Python 如何使用递归验证函数验证表单
我试图递归地验证一些JSON post数据,但在“child”调用中返回错误响应时遇到问题。以下是一个简化版本: 发布数据:Python 如何使用递归验证函数验证表单,python,django,validation,recursion,Python,Django,Validation,Recursion,我试图递归地验证一些JSON post数据,但在“child”调用中返回错误响应时遇到问题。以下是一个简化版本: 发布数据: { response_type: "parent", subresponses: [ { response_type: "foo", value: "something" },{ response_type: "bar", value: "something else" } ] } po
{
response_type: "parent",
subresponses: [
{
response_type: "foo",
value: "something"
},{
response_type: "bar",
value: "something else"
}
]
}
post数据可以有任意数量的子子响应
视图:
当然,process\u response
函数将丢弃子对象中无效的subresponse
返回的JsonResponse;我需要测试返回值
我考虑过在子级中引发异常并在父级中捕获它,但是响应类型
可能不是“父级”
——因此表单验证和异常引发将在该场景中的“顶层”发生。例如:
{
response_type: "bar",
value: "something"
}
有没有Djangoey的方法?如果我做得对,如何测试返回的JsonResponse(status=400)
如果是这样?那么:
def process_response(response):
forms = {
'foo': FooForm,
'bar': BarForm,
}
if response.get('response_type') == 'parent':
for subresponse in response.get('subresponses'):
result = self.process_response(subresponse)
if result.status_code != 200:
return result
else:
form = forms[response.get('response_type')](response)
if not form.is_valid():
return JsonResponse({"message": str(form.errors)}, status=400)
form.save()
return HttpResponse(status=200)
区别在于,我们不是简单地调用
process\u response
,而是调用它,看看是否有问题。你能给出调用process\u response
的上层代码吗?我问这个问题是因为,process\u response
如果成功则返回None
如果出错则返回JsonResponse
您是对的,为了简化代码,我在保存表单后忘记了返回Http200。我已经编辑好了process\u resposne
实际上是在执行了一些json解码验证后由post
调用的。很抱歉,有人指出我忘记了一行(保存表单后返回Http200)。函数的问题是,它在递归到第一个子级(第10行)后返回,它不会处理后续子级。这可以通过测试第9行的结果来改变。状态\u code
。我更新了答案以反映您问题中的更新。
def process_response(response):
forms = {
'foo': FooForm,
'bar': BarForm,
}
if response.get('response_type') == 'parent':
for subresponse in response.get('subresponses'):
result = self.process_response(subresponse)
if result.status_code != 200:
return result
else:
form = forms[response.get('response_type')](response)
if not form.is_valid():
return JsonResponse({"message": str(form.errors)}, status=400)
form.save()
return HttpResponse(status=200)