我是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 需要可用。如何检查某些请求密钥?
答案 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
。
但我会由你决定......