デバッグモードの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
ここでの問題は、他の回答で述べられているように、_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
_引数は、gunicorn
にFlask
という名前の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
_を実行することです。また、gunicorn
はapp
オブジェクトをインポートするだけでよいので、あいまいさを取り除き、Procfile
を次のように変更できます。
_# Procfile
web: gunicorn --log-level=DEBUG app:app
_
Flask Script には、組み込みのFlask Webサーバーをデバッグモードで実行する組み込みのコマンド_python manage.py runserver
_があります。
解決策は、コメントに記載されているようにforeman start
の使用を停止し、python run.py
を直接実行することでした。
このようにして、app.run
およびdebug=True
構成パラメーターを指定したuse_reloader=True
メソッドが有効になります。
サンプルアプリケーション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
すべてのオプションとフラグがそこに記載されています。楽しんで!