{ "info": { "author": "Stefan Liu", "author_email": "stefanliu@outlook.com", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Topic :: Internet :: WWW/HTTP :: Session" ], "description": "# redis-session\nWeb session implementation with redis store\n\n[![PYPI Version][pypi-image]][pypi-url]\n[![Build Status][travis-image]][travis-url]\n\n\n## Description\nImplementated for python3 web frameworks to handle client sessions(Tornado and Flask are supported, other web frameworks to be supported later), using redis hashes to save session data.\n\n+ For controlling expiration of sessions, we are using redis key expiration, and we only control session expiration at server/database side, while using default expiration time of secure cookies for session ids.\n\n+ Reading session data in a request will cause a session expiration reset per request. Modify session data will cause a reset per modification.\n\n+ Please specify `cookie_secret`(`SECRET_KEY` for flask) for we are using secure cookie keys.\n\n+ Getting session attributes is achived by directly fetching from redis to avoid stale data being read. So, when it's not necessary, copy the data instead of reading again, which means:\n```\n(Example of tornado)\n# Do this\nname = self.session.name.str\nnames.append(name)\nself.session.name = make_new_name(name)\n# Instead of (When we are not worried about conflicts with other processes/threads)\nnames.append(self.session.name.str)\nself.session.name = make_new_name(self.session.name.str) # This will read name from redis again\n```\n\n\n## Setup & Install\n\n#### Via pip\n\n```\npip install redis_session\n```\n\n#### From source\n\n```\npython setup.py build && python setup.py install\n```\n\n## Session data parsing\nWe provide common redis result parsing methods. For example:\n\n```\n# Get raw bytes\nself.session.name.raw # b'stefan'\n\n# Parsing to types\nself.session.name.str # Fallback to ''\nself.session.count.int # Fallback to 0\nself.session.vip.bool # Fallback to False\nself.session.properties.json # Fallback to {}\n\n# Check if is none\nself.session.age.none\n\n```\n\n\n## Tornado\n\n+ We are using tornado.options module, so please run below once at start.\n```\ntornado.options.parse_command_line()\n# or\ntornado.options.parse_config_file(\"/etc/server.conf\")\n```\n### Command line parameters\n\n```\n# For tornado users\ndefine('session-redis', default='redis://localhost:6379', help='session store redis url', type=str)\ndefine('session-redis-prefix', help='redis key prefix', type=str)\ndefine('session-expire', help='session ttl(seconds)', type=int)\ndefine('session-cookie-id', help='cookie key, default: session-id', type=str)\ndefine('session-cookie-secure', default=True, help='if use secure session cookie', type=bool)\ndefine('session-cookie-domain', default='', help='session cookie domain', type=str)\ndefine('session-cookie-path', default='/', help='session cookie path', type=str)\ndefine('session-cookie-http-only', default=True, help='if set session cookie as http only', type=bool)\n```\n\n### Example\n\n```\n# With tornado framework\n\nimport tornado.web\nimport tornado.httpserver\nimport tornado.ioloop\nfrom tornado.options import options, define, parse_command_line\nfrom redis_session.tornado_session import SessionHandler\n\ndefine('port', default=3000, help='run on the given port', type=int)\ndefine('debug', default=False, help='run in debug mode')\n\nclass MainHandler(SessionHandler):\n def get(self):\n count = self.session.count.int\n self.write(f'Current session value of count:{count}\\n')\n self.session.count = count + 1\n self.write(f'Current session value of count:{self.session.count.int}\\n')\n\ndef main():\n parse_command_line()\n application = tornado.web.Application([(r'/', MainHandler)], cookie_secret='udxas-efasx-ase323fs-3efsxf3eFdes')\n http_server = tornado.httpserver.HTTPServer(application)\n http_server.listen(options.port)\n tornado.ioloop.IOLoop.instance().start()\n\nif __name__ == '__main__':\n main()\n```\n\n## Flask\n\nPlease note `httpOnly` for flask session cookie is not well implementated in this project yet.\n\n### Example\n```\nfrom redis_session.flask_session import setup_session\nfrom flask import Flask, request\n\napp = Flask(__name__)\n\n@app.route('/')\ndef handle():\n count = request.session.count.int\n res = f'Current session value of count:{count}\\n'\n request.session.count = count + 1\n res += f'Current session value:{request.session.count.int}\\n'\n return res\n\n\ndef main():\n app.config.from_mapping(\n ENV='dev',\n SECRET_KEY='demo',\n SESSION_REDIS='redis://localhost:6379',\n SESSION_REDIS_PREFIX='appName',\n SESSION_COOKIE_ID='app-session-id',\n SESSION_COOKIE_HTTP_ONLY = True,\n SESSION_COOKIE_SECURE = False,\n SESSION_COOKIE_DOMAIN = '.mydomain.com',\n SESSION_COOKIE_PATH = '/',\n SESSION_EXPIRE=60*60*24*7\n )\n setup_session(app)\n app.run(port=3000)\n\nif __name__ == \"__main__\":\n main()\n```\n\n[pypi-image]: https://img.shields.io/pypi/v/redis-session.svg\n[pypi-url]: https://pypi.org/project/redis-session/\n[travis-image]: https://img.shields.io/travis/devfans/redis-session/master.svg\n[travis-url]: https://travis-ci.org/devfans/redis-session\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/devfans/redis-session", "keywords": "redis_session tornado web cookie session redis python", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "redis-session", "package_url": "https://pypi.org/project/redis-session/", "platform": "", "project_url": "https://pypi.org/project/redis-session/", "project_urls": { "Homepage": "http://github.com/devfans/redis-session" }, "release_url": "https://pypi.org/project/redis-session/0.2.1/", "requires_dist": [ "redis" ], "requires_python": "", "summary": "Simple session implementation for python3 web frameworks", "version": "0.2.1" }, "last_serial": 4335791, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "6b31774d4c9abd25659fc523753d9e9d", "sha256": "cdec6e5f452feb8ee4af9eaa306ea495feb2c831ca1d550aacd38a21b83d9c4f" }, "downloads": -1, "filename": "redis_session-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "6b31774d4c9abd25659fc523753d9e9d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 3896, "upload_time": "2018-08-14T09:45:40", "url": "https://files.pythonhosted.org/packages/64/4c/d54ebe8d2c91ae1c0f3a5c2d44cf904ee6b4bf2ace515c6c666eace9f469/redis_session-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "aa8d6c95f4358a107d3e308245cf0d26", "sha256": "9fb9f8a2b28d59907db2c30346a457c19abbaa787694a9941ed80ea61d3137e0" }, "downloads": -1, "filename": "redis_session-0.0.1.tar.gz", "has_sig": false, "md5_digest": "aa8d6c95f4358a107d3e308245cf0d26", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3535, "upload_time": "2018-08-14T09:45:41", "url": "https://files.pythonhosted.org/packages/e7/89/44f41972d53ca19c4254a0d5d75973254ec95b94a45e236bebbd047d7480/redis_session-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "99d7303d49bfd720737519d23d251e3a", "sha256": "e40c7021d9e48122ecd23b4fd2306abbf4ee3410a392875dd85ad231754b8169" }, "downloads": -1, "filename": "redis_session-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "99d7303d49bfd720737519d23d251e3a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 3881, "upload_time": "2018-08-14T11:02:22", "url": "https://files.pythonhosted.org/packages/5d/d3/6afabee0a2181d7601355de73e8029bddefad87972cf73e8bb3866ad4c04/redis_session-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "30a96199671016a205015a73000a8f52", "sha256": "019004d07d78383a8d0bf6fb8004d84cdba6e58be85631b77be41e3864ab7ada" }, "downloads": -1, "filename": "redis_session-0.0.2.tar.gz", "has_sig": false, "md5_digest": "30a96199671016a205015a73000a8f52", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4075, "upload_time": "2018-08-14T11:02:24", "url": "https://files.pythonhosted.org/packages/46/a7/5af64460f92ad43e2106a0ed9f640dc441cbcaa2e653d8ad19441df698fd/redis_session-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "54defacb8a7a716e925d36ba63ea8834", "sha256": "08eda396d61fe1e8c00c94f2bdf9e75be3bfb0bf406b9efd1c512a8da4e12aef" }, "downloads": -1, "filename": "redis_session-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "54defacb8a7a716e925d36ba63ea8834", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5234, "upload_time": "2018-08-14T11:06:48", "url": "https://files.pythonhosted.org/packages/23/98/2ee4eefc19f4d29b1fa8d6024a88a9303b3c622b4fd5fcd1ac01ed8337c6/redis_session-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4451282a58444d87c8595b996b268149", "sha256": "2b4a615dab470410e304e1bc8ad92127cc5ce53e23ceb3e9b15f66261e2274ca" }, "downloads": -1, "filename": "redis_session-0.0.3.tar.gz", "has_sig": false, "md5_digest": "4451282a58444d87c8595b996b268149", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4517, "upload_time": "2018-08-14T11:06:49", "url": "https://files.pythonhosted.org/packages/dc/ae/c32d354c5a4b1878a2cc76ac2f4466be4bc0d6ab3842dd39bcf6ba2baf0b/redis_session-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "c51ed57916a8840d11cef01ee9bcd4f5", "sha256": "b0f5541ef36f43e270f289fa07421d5c3bb970a39199c6b00d51fbdb55bd87c9" }, "downloads": -1, "filename": "redis_session-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "c51ed57916a8840d11cef01ee9bcd4f5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5257, "upload_time": "2018-08-14T11:14:12", "url": "https://files.pythonhosted.org/packages/65/88/a3ffac9379e367543e211dd3a13585db4aa7637d20d74e9538b9af561921/redis_session-0.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "996a9601c53ccda31302664c63b0f0b2", "sha256": "56e10fea624a5c1443b9ffd84900731cf4ee9bef0a71c7e5f2cc00b45dd4eba0" }, "downloads": -1, "filename": "redis_session-0.0.4.tar.gz", "has_sig": false, "md5_digest": "996a9601c53ccda31302664c63b0f0b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4585, "upload_time": "2018-08-14T11:14:13", "url": "https://files.pythonhosted.org/packages/32/31/f917802e827b4a1896eff302b0ac44a504cb9e7623ac362f2209e9a7647c/redis_session-0.0.4.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "dba68a3f6cb3fbbc92f083f5b84c259c", "sha256": "596debcad94451f4e92bc53bf56b74027ef1229d69698dbadbdd18824c3d6388" }, "downloads": -1, "filename": "redis_session-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "dba68a3f6cb3fbbc92f083f5b84c259c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7137, "upload_time": "2018-08-15T08:35:55", "url": "https://files.pythonhosted.org/packages/1e/85/485bb366d3c03809a9161ab23a57db943f8b54009b15c03e91bd923baa7f/redis_session-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7cc8dabbf5fd79334a480f0568fbc04b", "sha256": "11c4315066a2b0de98727dfd105b9fde53090cc07494ece9f8a0826d93c2d9fb" }, "downloads": -1, "filename": "redis_session-0.1.0.tar.gz", "has_sig": false, "md5_digest": "7cc8dabbf5fd79334a480f0568fbc04b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5868, "upload_time": "2018-08-15T08:35:57", "url": "https://files.pythonhosted.org/packages/6a/70/6e932aba9630b17589ee9e77a81c9a10f6f39ebd045a382ba47b7de9ef4b/redis_session-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "38daaf6c3b9ffc65a36db0638a3d25ab", "sha256": "0972ae7d2404f54276f3f7f8cf7c19bf4fd22ad3be11d52ecc120d45d6995189" }, "downloads": -1, "filename": "redis_session-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "38daaf6c3b9ffc65a36db0638a3d25ab", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7249, "upload_time": "2018-08-22T04:18:38", "url": "https://files.pythonhosted.org/packages/81/ce/30ff6270d45832c1fb931fac0394e39bbb015b855855f4e400c7b11c8e32/redis_session-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3eee0dab92aaa899874d842828bf701e", "sha256": "1cbe2d283758fda113f13d79d70e14761490a9787abb3fcb839ab317571cb9ee" }, "downloads": -1, "filename": "redis_session-0.2.0.tar.gz", "has_sig": false, "md5_digest": "3eee0dab92aaa899874d842828bf701e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5968, "upload_time": "2018-08-22T04:18:40", "url": "https://files.pythonhosted.org/packages/76/09/99fcd9382f2dd25c5dd98f213f8cefc3607df55779ee126a06fd4132f682/redis_session-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "17fb1d168e69e1d87ba87612e758ac9a", "sha256": "1993838700c632a5b250d2e4f652389af3cfc30e681cc4104a43e351f61351b4" }, "downloads": -1, "filename": "redis_session-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "17fb1d168e69e1d87ba87612e758ac9a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7456, "upload_time": "2018-10-03T08:55:51", "url": "https://files.pythonhosted.org/packages/95/8c/f23541199a0c752fdb56a87ee7260dfc66d8fa3c408a9089f1e19a9e50a3/redis_session-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7165893bb5156836dbd95b85b5f0e167", "sha256": "d84d93d6ea26b1f61c84d007fcff79137939d066a32e2b63070d74344c8423be" }, "downloads": -1, "filename": "redis_session-0.2.1.tar.gz", "has_sig": false, "md5_digest": "7165893bb5156836dbd95b85b5f0e167", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6147, "upload_time": "2018-10-03T08:55:54", "url": "https://files.pythonhosted.org/packages/eb/f6/f099cf9f6087fa8604f81c900e1492b13d954a50403a58fcecf43fe90214/redis_session-0.2.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "17fb1d168e69e1d87ba87612e758ac9a", "sha256": "1993838700c632a5b250d2e4f652389af3cfc30e681cc4104a43e351f61351b4" }, "downloads": -1, "filename": "redis_session-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "17fb1d168e69e1d87ba87612e758ac9a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7456, "upload_time": "2018-10-03T08:55:51", "url": "https://files.pythonhosted.org/packages/95/8c/f23541199a0c752fdb56a87ee7260dfc66d8fa3c408a9089f1e19a9e50a3/redis_session-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7165893bb5156836dbd95b85b5f0e167", "sha256": "d84d93d6ea26b1f61c84d007fcff79137939d066a32e2b63070d74344c8423be" }, "downloads": -1, "filename": "redis_session-0.2.1.tar.gz", "has_sig": false, "md5_digest": "7165893bb5156836dbd95b85b5f0e167", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6147, "upload_time": "2018-10-03T08:55:54", "url": "https://files.pythonhosted.org/packages/eb/f6/f099cf9f6087fa8604f81c900e1492b13d954a50403a58fcecf43fe90214/redis_session-0.2.1.tar.gz" } ] }