我正在尝试在 Django 中编写一个站点,其中 API URL 与面向用户的 URL 相同。但是我在使用 POST 请求和 CSRF 保护的页面上遇到了问题。例如,如果我有一个页面/foo/add 我希望能够通过两种方式向它发送 POST 请求:
- 作为最终用户(使用 session cookie 进行身份验证)提交表单。这需要 CSRF 保护。
- 作为 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/