2016-12-15 61 views
0

我是Python,Django和Django Rest Framework的新手 - 雖然我喜歡學習曲線!當參數丟失Django Rest框架時拋出異常

我想知道當沒有提供API參數時引發異常的標準(最常見)方式是什麼?

顯然如果條件在視圖的身體是不是要走的路。有可以傳遞參數名稱的裝飾器嗎?

# urls.py 

    urlpatterns = [ 
    url(r'test', test), 
    url(r'errand/make', errand.make), 
    url(r'errand/preview', errand.preview) 
] 

# views/errand.py 

@api_view(['GET']) 
@renderer_classes((JSONRenderer,)) 
def preview(request): 
    e = Errand.objects.get(pk=request.GET['errand_id']) 
    return Response({'data': e.get_preview_data()}) 

爲了此行

e = Errand.objects.get(pk=request.GET['errand_id']) 

要運行良好,errand_id需求可用。我如何檢查某些請求鍵

回答

1

對於參數沒有默認值的任何函數調用,您將得到TypeError

只要您沒有傳入默認值,即使參數在函數內部不被使用,您也會得到一個異常。

在你的榜樣,因爲你使用dict.get,默認情況下,如果關鍵是沒有找到它會返回None

如果你想要一個異常那裏,你可以直接嘗試訪問關鍵,這將導致KeyError當它沒有被發現時。像這樣:

... 
e = Errand.objects.get(pk=request['errand_id']) 
... 

否則另一個解決方案是創建表示該請求的所期望的結構的模式,並驗證在函數或使用裝飾該請求。

像這樣的事情將是一個開始:

def errand_id_required(func): 
    def func_wrapper(request): 
     if not request.get('errand_id', False): 
      raise KeyError('errand_id not present in request') 
     return func(request) 
    return func_wrapper 

@errand_id_required 
def preview(request): 
    e = Errand.objects.get(pk=request.GET['errand_id']) 
    return Response({'data': e.get_preview_data()}) 

我一般只做到這一點,如果我有驗證字典架構的複雜的方式,否則這是非常矯枉過正寫一個裝飾檢查單個密鑰。

你可以嘗試PyPI上的架構庫,並定義是這樣的:

import schema 

errand_schema = { 
    schema.Optional('some_key'): str, 
    'id': int, 
    'errand_id': int, 
} 
Errand = schema.Schema(errand_schema, ignore_extra_keys=True) 

,你可以使用Errand.validate(request)而不是我把裝飾的if.. raise KeyError的。

但我會留給你決定...

+0

當然 - 這將推斷從url的params權利?你可以看看我的編輯。它可能會清理一些事情。 –

+0

如果存在'errand_id'但是'Errand.objects.get(pk = request.GET ['errand_id'])'會產生'Errand.DoesNotExist'? – Qubad

+0

爲什麼它會將異常的屬性作爲異常提升? –