Flask-Admin中ModelView无法识别current_user及角色权限配置报错求助
问题分析与解决方案
错误原因
你直接在UserView类定义阶段就访问current_user,这时候程序还未处理任何请求,没有建立请求上下文,current_user是None,调用is_authenticated自然会触发AttributeError。类属性是在模块加载时初始化的,不是在请求处理阶段,所以不能在这里直接判断用户权限。
正确实现方式
使用Flask-Admin提供的get_form_choices方法,该方法在请求处理时调用,能正确获取当前用户的上下文信息,动态返回角色选项:
from flask_login import current_user class UserView(ModelView): column_exclude_list = ['logs', 'password_hash'] form_excluded_columns = ['logs'] can_edit = True def get_form_choices(self, field): # 仅针对role字段动态设置选项 if field == 'role': # 未认证用户仅允许选择User角色 if not current_user.is_authenticated: return [('u', 'User')] # 根据当前用户角色返回对应选项 if current_user.role == 'a': return [('a', 'Admin'), ('m', 'Manager'), ('u', 'User')] elif current_user.role == 'm': return [('m', 'Manager'), ('u', 'User')] else: # 普通用户只能选择User return [('u', 'User')] # 其他字段返回默认选项 return super().get_form_choices(field)
另一种方案:自定义表单类
如果需要更精细的表单控制,可以自定义创建/编辑表单,在表单初始化时动态修改角色选项:
from flask_login import current_user from flask_admin.form import SecureForm class UserCreateForm(SecureForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 根据当前用户角色设置角色选择项 if current_user.is_authenticated: if current_user.role == 'a': self.role.choices = [('a', 'Admin'), ('m', 'Manager'), ('u', 'User')] elif current_user.role == 'm': self.role.choices = [('m', 'Manager'), ('u', 'User')] else: self.role.choices = [('u', 'User')] else: self.role.choices = [('u', 'User')] class UserEditForm(SecureForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 编辑场景可单独调整逻辑(比如经理不能提升用户为管理员) if current_user.is_authenticated: if current_user.role == 'a': self.role.choices = [('a', 'Admin'), ('m', 'Manager'), ('u', 'User')] elif current_user.role == 'm': self.role.choices = [('m', 'Manager'), ('u', 'User')] else: # 普通用户只能修改为User角色 self.role.choices = [('u', 'User')] else: self.role.choices = [('u', 'User')] class UserView(ModelView): column_exclude_list = ['logs', 'password_hash'] form_excluded_columns = ['logs'] can_edit = True create_form = UserCreateForm edit_form = UserEditForm
内容的提问来源于stack exchange,提问作者Yusharth Singh
相关产品推荐
相关产品推荐

