中间件

一.什么是中间件

中间件是一个用来处理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:

Title

{% csrf_token %}

用户名:

密码:

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 中间件相关推荐

  1. python middleware模块_django之中间件middleware

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

  2. python scrapy框架爬虫_Python Scrapy爬虫框架学习

    Scrapy 是用Python实现一个为爬取网站数据.提取结构性数据而编写的应用框架. 一.Scrapy框架简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数 ...

  3. laravel 中间件不生效_laravel中间件实战(luke)

    简介 HTTP 中间件提供了为过滤进入应用的 HTTP 请求提供了一套便利的机制.例如,Laravel 内置了一个中间件来验证用户是否经过授权,如果用户没有经过授权,中间件会将用户重定向到登录页面,否 ...

  4. 东方通 中间件_东方通:中间件国产替代进程中的艰难领军者

    引言 东方通自1992年成立以来,一直深耕基础软件中间件的产品及相关技术研发,为国产中间件的开创者,连续十几年保持中间件市场占有率国内厂商第一.其时,国外的中间件也才开始起步,可以说与国际厂商站在了同 ...

  5. vscode使用教程python-VSCode下好用的Python插件及配置_python

    这篇文章主要介绍了微软官方的Python插件,已经自带很多功能,下面是插件功能描述,其中部分内容我做了翻译,需要的朋友可以参考下 MS Python插件. 这是微软官方的Python插件,已经自带很多 ...

  6. python算法和数据结构_Python中的数据结构和算法

    python算法和数据结构 To 至 Leonardo da Vinci 达芬奇(Leonardo da Vinci) 介绍 (Introduction) The purpose of this ar ...

  7. python中定义数据结构_Python中的数据结构—简介

    python中定义数据结构 You have multiples algorithms, the steps of which require fetching the smallest value ...

  8. python 数据框缺失值_Python:处理数据框中的缺失值

    python 数据框缺失值 介绍 (Introduction) In the last article we went through on how to find the missing value ...

  9. koa2 mysql 中间件_Koa2 和 Express 中间件对比

    koa2 中间件 koa2的中间件是通过 async await 实现的,中间件执行顺序是"洋葱圈"模型. 中间件之间通过next函数联系,当一个中间件调用 next() 后,会将 ...

最新文章

  1. 解读Java8中ConcurrentHashMap是如何保证线程安全的
  2. hive与hbase整合
  3. Microsoft Dynamic CRM 2013安装
  4. 大小端模式,stm32采用小端模式
  5. BFS广度优先算法, DFS深度优先算法,Python,队列实现,栈实现
  6. Unity 5.x 游戏开发指南 HD版 final.pdf
  7. python牛顿迭代法求平方根_Python编程如何实现二分法及牛顿迭代法求平方根代码...
  8. 张宇高等数学强化阶段笔记并标记重点
  9. 加法器php,全加器原理是什么
  10. scp 给ipv6_scp传输常用命令
  11. java铁三公路自行车_公路车、计时车、铁三车,到底都是什么鬼?
  12. 河北易县八佛洼辽三彩罗汉造像
  13. Istio的流量镜像
  14. python框架pika的基本使用
  15. DD-wrt无线参数详解
  16. 为什么鸿蒙系统那么火七星彩,七星彩要想独中500万 我们告诉你会出哪些号码!...
  17. nginx mysql 网页显示_Win10+Python+Django+Nginx+MySQL开发教程及实例(3)——Nginx运行html网页...
  18. C/C++ 三种方式获得文件的大小
  19. Python|使用 TCP 协议实现智能聊天机器人
  20. Mysql截取字符串,格式化字符串

热门文章

  1. 谁偷了1/3个CPU - 诡异Go性能问题追根问底
  2. 去哪儿网显示服务器错误,信息去哪儿了
  3. 微信截图时跳过当前页面解决办法
  4. iOS APP开发项目案例(仿探探优化)--FaceFriend
  5. 计算机简明教程实验总结,《大学物理实验简明教程》.pdf
  6. 中国邮政储蓄银行计算机招聘,2019年及历年中国邮政储蓄银行计算机招聘笔试题和参考答案4套...
  7. OpenGL蓝宝书源码学习(五)第三章——Blending.cpp
  8. ProtoBuf详解(一)概念和语法
  9. 粤嵌GEC6818板子TCP网络编程发送命令控制音视频
  10. 镇江大数据中心正式成立