Django中间件

Django的中间件,我们可以在settings.py里看到,如下图所示:
在这里插入图片描述
想要激活中间件组件,将其添加到MIDDLEWARE_CLASSES里就可以了。

一、挂钩和应用程序顺序:
在请求阶段,在调用视图之前,Django按其定义的顺序MIDDLEWARE_CLASSES(自上而下)应用中间件。有两个挂钩:

process_request()
process_view()
在响应阶段,在调用视图后,中间件以相反的顺序从下向上应用。有三个挂钩:

process_exception() (仅当视图引发异常时)
process_template_response() (仅用于模板回复)
process_response()

二、编写自己的中间件
每个中间件组件都是一个Python类,它定义了以下一种或多种方法:
(1)process_request

process_request(request)
request是一个HttpRequest对象。process_request() 在Django决定执行哪个视图之前,会在每个请求上调用。
它应该返回一个None或一个HttpResponse 对象。如果它返回None,Django将继续处理此请求,执行任何其他process_request()中间件,然后是process_view() 中间件,最后是相应的视图。如果它返回一个 HttpResponse对象,Django将不会打扰任何其他请求,视图或异常中间件或适当的视图; 它会将响应中间件应用于此HttpResponse,并返回结果。

下面我们来举例:

**【1】**首先,在项目的同名文件下新建一个py文件,在这里叫做为mymiddleware.py文件,在此文件里定义一个类,如下所示:

class MyMiddleware(object):
    def __init__(self):
        print('这是我们自己写的中间件的init方法调用')

    def process_request(self,request):
        print('此时启用process_request')

然后将自己写的中间件添加到MIDDLEWARE_CLASSES里,如下所示:
在这里插入图片描述
最后在浏览器地址栏输入地址,运行成功以后,查看终端,可以看到如下图:
在这里插入图片描述

**【2】**若我们返回的是HttpResponse对象

from django.http import HttpResponse
class MyMiddleware(object):
    def __init__(self):
        print('这是我们自己写的中间件的init方法调用')

    def process_request(self,request):
        return HttpResponse('没有权限进行访问')

刷新页面后,可以看到页面上显示的是返回一个HttpResponse对象,如下图所示:
在这里插入图片描述
而且不管你地址栏输入任何一个地址,它都显示的是HttpResponse对象。

(2)process_view
process_view(request,view_func,view_args,view_kwargs)
request是一个HttpRequest对象。view_func是Django即将使用的Python函数。(它是实际的函数对象,而不是作为字符串的函数的名称。)view_args是将传递给视图的位置参数列表,并且view_kwargs是将传递给视图的关键字参数的字典。既不 view_args也不view_kwargs包括第一视图参数(request)。
process_view() 在Django调用视图之前调用。
它应该返回一个None或一个HttpResponse 对象。如果它返回None,Django将继续处理此请求,执行任何其他process_view()中间件,然后,相应的视图。如果它返回一个HttpResponse对象,Django将不会打扰调用任何其他视图或异常中间件或适当的视图; 它会将响应中间件应用于此 HttpResponse,并返回结果。

下面我们来举例:
在mymiddleware.py文件下写入如下代码:

class MyMiddleware(object):
    def __init__(self):
        print('这是我们自己写的中间件的init方法调用')

    def process_request(self,request):
        print('此时启用process_request')
        # return HttpResponse('没有权限进行访问')

    def process_view(self,request,view_func,view_args,view_kwargs):
        print('此时启用process_view')

刷新页面后,查看终端,可以看到如下图:
在这里插入图片描述
若返回的是HttpResponse对象,和process_request的返回结果是一样的

(3)process_response
process_response(request,response)

request是一个HttpRequest对象。response是HttpResponse或 StreamingHttpResponse通过Django视图或通过一个中间件返回的对象。
process_response() 在所有响应返回浏览器之前调用它们。
它必须返回一个HttpResponse或 一个StreamingHttpResponse对象。它可以改变给定的 response,或者它可以创建并返回一个全新的 HttpResponse或 StreamingHttpResponse。
与process_request()和process_view()方法 不同process_response(),即使跳过相同中间件类的process_request()和process_view()方法(因为早期的中间件方法返回了HttpResponse),也总是调用该 方法 。特别是,这意味着您的 process_response()方法不能依赖于完成的设置 process_request()。
最后,请记住,在响应阶段,中间件以相反的顺序从下到上应用。这意味着MIDDLEWARE_CLASSES将首先运行在末尾定义的类。

下面我们来举例:
在mymiddleware.py文件下写入如下代码:

class MyMiddleware(object):
    def __init__(self):
        print('这是我们自己写的中间件的init方法调用')

    def process_request(self,request):
        print('此时启用process_request')
        # return HttpResponse('没有权限进行访问')

    def process_view(self,request,view_func,view_args,view_kwargs):
        print('此时启用process_view')

    def prcess_response(self,request,response):
        print('调用process_response')

刷新页面,发现报错了,如下所示:
在这里插入图片描述
这是因为它必须返回一个它必须返回一个HttpResponse或 一个StreamingHttpResponse对象,否则就会报错。

接下来,我们让他返回一个response,代码如下所示:

class MyMiddleware(object):
    def __init__(self):
        print('这是我们自己写的中间件的init方法调用')

    def process_request(self,request):
        print('此时启用process_request')
        # return HttpResponse('没有权限进行访问')

    def process_view(self,request,view_func,view_args,view_kwargs):
        print('此时启用process_view')

    def process_response(self,request,response):
        print('调用process_response')
        print(response)
        return response

重新刷新页面后,运行成功,可以发现response就是一个HttpResponse对象:
在这里插入图片描述
若是它直接返回一个HttpResponse对象,结果和前两个一样。

(4)process_exception
process_exception(request,exception)
request是一个HttpRequest对象。exception是Exception视图函数引发的 对象。
Django process_exception()在视图引发异常时调用。 process_exception()应该返回一个None或一个 HttpResponse对象。如果它返回一个 HttpResponse对象,将应用模板响应和响应中间件,并将结果响应返回给浏览器。否则,默认异常处理开始。
同样,中间件在响应阶段以相反的顺序运行,其中包括process_exception。如果异常中间件返回响应,则根本不会调用该中间件之上的中间件类。

下面我们来举例:
在mymiddleware.py文件下写入如下代码:
class MyMiddleware(object):
def init(self):
print(‘这是我们自己写的中间件的init方法调用’)

def process_request(self,request):
    print('此时启用process_request')
    # return HttpResponse('没有权限进行访问')

def process_view(self,request,view_func,view_args,view_kwargs):
    print('此时启用process_view')

def process_response(self,request,response):
    print('调用process_response')
    print(response)
    return response

def process_exception(self,request,exception):
    print('异常处理')

在view.py文件里先抛出一个异常,如下所示:

def exceptions_test(request):
    # 主动抛出异常,测试mymiddleware.py的process_exception中间件
    raise Exception('异常')

刷新页面后,发现报错:
在这里插入图片描述
查看终端,如图所示:
在这里插入图片描述

以上就是中间件的简单介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值