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

Flask模板渲染异常:head元素被渲染到body内及出现零宽空格

Flask模板渲染异常:Head内容被移至Body且出现零宽空格字符

搭建了一个使用模板继承的简单Flask应用,运行后生成的HTML出现异常:原本在<head>内的元素被渲染到<body>中,同时出现&#xFEFF;(零宽不换行空格)字符。


应用代码与目录结构

app.py

from flask import Flask
from flask import render_template

app = Flask(__name__)

@app.route("/")
def index():
    return render_template('index.html',
        title = "My Title"
    )

模板文件

templates/layout.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>{% block title %}{% endblock %}</title>
        <link rel="icon" href="data:,">
        <link rel="stylesheet" href="static/css/bootstrap.min.css">
        <link rel="stylesheet" href="static/css/style.css">
    </head>
    <body class="mx-3">

        <div class="card">
            <div class="card-body"> 
                {% block content %}{% endblock %}
            </div>
        </div>
        
        <script src="static/js/jquery-3.7.0.slim.min.js"></script>
        <script src="static/js/bootstrap.bundle.min.js"></script>
        {% block scripts %}{% endblock %}
    </body>
</html>

templates/index.html

{% extends "layout.html" %}

{% block title %}
{{ title }}
{% endblock %}

{% block content %}

<p class="display-4">Hello from index</p>

{% endblock %}

{% block scripts %}
<script src="static/js/scripts.js"></script>
{% endblock %}

目录结构

├───static
│   ├───css
│   │       bootstrap.min.css
│   │       style.css
│   │
│   └───js
│           bootstrap.bundle.min.js
│           jquery-3.7.0.slim.min.js
│           scripts.js
├───templates
│       index.html
│       layout.html
│
├───app.py

异常渲染结果

运行命令flask --app app run后,生成的异常HTML如下:

<html lang="en">
<head></head>
<body class="mx-3">
        "&#xFEFF; "
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title> My Title </title>
        <link rel="icon" href="data:,">
        <link rel="stylesheet" href="static/css/bootstrap.min.css">
        <link rel="stylesheet" href="static/css/style.css">   

        <div class="card">
            <div class="card-body"> 
                <p class="display-4">Hello from index</p>
            </div>
        </div>
        
        <script src="static/js/jquery-3.7.0.slim.min.js"></script>
        <script src="static/js/bootstrap.bundle.min.js"></script>
        <script src="static/js/scripts.js"></script>
</body>
</html>

环境信息

  • Python版本:3.11.4
  • Flask版本:2.3.2
  • 仅在虚拟环境中安装Flask,无其他额外依赖

异常原因及解决办法

最可能的问题是模板文件带UTF-8 BOM标记:

  • &#xFEFF;是UTF-8 BOM的HTML实体编码,说明你的模板文件(尤其是layout.html)是以带BOM的UTF-8格式保存的。Jinja2解析模板时,会把这个BOM当成普通文本输出到页面最开头。
  • 浏览器解析HTML时,一旦在<head>标签前遇到非HTML标签的内容(比如这个BOM),就会自动关闭<head>,把后续原本属于head的内容全部塞进<body>里,就出现了你看到的异常。

解决办法:

  • 用VS Code、PyCharm这类专业编辑器打开模板文件,将文件编码改成UTF-8 无BOM格式后重新保存。
  • 也可以用dos2unix这类工具批量去除文件里的BOM标记。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:01:16