2009-09-23 40 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'), 
) 

是否可以定義每個類型的一樣網址列表...

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

...然後根據這些列表檢查傳入的URL? (如果它在'foo_urls'中,發送到'project.views.foo';如果它在'bar_urls'中,發送到'project.views.bar')?

我僅限於保持此結構與前一個網站的網址保持兼容性,但任何關於簡化我的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

Django的URL模式是正則表達式,所以這確實是可能的:

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

如果您使用A,B,C作爲一種非單字符例如佔位符,你可以使用全但要小心確保它們遵循正則表達式匹配規則:

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

你可以用一個捕獲所有的網址替換的URL模式,然後將邏輯來選擇的URL到視圖foobar之間。

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

然後寫一個函數foobarviews.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? 

作爲替代方案,你可能想探索Django的redirects app,重新設計的URL結構,然後設置重定向的舊網址。

1

如果你已經在你的應用程序的前面得到的Apache:

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

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

的......可以是任何你需要的配置指令,包括SETENV如果你想一個環境變量來告訴你是否去foo vs bar,或者ProxyPass發送請求到幾個不同的後端服務器URL。

您也可以使用url重寫或接受正則表達式參數的其他一些Apache配置設置。