如何限制Flask-Admin中的一个视图?
我有一个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”页面的访问呢?用户有三种身份,比如两个用户的例子是:
testuser testgroup testlevel
joe it admin
john dev basic
我该如何限制管理页面,只允许testlevel="admin"
的用户访问?我需要使用Flask-Security吗?还是Flask-Principal?如果是的话,应该怎么做?我尝试了这两个库一段时间,但到现在还没有成功。
这是“/admin/userview”的一个例子: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文档,了解配置属性和方法的列表。谢谢!
1 个回答
4
我假设你是从 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'
希望这对你有帮助!