Django Post 403禁止CSRF

时间:2018-05-28 10:13:06

标签: django csrf

我有一个简单的Django webhook,尽管我用403 forbidden标记了它,仍然会返回csrf_exempt

以下是相关代码:

urls.py

 ...
 url(r'^mail/$', MailView.as_view(), name="mail"),
 ...

view.py

class MailView(View):
    @csrf_exempt
    def dispatch(self, *args, **kwargs):
        return super(MailTrackingView, self).dispatch(*args, **kwargs)

    def post(self, request, *args, **kwargs):
        return HttpResponse(status=204)

当向这个端点发送数据时,Django给出了

Forbidden (CSRF cookie not set.): /mail/

我还需要设置什么才能执行CSRF验证?

2 个答案:

答案 0 :(得分:0)

在模板中的表单中添加{%csrf_token%}。

并声明:

CSRF_COOKIE_SECURE = True

https://docs.djangoproject.com/en/2.0/ref/settings/#csrf-cookie-secure

答案 1 :(得分:0)

我相信你必须把它包裹在method_decorator里面  尝试

class MailView(View):
    @method_decorator(csrf_exempt))        
    def dispatch(self, *args, **kwargs):
        return super(MailTrackingView, self).dispatch(*args, **kwargs)

你也可以这样做:

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

更新

您是否将CSRF_USE_SESSIONS设置为True?

这是我用来测试它的代码,它按预期工作;如果装饰器已被注释掉,我会收到403 CSRF失败,如果剩下那么我的帖子就会成功。

查看文件

class MyView(View):

    @method_decorator(csrf_exempt)
    def dispatch(self, *args, **kwargs):
        return super(MyView, self).dispatch(*args, **kwargs)

    def post(self, request, *args, **kwargs):
        return HttpResponse(status=204)

    def get(self, request, *args, **kwargs):
        form = """
        Authenticated: {}
        <form method="post">
            <label for="your_name">Your name: </label>
            <input id="your_name" type="text" name="your_name">
            <input type="submit" value="OK">
        </form>
        """.format(request.user.is_authenticated())
        return HttpResponse(form)

网址文件

    url(r'^test/', views.MyView.as_view()),