102

フラスコ アプリを複数のファイルに分割する方法がわかりません。

私は Web サービスを作成していて、API を別のファイル (AccountAPI.py、UploadAPI.py、...) に分割したいので、1 つの巨大な 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 __name__ == "__main__":
    app.run()

AccountAPI.py:

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

この例では明らかにうまくいかないことはわかっていますが、そのようなことは可能ですか?

ありがとう

4

4 に答える 4

173

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

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 __name__ == "__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')

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

于 2013-03-05T18:43:06.627 に答える
49

を使用すると、ルートをディレクトリ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.pyroutesindex.pyusers.pyroutes.__init__.py

from .accounts import *
于 2016-04-17T15:57:25.527 に答える
3

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

あなたの場合、青写真の URL アカウントを開きたい場合は、テンプレートで次のように記述する必要があります。

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

メインアプリの場合は次のようになります。

redirect(url_for('account_api.account'))

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

于 2014-03-16T01:24:54.927 に答える
1

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

于 2013-09-17T23:54:32.337 に答える