Skip to content

Instantly share code, notes, and snippets.

@sjzabel
Created November 18, 2011 22:41
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sjzabel/1378003 to your computer and use it in GitHub Desktop.
Save sjzabel/1378003 to your computer and use it in GitHub Desktop.
django: adding required decorators to entire urlpatterns
'''
Author: Stephen J. Zabel
License: BSD
This module exposed a helper function for
wrapping views at the urls.py/resolver level
My personal little itch as an example...
urlpatterns += required(
login_required,
patterns('',
(r'^api/',
include(api.urls)),
)
)
'''
def required(wrapping_functions,patterns_rslt):
'''
Used to require 1..n decorators in any view returned by a url tree
Usage:
urlpatterns = required(func,patterns(...))
urlpatterns = required((func,func,func),patterns(...))
Note:
Use functools.partial to pass keyword params to the required
decorators. If you need to pass args you will have to write a
wrapper function.
Example:
from functools import partial
urlpatterns = required(
partial(login_required,login_url='/accounts/login/'),
patterns(...)
)
'''
if not hasattr(wrapping_functions,'__iter__'):
wrapping_functions = (wrapping_functions,)
return [
_wrap_instance__resolve(wrapping_functions,instance)
for instance in patterns_rslt
]
def _wrap_instance__resolve(wrapping_functions,instance):
if not hasattr(instance,'resolve'): return instance
resolve = getattr(instance,'resolve')
def _wrap_func_in_returned_resolver_match(*args,**kwargs):
rslt = resolve(*args,**kwargs)
if not hasattr(rslt,'func'):return rslt
f = getattr(rslt,'func')
for _f in reversed(wrapping_functions):
# @decorate the function from inner to outter
f = _f(f)
setattr(rslt,'func',f)
return rslt
setattr(instance,'resolve',_wrap_func_in_returned_resolver_match)
return instance
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment