day74天中间件介绍
一、 importlib
settings
执行结果:
两个process_request
process_response按照注册顺序的倒叙进行执行
PROCESS_VIEW
Process_view 在找到url之后 ,视图函数之前执行。
==================================================================
一、中间件
官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。
WSGI协议
首先弄清下面几个概念:
WSGI:全称是Web Server Gateway Interface
,WSGI
不是服务器,python
模块,框架,API
或者任何软件,只是一种规范,描述web server
如何与web application
通信的规范。server
和application
的规范在PEP 3333中有具体描述。要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI
协议之上的web
框架有Bottle
, Flask
, Django
。
作者:rainybowe
链接:https://www.jianshu.com/p/679dee0a4193
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
知道中间件作用在哪个位置上: 在wsgi 和 url视图的逻辑中间的位置。
中间件的定义:
wsgi之后 urls.py 之前 在全局操作Django请求和相应的模块
# 中间件 7个中间件 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',
中间件的使用 :
有5个固定的方法 :
process_request
process_response
上面两个最常用.
process-view
process_exception
process_template
用反射的方法 importlib的用法
OO.py 文件
NAME ='小黑' class Person(object): def __init__(self,name): self.name =name def dream(self): print('{}在做美梦'.format(self.name))
import importlib o =importlib.import_module('xx.oo') print(o.NAME) p =o.Person('赵导') p.dream()
输出的结果
输出结果:
中间件的执行顺序
一、process_request
settings里的middleware配置文件
'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'my_middleware.OOXX', 'my_middleware.MD2', ]
my_middleware.py 配置文件的配置
""" 自定义中间件 """ from django.utils.deprecation import MiddlewareMixin class OOXX(MiddlewareMixin): def process_request(self,request): print('这是我的第一个中间件.') class MD2(MiddlewareMixin): def process_request(self,request): print('这是我的第二个中间件:MD2 ')
url配置文件
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/$',views.index),
]
views
def index(request): print('这是app01 里面的index视图函数') return HttpResponse('O98K')
输出结果
拿路径
定义白名单
中间件py文件:
#d定义一个白名单 URL =['/index/','/xx/','/haha/'] class OOXX(MiddlewareMixin): def process_request(self,request): print('这是我的第一个中间件.') print(request.path_info)#属性 print(request.get_full_path())#方法 if request.path_info in URL: return else: return HttpResponse('不OJBK ') class MD2(MiddlewareMixin): def process_request(self,request): print('这是我的第二个中间件:MD2 ')
views视图
def index(request): print('这是app01 里面的index视图函数') return HttpResponse('O98K')
urls
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/$',views.index), ]
二、 Process_response:
它有两个参数,一个是request,一个是response,request就是上述例子中一样的对象,response是视图函数返回的HttpResponse对象。该方法的返回值也必须是HttpResponse对象。
中间件文件
#d定义一个白名单 URL =['/index/','/xx/','/haha/'] class OOXX(MiddlewareMixin): def process_request(self,request): print('这是我的第一个中间件.') print(request.path_info)#属性 print(request.get_full_path())#方法 if request.path_info in URL: return else: return HttpResponse('不OJBK ') def process_response(self,request,response): """ :param request: 是浏览器发来的请求对象 :param response: 是视图函数返回的响应对象 :return: """ print('这是ooxx中间件里的process_response') return response class MD2(MiddlewareMixin): def process_request(self,request): print('这是我的第二个中间件:MD2 ') def process_response(self,request,response): print('这是md2中间件里的process-response') return response
view
def index(request): print('这是app01 里面的index视图函数') return HttpResponse('O98K')
执行response方法是按照注册顺序(从上到下)的倒叙进行执行
三、Process-view方法