Tự động tải lại ứng dụng python Flask khi thay đổi mã


202

Tôi đang nghiên cứu cách phát triển một ứng dụng web tử tế với Python. Vì tôi không muốn một số cấu trúc bậc cao cản trở tôi, sự lựa chọn của tôi rơi vào khung Flask nhẹ . Thời gian sẽ cho biết nếu đây là sự lựa chọn đúng đắn.

Vì vậy, bây giờ tôi đã thiết lập một máy chủ Apache với mod_wsgi và trang web thử nghiệm của tôi đang chạy tốt. Tuy nhiên, tôi muốn tăng tốc quy trình phát triển bằng cách làm cho trang web tự động tải lại bất kỳ thay đổi nào trong tệp py hoặc tệp mẫu tôi thực hiện. Tôi thấy rằng bất kỳ thay đổi nào trong tệp .wsgi của trang web đều gây ra tải lại (ngay cả khi không có WSGIScriptReloading On trong tệp cấu hình apache), nhưng tôi vẫn phải xử lý thủ công (ví dụ: chèn thêm ngắt dòng, lưu). Có cách nào để tải lại khi tôi chỉnh sửa một số tệp py của ứng dụng không? Hoặc, tôi dự kiến ​​sẽ sử dụng IDE để làm mới tệp .wsgi cho tôi?

Câu trả lời:


228

Cách hiện tại được đề xuất là với flasktiện ích dòng lệnh.

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

Thí dụ:

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

hoặc trong một lệnh:

$ FLASK_APP=main.py FLASK_ENV=development flask run

Nếu bạn muốn cổng khác với tùy chọn 5000thêm ( ) mặc định --port.

Thí dụ:

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

Nhiều tùy chọn có sẵn với:

$ flask run --help

3
hoặc pyvenv trong python3.5, flask runcũng hoạt động, vì khi bạn pip install flask, một tệp thực thi bình cũng được cài đặt trong venv/bin/thư mục.
TonyTony

Đây là một giải pháp đơn giản có thể được dịch sang Docker cho mục đích phát triển. Người ta có thể thấy giải pháp tương tự ở đây .

Hoạt động tốt bình thường nhưng điều này dường như không hoạt động trên Ubuntu với mã trên phân vùng NTFS. Không phải là vấn đề với mã nhưng bình dường như không nhận ra những thay đổi trong thiết lập đó.
citynorman

210

Nếu bạn đang nói về môi trường test / dev, thì chỉ cần sử dụng tùy chọn gỡ lỗi. Nó sẽ tự động tải lại ứng dụng bình khi xảy ra thay đổi mã.

app.run(debug=True)

Hoặc, từ vỏ:

$ export FLASK_DEBUG=1
$ flask run

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


6
Điều này chỉ hoạt động khi bạn chạy trang web thông qua máy chủ phát triển tích hợp. Nhưng không phải khi chạy nó qua wsgi, trên Apache. Và tôi không khẳng định rằng tôi thực sự cần phải chạy nó trên Apache, vì vậy có lẽ những gì bạn đề xuất là cách đúng đắn để làm điều đó.
Thứ Sáu

4
chính xác. Trong môi trường dev, máy chủ tích hợp hoạt động rất tốt và bạn không cần phải phát minh lại bánh xe để tải lại ứng dụng. Tôi thực sự khuyên bạn chỉ nên sử dụng máy chủ tích hợp cho dev. mục đích. Trong prod anyway, bạn không muốn tự động tải lại ứng dụng mỗi khi thay đổi mã.
codegeek

44

Trong môi trường thử nghiệm / phát triển

Trình gỡ lỗi werkzeug đã có sẵn chức năng 'tự động tải lại' có thể được kích hoạt bằng cách thực hiện một trong các thao tác sau:

app.run(debug=True)

hoặc là

app.debug = True

Bạn cũng có thể sử dụng một tệp cấu hình riêng để quản lý tất cả các thiết lập của mình nếu bạn cần. Ví dụ: tôi sử dụng 'settings.py' với tùy chọn 'DEBUG = True'. Nhập tệp này cũng dễ dàng;

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

Tuy nhiên điều này không phù hợp với môi trường sản xuất.

Môi trường sản xuất

Cá nhân tôi đã chọn Nginx + uWSGI thay vì Apache + mod_wsgi vì một vài lý do hiệu suất mà còn cả các tùy chọn cấu hình. Các cảm ứng tải lại tùy chọn cho phép bạn chỉ định một tập tin / thư mục đó sẽ gây ra các ứng dụng uWSGI để tải lại ứng dụng bình mới triển khai của bạn.

