프로그래밍

[Django] 장고 View 본문

Python/Django

[Django] 장고 View

시케 2023. 11. 27. 13:28
728x90
반응형

2023.11.27.월

장고 View

Django의 뷰는 애플리케이션의 "로직"을 처리한다

 

Django의 뷰(Views)는 웹 요청을 받아 처리하고 웹 응답을 반환한다

데이터베이스로부터 데이터를 가져오고 ( Model )

필요한 작업을 수행한 후 ( View )

데이터를 템플릿에 전달하여 렌더링한다 ( Template )

함수 기반 뷰(Function-Based Views, FBVs) VS 클래스 기반 뷰(Class-Based Views, CBVs) 

장고에서는 대략적으로 2가지 방법으로 뷰를 작성한다

  1. 함수 기반 뷰(Function-Based Views, FBVs)
  2. 클래스 기반 뷰(Class-Based Views, CBVs)

FBV는 비교적 간단하고 직관적이다

요청을 받아 작업을 수행하고 응답을 반환하는 Python 함수이다

# 함수 기반 뷰(Function-Based Views, FBVs)
from django.http import HttpResponse
def hello_world(request):
    return HttpResponse("Hello, World!")

 

CBV는 재사용 가능한 뷰 클래스로 작성하는 방식이다

CBV는 객체 목록 표시나 단일 객체의 상세 뷰와 같은 데이터 작업에 대한 공통 패턴을 캡슐화한다

비슷한 기능끼리 묶을 수 있어 응집도가 향상된다

# 클래스 기반 뷰(Class-Based Views, CBVs)
from django.views import View
from django.http import HttpResponse

class HelloWorldView(View):
    def get(self, request):
        return HttpResponse("Hello, World!")

CBV에서는 메서드가 HTTP 동사와 대응한다

get(), post(), put(), delete() 등이 있다

CBV는 믹스인(mixins)과 제네릭 뷰(generic views)와 같은 재사용과 확장을 쉽게하기 위한 메커니즘도 제공한다

 

  함수 기반 뷰(FBVs) 클래스 기반 뷰(CBVs)
장점 - 간단하고 이해하기 쉬움
- 유연하며 복잡한 로직과 커스터마이징이 가능
- 적은 보일러플레이트 코드를 갖음
- 익숙한 Python 함수로 작성되어 진입 장벽이 낮음
- 코드 재사용성을 통한 개발 속도 향상
- 내장된 기능을 통한 간편한 구현
- 관심사를 분리하여 코드 유지보수성을 향상
단점 - 반복적인 코드 작성으로 인한 중복 코드 발생 가능성
- 코드 재사용성이 부족하여 유지보수에 불리
- 객체지향 프로그래밍의 이점을 활용할 수 없음
- 객체지향 기능의 제한으로 일부 복잡한 상황에서 코드 이해에 어려울 수 있음
- 학습 곡선이 높음
- 구문이 상대적으로 복잡하여 코드가 길어질 수 있음

뷰에서 HTTP 요청과 응답 처리하기

각 Django 뷰 함수는 최소한 하나의 매개변수를 가져야 한다

일반적으로 이 매개변수는 request이다

이 객체에는 현재 요청에 대한 메타데이터(사용자에 대한 세부 정보, HTTP 헤더, 메서드(GET, POST 등), 요청에 포함된 매개변수 등)가 포함된다

뷰는 HttpResponse 인스턴스 또는 그 하위 클래스를 반환해야 합니다. 

이 객체는 클라이언트로 보내는 HTTP 응답을 캡슐화한다

 

from django.views import View
from django.http import HttpResponse

class HelloWorldView(View):
    def get(self, request): # 뷰 함수의 매개변수 request 
        return HttpResponse("Hello, World!") # HttpResponse 인스턴스 반환

 

HttpResponse 인스턴스를 생성하려면 

HTML로 클라이언트로 보낼 문자열 매개변수로 인스턴스를 생성하면 된다

URL 패턴 및 URL 라우팅 작업

URL과 해당 URL에 대해 호출되어야 하는 뷰 함수 간의 매핑이 URLconf이다


Django의 URL 라우팅을 사용하면 URL을 뷰와 유연하게 매핑할 수 있다

URL 패턴은 "URLconfs"라고 불리는 Python 모듈에 정의된다

path 함수나 복잡하거나 기존의 URL 패턴에 대해서는 re_path 함수를 통해 뷰 함수와 매핑한다

# URLconf의 예시
from django.urls import path
from .views import HelloWorldView

urlpatterns = [
    path('hello/', HelloWorldView.as_view()),
]

 

# config/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('pybo/', include('pybo.urls')), 
]
# pybo/urls.py
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index),
    path('<int:question_id>/', views.detail, name='detail'), # URL 별칭 지정
]

위와 같이 url을 나누어서 맵핑할 수 있다

url을 나누어 맵핑할 시 pybo/urls만 바뀌면 해당 맵핑만 수정하기만 하면 된다

 

config/urls.py   pybo/urls.py   최종 URL
'pybo/' + '' = 'pybo/'
'pybo/' + 'question/create/' = 'pybo/question/create/'

Django의 내장 제네릭 뷰 사용하기

Django는 제네릭 클래스 기반 뷰를 지원한다

이러한 뷰들은 django.views.generic.View를 상속하며, 각각 특정한 기능을 제공한다

 

TemplateView : 주어진 템플릿을 렌더링
RedirectView : 다른 URL로 리디렉션을 제공
ListView : 객체 목록을 표시
DetailView : 단일 객체의 상세 뷰를 표시
CreateView, UpdateView, DeleteView : 객체를 생성, 업데이트, 삭제하기 위한 폼을 제공

 

중복 코드를 줄여주며 시간단축 또한 가능하다

# 제너릭 뷰 예시
from django.views.generic import ListView
from .models import Book

class BookListView(ListView):
    model = Book

 

 

728x90
반응형
Comments