Django URL 라우팅 기초

1. 앱별 경로 분배 방법

# 프로젝트 루트 urls.py
from django.conf.urls import include, url
from app01 import views

urlpatterns = [
    # 관리자 경로 비활성화
    # url(r'^admin/', admin.site.urls),
    # 메인 페이지
    url(r'^$', views.main_page),
    # 앱별 경로 포함
    url(r'^app01/', include('app01.urls')),
    url(r'^app02/', include('app02.urls')),
]

# app01.urls.py 내용
from django.conf.urls import url
from app01 import views

urlpatterns = [
    url(r'^$', views.app01_home),
    url(r'^start/', views.start_page),
]

# app02.urls.py 내용
from django.conf.urls import url
from app02 import views

urlpatterns = [
    url(r'^$', views.app02_home),
    url(r'^main/', views.main_section),
]

2. 그룹화 매개변수 사용

# 무명 그룹 예시
url(r'^login/(\d{4})/(\d{2})', views.auth_check)

# 명명 그룹 예시
url(r'^login/(?P<year>\d{4})/(?P<month>\d{2})', views.auth_check)

# URL 파라미터 추출 예시
# 이름과 ID 추출
url(r'^(?P<username>[\w-]+)/p/(?P<post_id>\d+)', views.view_post)
url(r'^([\w-]+)/p/(\d+)', views.view_post)

# 정적 페이지 변환
# 동적 URL을 정적 형식으로 변환하여 SEO 최적화
# 예: /login -> /login.html

3. 위치 기반 파라미터

# 연도 기반 경로
url(r'^books/(\d{4})/', views.year_books)

# 연도-월 기반 경로
url(r'^books/(\d{4})/(\d{1,2})/', views.year_month_books)

# 뷰 함수 예시
def year_month_books(request, year, month):
    print(year, month)
    return HttpResponse(f"{year}/{month}")

4. 기본값 설정

# urls.py
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^blog/$', views.page),
    url(r'^blog/page(?P<num>\d+)/$', views.page),
]

# views.py
def page(request, num="1"):
    pass

5. 역방향 URL 해석

기본 사용

# 라우팅 별칭 설정
url(r'^home/$', views.home, name='main_home')

# 뷰 내부 사용
reverse('main_home')

# 템플릿에서 사용
{% url 'main_home' %}

파라미터 포함

# 라우팅 설정
path('user/<str:username>/', views.profile, name='user_profile')

# URL 생성
reverse('user_profile', args=['john_doe'])
reverse('user_profile', kwargs={'username': 'john_doe'})

6. 네임스페이스 관리

# 메인 라우팅 설정
url(r'^app01', include(('app01.urls', 'app01'), namespace='app_ns'))

# 서브 라우팅
url(r'^profile/$', views.profile, name='profile')

# 뷰에서 사용
reverse('app_ns:profile')

# 템플릿에서 사용
<a href="{% url 'app_ns:profile' %}">프로필</a>

7. 경로 변환기

# 기본 변환기
path('login/<int:year>', views.login)
path('login/<str:name>', views.login)
path('login/<path:section>', views.article)

# 복잡한 경로 예시
path('<str:author>/posts/<int:post_id>.html', views.article)

# 변환기 사용 제한
# re_path에서는 커스텀 변환기 사용 불가

8. 커스텀 변환기 구현

# 커스텀 변환기 클래스
class YearConverter:
    regex = r'\d{4}'
    
    def to_python(self, value):
        return int(value)
    
    def to_url(self, value):
        return f"{int(value):04d}"

# 등록 및 사용
from django.urls import register_converter, path
register_converter(YearConverter, 'year')

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

태그: Django URL routing view functions URL patterns reverse lookup

6월 14일 01:49에 게시됨