我可以在视图函数中的函数中返回响应吗?

Posted

技术标签:

【中文标题】我可以在视图函数中的函数中返回响应吗?【英文标题】:Can I return a response in a function within a view function? 【发布时间】:2017-05-05 09:05:12 【问题描述】:

这里是视图函数:

def bar(request):
    ...
    record = get_record_from_model(model, **kwargs)
    ...
    return JsonResponse(data_to_response)

下面是view函数中用到的函数:

def get_record_from_model(model, **kwargs):
    try:
        return model.objects.get(**kwargs)
    except model.DoesNotExist:
        error_data = copy.copy(settings.ERROR["NOT_EXIST_ERR"])
        return JsonResponse(error_data)

发生异常时,我可以在get_record_from_model函数中将JsonResponse(error_data)返回给客户端吗?

类似 raise Http404

【问题讨论】:

【参考方案1】:

简短的回答是,您不能直接在那里执行此操作,因为调用函数仍然需要对来自get_record_for_model 的返回值做一些事情。也就是说,我建议您执行以下操作,将数据以及找到/未找到的布尔值发送回调用函数:

def get_record_from_model(model, **kwargs):
    try:
        return model.objects.get(**kwargs), True

    except model.DoesNotExist:
        error_data = copy.copy(settings.ERROR["NOT_EXIST_ERR"])
        return error_data, False

...

def bar(request):
    ...
    data, found = get_record_from_model(model, **kwargs)
    if not found:
        return JsonResponse(data, status=404)
    ...
    return JsonResponse(response_data)

【讨论】:

数据以后会用到,不能随便返回,这可能不是一个好的解决方案。 我宁愿不使用这个功能...谢谢。【参考方案2】:

使用 django 的内置快捷方式get_object_or_404

from django.shortcuts import get_object_or_404

def bar(request):
    ...
    record = get_object_or_404(model, **kwargs)
    ...
    return JsonResponse(data_to_response)

【讨论】:

以上是关于我可以在视图函数中的函数中返回响应吗?的主要内容,如果未能解决你的问题,请参考以下文章

第二章:视图层 - 4:视图函数及快捷方式

第二章:视图层 - 4:视图函数及快捷方式

Django——视图基础

Django的视图层

我一直陷入 Flask 错误。 TypeError:视图函数没有返回有效响应[重复]

视图函数未返回有效响应。烧瓶棉花糖,RestAPI [重复]