django2.2-中间件简介及自定义中间件


豌豆完美
豌豆完美 2022-09-21 09:16:37 66058
分类专栏: 资讯

一、中间件介绍

中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入(请求要先由它处理)和输出(响应也要在最后让它处理)。每个中间件组件都负责做一些特定的功能。

换个直白点的说法:中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法

涉及全局相关的功能,都可以通过中间件实现,比如:

  • 全局用户身份验证;
  • 全局用户权限校验;
  • 全局用户访问频率监控;
  • ……

但是由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能。

1. django默认启用(注册)的中间件

django自带一些中间件,其中有七个是默认就启用的,注册在settings.py文件中的MIDDLEWARE列表中:

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',
]
中间件。 

2. 中间件的顺序

在请求阶段:中间件的执行顺序就是列表中的注册顺序(从上到下);

在响应阶段:中间件的执行顺序就恰好和请求阶段相反(从下到上)

并且,由于部分中间件之间有依赖关系,例如: AuthenticationMiddleware 需要在会话中间件中存储的经过身份验证的用户信息,因此它必须在 SessionMiddleware 后面运行 。所以,对于django的内置中间件的顺序建议如下:

  1. SecurityMiddleware
  2. UpdateCacheMiddleware
  3. GZipMiddleware
  4. SessionMiddleware
  5. ConditionalGetMiddleware
  6. LocaleMiddleware。
  7. CommonMiddleware
  8. CsrfViewMiddleware
  9. AuthenticationMiddleware
  10. MessageMiddleware
  11. FetchFromCacheMiddleware
  12. FlatpageFallbackMiddleware
  13. RedirectFallbackMiddleware

以上中间件的说明请参考官方文档:传送门

二、自定义中间件

第一步:在项目目录或app目录下创建一个任意名称的文件夹;

第二步:在文件夹内创建一个任意名称的py文件;

第三步:在py文件内书写类,之后就可以在类中自定义django提供的3个钩子方法(看需要,不一定3个都定义),一定要注意执行顺序编号

class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
          配置和初始化

    def __call__(self, request):
        """
        :param request:  HttpRequest对象
        """

        """ 
        1. 在这里编写刚收到请求,视图和后面的中间件被调用之前需要执行的代码
           如果需要可以返回HttpResponse对象,这将直接返回给浏览器,不可以返回其他对象
		"""
        
        response = self.get_response(request)   执行视图或下一个中间件,总之,就是下一步的意思

        
        """
        5. 在这里编写视图调用后,返回响应之前需要执行的代码
           必须返回response
        """
        return response
 

    def process_view(self, request, view_func, view_args, view_kwargs):
        """
        2. 执行完__call__方法的前半部分之后,执行视图之前的代码,注意是执行视图之前!
        :param request:  HttpRequest对象
        :param view_func:  真正的视图函数对象(不是函数的字符串名称)
        :param view_args:  位置参数列表
        :param view_kwargs:  关键字参数字典
        :return:  None(继续下一步)或者HttpResponse对象(响应内容返回给浏览器)
        """
        pass

    
    def process_exception(self,request,exception):
        """
        3. 在视图执行过程中,发生异常时执行
        :param request:  HttpRequest对象
        :param exception:  视图引发的异常对象
        :return:  None(继续下一步)或者HttpResponse对象(响应内容返回给浏览器)
        """
		pass
        
        
    def process_template_response(self, request, response):
        """
        4. 视图执行完毕,__call__方法下半部分执行之前执行
        :param request:  HttpRequest对象
        :param response:  TemplateResponse 对象
        :return:  render方法的响应对象
        """
        pass
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

get_response 方法可能是一个实际视图(如果当前中间件是最后列出的中间件),或者是列表中的下一个中间件。我们不需要关心它到底是什么,它只是代表了下一步要进行的操作。

注意:

  • 视图抛出异常时,会从下往上依次执行每个中间件中的process_exception方法

  • Django仅使用 get_response 参数初始化中间件,因此不能为 __init__() 添加其他参数

  • 与每次请求都会调用 __call__() 方法不同,当 Web 服务器启动后,__init__() 只被调用一次

第四步:像自带的中间件一样,注册自定义的中间件,路径从项目目录开始,不包括项目目录。

文章已被收录至官方知识档案
Python入门技能树Web应用开发 Django127519 人正在系统学习中

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=8741
赞同 0
评论 0 条
豌豆完美L0
粉丝 0 发表 8 + 关注 私信
上周热门
Kingbase用户权限管理  2020
信刻全自动光盘摆渡系统  1749
信刻国产化智能光盘柜管理系统  1419
银河麒麟添加网络打印机时,出现“client-error-not-possible”错误提示  1014
银河麒麟打印带有图像的文档时出错  924
银河麒麟添加打印机时,出现“server-error-internal-error”  715
麒麟系统也能完整体验微信啦!  657
统信桌面专业版【如何查询系统安装时间】  633
统信操作系统各版本介绍  624
统信桌面专业版【全盘安装UOS系统】介绍  598
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

添加我为好友,拉您入交流群!

请使用微信扫一扫!