Memuat ulang otomatis aplikasi Flask python saat perubahan kode

202

Saya sedang menyelidiki bagaimana mengembangkan aplikasi web yang layak dengan Python. Karena saya tidak ingin beberapa struktur tingkat tinggi menghalangi saya, pilihan saya jatuh pada kerangka Flask yang ringan . Waktu akan memberi tahu apakah ini pilihan yang tepat.

Jadi, sekarang saya telah menyiapkan server Apache dengan mod_wsgi, dan situs pengujian saya berjalan dengan baik. Namun, saya ingin mempercepat pengembangan rutin dengan membuat situs secara otomatis memuat ulang setiap perubahan dalam file py atau template yang saya buat. Saya melihat bahwa setiap perubahan pada file .wsgi situs menyebabkan reload (bahkan tanpa WSGIScriptReloading Aktif pada file konfigurasi apache), tetapi saya masih harus mendorongnya secara manual (mis., Masukkan linebreak tambahan, simpan). Apakah ada cara bagaimana menyebabkan memuat ulang ketika saya mengedit beberapa file py aplikasi? Atau, saya diharapkan menggunakan IDE yang menyegarkan file .wsgi untuk saya?

Passiday
sumber

Jawaban:

228

Cara yang disarankan saat ini adalah dengan flaskutilitas baris perintah.

https://flask.palletsprojects.com/en/1.1.x/quickstart/#debug-mode

Contoh:

$ export FLASK_APP=main.py
$ export FLASK_ENV=development
$ flask run

atau dalam satu perintah:

$ FLASK_APP=main.py FLASK_ENV=development flask run

Jika Anda menginginkan port yang berbeda dari opsi 5000tambahkan default ( ) --port.

Contoh:

$ FLASK_APP=main.py FLASK_ENV=development flask run --port 8080

Lebih banyak opsi tersedia dengan:

$ flask run --help
Eyal Levin
sumber
3
atau pyvenv di python3.5, flask runjuga berfungsi, karena ketika Anda pip install flask, sebuah file executable flask juga diinstal di venv/bin/folder.
TonyTony
Ini adalah solusi sederhana yang dapat diterjemahkan ke Docker untuk tujuan pengembangan. Orang dapat melihat solusi yang sama di sini .
Bekerja dengan normal, tetapi ini sepertinya tidak bekerja di Ubuntu dengan kode pada partisi NTFS. Bukan masalah dengan kode tetapi labu tampaknya tidak mengenali perubahan dalam pengaturan itu.
citynorman
211

Jika Anda berbicara tentang lingkungan uji / dev, maka gunakan saja opsi debug. Ini akan memuat ulang aplikasi labu secara otomatis ketika terjadi perubahan kode.

app.run(debug=True)

Atau, dari shell:

$ export FLASK_DEBUG=1
$ flask run

http://flask.pocoo.org/docs/quickstart/#debug-mode

codegeek
sumber
6
Ini hanya berfungsi ketika Anda menjalankan situs melalui server pengembangan bawaan. Tetapi tidak ketika menjalankannya melalui wsgi, di Apache. Dan saya tidak bersikeras saya benar-benar harus menjalankannya di Apache, jadi mungkin apa yang Anda sarankan adalah cara yang tepat untuk melakukannya.
Passiday
4
benar. Dalam lingkungan dev, server bawaan bekerja dengan sangat baik dan Anda tidak perlu menemukan kembali roda untuk memuat ulang aplikasi. Saya sangat menyarankan Anda hanya menggunakan server bawaan untuk dev. tujuan. Bagaimanapun juga, dalam prod, Anda tidak ingin memuat ulang aplikasi secara otomatis pada setiap perubahan kode.
codegeek
44

Dalam lingkungan uji / pengembangan

The debugger werkzeug sudah memiliki fungsi 'auto reload' yang tersedia yang dapat diaktifkan dengan melakukan salah satu dari yang berikut:

app.run(debug=True)

atau

app.debug = True

Anda juga dapat menggunakan file konfigurasi terpisah untuk mengelola semua pengaturan Anda jika perlu. Misalnya saya menggunakan 'settings.py' dengan opsi 'DEBUG = True'. Mengimpor file ini juga mudah;

app.config.from_object('application.settings')

Namun ini tidak cocok untuk lingkungan produksi.

Lingkungan produksi

Secara pribadi saya memilih Nginx + uWSGI daripada Apache + mod_wsgi untuk beberapa alasan kinerja tetapi juga opsi konfigurasi. Opsi sentuh-reload memungkinkan Anda menentukan file / folder yang akan menyebabkan aplikasi uWSGI memuat ulang aplikasi labu Anda yang baru digunakan.

Misalnya, skrip pembaruan Anda menarik perubahan terbaru ke bawah dan menyentuh file 'reload_me.txt'. Skrip uWSGI Anda ini (yang disimpan oleh Supervisord - jelas) memiliki baris ini di suatu tempat:

touch-reload = '/opt/virtual_environments/application/reload_me.txt'

Saya harap ini membantu!

