Czy istnieje sposób, aby uzyskać pełną konfigurację adresu URL django?
Na przykład strona 404 debugowania Django nie pokazuje dołączonych konfiguracji url, więc nie jest to pełna konfiguracja.
Odpowiedź : Dzięki Alasdair, oto przykładowy skrypt:
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)
Odpowiedzi:
Django to Python, więc introspekcja jest twoim przyjacielem.
W powłoce zaimportuj
urls
. Przechodząc przez pętlęurls.urlpatterns
i przechodząc przez jak najwięcej warstw zawartych konfiguracji adresów URL, możesz zbudować pełną konfigurację adresu URL.import urls urls.urlpatterns
Lista
urls.urlpatterns
zawieraRegexURLPattern
iRegexURLResolver
obiekty.W przypadku
RegexURLPattern
obiektup
możesz wyświetlić wyrażenie regularne za pomocąW przypadku
RegexURLResolver
obiektuq
, który reprezentuje dołączoną konfigurację adresu URL, pierwszą część wyrażenia regularnego można wyświetlić za pomocąNastępnie użyj
co zwróci dalszą listę obiektów
RegexURLResolver
iRegexURLPattern
.źródło
RegexURLPattern
lubRegexURLResolver
. Używaniehas_attr
jest o wiele lepszym pomysłem. Powinieneś umieścić swoją funkcję w odpowiedzi tutaj na Stack Overflow. Głosowałbym za tym.Rozszerzenia Django zawierają narzędzie umożliwiające wykonanie tego jako polecenie manage.py.
Następnie dodaj
django_extensions
do swoich INSTALLED_APPS wsettings.py
. następnie z konsoli wpisz następujące polecenieźródło
Ryzykując dodaniem odpowiedzi „ja też”, publikuję zmodyfikowaną wersję powyższego przesłanego skryptu, który daje widok z listą wszystkich adresów URL w projekcie, nieco upiększonych i posortowanych alfabetycznie, oraz widoków, które wywołują. Bardziej narzędzie programistyczne niż strona produkcyjna.
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
i szablon:
<ul> {% for link in links %} <li> {{link.pattern}} ----- {{link.location}} </li> {% endfor%} </ul>
Jeśli chcesz uzyskać naprawdę wymyślny wygląd, możesz wyrenderować listę z polami wejściowymi dla dowolnego z wyrażeń regularnych, które przyjmują zmienne, aby przejść do widoku (ponownie jako narzędzie programistyczne, a nie jako strona produkcyjna).
źródło
To pytanie jest trochę stare, ale napotkałem ten sam problem i pomyślałem, że omówię moje rozwiązanie. Dany projekt Django oczywiście potrzebuje środków do poznania wszystkich swoich adresów URL i musi być w stanie zrobić kilka rzeczy:
Django osiąga to głównie poprzez obiekt o nazwie a
RegexURLResolver
.Możesz zdobyć jeden z tych obiektów w następujący sposób:
from my_proj import urls from django.core.urlresolvers import get_resolver resolver = get_resolver(urls)
Następnie możesz po prostu wydrukować swoje adresy URL w następujący sposób:
for view, regexes in resolver.reverse_dict.iteritems(): print "%s: %s" % (view, regexes)
To powiedziawszy, rozwiązanie Alasdair jest w porządku i ma pewne zalety, ponieważ drukuje coś ładniej niż ta metoda. Ale wiedza o
RegexURLResolver
obiekcie i zdobycie go to coś, o czym warto wiedzieć, zwłaszcza jeśli interesują Cię wewnętrzne elementy Django.źródło
Wysłałem pakiet (django-showurls), który dodaje tę funkcjonalność do dowolnego projektu Django, jest to proste nowe polecenie zarządzania, które dobrze integruje się z manage.py:
Możesz zainstalować go przez pip:
Następnie dodaj go do zainstalowanych aplikacji w pliku settings.py projektu Django:
INSTALLED_APPS = [ .. 'django_showurls', .. ]
I jesteś gotowy do drogi.
Więcej informacji tutaj - https://github.com/Niklas9/django-showurls
źródło
show_urls
polecenie - django-extensions.readthedocs.io/en/latest/ ...Najłatwiejszym sposobem uzyskania pełnej listy zarejestrowanych adresów URL jest zainstalowanie contrib.admindocs, a następnie sprawdzenie sekcji „Widoki”. Bardzo łatwy w konfiguracji, a także zapewnia w pełni przeglądalne dokumenty dotyczące wszystkich tagów szablonów, modeli itp.
źródło
Czy szukasz ocenionych lub nieocenionych adresów URL, jak pokazano w trybie DEBUGOWANIA? W ocenie, django.contrib.sitemaps może Ci w tym pomóc, w przeciwnym razie może to wymagać inżynierii wstecznej z kodem Django.
źródło
Kiedy wypróbowałem inne odpowiedzi tutaj, otrzymałem ten błąd:
Wygląda na to, że problem wynika z używania
django.contrib.admin.autodiscover()
w myurls.py
, więc mogę to skomentować lub poprawnie załadować Django przed zrzuceniem adresu URL. Oczywiście jeśli chcę zobaczyć adresy URL administratora w mapowaniu, nie mogę ich skomentować.Znalazłem sposób, w jaki utworzyłem niestandardowe polecenie zarządzania, które zrzuca adresy 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)
źródło
Jeśli używasz Django w trybie debugowania (masz
DEBUG = True
w ustawieniach), a następnie wpiszesz nieistniejący adres URL, pojawi się strona błędu z pełną konfiguracją adresu URL.źródło
/news/bad_url/
będzie wyświetlać dołączone adresy URL znews
aplikacji, ale nie zsport
aplikacji.