Определить полную конфигурацию Django URL - PullRequest
79 голосов
/ 01 декабря 2009

Есть ли способ получить полную конфигурацию 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 ]

66 голосов
/ 09 ноября 2013

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

pip install django-extensions

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

python manage.py show_urls
47 голосов
/ 02 декабря 2009

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.

6 голосов
/ 02 июля 2013

Рискуя добавить ответ "Я тоже", я публикую измененную версию представленного выше скрипта, которая дает вам представление с перечислением всех 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 голосов
/ 05 января 2015

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

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

Джанго выполняет это главным образом с помощью объекта, называемого 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.

2 голосов
/ 20 февраля 2016

Я отправил пакет (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

1 голос
/ 23 июля 2013

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

0 голосов
/ 04 мая 2015

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

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)
0 голосов
/ 02 декабря 2009

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

0 голосов
/ 02 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...