프로젝트 내에서 특정 서비스를 담당할 App을 만들어서 별도로 관리한다. App은 기존의 프로젝트 디렉터리에서 아래와 같은 명령어를 통해 생성한다.
django-admin startapp "App 이름"
위의 명령어로 기존 디렉터리 내에 지정한 App 이름
으로 새로운 디렉터리가 생성되며, 디렉터리 내에 App과 관련한 .py
파일들이 자동 생성된다. (본 예시에서는 App 이름
으로 polls
를 사용)
프로젝트 디렉터리 내에서 명령어를 통해 생성된 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
함수) 를 호출하도록 매핑을 추가했다. 따라서 polls
의 views.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. 함수 실행 결과를 웹브라우저에 전달
위의 경우에서는 polls
라는 경로를 통해 index
함수가 직접 연결되었다. 하지만 polls
App 내에 여러 내용이 추가되는 경우 프로젝트의 urls.py
에서 매번 함수를 연결하기보다 polls
의 urls.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
를 한단계 더 거치지만 결과적으로 동일한 화면이 표시된다.