POST ajaxリクエストを作成するためにテストしていますが、csrftokenがないため403を取得しました。ドキュメントをフォローしましたが、それでも機能せず、csrftokenという名前のCookieが空であることがわかりました。これは、 $.cookie("csrftoken")
nullを返すことを意味します。
csrftoken
誰かが理由とクッキーを設定する方法を教えてもらえますか?
POST ajaxリクエストを作成するためにテストしていますが、csrftokenがないため403を取得しました。ドキュメントをフォローしましたが、それでも機能せず、csrftokenという名前のCookieが空であることがわかりました。これは、 $.cookie("csrftoken")
nullを返すことを意味します。
csrftoken
誰かが理由とクッキーを設定する方法を教えてもらえますか?
HTML/JS コードで csrf トークンを取得する方法とミドルウェアの設定を提供する必要があると思います。
まず、django.middleware.csrf.CsrfViewMiddleware
オンになっていることを確認する必要があります。
request.META.get('CSRF_COOKIE')
Pythonコードでトークンを取得していたときに、同様の問題がありました。
このトークンをテンプレートで使用する{% csrf_token %}
と、Django はトークンがレンダリングされたことを認識し、Cookie を に設定しCsrfViewMiddleware.process_response
ます。他の方法でトークン値を取得すると、Django はこのフラグを見逃します。したがって、トークンは生成されますが、対応する Cookie は設定されません。
コードには 2 つの回避策があります。JS コードでテンプレートを生成するために使用されるビューに追加する必要があります。
1. Django に CSRF Cookie を設定させることができます:
# Force updating CSRF cookie
request.META["CSRF_COOKIE_USED"] = True
2.を呼び出すと、Django は CSRF_COOKIE_USED を自動的に設定します。get_token
from django.middleware.csrf import get_token
# don't use direct access to request.META.get('CSRF_COOKIE')
# in this case django will NOT send a CSRF cookie. Use get_token function
csrf_token = get_token(request)
このソリューションはそれぞれ個別に機能する必要があります。使用することをお勧めしますget_token
ensure_csrf_cookie
ビュー デコレータ (Django 1.4 以降で使用可能)を使用することをお勧めします。これにより、テンプレート タグcsrftoken
を使用しなくても Cookieが設定されます。{{ csrf_token }}
o_c の回答の拡張:CSRF_COOKIE_HTTPONLY
行にコメントを付けることにより、csrf_token 値は (Firefox firebug では) 「未定義」ではなくなり、「qGuPe2Q7... など」などの「実際の」値として表示されます。
Ajax リクエストがエラーで拒否されなくなり403 Forbidden
、正しく実行されます (AJAX ヘッダーに csrf_token が設定されている場合)。
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});