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

Docker+Django中{% if debug %}模板标签失效问题求助

问题排查与解决方案

为什么{% if debug %}不生效?

模板中的debug变量来自Django的django.template.context_processors.debug上下文处理器,它的生效条件是:

  • Django的DEBUG设置为True
  • 当前请求的客户端IP在INTERNAL_IPS列表中

你的场景里,请求是通过Nginx反向代理转发到Django的,Django实际获取到的客户端IP是Nginx容器的IP(而非用户本地IP或Django自身容器IP),而这个Nginx的IP并没有被加入到INTERNAL_IPS中,所以debug变量没有被设置为True,模板判断自然走了else分支。

解决方案

方案1:将Nginx容器IP加入INTERNAL_IPS

因为Docker Compose的服务可以通过服务名解析IP,所以可以在settings.py中自动获取Nginx的IP并添加到INTERNAL_IPS:

# settings.py
import socket

# 获取自身容器IP
hostname, _, ips = socket.gethostbyname_ex(socket.gethostname())
INTERNAL_IPS = [ip for ip in ips] + ['127.0.0.1']

# 添加Nginx容器IP
try:
    nginx_ip = socket.gethostbyname('nginx')
    INTERNAL_IPS.append(nginx_ip)
except socket.gaierror:
    # 服务未启动时忽略,不影响运行
    pass

这样每次启动容器时,都会自动把Nginx的IP加入到信任列表,debug变量就能正常生效。

方案2:直接使用settings.DEBUG判断(更简便)

不需要依赖请求来源IP,直接在模板中调用Django的DEBUG配置,步骤如下:

  1. 确保settings上下文处理器已启用:
    检查settings.py的TEMPLATES配置,确认django.template.context_processors.settings在context_processors列表中:
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                    'django.template.context_processors.settings',  # 确保这一行存在
                ],
            },
        },
    ]
    
  2. 修改模板代码,直接判断settings.DEBUG:
    {% if settings.DEBUG %}
    <!-- This url will be different for each type of app. Point it to your main js file. -->
    <script type="module" src="http://frontend:3000/src/main.jsx"></script>
    {% else %}
    {% render_vite_bundle %}
    {% endif %}
    

这种方式不需要考虑反向代理的IP问题,只要DEBUG设置正确就能直接生效,是最简便的实现方式。

方案3:开发环境跳过Nginx(临时调试用)

如果只是本地开发调试,可以直接访问Django容器的8000端口(比如http://localhost:8000),此时请求来源是你的本地IP或127.0.0.1,只要INTERNAL_IPS包含这些IP,debug变量就会正常生效。

内容的提问来源于stack exchange,提问作者NeonCop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:01:06