Index: conf/urls/defaults.py
===================================================================
--- conf/urls/defaults.py	(revision 13020)
+++ conf/urls/defaults.py	(working copy)
@@ -27,16 +27,16 @@
         pattern_list.append(t)
     return pattern_list
 
-def url(regex, view, kwargs=None, name=None, prefix=''):
+def url(regex, view, kwargs=None, name=None, prefix='', wrap=None):
     if isinstance(view, (list,tuple)):
         # For include(...) processing.
         urlconf_module, app_name, namespace = view
-        return RegexURLResolver(regex, urlconf_module, kwargs, app_name=app_name, namespace=namespace)
+        return RegexURLResolver(regex, urlconf_module, kwargs, app_name=app_name, namespace=namespace, wrap=wrap)
     else:
         if isinstance(view, basestring):
             if not view:
                 raise ImproperlyConfigured('Empty URL pattern view name not permitted (for pattern %r)' % regex)
             if prefix:
                 view = prefix + '.' + view
-        return RegexURLPattern(regex, view, kwargs, name)
+        return RegexURLPattern(regex, view, kwargs, name, wrap=wrap)
 
Index: core/urlresolvers.py
===================================================================
--- core/urlresolvers.py	(revision 13020)
+++ core/urlresolvers.py	(working copy)
@@ -87,7 +87,7 @@
     return callback[:dot], callback[dot+1:]
 
 class RegexURLPattern(object):
-    def __init__(self, regex, callback, default_args=None, name=None):
+    def __init__(self, regex, callback, default_args=None, name=None, wrap=None):
         # regex is a string representing a regular expression.
         # callback is either a string like 'foo.views.news.stories.story_detail'
         # which represents the path to a module and a view function name, or a
@@ -100,6 +100,12 @@
             self._callback_str = callback
         self.default_args = default_args or {}
         self.name = name
+        if isinstance(wrap, (list, tuple)):
+            self.wrap = wrap
+        elif wrap:
+            self.wrap = [wrap]
+        else:
+            self.wrap = []
 
     def __repr__(self):
         return '<%s %s %s>' % (self.__class__.__name__, self.name, self.regex.pattern)
@@ -130,7 +136,7 @@
 
     def _get_callback(self):
         if self._callback is not None:
-            return self._callback
+            return self._decorate(self._callback)
         try:
             self._callback = get_callable(self._callback_str)
         except ImportError, e:
@@ -139,11 +145,16 @@
         except AttributeError, e:
             mod_name, func_name = get_mod_func(self._callback_str)
             raise ViewDoesNotExist("Tried %s in module %s. Error was: %s" % (func_name, mod_name, str(e)))
-        return self._callback
+        return self._decorate(self._callback)
     callback = property(_get_callback)
 
+    def _decorate(self, callback):
+        for decorator in reversed(self.wrap):
+            callback = decorator(callback)
+        return callback
+
 class RegexURLResolver(object):
-    def __init__(self, regex, urlconf_name, default_kwargs=None, app_name=None, namespace=None):
+    def __init__(self, regex, urlconf_name, default_kwargs=None, app_name=None, namespace=None, wrap=None):
         # regex is a string representing a regular expression.
         # urlconf_name is a string representing the module containing URLconfs.
         self.regex = re.compile(regex, re.UNICODE)
@@ -157,6 +168,12 @@
         self._reverse_dict = None
         self._namespace_dict = None
         self._app_dict = None
+        if isinstance(wrap, (tuple, list)):
+            self.wrap = wrap
+        elif wrap:
+            self.wrap = [wrap]
+        else:
+            self.wrap = []
 
     def __repr__(self):
         return '<%s %s (%s:%s) %s>' % (self.__class__.__name__, self.urlconf_name, self.app_name, self.namespace, self.regex.pattern)
@@ -232,11 +249,16 @@
                         sub_match_dict.update(self.default_kwargs)
                         for k, v in sub_match[2].iteritems():
                             sub_match_dict[smart_str(k)] = v
-                        return sub_match[0], sub_match[1], sub_match_dict
+                        return self._decorate(sub_match[0]), sub_match[1], sub_match_dict
                     tried.append(pattern.regex.pattern)
             raise Resolver404({'tried': tried, 'path': new_path})
         raise Resolver404({'path' : path})
 
+    def _decorate(self, callback):
+        for decorator in reversed(self.wrap):
+            callback = decorator(callback)
+        return callback
+
     def _get_urlconf_module(self):
         try:
             return self._urlconf_module
