2012-09-21 5 views
3

J'ai une série de plans que j'utilise, et je veux pouvoir les regrouper dans un ensemble que je peux utiliser aussi facilement que possible avec un certain nombre d'autres applications. Un ensemble de plans qui fournit un moteur entier à une application. J'ai en quelque sorte créé ma propre solution, mais elle est manuelle et nécessite trop d'efforts pour être efficace. Cela ne semble pas être une extension, et il y a plus d'un plan (plusieurs qui fournissent une fonctionnalité commune).blueprint de plans (Flask)

Est-ce fait? Comment?

(méthodes de répartition d'application de lier ensemble plusieurs programmes pourraient travailler est pas ce que je cherche)

+0

http://stackoverflow.com/a/36326234/742173 –

Répondre

1

La façon la plus simple serait de créer une fonction qui prend une instance d'une application Flask et enregistre tous vos plans sur elle en une seule fois. Quelque chose comme ceci:

# 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 

Alternativement, vous pouvez utiliser quelque chose comme autoload function de HipPocket (divulgation complète: je l'ai écrit HipPocket) pour simplifier la gestion des importations:

# 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") 

Cependant, comme il est actuellement vous Impossible d'utiliser la même structure que l'exemple n ° 1 (HipPocket suppose que vous utilisez des packages pour chaque Blueprint). Au lieu de cela, votre mise en page devrait ressembler à ceci:

# 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 
0

je solution pour moi-même comment charger des plans définis dans la configuration, donc vous pouvez avoir quelque chose comme CORE_APPS = ('core', 'admin', 'smth') dans la configuration et quand vous construisez application, vous pouvez enregistrer ces applications (bien sûr, ces chaînes dans CORE_APPS doivent être les noms des fichiers que vous voulez importer dans votre chemin python).

Je suis en utilisant la fonction pour créer l'application:

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) 

Après que votre plan devrait être enregistré. Bien sûr, vous pouvez avoir un format différent dans les configs pour supporter les préfixes d'url personnalisés et ainsi de suite :)

Bien sûr, vous pouvez aussi faire quelque chose comme ça dans votre projet principal, donc dans la création de l'application, vous devrez vous enregistrer ce plan principal.

0

Je souhaite que l'objet Blueprint possède une fonction register_blueprint comme le fait l'objet Flask. Il placerait et enregistrerait automatiquement les plans sous l'URL actuelle de Blueprints.