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 ...
随机推荐
- FF D8 FF FE 00 24 47 00转图片
String[] img = "FF D8 FF FE 00 24 47 00 9D 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 0 ...
- spring security5.0源码导入idea
资源路径:链接:https://pan.baidu.com/s/1Xep6hzyIF2a0AtFYDeO_bw提取码:6af8 1.解压源码 2.编译源码 windows下:直接双击gradl ...
- Docker----搭建自己的gitlab(填坑之旅)
在成功完成docker的基础实验之后,尝试着使用docker搭建自己的gitlab,用来存放自己的代码.本文主要介绍使用docker搭建gitlab过程中遇到的问题,我的服务器系统是:Ubuntu S ...
- 【mongo】查询超时处理
使用no_cursor_timeout collection = self.db[tb_name] cols = collection.find(no_cursor_timeout=True) for ...
- Spark中集群相关概念
来源:http://spark.apache.org/docs/latest/cluster-overview.html Term Meaning Application User program b ...
- About The Order of The Declarations And Definition When Making a Member Function a Friend.关于使类成员成为另一个类友元函数的声明顺序和定义。
If only member function clear of WindowMgr is a friend of Screen, there are some points need to note ...
- Java 多线程系列 CountDownLatch
CountDownLatch 一个或多个线程等待其他线程完成操作后在在执行 CountDownLatch通过一个计数器来实现,await方法阻塞直到 countDown() 调用计数器归零之后释放所有 ...
- VIM中的特殊字符
0.简介 在linux中vim查看一个windows下的文本文件, 经常在行尾有一个 ^M. 这其实是windows/linux/mac系统中文本换行不一致的原因导致的, 系统类别 文本换行符 转义字 ...
- 蓝桥杯 穿越雷区(bfs)
题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废.某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短? ...
- python_str的应用
name = "fsafalk" #nam是个变量名 fsafalk是变量 也是字符串 name.startswith('fs')#判断是否是fs开头 name.endswit ...