Python 如何注册blueprint并将该应用程序添加到flask admin

Python 如何注册blueprint并将该应用程序添加到flask admin,python,flask,flask-admin,blueprint,Python,Flask,Flask Admin,Blueprint,我的代码: __初始值 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

我的代码:

__初始值

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
从应用程序导入数据库
类用户(db.Model):
id=db.Column(db.Integer,主键=True)
username=db.Column(db.String(80),unique=True)
email=db.Column(db.String(120),unique=True)
定义初始化(自我、用户名、电子邮件):
self.username=用户名
self.email=电子邮件
定义报告(自我):
返回“%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.
回溯(最近一次呼叫最后一次):
文件“run.py”,第2行,在
从应用程序导入应用程序
文件“/home/chenhj/flask/multiapp/app/_init__.py”,第21行,在
admin.add_视图(ModelView(userModel,db.session,name='chj'))
文件“/home/chenhj/.virtualenvs/multiapp/local/lib/python2.7/site packages/flask\u admin/base.py”,第526行,在添加视图中
self.app.register_blueprint(查看.创建_blueprint(self))
文件“/home/chenhj/.virtualenvs/multiapp/local/lib/python2.7/site packages/flask/app.py”,第62行,在wrapper_func中
返回f(自,*args,**kwargs)
文件“/home/chenhj/.virtualenvs/multiapp/local/lib/python2.7/site-packages/flask/app.py”,第885行,在注册表中
(blueprint,self.blueprints[blueprint.name],blueprint.name)
AssertionError:和之间发生蓝图名称冲突。两者共享相同的名称“用户”。动态创建的蓝图需要唯一的名称。

我非常喜欢这个

冲突是因为您有一个模块名user和一个名为user的蓝图。将蓝图重命名为user_blueprint。从代码来看,似乎有一个名为user的文件夹、一个名为user的模块和一个名为user的蓝图。您可以避免以后使用一些描述性名称时出现问题。否则会让人很困惑。

您还可以覆盖ModelView子类中的管理蓝图名称:

来自flask_admin.contrib.sqla导入模型视图
类AppModelView(ModelView):
def创建_蓝图(自我、管理):
blueprint=super(AppModelView,self)。创建\u蓝图(管理)
blueprint.name='{}_admin'。格式(blueprint.name)
返回蓝图
def get_url(自身、端点、**kwargs):
如果不是(endpoint.startswith('.')或endpoint.startswith('admin'):
endpoint=endpoint.replace(“.”,“\u admin.”)
返回super(AppModelView,self)。获取url(端点,**kwargs)

如果您已经有了一个用户名称的蓝图,那么您的管理员用户模型视图的“管理员”蓝图需要被称为不同的名称。
您可以使用ModelView中的端点变量来实现这一点


admin.add\u视图(ModelView(Users,db.session,endpoint=“Users”)

我认为错误日志中的答案非常清楚。。。很多
user
名称-只是尝试更改一些:)是的,我已经修复了它,我以前尝试过重命名管理员的名称,但我失败了,但最简单的方法是更改蓝图的名称:)哇,我尝试了很多方法,但都失败了。它起作用了!谢谢,也许所有蓝图的名字都应该加上后缀“\u blueprint”,使之独一无二!这是编写代码的好习惯