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配置,步骤如下:
- 确保
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', # 确保这一行存在 ], }, }, ] - 修改模板代码,直接判断
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
相关产品推荐
相关产品推荐

