7 votes

plan des plans (Flask)

J'utilise une série de plans et je veux pouvoir les regrouper dans un paquet que je peux utiliser de manière aussi transparente que possible avec un certain nombre d'autres applications. Un paquet de Blueprints qui fournit un moteur entier à une application. J'ai en quelque sorte créé ma propre solution, mais elle est manuelle et demande trop d'efforts pour être efficace. Cela ne ressemble pas à une extension, et il s'agit de plus d'un blueprint (plusieurs qui fournissent une fonctionnalité commune).

C'est fait ? Comment ?

(Les méthodes de répartition des applications permettant de regrouper plusieurs programmes peuvent fonctionner, mais ce n'est pas ce que je recherche).

5voto

Tomasz Hławiczka Points 281

Regarde ça : Plans d'emboîtementhttps://flask.palletsprojects.com/en/2.0.x/blueprints/#nesting-blueprints

parent = Blueprint('parent', __name__, url_prefix='/parent')
child = Blueprint('child', __name__, url_prefix='/child')
parent.register_blueprint(child)
app.register_blueprint(parent)

3voto

pip Points 454

J'aimerais que l'objet Blueprint dispose d'une fonction register_blueprint comme le fait l'objet Flask. Cela placerait automatiquement les blueprints enregistrés sous l'url du Blueprint courant.

2voto

Sean Vieira Points 47080

Le moyen le plus simple serait de créer une fonction qui prendrait une instance d'une fonction Flask et enregistre tous vos bleus dessus en une seule fois. Quelque chose comme ça :

# 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 HipPocket 's autoload fonction (divulgation complète : j'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, dans l'état actuel des choses, vous ne pourriez pas utiliser la même structure que dans l'exemple n°1 (HipPocket suppose que vous utilisez des packages pour chaque Blueprint). Au lieu de cela, votre mise en page ressemblerait à 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

0voto

Ignas Butėnas Points 2174

J'ai trouvé une solution pour moi-même pour charger les bleus définis dans la configuration, de sorte que vous pouvez avoir quelque chose comme CORE_APPS = ('core', 'admin', 'smth') dans la configuration et lorsque vous construisez l'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).

J'utilise donc une fonction pour créer une 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 cela, votre blueprint devrait être enregistré. Bien sûr, vous pouvez avoir un format différent dans les configurations 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 blueprint principal, donc dans la création de l'application, vous devrez enregistrer ce blueprint principal.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X