我正在try 用Django编写一个站点,其中API URL与面向用户的URL相同.但我在使用POST请求和CSRF保护的页面上遇到了问题.例如,如果我有一个页面/foo/add,我希望能够通过两种方式向其发送POST请求:

  1. 作为最终用户(使用会话cookie进行身份验证)提交表单.这需要CSRF保护.
  2. 作为API客户端(使用HTTP请求头进行身份验证).如果启用CSRF保护,则此操作将失败.

我找到了各种禁用CSRF的方法,比如@CSRF_emption,但这些方法都会在整个视图中禁用它.有没有办法在更细粒度的级别启用/禁用它?还是我必须从头开始实施自己的CSRF保护?

推荐答案

Django的CSRF保护文档中有一个标题为View needs protection for one path的部分描述了一种解决方案.我们的 idea 是在整个视图中使用@csrf_exempt,但当API客户端头不存在或无效时,则调用一个函数

Django相关问答推荐

如何根据递归ManyToManyField值创建Django查询集?

从Azure Web应用服务器上的cron任务的虚拟环境加载变量

Django-admin 显示decorator 按多列排序

获取 Django (postgres) 中带注释字段的平均值

Django 长时间运行带有线程/处理的异步任务

使用 south 重构具有继承的 Django 模型

获取结果集中返回的元素数的 django 模板标签是什么?

使用基于类的 UpdateView 在 Django 中更新用户模型

验证 Django 模型对象的正确方法?

Django 从字段开始

Python 和 Django OperationalError (2006, 'MySQL server has gone away')

如何在 django-rest-framework 中为 API 使用 TokenAuthentication

ImportError:无法导入设置

Django ORM 能否以可靠的与后端无关的方式存储无符号 64 位整数(又名 ulong64 或 uint64)?

Table doesn't exist表不存在

Django 1.7 - 如何 suppress (1_6.W001)某些元素单元测试可能无法按预期执行.?

Django 测试 - 在所有测试中修补对象

django-getlist()

AttributeError:ManyRelatedManager对象没有add属性?

Python Django 的多线程