参数缺少Django Rest框架时抛出异常

时间:2016-12-15 10:04:45

标签: python django rest

我是Python,Django和Django Rest Framework的新手 - 尽管我喜欢学习曲线!

我想知道在没有提供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 个答案:

答案 0 :(得分: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

但我会由你决定......