2009-09-23 2 views
3

У меня есть два разных типа объектов, которые я хотел бы проживать по одному и тому же URL-адресу. Одна группа объектов должна быть передана функции просмотра «foo», а другая группа должна быть передана в «bar».Убирать сложный диспетчер URL-адресов

Я сейчас делаю это с большим длинным списком URL-адресов HARDCODED, как так ...

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 Django являются регулярными выражениями, так что это действительно возможно:

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

Если вы используете, б, в качестве примеров заполнители для не-Односимвольного, вы можете использовать полный строки вместо этого, но будьте осторожны, чтобы убедиться, что они следуют регулярные выражения правила соответствия:

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

Вы могли бы заменить urlpatterns с той, которая улавливает все URLs, а затем переместить логику, чтобы выбрать между foo и bar URLs в виду.

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

Затем написать функцию foobar в 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? 

В качестве альтернативы, вы можете исследовать Джанго redirects app, перепроектировать структуру URL-адрес, а затем установите редирект для старых URL-адресов.

1

Если у вас есть Apache в передней части вашего приложения:

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

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

и ... могут быть любые директивы конфигурации вам нужно, в том числе SETENV, если вы хотите переменную окружения, чтобы сказать вам, стоит ли перейдите в foo vs bar или, возможно, ProxyPass, чтобы отправить запрос на несколько разных URL-адресов сервера.

Вы также можете использовать переписывание URL или ряд других настроек конфигурации Apache, которые принимают аргументы регулярных выражений.

Смежные вопросы