TIL no.40 - Django - Basic - 4 - url mapping 2

박준규·2019년 10월 19일
1

Django

목록 보기
9/30

Django - Basic - 3에서

firstapp/views.py에서 index라는 메소드를 만들고
practice/urls.py에서 rootURL로 접근하면
firstapp의 view에 선언한 index를 실행하게 했습니다.

그리고 practice/urls.py에서 rootURL 접근시
firstapp으로 넘어가게 urls.py를 수정하고
firstapp에 urls.py를 만들어 rootURL로 접근시
firstapp/views.py에 선언한 index가 실행하게 했습니다.

이를 응용해서 여러 페이지를 띄워보겠습니다.


1. 여러 View 만들기

firstapp/views.py에서 다른 메소드들을 만들어줍니다.

#firstapp/views.py

  from django.shortcuts import render
  from django.http import HttpResponse
    
  def index(request):
      return HttpResponse("Hello world.")
  
  def select(request):
      message = '수 하나를 입력해주세요.'
      return HttpResponse(message)
  
  def result(request):
      message = '추첨 결과입니다.'
      return HttpResponse(message)

그리고 firstapp/urls.py에서 각 메소드들을 다른 url에 연결시켜줍니다.

from django.urls import path
 
 from . import views
 
 urlpatterns = [
     path('', views.index, name='index'),
     path('select/', views.select, name='select'),
     path('result/', views.result, name='result'),
 ]

그리고 $ python manage.py runserver를 실행시켜 줍니다.

그뒤에
http://127.0.0.1:8000/select/
http://127.0.0.1:8000/result/
로 들어가면
아까 작성한 대로 view가 보여지게됩니다.


지금까지 여러 url들을 어떻게 연결시키는지 알아봤습니다.

다음 설명을 이어가기 전에 먼저
어떤 음식점 리뷰 사이트를 떠올려보겠습니다.

이런 url이 있을수 있습니다.

www.yummy.com/restaurant_list/13/reviews

음식점 리스트를 보여주는 페이지에서 13번째 음식점의 리뷰를 보게된다면 위와 같은 url로 나타날 것입니다.

그럼 음식점들 하나하나를 백엔드 개발자가 1번부터 끝까지 url mapping을 시켜줘야 할까요?

아닙니다! 이를 쉽게 해결하는 방법은 변수화를 사용하는 것입니다.


2. path parameter

코드부터 먼저 보겠습니다.

urlpatterns = [
     path('', views.index, name='index'),
     path('select/<int:number>/', views.select, name='select'),
     path('result/', views.result, name='result'),
 ]

위에서 사용한 코드에 <int:number>라는 것이 붙었습니다.

이는 이런 형태의 url을 뜻합니다.

select/13

당연히, 13말고도 다른 정수들이 들어갈 수 있습니다.

그리고 path에서 views.select와 연결되어 있으니 views.select에도 변화가 필요합니다.

def select(request, number):
      message = '수 하나를 입력해주세요.'
      return HttpResponse(message)

select함수의 인자로 넘겨줄 수 있습니다.

정리하겠습니다.

  1. 'select/13'과 같이 url에 어떤 변수를 넣는 경우가 있다.
  2. urls.py의 path함수에서 <int:number>와 같이 변수를 받을 수 있다.
  3. 이와 연결된 메서드는 url에서 받은 변수를 argument로 받아 사용할 수 있다.

앞에서 예를 들어 설명한 것을 path parameter라고 부릅니다.
즉, path안에 있는 parameter라는 것입니다.

그리고 이런 parameter의 종류는 다음과 같습니다.
1. int
2. string
3. slug
slug란 하이픈(-), 언더스코어(_)가 포함된 영숫자 문자열입니다.

(번외) 정규표현식을 사용해 url 읽기

정규표현식을 사용해 url을 읽을 수 있습니다.

urlpatterns = [
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
]

정규표현식을 사용해서 url을 읽을 때는
일반 path함수가 아니라 re_path함수를 사용합니다.
그리고 첫번째 인자에 string을 적기 전에
r로 먼저 시작한뒤 string을 적어줍니다.

위의 코드의 의미를 하나하나 의미를 해석해보겠습니다.
'^articles/:article로 시작한다.
(?P<year>[0-9]{4})/$:parameter이고 이는 year라는 변수로 저장되고 0에서 9의 숫자이며 4자리 숫자이다. 그리고 /로 끝난다.

profile
devzunky@gmail.com

0개의 댓글