我想知道 Django 一直向我抛出的CSRF Cookie not set
错误是怎么回事。我创建了一个视图(见下文(,它是付款的回调。我对发送到该观点的内容没有影响。我已经检查了StackOverflow上的其他帖子,但我认为任何帖子都不适用于我。他们中的大多数人都可以在他们的表格中实施CSRF保护,csrf_exempt他们的观点,或者他们使用rest_framework。
class PaymentWebhook(View):
def post(self, request, *args, **kwargs):
# ...
现在,每次对这个函数不做任何事情时,我都会收到此错误:
Forbidden (CSRF cookie not set.): /payment/webhook
既然这是关于付款的,我可以csrf_exempt
这个,还是只是打开一个安全漏洞?顺便说一句,我什至尝试过对这个函数进行豁免,但它仍然抛出该错误。有什么建议吗?
我终于设法通过了一个 POST。我很确定我已经测试过它,但它现在似乎有效:我在urls.py
放了一个csrf_exempt
.
from django.views.decorators.csrf import csrf_exempt
url(r'^payment/webhook$', csrf_exempt(paymentwebhook), name='payment-webhook')
出于某种原因,任何其他方式都对我不起作用。感谢nik_m的帮助,感激不尽!
你应该用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):
# ...
或者,基于此,您可以将其清理为:
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):
# ...
所做的(导入csrf_exempt(
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
@api_view(['POST'])
def add(request):
很简单。导入csrf_exempt:
from django.views.decorators.csrf import csrf_exempt
然后添加修饰器:
@csrf_exempt
def your_function(request):
...
我将其用于我的付款网络钩子,这不是问题。如果您特别担心安全性,您可以从请求中获取 IP 地址,并且仅在与您的支付提供商 IP 匹配时才处理 webhook。通常从他们的网站/api 文档中获得。