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),
]