DRF возвращает JsonResponse из другой функции
Я пытаюсь вернуть JsonResponse
из другой функции, но получаю следующую ошибку от DRF:
AssertionError: Ожидалось, что в представлении будет возвращено
Response
,HttpResponse
илиHttpStreamingResponse
будет возвращено из представления, но получено<class 'NoneType'>
Вот мой код
class SignedURL(GenericViewSet):
queryset = fileUpload.objects.all()
serializer_class = fileUploadSerializer
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
function1(request)
function2(request)
function3(request) <-- must quit here if this function has an error and return the JSONresponse of this function.
function4(request)
def function1(request):
return JsonResponse(
{
"message": "Pass",
},
status=status.HTTP_400_BAD_REQUEST,
Как я могу вернуть JsonResponse
из другой функции, не записывая return JsonResponse в самой def create
?
Дальнейшее разъяснение:
У меня есть десять разных functions
с десятью разными JsonResponse
.
т.е. function2
, function3
...function10
. Если, например, function 4
потерпит неудачу, я хотел бы вернуть JsonResponse
сразу из этой функции и не продолжать работу с другими функциями после function 4
в рамках вызова create.
Ваш function1
в настоящее время return
получает только JsonResponse без какой-либо проверки ошибок. Это приведет к остановке скрипта и отказу от дальнейшего выполнения кода.
Он не будет переходить к другим вызовам функций внутри метода create
.
Ваш код в его текущем состоянии должен иметь эффект, который вы ищете. Вы импортировали JsonResponse
?
В целом, это звучит немного неортодоксально, что вы пытаетесь реализовать. В любом случае, вы можете перехватить ответ всех функций и вернуть его из метода create
.
Но в любом случае, вам нужна некоторая обработка ошибок, либо внутри вашей функции (скорее всего, поскольку вы хотите вернуть JSONResponse
), либо в методе create
(например, используя try
/except
), что, кажется, не близко к тому, чего вы хотите достичь, поскольку у вас не будет ничего возвращаться из каждой функции, которая не работает (если только вы не обрабатываете исключения в КАЖДОЙ функции)
Так что может быть что-то вроде:
class SignedURL(GenericViewSet):
queryset = fileUpload.objects.all()
serializer_class = fileUploadSerializer
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
result1, is_success1 = function1(request)
if is_success1 is False:
# Quit here if this function has an error and return the JSONresponse of this function
return result1
# similar checks below
result2, is_success2 = function2(request)
result3, is_success3 = function3(request)
...
И
def function1(request):
try:
return 1 / 0, True
except:
return JsonResponse(
{
"message": "ERROR HAPPENED!"
},
status=status.HTTP_400_BAD_REQUEST
), False