Django middleware
1

什么是中间件

中间件是一hooks应用于Django的请求/响应处理框架。 它是一个轻,低级的“插件”系统,用于全局改变Django的输入或输出。

原理

官方文档供给出三种实现方法

  • 装饰器方法 基于方法
  • 装饰器方法 基于对象
  • 基于请求/响应中间件模式

第三种是推荐而且比较常用的方法。我们可以把它想象成一个洋葱,每一层都是一个中间件类,这些中间件包裹着views(视图)。当一个请求(request)进入所有层,将request从第一个层依次传递下一个直到view执行,然后响应(response)通过每一层(注意:以相反的顺序)原路返回。

  • process_request 接收到request开始执行在process_view前
  • process_view 在process_request后执行在views前执行
  • process_response views后执行
  • process_exception views抛出异常
  • process_template_response 需使用render()方法才会执行process_template_response 在process_response前views后执行
    file

应用场景

以下是官方的一些中间件,有auth,sesssion以及csrf等,对于我们自定义的中间件来说当然是根据自己项目的需求来做喽,核心在于知道在哪些环节使用那个方法就可以熟练的使用中间件。

'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',

代码实现

middleware.py

# -*- coding: utf-8 -*-

#方法一:装饰器方法 基于方法

def test1(get_response):

    def middleware(request):
        print ">>>>>>>>1"
        response = get_response(request)        
        print ">>>>>>>>3"
        return response    
    return middleware    #方法二:装饰器方法 基于对象

class Test2(object):
    def __init__(self, get_response):
        self.get_response = get_response    
    def __call__(self, request):
        print ">>>>>>>>>2"
        response = self.get_response(request)        
        print ">>>>>>>>>3"
        return response

方法三 基于请求/响应中间件模式 这种方式需要在 setting中的MIDDLEWARE_CLASSES增加Test3 相当于激活中间件 常用模式上面两种很少用

class Test3(object):

    def process_view(self, request, view_func, view_args, view_kwargs):
        print ">>>>>>>>in process_view"

    def process_request(self, request):
        print ">>>>>>>>in process_requset"
        return None

    def process_response(self, request, response):
        print ">>>>>>>>in process_response"
        return response    

    def process_exception(self, request, exception):
        print ">>>>>>>>in process_exception"

    def process_template_response(self, request, response):
        print ">>>>>>>>in process_template_response"
        return response

views/py
@test1
def hello1(request):
    print ">>>>>>>view"
    c = RequestContext(request, { })    
    return render_to_response('hello/hello.html', c)
@Test2
def hello2(request):
    print ">>>>>>>view"
    c = RequestContext(request, { })    
    return render_to_response('hello/hello.html', c)

def hello3(request):
    print ">>>>>>>view"
    c = RequestContext(request, { })    
    return render_to_response('hello/hello.html', c)

项目源码:https://github.com/guoyucheng/uwsgitest

load.jpeg

bert

本帖由 Summer 于 1年前 取消沉帖
讨论数量: 6
Summer
1年前

@Summer 哈哈 重要是内容~

1年前

@Summer 有预览就好了

1年前
Summer

有预览的,你好好琢磨下编辑器,先下沉咯,排版弄好了 @ 我

1年前

@Summer 已调,还有另一篇排版也有问题?

1年前

@Summer 另外一个已调 标题:uWSGI 的 Django 部署的方式

1年前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!