目录

一: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中间件?(七个中间件-自定义中间件)的更多相关文章

  1. asp.net core 系列之中间件进阶篇-编写自定义中间件(middleware)

    中间件是被用到管道(pipeline)上来处理请求(request)和响应的(response). asp.net core 本身提供了一些内置的中间件,但是有一些场景,你可能会需要写一些自定义的中间 ...

  2. Django基础七之CBV装饰器和中间件

    Django基础七之CBV装饰器和中间件 目录 Django基础七之CBV装饰器和中间件 1. CBV加装饰器 2. Django中间件 2.1 Django中间件介绍 2.2 自定义中间件 2.2. ...

  3. (28)django的中间件(自定义中间件和防范跨站请求伪造攻击)-重要的概念

    Django中间件和中间件不是同一种东西 什么是中间件:中间件是一个很大的概念,只要程序和程序之间还有一层程序,用来处理两个程序的整个交互过程的请求.数据等等就叫中间件 Django中间件:是介于re ...

  4. {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证

    Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...

  5. django系列8.1--django的中间件01 自定义中间件的5个方法

    一.Django中的中间件 Django中间件定义: Middleware is a framework of hooks into Django's request/response process ...

  6. django 自定义中间件 middleware

    Django 中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强 ...

  7. Django框架(十二)-- 中间件、CSRF跨站请求伪造

    中间件 一.什么是中间件 请求的时候需要先经过中间件才能到达django后端(urls,views,templates,models) 响应的时候也需要经过中间件才能到达web服务网关接口 djang ...

  8. Django框架-cookie和session以及中间件

    目录 一.cookie 和 session 1.为什么会有这些技术 2. cookie 2.1 Django如何设置cookie 2.2 Django如何获取cookie 2.3 Django如何设置 ...

  9. Django 源码小剖: 初探中间件(middleware)

    因为考虑到文章的长度, 所以 BaseHandler 的展开被推迟了. 在 BaseHandler 中隐藏着中间件的信息, 较常见的 SessionMiddleware 就已经默认安装.  BaseH ...

  10. Django进阶(路由系统、中间件、缓存、Cookie和Session、Ajax发送数据

    路由系统 1.每个路由规则对应一个view中的函数 url(r'^index/(\d*)', views.index), url(r'^manage/(?P<name>\w*)/(?P&l ...

随机推荐

  1. (三)JPA - EntityManager的使用

    (二)JPA 连接工厂.主键生成策略.DDL自动更新 建议在需要使用时,看看之前的文章,先把环境搭起来. 4.EntityManager EntityManager 是完成持久化操作的核心对象. En ...

  2. PAT (Basic Level) Practice 1032 挖掘机技术哪家强 分数 20

    为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 105 的正整数 N,即参赛人数.随后 N  ...

  3. 中小制造企业需要ERP和MES吗?

    并不是所有中小制造企业都需要ERP和MES,这个取决于你的规模和管理思维与模式!匹配很重要,不同规模的企业做不同的选择!比如你大型企业,一般是要使用ERP的,其工厂也应该需要上MES系统,ERP主要用 ...

  4. [题解] Codeforces Global Round 22 1738 A B C D E F 题解

    很久没rated打过cf的比赛了,这次打得还行,至少进前100了 点我看题 A. Glory Addicts 把类型0的数放进数组a里,类型1的数放进数组b里.如果\(|a|=|b|\),你可以把所有 ...

  5. 基于Netty的TCP服务框架

    19年写的一个基础的TCP服务框架,内置了一个简单IOC容器,当时的目标是一方面能作为组件供第三方集成实现TCP通讯相关功能,另一方面作为提供一种服务框架范式.所以框架核心点主要还是通过适度的封装,隐 ...

  6. Vue3 Vite3 状态管理 pinia 基本使用、持久化、在路由守卫中的使用

    在<基于 vite 创建 vue3 项目>一文中整合了 pinia,有不少伙伴不知道 pinia 是什么,本文简单介绍 pinia.主要包括三方面: pinia 的基本用法,在<基于 ...

  7. python-D1-typora软件和计算机入门1

    一 typora软件 typora是一款目前非常火爆文本编辑器 1.1 安装 尽量安装在非系统盘符及设置为短路径,方便后面查找 1.2 文件路径 在计算机上就是一个资源的定位坐标,表现为具体在哪里,例 ...

  8. C语言常见的八大排序(详解)

    冒泡排序 优点:写起来简单 缺点:运算量过大每两个之间就要比较一次 冒泡排序在一组需要排序的数组中,对两两数据顺序与要求顺序相反时,交换数据,使大的数据往后移,每趟排序将最大的数放在最后的位置上 如下 ...

  9. Docker | 容器互联互通

    上篇讲到创建自定义网络,我创建了 mynet 网络,并指定了网关和子网地址.在上篇结尾呢,我抛出了一个问题:其它网络下的容器可以直接访问mynet网络下的容器吗?今天就让我们一块看下怎么实现容器互联. ...

  10. 基于win11安装Java11环境

    下载JDK解压版本 下载后解压,并放到一个没有中文路径的目录,如图所示: 配置Java环境变量 以Windows11系统为例,打开设置,搜索"环境",点击"编辑系统环境变 ...