Core-XにPythonをインストールし、ローカル環境で作成したFlaskアプリを動かす。(CGIモードで)
そのさいにハマったことをメモ書き。なお解決していないものもあります。(原因がなんだか分からない・・・)
でも端的に言ってしまえば、ローカル環境でもしっかり同じような環境を組み立てて試験しておこうね。という話です。
■1.サーバエラー(HTTPステータス:500)になる
ローカル環境では動く(wsgiで)のに、CORE-XでCGIモードで動かすとHTTPステータス:500となる。
で、エラーログを確認しようとするが、エラーログ自体が出力されていない。。。
最初はパスが誤っているせいかと思い、venvのなかのpthファイル等を確認するが問題なさそう、テストファイルを用意してパスを出力するがそれで見ても問題なさそう、、、原因が分からないので、仕方なくソースコードを削って一つ一つ実行。
で分かったのはルートロガーにおいて、設定ファイルを読むこむ時点でエラーになっていること。
ログ出力先に対して権限が無いのかなぁ…と思ったがそうでもない。設定ファイル自体が見えてない?と思い読み込み時のパスを絶対バスのハードコードにしてみるが同じまま。
かれこれ2時間近くウーンウーンとやりながら気がついたのは、ログ出力において
ファイル出力とコンソール出力が設定されていること。
●ロガー設定ファイル
[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler ←このconsoleHandlerが原因で動かなかった
[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=simpleFormatter
args=(sys.stdout,)
確かにFlaskのページを見ても、CGIで動かす際にはコードの中にprintなど入れるなと書かれている。
このこと自体は知っていたが、ログ出力は見落としていた。。。
・・・なおただ単にprintを入れた場合、responseに追加される? jsonifyで返すところで、パース用のクラス(defaultの処理)においてprintを追加したら、jsonのあとにprintの出力が追加され、javascriptでparsererrorになった。
だけどコンソールのログ出力だとエラーになるのか?
今後気をつけたい。
■2.URL_FOR のパスが合わない
Jinjaテンプレートで良く使う”URL_FOR”。
ローカル環境ではwsgiで作成していたため、特段問題なくurl_forで正しいURLを指し示してくれるのだが、
CGIモードで稼働させると正しいURLを示さない。
まぁ理屈で考えるとCGIモードで稼働させるために、.htaccessファイルにおいてrewriteモージュルでURLを変更しているため、変更されたurlが追加されパスが合わなくなる。
●.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f # Don't interfere with static files
RewriteRule ^(.*)$ index.cgi/$1 [L]
●index.cgi
from wsgiref.handlers import CGIHandler
from test.web_app import app
CGIHandler().run(app)
●wsgiのとき
url_for(“static” , filename=”test.css”) ⇒ https://xx.xx.xx/static/test.html
●cgiのとき
url_for(“static” , filename=”test.css”) ⇒ https://xx.xx.xx/index.cgi/yyyy.html/static/test.html
のように、wsgiでは正常だったが、cgiでは余計なパスがついて上手く動かない。
.htaccessで変換ルールをちゃんと作れば上手く出来るのかもしれないが、
rewriteの変換ルールの記述がよくわからず、めんどうになったため、結局url_forで記述していた部分をハードコードでパスを記載した。