Flask-Admin:发生蓝图的名称冲突...两者共享相同的名称 "admin"
Flask-Admin: A blueprint's name collision occurred ... Both share the same name "admin"
我有一个 Flask 0.12.4 应用程序并且正在使用 Flask-Admin。
我在本地开发时间歇性地遇到这个错误,并且刚刚开始在我们的一个 public 环境中看到它。
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.
在我的开发环境中重现的步骤有点奇怪:
- 破坏一些管理配置(例如,更改
form_columns
中与列名称相关的字符串之一,使其引用不存在的名称)
- 刷新浏览器查看常规"unknown field"错误
- 还原更改
- 再次刷新浏览器 - 然后您会看到上面的蓝图错误
导致错误的行是这一行:
# admin.py
admin = flask_admin.Admin(
app, index_view=MyIndexView(), template_mode="bootstrap3"
)
似乎有问题的行被调用了多次(尽管它所在的文件只在一个地方导入)。我尝试在 Admin
构造函数中传递自定义 endpoint
并继续出现相同的错误,但使用了新的端点名称,这表明情况就是如此。
This answer refers in passing to the same problem, and to the solution of using 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
我不明白问题是如何发生的,也不知道为什么会这样解决,所以欢迎任何进一步的指点!
给我一些来自 here 的想法。 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
我有一个 Flask 0.12.4 应用程序并且正在使用 Flask-Admin。
我在本地开发时间歇性地遇到这个错误,并且刚刚开始在我们的一个 public 环境中看到它。
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.
在我的开发环境中重现的步骤有点奇怪:
- 破坏一些管理配置(例如,更改
form_columns
中与列名称相关的字符串之一,使其引用不存在的名称) - 刷新浏览器查看常规"unknown field"错误
- 还原更改
- 再次刷新浏览器 - 然后您会看到上面的蓝图错误
导致错误的行是这一行:
# admin.py
admin = flask_admin.Admin(
app, index_view=MyIndexView(), template_mode="bootstrap3"
)
似乎有问题的行被调用了多次(尽管它所在的文件只在一个地方导入)。我尝试在 Admin
构造函数中传递自定义 endpoint
并继续出现相同的错误,但使用了新的端点名称,这表明情况就是如此。
This answer refers in passing to the same problem, and to the solution of using 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
我不明白问题是如何发生的,也不知道为什么会这样解决,所以欢迎任何进一步的指点!
给我一些来自 here 的想法。 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