2

在测试我的 python eve API 时,我看到了一些非常奇怪的验证行为。

  • 夏娃 0.7.4
  • 蒙哥 v3.2.10

简化摘要:我有一个域端点test,其架构包含一个对象,该对象props具有两个子属性timewetBulb

DOMAIN = {

    # test end point
    'test': {
        'schema': {
            'props': {
                'type': 'dict',
                'schema': { 
                    'time':     {'type': 'datetime'},           # datetime fails to validate
                    'wetBulb':  {'type': ['string', 'float']} # only see issue while key is camel case and contains two type options
                }
            }
        },
        'resource_methods': ['GET', 'POST']
    }
}

DATE_FORMAT = '%Y-%m-%d %H:%M:%S'   # date format seems to be irrelevant

当我定义wetBulb为驼峰式键(即wetBulb代替wet_bulb)和/或将其定义为两种潜在类型之一(即'type': ['string', 'float'])时,eve/cerberus 无法将我的time值解释为datetime.

例子:

使用所有其他默认值在本地运行,我使用requests库测试此 API 点:

import requests 

post = {
    'properties': {
        'time': '2017-09-05 20:17:40',
        'wetBulb': '21.200000000000003' 
    }
}

r = requests.post('http://127.0.0.1:5000/test', data=json.dumps(post), headers={'content-type': 'application/json'})

# print response
print('Status {0}'.format(r.status_code))
print(r.text)

我得到了回应

Status 422
{"_status": "ERR", "_issues": {"properties": {"time": "must be of datetime type"}}, "_error": {"message": "Insertion failure: 1 document(s) contain(s) error(s)", "code": 422}}

如果我将架构定义更改为具有密钥wet_bulb和/或我将其类型更改为'type': 'string'它将正确验证:

DOMAIN = {

    # test end point
    'test': {
        'schema': {
            'props': {
                'type': 'dict',
                'schema': { 
                    'time':     {'type': 'datetime'},       
                    'wet_bulb': {'type': 'string'}
                }
            }
        },
        'resource_methods': ['GET', 'POST']
    }
}

然后使用更新的对象发布对象:

post = {
    'properties': {
        'time': '2017-09-05 20:17:40',
        'wet_bulb': '21.200000000000003' 
    }
}

r = requests.post('http://127.0.0.1:5000/test', data=json.dumps(post), headers={'content-type': 'application/json'})

# print response
print('Status {0}'.format(r.status_code))
print(r.text)

Status 201
{"_updated": "2017-09-06 12:30:18", "_links": {"self": {"href": "vos/59afea5aa8a548256898cc40", "title": "Vo"}}, "_created": "2017-09-06 12:30:18", "_status": "OK", "_id": "59afea5aa8a548256898cc40", "_etag": "f1b918a2fe688941f84f4d00bc1b400abddab446"}

问题:

有没有人看到过类似的其他行为,或者可以帮助澄清什么可能控制了这种验证行为?我已经四处探索,试图定义导致验证但没有成功的原因。


编辑

我相信部分解释type在 cerberus 文档下面的两个注释中,但我仍然没有弄清楚原因:

http://docs.python-cerberus.org/en/stable/validation-rules.html#type

datetime在不同的架构中遇到相同的验证问题。在这种情况下,我通过删除'type'声明或设置'type'为字符串而不是列表(即'type': 'number'代替'type': ['number', 'list'].'type'

4

1 回答 1

0

您没有在 JSON 中发送实际的 Python 日期时间。Cerberus 日期类型是检查属性值是否为 Python 日期时间对象。因此,您想验证一个 json 字符串,然后将其转换为 Python 日期时间。您有两种方法,如下所述:https ://stackoverflow.com/a/61320357/1417256 。

于 2021-10-09T06:15:08.963 回答