{ "info": { "author": "Imbolc", "author_email": "imbolc@imbolc.name", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3" ], "description": "Lesync\n======\nHttp helpers for `django-channels`\n\nHello world\n-----------\n```python\nfrom lesync import login_required\n\n@login_required\nasync def hello(request):\n return {'hello': request.user.username}\n```\n\nInstall\n-------\n\n pip install lesync\n\nAdd `ApiConsumer` into your `routing.py`:\n\n```python\nfrom django.urls import path\nfrom channels.routing import ProtocolTypeRouter, URLRouter\nfrom channels.sessions import SessionMiddlewareStack\nfrom lesync import ApiConsumer\n\napplication = ProtocolTypeRouter({\n # ... websockets or something\n 'http': SessionMiddlewareStack(\n URLRouter([\n path('/async/', ApiConsumer),\n # ... fallback to sync views\n ]),\n ),\n})\n```\n\nThat's it. Now you can add async views which will be served win `/async/` url\nprefix.\n\n\nRequest\n-------\nSubclass of `channels.http.AsgiRequest` with:\n\n- `json` attribute\n- `async load_user()` method - which returns standard django user\n- `user` attribute - it's available after calling `load_user()` of if you use\n `@login_required` or `@staff_member_required` decorators\n\n\nResponse\n--------\nIn addition to `django.http.HttpResponse`\nyou can use sugary json responses and streaming:\n\n```python\nasync def standard(request):\n return HttpResponse('hello, world')\n\nasync def json_data(request):\n return {'hello': 'world'}\n\nasync def with_status(request):\n return {'bad': 'request'}, 400\n\nasync def with_headers(request):\n return {}, 200, {'my': 'header'}\n\nasync def streaming(request):\n async def stream():\n for i in range(1, 1000):\n yield f'{i},{i**2}\\n'\n await asyncio.sleep(.1)\n return stream(), 200, {'Content-Type': 'text/csv'}\n```\n\n\nAuth\n----\nFamiliar `@login_required` and `@staff_member_required` decorators:\n\n```python\nfrom lesync import staff_member_required\n\n@staff_member_required\nasync def hello(request):\n return {'admin': request.user.username}\n```\n\n\nRequest validation\n------------------\nYou can use `@validate_query` and `@validate_json` decorators\nto validate requests data. They're using `trafaret` library to perform\nvalidation, so make sure it's installed.\n\n```python\nfrom lesync.trafaret import validate_json\n\n@validate_json({'ids': [int], 'hello?': str})\nasync def foo(request):\n return request.json\n```\n\n\nTests\n-----\n```bash\n python -m venv .venv\n source .venv/bin/activate\n pip install -Ur requirements-dev.txt\n python -m pytest tests/\n```\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": "https://github.com/imbolc/lesync", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "lesync", "package_url": "https://pypi.org/project/lesync/", "platform": "", "project_url": "https://pypi.org/project/lesync/", "project_urls": { "Homepage": "https://github.com/imbolc/lesync" }, "release_url": "https://pypi.org/project/lesync/0.3.0/", "requires_dist": [ "django", "channels" ], "requires_python": "", "summary": "Http helpers for django-channels", "version": "0.3.0" }, "last_serial": 5521886, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "3e42abf4650768632ff3408b5fe9218a", "sha256": "419ac7080ef77b6b187404675895c5956159ad1e504ef356d75acecd041b7c58" }, "downloads": -1, "filename": "lesync-0.0.1.tar.gz", "has_sig": false, "md5_digest": "3e42abf4650768632ff3408b5fe9218a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2383, "upload_time": "2018-09-09T07:52:48", "url": "https://files.pythonhosted.org/packages/bc/2b/8ab33292f1ac00eaebd1d2098276d084b4f8e0b4bd8bfcc8d59971960ca2/lesync-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "23865ac9796655ffcb57424a44e9b781", "sha256": "d2797033d2900984359f225ad08de8c2ac5bb7a94402433bfda8b254b71eda3a" }, "downloads": -1, "filename": "lesync-0.0.2.tar.gz", "has_sig": false, "md5_digest": "23865ac9796655ffcb57424a44e9b781", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3526, "upload_time": "2018-09-15T12:03:54", "url": "https://files.pythonhosted.org/packages/06/3a/0178ffd2b7f93167b8c39cb1d36ee194b1a4e94c5a17cfb95b9f076f11c4/lesync-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "4c95a8ff8938a291a8e679a1e4b42ec8", "sha256": "a3f97c0ce0d27f9e1630702767c6ed388844c75fcd26e35dadbbd53931dc0651" }, "downloads": -1, "filename": "lesync-0.0.3.tar.gz", "has_sig": false, "md5_digest": "4c95a8ff8938a291a8e679a1e4b42ec8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4295, "upload_time": "2018-09-16T08:50:56", "url": "https://files.pythonhosted.org/packages/ae/7b/3fa7630fa59cc68516d431ba73b03257838fd86eb6c4f1bc78e0edd0822d/lesync-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "fe4cf2ea85fbbfeaebf39aa5a7c60388", "sha256": "b10a9d29b8ffe29a8868dea7a4a76c9e8d71c626671f340f3cebf3f0ba0f56c9" }, "downloads": -1, "filename": "lesync-0.0.4.tar.gz", "has_sig": false, "md5_digest": "fe4cf2ea85fbbfeaebf39aa5a7c60388", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4350, "upload_time": "2018-09-27T07:27:11", "url": "https://files.pythonhosted.org/packages/6b/7a/c17928dd0e6ca3dfb32d595fde9f43026ca772248b036dd7621691263461/lesync-0.0.4.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "3b88e619eb9b4e8c2bb1c579521f14e1", "sha256": "a3791defc3f990f4326c0065ce22a7990b96772b0c13ed9b70f14b05c0376b21" }, "downloads": -1, "filename": "lesync-0.1.0.tar.gz", "has_sig": false, "md5_digest": "3b88e619eb9b4e8c2bb1c579521f14e1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4703, "upload_time": "2018-10-20T11:09:43", "url": "https://files.pythonhosted.org/packages/e2/ec/3291a7a6f20e8f5edbbd914ee5c18c6592b660114becaa43f898060bbd7c/lesync-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "cab342fc6093fc4ed18d328c8a5148c9", "sha256": "3ab2096380d445512df6bf02e4c90c177965138c0ab7f1ebfa465b4adc27ce34" }, "downloads": -1, "filename": "lesync-0.2.0.tar.gz", "has_sig": false, "md5_digest": "cab342fc6093fc4ed18d328c8a5148c9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4747, "upload_time": "2018-11-23T02:14:32", "url": "https://files.pythonhosted.org/packages/56/9e/68637d9c935ae49b5c4e0078edc8c711f8357f945ac76a63fdda6b4b63bf/lesync-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "ac5dac60f918273c372d7c2e6470878f", "sha256": "a0614f9bed13902eb406a81c2b82bf20783c76c6dfce322270b7cb38deb65fbc" }, "downloads": -1, "filename": "lesync-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "ac5dac60f918273c372d7c2e6470878f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5390, "upload_time": "2019-07-12T06:32:30", "url": "https://files.pythonhosted.org/packages/8f/33/1741cb6ae7810b1ad68e2ca045f31981951e3dbec47bfe02733880b1db87/lesync-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6e3cf2d4acd49ac0abbe3ad67f469f4f", "sha256": "371446df0c031827e645eb2cf3a36580bf7ac3917ab357b35f81f5e5d88a4dba" }, "downloads": -1, "filename": "lesync-0.3.0.tar.gz", "has_sig": false, "md5_digest": "6e3cf2d4acd49ac0abbe3ad67f469f4f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4830, "upload_time": "2019-07-12T06:32:31", "url": "https://files.pythonhosted.org/packages/bb/16/be6f3c7008cc0889d973a2a668f7c559c272981a570373a447bf2096e0a8/lesync-0.3.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ac5dac60f918273c372d7c2e6470878f", "sha256": "a0614f9bed13902eb406a81c2b82bf20783c76c6dfce322270b7cb38deb65fbc" }, "downloads": -1, "filename": "lesync-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "ac5dac60f918273c372d7c2e6470878f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5390, "upload_time": "2019-07-12T06:32:30", "url": "https://files.pythonhosted.org/packages/8f/33/1741cb6ae7810b1ad68e2ca045f31981951e3dbec47bfe02733880b1db87/lesync-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6e3cf2d4acd49ac0abbe3ad67f469f4f", "sha256": "371446df0c031827e645eb2cf3a36580bf7ac3917ab357b35f81f5e5d88a4dba" }, "downloads": -1, "filename": "lesync-0.3.0.tar.gz", "has_sig": false, "md5_digest": "6e3cf2d4acd49ac0abbe3ad67f469f4f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4830, "upload_time": "2019-07-12T06:32:31", "url": "https://files.pythonhosted.org/packages/bb/16/be6f3c7008cc0889d973a2a668f7c559c272981a570373a447bf2096e0a8/lesync-0.3.0.tar.gz" } ] }