python - Flask-Login 如何检查用户是否具有某个属性值
问题描述
我目前正在使用烧瓶登录来验证我的网站。我的模型是一个简单的用户(带有 id、邮件等),它有一个 admin(boolean) 属性。我不需要超过 2 个角色。
如果当前用户在 admin 属性中具有值“True”,是否有任何方法可以在调用路由后进行检查?
我尝试通过尝试自定义装饰器以及访问 session['admin'] 来解决此问题,但它不起作用。
解决方案
正如@Agung Wiyono 评论的那样,Flask-Login 提供了一个current_user
变量,请参阅docs。
在您的路线中,您可以执行以下操作:
from flask_login import current_user
@app.route("/test")
@login_required
def test():
if current_user.admin:
print('user is admin')
# blah blah
如果您不想使用login_required
装饰器:
@app.route("/test")
def test():
if current_user.is_authenticated and current_user.admin:
print('user is authenticated and is an admin')
# blah blah
如果您想使用装饰器来检查current_user
admin 值是否为True
:
def admin_role_required(func):
@wraps(func)
def decorated_view(*args, **kwargs):
if request.method in EXEMPT_METHODS:
return func(*args, **kwargs)
elif not current_user.admin:
abort(403)
return func(*args, **kwargs)
return decorated_view
这段代码或多或少是 的代码@login_required
,除了它检查admin
属性的状态 - 参见源代码。
并如下使用。注意装饰器的顺序很重要。@login_required
先被调用,然后@admin_role_required
被调用。装饰器admin_role_required
假定current_user
已经过身份验证。如果admin_role_required
首先调用,则current_user
代理将没有属性admin
,并且您会遇到错误。
@app.route("/test")
@admin_role_required
@login_required
def test():
# need to be logged in and admin be True to get here
# blah blah
推荐阅读
- java - 每次启动应用程序时,Spring data.sql 文件都会添加一条新记录。
- flutter - Flutter 中的 runApp(new MyApp()) 和 runApp(new MaterialApp()) 有什么区别?
- android - 将更新发布到生产时如何进行后端更新?
- flutter - Flutter 抛出异常 BoxConstraints 强制无限宽
- sitecore - 在 Sitecore 8.2 (rev. 170407) 中添加新的语言区域
- android - Textview 数据被用作条件 if 语句
- regex - 正则表达式和尖括号
- angular - Angular 6 Snap-to-Component 指令在 Chrome 中不起作用
- python - 是否可以使用 Django 的 execute_from_cammand_line 函数执行 npm 命令?
- react-native - 大型组件作为 VirtualizedList/etc 中的部分?