2009-12-01 3 views
71

Есть ли способ получить полный django url configuration?Определить полную конфигурацию Django url

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


Ответ: Благодаря Аласдера, вот пример сценария:

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

ответ

44

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 объектов.

+3

Хорошая идея! Я сделал простой скрипт здесь: http://code.activestate.com/recipes/576974/ – Michael

+0

Это элегантная функция. Я начал пытаться написать один, но он включал проверку типов объектов, чтобы увидеть, были ли они 'RegexURLPattern' или' RegexURLResolver'. Использование 'has_attr' - гораздо лучшая идея. Вы должны поставить свою функцию в ответ на Stack Overflow. Я бы поднял его. – Alasdair

+0

это вызывает столько циклических проблем импорта через файл настроек! – NoobEditor

-3

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

+0

Как я уже говорил, эта страница ошибки не показывает полную конфигурацию, поскольку она не включает в себя информацию о * * включены конфигурации URL. – Michael

+0

Я точно понял, что вы имели в виду настройки INCLUDED url, но ответил на неисправную память, потому что у меня не было немедленного доступа к тестовому сайту. Клянусь, я вижу, что страница с ошибкой URL помещает пробел между URL верхнего уровня и включенными URL-адресами, но теперь это не так. Поэтому ответ НЕТ, нет никакой возможности увидеть полную конфигурацию. –

+0

На странице ошибки отображаются только _relevant_ включенные конфигурации URL-адресов. НАПРИМЕР. на странице 404 для '/ news/bad_url /' будут отображаться включенные URL-адреса из приложения 'news', но не из приложения' sport'. – Alasdair

0

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

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> 

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

1

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

57

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

pip install django-extensions 

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

python manage.py show_urls 
+1

Удобный! Я не думаю, что когда-нибудь это обнаружу. Благодаря! –

+0

Удивительный! Благодаря! – mawaldne

+0

это правильный ответ – abbood

4

Этот вопрос немного старый, но я столкнулся с той же проблемой, и я думал, что будет обсуждать мое решение. Данный проект 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.

0

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

django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

Похоже, проблема возникает с помощью django.contrib.admin.autodiscover() в моем urls.py, так что я могу либо прокомментировать, что вне, или загрузить Django должным образом перед сброс URL-адресов. Конечно, если я хочу видеть URL-адрес администратора в сопоставлении, я не могу их прокомментировать.

Способ, которым я нашел, заключается в создании custom management command, который выгружает 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) 
2

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

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

Вы можете установить это через пункт:

pip install django-showurls 

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

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

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

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

+0

Ницца, спасибо. Было бы полезно, если бы рядом с каждой строкой дерева было имя приложения, определяющего правило (или аналогичный способ обнаружения приложения). –

+0

Обратите внимание, что Django Extensions также включает команду 'show_urls' - http://django-extensions.readthedocs.io/en/latest/command_extensions.html –

Смежные вопросы