Bjoern: Python 3 では、WSGI 文字列は ISO-8859-1 でデコードする必要があります。

作成日 2018年08月03日  ·  5コメント  ·  ソース: jonashaag/bjoern

問題

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%A5PATH_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%A5PATH_INFO: /åます。

Bug Needs patch

全てのコメント5件

この素晴らしいバグレポートをありがとう!

また、これを修正する方法を知っていますか?

私は 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)

ありがとう、私は数日中にこれを修正します。

ぜひご覧ください!

チャームのように機能します。 🎉🎉🎉

どうもありがとう! 🙌

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

alexted picture alexted  ·  12コメント

avloss picture avloss  ·  3コメント

ryanisnan picture ryanisnan  ·  11コメント

alexhultman picture alexhultman  ·  14コメント

jonashaag picture jonashaag  ·  18コメント