zoukankan      html  css  js  c++  java
  • Django--中间件

    一、中间件的执行过程

    二、给中间件加三种方法对应的三种流程

    三、自定义属于自己的中间件

    四、中间件知识点总结

    五、中间件的应用案例

    ---------------------------------------------------------------

    一、中间件的执行过程

    中间件:全局性的逻辑处理部分
    介于request和response之间的处理程序
    settings.py里的MIDDLEWARE就是中间件,有七个,有先后顺序

    请求先到wsgiref被封装成request,
    再到中间件,共七个
    按顺序执行每个中间件的process_request()方法
    从中间件出去后到了路由层,路由分发给相应的视图函数
    处理完后
    顺序执行中间件的process_response()方法
    然后到了wsgiref,封装响应,交给浏览器

    中间件调用流程: 

    二、给中间件加三种方法对应的三种流程

    情况一:

    process_request里写return HttpResponse(..) 请求被拦截。见下图所示

    情况二:

    中间件里写了process_view(self, request,callback, callback_args, callback_kwargs)方法:

    情况三:

    三、自定义属于自己的中间件

    在app01里新建my_middlewares.py
    加到settings.py里的MIDDLEWARE
    "app01.my_middlewares.CustomerMiddleware"

    from django.utils.deprecation import MiddlewareMixin
    class CustomerMiddleware(MiddlewareMixin):
      def process_request(self,request):
        print('request.....')
        #return HttpResponse("forbitton")   如果写这个就会拦截浏览器请求
      def process_response(self, request, response):
        print('response...')
        return response    #不响应要报错
        # 执行完中间件会依次执行各个中间件的process_view方法
        # callback是路由对应的视图函数,callback_args是视图函数的参数
      def process_view(self, request,callback, callback_args, callback_kwargs):
        # 下面这相当于执行对应的视图函数,得到响应再返回,就拦截了
        # response = callback(callback_args,callback_kwargs) 
        # return response
        print('process_view....')
      # 不出错不会执行这个,出错会依次执行中间件的这个方法,直到有中间件返回响应
      def process_exception(self,request,exception):
        print('process_exception...')
        return HttpResponse(exception)

    四、中间件知识点总结

    掌握:
    1、process_request(self, request):中间件访问时执行的方法
    2、process_response(self, request, response):中间件响应的时候执行的方法
    3、执行流程
    了解:
    process_view
    process_exception

    五、中间件的应用案例

    针对大多数视图要做的事情可以放在中间件里去做
    例如校验是否登录,登录就执行视图函数。
    例如限制一分钟内只能访问服务器20次,否则就屏蔽

    中间件的应用案例:

    1、做IP访问频率限制
    某些IP访问服务器的频率过高,进行拦截,比如限制每分钟不能超过20次
    2、URL访问过滤
    如果用户访问的是login视图(放过)
    如果访问其他视图,要检测是否有session认证,已经有了就放行,没有就返回login,
    这样就省得在多个视图函数上写装饰器了

    先在settings.py里定义白名单:WHITE_LIST['login/','reg/','logout/']
    class AuthMiddleware(MiddlewareMixin):
      def process_request(self,request):
        white_list = settings.WHITE_LIST
        if request.path in white_list:
          return None       # 先判断路径是不是白名单的。如果路径在白名单里,就结束这个方法,即放行
        if not request.user.is_authenticated:
          return redirect("/login/")    # 再判断是否登录,未登录的让其登录

  • 相关阅读:
    js字符串数组['1','2','3']转number
    antd-vue中给table表格整行加点击事件
    vue中路由在新的标签页打开
    antd中的form表单 initialValue导致数据不更新问题
    vue中computed的作用以及用法
    gitlab新增ssh
    CentOS7安装配置ActiveMQ
    利用已有的缓存地图文件发布ArcGIS Server瓦片服务
    CentOS7上使用源码安装物联网大数据平台TDengine
    一些可以使用的在线地图服务
  • 原文地址:https://www.cnblogs.com/staff/p/10739732.html
Copyright © 2011-2022 走看看