{ "info": { "author": "hsz", "author_email": "hsz1273327@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Documentation :: Sphinx" ], "description": "\r\nsanic-aredis\r\n===============================\r\n\r\nversion: 0.0.6\r\n\r\nauthor: hsz\r\n\r\nemail: hsz1273327@gmail.com\r\n\r\nFeature\r\n----------------------\r\n* \u4f7f\u7528python\u7684\u539f\u751f\u534f\u7a0b\r\n* \u4f7f\u7528aredis\u8bbf\u95eeredis,\u4e0earedis\u63a5\u53e3\u57fa\u672c\u4e00\u81f4\r\n* \u652f\u6301\u591adb\u591auri,\u4e00\u4e2a\u5e94\u7528\u5f80\u5f80\u4f7f\u7528\u4e0d\u6b62\u4e00\u4e2a\u6570\u636e\u5e93\r\n* \u652f\u6301session,sanic\u4e00\u822c\u90fd\u4f1a\u7528\u591a\u4e2aworker\u8fd0\u884c,\u56e0\u6b64\u57fa\u4e8e\u5185\u5b58\u7684session\u57fa\u672c\u662f\u884c\u4e0d\u901a\u7684.redis\u521a\u597d\u53ef\u4ee5\u7528\u6765\u5b58session\r\n* \u652f\u6301cache,\u7528\u6765\u7f13\u5b58\u6bd4\u8f83\u91cd\u7684\u4efb\u52a1\u7684\u7ed3\u679c,\u5982\u679c\u6211\u4eec\u6709\u7684\u4efb\u52a1\u6bd4\u8f83\u91cd,\u90a3\u4e48\u6211\u4eec\u53ef\u4ee5\u8ba9\u5b83\u81ea\u5df1\u8fd0\u7b97,\u7136\u540e\u5b58\u5728redis\u4e2d,\r\n* \u652f\u6301channel,redis\u81ea\u5e26\u53d1\u5e03\u8ba2\u9605\u6a21\u5f0f\r\n\r\n\r\nInstall\r\n--------------------------------\r\n\r\n- ``python -m pip install sanic-aredis``\r\n\r\n\r\nUsage\r\n---------------------------------\r\n\r\n\u4e0d\u540c\u7684\u529f\u80fd\u662f\u7528\u4e0d\u540c\u7c7b,\u4f46\u7528\u6cd5\u63a5\u8fd1\r\n\r\n* redis,app\u4e2d\u9700\u8981\u6709\u914d\u7f6e`REDIS_SETTINGS`,\u5b83\u5fc5\u987b\u662f\u4e00\u4e2a\u7531\u540d\u5b57,uri\u7ec4\u6210\u7684\u5b57\u5178,\u4e5f\u53ef\u4ee5\u4f7f\u7528`SetConfig(app, **confs)`\u7c7b\u65b9\u6cd5\u6765\u8bbe\u7f6e\u8be5\u53c2\u6570\r\n* session,app\u4e2d\u9700\u8981\u6709\u914d\u7f6e`REDIS_SESSION_URI`,\u5b83\u5fc5\u987b\u662f\u4e00\u4e2auri\u5b57\u7b26\u4e32,\u4e5f\u53ef\u4ee5\u4f7f\u7528`SetConfig(app, uri)`\u7c7b\u65b9\u6cd5\u6765\u8bbe\u7f6e\u8be5\u53c2\u6570\r\n* cache,app\u4e2d\u9700\u8981\u6709\u914d\u7f6e`REDIS_CACHE_SETTINGS`,\u5b83\u5fc5\u987b\u662f\u4e00\u4e2a\u7531\u540d\u5b57,uri\u7ec4\u6210\u7684\u5b57\u5178,\u4e5f\u53ef\u4ee5\u4f7f\u7528`SetConfig(app, **confs)`\u7c7b\u65b9\u6cd5\u6765\u8bbe\u7f6e\u8be5\u53c2\u6570\r\n* channel,app\u4e2d\u9700\u8981\u6709\u914d\u7f6e`REDIS_CHANNEL_SETTINGS`,\u5b83\u5fc5\u987b\u662f\u4e00\u4e2a\u7531\u540d\u5b57,(uri,ignore_subscribe_messages:bool)\u7ec4\u6210\u7684\u5b57\u5178,\u4e5f\u53ef\u4ee5\u4f7f\u7528`SetConfig(app, **confs)`\u7c7b\u65b9\u6cd5\u6765\u8bbe\u7f6e\u8be5\u53c2\u6570\r\n\r\n\u521d\u59cb\u5316\u5b8c\u6210\u540e\u5c31\u53ef\u5728app\u7684\u5bf9\u5e94\u7684\u5143\u7d20\u4e2d\u8bbf\u95ee\u5230\u4ed6\u4eec\u4e86\r\n\r\n* reids:app.redis[name]\r\n* session:app.session,\u4e5f\u53ef\u4ee5\u4f7f\u7528request['session']\u6765\u83b7\u53d6\r\n* cache:app.caches[name]\r\n* channels:app.channels[name]\r\n\r\n\r\nExample\r\n-------------------------------\r\n\r\n1. redis\r\n\r\n.. code:: python\r\n\r\n from sanic import Sanic, response\r\n from sanic.response import json\r\n # import aioredis\r\n from sanic_redis import Redis,Namespace\r\n import ujson\r\n app = Sanic('redis_test')\r\n #redis_pool = aredis.ConnectionPool(host='localhost', port=6379, db=0)\r\n Redis.SetConfig(app,test=\"redis://localhost:6379/1\")\r\n Redis(app)\r\n appspace = Namespace(app.name)\r\n\r\n @app.get(\"/test-my-key/\")\r\n async def handle(request,key):\r\n val = await request.app.redis[\"test\"].get(appspace(key))\r\n return response.text(val.decode('utf-8'))\r\n\r\n @app.post(\"/test-my-key\")\r\n async def handle(request):\r\n doc = request.json\r\n for k,v in doc.items():\r\n await request.app.redis[\"test\"].set(appspace(k), v)\r\n return json({\"result\":True})\r\n\r\n if __name__ == '__main__':\r\n app.run(host=\"0.0.0.0\", port=8000)\r\n\r\n\r\n2. session\r\n\r\n.. code:: python\r\n\r\n from sanic import Sanic, response\r\n from sanic.response import json,text\r\n # import aioredis\r\n from sanic_redis import Session\r\n import ujson\r\n app = Sanic('redis_session_test')\r\n\r\n Session.SetConfig(app,\"redis://localhost:6379/1\")\r\n Session(app)\r\n\r\n @app.route(\"/\")\r\n async def test(request):\r\n # interact with the session like a normal dict\r\n if not request['session'].get('foo'):\r\n request['session']['foo'] = 0\r\n\r\n request['session']['foo'] += 1\r\n response = text(request['session']['foo'])\r\n return response\r\n\r\n if __name__ == \"__main__\":\r\n app.run(host=\"0.0.0.0\", port=8000, debug=True)\r\n\r\n3. cache\r\n\r\n.. code:: python\r\n\r\n from sanic import Sanic, response\r\n from sanic.response import json\r\n # import aioredis\r\n from sanic_redis import Cache\r\n import time\r\n\r\n app = Sanic('redis_test')\r\n\r\n def expensive_work(data):\r\n \"\"\"some work that waits for io or occupy cpu\"\"\"\r\n time.sleep(2)\r\n return data\r\n\r\n Cache.SetConfig(app,test_cache=\"redis://localhost:6379/1\")\r\n Cache(app)\r\n\r\n\r\n @app.post(\"/test-my-key\")\r\n async def handle(request):\r\n data = request.json\r\n result = await request.app.caches[\"test_cache\"].set('example_key', expensive_work(data), data)\r\n return json({\"result\":request.app.caches[\"test_cache\"]._gen_identity('example_key', data)})\r\n\r\n @app.get(\"/test-my-key/\")\r\n async def handle(request,key):\r\n res = await request.app.caches[\"test_cache\"].get_by_key(key)\r\n return json(res)\r\n\r\n\r\n\r\n if __name__ == '__main__':\r\n app.run(host=\"0.0.0.0\", port=8000)\r\n\r\n\r\n4. channel\r\n\r\n.. code:: python\r\n\r\n from sanic import Sanic, response\r\n from sanic.response import json, text\r\n # import aioredis\r\n from sanic_redis import Broadcast\r\n import time\r\n\r\n app = Sanic('redis_channel_test')\r\n\r\n\r\n Broadcast.SetConfig(app,test_channels=(\"redis://localhost:6379/1\",True))\r\n Broadcast(app)\r\n\r\n thread = None\r\n\r\n\r\n def my_handler(x):\r\n print(\"my_handler\")\r\n print(x)\r\n\r\n\r\n @app.listener(\"before_server_start\")\r\n async def sub(app, loop):\r\n await app.channels[\"test_channels\"].subscribe(my_handler)\r\n global thread\r\n print(\"befor\")\r\n thread = app.channels[\"test_channels\"].sub_in_thread(daemon=True)\r\n @app.listener(\"before_server_stop\")\r\n async def sub_close(app, loop):\r\n global thread\r\n thread.stop()\r\n print(\"after\")\r\n\r\n @app.post(\"/test-my-key\")\r\n async def handle(request):\r\n data = request.json\r\n result = await app.channels[\"test_channels\"].publish(data[\"msg\"])\r\n return json({\"result\":'ok'})\r\n\r\n if __name__ == '__main__':\r\n app.run(host=\"0.0.0.0\", port=8000)\r\n\r\n5. \u4f7f\u7528channel\u914d\u5408websocket\r\n\r\n\u670d\u52a1\u7aef:\r\n\r\n.. code:: python\r\n\r\n from sanic import Sanic\r\n from sanic.response import file\r\n from sanic_redis import Broadcast\r\n import asyncio\r\n import time\r\n app = Sanic(\"test_ws_channel\")\r\n Broadcast.SetConfig(app,test_channels=(\"redis://localhost:6379/1\",True))\r\n Broadcast(app)\r\n thread = None\r\n\r\n @app.listener(\"before_server_start\")\r\n async def pub(app, loop):\r\n async def publish(client):\r\n import time\r\n import asyncio\r\n while True:\r\n await asyncio.sleep(2)\r\n now = time.strftime(\"%Y-%m-%d %H:%M:%S\", time.localtime())\r\n await client.publish('test message {time}'.format(time = now))\r\n global thread\r\n thread = app.channels[\"test_channels\"].pub_in_thread(publish,daemon=True)\r\n\r\n @app.listener(\"after_server_stop\")\r\n async def pub_close(app, loop):\r\n global thread\r\n thread.stop()\r\n print(\"after\")\r\n\r\n @app.route('/')\r\n async def index(request):\r\n return await file('websocket.html')\r\n\r\n\r\n @app.websocket('/feed')\r\n async def feed(request, ws):\r\n assert app.channels[\"test_channels\"].subscribed is False\r\n await app.channels[\"test_channels\"].subscribe()\r\n\r\n while app.channels[\"test_channels\"].subscribed:\r\n data = await app.channels[\"test_channels\"].get_message()\r\n if data is not None:\r\n await ws.send(data.get(\"data\"))\r\n\r\n if __name__ == '__main__':\r\n app.run(host=\"0.0.0.0\", port=7000)\r\n\r\n\r\n\u5ba2\u6237\u7aef:\r\n\r\n.. code:: html\r\n\r\n \r\n \r\n \r\n WebSocket demo\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\nTODO\r\n-------------------------------\r\n\r\n* Queue \u4f7f\u7528list\u6784\u5efa\u961f\u5217\u7cfb\u7edf\uff0c\u4f7f\u7528sorted set\u751a\u81f3\u53ef\u4ee5\u6784\u5efa\u6709\u4f18\u5148\u7ea7\u7684\u961f\u5217\u7cfb\u7edf\u3002\r\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/Sanic-Extensions/sanic-redis", "keywords": "redis", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "sanic-aredis", "package_url": "https://pypi.org/project/sanic-aredis/", "platform": "", "project_url": "https://pypi.org/project/sanic-aredis/", "project_urls": { "Homepage": "https://github.com/Sanic-Extensions/sanic-redis" }, "release_url": "https://pypi.org/project/sanic-aredis/0.0.6/", "requires_dist": null, "requires_python": "", "summary": "simple tools", "version": "0.0.6" }, "last_serial": 3094766, "releases": { "0.0.6": [ { "comment_text": "", "digests": { "md5": "7edbd250ccd22b3659de4685b55b640a", "sha256": "19bfe33878aacd6f6fec1d2a9c36b86004414d4953ad7dc0d1b5dba7e8a40a36" }, "downloads": -1, "filename": "sanic_aredis-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "7edbd250ccd22b3659de4685b55b640a", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 13753, "upload_time": "2017-08-14T05:52:24", "url": "https://files.pythonhosted.org/packages/19/b2/b824205fbcc8a82ec34db9c510d0d26026aec8e6e2324187cd5261d886e6/sanic_aredis-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d855362f6b2421054da9da7ef3c85eed", "sha256": "de89845f0c46ea3fe34a7455f00433ab94e3931f75148bddadcdf6f01c3230f3" }, "downloads": -1, "filename": "sanic-aredis-0.0.6.tar.gz", "has_sig": false, "md5_digest": "d855362f6b2421054da9da7ef3c85eed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10148, "upload_time": "2017-08-14T05:52:20", "url": "https://files.pythonhosted.org/packages/12/0f/aac50f36227aaca3e17069967f8d9babae289c6659f58803c9dcb6faf866/sanic-aredis-0.0.6.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7edbd250ccd22b3659de4685b55b640a", "sha256": "19bfe33878aacd6f6fec1d2a9c36b86004414d4953ad7dc0d1b5dba7e8a40a36" }, "downloads": -1, "filename": "sanic_aredis-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "7edbd250ccd22b3659de4685b55b640a", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 13753, "upload_time": "2017-08-14T05:52:24", "url": "https://files.pythonhosted.org/packages/19/b2/b824205fbcc8a82ec34db9c510d0d26026aec8e6e2324187cd5261d886e6/sanic_aredis-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d855362f6b2421054da9da7ef3c85eed", "sha256": "de89845f0c46ea3fe34a7455f00433ab94e3931f75148bddadcdf6f01c3230f3" }, "downloads": -1, "filename": "sanic-aredis-0.0.6.tar.gz", "has_sig": false, "md5_digest": "d855362f6b2421054da9da7ef3c85eed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10148, "upload_time": "2017-08-14T05:52:20", "url": "https://files.pythonhosted.org/packages/12/0f/aac50f36227aaca3e17069967f8d9babae289c6659f58803c9dcb6faf866/sanic-aredis-0.0.6.tar.gz" } ] }