Django URL Dispatcher와 정규 표현식
2022. 1. 7. 14:52ㆍ강의 정리/Django Views
반응형
장고(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),
]
새로운 장고 앱을 생성할 때, 추천 작업 순서
- 앱 생성
- 앱이름/urls.py 파일 생성
- 프로젝트/urls.py에 include 적용
- 프로젝트/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")
반응형
'강의 정리 > Django Views' 카테고리의 다른 글
Django 뷰 장식자(Decorators) (0) | 2022.01.10 |
---|---|
Django 기본 CBV API (Generic display views) (0) | 2022.01.10 |
Django 기본 CBV API (Base views) (0) | 2022.01.09 |
Django 클래스 기반 View (0) | 2022.01.08 |
Django 다양한 응답의 함수 기반 뷰 (0) | 2022.01.06 |