Определить полную конфигурацию URL-адреса Джанго
есть ли способ получить полное конфигурация url django?
например, страница отладки 404 Django не показывает включенные конфигурации url, поэтому это не полная конфигурация.
ответ: благодаря Alasdair, вот пример скрипта:
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.urlpatterns)
9 ответов:
Django-это Python, поэтому самоанализ-ваш друг.
в оболочке, импорт
urls
. По циклу черезurls.urlpatterns
, и детализируя как можно больше слоев включенных конфигураций url, вы можете построить полную конфигурацию url.import urls urls.urlpatterns
список
urls.urlpatterns
содержитRegexURLPattern
иRegexURLResolver
объекты.на
RegexURLPattern
объектp
вы можете отобразить регулярное выражение сp.regex.pattern
на
RegexURLResolver
объектq
, который представляет собой включенную конфигурацию url, вы можете отобразить первую часть регулярного выражения с помощьюq.regex.pattern
затем использовать
q.url_patterns
который возвращает список
RegexURLResolver
иRegexURLPattern
объекты.
Django extensions предоставляет утилиту для этого в качестве manage.py командование.
pip install django-extensions
затем добавить
django_extensions
для вашего INSTALLED_APPS вsettings.py
. затем из консоли просто введите следующееpython manage.py show_urls
рискуя добавить ответ "я тоже", я публикую измененную версию вышеприведенного сценария, который дает вам представление со списком всех URL-адресов в проекте, несколько приукрашенных и отсортированных в алфавитном порядке, а также представления, которые они вызывают. Скорее инструмент разработчика, чем рабочая страница.
def all_urls_view(request): from your_site.urls import urlpatterns #this import should be inside the function to avoid an import loop nice_urls = get_urls(urlpatterns) #build the list of urls recursively and then sort it alphabetically return render(request, "yourapp/links.html", {"links":nice_urls}) def get_urls(raw_urls, nice_urls=[], urlbase=''): '''Recursively builds a list of all the urls in the current project and the name of their associated view''' from operator import itemgetter for entry in raw_urls: fullurl = (urlbase + entry.regex.pattern).replace('^','') if entry.callback: #if it points to a view viewname = entry.callback.func_name nice_urls.append({"pattern": fullurl, "location": viewname}) else: #if it points to another urlconf, recur! get_urls(entry.url_patterns, nice_urls, fullurl) nice_urls = sorted(nice_urls, key=itemgetter('pattern')) #sort alphabetically return nice_urls
и шаблона:
<ul> {% for link in links %} <li> {{link.pattern}} ----- {{link.location}} </li> {% endfor%} </ul>
Если вы хотите получить реальную фантазию, вы можете отобразить список с полями ввода для любого из регулярных выражений, которые принимают переменные для передачи на вид (опять же как инструмент разработчика, а не разделе продукции).
этот вопрос немного старый, но я столкнулся с той же проблемой, и я думал, что буду обсуждать мое решение. Данный проект Django, очевидно, нуждается в средствах знания обо всех его URL-адресах и должен быть в состоянии сделать пару вещей:
- карта из url - > вид
- карта с именованным url - > url (затем 1 используется для получения представления)
- карта из имени представления - > url (затем 1 используется для получения представления)
Джанго выполняет это в основном через объект, называемый
RegexURLResolver
.
- RegexURLResolver.resolve (map from a url -> view)
- RegexURLResolver.обратный
вы можете получить в свои руки один из этих объектов следующим образом:
from my_proj import urls from django.core.urlresolvers import get_resolver resolver = get_resolver(urls)
затем, вы можете просто распечатать ваш URL-адреса следующим образом:
for view, regexes in resolver.reverse_dict.iteritems(): print "%s: %s" % (view, regexes)
тем не менее, решение Alasdair отлично и имеет некоторые преимущества, так как оно печатает что-то более приятное, чем этот метод. Но зная о и получить ваши руки на
RegexURLResolver
объект-это то, о чем приятно знать, особенно если вы заинтересованы в Django internals.
Я представил пакет (django-showurls), который добавляет эту функциональность в любой проект Django, это простая новая команда управления, которая хорошо интегрируется с manage.py:
$ python manage.py showurls ^admin/ ^$ ^login/$ ^logout/$ .. etc ..
вы можете установить его через pip:
pip install django-showurls
а затем добавить его в установленные приложения в вашем проекте Django settings.py файл:
INSTALLED_APPS = [ .. 'django_showurls', .. ]
и вы готовы пойти.
подробнее здесь - https://github.com/Niklas9/django-showurls
самый простой способ получить полный список зарегистрированных адресов-установка contrib.admindocs затем проверьте раздел "представления". Очень прост в настройке, а также дает вам полностью просматривать документы на всех ваших шаблонов, моделей и т. д.
вы ищете URL-адреса, оцененные или не оцененные, как показано в режиме отладки? Например, Джанго.ВНО.sitemaps может помочь вам там, в противном случае это может потребовать некоторого обратного проектирования с кодом Django.
когда я попробовал другие ответы здесь, я получил эту ошибку:
Джанго.ядро.исключения.AppRegistryNotReady: приложения еще не загружены.
похоже, что проблема возникает из-за использования
django.contrib.admin.autodiscover()
в своемurls.py
, Так что я могу комментировать это, или загрузить Джанго правильно перед сбросом URL-адреса. Конечно, если я хочу увидеть URL-адрес администрирования в сопоставлении, я не могу прокомментировать их.способ, который я нашел, чтобы создать custom команда управления это сбрасывает URL-адреса.
# install this file in mysite/myapp/management/commands/urldump.py from django.core.management.base import BaseCommand from kive import urls class Command(BaseCommand): help = "Dumps all URL's." def handle(self, *args, **options): self.show_urls(urls.urlpatterns) def show_urls(self, urllist, depth=0): for entry in urllist: print ' '.join((" " * depth, entry.regex.pattern, entry.callback and entry.callback.__module__ or '', entry.callback and entry.callback.func_name or '')) if hasattr(entry, 'url_patterns'): self.show_urls(entry.url_patterns, depth + 1)