web-dev-qa-db-fra.com

Déterminer la configuration complète de l'url Django

Existe-t-il un moyen d’obtenir la configuration complete Django url?

Par exemple, la page 404 de débogage de Django n'indique pas les configurations d'URL incluses. Il ne s'agit donc pas de la configuration complète.


Answer : Merci à Alasdair, voici un exemple de script:

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)
77
Michael

Django est Python, donc l'introspection est votre ami.

Dans le shell, importez urls. En parcourant urls.urlpatterns et en explorant autant de couches de configurations d'URL incluses que possible, vous pouvez créer la configuration d'URL complète. 

import urls
urls.urlpatterns

La liste urls.urlpatterns contient les objets RegexURLPattern et RegexURLResolver.

Pour un objet RegexURLPatternp, vous pouvez afficher l'expression régulière avec

p.regex.pattern

Pour un objet RegexURLResolverq, qui représente une configuration d'URL incluse, vous pouvez afficher la première partie de l'expression régulière avec

q.regex.pattern

Puis utiliser

q.url_patterns

qui renverra une liste supplémentaire d'objets RegexURLResolver et RegexURLPattern.

45
Alasdair

Les extensions Django fournissent un utilitaire permettant de le faire en tant que commande manage.py.

pip install Django-extensions

Ajoutez ensuite Django_extensions à votre INSTALLED_APPS dans settings.py. puis de la console il suffit de taper ce qui suit

python manage.py show_urls
64
Alan Viars

Au risque d’ajouter une réponse "moi aussi", je publie une version modifiée du script soumis ci-dessus qui vous donne une vue répertoriant toutes les URL du projet, quelque peu priées et triées par ordre alphabétique, ainsi que les vues qu’elles appellent. Plus d'un outil de développement qu'une page de production. 

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

et le template:

<ul>
{% for link in links %}
<li>
{{link.pattern}}   -----   {{link.location}}
</li>
{% endfor%}
</ul>

Si vous voulez vraiment vous imaginer, vous pouvez afficher la liste avec des zones de saisie pour toutes les expressions rationnelles prenant des variables à transmettre à la vue (à nouveau comme outil de développement plutôt que comme page de production). 

6
andy

Cette question est un peu ancienne, mais j'ai rencontré le même problème et j'ai pensé discuter de ma solution. Un projet Django donné a évidemment besoin d'un moyen de connaître toutes ses URL et doit pouvoir faire plusieurs choses:

  1. carte depuis une url -> vue
  2. carte à partir d'une URL nommée -> url (alors 1 est utilisé pour obtenir la vue)
  3. carte à partir d'un nom de vue -> url (alors 1 est utilisé pour obtenir la vue)

Django accomplit cela principalement via un objet appelé RegexURLResolver.

  1. RegexURLResolver.resolve (carte d'une url -> vue)
  2. RegexURLResolver.reverse

Vous pouvez mettre la main sur l'un de ces objets de la manière suivante:

from my_proj import urls
from Django.core.urlresolvers import get_resolver
resolver = get_resolver(urls)

Ensuite, vous pouvez simplement imprimer vos URL de la manière suivante:

for view, regexes in resolver.reverse_dict.iteritems():
    print "%s: %s" % (view, regexes)

Cela dit, la solution d’Alasdair est tout à fait satisfaisante et présente certains avantages, dans la mesure où elle imprime quelque chose de plus agréable que cette méthode. Mais connaître et mettre la main sur un objet RegexURLResolver est une chose agréable à connaître, surtout si vous êtes intéressé par les éléments internes de Django.

4
abhillman

J'ai soumis un package (Django-showurls) qui ajoute cette fonctionnalité à tout projet Django. Il s'agit d'une nouvelle commande simple de gestion s'intégrant bien à manage.py:

$ python manage.py showurls
^admin/
  ^$
    ^login/$
    ^logout/$
.. etc ..

Vous pouvez l'installer via pip:

pip install Django-showurls

Et ajoutez-le à vos applications installées dans votre fichier settings.py de projet Django:

INSTALLED_APPS = [
    ..
    'Django_showurls',
    ..
]

Et vous êtes prêt à partir.

Plus d'infos ici - https://github.com/Niklas9/Django-showurls

2
Niklas9

Le moyen le plus simple d’obtenir une liste complète des URL enregistrées est d’installer contrib.admindocs puis de vérifier la section "Vues". Très facile à configurer, il vous donne également des documents entièrement consultables sur toutes vos balises de modèles, modèles, etc.

1
shacker

Recherchez-vous les URL évaluées ou non évaluées comme indiqué dans le mode DEBUG? Pour l'évaluation, Django.contrib.sitemaps peut vous aider, sinon il pourrait impliquer du reverse engineering avec le code de Django.

0
Thierry Lam

Lorsque j'ai essayé les autres réponses ici, j'ai eu cette erreur:

Django.core.exceptions.AppRegistryNotReady: Les applications ne sont pas encore chargées.

Il semble que le problème vienne de l'utilisation de Django.contrib.admin.autodiscover() dans mon urls.py. Je peux donc commenter cela ou charger Django correctement avant de vider l'URL. Bien sûr, si je veux voir l'URL d'administration dans le mappage, je ne peux pas les commenter.

La méthode que j’ai trouvée est de créer une commande de gestion custom qui renvoie les 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)
0
Don Kirkby