Django : How can I see a list of urlpatterns?

后端 未结 16 1545
有刺的猬
有刺的猬 2020-11-29 19:36

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 wa

相关标签:
16条回答
  • 2020-11-29 19:36

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

    0 讨论(0)
  • 2020-11-29 19:36

    Django 1.8, Python 2.7+ Just run these commands in your Shell. Python manage.py shell and execute the following code.

    from django.conf.urls import RegexURLPattern, RegexURLResolver
    from django.core import urlresolvers
    urls = urlresolvers.get_resolver(None)
    
    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)
    
    0 讨论(0)
  • 2020-11-29 19:37

    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-

    0 讨论(0)
  • 2020-11-29 19:42

    If you want a list of all the urls in your project, first you need to install django-extensions, add it to your settings like this:

    INSTALLED_APPS = (
    ...
    'django_extensions',
    ...
    )
    

    And then, run this command in your terminal

    ./manage.py show_urls
    

    For more information you can check the documentation.

    0 讨论(0)
  • 2020-11-29 19:43

    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<path>.*)$ |                      | django.contrib.staticfiles.views.serve | {} |
    | ^media\/(?P<path>.*)$ |                      | django.views.static.serve | {'document_root': '/home/wlysenko/.virtualenvs/programmerHelper/project/media'} |
    | ^(?P<app_label>polls|snippets|questions)/$ | app_list             | apps.core.admin.AdminSite.app_index | {} |
    | ^(?P<app_label>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<app_label>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<slug>[-\w]+)/$ | article              | apps.articles.views.ArticleDetailView | {} |
    | book/(?P<slug>[-_\w]+)/$ | book                 | apps.books.views.BookDetailView | {} |
    | category/(?P<slug>[-_\w]+)/$ | category             | apps.utilities.views.CategoryDetailView | {} |
    | create/$             | create               | apps.users.views.UserDetailView | {} |
    | delete/$             | delete               | apps.users.views.UserDetailView | {} |
    | detail/(?P<email>\w+@[-_\w]+.\w+)/$ | detail               | apps.users.views.UserDetailView | {} |
    | snippet/(?P<slug>[-_\w]+)/$ | detail               | apps.snippets.views.SnippetDetailView | {} |
    | (?P<contenttype_model_pk>\d+)/(?P<pks_separated_commas>[-,\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<slug>[-_\w]+)/$ | level                | apps.users.views.UserDetailView | {} |
    | ^login/$             | login                | django.contrib.admin.sites.AdminSite.login | {} |
    | ^logout/$            | logout               | django.contrib.admin.sites.AdminSite.logout | {} |
    | newsletter/(?P<slug>[_\w]+)/$ | newsletter           | apps.newsletters.views.NewsletterDetailView | {} |
    | newsletters/$        | newsletters          | apps.newsletters.views.NewslettersListView | {} |
    | notification/(?P<account_email>[-\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<height>\d+)x(?P<width>\d+)/$ | placeholder          | apps.core.views.PlaceholderView | {} |
    | poll/(?P<pk>\w{8}-\w{4}-\w{4}-\w{4}-\w{12})/(?P<slug>[-\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<slug>[-_\w]+)/$ | publisher            | apps.books.views.PublisherDetailView | {} |
    | question/(?P<slug>[-_\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<pk>\w{8}-\w{4}-\w{4}-\w{4}-\w{12})/(?P<slug>[-_\w]+)/$ | solution             | apps.solutions.views.SolutionDetailView | {} |
    | suit/(?P<slug>[-\w]+)/$ | suit                 | apps.testing.views.SuitDetailView | {} |
    | tag/(?P<name>[-_\w]+)/$ | tag                  | apps.tags.views.TagDetailView | {} |
    | theme/(?P<slug>[-_\w]+)/$ | theme                | apps.forum.views.SectionDetailView | {} |
    | topic/(?P<slug>[-_\w]+)/$ | topic                | apps.forum.views.TopicDetailView | {} |
    | update/$             | update               | apps.users.views.UserDetailView | {} |
    | ^r/(?P<content_type_id>\d+)/(?P<object_id>.+)/$ | view_on_site         | django.contrib.contenttypes.views.shortcut | {} |
    | writer/(?P<slug>[-_\w]+)/$ | writer               | apps.books.views.WriterDetailView | {} |
    ----------------------------------------------------------------------------------------------------
    
    0 讨论(0)
  • 2020-11-29 19:45

    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<content_type_id>\d+)/(?P<object_id>.+)/$
    ^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/^(.+)/$
    ...
    
    0 讨论(0)
提交回复
热议问题