Update @ssl_required decorator to play nice with other decorators
authorMarti Raudsepp <marti@juffo.org>
Wed, 7 Nov 2012 21:11:21 +0000 (23:11 +0200)
committerMagnus Hagander <magnus@hagander.net>
Sun, 11 Nov 2012 15:07:05 +0000 (16:07 +0100)
The decorator now retains all attributes of the original view and adds a
new 'view.ssl_required = True' attribute.

pgweb/util/decorators.py
pgweb/util/middleware.py

index 49bcf66a3993a6b79191a43fc389b6b2aed02a40..dc173e23e9b91004f7ef54de95b0ca086dd719b3 100644 (file)
@@ -1,9 +1,12 @@
 import datetime
+from functools import wraps
 
 def ssl_required(fn):
        def _require_ssl(request, *_args, **_kwargs):
                return fn(request, *_args, **_kwargs)
-       return _require_ssl
+       _require_ssl.ssl_required = True
+       # wraps retains original function attributes such as __name__, csrf_exempt, etc
+       return wraps(_require_ssl)(fn)
 
 def nocache(fn):
        def _nocache(request, *_args, **_kwargs):
index 3b438fe7a500594b8416549983ab30b65407b5cf..ab0523b871506740b56580f9c54e7795425206e2 100644 (file)
@@ -30,7 +30,7 @@ class PgMiddleware(object):
                                return HttpResponseRedirect(request.build_absolute_uri().replace('http://','https://',1))
                        return None
 
-               if view_func.__name__ == '_require_ssl':
+               if getattr(view_func, 'ssl_required', False):
                        # This view requires SSL, so check if we have it
                        if not request.is_secure():
                                # May need to deal with ports specified here?