티스토리 뷰
※본 자료는 김석훈, 『파이썬 웹 프로그래밍(개정판)』, 한빛미디어, pp151-218. 를 참고하여 만들었습니다.
5. 클래스형 뷰
뷰는 요청을 받아서 응답을 반환해주는 호출 가능한 객체입니다. 장고에서는 뷰를 함수로도 작성할 수 있고 클래스로도 작성 할 수 있습니다. 장고에서 뷰를 함수로도 작성할 수 있고 클래스로도 작성할 수 있습니다. 함수형 뷰보다 클래스형 뷰가 장점이 많습니다. 클래스형 뷰를 사용하면 상속과 믹스인 기능을 사용해서 코드를 재사용할 수 있고, 뷰를 체계적으로 구성할 수도 있습니다. 간단한 경우에는 함수형 뷰로 신속하게 개발하는 것도 하나의 방법이지만, 로직이 복잡해지고 프로젝트가 커질수록 클래스형 뷰의 장점이 효과를 발휘한다.
(1) 클래스형 뷰의 시작점
클래스형 뷰를 사용하기 위해서는 가장 먼저 URLConf에서 함수형 뷰가 아니라 클래스형 뷰를 사용한다는 점을 표시해줘야 합니다.
#urls.py
from django.urls import path
from myapp.views import MyView
urlpatterns=[
path('about/', MyView.as_view()),
]
장고의 URL해석기는 요청과 관련된 파라미터들을 클래스가 아니라 함수에 전달하기 때문에, 클래스형 뷰는 클래스로 진입하기 위한 as_view( ) (진입 메소드) 클래스 메소드를 제공한다. as_view( ) 진입 메소드의 역할은 클래스의 인스턴스를 생성하고, 그 인스턴스의 dispath( ) 메소드를 호출합니다. dispath( ) 메소드는 요청을 검사해서 GET, POST 등의 어떤HTTP 메소드로 요청되었는지를 알아낸 다음, 인스턴스 내에서 해당 이름을 갖는 메소드로 요청을 중계해줍니다. 만일 해당 메소드가 정의되어 있지 않으면 HttpResponseNotAllowed 익셉션을 발생시킵니다.
뷰 클래스는 다음과 같은 형태로 정의됩니다.
#views.py
from django.http import HttpResponse
from django.views.generic import View
class MyView(View): # View를 상속받는다.
def get(self, request):
#view logic
return HttpResponse('result')
MyView 클래스는 View 클래스를 상속받고 있으며 View 클래스에는 as_view( ) 메소드와 dispatch( ) 메소드가 정의되어 있습니다. 그래서 우리가 작성하는 MyView 클래스에서는 이 메소드들을 정의하지 않아도 사용 할 수 있습니다.
(2) 클래스 뷰의 장점
- GET, POST 등의 HTTP 메소드에 따른 처리 기능을 코딩할 때, if 함수를 사용하지 않고 메소드명으로 구분할 수 있으므로 코드의 구조가 깔끔해집니다.
- 다중 상속과 같은 객체 지향 기술이 가능하므로, 클래스형 제네릭 뷰 및 믹스인 클래스 등을 사용할 수 있고, 이는 코드의 재사용성이나 개발 생산성을 획기적으로 높여줍니다.
① 효율적인 메소드 구분
HTTP 메소드 즉, GET(read), POST(create), PUT(update), DELETE(delete), HEAD, OPTIONS, TRACE, CONNECT 요청을 수신한 후 클래스형 뷰에서는 어떻게 처리하는지, 그리고 함수형 뷰와 어떻게 다른지 비교해보겠습니다.
#function based view
#views.py
from django.http import HttpResponse
def my_view(request):
if request.method == 'GET':
#view logic
return HttpResponse('result')
elif request.method == 'POST':
#view logic
return HttpResponse('result')
#class based view
#views.py
from django.http import HttpResponse
from django.views.generic import View
class MyView(View):
def get(self, request):
#view logic
return HttpResponse('result')
def post(self, request):
#view logic
return HttpResponse('result')
함수형 뷰에서는 if문을 이용하여 method를 분류해야 하지만, 클래스형 뷰에서는 HTTP 메소드 이름으로 클래스 내에 메소드를 정의하면 됩니다. 단, 메소드명은 소문자로 해야 하므로 get( ), post( ), head( ) 등과 같이 이름을 지어주면 됩니다. 클래스형 뷰에는 내부적으로 dispatch( ) 메소드가 있기 때문에 dispatch( ) 메소드가 GET, POST 등의 어떤 HTTP 메소드로 요청을 중계해주므로 가능한 것입니다.
② 상속 기능 가능
상속 기능을 이해하려면 그 전에 제네릭 뷰에 대해 알고 있어야 합니다. 왜냐하면 우리가 작성하는 클래스형 뷰의 대부분은 장고가 제공해주는 제네릭 뷰를 상속받아 작성하기 때문입니다. 웹 애플리케이션을 개발하는 경우, 공통적으로 반복되는 과정들이 많이 발생합니다. 장고에서는 특히 모델, 뷰, 템플릿 개발과정에서의 이러한 단순 반복 작업을 많이 없애주었는데, 제네릭뷰가 바로 뷰 개발과정에서 개발자의 단순 반복 작업을 덜어주는 기능입니다. 즉 제네릭 뷰란, 뷰 개발 과정에서 공통적으로 사용할 수 있는 기능들을 추상화하고, 이를 장고에서 미리 만들어 기본적으로 제공해주는 클래스형 뷰를 말합니다.
# some_app/urls.py
from django.urls import path
from some_app.views import AboutView
urlpatterns = [
path('about/', AboutView.as_view()),
]
제네릭 뷰를 상속받아서 클래스형 뷰를 만들기 위하여 urlspatterns에 .as_view( )를 호출합니다.
#some_app/views.py
from django.views.generic import TemplateView
class AboutView(TemplateView):
template_name ="about.html"
/about/ 이라는 URL로 웹 요청이 들어오면, 단순하게 about.html 템플릿을 보여준다고 가정하고 코딩한 것입니다.
AboutView class는 장고가 제공해주는 TemplateView라는 제네릭 뷰를 상속받아 사용하고 있습니다. 요청 request 객체를 분석하고 템플릿 시스템에게 넘겨줄 컨텍스트 변수를 구성하는 것은 모두 TemplateView 제네릭 뷰에서 처리합니다. 우리는 간단하게 about.html 템플릿 파일을 사용하라고만 알려주면 됩니다.
#some_app/urls.py
from django.urls import path
from django.views.generic import TemplateView
urlpatterns=[
path('about/' TemplateView.as_view(template_name="about.html"))
]
단순하게 템플릿만 보여주는 간단한 작업이라면 views.py에 별도의 class를 작성하지 않고 위와 같이 처리할 수도 있습니다. Template View는 뷰에 특별한 로직이 없고, URL에 맞춰 해당 템플릿 파일의 내용만 보여줄 때 사용하는 제네릭 뷰입니다.
(3) 클래스형 제네릭 뷰
웹 프로그램 개발 시 공통적으로 사용할 수 있는 로직을 이미 개발해 놓고 기본 클래스로 제공하고 있기 때문에 이를 상속받아 사용하면 됩니다.장고에서는 이렇게 공통된 로직을 미리 개발해 놓고 제공하는 뷰를 제네릭 뷰라고 부릅니다.
장고에서 제공하는 제네릭 뷰는 다음과 같이 4가지로 분류할 수 있습니다.
- Base View : 뷰 클래스를 생성하고, 다른 제네릭 뷰의 부모 클래스를 제공하는 기본 제네릭 뷰입니다.
- Generic Display View : 객체의 리스트를 보여주거나, 특정 객체의 상세 정보를 보여줍니다.
- Generic Edit View : 폼을 통해 객체를 생성, 수정, 삭제하는 기능을 제공합니다.
- Generic Data View : 날짜 기반 객체의 연/월/일 페이지로 구분해서 보여줍니다.
https://docs.djangoproject.com/en/3.0/ref/class-based-views/
제네릭 뷰에 대한 자세한 내용은 위 링크를 참고하세요.
(4) 클래스형 뷰에서 폼 처리
폼을 처리하는 과정을 아래와 같이 3가지 경우로 구분하였습니다.
- 최초의 GET : 사용자에게 처음으로 폼(빈 폼 또는 초기 데이터를 채워진 폼)을 보여줌
- 유효한 데이터를 가진 POST : 데이터를 처리함, 주로 리다이렉트 처리됨
- 유효하지 않은 데이터를 가진 POST : 보통은 에러 메세지와 함께 폼이 다시 출력됨
from django.http import HttpResponseRedirect
from django.shortcuts improt render
from .forms import MyForm # Form class
def myview(request):
if request.method == "POST":
form = MyFrom(request.POST)
if form.is_valid():
#cleand_data로 관련 로직 처리
return HttpResponseRedirect('/sucess/')
else:
form = MyForm(initial={'key':'value'})
return render(request, 'form_template.html', {'form':form})
함수형 뷰로 폼을 처리하면 위와 같습니다.
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.views.generic import View
from .forms import MyForm
class MyFormView(View):
form_class = MyForm
initial = {'key':'value'}
template_name = 'form_template.html'
# 최초의 GET
def get(self, request, *args, **kwargs):
form = self.form_class(initial = self.initial)
return render(request, self.template_name, {'form' : form})
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
# cleaned_data로 관련 로직 처리
return HttpResponseRedirect('/success/') #유효한 데이터를 가진 POST
return render(request, self.template_name, {'form' : form}) #유효하지 않은 데이터를 가진 POST
클래스형 뷰에서는 HTTP의 GET 방식과 POST 방식을 클래스 내의 메소드로 구분하여 처리함으로써, 코드 구조가 깔끔해지고 읽기도 편해집니다.
View 제네릭 뷰가 아닌, 폼 처리용 제네릭 뷰인 FormView를 상속받아 처리하면 코드가 훨씬 간결해집니다.
from .form import Myform
from django.views.generic.edit import FormView
class MyFormView(FormView):
form_class = Myform
template_name = 'form_template.html'
success_url = '/thank/'
def form_valid(self, form):
#cleaned_data로 관련 로직 처리
return super(MyFormView, self).form_valid(form)
FormView 제네릭 뷰를 사용하면 FormView 클래스에 이미 정의되어 있기 때문에 클래스 내에 get( ), post( ) 메소드 정의도 불필요하게 됩니다. 개발자가 코딩할 내용이 더 단순해졌는데, 다음과 같은 4가지 사항을 유의하여 코딩해주면 됩니다.
- form_class : 사용자에 보여줄 폼을 정의한 forms.py 파일 내의 클래스명
- template_name : 폼을 포함하여 렌더링할 템플릿 파일 이름
- success_url : MyFormView 처리가 정상적으로 완료되었을 때 리다이렉트시킬 URL
- form_valid( ) 함수 : 유효한 폼 데이터로 처리할 로직 코딩, super( ) 함수를 사용하면, success_url로 지정된 URL로 리다이렉션 처리됨
'컴퓨터공학 및 코딩 > Django Tutorial' 카테고리의 다른 글
Django 핵심기능 - 6. 로그 남기기 (0) | 2020.04.14 |
---|---|
Django 핵심기능 - 4. 폼 처리하기 (0) | 2020.04.12 |
Django 핵심기능 - 3. 템플릿 시스템 (0) | 2020.04.11 |
Django 핵심기능 - 2. 장고 파이썬 쉘로 조작하기 (0) | 2020.04.09 |
Django 핵심 기능 - 1. Admin 사이트 꾸미기 (0) | 2020.04.09 |
- Total
- Today
- Yesterday
- 당신의 그림자가 울고 있다.
- 분석심리학
- 텍스트분류
- 그림자
- web
- word2vec
- Tutorial
- 로버트존슨
- WebProgramming
- lstm
- 자연어처리
- NLP
- 젠심
- 심리학
- Python
- django
- Skip-gram
- word embedding
- text classification
- 단어표현
- 융
- word vector
- 알고스팟
- 코딩테스트
- AI
- Polls
- Mikolov
- CBOW
- 인공지능
- 코딩하는 신학생
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |