Apabila menjalankan aplikasi Flask menggunakan kaedah app.run(), anda mungkin menghadapi situasi di mana pernyataan cetakan yang menunjukkan pelayan dimulakan semula muncul dua kali. Tingkah laku ini boleh dikaitkan dengan pemuat semula Werkzeug.
Werkzeug, perpustakaan asas yang menjanakan pelayan pembangunan Flask, menggunakan mekanisme proses kanak-kanak untuk memudahkan perubahan kod dan auto-mula semula. Apabila anda menjalankan app.run(), pemuat semula menghasilkan proses anak yang memantau kod anda secara konsisten.
Untuk menggambarkan ini, mari kita rungkai fungsi restart_with_reloader() dalam Werkzeug. Fungsi ini memanggil subprocess.call() untuk melaksanakan skrip anda sekali lagi, yang membawa kepada pemijahan proses anak. Akibatnya, anda melihat kenyataan cetakan dua kali.
Untuk menghapuskan pertindihan ini, pertimbangkan untuk melumpuhkan pemuat semula. Anda boleh mencapai ini dengan menetapkan use_reloader kepada False in app.run():
app.run(port=4004, debug=config.DEBUG, host='0.0.0.0', use_reloader=False)
Sebagai alternatif, anda boleh melumpuhkan pemuat semula apabila menggunakan arahan larian kelalang:
FLASK_DEBUG=1 flask run --no-reload
Pilihan lain adalah untuk menggunakan fungsi werkzeug.serving.is_running_from_reloader() untuk menentukan sama ada anda melaksanakan dalam proses anak pemuat semula.
Walau bagaimanapun, jika anda memerlukan modul global, pilih penghias @app.before_first_request. Penghias ini membolehkan anda menentukan fungsi yang akan digunakan sekali selepas setiap muat semula, apabila permintaan pertama diterima:
@app.before_first_request def before_first_request(): print(f"########### Restarted, first request @ {datetime.utcnow()} ############")
Perhatikan bahawa apabila berjalan dalam pelayan WSGI skala penuh menggunakan forking atau subproses untuk pengendalian permintaan , pengendali before_first_request mungkin digunakan untuk setiap subproses yang baru dibuat.
Atas ialah kandungan terperinci Mengapa Pelayan Pembangunan Flask Saya Mencetak Mesej Permulaan Dua Kali?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!