Determinar la configuración completa de la URL de Django

82

¿Hay alguna manera de obtener la configuración completa de la URL de django?

Por ejemplo, la página de depuración 404 de Django no muestra las configuraciones de URL incluidas, por lo que esta no es la configuración completa.


Respuesta : Gracias a Alasdair, aquí hay un guión de ejemplo:

import urls

def show_urls(urllist, depth=0):
    for entry in urllist:
        print("  " * depth, entry.regex.pattern)
        if hasattr(entry, 'url_patterns'):
            show_urls(entry.url_patterns, depth + 1)

show_urls(urls.urlpatterns)
Miguel
fuente
2
script muy útil, gracias
RichVel

Respuestas:

49

Django es Python, así que la introspección es tu amiga.

En el shell, importe urls. Al recorrer urls.urlpatternsy profundizar en tantas capas de configuraciones de URL incluidas como sea posible, puede crear la configuración de URL completa.

import urls
urls.urlpatterns

La lista urls.urlpatternscontiene RegexURLPatterny RegexURLResolverobjetos.

Para un RegexURLPatternobjeto p, puede mostrar la expresión regular con

p.regex.pattern

Para un RegexURLResolverobjeto q, que representa una configuración de URL incluida, puede mostrar la primera parte de la expresión regular con

q.regex.pattern

Entonces usa

q.url_patterns

que devolverá una lista adicional de objetos RegexURLResolvery RegexURLPattern.

Alasdair
fuente
3
¡Buena idea! Hice un script simple aquí: code.activestate.com/recipes/576974
Michael
Esa es una función elegante. Empecé a intentar escribir uno, pero implicaba comprobar los tipos de objetos para ver si eran RegexURLPatterno RegexURLResolver. Usar has_attres una idea mucho mejor. Debería poner su función en respuesta aquí en Stack Overflow. Yo lo votaría.
Alasdair
Esto causa muchos problemas de importación cíclica a través del archivo de configuración.
NoobEditor
67

Las extensiones de Django proporcionan una utilidad para hacer esto como un comando manage.py.

pip install django-extensions

Luego agregue django_extensionsa su INSTALLED_APPS en settings.py. luego desde la consola simplemente escriba lo siguiente

python manage.py show_urls
Alan Viars
fuente
2
¡Práctico! No creo que jamás hubiera descubierto esto. ¡Gracias!
Tim Ruddick
6

A riesgo de agregar una respuesta "yo también", estoy publicando una versión modificada del script enviado anteriormente que le brinda una vista que enumera todas las URL del proyecto, algo embellecidas y ordenadas alfabéticamente, y las vistas que llaman. Más una herramienta de desarrollo que una página de producción.

def all_urls_view(request):
    from your_site.urls import urlpatterns #this import should be inside the function to avoid an import loop
    nice_urls = get_urls(urlpatterns) #build the list of urls recursively and then sort it alphabetically
    return render(request, "yourapp/links.html", {"links":nice_urls})

def get_urls(raw_urls, nice_urls=[], urlbase=''):
    '''Recursively builds a list of all the urls in the current project and the name of their associated view'''
    from operator import itemgetter
    for entry in raw_urls:
        fullurl = (urlbase + entry.regex.pattern).replace('^','')
        if entry.callback: #if it points to a view
            viewname = entry.callback.func_name
            nice_urls.append({"pattern": fullurl, 
                  "location": viewname})
        else: #if it points to another urlconf, recur!
            get_urls(entry.url_patterns, nice_urls, fullurl)
    nice_urls = sorted(nice_urls, key=itemgetter('pattern')) #sort alphabetically
    return nice_urls

y la plantilla:

<ul>
{% for link in links %}
<li>
{{link.pattern}}   -----   {{link.location}}
</li>
{% endfor%}
</ul>

Si quisiera ser realmente elegante, podría representar la lista con cuadros de entrada para cualquiera de las expresiones regulares que toman variables para pasar a la vista (nuevamente como una herramienta de desarrollo en lugar de una página de producción).

Andy
fuente
4

Esta pregunta es un poco vieja, pero me encontré con el mismo problema y pensé en discutir mi solución. Un proyecto de Django determinado obviamente necesita un medio para conocer todas sus URL y debe poder hacer un par de cosas:

  1. mapa desde una url -> ver
  2. mapa desde una URL nombrada -> URL (luego se usa 1 para obtener la vista)
  3. mapa desde un nombre de vista -> url (luego se usa 1 para obtener la vista)

