Django 2.0 노트- 3. URL Routing 설정에 사용하는 함수

1. 예제 작성 준비

  • path, repath 앱 추가
$ python manage.py startapp path
$ python manage.py startapp repath
  • settings.py 에 앱 등록합니다. 코드는 생략

2. include()

2.1 다른 Url 설정 포함하기

  • Django는 URL 의 그 시점까지 일치하는 부분을 잘라내고, 남은 문자열 부분을 후속 처리를 위해 include 된 url파일 경로에 전달합니다.
  • 레퍼런스 URL : https://docs.djangoproject.com/ko/2.0/ref/urls/#include

  • 아래의 코드를 프로젝트명/urls.py 파일에 추가합니다.
  • path('path/', include('path.urls')) 코드는 path/ 까지 프로젝트명/urls.py 파일에서 해석을 하고, include('path.urls')함수를 통해서 그 다음 url 부분을 path 디렉토리 아래 urls.py 모듈에서 해석할 수 있게 됩니다.

... 생략

urlpatterns = [
    ... 생략
    path('path/', include('path.urls')),
    path('repath/', include('repath.urls')),
]

2.2 path 또는 re_path 인스턴스 목록 추가하기

  • include() 함수는 다른 url 설정 모듈 경로 뿐만 아니라, path() 또는 re_path() 객체를 리스트 형태로도 할당할 수 있습니다.
  • 아래의 코드를 프로젝트명/urls.py 파일에 추가합니다.

... 생략

from blog import views as main_view

extra_patterns = [
    path('extra1/', main_view.get_extra1),
    path('extra2/', main_view.get_extra2),
]


urlpatterns = [
    ... 생략
    path('extra/', include(extra_patterns)),
]

  • 아래의 코드를 blog/views.py에 추가합니다.

... 생략

def get_extra1(request):
    return HttpResponse("extra1")


def get_extra2(request):
    return HttpResponse("extra2")


3. path()

3.1 path() 소개

  • django 2.0에서 새롭게 추가된 함수입니다.
  • URL경로 상에서 예를 들어 <username>과 같은 꺽쇠괄호가 들어 있는 URL을 인식하여 뷰 함수에 키워드 인자로 전달합니다.
  • 레퍼런스 URL : https://docs.djangoproject.com/ko/2.0/ref/urls/#path

3.2 인자를 view에 넘겨주기

  • path 디렉토리 아래에 urls.py 파일을 생성합니다.
  • path/urls.py에 아래코드를 입력합니다.

from django.urls import path
from . import views

urlpatterns = [
    path('<username>/', views.get_list_by_user),
]
  • path/views.py에 아래 코드를 추가합니다.

from django.http import HttpResponse

def get_list_by_user(request, username):
    print("username : ", username)
    return HttpResponse("{}의 블로그 글 리스트가 출력됩니다!".format(username))

3-1

  • 위 경로에서 suwoni 부분을 다른 이름으로도 바꾸어 봅니다. 변경되는 것을 확인할 수 있습니다.

3.3 인자 컨버터로 제한하기

  • 이 번에는 키워드 인자로 전달받는 항목의 타입을 지정할 수 있습니다.
  • <컨버터:전달할키워드인자명> 이러한 형태로 입력하면 입력받는 데이터를 제한 할 수 있습니다.
  • 컨버터의 종류와 역할은 다음과 같습니다.
    • str : 경로 구분자를 제외한 비어 있지 않은 문자열
    • path: 경로 구분자를 포함한 비어 있지 않은 문자열
    • int : 0 또는 임의의 양의 정수와 일치합니다.
    • slug : 문자 또는 숫자와 하이픈 및 밑줄 문자로 구성된 슬러그 문자열과 일치합니다. 예를 들어, SHOW-ME-THE-MONEY
  • 커스텀한 컨버터 작성법
  • path/urls.py 에 아래의 코드를 추가합니다.

...생략

urlpatterns = [
    ... 생략
    path('<username>/<int:articleId>', views.get_user_article),  
]
  • path/views.py에 아래의 코드를 추가합니다.

...생략

