我怎样才能既注册蓝图又将该应用程序添加到烧瓶管理员
How can i both register blueprint and add that app to flask-admin
我的代码:
__init__.py
from flask import Flask
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
from user.user import mod as user
from user.models import User as userModel
app.register_blueprint(user, url_prefix='/user')
admin = Admin(app, name='My app')
admin.add_view(ModelView(userModel, db.session, name='userAdmin'))
user.py:
from flask import Blueprint, json
from flask.views import MethodView
mod = Blueprint('user', __name__)
class UserAPI(MethodView):
def get(self):
users = [
{'nickname': 'Chan'},
{'nickname': 'Hzz'},
]
return json.dumps(users)
mod.add_url_rule('/users/', view_func=UserAPI.as_view('users'))
models.py:
from app import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
def __init__(self, username, email):
self.username = username
self.email = email
def __repr__(self):
return "<User %s>" % self.username
我的用户应用程序中有一个蓝图,我已经注册了它,但是当我想将它添加到我的管理员以管理用户数据时,它抛出以下异常:
Traceback (most recent call last):
File "run.py", line 2, in <module>
from app import app
File "/home/chenhj/flask/multiapp/app/__init__.py", line 21, in <module>
admin.add_view(ModelView(userModel, db.session, name='chj'))
File "/home/chenhj/.virtualenvs/multiapp/local/lib/python2.7/site-packages/flask_admin/base.py", line 526, in add_view
self.app.register_blueprint(view.create_blueprint(self))
File "/home/chenhj/.virtualenvs/multiapp/local/lib/python2.7/site-packages/flask/app.py", line 62, in wrapper_func
return f(self, *args, **kwargs)
File "/home/chenhj/.virtualenvs/multiapp/local/lib/python2.7/site-packages/flask/app.py", line 885, in register_blueprint
(blueprint, self.blueprints[blueprint.name], blueprint.name)
AssertionError: A blueprint's name collision occurred between <flask.blueprints.Blueprint object at 0x25e5d90> and <flask.blueprints.Blueprint object at 0x21b89d0>. Both share the same name "user". Blueprints that are created on the fly need unique names.
我为此疯狂
冲突是因为你有一个名为 user 的模块和一个名为 user 的蓝图。将蓝图重命名为 user_blueprint。从代码来看,您似乎有一个名为 user 的文件夹、一个名为 user 的模块和一个名为 user 的蓝图。您可以使用一些描述性名称避免以后出现问题。否则它只是简单的混乱。
您还可以覆盖 ModelView 子类中的管理蓝图名称:
from flask_admin.contrib.sqla import ModelView
class AppModelView(ModelView):
def create_blueprint(self, admin):
blueprint = super(AppModelView, self).create_blueprint(admin)
blueprint.name = '{}_admin'.format(blueprint.name)
return blueprint
def get_url(self, endpoint, **kwargs):
if not (endpoint.startswith('.') or endpoint.startswith('admin.')):
endpoint = endpoint.replace('.', '_admin.')
return super(AppModelView, self).get_url(endpoint, **kwargs)
如果您的蓝图已经包含用户名称,那么您的 'admin' 管理员用户模型视图的蓝图需要不同的名称。
您可以使用 ModelView 中的端点 var 实现此目的
Flask-Admin - ModelView
admin.add_view(ModelView(Users, db.session, endpoint="users_"))
我的代码:
__init__.py
from flask import Flask
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
from user.user import mod as user
from user.models import User as userModel
app.register_blueprint(user, url_prefix='/user')
admin = Admin(app, name='My app')
admin.add_view(ModelView(userModel, db.session, name='userAdmin'))
user.py:
from flask import Blueprint, json
from flask.views import MethodView
mod = Blueprint('user', __name__)
class UserAPI(MethodView):
def get(self):
users = [
{'nickname': 'Chan'},
{'nickname': 'Hzz'},
]
return json.dumps(users)
mod.add_url_rule('/users/', view_func=UserAPI.as_view('users'))
models.py:
from app import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
def __init__(self, username, email):
self.username = username
self.email = email
def __repr__(self):
return "<User %s>" % self.username
我的用户应用程序中有一个蓝图,我已经注册了它,但是当我想将它添加到我的管理员以管理用户数据时,它抛出以下异常:
Traceback (most recent call last):
File "run.py", line 2, in <module>
from app import app
File "/home/chenhj/flask/multiapp/app/__init__.py", line 21, in <module>
admin.add_view(ModelView(userModel, db.session, name='chj'))
File "/home/chenhj/.virtualenvs/multiapp/local/lib/python2.7/site-packages/flask_admin/base.py", line 526, in add_view
self.app.register_blueprint(view.create_blueprint(self))
File "/home/chenhj/.virtualenvs/multiapp/local/lib/python2.7/site-packages/flask/app.py", line 62, in wrapper_func
return f(self, *args, **kwargs)
File "/home/chenhj/.virtualenvs/multiapp/local/lib/python2.7/site-packages/flask/app.py", line 885, in register_blueprint
(blueprint, self.blueprints[blueprint.name], blueprint.name)
AssertionError: A blueprint's name collision occurred between <flask.blueprints.Blueprint object at 0x25e5d90> and <flask.blueprints.Blueprint object at 0x21b89d0>. Both share the same name "user". Blueprints that are created on the fly need unique names.
我为此疯狂
冲突是因为你有一个名为 user 的模块和一个名为 user 的蓝图。将蓝图重命名为 user_blueprint。从代码来看,您似乎有一个名为 user 的文件夹、一个名为 user 的模块和一个名为 user 的蓝图。您可以使用一些描述性名称避免以后出现问题。否则它只是简单的混乱。
您还可以覆盖 ModelView 子类中的管理蓝图名称:
from flask_admin.contrib.sqla import ModelView
class AppModelView(ModelView):
def create_blueprint(self, admin):
blueprint = super(AppModelView, self).create_blueprint(admin)
blueprint.name = '{}_admin'.format(blueprint.name)
return blueprint
def get_url(self, endpoint, **kwargs):
if not (endpoint.startswith('.') or endpoint.startswith('admin.')):
endpoint = endpoint.replace('.', '_admin.')
return super(AppModelView, self).get_url(endpoint, **kwargs)
如果您的蓝图已经包含用户名称,那么您的 'admin' 管理员用户模型视图的蓝图需要不同的名称。
您可以使用 ModelView 中的端点 var 实现此目的
Flask-Admin - ModelView
admin.add_view(ModelView(Users, db.session, endpoint="users_"))