데이터 분석 기술 블로그

Django에 대하여(8)_App과 URL 본문

백엔드

Django에 대하여(8)_App과 URL

데이터분석가 이채은 2024. 3. 29. 03:26
#변경 전
{% url 'articles:index' %}

1. App URL mapping

App URL mapping이란, 각 앱에 URL을 정의하는 것으로 프로젝트와 각 앱이 URL을 나누어 관리를 편하게 할 수 있습니다.

 

2번째 앱 pages 생성 후 발생할 수 있는 문제는 view 함수 이름이 같거나 같은 패턴의 url 주소를 사용하게 되는 경우가 있습니다. 이를 해결하기 위해서는 아래 코드와 같이 해결할 수 있으나 더 좋은 방법이 필요합니다. 따라서, URL을 각자 app에서 관리해서 문제를 해결할 수 있습니다.

# firstpjt/urls.py

from articels import views as articles_views
from pages import views as pages_views

urlpatterns = [
    ...,
    path('pages', pages_views.index),
]

 

기존 url 구조
변경된 url 구조
url 구조 변화

1-1. include()

include()는 프로젝트 내부 앱들의 URL을 참조할 수 있도록 매핑하는 함수입니다. URL의 일치하는 부분까지 잘라내고, 남은 문자열 부분은 후속 처리를 위해 include 된 URL로 전달합니다.

# firstpjt/urls.py

from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('articles/', include('articles.urls')),
    path('pages/', include('pages.urls')),
]

2. URL 이름 지정

url 구조 변경에 따른 문제점은 기존 'articles/' 주소가 'articles/index/'로 변경되면서 해당 주소를 사용하는 모든 위치를 찾아가서 변경해야 한다는 것입니다. 이를 해결하기 위해 URL에 이름을 지어주고 이름만 기억하면 됩니다.

# firstpjt/urls.py

path('aritlces/', include('arciels.urls'))
# articles/ursl.py

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

 

2-1. Naming URL patterns

Naming URL patterns는 URL에 이름을 지정하는 것으로 path 함수의 name 인자를 정의해서 사용합니다.

 

※ Naming URL patterns 적용: path 함수의 name 키워드 인자를 정의해서 사용합니다.

# articles/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('index/', views.index, name='index'),
    path('dinner/', views.dinner, name='dinner'),
    path('search/', views.search, name='search'),
    path('throw/', views.throw, name='throw'),
    path('catch/', views.catch, name='catch'),
    path('articels/<int:num>/', views.detail, name='detail'),
    path('hello/<str:name>/', views.greeting, name='greeting'),
]
# pages/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('index/', views.index, name='index'),
]

 

※ URL 표기 변화: href 속성 값 뿐만 아니라 form의 action 속성처럼 url을 작성하는 모든 위치에서 변경합니다.

# 변경 전
<!-- articles/index.html -->

{% extends 'base.html' %}

{% blcok content %}
  <h1>Hello, {{ name }}</h1>
  <a href="/dinner/">dinner</a>
  <a href="/search/">search</a>
  <a href="/throw/">throw</a>
{% endblcok content %}
# 변경 후
<!-- articles/index.html -->

{% extends 'base.html' %}

{% blcok content %}
  <h1>Hello, {{ name }}</h1>
  <a href="{% url 'dinner' %}">dinner</a>
  <a href="{% url 'search' %}">search</a>
  <a href="{% url 'throw' %}">throw</a>
{% endblcok content %}

 

2-2 'url' tag

{% url 'url-name' arg1 arg2 %}

주어진 URL 패턴의 이름과 일치하는 절대 경로 주소를 반환하는 함수입니다.

url 태그 적용 후 브라우저 출력 확인


3. URL 이름 공간

URL 이름 지정 후에는 단순히 이름만으로는 완벽하게 분리할 수 없기 때문에 articles 앱의 url 이름과 pages 앱의 url 이름이 같은 상황에 문제가 생깁니다. 이를 해결하기 위해 이름에 성(키, key)를 붙입니다.

# articles/urls.py

path('index/', views.index, name='index')
# pages/urls.py

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

 

3.1 'app_name' 속성 지정

app_name의 변수 값 설정

# articles/urls.py

app_name = 'articles'
urlpatterns = [
    ...,
]
# pages/urls.py

app_name = 'pages'
urlpatterns = [
    ...,
]

 

3.2 URL tag의 최종 변화

마지막으로 url 태그가 사용하는 모든 곳의 표기 변경하기

#변경 전
{% url 'index' %}

참고

1. Trailing Slashes

  • Django는 URL 끝에 '/'가 없다면 자동으로 붙인다. (Django의 url 설계 철학)
  • "기술적인 측면에서, foo.com/bar와 foo/bar/는 서로 다른 URL" - 검색 엔진 로봇이나 웹 트래픽 분석 도구에서는 이 두 주소를 서로 다른 페이지로 본다.
  • Django는 검색 엔진이 혼동하지 하지 않게 하기 위해 붙이는 것을 선택했다.
  • 하지만 모든 프레임워크가 이렇게 동작하는 것은 아니다.

'백엔드' 카테고리의 다른 글

Django에 대하여(10)_Migrations  (0) 2024.03.31
Django에 대하여(9)_Model  (0) 2024.03.30
Django에 대하여(7)_Django URLs  (0) 2024.03.28
Django에 대하여(6)_form 활용  (0) 2024.03.27
Django에 대하여(5)_요청과 응답  (0) 2024.03.26