首页 > 解决方案 > Flask-Admin:current_user 意外未定义?

问题描述

我有一个使用 Flask-Login 的完整工作的 Flask-Admin 应用程序。在我的 ModelView 代码中的许多地方,我都使用了current_user,这一直有效。例如,我有

def on_model_change(self, form, model, is_created):
  model.last_modified_by = current_user.get_id()

我现在正在尝试根据访问级别禁用对字段的编辑,并且在声明 some 之后form_args,我添加了:

if current_user.access_level == 'USER':
  form_widget_args = {'salary': {'disabled': True}}

这会引发错误AttributeError: 'NoneType' object has no attribute 'access_level'。然而,如果没有这段代码,我会直接进入on_model_change上面显示的内容,这成功地设置了last_modified_by值。

会发生什么?

标签: pythonflaskflask-admin

解决方案


好的,经过更多的挖掘,我遇到了这个问题,它揭示了发生了什么。的值form_widget_args在应用程序初始化时被缓存,并且在实际运行时没有得到检查(即当有 a 时current_user)。

我将代码更改为:

@property
def form_widget_args(self):
    if not has_app_context() or (current_user.access_level == 'USER'):
        form_widget_args = {'salary': {'disabled': True}}
        return form_widget_args

一切都很好。


推荐阅读