मैं वर्तमान urlpatterns को कैसे देख सकता हूं जो "रिवर्स" में देख रहा है?
मैं एक तर्क के साथ एक दृश्य में रिवर्स कॉल कर रहा हूं जो मुझे लगता है कि काम करना चाहिए, लेकिन नहीं। किसी भी तरह से मैं जांच सकता हूं कि मेरा पैटर्न क्या है और क्यों नहीं?
मैं वर्तमान urlpatterns को कैसे देख सकता हूं जो "रिवर्स" में देख रहा है?
मैं एक तर्क के साथ एक दृश्य में रिवर्स कॉल कर रहा हूं जो मुझे लगता है कि काम करना चाहिए, लेकिन नहीं। किसी भी तरह से मैं जांच सकता हूं कि मेरा पैटर्न क्या है और क्यों नहीं?
जवाबों:
यदि आप अपने प्रोजेक्ट के सभी url की सूची चाहते हैं, तो सबसे पहले आपको django- एक्सटेंशन को स्थापित करने की आवश्यकता है , इसे अपनी वेबसाइट पर इस तरह जोड़ें:
INSTALLED_APPS = (
...
'django_extensions',
...
)
और फिर, इस आदेश को अपने टर्मिनल में चलाएं
./manage.py show_urls
अधिक जानकारी के लिए आप दस्तावेज़ की जाँच कर सकते हैं ।
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
django_extensions
अपने को जोड़ना होगाINSTALLED_APPS
इसे इस्तेमाल करे:
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()
set(v[1] for k,v in get_resolver(None).reverse_dict.items())
django.core.urlresolvers
Django 2.0 में हटा दिया गया था , आयात लाइन की जगहfrom django.urls import get_resolver
मैंने इस पोस्ट में अन्य उत्तरों का परीक्षण किया और वे या तो 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/
... etc, etc
yield acc + [str(l.pattern)]
लाइन को बदल सकते हैं yield acc + [str(l.pattern)], l.callback
। ध्यान रखें कि यह दृश्य फ़ंक्शन को स्वयं लौटाएगा और एक नाम नहीं
Django 1.11, पायथन 2.7.6
cd_your_django_project
अजगर प्रबंधन शेल्फ़
फिर निम्नलिखित कोड पेस्ट करें।
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/^(.+)/$
...
None
लाइन में जोड़ना था urls = urlresolvers.get_resolver(None)
, और मुझे कभी-कभी कुछ URL की शुरुआत में 'कोई नहीं' मिला।
सक्रियता पर एक नुस्खा है
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)
show_urls(urls.url_patterns)
।
ModuleNotFoundError: No module named 'urls'
, पता नहीं क्यों?
test.py
को अपने प्रोजेक्ट के रूट में फाइल में रखा है और यह त्रुटि है, अगर मैं import urls
दुभाषिया में भी करता हूं तो मुझे भी यह त्रुटि मिलती है।
import urls
एक स्थानीय आयात है, इसलिए आपको शायद करने की आवश्यकता है from app_name import urls
।
मैं अगले आदेश का उपयोग कर रहा हूं:
(पायथन 3 + 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 | {} |
----------------------------------------------------------------------------------------------------
print
। इसके बजाय उपयोग करें self.stdout.write
। docs.djangoproject.com/en/1.10/howto/custom-management-commands
मेरे द्वारा उपयोग किया जाने वाला एक प्लगइन है: 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
अजगर प्रबंधन ओरेकल शेल में
import urls
get_resolved_urls(urls.urlpatterns)
Django 3.0 में, यह जितना आसान है:
from django.urls import get_resolver
print(get_resolver().url_patterns)
प्रिंटों:
[<URLPattern '' [name='home']>, <URLPattern '/testing' [name='another_url']>]
मैंने नामस्थान, सभी url भागों, स्वतः-समायोजित स्तंभ चौड़ाई, (नाम स्थान, नाम) द्वारा क्रमबद्ध दिखाने के लिए सेटी की कमान बढ़ा दी है : https://gist.github.com/andreif/263a3fa6e7254297ffee09c25f66b20b20
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()
नोट: स्तंभ क्रम को पाइथन 3.6 में रखा गया है और
OrderedDict
पुराने संस्करणों में उपयोग करने की आवश्यकता होगी ।
अद्यतन: ऑर्डरडेड के साथ एक नया संस्करण अब django-:s पैकेज में रहता है: https://github.com/5monkeys/django-bananas/blob/master/bananas/management/commands/show/urls.py
केवल एक यूआरएल में टाइप करें जो आप जानते हैं कि मौजूद नहीं है और सर्वर यूआरएल पैटर्न की एक सूची के साथ एक त्रुटि संदेश लौटाएगा।
उदाहरण के लिए, यदि आप http: // localhost: 8000 / कुछ पर साइट चला रहे हैं
में टाइप करें
http: // localhost: 8000 / कुछ / blahNonsense , और आपका सर्वर यूआरएल खोज सूची को लौटाएगा और इसे ब्राउज़र में प्रदर्शित करेगा
Django 2.0 के लिए न्यूनतम समाधान
उदाहरण के लिए, यदि आप एक url की खोज कर रहे हैं जो कि install_apps के पहले ऐप पर है, तो आप इसे इस तरह एक्सेस कर सकते हैं:
from django.urls import get_resolver
from pprint import pprint
pprint(
get_resolver().url_patterns[0].url_patterns
)
get_resolver
से django.core.urlresolvers
। धन्यवाद Marcio!
Django 1.8, पायथन 2.7+ बस अपने शेल में इन कमांड को चलाएं। पायथन प्रबंधन शेल को प्रबंधित करता है और निम्नलिखित कोड को निष्पादित करता है।
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)
आप अपनी परियोजना में प्रत्येक एप्लिकेशन से सभी URL प्रतिमानों को इकट्ठा करने के लिए एक डायनामिक आयात बना सकते हैं, जैसे कि एक सरल विधि:
def get_url_patterns():
from django.apps import apps
list_of_all_url_patterns = list()
for name, app in apps.app_configs.items():
# you have a directory structure where you should be able to build the correct path
# my example shows that apps.[app_name].urls is where to look
mod_to_import = f'apps.{name}.urls'
try:
urls = getattr(importlib.import_module(mod_to_import), "urlpatterns")
list_of_all_url_patterns.extend(urls)
except ImportError as ex:
# is an app without urls
pass
return list_of_all_url_patterns
list_of_all_url_patterns = get_url_patterns()
मैंने हाल ही में सक्रिय नेविगेशन लिंक दिखाने के लिए टेम्पलेट टैग बनाने के लिए कुछ इस तरह का उपयोग किया है।
from django.urls.resolvers import RegexPattern,RoutePattern
from your_main_app import urls
def get_urls():
url_list = []
for url in urls.urlpatterns:
url_list.append(url.pattern._regex) if isinstance(url.pattern, RegexPattern) else url_list.append(url.pattern._route)
return url_list
यहां your_main_app
एप्लिकेशन नाम दिया गया है, जहां आपकी सेटिंग्स फ़ाइल रखी गई है