2023. 4. 20. 22:39ㆍTIL/2023.4월
2023.04.20 목
이전 시간에는 view를 함수의 형태로 만들어주었습니다, if문을 이용하여 요청하는 method에 따라 출력하는 방법을 달리했습니다.
CBV는 클래스형 뷰 입니다, 함수형 뷰와 차이점은 어떤 것이 있을까요?
-재사용이 쉽습니다. <- 상속을 이용하여 쉽게 다른 곳에서 사용이 가능합니다
-관리가 용의합니다. <-method 명을 if문을 이용하여 관리하지 않아 좀 더 직관점입니다.
-제네릭을 이용할 수 있습니다(강의에서는 다루지 않을 예정이라고 합니다.) <-획기적으로 코드를 단축할 수 있습니다.
기존 사용하던 코드를 CBV형태로 바꾼다면 다음과 같습니다.
@api_view(['GET','POST'])
def articleAPI(request):
if request.method == 'GET':
articles = Articles.objects.all()
serializer = ArticlesSerializers(articles, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = ArticlesSerializers(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
print(serializer.errors)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
#CBV(클래스형 뷰)
from rest_framework.views import APIView #<-import 필요
class ArticleList(APIView):
def get(self, request, format=None):
articles = Articles.objects.all()
serializer = ArticlesSerializers(articles, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer = ArticlesSerializers(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
print(serializer.errors)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@api_view(['GET','PUT','DELETE'])
def articleDetailAPI(request, article_id):
if request.method == 'GET':
article = get_object_or_404(Articles, id=article_id)
serializer = ArticlesSerializers(article)
return Response(serializer.data)
elif request.method == 'PUT':
article = get_object_or_404(Articles, id=article_id)
serializer = ArticlesSerializers(article, data= request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
elif request.method == 'DELETE':
article = get_object_or_404(Articles, id=article_id)
article.delete()
return Response(status=status.HTTP_200_OK)
#CBV(클래스형 뷰)
class ArticleDetail(APIView):
def get(self, request, article_id, format=None):
article = get_object_or_404(Articles, id=article_id)
serializer = ArticlesSerializers(article)
return Response(serializer.data)
def put(self, request, article_id, format=None):
article = get_object_or_404(Articles, id=article_id)
serializer = ArticlesSerializers(article, data= request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, article_id, format=None):
article = get_object_or_404(Articles, id=article_id)
article.delete()
return Response(status=status.HTTP_200_OK)
코드가 크게 달라진 것은 없습니다, 메서드를 http메서드로 사용하는 것 빼고는 크게 달라진 것은 없습니다.
단, 함수형 뷰일 때 구현이 어려웠던 부분을 클래스형 뷰에서는 좀 더 쉽게 구현할 수 있습니다,
또한 제네릭을 이용한다면 위의 저 긴 코드를 이렇게 줄일 수 있습니다.
class SnippetList(generics.ListCreateAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Snippet.objects.all()
serializer_class = SnippetSerializer
(공식문서를 통해 좀 더 쉽게 알 수 있습니다)
3 - Class based views - Django REST framework
We can also write our API views using class-based views, rather than function based views. As we'll see this is a powerful pattern that allows us to reuse common functionality, and helps us keep our code DRY. We'll start by rewriting the root view as a cla
www.django-rest-framework.org
swagger
django flamework가 API를 생성해주는 역할을 했다면 swagger는 API서버를 문서형태로 만들어주는 역할을 합니다.
기존의 모습
swagger 적용
문서의 형태로만 출력됩니다, 서버에서 값을 넣고 수정하고 삭제하기 위해서는 준비가 필요합니다.
articles/views.py/
from drf_yasg.utils import swagger_auto_schema
사용방법
데코레이터를 사용하여 사용합니다(POST, article 생성을 해보겠습니다)
class ArticleList(APIView):
def get(self, request, format=None):
articles = Articles.objects.all()
serializer = ArticlesSerializers(articles, many=True)
return Response(serializer.data)
@swagger_auto_schema(request_body=ArticlesSerializers)
def post(self, request, format=None):
serializer = ArticlesSerializers(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
print(serializer.errors)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
적용 후 swagger
swagger를 사용하기 전에는 서버에서 POST기능을 테스트 하기 위해서 조금 귀찮은 과정을 거쳤습니다.
{
"title":"첫 게시글",
"content":"첫 게시글 작성"
}
오타가 발생하거나 필드의 속성에 맞지 않다면 다시 기능을 테스트하기 위해 저것을 적어주어야 했습니다, 필드가 많다면, 일일이 적어주는 것도 필드명을 하나하나 확인하는 것도 매우 번거로운 일입니다.
이것을 보완하고자 swagger을 사용하는 것입니다.
swagger 튜토리얼
https://drf-yasg.readthedocs.io/en/stable/readme.html
drf-yasg - Yet another Swagger generator — drf-yasg 1.20.1 documentation
Since the schema does not usually change during the lifetime of the django process, there is out of the box support for caching the schema view in-memory, with some sane defaults: caching is enabled by the cache_page decorator, using the default Django cac
drf-yasg.readthedocs.io
느낀점
어제, 오늘 TIL이 성의가 없습니다, 뭔가 쓰고 싶은 건 많고 잘 정리하고 싶지만, 배워야 할 것이 많아 TIL에 시간을 덜 쓰고 있습니다.
미래의 제가 잘 정리해서 글 쓸 것이라 믿으며! 마저 강의 들으러 가야겠습니다!
'TIL > 2023.4월' 카테고리의 다른 글
TIL onclick () (0) | 2023.04.24 |
---|---|
TIL CORS (0) | 2023.04.21 |
TIL django 심화 DRF 프레임워크! (0) | 2023.04.19 |
TIL 장고 심화과정 mypy, Black, Django Ninja (0) | 2023.04.18 |
TIL 또 알고리즘 직사각형 넓이 구하기 (0) | 2023.04.13 |