python - 直接从 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 无济于事。如果我为每个创建一个新的返回变量并在原始视图中检查它,在这种情况下,视图会变得非常混乱,并且编写新函数没有任何好处。
解决方案
您没有返回 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
推荐阅读
- java - 为项目设置工作目录
- php - Symfony 将带有子实体的实体序列化为 XML
- sql-server - C# double.Epsilon 和 float.Epsilon 是否有 SQL Server 等效项?
- azure-devops - VSTS - 当发布到以前的环境失败时,我如何阻止发布?
- ruby-on-rails - 单个模型在 Rails 中读取和写入多个表
- matlab - 我正在使用 MATLAB HDL 编码器来转换 matlab 编码器,目前有一些错误
- css - CSS 样式表在一个位置工作,但不在另一个位置
- html - 使用引导程序的 glyhicons 时如何修复“空按钮”Web 可访问性错误
- apache - Apache Geode 调试未知 pdx 类型=2140705
- sphinx - 如何通过 Sphinx 正确搜索数字?