Frage Ermitteln Sie die vollständige Django-URL-Konfiguration


Gibt es einen Weg, um das zu bekommen? Komplett Django-URL-Konfiguration?

Zum Beispiel zeigt Djangos Debugging-404-Seite keine enthaltenen URL-Konfigurationen, daher ist dies nicht die vollständige Konfiguration.


Antworten: Dank Alasdair, hier ist ein Beispielskript:

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)

75
2017-12-01 19:05


Ursprung


Antworten:


Django ist Python, also ist Introspektion dein Freund.

Importieren Sie in der Shell urls. Durchschleifen urls.urlpatternsUnd indem Sie so viele Ebenen von inkludierten URL-Konfigurationen wie möglich durchbohren, können Sie die komplette URL-Konfiguration erstellen.

import urls
urls.urlpatterns

Die Liste urls.urlpatterns enthält RegexURLPattern und RegexURLResolver Objekte.

Für ein RegexURLPattern Objekt p Sie können den regulären Ausdruck mit anzeigen

p.regex.pattern

Für ein RegexURLResolver Objekt q, die eine eingeschlossene URL-Konfiguration darstellt, können Sie den ersten Teil des regulären Ausdrucks mit anzeigen

q.regex.pattern

Dann benutze

q.url_patterns

was eine weitere Liste von ergibt RegexURLResolver und RegexURLPattern Objekte.


45
2017-12-01 23:02



Django-Erweiterungen stellen ein Dienstprogramm bereit, um dies als manage.py-Befehl auszuführen.

pip install django-extensions

Dann füge hinzu django_extensions zu Ihrer INSTALLED_APPS in settings.py. Gib dann von der Konsole aus folgendes ein

python manage.py show_urls

60
2017-11-08 21:38



Auf die Gefahr hin, eine "Ich auch" -Antwort hinzuzufügen, poste ich eine modifizierte Version des oben eingereichten Skripts, das Ihnen eine Ansicht bietet, die alle URLs im Projekt aufführt, die in alphabetischer Reihenfolge und alphabetisch sortiert sind, sowie die Aufrufe, die sie aufrufen. Mehr ein Entwicklerwerkzeug als eine Produktionsseite.

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

und die Vorlage:

<ul>
{% for link in links %}
<li>
{{link.pattern}}   -----   {{link.location}}
</li>
{% endfor%}
</ul>

Wenn Sie sich etwas einfallen lassen möchten, können Sie die Liste mit Eingabefeldern für alle Regexes rendern, die Variablen an die Ansicht übergeben (wiederum als Entwicklerwerkzeug und nicht als Produktionsseite).


6
2017-07-01 21:41



Diese Frage ist ein bisschen alt, aber ich stieß auf das gleiche Problem und dachte, ich würde über meine Lösung sprechen. Ein bestimmtes Django-Projekt benötigt offensichtlich ein Mittel, um über all seine URLs Bescheid zu wissen und muss ein paar Dinge tun können:

  1. Karte von einer URL -> Ansicht
  2. Karte von einer benannten URL -> URL (dann wird 1 verwendet, um die Ansicht zu erhalten)
  3. Karte von einer Ansicht Name -> URL (dann wird 1 verwendet, um die Ansicht zu erhalten)

Django erreicht dies hauptsächlich durch ein Objekt namens RegexURLResolver.

  1. RegexURLResolver.resolve (Karte von einer URL -> Ansicht)
  2. RegexURLResolver.reverse

Sie können eines dieser Objekte auf folgende Weise in die Hände bekommen:

from my_proj import urls
from django.core.urlresolvers import get_resolver
resolver = get_resolver(urls)

Dann können Sie einfach Ihre URLs folgendermaßen ausdrucken:

for view, regexes in resolver.reverse_dict.iteritems():
    print "%s: %s" % (view, regexes)

Nichtsdestoweniger ist Alasdairs Lösung vollkommen in Ordnung und hat einige Vorteile, da es etwas schöner ausgibt als diese Methode. Aber wissen und in die Hände bekommen RegexURLResolver Object ist etwas Schönes zu wissen, vor allem, wenn Sie an Django Interna interessiert sind.


4
2018-01-05 06:36



Ich habe ein Paket (django-showurls) eingereicht, das diese Funktionalität jedem Django-Projekt hinzufügt. Es handelt sich um einen einfachen neuen Verwaltungsbefehl, der sich gut in manage.py integriert:

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

Sie können es über pip installieren:

pip install django-showurls

Und fügen Sie es dann zu Ihren installierten Apps in Ihrer Django-Projektdatei settings.py hinzu:

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

Und du bist bereit zu gehen.

Mehr Infos hier - https://github.com/Niklas9/django-showurls


2
2018-02-20 09:36



Der einfachste Weg, um eine vollständige Liste der registrierten URLs zu erhalten, ist die Installation contrib.admindocs Überprüfen Sie dann den Abschnitt "Ansichten". Es ist sehr einfach einzurichten und bietet Ihnen auch vollständig durchsuchbare Dokumente zu allen Vorlagen-Tags, Modellen usw.


1
2017-07-23 18:13



Suchen Sie nach den bewerteten oder nicht bewerteten URLs, wie im DEBUG-Modus gezeigt? Für ausgewertete, django.contrib.sitemaps können Sie dort helfen, sonst könnte es einige Reverse-Engineering mit Django-Code beinhalten.


0
2017-12-01 22:22



Als ich die anderen Antworten hier ausprobierte, bekam ich diesen Fehler:

django.core.exceptions.AppRegistryNotReady: Apps sind noch nicht geladen.

Es scheint, dass das Problem von der Verwendung kommt django.contrib.admin.autodiscover() in meinem urls.py, also kann ich das entweder kommentieren oder Django richtig laden, bevor ich die URLs ablege. Wenn ich die Admin-URLs im Mapping sehen möchte, kann ich sie natürlich nicht auskommentieren.

Die Art und Weise, wie ich gefunden habe, war ein benutzerdefinierter Verwaltungsbefehl das wirft die URLs ab.

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

0
2018-05-04 17:29