美文网首页
Django-24 中间件

Django-24 中间件

作者: JuliusL | 来源:发表于2021-07-31 12:07 被阅读0次
    • 中间件是Django请求/响应处理的钩子框架。它是一个轻量级的、低级的“插件”系统,用于全局改变Django的输入输出
    • 中间件以类的形式体现
    • 每个中间件组件负责做一些特定的功能。例如:Django包含一个中间件组件AuthenticationMiddleware,它使用会话将用户与请求关联起来。

    编写中间件

    • 中间件类必须继承自django,urils.deprecation.MiddlewareMixin类

    • 中间件类需事先下列五个方法中的一个或多个:

      • process_request(self,request):
        执行路由前被调用,在每个请求上调用,返回None或HttpResponse对象
      • process_view(self,request,callback,callback_args,callback_kwargs):
        调用视图之前被调用,在每个请求上调用,返回None或HttpResponse对象
      • process_response(self,request,response)
        所有响应返回浏览器前被调用,在每个请求上调用,返回HttpResponse对象
      • process_exception(self,request,exception)
        当处理过程中抛出异常时调用,返回一个HttpResponse对象
      • process_template_response(self,request,response)
        在视图函数执行完毕且试图返回的对象中包含render方法时被调用;该方法需要返回实现了render方法的响应对象
    • 注:中间件的大多数方法在返回None时表示忽略当前操作进入下一项事件,当返回HttpResponse对象时表示此请求结束,直接返回给客户端

    注册中间件

    • settings.py 中需要注册一下,自定义的中间件
    MIDDLEWARE = [
      ...
    ]
    
    • 注意:配置为数组,中间件被调用时以“先上到下”再“由下到上”的顺序调用

    案例:访问5次禁止访问

    
    class VisitLimit(MiddlewareMixin):
    
        visit_times = {}
    
        def process_request(self,request):
            ip_address = request.META['REMOTE_ADDR']
            path_url = request.path_info
            if not re.match('^/test',path_url):
                return 
            times = self.visit_times.get(ip_address,0)
            print('ip',ip_address,'已经访问',times)
            self.visit_times[ip_address] = times + 1
            if times < 5:
                return
            
            return HttpResponse("您已经访问过"+str(times)+"次,访问被禁止")
    
    
    Django请求流程图.png

    CSRF防范

    • django采用'比对暗号'机制防止攻击
    • Cookies中存储暗号1,模板中表单里藏着暗号2,用于只有在本网站下提交数据,暗号2才会随表单提交给服务器,django对比两个暗号,对比成功,则认为是合法请求,否则是违法请求-403响应码

    配置步骤:

    1,settings.py中确认MIDDLEWARE中django.middleware.csrf.CsrfViewMiddleware是否打开
    2,模板中,form标签下添加如下标签

    {% csrf_token %}
    

    特殊说明

    如果某个视图不需要django进行csrf保护,可以用装饰器关闭对此视图的检查
    样例:

    from django.views.decorators.csrf import csrf_exempt
    
    @csrf_exempt
    def my_view(request):
      return HttpResponse('Hello world')
    

    相关文章

      网友评论

          本文标题:Django-24 中间件

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