在python-eve REST API framework中我在资源中定义了一个列表,列表项的类型是dict。而且我不希望列表为空。那么,如何定义架构?
{
'parents' : {
'type' : 'list',
'schema' : {
'parent' : 'string'
}
}
}
答案 0 :(得分:2)
目前empty
验证规则仅适用于字符串类型,但您可以将标准验证器子类化,使其能够处理列表:
from eve.io.mongo import Validator
class MyValidator(Validator):
def _validate_empty(self, empty, field, value):
# let the standard validation happen
super(Validator, self)._validate_empty(empty, field, value)
# add your custom list validation
if isinstance(value, list) and len(value) == 0 and not empty:
self._error(field, "list cannot be empty")
或者,如果想要提供标准empty
错误消息:
from eve.io.mongo import Validator
from cerberus import errors
class MyValidator(Validator):
def _validate_empty(self, empty, field, value):
# let the standard validation happen
super(Validator, self)._validate_empty(empty, field, value)
# add your custom list validation
if isinstance(value, list) and len(value) == 0 and not empty:
self._error(field, errors.ERROR_EMPTY_NOT_ALLOWED)
然后你运行你的API:
app = Eve(validator=MyValidator)
app.run()
PS:我计划在将来的某个时候向Cerberus的empty
规则添加列表和词组。
答案 1 :(得分:-1)
没有内置的方法来做到这一点。您可以为列表定义包装类:
class ListWrapper(list):
# Constructor
__init__(self, **kwargs):
allIsGood = False
# 'kwargs' is a dict with all your 'argument=value' pairs
# Check if all arguments are given & set allIsGood
if not allIsGood:
raise ValueError("ListWrapper doesn't match schema!")
else:
# Call the list's constructor, i.e. the super constructor
super(ListWrapper, self).__init__()
# Manipulate 'self' as you please
在需要非空列表的地方使用ListWrapper
。如果您愿意,可以以某种方式外化模式的定义,并将其添加为构造函数的输入。
另外:您可能需要查看this