본문 바로가기
Research/Django

[Django] 점프 투 장고 튜토리얼 - 02-1. URL과 VIEW

by RIEM 2021. 11. 10.

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

장고의 개발 흐름 

장고의 기본적인 흐름은 아래와 같다.

  1. Website 브라우저에서 로컬 서버로 ‘http://localhost:8000/pybo’페이지를 요청한다.
  2. Urls.py 파일에서 /pybo URL 매핑을 확인한다. 
  3. 매핑이 되어있을 경우, Views.py 파일의 index() 함수를 호출한다
  4. 호출된 결과를 브라우저에 반영한다

 

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/가 될 것이다.

 

댓글