Secara default, ketika menjalankan aplikasi Flask menggunakan built-in server ( Flask.run
), ia memonitor file Python-nya dan secara otomatis memuat ulang aplikasi jika kodenya berubah:
* Detected change in '/home/xion/hello-world/app.py', reloading
* Restarting with reloader
Sayangnya, ini tampaknya hanya berfungsi untuk file * .py , dan saya sepertinya tidak menemukan cara untuk memperluas fungsionalitas ini ke file lain. Terutama, akan sangat berguna jika Flask memulai ulang aplikasi saat template berubah. Saya tidak dapat menghitung berapa kali saya mengutak-atik markup di template dan menjadi bingung karena tidak melihat perubahan apa pun, hanya untuk mengetahui bahwa aplikasi tersebut masih menggunakan template Jinja versi lama.
Jadi, apakah ada cara untuk memiliki file monitor Flask di direktori templates , atau apakah itu membutuhkan masuk ke sumber framework?
Edit : Saya menggunakan Ubuntu 10.10. Belum pernah mencobanya di platform lain.
Setelah penyelidikan lebih lanjut, saya telah menemukan bahwa perubahan dalam template memang sedang diperbarui secara real time, tanpa reload aplikasi itu sendiri. Namun, ini tampaknya hanya berlaku untuk template yang diteruskan flask.render_template
.
Tapi kebetulan di aplikasi saya, saya memiliki cukup banyak komponen parameter yang dapat digunakan kembali yang saya gunakan di template Jinja. Mereka diimplementasikan sebagai {% macro %}
s, berada dalam "modul" khusus dan {% import %}
diubah menjadi halaman sebenarnya. Semuanya bagus dan KERING ... kecuali bahwa templat yang diimpor itu tampaknya tidak pernah diperiksa untuk modifikasi, karena tidak lolos render_template
sama sekali.
(Anehnya, ini tidak terjadi untuk template yang dipanggil melalui {% extends %}
. Adapun {% include %}
, saya tidak tahu karena saya tidak benar-benar menggunakannya.)
Jadi untuk menyimpulkan, akar dari fenomena ini tampaknya terletak di antara Jinja dan Flask atau Werkzeug. Saya kira ini mungkin memerlukan perjalanan ke pelacak bug untuk salah satu proyek tersebut :) Sementara itu, saya telah menerima jd. jawabannya karena itulah solusi yang sebenarnya saya gunakan - dan berfungsi dengan sangat baik.
Jawaban:
Dalam pengalaman saya, templat bahkan tidak memerlukan aplikasi untuk dimulai ulang untuk disegarkan, karena templat harus dimuat dari disk setiap kali
render_template()
dipanggil. Mungkin template Anda digunakan secara berbeda.Untuk memuat ulang aplikasi Anda saat template berubah (atau file lainnya), Anda dapat meneruskan
extra_files
argumen keFlask().run()
, kumpulan nama file yang harus diperhatikan: setiap perubahan pada file tersebut akan memicu reloader.Contoh:
from os import path, walk extra_dirs = ['directory/to/watch',] extra_files = extra_dirs[:] for extra_dir in extra_dirs: for dirname, dirs, files in walk(extra_dir): for filename in files: filename = path.join(dirname, filename) if path.isfile(filename): extra_files.append(filename) app.run(extra_files=extra_files)
Lihat di sini: http://werkzeug.pocoo.org/docs/0.10/serving/?highlight=run_simple#werkzeug.serving.run_simple
sumber
Flask.run
yang mengarah ke dokumen Werkzeug. Tetapi opsi khusus ini tampaknya cukup berguna untuk setidaknya disebutkan dalam dokumen Flask.No such file or directory
, coba gunakan jalur relatif seperti di:extra_dirs = ['./directory/to/watch',]
path
ituos.path
. pikir itu layak untuk disebutkanflask run
dari baris perintah?kamu bisa memakai
TEMPLATES_AUTO_RELOAD = True
Dari http://flask.pocoo.org/docs/1.0/config/
sumber
app.config['TEMPLATES_AUTO_RELOAD'] = True
, dan untuk beberapa alasan diharapkan melihat server restart otomatis ketika template berubah, seperti yang terjadi dalam mode debug. Itu tidak memulai ulang, tetapi TIDAK memperbarui template yang direndernya.Saat Anda bekerja dengan
jinja
template, Anda perlu mengatur beberapa parameter. Dalam kasus saya dengan python3, saya menyelesaikannya dengan kode berikut:if __name__ == '__main__': app.jinja_env.auto_reload = True app.config['TEMPLATES_AUTO_RELOAD'] = True app.run(debug=True, host='0.0.0.0')
sumber
Bagi saya bekerja dengan baik:
from flask import Flask, render_template, request, url_for, redirect app = Flask(__name__) app.config["TEMPLATES_AUTO_RELOAD"] = True
Lihat lebih lanjut di http://flask.pocoo.org/docs/1.0/config/
sumber
Sebenarnya bagi saya
TEMPLATES_AUTO_RELOAD = True
tidak berfungsi (versi 0,12). Saya menggunakan jinja2 dan apa yang telah saya lakukan:Buat fungsi
before_request
def before_request(): app.jinja_env.cache = {}
Daftarkan di aplikasi
Itu dia.
sumber
Apa yang berhasil bagi saya hanyalah menambahkan ini:
@app.before_request def before_request(): # When you import jinja2 macros, they get cached which is annoying for local # development, so wipe the cache every request. if 'localhost' in request.host_url or '0.0.0.0' in request.host_url: app.jinja_env.cache = {}
( diambil dari jawaban @ dikkini )
sumber
Menggunakan versi terbaru Flask di Windows, menggunakan perintah run dan debug disetel ke true; Flask tidak perlu diatur ulang agar perubahan pada template dapat diterapkan. Coba Shift + F5 (atau Shift plus tombol muat ulang) untuk memastikan tidak ada yang di-cache.
sumber
Diperbarui per Juni 2019:
The termos CLI dianjurkan lebih app.run () untuk menjalankan server dev, jadi jika kita ingin menggunakan CLI maka solusi yang diterima tidak dapat digunakan.
Menggunakan versi pengembangan Flask (1.1) pada tulisan ini memungkinkan kita untuk menyetel variabel lingkungan FLASK_RUN_EXTRA_FILES yang secara efektif melakukan hal yang sama seperti jawaban yang diterima.
Lihat masalah github ini .
Contoh penggunaan:
export FLASK_RUN_EXTRA_FILES="app/templates/index.html" flask run
di Linux. Untuk menentukan beberapa file tambahan, pisahkan jalur file dengan titik dua. , mis
export FLASK_RUN_EXTRA_FILES="app/templates/index.html:app/templates/other.html"
CLI juga mendukung
--extra-files
argumen mulai dari Flask 1.1.sumber
Lihat http://flask.pocoo.org/docs/1.0/quickstart/ dan gunakan
FLASK_ENV=development
sumber
Template dimuat ulang secara otomatis, mengapa tidak melakukan
ctrl+f5
refresh halaman web, karena browser web biasanya menyimpan cache.sumber