ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 🤖 Django - 클래스형 뷰
    프로그래밍/Django & Flask 2020. 10. 24. 22:41
    반응형

     

    클래스형 뷰


     

    뷰는 요청을 받아서 응답을 반환해주는 호출 가능한 객체다. 장고에서는 뷰를 함수로도 작성할 수 있고 클래스로도 작성할 수 있다.

    함수형 뷰보다 클래스형 뷰가 장점이 많다. 클래스형 뷰를 사용하면 상속과 미스인 기능을 사용해서 코드를 재사용할 수 있고, 뷰를 체계적으로 구성할 수도 있다. 

     

    1) 클래스형 뷰의 시작점

    클래스형 뷰를 사용하기 위해서는 URLconf에서 클래스형 뷰를 사용한다고 선언해야 한다.

    #urls.py
    from django.conf.urls import patterns
    from myapp.views import MyView
    
    urlpatterns = patterns('',
    	(r'^about/', MyView.as_view()),
    )

     

    장고의 URL 해석기는 요청과 관련된 파라미터들을 함수에 전달하기 때문에, 클래스형 뷰는 클래스로 진입하기 위한 as_view() 클래스 메소드를 제공한다. 이 메소드를 진입 메소드라고 부르기도 한다.

     

    as_view() 진입 메소드의 역할은 클래스의 인스턴스를 생성하고, 그 인스턴스의 dispatch() 메소드를 호출한다. dispatch 메소드는 요청을 검사해서 GET, POST 등 어떤 HTTP 메소드로 요청되었는지를 알아낸 다음, 인스턴스 내에서 해당 이름을 갖는 메소드로 요청을 중계해준다. 만일 해당 메소드가 정의되어 있지 않으면 HttpResponseNotAllowed 익셉션을 발생시킨다.

     

    # Myview 정의
    # views.py
    
    from django.http import HttpResponse
    from django.views.generic import View
    
    class MyView(View):
    	def get(self, request):
    		# 뷰 로직 작성
        	return HttpResponse('result')

    MyView 클래스는 View클래스를 상속받고 있으며, View 클래스에는 as_view() 메소드와 dispatch 메소드가 정의되어 있다. 

     

    2) 클래스형 뷰의 장점 - 효율적인 메소드 구분

    클래스형 뷰는 함수형 뷰에 비해서 다음과 같은 장점을 보유하고 있다

     

    - get, post 등이 http 메소드에 따른 처리 기능을 코딩할 때, if 함수를 사용하지 않고 메소드명으로 구분할 수 있으므로 코드의 구조가 깔끔해진다.

    - 다중 상속과 같은 객체 지향 기술이 가능하므로, 클래스형 지네릭 뷰 및 믹스인 클래스 등을 사용할 수 있고, 이는 코드의 재사용성이나 개발 생산성을 획기적으로 높여준다.

     

    함수형 뷰의 GET 메소드 처리 로직

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

    클래스형 뷰의 GET 메소드 처리 로직

    from django.http import HttpResponse
    from django.views.generic import View
    
    class MyView(View):
    	def get(self, request):
        	return HttpResponse('result')

     

    3) 클래스형 뷰의 장점 - 상속 기능 가능

    - 지네릭뷰?

    개발자의 단순 반복 작업을 덜어주는 기능. 뷰 개발 과정에서 공통적으로 사용할 수 있는 기능들을 추상화하고, 이를 장고에서 미리 만들어 기본적으로 제공해주는 클래스형 뷰. 

     

    클래스형 뷰를 작성할 때는 지네릭 뷰를 상속받아서 작성한다. 

    # urls.py
    from django.conf.urls import patterns
    from some_app.views import AboutView
    
    urlpattern = patterns('',
    	(r'^about/', AboutView.as_view()),
    )
    
    #------------------------------------------
    
    from django.views.generic import TemplateView
    
    class AboutView(TemplateView):
    	template_name = "about.html"
    from django.conf.urls import patterns
    from django.views.generic import TemplateView
    
    urlpatterns = patterns('',
    	(r'^about/', TemplateView.as_view(template_name="about.html")),
    )

    한 가지 유의할 점은 두 개의 예제에는 오버라이딩 기능이 포함되고 있다는 것이다.

     

    4) 클래스형 지네릭 뷰 

    장고에서 제공하는 지네릭 뷰는 다음과 같이 4가지로 분류할 수 있다.

    Base View 뷰 클래스를 생성하고, 다른 지네릭 뷰의 부모 클래스를 제공하는 기본 지네릭 뷰.
    Generic Display View 객체의 리스트를 보여주거나, 특정 객체의 상세 정보를 보여준다.
    Generic Edit View 폼을 통해 객체를 생성, 수정, 삭제하는 기능 제공
    Generic Date View 날짜 기반 객체의 년/월/일 페이지로 구분해서 보여준다.

     

     

     

    출처: 김석훈, Django로 배우는 쉽고 빠른 웹개발, 한빛미디어(2015)
    반응형

    댓글

Designed by Tistory.