- create
- Django
- 스택
- 통계학
- count
- delete
- M:N
- 완전검색
- update
- Tree
- migrations
- regexp
- Vue
- 트리
- 쟝고
- 그리디
- N:1
- 백트래킹
- 뷰
- Article & User
- SQL
- distinct
- ORM
- outer join
- 큐
- DB
- stack
- drf
- 이진트리
- Queue
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
데이터 분석 기술 블로그
Django에 대하여(8)_App과 URL 본문
#변경 전
{% 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),
]
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 패턴의 이름과 일치하는 절대 경로 주소를 반환하는 함수입니다.
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 |