django - 如何仅在某些情况下禁用 Django 的 csrf 保护?

标签 django api csrf-protection

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

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

我找到了多种禁用 CSRF 的方法,例如@csrf_exempt,但这些方法都对整个 View 禁用了它。有没有办法在更细粒度的级别启用/禁用它?还是我必须从头开始实现自己的 CSRF 保护?

最佳答案

修改urls.py

如果您在 urls.py 中管理您的路由,您可以用 csrf_exempt() 包装您想要的路由将它们排除在 CSRF 验证中间件之外。

例如,

from django.views.decorators.csrf import csrf_exempt
urlpatterns = patterns(
    # ...
    # Will exclude `/api/v1/test` from CSRF 
    url(r'^api/v1/test', csrf_exempt(TestApiHandler.as_view()))
    # ...
)

或者,作为装饰器

有些人可能会发现使用 @csrf_exempt 装饰器更适合他们的需要

例如,

from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse

@csrf_exempt
def my_view(request):
    return HttpResponse('Hello world')

关于django - 如何仅在某些情况下禁用 Django 的 csrf 保护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11374382/

相关文章:

PHP YouTube Api V3 MaxResults 不工作

security - 匿名评论/帖子表单是否需要 csrf token ?如果不是,为什么要使用它以及如何实现它?

python - 在 Django 提交表单中输入错误格式(日期时间格式)时如何打印错误?

django - Flutter 向 Django API 发送一个以文件为正文的 POST 请求

javascript - Watson Assistant 如何区分不同用户

php - Laravel 4.1 _token 表单提交错误

security - CSRF 攻击期间如何不可能欺骗 Referer header ?

python - 如何在 Python 的 mixin 中调用封闭类的 super?

python - 基于 Django 类的 View 移动模板

android - Google Fit Android API 中的手动数据标志?