6

使用している一連のブループリントがあり、それらをさらにバンドルして、他の多くのアプリケーションで可能な限りシームレスに使用できるパッケージにしたいと考えています。エンジン全体をアプリケーションに提供するブループリントのバンドル。私は自分でソリューションを作成しましたが、それは手動であり、効果を上げるには多大な労力を必要とします。これは拡張機能のようには見えず、複数の青写真(共通の機能を提供するいくつか)です。

これは行われますか?どのように?

(複数のプログラムを結び付けるアプリケーションディスパッチ方法は、私が探しているものではないかもしれません)

4

4 に答える 4

3

Flask オブジェクトと同じように、Blueprint オブジェクトに register_blueprint 関数があればいいのにと思います。現在のブループリントの URL の下にブループリントを自動的に配置して登録します。

于 2014-06-14T02:40:44.870 に答える
2

Flask最も簡単な方法は、アプリケーションのインスタンスを受け取り、すべてのブループリントを一度に登録する関数を作成することです。このようなもの:

# sub_site/__init__.py
from .sub_page1 import bp as sb1bp
from .sub_page2 import bp as sb2bp
# ... etc. ...

def register_sub_site(app, url_prefix="/sub-site"):
    app.register_blueprint(sb1bp, url_prefix=url_prefix)
    app.register_blueprint(sb2bp, url_prefix=url_prefix)
    # ... etc. ...


# sub_site/sub_page1.py
from flask import Blueprint

bp = Blueprint("sub_page1", __name__)

@bp.route("/")
def sub_page1_index():
    pass

HipPocketまたは、のautoload関数(完全な開示: 私が書いた) のようなものを使用してHipPocket、インポート処理を簡素化することもできます。

# sub_site/__init__.py
from hip_pocket.tasks import autoload

def register_sub_site(app,
                          url_prefix="/sub-site",
                          base_import_name="sub_site"):
    autoload(app, base_import_name, blueprint_name="bp")

ただし、現状では、例 #1 と同じ構造を使用することはできません (HipPocket は、各ブループリントにパッケージを使用していると想定しています)。代わりに、レイアウトは次のようになります。

# sub_site/sub_page1/__init__.py
# This space intentionally left blank

# sub_site/sub_page1/routes.py
from flask import Blueprint

bp = Blueprint("sub_page1", __name__)

@bp.route("/")
def sub_page1_index():
    pass
于 2012-09-22T03:06:52.980 に答える
0

構成で定義されたブループリントをロードする方法を自分で解決できるので、構成のようなものCORE_APPS = ('core', 'admin', 'smth')を作成し、アプリを構築するときにそれらのアプリを登録できます(もちろん、CORE_APPSの文字列はインポートするファイルの名前である必要があります) Pythonパス内)。

だから私はアプリを作成するために関数を使用しています:

app = create_app()

def create_app():
  app = Flask(__name__)

  # I have class for my configs so configuring from object
  app.config.from_object('configsClass')

  # does a lot of different stuff but the main thing could help you:
  from werkzeug.utils import import_string
  for app in app.config['CORE_APPS']
    real_app = import_string(app)
    app.register_blueprint(real_app)

その後、ブループリントを登録する必要があります。もちろん、カスタムURLプレフィックスなどをサポートするために、構成にさまざまな形式を設定できます:)

もちろん、メインのブループリントでこのようなことを行うこともできるため、アプリケーションの作成では、その1つのメインのブループリントを登録する必要があります。

于 2012-09-22T06:59:45.807 に答える