본문 바로가기

WebDev

Django Url

Django Url


django에서는 url에 관련해 다양한 기능을 제공한다.

또한 url을 정규표현식을 사용해 등록하므로 유연한 url 디자인이 가능하다.



URL 등록


보통 url등록은 기본으로 생성되는 urls.py에서 하게된다[각주:1].


url(url정규표현식, 뷰, 이름)의 형태로 등록한다.

urlpatterns = [
    url(r'^index/$', index_view, name="main-view"),
    ...
]


또한 정규표현식의 그룹을 사용해 매개변수를 지정할 수 있다.

# URLconf
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^blog/$', views.page),
    url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
]

# View (in blog/views.py)
def page(request, num="1"):
    # Output the appropriate page of blog entries, according to num.
    ...


이렇게 등록된 URL이 실제로 동작하는 방법은 다음과 같다:

  1. 클라이언트가 자원을 요청한다. 예를 들어 GET /api/users
  2. urlpatterns에 등록된 url객체를 순서대로 내려가며 정규표현식의 match를 시도한다.
    1. match가 성공할 경우 해당 url객체의 view로 흐름이 넘겨간다
    2. match가 실패한 경우 다음 url객체를 시도한다
주의할 점은, 순서대로 match를 사용한다는 것이다. 만약 /api, /api/users의 순서대로 url이 등록되어 있다고 할 경우, 클라이언트가 /api/users를 요청해도 /api의 뷰로 흐름이 넘겨진다. 이런 경우 해결 방법은 정규표현식의 끝 문자($)를 사용해 표현하는 것이다. ^api$라고 표현할 경우 이 문제가 해결된다.



URL 활용


앞서 url에 name을 입력했던 이유는 reverse를 위함이다. 보통 이렇게 reverse된 url은 redirection하는데 사용된다.


name이 겹칠 일이 없다고 확신할 수 있다면 아래와 같이 쓰면 된다.

from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect

def redirect_to_year(request):
    # ...
    year = 2006
    # ...
    return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))


그러나 name이 겹칠 일이 없다고 확신할 수 없을 경우(거의 항상 이렇다) namespace를 사용할 테고, namespace를 사용할 경우

namespace:name의 형태로 사용하면 된다. 또한 namespace:namespace:name과 같이 namespace는 nested 될 수 있다.

from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect def redirect_to_year(request): # ... year = 2006 # ... return HttpResponseRedirect(reverse('app1:news-year-archive', args=(year,)))





  1. 물론 얼마든지 커스터마이징 가능하다. settings.py,의 ROOT_URLCONF옵션값을 바꾸면 된다. [본문으로]

'WebDev' 카테고리의 다른 글

django CSRF disable (CSRF 해제)  (0) 2016.01.20
django class-based view  (0) 2016.01.15
Django Deploy  (0) 2016.01.04
Django Multiple Database  (0) 2015.11.16
Django settings 값 가져오기  (0) 2015.11.15