从嵌套函数“Django REST framework”传递响应
To pass the Response from the nested function `Django REST framework`
我正在使用 python django 和 Django REST framework
可以return这样对浏览器的响应,在views.py
from rest_framework.response import Response
@api_view(['GET'])
def get_by(request):
res = {"test":"answer"}
return Response(res)
我想将 Response 传递给嵌套函数所在的浏览器
from rest_framework.response import Response
@api_view(['GET'])
def get_by(request):
x(t)
def x():
#error happens here!!
res = {"error":"error happens!!"}
return Response(res)
在这种情况下,很简单,我可以return第一个函数的错误,第一个函数可以return错误的响应。
但是当你有三四五嵌套函数时?
最佳做法是什么?
最好使用序列化程序或服务并对其进行一些验证。
https://www.django-rest-framework.org/api-guide/serializers/#validation
另一方面,您可以开发一些自定义的 APIExcepetion 并引发它们。
https://www.django-rest-framework.org/api-guide/exceptions/#api-reference
如前一个答案所述,您可以在函数内部使用自定义 APIException
来中途停止 api 处理程序。如果你不希望它像系统错误一样return,你可以像下面的例子一样设置响应状态代码:
from rest_framework.exceptions import APIException
from rest_framework import status
class OkException(APIException):
status_code = status.HTTP_200_OK
default_detail = "error happens!!"
default_code = "error_happens"
然后您可以像普通异常一样在函数内部引发它
raise OkException()
我正在使用 python django 和 Django REST framework
可以return这样对浏览器的响应,在views.py
from rest_framework.response import Response
@api_view(['GET'])
def get_by(request):
res = {"test":"answer"}
return Response(res)
我想将 Response 传递给嵌套函数所在的浏览器
from rest_framework.response import Response
@api_view(['GET'])
def get_by(request):
x(t)
def x():
#error happens here!!
res = {"error":"error happens!!"}
return Response(res)
在这种情况下,很简单,我可以return第一个函数的错误,第一个函数可以return错误的响应。
但是当你有三四五嵌套函数时?
最佳做法是什么?
最好使用序列化程序或服务并对其进行一些验证。
https://www.django-rest-framework.org/api-guide/serializers/#validation
另一方面,您可以开发一些自定义的 APIExcepetion 并引发它们。
https://www.django-rest-framework.org/api-guide/exceptions/#api-reference
如前一个答案所述,您可以在函数内部使用自定义 APIException
来中途停止 api 处理程序。如果你不希望它像系统错误一样return,你可以像下面的例子一样设置响应状态代码:
from rest_framework.exceptions import APIException
from rest_framework import status
class OkException(APIException):
status_code = status.HTTP_200_OK
default_detail = "error happens!!"
default_code = "error_happens"
然后您可以像普通异常一样在函数内部引发它
raise OkException()