我已经检查了文档,并且非常模糊了如何实现is_accessible方法。
以下是烧瓶管理员的文档显示
class MicroBlogModelView(sqla.ModelView):
def is_accessible(self):
return login.current_user.is_authenticated()
def inaccessible_callback(self, name, **kwargs):
# redirect to login page if user doesn't have access
return redirect(url_for('login', next=request.url))
我不知道的是你怎么称呼它是自动调用还是你必须像这样自己调用它:
@expose("/", methods=["GET", "POST"])
def home(self):
if self.is_accesible():
return super().index()
else:
return self.login()
def is_accesible(self):
return current_user.is_authenticated and "admin" in current_user.role
因为放一个
会非常重复if self.is_accesible():
return super().index()
检查我们是否有很多管理员观点。 那么我们究竟是如何实现它的呢?文档展示了如何将它放在您的模型中,而不是如何在您的视图中实现它
答案 0 :(得分:5)
请参阅下面的示例代码 - 大部分代码都是从Quokka CMS
逐字逐句获取的定义处理Roled
和def is_accessible(self)
的{{1}} mixin。
在示例中,我使用了一个函数def _handle_view(self, name, *args, **kwargs)
来处理确定角色是否可接受的逻辑。
从sqla def is_accessible(roles_accepted=None, user=None)
和ModelView
mixin定义一个视图类,即:
Roled
从此类中派生您的视图模型:
class AdminView(Roled, ModelView):
def __init__(self, *args, **kwargs):
self.roles_accepted = kwargs.pop('roles_accepted', list())
super(AdminView, self).__init__(*args, **kwargs)
以正常方式将您的观点添加到管理类,但通过class UserView(AdminView):
form_excluded_columns = ('password')
class RoleView(AdminView):
pass
class PostView(AdminView):
pass
关键字传递允许的角色名称列表:
roles_accepted
请参阅下面的完整单个文件代码。这是在Python 2.7.9,Flask 0.10.1,flask-admin 1.1.0,flask-security 1.7.4和flask-login 0.2.11
下测试的。admin.add_view(UserView(model=User, session=db.session, category='Account', name='Users', roles_accepted=['admin']))
admin.add_view(RoleView(model=Role, session=db.session, category='Account', name='Roles', roles_accepted=['admin']))
admin.add_view(PostView(model=Post, session=db.session, category='Blog', name='Posts (Editor Only)', roles_accepted=['editor']))
admin.add_view(PostView(model=Post, session=db.session, category='Blog', name='Posts (Admins & Editors)', endpoint="post_special", roles_accepted=['editor', 'admin']))
答案 1 :(得分:2)
每次访问视图时都会自动调用它。您可以使用print语句进行检查。运行您的应用程序并查看控制台窗口。
class MicroBlogModelView(sqla.ModelView):
def is_accessible(self):
print "Called ME!!!!!!!!"
return login.current_user.is_authenticated()
def inaccessible_callback(self, name, **kwargs):
# redirect to login page if user doesn't have access
return redirect(url_for('login', next=request.url))