2012-07-07 61 views
22

我正在嘗試在Django中編寫一個網站,其中的API網址與面向用戶的網址相同。但是我在使用POST請求和CSRF保護的頁面遇到問題。舉例來說,如果我有一個頁面/富/加我希望能夠到POST請求發送到它在兩個方面:如何在某些情況下禁用Django的csrf保護?

  1. 作爲最終用戶(使用會話cookie身份驗證)提交表單。這需要CSRF保護。
  2. 作爲API客戶端(使用HTTP請求標頭進行身份驗證)。如果啓用CSRF保護,這將失敗。

我發現了各種禁用CSRF的方法,比如@csrf_exempt,但是這些都禁用了整個視圖。有什麼方法可以在更細粒度的級別啓用/禁用它?或者我只需要從頭開始實施自己的CSRF保護?

+1

您是否檢查[csrf保護文檔](https://docs.djangoproject.com/en/dev/ref/contrib/csrf/)? – machaku 2012-07-07 11:24:44

+0

我曾讀過它的一些部分,但顯然沒有閱讀所有方案。謝謝! – lucas 2012-07-07 11:34:33

回答

22

有一段Django的CSRF保護文檔標題爲View needs protection for one path,它描述了一個解決方案。我們的想法是在整個視圖上使用@csrf_exempt,但是當API客戶端標頭不存在或無效時,請調用註釋@csrf_protect

30

修改urls.py

如果您在urls.py管理你的路線,你可以用與csrf_exempt()你想要的路線從CSRF驗證中間件排除。

例如,

from django.views.decorators.csrf import csrf_exempt 
urlpatterns = patterns(
    # ... 
    # Will exclude `/api/v1/test` from CSRF 
    url(r'^api/v1/test', csrf_exempt(TestApiHandler.as_view())) 
    # ... 
) 

另外,作爲裝飾

有些人會覺得使用@csrf_exempt裝飾的更適合自己的需求

例如,

​​
相關問題