Странное поведение проверки с `datetime` в подобъекте в канун питона
Я вижу очень странное поведение проверки при тестировании моего Python Eve API.
- Ева 0.7.4
- Mongod v3.2.10
Упрощенное резюме: у меня есть конечная точка домена test
со схемой, содержащей объект props
который имеет два суб свойства time
а также wetBulb
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']
), Ева / Цербер не может интерпретировать мой time
ценность как datetime
,
Пример:
Работая локально со всеми другими значениями по умолчанию, я тестирую эту точку API с помощью requests
библиотека:
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
в документации Цербера, но я до сих пор не выяснил причину:
http://docs.python-cerberus.org/en/stable/validation-rules.html
У меня то же самое datetime
проблема проверки в другой схеме. В этом случае я обошел это путем удаления 'type'
декларация или настройка 'type'
быть строкой вместо списка (то есть 'type': 'number'
вместо 'type': ['number', 'list']
, К сожалению, эта схема не будет работать для приложения, поэтому я удалил 'type'
декларация на данный момент.
1 ответ
Вы не отправляете фактическую дату и время Python в своем JSON. Тип даты Cerberus предназначен для проверки того, что значение свойства является объектом даты и времени Python. Итак, вы хотите проверить строку json, а затем преобразовать ее в дату и время Python. У вас есть два подхода, как описано здесь: /questions/52420395/ispolzovanie-nastraivaemoj-proverki-dlya-vstroennyih-tipov/52420404#52420404.