首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >烧瓶-管理:一个蓝图的名字碰撞发生了..。两人同名为"admin“

烧瓶-管理:一个蓝图的名字碰撞发生了..。两人同名为"admin“
EN

Stack Overflow用户
提问于 2019-01-31 09:07:11
回答 2查看 2.9K关注 0票数 3

我有一个容量为0.12.4的应用程序,并且正在使用烧瓶-管理

在本地开发时,我间歇性地遇到了这个错误,并且刚刚开始在我们的公共环境中看到它。

代码语言:javascript
复制
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. 再次刷新浏览器-然后您会看到上面的蓝图错误

导致错误的行是以下一行:

代码语言:javascript
复制
# admin.py
admin = flask_admin.Admin(
    app, index_view=MyIndexView(), template_mode="bootstrap3"
)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-31 09:07:11

看起来,这个行被多次调用(尽管它所在的文件只在一个地方导入)。我尝试在endpoint构造函数中传递一个自定义的Admin,并继续获得相同的错误,但使用新的端点名称,这表明情况就是这样。

这个答案指的是传递相同的问题,以及使用init_app而不是将app传递给构造函数的解决方案。

这样做,我的代码就像这样,错误消失了:

代码语言:javascript
复制
# admin.py
# Notice I'm not passing app here any more.
admin = flask_admin.Admin(index_view=MyIndexView(), template_mode="bootstrap3")
代码语言:javascript
复制
# app.py
admin.init_app(app) # This line is new

我不明白这个问题是怎么发生的,也不明白为什么要解决这个问题,所以还有更多的建议欢迎你!

票数 1
EN

Stack Overflow用户

发布于 2019-04-03 17:35:15

让我从这里那里得到一些帮助。烧瓶-管理1.5.3

代码语言:javascript
复制
# 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54456922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档