Django REST和request.data MultiValueDictKeyError

时间:2015-10-05 08:18:39

标签: django rest dictionary

我的问题与Django REST Framework中的机制有关,我们可以通过调用request.data字典获取请求数据。问题是当我们要读取字典中没有的键时。当然,我们可以尝试检查request.data是否包含所需的密钥,如下所示:

if not 'time_begin' in request.data:
    raise APIException()

如您所见,如果所需密钥没有数据,Django REST Framework将通过响应API显示以下信息:

{
    "detail": "A server error occurred."
} 

否则,如果我不使用if-instruction来检查字典中键的存在,我有以下错误:

MultiValueDictKeyError at /address/
"'time_begin'"

我的问题是:我可以不使用代码检查密钥的存在吗?它有臭不使用吗?如果我关闭Django调试并且字典中没有想要的密钥,服务器响应HTTP 500 - 所以在某些方面它是可以的。另一方面,如果我必须检查字典中的许多字段,我的代码会非常重复。你觉得怎么样?

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

500s并不是一个很有意义的回应。你应该验证几乎所有事情。为了保持DRY,您可以创建辅助函数来解决一般问题。类似的东西:

def validate_request(req, keys):
    for key in keys:
        if key not in request.data:
            raise APIException('request.data missing key "{}"'.format(key))

编辑:您必须处理异常并将验证错误返回到请求来自的位置。如果您尝试使用RESTful,那么您可以将status codes用于任何消息,或者使用带有验证错误的JSON响应等。取决于您的用例。