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 ?

7voto

Sandeep Points 5289
def get_resolved_urls(url_patterns):
    url_patterns_resolved = []
    for entry in url_patterns:
        if hasattr(entry, 'url_patterns'):
            url_patterns_resolved += get_resolved_urls(
                entry.url_patterns)
        else:
            url_patterns_resolved.append(entry)
    return url_patterns_resolved

Dans le shell python manage.py

import urls
get_resolved_urls(urls.urlpatterns)

6voto

Solution minimaliste pour django 2.0

Par exemple, si vous cherchez une url qui se trouve sur la première application de installed_apps, vous pouvez y accéder comme ça :

from django.urls import get_resolver
from pprint import pprint

pprint(
    get_resolver().url_patterns[0].url_patterns
)

4voto

Andrei Points 3689

J'ai prolongé Le commandement de Seti pour afficher l'espace de nom, toutes les parties de l'url, ajuster automatiquement la largeur des colonnes, trier par (espace de nom, nom) : https://gist.github.com/andreif/263a3fa6e7c425297ffee09c25f66b20

import sys
from django.core.management import BaseCommand
from django.conf.urls import RegexURLPattern, RegexURLResolver
from django.core import urlresolvers

def collect_urls(urls=None, namespace=None, prefix=None):
    if urls is None:
        urls = urlresolvers.get_resolver()
    _collected = []
    prefix = prefix or []
    for x in urls.url_patterns:
        if isinstance(x, RegexURLResolver):
            _collected += collect_urls(x, namespace=x.namespace or namespace,
                                       prefix=prefix + [x.regex.pattern])
        elif isinstance(x, RegexURLPattern):
            _collected.append({'namespace': namespace or '',
                               'name': x.name or '',
                               'pattern': prefix + [x.regex.pattern],
                               'lookup_str': x.lookup_str,
                               'default_args': dict(x.default_args)})
        else:
            raise NotImplementedError(repr(x))
    return _collected

def show_urls():
    all_urls = collect_urls()
    all_urls.sort(key=lambda x: (x['namespace'], x['name']))

    max_lengths = {}
    for u in all_urls:
        for k in ['pattern', 'default_args']:
            u[k] = str(u[k])
        for k, v in list(u.items())[:-1]:
            # Skip app_list due to length (contains all app names)
            if (u['namespace'], u['name'], k) == \
                    ('admin', 'app_list', 'pattern'):
                continue
            max_lengths[k] = max(len(v), max_lengths.get(k, 0))

    for u in all_urls:
        sys.stdout.write(' | '.join(
            ('{:%d}' % max_lengths.get(k, len(v))).format(v)
            for k, v in u.items()) + '\n')

class Command(BaseCommand):
    def handle(self, *args, **kwargs):
        show_urls()

Note : l'ordre des colonnes est maintenu dans Python 3.6 et il faudrait utiliser OrderedDict dans les anciennes versions.

Mise à jour : Une nouvelle version avec OrderedDict existe maintenant dans le paquet django-s : https://github.com/5monkeys/django-bananas/blob/master/bananas/management/commands/show_urls.py

4voto

Aditya Saini Points 41

Django 1.8, Python 2.7+. Il suffit d'exécuter ces commandes dans votre Shell. shell Python manage.py et exécutez le code suivant.

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

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)

2voto

mehmet Points 3219

Solution pour la liste Django >= 2.0

adopté de @CesarCanassa

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

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

def list_urls(patterns, path=None):
    """ recursive """
    if not path:
        path = []
    result = []
    for pattern in patterns:
        if isinstance(pattern, URLPattern):
            result.append(''.join(path) + str(pattern.pattern))
        elif isinstance(pattern, URLResolver):
            result += list_urls(pattern.url_patterns, path + [str(pattern.pattern)])
    return result

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