如何在Django项目的HTML邮件模板中根据环境切换图片URL?
实现方案
针对Django环境下邮件HTML自动匹配不同环境图片URL的需求,给你几个实用的实现方式:
方式一:利用settings环境标识 + 模板条件判断
- 首先在项目的
settings.py里添加环境区分变量,根据部署环境设置对应值:
# NP环境设为'np',生产环境设为'production' ENVIRONMENT = 'np'
- 在邮件HTML模板里,通过Django模板标签做条件判断,动态生成图片URL:
<td bgcolor="#fff" align="right" style="padding: 21px 19px 18px"> <img alt="Teste" src="{% if settings.ENVIRONMENT == 'np' %}https://np-domain.com/mail/logo.png{% else %}https://prod-domain.com/mail/logo.png{% endif %}" width="210px" /> </td>
- 渲染邮件模板时,要把
settings传入上下文,比如用render_to_string('email_template.html', {'settings': settings}),确保模板能读取到环境变量。
方式二:自定义模板过滤器
如果多处需要切换图片URL,用过滤器更简洁:
- 在app下创建
templatetags目录,新增env_tags.py文件:
from django import template from django.conf import settings register = template.Library() @register.filter def env_image_url(image_path): base_url = "https://np-domain.com" if settings.ENVIRONMENT == 'np' else "https://prod-domain.com" return f"{base_url}{image_path}"
- 在邮件模板里加载并使用过滤器:
{% load env_tags %} <td bgcolor="#fff" align="right" style="padding: 21px 19px 18px"> <img alt="Teste" src="{{ '/mail/logo.png'|env_image_url }}" width="210px" /> </td>
方式三:多环境配置文件拆分
如果项目已经用了分环境的配置文件(比如settings/np.py、settings/production.py),可以直接在对应配置里定义图片基础URL:
- NP环境配置文件:
MAIL_IMAGE_BASE_URL = "https://np-domain.com" - 生产环境配置文件:
MAIL_IMAGE_BASE_URL = "https://prod-domain.com"
然后模板里直接调用:
<td bgcolor="#fff" align="right" style="padding: 21px 19px 18px"> <img alt="Teste" src="{{ settings.MAIL_IMAGE_BASE_URL }}/mail/logo.png" width="210px" /> </td>
注意事项
- 必须用Django的
render_to_string方法渲染邮件HTML,保证模板标签能被正确解析。 - 图片URL要确保是公网可访问的,邮件客户端无法读取本地静态文件。
内容的提问来源于stack exchange,提问作者Carlos Eduardo
相关产品推荐
相关产品推荐

