web-dev-qa-db-ja.com

Split Python Flaskアプリを複数のファイルに分割

flaskアプリを複数のファイルに分割する方法を理解できません。

私はWebサービスを作成していますが、APIを異なるファイル(AccountAPI.py、UploadAPI.py、...)に分割したいので、巨大なpythonファイル。

ブループリントでこれを行うことができると読んだことがありますが、そのルートが私にとって正しいルートであるかどうかは完全にはわかりません。

最終的に、1つのMain pythonファイルを実行し、他のファイルを含めて、実行時に1つの大きなファイルと見なされるようにします。

たとえば、Main.pyとAccountAPI.pyがある場合、これを実行できるようにします。

Main.py:

from flask import Flask
import AccountAPI

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __== "__main__":
    app.run()

AccountAPI.py:

@app.route("/account")
def accountList():
    return "list of accounts"

私はこの例では明らかに動作しないことを知っていますが、そのようなことをすることは可能ですか?

ありがとう

71
user1751547

はい、ブループリントはそれを行う正しい方法です。あなたがしようとしていることは、このように達成することができます:

Main.py

from flask import Flask
from AccountAPI import account_api

app = Flask(__name__)

app.register_blueprint(account_api)

@app.route("/")
def hello():
    return "Hello World!"

if __== "__main__":
    app.run()

AccountAPI.py

from flask import Blueprint

account_api = Blueprint('account_api', __name__)

@account_api.route("/account")
def accountList():
    return "list of accounts"

これがオプションの場合は、API /ブループリントごとに異なるURLプレフィックスを使用して、それらを明確に分離することを検討できます。これは、上記のregister_blueprint呼び出しを少し変更することで実行できます。

app.register_blueprint(account_api, url_prefix='/accounts')

詳細なドキュメントについては、 公式ドキュメント もご覧ください。

128
cyroxx

Blueprintを使用して、routesディレクトリにルートを追加できます。

構造

app.py
routes
    __init__.py
    index.py
    users.py

__init__.py

from flask import Blueprint
routes = Blueprint('routes', __name__)

from .index import *
from .users import *

index.py

from flask import render_template
from . import routes

@routes.route('/')
def index():
    return render_template('index.html')

users.py

from flask import render_template
from . import routes

@routes.route('/users')
def users():
    return render_template('users.html')

app.py

from routes import *
app.register_blueprint(routes)

新しいルートファイル、たとえばaccounts.pyを追加する場合は、accounts.pyおよびindex.pyと同様に、routesディレクトリにusers.pyファイルを作成し、routes.__init__.pyファイルにインポートするだけです。

from .accounts import *
29
Searene

ブループリントを使用していて、使用しているテンプレート内のブループリントのURLにルーティング/リダイレクトする場合は、正しいurl_forステートメントを使用する必要があります。

あなたの場合、ブループリントのURLアカウントを開きたい場合は、templateで次のように記述しなければなりません:

href="{{ url_for('account_api.account') }}"

メインappの場合、次のようになります。

redirect(url_for('account_api.account'))

そうしないと、werkzeugライブラリはエラーをスローします。

3
Thomas Krickl

これを行うもう1つの方法は、必要に応じて明示的にビュー関数をアタッチする lazy loading を使用することです。

1
Bhaskar