1 "Functions that help with dynamically creating decorators for views."
5 from functools
import wraps
7 from django
.utils
.functional
import wraps
# Python 2.3, 2.4 fallback.
9 def decorator_from_middleware(middleware_class
):
11 Given a middleware class (not an instance), returns a view decorator. This
12 lets you use middleware functionality on a per-view basis.
14 def _decorator_from_middleware(*args
, **kwargs
):
15 # For historical reasons, these "decorators" are also called as
16 # dec(func, *args) instead of dec(*args)(func). We handle both forms
17 # for backwards compatibility.
20 view_func
= kwargs
.pop('view_func')
23 view_func
, args
= args
[0], args
[1:]
26 if not (has_func
and isinstance(view_func
, types
.FunctionType
)):
27 # We are being called as a decorator.
29 args
= (view_func
,) + args
30 middleware
= middleware_class(*args
, **kwargs
)
32 def decorator_func(fn
):
33 return _decorator_from_middleware(fn
, *args
, **kwargs
)
36 middleware
= middleware_class(*args
, **kwargs
)
38 def _wrapped_view(request
, *args
, **kwargs
):
39 if hasattr(middleware
, 'process_request'):
40 result
= middleware
.process_request(request
)
41 if result
is not None:
43 if hasattr(middleware
, 'process_view'):
44 result
= middleware
.process_view(request
, view_func
, args
, kwargs
)
45 if result
is not None:
48 response
= view_func(request
, *args
, **kwargs
)
50 if hasattr(middleware
, 'process_exception'):
51 result
= middleware
.process_exception(request
, e
)
52 if result
is not None:
55 if hasattr(middleware
, 'process_response'):
56 result
= middleware
.process_response(request
, response
)
57 if result
is not None:
60 return wraps(view_func
)(_wrapped_view
)
61 return _decorator_from_middleware