You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 04:39:01