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이 실제로 동작하는 방법은 다음과 같다:
- 클라이언트가 자원을 요청한다. 예를 들어 GET /api/users
- urlpatterns에 등록된 url객체를 순서대로 내려가며 정규표현식의 match를 시도한다.
- match가 성공할 경우 해당 url객체의 view로 흐름이 넘겨간다
- match가 실패한 경우 다음 url객체를 시도한다
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,)))
- 물론 얼마든지 커스터마이징 가능하다. 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 |