Django中间件

1.什么是中间件

中间件,就是在请求和处理请求中间所做的一些操作。在django中有request中间件,view中间件,response中间件,exception中间件等等。Midddleware都需要在settings.py中的MIDDLEWARE_CLASSES中进行定义。大致的流程如下:
在这里插入图片描述
当一个请求来的时候,会将setting.py中的MIDDLERWARE_CLASSES中的中间件类名全部从头到尾的执行一遍。对于每个中间件类名里面都会有多个中间件的处理方法,如一个中间件类名MD1中有process_request方法,这是request中间件,process_response这是response中间件,process_view中间件,这是view中间件等等。

2.中间件实例

下面这个文件需要在一个app下面的一个文件中,如middlerware.py中

# 导入中间件模块
from django.utils.deprecation import MiddlewareMixin

# 这是一个中间件的类名,需要在settings.py文件的MIDDLEWARE_CLASSES中引入这个类名
class MD1(MiddlewareMixin):
    # 接收到客户端信息后立即执行(视图函数之前)
    def process_request(self, request):
        print("MD1里面的 process_request")
        # 返回到客户端信息前最后执行(视图函数之后)
    def process_view(self, request, view_func, view_args, view_kwargs):
        print("MD1里面的 process_view")
        return None
    # 返回到客户端信息前最后执行(视图函数之后)
    def process_response(self, request, response):
        print("MD1里面的 process_response")
        return response

在settings中定义

MIDDLEWARE = [
    # 自定义 在 对应app内创建一个 my_middleware.py 然后路径填写进来即可
    'app01.middlerware.MD1',
    ]

如上定义以后,当任意一个请求requst来了以后都会立刻去执行MD1这个中间件类,然后顺序的去执行里面的process_request方法和process_view方法和process_response方法;

在这些方法中除process_response均可以返回None或者response,若返回None则继续处理这个request,执行后续的中间件。若返回response则Django不再执行任何其他中间件,立即返回该HttpResponse;

process_response方法必须返回HttpResponse 对象;这个response对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。

3.各中间件参数介绍

3.1 Request预处理函数: process_request(self, request)

这个方法的调用时机在Django接收到request之后,但仍未解析URL以确定应当运行的view之前。Django向它传入相应的 HttpRequest 对象,以便在方法中修改。

process_request() 应当返回 None 或 HttpResponse 对象.

如果返回 None , Django将继续处理这个request,执行后续的中间件, 然后调用相应的view.

如果返回 HttpResponse 对象,Django 将不再执行任何其它的中间件(无视其种类)以及相应的view。 Django将立即返回该 HttpResponse .

3.2 View预处理函数: process_view(self, request, callback, callback_args, callback_kwargs)

这个方法的调用时机在Django执行完request预处理函数并确定待执行的view之后,但在view函数实际执行之前。

request

HttpRequest 对象。

callback

Django将调用的处理request的python函数. 这是实际的函数对象本身, 而不是字符串表述的函数名。

args

将传入view的位置参数列表,但不包括 request 参数(它通常是传入view的第一个参数)
kwargs

将传入view的关键字参数字典.

如同 process_request() , process_view() 应当返回 None 或 HttpResponse 对象。

如果返回 None , Django将继续处理这个 request ,执行后续的中间件, 然后调用相应的view

如果返回 HttpResponse 对象,Django 将不再执行 任何 其它的中间件(不论种类)以及相应的view。Django将立即返回

3.3Response后处理函数: process_response(self, request, response)

这个方法的调用时机在Django执行view函数并生成response之后。

该处理器能修改response的内容;一个常见的用途是内容压缩,如gzip所请求的HTML页面。

这个方法的参数相当直观: request 是request对象,而 response 则是从view中返回的response对象。

process_response() 必须 返回 HttpResponse 对象. 这个response对象可以是传入函数的那一个原始对象(通常已被修改),也可以是全新生成的。

3.4Exception后处理函数: process_exception(self, request, exception)

这个方法只有在request处理过程中出了问题并且view函数抛出了一个未捕获的异常时才会被调用。这个钩子可以用来发送错误通知,将现场相关信息输出到日志文件, 或者甚至尝试从错误中自动恢复。

这个函数的参数除了一贯的 request 对象之外,还包括view函数抛出的实际的异常对象 exception 。

process_exception() 应当返回 None 或 HttpResponse 对象.

如果返回 None , Django将用框架内置的异常处理机制继续处理相应request。

如果返回 HttpResponse 对象, Django 将使用该response对象,而短路框架内置的异常处理机制

来源地址:http://www.crazyant.net/1001.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值