Şablon dosyası değiştiğinde Flask uygulamasını yeniden yükleyin


96

Varsayılan olarak, yerleşik sunucuyu ( Flask.run) kullanarak Flask uygulamasını çalıştırırken , Python dosyalarını izler ve kodu değişirse uygulamayı otomatik olarak yeniden yükler:

* Detected change in '/home/xion/hello-world/app.py', reloading
* Restarting with reloader

Ne yazık ki, bu yalnızca * .py dosyaları için çalışıyor gibi görünüyor ve bu işlevi diğer dosyalara genişletmenin bir yolunu bulamıyorum. En önemlisi, bir şablon değiştiğinde Flask'ın uygulamayı yeniden başlatması son derece yararlı olacaktır . Şablonlarda işaretlemeyle kaç kez uğraştığımı ve herhangi bir değişiklik görmeyerek kafamın karıştığını, yalnızca uygulamanın Jinja şablonunun eski sürümünü kullandığını öğrenmek için kaybettim.

Öyleyse, şablonlar dizininde Flask izleme dosyalarına sahip olmanın bir yolu var mı , yoksa çerçevenin kaynağına dalmayı mı gerektiriyor?

Düzenleme : Ubuntu 10.10 kullanıyorum. Bunu başka platformlarda gerçekten denemedim.


Daha fazla araştırmadan sonra, şablonlardaki değişikliklerin gerçekten de uygulamanın kendisini yeniden yüklemeden gerçek zamanlı olarak güncellendiğini keşfettim . Ancak, bu yalnızca iletilen şablonlar için geçerli görünüyor flask.render_template.

Ancak uygulamamda Jinja şablonlarında kullandığım oldukça fazla sayıda yeniden kullanılabilir, parametreleştirilmiş bileşene sahibim. Bunlar, {% macro %}s olarak uygulanırlar , özel "modüller" içinde bulunurlar {% import %}ve gerçek sayfalar halinde düzenlenirler. Hepsi güzel ve KURU ... İçe aktarılan şablonların görünüşe göre hiçbir şekilde geçmedikleri için değişiklikler için asla kontrol edilmemesi render_templatedışında.

(Merakla, bu, aracılığıyla çalıştırılan şablonlar için geçerli değildir {% extends %}. Gelince {% include %}, onları gerçekten kullanmadığım için hiçbir fikrim yok.)

Sonuç olarak, bu fenomenin kökleri Jinja ile Flask veya Werkzeug arasında bir yerde yatıyor gibi görünüyor. Sanırım bu projelerden herhangi biri için bug tracker'a gitmeyi gerektirebilir :) Bu arada jd'yi kabul ettim . cevabı çünkü aslında kullandığım çözüm buydu - ve bir cazibe gibi çalışıyor.


3
DEBUG = True ile yapılandırılan uygulamanın emin olun , belgelere bakın .
Alex Morega

Yanıtlar:


67

Deneyimlerime göre, şablonların her render_template()çağrıldığında diskten yüklenmesi gerektiğinden, yenilenmesi için uygulamanın yeniden başlatılmasına bile ihtiyacı yok . Belki de şablonlarınız farklı kullanılıyor.

Şablonlar değiştiğinde (veya başka herhangi bir dosya) uygulamanızı yeniden yüklemek için , izlenecek dosya adlarından oluşan bir koleksiyon olan extra_filesbağımsız değişkeni iletebilirsiniz Flask().run(): bu dosyalardaki herhangi bir değişiklik, yeniden yükleyiciyi tetikleyecektir.

Misal:

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)

Buraya bakın: http://werkzeug.pocoo.org/docs/0.10/serving/?highlight=run_simple#werkzeug.serving.run_simple


İyi şeyler! Belgelerdeki Flask.runWerkzeug belgelerine götüren bağlantıyı kaçırdığımı kabul ediyorum . Ancak bu özel seçenek, en azından Flask belgelerinde bahsedilmesi için yeterince yararlı görünüyor.
Xion

Herhangi biri diyen bir hatayla karşılaşırsa No such file or directory, ilgili yolu şu şekilde kullanmayı deneyin:extra_dirs = ['./directory/to/watch',]
Kevin

3
Siz de ne patholduğu konusunda kafanız karıştıysa , budur os.path. bahsetmeye değer olduğunu düşündü
bjesus

İçin statik dosyalar bkz değiştirdikten sonra otomatik yeniden bu .
simanacci

1
flask runKomut satırından çalıştırırken fazladan dosyaların nasıl belirtileceği hakkında bir fikriniz var mı?
Michael Scheper

147

kullanabilirsiniz

TEMPLATES_AUTO_RELOAD = True

Http://flask.pocoo.org/docs/1.0/config/ adresinden

Şablon kaynağındaki değişikliklerin kontrol edilip edilmeyeceği ve otomatik olarak yeniden yüklenip yüklenmeyeceği. Varsayılan olarak değer Yok şeklindedir, yani Flask orijinal dosyayı yalnızca hata ayıklama modunda kontrol eder.


