如何从 python 烧瓶中的不同目录引用 html 模板

Posted

技术标签:

【中文标题】如何从 python 烧瓶中的不同目录引用 html 模板【英文标题】:How to reference a html template from a different directory in python flask 【发布时间】:2015-09-09 06:12:27 【问题描述】:
@app.route('/view', methods=['GET', 'POST'])
def view_notifications():
    posts = get_notifications()
    return render_template("frontend/src/view_notifications.html", posts=posts)

所以在我的project/backend/src/app.py 中有这个代码。我将如何引用project/frontend/src/view_notifications.html 中的模板我尝试过使用..,但它一直说找不到路径。我应该这样做吗?

[Tue Jun 23 12:56:02.597207 2015] [wsgi:error] [pid 2736:tid 140166294406912] [remote 10.0.2.2:248] TemplateNotFound: frontend/src/view_notifications.html
[Tue Jun 23 12:56:05.508462 2015] [mpm_event:notice] [pid 2734:tid 140166614526016] AH00491: caught SIGTERM, shutting down

【问题讨论】:

【参考方案1】:

Flask 会自动检测文件夹名称“templates”。因此,您应该在 .py 应用程序文件所在的项目目录中创建一个名为 templates 的文件夹。然后将包含 html 文件的文件夹放在模板文件夹中。因此您的代码将是

return render_template("frontend/src/view_notifications.html", posts=posts)

确保路径“frontend/src/view_notifications.html”在模板文件夹中

【讨论】:

【参考方案2】:

一个面糊的解决方案是直接去没有 os.path.abspath 像这样:

from flask import Flask

app = Flask(__name__, template_folder='../../frontend/src')

【讨论】:

在什么方面使用相对路径更好?我并不反对,但您应该在回答中解释原因。 因为您可以跳过 os.path.abspath 的使用,在您提供的解决方案中,您也使用相对路径并基于该路径创建一个绝对路径,但它也可以在没有转换的情况下工作。 对,它可以工作,但现在如果文件结构发生变化,则需要更改代码。您正在用可维护性/可靠性换取可读性/易用性。这没有错,但不一定“更好”;只是不一样。 如果文件结构发生变化,您也需要调整解决方案中的代码。您还使用相同的相对路径,因此我的解决方案仅增加了可读性,但不会引入额外的维护开销。【参考方案3】:

Flask 正在 templates/frontend/src/view_notifications.html 中查找您的模板文件。您要么需要将模板文件移动到该位置,要么更改默认模板文件夹。

根据 Flask 文档,您可以为模板指定不同的文件夹。默认为您应用根目录中的templates/

import os
from flask import Flask

template_dir = os.path.abspath('../../frontend/src')
app = Flask(__name__, template_folder=template_dir)

更新:

在 Windows 机器上自己测试后,模板文件夹确实需要命名为 templates。这是我使用的代码:

import os
from flask import Flask, render_template

template_dir = os.path.dirname(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))
template_dir = os.path.join(template_dir, 'frontend')
template_dir = os.path.join(template_dir, 'templates')
# hard coded absolute path for testing purposes
working = 'C:\Python34\pro\\frontend\\templates'
print(working == template_dir)
app = Flask(__name__, template_folder=template_dir)


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

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

采用这种结构:

|-pro
  |- backend
    |- app.py
  |- frontend
    |- templates
      |- index.html

'templates' 的任何实例更改为 'src' 并将模板文件夹重命名为 'src' 会导致收到相同的错误 OP。

【讨论】:

我添加了 template_folder 参数,它仍然说找不到模板 它会告诉你它正在查找的文件夹吗? 你试过project/frontend/src/view_notifications.html吗? 是的。不幸的是,它仍然给了我同样的东西。 嘿,非常感谢!这真的很棒,让我克服了使用 Flask 的困难!对此,我真的非常感激!注意:在 Ubuntu 16.04 上工作得很好:)

以上是关于如何从 python 烧瓶中的不同目录引用 html 模板的主要内容,如果未能解决你的问题,请参考以下文章

从烧瓶应用程序调用 python 函数

如何从烧瓶中的“ImmutableMultiDict”获取数据

Python:烧瓶从当前目录导入文件,但子类别

你如何序列化一个python烧瓶变量?

烧瓶-PyMongo。如何显示从 python 到 html 的所有条目?

如何从烧瓶网页在 python 控制台中打印数据