Django: как создать общую маршрутизацию URL-адресов для представлений?

У меня довольно стандартное приложение django, и мне интересно, как настроить маршрутизацию URL-адресов, чтобы мне не приходилось явно сопоставлять каждый URL-адрес с представлением.

Например, предположим, что у меня следующие представления: Project, Links, Profile, Contact. Я бы предпочел, чтобы мой urlpatterns не выглядел так:

(r'^Project/$', 'mysite.app.views.project'),
(r'^Links/$', 'mysite.app.views.links'),
(r'^Profile/$', 'mysite.app.views.profile'),
(r'^Contact/$', 'mysite.app.views.contact'),

И так далее. В Пилоны это было бы очень просто:

map.connect(':controller/:action/:id')

И он автоматически захватит нужный контроллер и функцию. Есть ли что-то подобное в Django?

Подождите, вы хотите, чтобы '^ Links / $' указывал на mysite.app.views.links?

Pete Karl II 03.10.2008 22:12

Да, ошибки копирования / вставки - это довольно мило.

swilliams 03.10.2008 22:43
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
8
2
3 215
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

mods = ('Project','Links','Profile','Contact')

urlpatterns = patterns('',
   *(('^%s/$'%n, 'mysite.app.views.%s'%n.lower()) for n in mods)
)

Это дает мне ошибку 'generator' object has no 'resolve'. Думаю, я знаю, что вы пытаетесь сделать (написать маршрут для каждой строки в кортеже), но вместо этого он создает генератор, который django не может разрешить.

swilliams 03.10.2008 23:04

я не тестировал, попробуйте развернуть генератор с помощью * (... for ...). я редактирую ответ

Javier 03.10.2008 23:28

У меня сейчас синтаксическая ошибка. Я никогда не видел, чтобы * использовалось таким образом ... это должно разыменовывать указатель, такой как C? Не могли бы вы проверить это перед публикацией?

swilliams 04.10.2008 00:04

он расширяет итератор до позиционных аргументов. я уже тестировал это.

Javier 04.10.2008 00:14

Вы используете какую-то библиотеку? Какая версия питона? Я получаю синтаксическую ошибку для каждого типа объекта-итератора, на котором я это пробую.

swilliams 04.10.2008 00:23

нет библиотеки, python2.5, но я не думаю, что это новая функция. попробуйте в командной строке: def f (a, b, c): напечатайте a, b, c f (1, * (2,3))

Javier 04.10.2008 00:35

Получил, чтобы работать. У меня был лишний ',' там, оставшийся от определения по умолчанию после оператора, который вызывал синтаксические ошибки. Следует отметить, что трюк * () работает только как аргумент. foo = *(1,2) вызывает синтаксическую ошибку. Я подозреваю, что это связано с разыменованием указателя.

swilliams 04.10.2008 00:57

дело не в указателях, '* (1,2)' расширяет кортеж (одно составное значение) до двух чисел, и вы не можете присвоить два числа переменной simgle.

Javier 04.10.2008 01:02

Это совершенно нечитабельно, по крайней мере, для меня. Я бы гораздо больше хотел просто взглянуть на код и увидеть его, а затем потратить секунду или проанализировать его. Может я просто такой устроен :)

kender 04.10.2008 01:04

@ {kender, hop}: да, я бы тоже не хотел это видеть, да и сам бы не стал. но свиллиамс хотел, так что он есть! :-)

Javier 04.10.2008 01:15

Эх, мне просто очень нравится, как Pylons выполняет маршрутизацию. На мой взгляд, Web.py делает это даже лучше, хотя Django выигрывает во всем остальном.

swilliams 04.10.2008 01:21

Если у вас нет действительно огромный количества просмотров, записать их явно не так уж плохо с точки зрения стиля.

Однако вы можете сократить свой пример, используя аргумент префикса функции patterns:

urlpatterns = patterns('mysite.app.views',
    (r'^Project/$', 'project'),
    (r'^Links/$', 'links'),
    (r'^Profile/$', 'profile'),
    (r'^Contact/$', 'contact'),
)

Это правда, но теперь я чувствую себя обязанным. :)

swilliams 04.10.2008 00:05

Возможно, вы сможете использовать специальную функцию просмотра в следующих строках:

def router(request, function, module):
    m =__import__(module, globals(), locals(), [function.lower()])
    try:
        return m.__dict__[function.lower()](request)
    except KeyError:
        raise Http404()

а затем urlconf, подобный этому:

(r'^(?P<function>.+)/$', router, {"module": 'mysite.app.views'}),

Этот код не тестировался, но общая идея должна работать, даже если вы должны помнить:

Явное лучше, чем неявное.

Другие вопросы по теме