我有一个简单的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验证?
答案 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()),