Определить полную конфигурацию URL-адреса Django

Есть ли способ получить полную конфигурацию URL-адреса django?

Например, на странице Django отладки 404 не отображаются включенные конфигурации URL-адресов, поэтому это не полная конфигурация.


Ответ: благодаря Alasdair, вот пример script:

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)

Ответ 1

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.

Ответ 2

Расширения Django предоставляют утилиту для выполнения этого как команды manage.py.

pip install django-extensions

Затем добавьте django_extensions к вашему INSTALLED_APPS в settings.py. то из консоли просто введите следующие

python manage.py show_urls

Ответ 3

Если вы добавите ответ "я тоже", я публикую измененную версию выше представленного script, в котором вы видите список всех 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>

Если вы хотите получить реальную фантазию, вы можете отобразить список с полями ввода для любого из регулярных выражений, которые передают переменные в представление (опять же как инструмент разработчика, а не производственная страница).

Ответ 4

Этот вопрос немного стар, но я столкнулся с той же проблемой, и я решил обсудить свое решение. Данный проект Django, очевидно, нуждается в средствах знать обо всех его URL-адресах и должен иметь возможность сделать пару вещей:

  • map from url → view
  • с именованного url → url (тогда 1 используется для получения представления)
  • карта с именем вида → url (тогда 1 используется для получения представления)

Django выполняет это главным образом через объект с именем RegexURLResolver.

  • RegexURLResolver.resolve(карта с URL-адреса) >
  • RegexURLResolver.reverse

Вы можете использовать один из этих объектов следующим образом:

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.

Ответ 5

Я представил пакет (django-showurls), который добавляет эту функциональность в любой проект Django, это простая новая команда управления, которая хорошо интегрируется с manage.py:

$ python manage.py showurls
^admin/
  ^$
    ^login/$
    ^logout/$
.. etc ..

Вы можете установить его через pip:

pip install django-showurls

Затем добавьте его в установленные приложения в файл настроек проекта. Django:

INSTALLED_APPS = [
    ..
    'django_showurls',
    ..
]

И вы готовы к работе.

Подробнее здесь - https://github.com/Niklas9/django-showurls

Ответ 6

Самый простой способ получить полный список зарегистрированных URL-адресов - установить contrib.admindocs, затем проверить раздел "Просмотры". Очень легко настроить, а также предоставляет полностью просматриваемые документы на всех ваших тегах, моделях и т.д.

Ответ 7

Вы ищете URL-адреса, оцененные или не оцененные, как показано в режиме DEBUG? Для оценки django.contrib.sitemaps может помочь вам там, иначе может потребоваться некоторая обратная инженерия с кодом Django.

Ответ 8

Когда я попробовал другие ответы здесь, я получил эту ошибку:

django.core.exceptions.AppRegistryNotReady: приложения еще не загружены.

Похоже, проблема связана с использованием 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)

Ответ 9

Если вы запускаете Django в режиме отладки (укажите DEBUG = True в своих настройках), а затем введите несуществующий URL-адрес, вы получите страницу с сообщением о полной конфигурации URL-адреса.