def get_user_article(request, username, articleId):
    print("username : ", username)
    print("articleId", articleId)
    return HttpResponse("{}의 블로그 {}번 글이 출력됩니다!".format(username, articleId))

... 생략

3-3

4. re_path()

4.1 re_path() 소개

  • django 2.0에서 새롭게 추가된 함수입니다.
  • 2.0 이전에 사용하던 url 함수와 동일한 함수 입니다.

  • 정규식을 포함한 url패턴을 지정합니다.
    • ^ 는 정규식 시작 기호입니다.
    • $ 는 정규식 종료 기호입니다.
    • 정규식에 대한 좀 더 자세한 내용은 다음 글에서 작성합니다.
  • 레퍼런스 URL : https://docs.djangoproject.com/ko/2.0/ref/urls/#re-path

4.2 정규식 시작기호와 종료기호 적용

  • repath 디렉토리 아래에 urls.py 파일을 생성합니다.
  • repath/urls.py에 아래코드를 입력합니다.
  • 하나는 ^$ 정규식 시작기호와 종료기호 모두 있습니다.
  • 하나는 ^ 정규식 시작기호만 있습니다.
from django.urls import re_path
from . import views

urlpatterns = [
    re_path(r'^startEnd/$', views.get_start_end),
    re_path(r'^startOnly/', views.get_start_only),
]
  • repath/views.py에 아래 코드를 추가합니다.

from django.http import HttpResponse


def get_start_end(request):
    return HttpResponse("정규식 시작기호 종료기호 둘 다 있는 경우")


def get_start_only(request):
    return HttpResponse("정규식 시작기호만 있는 경우")

4.3 정규식 패턴 적용

  • 이번에는 정규식으로 휴대폰 번호패턴을 적용해봅니다.
  • repath/urls.py에 아래코드를 입력합니다.
  • 010숫자는 반드시 오며, 4번째 자리는 1~9숫자만 올수 있고, 나머지 7자리는 숫자로 채워지는 패턴입니다.

... 생략

urlpatterns = [
    ... 생략
    re_path(r'^cellPhone/010[1-9]\d{7}$', views.get_pattern),
]
  • repath/views.py에 아래 코드를 입력합니다.
... 생략

def get_pattern(request):
    return HttpResponse("휴대폰번호 패턴이 일치하는 경우만 보입니다.")

4.4 인자를 view에 넘겨주기

4.4.1 키워드 인자로 넘겨주기

  • path()함수와 마찬가지로 url에서 특정부분을 인자로 view에 전달할 수 있습니다.
  • 인자를 작성하는 형식 : (?P<파라미터명>정규식패턴)
  • repath/urls.py 에 아래 코드를 추가해주세요.

... 생략

urlpatterns = [
    ... 생략
    re_path(r'^keword-parameter/(?P<cellphone>010[1-9]\d{7})$', views.get_cellphone),
]
  • repath/views.py에 아래 코드를 입력합니다.
... 생략

def get_cellphone(request, cellphone):
    return HttpResponse("휴대폰번호는 {} 입니다.".format(cellphone)

4.4.2 위치 인자로 넘겨주기

  • 키워드 인자와는 다르게 (정규식패턴) 으로 입력하면, view함수에 request다음 인자로 전달됩니다.
  • repath/urls.py 에 아래 코드를 추가해주세요.
  • views.get_cellphone 키워드 인자와 동일한 함수를 지정하였습니다.

... 생략

urlpatterns = [
    ... 생략
    re_path(r'^position-parameter/(010[1-9]\d{7})$', views.get_cellphone)
]

5. url() deprecate

6. path() 또는 re_path() 추가 인자 넘겨주기

  • 아래와 같이 3번째 옵션을 통해 데이터를 넘기는 것이 가능합니다.
  • path/urls.py를 아래와 같이 수정합니다.

... 생략

urlpatterns = [
    path('<username>/', views.get_list_by_user, {'foo':'bar'}),
    ... 생략
]

  • path/views.pyget_list_by_user 함수를 아래와 같이 수정합니다.

... 생략

def get_list_by_user(request, username, foo):
    print("username : ", username)
    return HttpResponse("{}의 블로그 글 리스트가 출력됩니다!{}".format(username, foo))

... 생략