11
Bu çözüm gelenekseldir, dokümantasyonla desteklenir, anlaşılması kolaydır ve uygulaması kolaydır. Kabul edilmelidir!
Carolyn Conway

Ben bu cevabı çalıştı ama yalnızca başka yenilendikten sonra bir kez çalışır o olmaz iş
medev21

3
Sadece diğerleri için bir not: Yaptım app.config['TEMPLATES_AUTO_RELOAD'] = Trueve bazı nedenlerden dolayı, hata ayıklama modunda olduğu gibi bir şablon değiştiğinde sunucunun otomatik olarak yeniden başlatıldığını görmeyi bekledim . Yeniden başlamaz, ancak oluşturduğu şablonu günceller.
cs01

3
Bunun 0.12 için çalışmaması için herhangi bir sebep var mı? veya bunun düzgün şekilde ayarlanmasını engelleyecek başka bir ayar?
user805981

3
@Federer Eskisi gibi çalışmıyor gibi görünüyor ... Daha önce şablonlar dizinindeki ve alt dizinlerdeki değişiklikleri tespit etmiş ve sunucuyu yeniden yükleyecekti .... Bu 0.12'de yeni bir şey mi değişti mi?
user805981

55

jinjaŞablonlarla çalışırken , bazı parametreleri ayarlamanız gerekir. Python3 ile ilgili durumumda, aşağıdaki kodla çözdüm:

if __name__ == '__main__':
    app.jinja_env.auto_reload = True
    app.config['TEMPLATES_AUTO_RELOAD'] = True
    app.run(debug=True, host='0.0.0.0')

1
Akıl sağlığımı kurtardın. Teşekkür ederim.
Nostalg.io

Ben de bu problemle zor anlar yaşıyordum.
Yardımcı

Bu benim için flask 1.0.2'de çalışıyor, ancak ana bilgisayar argümanına sahip değilim.
Enrico Borba

Evet @EnricoBorba, muhtemelen buna ihtiyacın olmayacak. Genellikle yerel olarak docker ile hata ayıkladığım için kullanıyorum ve bazen uygulamaya başka bir konteynerden erişilmesi gerekiyor. Some Reference
silgon

@silgon Evet anlıyorum. Balon sürümü 1.0.2 yükleme taze üzerinde çalıştı ne ağırlıklı hemen açık olmak üzere yorum ekleyerek oldu
Enrico Borba


10

Aslında benim için TEMPLATES_AUTO_RELOAD = Trueçalışmıyor (0.12 sürümü). Jinja2 kullanıyorum ve yaptıklarım:

  1. İşlev oluştur before_request

    def before_request():
        app.jinja_env.cache = {}
    
  2. Uygulamaya kaydedin

    app.before_request(before_request)
    
  3. Bu kadar.


3
Garret, bu seçenekler olmadan test etmedim.
dikkini

3. adım gerçekten gerekli değil, benim için çok iyi çalıştı.
Ricardo Ribeiro

4

Benim için işe yarayan şey sadece şunu eklemek:

@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 = {}

( @ dikkini'nin cevabından alınmıştır )


2

Windows üzerinde Flask'ın en son sürümünü kullanarak, run komutunu kullanarak ve hata ayıklama ayarını true olarak ayarlayın; Şablonlarda yapılan değişikliklerin yürürlüğe girmesi için Flask'ın sıfırlanması gerekmez. Hiçbir şeyin önbelleğe alınmadığından emin olmak için Shift + F5'i (veya Shift artı yeniden yükleme düğmesini) deneyin.


2

Haziran 2019 itibarıyla güncellendi:

Bir geliştirme sunucusu çalıştırmak için app.run () yerine flask CLI önerilir, bu nedenle CLI'yi kullanmak istiyorsak kabul edilen çözüm kullanılamaz.

Bu yazı itibariyle Flask (1.1) 'in geliştirme sürümünü kullanmak, kabul edilen cevapla aynı şeyi etkili bir şekilde yapan bir ortam değişkeni FLASK_RUN_EXTRA_FILES ayarlamamıza izin verir.

Bu github sorununa bakın .

Örnek kullanım:

export FLASK_RUN_EXTRA_FILES="app/templates/index.html"
flask run

Linux'ta. Birden fazla ekstra dosya belirtmek için dosya yollarını iki nokta üst üste ile ayırın. , Örneğin

export FLASK_RUN_EXTRA_FILES="app/templates/index.html:app/templates/other.html"

CLI ayrıca --extra-filesFlask 1.1'den itibaren bir argümanı destekler .


küçük güncelleme. 'flask CLI' bağlantısının mevcut sürüme güncellenmesi gerekiyor. flask.palletsprojects.com/en/1.1.x/cli aksi takdirde teşekkürler :)
CodingMatters


1

Şablonlar otomatik olarak yeniden yüklenir ctrl+f5, neden web sayfasını yenilemiyorsunuz, web tarayıcılarının genellikle önbelleği kaydetmesine neden oluyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.