TIL no.39 - Django - Basic - 3 - url mapping

박준규·2019년 10월 19일
0

Django

목록 보기
8/30

Django - Basic - 2에서
프로젝트(practice)를 만들고
App(firstapp)을 만들었습니다.

그리고 실생활에서 웹페이지를 접속할때 Django가 어느 폴더들을 옮겨가면서 url을 확인하는지 간략하게 알아봤습니다.


이제 간단한 웹페이지를 화면에 띄워보겠습니다.

이를 위해 views.py, urls.py 파일들을 건드려야 합니다.

views.py는 웹 화면에 어떤 데이터를 보여줄 것인지를 정의하는 파일이고
urls.py는 url과 웹 페이지를 어떻게 연결(매핑)할지 정의하는 파일입니다.

즉, urls.py를 통해 길을 찾습니다.
어느 app에 관한 요청인지 어떤 페이지를 보고싶은 요청인지 판단합니다.

그리고 view.py의 코드에 따라 해당 url에서 무엇을 보여줄지 판단하는 것입니다.


1. View 만들기

먼저, 보여줄 view를 만들어보겠습니다.

#firstapp/views.py

from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello world.")

import한 클래스들의 역할은 나중에 알아보도록 하겠습니다.

일단, 지금 알아둬야할 것은
index라는 함수는 request를 받아
HttpResponse를 return한다는 사실입니다.

2. view를 url과 연결하기

그리고 practice의 urls.py를 건드리겠습니다.

from django.contrib import admin
from django.urls import path

from firstapp import views

urlpatterns = [
    path('', views.index, name='index'),
    path('admin/', admin.site.urls),
]

방금 건드린 views.py를 import해왔습니다.

그리고 urlpatterns의 path함수는 url과 명령을 연결하는 역할을 합니다.
path함수의 첫번째,두번째 인자만 살펴보겠습니다.
path('', views.index, name='index')
첫번째 인자의 ''는 root URL뒤에 아무것도 없는 url입니다.
즉, root URL입니다.

두번째 인자의 views.index는 views의 index 메서드의 결과로 나오는 페이지를 뜻합니다.

즉, ''인 URL에 접속하면 views에서 정의되어있는 index라는 함수의 결과를 웹페이지에 띄운다.

이렇게 해석할 수 있습니다.


이제, 서버를 띄울 차례입니다.
manage.py가 있는 폴더로 돌아가서 다음 명령어를 실행합니다.

$ python manage.py runserver
그리고 http://127.0.0.1:8000/
에 접속하면 다음과 같은 페이지를 볼 수 있습니다.

스크린샷, 2019-10-19 16-45-18.png


지금까지 한 것은
firstapp에 view를 만들어 놓고
practice의 urls.py에서 root URL로 접근하면 firstapp에 있는 view의 index의 결과를 띄워주게 했습니다.

그런데, practice의 urls.py에서 바로 firstapp의 view로 접근하지 않고
firstapp으로 한번 넘어가서 그곳의 view를 보여주는 방법을 알아보겠습니다.


3. base path 지정하기

일단 rootURL로 접근하면 firstapp의 권한으로 넘깁니다.
practice/urls.py를 다음과 같이 변경하겠습니다.

#practice/urls.py

  from django.contrib import admin
  from django.urls import include, path
  
  urlpatterns = [
      path('', include('firstapp.urls')), 
      path('admin/', admin.site.urls),
  ]

여기서 눈여겨볼 것은 include() 함수입니다.
URL 의 그 시점까지 일치하는 부분을 잘라내고, 남은 문자열 부분의 후속 처리는 include 된 url파일 경로에 전달합니다.

아까 전에는 firstapp에서 view를 import해와서 보여줬지만
지금은 ''가 남았을 때 firstapp의 urls.py가 판별하도록 넘겨줍니다.

그런데 아직 firstapp에는 urls.py가 없으니 생성해주도록 하겠습니다.
$ cp urls.py ../firstapp

그리고 firstapp/urls.py를 다음과 같이 수정합니다.

#firstapp/urls.py
from django.urls import path
 
  from . import views
  
  urlpatterns = [
      path('', views.index, name='index'),
  ]

이제 firstapp으로 넘겨온 ''url을 처리해주도록 만들었습니다.

이렇게 해주는 이유는
하나의 프로젝트 내에 여러 앱이 존재할 수 있기 때문에
각 앱에 base path를 지정하고 유지보수를 용이하게 하기 위함입니다.

비록 지금은 하나의 앱만 처리했지만
수많은 앱이 있는 프로젝트의 각 앱에 urls 라우팅 파일을 정의하고
그 파일을 base path에 맵핑되도록 해준것과 동일합니다.

profile
devzunky@gmail.com

0개의 댓글