什么是django中间件?(七个中间件-自定义中间件)
一:django中间件
1.什么是django中间件
Django中间件是Django的门户
1.请求来的时候需要先经过中间件才能到达真正的Django后端
2.响应走的时候最后也需要经过中间件才能发送出去
2.django请求生命周期流程图
- Django的七个中间件
二: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',
]
1.研究django中间件代码规律
1.以上django自带中间件看着是字符串,其实,它是一个模块,类。
2.其实django自带中间件是一条导入语句,只不过变成字符串的形式
# 'django.contrib.sessions.middleware.SessionMiddleware'
class SessionMiddleware(MiddlewareMixin):
def process_request(self, request):
session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME)
request.session = self.SessionStore(session_key)
def process_response(self, request, response):
return response
# 'django.middleware.csrf.CsrfViewMiddleware'
class CsrfViewMiddleware(MiddlewareMixin):
def process_request(self, request):
csrf_token = self._get_token(request)
if csrf_token is not None:
# Use same token next time.
request.META['CSRF_COOKIE'] = csrf_token
def process_view(self, request, callback, callback_args, callback_kwargs):
return self._accept(request)
def process_response(self, request, response):
return response
# 'django.contrib.auth.middleware.AuthenticationMiddleware'
class AuthenticationMiddleware(MiddlewareMixin):
def process_request(self, request):
request.user = SimpleLazyObject(lambda: get_user(request))
2.django支持程序员自定义中间件并且暴露给程序员五个可以自定义的方法
2.1必须掌握
process_request
process_response
2.2了解即可
process_view
process_template_response
process_exception
三:如何自定义中间件
1.自定义中间件理论
1.在项目名或者应用名下创建一个任意名称的文件夹
2.在该文件夹内创建一个任意名称的py文件
3.在该py文件内需要书写类(这个类必须继承MiddlewareMixin)
3.2 然后在这个类里面就可以自定义五个方法了
3.3 这个五个方法并不是全部都需要书写 用几个写几个
4.需要将类的路径以字符串的形式注册到配置文件中才能生效
2.以字符串的形式注册到配置文件才能生效
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',
'你自己写的中间件的路径1',
'你自己写的中间件的路径2',
'你自己写的中间件的路径3',
]
四:必须掌握(process_request与process_response )
1.process_request 请求来的时候效验
process_request
1.请求来的时候需要经过每一个中间件里面的process_request方法
结果的顺序是按照配置文件中注册的中间件从上往下的顺序依次执行
2.如果中间件里面没有定义该方法,那么直接跳过执行下一个中间件
3.如果该方法返回了HttpResponse对象,那么请求将不再继续往后执行
而是直接原路返回(校验失败不允许访问...)
process_request方法就是用来做全局相关的所有限制功能
2.process_response 请求走的时候效验
process_response
1.响应走的时候需要经过每一个中间件里面的process_response方法
该方法有两个额外的参数request,response
2.该方法必须返回一个HttpResponse对象
1.默认返回的就是形参response 因为response就是后端返回给前端的内容,不然报错
2.你也可以自己返回自己的
3.顺序是按照配置文件中注册了的中间件从下往上依次经过
![image](https://img2022.cnblogs.com/blog/2608805/202203/2608805-20220320233030548-1869094438.png)
个
3.研究(process_request方法就已经返回了HttpResponse对象):
如果在第一个process_request方法就已经返回了HttpResponse对象,那么响应走的时候是经过所有的中间件里面的process_response还是有其他情况?
答案: 是其他情况
解析:
就是会直接走同级别的process_response返回
4.flask与django中间件两者区别
flask框架也有一个中间件但是它的规律
只要返回数据了就必须经过所有中间件里面的类似于process_response方法
5.process_view(了解)
执行时间:
1.路由匹配成功之后执行视图函数之前,会自动执行中间件里面的该方法
2.顺序是按照配置文件中注册的中间件从上往下的顺序依次执行
作用:
在执行某一个视图函数之前,可以在process_view里面做一些零时的额外操作。
6.process_template_response
触发时间:
1.返回的HttpResponse对象有render属性的时候才会触发
2.顺序是按照配置文件中注册了的中间件从下往上依次经过
7.process_exception
1.当视图函数中出现异常的情况下触发
2.顺序是按照配置文件中注册了的中间件从下往上依次经过
五:实战案例自定义中间件
- mymiddleware.mydd.py
# 导入MiddlewareMixin
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
# 自定义中间件1
class MyMiddleware1(MiddlewareMixin):
def process_request(self, request):
print('我是第一个自定义process_request方法')
def process_response(self, request, response):
print('我是第一个自定义中间件里面的process_response方法')
return response
def process_view(self, request, view_name, *args, **kwargs):
print(view_name, args, kwargs)
print('我是第一个自定义中间件里面的process_view')
def process_template_response(self, request, response):
print('我是第一个自定义中间件里面的process_template_response')
return response
def process_exception(self, request, exception):
print('我是第一个中间件里面的process_exception')
print(exception)
# 自定义django中间件2
class MyMiddleware2(MiddlewareMixin):
def process_request(self, request):
print('我是第二个自定义process_request方法')
def process_response(self, request, response):
print('我是第二个自定义中间件里面的process_response方法')
return response
def process_view(self, request, view_name, *args, **kwargs):
print(view_name, args, kwargs)
print('我是第二个自定义中间件里面的process_view')
def process_template_response(self, request, response):
print('我是第二个自定义中间件里面的process_template_response')
return response
def process_exception(self, request, exception):
print('我是第二个中间件里面的process_exception')
print(exception)
八:模块importlib
1.需求
a.py不使用导入b.py的功能拿到b.py
2.模块importlib
1.作用于字符串的导入,内部按照字符串的点分割成导入文件的形式。
2.缺陷 该方法最小单位只能到py文件名
3.使用
import importlib
res = 'myfile.b'
ret = importlib.import_module(res) # from myfile import b
print(ret)
只能拿到b.py的对象
# <module 'myfile.b' from 'D:\\计算机知识存储\\中间件\\myfile\\b.py'>
七:自定制settings中间件
1.需求
实现用户一点击发送,公司内所有的QQ,微信,邮箱,都收到信息。
notify相当于包所以需要__init__
notify文件夹
2.init.py
import settings
import importlib
def send_all(content):
# path_str = 就是 一个一个settings内的字符串 'notify.email.Email'
for path_str in settings.NOTIFY_LIST:
# rsplit从右往左切 只切一次
module_path, class_name = path_str.rsplit('.', maxsplit=1)
# module_path = 'notify.email' class_name = 'Email' 都是字符串的形式
# 1.利用字符串导入模块
module = importlib.import_module(module_path)
# 相当于在导模块 form notify import email
# 2.利用反射获取类名
cls = getattr(module, class_name)
# 拿到真正的类的名字 Email QQ Wechat
# 3.生成类的对象
obj = cls()
# 4.利用鸭子类型调用send方法
obj.send(content)
# QQ.py
class QQ(object):
def __init__(self):
pass # 发送微信需要做的前期准备工作
def send(self, content):
print('qq通知:%s' % content)
# email.py
class Email(object):
def __init__(self):
pass # 发送邮箱需要做的前期准备工作
def send(self, content):
print('邮箱通知:%s' % content)
# wechat.py
class Wechat(object):
def __init__(self):
pass # 发送微信需要做的前期准备工作
def send(self, content):
print('微信通知:%s' % content)
settings.py
NOTIFY_LIST = [
'notify.email.Email',
'notify.qq.QQ',
'notify.wechat.Wechat'
]
start.py
import notify
notify.send_all('快下课了')
什么是django中间件?(七个中间件-自定义中间件)的更多相关文章
- asp.net core 系列之中间件进阶篇-编写自定义中间件(middleware)
中间件是被用到管道(pipeline)上来处理请求(request)和响应的(response). asp.net core 本身提供了一些内置的中间件,但是有一些场景,你可能会需要写一些自定义的中间 ...
- Django基础七之CBV装饰器和中间件
Django基础七之CBV装饰器和中间件 目录 Django基础七之CBV装饰器和中间件 1. CBV加装饰器 2. Django中间件 2.1 Django中间件介绍 2.2 自定义中间件 2.2. ...
- (28)django的中间件(自定义中间件和防范跨站请求伪造攻击)-重要的概念
Django中间件和中间件不是同一种东西 什么是中间件:中间件是一个很大的概念,只要程序和程序之间还有一层程序,用来处理两个程序的整个交互过程的请求.数据等等就叫中间件 Django中间件:是介于re ...
- {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证
Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...
- django系列8.1--django的中间件01 自定义中间件的5个方法
一.Django中的中间件 Django中间件定义: Middleware is a framework of hooks into Django's request/response process ...
- django 自定义中间件 middleware
Django 中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强 ...
- Django框架(十二)-- 中间件、CSRF跨站请求伪造
中间件 一.什么是中间件 请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models) 响应的时候也需要经过中间件才能到达web服务网关接口 djang ...
- Django框架-cookie和session以及中间件
目录 一.cookie 和 session 1.为什么会有这些技术 2. cookie 2.1 Django如何设置cookie 2.2 Django如何获取cookie 2.3 Django如何设置 ...
- Django 源码小剖: 初探中间件(middleware)
因为考虑到文章的长度, 所以 BaseHandler 的展开被推迟了. 在 BaseHandler 中隐藏着中间件的信息, 较常见的 SessionMiddleware 就已经默认安装. BaseH ...
- Django进阶(路由系统、中间件、缓存、Cookie和Session、Ajax发送数据
路由系统 1.每个路由规则对应一个view中的函数 url(r'^index/(\d*)', views.index), url(r'^manage/(?P<name>\w*)/(?P&l ...
随机推荐
- Ubuntu20.04和Docker环境下安装Redash中文版
创建Ubunt20.04虚拟机,请参考:https://www.linuxidc.com/Linux/2020-03/162547.htm 一.安装基础环境: # 1.更换APT国内源 sudo se ...
- Opengl ES之纹理贴图
纹理可以理解为一个二维数组,它可以存储大量的数据,这些数据可以发送到着色器上.一般情况下我们所说的纹理是表示一副2D图,此时纹理存储的数据就是这个图的像素数据. 所谓的纹理贴图,就是使用Opengl将 ...
- salesforce零基础学习(一百一十九)In-App Guidance实现引导页操作功能
本篇参考: https://help.salesforce.com/s/articleView?id=sf.customhelp_lexguid.htm&type=5 https://deve ...
- Codeforces Round #442 (Div. 2) B. Nikita and string
题意:求最长可以分a b a为三部分子串,a b a可以为空 思路在代码里 1 #include<cstdio> 2 #include<iostream> 3 #include ...
- BinaryBombs(二进制炸弹实验)
实验介绍 使用所学知识拆除Binary Bombs来增强对程序的机器级表示.汇编语言.调试器和逆向工程等理解. Binary Bombs(二进制炸弹)是一个可执行程序,是C语言编译链接成的,包含pha ...
- day10-习题
习题 1.Homework01 (1) D -- 没有在别名上加引号(ps:别名的as可以省略) (2) B -- 判断null或非空不能用不等于号 (3) C 2.Homework02 写出查看de ...
- Ubuntu 环境下安装 Docker
系统要求 Docker目前只能运行在64位平台上,并且要求内核版本不低于3.10,实际上内核越新越好,过低的内核版本容易造成功能不稳定. 用户可以通过如下命令检查自己的内核版本详细信息: $ unam ...
- centos7搭建安装loki、promtail、Grafana日志系统
loki.promtail.Grafana安装包 链接:https://pan.baidu.com/s/1vkSa_KYrXM0UEI8i42KdaA 提取码:4d4q 如果安装失败或者下载速度慢可以 ...
- 后端框架的学习----mybatis框架(7、使用注解开发)
7.使用注解开发 1.注解在接口上实现 /** * 查询用户 */ @Select("select * from user") public List<User> ge ...
- sql面试50题------(21-30)
文章目录 21.查询不同老师所教不同课程平均分从高到低显示 23.使用分段[100,85),[85,70),[70,60),[<60] 来统计各科成绩,分别统计各分数段人数:课程ID和课程名称 ...