_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
_
どうやら、変数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つ で見つけました。)
背景
この問題は、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