中间件
一.什么是中间件
中间件是一个用来处理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 中间件的更多相关文章

  1. python中间件

    django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 1.中间件的方法 pro ...

  2. Python面试题整理-更新中

    几个链接: 编程零基础应当如何开始学习 Python ? - 路人甲的回答 网易云课堂上有哪些值得推荐的 Python 教程? - 路人甲的回答 怎么用最短时间高效而踏实地学习 Python? - 路 ...

  3. Django基础之MTV模型

    一.Django基础 一.Django简介 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型(Model).视图(View)和控制器(Control ...

  4. python运维开发(二十)----models操作、中间件、缓存、信号、分页

    内容目录 select Form标签数据库操作 models操作F/Q models多对多表操作 Django中间件 缓存 信号 分页 select Form标签补充 在上一节中我们可以知道Form标 ...

  5. python/ Django之中间件

    python/ Django之中间件 一.中间件 中间件共分为: (1)process_request(self,request) (2)process_view(self, request, cal ...

  6. Python Django的分页,Form验证,中间件

    本节内容 Django的分页 Form 中间件 1 Django 分页 1.1 Django自带的分页 1.首先来看下我的测试数据环境 ############ models.py ######### ...

  7. python自动化开发-[第二十一天]-form验证,中间件,缓存,信号,admin后台

    今日概要: 1.form表单进阶 2.中间件 3.缓存 4.信号 5.admin后台 上节课回顾 FBV,CBV 序列化 - Django内置 - json.dumps(xxx,cls=) Form验 ...

  8. python的Web框架,中间件middleware及djangoAdmin

    简介 用于处理request和response的中间处理的函数,可以创建在项目中的任意位置,只要可以导入即可. 建议创建在APP目录下,方便管理. 函数范式与激活 中间件的范式: # 必须接受get_ ...

  9. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)

    一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 from app01 import views urlpatterns = [ path('admin/', admi ...

随机推荐

  1. ftp上传或下载文件工具类

    FtpTransferUtil.java工具类,向ftp上传或下载文件: package utils; import java.io.File; import java.io.FileOutputSt ...

  2. Maven Install报错:Perhaps you are running on a JRE rather than a JDK?

    我用的是idea,解决办法是:安装jdk,配置环境变量

  3. STM32F0使用LL库实现SHT70通讯

    在本次项目中,限于空间要求我们选用了STM32F030F4作为控制芯片.这款MCU不但封装紧凑,而且自带的Flash空间也非常有限,所以我们选择了LL库实现.本篇我们将基于LL库采用模拟I2C接口的方 ...

  4. oracle查看执行最慢与查询次数最多的sql语句及其执行速度很慢的问题分析

    oracle查看执行最慢与查询次数最多的sql语句 注:本文来源 于<oracle查看执行最慢与查询次数最多的sql语句> 前言 在ORACLE数据库应用调优中,一个SQL的执行次数/频率 ...

  5. 初识中间件Kafka

    初识中间件Kafka Author:SimplelWu 什么是消息中间件? 非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的,不能直接给客户带来价值的软件统称为中间件 关注于数据的发送和接 ...

  6. lombok @Accessors用法

    @Accessors 翻译是存取器.通过该注解可以控制getter和setter方法的形式. fluent 若为true,则getter和setter方法的方法名都是属性名,且setter方法返回当前 ...

  7. 前言:JNI调用-简单使用

    JNI JNI是(Java Native Interface  本地接口)是一个协议,用来沟通Java 代码和C/C++代码,是 Java和 C.C++之间的桥梁. 通过JNI协议,Java可以调用外 ...

  8. 解决MongoDB登录的WARNING

    解决MongoDB登录的WARNING 1.安装完成运行mongodb警告内容如下: 2019-01-17T15:41:50.578+0800 I CONTROL [initandlisten] ** ...

  9. JFinal Druid 配置

    /** * 数据库密码加密,执行如下命令,生成加密密码 * java -cp druid-1.1.14.jar com.alibaba.druid.filter.config.ConfigTools ...

  10. 指定的 CGI 应用程序遇到错误,服务器终止了该进程。

    遇到这种错误只需要把这个项目的Cookies删除再重新启动就行了