当前位置: 首页 > news >正文

Django2.0——中间件

Django中间件middleware本质是一个类,在请求到返回的中间,类中不同的方法会在指定的时机中被触发。setting.py的变量MIDDLEWARE_CLASSES中的每一个元素都是中间件,且这些注册的中间件之间,有着严格的执行顺序。在request到url层之间,中间件的执行顺序是从上而下,依次执行。在response到浏览器之间,中间的执行顺序变成从下至上。

通常情况下,Django默认配置的中间件如下:

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',
]

中间件的执行顺序如下图所示:

写中间件类的定义五种方法如下,它们分别代表着各自不同的执行时机。

  • process_request(self,request):执行视图前被调用,返回None或HttpResponse对象
  • process_view(self,request,callback,callback_args,callback_kwargs):调用视图函数之前被执行,返回None或HttpResponse

上面两个方法是在请求到视图之间可以被执行的方法,若其中任意一个返回的HttpResponse,那么这个请求就不会到达视图层,而是直接返回给浏览器。

  • process_template_response(self,request,response):视图函数渲染模板后立即被调用。
  • process_exception(self,request,exception):在视图函数抛出异常时被调用,返回一个HttpResponse对象。
  • process_response(self,request,response):所有响应返回到浏览器之前被调用,返回一个HttpResponse对象。

以上三个方法都是发生在response到客户端之间。

自定义中间件

自定义中间件要导入from django.utils.deprecation import MiddlewareMixin,下面写的类都是基于MiddlewareMixin来写。自定义的中间件写好后要记得在setting中进行注册。中间件的作用范围是整个项目下的所有主路由及其子路由(各个app)。

自定义中间件的第一种方式:

from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse

class Usermiddle(MiddlewareMixin):
    def process_request(self,request):
        print('这是方法1')
        return None
    def process_view(self,request,callback,callback_args,callback_kwargs):
        print('这是方法2')
        return None
    def process_template_response(self,request,response):
        print('渲染模板后执行')
        return response
    def process_exception(self,request,exception):
        print('视图函数抛出异常')
        return HttpResponse(exception)
    def process_response(self,request,response):
        print('这是方法5')
        return response

自定义中间件的第二种方式:

class Usermiddle1(object):
    def __init__(self,get_response):
        self.get_response = get_response
    def __call__(self, request):
        #从这开始是请求到视图前执行的语句
        print('xxx')

        #从这结束请求到视图前执行的语句
        response = self.get_response(request)
        # 从这开始是response到浏览器前执行的语句
        print('xxx')

        # 从这结束response到浏览器前执行的语句
        return response

注册这两个类:

转载于:https://www.cnblogs.com/longwhite/p/10397665.html

相关文章:

  • 蔚来总裁秦力洪:不要贴标签说ES8不好 短期压力是做好服务
  • 菜鸟问题
  • python之dict与set实现原理之hash算法
  • onLoad onShow
  • CSS利用@font-face使用自定义字符和图标
  • [译] 时间序列异常检测算法
  • Vue优化首页加载速度 CDN引入
  • 【更新】Infragistics Ultimate UI for WPF v18.2(三):Excel引擎
  • javascript开发使用奇淫技巧
  • 51、多线程创建的三种方式之实现Callable接口
  • linux下编译visp库
  • CF788B Weird journey
  • UOJ #390. 【UNR #3】百鸽笼
  • python 基础复习 03
  • Docker入门实战 (二) - Docker环境的搭建方法
  • 【Amaple教程】5. 插件
  • java小心机(3)| 浅析finalize()
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • JS专题之继承
  • learning koa2.x
  • node入门
  • V4L2视频输入框架概述
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 百度小程序遇到的问题
  • 分布式熔断降级平台aegis
  • 老板让我十分钟上手nx-admin
  • 数组的操作
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • Spring第一个helloWorld
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #define与typedef区别
  • (11)MSP430F5529 定时器B
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (poj1.2.1)1970(筛选法模拟)
  • (Python) SOAP Web Service (HTTP POST)
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (译)计算距离、方位和更多经纬度之间的点
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net项目IIS、VS 附加进程调试
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [CareerCup] 6.1 Find Heavy Bottle 寻找重瓶子
  • [CF543A]/[CF544C]Writing Code
  • [CSS]文字旁边的竖线以及布局知识
  • [CVPR 2023:3D Gaussian Splatting:实时的神经场渲染]
  • [Docker]三.Docker 部署nginx,以及映射端口,挂载数据卷
  • [java进阶]——方法引用改写Lambda表达式
  • [LeetCode周赛复盘] 第 310 场周赛20220911
  • [ListView.View=List]的垂直滚动条
  • [Neural Network] {Université de Sherbrooke} L2.9 Param Initialization
  • [No000016]为什么假期计划总是做不到?