码迷,mamicode.com
首页 > 其他好文 > 详细

Django 中间件

时间:2018-11-10 19:10:12      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:inf   中间   必须   自己   cep   strong   temp   比较   请求   

一、什么是中间件

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

但是由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能。

二、自定义中间件

中间件可以定义五个方法

process_request(self,request)
process_view(self, request, view_func, view_args, view_kwargs)
process_exception(self, request, exception)
process_template_response(self,request,response)
process_response(self, request, response)

自己定义一个中间件,需要写一个类,这个类必须继承 MiddlewareMixin

技术分享图片

# views.py

def index(request):
    print("views.py(视图函数)")
    return HttpResponse("ok")
# my_middleware.py

from django.utils.deprecation import MiddlewareMixin


class Test1Middleware(MiddlewareMixin):

    def process_request(self, request):
        print("Test1请求")

    def process_response(self, request, response):
        print("Test1返回")
        return response


class Test2Middleware(MiddlewareMixin):

    def process_request(self, request):
        print("Test2请求")

    def process_response(self, request, response):
        print("Test2返回")
        return response

结果:

Test1请求
Test2请求
views.py(视图函数)
Test2返回
Test1返回

注意:

如果当请求到达 Test2请求 的时候直接不符合条件返回,即 return HttpResponse("Test2Middleware中断"),程序将把请求直接发给中间件 Test2Middleware 返回,然后依次返回到请求者:

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse

class Test1Middleware(MiddlewareMixin):
    ...

class Test2Middleware(MiddlewareMixin):

    def process_request(self, request):
        print("Test2请求")
        return HttpResponse("Test2Middleware中断")
    ...

结果:

Test1请求
Test2请求
Test2返回
Test1返回

process_request

该方法有一个参数,就是request。它的返回值可以是None也可以是HttpResponse对象。返回值是None的话,按正常流程继续走,交给下一个中间件处理,如果是HttpResponse对象,Django将不执行视图函数,而将相应对象直接返回给浏览器。

process_response

该方法有两个参数,一个是request,一个是response,request就是上述例子中一样的对象,response是视图函数返回的HttpResponse对象。该方法的返回值也必须是HttpResponse对象。

process_view

该方法有四个参数;

request      HttpRequest对象
view_func    Django即将使用的视图函数(它是实际的函数对象,而不是函数的名称作为字符串)
view_args    将传递给视图的位置参数的列表
view_kwargs  将传递给视图的关键字参数的字典;view_args和view_kwargs都不包含第一个视图参数(request)

技术分享图片

class Test1Middleware(MiddlewareMixin):

    def process_request(self, request):
        print("Test1请求")

    def process_response(self, request, response):
        print("Test1返回")
        return response

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


class Test2Middleware(MiddlewareMixin):

    def process_request(self, request):
        print("Test2请求")

    def process_response(self, request, response):
        print("Test2返回")
        return response

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

结果:

Test1请求
Test2请求
Test1_view
Test2_view
views.py(视图函数)
Test2返回
Test1返回

process_exception

该方法两个参数;

request      HttpRequest对象
exception    视图函数异常产生的Exception对象

这个方法只有在视图函数中出现异常了才执行,它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。

process_template_response(用的比较少)

 

Django 中间件

标签:inf   中间   必须   自己   cep   strong   temp   比较   请求   

原文地址:https://www.cnblogs.com/believepd/p/9940105.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!