「リバース」が探している現在のURLパターンを確認するにはどうすればよいですか?
私は私が働くべきだと思う引数を持つビューでreverseを呼び出していますが、そうではありません。どうすればそこに何があり、なぜ私のパターンがそうでないのかを確認できますか?
プロジェクト内のすべてのURLのリストが必要な場合は、まず Django-extensions をインストールする必要があります。次のように設定に追加します。
INSTALLED_APPS = (
...
'Django_extensions',
...
)
そして、ターミナルでこのコマンドを実行します
./manage.py show_urls
詳細については、 ドキュメントを確認してください
これを試して:
from Django.urls import get_resolver
get_resolver().reverse_dict.keys()
または、まだDjango 1. *:
from Django.core.urlresolvers import get_resolver
get_resolver(None).reverse_dict.keys()
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)
私は次のコマンドを使用しています:
(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)
使用法:
./manage.py showurls
サンプル出力:
----------------------------------------------------------------------------------------------------
| ^(.+)/$ | | 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 | {} |
----------------------------------------------------------------------------------------------------
Django 1.11、Python 2.7.6
cd to_your_Django_project
python manage.pyシェル
次に、次のコードを貼り付けます。
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)
サンプル出力:
^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/^(.+)/$
...
私が使用するプラグインがあります: https://github.com/Django-extensions/Django-extensions 、それに役立つshow_urlsコマンドがあります。
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
python manage.py Shell
import urls
get_resolved_urls(urls.urlpatterns)
この投稿で他の回答をテストしたところ、Django 2.X、不完全または複雑すぎるため、動作していませんでした。
from Django.conf import settings
from Django.urls import URLPattern, URLResolver
urlconf = __import__(settings.ROOT_URLCONF, {}, {}, [''])
def list_urls(lis, acc=None):
if acc is None:
acc = []
if not lis:
return
l = lis[0]
if isinstance(l, URLPattern):
yield acc + [str(l.pattern)]
Elif isinstance(l, URLResolver):
yield from list_urls(l.url_patterns, acc + [str(l.pattern)])
yield from list_urls(lis[1:], acc)
for p in list_urls(urlconf.urlpatterns):
print(''.join(p))
このコードは、他のソリューションとは異なり、すべてのURLを出力します。最後のノードだけでなく、フルパスも出力します。例えば。:
admin/
admin/login/
admin/logout/
admin/password_change/
admin/password_change/done/
admin/jsi18n/
admin/r/<int:content_type_id>/<path:object_id>/
admin/auth/group/
admin/auth/group/add/
admin/auth/group/autocomplete/
admin/auth/group/<path:object_id>/history/
admin/auth/group/<path:object_id>/delete/
admin/auth/group/<path:object_id>/change/
admin/auth/group/<path:object_id>/
admin/auth/user/<id>/password/
admin/auth/user/
...
存在しないことがわかっているURLを入力するだけで、サーバーはURLパターンのリストを含むエラーメッセージを返します。
たとえば、 http:// localhost:8000/something でサイトを実行している場合
入力する
http:// localhost:8000/something/blahNonsense 。サーバーはURL検索リストを返し、ブラウザーに表示します。
Setiのコマンド を拡張して、名前空間、すべてのURLパーツ、列幅の自動調整、(名前空間、名前)による並べ替えを行いました: https://Gist.github.com/andreif/ 263a3fa6e7c425297ffee09c25f66b2
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()
注:列の順序はPython 3.6に保持されており、古いバージョンでは
OrderedDict
を使用します。
更新:OrderedDictの新しいバージョンがDjango-???? sパッケージに存在するようになりました: https://github.com/5monkeys /Django-bananas/blob/master/bananas/management/commands/show_urls.py
Django 2.0の最小解
たとえば、installed_appsの最初のアプリにあるURLを探している場合、次のようにアクセスできます。
from Django.urls import get_resolver
from pprint import pprint
pprint(
get_resolver().url_patterns[0].url_patterns
)