Django URL 라우팅 시스템의 다양한 전달 방식과 역방향 해석

정규 표현식 기반 URL 매핑

Django는 urls.py에서 정규 표현식을 사용해 HTTP 요청을 특정 뷰 함수에 연결합니다. 이 과정에서 클라이언트로부터 데이터를 추출하고, 이를 뷰에 인자로 전달할 수 있습니다.

1. 쿼리 스트링을 통한 값 전달

가장 간단한 방법은 URL 쿼리 파라미터를 사용하는 것입니다.

  • 템플릿 예시:
<form action="/edit_book/?id={{ obj.id }}" method="post">
  • URL 설정:
url(r'^edit_book/', views.edit_book),
  • 뷰 처리:
def edit_book(request):
    book_id = request.GET.get('id')  # 쿼리 스트링에서 id 추출

2. 위치 기반 그룹 캡처 (정규식 그룹)

정규 표현식의 괄호 ()를 이용해 패턴을 캡처하고, 해당 값을 뷰에 위치 인자로 전달합니다.

  • 템플릿:
<form action="/author_update/{{ obj.id }}" method="post">
  • URL 설정:
url(r'^author_update/([0-9]+)/$', views.update_author),
  • 뷰 함수:
def update_author(request, arg1):
    author_id = arg1  # 첫 번째 그룹의 값이 전달됨

여기서 ([0-9]+)는 하나의 매개변수를 의미하며, 뷰에서는 순서대로 인자를 받습니다.

3. 명명된 그룹 캡처 (Named Groups)

캡처된 그룹에 이름을 부여하면, 뷰 함수에서 키워드 인자로 받아 처리할 수 있어 가독성이 향상됩니다.

  • URL 설정:
url(r'^article/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.article_archive),
  • 뷰 함수:
def article_archive(request, year, month):
    # year와 month는 키워드 인자로 전달됨
    articles = Article.objects.filter(
        created_at__year=year,
        created_at__month=month
    )

이 방식은 여러 매개변수가 있을 때 순서에 의존하지 않아도 되므로 오류를 줄일 수 있습니다.

4. URL 패턴에 추가 데이터 전달 (딕셔너리)

특정 뷰에 고정된 값을 전달해야 할 경우, URL 패턴에서 딕셔너리를 함께 넘길 수 있습니다.

  • URL 설정:
url(r'^profile/$', views.show_profile, {'user_type': 'admin'}),
  • 뷰 함수:
def show_profile(request, user_type):
    if user_type == 'admin':
        # 관리자 전용 로직 처리

이 방식은 동일한 뷰를 다양한 컨텍스트에서 재사용할 때 유용합니다.

주의사항: 위치 인자와 키워드 인자의 혼용 금지

하나의 URL 패턴 내에서 위치 기반 그룹과 명명된 그룹을 동시에 사용하면 예기치 않은 오류가 발생할 수 있습니다.

# 잘못된 예시 — 피해야 함
url(r'^data/([0-9]+)/(?P<code>[A-Z]{2})/$', views.process_data)
# 이 경우 뷰의 인자 순서가 꼬일 수 있음

URL 분리 및 네임스페이스

프로젝트가 커질수록 모든 URL을 하나의 파일에 두는 것은 관리하기 어렵습니다. 따라서 앱별로 urls.py를 분리하고, include()를 통해 포함시킵니다.

# main urls.py
from django.conf.urls import url, include

urlpatterns = [
    url(r'^blog/', include('blog.urls')),
    url(r'^shop/', include('shop.urls')),
]

네임스페이스를 활용한 충돌 방지

서로 다른 앱이 동일한 URL 이름(name)을 사용할 수 있으므로, 네임스페이스를 지정하여 구분합니다.

  • 앱 내 urls.py:
app_name = 'blog'
urlpatterns = [
    url(r'^create/$', views.create_post, name='create'),
]
  • 템플릿 내 역방향 해석:
<form action="{% url 'blog:create' %}" method="post">

역방향 URL 해석 (Reverse Resolution)

Django는 이름을 기반으로 URL을 다시 생성하는 기능을 제공하여, 하드코딩된 경로를 피할 수 있습니다.

템플릿에서의 사용

{% url 'article_archive' year=2023 month=12 %}

뷰 또는 파이썬 코드 내에서의 사용

from django.urls import reverse
from django.shortcuts import redirect

def some_view(request):
    return redirect(reverse('update_author', args=[123]))
    # 또는 키워드 인자 사용
    return redirect(reverse('article_archive', kwargs={'year': 2023, 'month': 12}))

태그: Django URL routing Regular Expressions Named Groups Reverse Resolution

7월 13일 21:13에 게시됨