SOでこれについて多くのことを見てきましたが、何も問題を解決できません。
問題:
CSRF ミドルウェアを有効にすると、Django は AJAX フォーム リクエストに対して 403 で応答し、次のように述べます。
「CSRF Cookie が設定されていません。」
ドキュメントに従って、カスタムの「X-CSRFToken」ヘッダーを設定する JS 機能が実装されました。
期待どおりに動作し、ブラウザーから「csrftoken」 Cookie を取得し、AJAX 要求と共に投稿します。
x-csrftoken: 1a0u7GCQG0wepZHQNThIXeYpMy2lZOf2
しかし、応答はまだ 403 です。
試した解決策:
具体的には、SOまたはWebで見つけることができるすべてを試しました:
ミドルウェアが有効になっていることを確認します。
MIDDLEWARE_CLASSES = [ ... 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', ... ]
Cookie が有効になっているさまざまなブラウザー。
@ensure_csrf_cookie
ビューを;で装飾する{% csrf_token %}
私のテンプレートでの設定;render
正しいリクエスト コンテキストを取得するショートカットを使用します。カスタムの設定
CSRF_COOKIE_NAME
とCSRF_HEADER_NAME
私のsettings.py
;明示的に設定
CSRF_COOKIE_SECURE = False
してCSRF_COOKIE_HTTPONLY = False
;明示的に設定
CSRF_TRUSTED_ORIGINS
する。開発サーバーと本番サーバーでのテスト。
request.META["CSRF_COOKIE_USED"] = True
誰かが示唆したように、私の見解でも。
それでも何も得られませんでした。
ヘッダー:
私@csrf_exempt
のprint(request.META)
見解では、カスタムヘッダー"X-CSRFToken"がリクエストに存在し、Django のドキュメントに従ってフォーマットされ、"HTTP_" プレフィックスが付けられ、ハイフンがアンダースコアに置き換えられ、すべて大文字の"HTTP_X_CSRFTOKEN"であることは明らかです。
さらに、その値は Django によって設定された Cookie と一致します。
クッキー:
奇妙なことにprint(request.COOKIES)
、私のビューでページとフォームの読み込み時に「csrftoken」 Cookieが表示されますが、辞書はAJAXリクエストで空です。それが問題になる可能性はありますか?
実際に何が間違っているのかを見つけようと必死です。これを読んでくれてありがとう。