Comment puis-je voir les urlpatterns actuels que “reverse” recherche?
J’appelle reverse dans un sharepoint vue avec un argument qui, je pense, devrait fonctionner, mais pas. De toute façon je peux vérifier ce qu’il y a et pourquoi mon modèle n’est pas?
./manage.py show_urls
Manage devrait inclure ceci par fonctionnalité par défaut.
edit Après avoir lu un commentaire, j’ai réalisé que cette fonctionnalité est fournie par django-extensions ( http://pypi.python.org/pypi/django-extensions/0.7.1 )
Essaye ça:
from django.core.urlresolvers import get_resolver get_resolver(None).reverse_dict.keys()
Il y a une recette sur activestate
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.url_patterns)
J’utilise la commande suivante:
(Python3 + Django 1.10)
from django.core.management import BaseCommand from django.conf.urls import RegexURLPattern, RegexURLResolver from django.core import urlresolvers class Command(BaseCommand): def add_arguments(self, parser): pass def handle(self, *args, **kwargs): urls = urlresolvers.get_resolver() all_urls = list() def func_for_sorting(i): if i.name is None: i.name = '' return i.name def show_urls(urls): for url in urls.url_patterns: if isinstance(url, RegexURLResolver): show_urls(url) elif isinstance(url, RegexURLPattern): all_urls.append(url) show_urls(urls) all_urls.sort(key=func_for_sorting, reverse=False) print('-' * 100) for url in all_urls: print('| {0.regex.pattern:20} | {0.name:20} | {0.lookup_str:20} | {0.default_args} |'.format(url)) print('-' * 100)
Usage:
./manage.py showurls
Sortie de l’échantillon:
---------------------------------------------------------------------------------------------------- | ^(.+)/$ | | django.views.generic.base.RedirectView | {} | | ^(.+)/$ | | django.views.generic.base.RedirectView | {} | | ^(.+)/$ | | django.views.generic.base.RedirectView | {} | | ^(.+)/$ | | django.views.generic.base.RedirectView | {} | | ^(.+)/$ | | django.views.generic.base.RedirectView | {} | | ^(.+)/$ | | django.views.generic.base.RedirectView | {} | | ^static\/(?P.*)$ | | django.consortingb.staticfiles.views.serve | {} | | ^media\/(?P .*)$ | | django.views.static.serve | {'document_root': '/home/wlysenko/.virtualenvs/programmerHelper/project/media'} | | ^(?Ppolls|snippets|questions)/$ | app_list | apps.core.admin.AdminSite.app_index | {} | | ^(?P activity|articles|badges|books|comments|flavours|forum|marks|newsletters|notifications|opinions|polls|questions|replies|snippets|solutions|tags|testing|users|utilities|visits)/reports/$ | app_reports | apps.core.admin.AdminSite.reports_view | {} | | ^(?P activity|articles|badges|books|comments|flavours|forum|marks|newsletters|notifications|opinions|polls|questions|replies|snippets|solutions|tags|testing|users|utilities|visits)/statistics/$ | app_statistics | apps.core.admin.AdminSite.statistics_view | {} | | articles/(?P[-\w]+)/$ | article | apps.articles.views.ArticleDetailView | {} | | book/(?P [-_\w]+)/$ | book | apps.books.views.BookDetailView | {} | | category/(?P [-_\w]+)/$ | category | apps.utilities.views.CategoryDetailView | {} | | create/$ | create | apps.users.views.UserDetailView | {} | | delete/$ | delete | apps.users.views.UserDetailView | {} | | detail/(?P\w+@[-_\w]+.\w+)/$ | detail | apps.users.views.UserDetailView | {} | | snippet/(?P[-_\w]+)/$ | detail | apps.snippets.views.SnippetDetailView | {} | | (?P\d+)/(?P[-,\w]*)/$ | export | apps.export_import_models.views.ExportTemplateView | {} | | download_preview/$ | export_preview_download | apps.export_import_models.views.ExportPreviewDownloadView | {} | | ^$ | import | apps.export_import_models.views.ImportTemplateView | {} | | result/$ | import_result | apps.export_import_models.views.ImportResultTemplateView | {} | | ^$ | index | django.consortingb.admin.sites.AdminSite.index | {} | | ^$ | index | apps.core.views.IndexView | {} | | ^jsi18n/$ | javascript-catalog | django.views.i18n.javascript_catalog | {'packages': ('your.app.package',)} | | ^jsi18n/$ | jsi18n | django.consortingb.admin.sites.AdminSite.i18n_javascript | {} | | level/(?P[-_\w]+)/$ | level | apps.users.views.UserDetailView | {} | | ^login/$ | login | django.consortingb.admin.sites.AdminSite.login | {} | | ^logout/$ | logout | django.consortingb.admin.sites.AdminSite.logout | {} | | newsletter/(?P [_\w]+)/$ | newsletter | apps.newsletters.views.NewsletterDetailView | {} | | newsletters/$ | newsletters | apps.newsletters.views.NewslettersListView | {} | | notification/(?P[-\w]+@[-\w]+.\w+)/$ | notification | apps.notifications.views.NotificationDetailView | {} | | ^password_change/$ | password_change | django.consortingb.admin.sites.AdminSite.password_change | {} | | ^password_change/done/$ | password_change_done | django.consortingb.admin.sites.AdminSite.password_change_done | {} | | ^image/(?P\d+)x(?P\d+)/$ | placeholder | apps.core.views.PlaceholderView | {} | | poll/(?P\w{8}-\w{4}-\w{4}-\w{4}-\w{12})/(?P[-\w]+)/$ | poll | apps.polls.views.PollDetailView | {} | | ^add/$ | polls_choice_add | django.consortingb.admin.options.ModelAdmin.add_view | {} | | ^(.+)/change/$ | polls_choice_change | django.consortingb.admin.options.ModelAdmin.change_view | {} | | ^$ | polls_choice_changelist | django.consortingb.admin.options.ModelAdmin.changelist_view | {} | | ^(.+)/delete/$ | polls_choice_delete | django.consortingb.admin.options.ModelAdmin.delete_view | {} | | ^(.+)/history/$ | polls_choice_history | django.consortingb.admin.options.ModelAdmin.history_view | {} | | ^add/$ | polls_poll_add | django.consortingb.admin.options.ModelAdmin.add_view | {} | | ^(.+)/change/$ | polls_poll_change | django.consortingb.admin.options.ModelAdmin.change_view | {} | | ^$ | polls_poll_changelist | django.consortingb.admin.options.ModelAdmin.changelist_view | {} | | ^(.+)/delete/$ | polls_poll_delete | django.consortingb.admin.options.ModelAdmin.delete_view | {} | | ^(.+)/history/$ | polls_poll_history | django.consortingb.admin.options.ModelAdmin.history_view | {} | | ^$ | polls_vote_changelist | django.consortingb.admin.options.ModelAdmin.changelist_view | {} | | publisher/(?P [-_\w]+)/$ | publisher | apps.books.views.PublisherDetailView | {} | | question/(?P [-_\w]+)/$ | question | apps.questions.views.QuestionDetailView | {} | | ^add/$ | questions_answer_add | django.consortingb.admin.options.ModelAdmin.add_view | {} | | ^(.+)/change/$ | questions_answer_change | django.consortingb.admin.options.ModelAdmin.change_view | {} | | ^$ | questions_answer_changelist | django.consortingb.admin.options.ModelAdmin.changelist_view | {} | | ^(.+)/delete/$ | questions_answer_delete | django.consortingb.admin.options.ModelAdmin.delete_view | {} | | ^(.+)/history/$ | questions_answer_history | django.consortingb.admin.options.ModelAdmin.history_view | {} | | ^add/$ | questions_question_add | django.consortingb.admin.options.ModelAdmin.add_view | {} | | ^(.+)/change/$ | questions_question_change | django.consortingb.admin.options.ModelAdmin.change_view | {} | | ^$ | questions_question_changelist | django.consortingb.admin.options.ModelAdmin.changelist_view | {} | | ^(.+)/delete/$ | questions_question_delete | django.consortingb.admin.options.ModelAdmin.delete_view | {} | | ^(.+)/history/$ | questions_question_history | django.consortingb.admin.options.ModelAdmin.history_view | {} | | ^setlang/$ | set_language | django.views.i18n.set_language | {} | | ^add/$ | snippets_snippet_add | django.consortingb.admin.options.ModelAdmin.add_view | {} | | ^(.+)/change/$ | snippets_snippet_change | django.consortingb.admin.options.ModelAdmin.change_view | {} | | ^$ | snippets_snippet_changelist | django.consortingb.admin.options.ModelAdmin.changelist_view | {} | | ^(.+)/delete/$ | snippets_snippet_delete | django.consortingb.admin.options.ModelAdmin.delete_view | {} | | ^(.+)/history/$ | snippets_snippet_history | django.consortingb.admin.options.ModelAdmin.history_view | {} | | solution/(?P\w{8}-\w{4}-\w{4}-\w{4}-\w{12})/(?P[-_\w]+)/$ | solution | apps.solutions.views.SolutionDetailView | {} | | suit/(?P [-\w]+)/$ | suit | apps.testing.views.SuitDetailView | {} | | tag/(?P[-_\w]+)/$ | tag | apps.tags.views.TagDetailView | {} | | theme/(?P[-_\w]+)/$ | theme | apps.forum.views.SectionDetailView | {} | | topic/(?P [-_\w]+)/$ | topic | apps.forum.views.TopicDetailView | {} | | update/$ | update | apps.users.views.UserDetailView | {} | | ^r/(?P\d+)/(?P.+)/$ | view_on_site | django.consortingb.contenttypes.views.shortcut | {} | | writer/(?P[-_\w]+)/$ | writer | apps.books.views.WriterDetailView | {} | ----------------------------------------------------------------------------------------------------
Django 1.11, Python 2.7.6
cd to_your_django_project
shell python manage.py
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)
Sortie de l’échantillon:
^django-admin/^$ ^django-admin/^login/$ ^django-admin/^logout/$ ^django-admin/^password_change/$ ^django-admin/^password_change/done/$ ^django-admin/^jsi18n/$ ^django-admin/^r/(?P\d+)/(?P.+)/$ ^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/^(.+)/$ ...
J’utilise un plugin: https://github.com/django-extensions/django-extensions , il a une commande show_urls qui pourrait aider.
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)
J’ai étendu la commande de Seti pour afficher l’espace de noms, toutes les parties d’URL, ajuster automatiquement les largeurs de colonne, sortingées par (espace de noms, 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()
Remarque: l’ ordre des colonnes est conservé dans Python 3.6 et vous devez utiliser
OrderedDict
dans les anciennes versions.
Mise à jour: Une nouvelle version avec OrderedDict vit désormais dans le package django-🍌s: https://github.com/5monkeys/django-bananas/blob/master/bananas/management/commands/show_urls.py
Tapez simplement une URL dont vous savez qu’elle n’existe pas et le serveur renverra un message d’erreur avec une liste de modèles d’URL.
Par exemple, si vous exécutez un site à l’ adresse http: // localhost: 8000 / quelquechose
Tapez
http: // localhost: 8000 / something / blahNonsense , et votre serveur retournera la liste de recherche d’URL et l’affichera dans le navigateur