Управление журналом wsgiref simple_server
Я играю с wsgiref.simple_server
изучать мир веб-серверов.
Я хотел бы контролировать сгенерированный журнал, но не смог найти ничего об этом в документации Python.
Мой код выглядит так:
from wsgiref.simple_server import make_server
def application(environ, start_response):
start_response('200 OK', headers)
return ['Hello World']
httpd = make_server('', 8000, application)
httpd.serve_forever()
1 ответ
Решение
wsgiref.simple_server.make_server
по умолчанию создает WSGIServer
с WSGIRequestHandler
:
def make_server(
host, port, app, server_class=WSGIServer, handler_class=WSGIRequestHandler):
"""Create a new WSGI server listening on `host` and `port` for `app`"""
server = server_class((host, port), handler_class)
server.set_app(app)
return server
WSGIRequestHandler
здесь простирается от BaseHTTPServer.BaseHTTPRequestHandler
где магия лесозаготовок оказывается:
def log_message(self, format, *args):
sys.stderr.write("%s - - [%s] %s\n" %
(self.client_address[0],
self.log_date_time_string(),
format%args))
Так что это запись в stderr, а не в модуль регистрации python. Вы можете переопределить это в вашем собственном обработчике:
class NoLoggingWSGIRequestHandler(WSGIRequestHandler):
def log_message(self, format, *args):
pass
И вместо этого передайте свой пользовательский обработчик на сервер:
httpd = make_server('', 8000, application, handler_class=NoLoggingWSGIRequestHandler)
Еще один странный трюк - использовать redirect_stderr
.
import os
from contextlib import redirect_stderr
with redirect_stderr(open(os.devnull, "w")):
with make_server("", 8051, app) as httpd:
httpd.handle_request()