如何在 django 中验证 json 对象
Posted
技术标签:
【中文标题】如何在 django 中验证 json 对象【英文标题】:How to validate a json object in django 【发布时间】:2017-10-20 11:24:48 【问题描述】:我正在使用 AJAX 将 JSON 提交到 django 视图。 JSON 如下所示:
"code":"9910203040", // required
"name":"Abc", // required
"payments":[
"amount":300, // required
"name":"efg", // required,
"type": 2 // can be empty
,
"amount":100,
"name":"pqr",
"type": 3
]
付款清单可以是任意大小。如何在 Django 中验证这一点?是否可以使用 Django Forms 来验证这一点?如果是 Spring,我会创建 Request 类并在字段上使用注释,但不知道如何在 Django 中执行此操作。
【问题讨论】:
试试json.loads()
:***.com/a/5508552和Django validators。
【参考方案1】:
您可以使用 django rest 框架来验证@zaphod100.10 提到的请求数据,
这是您可以用来验证的序列化程序-
from rest_framework import serializers
class PaymentSerializer(serializers.Serializer):
amount = serializers.IntegerField(required=True, min_value=0, null=True)
name = serializers.CharField(required=True, max_length=128)
type = serializers.IntegerField(required=True, min_value=0)
class ValidateFormSerializer(serializers.Serializer):
code = serializers.CharField(required=True, max_length=32)
name = serializers.CharField(required=True, max_length=128)
payments = serializers.ListField(child=PaymentSerializer)
您需要像这样在视图部分中验证它 -
import ValidateFormSerializer
# add this snippet in your view section
valid_ser = ValidateFormSerializer(data=request.data)
if valid_ser.is_valid():
post_data = valid_ser.validated_data
else:
print(valid_ser.errors)
如果它足以解决您的问题,请告诉我。
【讨论】:
我没有在我的项目中使用 django rest 框架。有替代品吗? 检查docs.djangoproject.com/en/1.11/ref/forms/validation,有什么不使用django rest框架的具体原因吗? 实际上不是。我有一个单一的视图函数,它接受像上面这样的复杂 JSON 请求。所有其他视图都是纯表单提交。我只是想知道是否有一种优雅的方式可以使用 django 内置 api 来做到这一点。 我在我的项目中使用 django rest-framework。谢谢您的回答。但是我已经对其进行了一些编辑以匹配当前的 api 文档。【参考方案2】:有很多方法可以验证 json。我会列出以下内容:
-
Marshmallow
Schema Validation
如果您在使用这些方面需要任何帮助,请告诉我
【讨论】:
【参考方案3】:你可以使用 django rest framework [1] 它非常适合处理 json 请求。
为了验证数据,您可以使用序列化程序或 django 表单。
使用表格:
@api_view(['POST'])
def my_view(request):
payments = request.data.pop('payments', [])
# validate the main object
form = MyForm(request.data)
if form.is_valid():
obj = form.save()
else:
raise APIException(form.errors)
for pdata in payments:
form = PaymentForm(pdata)
if form.is_valid():
# your code
else:
raise APIException(form.errors)
return Response()
[1]http://www.django-rest-framework.org/
【讨论】:
如何编写可以验证对象列表的表单类? 您可以遍历列表并验证每个对象。让我编辑答案以说明如何。【参考方案4】:您可以使用表单集。例如:
class UserForm(Form):
code = forms.CharField()
name = forms.CharField()
class PaymentForm(Form):
amount = forms.CharField()
name = forms.CharField()
type = forms.CharField()
class TestView(View):
def post(self, request):
response_data=
json_data=json.loads(request.body)
UserFormSet = formset_factory(UserForm)
userformset = UserFormSet(initial=['code' : json_data['code'], 'name' : json_data['name']])
PaymentFormSet = formset_factory(PaymentForm)
paymentformset = PaymentFormSet(initial=json_data['payments'])
for userform in userformset:
#do something
for paymentform in paymentformset:
#do something
return JsonResponse(response_data)
【讨论】:
以上是关于如何在 django 中验证 json 对象的主要内容,如果未能解决你的问题,请参考以下文章
Django 表单字段验证 - 如何判断操作是插入还是更新?