Django 如何在middleware中获取渲染完成后发送给用户的站点模板
Django中间件获取渲染后最终响应的实现方案
核心逻辑
Django中间件的执行流程分为请求前置、响应后置两个阶段:请求到达视图前会依次执行所有中间件的前置逻辑,视图完成模板渲染生成响应后,会逆序执行所有中间件的后置逻辑,在此阶段拿到的响应对象即为最终要发送给用户的内容。
实现步骤
- 第一步:编写自定义中间件,在后置逻辑中读取响应内容
# 放在你对应app的middleware.py文件中 from django.utils.deprecation import MiddlewareMixin class FetchRenderedTemplateMiddleware(MiddlewareMixin): def __call__(self, request): # 此处为请求前置逻辑,视图还未执行 response = self.get_response(request) # 此处为响应后置逻辑,视图已完成模板渲染 # 过滤HTML类型的页面响应,排除接口、静态资源等内容 if not response.streaming and response.get('Content-Type', '').startswith('text/html'): # 解码得到渲染完成的最终HTML字符串 final_html = response.content.decode(response.charset) # 此处可添加你自己的处理逻辑,比如内容修改、日志存储等 print(final_html) return response
- 第二步:注册中间件到项目配置
将自定义中间件添加到settings.py的MIDDLEWARE列表的末尾,确保能获取到所有其他中间件处理完成后的最终响应:
# settings.py MIDDLEWARE = [ # Django默认中间件保留,原有顺序不要改动 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', # 新增你的自定义中间件到最后一行 'your_app_name.middleware.FetchRenderedTemplateMiddleware' ]
特殊场景说明
- 如果你需要获取渲染所用的原始模板对象而非渲染后的HTML字符串,可监听Django的
template_rendered信号,信号触发时会返回模板实例、渲染上下文、请求对象等信息。 - 如果处理
StreamingHttpResponse流式响应,需要遍历response.streaming_content拼接内容,处理完成后需要把新的内容迭代器重新赋值给response.streaming_content,避免响应内容被消耗无法返回给用户。
内容的提问来源于stack exchange,提问作者hexal
相关产品推荐
相关产品推荐

