diff --git a/flask/app.py b/flask/app.py index 83721a6b..ebf4e6a6 100644 --- a/flask/app.py +++ b/flask/app.py @@ -41,6 +41,12 @@ from .signals import request_started, request_finished, got_request_exception, \ _logger_lock = Lock() +def _make_timedelta(value): + if not isinstance(value, timedelta): + return timedelta(seconds=value) + return value + + def setupmethod(f): """Wraps a method so that it performs a check in debug mode if the first request was already handled. @@ -177,6 +183,16 @@ class Flask(_PackageBoundObject): #: `SESSION_COOKIE_NAME` configuration key. Defaults to ``'session'`` session_cookie_name = ConfigAttribute('SESSION_COOKIE_NAME') + #: A :class:`~datetime.timedelta` which is used to set the expiration + #: date of a permanent session. The default is 31 days which makes a + #: permanent session survive for roughly one month. + #: + #: This attribute can also be configured from the config with the + #: `PERMANENT_SESSION_LIFETIME` configuration key. Defaults to + #: ``timedelta(days=31)`` + permanent_session_lifetime = ConfigAttribute('PERMANENT_SESSION_LIFETIME', + get_converter=_make_timedelta) + #: Enable this if you want to use the X-Sendfile feature. Keep in #: mind that the server has to support this. This only affects files #: sent with the :func:`send_file` method. @@ -486,32 +502,6 @@ class Flask(_PackageBoundObject): return rv return self.debug - def _get_permanent_session_lifetime(self): - """A :class:`~datetime.timedelta` which is used to set the expiration - date of a permanent session. The default is 31 days which makes a - permanent session survive for roughly one month. - - This attribute can also be configured from the config with the - `PERMANENT_SESSION_LIFETIME` configuration key. Defaults to - ``timedelta(days=31)``. - - If you want to have this value as seconds you can use ``total_seconds()``:: - - app.permanent_session_lifetime.total_seconds() - - Note that the config key can be a timedelta object or number of seconds - as integer since Flask 0.8. - """ - rv = self.config['PERMANENT_SESSION_LIFETIME'] - if not isinstance(rv, timedelta): - return timedelta(seconds=rv) - return rv - def _set_permanent_session_lifetime(self, value): - self.config['PERMANENT_SESSION_LIFETIME'] = value - permanent_session_lifetime = property(_get_permanent_session_lifetime, - _set_permanent_session_lifetime) - del _get_permanent_session_lifetime, _set_permanent_session_lifetime - @property def logger(self): """A :class:`logging.Logger` object for this application. The diff --git a/flask/config.py b/flask/config.py index 7b6cd1ee..67dbf9b7 100644 --- a/flask/config.py +++ b/flask/config.py @@ -21,13 +21,17 @@ from werkzeug.utils import import_string class ConfigAttribute(object): """Makes an attribute forward to the config""" - def __init__(self, name): + def __init__(self, name, get_converter=None): self.__name__ = name + self.get_converter = get_converter def __get__(self, obj, type=None): if obj is None: return self - return obj.config[self.__name__] + rv = obj.config[self.__name__] + if self.get_converter is not None: + rv = self.get_converter(rv) + return rv def __set__(self, obj, value): obj.config[self.__name__] = value diff --git a/flask/testsuite/config.py b/flask/testsuite/config.py index 2ed726c8..1f6d79c3 100644 --- a/flask/testsuite/config.py +++ b/flask/testsuite/config.py @@ -78,6 +78,11 @@ class ConfigTestCase(FlaskTestCase): self.assert_(0, 'expected config') self.assert_(not app.config.from_pyfile('missing.cfg', silent=True)) + def test_session_lifetime(self): + app = flask.Flask(__name__) + app.config['PERMANENT_SESSION_LIFETIME'] = 42 + self.assert_equal(app.permanent_session_lifetime.total_seconds(), 42) + class InstanceTestCase(FlaskTestCase):