首页 > 解决方案 > 直接从 django rest 框架中的内部函数返回响应

问题描述

我有一个调用其他函数的视图。现在根据不同的场景,函数要返回一些错误信息给用户。但是,如果在该内部函数中使用 return,则视图始终返回“200 OK”,直到引发异常。下面是一个示例代码 -

class BranchViewSet(BaseViewSet):
    serializer_class = BranchSerializer

    def create(self, request, *args, **kwargs):
        branch = super().create(request, *args, **kwargs)
        createBranchAdmin(branch.data)
        response = Response(branch.data, status=status.HTTP_201_CREATED)
        return response


def createBranchAdmin(data):
    schema = Branch.objects.filter(BranchId=data['BranchId'])[0]
    name = schema.contactPerson
    phone = schema.phoneNumber
    existingUser = User.objects.filter(phone=phone)

    if existingUser:
        response = Response("User Already Exists!", status=status.HTTP_400_BAD_REQUEST)
        return response

如果用户已经存在,我想将此 400 错误发送给用户,但我得到 201,即使用户存在。如何从这里直接将此响应发送给用户?

编辑 - 我理解@iceagebaby 所传达的观点。但这是一个简单的场景,我已经提出了。有时一个函数中有多个返回点,每个返回点都携带不同的消息和错误。因此,返回 None 无济于事。如果我为每个创建一个新的返回变量并在原始视图中检查它,在这种情况下,视图会变得非常混乱,并且编写新函数没有任何好处。

标签: pythondjangodjango-rest-framework

解决方案


您没有返回 createBranchAdmin 的值,因此当您返回响应时,它始终来自 response = Response(branch.data, status=status.HTTP_201_CREATED)

您应该将 createBranchAdmin 的返回值设置为一个变量(如果没有用户则返回 None 或者如果有则返回 400 响应)然后检查 createBranchAdmin 的返回是否为 None 并相应地返回,或者您可以抛出一个错误并调用该函数在 try catch 块中并返回正确的响应(尽管我很确定这有点慢)。

即尝试这样的事情

class BranchViewSet(BaseViewSet):
    serializer_class = BranchSerializer

    def create(self, request, *args, **kwargs):
        branch = super().create(request, *args, **kwargs)
        ret = createBranchAdmin(branch.data)
        if ret is not None: return ret
        response = Response(branch.data, status=status.HTTP_201_CREATED)
        return response


def createBranchAdmin(data):
    schema = Branch.objects.filter(BranchId=data['BranchId'])[0]
    name = schema.contactPerson
    phone = schema.phoneNumber
    existingUser = User.objects.filter(phone=phone)

    if existingUser:
        response = Response("User Already Exists!", status=status.HTTP_400_BAD_REQUEST)
        return response
    return None

推荐阅读