WeniVooks

검색

Django 베이스캠프

URL 추가 설명

1. Django의 URL 패턴

URL 패턴은 from django.urls import path, re_path, reverse 등을 사용하여 일련의 규칙으로 URL을 관리함으로 페이지를 질서 있게 관리하는 방법입니다. 잘 구성된 URL 패턴은 웹사이트의 사용성을 높이고, 개발자가 웹사이트를 관리하기 쉽게 만듭니다. URL 패턴은 다음과 같은 요소로 구성됩니다.

  • URL 주소: 웹사이트의 주소를 나타냅니다. 사용자가 웹사이트에 접속할 때 입력하는 주소입니다.
  • 뷰 함수: URL 주소로 들어가면 실행되는 함수입니다. 이 함수는 웹사이트의 페이지를 보여주거나 데이터를 처리하는 역할을 합니다.
  • URL 별명: URL 주소에 붙이는 별명으로, URL을 쉽게 참조할 수 있게 합니다.
  • 추가 정보: URL 주소에 추가 정보를 전달할 때 사용합니다. 이 정보는 딕셔너리 형태로 전달됩니다.
  • URL 인클루드: URL을 여러 부분으로 나눠서 관리할 때 사용합니다. 이 방법을 사용하면 URL을 쉽게 찾고 관리할 수 있습니다.

이 밖에도 접속할 수 있는 권한이나 등을 함께 문서나 주석으로 정리해놓으면 URL 패턴을 더욱 효율적으로 관리할 수 있습니다.

2. Django에서의 URL 관리

Django에서는 urls.py라는 파일에 URL 패턴을 정의합니다. 이 파일은 프로젝트의 루트 디렉토리에 있습니다. URL 패턴을 정의할 때는 urlpatterns라는 변수를 사용합니다. 이 변수는 URL 패턴을 담는 리스트입니다. URL 패턴은 주로 path() 함수를 사용하여 정의합니다. 이 path() 함수는 가상환경 안 \venv\Lib\site-packages\django\urls\conf.py에 정의되어 있습니다.

다음은 URL 패턴을 정의하는 예시입니다.

from django.urls import path
from main.views import index, blog_list, blog_details, year_archive
 
urlpatterns = [
    path('', index),
    path('blog/', blog_list, name='blog_list'),
    path('blog/<int:pk>/', blog_details, name='blog_detail'),
    path('blog/<int:year>/', year_archive, {'hello': 'world'}, name='news-year-archive'),
]
from django.urls import path
from main.views import index, blog_list, blog_details, year_archive
 
urlpatterns = [
    path('', index),
    path('blog/', blog_list, name='blog_list'),
    path('blog/<int:pk>/', blog_details, name='blog_detail'),
    path('blog/<int:year>/', year_archive, {'hello': 'world'}, name='news-year-archive'),
]

import문은 필요한 함수와 뷰를 가져옵니다. urlpatterns는 URL 패턴을 담는 리스트이고, path() 함수는 URL 패턴을 정의하는 핵심적인 역할을 합니다.

2.1 path() 함수

path() 함수는 웹사이트의 주소와 그 주소에서 실행될 작업을 연결해줍니다.

path(route, view, kwargs=None, name=None)
path(route, view, kwargs=None, name=None)

route는 URL 경로를 나타냅니다. 이 주소를 이용해서 웹사이트에 들어 갈 수 있습니다. view는 route의 URL 경로로 들어가면 실행되는 함수입니다. kwargs는 view에 추가 정보를 전달할 때 사용할 수 있습니다. name은 URL에 붙이는 별명으로, 이를 통해 URL을 쉽게 참조할 수 있습니다. 예를 들어, 웹페이지에서 이 URL을 사용할 때는 이렇게 쓸 수 있습니다.

<a href="{% url 'blog_detail' 1 %}">첫 번째 블로그 글</a>
<a href="{% url 'blog_detail' 1 %}">첫 번째 블로그 글</a>

여기서 'blog_detail'은 URL의 별명이고, 1은 블로그 글 번호입니다.

kwargs는 딕셔너리 형태로 추가 정보를 전달하는 데 사용합니다. 예를 들어, year_archive 함수에 추가 정보를 전달할 때는 다음과 같이 사용합니다.

# urls.py
path('blog/<int:year>/', year_archive, {'hello': 'world'}, name='news-year-archive'),
 
# views.py
def year_archive(request, year, **kwargs):
    print(kwargs['hello'])
# urls.py
path('blog/<int:year>/', year_archive, {'hello': 'world'}, name='news-year-archive'),
 
# views.py
def year_archive(request, year, **kwargs):
    print(kwargs['hello'])

