我的项目结构如下
run.py
lib/
mysite/
conf/
__init__.py (flask app)
settings.py
pages/
templates/
index.html
views.py
__init__.py
这是mysite.conf.__init__
from flask import Flask
app = Flask(__name__)
app.debug = True
我的想法是现在将app
导入到每个其他模块以使用它来创建视图。在这种情况下,有一个模块pages
。
在pages.views
我有一些像
from flask import render_template
from mysite.conf import app
@app.route('/')
def index():
return render_template('index.html')
index.html
位于pages/templates
当我从run.py
运行此应用时,如下所示
from mysite.conf import app
app.run()
我收到模板未找到错误。 怎么解决?为什么会这样呢!
我基本上是一个django家伙,每次导入wsgi
对象以在每个模块中创建视图时都会遇到很多不便!它有点疯狂 - 这在某种程度上鼓励了循环进口。有什么方法可以避免这种情况吗?
答案 0 :(得分:22)
Flask希望templates
目录与创建它的模块位于同一文件夹中;它正在寻找mysite/conf/templates
,不是 mysite/pages/templates
。
你需要告诉Flask去别处寻找:
app = Flask(__name__, template_folder='../pages/templates')
这适用于相对于当前模块路径解析的路径。
您不能拥有每个模块的模板目录,而不能使用blueprints。常见的模式是使用templates
文件夹的子目录来分区模板。您使用加载了templates/pages/index.html
等的render_template('pages/index.html')
另一种方法是每个子模块使用Blueprint
个实例;您可以为每个蓝图指定一个单独的模板文件夹,用于注册到该蓝图实例的所有视图。请注意,蓝图中的所有路径都必须以该蓝图独有的公共前缀(可以为空)开头。
答案 1 :(得分:1)
我也遇到了这个问题,并且是Flask的新手。
针对我的情况的解决方案是在主应用目录中创建一个__init__.py
文件,以便将app/
转到一个模块中,因为正如Martijn Pieters
所指出的,flask期望{ {1}}默认位于主模块目录中。为了重述他的答案,您可以在实例化templates
类时重新分配默认目录,例如Flask
因此,简单的目录结构应如下所示:
Flask(__name__, template_folder=any/relative/path/from/app/dir/or/absolute/path/youd/like)
...其中app/
run.py
templates/
sample_template.html
__init__.py # <---- This was the missing file in my case.
可能看起来像这样:
app.py
答案 2 :(得分:0)
我很确定您在主文件夹上拼错了“模板”。只需重命名
或:
做这样的事情(template_folder = '你的文件所属的文件夹的名称')
from flask import Blueprint
from flask import render_template
views = Blueprint('views',__name__,template_folder='tamplate')
@views.route('/')
def home():
return render_template("home.html")