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,HttpResponse
- def 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 #设置session
- next_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',
- ]
python 中间件的更多相关文章
- python中间件
django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 1.中间件的方法 pro ...
- Python面试题整理-更新中
几个链接: 编程零基础应当如何开始学习 Python ? - 路人甲的回答 网易云课堂上有哪些值得推荐的 Python 教程? - 路人甲的回答 怎么用最短时间高效而踏实地学习 Python? - 路 ...
- Django基础之MTV模型
一.Django基础 一.Django简介 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型(Model).视图(View)和控制器(Control ...
- python运维开发(二十)----models操作、中间件、缓存、信号、分页
内容目录 select Form标签数据库操作 models操作F/Q models多对多表操作 Django中间件 缓存 信号 分页 select Form标签补充 在上一节中我们可以知道Form标 ...
- python/ Django之中间件
python/ Django之中间件 一.中间件 中间件共分为: (1)process_request(self,request) (2)process_view(self, request, cal ...
- Python Django的分页,Form验证,中间件
本节内容 Django的分页 Form 中间件 1 Django 分页 1.1 Django自带的分页 1.首先来看下我的测试数据环境 ############ models.py ######### ...
- python自动化开发-[第二十一天]-form验证,中间件,缓存,信号,admin后台
今日概要: 1.form表单进阶 2.中间件 3.缓存 4.信号 5.admin后台 上节课回顾 FBV,CBV 序列化 - Django内置 - json.dumps(xxx,cls=) Form验 ...
- python的Web框架,中间件middleware及djangoAdmin
简介 用于处理request和response的中间处理的函数,可以创建在项目中的任意位置,只要可以导入即可. 建议创建在APP目录下,方便管理. 函数范式与激活 中间件的范式: # 必须接受get_ ...
- python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)
一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...
随机推荐
- .Net 入门资料推荐 (编辑中)
1.首先推荐 网易云课堂上的一个付费课程:常老师带你学ASP.NET MVC ,价格199元 2. 一个.net的框架,ABP,中文介绍如下 http://www.cnblogs.com/farb/p ...
- 5G到来,App的未来,是JavaScript,Flutter还是Native ?
Native App React Native(RN)发布于2015年,也是使用JavaScript语言进行跨平台APP的开发.与H5开发不同的是,它使用JS桥接技术在运行时编译成各个平台的Nativ ...
- 文件上传的一个坑 Apache上传组件和SpringMVC自带上传冲突
List list = upload.parseRequest(request); 接受不到数据,size=0; 原因就是下面这货造成的 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ bean id=&qu ...
- centos7手把手教你搭建zabbix监控
Centos7安装部署zabbix3.4 centos系统版本: 1.安装前需要先关闭selinux和firewall. 1.1 [root@zabbix ~]# vi /etc/selinux/co ...
- js拼音排序
js拼音排序 var arr =['a','c','b','b']; arr.sort( function compareFunction(p1, p2) { return p1.localeComp ...
- Java实现一个简单的循环队列
在某些时候,我们不能被要求像数组一样可以使用索引随机访问,而是需要被限制顺序处理业务,今天介绍一种先进先出(FIFO)的线性数据结构:队列, 当然,还有后进先出(LIFO)的处理方式,即为栈(后续有时 ...
- PHP实现域名授权的两种方法-转
01. 在线校验域名授权的方法: 客户端代码: PHP <?php //获取不带端口号的域名前缀 $servername = trim($_SERVER['SERVER_NAME'] ...
- podman(libpod)---github简单记录
这个应该集成了Skopeo 和Buildah. 用于代替docker的工具包,且和cri-o共享后端代码,迟早集成进K8S~~~. (docker肿么办????) github地址: https:// ...
- [转] Ramda 函数库参考教程
学习函数式编程的过程中,我接触到了 Ramda.js. 我发现,这是一个很重要的库,提供了许多有用的方法,每个 JavaScript 程序员都应该掌握这个工具. 你可能会问,Underscore 和 ...
- 为什么 kubernetes 天然适合微服务
最近总在思考,为什么在支撑容器平台和微服务的竞争中,Kubernetes 会取得最终的胜出,事实上从很多角度出发三大容器平台从功能方面来看,最后简直是一摸一样.(可参考<容器平台选型的十大模式: ...