인프런 커뮤니티 질문&답변

ajdsasld님의 프로필 이미지
ajdsasld

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

URL 정규표현식 질문입니다!

작성

·

283

0

from django.urls import path, re_path, register_converter
from . import views


# 커스텀 Converter
class YearConverter:
regex = r"20\d{2}" # 정규표현식 패턴을 작성

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

def to_url(self, value):
return "%04d" % value


# 커스텀 Converter를 등록하고 이름을 설정
register_converter(YearConverter, 'year')

app_name = 'instagram'

urlpatterns = [
path('', views.post_list, name='post_list'),
# path('<int:pk>/', views.post_detail),
re_path(r'(?P<pk>\d{3})/', views.post_detail),
# path('archives/<int:year>/', views.archives_year),
# re_path(r'archives/(?P<year>20\d{2})/', views.archives_year),
path('archives/<year:year>/', views.archives_year),
# re_path(r'(?P<pk>\d+)/$', views.post_detail),
]

안녕하세요, 강사님!

위와 같이 instagram 앱 내부의 urls.py에서 

re_path(r'(?P<pk>\d{3})/', views.post_detail), 

이렇게 re_path함수를 사용하여 localhost:8000/instagram/이후에 3자리만 요청이 가능하도록 해보고 싶은데요.

이렇게 1자리 또는 2자리를 입력하면 정상적으로 오류가 나오는데, 

다음과 같이 3자리만 매칭되는 게 아니라, 3자리 이상은 전부 매칭이 되고 있어서 질문을 드려봅니다. 어떤 부분이 문제가 있는걸까요..?

 

 

 

 

 

 

 

 

 

답변 1

1

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

re_path를 쓰실 때에는 정규표현식에서 문자열의 시작과 끝을 명시해주셔야 합니다.

re_path(r'(?P<pk>^\d{3})/$', views.post_detail),

이를 지정하지 않으시면, 부분매칭이 됩니다. 숫자 4자리도 결국 숫자 3자리가 포함된 것이니까 매칭이 된 것입니다.

화이팅입니다. :-)

ajdsasld님의 프로필 이미지
ajdsasld
질문자

시작과 끝이 있다는 걸 몰랐네요ㅎㅎ 항상 자세히 알려주셔서 감사합니다:)

ajdsasld님의 프로필 이미지
ajdsasld

작성한 질문수

질문하기