Skip to content

Instantly share code, notes, and snippets.

@garrypolley
Created September 21, 2012 15:06
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save garrypolley/3762045 to your computer and use it in GitHub Desktop.
Save garrypolley/3762045 to your computer and use it in GitHub Desktop.
Django decorate 3rd party app's views
# -*- coding: utf-8 -*-
from django.conf.urls import include
def decorated_include(urls, decorator)
"""Used to decorate all urls in a 3rd party app with a specific decorator"""
urls_to_decorate = include(urls)
for url_pattern in urls_to_decorate
url_pattern._callback = decorator(url_pattern._callback)
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url
from django.contrib.auth.decorators import login_required
from .decorators import decorated_include
urlpatterns = patterns('',
url(r'^admin/', decorated_include('mongoanut.urls', login_required),
url(r'^auth/', include('social_auth.urls')),
)
@alukach
Copy link

alukach commented May 10, 2017

This code seems to not cover the case where a URL pattern contains a RegexURLResolver rather than a RegexURLPattern (i.e., an nested include() call in the examined include() call). This is my solution around that:

from django.conf.urls import include


def process_url_patterns(patterns, *decorators):
    """ Recursively look through patterns for views and apply decorators """
    for url_pattern in patterns:
        if hasattr(url_pattern, 'url_patterns'):
            process_url_patterns(url_pattern.url_patterns, *decorators)
        else:
            for decorator in decorators:
                print("Decorating {} with {}".format(url_pattern, decorator))
                url_pattern.callback = decorator(url_pattern.callback)


def decorated_include(urls, *decorators):
    """
    Used to decorate all urls in a 3rd party app with specific decorators
    """
    urls_to_decorate, app_name, namespace = include(urls)
    process_url_patterns(urls_to_decorate.urlpatterns, *decorators)
    return urls_to_decorate, app_name, namespace

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment