Django -- URLconf 구성 팁

이 장에서는 보기와 URL 구성에 대해 뛰어난 팁을 사용합니다.
[스트리밍 함수 가져오기(streamlining)]
방법1: 전통적인 방법
from django.conf.urls.defaults import *
from mysite.views import hello, current_datetime, hours_ahead

urlpatterns = patterns('',
    (r'^hello/$', hello),
    (r'^time/$', current_datetime),
    (r'^time/plus/(\d{1,2})/$', hours_ahead),
)

방법2:views 함수를 가져오고 유지보수가 간단하며 import에 대한 보기 모듈
from django.conf.urls.defaults import *
**from mysite import views**

urlpatterns = patterns('',
    (r'^hello/$', views.hello'),
    (r'^time/$', views.current_datetime ),
    (r'^time/plus/(d{1,2})/$', views.hours_ahead ),
)

방법3: 모듈 이름과 보기 함수 이름을 가져오고 인용부호로 묶는 것을 주의하십시오
from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^hello/$', 'mysite.views.hello' ),
    (r'^time/$', 'mysite.views.current_datetime' ),
    (r'^time/plus/(d{1,2})/$', 'mysite.views.hours_ahead' ),
)

방법4: 공공 보기 접두사를 추출하고 접두사 뒤와 보기 문자열 앞에 점호를 두지 마세요.django가 자동으로 처리합니다
from django.conf.urls.defaults import *

urlpatterns = patterns('mysite.views' ,
    (r'^hello/$', 'hello' ),
    (r'^time/$', 'current_datetime' ),
    (r'^time/plus/(d{1,2})/$', 'hours_ahead' ),
)

방법4(2): 만약에 우리 URLconf에 공통 접두사가 없을 때?아래와 같다
from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^hello/$', 'mysite.views.hello'),
    (r'^time/$', 'mysite.views.current_datetime'),
    (r'^time/plus/(\d{1,2})/$', 'mysite.views.hours_ahead'),
    (r'^tag/(\w+)/$', 'weblog.views.tag'),
)

해결: 전체 프레임워크는 urlpatterns 모듈 단계의 변수를 주목하고patterns 반환 대상은 추가할 수 있습니다.
from django.conf.urls.defaults import *

urlpatterns = patterns('mysite.views',
    (r'^hello/$', 'hello'),
    (r'^time/$', 'current_datetime'),
    (r'^time/plus/(\d{1,2})/$', 'hours_ahead'),
)
urlpatterns += patterns('weblog.views',
    (r'^tag/(\w+)/$', 'tag'),
)

특례:django 디버그 모드에서 URLconf의 행위 기술을 수정하고 debuginfo 링크는 DEBUG 설정 항목이 True일 때만 유효합니다.
from django.conf import settings
from django.conf.urls.defaults import *

from mysite import views
urlpatterns = patterns('',
      .....   
    ) 
if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^debuginfo/$', views.debug),
    )

[url의 명명법 일치 모드]
방법1:python 함수에서 위치 매개 변수와 키워드 매개 변수의 대응 관계, 예를 들어python 함수의 문법(?P 일치 모드)을 사용합니다.
##     
from django.conf.urls.defaults import *
from mysite import views

urlpatterns = patterns('',
    (r'^articles/(\d{4})/$', views.year_archive),
    (r'^articles/(\d{4})/(\d{2})/$', views.month_archive),
)

##      
from django.conf.urls.defaults import *
from mysite import views

urlpatterns = patterns('',
    (r'^articles/(?P\d{4})/$', views.year_archive),
    (r'^articles/(?P\d{4})/(?P\d{2})/$', views.month_archive),
)

그것들의 차이를 구분하기 위해 요청/archive/2016/12를 예로 들면 함수는 어떻게 호출되었습니까?전자:montharchive(request,'2016','12') 후자:montharchive(request,year='2016',month='12') 단점: 이렇게 하면 가독성이 강하고 정확하지만 불필요성도 떨어진다.또한 URLconf 모드에서는 명명된 그룹과 명명되지 않은 그룹 형식이 동시에 존재할 수 없습니다. 우선순위: 명명된 그룹 > 비명명된 그룹 > 키워드는 추가 파라미터를 전달합니다.
[추가 매개 변수 정보 전달]
우리가 쓴 보기 함수에서 우리는 많은 보기 함수가 유사하지만, 또 다른 것을 발견할 수 있다. 우리는 어떻게 해야 그것을 더욱 간결하게 쓸 수 있는지, 원시 템플릿은 다음과 같다.
# urls.py
from django.conf.urls.defaults import *
from mysite import views

