이번 포스팅에서는 장고의 기본 요소 중 하나인 URL과 View에 대하여 공부를 해보고자 한다.
앱(App)
전 포스팅에서 생성한 프로젝트는 단독으로 아무 일도 할 수 없다.
프로젝트에 기능을 추가하기 위해서는 앱(App)을 생성해야 한다.
django-admin의 startapp 명령을 이용하여 앱을 생성한다.
(mysite) C:\projects\mysite> django-admin startapp pybo
(mysite) C:\projects\mysite>
명령을 실행하면 아무런 메시지 없이 종료되지만 앱 관련한 파일과 디렉터리가 생성된다.
디렉터리가 생성되고 그 하위에 여러 파일들이 생성된다.
장고 프로그램 만들기
브라우저에서 http://localhost:8000/pybo 페이지를 요청했을 때 "안녕하세요 pybo에 오신 것을 환영합니다."라는 문자열을 출력하도록 만들기
로컬 서버를 구동한다.
(mysite) C:\projects\mysite> python manage.py runserver
브라우저에서 http://localhost:8000/pybo 페이지를 요청한다.
"Page not found (404)" 라는 오류가 발생한다.
404 오류는 브라우저가 요청한 페이지를 찾을 수 없을 경우에 발생한다.
장고는 오류가 발생하면 오류의 원인을 화면에 자세히 보여주기 때문에 오류를 파악하기 쉽다.
config/urls.py 파일에 요청한 pybo/ URL에 해당되는 매핑이 없어서 오류가 발생했다.
장고의 urls.py 파일은 페이지 요청이 발생하면 가장 먼저 호출되는 파일로 URL과 뷰 함수 간의 매핑을 정의한다.
view 함수는 views.py 파일에 정의된 함수를 말한다.
urls.py
URL 매핑을 추가하기 위해 config/urls.py 파일을 수정해야 한다.
[파일이름: projects/mysite/config/urls.py]
from django.contrib import admin
from django.urls import path
from pybo import views
urlpatterns = [
path('admin/', admin.site.urls),
path('pybo/', views.index),
]
'pybo/URL이 요청되면 views.index를 호출하라' 는 매핑을 urlpatterns에 추가하였다.
views.index는 views.py 파일의 index 함수를 의미한다.
urlpatterns에서 실제 URL은 http://localhost:8000/pybo 이지만 호스트명과 포트가 생략된 pybo/로 매핑해야 한다.
호스트(예:localhost)와 포트(예:8000)는 서버가 어떤 환경에서 실행되는지에 따라 변하기 때문이다.
pybo/ 를 pybo라고 하지 않고 뒤에 슬래시(/)를 하나 더 붙이면 브라우저 주소창에 http://localhost:8000/pybo 라고 입력해도 자동으로 http://localhost:8000/pybo/ 처럼 변환된다.
이렇게 되는 이유는 URL을 정규화하는 장고의 기능 때문이다.
특별한 경우가 아니라면 URL 매핑 시 항상 끝에 슬래시를 붙여 주는 것이 좋다.
views
다시 http://localhost:8000/pybo 페이지를 요청하면 "사이트에 연결할 수 없음" 이라는 오류가 화면에 표시된다.
오류의 원인은 URL 매핑에 추가한 view 함수 views.index가 없기 때문이므로 pybo/views.py 파일에 index 함수를 추가해야 한다.
[파일이름: projects/mysite/pybo/views.py]
from django.http import HttpResponse
def index(request):
return HttpResponse("안녕하세요 pybo에 오신것을 환영합니다.")
HttpResponse는 요청에 대한 응답을 할 때 사용한다.
지금은 "안녕하세요 pybo에 오신 것을 환영합니다." 라는 문자열을 브라우저에 출력하기 위해 사용되었다.
index 함수의 매개변수 request는 HTTP 요청 객체이다.
view 함수를 작성하고 다시 http://localhost:8000/pybo 페이지를 요청하면 다음과 같은 결과를 볼 수 있다.
장고 개발 흐름 정리
1. 브라우저에서 로컬 서버로 http://localhost:8000/pybo 페이지 요청
2. urls.py 파일에서 /pybo URL 매핑을 확인하여 views.py 파일의 index 함수 호출
3. 호출한 결과를 브라우저에 반영
URL 분리
pybo 앱에 관련한 것들은 pybo 앱 디렉터리 하위에 위치해야 한다.
현재 상태로는 pybo와 관련된 URL 매핑을 추가할 때마다 config/urls.py 파일을 수정해야 한다.
config의 urls.py 파일은 앱이 아닌 프로젝트 성격의 파일이므로 이곳에는 프로젝트 성격의 URL 매핑만 추가되어야 한다.
pybo 앱에서만 사용하는 URL 매핑을 config/urls.py 파일에 계속 추가하는 것은 좋은 방법이 아니다.
config/urls.py 파일을 다음처럼 수정한다.
[파일이름: projects/mysite/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/ URL에 대한 매핑을 path('pybo/', views.index) 에서 path('pybo/', include('pybo.urls'))로 수정했다.
path('pybo/', include('pybo.urls'))의 의미는 pybo/로 시작하는 페이지를 요청하면 이제 pybo/urls.py 파일의 매핑 정보를 읽어서 처리하라는 의미이다.
따라서 이제 pybo/question/create, pybo/answer/create 등의 pybo/로 시작하는 URL을 추가해야 할 때 config/urls.py 파일을 수정할 필요 없이 pybo/urls.py 파일만 수정하면 된다.
pybo/urls.py 파일을 생성하고 다음과 같이 작성한다.
[파일이름: projects/mysite/pybo/urls.py]
from django.urls import path
from . import views
urlpatterns = [
path('', views.index),
]
기존 config/urls.py 파일에 설정했던 내용과 별반 차이가 없지만 path('', views.index) 처럼 pybo/ 가 생략된 '' 이 사용되었다.
config/urls.py 파일에서 이미 pybo/로 시작하는 URL이 pybo/urls.py 파일과 먼저 매핑되었기 때문에 가능하다.
즉, pybo/ URL은 다음처럼 config/urls.py 파일에 매핑된 pybo/ 와 pybo/urls.py 파일에 매핑된 '' 이 더해져 pybo/가 된다.
config/urls.py | pybo/urls.py | 최종 URL | ||
'pybo/' | + | ' ' | + | 'pybo/' |
'pybo/' | + | 'question/create/' | + | 'pybo/question/create/' |
다시 http://localhost:8000/pybo 페이지를 요청하면, URL 분리 후에도 동일한 결과가 나타난다.
'Framework > Django' 카테고리의 다른 글
[Django] 장고(Django) 기본요소 - 장고 관리자(Admin) (0) | 2022.11.25 |
---|---|
[Django] 장고(Django) 기본요소 - 모델(Model) (4) | 2022.11.24 |
[Django] 장고(Django) 프로젝트 생성하기 (0) | 2022.11.23 |
[Django] 장고(Django) 개발 환경 준비하기 (0) | 2022.11.20 |
[Django] 장고(Django)란? (0) | 2022.11.19 |