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方法就行


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

查看所有标签

猜你喜欢:

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

Python for Everyone

Python for Everyone

Cay S. Horstmann、Rance D. Necaise / John Wiley & Sons / 2013-4-26 / GBP 181.99

Cay Horstmann's" Python for Everyone "provides readers with step-by-step guidance, a feature that is immensely helpful for building confidence and providing an outline for the task at hand. "Problem S......一起来看看 《Python for Everyone》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具