Django REST Framework/DRF 일반

[DRF] FBV, APIView의 예시

bluebamus 2024. 1. 25.

1. FBV 정리 및 예시

# urls.py
    
from django.urls import path, include
from . import views
    
urlpatterns = [
	# FBV
	path('cbv/post/', views.post_list),
	path('cbv/post/<int:pk>/',views.post_detail),
]
# views.py

from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Post
from .serializers import PostSerializer
from rest_framework.decorators import api_view

@api_view(['GET','POST'])
def post_list(request):
	if request.method == 'GET':
		qs = Post.objects.all()
		serializer = PostSerializer(qs, many=True)
		return Response(serializer.data)
	else:
		serializer = PostSerializer(data=request.data)
		if serializer.is_valid():
			serializer.save()
			return Response(serializer.data, status=201)
		return Response(serializer.errors, status=400)

@api_view(['GET','PUT','DELETE'])
def post_detail(request, pk):
	post = get_object_or_404(Post, pk=pk)
	if request.method == 'GET':
		serializer = PostSerializer(post)
		return Response(serializer.data)
	elif request.method == 'PUT':
	serializer = PostSerializer(post, data=reqeust.data)
		if serializer.is_valid():
			serializer.save()
			return Response(serializer.data)
		return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
	else:
		post.delete()
		return Response(status=status.HTTP_204_NO_CONTENT)

 

2. APIView 정리 및 예시

   1) APIView

from django.urls import path, include
from . import views

urlpatterns = [
    # FBV
    path('post/', views.PostListAPIView.as_view()),
    path('post/<int:pk>/',views.PostDetailAPIView.as_view()),
]
# views.py

from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Post
from .serializers import PostSerializer

# 포스팅 목록 및 새 포스팅 작성
class PostListAPIView(APIView):
    def get(self, request):
        serializer = PostSerializer(Post.objects.all(), many=True)
    def post(self, request):
        serializer = PostSerializer(data=request.data)
        if serializer.is_valid():
          	serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)  
      
from django.shortcuts import get_object_or_404

# 포스팅 내용, 수정, 삭제
class PostDetailAPIView(APIView):
    def get_object(self, pk):
        return get_object_or_404(Post, pk=pk)
      
    def get(self, request, pk, format=None):
        post = self.get_object(pk)
        serializer = PostSerializer(post)
        return Response(serializer.data)
    
    def put(self, request, pk):
      	post = self.get_object(pk)
        serializer = PostSerializer(post, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
      
    def delete(self, request, pk):
        post = self.get_object(pk)
        post.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

 

 - reference : 

https://velog.io/@jcinsh/DRF-function-based-view

 

DRF 2 - Function-based view, Request, Response (News api 2편)

본 사례에서는 article 정보를 CRUD하는 함수형 뷰를 작성하려고 한다.엔드포인트는 인자로 article 객체에 대한 pk 정보가 필요한가, 필요하지 않은가로 판단해 2가지로 만들고자 한다. 이 때 pk 정보

velog.io

https://ssungkang.tistory.com/entry/Django-APIView-Mixins-generics-APIView-ViewSet%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90?category=366160

 

[Django] APIView, Mixins, generics APIView, ViewSet을 알아보자

django 에서는 view 를 통해서 HTTP 요청을 처리합니다. view에서 이를 처리하는 방법은 다양합니다. FBV(함수기반뷰), CBV(클래스기반뷰) 를 통해서도 API 를 만들 수 있지만 rest_framework 는 보다 쉽게, 효

ssungkang.tistory.com

https://velog.io/@yvvyoon/django-rest-framework-1

 

Django REST Framework 뽀개기 1

글을 작성하지는 않았지만 Django REST Framework(DRF) 공식 문서의 튜토리얼을 따라서 간단한 ModelSerializer를 사용하여 API를 구축해보았다. 단순 JSON 데이터를 입력, 출력하는 것을 넘어 이번에는 DRF의

velog.io

 

댓글