django views 함수형 vs 클래스형 & 제네릭

eunji hwang·2020년 6월 6일
1

BACKEND-PYTHON-DJANGO

목록 보기
27/28

함수형 뷰

  • 신속한 개발이 가능하지만, 로직이 복잡해 진다.
  • if request.method=='GET'과 같은 조건을 달고 로직 구성
# 함수형뷰 예제
from django.http import HttpResponse

def my_view(request):
    if request.method == 'GET' :
        # 로직작성
        return HttpResponse('result')
        
    if request.method == 'POST' :
    	# 로직작성
        return HttpResponse('result')

클래스형 뷰

  • 상속과 믹스인 기능을 사용하여 코드 재사용이 용이
  • 뷰를 체계적으로 구성 할 수 있음
  • 제네릭뷰 역시 클래스형 뷰
  • urls.py에 .as_view() 메서드와 함께 사용
# 클래스형뷰 예제
from django.http import HttpResponse
from django.views import View

class MyView(View):
    def get(self, request):
        # 로직작성
        return HttpResponse('result')
    
    def post(self, request):
        # 로직작성
        return HttpResponse('result')
    
    def head(self, *args, **kwargs):
        # 로직구현
        return HttpResponse('')
        


.as_view(인자)

진입 메서드로 클래스의 인스턴스를 생성, 인스턴스는 dispatch() 메서드를 호출.
dispatch() 는 GET, POST 등 HTTP method를 구분하여 해당 인스턴스 내의 get, post등 메서드로 중계를 한다.
만약 해당 메서드가 구현되지 않았을 경우 HttpResponseNotAllowed 예외 발생

# urls.py

from django.urls import path

urlpatterns = [
   path('', MyView.as_view(인자), name='my_view'),
]

인자

as_view(여기에는 뭐가 들어갈까?) !
인자로 전해지는 것은 해당 뷰에게 전달될 인자가 된다!
만약 뷰 로직 구현하는데 필요한 것이 있다면 인자로 넘겨주도록 한다.

제네릭 뷰

장고에서 자주쓰는 뷰를 미리 만들어 제공, 제네릭 뷰라고 한다. 클래스 형으로 구현되어 있기 때문에 상속받아 사용한다.

  • View : 가장 기본 최상위 제네릭 뷰, 모든 제네릭뷰의 최상위
  • TemplateView : urls.py에 따라 템플릿이 주어지면 렌더링
  • RedirectView : url이 주어지면 해당 url로 이동시켜줌
  • ListView : 조건에 맞는 여러 객체를 보여줌
  • DetailView : 객체 하나에 대한 상세한 정보를 보여줌
  • FormView : 폼이 주어지면 해당 폼을 보여줌
  • CreateView : 객체를 생성하는 폼을 보여줌
  • UpdateView : 기존 객체를 수정하는 폼을 보여줌
  • DeleteView : 기존 객체를 삭제하는 폼을 보여줌
  • DateDetailView : 연월일, 기본키, 슬래그에 따른 특정객체 하나에 대한 상세정보 보여줌
  • ArchiveIndexView : 조건에 맞는 여러게의 객체들에 대한 날짜 정보 보여줌
  • YearArchiveView : 연도에 해당하는 객체들 보여줌
  • MonthArchiveView : 연, 월에 해당하는 객체들 보여줌
  • WeekArchiveView
  • DayArchiveView
  • TodayArchiveView

참고서적 파이썬 웹 프로그래밍 django로 배우는 쉽고 빠른 웹개발 김석훈 저

profile
TIL 기록 블로그 :: 문제가 있는 글엔 댓글 부탁드려요!

0개의 댓글