csrf_exempt() 是 Django 框架中的一个装饰器,用于设置某个视图或 View 的某个方法跳过 CSRF 验证。
在 Django 中,CSRF(Cross-Site Request Forgery)指的是跨站点请求伪造,攻击者可以构造 URL 或一些特殊的参数,从而让用户在不知情的情况下进行一些恶意操作,如更改密码、提交订单等。为了避免这类安全问题,Django 引入了 CSRF 验证机制。
但有些情况下,我们需要禁用某个视图或 View 的某个方法的 CSRF 验证,可能是因为表单的操作跨域了,或者说是因为该视图已设置其他的防护措施来避免 CSRF 攻击,此时就可以采用 csrf_exempt() 来解决。
csrf_exempt() 的使用方法如下:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def some_view(request):
return HttpResponse('some view')
csrf_exempt() 的参数为视图函数,该函数内的所有 POST 请求都不需要 CSRF 保护了。
下面我们来看两个实例:
- 禁用视图函数的 CSRF 校验
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def my_view(request):
# 不进行 CSRF 验证的代码
return HttpResponse('this is my view')
这样的话,针对该视图的 POST 请求就不会再进行 CSRF 校验了。
- 禁用 View 类里指定方法的 CSRF 校验
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
from django.views import View
class MyView(View):
@method_decorator(csrf_exempt)
def dispatch(self, *args, **kwargs):
return super().dispatch(*args, **kwargs)
def post(self, request):
# 经过 csrf_exempt 装饰器,此处会跳过进行 CSRF 验证
return HttpResponse('POST request')
该实例通过继承 Django 中的 View 类来定义一个视图,使用 method_decorator 将 csrf_exempt 装饰器装饰在 View 类的 dispatch() 方法上,这样就可以禁用 MyView 类中的 POST 请求的 CSRF 校验了。
以上就是 csrf_exempt() 的作用与使用方法的完整攻略及两个实例的示范。