将 flask-admin 添加到项目时出现错误的仪表板
Wrong dashboard while adding flask-admin to project
我正在尝试扩展 flask-base 项目 https://github.com/hack4impact/flask-base/tree/master/app。这使用 app/init.py 和 blueprints.
中的应用程序工厂模式
在 app/init.py 我有:
import os
from flask import Flask
from flask_mail import Mail
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from flask_assets import Environment
from flask_wtf import CsrfProtect
from flask_compress import Compress
from flask_rq import RQ
from flask_admin import Admin, BaseView, expose
from flask_admin.contrib.sqla import ModelView
# from app.models import User
from config import config
from .assets import app_css, app_js, vendor_css, vendor_js
basedir = os.path.abspath(os.path.dirname(__file__))
mail = Mail()
db = SQLAlchemy()
csrf = CsrfProtect()
compress = Compress()
# Set up Flask-Login
login_manager = LoginManager()
login_manager.session_protection = 'strong'
login_manager.login_view = 'account.login'
from app.models import User
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# not using sqlalchemy event system, hence disabling it
with app.app_context():
m =app.url_map
config[config_name].init_app(app)
# Set up extensions
mail.init_app(app)
db.init_app(app)
login_manager.init_app(app)
csrf.init_app(app)
compress.init_app(app)
RQ(app)
# adm = Admin(app, name='MyAPP')
adm = Admin(endpoint='adminz', name='adz', url='/adminz')
......
# Create app blueprints
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
from .account import account as account_blueprint
app.register_blueprint(account_blueprint, url_prefix='/account')
from .admin import admin as admin_blueprint
# from .admin import admin_blueprint
app.register_blueprint(admin_blueprint, url_prefix='/admin')
return app
templates/admin/db.html:
<p>Hello world</p>
我在管理视图 (https://github.com/hack4impact/flask-base/blob/master/app/admin/views.py) 中添加了 :
from flask_admin import Admin, BaseView, expose
from flask_admin.contrib.sqla import ModelView
from app import adm as adm, db
class MyView(ModelView):
@expose('/')
def db(self):
return self.render('admin/db.html')
# admin management setup
@main.route('/db')
def db():
adm.add_view(MyView(User, db.session))
我打开时看到的是管理仪表板,而不是 flask-admin 基本视图:
127.0.0.1:5000/db
我做错了什么?
编辑:
按照您的指示,我更改了 create_app 开头:
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# not using sqlalchemy event system, hence disabling it
# adm = Admin(name='admin2', endpoint='/db', url='/db', template_mode='bootstrap3',base_template='admin/db.html')
config[config_name].init_app(app)
# Set up extensions
mail.init_app(app)
db.init_app(app)
login_manager.init_app(app)
csrf.init_app(app)
compress.init_app(app)
RQ(app)
adm = Admin(app, name='MyAPP')
# adm = Admin(endpoint='adminz', name='adz', url='/adminz')
adm.add_view(MyView(User, db.session, endpoint='db'))
这导致:
文件“....flask\app.py”,第 946 行,在 register_blueprint
(蓝图,self.blueprints[blueprint.name],blueprint.name)
AssertionError:蓝图的名称冲突发生在 和 之间。两者同名 "admin"。即时创建的蓝图需要唯一的名称。
编辑2:
到 create_app 的末尾我添加了:
# Create app blueprints
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
from .account import account as account_blueprint
app.register_blueprint(account_blueprint, url_prefix='/account')
from .admin import admin as admin_blueprint
# from .admin import admin_blueprint
app.register_blueprint(admin_blueprint, url_prefix='/admin')
# app.register_blueprint(admin_blueprint, url_prefix='/ab')
with app.app_context():
m =app.url_map
return app
我不确定你想看什么,但 m.rules 给出:
<Rule '/account/manage/change-password' (HEAD, GET, OPTIONS, POST) -> account.change_password>,
<Rule '/account/manage/change-email' (HEAD, GET, OPTIONS, POST) -> account.change_email_request>,
<Rule '/account/manage/info' (HEAD, GET, OPTIONS, POST) -> account.manage>,
<Rule '/account/confirm-account' (HEAD, GET, OPTIONS) -> account.confirm_request>,
<Rule '/account/reset-password' (HEAD, GET, OPTIONS, POST) -> account.reset_password_request>,
<Rule '/account/unconfirmed' (HEAD, GET, OPTIONS) -> account.unconfirmed>,
<Rule '/account/register' (HEAD, GET, OPTIONS, POST) -> account.register>,
<Rule '/account/logout' (HEAD, GET, OPTIONS) -> account.logout>,
<Rule '/account/manage' (HEAD, GET, OPTIONS, POST) -> account.manage>,
<Rule '/account/login' (HEAD, GET, OPTIONS, POST) -> account.login>,
<Rule '/admin/_update_editor_contents' (OPTIONS, POST) -> admin.update_editor_contents>,
<Rule '/admin/invite-user' (HEAD, GET, OPTIONS, POST) -> admin.invite_user>,
<Rule '/admin/new-user' (HEAD, GET, OPTIONS, POST) -> admin.new_user>,
<Rule '/admin/users' (HEAD, GET, OPTIONS) -> admin.registered_users>,
<Rule '/get_session_job_value' (HEAD, GET, OPTIONS) -> main.get_session_job_value>,
<Rule '/cl_confirm_chrome' (HEAD, GET, OPTIONS, POST) -> main.cl_confirm_chrome>,
<Rule '/render_png' (HEAD, GET, OPTIONS) -> main.render_png>,
<Rule '/selected' (HEAD, GET, OPTIONS) -> main.selected>,
<Rule '/cl_dash' (HEAD, GET, OPTIONS, POST) -> main.cl_dash>,
<Rule '/about' (HEAD, GET, OPTIONS) -> main.about>,
<Rule '/admin/' (HEAD, GET, OPTIONS) -> admin.index>,
<Rule '/dash' (HEAD, GET, OPTIONS) -> main.dash>,
<Rule '/jobs' (HEAD, GET, OPTIONS) -> main.get_jobs>,
<Rule '/' (HEAD, GET, OPTIONS) -> main.index>,
<Rule '/account/manage/change-email/<token>' (HEAD, GET, OPTIONS, POST) -> account.change_email>,
<Rule '/admin/user/<user_id>/change-account-type' (HEAD, GET, OPTIONS, POST) -> admin.change_account_type>,
<Rule '/admin/user/<user_id>/change-email' (HEAD, GET, OPTIONS, POST) -> admin.change_user_email>,
<Rule '/admin/user/<user_id>/_delete' (HEAD, GET, OPTIONS) -> admin.delete_user>,
<Rule '/admin/user/<user_id>/delete' (HEAD, GET, OPTIONS) -> admin.delete_user_request>,
<Rule '/admin/user/<user_id>/info' (HEAD, GET, OPTIONS) -> admin.user_info>,
<Rule '/account/join-from-invite/<user_id>/<token>' (HEAD, GET, OPTIONS, POST) -> account.join_from_invite>,
<Rule '/account/confirm-account/<token>' (HEAD, GET, OPTIONS) -> account.confirm>,
<Rule '/account/reset-password/<token>' (HEAD, GET, OPTIONS, POST) -> account.reset_password>,
<Rule '/admin/static/<filename>' (HEAD, GET, OPTIONS) -> admin.static>,
<Rule '/admin/user/<user_id>' (HEAD, GET, OPTIONS) -> admin.user_info>,
<Rule '/results/<job_key>' (HEAD, GET, OPTIONS) -> main.get_results>,
<Rule '/static/<filename>' (HEAD, GET, OPTIONS) -> static>
编辑 3:
我不得不说这是一个令人难以置信的答案!你真的教会了我很多。我已经按照您的指示用上述规则替换了网址。我 10 天前的最初计划只是使用基本的 flask-admin CRUD 功能。我对 db.html 模板不感兴趣(这只是我尝试过的)。
无论如何都在尝试更改管理蓝图的名称(您的编号 1)。在将 app/admin/init.py 更改为 :
之前,我曾尝试过此操作
from flask import Blueprint
admin = Blueprint('admin_blueprint', __name__)
from . import views # noqa
现在打开
http://127.0.0.1:5000/adminz/
我收到 404 错误
最终编辑:
问题已解决 https://chat.whosebug.com/users/5819113/diego-quintana who explained that there was a conflict between flask-admin which creates a blueprint and the flask-base admin blueprint. By changing both the name of the blueprint and the static file folder of the flask-base project. Flask-admin could work without being overridden. Please see https://github.com/kc1/flask-base
使用url
代替endpoint
adm = Admin(name='test',url='/db')
您应该初始化 Admin
并在 create_app
中注册 views
和 blueprints
。检查这是否适合您。
# app factory
def create_app(config_name):
# configure current app
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
# wrap app with extensions
...
# admin.init_app(app) does not work and flask-admin
# should be instantiated inside create_app()
# see https://github.com/flask-admin/flask-admin/issues/910#issuecomment-115003492
# for details
admin = Admin(app, name='MyAPP')
...
# import models
from .models.user import User
# more imports happening here
# import flask-admin views to be used in the admin panel
from .admin.views import MyView
# register admin view forms
admin.add_view(MyView(name='MyCustomView', endpoint='db'))
# register blueprints
# ...
# implementation of the app factory pattern
return app
编辑:
我认为正在发生的是
- repo 中的应用程序已经有一个名为
admin
的蓝图位于 /admin
- 您想在应用中实现
flask-admin
,但与现有蓝图冲突
你可以通过两件事来实现:
- 将存储库中的当前
blueprint
名称更改为与 admin
不同的名称,因为 flask-admin
与其冲突。 (从你的 github 问题来看,admin.static
似乎有很多硬编码的内部结构,这使得更改当前的 admin
蓝图 更容易 。
蓝图的结构有点像这样
# app/myblueprint/__init__.py
from flask import Blueprint
# a random blueprint
myblueprint = Blueprint(name='mycustomblueprint',
import_name=__name__, # name of the file
static_folder='static', # a folder inside app/myblueprint/static
template_folder='templates', # a folder inside app/myblueprint/templates
static_url_path='/static', # this is what mycustomblueprint.static will point to, and if the name is admin it will be admin.static, thus colliding with flask-admin
url_prefix='/myblueprintprefix', # this will be appended to each view inside your blueprint, i.e. a view '/foo' will get converted into '/myblueprintprefix/foo' in your url mappings
subdomain=None,
url_defaults=None,
root_path=None)
from . import views # import the views inside app/myblueprint/views.py
然后,你将它导入 create_app
as
from .myblueprint import myblueprint as my_blueprint
app.register_blueprint(my_blueprint) # notice I've defined url_prefix in the Blueprint definition. You can do it at registration time, it's up to you
tl;dr:更改 admin
蓝图,因为它与 flask-admin
冲突
flask-admin
基于视图工作,生成管理视图的模式是通过 导入 它们并传递附加到/admin
端点(flask-admin
所在的位置)。
在这种情况下,您可以想到两种口味(更多但为了示例没关系)
ModelView
,您可以使用它来创建自定义 CRUD 视图,并接受一个 model
和一个 db.session
对象。
BaseView
用于在 flask-admin
使用的 admin
蓝图中扩展通用视图。
这意味着,如果您想在 flask-admin
视图中呈现您自己的 db.html
文件,您必须执行以下操作:
# app/modelviews/mycustomviews.py
from flask_admin import BaseView, expose
class DBView(BaseView): # notice I'm using BaseView and not ModelView
@expose('/')
def index(self):
return self.render('modelviews/db.html') # this file should live in app/templates/modelviews/db.html
和内部 create_app
# register admin view forms
from .modelviews import DBView
admin.add_view(DBView(name='MyCustomView', endpoint='db')) # this will show up in your `flask-admin` main view as MyCustomView, and it will live in {host}/admin/db
您还可以在您拥有的上下文中检查 Flask 应用程序的 url_map
参数。您的 create_app
中不需要此位
with app.app_context():
m =app.url_map
我提到它是因为它可以帮助您调试 python repl
中的视图。导入您的应用程序,并按照我提供的要点进行操作。 url_map
应该 return 类似于 <Rules>
的列表
[<Rule '/admin/' (OPTIONS, HEAD, GET) -> admin.index>,
<Rule '/admin/db' (OPTIONS, HEAD, GET) -> dbview.index>]
这样您就可以确认您的视图位于应有的位置。希望这有帮助。
我正在尝试扩展 flask-base 项目 https://github.com/hack4impact/flask-base/tree/master/app。这使用 app/init.py 和 blueprints.
中的应用程序工厂模式在 app/init.py 我有:
import os
from flask import Flask
from flask_mail import Mail
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from flask_assets import Environment
from flask_wtf import CsrfProtect
from flask_compress import Compress
from flask_rq import RQ
from flask_admin import Admin, BaseView, expose
from flask_admin.contrib.sqla import ModelView
# from app.models import User
from config import config
from .assets import app_css, app_js, vendor_css, vendor_js
basedir = os.path.abspath(os.path.dirname(__file__))
mail = Mail()
db = SQLAlchemy()
csrf = CsrfProtect()
compress = Compress()
# Set up Flask-Login
login_manager = LoginManager()
login_manager.session_protection = 'strong'
login_manager.login_view = 'account.login'
from app.models import User
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# not using sqlalchemy event system, hence disabling it
with app.app_context():
m =app.url_map
config[config_name].init_app(app)
# Set up extensions
mail.init_app(app)
db.init_app(app)
login_manager.init_app(app)
csrf.init_app(app)
compress.init_app(app)
RQ(app)
# adm = Admin(app, name='MyAPP')
adm = Admin(endpoint='adminz', name='adz', url='/adminz')
......
# Create app blueprints
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
from .account import account as account_blueprint
app.register_blueprint(account_blueprint, url_prefix='/account')
from .admin import admin as admin_blueprint
# from .admin import admin_blueprint
app.register_blueprint(admin_blueprint, url_prefix='/admin')
return app
templates/admin/db.html:
<p>Hello world</p>
我在管理视图 (https://github.com/hack4impact/flask-base/blob/master/app/admin/views.py) 中添加了 :
from flask_admin import Admin, BaseView, expose
from flask_admin.contrib.sqla import ModelView
from app import adm as adm, db
class MyView(ModelView):
@expose('/')
def db(self):
return self.render('admin/db.html')
# admin management setup
@main.route('/db')
def db():
adm.add_view(MyView(User, db.session))
我打开时看到的是管理仪表板,而不是 flask-admin 基本视图:
127.0.0.1:5000/db
我做错了什么?
编辑:
按照您的指示,我更改了 create_app 开头:
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# not using sqlalchemy event system, hence disabling it
# adm = Admin(name='admin2', endpoint='/db', url='/db', template_mode='bootstrap3',base_template='admin/db.html')
config[config_name].init_app(app)
# Set up extensions
mail.init_app(app)
db.init_app(app)
login_manager.init_app(app)
csrf.init_app(app)
compress.init_app(app)
RQ(app)
adm = Admin(app, name='MyAPP')
# adm = Admin(endpoint='adminz', name='adz', url='/adminz')
adm.add_view(MyView(User, db.session, endpoint='db'))
这导致:
文件“....flask\app.py”,第 946 行,在 register_blueprint (蓝图,self.blueprints[blueprint.name],blueprint.name) AssertionError:蓝图的名称冲突发生在 和 之间。两者同名 "admin"。即时创建的蓝图需要唯一的名称。
编辑2:
到 create_app 的末尾我添加了:
# Create app blueprints
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
from .account import account as account_blueprint
app.register_blueprint(account_blueprint, url_prefix='/account')
from .admin import admin as admin_blueprint
# from .admin import admin_blueprint
app.register_blueprint(admin_blueprint, url_prefix='/admin')
# app.register_blueprint(admin_blueprint, url_prefix='/ab')
with app.app_context():
m =app.url_map
return app
我不确定你想看什么,但 m.rules 给出:
<Rule '/account/manage/change-password' (HEAD, GET, OPTIONS, POST) -> account.change_password>,
<Rule '/account/manage/change-email' (HEAD, GET, OPTIONS, POST) -> account.change_email_request>,
<Rule '/account/manage/info' (HEAD, GET, OPTIONS, POST) -> account.manage>,
<Rule '/account/confirm-account' (HEAD, GET, OPTIONS) -> account.confirm_request>,
<Rule '/account/reset-password' (HEAD, GET, OPTIONS, POST) -> account.reset_password_request>,
<Rule '/account/unconfirmed' (HEAD, GET, OPTIONS) -> account.unconfirmed>,
<Rule '/account/register' (HEAD, GET, OPTIONS, POST) -> account.register>,
<Rule '/account/logout' (HEAD, GET, OPTIONS) -> account.logout>,
<Rule '/account/manage' (HEAD, GET, OPTIONS, POST) -> account.manage>,
<Rule '/account/login' (HEAD, GET, OPTIONS, POST) -> account.login>,
<Rule '/admin/_update_editor_contents' (OPTIONS, POST) -> admin.update_editor_contents>,
<Rule '/admin/invite-user' (HEAD, GET, OPTIONS, POST) -> admin.invite_user>,
<Rule '/admin/new-user' (HEAD, GET, OPTIONS, POST) -> admin.new_user>,
<Rule '/admin/users' (HEAD, GET, OPTIONS) -> admin.registered_users>,
<Rule '/get_session_job_value' (HEAD, GET, OPTIONS) -> main.get_session_job_value>,
<Rule '/cl_confirm_chrome' (HEAD, GET, OPTIONS, POST) -> main.cl_confirm_chrome>,
<Rule '/render_png' (HEAD, GET, OPTIONS) -> main.render_png>,
<Rule '/selected' (HEAD, GET, OPTIONS) -> main.selected>,
<Rule '/cl_dash' (HEAD, GET, OPTIONS, POST) -> main.cl_dash>,
<Rule '/about' (HEAD, GET, OPTIONS) -> main.about>,
<Rule '/admin/' (HEAD, GET, OPTIONS) -> admin.index>,
<Rule '/dash' (HEAD, GET, OPTIONS) -> main.dash>,
<Rule '/jobs' (HEAD, GET, OPTIONS) -> main.get_jobs>,
<Rule '/' (HEAD, GET, OPTIONS) -> main.index>,
<Rule '/account/manage/change-email/<token>' (HEAD, GET, OPTIONS, POST) -> account.change_email>,
<Rule '/admin/user/<user_id>/change-account-type' (HEAD, GET, OPTIONS, POST) -> admin.change_account_type>,
<Rule '/admin/user/<user_id>/change-email' (HEAD, GET, OPTIONS, POST) -> admin.change_user_email>,
<Rule '/admin/user/<user_id>/_delete' (HEAD, GET, OPTIONS) -> admin.delete_user>,
<Rule '/admin/user/<user_id>/delete' (HEAD, GET, OPTIONS) -> admin.delete_user_request>,
<Rule '/admin/user/<user_id>/info' (HEAD, GET, OPTIONS) -> admin.user_info>,
<Rule '/account/join-from-invite/<user_id>/<token>' (HEAD, GET, OPTIONS, POST) -> account.join_from_invite>,
<Rule '/account/confirm-account/<token>' (HEAD, GET, OPTIONS) -> account.confirm>,
<Rule '/account/reset-password/<token>' (HEAD, GET, OPTIONS, POST) -> account.reset_password>,
<Rule '/admin/static/<filename>' (HEAD, GET, OPTIONS) -> admin.static>,
<Rule '/admin/user/<user_id>' (HEAD, GET, OPTIONS) -> admin.user_info>,
<Rule '/results/<job_key>' (HEAD, GET, OPTIONS) -> main.get_results>,
<Rule '/static/<filename>' (HEAD, GET, OPTIONS) -> static>
编辑 3:
我不得不说这是一个令人难以置信的答案!你真的教会了我很多。我已经按照您的指示用上述规则替换了网址。我 10 天前的最初计划只是使用基本的 flask-admin CRUD 功能。我对 db.html 模板不感兴趣(这只是我尝试过的)。
无论如何都在尝试更改管理蓝图的名称(您的编号 1)。在将 app/admin/init.py 更改为 :
之前,我曾尝试过此操作from flask import Blueprint
admin = Blueprint('admin_blueprint', __name__)
from . import views # noqa
现在打开
http://127.0.0.1:5000/adminz/
我收到 404 错误
最终编辑:
问题已解决 https://chat.whosebug.com/users/5819113/diego-quintana who explained that there was a conflict between flask-admin which creates a blueprint and the flask-base admin blueprint. By changing both the name of the blueprint and the static file folder of the flask-base project. Flask-admin could work without being overridden. Please see https://github.com/kc1/flask-base
使用url
代替endpoint
adm = Admin(name='test',url='/db')
您应该初始化 Admin
并在 create_app
中注册 views
和 blueprints
。检查这是否适合您。
# app factory
def create_app(config_name):
# configure current app
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
# wrap app with extensions
...
# admin.init_app(app) does not work and flask-admin
# should be instantiated inside create_app()
# see https://github.com/flask-admin/flask-admin/issues/910#issuecomment-115003492
# for details
admin = Admin(app, name='MyAPP')
...
# import models
from .models.user import User
# more imports happening here
# import flask-admin views to be used in the admin panel
from .admin.views import MyView
# register admin view forms
admin.add_view(MyView(name='MyCustomView', endpoint='db'))
# register blueprints
# ...
# implementation of the app factory pattern
return app
编辑:
我认为正在发生的是
- repo 中的应用程序已经有一个名为
admin
的蓝图位于 /admin - 您想在应用中实现
flask-admin
,但与现有蓝图冲突
你可以通过两件事来实现:
- 将存储库中的当前
blueprint
名称更改为与admin
不同的名称,因为flask-admin
与其冲突。 (从你的 github 问题来看,admin.static
似乎有很多硬编码的内部结构,这使得更改当前的admin
蓝图 更容易 。
蓝图的结构有点像这样
# app/myblueprint/__init__.py
from flask import Blueprint
# a random blueprint
myblueprint = Blueprint(name='mycustomblueprint',
import_name=__name__, # name of the file
static_folder='static', # a folder inside app/myblueprint/static
template_folder='templates', # a folder inside app/myblueprint/templates
static_url_path='/static', # this is what mycustomblueprint.static will point to, and if the name is admin it will be admin.static, thus colliding with flask-admin
url_prefix='/myblueprintprefix', # this will be appended to each view inside your blueprint, i.e. a view '/foo' will get converted into '/myblueprintprefix/foo' in your url mappings
subdomain=None,
url_defaults=None,
root_path=None)
from . import views # import the views inside app/myblueprint/views.py
然后,你将它导入 create_app
as
from .myblueprint import myblueprint as my_blueprint
app.register_blueprint(my_blueprint) # notice I've defined url_prefix in the Blueprint definition. You can do it at registration time, it's up to you
tl;dr:更改 admin
蓝图,因为它与 flask-admin
flask-admin
基于视图工作,生成管理视图的模式是通过 导入 它们并传递附加到/admin
端点(flask-admin
所在的位置)。 在这种情况下,您可以想到两种口味(更多但为了示例没关系)ModelView
,您可以使用它来创建自定义 CRUD 视图,并接受一个model
和一个db.session
对象。BaseView
用于在flask-admin
使用的admin
蓝图中扩展通用视图。
这意味着,如果您想在 flask-admin
视图中呈现您自己的 db.html
文件,您必须执行以下操作:
# app/modelviews/mycustomviews.py
from flask_admin import BaseView, expose
class DBView(BaseView): # notice I'm using BaseView and not ModelView
@expose('/')
def index(self):
return self.render('modelviews/db.html') # this file should live in app/templates/modelviews/db.html
和内部 create_app
# register admin view forms
from .modelviews import DBView
admin.add_view(DBView(name='MyCustomView', endpoint='db')) # this will show up in your `flask-admin` main view as MyCustomView, and it will live in {host}/admin/db
您还可以在您拥有的上下文中检查 Flask 应用程序的 url_map
参数。您的 create_app
with app.app_context():
m =app.url_map
我提到它是因为它可以帮助您调试 python repl
中的视图。导入您的应用程序,并按照我提供的要点进行操作。 url_map
应该 return 类似于 <Rules>
[<Rule '/admin/' (OPTIONS, HEAD, GET) -> admin.index>,
<Rule '/admin/db' (OPTIONS, HEAD, GET) -> dbview.index>]
这样您就可以确认您的视图位于应有的位置。希望这有帮助。