Определить полную конфигурацию 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)