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”)

Try
render\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文件也会执行。