2014-10-29 69 views
23

我正在使用Django 1.7和django-rest-framework。CSRF失敗:CSRF令牌丟失或不正確

我做了返回我一些JSON數據把這個在我settings.py

REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.AllowAny',), 
    'DEFAULT_RENDERER_CLASSES': (
    # 'rest_framework.renderers.XMLRenderer', 
    'rest_framework.renderers.JSONRenderer', 
    # 'rest_framework.renderers.BrowsableAPIRenderer', 
    ) 
} 

當我做GET調用,它返回我所有的數據,但是當我試圖用PUT/PATCH我得到一個API:

--------Response Headers--------- 
Status Code: 403 
Date: Wed, 29 Oct 2014 18:51:42 GMT 
Vary: Cookie 
Server: WSGIServer/0.1 Python/2.7.8 
Allow: GET, POST, PUT, PATCH, HEAD, OPTIONS 
X-Frame-Options: SAMEORIGIN 
Content-Type: application/json 
--------------------------------- 

--------Response Body----------- 
{"detail": "CSRF Failed: CSRF token missing or incorrect."} 
--------------------------------- 

這隻發生在我登錄時,如果我是匿名的,我可以正確地PUT/PATCH。

我與@csrf_exempt試圖和我的錯誤,我已經包括在設置中,rest_framework.permissions.AllowAny ...

我不知道發生了什麼事情。有誰知道這個問題是什麼?

回答

32

當您使用SessionAuthentication時,您使用的Django身份驗證通常需要檢查CSRF。 Django REST Framework僅對SessionAuthentication執行此操作,因此您必須在X-CSRFToken標頭中傳遞CSRF標記。

Django documentation提供了更多關於使用jQuery檢索CSRF令牌並在請求中發送CSRF令牌的信息。 CSRF令牌被保存爲一個名爲csrftoken的Cookie,您可以從HTTP響應中檢索該響應,該響應取決於正在使用的語言。

如果您無法檢索CSRF cookie,通常這表示您不應使用SessionAuthentication。我建議根據您的需要查看TokenAuthenticationOAuth 2.0

+1

我知道我應該給CSRF令牌,當我驗證,但實際上我使用.NET Windows窗體應用程序與此API進行通信,並且它通過HTTPRequest和HTTPResponse方法進行GET調用,我不知道如何在這種情況下獲得CSRF令牌,我不使用AJAX或HTML表單。 **編輯** .NET應用程序接收JSON格式的純文本,並返回相同的 – 2014-10-29 20:54:54

+0

你沒事,用cookie我可以處理csrftoken並將其放回到標題數據中,所以我可以使PUT/PATCH調用,如果我登錄。謝謝! – 2014-10-30 19:14:34

+0

@AlexLordMordor您能解釋一下您的解決方案嗎?以及爲什麼當你是一個登錄用戶時它不工作,但以匿名方式工作。 (我有完全相同的問題) – 2015-03-30 04:59:28

0

我有類似的問題,我裹着我的網址下csrf_exempt方法 -

from django.views.decorators.csrf import csrf_exempt 

url(r'^api/v1/some-resource$', csrf_exempt(SomeApiView.as_view())), 
相關問題