Imported Upstream version 0.6.1
Scott Kitterman
6 years ago
0 | ## 0.6.1 (16 September 2017) | |
1 | ||
2 | BUG FIXES: | |
3 | ||
4 | * Dict Config fixes: ([#48](https://github.com/martinrusev/django-redis-sessions/issues/48)) | |
5 | ||
6 | ||
7 | ## 0.6 (6 September 2017) | |
8 | ||
9 | ||
10 | IMPROVEMENTS: | |
11 | ||
12 | * Dict config: ([#18](https://github.com/martinrusev/django-redis-sessions/issues/18)) | |
13 | ||
14 | ||
15 | ## 0.5.6 (9 June 2016) | |
16 | ||
17 | ||
18 | IMPROVEMENTS: | |
19 | ||
20 | * Redis Sentinel support: ([#29](https://github.com/martinrusev/django-redis-sessions/pull/29))⏎ |
0 | Copyright (c) 2010, Martin Rusev | |
0 | Copyright (c) 2017, Martin Rusev | |
1 | 1 | All rights reserved. |
2 | 2 | |
3 | 3 | Redistribution and use in source and binary forms, with or without |
0 | include README.md | |
0 | include README.rst | |
1 | 1 | include LICENSE.txt |
2 | include CHANGELOG.md | |
3 | graft tests⏎ |
0 | 0 | Metadata-Version: 1.1 |
1 | 1 | Name: django-redis-sessions |
2 | Version: 0.5.6 | |
2 | Version: 0.6.1 | |
3 | 3 | Summary: Redis Session Backend For Django |
4 | 4 | Home-page: http://github.com/martinrusev/django-redis-sessions |
5 | 5 | Author: Martin Rusev |
6 | 6 | Author-email: martin@amon.cx |
7 | 7 | License: BSD |
8 | 8 | Description: django-redis-sessions |
9 | ======================= | |
9 | ===================== | |
10 | ||
10 | 11 | Redis database backend for your sessions |
11 | 12 | |
13 | |Build Status| | |
12 | 14 | |
13 | [![Build Status](https://travis-ci.org/martinrusev/django-redis-sessions.svg?branch=master)](https://travis-ci.org/martinrusev/django-redis-sessions) | |
14 | ||
15 | - `Installation`_ | |
16 | - `Available Settings`_ | |
17 | - `Changelog`_ | |
15 | 18 | |
16 | 19 | Installation |
17 | 20 | ============ |
18 | 21 | |
19 | * Run `pip install django-redis-sessions` or alternatively download the tarball and run `python setup.py install`, | |
22 | - Run ``pip install django-redis-sessions`` or alternatively download | |
23 | the tarball and run ``python setup.py install``, | |
20 | 24 | |
21 | For Django < 1.4 run `pip install django-redis-sessions==0.3` | |
25 | For Django < 1.4 run ``pip install django-redis-sessions==0.3`` | |
22 | 26 | |
23 | * Set `redis_sessions.session` as your session engine, like so: | |
27 | - Set ``redis_sessions.session`` as your session engine, like so: | |
28 | ||
29 | .. code:: python | |
30 | ||
31 | SESSION_ENGINE = 'redis_sessions.session' | |
32 | ||
33 | Available Settings | |
34 | ================== | |
35 | ||
36 | .. code:: python | |
37 | ||
38 | SESSION_REDIS = { | |
39 | 'host': 'localhost', | |
40 | 'port': 6379, | |
41 | 'db': 0, | |
42 | 'password': 'password', | |
43 | 'prefix': 'session', | |
44 | 'socket_timeout': 1 | |
45 | } | |
46 | ||
47 | If you prefer domain socket connection, you can just add this line | |
48 | instead of HOST and PORT. | |
49 | ||
50 | .. code:: python | |
51 | ||
52 | SESSION_REDIS = { | |
53 | 'unix_domain_socket_path': '/var/run/redis/redis.sock', | |
54 | 'db': 0, | |
55 | 'password': 'password', | |
56 | 'prefix': 'session', | |
57 | 'socket_timeout': 1 | |
58 | } | |
59 | ||
60 | Redis Sentinel | |
61 | ~~~~~~~~~~~~~~ | |
62 | ||
63 | .. code:: python | |
64 | ||
65 | SESSION_REDIS_SENTINEL_LIST = [(host, port), (host, port), (host, port)] | |
66 | SESSION_REDIS_SENTINEL_MASTER_ALIAS = 'sentinel-master' | |
67 | ||
68 | Redis Pool (Horizontal partitioning) | |
69 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
70 | ||
71 | Splits sessions between Redis instances based on the session key. You | |
72 | can configure the connection type for each Redis instance in the pool | |
73 | (host/port, unix socket, redis url). | |
24 | 74 | |
25 | 75 | |
26 | ``` | |
27 | SESSION_ENGINE = 'redis_sessions.session' | |
28 | ``` | |
76 | .. code:: python | |
29 | 77 | |
30 | * Optional settings: | |
31 | ||
32 | ``` | |
33 | SESSION_REDIS_HOST = 'localhost' | |
34 | SESSION_REDIS_PORT = 6379 | |
35 | SESSION_REDIS_DB = 0 | |
36 | SESSION_REDIS_PASSWORD = 'password' | |
37 | SESSION_REDIS_PREFIX = 'session' | |
38 | SESSION_REDIS_SOCKET_TIMEOUT=1 | |
39 | ||
40 | # If you prefer domain socket connection, | |
41 | # you can just add this line instead of SESSION_REDIS_HOST and SESSION_REDIS_PORT. | |
42 | ||
43 | SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH = '/var/run/redis/redis.sock' | |
44 | ||
45 | # Redis Sentinel | |
46 | SESSION_REDIS_SENTINEL_LIST = [(host, port), (host, port), (host, port)] | |
47 | SESSION_REDIS_SENTINEL_MASTER_ALIAS = 'sentinel-master' | |
48 | ||
49 | ``` | |
50 | ||
78 | SESSION_REDIS = { | |
79 | 'prefix': 'session', | |
80 | 'socket_timeout': 1 | |
81 | 'retry_on_timeout': False, | |
82 | 'pool': [{ | |
83 | 'host': 'localhost3', | |
84 | 'port': 6379, | |
85 | 'db': 0, | |
86 | 'password': None, | |
87 | 'unix_domain_socket_path': None, | |
88 | 'url': None, | |
89 | 'weight': 1 | |
90 | }, | |
91 | { | |
92 | 'host': 'localhost2', | |
93 | 'port': 6379, | |
94 | 'db': 0, | |
95 | 'password': None, | |
96 | 'unix_domain_socket_path': None, | |
97 | 'url': None, | |
98 | 'weight': 1 | |
99 | }, | |
100 | { | |
101 | 'host': 'localhost1', | |
102 | 'port': 6379, | |
103 | 'db': 0, | |
104 | 'password': None, | |
105 | 'unix_domain_socket_path': None, | |
106 | 'url': None, | |
107 | 'weight': 1 | |
108 | }] | |
109 | } | |
51 | 110 | |
52 | 111 | |
53 | 112 | Tests |
54 | ============ | |
113 | ===== | |
55 | 114 | |
115 | .. code:: bash | |
56 | 116 | |
57 | ``` | |
58 | $ pip install django nose redis | |
59 | # Make sure you have redis running on localhost:6379 | |
60 | $ nosetests | |
61 | ``` | |
117 | $ pip install -r dev_requirements.txt | |
118 | # Make sure you have redis running on localhost:6379 | |
119 | $ nosetests -v | |
62 | 120 | |
63 | # [Changelog](https://github.com/martinrusev/imbox/blob/master/CHANGELOG.md) | |
121 | `Changelog <https://github.com/martinrusev/django-redis-sessions/blob/master/CHANGELOG.md>`__ | |
122 | ============================================================================================= | |
123 | ||
124 | .. _Installation: #installation | |
125 | .. _Available Settings: #available-settings | |
126 | .. _Changelog: #changelog | |
127 | ||
128 | .. |Build Status| image:: https://travis-ci.org/martinrusev/django-redis-sessions.svg?branch=master | |
129 | :target: https://travis-ci.org/martinrusev/django-redis-sessions | |
64 | 130 | Keywords: django,sessions, |
65 | 131 | Platform: UNKNOWN |
66 | 132 | Classifier: Programming Language :: Python :: 2 |
0 | django-redis-sessions | |
1 | ======================= | |
2 | Redis database backend for your sessions | |
3 | ||
4 | ||
5 | [![Build Status](https://travis-ci.org/martinrusev/django-redis-sessions.svg?branch=master)](https://travis-ci.org/martinrusev/django-redis-sessions) | |
6 | ||
7 | ||
8 | Installation | |
9 | ============ | |
10 | ||
11 | * Run `pip install django-redis-sessions` or alternatively download the tarball and run `python setup.py install`, | |
12 | ||
13 | For Django < 1.4 run `pip install django-redis-sessions==0.3` | |
14 | ||
15 | * Set `redis_sessions.session` as your session engine, like so: | |
16 | ||
17 | ||
18 | ``` | |
19 | SESSION_ENGINE = 'redis_sessions.session' | |
20 | ``` | |
21 | ||
22 | * Optional settings: | |
23 | ||
24 | ``` | |
25 | SESSION_REDIS_HOST = 'localhost' | |
26 | SESSION_REDIS_PORT = 6379 | |
27 | SESSION_REDIS_DB = 0 | |
28 | SESSION_REDIS_PASSWORD = 'password' | |
29 | SESSION_REDIS_PREFIX = 'session' | |
30 | SESSION_REDIS_SOCKET_TIMEOUT=1 | |
31 | ||
32 | # If you prefer domain socket connection, | |
33 | # you can just add this line instead of SESSION_REDIS_HOST and SESSION_REDIS_PORT. | |
34 | ||
35 | SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH = '/var/run/redis/redis.sock' | |
36 | ||
37 | # Redis Sentinel | |
38 | SESSION_REDIS_SENTINEL_LIST = [(host, port), (host, port), (host, port)] | |
39 | SESSION_REDIS_SENTINEL_MASTER_ALIAS = 'sentinel-master' | |
40 | ||
41 | ``` | |
42 | ||
43 | ||
44 | ||
45 | Tests | |
46 | ============ | |
47 | ||
48 | ||
49 | ``` | |
50 | $ pip install django nose redis | |
51 | # Make sure you have redis running on localhost:6379 | |
52 | $ nosetests | |
53 | ``` | |
54 | ||
55 | # [Changelog](https://github.com/martinrusev/imbox/blob/master/CHANGELOG.md)⏎ |
0 | django-redis-sessions | |
1 | ===================== | |
2 | ||
3 | Redis database backend for your sessions | |
4 | ||
5 | |Build Status| | |
6 | ||
7 | - `Installation`_ | |
8 | - `Available Settings`_ | |
9 | - `Changelog`_ | |
10 | ||
11 | Installation | |
12 | ============ | |
13 | ||
14 | - Run ``pip install django-redis-sessions`` or alternatively download | |
15 | the tarball and run ``python setup.py install``, | |
16 | ||
17 | For Django < 1.4 run ``pip install django-redis-sessions==0.3`` | |
18 | ||
19 | - Set ``redis_sessions.session`` as your session engine, like so: | |
20 | ||
21 | .. code:: python | |
22 | ||
23 | SESSION_ENGINE = 'redis_sessions.session' | |
24 | ||
25 | Available Settings | |
26 | ================== | |
27 | ||
28 | .. code:: python | |
29 | ||
30 | SESSION_REDIS = { | |
31 | 'host': 'localhost', | |
32 | 'port': 6379, | |
33 | 'db': 0, | |
34 | 'password': 'password', | |
35 | 'prefix': 'session', | |
36 | 'socket_timeout': 1 | |
37 | } | |
38 | ||
39 | If you prefer domain socket connection, you can just add this line | |
40 | instead of HOST and PORT. | |
41 | ||
42 | .. code:: python | |
43 | ||
44 | SESSION_REDIS = { | |
45 | 'unix_domain_socket_path': '/var/run/redis/redis.sock', | |
46 | 'db': 0, | |
47 | 'password': 'password', | |
48 | 'prefix': 'session', | |
49 | 'socket_timeout': 1 | |
50 | } | |
51 | ||
52 | Redis Sentinel | |
53 | ~~~~~~~~~~~~~~ | |
54 | ||
55 | .. code:: python | |
56 | ||
57 | SESSION_REDIS_SENTINEL_LIST = [(host, port), (host, port), (host, port)] | |
58 | SESSION_REDIS_SENTINEL_MASTER_ALIAS = 'sentinel-master' | |
59 | ||
60 | Redis Pool (Horizontal partitioning) | |
61 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
62 | ||
63 | Splits sessions between Redis instances based on the session key. You | |
64 | can configure the connection type for each Redis instance in the pool | |
65 | (host/port, unix socket, redis url). | |
66 | ||
67 | ||
68 | .. code:: python | |
69 | ||
70 | SESSION_REDIS = { | |
71 | 'prefix': 'session', | |
72 | 'socket_timeout': 1 | |
73 | 'retry_on_timeout': False, | |
74 | 'pool': [{ | |
75 | 'host': 'localhost3', | |
76 | 'port': 6379, | |
77 | 'db': 0, | |
78 | 'password': None, | |
79 | 'unix_domain_socket_path': None, | |
80 | 'url': None, | |
81 | 'weight': 1 | |
82 | }, | |
83 | { | |
84 | 'host': 'localhost2', | |
85 | 'port': 6379, | |
86 | 'db': 0, | |
87 | 'password': None, | |
88 | 'unix_domain_socket_path': None, | |
89 | 'url': None, | |
90 | 'weight': 1 | |
91 | }, | |
92 | { | |
93 | 'host': 'localhost1', | |
94 | 'port': 6379, | |
95 | 'db': 0, | |
96 | 'password': None, | |
97 | 'unix_domain_socket_path': None, | |
98 | 'url': None, | |
99 | 'weight': 1 | |
100 | }] | |
101 | } | |
102 | ||
103 | ||
104 | Tests | |
105 | ===== | |
106 | ||
107 | .. code:: bash | |
108 | ||
109 | $ pip install -r dev_requirements.txt | |
110 | # Make sure you have redis running on localhost:6379 | |
111 | $ nosetests -v | |
112 | ||
113 | `Changelog <https://github.com/martinrusev/django-redis-sessions/blob/master/CHANGELOG.md>`__ | |
114 | ============================================================================================= | |
115 | ||
116 | .. _Installation: #installation | |
117 | .. _Available Settings: #available-settings | |
118 | .. _Changelog: #changelog | |
119 | ||
120 | .. |Build Status| image:: https://travis-ci.org/martinrusev/django-redis-sessions.svg?branch=master | |
121 | :target: https://travis-ci.org/martinrusev/django-redis-sessions⏎ |
0 | 0 | Metadata-Version: 1.1 |
1 | 1 | Name: django-redis-sessions |
2 | Version: 0.5.6 | |
2 | Version: 0.6.1 | |
3 | 3 | Summary: Redis Session Backend For Django |
4 | 4 | Home-page: http://github.com/martinrusev/django-redis-sessions |
5 | 5 | Author: Martin Rusev |
6 | 6 | Author-email: martin@amon.cx |
7 | 7 | License: BSD |
8 | 8 | Description: django-redis-sessions |
9 | ======================= | |
9 | ===================== | |
10 | ||
10 | 11 | Redis database backend for your sessions |
11 | 12 | |
13 | |Build Status| | |
12 | 14 | |
13 | [![Build Status](https://travis-ci.org/martinrusev/django-redis-sessions.svg?branch=master)](https://travis-ci.org/martinrusev/django-redis-sessions) | |
14 | ||
15 | - `Installation`_ | |
16 | - `Available Settings`_ | |
17 | - `Changelog`_ | |
15 | 18 | |
16 | 19 | Installation |
17 | 20 | ============ |
18 | 21 | |
19 | * Run `pip install django-redis-sessions` or alternatively download the tarball and run `python setup.py install`, | |
22 | - Run ``pip install django-redis-sessions`` or alternatively download | |
23 | the tarball and run ``python setup.py install``, | |
20 | 24 | |
21 | For Django < 1.4 run `pip install django-redis-sessions==0.3` | |
25 | For Django < 1.4 run ``pip install django-redis-sessions==0.3`` | |
22 | 26 | |
23 | * Set `redis_sessions.session` as your session engine, like so: | |
27 | - Set ``redis_sessions.session`` as your session engine, like so: | |
28 | ||
29 | .. code:: python | |
30 | ||
31 | SESSION_ENGINE = 'redis_sessions.session' | |
32 | ||
33 | Available Settings | |
34 | ================== | |
35 | ||
36 | .. code:: python | |
37 | ||
38 | SESSION_REDIS = { | |
39 | 'host': 'localhost', | |
40 | 'port': 6379, | |
41 | 'db': 0, | |
42 | 'password': 'password', | |
43 | 'prefix': 'session', | |
44 | 'socket_timeout': 1 | |
45 | } | |
46 | ||
47 | If you prefer domain socket connection, you can just add this line | |
48 | instead of HOST and PORT. | |
49 | ||
50 | .. code:: python | |
51 | ||
52 | SESSION_REDIS = { | |
53 | 'unix_domain_socket_path': '/var/run/redis/redis.sock', | |
54 | 'db': 0, | |
55 | 'password': 'password', | |
56 | 'prefix': 'session', | |
57 | 'socket_timeout': 1 | |
58 | } | |
59 | ||
60 | Redis Sentinel | |
61 | ~~~~~~~~~~~~~~ | |
62 | ||
63 | .. code:: python | |
64 | ||
65 | SESSION_REDIS_SENTINEL_LIST = [(host, port), (host, port), (host, port)] | |
66 | SESSION_REDIS_SENTINEL_MASTER_ALIAS = 'sentinel-master' | |
67 | ||
68 | Redis Pool (Horizontal partitioning) | |
69 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
70 | ||
71 | Splits sessions between Redis instances based on the session key. You | |
72 | can configure the connection type for each Redis instance in the pool | |
73 | (host/port, unix socket, redis url). | |
24 | 74 | |
25 | 75 | |
26 | ``` | |
27 | SESSION_ENGINE = 'redis_sessions.session' | |
28 | ``` | |
76 | .. code:: python | |
29 | 77 | |
30 | * Optional settings: | |
31 | ||
32 | ``` | |
33 | SESSION_REDIS_HOST = 'localhost' | |
34 | SESSION_REDIS_PORT = 6379 | |
35 | SESSION_REDIS_DB = 0 | |
36 | SESSION_REDIS_PASSWORD = 'password' | |
37 | SESSION_REDIS_PREFIX = 'session' | |
38 | SESSION_REDIS_SOCKET_TIMEOUT=1 | |
39 | ||
40 | # If you prefer domain socket connection, | |
41 | # you can just add this line instead of SESSION_REDIS_HOST and SESSION_REDIS_PORT. | |
42 | ||
43 | SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH = '/var/run/redis/redis.sock' | |
44 | ||
45 | # Redis Sentinel | |
46 | SESSION_REDIS_SENTINEL_LIST = [(host, port), (host, port), (host, port)] | |
47 | SESSION_REDIS_SENTINEL_MASTER_ALIAS = 'sentinel-master' | |
48 | ||
49 | ``` | |
50 | ||
78 | SESSION_REDIS = { | |
79 | 'prefix': 'session', | |
80 | 'socket_timeout': 1 | |
81 | 'retry_on_timeout': False, | |
82 | 'pool': [{ | |
83 | 'host': 'localhost3', | |
84 | 'port': 6379, | |
85 | 'db': 0, | |
86 | 'password': None, | |
87 | 'unix_domain_socket_path': None, | |
88 | 'url': None, | |
89 | 'weight': 1 | |
90 | }, | |
91 | { | |
92 | 'host': 'localhost2', | |
93 | 'port': 6379, | |
94 | 'db': 0, | |
95 | 'password': None, | |
96 | 'unix_domain_socket_path': None, | |
97 | 'url': None, | |
98 | 'weight': 1 | |
99 | }, | |
100 | { | |
101 | 'host': 'localhost1', | |
102 | 'port': 6379, | |
103 | 'db': 0, | |
104 | 'password': None, | |
105 | 'unix_domain_socket_path': None, | |
106 | 'url': None, | |
107 | 'weight': 1 | |
108 | }] | |
109 | } | |
51 | 110 | |
52 | 111 | |
53 | 112 | Tests |
54 | ============ | |
113 | ===== | |
55 | 114 | |
115 | .. code:: bash | |
56 | 116 | |
57 | ``` | |
58 | $ pip install django nose redis | |
59 | # Make sure you have redis running on localhost:6379 | |
60 | $ nosetests | |
61 | ``` | |
117 | $ pip install -r dev_requirements.txt | |
118 | # Make sure you have redis running on localhost:6379 | |
119 | $ nosetests -v | |
62 | 120 | |
63 | # [Changelog](https://github.com/martinrusev/imbox/blob/master/CHANGELOG.md) | |
121 | `Changelog <https://github.com/martinrusev/django-redis-sessions/blob/master/CHANGELOG.md>`__ | |
122 | ============================================================================================= | |
123 | ||
124 | .. _Installation: #installation | |
125 | .. _Available Settings: #available-settings | |
126 | .. _Changelog: #changelog | |
127 | ||
128 | .. |Build Status| image:: https://travis-ci.org/martinrusev/django-redis-sessions.svg?branch=master | |
129 | :target: https://travis-ci.org/martinrusev/django-redis-sessions | |
64 | 130 | Keywords: django,sessions, |
65 | 131 | Platform: UNKNOWN |
66 | 132 | Classifier: Programming Language :: Python :: 2 |
0 | CHANGELOG.md | |
0 | 1 | LICENSE.txt |
1 | 2 | MANIFEST.in |
2 | README.md | |
3 | README.rst | |
3 | 4 | setup.py |
4 | 5 | django_redis_sessions.egg-info/PKG-INFO |
5 | 6 | django_redis_sessions.egg-info/SOURCES.txt |
6 | 7 | django_redis_sessions.egg-info/dependency_links.txt |
7 | 8 | django_redis_sessions.egg-info/not-zip-safe |
8 | django_redis_sessions.egg-info/pbr.json | |
9 | 9 | django_redis_sessions.egg-info/requires.txt |
10 | 10 | django_redis_sessions.egg-info/top_level.txt |
11 | 11 | redis_sessions/__init__.py |
12 | 12 | redis_sessions/session.py |
13 | redis_sessions/settings.py⏎ | |
13 | redis_sessions/settings.py | |
14 | tests/__init__.py | |
15 | tests/__init__.pyc | |
16 | tests/tests.py | |
17 | tests/tests.pyc | |
18 | tests/__pycache__/__init__.cpython-35.pyc | |
19 | tests/__pycache__/tests.cpython-35.pyc⏎ |
0 | {"is_release": false, "git_version": "7be7b21"}⏎ |
7 | 7 | from redis_sessions import settings |
8 | 8 | |
9 | 9 | |
10 | # Avoid new redis connection on each request | |
10 | class RedisServer(): | |
11 | __redis = {} | |
11 | 12 | |
12 | if settings.SESSION_REDIS_SENTINEL_LIST is not None: | |
13 | from redis.sentinel import Sentinel | |
13 | def __init__(self, session_key): | |
14 | self.session_key = session_key | |
15 | self.connection_key = '' | |
14 | 16 | |
15 | redis_server = Sentinel( | |
16 | settings.SESSION_REDIS_SENTINEL_LIST, | |
17 | socket_timeout=settings.SESSION_REDIS_SOCKET_TIMEOUT, | |
18 | retry_on_timeout=settings.SESSION_REDIS_RETRY_ON_TIMEOUT, | |
19 | db=getattr(settings, 'SESSION_REDIS_DB', 0), | |
20 | password=getattr(settings, 'SESSION_REDIS_PASSWORD', None) | |
21 | ).master_for(settings.SESSION_REDIS_SENTINEL_MASTER_ALIAS) | |
17 | if settings.SESSION_REDIS_SENTINEL_LIST is not None: | |
18 | self.connection_type = 'sentinel' | |
19 | else: | |
20 | if settings.SESSION_REDIS_POOL is not None: | |
21 | server_key, server = self.get_server(session_key, settings.SESSION_REDIS_POOL) | |
22 | self.connection_key = str(server_key) | |
23 | settings.SESSION_REDIS_HOST = getattr(server, 'host', 'localhost') | |
24 | settings.SESSION_REDIS_PORT = getattr(server, 'port', 6379) | |
25 | settings.SESSION_REDIS_DB = getattr(server, 'db', 0) | |
26 | settings.SESSION_REDIS_PASSWORD = getattr(server, 'password', None) | |
27 | settings.SESSION_REDIS_URL = getattr(server, 'url', None) | |
28 | settings.SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH = getattr(server,'unix_domain_socket_path', None) | |
22 | 29 | |
23 | elif settings.SESSION_REDIS_URL is not None: | |
30 | if settings.SESSION_REDIS_URL is not None: | |
31 | self.connection_type = 'redis_url' | |
32 | elif settings.SESSION_REDIS_HOST is not None: | |
33 | self.connection_type = 'redis_host' | |
34 | elif settings.SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH is not None: | |
35 | self.connection_type = 'redis_unix_url' | |
24 | 36 | |
25 | redis_server = redis.StrictRedis.from_url( | |
26 | settings.SESSION_REDIS_URL, | |
27 | socket_timeout=settings.SESSION_REDIS_SOCKET_TIMEOUT | |
28 | ) | |
29 | elif settings.SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH is None: | |
30 | ||
31 | redis_server = redis.StrictRedis( | |
32 | host=settings.SESSION_REDIS_HOST, | |
33 | port=settings.SESSION_REDIS_PORT, | |
34 | socket_timeout=settings.SESSION_REDIS_SOCKET_TIMEOUT, | |
35 | retry_on_timeout=settings.SESSION_REDIS_RETRY_ON_TIMEOUT, | |
36 | db=settings.SESSION_REDIS_DB, | |
37 | password=settings.SESSION_REDIS_PASSWORD | |
38 | ) | |
39 | else: | |
37 | self.connection_key += self.connection_type | |
40 | 38 | |
41 | redis_server = redis.StrictRedis( | |
42 | unix_socket_path=settings.SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH, | |
43 | socket_timeout=settings.SESSION_REDIS_SOCKET_TIMEOUT, | |
44 | retry_on_timeout=settings.SESSION_REDIS_RETRY_ON_TIMEOUT, | |
45 | db=settings.SESSION_REDIS_DB, | |
46 | password=settings.SESSION_REDIS_PASSWORD, | |
47 | ) | |
39 | def get_server(self, key, servers_pool): | |
40 | total_weight = sum([row.get('weight', 1) for row in servers_pool]) | |
41 | pos = 0 | |
42 | for i in range(3, -1, -1): | |
43 | pos = pos * 2 ** 8 + ord(key[i]) | |
44 | pos = pos % total_weight | |
45 | ||
46 | pool = iter(servers_pool) | |
47 | server = next(pool) | |
48 | server_key = 0 | |
49 | i = 0 | |
50 | while i < total_weight: | |
51 | if i <= pos < (i + server.get('weight', 1)): | |
52 | return server_key, server | |
53 | i += server.get('weight', 1) | |
54 | server = next(pool) | |
55 | server_key += 1 | |
56 | ||
57 | return | |
58 | ||
59 | def get(self): | |
60 | if self.connection_key in self.__redis: | |
61 | return self.__redis[self.connection_key] | |
62 | ||
63 | if self.connection_type == 'sentinel': | |
64 | from redis.sentinel import Sentinel | |
65 | self.__redis[self.connection_key] = Sentinel( | |
66 | settings.SESSION_REDIS_SENTINEL_LIST, | |
67 | socket_timeout=settings.SESSION_REDIS_SOCKET_TIMEOUT, | |
68 | retry_on_timeout=settings.SESSION_REDIS_RETRY_ON_TIMEOUT, | |
69 | db=getattr(settings, 'db', 0), | |
70 | password=getattr(settings, 'password', None) | |
71 | ).master_for(settings.SESSION_REDIS_SENTINEL_MASTER_ALIAS) | |
72 | ||
73 | elif self.connection_type == 'redis_url': | |
74 | self.__redis[self.connection_key] = redis.StrictRedis.from_url( | |
75 | settings.SESSION_REDIS_URL, | |
76 | socket_timeout=settings.SESSION_REDIS_SOCKET_TIMEOUT | |
77 | ) | |
78 | elif self.connection_type == 'redis_host': | |
79 | self.__redis[self.connection_key] = redis.StrictRedis( | |
80 | host=settings.SESSION_REDIS_HOST, | |
81 | port=settings.SESSION_REDIS_PORT, | |
82 | socket_timeout=settings.SESSION_REDIS_SOCKET_TIMEOUT, | |
83 | retry_on_timeout=settings.SESSION_REDIS_RETRY_ON_TIMEOUT, | |
84 | db=settings.SESSION_REDIS_DB, | |
85 | password=settings.SESSION_REDIS_PASSWORD | |
86 | ) | |
87 | elif self.connection_type == 'redis_unix_url': | |
88 | self.__redis[self.connection_key] = redis.StrictRedis( | |
89 | unix_socket_path=settings.SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH, | |
90 | socket_timeout=settings.SESSION_REDIS_SOCKET_TIMEOUT, | |
91 | retry_on_timeout=settings.SESSION_REDIS_RETRY_ON_TIMEOUT, | |
92 | db=settings.SESSION_REDIS_DB, | |
93 | password=settings.SESSION_REDIS_PASSWORD, | |
94 | ) | |
95 | ||
96 | return self.__redis[self.connection_key] | |
48 | 97 | |
49 | 98 | |
50 | 99 | class SessionStore(SessionBase): |
53 | 102 | """ |
54 | 103 | def __init__(self, session_key=None): |
55 | 104 | super(SessionStore, self).__init__(session_key) |
56 | ||
57 | self.server = redis_server | |
105 | self.server = RedisServer(session_key).get() | |
58 | 106 | |
59 | 107 | def load(self): |
60 | 108 | try: |
0 | 0 | from django.conf import settings |
1 | 1 | |
2 | # SESSION_REDIS - Default | |
3 | SESSION_REDIS = getattr(settings, 'SESSION_REDIS', {}) | |
2 | 4 | |
3 | SESSION_REDIS_HOST = getattr(settings, 'SESSION_REDIS_HOST', 'localhost') | |
4 | SESSION_REDIS_PORT = getattr(settings, 'SESSION_REDIS_PORT', 6379) | |
5 | SESSION_REDIS_SOCKET_TIMEOUT = getattr(settings, 'SESSION_REDIS_SOCKET_TIMEOUT', 0.1) | |
6 | SESSION_REDIS_RETRY_ON_TIMEOUT = getattr(settings, 'SESSION_REDIS_RETRY_ON_TIMEOUT', False) | |
7 | SESSION_REDIS_DB = getattr(settings, 'SESSION_REDIS_DB', 0) | |
8 | SESSION_REDIS_PREFIX = getattr(settings, 'SESSION_REDIS_PREFIX', '') | |
9 | SESSION_REDIS_PASSWORD = getattr(settings, 'SESSION_REDIS_PASSWORD', None) | |
10 | SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH = getattr( | |
11 | settings, 'SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH', None | |
12 | ) | |
13 | SESSION_REDIS_URL = getattr(settings, 'SESSION_REDIS_URL', None) | |
5 | SESSION_REDIS_HOST = SESSION_REDIS.get('host', 'localhost') | |
6 | SESSION_REDIS_PORT = SESSION_REDIS.get('port', 6379) | |
7 | SESSION_REDIS_SOCKET_TIMEOUT = SESSION_REDIS.get('socket_timeout', 0.1) | |
8 | SESSION_REDIS_RETRY_ON_TIMEOUT = SESSION_REDIS.get('retry_on_timeout', False) | |
9 | SESSION_REDIS_DB = SESSION_REDIS.get('db', 0) | |
10 | SESSION_REDIS_PREFIX = SESSION_REDIS.get('prefix', '') | |
11 | SESSION_REDIS_PASSWORD = SESSION_REDIS.get('password', None) | |
12 | SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH = SESSION_REDIS.get('unix_domain_socket_path', None) | |
13 | SESSION_REDIS_URL = SESSION_REDIS.get('url', None) | |
14 | ||
15 | ||
16 | """ | |
17 | Should be on the format: | |
18 | [ | |
19 | { | |
20 | 'host': 'localhost2', | |
21 | 'port': 6379, | |
22 | 'db': 0, | |
23 | 'password': None, | |
24 | 'unix_domain_socket_path': None, | |
25 | 'url': None, | |
26 | 'weight': 1, | |
27 | }, | |
28 | { | |
29 | 'host': 'localhost1', | |
30 | 'port': 6379, | |
31 | 'db': 0, | |
32 | 'password': None, | |
33 | 'unix_domain_socket_path': None, | |
34 | 'url': None, | |
35 | 'weight': 1, | |
36 | }, | |
37 | ] | |
38 | """ | |
39 | SESSION_REDIS_POOL = SESSION_REDIS.get('POOL', None) | |
14 | 40 | |
15 | 41 | # should be on the format [(host, port), (host, port), (host, port)] |
16 | SESSION_REDIS_SENTINEL_LIST = getattr( | |
17 | settings, 'SESSION_REDIS_SENTINEL_LIST', None | |
18 | ) | |
19 | SESSION_REDIS_SENTINEL_MASTER_ALIAS = getattr( | |
20 | settings, 'SESSION_REDIS_SENTINEL_MASTER_ALIAS', None | |
21 | )⏎ | |
42 | SESSION_REDIS_SENTINEL_LIST = getattr(settings, 'SESSION_REDIS_SENTINEL_LIST', None) | |
43 | SESSION_REDIS_SENTINEL_MASTER_ALIAS = getattr(settings, 'SESSION_REDIS_SENTINEL_MASTER_ALIAS', None)⏎ |
11 | 11 | name='django-redis-sessions', |
12 | 12 | version=__version__, |
13 | 13 | description= "Redis Session Backend For Django", |
14 | long_description=read("README.md"), | |
14 | long_description=read("README.rst"), | |
15 | 15 | keywords='django, sessions,', |
16 | 16 | author='Martin Rusev', |
17 | 17 | author_email='martin@amon.cx', |
28 | 28 | "Framework :: Django", |
29 | 29 | "Environment :: Web Environment", |
30 | 30 | ], |
31 | test_suite='tests' | |
31 | 32 | ) |
0 | from django.conf import settings | |
1 | ||
2 | ||
3 | settings.configure( | |
4 | SESSION_ENGINE='redis_sessions.session' | |
5 | ) |
Binary diff not shown
Binary diff not shown
Binary diff not shown
0 | import time | |
1 | from random import randint | |
2 | ||
3 | ||
4 | from nose.tools import eq_, assert_false | |
5 | ||
6 | from redis_sessions.session import SessionStore | |
7 | from redis_sessions.session import RedisServer | |
8 | from redis_sessions import settings | |
9 | ||
10 | ||
11 | ## Dev | |
12 | import redis | |
13 | import timeit | |
14 | ||
15 | redis_session = SessionStore() | |
16 | ||
17 | ||
18 | def test_modify_and_keys(): | |
19 | eq_(redis_session.modified, False) | |
20 | redis_session['test'] = 'test_me' | |
21 | eq_(redis_session.modified, True) | |
22 | eq_(redis_session['test'], 'test_me') | |
23 | ||
24 | ||
25 | def test_session_load_does_not_create_record(): | |
26 | session = SessionStore('someunknownkey') | |
27 | session.load() | |
28 | ||
29 | eq_(redis_session.exists(redis_session.session_key), False) | |
30 | ||
31 | ||
32 | def test_save_and_delete(): | |
33 | redis_session['key'] = 'value' | |
34 | redis_session.save() | |
35 | eq_(redis_session.exists(redis_session.session_key), True) | |
36 | redis_session.delete(redis_session.session_key) | |
37 | eq_(redis_session.exists(redis_session.session_key), False) | |
38 | ||
39 | ||
40 | def test_flush(): | |
41 | redis_session['key'] = 'another_value' | |
42 | redis_session.save() | |
43 | key = redis_session.session_key | |
44 | redis_session.flush() | |
45 | eq_(redis_session.exists(key), False) | |
46 | ||
47 | ||
48 | def test_items(): | |
49 | redis_session['item1'], redis_session['item2'] = 1, 2 | |
50 | redis_session.save() | |
51 | # Python 3.* | |
52 | eq_(set(list(redis_session.items())), set([('item2', 2), ('item1', 1)])) | |
53 | ||
54 | ||
55 | def test_expiry(): | |
56 | redis_session.set_expiry(1) | |
57 | # Test if the expiry age is set correctly | |
58 | eq_(redis_session.get_expiry_age(), 1) | |
59 | redis_session['key'] = 'expiring_value' | |
60 | redis_session.save() | |
61 | key = redis_session.session_key | |
62 | eq_(redis_session.exists(key), True) | |
63 | time.sleep(2) | |
64 | eq_(redis_session.exists(key), False) | |
65 | ||
66 | ||
67 | def test_save_and_load(): | |
68 | redis_session.set_expiry(60) | |
69 | redis_session.setdefault('item_test', 8) | |
70 | redis_session.save() | |
71 | session_data = redis_session.load() | |
72 | eq_(session_data.get('item_test'), 8) | |
73 | ||
74 | ||
75 | def test_with_redis_url_config(): | |
76 | settings.SESSION_REDIS_URL = 'redis://localhost' | |
77 | ||
78 | from redis_sessions.session import SessionStore | |
79 | ||
80 | redis_session = SessionStore() | |
81 | server = redis_session.server | |
82 | ||
83 | host = server.connection_pool.connection_kwargs.get('host') | |
84 | port = server.connection_pool.connection_kwargs.get('port') | |
85 | db = server.connection_pool.connection_kwargs.get('db') | |
86 | ||
87 | eq_(host, 'localhost') | |
88 | eq_(port, 6379) | |
89 | eq_(db, 0) | |
90 | ||
91 | ||
92 | def test_one_connection_is_used(): | |
93 | session = SessionStore('session_key_1') | |
94 | session['key1'] = 'value1' | |
95 | session.save() | |
96 | ||
97 | redis_server = session.server | |
98 | set_client_name_1 = 'client_name_' + str(randint(1, 1000)) | |
99 | redis_server.client_setname(set_client_name_1) | |
100 | client_name_1 = redis_server.client_getname() | |
101 | eq_(set_client_name_1, client_name_1) | |
102 | del session | |
103 | ||
104 | session = SessionStore('session_key_2') | |
105 | session['key2'] = 'value2' | |
106 | session.save() | |
107 | ||
108 | redis_server = session.server | |
109 | client_name_2 = redis_server.client_getname() | |
110 | eq_(client_name_1, client_name_2) | |
111 | ||
112 | ||
113 | def test_redis_pool_server_select(): | |
114 | servers = [ | |
115 | { | |
116 | 'HOST': 'localhost2', | |
117 | 'PORT': 6379, | |
118 | 'DB': 0, | |
119 | 'PASSWORD': None, | |
120 | 'UNIX_DOMAIN_SOCKET_PATH': None, | |
121 | 'WEIGHT': 1, | |
122 | }, | |
123 | { | |
124 | 'HOST': 'localhost1', | |
125 | 'PORT': 6379, | |
126 | 'DB': 0, | |
127 | 'PASSWORD': None, | |
128 | 'UNIX_DOMAIN_SOCKET_PATH': None, | |
129 | 'WEIGHT': 1, | |
130 | }, | |
131 | ] | |
132 | ||
133 | keys1 = [ | |
134 | 'm8f0os91g40fsq8eul6tejqpp6k22', | |
135 | 'kcffsbb5o272et1d5e6ib7gh75pd9', | |
136 | 'gqldpha87m8183vl9s8uqobcr2ws3', | |
137 | 'ukb9bg2jifrr60fstla67knjv3e32', | |
138 | 'k3dranjfna7fv7ijpofs6l6bj2pw1', | |
139 | 'an4no833idr9jddr960r8ikai5nh3', | |
140 | '16b9gardpcscrj5q4a4kf3c4u7tq8', | |
141 | 'etdefnorfbvfc165c5airu77p2pl9', | |
142 | 'mr778ou0sqqme21gjdiu4drtc0bv4', | |
143 | 'ctkgd8knu5hukdrdue6im28p90kt7' | |
144 | ] | |
145 | ||
146 | keys2 = [ | |
147 | 'jgpsbmjj6030fdr3aefg37nq47nb8', | |
148 | 'prsv0trk66jc100pipm6bb78c3pl2', | |
149 | '84ksqj2vqral7c6ped9hcnq940qq1', | |
150 | 'bv2uc3q48rm8ubipjmolgnhul0ou3', | |
151 | '6c8oph72pfsg3db37qsefn3746fg4', | |
152 | 'tbc0sjtl2bkp5i9n2j2jiqf4r0bg9', | |
153 | 'v0on9rorn71913o3rpqhvkknc1wm5', | |
154 | 'lmsv98ns819uo2klk3s1nusqm0mr0', | |
155 | '0foo2bkgvrlk3jt2tjbssrsc47tr3', | |
156 | '05ure0f6r5jjlsgaimsuk4n1k2sx6', | |
157 | ] | |
158 | rs = RedisServer('') | |
159 | ||
160 | for key in keys1: | |
161 | server_key, server = rs.get_server(key, servers) | |
162 | eq_(server_key, 1) | |
163 | ||
164 | for key in keys2: | |
165 | server_key, server = rs.get_server(key, servers) | |
166 | eq_(server_key, 0) | |
167 | ||
168 | ||
169 | def test_with_unix_url_config(): | |
170 | pass | |
171 | ||
172 | # Uncomment this in `redis.conf`: | |
173 | # | |
174 | # unixsocket /tmp/redis.sock | |
175 | # unixsocketperm 755 | |
176 | ||
177 | #settings.SESSION_REDIS_URL = 'unix:///tmp/redis.sock' | |
178 | ||
179 | #from redis_sessions.session import SessionStore | |
180 | ||
181 | # redis_session = SessionStore() | |
182 | # server = redis_session.server | |
183 | # | |
184 | # host = server.connection_pool.connection_kwargs.get('host') | |
185 | # port = server.connection_pool.connection_kwargs.get('port') | |
186 | # db = server.connection_pool.connection_kwargs.get('db') | |
187 | # | |
188 | # eq_(host, 'localhost') | |
189 | # eq_(port, 6379) | |
190 | # eq_(db, 0) | |
191 | ||
192 | # def test_load(): | |
193 | # redis_session.set_expiry(60) | |
194 | # redis_session['item1'], redis_session['item2'] = 1,2 | |
195 | # redis_session.save() | |
196 | # session_data = redis_session.server.get(redis_session.session_key) | |
197 | # expiry, data = int(session_data[:15]), session_data[15:] |
Binary diff not shown