02-1 주소와 화면을 연결하는 URL과 뷰
1장에서 mysite 프로젝트를 생성했고,
이 프로젝트에는 장고가 제공하는 기본 앱과 개발자가 직접 만든 앱이 포함될 수 있다.
앱 생성하고 확인하기
01단계 pybo 앱 생성하기
명령프롬프트에서 django-admin의 startapp 명령을 이용해서 pybo앱을 생성.
02단계 생성된 앱 확인하기
1단계 진행하고 아무 변화가 없어 보이지만
파이참에서 왼쪽 디렉터리 목록을 보면
pybo 디렉터리가 생성되어 있음을 확인할 수 있다.
pybo 하위 파일들이 pybo앱을 위한 것이다.
안녕하세요 파이보?
01단계 개발 서버 구동하기
py manage.py runserver 명령어를 입력해서 개발 서버를 구동했다.
02단계 localhost:8000/pybo에 접속하기
웹 브라우저 주소창에 [ localhost:8000/pybo ] 를 입력해 접속하기.
앞으로 이 과정을 '페이지를 요청한다' 또는 '/pybo/를 요청한다' 라고 할 것이다.
03단계 오류 메시지 확인하기
localhost:8000/pybo 검색 결과 'Page not found (404)' 오류 메시지가 뜬다.
404는 HTTP 오류 코드 중 하나로, 사용자가 요청한 페이지를 찾을 수 없는 경우 발생하는 오류이다.
명령프롬프트에도 같은 오류 메시지가 뜬다.
장고는 오류 발생 시 오류 원인을 웹브라우저 또는 명령 프롬프트에 자세히 보여준다.
장고는 사용자가 웹 브라우저에서 /pybo/라는 페이지를 요청하면
해당 페이지를 가져오는 URL 매핑이 있는지 config/urls.py 파일을 뒤져 찾아본다.
그런데 아직 /pybo/ 페이지에 해당하는 URL 매핑이 장고에 등록되지 않아서 페이지를 찾을 수 없다는
메시지를 보낸 것 이다.
04단계 config/urls.py 수정하기
3단계와 같은 오류가 뜨지 않도록 장고에서 config/urls.py 파일을 수정하자.
앞으로 이것을 'URL 매핑을 추가한다' 라고 말할 것이다.
파이참에서 config/urls.py파일을 열어서
from pybo import views
path('pybo/', views.index),
(path 함수를 사용해서 pybo/ URL과 views.index를 매핑. views.index는 views.py파일의 index함수를 의미한다.)
두 문장을 추가했다.
- config/urls.py 는 페이지 요청 시 가장 먼저 호출되며, 요청 URL과 뷰 함수를 1:1로 연결해준다.
- 뷰 함수는 뒤에 작성할 예정. 화면을 보여주기 위한 함수로 views.py에 있는 함수이다.
urlpatterns의 path('pybo/', views.index), 는 path 함수를 사용해서 pybo/ URL과 views.index를 매핑,
views.index는 views.py파일의 index함수를 의미한다.
(=> pybo/ 라는 URL이 들어오면 view.index화면을 보여준다는 뜻)
05단계 config/urls.py 다시 살펴보기
4단계에서 urlpatterns에 입력한 URL은 앞서 웹 브라우저에 입력했던 [ localhost:8000/pybo ] 에서
호스트명 [ localhost ] 와 포트 번호 [ :8000 ] 이 생략된 pybo/ 이다.
호스트명과 포트번호 [ localhost:8000 ] 는 장고가 실행되는 환경에 따라 변하는 값이고,
이는 장고가 이미 알고 있는 값이기 때문에 urlpatterns에 입력하지 않아도 된다.
+) pybo 뒤에 슬래시 (/) 가 붙는 이유 :
슬래시를 붙이면 사용자가 슬래시 없이 주소를 입력해도 장고가 자동으로 슬래시를 붙여준다.
이는 URL을 정규화하는 장고의 기능이고, 특별한 경우가 아니라면 URL매핑에는
호스트명과 포트를 생략하고 끝에는 슬래시를 붙이자!
06단계 오류 메시지 확인하기
다시 명령프롬프트에서 /pybo/에 접속해보자.
py manage.py runserver 명령어를 입력해서 다시 서버를 작동해보면
긴 오류문이 뜬다.
이 이유는 URL매핑에 추가한 뷰 함수 views.index가 아직 없기 때문이다.
07단계 pybo/views.py 작성하기
pybo/views.py 파일에 index 함수를 추가하자.
- return 문에 사용된 HttpResponse는 페이지 요청에 대한 응답을 할 때 쓰는 장고 클래스이다.
- index 함수의 매개변수 request는 장고에 의해 자동으로 전달되는 HTTP 요청 객체이다.
여기에서는 HttpResponse에 "안녕하세요 pybo에 오신 것을 환영합니다." 라는 문자열을 전달해서
이 문자열이 웹 브라우저에 그대로 출력되도록 만들었다.
08단계 첫 번째 장고 프로그램 완성!
평소 학원에서는 localhost:8000/pybo 를 입력하는게 아니라
터미널에 뜨는 http://127.0.0.1:8000/ URL로 바로 이동했어서 계속 그 방법대로 하는데 위와 같은 창이 뜨지 않아서
도대체 뭐가 잘못된건지 한참 찾았다... 정답은 URL이 잘못된거였어..
localhost:8000/pybo로 들어가면 잘 뜬다^^
장고 개발 흐름 정리하기
① 웹 브라우저 주소창에 localhost:8000/pybo 입력 (장고 개발 서버에 /pybo/ 페이지 요청)
② config/urls.py 파일에서 URL을 해석해 pybo/views.py 파일의 index 함수 호출
③ pybo/views.py 파일의 index 함수를 실행해 함수 실행 결과를 웹 브라우저에 전달
사용자가 /pybo/ 페이지를 요청하면
장고 개발 서버가 URL을 분석해서 URL에 매핑된 함수를 호출하고,
함수 실행 결과를 웹 브라우저 화면에 전달한다.
URL 분리하기
01단계 config/urls.py 다시 살펴보기
pybo 앱 관련 파일은 대부분 pybo 파일 안에 있다.
하지만 config/urls.py 파일은 pybo안에 없다.(최상위폴더 안에 있음)
그러므로 pybo 앱에 URL매핑을 추가하려면 pybo 디렉터리가 아닌 config 파일에 있는 urls.py파일을 수정해야 한다.
pybo 앱 관련 urls.py 파일을 따로 구성해보자.
02단계 config/urls.py 수정하기
include 함수를 import해서 pybo/의 URL 매핑을 path('pybo/', views.index)에서 path('pybo/', include('pybo.urls'))로 수정.
path('pybo/', include('pybo.urls'))
[ pybo/ ] 로 시작하는 모든 페이지 요청은 pybo 파일 안의 urls.py 파일에 있는 URL매핑을 참고해 처리하라는 뜻.
전에는 config/urls.py에 URL이 들어 있었다면 이번에는 pybo/urls.py에서 관리할거라는 ..
03단계 pybo/urls.py 생성하기
pybo 파일의 urls.py로 위치를 지정해 줬지만 아직 pybo파일 안에는 urls.py파일이 없기 때문에 생성해줘야됨.
04단계 pybo/urls.py 수정하기
기존에 confic/urls.py에 입력했던것과 비슷한 코드를 pybo/urls.py에 입력한다.
urlpatterns의 path('', views.index), 부분이 이전과 다르다.
config/urls.py 파일에서 pybo/에 대한 처리를 한 상태에서 pybo/urls.py 파일이 실행되므로
첫 번째 매개변수에 pybo/가 아닌 빈 문자열('')을 인자로 넘겨준 것이다.
< 장고가 config/urls.py | pybo/urls.py 파일 순서로 살펴보며 URL 매핑을 찾는 과정 >
ex) pybo/urls.py 파일에 path('question/create/', ...)가 추가되면
config/urls.py파일과 pybo/urls.py파일에 의해 최종 매핑되는 URL은
pybo/question/create/가 된다.