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)
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 RegexURLPattern
p
, vous pouvez afficher l'expression régulière avec
p.regex.pattern
Pour un objet RegexURLResolver
q
, 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
.
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
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).
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:
Django accomplit cela principalement via un objet appelé RegexURLResolver
.
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.
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
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.
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.
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)