34.Django中间件

栏目: Python · 发布时间: 5年前

内容简介:Django的中间件事面向切面编程的实现,好比spring的过滤器和拦截器,他是request和response 处理过程的钩子。默认的setting.py中已经定义的中间件有。每一项都是一个中间件,就像电梯一样,从上到下,又从下到上一次经过每一个层楼(中间件)。

Django的中间件事面向切面编程的实现,好比spring的过滤器和拦截器,他是request和response 处理过程的钩子。

默认的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',
]

每一项都是一个中间件,就像电梯一样,从上到下,又从下到上一次经过每一个层楼(中间件)。 34.Django中间件

自定义中间件

自定义中间件只需要写一个普通的类即可。

# 可以写到任意py文件中,本例写在mysite/middlewares.py中
class MyMiddleware(object):

    def __init__(self, get_response):
        self.get_response = get_response


    def __call__(self, request):

        print('before')
        response = self.get_response(request)
        print('after')
        return response

然后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',
    'mysite.middlewares.MyMiddleware', # 添加自定义中间件
]

views.py和urls.py省略。简单的index视图。

启动服务器,输入 http://127.0.0.1:8000 将会在控制台看到

before
after
[26/Apr/2019 07:07:36] "GET / HTTP/1.1" 200 2

表示我们的中间件已经生效。

init初始化方法只在web服务启动时调用一次,get_response参数是必需的,这个参数指的是下一个中间件或者view函数(如果是最后一个中间件)。

每个请求都会调用一次 call ,先对请求做处理,然后将请求发往下一个中间件(get_response),一层层的迭代,就像栈一样,返回时对响应做处理。

如果其中一个层的中间件决定短路并返回响应而不调用其get_response,那么该层下面的层都不会看到请求或响应,只有该中间件和之上的中间件才会看到响应。

其他可用函数: process_view(request, view_func, view_args, view_kwargs):

在调用view之前被调用。

它应该返回一个None 或一个HttpResponse对象。 如果返回None,Django 将会继续处理这个请求,执行其它的process_view() 中间件,然后调用对应的视图。 如果它返回一个HttpResponse对象,也会起到短路作用

process_exception(request, exception):

当一个view引发异常时,Django会调用process_exception()来处理。返回一个None或一个HttpResponse对象。如果返回HttpResponse对象,会将响应交给处理响应的中间件处理。由于处理响应时是从下到上的,此层以上的process_exception()是不会被调用的。

process_template_response(request, response):

response参数应该是一个由view或者中间件返回的TemplateResponse对像(或等价的对象)。

如果响应的实例有render()方法,process_template_response()会在view刚好执行完毕之后被调用。这个方法必须返回一个实现了render方法的响应对象。

中间件就这么简单,通常重写call方法就行


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序设计实践

程序设计实践

[美] BRIAN W.KERNIG / 裘宗燕 / 机械工业出版社 / 2007-1 / 59.00元

从排错、测试、性能、可移植性、设计、界面、风格和记法等方面,讨论了程序设计中实际的、又是非常深刻和具有广泛意义的思想、技术和方法,它的翻译出版将填补国内目前这方面书籍的空白。《程序设计实践》(双语版)值得每个梦想并努力使自己成为优秀程序员的人参考,值得每个计算机专业的学生和计算机工作者阅读,也可作为程序设计高级课程的教材或参考书。一起来看看 《程序设计实践》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器