WEB

[Django 04] URL 분리하기

mhko411 2021. 3. 9. 20:52
728x90

프로젝트의 규모가 커질수록 애플리케이션별로 URL을 분리하여 사용하는 것이 효율적이다. 또한 같은 이름의 HTML문서가 있다면 어떤 페이지를 출력할까?


urls.py에 URL 등록하기

기존에는 프로젝트의 urls.py에 애플리케이션들의 URL을 등록해서 사용하였다. 아래와 같이 applications라는 애플리케이션을 생성하고 app/이라는 URL을 사용자가 요청했을 때 views.py의 index함수가 요청을 받고 html문서를 보여주도록 한 것이다.

하지만 또다른 애플리케이션을 생성하여 URL을 등록할 때 같은 이름의 views 모듈이 존재한다. 이러한 경우와 각각의 애플리케이션을 독립적으로 분리하기위해 URL을 분리할 필요가있다.

from django.contrib import admin
from django.urls import path
from applications import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app/', views.index),
]

 

include를 통한 URL 분리

django.urls의 include 모듈을 통해 URL 분리를 시도한다. app1과 app2라는 두 개의 애플리케이션이 존재한다고 하자. 그러면 아래와 같이 URL을 등록할 수 있다. include()안에 각각 애플리케이션들의 urls.py로 연결하도록 하였다. 그렇다면 이젠 애플리케이션 별로 urls.py를 생성하여 사용할 수 있을 것이다.

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app1/', include('app1.urls')),
    path('app2/', include('app2.urls')),
]

 

두 개의 애플리케이션에 index.html이 있다면?

지금까지 애플리케이션 별로 urls.py를 지정하여 URL을 분리하였다. 이때 두 개의 애플리케이션에 index.html을 만들고 index URL에 접근하면 어떤 페이지가 출력될까? settings.py에서 INSTALLED_APPS에서 정의한 순서가 먼저인 애플리케이션의 index.html을 실행한다.

Django는 html문서를 출력할 때 templates라는 폴더에서 찾게된다. 그렇기 때문에 애플리케이션 별로 templates 폴더를 만들어주고 그 안에 html을 작성하였다. 따라서 templates 폴더 안에 애플리케이션과 같은 이름의 폴더를 하나 생성하여 그 안에 html을 작성하도록 한다.

이러한 구조를 만들었을 때는 views.py에서 렌더링을 할 때 기존의 'index.html'에서 'app1/index.html'로 해주도록 한다. 이 디렉토리의 의미는 templates/app1/index.html이다.

 

URL 이름공간

URL이 길거나 기억하기 쉽지않을 때 URL의 별명을 지을 수 있다. 아래와 같이 path()안에 name이라는 속성을 정의하면된다.

path('index/', views.index, name='index')

 

또한 각 애플리케이션의 이름도 지을 수 있다. urls.py에서 app_name을 아래와 같이 정의할 수 있다.

# urls.py
app_name = 'app1'

이를 HTML 내에서 활용할 수 있다. {% url %}이라는 템플릿 태그를 사용한다. 아래는 app1이라는 애플리케이션에서 index라는 별명을 갖는 페이지로 이동하는 의미이다.

<a href="{% url 'app1:index' %}"></a>

 

'WEB' 카테고리의 다른 글

[Django 06] Model  (0) 2021.03.10
[Django 05] form 사용하기  (0) 2021.03.09
[Django 03] 템플릿 상속  (0) 2021.03.08
[Django 02] Django Template Language(DTL)  (0) 2021.03.08
[Django 01] 첫 번째 프로젝트 생성하기  (0) 2021.03.08