Flask-Admin: current_user неожиданно не определен?

У меня есть полностью работающее приложение Flask-Admin, в котором используется Flask-Login. В ряде мест в моем коде ModelView я использую current_user, и это всегда работало. Например, у меня есть

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

Сейчас я пытаюсь отключить редактирование поля в зависимости от уровня доступа, и после того, как я объявил 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.

Что могло происходить?


person user9219182    schedule 16.01.2021    source источник


Ответы (1)


Хорошо, немного покопавшись, я наткнулся на этот вопрос, который раскрыл, что происходит. Значение form_widget_args кэшировалось при инициализации приложения и не проверялось, когда что-то действительно работало (т.е. когда было 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

И все хорошо.

person user9219182    schedule 16.01.2021