見出し画像

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エラー

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型にするためにエンコードを指定しているという事みたいです

この記事が気に入ったらサポートをしてみませんか?