반응형

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'),
]
반응형

+ Recent posts