반응형
Django의 urlpatterns는 URL을 처리하기 위한 매핑 테이블 역할을 한다.
Django의 URL 처리 시스템은 user가 보낸 HTTP 요청의 URL을 분석하고, 해당 요청을 적절한 view 함수 또는 view 클래스로 routing하는 데 기반을 두고 있다.
urlpatterns의 단계별 작동 원리
1. URL 요청 수신
- Django 프로젝트가 client의 HTTP 요청을 수신한다.
- 이 요청은 Django의 URLconf 시스템으로 전달된다.
- URLconf 시스템이란, Django 프로젝트에서 URL과 뷰(view)를 매핑하기 위한 설정 체계이다.
2. URLconf와 urlpatterns
- Django 설정 파일(settings.py)의 ROOT_URLCONF 변수에 명시된 모듈이 메인 URLconf로 사용된다.
# project/settings.py
ROOT_URLCONF = 'project.urls'
- 해당 모듈에는 urlpatterns라는 이름의 list가 정의되어 있고, 이 list에는 URL 패턴과 뷰가 매핑되어 있다.
3. URL 매칭 과정
- Django는 urlpatterns의 각 항목을 순서대로 비교하여 요청된 URL과 일치하는 항목을 찾는다.
- URL 패턴을 정의하는 데 path()나 re_path() 함수가 사용된다.
from django.urls import path
urlpatterns = [
path('home/', views.home, name='home'), # 'home/' 요청 -> views.home 함수로 처리
path('about/', views.about, name='about'),
]
4. URL 패턴의 동작 방식
- path() 함수는 정규화된 URL 경로를 기반으로 URL을 매칭한다.
path('articles/<int:year>/', views.year_archive)
위 예시는 /articles/2024/ 같은 요청을 처리한다. 이때 year 변수에는 2024 값이 전달된다.
- re_path() 함수는 정규표현식을 사용하여 URL을 매칭한다.
from django.urls import re_path
urlpatterns = [
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
]
5. 뷰 함수로의 라우팅
- 매칭된 URL 패턴에 연결된 뷰 함수나 뷰 클래스가 호출된다.
- URL 패턴에서 캡처된 값은 뷰 함수의 argument로 전달된다.
6. App 사용시 URLconf 분리
- (여러 app으로 구성된) 복잡한 프로젝트에서는 include()를 사용하여 URLconf를 분리할 수 있다.
from django.urls import include
urlpatterns = [
path('blog/', include('blog.urls')), # blog app의 URLconf로 위임
]
- Namespace를 사용하면 여러 앱 간 URL 이름 충돌을 방지할 수 있다.
7. URL 패턴이 매칭되는 경우가 없는 경우의 처리
- urlpatterns의 항목 중 요청된 URL과 일치하는 것이 없으면, Django는 404 Not Found 에러를 반환한다.
전체 흐름 예시
# project/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('myapp/', include('myapp.urls')), # myapp의 URLconf로 위임
]
# myapp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'), # 루트 URL 처리
path('hello/<str:name>/', views.hello, name='hello'),
]
반응형
'Django' 카테고리의 다른 글
[django] reverse 함수 (0) | 2024.12.28 |
---|---|
[django] Model attribute들은 어떤 class attribute일까? (0) | 2023.11.23 |
[django] CSRF verification error와 CSRF token 사용방법 (0) | 2023.11.22 |