フラスコアプリを複数のpyファイルに分割する方法は?


146

私のフラスコアプリケーションは現在test.py、複数のルートとmain()ルートが定義された単一のファイルで構成されています。でtest2.py処理されなかったルートを含むファイルを作成する方法はありますtest.pyか?

@app.route('/somepath')
def somehandler():
    # Handler code here

にルートが多すぎるのではないかと心配です。test.py実行できるようにしたいので、同じファイルの一部であるかのようにpython test.pyルートを取得しtest.pyます。これを機能させるにはtest.py、どのような変更を加えたり、追加したりする必要がありtest2.pyますか?

回答:


152

通常のPythonパッケージ構造を使用して、アプリを複数のモジュールに分割できます。Flaskのドキュメントをご覧ください。

しかしながら、

Flaskは、アプリケーションコンポーネントを作成し、アプリケーション内またはアプリケーション間で共通のパターンをサポートするための青写真の概念を使用します。

アプリのサブコンポーネントを別のファイルのブループリントとして作成できます。

simple_page = Blueprint('simple_page', __name__, template_folder='templates')
@simple_page.route('/<page>')
def show(page):
    # stuff

そしてそれをメインパートで使用します:

from yourapplication.simple_page import simple_page

app = Flask(__name__)
app.register_blueprint(simple_page)

ブループリントは、テンプレートまたは静的ファイルなどの特定のリソースをバンドルすることもできます。詳細については、Flaskのドキュメントを参照してください。


1
どのようにして、そのブループリントのinitを他のファイルにブループリントルートに含めることができますか?
divyenduz 14

JWTを使用してセキュリティで保護されたエンドポイントを作成する場合、すべてのroute.pyファイルでそれを行う方法
Ashok Sri

18

あなたは別のファイル内のメインからフラスコアプリ変数をインポートするという簡単なトリックを使うことができます:

test-routes.py

from __main__ import app

@app.route('/test', methods=['GET'])
def test():
    return 'it works!'

そしてフラスコアプリを宣言したメインファイルに、次のようなテストルートをインポートします。

app.py

from flask import Flask, request, abort

app = Flask(__name__)

# import declared routes
import test-routes

それは私の側から動作します。


2
これは単なる例であり、__main__エントリファイルを参照します。
nimeresam

3
素晴らしい、ありがとう。上記のブループリントまたはパッケージアプローチは、小さなアプリには過剰です。
VH-NZZ

このメソッドが説明されているドキュメントへのリンクは次のとおりです。https
Christopher

1
@nimeresamそれは私にとってはうまくいきましたがimport test-routes、がapp.pyファイルの先頭にあることはできないことを学ぶ必要がありました。gunicornがクラッシュしましたが、インポートをファイルの最後に移動した後、機能しました。「モジュールがインポートされていることを確認し、ファイルの下部でそれを行っています」
Niklas R.


5

アプリをブループリントに分割することは素晴らしいアイデアです。ただし、これで十分ではなく、ブループリント自体を複数のpyファイルに分割する場合は、通常のPythonモジュールインポートシステムを使用して、他のファイルからインポートされるすべてのルートをループすることもできます。 。

これを行うためのコードでGistを作成しました。

https://gist.github.com/Jaza/61f879f577bc9d06029e

私の知る限り、これは現時点でブループリントを分割する唯一の実行可能な方法です。Flaskで「サブブループリント」を作成することはできませんが、これについては多くの議論で未解決の問題があります。

https://github.com/mitsuhiko/flask/issues/593

また、それが可能であったとしても(おそらく、その問題のスレッドからのスニペットのいくつかを使用して実行できる可能性があります)、サブブループリントはとにかくユースケースに対して制限が多すぎる可能性があります。たとえば、すべてのルートを同じURLサブプレフィックスを持つサブモジュール。


4

このタスクは、一元化されたURLマップを使用して、ブループリントやトリッキーなインポートなしで実行できます。

app.py

import views
from flask import Flask

app = Flask(__name__)

app.add_url_rule('/', view_func=views.index)
app.add_url_rule('/other', view_func=views.other)

if __name__ == '__main__':
    app.run(debug=True, use_reloader=True)

views.py

from flask import render_template

def index():
    return render_template('index.html')

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