Python Eve — полезная нагрузка POST, содержащая список

У меня проблемы с типом list в моих схемах. Всякий раз, когда я пытаюсь выполнить POST, я получаю ответ 422, в котором говорится, что «должен быть типа списка». Ниже приведен простой пример, который создает эту проблему.

from eve import Eve

people = {
    'schema': {
        'tests': {
            'type': 'list',
            'schema': {
                'type': 'string'
            },
            'required': True,
        }
    },
    'resource_methods': ['GET', 'POST'],
}

settings = {
    'DOMAIN': {
        'people': people
    }
}
app = Eve(settings=settings)

if __name__ == '__main__':
    app.run()

Затем, когда вы отправляете сообщение на конечную точку людей со следующим:

import requests

url = "http://localhost:5000/people"

person = {
    "tests": ['a', 'b'],
}

r = requests.post(url, data=person)
print(r.json())

Вы получаете ответ 422. Когда я отлаживаю это, похоже, что приложение Eve получило параметр tests как просто строку 'a', а не весь список. Из того, что я вижу в тестах Eve на GitHub, кажется, что это правильный способ сделать запрос, поэтому я могу только предположить, что делаю ошибку при настройке ресурса/схемы?

Спасибо.


person Andrew Walker    schedule 08.09.2015    source источник


Ответы (1)


Если вы напечатаете request.POST, вы увидите UnicodeMultiDict([('tests', u'a'), ('tests', u'b')]). Исправить это можно было бы, используя json object для вашего post.

person = json.dumps({
    "tests": ['a', 'b'],
})

r = requests.post(url, json=person)
print(r.json())

Или, в вашем случае, вам нужно будет каким-то образом настроить свой запрос POST в конце API, чтобы получить список как: - request.POST.getall('tests'), а затем продолжить.

Пожалуйста, проверьте использование json в запросе POST. Также при использовании json может не потребоваться json.dumps, словарь будет jsonified автоматически.

person Barun Sharma    schedule 08.09.2015