web-dev-qa-db-ja.com

TypeError:バイト文字列値のシーケンスが必要です。タイプstrの値が見つかりました

_mod_wsgi_ for Python 3. Fedora23を使用しています。Apache仮想ホストの構成は次のとおりです。

_<VirtualHost *:80>
    ServerName localhost
    ServerAdmin admin@localhost
    # ServerAlias foo.localhost
    WSGIScriptAlias /headers /home/httpd/localhost/python/headers/wsgi.py
    DocumentRoot /home/httpd/localhost/public_html
    ErrorLog /home/httpd/localhost/error.log
    CustomLog /home/httpd/localhost/requests.log combined
</VirtualHost>
_

wsgi.py:

_def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-Type', 'text/plain'),
                        ('Content-Length', str(len(output)))]

    start_response(status, response_headers)

    return [output]
_

Python 2(_mod_wsgi_)に_Sudo dnf remove python3-mod_wsgi -y && Sudo dnf install mod_wsgi -y && Sudo apachectl restart_を使用すると正常に動作しますが、Python)を使用すると500内部サーバーエラーが発生します= 3。エラーログは次のとおりです。

_mod_wsgi (pid=899): Exception occurred processing WSGI script '/home/httpd/localhost/python/headers/wsgi.py'.
TypeError: sequence of byte string values expected, value of type str found
_

更新

encode()encode('utf-8')(またはstr(len(output)))を使用しても機能しません。今私は得る:

_Traceback (most recent call last):
  File "/home/httpd/localhost/python/headers/wsgi.py", line 8, in application
    start_response(status, response_headers)
TypeError: expected unicode object, value of type bytes found
_
12
Sumit

どうやら、変数output自体には、Unicode文字列ではなくバイト文字列が必要です。また、response_headersだけでなく、outputが使用されるすべての場所(したがって、str(len(output)).encode('utf-8') 6行目は、私が試していたように機能しませんでした)。

したがって、私の場合の解決策は次のとおりです。

def application(environ, start_response):
    status = '200 OK'
    output = b'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

(コメントでRolbrokが示唆しているように、公式のmod_wsgiリポジトリの テストの1つ で見つけました。)

26
Sumit

背景

この問題は、Python 3のデフォルトのUTF-8が原因で発生します。これは、今日、ネイティブ以外の英語の文字が多数あり、それらに対応するのが最善であることがわかったためです。HTTPは=でのみ機能します。 ASCII文字。UTF-8を適切に処理しません。したがって、Apacheもmod_wsgiもUTF8で適切に機能しません。

解決策

したがって、html文字列全体を準備した後、組み込みのpython function --bytes()を使用してタイプキャストできます。これは文字列を受け取り、バイト文字列を提供します。

サンプルコード

html = "This "
html += "is the code"
html = bytes(html, encoding= 'utf-8')
response_header = [('Content-type', 'text/html')]
start_response(status, response_header)
yield html
8
Rahul