没有使用Flask template_folder参数

时间:2014-01-08 04:14:29

标签: python flask

我有一个使用蓝图的Flask应用,我想要更改蓝图搜索模板的目录。

我创建了如下蓝图:

main = Blueprint('main', __name__, template_folder='newName')

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

然后我注册并运行我的应用程序:

app.register_blueprint(main)
app.run(debug=True)

但是,如果我继续将templates目录的名称更改为newName,我会jinja2.exceptions.TemplateNotFound。如果我将目录名称更改回templates,我的应用程序工作正常并呈现index.html页面;蓝图正在注册,但template_folder param似乎无关紧要。为什么它没有影响?如何使用蓝图在newName中存储我的模板?

编辑:

我有以下结构:

run.py <--- from app import build
            build().run(debug=True)
app/
    __init__.py <--- define build: register bp and return app
    controllers/
        __init__.py <--- import main blueprint from main
        main.py <--- create main blueprint as above
    newName/
        index.html

1 个答案:

答案 0 :(得分:2)

$ tree
.
├── app.py
└── foo
    ├── bp
    │   └── index.html
    └── __init__.py

2 directories, 3 files
# atupal at xiaomi in /tmp/atupal/py [13:25:26]
$ cat app.py 
from flask import Flask

import foo

app = Flask(__name__)

app.register_blueprint(foo.bp)

if __name__ == '__main__':
  app.run(debug=True)
# atupal at xiaomi in /tmp/atupal/py [13:25:28]
$ cat foo/__init__.py 
from flask import Blueprint, render_template

bp = Blueprint('bp', __name__, template_folder='bp')

@bp.route('/')
def index():
  return render_template('index.html')
# atupal at xiaomi in /tmp/atupal/py [13:25:37]
$ curl http://127.0.0.1:5000/
<p>
  index
</p>

从文档中我们可以看到:

  

对于静态文件,路径可以是绝对路径,也可以是相对于蓝图资源文件夹。模板文件夹添加到模板的搜索路径中,但优先级低于实际应用程序的模板文件夹。这样,您可以轻松覆盖蓝图在实际应用程序中提供的模板。

因此,如果您提供的template_folder不存在。 Flask将在应用程序的模板文件夹中搜索它,默认名称为“templates”。