Django框架中的CSRF原理这篇文章中, 我们已经知道,如果不注释掉django.middleware.csrf.CsrfViewMiddleware的话,django会在全局的POST请求中添加token验证,不带就会报错。那么这通常是不太好的,现在我们有两个不需要做token验证,那么我们需要单独进行配置,现在有10个不需要做token就需要配置10个,非常的麻烦。django给我们提供了一种方法,只需要对使用token验证的POST请求做一下配置就可以了,两者调换一下会方便很多。

跨站请求伪造

django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成。而对于django中设置防跨站请求伪造功能有分为全局和局部。

  • @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
  • @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
注:from django.views.decorators.csrf import csrf_exempt,csrf_protect

那么简单理解,在需要进行token认证的函数上添加装饰器@csrf_protect,不需要认证添加装饰器@csrf_exempt。现在我们在全局中打开csrf注释,也就是所有的POST请求都需要token认证:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_exempt   #当前函数不需要认证
def login(request):

    if request.method=='GET':
        return render(request,'login.html')
    if request.method=='POST':
        pass

如果注释掉全局的django.middleware.csrf.CsrfViewMiddleware,代表所有的函数都不需要token认证,那么在需要认证的函数上添加@csrf_protect装饰器即可。

发表评论

后才能评论