【问题标题】:Flask-Admin: local variable 'admin' referenced before assignmentFlask-Admin:分配前引用的局部变量“admin”
【发布时间】:2019-07-13 09:11:10
【问题描述】:

我也尝试使用 Flask-Blueprint 将 Flask-Admin 添加到我的项目中,然后我遇到了这个问题

## UnboundLocalError: local variable 'admin' referenced before assignment ##

在我搞砸之后,我遇到了另一个问题,比如

## A blueprint's name collision occurred … Both share the same name “admin” ## 

但随后我删除了所有已更改的内容并返回第一个问题!

  • FlaskBackEnd/__ 初始化 __.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
from flask_login import LoginManager
from flask_mail import Mail
from FlaskBackEnd.config import Config
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView


db = SQLAlchemy()
bcrypt = Bcrypt()
login_manager = LoginManager()
login_manager.login_view = 'users.login'
login_manager.login_message_category = 'info'
mail = Mail()
admin = Admin(name='Admin', template_mode='bootstrap3')


def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(Config)
    # initiate flask extentions
    db.init_app(app)
    bcrypt.init_app(app)
    login_manager.init_app(app)
    mail.init_app(app)
    admin.init_app(app)

    # Importing Blueprint packages
    from FlaskBackEnd.main.routes import main
    from FlaskBackEnd.posts.routes import posts
    from FlaskBackEnd.users.routes import users
    from FlaskBackEnd.errors.handler import errors
    from FlaskBackEnd.admin.routes import admin, user_datastore


    # Register blueprint app for ready to use
    app.register_blueprint(main)
    app.register_blueprint(posts)
    app.register_blueprint(users)
    app.register_blueprint(errors)
    app.register_blueprint(admin)

    return app
  • FlaskBackEnd/admin/roundes.py
from flask import render_template, Blueprint
from FlaskBackEnd.models import User, Post
from FlaskBackEnd import db, admin
from flask_admin.contrib.sqla import ModelView
from flask_admin.contrib.fileadmin import FileAdmin
from wtforms.fields import PasswordField
import os.path as op

from flask_security import (current_user, login_required, RoleMixin, Security, 
                            SQLAlchemyUserDatastore, UserMixin, utils)

admin = Blueprint('admin', __name__)

admin.add_view(ModelView(User, db.session))
admin.add_view(ModelView(Post, db.session))

path = op.join(op.dirname(__file__), 'static')
admin.add_view(FileAdmin(path, '/static/img/', name='File Explore'))

【问题讨论】:

  • 回溯(最近一次调用最后一次):app = create_app() admin.init_app(app) UnboundLocalError: 分配前引用了局部变量 'admin'
  • 您正在导入admin 之后使用它。
  • 你能给我解释一下吗?我试图解决,但它不会工作

标签: python flask flask-sqlalchemy flask-admin


【解决方案1】:

问题是当你创建管理实例并将其绑定到应用程序时:

from flask_admin import Admin

admin = Admin(name='Admin', template_mode='bootstrap3')
admin.init_app(app)

flask-admin 已经动态创建了一个蓝图,该蓝图将被命名为“admin”。这就是为什么您不能添加另一个自定义创建的名为“admin”的蓝图。正如您在flask_admin.base.Admin.init_app()中看到的那样

所以我建议:

  • routes/admin.py 中实例化flask_admin.Admin 并将视图绑定到那里。
  • __init__.py 中导入管理对象,然后只在构造函数中调用admin.init_app(self)

这样可以避免创建两个蓝图。

【讨论】:

  • 非常感谢您的回复,我会努力解决的!
  • 我忘了说我已根据您的建议解决了这个问题。谢谢!
猜你喜欢
  • 2015-05-31
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 2017-08-10
  • 2020-01-16
  • 2019-12-05
  • 2017-09-19
  • 2020-09-26
相关资源
最近更新 更多