Определить полную конфигурацию URL-адреса Django
Есть ли способ получить полную конфигурацию URL-адреса django?
Например, на странице Django отладки 404 не отображаются включенные конфигурации URL-адресов, поэтому это не полная конфигурация.
Ответ: благодаря Alasdair, вот пример script:
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)
Ответы
Ответ 1
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
.
Ответ 2
Расширения Django предоставляют утилиту для выполнения этого как команды manage.py.
pip install django-extensions
Затем добавьте django_extensions
к вашему INSTALLED_APPS в settings.py
. то из консоли просто введите следующие
python manage.py show_urls
Ответ 3
Если вы добавите ответ "я тоже", я публикую измененную версию выше представленного script, в котором вы видите список всех 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-адресах и должен иметь возможность сделать пару вещей:
- map from url → view
- с именованного url → url (тогда 1 используется для получения представления)
- карта с именем вида → url (тогда 1 используется для получения представления)
Django выполняет это главным образом через объект с именем RegexURLResolver
.
- RegexURLResolver.resolve(карта с URL-адреса) >
- 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.
Ответ 5
Я представил пакет (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
Ответ 6
Самый простой способ получить полный список зарегистрированных URL-адресов - установить contrib.admindocs, затем проверить раздел "Просмотры". Очень легко настроить, а также предоставляет полностью просматриваемые документы на всех ваших тегах, моделях и т.д.
Ответ 7
Вы ищете URL-адреса, оцененные или не оцененные, как показано в режиме DEBUG? Для оценки django.contrib.sitemaps может помочь вам там, иначе может потребоваться некоторая обратная инженерия с кодом Django.
Ответ 8
Когда я попробовал другие ответы здесь, я получил эту ошибку:
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)
Ответ 9
Если вы запускаете Django в режиме отладки (укажите DEBUG = True
в своих настройках), а затем введите несуществующий URL-адрес, вы получите страницу с сообщением о полной конфигурации URL-адреса.