diff options
author | Jon Parise <jon@indelible.org> | 2012-07-06 17:44:26 -0700 |
---|---|---|
committer | Jon Parise <jon@indelible.org> | 2012-07-06 17:49:37 -0700 |
commit | a378cdb91fbf3909b67748bc18a12f0dbbcaacf5 (patch) | |
tree | 43ed3deedc83fc3746d41b00515b200295550d7d /redis/client.py | |
parent | 1f6c4a5ab1fefb125fb8af9b3974c3f25fd44f8f (diff) | |
download | redis-py-a378cdb91fbf3909b67748bc18a12f0dbbcaacf5.tar.gz |
Improved `from_url()` support.
`from_url()` is now implemented as a classmethod. The previous
implementation always returned instances of the `Redis` class. This
new approach lets us construct StrictRedis instances (or any other
class derived from StrictRedis, including Redis).
`utils.from_url()` has been preserved for backwards compatibility.
Also, both versions of `from_url()` now pass along any additional
keyword arguments to the class's initializer.
Diffstat (limited to 'redis/client.py')
-rw-r--r-- | redis/client.py | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/redis/client.py b/redis/client.py index d866928..3cca591 100644 --- a/redis/client.py +++ b/redis/client.py @@ -3,6 +3,7 @@ import datetime import time import warnings from itertools import imap, izip, starmap +from urlparse import urlparse from redis.connection import ConnectionPool, UnixDomainSocketConnection from redis.exceptions import ( ConnectionError, @@ -184,6 +185,36 @@ class StrictRedis(object): } ) + @classmethod + def from_url(cls, url, db=None, **kwargs): + """ + Return a Redis client object configured from the given URL. + + For example:: + + redis://username:password@localhost:6379/0 + + If ``db`` is None, this method will attempt to extract the database ID + from the URL path component. + + Any additional keyword arguments will be passed along to the Redis + class's initializer. + """ + url = urlparse(url) + + # We only support redis:// schemes. + assert url.scheme == 'redis' or not url.scheme + + # Extract the database ID from the path component if hasn't been given. + if db is None: + try: + db = int(url.path.replace('/', '')) + except (AttributeError, ValueError): + db = 0 + + return cls(host=url.hostname, port=url.port, db=db, + password=url.password, **kwargs) + def __init__(self, host='localhost', port=6379, db=0, password=None, socket_timeout=None, connection_pool=None, charset='utf-8', |