Django의 View, Url 기본

최동혁·2022년 12월 6일
0

Django

목록 보기
4/11

Django의 View, Url 기본

View

1개의 HTTP 요청에 대해 → 1개의 뷰가 호출

urls.py/urlpatterns 리스트에 매핑된 호출 가능한 객체

함수도 "호출 가능한 객체" 중의 하나

웹 클라이언트로부터의 HTTP 요청을 처리

크게 2가지 형태의 뷰

함수 기반 뷰 (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에 맞게 변환된 값이 인자로 전달

예시

# urls.py
urlpatterns = [
	path('<int:pk>/', views.post_detail),
]

# views.py
def post_detail(request, pk):
	pass

View 호출에 대한 리턴값

HttpResponse 객체

필히 HttpResponse 객체를 리턴해야 한다.

장고 Middleware에서는 뷰에서 HttpResponse 객체를 리턴하기를 기대한다. → 다른 타입을 리턴하면 Middleware에서 처리 오류.

django.shortcuts.render 함수는 템플릿 응답을 위한 shortcut 함수

파일 like 객체 혹은 str/bytes 타입의 응답 지원

str 문자열을 직접 utf8로 인코딩할 필요가 없다.

장고 디폴트 설정에서 str 문자열을 utf8로 인코딩해준다.

response = HttpResponse(파일 like 객체 또는 str 객체 또는 bytes 객체)

파일 like 객체

response.write(str 객체 또는 bytes 객체)

예시

def post_list(request):
	qs = Post.objects.all()
	q = request.GET.get('q', '')
	if q:
		qs = qs.filter(message__icontains=q)

	return render(request, 'instagram/post_list.html', {
		'post_list' : qs,
		'q': q,
	})

def post_detail(request, pk):
	response = HttpResponse()
	response.write("Hello World")
	return response

FBV의 예

Item 목록 보기

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

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

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

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

CBV의 예

Item 목록 보기

예시 1

#views.py
from django.views.generic import ListView
from shop.models import Item

item_list = ListView.as_view(model=Item)

#urls.py
from django.urls import path

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

예시 2

#views.py
from django.views.generic import ListView
from shop.models import Item

class ItemListView(ListView):
	model = Item

item_list = ItemListView.as_view()

#urls.py
from django.urls import path

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

URL Dispatcher

"특정 URL 패턴 → View"의 List

프로젝트/settings.py에서 최상위 URLConf 모듈을 지정

최초의 urlpatterns로부터 include를 통해, TREE구조로 확장

HTTP 요청이 들어올 때마다, 등록된 urlpatterns 상의 매핑 리스트를 처음부터 순차적으로 훝으며 URL 매칭을 시도

매칭이 되는 URL Rule이 다수 존재하더라도, 처음 Rule만을 사용

매칭되는 URL Rule이 없을 경우, 404 Page Not Found 응답을 발생

urlpatterns 예시

# shop/urls.py

from django.urls import path, re_path
from shop import views
urlpatterns = [
	path('', views.item_list, name='item_list'), # Item 목록
	path('new/', views.item_new, name='item_new'), # 새 Item

	path('<int:id>/', views.item_detail, name='item_detail'), # Item 보기
	re_path(r'^(?P<id>\d+)/$', views.item_detail, name='item_detail'), # 혹은 re_path 활용

	path('<int:id>/edit/', views.item_edit, name='item_edit'), # Item 수정
	path('<int:id>/delete/', views.item_delete, name='item_delete'), # Item 삭제

	path('<int:id>/reviews/', views.review_list, name='review_list'), # 리뷰 목록
	path('<int:item_id>/reviews/<int:id>/edit/$', views.review_edit, # 리뷰 수정
	name='review_edit'),
	path('<int:item_id>/reviews/<int:id>/delete/$', views.review_delete, # 리뷰 삭제
	name='review_delete'),
]

새로운 장고 앱을 생성할 때, 추천 작업

앱 내 urls.py를 생성하고 등록

1. 앱 생성

2. 앱 이름/urls.py 파일 생성

3. 프로젝트/urls.py에 include 적용

4. 프로젝트/settings.py의 INSTALLED_APPS에 앱 이름 등록

# 앱/urls.py
from django.urls import path
from 앱이름 import views

app_name = '앱이름'

urlpatterns = [
]

# 프로젝트/urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
	path('admin/', admin.site.urls),
	path('앱이름/', include('앱이름.urls')),
]
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글