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))
- 테스트 서버를 실행하여 아래 경로로 들어가봅니다.
- 위 경로에서
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))
... 생략
- 테스트 서버를 실행하여 아래 경로로 들어가봅니다.
- 첫번째, 두번째는 정상적으로 화면이 나옵니다.
- 두번째는
03
이3
으로 변환됩니다. - 세번째는 int타입이 아닌
test
문자열로 인해 Page not found(404) 에러가 발생합니다.
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("정규식 시작기호만 있는 경우")
- 테스트 서버를 실행하여 아래 경로로 들어가봅니다.
- 아래의 경우 중 2번째만 에러가 발생합니다.
- 종료문자가 없는경우 시작문자만 만족하면 뒤에 어떠한 경로가 오더라도 괜찮습니다.
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
- Django 2.0 이전 버전에서
re_path()
대신 사용되어 오던 함수입니다. 기능은 동일합니다. - 미래에는 제거될 것이므로 사용을 지양해야합니다.
- https://docs.djangoproject.com/ko/2.0/ref/urls/#url
6. path() 또는 re_path() 추가 인자 넘겨주기
- 아래와 같이 3번째 옵션을 통해 데이터를 넘기는 것이 가능합니다.
path/urls.py
를 아래와 같이 수정합니다.
... 생략
urlpatterns = [
path('<username>/', views.get_list_by_user, {'foo':'bar'}),
... 생략
]
path/views.py
에get_list_by_user
함수를 아래와 같이 수정합니다.
... 생략
def get_list_by_user(request, username, foo):
print("username : ", username)
return HttpResponse("{}의 블로그 글 리스트가 출력됩니다!{}".format(username, foo))
... 생략
- url로 테스트 해봅니다. http://127.0.0.1:8000/path/suwoni/