15

POST ajaxリクエストを作成するためにテストしていますが、csrftokenがないため403を取得しました。ドキュメントをフォローしましたが、それでも機能せず、csrftokenという名前のCookieが空であることがわかりました。これは、 $.cookie("csrftoken") nullを返すことを意味します。

csrftoken誰かが理由とクッキーを設定する方法を教えてもらえますか?

4

5 に答える 5

22

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 Coo​​kie を設定させることができます:

# 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

于 2012-11-16T09:38:50.700 に答える
15

ensure_csrf_cookieビュー デコレータ (Django 1.4 以降で使用可能)を使用することをお勧めします。これにより、テンプレート タグcsrftokenを使用しなくても Cookieが設定されます。{{ csrf_token }}

于 2013-04-10T06:52:24.603 に答える
2

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);
                }
             }
        });
于 2016-04-18T19:26:45.260 に答える