Ответ динамического маршаллинга Python Flask_restplus flash_restx

Можно ли динамически изменять модель упорядоченного ответа (например: изменить список полей, добавить маску, ...)?

пример:

from flask_restplus import Resource, fields

model = api.model('Model', {
    'name': fields.String,
    'address': fields.String,
    'date_updated': fields.DateTime(dt_format='rfc822'),
})

@api.route('/todo')
class Todo(Resource):
    @api.marshal_with(model, envelope='resource')
    def get(self, **kwargs):
        return db_get_todo()  # Some function that queries the db

Здесь маршаллинг объявлен статически с помощью декоратора. Если я хочу замаскировать пример date_updated, когда пользователь не является администратором или в зависимости от предпочтений пользователя, я не могу.

Я видел этот пример: https://blog.fossasia.org/dynamically-marshaling-output-in-flask-restplus/ Это интересно, но в нем используется другая статическая модель, поэтому она не совсем динамическая и подразумевает дублирование кода (конечно, я можно использовать наследование,...)

Я хотел бы иметь возможность динамически изменять поля или добавлять маску из списка, который может поступать, например, из базы данных (пользовательские настройки или права).

Я пытался вручную задать ответ

wanted_field_list='name,address'
return  marshal(db_get_todo(),model , mask=wanted_field_list),  200

Если я удалю декоратор @marshall_with, он будет работать отлично, но недостаток в том, что у меня больше нет документа Swagger

{ 'name':'blabla',
'address':'xxx'}

Если я сохраню декоратор, он все еще будет работать, потому что нежелательные поля все равно будут отображаться с нулевым значением:

{ 'name':'blabla',
'address':'xxx',
'date_updated : null}

Это не ожидаемый результат

Я попытался перейти на flask_restx, но мое чванство вообще не отображается, и у меня есть другие проблемы.

Любая помощь приветствуется!

2 ответа

Я знаю, что это немного поздно, но все равно, на случай, если кому-то это понадобится:

У вас есть несколько вариантов, чтобы выполнить то, что вам нужно:

  • Используйте для флага skip_none значение true . Это приведет к игнорированию поля date_updated из ответа, если оно равно нулю.
  • Используйте маску X-Fields при вызове API. Значение маски - это список переменных, разделенных запятыми, которые вы хотите получить. Остальные игнорируются.
  • Тот , который вам не понравился в сообщении блога , на которое вы указали ссылку;)

используйте следующий декоратор

      @api.marshal_with(model, skip_none=True)
Другие вопросы по тегам