Django logra esto principalmente a través de un objeto llamado a RegexURLResolver.

  1. RegexURLResolver.resolve (mapa de una URL -> ver)
  2. RegexURLResolver.reverse

Puede conseguir uno de estos objetos de la siguiente manera:

from my_proj import urls
from django.core.urlresolvers import get_resolver
resolver = get_resolver(urls)

Luego, simplemente puede imprimir sus URL de la siguiente manera:

for view, regexes in resolver.reverse_dict.iteritems():
    print "%s: %s" % (view, regexes)

Dicho esto, la solución de Alasdair está perfectamente bien y tiene algunas ventajas, ya que imprime algo mejor que este método. Pero saber acerca de un RegexURLResolverobjeto y tenerlo en sus manos es algo bueno de saber, especialmente si está interesado en los componentes internos de Django.

abhillman
fuente
2

He enviado un paquete (django-showurls) que agrega esta funcionalidad a cualquier proyecto de Django, es un nuevo comando de administración simple que se integra bien con manage.py:

$ python manage.py showurls
^admin/
  ^$
    ^login/$
    ^logout/$
.. etc ..

Puedes instalarlo a través de pip:

pip install django-showurls

Y luego agréguelo a sus aplicaciones instaladas en el archivo settings.py de su proyecto Django:

INSTALLED_APPS = [
    ..
    'django_showurls',
    ..
]

Y estás listo para empezar.

Más información aquí: https://github.com/Niklas9/django-showurls

Niklas9
fuente
Bien gracias. Podría ser útil si, al lado de cada línea de árbol, estuviera el nombre de la aplicación que define la regla (o alguna forma similar de detectar la aplicación).
Vedran Šego
Tenga en cuenta que Django Extensions también incluye un show_urlscomando - django-extensions.readthedocs.io/en/latest/…
Taylor Edmiston
1

La forma más sencilla de obtener una lista completa de las URL registradas es instalar contrib.admindocs luego consultar la sección "Vistas". Muy fácil de configurar y también le brinda documentos completamente navegables en todas sus etiquetas de plantilla, modelos, etc.

coctelera
fuente
0

¿Está buscando las URL evaluadas o no evaluadas como se muestra en el modo DEBUG? Para evaluarlo, django.contrib.sitemaps puede ayudarlo allí, de lo contrario, podría involucrar algo de ingeniería inversa con el código de Django.

Thierry Lam
fuente
0

Cuando probé las otras respuestas aquí, recibí este error:

django.core.exceptions.AppRegistryNotReady: las aplicaciones aún no están cargadas.

Parece que el problema proviene de usar django.contrib.admin.autodiscover()en mi urls.py, por lo que puedo comentarlo o cargar Django correctamente antes de descargar las URL. Por supuesto, si quiero ver las URL de administrador en el mapeo, no puedo comentarlas.

La forma que encontré fue crear un comando de administración personalizado que volca las URL.

# install this file in mysite/myapp/management/commands/urldump.py
from django.core.management.base import BaseCommand

from kive import urls


class Command(BaseCommand):
    help = "Dumps all URL's."

    def handle(self, *args, **options):
        self.show_urls(urls.urlpatterns)

    def show_urls(self, urllist, depth=0):
        for entry in urllist:
            print ' '.join(("  " * depth, entry.regex.pattern,
                            entry.callback and entry.callback.__module__ or '',
                            entry.callback and entry.callback.func_name or ''))
            if hasattr(entry, 'url_patterns'):
                self.show_urls(entry.url_patterns, depth + 1)
Don Kirkby
fuente
-3

Si está ejecutando Django en modo de depuración (tiene DEBUG = Trueen su configuración) y luego escribe una URL inexistente, obtendrá una página de error que enumera la configuración completa de la URL.

Van Gale
fuente
Como mencioné, esta página de error no muestra la configuración completa porque no incluye información sobre las configuraciones de URL incluidas .
Michael
Entendí exactamente lo que querías decir con las configuraciones de URL INCLUIDAS, pero respondí desde una memoria defectuosa porque no tenía acceso inmediato a un sitio de prueba. Juro que he visto que la página de error de URL pone un espacio entre la URL de nivel superior y las URL incluidas, pero ahora veo que no. Entonces la respuesta es NO, no hay forma de ver la configuración completa.
Van Gale
La página de error muestra solo las configuraciones de URL incluidas relevantes . Por ejemplo, la página 404 /news/bad_url/mostrará las URL incluidas desde la newsaplicación, pero no desde la sportaplicación.
Alasdair