python 中间件
中间件一.什么是中间件 中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django 的输入和输出。每个中间件组件都负责做一些特定的功能,中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的 操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在处理请求的特定的时间去执行这些方法。二.自定义中间件(一)中间件可以定义五个方法,分别是:(主要的是process_request和process_response) process_request(self,request) process_view(self, request, view_func, view_args, view_kwargs) process_template_response(self,request,response) process_exception(self, request, exception) process_response(self, request, response)以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。(二)自定义一个中间件示例 1.导入 from django.utils.deprecation import MiddlewareMixin 2.在settings.py的MIDDLEWARE配置项中注册上述两个自定义中间件: 'app01.my_middlewares.MD2', 'app01.my_middlewares.MD1'三.方法:1.process_request 执行时间:视图函数之前 参数:request (同视图函数参数) 执行顺序:按注册的顺序 返回值:如果是none: 则继续按规则执行 如果是 Httpresponse对象: 跳过后面中间件的request方法,直接执行相对应的中间件的response方法.示例: class MD1(MiddlewareMixin): def process_request(self,request): #正序 print("这是MD1request方法")2.process_response 执行时间:视图函数后 参数:request response 执行顺序:按倒序执行 返回值:必须return response 如果返回Httpresponse对象,返回当前Httpresponse对象则直接从最后一个中间件的response开始执行示例 class MD1(MiddlewareMixin): def process_response(self,request,response): #倒序 print('这是MD1response方法') return response 3.process_view 执行时间:request之后,视图函数之前 参数:self, request, view_func, view_args, view_kwargs 执行顺序:按注册顺序执行 返回值:如果是none,正常执行 如果是Httpresponse对象,不执行后面的中间件的view方法,,直接从最后一个中间件的response方法开始执行(执行全部)示例: class MD1(MiddlewareMixin): def process_view(self,request,view_func,view_args,view_kwargs): #顺序 # view_func(request) print('这是MD1view 方法') # return HttpResponse('ok') #不执行MD2的view方法从最后一个中间件的response开始执行倒序4.process_exception 报错才会触发 执行时间: 视图函数之后,response之前 参数: self, request, exception 执行顺序:倒序执行 返回值:返回none:不对错误进行处理,交给下一个中间件进行处理 返回Httpresponse对象:不执行后面的中间件的该方法,直接执行所有中间件的response方法示例: class MD1(MiddlewareMixin): def process_exception(self,request,exception): #报错才显示 视图之后 倒序 print('这是MD1exception 方法') # return HttpResponse('你出错了') 不执行其之后中间件的exception方法 ,直接从最后一个中间件的response方法开始执行5.process_template_response(用的比较少) 视图函数返回的对象中有render方法才触发该方法 执行时间:视图函数之后,response之前 参数:(self, request, response) 执行顺序:倒序 返回值:必须有return 视图函数执行完之后,立即执行了中间件的process_template_response方法,顺序是倒序,先执行MD1的,在执行MD2的, 接着执行了视图函数返回的HttpResponse对象的render方法,返回了一个新的HttpResponse对象,接着执行中间件的 process_response方法 (倒序)。 作业: 中间件实现登陆验证中间件(my_middleware.py): from django.middleware.security import SecurityMiddleware from django.utils.deprecation import MiddlewareMixin from django.shortcuts import render, HttpResponse,redirect class AuthMD(MiddlewareMixin): white_list=['/home/',"/login/"] #白名单 定义一个字段白名单(静态属性) black_list=[''] #黑名单 #定义一个黑名单 def process_request(self,request): #所有请求都必须经过process_request next_url=request.path_info #获取用户发送请求中的路径 print(next_url) #login if next_url in self.black_list: #判断 用户请求路径是否在黑名单中 return HttpResponse('This is an illegal URL') #如果在则响应'' elif next_url in self.white_list or request.session.get('user'): #如果路径在白名单中则可以执行(匹配url,视图函数) return else: return redirect('/login/?next={}'.format(next_url)) # 如果是其他则跳转到login页面 后面拼接上用户的路径, #匹配路径与函数url.py:
urlpatterns = [url(r'^admin/', admin.site.urls),# url(r"^work/",views.work),url(r"^login/$",views.login),url(r'^index/$',views.index),url(r'^home/$',views.home),
]
views.py:
from django.shortcuts import render,redirect,HttpResponsedef index(request): #登陆后才能访问return HttpResponse('这是index')def home(request): #随意访问return HttpResponse('这是home')def login(request): #随意访问if request.method=='POST':user=request.POST.get("user") #获取用户名pwd=request.POST.get('pwd') #获取密码if user=="alex" and pwd=='alex': #如果验证成功request.session['user']=user #设置sessionnext_url=request.GET.get('next')#获取路径后面拼接的查找内容if next_url:#如果路径存在return redirect(next_url) #跳转到该页面else: #如果不存在默认跳转到index页面return redirect('/index/')return render(request,'login.html') #如果是get请求返回login页面
login.html:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="x-ua-compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Title</title></head><body><form action="" method="post">{% csrf_token %}<p><lable for="user">用户名:</lable><input type="text" name="user" id="user"></p><p><lable for="pwd">密码:</lable><input type="password" name="pwd" id="pwd"></p><input type="submit" value="登陆"></form></body></html>
setting.py:
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','app01.my_middlewares.AuthMD',]
转载于:https://www.cnblogs.com/J-7-H-2-F-7/p/9671710.html
python 中间件相关推荐
- python 通信中间件_apachemiddleware-有用的Python中间件,用于mod\wsgi部署-James Gardner 0.1.1 0.1.0...
作者:James Gardner ### 作者邮箱:james@ ### 首页:http://jimmyg.org/work/code/apachemiddleware/index.html ### ...
- python中间件有哪些_python 中间件
中间件 一.什么是中间件 中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django 的输入和输出.每个中间件组件都负责做一些特定的 ...
- python中间件的作用_引用java作用
浅谈AndroidManifest.xml与R.java及各个目录的作用 原文:浅谈AndroidManifest.xml与R.java及各个目录的作用 在开发Android项目中,AndroidMa ...
- writelines是python对文件的写操作方法_Python File writelines() 方法
概述 writelines() 方法用于向文件中写入一序列的字符串.高佣联盟 www.cgewang.com 这一序列字符串可以是由迭代对象产生的,如一个字符串列表. 换行需要制定换行符 \n. 语法 ...
- python的flask微服务-flask微服务框架的初步接触
测试2个关联的系统接口时,经常会遇到被测试系统或被测app的处理内部处理流程会依赖另一个系统的接口返回结果,这时, 常用的做法就是写一个模拟测试桩,用作返回请求时的结果.java可以用servicel ...
- 【Python 实战基础】什么是PyQt6? 简单介绍一下PyQt6
目录 一.基础简介 二.安装 PyQt6 三.PyQt6 模块 1. 界面框架部分 2. 界面组件部分(其实也是Widget类) 3. 界面样式部分 4.界面交互部分 5.概念之间关系 6.学习文档 ...
- Web服务(02)——Web服务器中间件
文章目录 Web服务(02)--Web服务器中间件 前言 一.JAVA中间件 1.Tomcat 2.Weblogic 3.Jboss 4.Webshaere 二.Python中间件 1.wsgi 2. ...
- 【Python】pyqt6入门到入土系列,非常详细...
写在前面 最近真的是运气不好,国庆前一天,隔壁小区有人中招了,结果国庆出不了门,好不容易国庆结束了,准备上班,结果小区又有个叼毛中招了,搞得我直接国庆放了半个月,还只能在家过,没事干只能这里写写,那里 ...
- b插到元素a之前python_python面试题(转)
1.How are arguments passed – by reference of by value? 2.Do you know what list and dict comprehensio ...
最新文章
- 初探Django2.1:Win10+Python3.6.6环境下安装Django
- 医疗人工智能会替代医生吗
- android4.4.2fragment不显示,Android应用中使用Fragment组件的一些问题及解决方案总结...
- Boost:字符串正则表达式的测试程序
- java高并发(五)并发模拟
- 小波滤波器与其他滤波器的区别_滤波器国产 VS 国外
- sql2008“备份集中的数据库备份与现有的xx数据库不同”解决方法 因为是在另一台电脑对同名数据库做的备份,用常规方法还原,提示不是相同数据库,不让还原,在网上找到下面的方法解决了: 一、右击系
- u盘启动pxe安装linux,U盘启动安装centos5.5+centos6.3+PXE网络安装CentOS
- 真就卖爆了!两分钟破万台:1999元实在无敌
- pca各个向量之间的相关度_详细推导PCA算法
- 南阳理工ACM 28大数阶乘
- android平台malloc_debug使用方法(含测试代码)
- nmake 环境变量配置
- java科学计数法的基本使用与如何看科学计数法
- 沙加在沙罗双树下临死前的一段对白
- 星际争霸1-PvPGN战网架设参数
- pixi 小游戏_PIXI兼容微信小游戏
- 苹果三代耳机_预告2020.6.13其他团无线蓝牙耳机
- UTC时间与北京时间的关系
- 网吧组网 光纤接入与ADSL接入的较量
热门文章
- 2029.石子游戏 IX-LeetCode
- linux下如何运行脚本程序设计,Uboot 如何运行脚本
- JavaScript正则表达式(1)
- php sql 字段不能为空值,关于php:Sudden SQL问题-一般错误:1364字段没有默认值
- 计算机六年级基础知识,六年级计算机试题
- python模拟抛体运动_换个姿势学物理!用Python和Matplotlib进行模拟
- VSCode配置PyQt5和designer
- 心语收集12:我以为要是唱的用心良苦,你就会对我多点在乎
- Qt第一印象——Qte与Qt
- 苹果被曝寻求收购Drive.ai:吴恩达参与运营,多家中国VC投资