Django URL Dispatcher와 정규 표현식

2022. 1. 7. 14:52강의 정리/Django Views

반응형

출처 : https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard

 

장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!

 

 


 

 

URL Dispatcher

  • " 특정 URL 패턴 -> View"의 List
  • 프로젝트 / settings.py에서 최상위 URLConf 모듈을 지정 
  • ROOT_URLCONF = 'dongbaek.urls'
  • # 최초의 urlpatterns로부터 include를 통해, TREE 구조로 확장
  • urlpatterns = [
        path('admin/', admin.site.urls),
        path('inflearn/', include('inflearn.urls')),
        path('instagram/', include('instagram.urls')),
        path('church/', include('church.urls')),
        path('accounts/', include('accounts.urls')),
    ]
  • HTTP 요청이 들어올 때마다, 등록된 urlpatterns 상의 매핑 리스트를 처음부터 순차적으로 훑으며, URL 매칭을 시도 # 매칭이 되는 URL Rule이 다수 존재하더라도, 처음 Rule만을 사용, 매칭이 되는 URL Rule이 없을 경우, 404 Page Not Found 응답을 발생
HTTP 요청이 들어올 때, 즉 예를 들어서 검색을 하거나, 주소창에 직접 주소를 입력하거나, 어떠한 이벤트가 발생하여 백엔드(Django)에게 HTTP request가 들어올 때, 적합한 로직(View 함수)을 가진 URL로 매칭을 해주는 것이 URL Dispatcher이다.

 

 

# urlpatterns 예시

instagram/urls.py

urlpatterns = [
    path('', views.post_list),
    path('<int:pk>/', views.post_detail),
    # 숫자 타입이 나오고, /로 끝날경우 뒤 함수를 호출하겠다는 의미
]

# 주소가 "instagram/" 일 경우에는 views.post_list 함수를 호출하고,

   주소가 "instagram/1" or  "instagram/2" 등 pk가 int형으로 나열될 경우 views.post_detail 함수를 호출하겠다는 의미

 

 


 

Path()와 re_path()

django.urls.re_path()

  • django.conf.urls.url() 과 동일 # 과거 방식과 동일

 

django.urls.path()

  • 기본 지원되는 Path converters를 통해 정규표현식 기입이 간소화 -> 만능은 아닙니다.
  • 자주 사용하는 패턴을 Converter로 등록하면, 재활용면에서 편리
from django.conf.urls import url # Django 1.x 스타일
from django.urls import path,re_path # Django 2.x ~ 스타일


urlpatterns = [
	# 장고 1.x에서는 아래 코드를 사용
    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), # 4개 연속된 숫자만 year라는 파라미터로 views.py에 넘겨줌
   
   	# 아래 코드와 같이 간소화 가능
   	path('articles/<int:year>/', views.year_archive), # 숫자 1개든, 2개든 모두 년도로 인식

	# re_path를 사용해 옛 방법과 같이 동일하게 사용 가능
    re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), # 4개 연속된 숫자만 year라는 파라미터로 views.py에 넘겨줌

]

 

 

정규표현식 -> https://wayhome25.github.io/django/2017/03/18/django-ep2-regx/

 

 

 


 

 

기본 제공되는 Path Converters

  • IntConverter = r"[0-9]+" = <int:>
  • StringConverter = r"[^/]+" = <str:>
  • UUIDConverter = r"[0-9a-f]{8}-[0-9a-f]{1}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}-"
  • SlugConverter (StringConverter 상속)= r"[-a-zA-Z0-9_]+"
  • PathConverter (StringConverter 상속) = r".+"

 


 

정규 표현식

  • 거의 모든 프로그래밍 언어에서 지원
  • 문자열의 패턴, 규칙, Rule을 정의하는 방법
  • 문자열 검색이나 치환작업을 간편하게 처리
  • 장고 URL Dispatcher에서는 정규표현식을 통한 URL 매칭
  • 문법

. 1글자에 대한 패턴 + 연속된 출연 횟수 지정 -> [어떤 글자가 올수있는지 후보군 나열] {출연(반복) 횟수 지정}

. 대괄호 내에 1글자에 대한 후보 글자들을 나열

-> [어떤 글자가 올수있는지 후보군 나열] {출연 횟수 지정}[어떤 글자가 올수있는지 후보군 나열] {출연 횟수 지정}

 

예시

  • 1자리 숫자 -> "[0123456789]" or "[0-9]" or r"[\d]" or r"\d"
  • 2자리 숫자 -> "[0123456789][0123456789]" or "[0-9][0-9]" or r"\d\d"
  • 휴대폰 번호 -> r"010[1-9]\d{7}"
  • 알파벳 소문자 1글자 -> "[abcdefghijklmnopqrstuvwxyz]" or "[a-z]"
  • 알파벳 대문자 1글자 -> "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]" or "[A-Z]"

 

주의 : 정규표현식은 띄어쓰기 하나에도 민감하기에, 가독성을 이유로 띄어쓰기 하지 말것

 

 

 


 

커스텀 Path Converter

만드는 방법 : 

from django.urls import path, re_path, register_converter


class YearConverter:
    regex = r"\d{4}"

    def to_python(self, value): # url로부터 추출한 문자열을 뷰에 넘겨주기 전에 변환
        return int(value)
    
    def to_url(self, value): # url reverse 시에 호출
        return str(value)

register_converter(YearConverter, 'year')

urlpatterns = [
    path('archives/<year:year>/', views.archives_year),
]

 

 


 

새로운 장고 앱을 생성할 때, 추천 작업 순서

  1. 앱 생성
  2. 앱이름/urls.py 파일 생성
  3. 프로젝트/urls.py에 include 적용
  4. 프로젝트/settings.py의 INSTALLED_APPS에 앱 이름 등록

 

 

# instagram/urls.py

urlpatterns = [
    path('archives/<int:year>/', views.archives_year),
    # 위와 같은 의미
   	path(r'archives/(?P<year>\d{4})/', views.archives_year),

]

 

 

# instagram/views.py

def archives_year(request, year):
    return HttpResponse(f"{year}년 archives")

 

 

반응형