Странное поведение проверки с `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.

Другие вопросы по тегам