python - 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
值。
会发生什么?
解决方案
好的,经过更多的挖掘,我遇到了这个问题,它揭示了发生了什么。的值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
一切都很好。
推荐阅读
- python - 用python打开文件对象:readlines()和readline()不返回任何值
- python - 没有名为“sage.all”的模块
- java - 为什么 if(null) 抛出 NullPointerException
- javascript - 我无法将 FormData 发送到 php
- elixir - 如何更改 Elixir 中命令提示符的颜色?
- ios - 如果将导航栏大标题颜色设置为命名颜色,应用程序将崩溃
- python - 运行 matplotlib.pyplot 的 plt.show 时 Python 脚本停止
- ios - 如何在目标c中的firebase中实现打字指示器?
- r - 将栅格堆栈范围从米转换为纬度/经度坐标
- hyperledger-fabric - Hyperledger Fabric ./byfn -m up 不会启动网络