[英]Django 1.9 AJAX form CSRF token 403 error - “CSRF cookie not set”
我已經在SO上看到了很多,但沒有什么能解決我的問題。
問題:
啟用CSRF中間件后,Django在AJAX表單請求上響應403,說明:
“未設置CSRF cookie。”
在文檔之后 ,實現了一個JS功能,它設置了自定義的“X-CSRFToken”標頭。
它按預期工作,從瀏覽器獲取“csrftoken” cookie並將其與AJAX請求一起發布:
x-csrftoken: 1a0u7GCQG0wepZHQNThIXeYpMy2lZOf2
但回應仍然是403。
嘗試的解決方案:
我已經嘗試過在SO或網上找到的所有內容,特別是:
檢查是否啟用了中間件:
MIDDLEWARE_CLASSES = [ ... 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', ... ]
啟用了Cookie的不同瀏覽器;
用@ensure_csrf_cookie
裝飾我的觀點;
在我的模板中設置{% csrf_token %}
;
使用獲取正確請求上下文的render
快捷方式
在我的settings.py
設置自定義CSRF_COOKIE_NAME
和CSRF_HEADER_NAME
;
明確設置CSRF_COOKIE_SECURE = False
和CSRF_COOKIE_HTTPONLY = False
;
明確設置CSRF_TRUSTED_ORIGINS
設置;
測試開發和生產服務器;
甚至request.META["CSRF_COOKIE_USED"] = True
在我看來是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請求時是空的 。 這可能是問題嗎?
不顧一切地發現實際上是錯的。 謝謝您閱讀此篇。
好的,問題很簡單:
默認情況下,Fetch API不會發送憑據。 據MDN稱 :
Request接口的憑證只讀屬性指示用戶代理是否應在跨源請求的情況下從其他域發送cookie。 這類似於XHR的withCredentials標志,但有三個可用值。
默認為omit
,它永遠不會發送cookie。 您只需要在fetch()
函數參數中添加same-origin
:
fetch(formUrl, {
...
credentials: 'same-origin',
...
})
你會很高興去:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.