Я пытаюсь использовать ErrorMiddleware, включенный в Python Paste 2.0.3, чтобы показать трассировку в браузере, когда мой сервер приложений Python 3.4 mod_wsgi выдает исключение. Проблема, с которой я сталкиваюсь, заключается в том, что ErrorMiddleware выдает это исключение всякий раз, когда пытается обработать исключения моего сервера:
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3.4/site-packages/paste/exceptions/errormiddleware.py", line 154, in __call__
response = self.exception_handler(exc_info, environ)
File "/usr/lib/python3.4/site-packages/paste/exceptions/errormiddleware.py", line 188, in exception_handler
simple_html_error=simple_html_error)
File "/usr/lib/python3.4/site-packages/paste/exceptions/errormiddleware.py", line 391, in handle_exception
error_stream.write(line)
TypeError: must be str, not bytes
и поэтому я все еще получаю 500 Internal Server Error
в браузере.
Похоже, проблема в том, что ErrorMiddleware пытается записать байты в поток ошибок wsgi:
if six.PY3:
line = line.encode('utf8')
error_stream.write(line) # line 391 error_stream comes from environ['wsgi.errors']
но если я распечатаю environ['wsgi.errors']
, это будет текстовый поток:
'wsgi.errors': <_io.TextIOWrapper name='<wsgi.errors>' encoding='utf-8'>
что означает, что ErrorMiddleware не может записывать в него байты.
Я оборачиваю свое приложение в ErrorMiddleware следующим образом:
application = ErrorMiddleware(application, debug=True)
Есть ли что-то, что я делаю неправильно, чтобы вызвать это? Могу ли я настроить mod_wsgi так, чтобы поток ошибок был потоком байтов, а не текстовым потоком?