Anda harus membuat file template Anda di lokasi yang benar; di templates
subdirektori di sebelah modul python Anda.
Kesalahan menunjukkan bahwa tidak ada home.html
file di templates/
direktori. Pastikan Anda membuat direktori itu di direktori yang sama dengan modul python Anda, dan bahwa Anda memang meletakkan home.html
file di subdirektori itu. Jika aplikasi Anda adalah sebuah paket, folder template harus dibuat di dalam paket tersebut.
myproject/
app.py
templates/
home.html
myproject/
mypackage/
__init__.py
templates/
home.html
Alternatifnya, jika Anda menamai folder templat Anda dengan nama lain templates
dan tidak ingin menamainya kembali ke default, Anda dapat memberi tahu Flask untuk menggunakan direktori lain itu.
app = Flask(__name__, template_folder='template')
Anda dapat meminta Flask untuk menjelaskan bagaimana ia mencoba menemukan template yang diberikan, dengan menyetel EXPLAIN_TEMPLATE_LOADING
opsi ke True
. Untuk setiap template yang dimuat, Anda akan mendapatkan laporan yang dicatat ke Flaskapp.logger
, di level INFO
.
Inilah yang terlihat ketika pencarian berhasil; dalam contoh ini foo/bar.html
template memperluas base.html
template, jadi ada dua pencarian:
[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')
Cetak biru juga dapat mendaftarkan direktori templatnya sendiri , tetapi ini bukan persyaratan jika Anda menggunakan cetak biru agar lebih mudah membagi proyek yang lebih besar ke seluruh unit logis. Direktori template aplikasi Flask utama selalu dicari terlebih dahulu bahkan saat menggunakan jalur tambahan per cetak biru.
template_folder
jalur per cetak biru .EXPLAIN_TEMPLATE_LOADING
ditambahkan setelah jawaban ini awalnya ditulis../Templates/index.html
, tetapi ketika saya menyebarkan ke heroku (mengira itu adalah Python yang sama, versi pustaka yang sama, termasuk versi Flask yang sama; tetapi heroku adalah Unix); dan melemparTemplateNotFound
kesalahan; setelah saya mengganti nama foldergit mv Templates/index.html templates/index.html
, versi lokal (Windows) dan heroku (Unix) berfungsiTemplates
==templates
. Tapi Heroku menjalankan Linux, dengan filesystem case sensitive.Saya rasa Flask menggunakan template direktori secara default. Jadi kode Anda haruslah misalkan ini adalah hello.py Anda
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)
Dan Anda menyukai struktur ruang
Anda juga telah membuat dua file html dengan nama home.html dan about.html dan meletakkan file tersebut di folder template.
sumber
(Harap dicatat bahwa Jawaban yang diterima di atas diberikan untuk file / struktur proyek benar-benar benar.)
Juga..
Sebagai tambahan untuk mengatur struktur file proyek dengan benar, kita harus memberi tahu flask untuk melihat level hirarki direktori yang sesuai.
sebagai contoh..
app = Flask(__name__, template_folder='../templates')
app = Flask(__name__, template_folder='../templates', static_folder='../static')
Dimulai dengan
../
memindahkan satu direktori ke belakang dan mulai dari sana.Dimulai dengan
../../
memindahkan dua direktori ke belakang dan mulai dari sana (dan seterusnya ...).Semoga ini membantu
sumber
Saya tidak tahu mengapa, tetapi saya harus menggunakan struktur folder berikut sebagai gantinya. Saya menempatkan "template" satu tingkat ke atas.
Ini mungkin menunjukkan kesalahan konfigurasi di tempat lain, tetapi saya tidak tahu apa itu dan ini berhasil.
sumber
Periksa itu:
templates
render_template
adalah relatif terhadap direktori template (index.html
akan langsung berada di direktori templates,auth/login.html
akan berada di bawah direktori auth di direktori templates.)Jika tidak berhasil, aktifkan debugging (
app.debug = True
) yang mungkin membantu mencari tahu apa yang salah.sumber
Jika Anda menjalankan kode Anda dari paket yang diinstal, pastikan file template ada di direktori
<python root>/lib/site-packages/your-package/templates
.Beberapa detail:
Dalam kasus saya, saya mencoba menjalankan contoh proyek flask_simple_ui dan
jinja
akan selalu berkataTriknya adalah program sampel akan mengimpor paket yang diinstal
flask_simple_ui
. Danninja
digunakan dari dalam paket itu digunakan sebagai direktori root untuk mencari jalur paket, dalam kasus saya...python/lib/site-packages/flask_simple_ui
, bukanos.getcwd()
seperti yang diharapkan.Sayangnya, saya
setup.py
memiliki bug dan tidak menyalin file html apa pun, termasuk yang hilangform.html
. Setelah saya perbaikisetup.py
, masalah dengan TemplateNotFound lenyap.Saya harap ini membantu seseorang.
sumber
Saya mengalami kesalahan yang sama ternyata satu-satunya hal yang saya lakukan salah adalah memberi nama folder 'template' saya, 'template' tanpa 's'. Setelah mengubahnya itu berfungsi dengan baik, tidak tahu mengapa itu adalah sesuatu tetapi itu benar.
sumber
Ketika fungsi render_template () digunakan, ia mencoba mencari template di folder yang disebut template dan memunculkan error jinja2.exceptions.TemplateNotFound ketika:
Untuk memecahkan masalah :
buat folder dengan template nama di direktori yang sama tempat file python berada dan letakkan file html yang dibuat di folder template.
sumber
Anda harus meletakkan semua
.html
file Anda di folder template di sebelah modul python Anda. Dan jika ada gambar yang Anda gunakan di file html Anda maka Anda perlu meletakkan semua file Anda di folder bernama statisDalam Struktur berikut
sumber
Alternatif lain adalah mengatur
root_path
mana yang memperbaiki masalah baik untuk templat maupun folder statis.root_path = Path(sys.executable).parent if getattr(sys, 'frozen', False) else Path(__file__).parent app = Flask(__name__.split('.')[0], root_path=root_path)
Jika Anda merender template secara langsung melalui
Jinja2
, maka Anda menulis:ENV = jinja2.Environment(loader=jinja2.FileSystemLoader(str(root_path / 'templates'))) template = ENV.get_template(your_template_name)
sumber
Masalah saya adalah bahwa file yang saya rujuk dari dalam saya
home.html
adalah.j2
bukan sebuah.html
, dan ketika saya mengubahnya kembali jinja bisa membacanya.Kesalahan bodoh tetapi mungkin membantu seseorang.
sumber