PythonFlaskアプリを複数のファイルに分割


88

フラスコアプリを複数のファイルに分割する方法を理解するのに問題があります。

Webサービスを作成していて、APIをさまざまなファイル(AccountAPI.py、UploadAPI.pyなど)に分割したいので、巨大なPythonファイルが1つもありません。

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

最終的には、1つのメイン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"

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

ありがとう

回答:


158

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

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 /ブループリントを明確に分離するために、API /ブループリントごとに異なるURLプレフィックスを使用することを検討してください。これは、上記のregister_blueprint呼び出しを少し変更することで実行できます。

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

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


これは私にとって完璧に機能しました。ブループリントのドキュメントをもっと注意深く読むべきだったと思います。
user1751547 2013年

ねえ、質問があります。上記のコードでは、accountList()のURLは「ドメイン/アカウント/アカウント」と一致していますか?
jeyraof 2013年

4
Main.pyとAccountAPI.pyは、どちらかのファイルにある共有グローバル変数を持つことができますか?
matchifang 2017

accountList同じファイルのクラス内に配置するための簡単な解決策はありますか?
GA1 2017

チャームのように機能し、個別の.pyファイルでJWTを使用して保護されたエンドポイントを追加する方法
AshokSri19年

41

を使用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.pyroutes同じように、ディレクトリindex.pyusers.py、その後にそれをインポートするroutes.__init__.pyファイル

from .accounts import *

1
インポートエラーが発生します
Abhishek Jebaraj 2017年

ファイルの途中でインポートすることは悪い習慣と見なすことができますか?
TomSawyer 2017

3

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

あなたの場合、ブループリントのURLアカウントを開きたい場合は、テンプレートに次のように記載する必要があります。

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

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

redirect(url_for('account_api.account'))

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


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