urlpatterns = patterns('',
    (r'^foo/$', views.foo_view),
    (r'^bar/$', views.bar_view),
)

# views.py
from django.shortcuts import render_to_response
from mysite.models import MyModel

def foo_view(request):
    m_list = MyModel.objects.filter(is_new=True)
    return render_to_response('template1.html', {'m_list': m_list})
def bar_view(request):
    m_list = MyModel.objects.filter(is_new=True)
    return render_to_response('template2.html', {'m_list': m_list})

방법1:if판단을 추가하면 단점은 url을 코드에 결합시키는 것이다. url을 바꾸면 보기 함수를 바꾸어야 한다.
# views.py
from django.shortcuts import render_to_response
from mysite.models import MyModel
def foobar_view(request, url):
    m_list = MyModel.objects.filter(is_new=True)
    if url == 'foo':
        template_name = 'template1.html'
    elif url == 'bar':
        template_name = 'template2.html'
    return render_to_response(template_name, {'m_list': m_list})

방법2: URLconf에 세 번째 위치 매개변수: 키워드 매개변수
# urls.py
from django.conf.urls.defaults import *
from mysite import viewsurlpatterns = patterns('',
    (r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}),
    (r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}),
)

# views.py
from django.shortcuts import render_to_response
from mysite.models import MyModel
def foobar_view(request, template_name):
    m_list = MyModel.objects.filter(is_new=True)
    return render_to_response(template_name, {'m_list': m_list})

예를 들어 우리는 다음과 같은 규칙의 URL에 방문해야 한다
/mydata/jan/01//mydata/jan/02//mydata/jan/03/# .../mydata/dec/30/mydata/dec/31/URLconf와 보기 함수를 다음과 같이 설정할 수 있습니다.
urlpatterns = patterns('',
    (r'^mydata/(?P\w{3})/(?P\d\d)/$', views.my_view),
)def my_view(request, month, day):
    # ....그러나 만약 우리가/mydata/birthday/에 접근하는 URL을 늘리고 싶다면, 정상적으로 우리는 그에게 보기 함수를 주어야 하지만, 우리는 위에서 추가 매개 변수를 전달하여urlpatterns = patterns () 를 해결할 수 있다.
    (r'^mydata/birthday/$', views.my_view, {'month': 'jan', 'day': '06'}),
    (r'^mydata/(?P\w{3})/(?P\d\d)/$', views.my_view),
)
[include 기타 URLconf]
때때로 우리는 우리의 코드를 여러 개의django 사이트에 사용하기를 원하기 때문에, 우리는 우리의 URLconf를 포함하는 방식으로 처리하는 것을 고려해야 한다.
from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^weblog/', include('mysite.blog.urls')),
    (r'^photos/', include('mysite.photos.urls')),
    (r'^about/$', 'mysite.views.about'),
)

주: 다른 urls를 포함하는 URL에는 $문자가 없지만,/가 포함되어 있습니다. 그는django가include를 만났을 때, 일치하는 URL을 차단하고, 나머지 문자열을 포함하는 URLconf에 보내서 더 처리한다는 뜻입니다.예를 들어 Google 접근/weblog/2007/weblog는 이 URL conf와 일치하고,/차단된 2007은 포함된 URL conf의 urls에 전달됩니다.1. 포획된 매개 변수와include
# root urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
    (r'^(?P\w+)/blog/', include('foo.urls.blog')),
)

# foo/urls/blog.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
    (r'^$', 'foo.views.blog_index'),
    (r'^archive/$', 'foo.views.blog_archive'),
)

이 예에서 포획된username 변수는 포함된 URLconf에 전달되며, 그 URLconf의 모든 보기 함수에 전달됩니다.2. 추가 URLconf와include는 위에서 언급한 바와 같이 URLconf에는 세 번째 위치의 매개 변수가 있는데 사전으로 다음 두 개의 설정이 같은 효과를 가진다는 것을 나타낸다.
# urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
    (r'^blog/', include('inner'), {'blogid': 3}),
)

# inner.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
    (r'^archive/$', 'mysite.views.archive'),
    (r'^about/$', 'mysite.views.about'),
    (r'^rss/$', 'mysite.views.rss'),
)
# urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
    (r'^blog/', include('inner')),
)

# inner.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
    (r'^archive/$', 'mysite.views.archive', {'blogid': 3}),
    (r'^about/$', 'mysite.views.about', {'blogid': 3}),
    (r'^rss/$', 'mysite.views.rss', {'blogid': 3}),
)

좋은 웹페이지 즐겨찾기