2009-09-23 4 views
3

동일한 URL에서 살고 싶은 두 가지 종류의 객체가 있습니다. 한 그룹의 객체는 뷰 함수 'foo'에 전달되어야하고 다른 그룹은 'bar'에 전달되어야합니다.복잡한 URL 디스패처를 정리하십시오.

과 같이 나는 현재하고, 하드 코딩 된 URL의 큰 긴 목록과 함께이 일을 해요

...

urlpatterns = patterns('project.views', 
    (r'^a/$', 'foo'), 
    (r'^b/$', 'foo'), 
    (r'^c/$', 'foo'), 
    #...and so on until... 
    (r'^x/$', 'bar'), 
    (r'^y/$', 'bar'), 
    (r'^z/$', 'bar'), 
) 

같은 각 URL 유형의 목록을 정의하는 것이 가능 ...

foo_urls = ['a', 'b', 'c'] #... 
bar_urls = ['x', 'y', 'z'] #... 

... 그런 다음 들어오는 URL을 확인하십시오. ('foo_urls'에 있다면 'project.views.foo'로 보내고, 'bar_urls'에 있다면 'project.views.bar'로 보내주십시오)?

이전 사이트의 URL과의 호환성을 유지하기 위해이 구조를 유지하는 것으로 제한되지만, urls.py를 단순화하는 방법에 대한 조언은 많은 도움이됩니다.

답변

5

URL 맵은 일반적으로 명시 적으로 표현되지만 반드시 그럴 필요는 없습니다. 목록에서 URL 맵을 작성하는 방법은?

foo_urls = ['a', 'b', 'c'] #... 
bar_urls = ['x', 'y', 'z'] #... 

# A first pattern to get urlpatterns started. 
urlpatterns = pattern('project.views', 
    ('blah', 'blah') 
    ) 

# Append all the foo urls. 
for foo_url in foo_urls: 
    urlpatterns += patterns('project.views', 
     ('^' + foo_url + '/$', 'foo') 
     ) 

# Append all the bar urls. 
for bar_url in bar_urls: 
    urlpatterns += patterns('project.views', 
     ('^' + bar_url + '/$', 'bar') 
     ) 
4

장고의 URL 패턴은 정규식, 그래서 이것은 참으로 가능하다 : 당신이 A, B를 사용하는 경우

urlpatterns = patterns('project.views', 
    (r'^[abc]/$', 'foo'), 
    (r'^[xyz]/$', 'bar'), 
) 

아닌 단일 문자 예를 들어 자리, 당신은 전체를 사용할 수있는 C 대신 정규식 일치 규칙을 따르도록주의해야합니다.

urlpatterns = patterns('project.views', 
    (r'^(foo|slithy|toves)/$', 'foo'), 
    (r'^(bar|twas|brillig)/$', 'bar'), 
) 
3

그런 다음, 모든 URL을 잡는다 하나를 사용하여 urlpatterns을 대체 뷰에 foo 사이 bar URL을 선택하는 논리를 이동할 수 있습니다.

urlpatterns = patterns('project.views', 
    (r'^(?P<letter>[a-z])/$', 'foobar'), 
) 

그런 다음 당신은 URL 구조, 다음 이전 URL에 대한 리디렉션을 설정을, 장고 redirects app을 찾아 재 설계 할 수 있습니다, 다른 방법으로 views.py

def foobar(request, letter): 

    foo_urls = ['a', 'b', 'c'] #... 
    bar_urls = ['x', 'y', 'z'] #... 
    if slug in foo_urls: 
     return foo(request) 
    if slug in bar_urls: 
     return bar(request) 
    else: 
     #oh dear, you've caught a 
     #url that isn't foo or bar 
     #return 404? 

의 기능 foobar 물품.

1

앱의 앞에 아파치를 가지고있는 경우에 :

<LocationMatch "^[a-w]/$"> 
    ... 
</LocationMatch> 

<LocationMatch "^[x-z]/$"> 
    ... 
</LocationMatch> 

는 ... 그러나 SetEnv을 포함하여, 당신이 필요로하는 모든 설정 지침이 될 수있는 것은 당신에 대한 여부를 알 수있는 환경 변수를 원하신다면 foo 대 bar 또는 ProxyPass를 사용하여 여러 백엔드 서버 URL에 요청을 보냅니다.

URL 재 작성이나 정규식 인수를 허용하는 다른 Apache 구성 설정을 사용할 수도 있습니다.

관련 문제