來自燒瓶,request.args[key]
和request.form[key]
responds with 400如果密鑰不存在。這有一個不錯的財產failing fast。如何在`MultiValueDictKeyError`上響應Django中的400?
在Django中,如果密鑰不存在,request.GET[key]
和request.FORM[key]
和request.FORM[key]
會產生HttpResponseBadRequest
,這會導致您的API在未處理時響應500狀態。我見過other answers推薦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))
但是,現在你有一個額外的事情寫意見時,要記住。
比較上面的例子來瓶等效:
arg1 = request.form['arg1']
arg2 = request.form['arg2']
arg3 = request.form['arg3']
我怎麼能寫在Django同樣的事情,而無需額外的樣板在我的意見,並設置了一個param丟失時都將其與400
迴應?
謝謝!儘管這對於簡單的基於JSON的API視圖來說似乎過分了。 Django表單仍然用於這個嗎? – Joe