Flask render_template() 不呈现 xhtml,但当我手动打开它时它在我的浏览器中正确呈现

Flask render_template() does not render the xhtml, but it renders correctly in my browser when I open it manually

我正在尝试渲染 xhtml (X3D) 文件。问题是,当通过 flask 路由呈现这些模板时,一个 xhtml 模板可以正常工作,而另一个则不能。当我在浏览器中手动打开这两个文件时,它们都可以正常工作。第二个文件是使用 BeautifulSoup.

对第一个文件的修改
#flask app module
from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def hello_world():
    return render_template('index.html')

@app.route('/xhtml')
def xhtml():
    return render_template('8b0e87efd5144053916a1cadfc9c5194.xhtml')

@app.route('/xhtml_2')
def xhtml_2():
    return render_template('920e053d8e474fc1869e9a2c763e9186.xhtml')

if __name__ == '__main__':
    app.run(debug=True)

关于 render_template() 我是否遗漏了什么?

工作文件:https://pastebin.com/qQi96Fcq

无效文件:https://pastebin.com/HJiD9WTZ

关于 render_template() 我是否遗漏了什么?

根据Flask tutorial

Flask uses the Jinja template library to render templates.

难道 一个 xhtml 模板可以正常工作 巧合是有效的 Jinja 模板吗?

jinja 默认情况下期望 .html 作为模板的扩展名,但对于您的情况,您想要使用其他扩展名 .xhtml 呈现模板,为此您需要 autoescape 该自定义扩展,您必须像这样在您的 Flask 应用程序中全局启用它

from jinja2 import select_autoescape

app.jinja_env.autoescape = select_autoescape(      
    default_for_string=True,    
    enabled_extensions=('html', 'xhtml')
)

参考https://jinja.palletsprojects.com/en/3.0.x/api/

如果有用请告诉我。

两个文件非常相似,因为第二个文件只是使用 BeatifulSoup 对第一个文件的修改。我玩弄了这些文件并逐步更改了代码块。我想通了,BeautifulSoup 改变了

<Viewpoint ... ></Viewpoint>

<Viewpoint ... />

jinja 似乎并不喜欢它。在损坏的文件中更改这些标签后,它现在可以正确呈现:

<Viewpoint ... > </Viewpoint>

尽管没有人能为我解决这个问题,但我仍然感谢您的意见,因为它让我更专注地思考我的问题。

将“内容类型”从“text/html”更改为“application/xhtml+xml”。 HTML 不接受自闭标签。然而,XHTML 确实如此。

"但是,即使文档正确验证为 XHTML,真正决定 XHTML/HTML 在浏览器中处理的是 MIME 类型,如前所述,MIME 类型通常设置不正确。所以有效 XHTML 被视为无效 HTML。"

来源:https://flask.palletsprojects.com/en/2.0.x/htmlfaq/

更改的代码部分:

from flask import Flask, render_template, make_response

@app.route('/xhtml_2')
def xhtml_2():
    resp = make_response(render_template('920e053d8e474fc1869e9a2c763e9186.xhtml'), 200)
    resp.headers['Content-Type'] = 'application/xhtml+xml'
    return resp