Ответ динамического маршаллинга 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)