이번 내용은 chatGPT의 도움을 좀 받았다. 이제 어지간한 내용은 구글 검색보다 chatGPT에게 물어보는게 더 빠르다. 공유를 위해 블로그에 글 쓰는게 의미가 있나 싶기도 하고.
Django에서 API마다 리턴값을 정의해 주고 있었다. 그런데 API가 많아지니 리턴하는 부분도동일한 소스 코드가 난무하게 된다. 이를 함수 하나로 만들어 처리하도록 만들었다.
RestAPI에 파라메터를 serializer로 검사하고 결과값을 리턴하는 로직이다. 에러의 종류로는 호출이 성공일 때 200, 생성 시 201, 파라메터가 유효하지 않을때 400, 그 밖에 500 이다.
#기존 소스
#Test/app/views.py
from rest_framework.views import APIView
from rest_framework import status
from bson import json_util
import json
from django.http import HttpResponse
class SomeView(APIView):
def get(self, request):
try:
serializer = SomeSerializer()
if serializer.is_valid():
#logic
...
return HttpResponse(json.dumps({'status': 'S', 'data': result}, default=json_util.default, ensure_ascii=False), status=status.HTTP_200_OK)
return HttpResponse(json.dumps({'status': 'F', 'data': 'Bad Request'}, default=json_util.default, ensure_ascii=False), status=status.HTTP_400_BAD_REQUEST)
except:
return HttpResponse(json.dumps({'status': 'F'}, default=json_util.default, ensure_ascii=False), status=status.HTTP_500_INTERNAL_SERVER_ERROR)
#변경 소스
#Test/utils.py
from rest_framework import status
from bson import json_util
import json
from django.http import HttpResponse
def generateHttpResponse(statusCode, data=None):
if statusCode == 200:
statusResult = 'S'
elif statusCode == 201:
statusResult = 'S'
elif statusCode == 400:
statusResult = 'F'
data = 'Bad Request'
else:
statusResult = 'F'
data = 'Internal Server Error'
return HttpResponse(
json.dumps(
{
'status': statusResult,
'data': data
},
default=json_util.default,
ensure_ascii=False),
status=statusCode
#Test/app/views.py
from rest_framework.views import APIView
from Test.utils import generateHttpResponse
class SomeView(APIView):
def get(self, request):
try:
serializer = SomeSerializer()
if serializer.is_valid():
#logic
...
return generateHttpResponse(200, result)
return generateHttpResponse(400)
except:
return generateHttpResponse(500)