[英]How to respond with 400 in Django on `MultiValueDictKeyError`?
如果不存在该密钥,则来自Flask的request.args[key]
和request.form[key]
响应为400 。 这具有快速失败的良好特性。
在Django中,如果密钥不存在,则request.GET[key]
和request.FORM[key]
会引发HttpResponseBadRequest
,如果未处理,则会导致您的API响应500状态。 我还看到了其他一些建议request.GET.get(key)
答案 ,但这无意间松开了API协定,该协定可能会使客户端的错误溜走(例如,查询参数错字,忘记包含参数等)。
我可以手动检查所需的查询参数:
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))
但是现在在编写视图时,您还需要记住一件事。
将以上示例与Flask的等效示例进行比较:
arg1 = request.form['arg1']
arg2 = request.form['arg2']
arg3 = request.form['arg3']
如何在Django中编写相同的内容而又没有多余的样板,并在缺少参数时以400
响应?
正是您应该使用Django表单 。 它们是验证框架,用于检查用户输入并在输入无效时返回错误。
(请注意,不是访问不存在的键会引发BadRequest;它会引发MultiValueDictKeyError,这是您的摘录内容之一,如果未处理,则响应中间件将返回BadRequest。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.