84 votes

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

Y a-t-il un moyen d'obtenir le complet configuration de l'url de django ?

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


Réponse : : Grâce à 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)

2 votes

Très utile script, merci

68voto

Alan Viars Points 311

Les extensions Django fournissent un utilitaire pour faire cela sous la forme d'une commande manage.py.

pip install django-extensions

Puis ajoutez django_extensions à votre INSTALLED_APPS dans settings.py . puis, à partir de la console, tapez simplement ce qui suit

python manage.py show_urls

2 votes

Pratique ! Je ne pense pas que j'aurais jamais découvert cela. Je vous remercie !

49voto

Alasdair Points 36535

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

Dans le shell, importez urls . En passant en boucle par urls.urlpatterns et en passant par autant de couches de configurations d'url incluses que possible, vous pouvez construire la configuration d'url complète.

import urls
urls.urlpatterns

La liste urls.urlpatterns contient RegexURLPattern y RegexURLResolver objets.

Pour un RegexURLPattern objet p vous pouvez afficher l'expression régulière avec

p.regex.pattern

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

q.regex.pattern

Ensuite, utilisez

q.url_patterns

qui renverra une autre liste de RegexURLResolver y RegexURLPattern objets.

3 votes

Bonne idée ! J'ai fait un simple script ici : code.activestate.com/recipes/576974

0 votes

C'est une fonction élégante. J'ai commencé à essayer d'en écrire une, mais cela impliquait de vérifier les types d'objets pour voir s'ils étaient RegexURLPattern o RegexURLResolver . Utilisation de has_attr est une bien meilleure idée. Vous devriez mettre votre fonction en réponse ici sur Stack Overflow. Je la mettrais en avant.

0 votes

Cela cause tellement de problèmes d'importation cyclique à travers le fichier des paramètres !!!

7voto

andy Points 398

Au risque d'ajouter une réponse de type "moi aussi", je poste une version modifiée du script soumis ci-dessus qui vous donne une vue listant toutes les URLs du projet, quelque peu jolies et triées par ordre alphabétique, et les vues qu'elles appellent. C'est plus un outil de développeur 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 modèle :

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

Si vous voulez être vraiment fantaisiste, vous pouvez rendre la liste avec des boîtes de saisie pour toutes les expressions rationnelles qui prennent des variables à passer à la vue (encore une fois comme outil de développement plutôt que comme page de production).

0 votes

Je reçois AttributeError: 'URLResolver' object has no attribute 'regex'

1voto

shacker Points 3348

La manière la plus simple d'obtenir une liste complète des URLs enregistrées est d'installer contrib.admindocs puis vérifiez la section "Views". C'est très facile à mettre en place, et cela vous donne également des documents entièrement consultables sur toutes les balises de votre modèle, les modèles, etc.

0voto

Thierry Lam Points 7888

Cherchez-vous les urls évaluées ou non évaluées comme indiqué dans le mode DEBUG ? Pour les urls évaluées, django.contrib.sitemaps peut vous aider, sinon cela peut impliquer un peu de rétro-ingénierie avec le code de Django.

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