herokuの無料枠が廃止になる!という報道を受けて、自分のサーバーにアプリを移動してみました。結果、思ったより簡単にできました。
では早速移管しましょう〜!
移行元・先・ローカルのPythonバージョンを確認
Pythonバージョン確認コマンド
% python3 --version
移管元
Python 3.8.8
移管先
私の環境では、移管先(Conoha)にデフォルトで入っているPythonはバージョンが古いことがわかりました。
バージョン3.6と3.8の違いを確認するとセキュリティ要件のようです。ソースに問題は出ないようですね(もちろんセキュリティ強い方がいいですが)
とりあえず移管してしまおうと思います。
# python3 --version Python 3.6.8
デプロイしてみる
とりあえずpythonソースをデプロイしています。
任意のフォルダに.pyファイルを置いて
実行
$ python3 tmp.py ModuleNotFoundError: No module named 'bottle'
モジュールが見つかりませんでした。入れてないですもんね。入れましょう
herokuを使っていた時、requirements.txtの中に必要なモジュールをそのバージョンとともに記載していました。
今後もこれを使いたいと思います。
$ pip3 install -r requirements.txt
python実行してみる
$ python3 tmp.py Bottle v0.12.19 server starting up (using WSGIRefServer())... Listening on http://0.0.0.0:3000/ Hit Ctrl-C to quit.
$ nohup python3 tmp.py &
$ curl http://0.0.0.0:3000/hello
hello!
ローカルサーバー内で、アクセスでき正しく挙動していることが確認できました!
私は今回3000ポートを外部からアクセスできないようにしているのでサーバー外からはリクエストを送ることができません。
稼働開始してみたら、文字コードがおかしい
無事、移行が完了したかと思っていましたが、数日経って今回移行したPythonアプリから吐き出される文字が化けていることに気がつきました。
ãçºå£²ã¾ã§25æ¥ã%0AãDVDãçºå£² ã¹ãã¼ã³ãº%0Açºå£²æ¥ï¼2022å¹´09æ 28æ¥%0A
派手な文字化けです…なんでしょうこれ。どうしてこうなっているんでしょう。ソースは変えてないので、明らかにサーバー依存の問題です。文字化け解析ツールなどで調べても、これが何の文字コードなのかわかりません。
そんな中、以下のブログに辿り着きました。救われました…「ãがいっぱいある」文字化けがどうして起こるのかを説明してくださっています。
Pythonアプリがインプットの文字列の文字コードを誤判し、別の文字コードへ変換してしまっているんですね。
原因はわかりました。では正しい文字コードをPythonに教えてあげるだけです!
Python「ãがいっぱい」文字化け解消
# "koretoritai"というクエリをURLから取得したい # 前 msg = request.query.get('koretoritai') # 後 msg = request.query.koretoritai
ちょっと疑問が残りますが、私の環境ではこのソース変更で文字化けが解消しました!
解決に到達するまで、たくさん回り道しました…
こちらのブログさんもお世話になりました。
ソース修正前のクエリ取得方法でパラメータを取得したときは以下のような文字列になっていました。
想定通りUTF-8で文字列を受け取れているのに、その後うまく扱えず。
b'\xc3\xa6\xc2\x97\xc2\xa5\xc3\xa6\xc2\x9c\xc2\xac\xc3\xa3\xc2\x81\xc2\x94\\n\xc3\xa3\xc2\x81\xc2\x93\xc3\xa3\xc2\x81\xc2\x86\xc3\xa3\xc2\x81\xc2\xaa\xc3\xa3\xc2\x82\xc2\x8b\xc3\xa3\xc2\x81\xc2\xa8\xc3\xa3\xc2\x81\xc2\xa9\xc3\xa3\xc2\x81\xc2\x86'
で、結局のところ、それ以前のパラメータ取得部分のコードを変えたらうまく取得できるようになった!という結論です。
文字コード問題は、どの部分でおかしくなっているか?を見つけ、場所を特定したらどうしたら解消できるか?を冷静に考えることが大切ですね…!
コメント