본문 바로가기
아카이브

Django - path, re_path, 정규표현식

by PilYeooong 2020. 3. 25.

 

Django 1.x 버전에서의 django.conf.urls.url()의 대한 사용법이
path()와, re_path()로 나누어졌습니다.

 


 

re_path() - django.conf.urls.url()와 동일

path() - Django가 기본적으로 제공하는 Path Converter를 통해 정규표현식 기입이 간소화되었습니다.

 

기본 제공되는 Path Converter

IntConverter - r"[0-9]+"
StringConverter - r"[^/]+"
UUIDConverter - r"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"
SlugConverter (StringConverter 상속) - r"[-a-zA-Z0-9_]+"
PathConverter (StringConverter 상속) - r".+"

 


 

 

정규 표현식 패턴 예시

1자리 숫자 - "[0123456789]" 혹은 "[0-9]" 혹은 r"[\d]" 혹은 r"\d"
2자리 숫자 - "[0123456789][0123456789]" 혹은 "[0-9][0-9]" 혹은 "\d\d"
3자리 숫자 -
r"\d\d\d" 혹은 r"\d{3}"
2자리~4자리 숫자 - r"\d{2,4}"
휴대폰 번호 -
r"010[1-9]\d{7}"
알파벳 소문자 1글자 -r
"[abcdefghijklmnopqrstuvwxyz]" 혹은 "[a-z]"
알파벳 대문자 1글자 - r"[ABCDEFGHIJKLMNOPQRSTUVWXYZ]" 혹은 "[A-Z]"
한글이름 2글자 혹은 3글자 - r"[ㄱ-힣]{2,3}"
성이 "김"씨인 이름  - r"김[ㄱ-힣]{1,2}"

 


 

URL에 path(), re_path(), 정규표현식을 사용한 예시

path('archives/<int:year>/', archives_year),

URL로 archives/2020/ 등 int 형태의 정수만 온다면 정상적으로 HttpResponse 반환합니다.

위의 path를 정규표현식을 사용하여 표현 해보면,

re_path(r'archives/(?P<year>\d+)/', archives_year),

로 나타낼 수 있습니다.


정규표현식을 활용해 4자리 정수만 받을 수 있도록 제한할 수 있습니다

re_path(r'archives/(?P<year>\d{4})/', archives_year),

4자리의 정수가 매칭될 경우에만 정상적으로 HttpResponse를 반환, 4자리보다 크거나 작은 크기의 정수가 온다면 HTTP 404 에러를 반환 합니다.

좀 더 활용해 보면 2000년대의 연도만 받도록 제한을 할 수도 있습니다.

re_path(r'archives/(?P<year>20\d{2})/', archives_year),

이런식으로 말이죠. 2000년대의 연도가 오면 정상적으로 작동하고, 나머진 404에러를 반환합니다.

 

기존 path()에서도, re_path에서 정규표현식을 통해 year에 제한을 주듯이 register_converter을 통해 적용 시킬수 있습니다.

from django.urls import register_converter

class YearConverter:
    regex = r"20\d{2}"

    def to_python(self, value):
        return int(value)

    def to_url(self, value):
        return str(value)


register_converter(YearConverter, 'year')
path('archives/<year:year>/', archives_year),


이런식으로 path()에서도 register_converter를 사용하여 2000년대의 연도만 접근하실 수 있는걸 볼 수 있습니다.

 

AskCompany의 장고/리액트 강의를 바탕으로 작성하였습니다.

'아카이브' 카테고리의 다른 글

200328 / TIL  (0) 2020.03.28
200325 / TIL  (0) 2020.03.25
200320 / TIL  (0) 2020.03.20
200318 / TIL  (0) 2020.03.18
200317 / TIL  (0) 2020.03.17