Commit 615eab6b authored by Russell Keith-Magee's avatar Russell Keith-Magee
Browse files

Fixed #13093 -- Updated some decorators and the decorator_from_middleware...

Fixed #13093 -- Updated some decorators and the decorator_from_middleware function to allow callable classes to be decorated. Thanks to Brian Neal for the report.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@12762 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 5c256dde
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -2,9 +2,9 @@

import types
try:
    from functools import wraps, update_wrapper
    from functools import wraps, update_wrapper, WRAPPER_ASSIGNMENTS
except ImportError:
    from django.utils.functional import wraps, update_wrapper  # Python 2.3, 2.4 fallback.
    from django.utils.functional import wraps, update_wrapper, WRAPPER_ASSIGNMENTS  # Python 2.3, 2.4 fallback.


def method_decorator(decorator):
@@ -50,6 +50,12 @@ def decorator_from_middleware(middleware_class):
    """
    return make_middleware_decorator(middleware_class)()

def available_attrs(fn):
    """
    Return the list of functools-wrappable attributes on a callable.
    This is required as a workaround for http://bugs.python.org/issue3445.
    """
    return tuple(a for a in WRAPPER_ASSIGNMENTS if hasattr(fn, a))

def make_middleware_decorator(middleware_class):
    def _make_decorator(*m_args, **m_kwargs):
@@ -77,6 +83,6 @@ def make_middleware_decorator(middleware_class):
                    if result is not None:
                        return result
                return response
            return wraps(view_func)(_wrapped_view)
            return wraps(view_func, assigned=available_attrs(view_func))(_wrapped_view)
        return _decorator
    return _make_decorator
+3 −3
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ try:
except ImportError:
    from django.utils.functional import wraps  # Python 2.3, 2.4 fallback.

from django.utils.decorators import decorator_from_middleware_with_args
from django.utils.decorators import decorator_from_middleware_with_args, available_attrs
from django.utils.cache import patch_cache_control, add_never_cache_headers
from django.middleware.cache import CacheMiddleware

@@ -56,7 +56,7 @@ def cache_control(**kwargs):
            response = viewfunc(request, *args, **kw)
            patch_cache_control(response, **kwargs)
            return response
        return wraps(viewfunc)(_cache_controlled)
        return wraps(viewfunc, assigned=available_attrs(viewfunc))(_cache_controlled)
    return _cache_controller


@@ -69,4 +69,4 @@ def never_cache(view_func):
        response = view_func(request, *args, **kwargs)
        add_never_cache_headers(response)
        return response
    return wraps(view_func)(_wrapped_view_func)
    return wraps(view_func, assigned=available_attrs(view_func))(_wrapped_view_func)
+4 −3
Original line number Diff line number Diff line
from django.middleware.csrf import CsrfViewMiddleware
from django.utils.decorators import decorator_from_middleware
from django.utils.decorators import decorator_from_middleware, available_attrs

try:
    from functools import wraps
except ImportError:
@@ -22,7 +23,7 @@ def csrf_response_exempt(view_func):
        resp = view_func(*args, **kwargs)
        resp.csrf_exempt = True
        return resp
    return wraps(view_func)(wrapped_view)
    return wraps(view_func, assigned=available_attrs(view_func))(wrapped_view)

def csrf_view_exempt(view_func):
    """
@@ -34,7 +35,7 @@ def csrf_view_exempt(view_func):
    def wrapped_view(*args, **kwargs):
        return view_func(*args, **kwargs)
    wrapped_view.csrf_exempt = True
    return wraps(view_func)(wrapped_view)
    return wraps(view_func, assigned=available_attrs(view_func))(wrapped_view)

def csrf_exempt(view_func):
    """
+2 −2
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@ from calendar import timegm
from datetime import timedelta
from email.Utils import formatdate

from django.utils.decorators import decorator_from_middleware
from django.utils.decorators import decorator_from_middleware, available_attrs
from django.utils.http import parse_etags, quote_etag
from django.middleware.http import ConditionalGetMiddleware
from django.http import HttpResponseNotAllowed, HttpResponseNotModified, HttpResponse
@@ -35,7 +35,7 @@ def require_http_methods(request_method_list):
            if request.method not in request_method_list:
                return HttpResponseNotAllowed(request_method_list)
            return func(request, *args, **kwargs)
        return wraps(func)(inner)
        return wraps(func, assigned=available_attrs(func))(inner)
    return decorator

require_GET = require_http_methods(["GET"])
+3 −2
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ except ImportError:
    from django.utils.functional import wraps  # Python 2.3, 2.4 fallback.

from django.utils.cache import patch_vary_headers
from django.utils.decorators import available_attrs

def vary_on_headers(*headers):
    """
@@ -21,7 +22,7 @@ def vary_on_headers(*headers):
            response = func(*args, **kwargs)
            patch_vary_headers(response, headers)
            return response
        return wraps(func)(inner_func)
        return wraps(func, assigned=available_attrs(func))(inner_func)
    return decorator

def vary_on_cookie(func):
@@ -37,4 +38,4 @@ def vary_on_cookie(func):
        response = func(*args, **kwargs)
        patch_vary_headers(response, ('Cookie',))
        return response
    return wraps(func)(inner_func)
    return wraps(func, assigned=available_attrs(func))(inner_func)
Loading