Django urlpatterns расстраивает проблему с косой чертой - PullRequest
2 голосов
/ 11 ноября 2010

Все примеры, которые я могу найти для urlpatterns для сайтов django, имеют отдельную запись для входящих URL, которые не имеют косой черты, или корневой папки. Затем они обрабатывают подпапки в каждой отдельной строке. Я не понимаю, почему простой

/?

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

Рассмотрим следующее. Давайте назовем проект Django Baloney, а имя приложения - Cheese. Так что в проекте urls.py у нас есть что-то вроде этого, чтобы позволить приложениям urls.py обрабатывать его запросы ...

urlpatterns = patterns('',
    (r'^cheese/', include('Baloney.Cheese.urls')),
)

затем в приложениях Cheese urls.py, я не понимаю, почему эта простая строка не сработает как истина для всех входящих подпутей URL, включая пустое значение ...

urlpatterns = patterns('',
    (r'^(?P<reqPath>.*)/?$', views.cheeseapp_views),
)

Вместо этого он соответствует пустому регистру, но не регистру присутствующего значения. Итак ...

http://baloneysite.com/cheese/        -->   MATCHES THE PATTERN
http://baloneysite.com/cheese/swiss   -->   DOES NOT MATCH

По сути, я хочу перехватить переменную reqPath, чтобы включить в нее все, что есть (даже пустое или ''), но не включать в себя косую черту, если она есть.

URL-адреса - это динамические слагы, извлекаемые из БД, поэтому я выполняю все сопоставления с содержимым в своих представлениях, и мне просто нужны шаблоны URL-адресов для пересылки значений. Я знаю, что работает следующее, но не понимаю, почему все это нельзя поместить в одну строку с /? регулярное выражение перед окончанием знака $.

(r'^$', views.cheeseapp_views, {'reqPath':''}),
(r'^(?P<reqPath>.*)/$', views.cheeseapp_views),

Цените любые идеи.

1 Ответ

9 голосов
/ 11 ноября 2010

Я только что попробовал подобный пример, и он сработал так, как вы написали. Нет необходимости в / ?,. * Будет соответствовать этому в любом случае. Какую именно ошибку вы получаете? Может быть, у вас есть ваше мнение без параметра запроса? То есть views.cheeseapp_views должен выглядеть примерно так:

def cheeseapp_views(request, reqPath):
    ...

Edit:

Шаблон, который вы предложили, ловит косую черту в reqPath, потому что оператор * жадный (посмотрите на docs.python.org/library/re.html). Попробуйте вместо этого:

(r'^(?P<reqPath>.*?)/?$', views.cheeseapp_views) 

обратите внимание, это. *? вместо. * чтобы сделать его нежадным.

...