Ewan
sumber
1
Terima kasih atas tipnya. Saya sedikit menyederhanakannya. Buat skrip bash yang menyentuh sendiri saat dijalankan. Jadi, Anda hanya perlu meluncurkannya saat Anda ingin memuat ulang. Solusi saya: # touch_me_and_reload.sh sentuh $ 0
Jabba
@ Ewan. di mana seharusnya jalur reload sentuh berada? bagian [program: uwsig] atau bagian [supervisord]?
user805981
@ user805981- tidak, .inifile konfigurasi uwsgi terpisah . Jika Anda membaca dokumentasi tentang "touch-reload" itu ada di konfigurasi uWSGI, bukan supervisor,.
Ewan
Terima kasih untuk ini. app.run(debug=True)gagal, tetapi pengaturan variabel lingkungan berfungsi.
Ari
23

Jika Anda menggunakan uwsgi lihat opsi pengisian ulang python:

uwsgi --py-autoreload 1

Contoh uwsgi-dev-example.ini:

[uwsgi]
socket = 127.0.0.1:5000
master = true
virtualenv = /Users/xxxx/.virtualenvs/sites_env
chdir = /Users/xxx/site_root
module = site_module:register_debug_server()
callable = app
uid = myuser
chmod-socket = 660
log-date = true
workers = 1
py-autoreload = 1

site_root / __ init__.py

def register_debug_server():
    from werkzeug.debug import DebuggedApplication

    app = Flask(__name__)
    app.debug = True
    app = DebuggedApplication(app, evalex=True)
    return app

Lalu lari:

uwsgi --ini uwsgi-dev-example.ini

Catatan: Contoh ini juga memungkinkan debugger.

Saya menempuh rute ini untuk meniru produksi sedekat mungkin dengan pengaturan nginx saya. Cukup menjalankan aplikasi labu dengan itu dibangun di server web di belakang nginx itu akan menghasilkan kesalahan gateway yang buruk.

Kyle James Walker
sumber
16

Beberapa pembaruan untuk Flask 1.0 dan lebih tinggi

pendekatan dasar untuk memuat ulang panas adalah:

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
  • Anda harus menggunakan FLASK_ENV=development(bukan FLASK_DEBUG=1)
  • sebagai pemeriksaan keamanan, Anda dapat menjalankan flask run --debuggerhanya untuk memastikan itu dihidupkan
  • CLI Flask sekarang akan secara otomatis membaca hal-hal seperti FLASK_APPdan FLASK_ENVjika Anda memiliki .envfile di root proyek dan telah menginstal python-dotenv
Zach Valenta
sumber
export FLASK_ENV=developmentbekerja untukku. app.run(debug=True)tampaknya tidak berfungsi.
alex
3

Saya mendapat ide yang berbeda:

Pertama:

pip install python-dotenv

Pasang python-dotenvmodul, yang akan membaca preferensi lokal untuk lingkungan proyek Anda.

Kedua:

Tambahkan .flaskenvfile di direktori proyek Anda. Tambahkan kode berikut:

FLASK_ENV=development

Selesai!

Dengan konfigurasi ini untuk proyek Flask Anda, ketika Anda menjalankan flask rundan Anda akan melihat output ini di terminal Anda:

masukkan deskripsi gambar di sini

Dan ketika Anda mengedit file Anda, simpan saja perubahannya. Anda akan melihat auto-reload ada untuk Anda:

masukkan deskripsi gambar di sini

Dengan lebih banyak penjelasan:

Tentu saja Anda dapat menekan secara manual export FLASK_ENV=developmentsetiap kali Anda butuhkan. Tetapi menggunakan file konfigurasi yang berbeda untuk menangani lingkungan kerja yang sebenarnya sepertinya solusi yang lebih baik, jadi saya sangat merekomendasikan metode ini yang saya gunakan.

Anthonyeef
sumber
Sempurna! juga, jangan lupa untuk memasukkan FLASK_APPvariabel ke dalam .flaskenvfile.
Cequiel
2

Aplikasi flask secara opsional dapat dijalankan dalam mode debug. Dalam mode ini, dua modul server pengembangan yang sangat nyaman yang disebut reloader dan debugger diaktifkan secara default. Ketika reloader diaktifkan, Flask mengawasi semua file kode sumber proyek Anda dan secara otomatis me-restart server ketika ada file yang dimodifikasi.

Secara default, mode debug dinonaktifkan. Untuk mengaktifkannya, setel FLASK_DEBUG=1variabel lingkungan sebelum menggunakan labu run:

(venv) $ export FLASK_APP=hello.py for Windows use > set FLASK_APP=hello.py

(venv) $ export FLASK_DEBUG=1 for Windows use > set FLASK_DEBUG=1

(venv) $ flask run

* Serving Flask app "hello"
* Forcing debug mode on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 273-181-528

Menjalankan server dengan reloader diaktifkan sangat berguna selama pengembangan, karena setiap kali Anda memodifikasi dan menyimpan file sumber, server secara otomatis me-restart dan mengambil perubahan.

Asim Fakhi
sumber
1

Untuk mencapai ini di PyCharm setel bagian 'Variabel Lingkungan' ke:

PYTHONUNBUFFERED=1;
FLASK_DEBUG=1

Untuk Flask 'jalankan / konfigurasi debug'.

langit biru
sumber
Untuk pengguna PyCharm Pro, Anda dapat menyiapkan konfigurasi debug terpisah
Ty Hitzeman
0

$ env: Flask_ENV = "MyAPP.py"

$ env: Flask_ENV = "development"

lari termos

Itu harus bekerja

LiQiang
sumber