Você deve criar seus arquivos de modelo no local correto; no templates
subdiretório próximo ao seu módulo python.
O erro indica que não há home.html
arquivo no templates/
diretório. Certifique-se de ter criado esse diretório no mesmo diretório de seu módulo python e de ter de fato colocado um home.html
arquivo nesse subdiretório. Se seu aplicativo for um pacote, a pasta de modelos deve ser criada dentro do pacote.
myproject/
app.py
templates/
home.html
myproject/
mypackage/
__init__.py
templates/
home.html
Alternativamente, se você nomeou sua pasta de modelos de outra forma templates
e não deseja renomeá-la para o padrão, você pode dizer ao Flask para usar esse outro diretório.
app = Flask(__name__, template_folder='template') # still relative to module
Você pode pedir ao Flask para explicar como tentou encontrar um determinado modelo, definindo a EXPLAIN_TEMPLATE_LOADING
opção para True
. Para cada template carregado, você obterá um relatório registrado no Flaskapp.logger
, no nível INFO
.
Isso é o que parece quando uma pesquisa é bem-sucedida; neste exemplo, o foo/bar.html
modelo estende o base.html
modelo, portanto, há duas pesquisas:
[2019-06-15 16:03:39,197] INFO in debughelpers: Locating template "foo/bar.html":
1: trying loader of application "flaskpackagename"
class: jinja2.loaders.FileSystemLoader
encoding: 'utf-8'
followlinks: False
searchpath:
- /.../project/flaskpackagename/templates
-> found ('/.../project/flaskpackagename/templates/foo/bar.html')
[2019-06-15 16:03:39,203] INFO in debughelpers: Locating template "base.html":
1: trying loader of application "flaskpackagename"
class: jinja2.loaders.FileSystemLoader
encoding: 'utf-8'
followlinks: False
searchpath:
- /.../project/flaskpackagename/templates
-> found ('/.../project/flaskpackagename/templates/base.html')
Os blueprints também podem registrar seus próprios diretórios de modelo , mas isso não é um requisito se você estiver usando blueprints para facilitar a divisão de um projeto maior em unidades lógicas. O diretório principal do modelo do aplicativo Flask é sempre pesquisado primeiro, mesmo ao usar caminhos adicionais por blueprint.
template_folder
caminho por blueprint .EXPLAIN_TEMPLATE_LOADING
foi adicionado depois que esta resposta foi escrita inicialmente../Templates/index.html
, mas quando eu implantar no heroku (pensei que fosse o mesmo Python, mesmas versões de biblioteca, incluindo a mesma versão do Flask; mas heroku é Unix); e lançaTemplateNotFound
erro; depois de renomear a pastagit mv Templates/index.html templates/index.html
, as versões local (Windows) e heroku (Unix) funcionaramTemplates
==templates
. Mas o Heroku roda Linux, com um sistema de arquivos que diferencia maiúsculas de minúsculas.Acho que o Flask usa os modelos de diretório por padrão. Portanto, seu código deve ser suposto que este é o seu hello.py
E você trabalha a estrutura do espaço como
Além disso, você deve criar dois arquivos html com os nomes home.html e about.html e colocar esses arquivos na pasta de modelos.
fonte
(Observe que a Resposta aceita acima fornecida para a estrutura do arquivo / projeto está absolutamente correta.)
Além disso..
Além de configurar corretamente a estrutura do arquivo do projeto, temos que dizer ao flask para procurar no nível apropriado da hierarquia de diretórios.
por exemplo..
Começar com
../
move um diretório para trás e começa aí.Começar com
../../
move dois diretórios para trás e começa aí (e assim por diante ...).Espero que isto ajude
fonte
Não sei por que, mas tive que usar a seguinte estrutura de pastas. Eu coloquei "modelos" um nível acima.
Isso provavelmente indica uma configuração incorreta em outro lugar, mas não consegui descobrir o que era e funcionou.
fonte
Verifique se:
templates
render_template
é relativo ao diretório de modelos (index.html
estaria diretamente no diretório de modelos,auth/login.html
estaria sob o diretório auth no diretório de modelos).Se isso não funcionar, ative debugging (
app.debug = True
) que pode ajudar a descobrir o que está errado.fonte
Se você executar seu código de um pacote instalado, certifique-se de que os arquivos de modelo estejam presentes no diretório
<python root>/lib/site-packages/your-package/templates
.Alguns detalhes:
No meu caso, eu estava tentando executar exemplos do projeto flask_simple_ui e
jinja
sempre diziaO truque era que o programa de amostra importaria o pacote instalado
flask_simple_ui
. Eninja
ser usado de dentro desse pacote é usar como diretório raiz para pesquisar o caminho do pacote, no meu caso...python/lib/site-packages/flask_simple_ui
, em vez deos.getcwd()
como seria de esperar.Para meu azar,
setup.py
está com um bug e não copia nenhum arquivo html, inclusive o ausenteform.html
. Depois de consertarsetup.py
, o problema com TemplateNotFound desapareceu.Eu espero que isso ajude alguém.
fonte
Eu tive o mesmo erro, mas a única coisa que fiz de errado foi nomear minha pasta 'templates', 'template' sem 's'. Depois de mudar isso funcionou bem, não sei por que é uma coisa, mas é.
fonte
Quando a função render_template () é usada, ela tenta pesquisar o modelo na pasta chamada modelos e gera o erro jinja2.exceptions.TemplateNotFound quando:
Para resolver o problema:
crie uma pasta com modelos de nomes no mesmo diretório onde o arquivo python está localizado e coloque o arquivo html criado na pasta de modelos.
fonte
Você precisa colocar todos os seus
.html
arquivos na pasta de modelos ao lado do seu módulo python. E se houver alguma imagem que você está usando em seus arquivos html, então você precisa colocar todos os seus arquivos na pasta chamada staticNa seguinte estrutura
fonte
Outra alternativa é definir o
root_path
que corrige o problema tanto para modelos quanto para pastas estáticas.Se você renderizar modelos diretamente via
Jinja2
, então você escreve:fonte