Django-检查实例是否存在会导致内部服务器错误500

时间:2018-09-25 16:12:19

标签: python django

我正在尝试使用以下代码检查数据库中是否有条目:

def device_update(request):
    json_data = json.loads(request.body)
    email = json_data['email']
    imei = json_data['imei']
    sdk_version = json_data['sdk_version']
    date = json_data['updateDate']
    rule = json_data['ruleName']
    group_name = json_data['group']
    if Group.objects.filter(group=group_name).exists():
        print("group does exists")
    else:
        print("group doesn't exists")
    return HttpResponse("Successful")

但是,当代码到达if语句以检查该组是否存在时,它将返回错误500。

我试图检查两组是否存在,而另一组则不存在,在两种情况下都出现错误500。

我该如何解决?为什么会这样?

3 个答案:

答案 0 :(得分:2)

检查Group是否存在的逻辑,即该行:

if Group.objects.filter(group=group_name).exists()

没有在这里抛出错误。 json_data可能缺少您期望的键之一,例如'group'

我建议使用get method that dictionaries have。当字典中不存在指定的键时,它将提供默认值。当请求正文不是有效的JSON格式时,您还应该进行错误处理。

这是一个例子:

def device_update(request):
    try:
        json_data = json.loads(request.body)
    except json.JSONDecodeError:
        return HttpResponse('Request body must be in valid JSON format')
    email = json_data.get('email', '')
    imei = json_data.get('imei', '')
    sdk_version = json_data.get('sdk_version', '')
    date = json_data.get('updateDate', '')
    rule = json_data.get('ruleName', '')
    group_name = json_data.get('group', '')
    if Group.objects.filter(group=group_name).exists():
        print("group does exists")
    else:
        print("group doesn't exists")
    return HttpResponse("Successful")

我将默认值设置为空字符串'',但您可能需要更改它。

答案 1 :(得分:1)

您的视图没有任何错误处理。快速查看,至少有两件事可能出错。请求正文可能不是有效的json,并且如果它是有效的json,则可能不包含必需的键。

def device_update(request):
    try:
        json_data = json.loads(request.body)
    except ValueError:
        return HttpResponse("Invalid json")
    try:
        email = json_data['email']
        imei = json_data['imei']
        sdk_version = json_data['sdk_version']
        date = json_data['updateDate']
        rule = json_data['ruleName']
        group_name = json_data['group']
    except KeyError as e:
        return HttpResponse("Missing Key %s" % e[0])
    ...

像这样为单个视图编写自己的验证是可以的。随着变得越来越复杂,您可能需要查看django rest框架。它具有序列化程序,可帮助您管理验证。

答案 2 :(得分:0)

阿拉斯代尔/凯塞尔梅,看来您的观点是正确的。 尝试将ipdb放入代码中以调试代码,然后可以打印request.data并查看请求中的内容。