장고 URL“을 다루는 정말 편리한 기술들이 많습니다. 모르면 암호 같은 표기인데 알고 나면 너무 편리한 기능들인 거죠.

이런 기능들에는 Variable Routing과 Naming URL 패턴이 있습니다.

이번 포스트에서는 이 두 기능에 대해 정리해보았습니다.

Variable Routing : 다양한 URL 패턴을 수용

특정 사용자에 대한 URL을 만든다고 가정하면 /user1, /user2, /user3, …으로 만들 수 있습니다.그래서 urlspatterns에 계속 추가하는거죠.

urlpatterns = [
    path("", views.users, name='urls'),
    path("profile/user1/", views.user1),
    path("profile/user2/", views.user2),
    path("profile/user3/", views.user3),
]

하지만 이 방법에는 한계가 있습니다. 위의 예의 경우 사용자가 100만 되어도 urlpatterns에 이들을 다 넣어주는 게 쉽지 않은 것 처럼요.

때문에 등장한 기술이 Variable Routing 입니다.

Variable RoutingURL 일부를 변수로 지정하여, 해당 부분에 들어온 값을 view로 넘겨줄 수 있습니다.

view에서는 변수를 받아서 그 부분에 맞게 처리하도록 할 수 있습니다.

이러면 URL 하나에 마음껏 여러 페이지에 연결 할 수 있게 됩니다.

아래 예를 확인해봅시다

urls.py
urlpatterns에 아래와 같은 형태로 입력합니다.

path("profile/<str:username>/", views.profile),

variable routing에 가능한 타입

views.py
urls.py에서 path의 <>에 넣은 변수 (여기서는 username)를 동일한 이름의 인자로 views.py내 함수로 받을 수 있게 됩니다.

def profile(request, username):
        return render(request, "profile.html")

profile.html

{% extends 'base.html' %}
{% block content %}
<h1>Profile</h1>
{{ username|default:"없는 사용자 입니다." }}
<p>
    <a href="/users/">유저 페이지</a>
</p>
{% endblock content %}

브라우저

urlpatterns에 <>로 variable routing을 해줬기에, 이제 하나의 path만으로 여러 URL을 입력 받을 수 있게 되었습니다.

아래 다양한 URL 주소가 정상 작동하는 것을 확인 할 수 있습니다.

http://127.0.0.1:8000/users/profile/John/

Naming URL : name 파라미터 활용

프로젝트가 완성됨에 따라 URL의 이름이나 구조가 변경될 수 있습니다.

그런데 URL 이름이나 구조를 변경하게 되면, urlpatterns와 함께 Templates에 있던 form 태그의 action과 a 태그 href를 전부 변경해줘야 합니다.

Template가 몇 개면 상관없는데 프로젝트가 커지면 커질수록 이것도 감당하기 힘든 일이 되어버립니다.

장고에서는 이를 도와주기 위해 pathname 파라미터가 존재합니다.

기본적인 사용법은 아래와 같습니다.


urls.py

path의 name 파라미터에 해당 URL에 해당하는 애칭을 입력해줍니다.

path("<URL>", <views.메소드>, name="<URL 애칭>")

templates

이제 templates에 있는 html에서는 "{% url <URL 애칭>%}" 방식으로 해당 URL을 가리킬 수 있게 됩니다.

<form action="{% url <URL 애칭> %}">
...
</form>

name 파라미터를 사용하지 않고 URL 사용

이해를 돕기 위해 name 파라미터를 사용한 경우와 사용하지 않은 경우 코드를 비교해보겠습니다.

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path("", views.users),
    path("profile/<str:username>/", views.profile),
]

profile.html

{% extends 'base.html' %}
{% block content %}
<h1>Profile</h1>
{{ username|default:"없는 사용자 입니다." }}
<p>
    <a href="/users/">유저 페이지</a>
</p>
{% endblock content %}

브라우저

http://127.0.0.1:8000/users/profile/Daniel/

name 파라미터를 사용한 경우

예제에서는 url 구조나 이름은 변경하지 않았지만 url 구조나 이름이 바뀌어도 name만 유지하면 templates에서 URL 변경사항이 그대로 적용되는 것을 확인 할 수 있습니다.

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path("", views.users, name='urls'),
    path("profile/<str:username>/", views.profile, name='profile'),
]

profile.html

{% extends 'base.html' %}
{% block content %}
<h1>Profile</h1>
{{ username|default:"없는 사용자 입니다." }}
<p>
    <a href="{% url 'urls' %}">유저 페이지</a>
</p>
{% endblock content %}

브라우저

http://127.0.0.1:8000/users/profile/Daniel/

마치며

현재 포스트에서는 다루지 않았지만 이전에 include 메소드를 포함해서 이번에 배운 variable routing과 naming 기술은 정말 유용하게 사용될 것 같습니다.

아직은 아니지만 프로젝트가 복잡해질수록 “장고 URL”의 편리함에 감사함을 느낄 것 같은 기능들이였습니다.

“장고 URL”에 대해 추가적인 공부를 위해서 공식 Docs도 훑어보았습니다.

공식 Docs에서는 Dispatcher 개념부터, include, 정규표현식을 이용한 URL (re_path()), path_converter에 관한 내용들도 확인 할 수 있었습니다.

추가 공부를 위해 링크를 걸어 놓았습니다.

장고 공식 Docs : URL dispatcher

참고하면 좋은 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다


목차