14

我有以下简单的线程文件服务器供我的应用程序使用:

class FileServer(Thread):
    """Simple file server exposing the current directory for the thumbnail
    creator
    """

    def __init__(self, port):
        Thread.__init__(self)
        self.port = port

        Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
        self.httpd = SocketServer.TCPServer(("", port), Handler)

    def run(self):
        self.httpd.serve_forever()

    def stop(self):
        self.httpd.shutdown()

如何防止 SimpleHTTPServer 在每次请求时输出“GET 'http://BLA BLA BLA”?谢谢

4

3 回答 3

29

您可以子类SimpleHTTPServer.SimpleHTTPRequestHandler化并覆盖该log_message方法。这是您将覆盖的方法,没有文档字符串:

def log_message(self, format, *args):
    sys.stderr.write("%s - - [%s] %s\n" %
                     (self.address_string(),
                      self.log_date_time_string(),
                      format%args))

因此,要简单地忽略所有消息,请将函数的主体替换为pass. 对于更细粒度的控制(即,如果您仍然希望打印错误消息),您可以改写log_requestand/orlog_error方法。原来的方法是这样的:

def log_request(self, code='-', size='-'):
    self.log_message('"%s" %s %s',
                     self.requestline, str(code), str(size))

def log_error(self, format, *args):
    self.log_message(format, *args)

从 2.7 到 3.1,模块名称发生了变化,但这些方法没有改变。

于 2012-05-18T10:50:39.207 回答
13

在 Bash 中以这种方式运行它:

python -m SimpleHTTPServer &>/dev/null
于 2012-05-18T10:48:52.467 回答
2

不需要子类。

更简单的解决方案:

http_handler = SimpleHTTPServer.SimpleHTTPRequestHandler
http_handler.log_message = lambda a, b, c, d, e: None
于 2020-04-02T17:58:07.883 回答