Django Forbidden(未设置CSRF cookie。)

时间:2017-04-08 13:23:04

标签: django

我想知道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这个,还是仅仅打开一个安全漏洞?顺便说一句,我甚至尝试过豁免这个功能,但它仍然会抛出那个错误。 有什么建议吗?

4 个答案:

答案 0 :(得分:2)

我终于设法通过了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的帮助,感激不尽!

答案 1 :(得分:0)

为我解决

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

答案 2 :(得分:0)

简单。导入csrf_exempt:

from django.views.decorators.csrf import csrf_exempt

然后添加装饰器:

@csrf_exempt def your_function(request): ...

我将此用于我的付款网络挂钩,这不是问题。如果您特别担心安全性,可以从请求中获取IP地址,并且仅在Webhook与您的付款提供商IP匹配时才对其进行处理。通常从他们的网站/ api文档获得。

答案 3 :(得分:-1)

您应该使用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):
        # ...