¿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)
Respuestas:
Django es Python, así que la introspección es tu amiga.
En el shell, importe
urls
. Al recorrerurls.urlpatterns
y 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.urlpatterns
contieneRegexURLPattern
yRegexURLResolver
objetos.Para un
RegexURLPattern
objetop
, puede mostrar la expresión regular conPara un
RegexURLResolver
objetoq
, que representa una configuración de URL incluida, puede mostrar la primera parte de la expresión regular conEntonces usa
que devolverá una lista adicional de objetos
RegexURLResolver
yRegexURLPattern
.fuente
RegexURLPattern
oRegexURLResolver
. Usarhas_attr
es una idea mucho mejor. Debería poner su función en respuesta aquí en Stack Overflow. Yo lo votaría.Las extensiones de Django proporcionan una utilidad para hacer esto como un comando manage.py.
Luego agregue
django_extensions
a su INSTALLED_APPS ensettings.py
. luego desde la consola simplemente escriba lo siguientefuente
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).
fuente
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:
Django logra esto principalmente a través de un objeto llamado a
RegexURLResolver
.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
RegexURLResolver
objeto y tenerlo en sus manos es algo bueno de saber, especialmente si está interesado en los componentes internos de Django.fuente
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:
Puedes instalarlo a través de pip:
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
fuente
show_urls
comando - django-extensions.readthedocs.io/en/latest/…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.
fuente
¿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.
fuente
Cuando probé las otras respuestas aquí, recibí este error:
Parece que el problema proviene de usar
django.contrib.admin.autodiscover()
en miurls.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)
fuente
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.fuente
/news/bad_url/
mostrará las URL incluidas desde lanews
aplicación, pero no desde lasport
aplicación.