Inaccessible_callback () Flask-Admin не работает должным образом - PullRequest
0 голосов
/ 24 мая 2019

Я хочу контролировать, кто может получить доступ к страницам администратора в моем приложении фляги.

Я пытался переписать методы flask_admin.ModelView, 'is_accessible' и 'inaccessible_callback', чтобы справиться с ситуацией.

Это класс AdminView, который я создаю:

class AdminView(ModelView):

    def is_accessible(self):
        return current_user.admin

    def inaccessible_callback(self, name, **kwargs):
        # redirect to login page if user doesn't have access
        return redirect(url_for('auth.login', next=request.url))

и модель:

class User(db.Model, UserMixin):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), unique=True)
    email = db.Column(db.String(120), unique=True)
    password_hash = db.Column(db.String(128))
    admin = db.Column(db.Boolean, default=False)

    def __init__(self, username=None, email=None, password=None):
        self.username = username
        self.email = email
        self.password_hash = password_hash
        self.admin = admin

и инициализация AdminView:

def init_admin(admin):
    from app.models import User
    admin.add_view(AdminView(User, db.session))

, который вызывается на фабрике приложений:

def create_app(test_config=None):
    # create and configure the app
    app = Flask(__name__, instance_relative_config=True)

    if test_config is None:
        # load the isntance config, if it exists, when not testing
        app.config.from_object(Config)
    else:
        # load the test config passed in
        app.config.from_object(test_config)

    db.init_app(app)
    migrate = Migrate(app, db)
    login_manager.init_app(app)
    mail.init_app(app)
    bootstrap.init_app(app)

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


    from app.auth import auth_bp
    app.register_blueprint(auth_bp)

    from app.tables import tables_bp
    app.register_blueprint(tables_bp)

    init_admin(admin)

    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass

    return app

Когда я вхожу в систему с пользователем, у которого атрибут admin имеет значение True, он возвращает правильную страницу администратора с моделью пользователя, готовой к использованию. Когда я вхожу в систему с пользователем, у которого есть атрибут false admin, он по-прежнему показывает страницу администратора без присоединенной модели пользователя. Я бы предпочел, чтобы он перенаправил их на страницу входа с предупреждением, что они запрещены на этой странице.

1 Ответ

1 голос
/ 24 мая 2019

Я понял, как заставить это работать благодаря видео на YouTube!

Доступность Flask_Admin

Проверьте это для более подробного объяснения!

Проблема заключалась в том, что страница '/ admin' загружается Flask_Admin.AdminIndexView

Поэтому мне пришлось создать свой собственный дочерний класс AdminIndexView и установить его в качестве параметра index_view, когдаинициализация Admin()

Вот обновленный код: я добавил класс MyIndexView в свой админ-файл:

# ...
from flask_admin import AdminIndexView
# ...
class MyIndexView(AdminIndexView):
    def is_accessible(self):
        return current_user.admin

    def inaccessible_callback(self, name, **kwargs):
        # redirect to login page if user doesn't have access
        return redirect(url_for('auth.login', next=request.url))

А затем я установил параметр index_view на фабрике приложений

# ...
from app.admin import AdminView, MyIndexView
# ...
admin = Admin(app, name='app', template_mode='bootstrap3',
                  index_view=MyIndexView())
# ...

Теперь работает отлично!

...