Django 점프 투 장고 정리
작성일 : 2021-11-09
문서버전 : 1.0
개요
이 문서는 점프 투 장고 사이트의 장고 튜토리얼 학습 내용을 정리한 내용입니다.
레퍼런스
점프 투 장고 https://wikidocs.net/72242
2장. 장고 기본 요소 익히기
이번 장에서는 장고 개발에 필요한 기본적인 요소를 연구해보자. 앞으로 만들 프로그램이 건물이라면 이번 장은 기초공사를 하는 단계라고 보면 되겠다. 기초 공사는 중요하다.
2-1. URL과 View
앱(APP)
이전 장에서 mysite라는 프로젝트를 생성했다. 이 프로젝트는 빈 공백과 같은 상태이므로 기능을 추가하기 위해 앱을 생성해야한다.
> app 생성하기
(mysite) C:\Users\yangs\Desktop\django_jump\projects\mysite>django-admin startapp pybo
Mysite 프로젝트 디렉토리 내에 pybo 앱 디렉토리가 생성된 것을 알 수 있다. Pybo 명칭은 점프투장고 튜토리얼에서 사용한 명칭이다. 앱 명칭은 자신이 정하고싶은대로 정하면 된다.
단순 문자열 출력하기
http://localhost:8000/pybo 페이지 요청 시 문자열을 출력하는 기능을 구현해보자.
> 로컬 서버 구동 후 위 페이지로 접속
404오류가 발생했다. 404오류는 브라우저가 요청한 페이지를 찾을 수 없을 때 발생하는 오류다. 문구를 보면 config/urls 파일에 /pybo URL이 없다고 나온다. 오류를 해결하기 위해 당연히 config/urls.py에 /pybo URL에 대한 매핑을 추가해야 한다.
장고의 urls.py 파일은 페이지 요청이 발생할 때 가장 먼저 호출되는 파일이다. URL과 View 함수 간의 매핑을 정의해준다. 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/ 로 매핑해야 한다. 호스트명과 포트는 환경에 따라 달라질 수 있기 때문이다.
추가로 pybo/ 에 슬래시가 추가된 이유는 무엇일까? 만약 http://localhost:8000/pybo 라 입력하더라도 이를 자동으로 http://localhost:8000/pybo/ 로 변환해준다. 장고에서는 URL을 정규화해주는 기능이 있기 때문이다. 특별한 경우가 아니라면 URL 매핑 시 뒤에 항상 슬래시를 붙여주면 좋다.
Views.py
다시 http://localhost:8000/pybo 페이지를 요청하면 ‘사이트 연결할 수 없음’ 오류가 뜰 것이다. 그 오류가 뜰 때 로컬 서버에는 아래와 같은 오류가 출력된다.
result
...
File "c:\Users\yangs\Desktop\django_jump\projects\mysite\config\urls.py", line 22, in <module>
path('pybo/', views.index),
AttributeError: module 'pybo.views' has no attribute 'index'
URL에 매핑한 view 함수 ‘views.index’가 없기 때문에 오류가 발생했다. 오류를 해결하기 위해 pybo/views.py 파일 내 index 함수를 추가해야한다.
> ../projects/mysite/pybo/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("안녕하세요 pybo 페이지입니다.")
http://localhost:8000/pybo 페이지에 들어가면 아래와 같은 문구가 정상적으로 뜬다.
Result
장고의 개발 흐름
장고의 기본적인 흐름은 아래와 같다.
- Website 브라우저에서 로컬 서버로 ‘http://localhost:8000/pybo’페이지를 요청한다.
- Urls.py 파일에서 /pybo URL 매핑을 확인한다.
- 매핑이 되어있을 경우, Views.py 파일의 index() 함수를 호출한다
- 호출된 결과를 브라우저에 반영한다
URL 분리
다음으로 넘어가기 전에 config/urls.py를 수정하자. Pybo 앱 관련 파일들은 항상 pybo 앱 디렉토리 하위에 위치해야하는데, 현재의 경우 pybo 관련 URL 매핑 추가할 때마다 config/urls/py를 수정해줘야 한다는 번거로움 때문이다. Config의 urls.py 파일은 앱이 아닌 프로젝트 성격의 파일이라 프로젝트 성격의 URL 매핑만 추가하는 것이 좋다. 그렇기 때문에 pybo 앱에서 사용하는 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),
]
변경 후
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('pybo/', include('pybo.urls')),
]
pybo/에 대한 매핑이 views.index -> 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 파일을 생성해해준다
> pybo/urls.py 파일 생성> pybo/urls.py
해당 파일 내 views.index를 추가해주자.
from django.urls import path
from . import views
urlpatterns = [
path('', views.index),
]
path(‘’, views.index)의 경우, pybo/가 생략되고 ‘’만 사용되었다. 이는 config/urls.py에서 이미 pybo/로 시작한 URL이 pybo/urls.py 파일과 먼저 매핑되어 있기 때문이다. /pybo URL은 config/urls.py 파일에 매핑된 pybo/가 자동으로 부여되고 이것이 pybo/urls.py 파일에 매핑된 ‘’이 더해져 views.index 함수와 매핑된다.
config/urls.py | pybo/urls.py | 최종 URL | ||
‘pybo/’ | + | ‘’ | = | ‘pybo/’ |
만약, pybo/urls.py 파일에 path(‘question/create/’, ...)라는 URL 매핑이 추가될 경우 최종 매핑되는 URL은 pybo/question/create/가 될 것이다.
'Research > Django' 카테고리의 다른 글
[Django] 점프 투 장고 튜토리얼 - 02-3. 장고 관리자(Admin) (0) | 2021.11.11 |
---|---|
[Django] 점프 투 장고 튜토리얼 - 02-2. 모델(Model) (0) | 2021.11.10 |
[Django] 점프 투 장고 튜토리얼 - 01. 장고 개발 준비 (0) | 2021.11.10 |
[Django] 공식 튜토리얼 3 정리 (0) | 2021.11.05 |
[Django] 공식 튜토리얼 2 정리 (0) | 2021.11.03 |
댓글