장고에서는 MVC패턴의 컨트롤러(Controller)에 대응하는 뷰(View)가 존재하는데, 이 뷰를 URL 엔드포인트에 연결하는 것이 장고의 URL 부분이다.
URL, urls.py
장고에서는 각 뷰에 대응하는 URL을 맵핑한다. 그리고 이 URL을 맵핑하는 파일을 URLConf라고 하는데, 보통 우리는 urls.py에 URLConf를 정의한다.
urls.py는 최초 프로젝트 생성 시에 프로젝트 폴더에 하나(해당 가이드에서는 django_basic/urls.py) 생성된다. 그리고 보통 여기서 앱별로 urls.py를 추가적으로 생성하여 사용한다.
우선 django_basic/urls.py 파일을 확인해 보자.
"""
URL configuration for django_basic project.
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.2/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
친절하게 주석으로 사용 설명과, 맵핑된 urlpatterns가 존재한다. 주석의 내용만 보아도 path에 view를 연결하는 방법을 익힐 수 있다.
urlpatterns는 path들의 리스트이다. 각 path는 첫 번째 인자로 route 문자열을 받고, 두 번째 인자로 연결할 view 또는 다른 URLconf를 입력받는다.
기본적으로 생성되어 있는 path('admin/', admin.site.urls)는 장고에서 자동으로 생성해 주는 관리자 페이지로의 맵핑을 위한 path이다.
path
결국 urls.py의 구조는 urlpatterns에 path 여러 개가 있는 구조이다. 그렇기에 path 사용법에 대해 알아보자. path의 정의는 이렇게 되어있다.
@overload
def path(
route: str,
view: Callable[..., _ResponseType],
kwargs: Dict[str, Any] = ...,
name: str = ...,
) -> URLPattern: ...
@overload
def path(
route: str, view: IncludedURLConf, kwargs: Dict[str, Any] = ..., name: str = ...
) -> URLResolver: ...
@overload
def path(
route: str,
view: List[Union[URLResolver, str]],
kwargs: Dict[str, Any] = ...,
name: str = ...,
) -> URLResolver: ...
첫 번째 인자에는 route, 두 번째 인자에는 view(또는 URLConf), 그다음은 name, kwargs를 인자로 받는 형태이다. 우선은 두 번째 인자인 view(또는 URLConf)에 대해 알아보자.
path view(URLconf) 설정
function view 맵핑
뷰는 다음에 소개할 것이니 간단히 이야기해 보자면, 뷰는 http request를 받아 서버에서 내부적으로 처리하고 reponse를 보내는 장고의 중심 controller라 할 수 있다. view는 함수형 또는 클래스(class-based)로 구현할 수 있는데, 우선 함수형 뷰의 맵핑방법을 소개한다.
view는 보통 각 앱의 views.py 파일에 정의한다. 고로 해당 가이드의 books앱의 views.py에 index라는 이름의 뷰가 있다고 가정하겠다.
# books/views.py
def index(request):
return render(request, "books/index.html")
이렇게 정의된 함수형 뷰를 url에 맵핑하려면 다음과 같이 urlpatterns에 path를 추가해 주면 된다.
# django_basic/urls.py
from django.urls import path
import books
urlpatterns = [
...
path('index/', books.views.index)
]
# 또는
from books.views import index
urlpatterns = [
...
path('index/', index)
]
위와 같이 각 앱의 views.py에 구현한 뷰를 url에 맵핑할 수 있다. 앱을 직접 불러오든, 각각의 뷰를 불러오든 파이썬의 import 방법에 맞춰서 어떤 방식으로도 추가할 수 있다.
class-based-view 맵핑
다음은 함수형이 아닌 클래스로 선언한 뷰의 맵핑 방법이다. 이후 뷰를 소개하는 4장에서 클래스형 뷰를 다룰때 알아볼 것이다.
# django_basic/urls.py
from django.urls import path
from books.views import index
urlpatterns = [
...
path('', index.as_view())
]
URLConf 맵핑
URLconf 맵핑이란 다른 urls.py 파일을 맵핑하는 방식이다. 프로젝트에는 여러 앱이 존재할 텐데(예: books, users) 모든 앱의 url path를 한 파일에 지정하는 것보다, 각 앱에서 각각 관리하는 것이 더 보기 좋고 효율적일 것이다. 이를 위해 URLConf 맵핑을 한다.
예시로 books 앱에 urls.py를 아래와 같이 생성한다.
# books/urls.py
from django.urls import path
from books import views
urlpatterns = [
path('index/', views.index)
]
위와 같이 index 뷰를 index/ 로 맵핑되게 설정한 파일을 새로 생성하였다.
그러면 이 파일을 메인파일인 django_basic/urls.py 파일에서 맵핑해 주자. 다른 urls.py를 맵핑하기 위해서는 django.urls의 include()를 사용한다. include의 내부에는 문자열로 appname.urls 형식의 이름으로 작성해 준다.
# django_basic/urls.py
from django.urls import path, include
urlpatterns = [
...
path('books/', include("books.urls"))
]
위와 같이 books.urls를 books/에 맵핑해 주었다. 이렇게 설정한다면 앞으로 books/로 들어오는 모든 요청은 books.urls로 가게 된다. 즉 www.example.com/books/index/ 로 요청 시에 index 뷰가 호출되는 방식이다.
path에 route 다루기
path의 첫 번째 인자로 오는 route는 단순히 고정된 문자열뿐만 아닌 여러 종류의 인자를 받을 수 있다.
# books/urls.py
from django.urls import path
from books import views
urlpatterns = [
path('books/', views.books),
path('books/<int:book_id>', views.book)
]
위와 같이 인자를 받을 수 있다. 인자는 view에 전달되는데, 이때 view에서 어떻게 인자를 받아 활용하는지는 이후에 view를 다룰 때 알아보겠다. 그리고 위와 같이 route에서 받을 수 있는 인자의 자료형은 5가지가 있다.
1. str
2. int
3. slug
4. uuid
5. path
path에 name 전달하기
각 URL을 맵핑할 때 이에 쉽게 접근할 수 있게 별칭을 지어줄 수 있다. 이는 이후 뷰에서 리다이렉트등을 설정해 줄 때 사용된다. 이렇게 설정해 준 별칭은 뷰나 템플릿등에서 간단히 URL 경로를 지정해 줄 수 있게 해 준다. 또한 이렇게 별칭으로 지정된 경로는 추후에 path를 변경하더라도 이름만 같다면 유지되어 하드코딩을 방지하는 역할을 하여 사후 보수 측면에서도 권장된다.
별칭을 설정하는 방법은 다음과 같다. path() 함수는 다음과 같이 경로와 뷰 말고도 여러 인자를 받을 수 있는데 여기에 name이라는 인자를 추가적으로 전달해 주면 된다.
# books/urls.py
urlpatterns = [
...
path('books/', views.books, name="books"),
]
이렇게 설정한 별칭은 이후에 뷰의 redirect(), reverse() 또는 템플릿의 url 태그등으로 사용한다.
여기까지 진행했을 때의 파일 구성: Github
'파이썬 (Python) > 장고 (Django)' 카테고리의 다른 글
DRF OAuth 라이브러리 비교 (0) | 2023.07.24 |
---|---|
[Django Basic] 3.1. URL심화 (0) | 2023.07.15 |
[Django Basic] 2. Model, models.py, Database (0) | 2023.07.15 |
[Django Basic] 1.4. Applications, apps.py, AppConfig (0) | 2023.07.15 |
[Django Basic] 1.3. manage.py, django-admin (0) | 2023.07.15 |