如何从 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 模板的主要内容,如果未能解决你的问题,请参考以下文章
如何从烧瓶中的“ImmutableMultiDict”获取数据