Django中间件Middleware
#
from django.utils.deprecation import MiddlewareMixin
class ProcessHandleMiddleware(MiddlewareMixin):
"""
以下几个函数的顺序,刚好也是中间件的执行顺序,
按需在适当的位置做操作
"""
def __init__(self, *args, **kwargs):
"""
如果需要额外初始化数据则定义
"""
super(ProcessHandleMiddleware, self).__init__(*args, **kwargs)
self.start_time = time.time()
def process_request(self, request):
"""request请求一进来的预处理函数。
- 在Django接收到request之后,未解析URL到对应视图函数之前。Django向它传入相应的Request对象,以便在方法中修改。
- 若返回None,Django将继续处理这个request,执行后续的中间件, 然后调用相应的 view。
- 若返回HttpResponse对象,Django将不再执行任何除了process_response(返回浏览器的最后一层干预)以外其它的中间件
以及相应的view,Django将立即返回该HttpResponse
- 这里如果报错,后边所有的中间件都就不执行了,直接返回(由内部对error处理,报500)
"""
print("request arrive ...")
def process_view(self, request, callback, callback_args, callback_kwargs):
"""进view前的预处理函数
- 在Django执行完request预处理,路由解析完毕,确定待执行的view函数(即callback函数)之后,但在view实际执行之前
:param request: HttpRequest 对象
:param callback: Django将调用的处理request的python函数. 这是实际的函数对象本身, 而不是字符串表述的函数名
:param callback_args: 将传入view的位置参数列表,但不包括request参数(它通常是传入view的第一个参数)
:param callback_kwargs: 将传入view的关键字参数字典
:return:
- 如果返回None, Django将继续处理这个request ,执行后续的中间件, 然后调用相应的view
- 如果返回HttpResponse对象,Django将不再执行任何其它的中间件(不论种类)以及相应的view,Django会立即返回
- 这里如果报错,后边所有的中间件都就不执行了,直接返回(由内部对error处理,报500)
"""
print("before view")
def process_template_response(self):
"""template模板渲染函数
- 默认不执行,只有在view函数返回的结果对象中有render方法才会执行
- 若返回的话,会把对象内执行render方法后的返回值返回给用户(不返回view返回的对象,而是其对象内render方法的返回值)
"""
print("template response ")
def process_exception(self, request, exception):
"""只有view函数处理抛出的错误才能接到,其他的错误,这里并不能捕获
- 可做异常通知,错误日志搜集,或尝试从错误中自动恢复
- 若返回None,Django将用框架内置的异常处理机制继续处理相应request
- 若返回HttpResponse对象,Django将使用该response对象,而短路框架内置的异常处理机制,直接返回(其他异常处理便不再执行)
"""
print("process exception")
def process_response(self, request, response):