9.다양한 응답의 함수 기반 뷰

1 분 소요

View

1개의 HTTP 요청(Request)에 대해 -> 1개의 뷰가 호출(response)

  • urls.py/urlpatterns 리스트에 매핑된 호출 가능한 객체 (함수 또는 클래스로 구현)
  • View의 형태
    • 함수 기반 뷰 (Function Based View) : 장고 뷰의 기본
      • 호출 가능한 객체 (그 자체)
    • 클래스 기반 뷰 (Class Based View) :
      • 클래스.as_view()를 통해 호출 가능한 객체를 생성/리턴

View 호출시, 인자

HttpRequest 객체 및 URL Captured Values

  • 1번째 인자 : HttpRequest 객체
    • 현재 요청에 대한 모든 내역을 담고 있음
  • 2번째 ~ 인자 : 현재 요청의 URL로부터 capture된 문자열들
    • url/re_path를 통한 처리 -> str 타입으로 전달
    • path를 통한 처리 -> 매핑된 Converter의 to_python에 맞게 변환된 인자로 전달

# app/urls.py
from . import views
from django.urls import path

urlpatterns = [
    path('', views.post_list, name='post_list'),
    
    # 정수 패턴이 나오면 pk란 이름을 넘기고, post_detail을 호출하겠다는 의미
    path('<int:pk>/', views.post_detail), # <int:pk> 부분이 Converter
]

  • app/views.py의 post_detail 부분

# app/views.py

def post_detail(request: HttpRequest, pk: int) -> HttpResponse:
    return render(request, 'instagram/post_list.html', {})

View 호출에 대한 리턴

HttpResponse 객체

  • 반드시 HttpResponse 객체를 리턴해야함
    • django Middleware에서는 뷰에서 HttpResponse 객체를 리턴하길 기대함 -> 다른타입(None 포함)을 리턴하면 Middleware 오류 발생
  • django.shortcuts.render 함수는 템플릿 응답을 위한 shortcut 함수

  • 파일like 객체 혹은 str/bytes 타입의 응답 지원
    • str 문자열을 직접 utf8로 인코딩할 필요 없음
    • django default 설정에서 str 문자열을 utf8로 인코딩해줌
  • response = HttpResponse( 파일like객체, str객체, byte객체)

함수 기반 뷰 예시


# app/views.py
from django.shortcuts import render
from shop.models import Item

def item_list(requset):
    qs = Item.object.all()
    return render(request, 'shop/item_list.html', {
        'item_list' : qs,
    })

# app/urls.py
from django.urls import path

urlpatterns = [
    path('items/', item_list, name='item_list'),
]

댓글남기기