2014-05-01 15 views
8

Tôi biết thực tế là Flask, ở chế độ gỡ lỗi, sẽ phát hiện các thay đổi đối với các tệp mã nguồn .py và sẽ tải lại chúng khi có yêu cầu mới.Tự động tải lại ứng dụng Flask khi mã nguồn thay đổi

Tôi đã từng thấy điều này trong ứng dụng của tôi mọi lúc. Thay đổi một chút văn bản trong phần @ app.route trang trí trong tệp views.py của tôi và tôi có thể thấy các thay đổi trong trình duyệt khi làm mới.

Nhưng đột nhiên (không thể nhớ những gì đã thay đổi), điều này dường như không hoạt động nữa.

Q: Tôi đang đi sai ở đâu?

Tôi đang chạy trên hệ thống OSX 10.9 với thiết lập VENV bằng Python 2.7. Tôi sử dụng foreman start trong thư mục gốc của dự án để bắt đầu.

App cấu trúc là như thế này:

[Project Root] 
+-[app] 
| +-__init__.py 
| +- views.py 
| +- ...some other files... 
+-[venv] 
+- config.py 
+- Procfile 
+- run.py 

Các tập tin giống như thế này:

# Procfile 
web: gunicorn --log-level=DEBUG run:app 
# config.py 
contains some app specific configuration information. 
# run.py 
from app import app 

if __name__ == "__main__": 
    app.run(debug = True, port = 5000) 
# __init__.py 
from flask import Flask 
from flask.ext.login import LoginManager 
from flask.ext.sqlalchemy import SQLAlchemy 
from flask.ext.mail import Mail 
import os 

app = Flask(__name__) 
app.config.from_object('config') 

db = SQLAlchemy(app) 

#mail sending 
mail = Mail(app) 

lm = LoginManager() 
lm.init_app(app) 
lm.session_protection = "strong" 

from app import views, models 
# app/views.py 
@app.route('/start-scep') 
def start_scep(): 
    startMessage = '''\ 
<html> 
<header> 
<style> 
body { margin:40px 40px;font-family:Helvetica;} 
h1 { font-size:40px; } 
p { font-size:30px; } 
a { text-decoration:none; } 
</style> 
</header> 

<p>Some text</p> 
</body> 
</html>\ 
''' 
    response = make_response(startMessage) 
    response.headers['Content-Type'] = "text/html" 
    print response.headers 
    return response 
+0

Tôi đoán là bạn bắt đầu sử dụng 'foreman run' thay vì' python run.py' - Flask không nằm trong tầm kiểm soát khi bạn chạy nó dưới gunicorn và vì vậy nó không thể tự động tải lại. –

+0

@SeanVieira Tôi sử dụng 'foreman start' từ dòng lệnh. Tôi có nên làm 'foreman run python run.py'? – HanSooloo

+0

Có, đó là những gì bạn sẽ muốn làm (rất có thể) - nếu điều đó không hoạt động, hãy sử dụng 'python run.py' để thay thế. –

Trả lời

8

Vấn đề ở đây, như đã nêu trong câu trả lời khác, là có vẻ như bạn chuyển từ python run.py để foreman start, hoặc bạn đã thay đổi Procfile của bạn từ

# Procfile 
web: python run.py 

để

# Procfile 
web: gunicorn --log-level=DEBUG run:app 

Khi bạn chạy foreman start, nó chỉ cần chạy các lệnh mà bạn đã chỉ định trong Procfile. (Tôi sẽ đoán bạn đang làm việc với Heroku, nhưng ngay cả khi không, điều này là tốt đẹp bởi vì nó sẽ bắt chước những gì sẽ chạy trên máy chủ của bạn/Heroku dyno/bất cứ điều gì.)

Bây giờ, khi bạn chạy gunicorn --log-level=DEBUG run:app (thông qua foreman start) bạn hiện đang chạy ứng dụng của mình với gunicorn thay vì máy chủ web tích hợp đi kèm với Flask. Đối số run:app yêu cầu gunicorn để xem trong run.py đối với trường hợp Flask có tên app, nhập và chạy nó. Đây là nơi mà nó có được niềm vui: kể từ khi run.py đang được nhập, __name__ == '__main__'False (xem thêm về điều đó here), và do đó app.run(debug = True, port = 5000) không bao giờ được gọi.

Đây là những gì bạn muốn (ít nhất là trong cài đặt có sẵn công khai) vì máy chủ web được tích hợp vào Flask được sử dụng khi app.run() được gọi là một số lỗ hổng bảo mật khá nghiêm trọng.Các --log-level=DEBUG cũng có thể được một chút lừa dối vì nó sử dụng từ "DEBUG" nhưng nó chỉ nói gunicorn mà báo cáo khai thác gỗ để in và để bỏ qua (xem phần Python docs on logging.)

Giải pháp là để chạy python run.py khi chạy ứng dụng cục bộ và làm việc/gỡ lỗi trên đó và chỉ chạy foreman start khi bạn muốn bắt chước môi trường sản xuất. Ngoài ra, vì gunicorn chỉ cần nhập khẩu các đối tượng app, bạn có thể loại bỏ một số mơ hồ và thay đổi của bạn Procfile để

# Procfile 
web: gunicorn --log-level=DEBUG app:app 

Bạn cũng có thể nhìn vào Flask Script đã tích hợp sẵn trong lệnh python manage.py runserver chạy việc xây dựng trong Flask webserver trong chế độ kiểm tra sửa lỗi.

3

Giải pháp là ngừng sử dụng foreman start như đã nêu trong các ý kiến ​​và trực tiếp thực hiện python run.py.

Bằng cách này, phương pháp app.run có các thông số cấu hình debug=Trueuse_reloader=True có hiệu lực.

2

Sample Application nơi ứng dụng là ứng dụng của chúng tôi và ứng dụng này đã được lưu trong file start.py:

from flask import Flask 
app = Flask(__name__) 

@app.route('/') 
def hallo(): 
    return 'Hello World, this is really cool... that rocks... LOL' 

bây giờ chúng tôi khởi động ứng dụng từ vỏ với cờ --reload

gunicorn -w 1 -b 127.0.0.1:3032 start:app --reload 

và gunicorn tải lại ứng dụng tại thời điểm tệp đã thay đổi tự động. Không cần phải thay đổi gì cả.

nếu bạn rất muốn chạy ứng dụng này ở chế độ nền thêm cờ -D

gunicorn -D -w 1 -b 127.0.0.1:3032 start:app --reload 

-D Demon mode

số -w công nhân

- địa chỉ b và cổng

bắt đầu (start.py): ứng dụng - ứng dụng

--reload gunicorns nộp theo dõi

Nhìn vào tập tin cài đặt: http://docs.gunicorn.org/en/latest/settings.html

tất cả các tùy chọn và cờ được đề cập ở đây. Chúc vui vẻ!

Các vấn đề liên quan