반응형
reverse() 함수는 Django에서 URL 패턴의 이름(name)을 사용해서 해당되는는 URL을 생성하는 기능을 수행한다.
이를 사용하면 URL 하드코딩을 피하고 유연한 URL 관리가 가능해진다.
# urls.py
path('posts/<int:post_id>/', views.post_detail, name='post_detail')
# views.py나 다른 Python 코드에서
from django.urls import reverse
url = reverse('post_detail', args=[42]) # '/posts/42/' 반환
위 코드를 보면서 reverse()의 주요 특징과 장점을 살펴보자.
- URL 패턴 변경에 유연하게 대응할 수 있다.
- URL 구조가 바뀌더라도, 이름(name)이 같다면 코드를 수정할 필요가 없다.
- (ex: "posts/42/"가 "articles/42/"로 바뀌어도 reverse() 호출은 동일하다.)
- URL 구조가 바뀌더라도, 이름(name)이 같다면 코드를 수정할 필요가 없다.
- 다양한 컨텍스트에서 사용 가능하다.
- view 함수에서 redirect할 때
- template에서 link를 생성할 때(template에서는 url 태그로 사용)
- Model의 get_absolute_url() 메서드에서
- 인자 전달 방식
- args: positional argument로 전달(list 형태)
- kwargs: keyword argument로 전달(dict 형태)
예를 들어, template에서는 아래와 같이 사용된다:
<a href="{% url 'post_detail' post.id %}">포스트 보기</a>
이렇게 reverse()를 사용해서 URL을 관리하면 코드의 유지보수성이 좋아진다. URL 구조를 변경해도 이름(name) 기반으로 참조하기 때문에 개별 URL을 일일이 수정할 필요가 없어진다.
"reverse"라고 불리는 이유?
URL 패턴을 "거꾸로(역방향으로)" 해석하기 때문이다.
일반적인 URL 라우팅 과정:
URL 패턴 → URL → View
예: 'posts/<int:id>/' → '/posts/42/' → post_detail view
reverse() 함수의 동작 과정:
View 이름 → URL
예: 'post_detail' → '/posts/42/'
즉, 일반적인 URL 해석은 사용자가 브라우저에 입력한 URL을 받아서 해당하는 view를 찾는 과정이나, reverse()는 반대로 view의 이름을 가지고 URL을 찾아내는 과정이다. 이런 역방향 URL 해석 과정 때문에 "reverse"라는 이름이 붙은 것이다.
반응형
'Django' 카테고리의 다른 글
[django] urlpatterns의 작동 원리 (0) | 2024.12.29 |
---|---|
[django] Model attribute들은 어떤 class attribute일까? (0) | 2023.11.23 |
[django] CSRF verification error와 CSRF token 사용방법 (0) | 2023.11.22 |