【问题标题】:django - method PUT - Forbidden (CSRF cookie not set.):django - 方法 PUT - 禁止(未设置 CSRF cookie。):
【发布时间】:2015-12-19 08:13:51
【问题描述】:

我对 PUT 方法的功能视图是:

return JsonResponse ({})

使用 HttpRequester(firefox 插件)

CSRF 验证失败。请求中止。

print(request) 给出以下结果:

Forbidden (CSRF cookie not set.): /test/src/4213

我不知道我应该做什么。你能帮我吗?

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^test/src/(\d+)', MyView.as_view(), name='put_'),
]

class MyView(View):
    ....
    def put(self, request, *args, **kwargs):
            print(request)
            return JsonResponse({})

我没有表格,所以我不能包含 {%csrf_token%}。我没有 html 文件。我尝试使用 HttpRequester(firefox 插件)测试它

【问题讨论】:

  • 您在提交表单吗?
  • 能否分享 urls.py 和 views.py 以更好地了解事情的运作方式?
  • 我编辑了我的第一篇文章。再看看它的底部。

标签: django cookies csrf-protection django-csrf


【解决方案1】:

确保在提交表单时将{%csrf_token%} 作为表单中的隐藏输入。

另外,请检查以确保 CsrfViewMiddleware 在您的 settings.py 中的 MIDDLEWARE_CLASSES

【讨论】:

  • 我编辑了我的第一篇文章。再看看这个底部。
【解决方案2】:

如果此视图不是用于表单,而是通过某些东西直接访问,您可以使用 csrf_exempt 装饰器删除 csrf 检查:

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^test/src/(\d+)', csrf_exempt(MyView.as_view()), name='put_'),
]

【讨论】:

  • 问题不是关于表单也不是 ajax,OP 是从 firefox 扩展中请求的。因此,就像在任何 REST API(例如,参见 DRF)中一样,可以禁用 csrf。但是,是的,这应该有更多的解释。
  • 你是对的,它是 REST API。我应该禁用 csrf 吗?怎么办?
  • 查看DRF 中的讨论。如果这是一个混合环境,您可以删除每个视图的 CSRF 视图,但前提是要使用非基于会话的身份验证方案访问此 REST api 视图。以及如何做到这一点,就是@method_decorator(csrf_exempt)
  • 没用。还是有同样的问题
  • @method_decorator 的语法错误。基于类的视图必须在 urlconf 或调度方法DOC 中进行修饰。更新了答案。
猜你喜欢
  • 2012-05-03
  • 2016-11-26
  • 2021-10-08
  • 1970-01-01
  • 2022-09-27
  • 2020-01-16
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多