【问题标题】:Restricting one view on Flask-Admin?限制 Flask-Admin 的一个视图?
【发布时间】:2014-09-04 16:49:02
【问题描述】:

我有一个用于 Flask 应用程序的文件,views.py

views.py 内部,我在这里设置了Flask-Admin 和对应的sqlalchemy 数据库:

db = SQLAlchemy(flaskapp)

def build_db():

import random
import datetime

db.drop_all()
db.create_all()

# Create sample Users
testuser = []
testgroup = []
testlevel = []

user_list = []
for i in range(len(testuser)):
    user = User()
    user.testuser = testuser[i]
    user.testlevel = testlevel[i]
    user.testgroup = testgroup[i]

    user_list.append(user)
    db.session.add(user)

for user in user_list:
    entry = random.choice(sample_text)  # select text at random
    post = Post()
    post.user = user
    post.title = entry['title']
    post.text = entry['content']
    tmp = int(1000*random.random())  # random number between 0 and 1000:
    post.date = datetime.datetime.now() - datetime.timedelta(days=tmp)
    post.tags = random.sample(tag_list, 2)  # select a couple of tags at random
    db.session.add(post)

db.session.commit()
return

# Create models
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    testuser = db.Column(db.String(100))
    testgroup = db.Column(db.String(100))
    testlevel = db.Column(db.String(100))

# Required for administrative interface. For python 3 please use __str__ instead.
def __repr__(self):
    return self.testuser

class UserInfo(db.Model):
    id = db.Column(db.Integer, primary_key=True)

    key = db.Column(db.String(64), nullable=False)
    value = db.Column(db.String(64))

    user_id = db.Column(db.Integer(), db.ForeignKey(User.id))
    user = db.relationship(User, backref='info')

def __repr__(self):
    return '%s - %s' % (self.key, self.value)

### Attempt at doing something...
class MyView(ModelView):
    @expose('/admin/userview', methods=('GET', 'POST'))
    def adminview():
        return "yes"
##ADMIN
admin = Admin(flaskapp, name="Test Aptly")
admin.add_view(MyView(User, db.session))

问题。

如何根据用户的级别(使用数据库“testlevel”定义)阻止对“/admin/userview”页面的访问?用户有 3 种品质,两个用户的示例是:

testuser          testgroup        testlevel

joe               it               admin

john              dev              basic

如何将管理页面限制为只允许拥有testlevel="admin" 的人? 我使用 Flask-Security 吗?烧瓶校长?如果是这样,怎么做?我已经对两者进行了一些修改,但到目前为止我还没有得到任何工作。

这是一个示例“/admin/userview”,如下所示:example Flask-Admin

首先,你可以使用各种类级别的属性来配置 应该显示什么以及如何显示。例如,可以使用 column_list 显示某些列或包括相关的额外列 模型。

例如

class UserView(ModelView):
    # Show only name and email columns in list view
    column_list = ('name', 'email')

    # Enable search functionality - it will search for terms in
    # name and email fields
    column_searchable_list = ('name', 'email')

    # Add filters for name and email columns
    column_filters = ('name', 'email')

或者,您可以覆盖一些 ModelView 方法并 实现您的自定义逻辑。

例如,如果您需要向 生成的表格,你可以这样做:

class UserView(ModelView):
    def scaffold_form(self):
        form_class = super(UserView, self).scaffold_form()
        form_class.extra = wtf.TextField('Extra')
        return form_class

查看flask.ext.admin.contrib.sqlamodel documentation 获取列表 配置属性和方法。谢谢!

【问题讨论】:

    标签: python flask flask-admin flask-security flask-principal


    【解决方案1】:

    我假设您继承了 BaseView 来创建您的管理视图,并且您正在使用 Flask-login。

    然后覆盖视图类中的is_accessible 方法,以检查当前用户的质量:

    from flask.ext.admin.base import BaseView
    from flask.ext.login import current_user
    
    class MyView(BaseView):
        def is_accessible(self):
            return current_user.testlevel == 'admin'
    

    希望这会有所帮助!

    【讨论】:

    • 我还应该说我使用 kerberos 来获取用户名,如下所示:request.environ.get('REMOTE_USER') 我没有对任何内容进行子类化,我发布的内容是我用来获取 Flask-Admin/sqlalchemy 的所有内容和运行。我不知道 Flask-Admin 将其网页或任何内容保存在哪里:/
    • 如果request.environ.get('REMOTE_USER') 包含用户名(作为字符串),您可以查询您的数据库以获取他的测试级别。关于子类化,必须在某个地方创建Admin 对象并向其添加视图(例如here)。你在admin.add_view(...)使用哪个类?
    • 是的,我在整个 Flask 应用程序中一直在这样做,但是使用 Flask-Admin 我无法让它用于查询数据库。
    • 你能用初始化 Flask-Admin 的代码来编辑你的问题吗?将有助于弄清楚为什么您无法专门使用 Flask-Admin 运行查询。
    • 不允许我编辑,但在上面代码的底部是我如何初始化 Flask-Admin admin = Admin(flaskapp, name="Test Aptly") admin.add_view(MyView(User, db.session))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多