Python Django框架 中间件基础(一)

中间件是Django请求与响应处理的钩子框架。是一个轻量级的插件系统。
Django的中间件用于在全局范围内改变输入(Httprequest)和输出(Httpresponse)

1. 什么是中间件?
中间件用于在视图函数执行之前和执行之后做一些预处理和后处理操作,功能类似装饰器,它的表现形式是一个Python类。类中定义了固定名称的方法 即钩子函数。
Django框架会对每一个http请求在特定的时机执行这些钩子函数。

2. 中间件包含什么?
中间件可以定义五个钩子函数,他们的名字是固定的。

Process_request
Process_view
Process_template_response
Process_response
Process_exception
**不仅中间件的定义需要考虑顺序问题,中间件中的钩子函数调用时也需要考虑顺序问题**

3. 中间件的使用场景
如果需要对请求和响应对象做出修改,就可以考虑使用Django的中间件

4. 配置和使用中间件的注意事项
不可以随便更改中间件的定义顺序,因为他们之间可能存在依赖关系
例如,对于默认的配置,会话中间件定义在身份认证中间件之前。

中间件的钩子函数

1. process_request

在执行视图前被调用,每个请求上都会调用,即请求预处理函数,它接收一个参数request,是Httprequest的对象实例. 这个request和视图函数中的request是类似的。
它的返回值可以是None也可以是HttpResponse对象。
返回值是None:按正常流程继续走,即顺序执行其他中间件的process_request再去执行process_view,接下来才是视图函数
如果是HttpResponse对象:Django将不执行视图函数,也不执行后面中间件的process_request 而将相应对象返回给浏览器。

2. process_view

视图预处理函数,定义如下:

process_view(self, request, view_func, view_args, view_kwargs)

Django会在调用视图函数之前调用process_view方法。但是与process_request不同的是,它会在确定了当前请求对应的视图函数后被调用.
该方法有四个参数:

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

它的返回值可以是None也可以是HttpResponse对象。
返回值是None:继续处理当前请求,调用其他中间件的process_view,再去执行对应的视图函数.
如果是HttpResponse对象:Django将不执行视图函数,也不执行后面中间件的process_view 而执行中间件的process_response, 并应用到当前返回的HttpResponse,最终返回响应对象

3. process_response

响应后处理函数.定义如下:

Process_response(request, response)

该函数调用的时机是Django执行了视图函数并生成响应之后,接收两个参数:

Request:HttpRequest对象实例
Response:视图或中间件返回的响应对象

它的返回值必须是HttpResponse对象或SttreamingHttpRespponse对象。
注意:
多个中间件中的process_response方法是按照MIDDLEWARE中的注册顺序倒序执行的,也就是说第一个中间件的process_request方法首先执行,而它的process_response方法最后执行,最后一个中间件的process_request方法最后一个执行,它的process_response方法是最先执行。

4. process_template_response

TemplateResponse或响应实例有render方法后的后处理函数,定义如下:
process_template_response(request, response) 接收两个参数:

Request:HttpRequest对象实例
Response:TemplateResponse或存在render方法的对象,可以是视图函数或中间件返回的

process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法
必须返回一个实现了render方法的对象

5. Process_exception

异常后处理函数,定义如下:
process_exception(request, exception) 接收两个参数:

Request:HttpRequest对象实例
Exception:视图函数抛出的异常对象

该函数主要用来对异常信息做一些记录和对异常的修复,如视图函数抛出异常后,给用户展示友好的错误信息提示信息**。只有在视图函数中出现异常了才执行**,它返回的值可以是一个None也可以是一个HttpResponse对象。
返回值None:继续执行下一个中间件的process_exception方法处理异常,最终,如果所有中间件的process_exception都返回None,则Django使用内置的异常处理机制处理当前请求.
返回值HttpResponse:继续调用Process_template_response和Process_response,并最终返回响应对象

自定义中间件

1.在工程目录下创建middleware目录
2.目录中创建一个python文件
3.在python文件中导入中间件的基类
from diango.utils.deprecation import MiddlewareMixin
4.在类中根据功能需求,创建切入需求类,重写切入点方法
class LearnAQP(MiddlewareMixin):
def process_reguest(self.request):
print('request的路径',request.GET.path)
5.启用中间件,在settings中进行配置,MIDDLEWARE中添加middleware.文件名.类名

补充:
面向切面编程(Aspect Oriented Programming)简称AOP。AOP的主要实现目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合的隔离效果。

你可能感兴趣的:(python,django)