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

82

Есть ли способ получить полную конфигурацию 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)
Майкл
источник
2
очень полезный скрипт, спасибо
RichVel

Ответы:

49

Django - это Python, поэтому самоанализ - ваш друг.

В оболочке import 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объекты.

Alasdair
источник
3
Хорошая идея! Я сделал простой скрипт здесь: code.activestate.com/recipes/576974
Майкл
Это элегантная функция. Я начал пытаться написать один, но он включал проверку типов объектов, чтобы узнать, являются ли они RegexURLPatternили RegexURLResolver. Использование has_attr- намного лучшая идея. Вы должны указать свою функцию здесь, в Stack Overflow. Я бы поддержал это.
Alasdair
это вызывает так много проблем с циклическим импортом через файл настроек !!
NoobEditor 05
67

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

pip install django-extensions

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

python manage.py show_urls
Алан Виарс
источник
2
Удобно! Не думаю, что когда-нибудь обнаружил бы это. Благодаря!
Тим Раддик
6

Рискуя добавить ответ «я тоже», я отправляю измененную версию представленного выше скрипта, который дает вам представление, в котором перечислены все 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-адресах, и уметь делать несколько вещей:

  1. карта по URL -> просмотр
  2. карта из именованного url -> url (тогда 1 используется для получения представления)
  3. карта из имени представления -> url (тогда 1 используется для получения представления)

Django выполняет это в основном с помощью объекта, называемого RegexURLResolver.

  1. RegexURLResolver.resolve (карта из URL -> просмотр)
  2. 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.

Abhillman
источник
2

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

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

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

pip install django-showurls

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

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

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

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

Никлас9
источник
Мило спасибо. Было бы полезно, если бы рядом с каждой строкой дерева было имя приложения, определяющего правило (или какой-либо аналогичный способ обнаружения приложения).
Vedran Šego
Обратите внимание, что Django Extensions также включает show_urlsкоманду - django-extensions.readthedocs.io/en/latest/…
Taylor Edmiston
1

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

шейкер
источник
0

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

Тьерри Лам
источник
0

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

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)
Дон Киркби
источник
-3

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

Ван Гейл
источник
Как я уже упоминал, на этой странице ошибки не отображается полная конфигурация, поскольку она не включает информацию о включенных конфигурациях URL-адресов.
Майкл
Я точно понял, что вы имели в виду о ВКЛЮЧЕННЫХ конфигурациях URL, но ответил из-за неисправной памяти, потому что у меня не было немедленного доступа к тестовой площадке. Клянусь, я видел, как на странице ошибки URL-адреса был пробел между URL-адресом верхнего уровня и включенными URL-адресами, но теперь это не так. Итак, ответ - НЕТ, нет возможности увидеть полную конфигурацию.
Van Gale,
На странице ошибки отображаются только соответствующие включенные конфигурации URL. Например, страница 404 /news/bad_url/будет отображать включенные URL-адреса из newsприложения, но не из sportприложения.
Alasdair