到目前为止,我正在使用滤锅来验证我的 aiohttp 应用程序中的数据。
我面临的问题是我不知道如何进行“深度”验证。
给定以下架构:
import colander
class User(colander.MappingSchema):
username = colander.SchemaNode(colander.String())
password = colander.SchemaNode(colander.String())
confirmation = colander.SchemaNode(colander.String())
我都验证了输入数据结构是否具有所有必需的字段(为了清楚起见,约束是最小的)但我还需要检查:
username
尚未被其他用户使用password
并且confirmation
是相同的
所以在我的控制器中,代码看起来像下面的伪代码:
def create_user(request):
user = await request.json()
schema = User()
# do schema validation
try:
user = schema.deserialize(user)
except colander.Invalid, exc:
response = dict(
status='error',
errors=errors.asdict()
)
return json_response(response)
else:
# check password and confirmation are the same
if user['password'] != user['confirmation']:
response = dict(
status='error'
errors=dict(confirmation="doesn't match password")
)
return json_response(response)
# check the user is not already used by another user
# we want usernames to be unique
if user_exists(user['user']):
response = dict(
status='error',
errors=dict(username='Choose another username')
)
return json_response(response)
return json_response(dict(status='ok'))
基本上有两种验证。是否可以在单个滤锅模式中同时拥有这两种逻辑?这是一个很好的模式吗?