Визначте повну конфігурацію 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, тому самоаналіз - це ваш друг.

У оболонці імпорт 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
Гарна ідея! Я зробив простий сценарій тут: code.activestate.com/recipes/576974
Майкл

Це елегантна функція. Я почав намагатися писати один, але він бере участь перевірки типів об'єктів , щоб побачити , якщо вони були RegexURLPatternабо RegexURLResolver. Використання has_attr- набагато краща ідея. Ви повинні помістити свою функцію у відповідь тут, у Stack Overflow. Я б підтримав його.
Alasdair

це викликає стільки проблем із циклічним імпортом через файл налаштувань !!
NoobEditor

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. map from a named url -> url (тоді 1 використовується для отримання перегляду)
  3. map з імені подання -> url (тоді для отримання перегляду використовується 1)

Django досягає цього здебільшого за допомогою об’єкта, який називається a 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

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


Приємно, дякую. Це може бути корисно, якщо біля кожного рядка дерева було назва програми, що визначає правило (або подібний спосіб виявлення програми).
Ведран Шего

Зверніть увагу, що Django Extensions також включає show_urlsкоманду - django-extensions.readthedocs.io/en/latest/…
Тейлор Едмістон

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.