Flask渲染XML需显式设置Content-Type为application/xml,并在模板中添加XML声明及正确转义。使用Response对象返回渲染结果,对用户输入保留|escape过滤,避免XML注入;验证输出是否符合XML规范。

Flask 默认将 Jinja2 渲染结果作为 text/html 响应,但 XML 模板需要正确的 MIME 类型和编码声明。关键不是“能不能渲染”,而是“如何让浏览器/客户端正确识别并解析为 XML”。
设置响应的 Content-Type 为 application/xml
Jinja2 本身不关心输出格式,它只负责字符串替换。你需要显式告诉 Flask 返回的是 XML:
- 使用
Response对象手动指定mimetype='application/xml' - 或用
make_response()包装渲染结果,并设置 headers
示例:
from flask import Flask, render_template, Response
app = Flask(__name__)
@app.route('/feed.xml')
def rss_feed():
xml_content = render_template('rss.xml', items=[...])
return Response(xml_content, mimetype='application/xml')
在模板中写标准 XML 声明(可选但推荐)
Jinja2 模板文件(如 rss.xml)应以 XML 声明开头,确保生成内容符合 XML 规范:
{{ site_title }} {% for item in items %}- {% endfor %}
{{ item.title | escape }} {{ item.url | escape }}
注意:| escape 很重要——XML 中的 、& 等字符必须转义,否则会破坏结构。
避免自动 HTML 转义干扰 XML 内容
Jinja2 默认对变量输出做 HTML 转义({{ var }} → 转义特殊字符),这在 XML 中可能过度处理(比如把合法的 © 变成 ©)。必要时可用 | safe,但仅限你**完全信任数据不含非法字符**:
- 普通文本字段(标题、描述)建议保留
| escape - 已预处理的 CDATA 内容或纯 ASCII 字段,可酌情用
{{ raw_xml | safe }} - 不要对用户输入直接加
| safe,易引发 XML 注入或解析失败
验证输出是否真正有效 XML
部署前用工具检查生成内容:
- 浏览器访问路由,查看源码,右键“查看页面信息”确认类型是
application/xml - 复制响应体到 XML 验证网站 或用命令行
xmllint --noout feed.xml - 注意常见错误:未闭合标签、非法字符(如控制符 \x00-\x08)、编码声明与实际不符
不复杂但容易忽略:Content-Type + 正确转义 + XML 声明,三者齐备才能让下游系统稳定消费。









