Flask-admin: различайте доступность между представлениями

Я хотел бы различать доступ к представлениям (индексировать, создавать, редактировать) в flask-admin. Это можно сделать на уровне всех представлений, касающихся конкретной модели, путем переопределения метода: is_accessible.

def is_accessible(self):
    return current_user.is_authenticated # using flask-login

Мне нужно, чтобы некоторые пользователи могли просматривать данные, но без разрешения создавать новые записи. С другой стороны, другие пользователи должны иметь возможность создавать и редактировать записи. Любая помощь будет оценена.

Решение

Я переопределил метод _handle_view, который вызывается перед каждым представлением.

def _handle_view(self, name, **kwargs):
    if not current_user.is_authenticated:
        return self.unauthorized_access()

    permissions = self.get_permissions(name)
    if not current_user.can(permissions):
        return self.forbidden_access()

    return None #access granted

person hakubaa    schedule 14.07.2017    source источник


Ответы (2)


Это не очень хорошо документировано, но я думаю, что вы можете переопределить метод is_action_allowed в классе ModelView, чтобы получить желаемое поведение. В документации API об этом мало говорится, но я нашел лучший пример из примечания об изменениях, когда он был введен:

Вы можете контролировать, какие действия доступны для текущего запроса, переопределив метод is_action_allowed:

from flask.ext.admin.actions import action

class MyModelAdmin(ModelAdmin):
    def is_action_allowed(self, name):
        if name == 'merge' and not user.superadmin:
            return False

        if name == 'delete' and not user.admin:
            return False

        return super(MyModelAdmin, self).is_action_allowed(name)

Я не пробовал это сам, поэтому я не могу подтвердить, действительно ли пример работает без других изменений.

person abathur    schedule 15.07.2017

Flask-User похоже на то, что вы хотите. Вы указываете класс UserRoles, класс Roles и класс User, которые у вас уже есть. Вы назначаете UserRole User, а затем в своем методе is_accessible можете различать, что вы хотите делать (чтение/запись/редактирование) в зависимости от вашей роли.

https://pythonhosted.org/Flask-User/

# Define User model
class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), nullable=True, unique=True)
    ...
    roles = db.relationship('Role', secondary='user_roles',
            backref=db.backref('users', lazy='dynamic'))

# Define Role model
class Role(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(50), unique=True)

# Define UserRoles model
class UserRoles(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id', ondelete='CASCADE'))
    role_id = db.Column(db.Integer(), db.ForeignKey('role.id', ondelete='CASCADE'))
person Billy Ferguson    schedule 14.07.2017