Merge pull request #51 from peterfarrell/feature_conn_max_age

Added support for CONN_MAX_AGE for Django 1.6+
This commit is contained in:
Kenneth Reitz 2016-02-01 15:57:36 -05:00
commit 063ff555dd
3 changed files with 26 additions and 6 deletions

View file

@ -24,14 +24,19 @@ Usage
-----
Configure your database in ``settings.py`` from ``DATABASE_URL``
(``default`` is optional)::
(``default`` and ``conn_max_age`` are optional)::
import dj_database_url
DATABASES = {'default': dj_database_url.config(default='postgres://...')}
DATABASES = {'default': dj_database_url.config(default='postgres://...', conn_max_age=600 )}
Parse an arbitrary Database URL::
DATABASES = {'default': dj_database_url.parse('postgres://...')}
DATABASES = {'default': dj_database_url.parse('postgres://...', conn_max_age=600)}
The ``conn_max_age`` attribute is the lifetime of a database connection in seconds
and is available in Django 1.6+. If you do not set a value, it will default to ``0``
which is Django's historical behavior of using a new database connection on each
request. Use ``None`` for unlimited persistent connections.
URL schema
----------

View file

@ -35,7 +35,7 @@ SCHEMES = {
}
def config(env=DEFAULT_ENV, default=None, engine=None):
def config(env=DEFAULT_ENV, default=None, engine=None, conn_max_age=0):
"""Returns configured DATABASE dictionary from DATABASE_URL."""
config = {}
@ -43,12 +43,12 @@ def config(env=DEFAULT_ENV, default=None, engine=None):
s = os.environ.get(env, default)
if s:
config = parse(s, engine)
config = parse(s, engine, conn_max_age)
return config
def parse(url, engine=None):
def parse(url, engine=None, conn_max_age=0):
"""Parses a database URL."""
if url == 'sqlite://:memory:':
@ -87,6 +87,7 @@ def parse(url, engine=None):
'PASSWORD': url.password or '',
'HOST': hostname,
'PORT': url.port or '',
'CONN_MAX_AGE': conn_max_age,
})
if engine:

View file

@ -110,6 +110,20 @@ class DatabaseTestSuite(unittest.TestCase):
url = dj_database_url.config(engine=engine)
assert url['ENGINE'] == engine
def test_parse_conn_max_age_setting(self):
conn_max_age = 600
url = 'mysql://bea6eb025ca0d8:69772142@us-cdbr-east.cleardb.com/heroku_97681db3eff7580?reconnect=true'
url = dj_database_url.parse(url, conn_max_age=conn_max_age)
assert url['CONN_MAX_AGE'] == conn_max_age
def test_config_conn_max_age_setting(self):
conn_max_age = 600
os.environ['DATABASE_URL'] = 'mysql://bea6eb025ca0d8:69772142@us-cdbr-east.cleardb.com/heroku_97681db3eff7580?reconnect=true'
url = dj_database_url.config(conn_max_age=conn_max_age)
assert url['CONN_MAX_AGE'] == conn_max_age
if __name__ == '__main__':
unittest.main()