232 votes

Django : Comment voir une liste d'urlpatterns ?

Comment puis-je voir les urlpatterns actuels que "reverse" recherche ?

J'appelle l'inverse dans une vue avec un argument qui devrait fonctionner, mais qui ne fonctionne pas. Y a-t-il un moyen de vérifier ce qui est là et pourquoi mon motif ne l'est pas ?

306voto

robert Points 915

Si vous voulez une liste de toutes les urls dans votre projet, vous devez d'abord installer django-extensions

Vous pouvez simplement l'installer en utilisant la commande.

pip install django-extensions

Pour plus d'informations sur le paquet, voir django-extensions

Après cela, ajoutez django_extensions sur INSTALLED_APPS dans votre settings.py comme ceci :

INSTALLED_APPS = (
...
'django_extensions',
...
)

urls.py exemple :

from django.urls import path, include
from . import views
from . import health_views

urlpatterns = [
    path('get_url_info', views.get_url_func),
    path('health', health_views.service_health_check),
    path('service-session/status', views.service_session_status)
]

Et ensuite, exécutez l'une des commandes dans votre terminal.

python manage.py show_urls

ou

./manage.py show_urls

Exemple de sortie basé sur la configuration urls.py :

/get_url_info             django_app.views.get_url_func
/health                   django_app.health_views.service_health_check
/service-session/status   django_app.views.service_session_status

Pour plus d'informations, vous pouvez consulter le site documentation .

119voto

SmileyChris Points 5405

Essayez ça :

from django.urls import get_resolver
get_resolver().reverse_dict.keys()

Ou si vous êtes toujours sur Django 1.* :

from django.core.urlresolvers import get_resolver
get_resolver(None).reverse_dict.keys()

90voto

Cesar Canassa Points 3579

Solution Django >= 2.0

J'ai testé les autres réponses de cet article et elles ne fonctionnaient pas avec Django 2.X, étaient incomplètes ou trop complexes. Voici donc mon point de vue sur la question :

from django.conf import settings
from django.urls import URLPattern, URLResolver

urlconf = __import__(settings.ROOT_URLCONF, {}, {}, [''])

def list_urls(lis, acc=None):
    if acc is None:
        acc = []
    if not lis:
        return
    l = lis[0]
    if isinstance(l, URLPattern):
        yield acc + [str(l.pattern)]
    elif isinstance(l, URLResolver):
        yield from list_urls(l.url_patterns, acc + [str(l.pattern)])
    yield from list_urls(lis[1:], acc)

for p in list_urls(urlconf.urlpatterns):
    print(''.join(p))

Ce code imprime toutes les URLs, contrairement à d'autres solutions, il imprimera le chemin complet et pas seulement le dernier nœud, par exemple :

admin/
admin/login/
admin/logout/
admin/password_change/
admin/password_change/done/
admin/jsi18n/
admin/r/<int:content_type_id>/<path:object_id>/
admin/auth/group/
admin/auth/group/add/
admin/auth/group/autocomplete/
admin/auth/group/<path:object_id>/history/
admin/auth/group/<path:object_id>/delete/
admin/auth/group/<path:object_id>/change/
admin/auth/group/<path:object_id>/
admin/auth/user/<id>/password/
admin/auth/user/
... etc, etc

29voto

small mammal Points 333

Django 1.11, Python 2.7.6

cd to_votre_django_projet

python manage.py shell

Puis collez le code suivant.

from django.conf.urls import RegexURLPattern, RegexURLResolver
from django.core import urlresolvers
urls = urlresolvers.get_resolver()

def if_none(value):
    if value:
        return value
    return ''

def print_urls(urls, parent_pattern=None):
    for url in urls.url_patterns:
        if isinstance(url, RegexURLResolver):
            print_urls(url, if_none(parent_pattern) + url.regex.pattern)
        elif isinstance(url, RegexURLPattern):
            print(if_none(parent_pattern) + url.regex.pattern)

print_urls(urls)

Exemple de sortie :

^django-admin/^$
^django-admin/^login/$
^django-admin/^logout/$
^django-admin/^password_change/$
^django-admin/^password_change/done/$
^django-admin/^jsi18n/$
^django-admin/^r/(?P<content_type_id>\d+)/(?P<object_id>.+)/$
^django-admin/^wagtailimages/image/^$
^django-admin/^wagtailimages/image/^add/$
^django-admin/^wagtailimages/image/^(.+)/history/$
^django-admin/^wagtailimages/image/^(.+)/delete/$
^django-admin/^wagtailimages/image/^(.+)/change/$
^django-admin/^wagtailimages/image/^(.+)/$
...

25voto

Javier Buzzi Points 2107

Voici une méthode rapide et efficace pour obtenir les informations dont vous avez besoin sans avoir à modifier vos paramètres.

$ pip install django-extensions
$ python manage.py shell -c 'from django.core.management import call_command; from django_extensions.management.commands.show_urls import Command; call_command(Command())'

C'est un complément à la réponse de @robert. Bien qu'elle soit correcte, je ne voulais pas avoir django-extensions comme une dépendance, même si ce n'était que pour une seconde.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X