美文网首页程序员
django post 请求报csrf错误

django post 请求报csrf错误

作者: _AlphaBaby_ | 来源:发表于2018-09-17 19:09 被阅读5次

    首先我们要先弄清楚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项目中就可以屏蔽掉csrf的验证就不会报错了,但是这样做会影响到我们项目的安全性,所以这样做是不推荐的,接下里我推荐大家另外一种做法。

    解决方法

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


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

    CBV模式下避免导致csrf验证

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


    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错误

        本文链接:https://www.haomeiwen.com/subject/shtlnftx.html