Python 如何在Django中用400响应“MultiValueDictKeyError”?

Python 如何在Django中用400响应“MultiValueDictKeyError”?,python,django,forms,http-status-codes,Python,Django,Forms,Http Status Codes,来自烧瓶,request.args[key]和request.form[key]如果密钥不存在。这有一个很好的特性 在Django中,如果密钥不存在,request.GET[key]和request.FORM[key]将引发HttpResponseBadRequest,如果未处理,将导致API以500状态响应。我看到过推荐的request.GET.GET(key),但这无意中放松了API契约,可能会让客户端bug溜走(例如,查询参数输入错误、忘记包含参数等) 我可以手动检查所需的查询参数: ar

来自烧瓶,
request.args[key]
request.form[key]
如果密钥不存在。这有一个很好的特性

在Django中,如果密钥不存在,
request.GET[key]
request.FORM[key]
将引发
HttpResponseBadRequest
,如果未处理,将导致API以500状态响应。我看到过推荐的
request.GET.GET(key)
,但这无意中放松了API契约,可能会让客户端bug溜走(例如,查询参数输入错误、忘记包含参数等)

我可以手动检查所需的查询参数:

arg1 = request.POST.get('arg1')
if not arg1:
    raise HttpBadRequest('"arg1" was not provided.')

arg2 = request.POST.get('arg2')
if not arg2:
    raise HttpBadRequest('"arg1" was not provided.')

arg3 = request.POST.get('arg3')
if not arg3:
    raise HttpBadRequest('"arg3" was not provided.')
但这给错误留下了很大的空间。(你注意到打字错误了吗?)

我可以手动处理HttpResponseBadRequest:

def my_view(request):
    try:
        arg1 = request.POST['arg1']
        arg2 = request.POST['arg2']
        arg3 = request.POST['arg3']
    except MultiValueDictKeyError as ex:
        raise HttpBadRequest('"{}" was not provided.'.format(ex))
但是现在,在编写视图时,您需要记住一件额外的事情

将上述示例与烧瓶的等效物进行比较:

arg1 = request.form['arg1']
arg2 = request.form['arg2']
arg3 = request.form['arg3']

我如何在Django中编写相同的东西,而不在视图中使用额外的样板文件,并在缺少参数时让它以
400
响应?

这正是您应该使用的。它们是检查用户输入并在无效时返回错误的验证框架


(注意,引发BadRequest的不是对不存在的键的访问;它会引发多值DictKeyError,作为您的代码段注释之一,如果未处理,响应中间件将返回BadRequest。)

谢谢!不过,对于简单的基于JSON的API视图来说,这似乎有些过分了。Django表单是否仍在使用?