はじめに
技術習熟度が低い状態で奇跡的に運用開始できたWebアプリを、この度全面改訂したいと考え、Djangoを1から勉強することにしました。
Snow TreeさんのDjango講座がとてもわかりやすかったので、このページに沿って進めることにしました。
今回の現象は、講座内容を終えた後の作業になります。必ず起きるのか、それとも、作り方や利用ライブラリのVer.に影響される固有の問題なのか、私には理解できないままですが、誰かの役に立つかもと考え、作業内容を記すことにしました。
環境
- ConoHa VPS
- Ubuntu20
- nginx, gunicorn (参考サイト通りhttp接続とした。socketでは無い)
- Django4.0.1, python
- VScodeでSSH接続して開発
現象
nginx、gunicorn、SSL認証の設定作業が済み、独自ドメイン(https://...)でDjangoのHello World アプリにアクセスできるようなったが、admin画面でloginしようとしたらCSRF validation エラー。
試しに nginx と gunicorn を止めて、DEBUG=True に戻して runserver を実行したところ正常にadmin画面でloginできた。
admin画面特有の問題かもと考えアプリ制作を進めたが、formでユーザーからのデータ送信を求めるところで、同じ現象が起きたので、本腰を入れて解決策を探ることに。。
解決策
ネットの海を彷徨った末に、公式のフォーラムにたどり着きました。。この投稿に従い、以下の2点を実施しました。
- nginxの設定を記す sites-available/my_app に以下の2行を追記。(my_appはご自分の環境に合わせて読み替えてください)
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Host $host;
- setting.pyに以下の3行を追記
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
USE_X_FORWARDED_HOST = True
USE_X_FORWARDED_PORT = True
これでPOSTできるようになりました。バンザイ!
(公式リファレンスを読み解けば正確な情報が得られるかも。今の私には無理。)