[Django] App 생성 및 URL과 View

jaylight·2020년 11월 25일
0

App

App 생성

프로젝트 내에서 특정 서비스를 담당할 App을 만들어서 별도로 관리한다. App은 기존의 프로젝트 디렉터리에서 아래와 같은 명령어를 통해 생성한다.

django-admin startapp "App 이름"

위의 명령어로 기존 디렉터리 내에 지정한 App 이름으로 새로운 디렉터리가 생성되며, 디렉터리 내에 App과 관련한 .py파일들이 자동 생성된다. (본 예시에서는 App 이름으로 polls를 사용)

Project에 App 등록하기

프로젝트 디렉터리 내에서 명령어를 통해 생성된 App은 해당 프로젝트 디렉터리에 폴더로 생성되지만, 자동으로 프로젝트에 등록되지는 않는다.

따라서 현재 상태에서 URL(http://localhost:8000/polls)을 통해 App을 실행하면 아래와 같이 요청한 페이지를 찾을 수 없다는 오류 (Page not found (404))가 발생한다.

404: HTTP 오류 코드 중 하나로, 웹브라우저가 요청한 페이지를 찾을 수 없을 경우에 발생하는 오류

장고는 발생한 오류에 대해 원인을 자세하게 표시해주는데 위에서 config.urls에서 polls/에 해당하는 URL 매핑 정보를 찾을 수 없다고 표시된다. 따라서 config.urls.py 파일에 polls App으로 연결할 수 있는 URL 매핑정보를 추가해야 한다.

urls.py: 페이지 요청이 발생하면 가장 먼저 호출되는 파일로, URL과 View 함수 간 매핑을 정의

urls.py 파일에 매핑정보를 추가하기 위해 다음과 같이 수정한다.

from django.contrib import admin
from django.urls import path
from polls import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('polls/', views.index),
]

위의 명령은 polls/ URL 요청에 대해 views.index(즉, polls -views(뷰)의 index 함수) 를 호출하도록 매핑을 추가했다. 따라서 pollsviews.py에 아래와 같이 index 함수를 생성해주어야 한다.

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

HttpResponse: HTTP 요청에 응답할 때 사용하는 장고 함수

또한 주의해야할 점은 urls.py에서 URL을 매핑할 때, polls/로 슬래시를 붙여주었는데, 이는 URL을 정규화하는 장고의 기능 때문으로 특별한 경우가 아니라면 URL 매핑 시 항상 끝에 슬래시를 붙여주는 것으로 한다.

위의 작업을 마친 뒤, 다시 URL을 불러오면 아래 그림과 같이 표시된다.

장고의 흐름
1. 웹브라우저에서 로컬서버로 URL(http://localhost:8000/pybo)를 요청
2. 장고의 urls.py에서 사전에 정의된 매핑에 따라 URL을 해석하여 App의 views.py 파일의 index 함수를 호출
3. 함수 실행 결과를 웹브라우저에 전달

URL 분리

위의 경우에서는 polls라는 경로를 통해 index 함수가 직접 연결되었다. 하지만 polls App 내에 여러 내용이 추가되는 경우 프로젝트의 urls.py에서 매번 함수를 연결하기보다 pollsurls.py를 추가적으로 생성하여 해당 파일로 연결 후, URL에 따라 다시 매핑 되도록 구조를 정의하는 것이 바람직하다.

[mysite/config/urls.py]

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('polls/', include('polls.urls')),
]

[mysite/polls/urls.py]

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index),
]

위와 같이 수정한다면, 기존 URL(http://localhost:8000/pybo)에 동일하게 접속할 경우, 뒤에서는 polls/urls.py를 한단계 더 거치지만 결과적으로 동일한 화면이 표시된다.

0개의 댓글