Bestimmen Sie die vollständige Django-URL-Konfiguration

82

Gibt es eine Möglichkeit, die vollständige Django-URL-Konfiguration zu erhalten?

Auf der Debugging-Seite 404 von Django werden beispielsweise keine enthaltenen URL-Konfigurationen angezeigt, sodass dies nicht die vollständige Konfiguration ist.


Antwort : Dank Alasdair ist hier 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)
Michael
quelle
2
sehr nützliches Skript, danke
RichVel

Antworten:

49

Django ist Python, also ist Selbstbeobachtung dein Freund.

Importieren Sie in die Shell urls. Durch Durchlaufen urls.urlpatternsund Durchlaufen möglichst vieler Ebenen der enthaltenen URL-Konfigurationen können Sie die vollständige URL-Konfiguration erstellen.

import urls
urls.urlpatterns

Die Liste urls.urlpatternsenthält RegexURLPatternund RegexURLResolverObjekte.

Für ein RegexURLPatternObjekt können pSie den regulären Ausdruck mit anzeigen

p.regex.pattern

Für ein RegexURLResolverObjekt q, das eine enthaltene URL-Konfiguration darstellt, können Sie den ersten Teil des regulären Ausdrucks mit anzeigen

q.regex.pattern

Dann benutze

q.url_patterns

Dies gibt eine weitere Liste von RegexURLResolverund RegexURLPatternObjekten zurück.

Alasdair
quelle
3
Gute Idee! Ich habe hier ein einfaches Skript erstellt: code.activestate.com/recipes/576974
Michael
Das ist eine elegante Funktion. Ich habe versucht, einen zu schreiben, aber es ging darum, die Objekttypen zu überprüfen, um festzustellen, ob sie RegexURLPatternoder waren RegexURLResolver. Verwenden has_attrist eine viel bessere Idee. Sie sollten Ihre Funktion hier auf Stapelüberlauf als Antwort setzen. Ich würde es positiv bewerten.
Alasdair
Dies verursacht so viele zyklische Importprobleme durch die Einstellungsdatei !!
NoobEditor
67

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

pip install django-extensions

django_extensionsFügen Sie dann zu Ihrem INSTALLED_APPS in hinzu settings.py. Geben Sie dann in der Konsole einfach Folgendes ein

python manage.py show_urls
Alan Viars
quelle
2
Praktisch! Ich glaube nicht, dass ich das jemals entdeckt hätte. Vielen Dank!
Tim Ruddick
6

Auf die Gefahr hin, eine "Ich auch" -Antwort hinzuzufügen, veröffentliche ich eine modifizierte Version des oben eingereichten Skripts, die Ihnen eine Ansicht bietet, in der alle URLs im Projekt aufgelistet sind, die etwas hübsch und alphabetisch sortiert sind, sowie die Ansichten, die sie aufrufen. Eher ein Entwicklertool 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 wirklich ausgefallen sein möchten, können Sie die Liste mit Eingabefeldern für alle regulären Ausdrücke rendern, bei denen Variablen an die Ansicht übergeben werden (wiederum als Entwicklertool und nicht als Produktionsseite).

Andy
quelle
4

Diese Frage ist etwas alt, aber ich bin auf dasselbe Problem gestoßen und dachte, ich würde meine Lösung besprechen. Ein bestimmtes Django-Projekt benötigt offensichtlich ein Mittel, um alle seine URLs zu kennen, und muss in der Lage sein, einige Dinge zu tun:

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

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

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

Sie können eines dieser Objekte folgendermaßen in die Hände bekommen:

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

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

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

Die Lösung von Alasdair ist jedoch vollkommen in Ordnung und hat einige Vorteile, da sie etwas Schöneres als diese Methode ausgibt. Aber über ein RegexURLResolverObjekt Bescheid zu wissen und es in die Hände zu bekommen, ist etwas Schönes, besonders wenn Sie sich für Django-Interna interessieren.

abhillman
quelle
2

Ich habe ein Paket (django-showurls) eingereicht, das diese Funktionalität zu jedem Django-Projekt hinzufügt. Es ist ein einfacher neuer Verwaltungsbefehl, der sich gut in manage.py integrieren lässt:

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

Sie können es über pip installieren:

pip install django-showurls

Fügen Sie es dann zu Ihren installierten Apps in der Datei settings.py Ihres Django-Projekts hinzu:

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

Und du bist bereit zu gehen.

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

Niklas9
quelle
Nett, danke. Es kann nützlich sein, wenn neben jeder Baumzeile der Name der App steht, der die Regel definiert (oder eine ähnliche Methode zum Erkennen der App).
Vedran Šego
Beachten Sie, dass Django Extensions auch einen show_urlsBefehl enthält - django-extensions.readthedocs.io/en/latest/…
Taylor Edmiston
1

Der einfachste Weg, um eine vollständige Liste der registrierten URLs zu erhalten, besteht darin, contrib.admindocs zu installieren und dann den Abschnitt "Ansichten" zu überprüfen. Sehr einfach einzurichten und bietet Ihnen außerdem vollständig durchsuchbare Dokumente für alle Ihre Vorlagen-Tags, Modelle usw.

Shacker
quelle
0

Suchen Sie nach ausgewerteten oder nicht ausgewerteten URLs, wie im DEBUG-Modus angezeigt? Für die Auswertung kann django.contrib.sitemaps Ihnen dort helfen, andernfalls kann es sich um ein Reverse Engineering mit Djangos Code handeln.

Thierry Lam
quelle
0

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

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

Es sieht so aus, als ob das Problem von der Verwendung django.contrib.admin.autodiscover()in my urls.pyherrührt. Daher kann ich das entweder auskommentieren oder Django ordnungsgemäß laden, bevor ich die URLs entleere. Wenn ich die Administrator-URLs in der Zuordnung sehen möchte, kann ich sie natürlich nicht auskommentieren.

Ich fand einen benutzerdefinierten Verwaltungsbefehl , der die URLs ausgibt.

# 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
quelle
-3

Wenn Sie Django im Debug-Modus ausführen ( DEBUG = Truein Ihren Einstellungen) und dann eine nicht vorhandene URL eingeben, wird eine Fehlerseite mit der vollständigen URL-Konfiguration angezeigt.

Van Gale
quelle
Wie bereits erwähnt, wird auf dieser Fehlerseite nicht die vollständige Konfiguration angezeigt, da sie keine Informationen zu den enthaltenen URL-Konfigurationen enthält.
Michael
Ich habe genau verstanden, was Sie mit INCLUDED-URL-Konfigurationen gemeint haben, aber aus fehlerhaftem Speicher geantwortet, weil ich keinen sofortigen Zugriff auf eine Testseite hatte. Ich schwöre, ich habe gesehen, dass die URL-Fehlerseite ein Leerzeichen zwischen der URL der obersten Ebene und den enthaltenen URLs gesetzt hat, aber jetzt ist dies nicht der Fall. Die Antwort lautet also NEIN. Es gibt keine Möglichkeit, die vollständige Konfiguration anzuzeigen.
Van Gale
Die Fehlerseite zeigt nur relevante enthaltene URL-Konfigurationen. Auf der 404-Seite für /news/bad_url/werden die enthaltenen URLs der newsApp angezeigt , jedoch nicht der sportApp.
Alasdair