Cho*_*key 4 python roles flask
我写了这个,它似乎工作得很好:
@app.route('/admin', methods=['GET','POST'])
@login_required
def admin():
if not current_user.role == ROLE_ADMIN:
flash('You do not have access to view this page.')
return redirect(url_for('index'))
...the rest of my code...
Run Code Online (Sandbox Code Playgroud)
在试图简化事情时,因为我不想将这 3 行添加到我希望只对管理员可见的每个区域,我尝试将其放入如下函数中:
def admin_only():
if not current_user.role == ROLE_ADMIN:
flash('You do not have access to view this page.')
return redirect(url_for('index'))
Run Code Online (Sandbox Code Playgroud)
然后放入我的视图函数:
@app.route('/admin', methods=['GET','POST'])
@login_required
def admin():
admin_only()
...the rest of my code....
Run Code Online (Sandbox Code Playgroud)
然而,这并不像我预期的那样工作。我收到闪现的消息,但它并没有像我想象的那样重定向。
所以,两个问题:
真正回答你的问题。您应该使admin_only函数成为装饰器并装饰admin视图方法。它现在不重定向的原因是因为您没有从视图中返回重定向。
def admin():
ret = admin_only()
if( not ret ):
return ret
....
Run Code Online (Sandbox Code Playgroud)
这应该可以解决您当前的问题,但它并不理想,您希望的功能应该移至装饰器。
我还推荐以下内容:
看看Flask-Principal,它提供了为用户分配角色的能力,然后根据这些角色限制对您的视图的访问。
与 Flask-Principal 一起看一下Flask-Security,因为它提供了许多有用的与安全相关的 Flask 扩展,并且使其更易于使用。
使用示例:
@roles_required( "admin" )
def website_control_panel():
return "Only Admin's can see this."
Run Code Online (Sandbox Code Playgroud)
将仅允许将角色admin附加到其帐户的用户。另一个用例是允许用户拥有许多角色中的一个,这些角色可以用roles_accepted和指定,可以如下使用:
@roles_accepted( "journalist", "editor" )
def edit_paper():
return render_template( "paper_editor.html", ... )
Run Code Online (Sandbox Code Playgroud)
将只允许至少具有与其帐户相关联的journalist或editor角色之一的用户。
| 归档时间: |
|
| 查看次数: |
6733 次 |
| 最近记录: |