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"
私はこの例では明らかに動作しないことを知っていますが、そのようなことをすることは可能ですか?
ありがとう
はい、ブループリントはそれを行う正しい方法です。あなたがしようとしていることは、このように達成することができます:
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')
詳細なドキュメントについては、 公式ドキュメント もご覧ください。
Blueprint
を使用して、routes
ディレクトリにルートを追加できます。
app.py
routes
__init__.py
index.py
users.py
from flask import Blueprint
routes = Blueprint('routes', __name__)
from .index import *
from .users import *
from flask import render_template
from . import routes
@routes.route('/')
def index():
return render_template('index.html')
from flask import render_template
from . import routes
@routes.route('/users')
def users():
return render_template('users.html')
from routes import *
app.register_blueprint(routes)
新しいルートファイル、たとえばaccounts.py
を追加する場合は、accounts.py
およびindex.py
と同様に、routes
ディレクトリにusers.py
ファイルを作成し、routes.__init__.py
ファイルにインポートするだけです。
from .accounts import *
ブループリントを使用していて、使用しているテンプレート内のブループリントのURLにルーティング/リダイレクトする場合は、正しいurl_forステートメントを使用する必要があります。
あなたの場合、ブループリントのURLアカウントを開きたい場合は、templateで次のように記述しなければなりません:
href="{{ url_for('account_api.account') }}"
メインappの場合、次のようになります。
redirect(url_for('account_api.account'))
そうしないと、werkzeugライブラリはエラーをスローします。
これを行うもう1つの方法は、必要に応じて明示的にビュー関数をアタッチする lazy loading を使用することです。