🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

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

22.02.14 16:51 작성 조회수 200

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

질문자

2022.02.15

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

채널톡 아이콘