1

day74天中间件介绍

一、 importlib

 

 

 

 

 

 

settings

 

 

 

 

 

执行结果:

 

两个process_request 

 

 

 

 

 

 

 

process_response按照注册顺序的倒叙进行执行

 

 

 PROCESS_VIEW 

 

Process_view 在找到url之后 ,视图函数之前执行。

 

 

==================================================================

一、中间件  

官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。

 

WSGI协议

首先弄清下面几个概念:
WSGI:全称是Web Server Gateway InterfaceWSGI不是服务器,python模块,框架,API或者任何软件,只是一种规范,描述web server如何与web application通信的规范。serverapplication的规范在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()

输出的结果

 
 
 
 注意: import-module只能导入包 不能导入类,方法
 

 

 

输出结果:

 

 

 

中间件的执行顺序 

 

一、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方法

 

 

 
posted @ 2018-05-23 16:54  萌哥-爱学习  阅读(212)  评论(0编辑  收藏  举报