Django中间件Middleware

时间:2025-02-23 19:11:54
# 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):