2017-04-08 99 views
0

我想知道Django始終拋出的CSRF Cookie not set錯誤是怎麼回事。我創建了一個視圖(參見下面),這是一個付款回調。我對發送給這個觀點的內容沒有影響。我已經檢查了StackOverflow上的其他帖子,但我認爲不適用於我。他們中的大多數人可以在他們的表單中實施csrf保護,csrf_exempt他們的視圖,或者他們使用rest_framework。現在Django禁止(CSRF cookie未設置)

class PaymentWebhook(View): 

    def post(self, request, *args, **kwargs): 
     # ... 

,我得到這個錯誤每次當我什麼都不做這樣的功能:

Forbidden (CSRF cookie not set.): /payment/webhook 

因爲這是有關付款,我能csrf_exempt這一點,或將只是打開一個安全孔?順便說一下,我甚至試着對這個函數進行免除,但它仍然會拋出這個錯誤。 有什麼建議嗎?

+0

顯示您的HTML包含提交這種觀點的形式。可能你沒有在這個表單中設置* {%csrf_token%}'。 –

+0

@nik_m就是這樣,這個觀點並沒有被我的任何形式發佈。付款提供商發送此郵件以返回付款信息 – dnsko

+1

然後,您應該使用['csrf_exempt'](https://docs.djangoproject.com/en/1.10/ref/csrf/#django.views.decorators.csrf .csrf_exempt)裝飾器,沒有任何安全漏洞。 –

回答

0

你應該與csrf_exempt裝飾dispatch方法,像這樣:

from django.views.decorators.csrf import csrf_exempt 
from django.utils.decorators import method_decorator 

class PaymentWebhook(View): 
    @method_decorator(csrf_exempt) 
    def dispatch(self, request, *args, **kwargs): 
     return super(PaymentWebhook, self).dispatch(request, *args, **kwargs) # for python 2 
     return super().dispatch(request, *args, **kwargs) # for python 3 

    def post(self, request, *args, **kwargs): 
     # ... 

,或者基於this,您可以將其清理到:

from django.views.decorators.csrf import csrf_exempt 
from django.utils.decorators import method_decorator 

@method_decorator(csrf_exempt, name='dispatch') 
class PaymentWebhook(View): 

    def post(self, request, *args, **kwargs): 
     # ... 
+0

我以前試過這個,並且像你建議的那樣再次實現它,但是我似乎仍然得到一個csrf錯誤 '禁止(CSRF cookie未設置):/ payment/webhook 信息請求「POST/payment/webhook HTTP /1.1「403' – dnsko

+0

你確定這是一個'POST'請求​​嗎?支付提供商的文檔對該請求的說明是什麼? –

+0

我很確定。我的控制檯輸出一個403 POST錯誤,他們明確表示他們正在向這個視圖發送一個POST請求 – dnsko

0

我終於得到了一個POST通過。我相當肯定我已經測試過它,但現在它似乎工作:我把csrf_exempt放入我的urls.py

from django.views.decorators.csrf import csrf_exempt 

url(r'^payment/webhook$', csrf_exempt(paymentwebhook), name='payment-webhook') 

任何其他方式,由於某種原因,它不適用於我。感謝nik_m的幫助,感謝它!

0

解決了我

@csrf_exempt 
@api_view(['POST']) 
def add(request):