【问题标题】:Python Eve - POST payload containing a listPython Eve - 包含列表的 POST 有效负载
【发布时间】:2015-12-04 01:23:21
【问题描述】:

我的架构中的 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',而不是整个列表。从我在 GitHub 上的 Eve 测试中可以看出,这似乎是发出请求的正确方式,所以我只能假设我在设置资源/模式时犯了错误?

谢谢。

【问题讨论】:

    标签: python eve


    【解决方案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())
    

    或者在您的情况下,您将不得不在 API 端以某种方式调整您的 POST 请求以获取如下列表:- request.POST.getall('tests') 然后继续。

    请查看using json in POST request。此外,在使用json 时,可能不需要 json.dumps,字典将自动为jsonified

    【讨论】:

    • 啊,这行得通,谢谢。我没有意识到请求中有jsonargument。我已经尝试过data=json.dumps(payload),它给出了 400 错误。现在看看requests docs,我认为它们是等价的。
    • 也许我应该将此链接添加到答案中。
    • 我发现json=persondata=json.dumps(person)不起作用的情况下起作用的原因是因为json关键字参数还将请求标头更改为application/json,而手动转储不起作用。跨度>
    • @AndrewWalker 好的。谢谢。我不知道这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2021-01-19
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多