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


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

9 ответов:

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

Django extensions предоставляет утилиту для этого в качестве manage.py командование.

pip install django-extensions

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

python manage.py show_urls

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

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

Джанго выполняет это в основном через объект, называемый RegexURLResolver.

  1. RegexURLResolver.resolve (map from a url -> view)
  2. 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 internals.

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

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

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

pip install django-showurls

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

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

и вы готовы пойти.

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

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

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

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

Джанго.ядро.исключения.AppRegistryNotReady: приложения еще не загружены.

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

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