IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> django2.2-中间件简介及自定义中间件 -> 正文阅读

[Python知识库]django2.2-中间件简介及自定义中间件

一、中间件介绍

中间件是一个用来处理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

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

注意:

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

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

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

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

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-17 11:57:20  更:2021-10-17 11:58:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 12:05:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计