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

Por ejemplo, la página 404 de depuración 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 script 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)
82
Michael 1 dic. 2009 a las 22:05

9 respuestas

La mejor respuesta

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

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

import urls
urls.urlpatterns

La lista urls.urlpatterns contiene RegexURLPattern y RegexURLResolver objetos.

Para un objeto RegexURLPattern p puede mostrar la expresión regular con

p.regex.pattern

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

q.regex.pattern

A continuación, use

q.url_patterns

Que devolverá una lista adicional de objetos RegexURLResolver y RegexURLPattern.

47
Alasdair 12 oct. 2016 a las 14:10

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

0
Thierry Lam 1 dic. 2009 a las 22:22

La forma más fácil de obtener una lista completa de URL registradas es instalar contrib. admindocs luego verifique 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.

1
shacker 23 jul. 2013 a las 18:13

Esta pregunta es un poco vieja, pero me encontré con el mismo problema y pensé en discutir mi solución. Un proyecto Django dado 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 de una url con nombre -> 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 RegexURLResolver.

  1. RegexURLResolver.resolve (mapa desde una url -> ver)
  2. RegexURLResolver.reverse

Puede obtener 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 más bonito que este método. Pero conocer y tener en tus manos un objeto RegexURLResolver es algo agradable de saber, especialmente si estás interesado en los componentes internos de Django.

4
abhillman 5 ene. 2015 a las 06:36

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

pip install django-extensions

Luego agregue django_extensions a sus INSTALLED_APPS en settings.py. luego desde la consola simplemente escriba lo siguiente

python manage.py show_urls
66
Alan Viars 8 nov. 2013 a las 21:38

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

-3
Van Gale 1 dic. 2009 a las 21:32

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 del proyecto Django:

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

Y ya estás listo para partir.

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

2
Niklas9 20 feb. 2016 a las 09:36

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 del uso de 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 la asignación, no puedo comentarlas.

La forma en que encontré fue crear un comando de administración personalizado que vuelca las urls.

# 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)
0
Don Kirkby 4 may. 2015 a las 17:29

A riesgo de agregar una respuesta "yo también", estoy publicando una versión modificada de la secuencia de comandos presentada anteriormente que le brinda una vista que enumera todas las URL en el proyecto, algo prettified y ordenado alfabéticamente, y las vistas que llaman. Más de una herramienta de desarrollador 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 desea obtener una fantasía real, puede 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 desarrollador en lugar de una página de producción).

6
andy 1 jul. 2013 a las 21:41