3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

runserverではPOSTできるのに、本番環境でCSRF validation エラーになる(解決)

Last updated at Posted at 2022-01-24

はじめに

技術習熟度が低い状態で奇跡的に運用開始できた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できるようになりました。バンザイ!
公式リファレンスを読み解けば正確な情報が得られるかも。今の私には無理。)

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?