3 votes

Flask-Admin : Une collision de nom de blueprint s'est produite ... Les deux partagent le même nom "admin".

J'ai une application Flask 0.12.4 et j'utilise Flask-Admin .

J'obtiens cette erreur par intermittence lorsque je développe localement, et je viens de commencer à la voir dans l'un de nos environnements publics également.

AssertionError: A blueprint's name collision occurred between 
<flask.blueprints.Blueprint object at 0x7f5cd31f96d0> and 
<flask.blueprints.Blueprint object at 0x7f5cd33b0d90>.
Both share the same name "admin".
Blueprints that are created on the fly need unique names.

Les étapes à reproduire dans mon environnement de développement sont légèrement étranges :

  1. Modifier une partie de la configuration de l'administration (par exemple, changer l'une des chaînes relatives au nom d'une colonne dans le fichier form_columns donc il fait référence à un nom inexistant)
  2. Rafraîchissez le navigateur pour voir l'erreur régulière "champ inconnu".
  3. Annulez la modification
  4. Rafraîchissez à nouveau le navigateur - vous verrez alors l'erreur de schéma directeur ci-dessus.

La ligne qui provoque l'erreur est celle-ci :

# admin.py
admin = flask_admin.Admin(
    app, index_view=MyIndexView(), template_mode="bootstrap3"
)

1voto

Sam Points 462

Il semble que la ligne en question soit appelée plusieurs fois (bien que le fichier dans lequel elle se trouve ne soit importé qu'à un seul endroit). J'ai essayé de passer un endpoint dans le Admin et j'ai continué à obtenir la même erreur mais avec le nouveau nom du point de terminaison, ce qui suggère que c'était le cas.

Cette réponse se réfère en passant au même problème, et à la solution consistant à utiliser init_app plutôt que de transmettre le app au constructeur.

En faisant cela, mon code ressemblait alors à ceci, et l'erreur a disparu :

# admin.py
# Notice I'm not passing app here any more.
admin = flask_admin.Admin(index_view=MyIndexView(), template_mode="bootstrap3")

# app.py
admin.init_app(app) # This line is new

Je ne comprends pas le détail de la façon dont le problème s'est produit ni pourquoi cette solution l'a résolu, donc tout autre point de vue est le bienvenu !

0voto

madjardi Points 475

Pour m'aider à trouver une idée de aquí . Flask-admin 1.5.3

# token.__init__.py  <-- token - my app
# endpoint - very important
from app.model import blueprint, Token
from db import db

blueprint = Blueprint("token", __name__, url_prefix='/token')

blueprint.custom_model_views = []
blueprint.custom_model_views += [ModelView(Token, db.session, endpoint='token-admin')]

# admin.__init__.py
def create_module(admin, app, **kwargs):
    admin.init_app(app)

    with app.app_context() as e:
        from app import token
        views = token.blueprint.custom_model_views
        for v in views:
            admin.add_view(v)

# root.__init__.py
flask_admin = Admin()

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])

    from .token import create_module as token_create_module
    from .admin import create_module as admin_create_module

    token_create_module(app)
    admin_create_module(flask_admin, app)

    return app

vérifier http://localhost:5000/admin/token-admin/

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