Musisz utworzyć pliki szablonów w prawidłowej lokalizacji; w templates
podkatalogu obok modułu Pythona.
Błąd wskazuje, że home.html
w templates/
katalogu nie ma pliku . Upewnij się, że utworzyłeś ten katalog w tym samym katalogu co moduł Pythona i że faktycznie umieściłeś home.html
plik w tym podkatalogu. Jeśli Twoja aplikacja jest pakietem, folder szablonów powinien zostać utworzony wewnątrz pakietu.
myproject/
app.py
templates/
home.html
myproject/
mypackage/
__init__.py
templates/
home.html
Alternatywnie, jeśli nadałeś folderowi szablonów inną templates
nazwę niż i nie chcesz zmieniać jego nazwy na domyślną, możesz powiedzieć Flask, aby używał tego innego katalogu.
app = Flask(__name__, template_folder='template')
Możesz poprosić Flask o wyjaśnienie, w jaki sposób próbował znaleźć dany szablon, ustawiając EXPLAIN_TEMPLATE_LOADING
opcję na True
. Dla każdego załadowanego szablonu otrzymasz raport zarejestrowany w Kolbieapp.logger
na poziomie INFO
.
Tak to wygląda, gdy wyszukiwanie się powiedzie; w tym przykładzie foo/bar.html
szablon rozszerza base.html
szablon, więc są dwa wyszukiwania:
[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')
Schematy mogą również rejestrować własne katalogi szablonów , ale nie jest to wymagane, jeśli używasz planów, aby ułatwić podzielenie większego projektu na jednostki logiczne. Główny katalog szablonów aplikacji Flask jest zawsze przeszukiwany jako pierwszy, nawet jeśli używasz dodatkowych ścieżek na schemat.
template_folder
ścieżkę dla planu .EXPLAIN_TEMPLATE_LOADING
zostało dodane po tym, jak ta odpowiedź została wstępnie napisana../Templates/index.html
, ale kiedy wdrażam na heroku (myślę, że to ten sam Python, te same wersje bibliotek, w tym ta sama wersja Flask; ale heroku to Unix); i rzucaTemplateNotFound
błąd; po zmianie nazwy folderugit mv Templates/index.html templates/index.html
działały zarówno wersje lokalne (Windows), jak i heroku (Unix)Templates
==templates
. Ale Heroku działa pod Linuksem, z systemem plików uwzględniającym wielkość liter.Myślę, że Flask domyślnie używa szablonów katalogów. Więc twój kod powinien wyglądać tak, jakby to był twój hello.py
from flask import Flask,render_template app=Flask(__name__,template_folder='template') @app.route("/") def home(): return render_template('home.html') @app.route("/about/") def about(): return render_template('about.html') if __name__=="__main__": app.run(debug=True)
I jak struktura przestrzeni roboczej
musisz również utworzyć dwa pliki html o nazwach home.html i about.html i umieścić je w folderze szablonów.
źródło
(Należy pamiętać, że powyższa zaakceptowana odpowiedź podana dla struktury pliku / projektu jest absolutnie poprawna.)
Również..
Oprócz poprawnego ustawienia struktury plików projektu, musimy powiedzieć flaskowi, aby szukał w odpowiednim poziomie hierarchii katalogów.
na przykład..
app = Flask(__name__, template_folder='../templates')
app = Flask(__name__, template_folder='../templates', static_folder='../static')
Rozpoczynanie od
../
powoduje przejście o jeden katalog wstecz i rozpoczęcie w tym miejscu.Rozpoczynanie od
../../
przenosi dwa katalogi wstecz i zaczyna tam (i tak dalej ...).Mam nadzieję że to pomoże
źródło
Nie wiem dlaczego, ale zamiast tego musiałem użyć następującej struktury folderów. Umieszczam „szablony” o jeden poziom wyżej.
To prawdopodobnie wskazuje na błędną konfigurację w innym miejscu, ale nie mogłem dowiedzieć się, co to było i to zadziałało.
źródło
Sprawdź to:
templates
render_template
jest określana względem katalogu szablonów (index.html
znajdowałaby się bezpośrednio w katalogu szablonów,auth/login.html
w katalogu auth w katalogu szablonów).Jeśli to nie zadziała, włącz debugowanie (
app.debug = True
), co może pomóc dowiedzieć się, co jest nie tak.źródło
Jeśli uruchamiasz kod z zainstalowanego pakietu, upewnij się, że pliki szablonów znajdują się w katalogu
<python root>/lib/site-packages/your-package/templates
.Trochę szczegółów:
W moim przypadku próbowałem uruchomić przykłady projektu flask_simple_ui i
jinja
zawsze mówiłemSztuczka polegała na tym, że przykładowy program importował zainstalowany pakiet
flask_simple_ui
. Aninja
używanie z wnętrza tego pakietu oznacza używanie jako katalogu głównego do wyszukiwania ścieżki pakietu, w moim przypadku...python/lib/site-packages/flask_simple_ui
, zamiast tego,os.getcwd()
czego można by się spodziewać.Niestety,
setup.py
ma błąd i nie kopiuje żadnych plików html, w tym brakującychform.html
. Po rozwiązaniusetup.py
problem z TemplateNotFound zniknął.Mam nadzieję, że to komuś pomoże.
źródło
Miałem ten sam błąd, okazało się, że jedyną rzeczą, jaką zrobiłem źle, było nazwanie folderu „szablony”, a „szablon” bez „s”. Po zmianie, że działało dobrze, nie wiem, dlaczego to jest coś, ale tak jest.
źródło
Gdy używana jest funkcja render_template (), próbuje ona wyszukać szablon w folderze o nazwie templates i zgłasza błąd jinja2.exceptions.TemplateNotFound, gdy:
Rozwiązać problem :
utwórz folder z szablonami nazw w tym samym katalogu, w którym znajduje się plik Pythona i umieść utworzony plik html w folderze szablonów.
źródło
Musisz umieścić wszystkie swoje
.html
pliki w folderze szablonów obok modułu Pythona. A jeśli są jakieś obrazy, których używasz w swoich plikach html, musisz umieścić wszystkie swoje pliki w folderze o nazwie staticW poniższej strukturze
źródło
Inną alternatywą jest ustawienie,
root_path
które rozwiązuje problem zarówno w przypadku szablonów, jak i folderów statycznych.root_path = Path(sys.executable).parent if getattr(sys, 'frozen', False) else Path(__file__).parent app = Flask(__name__.split('.')[0], root_path=root_path)
Jeśli renderujesz szablony bezpośrednio przez
Jinja2
, piszesz:ENV = jinja2.Environment(loader=jinja2.FileSystemLoader(str(root_path / 'templates'))) template = ENV.get_template(your_template_name)
źródło
Mój problem polegał na tym, że plik, do którego odwoływałem się od wewnątrz,
home.html
był a.j2
zamiast a.html
, a kiedy go zmieniłem, jinja mogła go odczytać.Głupi błąd, ale może komuś pomóc.
źródło