2015-10-06 121 views
4

我試圖設置Django API(一個POST API端點)。我想要具有相同的URL路徑指向相同的函數,如果它是POST或GET,則處理方式不同。因此,我所用的方法是這樣Django API Post方法返回403錯誤

def handle_post(request): 

    dict = {} 
    dict['email'] = "test" 

    if request.method == "POST": 
     return HttpResponse(json.dumps(dict), content_type="application/json") 

在url.py,我有以下的代碼

router = routers.DefaultRouter() 
router.register(r'notes', UsernotesViewSet) 
urlpatterns = patterns('', 
url(r'^', include(router.urls)), 
url(r'^admin/', include(admin_site.urls)), 
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), 
url(r'^docs/', include('rest_framework_swagger.urls')), 
url(r'^example/postrequest', handle_post), 
) 

但是,當我執行POST到URL http://127.0.0.1:8000/example/postrequest?requestid=abc&starthour=10我不能得到這個工作。我沒有發佈任何內容,只是將方法更改爲從httpclient上的POST來嘗試此API。如果我沒有發佈任何內容到URL,可以嗎?

我收到403錯誤,如下:

禁止(403)
CSRF驗證失敗。請求中止。
您看到此消息是因爲此網站在提交表單時需要CSRF Coo​​kie。出於安全原因,此cookie是必需的,以確保您的瀏覽器不被第三方劫持。 如果您已將瀏覽器配置爲禁用Cookie,請重新啓用它們,至少對於本網站或「同源」請求來說,請重新啓用它們。

讚賞有幫助。

回答

4

我無法正確理解您的問題,但是CSRF驗證失敗是因爲「通過」不安全「方法(例如POST,PUT和DELETE)執行請求時未使用CSRF(Cross Site Request Forgeries,跨站點請求僞造) 。

您可以在此link瞭解更多。

有一個快速的工作,各地的問題。您可以使用csrf_exempt裝飾標記一個視圖是由通過CSRF查看中間件(django.middleware.csrf.CsrfViewMiddleware)確保保護豁免。例如:

​​

您可以閱讀更多關於here

+0

非常感謝。你的工作方式,通過增加@csrf_exempt – Terry

2

請閱讀CSRF protection上的Django文檔。如果您的API將在瀏覽器中通過JavaScript訪問,那麼有instructions關於如何在ajax請求中包含令牌。

如果以不同的方式訪問API,例如從不使用cookie的移動客戶端,使用csrf_exempt裝飾器關閉該視圖的CSRF保護可能是合適的。