Цербер принимает в качестве действительного пустые значения
Пытаясь получить эту проверку как приемлемую True
где любое из полей может быть empty: True
(по умолчанию я знаю), но когда не пусто, то должны применяться все последовательные условия.
SCHEMA v = Validator()
schm = {'l_addrsch': {'type': 'string', 'empty': True, 'allowed': ['m', 'o', 'e', 'M', 'O', 'E'], 'dependencies': ['l_nrefaddr', 'l_refaddr']},
'l_nrefaddr': {'type': 'integer', 'empty': True, 'dependencies': ['l_addrsch', 'l_refaddr']},
'l_refaddr': {'type': 'integer', 'empty': True, 'dependencies': ['l_addrsch', 'l_nrefaddr']}}
СООБЩЕНИЕ val = v.validate(p, schema)
{
"l_addrsch" : "",
"l_nrefaddr" : "",
"l_refaddr" : ""
}
ОТВЕТ
[
{
"l_addrsch": [
"unallowed value "
],
"l_nrefaddr": [
"must be of integer type"
],
"l_refaddr": [
"must be of integer type"
]
}
]
Надеюсь, я не слишком запутался.
РЕДАКТИРОВАТЬ 1: попытался это, как указано в нормализации правил по умолчанию:
schema = {'l_addrsch': {'type': 'string', 'default': '', 'allowed': ['', 'm', 'o', 'e', 'M', 'O', 'E'], 'dependencies': ['l_nrefaddr', 'l_refaddr']},
'l_nrefaddr': {'type': 'integer', 'default': 0, 'dependencies': ['l_addrsch', 'l_refaddr']},
'l_refaddr': {'type': 'integer', 'default': 0, 'dependencies': ['l_addrsch', 'l_nrefaddr']}
СООБЩЕНИЕ:
{ "l_addrsch" : "",
"l_nrefaddr" : "",
"l_refaddr" : ""}
Но кажется, что я все еще что-то упустил, чтобы заставить его работать на целые числа
[
{
"l_nrefaddr": [
"must be of integer type"
],
"l_refaddr": [
"must be of integer type"
]
}
]
2 ответа
Из документа:
Если
False
, проверка итерируемого значения завершится неудачно, если оно пустое. Установка его в True вручную не имеет смысла, так как ведет себя так, как если бы оно вообще не использовалось.
Чтобы установить значения по умолчанию, используйте вместо этого правило нормализации. http://docs.python-cerberus.org/en/stable/normalization-rules.html
Что-то вроде этого:
'kind': {'type': 'string', 'default': ''}
Проверка не проходит по двум причинам:
''
не определяется какallowed
значение, этот набор правил должен достичь того, что вы хотите дляl_addrsch
поле:'l_addrsch': {'type': string, 'allowed': ('', 'm', 'o', 'e', 'M', 'O', 'E'), 'required': True}
Обновление: в Cerberus 1.2 будет возможно иметь пустое поле (если разрешено), которое не будет проверяться на допустимые значения (см. Этот коммит).
Как строка (
''
) передается в качестве значения для двух других полей, оно, конечно, потерпит неудачу сtype
ограниченinteger
, Вы должны добавить приведение входного значения, если''
всегда значит0
,