Określ pełną konfigurację adresu URL Django

82

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)
Michael
źródło
2
bardzo przydatny skrypt, dzięki
RichVel,

Odpowiedzi:

49

Django to Python, więc introspekcja jest twoim przyjacielem.

W powłoce zaimportuj urls. Przechodząc przez pętlę urls.urlpatternsi 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.urlpatternszawiera RegexURLPatterni RegexURLResolverobiekty.

W przypadku RegexURLPatternobiektu pmożesz wyświetlić wyrażenie regularne za pomocą

p.regex.pattern

W przypadku RegexURLResolverobiektu q, który reprezentuje dołączoną konfigurację adresu URL, pierwszą część wyrażenia regularnego można wyświetlić za pomocą

q.regex.pattern

Następnie użyj

q.url_patterns

co zwróci dalszą listę obiektów RegexURLResolveri RegexURLPattern.

Alasdair
źródło
3
Dobry pomysł! Zrobiłem tutaj prosty skrypt: code.activestate.com/recipes/576974
Michael
To elegancka funkcja. Zacząłem próbować napisać jeden, ale wymagało to sprawdzenia typów obiektów, aby zobaczyć, czy były RegexURLPatternlub RegexURLResolver. Używanie has_attrjest o wiele lepszym pomysłem. Powinieneś umieścić swoją funkcję w odpowiedzi tutaj na Stack Overflow. Głosowałbym za tym.
Alasdair
powoduje to wiele problemów z cyklicznym importem poprzez plik ustawień !!
NoobEditor
67

Rozszerzenia Django zawierają narzędzie umożliwiające wykonanie tego jako polecenie manage.py.

pip install django-extensions

Następnie dodaj django_extensionsdo swoich INSTALLED_APPS w settings.py. następnie z konsoli wpisz następujące polecenie

python manage.py show_urls
Alan Viars
źródło
2
Poręczny! Chyba nigdy bym tego nie odkrył. Dzięki!
Tim Ruddick
6

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).

andy
źródło
4

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:

  1. mapa z adresu URL -> widok
  2. mapa z nazwanego url -> url (wtedy 1 jest używany do uzyskania widoku)
  3. mapa z widoku nazwa -> url (wtedy 1 służy do pobrania widoku)

Django osiąga to głównie poprzez obiekt o nazwie a RegexURLResolver.

  1. RegexURLResolver.resolve (mapa z adresu URL -> widok)
  2. RegexURLResolver.reverse

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 RegexURLResolverobiekcie i zdobycie go to coś, o czym warto wiedzieć, zwłaszcza jeśli interesują Cię wewnętrzne elementy Django.

abhillman
źródło
2

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:

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

Możesz zainstalować go przez pip:

pip install django-showurls

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

Niklas9
źródło
Fajnie, dziękuję. Może się przydać, jeśli obok każdego wiersza drzewa znajduje się nazwa aplikacji definiującej regułę (lub podobny sposób wykrywania aplikacji).
Vedran Šego
Zwróć uwagę, że rozszerzenia Django zawierają również show_urlspolecenie - django-extensions.readthedocs.io/en/latest/ ...
Taylor Edmiston
1

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.

shacker
źródło
0

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.

Thierry Lam
źródło
0

Kiedy wypróbowałem inne odpowiedzi tutaj, otrzymałem ten błąd:

django.core.exceptions.AppRegistryNotReady: aplikacje nie są jeszcze załadowane.

Wygląda na to, że problem wynika z używania django.contrib.admin.autodiscover()w my urls.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)
Don Kirkby
źródło
-3

Jeśli używasz Django w trybie debugowania (masz DEBUG = Truew ustawieniach), a następnie wpiszesz nieistniejący adres URL, pojawi się strona błędu z pełną konfiguracją adresu URL.

Van Gale
źródło
Jak wspomniałem, ta strona błędu nie pokazuje pełnej konfiguracji, ponieważ nie zawiera informacji o dołączonych konfiguracjach adresów URL.
Michael
Zrozumiałem dokładnie, co masz na myśli, mówiąc o dołączonych konfiguracjach adresów URL, ale odpowiedziałem z wadliwej pamięci, ponieważ nie miałem natychmiastowego dostępu do strony testowej. Przysięgam, że strona błędu adresu URL umieszcza spację między adresem URL najwyższego poziomu a dołączonymi adresami URL, ale teraz widzę, że tak nie jest. Więc odpowiedź brzmi NIE, nie ma możliwości zobaczenia pełnej konfiguracji.
Van Gale
Strona błędu pokazuje tylko odpowiednie konfiguracje dołączonych adresów URL. Np. Strona 404 dla /news/bad_url/będzie wyświetlać dołączone adresy URL z newsaplikacji, ale nie z sportaplikacji.
Alasdair