bjoern を使用して Django アプリを実行し、ISO-8859-1 文字セット以外の文字を含む URL に移動すると、次のエラーで失敗します。
Traceback (most recent call last):
File "/webapps/django-interfax-app/env/lib/python3.5/site-packages/django/core/handlers/wsgi.py", line 145, in __call__
request = self.request_class(environ)
File "/webapps/django-interfax-app/env/lib/python3.5/site-packages/django/core/handlers/wsgi.py", line 69, in __init__
path_info = get_path_info(environ)
File "/webapps/django-interfax-app/env/lib/python3.5/site-packages/django/core/handlers/wsgi.py", line 162, in get_path_info
path_info = get_bytes_from_wsgi(environ, 'PATH_INFO', '/')
File "/webapps/django-interfax-app/env/lib/python3.5/site-packages/django/core/handlers/wsgi.py", line 210, in get_bytes_from_wsgi
return value.encode('iso-8859-1')
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0457' in position 1: ordinal not in range(256)
str または StringType タイプが実際に Unicode ベース (Jython、IronPython、Python 3 など) である Python プラットフォームでは、この仕様で参照されるすべての「文字列」には、ISO-8859-1 エンコーディングで表現可能なコード ポイントのみが含まれている必要があります。 (\u0000 から \u00FF までを含む)。 [1]
[1] https://www.python.org/dev/peps/pep-3333/#unicode -issues
wsgiref
実装されているため。
def application(environ, start_response):
start_response('200 OK', [])
print('PATH_INFO:', environ['PATH_INFO'])
yield b'OK'
from wsgiref.simple_server import make_server
httpd = make_server('0.0.0.0', 8080, application)
httpd.serve_forever()
curl localhost:8080/%C3%A5
はPATH_INFO: /Ã¥
ます。
def application(environ, start_response):
start_response('200 OK', [])
print('PATH_INFO:', environ['PATH_INFO'])
yield b'OK'
import bjoern
bjoern.run(application, '0.0.0.0', 8080)
curl localhost:8080/%C3%A5
はPATH_INFO: /å
ます。
この素晴らしいバグレポートをありがとう!
また、これを修正する方法を知っていますか?
私は C の専門家ではありませんが、見ることができます。 これまでのところ、この問題に一時的に対処するために WSGI ミドルウェアを作成することになりました。
from wsgi import application
import bjoern
class FixBjoernEncoding:
def __init__(self, app):
self._app = app
def __call__(self, environ, start_response):
environ['PATH_INFO'] = environ.get('PATH_INFO', '/')\
.encode('utf8').decode('latin-1')
return self._app(environ, start_response)
bjoern.run(FixBjoernEncoding(application), '0.0.0.0', 8080)
ありがとう、私は数日中にこれを修正します。
ぜひご覧ください!
チャームのように機能します。 🎉🎉🎉
どうもありがとう! 🙌