目录

一: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. ERP 软件为什么很贵?

    ERP软件的贵体现在两个方面,一个是软件系统贵,一个是部署实施贵,究其原因,就是ERP专业性太高.内部业务逻辑忒复杂,而面向形形色色的实体企业时个性化需求又加剧了它整体的复杂性,实施部署客制化无法避免 ...

  2. 一文读懂 MySQL 索引

    1 索引简介 1.1 什么是 MySQL 的索引 官方定义:索引是帮助 MySQL 高效获取数据的数据结构 从上面定义中我们可以分析出索引本质是一个数据结构,他的作用是帮助我们高效获取数据,在正式介绍 ...

  3. Oracle索引和事务

    1. 什么是索引?有什么用? 1)索引是数据库对象之一,用于加快数据的检索,类似于书籍的目录.在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利用索引可以不用翻阅整本书即 ...

  4. 检测 MySQL 服务是否存活 shell脚本

    #!/bin/bash # 检测 MySQL 服务是否存活 # host 为你需要检测的 MySQL 主机的 IP 地址,user 为 MySQL 账户名,passwd 为密码 # 这些信息需要根据实 ...

  5. Kubeadm部署高可用K8S集群

    一 基础环境 1.1 资源 节点名称 ip地址 VIP 192.168.12.150 master01 192.168.12.48 master02 192.168.12.242 master03 1 ...

  6. Request method ‘POST‘ not supported。 Failed to load resource: net::ERR_FAILED

    1.问题描述 技术栈:前后端项目分离(Springboot+Vue+MybatisPlus) 前端报错信息: 后端报错信息: 2.问题分析 这里使用了ResultFul风格的接口设计方式.增删改查对应 ...

  7. 一天十道Java面试题----第一天(面向对象-------》ArrayList和LinkedList)

    这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1.面向对象 2.JDK.JRE.JVM区别和联系 3.==和equals 4.final 5.String .Strin ...

  8. go-zero docker-compose 搭建课件服务(五):完善user服务

    0.转载 go-zero docker-compose 搭建课件服务(五):完善user服务 0.1源码地址 https://github.com/liuyuede123/go-zero-course ...

  9. 【pytest官方文档】解读- 开发可pip安装的第三方插件

    在上一篇的 hooks 函数分享中,开发了一个本地插件示例,其实已经算是在编写插件了.今天继续跟着官方文档学习更多知识点. 一个插件包含一个或多个钩子函数,pytest 正是通过调用各种钩子组成的插件 ...

  10. uniapp/微信小程序 项目day03

    一.商品列表 1.1 获取数据 首先能够进入商品列表的途径 传的数据有 了解了这个之后就可以开始了,先创建分支 创建编译模式,并分配初试数据 这个时候就可以获取数据了 需要的数据 所以在发起请求之前需 ...