wsgi経由で日本語使うと500エラーになる対処方
Apache+mod_wsgiでpythonをブラウザで実行したいと思います。ところがなぜか500エラーとなるのでその対処方となります
環境
今回はDocker環境で行います。Dockerファイルとしては以下のようになってます
#イメージを取得。ここではalmalinux8のイメージ
FROM almalinux
#実行コマンドを書いていく
RUN dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
#RUN dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
#RUN dnf module enable python39 -y
RUN dnf install python -y
RUN dnf install -y httpd
RUN dnf install mod_wsgi -y
RUN dnf -y install supervisor
#ファイルコピー
COPY ./etc/supervisord.conf /etc/supervisord.d/supervisord.conf
COPY ./etc/wsgi.conf /etc/httpd/conf.d/wsgi.conf
#スーパーバイザーを実行 CMD ["supervisord", "-c", "/etc/supervisord.d/supervisord.conf"]
スーパーバイザーは別になくてもいいです。前PHP使うときに使っていてファイルなのでそのまま使っています。
yml
version: '3'
services:
almalinux9:
container_name: "al9"
build:
dockerfile: ./Dockerfile
#volumes: #ホストにあるファイルをマウント # - ./etc/php.ini:/etc/php.ini #php.iniの設定
# - ./documentroot/info.php:/var/www/html/info.php #phpinfoをホストからコンテナへ転送
tty: true # ← これがないとコンテナにログインできない
ports:
- 8080:80
使い回してます。こんな感じです。
wisgi.conf
<Directory /var/www/html/>
Options ExecCGI MultiViews Indexes
MultiViewsMatch Handlers
AddHandler wsgi-script .py
AddHandler wsgi-script .wsgi
DirectoryIndex index.html index.py app.wsgi
Order allow,deny
Allow from all
</Directory>
wsgiはdnfからインストール
コードをみていただくとわかるように、wisgiはpipではなくdnfでインストールしてます
pythonは標準の3.9を使っています。
index.pyを作って表示する
# app.wsgi
def application(environ, start_response):
start_response('200 OK', [('Content-type', 'text/plain')])
return [b'hallo world']
英語で表示
画像は小さいですが表示されました
日本語にしてみる
# app.wsgi
def application(environ, start_response):
start_response('200 OK', [('Content-type', 'text/plain')])
return ['こんにちは世界']
500エラーとなりました。pythonは日本語使えるはずなのに何故か500エラーとなります。
結論:コードを少し変える
# app.wsgi
def application(environ, start_response):
start_response('200 OK', [('Content-type', 'text/plain')])
return ['こんにちは世界'.encode("utf-8")]
コードにUTF-8の指定をいれるとでます。詳細はhttps://p--q.blogspot.com/2014/05/wsgi1pythonwsgi.htmlを閲覧してください
なぜUTF-8メソッドをいれる?
Python3ではbytes型扱いになっているため、日本語の返しがエラーとなるみたいです。python2とかではstr型で返していたみたいです
なので、str型にするためにエンコードを指定しているという事みたいです
この記事が気に入ったらサポートをしてみませんか?