web-dev-qa-db-ja.com

自動リロードFlaskソースコードが変更されたときのアプリ

デバッグモードのFlaskは、.pyソースコードファイルへの変更を検出し、新しいリクエストが届いたときにそれらをリロードすることを知っています。

私はいつもこれを私のアプリで見ていました。 views.pyファイルの@ app.route装飾セクションの小さなテキストを変更すると、更新時にブラウザーで変更を確認できました。

しかし、突然(何が変わったか思い出せない)、これはもう機能していないようです。

Q:どこが間違っているのですか?

Python 2.7を使用してVENVセットアップを使用してOSX10.9システムで実行しています。プロジェクトルートでforeman startを使用して起動します。

アプリの構造は次のとおりです。

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

ファイルは次のようになります。

# 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
11
HanSooloo

ここでの問題は、他の回答で述べられているように、_python run.py_から_foreman start_に移動したか、Procfileをからに変更したように見えることです。

_# Procfile
web: python run.py
_

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

_foreman start_を実行すると、Procfileで指定したコマンドが実行されるだけです。 (Herokuを使用していると思いますが、そうでない場合でも、サーバー/ Heroku dynoなどで実行されるものを模倣するのでこれは素晴らしいです。)

したがって、_gunicorn --log-level=DEBUG run:app_を(_foreman start_経由で)実行すると、gunicornに付属する組み込みのWebサーバーではなく、Flaskを使用してアプリケーションを実行することになります。 _run:app_引数は、gunicornFlaskという名前のappインスタンスを_run.py_で検索し、インポートして実行するように指示します。ここが楽しいところです。_run.py_がインポートされているので、___name__ == '__main__'_はFalseです(詳細は ここ を参照)。したがって、app.run(debug = True, port = 5000)が呼び出されることはありません。

app.run()が呼び出されたときに使用されるFlaskに組み込まれているWebサーバーには、かなり深刻なセキュリティの脆弱性があるため、これは(少なくとも公開されている設定では)必要なものです。 _--log-level=DEBUG_は、「DEBUG」という単語を使用しているため、少し誤解を招く可能性がありますが、印刷するログステートメントと無視するログステートメントをgunicornに指示するだけです( Python docs onロギング 。)

解決策は、アプリをローカルで実行して作業/デバッグするときに_python run.py_を実行し、本番環境を模倣する場合にのみ_foreman start_を実行することです。また、gunicornappオブジェクトをインポートするだけでよいので、あいまいさを取り除き、Procfileを次のように変更できます。

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

Flask Script には、組み込みのFlask Webサーバーをデバッグモードで実行する組み込みのコマンド_python manage.py runserver_があります。

10
erik

解決策は、コメントに記載されているようにforeman startの使用を停止し、python run.pyを直接実行することでした。

このようにして、app.runおよびdebug=True構成パラメーターを指定したuse_reloader=Trueメソッドが有効になります。

4
HanSooloo

サンプルアプリケーションappはアプリケーションであり、このアプリケーションはファイルstart.py

from flask import Flask
app = Flask(__name__)

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

ここで、フラグ-reloadを使用してシェルからアプリケーションを起動します。

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

そしてgunicornは、ファイルが自動的に変更された瞬間にアプリケーションをリロードします。何も変更する必要はありません。

このアプリケーションをバックグラウンドで実行したい場合は、フラグ-Dを追加します。

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

-Dデーモンモード

-w労働者数

-bアドレスとポート

start(start.py):app-アプリケーション

--gunicornsファイルモニタリングをリロードします

設定ファイルを見てください: http://docs.gunicorn.org/en/latest/settings.html

すべてのオプションとフラグがそこに記載されています。楽しんで!

2
SmileMZ