Determine complete Django url configuration

Question:

Is there a way to get the complete django url configuration?

For example Django’s debugging 404 page does not show included url configs, so this is not the complete configuration.


Answer: Thanks to Alasdair, here is an example 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)
Asked By: Michael

||

Answers:

If you are running Django in debug mode (have DEBUG = True in your settings) and then type a non-existent URL you will get an error page listing the complete URL configuration.

Answered By: Van Gale

Are you looking for the urls evaluated or not evaluated as shown in the DEBUG mode? For evaluated, django.contrib.sitemaps can help you there, otherwise it might involve some reverse engineering with Django’s code.

Answered By: Thierry Lam

Django is Python, so introspection is your friend.

In the shell, import urls. By looping through urls.urlpatterns, and drilling down through as many layers of included url configurations as possible, you can build the complete url configuration.

import urls
urls.urlpatterns

The list urls.urlpatterns contains RegexURLPattern and RegexURLResolver objects.

For a RegexURLPattern object p you can display the regular expression with

p.regex.pattern

For a RegexURLResolver object q, which represents an included url configuration, you can display the first part of the regular expression with

q.regex.pattern

Then use

q.url_patterns

which will return a further list of RegexURLResolver and RegexURLPattern objects.

Answered By: Alasdair

At the risk of adding a “me too” answer, I am posting a modified version of the above submitted script that gives you a view listing all the URLs in the project, somewhat prettified and sorted alphabetically, and the views that they call. More of a developer tool than a production page.

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

and the template:

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

If you wanted to get real fancy you could render the list with input boxes for any of the regexes that take variables to pass to the view (again as a developer tool rather than production page).

Answered By: andy

The easiest way to get a complete list of registered URLs is to install contrib.admindocs then check the “Views” section. Very easy to set up, and also gives you fully browsable docs on all of your template tags, models, etc.

Answered By: shacker

Django extensions provides a utility to do this as a manage.py command.

pip install django-extensions

Then add django_extensions to your INSTALLED_APPS in settings.py. then from the console just type the following

python manage.py show_urls
Answered By: Alan Viars

This question is a bit old, but I ran into the same problem and I thought I would discuss my solution. A given Django project obviously needs a means of knowing about all its URLs and needs to be able to do a couple things:

  1. map from a url -> view
  2. map from a named url -> url (then 1 is used to get the view)
  3. map from a view name -> url (then 1 is used to get the view)

Django accomplishes this mostly through an object called a RegexURLResolver.

  1. RegexURLResolver.resolve (map from a url -> view)
  2. RegexURLResolver.reverse

You can get your hands on one of these objects the following way:

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

Then, you can simply print out your urls the following way:

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

That said, Alasdair’s solution is perfectly fine and has some advantages, as it prints out some what more nicely than this method. But knowing about and getting your hands on a RegexURLResolver object is something nice to know about, especially if you are interested in Django internals.

Answered By: abhillman

When I tried the other answers here, I got this error:

django.core.exceptions.AppRegistryNotReady: Apps aren’t loaded yet.

It looks like the problem comes from using django.contrib.admin.autodiscover() in my urls.py, so I can either comment that out, or load Django properly before dumping the URL’s. Of course if I want to see the admin URL’s in the mapping, I can’t comment them out.

The way I found was to create a custom management command that dumps the urls.

# 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)
Answered By: Don Kirkby

I have submitted a package (django-showurls) that adds this functionality to any Django project, it’s a simple new management command that integrates well with manage.py:

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

You can install it through pip:

pip install django-showurls

And then add it to your installed apps in your Django project settings.py file:

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

And you’re ready to go.

More info here –
https://github.com/Niklas9/django-showurls

Answered By: Niklas9

If you want a list of all the urls in your project, first you need to install django-extensions

You can simply install using command.

pip install django-extensions

For more information related to package goto django-extensions

After that, add django_extensions in INSTALLED_APPS in your settings.py file like this:

INSTALLED_APPS = (
...
'django_extensions',
...
)

urls.py example:

from django.urls import path, include
from . import views
from . import health_views

urlpatterns = [
    path('get_url_info', views.get_url_func),
    path('health', health_views.service_health_check),
    path('service-session/status', views.service_session_status)
]

And then, run any of the command in your terminal

python manage.py show_urls

or

./manage.py show_urls

Sample output example based on config urls.py:

/get_url_info             django_app.views.get_url_func
/health                   django_app.health_views.service_health_check
/service-session/status   django_app.views.service_session_status

For more information you can check the documentation.

Answered By: Shubhank Gupta
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.