STUNUM

面有萌色,胸有丘壑。心有猛虎,细嗅蔷薇。

嗨,我是王鑫 (@stunum),一名 Python 开发者。


Python web开发,后端以Django框架为主,前端使用Vue.js...

Django-middleware

中间件是一个 hook 框架,它们可以介入 Django 的请求和响应处理过程。 它是一个轻量级、底层的“插件”系统,用于在全局修改 Django 的输入或输出。

Django 的中间件

自定义中间件类可以继承 MiddlewareMixin 类。

class MiddlewareMixin:
    def __init__(self, get_response=None):
        self.get_response = get_response
        super().__init__()

    def __call__(self, request):
        response = None
        if hasattr(self, 'process_request'):
            response = self.process_request(request)
        response = response or self.get_response(request)
        if hasattr(self, 'process_response'):
            response = self.process_response(request, response)
        return response

MiddlewareMixin中的 __call__方法使得每个自定义中间件如果定义了 process_requestprocess_response的方法那么就一定会被执行!并且process_response方法必须有返回值,也就是要有return

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

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 并返回结果。

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

request 是一个 HttpRequest 对象。 Exception 是一个被视图中的方法抛出来的 exception 对象。

当一个视图抛出异常时,Django 会调用 process_exception()来处理。 None 应该返回一个 process_exception() 或者一个 HttpResponse 对象。 如果它返回一个 HttpResponse 对象,则将应用模板响应和响应中间件,并将生成的响应返回给浏览器。 否则,default exception handling 开始。

再次提醒,在处理响应期间,中间件的执行顺序是倒序执行的,这包括 process_exception。 如果异常中间件返回响应,那么中间件上面的中间件类的 process_exception 方法根本就不会被调用。

Template 模版渲染函数:process_template_response()

request 是一个 HttpRequest 对象。 response 是一个 TemplateResponse 对象(或等价的对象),由 Django 视图或者中间件返回。

如果响应的实例有 render()方法,process_template_response()在视图刚好执行完毕之后被调用,这表明了它是一个 TemplateResponse 对象(或等价的对象)。

这个方法必须返回一个实现了 render 方法的响应对象。 它可以修改给定的 response.template_name 对象,通过修改 response 和 response.context_data 或者它可以创建一个全新的 TemplateResponse 或等价的对象。

你不需要显式渲染响应 —— 一旦所有的模板响应中间件被调用,响应会自动被渲染。

在一个响应的处理期间,中间件以相反的顺序运行,这包括 process_template_response()。

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

Django 自动将视图或中间件引发的异常转换为具有错误状态代码的适当 HTTP 响应。 Certain exceptions 转换为 4xx 状态码,而将未知异常转换为 500 状态码。

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

request 是 request 对象,而 response 则是从 view 中返回的 response 对象。 这个方法的调用时机在 Django 执行 view 函数并生成 response 之后。 该处理器能修改 response 的内容;一个常见的用途是内容压缩,如 gzip 所请求的 HTML 页面。

通过重写这五个方法可以处理 django 的输入输出。

最近的文章

docker-file的学习使用

docker-file的学习使用…

水滴石穿继续阅读
更早的文章

python实现的常用算法

冒泡排序冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。def bubbleSort(arr): for i in range(1, len(arr)): for j in range(0, len(arr)-i): ...…

水滴石穿继续阅读