Flask-Admin: произошло столкновение имени проекта ... Оба имеют одно и то же имя "admin" - PullRequest
0 голосов
/ 31 января 2019

У меня есть приложение Flask 0.12.4, и я использую Flask-Admin .

Я периодически получаю эту ошибку при локальной разработке и только что начал видеть ее в одном из наших общедоступныхсреды тоже.

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.

Шаги для воспроизведения в моей среде разработки немного странные:

  1. Разорвать некоторые настройки администратора (например, изменить одну из строк, относящихся к столбцуимя в form_columns, поэтому оно ссылается на несуществующее имя)
  2. Обновите браузер, чтобы увидеть обычную ошибку «неизвестное поле»
  3. Восстановите изменение
  4. Обновитеснова в браузере - вы увидите сообщение об ошибке выше

Вот строка, которая вызывает ошибку:

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

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

мне помогут некоторые идеи из здесь .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

чек http://localhost:5000/admin/token-admin/

0 голосов
/ 31 января 2019

Казалось, что рассматриваемая строка вызывается несколько раз (хотя файл, в котором она находится, импортируется только в одном месте).Я попытался передать пользовательский endpoint в конструктор Admin и продолжал получать ту же ошибку, но с новым именем конечной точки, что указывало на это.

Этот ответ относитсяпереходя к той же проблеме и к решению использовать init_app вместо передачи app в конструктор.

После этого мой код выглядел следующим образом, иошибка исчезла:

# 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

Я не понимаю подробностей того, как возникла проблема, и почему именно это удалось решить, поэтому любые дальнейшие указания приветствуются!

...