2010-09-01 1 views
21

Я разрабатываю приложение django и со временем URL-адреса выросли. У меня их много со мной сейчас, и из-за некоторых изменений, которые я сделал, одна точка зрения начала сбой. Когда я пытаюсь GET http://example.com/foo/edit_profile, он должен выполнить функцию просмотра определенного вида X, но вместо этого он выполняет Y. Где-то маршрутизация URL-адресов путается, и я не могу понять это. Я использовал метод django.core.urlresolvers.resolve, чтобы попробовать его из оболочки, и я могу подтвердить, что URL-адрес ошибочно разрешен. Однако я не знаю, как отладить это и определить проблему.Django url debugger

В идеале, я бы хотел увидеть что-то вроде «протестированного этого шаблона», «протестировал этот шаблон» и т. Д., Пока он, наконец, не найдет правильный, и тогда я смогу осмотреться там, где он был разрешен. Я не могу найти ничего подобного.

Разве это не распространенная проблема для крупных проектов? Что делают люди?

Update

Я знаю, как работает система и как смотреть через URL, один за другим. Это то, что я пытаюсь сделать. Этот вопрос в основном требует ярлыка.

+0

Я еще не вижу набор URL-адресов этого комплекса. Мой 'urls.py' имеет кучу включений, каждый из которых имеет свой собственный уникальный префикс (например,'^foo' будет включать URL-адреса в приложении «foo», поэтому я мог бы пойти туда, чтобы узнать, где следующий матч Если у вас возникла эта проблема, ваш 'urls.py', вероятно, слишком сложный. Мы могли бы помочь вам разобраться, что случилось, если вы опубликовали его ... –

+1

Собственно, мой (и все остальные я «все видели»), все «имена» (уникальный префикс, за которым следует include). По какой-то причине один из моих foo/URL-адресов попадает в панель/приложение и возвращает что-то оттуда. Было бы неплохо иметь отладчик, чтобы просто сказать мне, в каком порядке эта попытка разрешена, чтобы я мог определить проблему. –

ответ

26

вы уже пытались запустить

manage.py show_urls 

после установки django_extensions?

http://vimeo.com/1720508 - смотреть с 06:58.

Это должно указывать на то, в каком порядке предпринимается попытка разрешения URL-адреса.

Надеюсь, что это поможет

+0

Интересно ... Я не знал об этом. Благодаря! –

+1

Хорошая идея. Не забывайте, что вам нужно добавить django_extensions to installed_apps, прежде чем пытаться использовать его. Https://django-extensions.readthedocs.org/en/latest/installation_instructions.html – glaucon

0

Посмотрите на свои urlconfs, найдите, какой urlpattern вызывает ваш взгляд Y, и посмотрите, является ли регулярное выражение более общим, чем должно быть. Попробуйте прокомментировать URL-адрес, который вызывает ложное совпадение, и посмотреть, правильно ли он соответствует X.

Как правило, это не проблема для меня, но это происходит. Всегда сохраняйте более конкретные шаблоны перед общими. Используйте статические префиксы для разделения пространства имен URL-адресов, чтобы предотвратить ложные совпадения.

+0

Это становится непомерно трудоемким с большим количеством URL-адресов и регулярных выражений, которые у меня есть сейчас. Это то, что я делаю прямо сейчас, d хотел бы иметь достойный «отладчик URL», а не весь этот бизнес, комментируя и комментируя строки из различные файлы url. –

0

Вы можете предположить, что он проходит через urlpatterns сверху вниз, и первый, который соответствует, будет выполнен.

Как вы знаете, который выполняется вид (Y) думать о том, что:

  • если Y находится перед X: паттерны Y соответствует URL (но не должен)
  • если X находится перед Y: шаблоны X не соответствуют URL-адресу (но должны)

Можете ли вы предоставить более явные примеры вашего URLConf? Чем я могу дать вам более явный ответ.

+0

Они типичны. Подобно тому, что сказал Доминик. Я знаю, как они работают, и ваши две точки в порядке. Просто, когда вы пытаетесь получить исправление, это утомительно, когда я пытаюсь найти исправление, поэтому я ищу отладчик. –

+0

Вы всегда можете поместить некоторые строки печати в источник django, если вы действительно думаете, что это вам помогает. Он просто покажет вам, что он точно идет сверху вниз и пытается сопоставить каждое регулярное выражение, пока оно не совпадет. MAybe здесь: http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L143 –

+0

Вот что я делаю. :) –

3

Я бы прокомментировал шаблоны в вашем url.py, пока вы не получите ошибку 404 при попытке перейти к foo. Если этот шаблон является включенным, я бы отложил его и прокомментировал строки в url.py. В конце концов вы точно узнаете, какой шаблон соответствует.

Тогда я бы взял функцию просмотра, которую она вызывает, и жесткий код. Если он использует общий вид или что-то тонкое, я сделаю его максимально очевидным и прямым. В этот момент вы должны знать, какое правило соответствует, и почему и какой код он выполняет в представлении.

+0

Хм. Да. Это будет немного медленнее, но работоспособно. –

+0

Хорошо, как насчет этого: закомментируйте * все * ваши шаблоны url верхнего уровня и после подтверждения с помощью 404 повторно включите один шаблон, который, по вашему мнению, используется. Если вы ошибаетесь, вы что-то узнаете. Если вы правы, перейдите к этому включению (при условии, что он включен) и закомментируйте все, кроме того, что, по вашему мнению, используется. С помощью этого ярлыка вам понадобится от пяти до десяти минут, чтобы выяснить, используется ли код, который вы хотите использовать. – hughdbrown