Python 无法找到模板
我的项目结构如下所示Python 无法找到模板,python,flask,Python,Flask,我的项目结构如下所示 run.py lib/ mysite/ conf/ __init__.py (flask app) settings.py pages/ templates/ index.html views.py __init__.py 这是mysite.conf.\uuuu init\uuuu from flask import Flask app = Flask
run.py
lib/
mysite/
conf/
__init__.py (flask app)
settings.py
pages/
templates/
index.html
views.py
__init__.py
这是mysite.conf.\uuuu init\uuuu
from flask import Flask
app = Flask(__name__)
app.debug = True
我的想法是现在将app
导入到其他每个模块,以使用它创建视图。本例中有一个模块页面
在页面.视图中
我有一些类似的代码
from flask import render_template
from mysite.conf import app
@app.route('/')
def index():
return render_template('index.html')
index.html
放在页面/模板中
当我从run.py
运行此应用程序时,如下所示
from mysite.conf import app
app.run()
我正在获取模板未找到错误。
如何修复它?为什么会这样
我基本上是一个django人,每次导入
wsgi
对象以在每个模块中创建视图时都会遇到很多不便!感觉有点疯狂——这在某种程度上鼓励了循环进口。有没有办法避免这种情况?Flask希望模板
目录与创建它的模块位于同一文件夹中;它正在寻找mysite/conf/templates
,而不是mysite/pages/templates
您需要告诉Flask去别处看看:
app = Flask(__name__, template_folder='../pages/templates')
这在路径相对于当前模块路径解析时起作用
您不能拥有每个模块的模板目录,除非使用。一种常见的模式是使用templates
文件夹的子目录对模板进行分区。您可以使用模板/pages/index.html
,加载呈现模板('pages/index.html')
,等等
另一种方法是为每个子模块使用
蓝图
实例;您可以为每个蓝图指定一个单独的模板文件夹,用于注册到该蓝图实例的所有视图。请注意,蓝图中的所有路由都必须以该蓝图特有的公共前缀开头(可以为空)。我遇到了这个问题,也是Flask的新手
我的情况的解决方案是在主应用程序目录中创建一个\uuuu init\uuuuuuuy.py
文件,以便将app/
转入一个模块,因为正如Martijn Pieters
指出的那样,flask默认情况下希望模板
位于主模块目录中。根据他的回答,您可以在实例化Flask
类时重新分配默认目录,例如Flask(\uuuu name\uuuuuuuuuu,template\u folder=any/relative/path/from/app/dir/或/absolute/path/youd/like)
因此,一个简单的目录结构应该如下所示:
app/
run.py
templates/
sample_template.html
__init__.py # <---- This was the missing file in my case.
from flask import Flask, render_template
app = Flask(__name__) # or e.g. Flask(__name__, template_folder='../otherdir')
@app.route("/")
def home():
return "Hello world"
@app.route("/hello/again")
def hello_again():
return render_template("hello_again.html")
if __name__ == "__main__":
app.run()
我敢肯定你在主文件夹上把“模板”拼错了。改名吧 或: 执行类似操作(template_folder='文件所属文件夹的名称')
从flask导入蓝图
从flask导入渲染模板
视图=蓝图('views'、\uuuuu name\uuuuuuuuu、template\uu folder='tamplate')
@视图。路由(“/”)
def home():
返回渲染模板(“home.html”)
Tryrender\u template('templates/index.html')
我还有一些类似person
的模块。我想查看person/templates
dir。如何自动做到这一点。@Iamcool:每个模块使用蓝图(可以配置自己的独立模板文件夹),或者不这样做。通常你会使用templates/
的子文件夹,比如templates/person
,然后加载render\u模板('person/template.html')
。我碰巧看到了蓝图。它说它们不是可插拔的应用程序。如果我们与Django的应用程序相比。。它们有多不同?@Iamcool:它们是钩子处理程序、路由、静态资源和模板的分组。例如,Flask Admin是一个蓝图。@Iamcool:它们非常像Django应用程序;Django应用程序还将URL、视图、静态文件和模板分组在一个公共路径前缀下?其中包含了什么?我相信您现在已经解决了@mrdyprosium,但是init.py是空的。但是,如果愿意,可以将应用程序放在init.py中app.py的内容中。当python导入模块时,将执行此init中的代码。模块的目录结构也是递归搜索的,init文件用于确定是否应将任何子目录作为子模块导入。可以想象,子模块init.py文件也会执行。