vistas urls tutorial genericas examples bootstrap django django-urls django-views

urls - django views



Django: ¿Cómo puedo ver una lista de urlpatterns? (9)

Django 1.11, Python 2.7.6

cd to_your_django_project

Python manage.py shell

Luego pegue el siguiente código.

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)

Salida de muestra:

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

¿Cómo puedo ver los patrones de URL actuales en los que está "invertido"?

Estoy llamando al revés en una vista con un argumento que creo que debería funcionar, pero no lo hace. ¿De alguna manera puedo verificar qué hay ahí y por qué mi patrón no lo está?


Estoy usando el siguiente comando:

(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)

Uso:

./manage.py showurls

Salida de muestra:

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



Hay una receta en 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)


He extendido el comando de Seti para mostrar el espacio de nombres, todas las partes de url, ajustar automáticamente los anchos de columna, ordenados por (espacio de nombres, nombre): 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()

Nota: el orden de las columnas se mantiene en Python 3.6 y uno tendría que usar OrderedDict en versiones anteriores.

Actualización: una nueva versión con OrderedDict ahora reside en el paquete django-🍌s: https://github.com/5monkeys/django-bananas/blob/master/bananas/management/commands/show_urls.py


Prueba esto:

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


Si desea una lista de todas las direcciones URL de su proyecto, primero necesita instalar django-extensions , agréguela a su configuración de esta manera:

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

Y luego, ejecuta este comando en tu terminal.

./manage.py show_urls

Para más información puedes consultar la documentación.



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

En python manage.py shell

import urls get_resolved_urls(urls.urlpatterns)