가장 먼저 URL을 어떻게 처리하고, 또 어떻게 파이썬 프로그램을 호출하는지 알아보자.
앱 생성하고 확인하기
파이보 서비스에 필요한 pybo 앱을 만들며 알아보자.
(1단계) pybo 앱 생성하기
명령 프롬프트에서 django-admin의 startapp 명령을 이용하여 pybo 앱을 생성하자.
D:\projects\mysite>django-admin startapp pybo D:\projects\mysite> |
처리 메시지는 나타나지 않는다.
(2단계) 생성된 pybo 앱 확인하기
파이참에서 왼쪽의 프로젝트 디렉터리 목록을 살펴 보면 pybo라는 이름의 디렉터리가 생성되었음을 확인할 수 있다.
__init__.py, admin.py, apps.py 같은 파일이 바로 pybo 앱을 위한 것이다. 이 파일들은 앞으로 작성 또는 수정이 될 것이다.
안녕하세요 파이보?
(1단계) 개발 서버를 구동하자.
> python manage.py runserver
D:\projects\mysite>python manage.py runserver Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run 'python manage.py migrate' to apply them. August 08, 2022 - 10:44:24 Django version 3.1.3, using settings 'config.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK. |
(2단계) localhost:8000/pybo 접속하기 → /pybo/를 요청 (페이지를 요청한다)
아직 아무런 작업도 하지 않았지만 웹 브라우저 주소창에 localhost:8000/pybo을 입력하여 접속해 보자.
이 과정을 '페이지를 요청한다' 또는 localhost:8000을 생략하여 '/pybo/를 요청한다'라고 할 것이다.
localhost:8000/pybo |
(3단계) 오류 메시지 확인하기
'Page not found (404)' 오류 페이지를 확인할 수 있다.
404는 HTTP 오류코드 중 하나로, 사용자가 요청한 페이지를 찾을 수 없는 경우 발생한다. 장고는 오류 발생 시 오류 원인을 웹 브라우저 또는 명령 프롬프트에 자세히 보여준다.
Not Found: /pybo [08/Aug/2022 10:45:47] "GET /pybo HTTP/1.1" 404 1951 Not Found: /favicon.ico [08/Aug/2022 10:45:47] "GET /favicon.ico HTTP/1.1" 404 1972 |
이 오류는 왜 발생했을까?
장고는 사용자가 웹 브라우저에서 /pybo/라는 페이지를 요청하면 해당 페이지를 가져오는 URL 매핑이 있는지 config/urls.py 파일을 뒤져 찾아본다. 그런데 아직 /pybo/ 페이지에 해당하는 URL 매핑을 장고에 등록하지 않았다. 그래서 장고는 /pybo/ 페이지를 찾을 수 없다고 오류 메시지를 보낸 것이다.
(4단계) config/urls.py 파일 수정하기 → URL 매핑을 추가
장고가 사용자의 페이지 요청을 이해할 수 있도록 config/urls.py 파일을 수정하자. 앞으로 이를 'URL 매핑을 추가한다'라고 말할 것이다.
☞ config/urls.py은 페이지 요청 시 가장 먼저 호출되며, 요청 URL과 뷰 함수를 1:1로 연결해 준다.
☞ 뷰 함수는 화면을 보여 주기 위한 함수로, views.py에 있는 함수다.
# 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) """ path 함수를 사용하여 pybo/ URL 과 views.index를 매핑 """ ] |
views.index는 views.py 파일의 index 함수를 의미한다. 장고는 이런 식으로 URL과 뷰함수를 매핑했다.
(5단계) config/urls.py 다시 살펴보기
urlpatterns에 입력한 URL은 웹 브라우저에 입력한 localhost:8000/pybo에서 호스트명(localhost):포트번호(8000)가 생략된 pybo/이다. 호스트명과 포트는 장고가 실행되는 환경에 따라 변하는 값이며 장고가 이미 알고 있는 값이다. 그러므로 urlpatterns에 호스트명:포트명은 입력하지 않는다.
그리고 pybo에 슬래시[/]를 붙여 입력한 점에도 주목하자!
슬래시를 붙이면 사용자가 슬래시 없이 주소를 입력해도 장고가 자동으로 슬래시를 붙여 준다. 이는 URL을 정규화하는 장고의 기능 덕분이다. 아무튼 특별한 경우가 아니라면 URL 매핑에는 호스트명과 포트를 생략하고 끝에는 슬래시를 붙이자.
(6단계) 오류메시지 확인하기
다시 /pybo/에 접속해 보면 웹 브라우저에 '사이트를 연결할 수 없음' 오류 표시가 되고, 개발 서버에는 다음과 같은 오류가 표시된다.
File "D:\projects\mysite\config\urls.py", line 22, in path('pybo/', views.index) AttributeError: module 'pybo.views' has no attribute 'index' |
config/urls.py 파일을 수정했음에도 이런 오류가 발생한 이유는 URL 매핑에 추가한 뷰 함수 views.index가 없기 때문이다.
(7단계) pybo/views.py 작성하기 → index 함수 추가
pybo/views.py 파일에 index 함수를 추가하자.
# pybo/views.py from django.shortcuts import render from django.http import HttpResponse # Create your views here. def index(request): return HttpResponse("안녕하세요. pybo에 오신 것을 환영합니다!") |
return 문에 사용된 HttpResponse는 페이지 요청에 대한 응답을 할 때 사용하는 장고 클래스이다. 여기서는 HttpResponse에 "안녕하세요. pybo에 오신 것을 환영합니다!"라는 문자열을 전달하여 이 문자열이 웹 브라우저에 그대로 출력되도록 만들었다.
(8단계) 첫 번째 장고 프로그램 완성!
이제 /pybo/에 접속하면 웹 브라우저에 다음과 같이 문자열이 출력된다.
다시 한번 정리하자면!
1. 웹 브라우저 주소창에 localhost:8000/pybo 입력 → 장고 개발 서버에 /pybo/ 페이지 요청
2. config/urls.py 파일에서 URL을 해석해 pybo/views.py 파일의 index 함수 호출
3. pybo/views.py 파일의 index 함수를 실행해 함수 실행 결과를 웹 브라우저에 전달
URL 분리하기
(1단계) config/urls.py 다시 살펴보기
pybo 앱 관련 파일은 대부분 pybo 디렉터리에 있다. 하지만 config/urls.py 파일은 pybo 디렉터리에 없다. 그러므로 pybo 앱에 URL 매핑을 추가하려면 pybo 디렉터리가 아닌 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 앱 관련 urls.py 파일을 따로 구성해 보자.
(2단계) config/urls.py 수정하기
include 함수를 import해 pybo/의 URL 매핑을 path('pybo/', views.index) 에서 path('pybo/', include('pybo.urls')) 로 수정하자.
# config/urls.py from django.contrib import admin from django.urls import path, include from pybo import views urlpatterns = [ path('admin/', admin.site.urls), path('pybo/', include('pybo.urls')) ] |
path('pybo/', include('pybo.urls'))는 pybo/로 시작하는 페이지 요청은 모두 pybo/urls.py 파일에 있는 URL 매핑을 참고하여 처리하라는 의미이다.
(3단계) pybo/urls.py 생성하기
pybo 앱 디렉터리에 urls.py 파일을 생성하자.
(4단계) pybo/urls.py 생성하기
pybo 앱 디렉터리에 urls.py 파일을 생성하자.
from django.urls import path from . import views urlpatterns = [ path('', views.index) ] |
코드 내용은 기존 config/urls.py 파일과 다르지 않다. path('', views.index) 입력 부분만 다르다. config/urls.py 파일에서 pybp/에 대한 처리를 한 상태에서 pybo/urls.py 파일이 실행되므로 첫 번째 매개변수에 pybo/가 아닌 빈 문자열('')을 인자로 넘겨준 것이다.
다시 /pybo/에 접속해 보면 아래와 같은 화면이 나오면 잘 접속된 것이다.
★ 이 과정을 이해하는 것은 매우 중요하다!
pybo/urls.py 파일에 path('question/create/', ...)가 추가되면 config/urls.py 파일과 pybo/urls.py 파일에 의해 최종 매핑되는 URL은 pybo/question/create/가 된다.
여기까지.
'개발자모드 > 혼자공부하는파이썬' 카테고리의 다른 글
[장고#06] 장고 Admin에서 모델 데이터 추가, 검색기능 추가 (0) | 2022.08.17 |
---|---|
[장고#05] SQLite 설치, 장고ORM기능, 모델생성, 테이블 생성/저장/조회/수정/삭제 (ft. 장고에 앱등록하기, 장고 쉘shell 실행하기) (0) | 2022.08.16 |
[장고#03] 파이참 다운로드 후 설치, 인터프리터 설정, 장고개발서버 실행 (ft. 개발서버 한글로 변경-setting파일수정) (0) | 2022.08.05 |
[장고#02] 장고 프로젝트 생성, 개발 서버 구동 및 종료, 개발서버 접속 확인 (0) | 2022.08.03 |
[장고#01][웹개발환경셋팅] 파이썬 가상 환경 만들기 및 장고 설치하기 (0) | 2022.08.02 |
댓글