{ "info": { "author": "Johnathan Ryan Hornik", "author_email": "ryanhornik@gmail.com", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 1.11", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content" ], "description": "# Channels-Redux\n\nChannels-Redux is a package that notifies subscribers about changes in the database\n\nIt should be paired with the [npm package of the same name](https://www.npmjs.com/package/channels-redux). \nThe pypi package [django-react-views](https://pypi.org/project/django-react-views/) is also useful for hydrating initial state\n\n## Exposed Modules\n\n### NotifyConsumer\nThis is an AsyncWebsocketConsumer that allows clients to subscribe to different models and objects and sends frames \nwhen subscribed objects are updated, created or deleted. Unless you plan on extending it's functionality you don't \nneed to do anything with this.\n\n### NotifyRouter\nNotifyRouter is a channels.routing.URLRouter that defines a default URL that routes connections to NotifyConsumer\n\n### NotifierMixin\nExtending this mixin marks a model as being a 'Notifier' this means that it will send frames to subscribed clients\nwhen changes happen on the server side.\n\nThis also defines a property that returns the name of the api url for the model. By default it assumes the namespace\nof your api is 'api' this can be overridden by defining `API_APP_NAMESPACE` in your settings.\n\n### HyperlinkedModelSerializer\nA drop-in replacement for DRF's HyperlinkedModelSerializer that fixes some issues with URL fields and relationships \nin a namespaced api\n\n### RestRouter\nA drop-in replacement for DRF's DefaultRouter that should be used to assign the expected default base names for\nyour api urls.\n\n## Quick Start\n\n1. Add to installed apps\n ```python\n INSTALLED_APPS = [\n ...\n 'channels_redux',\n ]\n ```\n\n1. Models that you want clients to receive notifications about should extend the NotifierMixin\n\n1. Setup your models with Django Rest Framework with the following exceptions:\n 1. Instead of the DRF's HyperlinkedModelSerializer you should use \nchannels_redux.rest.HyperlinkedModelSerializer. At minimum your serializers should include the `url` and the `pk` fields.\n 1. User RestRouter instead of DefaultRouter for your api routes\n ```python\n router = RestRouter()\n router.register(r'appname/modelname', viewsets.ModelNameViewSet)\n ```\n\n1. Setup django-channels. Follow their docs for this with the following exceptions:\n 1. In routing.py use the NotifyRouter \n ```python\n application = ProtocolTypeRouter({\n \"websocket\": AuthMiddlewareStack(NotifyRouter()),\n })\n ```\n 1. channels-redux **requires** channel layers, so be sure to set those up.\n\n1. Use django-react-views to provide the initial data to your frontend\n\n1. On the frontend use channels-redux js to setup your redux state and WebsocketHandler before rendering any react components\n ```javascript\n // In the root component that your page loads.\n import {WebSocketHandler, store} from 'channels-redux';\n const webSocketHandler = new WebSocketHandler(store);\n webSocketHandler.subscribeAll();\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://bitbucket.org/plus1tables/channels-redux-python/", "keywords": "", "license": "MIT License", "maintainer": "", "maintainer_email": "", "name": "channels-redux", "package_url": "https://pypi.org/project/channels-redux/", "platform": "", "project_url": "https://pypi.org/project/channels-redux/", "project_urls": { "Homepage": "https://bitbucket.org/plus1tables/channels-redux-python/" }, "release_url": "https://pypi.org/project/channels-redux/1.8.0/", "requires_dist": [ "Django (>=1.11)", "djangorestframework (>=3.4.0)", "channels (>=2.0.0)" ], "requires_python": "", "summary": "Channels-Redux is a package that notifies subscribers about changes in the database", "version": "1.8.0" }, "last_serial": 4291352, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "d3adccbdd8c8ece148b9752452e1ae6c", "sha256": "618527f17511d4a5a305ef1e4900d7e94e6534c305e7eb6d63f4f55c65e59b0a" }, "downloads": -1, "filename": "channels_redux-1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d3adccbdd8c8ece148b9752452e1ae6c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6697, "upload_time": "2018-07-14T06:28:43", "url": "https://files.pythonhosted.org/packages/34/74/ad51aca125bac1a560b1a773920b00ea334b05d0fe173807750d09e949b8/channels_redux-1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0fe61b3978ebf549c4b0e5291898aa9c", "sha256": "7f8d171b2d698cf023b2f8f8f6ea24622c1b925119e4b730dd78e3d56c4b7fe4" }, "downloads": -1, "filename": "channels-redux-1.0.tar.gz", "has_sig": false, "md5_digest": "0fe61b3978ebf549c4b0e5291898aa9c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5510, "upload_time": "2018-07-14T06:28:44", "url": "https://files.pythonhosted.org/packages/6a/1b/d250f6c29e431e7619f841382cea48449ac4e9bf192acbca2da114bdb449/channels-redux-1.0.tar.gz" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "fcc2c645c1e6bd21a6e79d19bb68b353", "sha256": "12c5ea364f659056854875451cd14170edebb9f11c6e55062b05b651bcd395b0" }, "downloads": -1, "filename": "channels_redux-1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "fcc2c645c1e6bd21a6e79d19bb68b353", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6746, "upload_time": "2018-07-15T05:15:59", "url": "https://files.pythonhosted.org/packages/24/85/9f9a811a0c1a933202604fdb8b0613e37ce0c02dd5a5303a80fcaeea4033/channels_redux-1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ff68a2e6dc4aa5e75836429567f49229", "sha256": "589c23e2c96fa8b9d3d548607dd2510ebe3d87e60ec09ddbdcc5c80380ca7873" }, "downloads": -1, "filename": "channels-redux-1.1.tar.gz", "has_sig": false, "md5_digest": "ff68a2e6dc4aa5e75836429567f49229", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5544, "upload_time": "2018-07-15T05:16:00", "url": "https://files.pythonhosted.org/packages/67/ee/bb23e784d9ebb8d6951904cd14179612435fac5c7761d74a8cb6eb6f3fa0/channels-redux-1.1.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "ed2f169e3933eb2328104e7a053c5c5d", "sha256": "5fab08d286a5ca941733c71ae1ac23b1cd9f3bc48c6abd3170f73eae2fed7c3b" }, "downloads": -1, "filename": "channels_redux-1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "ed2f169e3933eb2328104e7a053c5c5d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6701, "upload_time": "2018-07-17T03:04:07", "url": "https://files.pythonhosted.org/packages/13/77/ef2f6d74995d0fd4abdb17a952e57ac148125fa3aa7149aa75a205adb4f5/channels_redux-1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9026af7533639d2412f0a0400a7a8a42", "sha256": "daaefbc6a3c9ded04435acfe7e2ce2d9fbb100187eea6f3617cc8a9a7b872eae" }, "downloads": -1, "filename": "channels-redux-1.2.tar.gz", "has_sig": false, "md5_digest": "9026af7533639d2412f0a0400a7a8a42", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5503, "upload_time": "2018-07-17T03:04:07", "url": "https://files.pythonhosted.org/packages/33/4f/9fd5b5665100009666467d2aa6776a14c380bbf1ab3c38a37e428352cce3/channels-redux-1.2.tar.gz" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "660425aaaa7b583e19432829dd9da71a", "sha256": "33aded82668d0e97dce595f0dd8066dd98c040fb333cb7baf520032716b0e2a6" }, "downloads": -1, "filename": "channels_redux-1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "660425aaaa7b583e19432829dd9da71a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5492, "upload_time": "2018-07-17T03:55:53", "url": "https://files.pythonhosted.org/packages/73/28/742fe5185123d1c36c6eba332b758e6e823fbe97adde76b72064a1f4b27d/channels_redux-1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b53d6e83cc8bc2088804cfd16f6f9615", "sha256": "884a59a8b6ff4d6bd3d3f95bc51769a432232ff4424d7be7a8fb75a140095712" }, "downloads": -1, "filename": "channels-redux-1.3.tar.gz", "has_sig": false, "md5_digest": "b53d6e83cc8bc2088804cfd16f6f9615", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5279, "upload_time": "2018-07-17T03:55:53", "url": "https://files.pythonhosted.org/packages/76/0d/802d7134282a40e75c3832af661867b99ab04981ecc6d261d06bb56ad53d/channels-redux-1.3.tar.gz" } ], "1.4": [ { "comment_text": "", "digests": { "md5": "2e5ff5e100a96594272094f67585bb0d", "sha256": "581d171c73736235690215e9b85531ec4cbb15b4862876c69cd97d6bfd7a961d" }, "downloads": -1, "filename": "channels_redux-1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "2e5ff5e100a96594272094f67585bb0d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9788, "upload_time": "2018-07-22T05:50:04", "url": "https://files.pythonhosted.org/packages/03/28/5f15b84a9e0712370d4fcfde0931aec76031c269504f71de59a93acd0f60/channels_redux-1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "778987ac92b7e316b7fa2a511dd75ce4", "sha256": "903700bbf73c5ff649735544509fe861f7aff146eac13ded8963324ac50a2720" }, "downloads": -1, "filename": "channels-redux-1.4.tar.gz", "has_sig": false, "md5_digest": "778987ac92b7e316b7fa2a511dd75ce4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7996, "upload_time": "2018-07-22T05:50:05", "url": "https://files.pythonhosted.org/packages/ca/12/55ba47e1cb79d429ee13e6adfb3d3b407f1d2a9608959c35ea0c94854f61/channels-redux-1.4.tar.gz" } ], "1.4.1": [ { "comment_text": "", "digests": { "md5": "c1c8a81b1c265b013489b83dd9aca7c6", "sha256": "3a4f3a05befabfde95cacc75316fa324e3db75525970be64e0087eb7794b6bd3" }, "downloads": -1, "filename": "channels_redux-1.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "c1c8a81b1c265b013489b83dd9aca7c6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9776, "upload_time": "2018-07-22T06:07:43", "url": "https://files.pythonhosted.org/packages/0f/eb/a7e9f38353fa6cef0e3e570612269948d442a57a5571c7edd0f7ace4a33c/channels_redux-1.4.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4490c5ae883cb4eaadcbe634188a1040", "sha256": "ca69c256e4db2ca380f83a44e06599e39f000902ad34b5a3261a72a64f2ad0cc" }, "downloads": -1, "filename": "channels-redux-1.4.1.tar.gz", "has_sig": false, "md5_digest": "4490c5ae883cb4eaadcbe634188a1040", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7966, "upload_time": "2018-07-22T06:07:44", "url": "https://files.pythonhosted.org/packages/59/2b/a0d94e61947402a2ce3860b1f8a7bd5a23a21ffa682da835cc11f87e9eff/channels-redux-1.4.1.tar.gz" } ], "1.5.0": [ { "comment_text": "", "digests": { "md5": "d1d81a32c93d92ff1979f779922e03f3", "sha256": "91e12b18de1a92ec87562a74f6b7c04b40344a20e1b8f320cbcd7acfe2578235" }, "downloads": -1, "filename": "channels_redux-1.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d1d81a32c93d92ff1979f779922e03f3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10212, "upload_time": "2018-07-22T08:35:08", "url": "https://files.pythonhosted.org/packages/fc/f9/a64f314be8fc4efac440300c8e35e2f4fd18cea5153ad2e84f23733f6fc0/channels_redux-1.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3e0ac315d7be3236d36495be18197bdf", "sha256": "8ba9b94a0b23c834f57e79eb3802961273e1265049dad338d0e7883a49993ff7" }, "downloads": -1, "filename": "channels-redux-1.5.0.tar.gz", "has_sig": false, "md5_digest": "3e0ac315d7be3236d36495be18197bdf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8364, "upload_time": "2018-07-22T08:35:09", "url": "https://files.pythonhosted.org/packages/19/35/a82885f9c751750378f84f4a9643bb6885f278e76fe48de9166f6aae90d8/channels-redux-1.5.0.tar.gz" } ], "1.6.0": [ { "comment_text": "", "digests": { "md5": "351add8f326550c192b5102ca0682a9b", "sha256": "8eb6054ce649c97e22eb4738566fc1a98255094348350a5639da5702b6d60fd8" }, "downloads": -1, "filename": "channels_redux-1.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "351add8f326550c192b5102ca0682a9b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10722, "upload_time": "2018-07-27T04:30:11", "url": "https://files.pythonhosted.org/packages/3b/b3/3321f767c73870d813ec020dce6c2be767ded2ceb8e44ab67641268df634/channels_redux-1.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7871d8b01ddfe5d13c435c4d4444c01c", "sha256": "91fa6ef32f4be338bb389b878841feec54b777db0c6371027bbb48a2e4335f92" }, "downloads": -1, "filename": "channels-redux-1.6.0.tar.gz", "has_sig": false, "md5_digest": "7871d8b01ddfe5d13c435c4d4444c01c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8844, "upload_time": "2018-07-27T04:30:12", "url": "https://files.pythonhosted.org/packages/0f/00/7e855626380c6f824df8d165c1590fa0a50d604080154f79c668d6beafbe/channels-redux-1.6.0.tar.gz" } ], "1.7.0": [ { "comment_text": "", "digests": { "md5": "ed69c230e2057f6ba4e2b07e2113c6aa", "sha256": "85e70533f5242c6041f4eca4f6967ea2d41e605d7e62438fb8b2ad6542ea0bbf" }, "downloads": -1, "filename": "channels_redux-1.7.0-py2-none-any.whl", "has_sig": false, "md5_digest": "ed69c230e2057f6ba4e2b07e2113c6aa", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 10937, "upload_time": "2018-09-09T21:46:15", "url": "https://files.pythonhosted.org/packages/a1/6e/f7ad7487debad3288a95747b3e0ef7cca1a7c047887e04558afdbbf8c2e0/channels_redux-1.7.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b34808735147fdc29edc71ac4902e009", "sha256": "c6bb75b520b09f0829b1289c8433ee30d81f51b9d19358f5e406f9204b872989" }, "downloads": -1, "filename": "channels-redux-1.7.0.tar.gz", "has_sig": false, "md5_digest": "b34808735147fdc29edc71ac4902e009", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9053, "upload_time": "2018-09-09T21:46:17", "url": "https://files.pythonhosted.org/packages/c2/80/ecfd3844d6fd2f7db6a244697d6ec88ec4737530fba93aebf3f0c57e7ad4/channels-redux-1.7.0.tar.gz" } ], "1.7.1": [ { "comment_text": "", "digests": { "md5": "8c7b2073553def213218cd736a324ab6", "sha256": "262db83bbffe7f6d887d8a6db026a042b9a7142e9b002abf28f55157c9d58c32" }, "downloads": -1, "filename": "channels_redux-1.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "8c7b2073553def213218cd736a324ab6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10939, "upload_time": "2018-09-14T05:12:48", "url": "https://files.pythonhosted.org/packages/d6/00/58c0433dd7539cff7cae23fd750f670eb3f343d5e4fad28445bbcd09229b/channels_redux-1.7.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2269373990c5a1e280bfb40592f17c02", "sha256": "276469809648596419cda07e8524ceb64012f7dd196b3282d87c9188137fdfca" }, "downloads": -1, "filename": "channels-redux-1.7.1.tar.gz", "has_sig": false, "md5_digest": "2269373990c5a1e280bfb40592f17c02", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9062, "upload_time": "2018-09-14T05:12:50", "url": "https://files.pythonhosted.org/packages/65/3a/5114bc897ba0dd72904df9e15f7a25698ef5bf7038b619f43e385f10f28d/channels-redux-1.7.1.tar.gz" } ], "1.7.2": [ { "comment_text": "", "digests": { "md5": "18323ca2218faf6cca01d92441f11db2", "sha256": "558e44c8f52866b04a0fc390e09a66ea9ce6fd0ca96c308ad77e0dc7365852e8" }, "downloads": -1, "filename": "channels_redux-1.7.2-py3-none-any.whl", "has_sig": false, "md5_digest": "18323ca2218faf6cca01d92441f11db2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11271, "upload_time": "2018-09-20T04:38:02", "url": "https://files.pythonhosted.org/packages/71/f7/8d82880ddf31e9881c7a949dfc4a1290b66286ec9708f095bc0704c98aa0/channels_redux-1.7.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a96d99a431e1029b1c8dfd840756548c", "sha256": "ee66c19c16acd654b9fd0e5cd864a32cb14861f312e120685b44adcf9ebfdbf4" }, "downloads": -1, "filename": "channels-redux-1.7.2.tar.gz", "has_sig": false, "md5_digest": "a96d99a431e1029b1c8dfd840756548c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9225, "upload_time": "2018-09-20T04:38:04", "url": "https://files.pythonhosted.org/packages/bd/39/a603d4956baa332f0a255885cc7b60403ee356fba3f1770d8fe9680d8307/channels-redux-1.7.2.tar.gz" } ], "1.8.0": [ { "comment_text": "", "digests": { "md5": "d823f46b05f4720d37b3be9feb7e6a0d", "sha256": "97c365d871bb31ecbd012cd3ebe5aff4c71a4b7a7d70e4c7fb104f8593db6a92" }, "downloads": -1, "filename": "channels_redux-1.8.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d823f46b05f4720d37b3be9feb7e6a0d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11042, "upload_time": "2018-09-20T05:26:17", "url": "https://files.pythonhosted.org/packages/a7/fd/59a2d194012c38074a6db578dc5ffc9cc1034cece3903e84c7d07c42fd48/channels_redux-1.8.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "408587112c1619fa454d3b74a8f835ca", "sha256": "94d44d7f2175b4f10473843acdcb078e4be14c02dad11184e8284352aa87cc64" }, "downloads": -1, "filename": "channels-redux-1.8.0.tar.gz", "has_sig": false, "md5_digest": "408587112c1619fa454d3b74a8f835ca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8957, "upload_time": "2018-09-20T05:26:19", "url": "https://files.pythonhosted.org/packages/cb/3a/0d5c5c0ae855bf90ae5c71d024e43af44ec47fc0e88538d693725d3f0716/channels-redux-1.8.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d823f46b05f4720d37b3be9feb7e6a0d", "sha256": "97c365d871bb31ecbd012cd3ebe5aff4c71a4b7a7d70e4c7fb104f8593db6a92" }, "downloads": -1, "filename": "channels_redux-1.8.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d823f46b05f4720d37b3be9feb7e6a0d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 11042, "upload_time": "2018-09-20T05:26:17", "url": "https://files.pythonhosted.org/packages/a7/fd/59a2d194012c38074a6db578dc5ffc9cc1034cece3903e84c7d07c42fd48/channels_redux-1.8.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "408587112c1619fa454d3b74a8f835ca", "sha256": "94d44d7f2175b4f10473843acdcb078e4be14c02dad11184e8284352aa87cc64" }, "downloads": -1, "filename": "channels-redux-1.8.0.tar.gz", "has_sig": false, "md5_digest": "408587112c1619fa454d3b74a8f835ca", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8957, "upload_time": "2018-09-20T05:26:19", "url": "https://files.pythonhosted.org/packages/cb/3a/0d5c5c0ae855bf90ae5c71d024e43af44ec47fc0e88538d693725d3f0716/channels-redux-1.8.0.tar.gz" } ] }