2010-09-01 19 views
21

Estoy desarrollando una aplicación django y con el tiempo, las URL han crecido. Tengo muchos de ellos conmigo ahora y debido a un cambio que hice, una vista comenzó a funcionar mal. Cuando trato de OBTENER http://example.com/foo/edit_profile, se supone que ejecuta una vista determinada función de vista X pero está ejecutando Y en su lugar. En algún lugar, el enrutamiento de la url está estropeando y no puedo resolverlo. Usé el método django.core.urlresolvers.resolve para probarlo desde el shell y puedo confirmar que la URL se está resolviendo erróneamente. Sin embargo, no sé cómo depurar esto e identificar el problema.Django url debugger

Idealmente, me gustaría ver algo así como "probado este patrón", "probado este patrón", etc. hasta que finalmente encuentre el correcto y luego pueda ver dónde se resolvió. No puedo encontrar nada como esto.

¿No es este un problema común para proyectos más grandes? ¿Que hace la gente?

actualización

sé cómo funciona el sistema y la forma de mirar a través de las direcciones URL uno por uno. Eso es lo que trato de hacer. Esta pregunta es básicamente pedir un atajo.

+0

Todavía tengo que ver un conjunto de URL de este complejo. Mi 'urls.py' tiende a tener un montón de includes, cada uno de los cuales tiene su propio prefijo único (por ejemplo,'^foo' incluiría URLs en la aplicación 'foo', así podría ir allí para averiguar dónde está el próximo partido viene de. Si tiene este problema, su 'urls.py' es probablemente demasiado complicado. Podríamos ayudarle a descubrir qué pasa si lo publica ... –

+1

En realidad, el mío (y todos los demás) He visto) son todos "namespaced" (un prefijo único seguido de un include). Sin embargo, por alguna razón, uno de mis foo/URLs se enruta a la barra/aplicación y devuelve algo de allí. Sería bueno tener un depurador solo para decirme en qué orden se intenta la resolución para poder identificar el problema. –

Respuesta

26

ha intentado ya ejecutar

manage.py show_urls 

después de instalar django_extensions?

http://vimeo.com/1720508 - ver desde 06:58.

Esto debería indicarle en qué orden se intenta la resolución de la url.

Espero que esto ayude

+0

Interesante ... No estaba al tanto de esto. ¡Gracias! –

+1

Buena idea. No olvides que necesitas agregar django_extensions a installed_apps antes de intentar usarlo https://django-extensions.readthedocs.org/en/latest/installation_instructions.html – glaucon

0

Mire su urlconfs, encuentre qué urlpattern invoca su vista Y y vea si la expresión regular es más general de lo que debería ser. Intente comentar el urlpattern que causa la coincidencia falsa y verifique si coincide correctamente con X.

Normalmente, esto no es un problema para mí, pero se produce. Mantenga siempre patrones más específicos antes que los generales. Use prefijos estáticos para dividir el espacio de nombres de su url, para evitar coincidencias falsas.

+0

Esto consume mucho tiempo con la gran cantidad de URL y expresiones regulares que tengo actualmente. Es lo que estoy haciendo en este momento, pero ' Me gustaría tener un "depurador de URL" decente en lugar de todo este asunto de comentar y comentar en líneas de los diversos archivos de url –

0

Puede asumir que va a través de los patrones url de arriba a abajo y se ejecutará el primero que coincida.

Como saben los que se ejecuta la vista (Y) pensar en eso:

  • si es Y antes X: los patrones de Y coincide con la URL (pero no debe)
  • si es antes XY: los patrones de X no coincide con la URL (pero deberían)

¿puede proporcionar algunos ejemplos más explícitos de su URLconf? Entonces puedo darte una respuesta más explícita.

+0

Son típicos. Similar a lo que dijo Domingo. Sé cómo funcionan y tus dos puntos están bien. Es solo que es tedioso revisar el objeto manualmente cuando intento obtener una solución, y es por eso que estoy buscando un depurador. –

+0

Siempre puede poner algunas líneas de impresión en la fuente de django, si realmente cree que lo ayuda. Simplemente le mostrará que va exactamente de arriba a abajo e intenta hacer coincidir cada expresión regular hasta que coincida. Puede estar aquí: http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L143 –

+0

Eso es lo que estoy haciendo. :) –

3

Yo comentaría los patrones en su url.py hasta que obtenga un error 404 cuando intente navegar al foo. Si ese patrón es una inclusión, recurriría a eso y comentaría las líneas en ese url.py. Eventualmente sabrá exactamente qué patrón coincide.

A continuación, tomaría la función de vista que está llamando y el código duro que. Si está usando una vista genérica o algo sutil, lo haría lo más obvio y directo posible. En ese punto, debe saber qué regla coincide y por qué y qué código se está ejecutando en la vista.

+0

Hmm. Sí. Sería un poco lento pero viable. –

+0

Está bien, qué tal esto: comente * todos * sus patrones de URL de nivel superior y después de confirmar con un 404, vuelva a habilitar el patrón que cree que se está utilizando. Si te equivocas, aprendes algo. Si tiene razón, profundice en eso incluido (suponiendo que sea una inclusión) y comente todo excepto lo que cree que se está utilizando. Con este acceso directo, le tomará de cinco a diez minutos averiguar si se está utilizando el código que desea usar. – hughdbrown