django如何自己创建一个中间件
作者:苦瓜爆炒牛肉 发布时间:2021-03-31 10:26:59
标签:django,创建,中间件
中间件是什么?
中间件是类似flask函数中钩子函数的东西。可以在请求视图函数前,或者视图函数响应后处理某些事情。中间件对全部视图都有效!
中间件一般会有两个方法,process_request和process_response。分别用来处理请求到达视图函数前,到达视图函数后的事情。
编写一个自定义的中间件
我们可以根据业务需要自己编写一个中间件。在编写中间件前,你需要读一下django.utils.deprecation.MiddlewareMixin的源码。
class MiddlewareMixin(object):
def __init__(self, get_response=None):
self.get_response = get_response
super(MiddlewareMixin, self).__init__()
def __call__(self, request):
response = None
if hasattr(self, 'process_request'):
response = self.process_request(request)
if not response:
response = self.get_response(request)
if hasattr(self, 'process_response'):
response = self.process_response(request, response)
return response
方法名 | 作用 | 返回值 | 备注 |
---|---|---|---|
__init__(self, get_response=None) | 服务器启动(重启)时执行一次 | 无 | -- |
process_request(self, request) | 在视图执行之前调用 |
| -- |
process_response(self, request, response) | 在视图执行完之后调用 | 必须返回HttpResponse对象 | -- |
编写自定义的中间件:
class My_middleware(MiddlewareMixin):
def __init__(self,get_response=None):
super().__init__(get_response)
def process_request(self,request):
"""
视图函数前执行的,一旦这里有return将到达不了视图函数
request是浏览器发过来的请求
"""
print("视图函数执行前")
def process_response(self,request,response):
"""
视图函数后执行的
request是浏览器发过来的请求
response是视图函数返回的响应
"""
print("视图函数执行后")
# 因为你拿了视图函数的response,就算处理的业务与response无关也要返回response
return response
中间件的注册
MIDDLEWARE = [
...
'middlewares.My_middleware' # 写上自己的路径
]
多个中间件的执行顺序
!!!如果你定义了多个中间件,记得注意一下中间件摆在setting.py文件的位置:
注册中间件设置是由上到下执行的,所以上面的中间件会先被注册
对于视图函数执行前的process_request,先注册的中间件会先执行
对于视图函数执行后的process_response,后注册的中间件会先执行
例如:
先注册中间件1,后注册中间件2。
输出结果是:
before 视图(中间件1)
before 视图 2(中间件2)
==index==
after 视图 2(中间件2)
after 视图(中间件1)
来源:https://www.cnblogs.com/chichung/p/9897303.html


猜你喜欢
- 前言&最近因为一些原因,没有更博客,昨天老师布置了一个作业,用vue实现增删改查功能,想想这也不难,就做一下试试吧。因为自己写的样式
- 微信的小程序是一个很不错的体验,简单,上手快,这几天也在学习使用小程序,自己总结了三种用 Python 作为小程序后端的方式,供你参考。方法
- 前言1992年扫雷被加入到windows3.1,成为早期windows的经典游戏。近来接触python的GUI(图形化)编程,于是通过编写扫
- python3.6使用pymysql连接Mysql数据库及简单的增删改查操作,供大家参考,具体内容如下折腾好半天的数据库连接,由于之前未安装
- np.newaxis 新增一个轴 如何将数组[0,1,2]转换成列向量用ndarray[: , np.newaxis]代码实质就是将原本的(
- 针对这种情况,人工智能自动SQL优化工具应运而生。现在我就向大家介绍这样一款工具:SQLTuning for SQL Server。1. S
- 本文主要介绍了Python中list[::-1]的几种用法,分享给大家,具体如下:s = "abcde"list的[]中
- 本文实例讲述了mysql语句实现简单的增、删、改、查操作。分享给大家供大家参考,具体如下:1、创建db_shop数据库,如果该数据库不存在则
- 目录一.models数据库映射二.serializers序列化三.url路由四.Views视图类一.models数据库映射from djan
- 问题如图:想要删除产品表的主键约束,但是报错创建的产品表:CREATE TABLE PROVIDERS(PROVIDERID INT NOT
- position属性可以让你让你随意控制一个特定元素在浏览器何处以及如何显示。比方说我们用position:fixed 让一个图片显示在浏览
- 在程序中,有多种方法进行强制类型转换。本博文将介绍一个非常常用的方法:to()方法。我们通常使用它来进行GPU和CPU的类型转换,但其实也可
- 英文文档:locals()Update and return a dictionary representing the current l
- 1、查看是否启用了日志:show variables like 'log_bin';2、查看当前日志文件名:show mas
- 名片管理系统一、思路1、定义名片操作选项2、把增加的名片信息存储到字典中3、所有名片信息存储到列表4、对于误操作给出提示二、用到的知识点1、
- 大家好,今天我们要看看如何用 Python制作音乐播放器。此音乐播放器播放您的歌曲,您可以在播放歌曲时暂停、恢复、设置音量,然后您可以停止音
- Unittest1.环境Unittest为Python内嵌的测试框架,不需要特殊配置,仅需要在File---settings---Tools
- 本文实例为大家分享了python openCV自制绘画板的具体代码,供大家参考,具体内容如下import numpy as npimport
- 本文实例讲述了Python简单网络编程。分享给大家供大家参考,具体如下:内容目录1. 客户端(client.py)2. 服务端(server
- 一个小项目自动登录淘宝联盟抓取数据,由于之前在Github上看过类似用Python写的代码因此选择用Python来写,第一次用Python正