{ "info": { "author": "Omar Ryhan", "author_email": "omarryhan@gmail.com", "bugtrack_url": null, "classifiers": [ "Operating System :: OS Independent", "Programming Language :: Python :: 3.7" ], "description": "

\n \"Logo\"\n

\n \"Software\n \"Build\n \"Code\n \"Downloads\"\n \"Monthly\n

\n

\n\n# Sanic Cookies\n\nMuch of the code here is borrowed from [sanic_session](https://github.com/xen/sanic_session).\n\nI wanted to make some changes that would break a big part of `sanic_session`'s API, so I decided to create this repo instead.\n\nSanic cookies supports both client side and server side cookies.\n\n## Main deviations from sanic_session are\n\n1. Interfaces are only responsible for reading/writing the `session_dict`. Session management logic is handled by the session object\n2. No race conditions:\n\nBy using:\n\n```python 3.7\nasync with request['session']:\n request['session']['foo'] = 'bar'\n```\n\ninstead of:\n\n```python 3.7\nrequest['session']['foo'] = 'bar'\n```\n\nIt is still however possible to use the `session_dict` without a context manager, but it will raise some warnings,\nunless it's explicitly turned off (warn_lock=False)\n\n3. A more simple implementation of SessionDict that helps me sleep in peace at night. (Probably less performant)\n4. In memory interface schedules cleanup to avoid running out of memory\n5. Encrypted client side cookies interface\n6. Ability to add more than one interface to the same session\n7. Authenticated Session implementation\n\n## Setup \u2699\ufe0f\n\n```bash\n$ pip install sanic_cookies\n```\n\n## Quick Start\n\n```python 3.7\nfrom sanic_cookies import Session, InMemory\nfrom sanic import Sanic\n\napp = Sanic()\nSession(app, master_interface=InMemory())\n\n@app.route('/')\nasync def handler(request):\n async with request['session'] as sess:\n sess['foo'] = 'bar'\n```\n\n## Usage\n\n### Running multiple interfaces\n\n```python 3.7\nfrom sanic_cookies import Session, InMemory, Aioredis\nfrom sanic import Sanic\n\ninmem = InMemory()\naioredis = AioRedis(aioredis_pool_instance)\napp = Sanic()\nsess = Session(app, master_interface=inmem, session_name='my_1st_sess')\nsess.add_interface(aioredis)\n\n@app.route('/')\nasync def index(request):\n async with request['my_1st_session'] as sess:\n sess['foo'] = 'bar'\n # At this point 'foo' = 'bar' is written both to the inmemory\n # interface and the aioredis interface\n\n async with request['my_1st_session'] as sess:\n # When reading, your session will always read from the \"master_interface\"\n # In that case it's the inmem interface\n assert sess['foo'] == 'bar'\n # Such pattern can be useful in many cases \n # e.g. you want to share your session information with an analytics team\n```\n\n### Running multiple sessions\n\n```python 3.7\nfrom sanic_cookies import Session, AuthSession, InMemory, InCookieEncrypted, AioRedis\nfrom sanic import Sanic\n\ninmem = InMemory()\naioredis = Aioredis(aioredis_pool_instance)\nincookie = InCookieEncrypted(b'fernetsecretkey')\n\napp = Sanic()\n\nincookie_session = Session(\n app,\n master_interface=incookie,\n session_name='incookiesess',\n cookie_name='INCOOKIE'\n)\n\ngeneric_session = Session(\n app,\n master_interface=inmem,\n session_name='session',\n cookie_name='SESSION'\n)\n\nauth_session = AuthSession(\n app,\n master_interface=aioredis,\n session_name='auth_session',\n cookie_name='SECURE_SESSION'\n)\n\n# for production (HTTPs) set `secure=True` in your auth_session,\n# but this will fail in local development\n\n@app.route('/')\nasync def index(request):\n async with request['incookie_session'] as sess:\n sess['foo'] = 'bar'\n\n async with request['session'] as sess:\n sess['bar'] = 'baz'\n\n async with request['auth_session'] as sess:\n sess['baz'] = 'foo'\n```\n\n### AuthSession\n\nFollowing up on the previous example:\n\n```python 3.7\nfrom sanic_cookies import login_required\n\n@app.route('/login')\nasync def login(request):\n # 1. User verification logic\n\n # both will work (Whatever is json serializble will)\n # If you want to pickle an object simply change the default\n # encoder&decoder in the interfaces plugged in to your AuthSession\n authorized_user = 123 \n authorized_user = {'user_id': 123, 'email': 'foo@bar.baz'}\n\n # 2. Login user\n\n # Here we access the session object\n # (not the session dict that is accessible from the request) from the app\n await request.app.exts.auth_session.login_user(request, authorized_user)\n\n # 3. Use the session dict safely and exclusively for the logged in user\n\n async with request['auth_session'] as sess:\n sess['foo'] = 'bar'\n current_user = sess['current_user']\n assert current_user == await request.app.exts.auth_session.current_user()\n\n@app.route('/logout')\nasync def logout(request):\n async with request['auth_session'] as sess:\n assert sess['foo'] == 'bar' # From before\n\n await request.app.exts.auth_session.logout_user(request) # Resets the session\n\n async with request['auth_session'] as sess:\n assert sess.get('foo') is None # should never fail\n assert sess.get('current_user') is None # should never fail\n\n@app.route('/protected')\n@login_required()\nasync def protected(request):\n assert await request.app.exts.auth_session.current_user() is not None # should never fail\n```\n\n## Interfaces available\n\n1. In memory\n\n ``` python 3.7\n from sanic_cookies import Session, InMemory\n from sanic import Sanic\n\n interface = InMemory()\n app = Sanic()\n Session(app, master_interface=interface)\n\n # You can skip this part if you don't want scheduled interface cleanup\n @app.listener('before_server_start')\n def init_inmemory(app, loop):\n interface.init()\n @app.listener('after_server_stop')\n def kill_inmemory(app, loop):\n interface.kill()\n\n @app.route('/')\n async def handler(request):\n async with request['session'] as sess:\n sess['foo'] = 'bar'\n ```\n\n2. Aioredis\n\n ```python 3.7\n from aioredis import Aioredis\n from sanic_cookies import Aioredis as AioredisInterface\n from sanic import Sanic\n\n app = Sanic()\n aioredis_pool_instance = Aioredis()\n aioredis = AioredisInterface(aioredis_pool_instance)\n Session(app, master_interface=interface)\n\n @app.route('/')\n async def handler(request):\n async with request['session'] as sess:\n sess['foo'] = 'bar'\n ```\n\n3. Encrypted in-cookie (using the amazing cryptography.Fernet library)\n\n i. Open a Python terminal and generate a new Fernet key:\n\n ```python 3.7\n >>> from cryptography.fernet import Fernet\n\n >>> SESSION_KEY = Fernet.generate_key()\n\n >>> print(SESSION_KEY)\n\n b'copy me to your sanic app and keep me really secure'\n ```\n\n ii. Write your app\n\n ```python 3.7\n from sanic import Sanic\n from sanic_cookies import Session, InCookieEncrypted\n\n app = Sanic()\n app.config.SESSION_KEY = SESSION_KEY\n\n Session(\n app,\n master_interface=InCookieEncrypted(app.config.SESSION_KEY),\n )\n\n @app.route('/')\n async def handler(request):\n async with request['session'] as sess:\n sess['foo'] = 'bar'\n ```\n\n4. Gino-AsyncPG (Postgres 9.5+):\n\n i. Manually create a table:\n\n ```sql\n CREATE TABLE IF NOT EXISTS sessions\n (\n created_at timestamp without time zone NOT NULL,\n expires_at timestamp without time zone,\n sid character varying,\n val character varying,\n CONSTRAINT sessions_pkey PRIMARY KEY (sid)\n );\n ```\n\n ii. Add the interface:\n\n ```python 3.7\n from sanic import Sanic\n from gino.ext.sanic import Gino\n from sanic_cookies import GinoAsyncPG\n\n from something_secure import DB_SETTINGS\n\n app = Sanic()\n app.config.update(DB_SETTINGS)\n db = Gino()\n db.init_app(app)\n\n interface = GinoAsyncPG(client=db)\n auth_session = AuthSession(app, master_interface=interface)\n\n if __name__ == '__main__':\n app.run(host='127.0.0.1', port='8080')\n ```\n\n## Sessions available\n\n1. Session (A generic session interface)\n2. AuthSession (A session interface with login_user, logout_user, current_user logic)\n\n## Other pluggable parts\n\n1. Encoders and Decoders (Default to ujson)\n2. SID factory (Default to uuid.uuid4)\n3. Session dict implementation\n\n## Contact \ud83d\udce7\n\nI currently work as a freelance software devloper. Like my work and got a gig for me?\n\nWant to hire me fulltime? Send me an email @ omarryhan@gmail.com\n\n## Buy me a coffee \u2615\n\n**Bitcoin:** 3NmywNKr1Lzo8gyNXFUnzvboziACpEa31z\n\n**Ethereum:** 0x1E1400C31Cd813685FE0f6D29E0F91c1Da4675aE\n\n**Bitcoin Cash:** qqzn7rsav6hr3zqcp4829s48hvsvjat4zq7j42wkxd\n\n**Litecoin:** MB5M3cE3jE4E8NwGCWoFjLvGqjDqPyyEJp\n\n**Paypal:** https://paypal.me/omarryhan", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/omarryhan/sanic-cookies", "keywords": "", "license": "GNU", "maintainer": "", "maintainer_email": "", "name": "sanic-cookies", "package_url": "https://pypi.org/project/sanic-cookies/", "platform": "", "project_url": "https://pypi.org/project/sanic-cookies/", "project_urls": { "Homepage": "https://github.com/omarryhan/sanic-cookies" }, "release_url": "https://pypi.org/project/sanic-cookies/0.4.2/", "requires_dist": null, "requires_python": "", "summary": "Cookies and Session Management for Sanic", "version": "0.4.2" }, "last_serial": 5636121, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "92ee960e80d97a83c33a17e776ae3668", "sha256": "529621c5c50c1135413004fea780bf6ba8b3e7ce565ad68b6b8cb4772e0a128b" }, "downloads": -1, "filename": "sanic_cookies-0.1.0.tar.gz", "has_sig": false, "md5_digest": "92ee960e80d97a83c33a17e776ae3668", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6262, "upload_time": "2019-02-03T08:05:13", "url": "https://files.pythonhosted.org/packages/5d/9d/5d0f1f4c4e785ec402649842bb29295172dd44ee07292db0249ff22a6b51/sanic_cookies-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "746c4abe571883aef3422823d92bb140", "sha256": "02d43b6b2cbe5e90cbb1a970c03e06831aef5980935903e9738e2ddfbc8d887f" }, "downloads": -1, "filename": "sanic_cookies-0.1.1.tar.gz", "has_sig": false, "md5_digest": "746c4abe571883aef3422823d92bb140", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8515, "upload_time": "2019-02-04T06:55:28", "url": "https://files.pythonhosted.org/packages/45/59/c1a6b1b8e4a4a0a93c9b5a8afea737b54c01d3bcb9a96ff460fcde1c2bca/sanic_cookies-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "6c874b18205b4cd82cc0559e742dd3fa", "sha256": "998dc7769246525949f4cec3ee9a23ce33a60edf2f59b6d97b3bffa805b95f86" }, "downloads": -1, "filename": "sanic_cookies-0.1.2.tar.gz", "has_sig": false, "md5_digest": "6c874b18205b4cd82cc0559e742dd3fa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9469, "upload_time": "2019-02-04T16:10:49", "url": "https://files.pythonhosted.org/packages/b0/d3/882cbbbe38cd9fc3442784274a42a60f955df7e6ae1a0d0acfee1a0de5e5/sanic_cookies-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "8cacb9d113c7d62fd676d066e6e59a85", "sha256": "929cdd21d4aadea2d9c2b48ef2e7efd02728fdbc1344ad823fff20546fc694a1" }, "downloads": -1, "filename": "sanic_cookies-0.1.3.tar.gz", "has_sig": false, "md5_digest": "8cacb9d113c7d62fd676d066e6e59a85", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9395, "upload_time": "2019-02-04T16:18:49", "url": "https://files.pythonhosted.org/packages/4d/6e/22e728d8a150cf25897f6e268b6bcfa7cb04525acd1451f16e9624c8364f/sanic_cookies-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "0ffe0dac8e368360a8bfea47cd64c3c9", "sha256": "13120eb847399d5ae9827dbea922af12469760a0e1a93f5234fd3189c209c578" }, "downloads": -1, "filename": "sanic_cookies-0.1.4.tar.gz", "has_sig": false, "md5_digest": "0ffe0dac8e368360a8bfea47cd64c3c9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9335, "upload_time": "2019-02-04T16:37:08", "url": "https://files.pythonhosted.org/packages/c8/f8/4600a5ac236a06586f5b432b1ce22c191e7551ce8f4f96f9f7415de0d188/sanic_cookies-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "56fbdfdedb1c43b5dc75b809384cb7aa", "sha256": "b39121fe04335701dab49e32a22c63885ccf74a9a9726b9ab721b5fff129088a" }, "downloads": -1, "filename": "sanic_cookies-0.1.5.tar.gz", "has_sig": false, "md5_digest": "56fbdfdedb1c43b5dc75b809384cb7aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9722, "upload_time": "2019-02-04T19:17:46", "url": "https://files.pythonhosted.org/packages/87/25/b9a3d7cbd77b879c6efe912cf1a173dbaf96e59001b5fe7a68c9ba257d6b/sanic_cookies-0.1.5.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "c23c60e9967ebcae9089e711fe3177a9", "sha256": "a66c3c058a5e413894c993915552906f8fdda0724ba8fa85cd32368f7963e048" }, "downloads": -1, "filename": "sanic_cookies-0.2.0.tar.gz", "has_sig": false, "md5_digest": "c23c60e9967ebcae9089e711fe3177a9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11219, "upload_time": "2019-02-05T09:58:49", "url": "https://files.pythonhosted.org/packages/6a/2c/7c2a10600596302e6bbbfd67da6a43dc99c0c666cec6b157dfc28ec15414/sanic_cookies-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "f602f9ec96bd66eb64a11b8486b52083", "sha256": "053b07d9027daaf8b35fba72afa3073820bfe20e8ce6503a2c7cc8d3f4d95ec1" }, "downloads": -1, "filename": "sanic_cookies-0.2.1.tar.gz", "has_sig": false, "md5_digest": "f602f9ec96bd66eb64a11b8486b52083", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11328, "upload_time": "2019-02-05T10:51:11", "url": "https://files.pythonhosted.org/packages/ac/03/cec00751615235644b9a4280e1d0ace3428e76ab1ab4070b0b23e018f026/sanic_cookies-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "9300c94d2d346820a4ede099df9f4d17", "sha256": "d4ca90c72bef434559c6de912ece2b3c727a4aee9b1a94b0fa4311f0833398ce" }, "downloads": -1, "filename": "sanic_cookies-0.2.2.tar.gz", "has_sig": false, "md5_digest": "9300c94d2d346820a4ede099df9f4d17", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11298, "upload_time": "2019-02-05T13:17:53", "url": "https://files.pythonhosted.org/packages/fc/28/45ef359ee7efc50d8169d64321a7d7e7069af864a119f396652758aedaaf/sanic_cookies-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "154d28108a606f44552c328576b8fc3a", "sha256": "e05076cefa1c52c9515f6ec8ea1313e3fd5f712b054d2897d9099d4ce6932237" }, "downloads": -1, "filename": "sanic_cookies-0.2.3.tar.gz", "has_sig": false, "md5_digest": "154d28108a606f44552c328576b8fc3a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11297, "upload_time": "2019-02-05T14:05:36", "url": "https://files.pythonhosted.org/packages/0f/e4/a12f4d0ce5baa44fc70098f2cf7648269f8e03e39bd1e1cf0687598afc05/sanic_cookies-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "176968e8f091a607c5d8e1bc5d40f481", "sha256": "60e5cdf7954ac8d16a92fb8f59eba6c15446bc0b1f6f928f9a8a9867e40f2739" }, "downloads": -1, "filename": "sanic_cookies-0.2.4.tar.gz", "has_sig": false, "md5_digest": "176968e8f091a607c5d8e1bc5d40f481", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11299, "upload_time": "2019-02-05T19:03:21", "url": "https://files.pythonhosted.org/packages/2c/7f/75df792f1df3208c48653f5c9ebf1199ed06dcede510335f775596938ddf/sanic_cookies-0.2.4.tar.gz" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "9e39d42470330325a36082a6ad184794", "sha256": "692249e11ceb037756c482e6a9a25fbf39ac19d1a8e8b6cdde346f26b479dd97" }, "downloads": -1, "filename": "sanic_cookies-0.2.5.tar.gz", "has_sig": false, "md5_digest": "9e39d42470330325a36082a6ad184794", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11461, "upload_time": "2019-02-06T07:03:20", "url": "https://files.pythonhosted.org/packages/96/3c/448af07877979592e2a0a2d7d631fcd59d0cb6a7b53a975b14f00ea443f9/sanic_cookies-0.2.5.tar.gz" } ], "0.2.6": [ { "comment_text": "", "digests": { "md5": "09c8d360c2f2639982a7f2f54ae76283", "sha256": "18f5b2da9fab3882babcd402e5a7c5cfc7fa17a3cf59c5039e8ec02cb7fe71dc" }, "downloads": -1, "filename": "sanic_cookies-0.2.6.tar.gz", "has_sig": false, "md5_digest": "09c8d360c2f2639982a7f2f54ae76283", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13731, "upload_time": "2019-02-07T11:38:56", "url": "https://files.pythonhosted.org/packages/13/c3/b702efa7eec686b503318918c2919676d36dad472b07edfd2223a2ad5aea/sanic_cookies-0.2.6.tar.gz" } ], "0.2.7": [ { "comment_text": "", "digests": { "md5": "b2edb8dbb9a2bed38d9cd3132d21dfaf", "sha256": "1e93dce624393c39dc4bcd38dfd9172d9853e457574a0d0777f6ed7aaf45e9fa" }, "downloads": -1, "filename": "sanic_cookies-0.2.7.tar.gz", "has_sig": false, "md5_digest": "b2edb8dbb9a2bed38d9cd3132d21dfaf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13947, "upload_time": "2019-02-08T10:24:18", "url": "https://files.pythonhosted.org/packages/9d/79/6af4568540c5b3633cb7f5122c7aa606661f7d9b65c1dc0521a1ce3215b6/sanic_cookies-0.2.7.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "c3900cd05baf717e79f801993e73909c", "sha256": "c33867acaafccc79279968e825048fd46053abd787802f62f061cb98943211a2" }, "downloads": -1, "filename": "sanic_cookies-0.3.0.tar.gz", "has_sig": false, "md5_digest": "c3900cd05baf717e79f801993e73909c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14585, "upload_time": "2019-02-09T09:39:34", "url": "https://files.pythonhosted.org/packages/7a/6a/62a6f4bc0f1260dbdee9bea5dc01f2dd9b7f03a70ea37e0cb0a4b59e51ae/sanic_cookies-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "5924ab27c680ca823d486f3803ccff32", "sha256": "1ad0412ea473b2baf617a22760111e6d08e06e70b5a391d57bc6b6e33c564e14" }, "downloads": -1, "filename": "sanic_cookies-0.3.1.tar.gz", "has_sig": false, "md5_digest": "5924ab27c680ca823d486f3803ccff32", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14576, "upload_time": "2019-02-11T12:23:20", "url": "https://files.pythonhosted.org/packages/40/65/0b168ba8db6ec2e30df51906962ee3732a3df7adf83cd5ac4ac870a9de87/sanic_cookies-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "3b273e7dc13db547e1076fa440f7d3c1", "sha256": "1804910255733bd0604b7b80284f518fd50db9fa18a6eb01bf3bd34822d8534a" }, "downloads": -1, "filename": "sanic_cookies-0.3.2.tar.gz", "has_sig": false, "md5_digest": "3b273e7dc13db547e1076fa440f7d3c1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15121, "upload_time": "2019-02-19T13:46:38", "url": "https://files.pythonhosted.org/packages/f1/56/b56438228efce438c4d503c44afdcfde823ec8f66d2bb8e028c3e55bafc2/sanic_cookies-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "f6b70669d867cc4e0fa2136364daf839", "sha256": "2f9cc7e3add716ca5ccd59e3bff7ce80275e3c7ff5dbbd8e3e3805a27bd87c7e" }, "downloads": -1, "filename": "sanic_cookies-0.3.3.tar.gz", "has_sig": false, "md5_digest": "f6b70669d867cc4e0fa2136364daf839", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15177, "upload_time": "2019-02-19T15:36:15", "url": "https://files.pythonhosted.org/packages/92/69/fb85f361a19faf2b087404ba1257a0100c7283e06b51cfc19483613551ad/sanic_cookies-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "5108ed7b4fe5b73bfa2e189786369b5d", "sha256": "6cdcec509a43bf0709e644671cff5efb94e13a22b759783fcc285b11b91947ec" }, "downloads": -1, "filename": "sanic_cookies-0.3.4.tar.gz", "has_sig": false, "md5_digest": "5108ed7b4fe5b73bfa2e189786369b5d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15265, "upload_time": "2019-02-19T16:34:13", "url": "https://files.pythonhosted.org/packages/b7/eb/87cebc2eafecbee342bdc06d9cb616064fe32935e45012418bfc27659a5e/sanic_cookies-0.3.4.tar.gz" } ], "0.3.5": [ { "comment_text": "", "digests": { "md5": "8012bb2569b1c7c55effa02543061667", "sha256": "febe825a54312a28869970b547538e314cb6ef5ad98f5dc8d1103decb79c5eed" }, "downloads": -1, "filename": "sanic_cookies-0.3.5.tar.gz", "has_sig": false, "md5_digest": "8012bb2569b1c7c55effa02543061667", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15275, "upload_time": "2019-02-19T23:04:12", "url": "https://files.pythonhosted.org/packages/b9/35/d9ed65a444bf58616d01ea10b7d5ac64c25c81eb9e3f953ed5cf0513b2f6/sanic_cookies-0.3.5.tar.gz" } ], "0.3.6": [ { "comment_text": "", "digests": { "md5": "4d7f1d8d3bc5e35e0d9903a7b7c85472", "sha256": "a6f82e9ac79b895cf02a160748139df5436851deebda1c46214cac1e900176f3" }, "downloads": -1, "filename": "sanic_cookies-0.3.6.tar.gz", "has_sig": false, "md5_digest": "4d7f1d8d3bc5e35e0d9903a7b7c85472", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15273, "upload_time": "2019-02-24T20:09:45", "url": "https://files.pythonhosted.org/packages/44/56/39a9c6cb81b8955d27ea8374bd8d9a74262e87a7db420380e16a10a653c7/sanic_cookies-0.3.6.tar.gz" } ], "0.3.7": [ { "comment_text": "", "digests": { "md5": "8722464438f26ed52bc8de01b7c9647c", "sha256": "255ec00f166691c408a0a6351d22f288ebe5fbef89e060dcc259deab39956b82" }, "downloads": -1, "filename": "sanic_cookies-0.3.7.tar.gz", "has_sig": false, "md5_digest": "8722464438f26ed52bc8de01b7c9647c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15298, "upload_time": "2019-02-26T23:39:15", "url": "https://files.pythonhosted.org/packages/75/a9/0cef1afa4d733d95dd98415272f073e07bf5677b77bab0278099007b27a3/sanic_cookies-0.3.7.tar.gz" } ], "0.3.8": [ { "comment_text": "", "digests": { "md5": "42d59339d98bb68b1d7d10ec98eea95d", "sha256": "398e421b7930917411729c8719fa839cf23249778102345f8c7177aa7fd0f715" }, "downloads": -1, "filename": "sanic_cookies-0.3.8.tar.gz", "has_sig": false, "md5_digest": "42d59339d98bb68b1d7d10ec98eea95d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15334, "upload_time": "2019-03-24T00:55:04", "url": "https://files.pythonhosted.org/packages/b1/3b/5189490e10ecfec2057ceaf56b7f3debff33de84a6901d8b668028b4a018/sanic_cookies-0.3.8.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "998e59c018b5153489dfafb34782bf9b", "sha256": "480a4ac7f154f3466acd533b4b609e90168dbe00647134fea97d70d0bd939bd7" }, "downloads": -1, "filename": "sanic_cookies-0.4.0.tar.gz", "has_sig": false, "md5_digest": "998e59c018b5153489dfafb34782bf9b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17370, "upload_time": "2019-05-02T20:56:20", "url": "https://files.pythonhosted.org/packages/8b/ac/853f56d2bafb46e00d58e501f3aced989f655ac2bc0b9bef4e0cc25ff7e5/sanic_cookies-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "41c75c9de769df9c3677b9a2816b69c0", "sha256": "f5c1f534bc3b8a796ba43aa3b74ac5d77935f8eb1db1c0b514d9e84b0fab5153" }, "downloads": -1, "filename": "sanic_cookies-0.4.1.tar.gz", "has_sig": false, "md5_digest": "41c75c9de769df9c3677b9a2816b69c0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18160, "upload_time": "2019-06-05T14:04:12", "url": "https://files.pythonhosted.org/packages/a9/4b/abda29f1c805f8b34e77830227ea58cb4fe00dd1efc95876800bebc8a2ee/sanic_cookies-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "dbbef9abbc0481706a3b05dc0a6c718c", "sha256": "a06a5da2f2d762d7e9da6f8753696efbb318bae766e5e8a9f078a3af87a37350" }, "downloads": -1, "filename": "sanic_cookies-0.4.2.tar.gz", "has_sig": false, "md5_digest": "dbbef9abbc0481706a3b05dc0a6c718c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18224, "upload_time": "2019-08-05T19:59:41", "url": "https://files.pythonhosted.org/packages/64/72/4bd0006edb6443ecca75bbc6cecb6054bee9b857d6da113bb1654fef92de/sanic_cookies-0.4.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "dbbef9abbc0481706a3b05dc0a6c718c", "sha256": "a06a5da2f2d762d7e9da6f8753696efbb318bae766e5e8a9f078a3af87a37350" }, "downloads": -1, "filename": "sanic_cookies-0.4.2.tar.gz", "has_sig": false, "md5_digest": "dbbef9abbc0481706a3b05dc0a6c718c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18224, "upload_time": "2019-08-05T19:59:41", "url": "https://files.pythonhosted.org/packages/64/72/4bd0006edb6443ecca75bbc6cecb6054bee9b857d6da113bb1654fef92de/sanic_cookies-0.4.2.tar.gz" } ] }