views.py에서 추가 정보를 받을 때에는 **kwargs를 사용합니다.

path() 함수를 잘 사용하면, 웹사이트의 주소를 체계적으로 관리할 수 있고, 나중에 주소 구조를 바꿔야 할 때도 쉽게 수정할 수 있습니다. 좀 더 상세한 내용은 아래 django 공식 문서를 참고해 주세요.

Django 공식 문서- django.urls.path
2.2 include() 함수

대형 Django 프로젝트에서 URL을 하나의 파일에서 모두 관리하면 여러 문제가 생깁니다. 이 파일이 너무 길어지고 복잡해져서 원하는 URL을 찾거나 고치는 일이 힘들어집니다. 여러 사람이 함께 작업할 때도 자주 충돌이 일어납니다. 이런 문제를 해결하려고 Django는 include() 함수를 사용합니다. 이걸 사용하면 URL을 여러 부분으로 나눠서 관리할 수 있습니다. include 함수는 path 함수와 동일한 \venv\Lib\site-packages\django\urls\conf.py 파일 안에 있습니다.

다음은 include의 사용 예시 입니다.

from django.urls import path, include
from main.views import index
 
urlpatterns = [
    path('', index),
    path('blog/', include('blog.urls')),
]
from django.urls import path, include
from main.views import index
 
urlpatterns = [
    path('', index),
    path('blog/', include('blog.urls')),
]

여기서 'blog.urls'는 블로그 부분의 URL을 따로 모아놓은 파일입니다.

from django.urls import path
from . import views
 
urlpatterns = [
    path("", views.blog_list, name="blog_list"), 
    path("<int:pk>/", views.blog_detail, name="blog_detail"),
]
from django.urls import path
from . import views
 
urlpatterns = [
    path("", views.blog_list, name="blog_list"), 
    path("<int:pk>/", views.blog_detail, name="blog_detail"),
]

URL을 분리하면 각 앱의 URL을 별도로 관리할 수 있어 필요한 URL을 빠르게 찾고 고칠 수 있습니다. 또, 다른 앱에서 특정 기능을 쓰고 싶을 때, URL 설정도 함께 가져올 수 있어 재사용하기 편리합니다.

2.3 re_path() 함수

re_path() 함수는 URL 패턴을 정의할 때 정규표현식을 사용할 때 사용합니다. re_path() 함수는 path() 함수와 사용법이 비슷하지만, URL 주소를 정규표현식으로 정의할 수 있습니다. re_path() 함수는 path() 함수와 동일한 \venv\Lib\site-packages\django\urls\conf.py 파일 안에 있습니다.

다음은 re_path() 함수의 사용 예시입니다.

# urls.py
from django.urls import re_path
 
urlpatterns = [
    re_path(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive),
]
 
# views.py
def year_archive(request, year):
    print(year)
# urls.py
from django.urls import re_path
 
urlpatterns = [
    re_path(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive),
]
 
# views.py
def year_archive(request, year):
    print(year)

여기서 r'^blog/(?P<year>[0-9]{4})/$'는 URL 주소를 정규표현식으로 정의한 것입니다. 이 정규표현식은 blog/로 시작하고, 4자리 숫자로 된 year 변수를 가지는 URL 주소를 나타냅니다. 이렇게 정규표현식을 사용하면 URL 주소를 더 유연하게 정의할 수 있습니다.

2.4 reverse() 함수

reverse()함수는 URL 별명을 이용해서 URL 주소를 만들어주는 함수입니다. reverse() 함수는 URL 별명을 인자로 받아서 해당 URL 주소를 반환합니다. reverse() 함수는 \venv\Lib\site-packages\django\urls\base.py에 있습니다. path() 함수와 include()가 있는 파일에 들어있진 않습니다. 다만 동일하게 from django.urls로 import 할 수 있습니다.

다음은 reverse() 함수의 사용 예시입니다.

# views.py
from django.shortcuts import redirect
from django.urls import reverse
 
def my_view(request):
    url = reverse('blog_detail', args=[1])
    print(url) # /blog/1/
    return redirect(url)
    # 다만 이렇게도 할 수 있기 때문에 reverse를 사용하는 경우가 많지는 않습니다.
    # return redirect('blog_detail', 1) 
# views.py
from django.shortcuts import redirect
from django.urls import reverse
 
def my_view(request):
    url = reverse('blog_detail', args=[1])
    print(url) # /blog/1/
    return redirect(url)
    # 다만 이렇게도 할 수 있기 때문에 reverse를 사용하는 경우가 많지는 않습니다.
    # return redirect('blog_detail', 1) 
2.2 템플릿 상속과 정적 파일2.4 View 추가 설명