Есть ли способ получить полную конфигурацию 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)
Ответы:
Django - это Python, поэтому самоанализ - ваш друг.
В оболочке import
urls
. Выполняя циклurls.urlpatterns
и просматривая как можно больше уровней включенных конфигураций URL-адресов, вы можете создать полную конфигурацию URL-адресов.import urls urls.urlpatterns
Список
urls.urlpatterns
содержитRegexURLPattern
иRegexURLResolver
объекты.Для
RegexURLPattern
объектаp
вы можете отобразить регулярное выражение с помощьюДля
RegexURLResolver
объектаq
, который представляет включенную конфигурацию URL-адреса, вы можете отобразить первую часть регулярного выражения с помощьюЗатем используйте
который будет возвращать дополнительный список
RegexURLResolver
иRegexURLPattern
объекты.источник
RegexURLPattern
илиRegexURLResolver
. Использованиеhas_attr
- намного лучшая идея. Вы должны указать свою функцию здесь, в Stack Overflow. Я бы поддержал это.Расширения Django предоставляют утилиту для этого в виде команды manage.py.
Затем добавьте
django_extensions
в INSTALLED_APPS файлыsettings.py
. затем с консоли просто введите следующееисточник
Рискуя добавить ответ «я тоже», я отправляю измененную версию представленного выше скрипта, который дает вам представление, в котором перечислены все 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-адресах, и уметь делать несколько вещей:
Django выполняет это в основном с помощью объекта, называемого
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.источник
Я отправил пакет (django-showurls), который добавляет эту функциональность в любой проект Django, это простая новая команда управления, которая хорошо интегрируется с manage.py:
Вы можете установить его через pip:
А затем добавьте его в установленные приложения в файле settings.py проекта Django:
INSTALLED_APPS = [ .. 'django_showurls', .. ]
И вы готовы к работе.
Подробнее здесь - https://github.com/Niklas9/django-showurls
источник
show_urls
команду - django-extensions.readthedocs.io/en/latest/…Самый простой способ получить полный список зарегистрированных URL-адресов - это установить contrib.admindocs и проверить раздел «Просмотры». Очень легко настроить, а также предоставляет вам полностью доступную для просмотра документацию по всем вашим тегам шаблонов, моделям и т. Д.
источник
Вы ищете URL-адреса, которые оцениваются или не оцениваются, как показано в режиме DEBUG? Для оценки вам может помочь django.contrib.sitemaps, иначе это может потребовать некоторой обратной инженерии с кодом Django.
источник
Когда я попробовал другие ответы здесь, я получил эту ошибку:
Похоже, проблема связана с использованием
django.contrib.admin.autodiscover()
в моемurls.py
, поэтому я могу либо прокомментировать это, либо правильно загрузить Django, прежде чем выгрузить URL-адрес. Конечно, если я хочу видеть URL-адреса администратора в сопоставлении, я не могу их закомментировать.Я нашел способ создать настраиваемую команду управления, которая сбрасывает 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)
источник
Если вы запускаете Django в режиме отладки (
DEBUG = True
укажите в настройках), а затем вводите несуществующий URL-адрес, вы получите страницу с ошибкой, на которой указана полная конфигурация URL-адреса.источник
/news/bad_url/
будет отображать включенные URL-адреса изnews
приложения, но не изsport
приложения.