Programming

; develop a program

Framework/Django

[Django] 장고(Django) 기본요소 - URL과 View

Clloud_ 2022. 11. 23. 23:09
반응형

이번 포스팅에서는 장고의 기본 요소 중 하나인 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 분리 후에도 동일한 결과가 나타난다.

 


 

반응형