Ví dụ: tập lệnh cập nhật của bạn kéo các thay đổi mới nhất của bạn xuống và chạm vào tệp 'reload_me.txt'. Tập lệnh ini uWSGI của bạn (được giám sát bởi Keepord - rõ ràng) có dòng này trong đó ở đâu đó:

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

Tôi hi vọng cái này giúp được!


1
Cám ơn về tiền bo nhiều. Tôi đơn giản hóa nó một chút. Tạo một tập lệnh bash chạm vào chính nó khi được thực thi. Do đó, bạn chỉ cần khởi chạy nó khi bạn muốn tải lại. Giải pháp của tôi: # touch_me_and_reload.sh chạm $ 0
Jabba

@Ewan. đường dây tải lại cảm ứng được cho là ở đâu? phần [chương trình: uwsig] hoặc phần [giám sát]?
dùng805981

@ user805981- cũng không, một .initệp cấu hình uwsgi riêng biệt . Nếu bạn đọc tài liệu về "tải lại cảm ứng" thì đó là trong uWSGI, không phải người giám sát, cấu hình.
Ewan

Cảm ơn vì điều đó. app.run(debug=True)thất bại, nhưng thiết lập các biến môi trường hoạt động.
Ari

23

Nếu bạn đang chạy bằng uwsgi, hãy xem tùy chọn tải lại tự động python:

uwsgi --py-autoreload 1

Ví dụ 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

Sau đó chạy:

uwsgi --ini uwsgi-dev-example.ini

Lưu ý: Ví dụ này cũng cho phép trình gỡ lỗi.

Tôi đã đi theo con đường này để bắt chước sản xuất càng gần càng tốt với thiết lập nginx của tôi. Chỉ cần chạy ứng dụng bình với máy chủ web tích hợp phía sau nginx, nó sẽ dẫn đến lỗi cổng xấu.


16

Một vài cập nhật cho Flask 1.0 trở lên

phương pháp cơ bản để tải lại nóng là:

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
  • bạn nên sử dụng FLASK_ENV=development(không FLASK_DEBUG=1)
  • để kiểm tra an toàn, bạn có thể chạy flask run --debuggerchỉ để đảm bảo nó được bật
  • Flask CLI bây giờ sẽ tự động đọc những thứ như FLASK_APPFLASK_ENVnếu bạn có một .envtệp trong thư mục gốcđã cài đặt python-dotenv

export FLASK_ENV=developmentđã làm cho tôi. app.run(debug=True)không xuất hiện để làm việc
alex

3

Tôi có một ý tưởng khác:

Đầu tiên:

pip install python-dotenv

Cài đặt python-dotenvmô-đun, sẽ đọc ưu tiên cục bộ cho môi trường dự án của bạn.

Thứ hai:

Thêm .flaskenvtập tin trong thư mục dự án của bạn. Thêm mã sau đây:

FLASK_ENV=development

Xong rôi!

Với cấu hình này cho dự án Flask của bạn, khi bạn chạy flask runvà bạn sẽ thấy đầu ra này trong thiết bị đầu cuối của mình:

nhập mô tả hình ảnh ở đây

Và khi bạn chỉnh sửa tệp của mình, chỉ cần lưu thay đổi. Bạn sẽ thấy tự động tải lại là có cho bạn:

nhập mô tả hình ảnh ở đây

Với nhiều lời giải thích hơn:

Tất nhiên bạn có thể tự đánh export FLASK_ENV=developmentmỗi khi bạn cần. Nhưng sử dụng tệp cấu hình khác nhau để xử lý môi trường làm việc thực tế có vẻ như là một giải pháp tốt hơn, vì vậy tôi khuyên bạn nên sử dụng phương pháp này.


Hoàn hảo! Ngoài ra, đừng quên bao gồm FLASK_APPbiến vào .flaskenvtệp.
Cequiel

2

Các ứng dụng bình có thể được thực thi trong chế độ gỡ lỗi. Trong chế độ này, hai mô-đun rất thuận tiện của máy chủ phát triển được gọi là trình tải lạitrình gỡ lỗi được bật theo mặc định. Khi trình tải lại được bật, Flask sẽ xem tất cả các tệp mã nguồn của dự án của bạn và tự động khởi động lại máy chủ khi bất kỳ tệp nào được sửa đổi.

Theo mặc định, chế độ gỡ lỗi bị tắt. Để kích hoạt nó, hãy đặt FLASK_DEBUG=1biến môi trường trước khi gọi bình 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

Có một máy chủ chạy với trình tải lại được kích hoạt là vô cùng hữu ích trong quá trình phát triển, bởi vì mỗi khi bạn sửa đổi và lưu tệp nguồn, máy chủ sẽ tự động khởi động lại và nhận thay đổi.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.