django post 请求报csrf错误

django post 请求报csrf错误_第1张图片

首先我们要先弄清楚csrf是什么
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。(参考自百度百科)

所以django为了安全性的考虑我们就应该提交一个csrf 的 token 给django

django 怎么实现csrf验证的:

其实这是用django中的中间件在做的
django中的中间件有:

process_request
process_view
process_response
process_exception
process_render_template
django的中间件可以做:权限用户登陆验证

其中Django的csrf验证是用到了 process_view函数来实现的
我们可以在Django项目的setting.py 文件中找到图中的中间键:

django post 请求报csrf错误_第2张图片

我们只需要注释掉红框中的内容就好了,这样在我们整个django项目中就可以屏蔽掉csrf的验证就不会报错了,但是这样做会影响到我们项目的安全性,所以这样做是不推荐的,接下里我推荐大家另外一种做法。

解决方法

首先在view里面, 引入装饰器
from django.views.decorators.csrf import csrf_exempt
然后我们再像下面一样在函数前面加上这个装饰器:

django post 请求报csrf错误_第3张图片

加上这个装饰器就能让这一个函数避免csrf验证从而报错,也能避免破坏全局的csrf验证从而影响我们项目的安全性的。

CBV模式下避免导致csrf验证

有的朋友可能不知道什么是FBV,和CBV是什么意思。
简单的说就是:我们在view中不是直接写函数,而是写类,类中有get post put 等函数,在类中加上:


django post 请求报csrf错误_第4张图片
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator

class StudentsView(View):
    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super(StudentsView, self).dispatch(request, *args, **kwargs)

    def get(self, reuqest, *args, **kwargs):
        return HttpResponse('GET')

    def post(self, request, *args, **kwargs):
        return HttpResponse('post')

    def delete(self, request, *args, **kwargs):
        return HttpResponse('DELETE')

    def put(self, request, *args, **kwargs):
        return HttpResponse('PUT')

或者还有另外一种方法,直接把装饰器放在类的外面

@method_decorator(csrf_exempt, name='dispatch')
class StudentsView(View):
    def get(self, reuqest, *args, **kwargs):
        return HttpResponse('GET')

    def post(self, request, *args, **kwargs):
        return HttpResponse('post')

    def delete(self, request, *args, **kwargs):
        return HttpResponse('DELETE')

    def put(self, request, *args, **kwargs):
        return HttpResponse('PUT')

你可能感兴趣的:(django post 请求报csrf错误)