Django : How can I see a list of urlpatterns?

匿名 (未验证) 提交于 2019-12-03 01:51:02

问题:

How can I see the current urlpatterns that "reverse" is looking in?

I'm calling reverse in a view with an argument that I think should work, but doesn't. Any way I can check what's there and why my pattern isn't?

回答1:

./manage.py show_urls

Manage should include this by feature by default.

edit After reading a comment I realized that this feature is provided by django-extensions (http://pypi.python.org/pypi/django-extensions/0.7.1)



回答2:

Try this:

from django.core.urlresolvers import get_resolver get_resolver(None).reverse_dict.keys()


回答3:

There is a recipe on 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)


回答4:

I am using the next command:

(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

Sample output:

---------------------------------------------------------------------------------------------------- | ^(.+)/$              |                      | 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.contrib.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 | {} | | ^(?Pactivity|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 | {} | | ^(?Pactivity|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.contrib.admin.sites.AdminSite.index | {} | | ^$                   | index                | apps.core.views.IndexView | {} | | ^jsi18n/$            | javascript-catalog   | django.views.i18n.javascript_catalog | {'packages': ('your.app.package',)} | | ^jsi18n/$            | jsi18n               | django.contrib.admin.sites.AdminSite.i18n_javascript | {} | | level/(?P[-_\w]+)/$ | level                | apps.users.views.UserDetailView | {} | | ^login/$             | login                | django.contrib.admin.sites.AdminSite.login | {} | | ^logout/$            | logout               | django.contrib.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.contrib.admin.sites.AdminSite.password_change | {} | | ^password_change/done/$ | password_change_done | django.contrib.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.contrib.admin.options.ModelAdmin.add_view | {} | | ^(.+)/change/$       | polls_choice_change  | django.contrib.admin.options.ModelAdmin.change_view | {} | | ^$                   | polls_choice_changelist | django.contrib.admin.options.ModelAdmin.changelist_view | {} | | ^(.+)/delete/$       | polls_choice_delete  | django.contrib.admin.options.ModelAdmin.delete_view | {} | | ^(.+)/history/$      | polls_choice_history | django.contrib.admin.options.ModelAdmin.history_view | {} | | ^add/$               | polls_poll_add       | django.contrib.admin.options.ModelAdmin.add_view | {} | | ^(.+)/change/$       | polls_poll_change    | django.contrib.admin.options.ModelAdmin.change_view | {} | | ^$                   | polls_poll_changelist | django.contrib.admin.options.ModelAdmin.changelist_view | {} | | ^(.+)/delete/$       | polls_poll_delete    | django.contrib.admin.options.ModelAdmin.delete_view | {} | | ^(.+)/history/$      | polls_poll_history   | django.contrib.admin.options.ModelAdmin.history_view | {} | | ^$                   | polls_vote_changelist | django.contrib.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.contrib.admin.options.ModelAdmin.add_view | {} | | ^(.+)/change/$       | questions_answer_change | django.contrib.admin.options.ModelAdmin.change_view | {} | | ^$                   | questions_answer_changelist | django.contrib.admin.options.ModelAdmin.changelist_view | {} | | ^(.+)/delete/$       | questions_answer_delete | django.contrib.admin.options.ModelAdmin.delete_view | {} | | ^(.+)/history/$      | questions_answer_history | django.contrib.admin.options.ModelAdmin.history_view | {} | | ^add/$               | questions_question_add | django.contrib.admin.options.ModelAdmin.add_view | {} | | ^(.+)/change/$       | questions_question_change | django.contrib.admin.options.ModelAdmin.change_view | {} | | ^$                   | questions_question_changelist | django.contrib.admin.options.ModelAdmin.changelist_view | {} | | ^(.+)/delete/$       | questions_question_delete | django.contrib.admin.options.ModelAdmin.delete_view | {} | | ^(.+)/history/$      | questions_question_history | django.contrib.admin.options.ModelAdmin.history_view | {} | | ^setlang/$           | set_language         | django.views.i18n.set_language | {} | | ^add/$               | snippets_snippet_add | django.contrib.admin.options.ModelAdmin.add_view | {} | | ^(.+)/change/$       | snippets_snippet_change | django.contrib.admin.options.ModelAdmin.change_view | {} | | ^$                   | snippets_snippet_changelist | django.contrib.admin.options.ModelAdmin.changelist_view | {} | | ^(.+)/delete/$       | snippets_snippet_delete | django.contrib.admin.options.ModelAdmin.delete_view | {} | | ^(.+)/history/$      | snippets_snippet_history | django.contrib.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.contrib.contenttypes.views.shortcut | {} | | writer/(?P[-_\w]+)/$ | writer               | apps.books.views.WriterDetailView | {} | ----------------------------------------------------------------------------------------------------


回答5:

There's a plugin I use: https://github.com/django-extensions/django-extensions, it has a show_urls command that could help.



回答6:

Django 1.11, Python 2.7.6

cd to_your_django_project

python manage.py shell

Then paste following code.

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)

Sample output:

^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/^(.+)/$ ...


回答7:

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

In python manage.py shell

import urls get_resolved_urls(urls.urlpatterns)


回答8:

I have extended Seti's command to show namespace, all url parts, auto-adjust column widths, sorted by (namespace,name): 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: column order is kept in Python 3.6 and one would need to use OrderedDict in older versions.

Update: A new version with OrderedDict now lives in django-?s package: https://github.com/5monkeys/django-bananas/blob/master/bananas/management/commands/show_urls.py



回答9:

Simply type in a url you know does not exist and the server will return an error message with a list of url patterns.

For example, if you're running a site at http://localhost:8000/something

Type in

http://localhost:8000/something/blahNonsense, and your server will return the url search list and display it in the browser



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!