Pregunta Determinar la configuración completa de URL de Django


¿Hay alguna manera de obtener el completar configuración django url?

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.


Responder: 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)

75
2017-12-01 19:05


origen


Respuestas:


Django es Python, por lo que la introspección es tu amiga.

En el shell, importar urls. Al recorrer a través de urls.urlpatternsy explorando tantas capas de configuraciones de url incluidas como sea posible, puede compilar la configuración de url completa.

import urls
urls.urlpatterns

La lista urls.urlpatterns contiene RegexURLPattern y RegexURLResolver objetos.

Para RegexURLPattern objeto p puedes mostrar la expresión regular con

p.regex.pattern

Para RegexURLResolver objeto 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 RegexURLResolver y RegexURLPattern objetos.


45
2017-12-01 23:02



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

pip install django-extensions

Luego añade django_extensions a su INSTALLED_APPS en settings.py. luego, desde la consola solo escribe lo siguiente

python manage.py show_urls

60
2017-11-08 21:38



A riesgo de agregar una respuesta "yo también", estoy publicando una versión modificada del script enviado anteriormente que le ofrece una vista que enumera todas las URL del proyecto, algo embellecido y ordenado alfabéticamente, y las vistas que llaman. Más 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 quieres ser realmente elegante, puedes renderizar la lista con cuadros de entrada para cualquiera de las expresiones regulares que toman las variables para pasar a la vista (una vez más como una herramienta de desarrollador en lugar de como una página de producción).


6
2017-07-01 21:41



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

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

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

  1. RegexURLResolver.resolve (mapa de una url -> vista)
  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)

Entonces, 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 que este método. Pero conocer y tener en tus manos una RegexURLResolver el objeto es algo bueno de saber, especialmente si estás interesado en el interior de Django.


4
2018-01-05 06:36



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 su archivo Django project settings.py:

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

Y estás listo para irte

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


2
2018-02-20 09:36



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


1
2017-07-23 18:13



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


0
2017-12-01 22:22