본문 바로가기

웹 개발

[Django] 다중 앱을 위한 URL 분리

유저별로 프로필 페이지를 구현하려고 할 때 URL을 어떻게 설정해줘야 할까?

users/kim => kim의 프로필 페이지

users/admin => admin의 프로필 페이지

 

이런 방식으로 한 번 구현을 해보자!

# urls.py의 urlpatterns
urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index),
    path('users/', views.users),
    path('users/kim/', views.users_kim),
    path('users/admin/', views.users_admin),
    path('hello/', views.hello)
]

위와 같은 방식은 유저가 한 두명, 많게는 다섯 명 정도면 사실 아무 문제가 없다.

그러나 유저가 100명, 1000명 늘어나면 유저의 이름에 따라 전부 path를 만들어 줘야 할까?

username을 변수로 받아서 users/변수/ <==이렇게 처리하면 문제를 해결할 수 있지 않을까?

 

Variable Routing란?

URL 일부를 변수로 지정하여, 해당 부분에 들어온 값을 view로 넘겨줌으로써 view에서 변수를 받아서 그 부분에 맞게 처리하도록 할 수 있다.

# urls.py
urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index),
    path('users/', views.users),
    path('users/<str:username>/', views.profile),
    path('hello/', views.hello)
]

# views.py
def profile(request):
    return render(request, "profile.html")

Variable Routing의 변수로는 str이나 int를 쓸 수 있으며, str이 기본값이 된다.

 

더욱 효율적인 코드를 작성하였지만 아직 부족하다.

프로젝트 안에는 각각의 기능별로 나누어서 App을 만들어 두었으니 프로젝트에 있는 urls.py가 아니라

앱안에 urls.py를 만들어서 프로젝트의 urls.py에서 앞부분을 처리하고 나머지 부분은 앱안에서 처리하도록 하면

보기도 편해지고 좋은 점이 많지 않을까?

 

django의 urls는 다른 urls를 포함할 수 있는데 이 때 include 함수를 사용한다.

# urls.py

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/',  include("accounts.urls")),
    path('products/', include("products.urls")),
]

include되는 urls에는 반드시 urlpatterns가 필요하기 때문에 빈 리스트라도 무조건 만들어 줘야 한다.

이제 만약에 accounts/test/로 요청이 들어온다고 하면 먼저 프로젝트의 urls가 accounts/와 일치함을 발견하고

accounts 앱의 urls.py로 다음 처리를 이관해준다.

accounts 앱의 urls.py에서 test/ 패턴과 일치하는 url 패턴을 탐색하고 일치하면 해당 view로 가서 처리한다.

# accounts/urls.py
from django.urls import path

app_name = 'accounts'
urlpatterns = [
    path('test/', views.test)
]


# accounts/views.py
def test(request):
    return render(request, 'test.html')

이런식으로 이제 원래 프로젝트에 있던 templates이나 url을 앱 안에 옮겨서 분리해주면 된다.


이미 지나간 강의를 복습하며 내용을 정리하려고 하면 수정된 부분도 있어서 잘 되고 있는지 모르겠다.

프로젝트를 진행하며 다시 배운다는 느낌으로 정리를 해보고, 나중에 썼던 내용을 수정해야 겠다.