2016-02-05 56 views
2

來自燒瓶,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迴應?

回答

5

這正是您應該使用Django forms。它們是驗證框架,用於檢查用戶輸入,並在錯誤無效時返回錯誤。

(注意,它不是引發錯誤請求不存在的鍵的訪問;它提出MultiValueDictKeyError,爲您摘錄筆記之一,如果是未經處理的響應中間件將返回錯誤請求。)

+0

謝謝!儘管這對於簡單的基於JSON的API視圖來說似乎過分了。 Django表單仍然用於這個嗎? – Joe

相關問題