コードの変更時にPython Flaskアプリを自動再読み込み


202

私はPythonでまともなWebアプリを開発する方法を調査しています。高次構造が邪魔になりたくないので、軽量のFlaskフレームワークを選択しました。これが正しい選択であったかどうかは時が経てばわかるでしょう。

それで、今私はmod_wsgiでApacheサーバーをセットアップしました、そして私のテストサイトはうまく動いています。ただし、pyまたはテンプレートファイルを変更すると、サイトが自動的に再読み込みされるようにして、開発ルーチンを高速化したいと考えています。サイトの.wsgiファイルに変更を加えるとリロードが発生します(Apache構成ファイルにWSGIScriptReloading Onがない場合でも)が、手動で生成する必要があります(つまり、改行を挿入して保存します)。アプリの一部のpyファイルを編集するときにリロードを発生させる方法はありますか?または、.wsgiファイルを更新するIDEを使用することが期待されていますか?

回答:


228

現在推奨されている方法は、flaskコマンドラインユーティリティを使用する方法です。

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

例:

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

または1つのコマンドで:

$ FLASK_APP=main.py FLASK_ENV=development flask run

デフォルト(5000)以外のポートが必要な場合は、--portオプションを追加します。

例:

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

より多くのオプションが利用可能です:

$ flask run --help

3
またはpython3.5のpyvenv flask runも機能pip install flaskvenv/bin/ます。
TonyTony 2017年

これは、開発目的でDockerに変換できるシンプルなソリューションです。これと同じソリューションをここで見ることができます

正常に動作しますが、NTFSパーティションのコードを使用するUbuntuでは動作しないようです。コードには問題ありませんが、フラスコはその設定の変更を認識していません。
citynorman

210

テスト/開発環境について話している場合は、デバッグオプションを使用してください。コードの変更が発生すると、フラスコアプリが自動的に再読み込みされます。

app.run(debug=True)

または、シェルから:

$ export FLASK_DEBUG=1
$ flask run

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


6
これは、組み込みの開発サーバーを介してサイトを実行する場合にのみ機能します。しかし、Apacheでwsgiを介して実行する場合はそうではありません。そして、私は本当にそれをApacheで実行する必要があるとは言いません。
Passiday

4
正しい。開発環境では、組み込みサーバーは非常にうまく機能し、アプリをリロードするためにホイールを再発明する必要はありません。開発用の組み込みサーバーを使用することを強くお勧めします。目的。とにかく、本番環境では、コードを変更するたびにアプリを自動的に再読み込みする必要はありません。
codegeek 2013年

44

テスト/開発環境

werkzeugデバッガーには、次のいずれかを実行することで有効にできる「自動リロード」機能がすでにあります。

app.run(debug=True)

または

app.debug = True

必要に応じて、個別の構成ファイルを使用してすべてのセットアップを管理することもできます。たとえば、「settings.py」と「DEBUG = True」オプションを使用します。このファイルのインポートも簡単です。

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

ただし、これは実稼働環境には適していません。

本番環境

個人的には、いくつかのパフォーマンス上の理由と構成オプションのために、Apache + mod_wsgiよりもNginx + uWSGIを選択しました。タッチリロードオプションでは、uWSGIのアプリケーションが新しく展開されたフラスコアプリをリロードするようになりますファイル/フォルダを指定することができます。

たとえば、更新スクリプトは最新の変更をプルダウンし、「reload_me.txt」ファイルを変更します。uWSGI iniスクリプト(Supervisordによって維持されている-明らかに)には、どこかに次の行があります。

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

これが役に立てば幸いです!


1
素晴らしいヒントをありがとう。少し簡略化しました。実行時に自分自身に触れるbashスクリプトを作成します。したがって、リロードが必要な場合にのみ起動する必要があります。私の解決策:#touch_me_and_reload.sh touch $ 0
Jabba

@Ewan。タッチリロードラインはどこにあるはずですか?[program:uwsig]セクションまたは[supervisord]セクション?
user805981 2015

@ user805981-どちらも、別個のuwsgi構成.iniファイル。「touch-reload」に関するドキュメントを読んだ場合、それはスーパーバイザーではなく、uWSGIの設定にあります。
Ewan

これをありがとう。app.run(debug=True)失敗しますが、環境変数の設定は機能します。
アリ

23

uwsgiを使用して実行している場合は、python auto reloadオプションを確認してください。

uwsgi --py-autoreload 1

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

次に実行します:

uwsgi --ini uwsgi-dev-example.ini

注:この例では、デバッガーも有効にします。

私は、nginxセットアップを使用して、できるだけプロダクションを模倣するためにこのルートを使用しました。nginxの背後にある組み込みのWebサーバーでフラスコアプリを実行するだけでは、不正なゲートウェイエラーが発生します。


16

Flask 1.0以降のいくつかの更新

ホットリロードの基本的なアプローチは次のとおりです。

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run

export FLASK_ENV=development私のために働いた。 app.run(debug=True)動作していないようです。
アレックス

3

私は別のアイデアを得ました:

最初:

pip install python-dotenv

python-dotenvプロジェクト環境のローカル設定を読み取るモジュールをインストールします。

第二:

.flaskenvプロジェクトディレクトリにファイルを追加します。次のコードを追加します。

FLASK_ENV=development

終わった!

Flaskプロジェクトのこの構成を使用するflask runと、実行するとターミナルに次の出力が表示されます。

ここに画像の説明を入力してください

ファイルを編集するときは、変更を保存するだけです。自動リロードが表示されます。

ここに画像の説明を入力してください

詳細な説明:

もちろん、export FLASK_ENV=development必要なときにいつでも手動でヒットできます。しかし、実際の作業環境を処理するために別の構成ファイルを使用することはより良い解決策のように思われるので、私はこの方法を使用することを強くお勧めします。


パーフェクト!また、FLASK_APP変数を.flaskenvファイルに含めることを忘れないでください。
Cequiel

2

Flaskアプリケーションは、オプションでデバッグモードで実行できます。このモードでは、リローダーデバッガーと呼ばれる開発サーバーの2つの非常に便利なモジュールがデフォルトで有効になっています。リローダーが有効になっている場合、Flaskはプロジェクトのすべてのソースコードファイルを監視し、ファイルが変更されると自動的にサーバーを再起動します。

デフォルトでは、デバッグモードは無効になっています。これを有効にするには、FLASK_DEBUG=1フラスコを呼び出す前に環境変数を設定します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

リローダーを有効にしてサーバーを実行すると、ソースファイルを変更して保存するたびにサーバーが自動的に再起動して変更を取得するため、開発中に非常に役立ちます。



0

$ env:Flask_ENV = "MyAPP.py"

$ env:Flask_ENV = "開発"

フラスコラン

うまくいくはず

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.