{ "info": { "author": "Alexander Kaftan", "author_email": "", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8" ], "description": "# django-fast-ratelimit\n\n\nDjango-fast-ratelimit provides a secure and fast ratelimit facility based on the django caching framework.\nIt uses a \"Fixed window counter\"-algorithm based on:\nhttps://medium.com/figma-design/an-alternative-approach-to-rate-limiting-f8a06cf7c94c\n\n\n\n## Installation\n\n```` bash\npip install django-fast-ratelimit\n\n````\n\nNote: pip >= 19 is required, I use the novel pyproject.toml method\n\n## usage\n\n\nDecorator:\n\n```` python\nimport ratelimit\n\n@ratelimit.decorate(key=\"ip\", rate=\"1/s\")\ndef expensive_func(request):\n # how many ratelimits request limiting\n if request.ratelimit[\"request_limit\"] > 0:\n # reschedule with end of rate epoch\n return request_waiting(request.ratelimit[\"end\"])\n\n````\n\nblocking Decorator (raises RatelimitError):\n\n```` python\nimport ratelimit\n\n@ratelimit.decorate(key=\"ip\", rate=\"1/s\", block=True, methods=ratelimit.UNSAFE)\ndef expensive_func(request):\n # how many ratelimits request limiting\n if request.ratelimit[\"end\"] > 0:\n\n````\n\n\n\ndecorate View (requires group):\n\n```` python\nimport ratelimit\nfrom django.views.generic import View\nfrom django.utils.decorators import method_decorator\n\n\n@method_decorator(ratelimit.decorate(\n key=\"ip\", rate=\"1/s\", block=True, methods=ratelimit.SAFE, group=\"required\"\n), name=\"dispatch\")\nclass FooView(View):\n ...\n\n````\n\nmanual\n```` python\nimport ratelimit\n\n\ndef func(request):\n ratelimit.get_ratelimit(key=\"ip\", rate=\"1/s\", request=request, group=\"123\")\n # or only for GET\n ratelimit.get_ratelimit(\n key=\"ip\", rate=\"1/s\", request=request, group=\"123\", methods=\"GET\"\n )\n # also simple calls possible (note: key in bytes format)\n ratelimit.get_ratelimit(\n key=b\"abc\", rate=\"1/s\", group=\"123\"\n )\n # check constraints of rate\n r = ratelimit.parse_rate(\"1/s\") # returns tuple (amount, period)\n assert(r[1]==1) # assert period is 1 second\n # for simple naming use o2g (object to group)\n ratelimit.get_ratelimit(\n key=b\"abc\", rate=r, group=ratelimit.o2g(func)\n )\n\n````\n\n## parameters\n\nratelimit.get_ratelimit:\n\n* group: group name, can be callable (fun(request))\n* methods: set of checked methods, can be callable (fun(request, group)), modes:\n * callable(request, group): allow dynamic\n * ratelimit.ALL (default): all methods are checked\n * \\(\"HEAD\", \"GET\"\\): list of checked methods\n * ratelimit.invertedset([\"HEAD\", \"GET\"]): inverted set of checked methods. Here: every method is checked, except HEAD, GET\n* request: ingoing request (optional if key supports it and methods=ratelimit.ALL (default))\n* key: multiple modes possible:\n * bool: True: skip key (should only be used for baking), False: disable cache (like RATELIMIT_ENABLE=False)\n * int: sidestep cache, value will be used for request_limit. 0 is for never blocking, >=1 blocks\n * str: \"path.to.method:argument\"\n * str: \"inbuildmethod:argument\" see methods for valid arguments\n * str: \"inbuildmethod\" method which is ready to use for (request, group)\n * tuple,list: [\"method\", args...]: method (can be also inbuild) with arbitary arguments\n * bytes: static key (supports mode without request)\n * callable: check return of function (fun(request, group)), return must be string (converted to bytes), bytes, bool or int (see \"key\" for effects)\n * empty_to: convert empty keys (b\"\") to parameter. Must be bytes, bool or int (see \"key\" for effects) (default: keep b\"\")\n * cache: specify cache to use, defaults to RATELIMIT_DEFAULT_CACHE setting (default: \"default\")\n * hash_algo: name of hash algorithm for creating cache_key (defaults to RATELIMIT_KEY_HASH setting (default: \"sha256\"))\n Note: group is seperately hashed\n * hashctx: optimation parameter, read the code and only use if you know what you are doing. It basically circumvents the parameter hashing and only hashes the key. If the key parameter is True even the key is skipped\n\nratelimit.decorate:\n\nAll of ratelimit.get_ratelimit except request. group is here optional (except for decorations with method_decorator (no access to wrapped function)).\nAlso supports:\n* block: should hard block with an RatelimitExceeded exception (subclass of PermissionDenied) or only annotate request with ratelimit\n\n## helpers\n\n* ratelimit.invertedset: inverts a collection, useful for http methods\n\n## methods\n\nSee in methods which methods are available. Here some of them:\n* ip: use ip address as key, argument: [netmask ipv4/]netmask ipv6\n* user: authenticated user primary key or b\"\"\n* user_or_ip: use autenticated user primary key as key. If not autenticated fallback to ip, also with netmask argument\n* user_and_ip: same like user_or_ip except that the ip matching also applies for authenticated users\n* get: generate key from multiple sources, input can be multiple input args or a dict with options\n\n## settings\n\n* RATELIMIT_GROUP_HASH: hash function which is used for the group hash (default: md5)\n* RATELIMIT_KEY_HASH: hash function which is used as default for the key hash, can be overridden with hash_algo (default: md5)\n* RATELIMIT_ENABLE disable ratelimit (e.g. for tests) (default: enabled)\n* RATELIMIT_KEY_PREFIX: internal prefix for the hash keys (so you don't have to create a new cache). Defaults to \"frl:\".\n* RATELIMIT_DEFAULT_CACHE: default cache to use, defaults to \"default\" and can be overridden by cache parameter\n\n\n## TODO\n\n* more documentation\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/devkral/django-fast-ratelimit", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "django-fast-ratelimit", "package_url": "https://pypi.org/project/django-fast-ratelimit/", "platform": "", "project_url": "https://pypi.org/project/django-fast-ratelimit/", "project_urls": { "Homepage": "https://github.com/devkral/django-fast-ratelimit", "Repository": "https://github.com/devkral/django-fast-ratelimit" }, "release_url": "https://pypi.org/project/django-fast-ratelimit/0.5.0.3/", "requires_dist": [ "django (>=2.0)" ], "requires_python": ">=3.5", "summary": "Fast ratelimit implementation with django caches", "version": "0.5.0.3", "yanked": false, "yanked_reason": null }, "last_serial": 8527448, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "454b16d002d333ed786b3a878afdee5d", "sha256": "507faa5010ac68564c795df6a51f14c0a26d58716a19b7b6b1d78d337f12de12" }, "downloads": -1, "filename": "django_fast_ratelimit-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "454b16d002d333ed786b3a878afdee5d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 6495, "upload_time": "2019-05-01T19:01:48", "upload_time_iso_8601": "2019-05-01T19:01:48.254495Z", "url": "https://files.pythonhosted.org/packages/4f/16/1f91e9c9e5bba3809a5c85e7ec16ebbae3768de34d60a9fb622272d5b85e/django_fast_ratelimit-0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "3d212fbc9bacdfd771b4f98e9ec0ede6", "sha256": "2912110f2e4044484e402c6882472226bc9ead86efa43157dfb29fa96c23e69d" }, "downloads": -1, "filename": "django-fast-ratelimit-0.1.tar.gz", "has_sig": false, "md5_digest": "3d212fbc9bacdfd771b4f98e9ec0ede6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 5753, "upload_time": "2019-05-01T19:01:45", "upload_time_iso_8601": "2019-05-01T19:01:45.645740Z", "url": "https://files.pythonhosted.org/packages/34/2e/4fe8fe9e5fa8c1033ce895ac5a1cc1f2eefb1410b7029af8e2d9abdcc2cd/django-fast-ratelimit-0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2": [ { "comment_text": "", "digests": { "md5": "e90b8c01e91d81f6caafebdf322c37fe", "sha256": "29d22b359da26cb9389635ec14e386cabf1a2d73f9cbb6db96f4cdffb2dec133" }, "downloads": -1, "filename": "django_fast_ratelimit-0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "e90b8c01e91d81f6caafebdf322c37fe", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 6539, "upload_time": "2019-05-01T20:59:01", "upload_time_iso_8601": "2019-05-01T20:59:01.037702Z", "url": "https://files.pythonhosted.org/packages/01/36/4a3920da3a9f604b7f76f59ad68882547975473b0f773c18f5514118cd1e/django_fast_ratelimit-0.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "80fad6881ce837721c7ed1cd343c2d18", "sha256": "892993237f1305cdd807eeff796c23315fba64995b42f57c7e269ef87c1dab7e" }, "downloads": -1, "filename": "django-fast-ratelimit-0.2.tar.gz", "has_sig": false, "md5_digest": "80fad6881ce837721c7ed1cd343c2d18", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 5811, "upload_time": "2019-05-01T20:58:59", "upload_time_iso_8601": "2019-05-01T20:58:59.445479Z", "url": "https://files.pythonhosted.org/packages/ab/fe/8d3a76b539edc76ebb9f42b35a89d36d0ab2d38c61d7a49d82b7d13965ef/django-fast-ratelimit-0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "e0b89b5228010b612acd716aaaac3678", "sha256": "7c372c6158b6b96c6bff88ba3becc145ba3bb3a18a65677e70deb283228dfb89" }, "downloads": -1, "filename": "django_fast_ratelimit-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e0b89b5228010b612acd716aaaac3678", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 6554, "upload_time": "2019-05-01T21:04:18", "upload_time_iso_8601": "2019-05-01T21:04:18.713911Z", "url": "https://files.pythonhosted.org/packages/09/7e/acd42651898dfe3c10d1626023aa00b7adb666227dd8686a860d0a5c62d2/django_fast_ratelimit-0.2.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "766e886ef834d785b91b692d974dc4dd", "sha256": "301cc8c8501351b1fb2f78e8f72b13d2d28fb0edea0662fad8f15f4c3b6c479f" }, "downloads": -1, "filename": "django-fast-ratelimit-0.2.1.tar.gz", "has_sig": false, "md5_digest": "766e886ef834d785b91b692d974dc4dd", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 5810, "upload_time": "2019-05-01T21:04:17", "upload_time_iso_8601": "2019-05-01T21:04:17.526847Z", "url": "https://files.pythonhosted.org/packages/78/e0/471a33a99264937687d86eb93a8649b442f33b59bcdf1f4a8e21cd7fced5/django-fast-ratelimit-0.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3": [ { "comment_text": "", "digests": { "md5": "f3c4ee48f3a37b6ce86520842b6ce792", "sha256": "dd324c6d935423980c30c4ff88b38e51d6aded2ed00a11cff90434dbbacb0611" }, "downloads": -1, "filename": "django_fast_ratelimit-0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "f3c4ee48f3a37b6ce86520842b6ce792", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 6536, "upload_time": "2019-05-01T22:14:41", "upload_time_iso_8601": "2019-05-01T22:14:41.639662Z", "url": "https://files.pythonhosted.org/packages/63/d5/3c38f2fa3bb2d02b1795f2fee02c9661ced6d0afedfcb65a1447ed2fcbdb/django_fast_ratelimit-0.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "665caffd9c77e70de48b2e53f039755b", "sha256": "79883d176a567b9e3812e6714399087732b879d6e2473f993cb41106d94080a1" }, "downloads": -1, "filename": "django-fast-ratelimit-0.3.tar.gz", "has_sig": false, "md5_digest": "665caffd9c77e70de48b2e53f039755b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 5813, "upload_time": "2019-05-01T22:14:40", "upload_time_iso_8601": "2019-05-01T22:14:40.169899Z", "url": "https://files.pythonhosted.org/packages/45/cc/1c496978a7cdf72b9cf8143cc46b684ecbf33c312ee60744bf480f4a3462/django-fast-ratelimit-0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "452bdd984e072d1628adda3bc1a3fe53", "sha256": "4d33cb17df2bad6fec363ff97016e0f96a5b1bbf4fc6f3b5c014676b71151491" }, "downloads": -1, "filename": "django_fast_ratelimit-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "452bdd984e072d1628adda3bc1a3fe53", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 7347, "upload_time": "2019-05-02T08:02:20", "upload_time_iso_8601": "2019-05-02T08:02:20.559463Z", "url": "https://files.pythonhosted.org/packages/cd/8f/9146914a1146a2edc5a718397639756541c8318bfef8db549be8486658ab/django_fast_ratelimit-0.3.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "7d91accadb888d3a9ae26a526ae4ae35", "sha256": "7ae0fc2b5c887124910046b03c35dc584068ba6eef4a5aed30e1a5bd5fefc03b" }, "downloads": -1, "filename": "django-fast-ratelimit-0.3.1.tar.gz", "has_sig": false, "md5_digest": "7d91accadb888d3a9ae26a526ae4ae35", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 6677, "upload_time": "2019-05-02T08:02:18", "upload_time_iso_8601": "2019-05-02T08:02:18.972951Z", "url": "https://files.pythonhosted.org/packages/f9/57/86e67250051eba405c36790482b1cb4a1add0e0f18b05e0b4eaa6837c20c/django-fast-ratelimit-0.3.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "fea88ec8309d59280d96f6ae16cc4b0a", "sha256": "8afc5148ec2ed01a44ce808d0c1a075783601c9cb0191ab5ffefe579a2e02bfd" }, "downloads": -1, "filename": "django_fast_ratelimit-0.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "fea88ec8309d59280d96f6ae16cc4b0a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 7358, "upload_time": "2019-05-02T08:21:40", "upload_time_iso_8601": "2019-05-02T08:21:40.662432Z", "url": "https://files.pythonhosted.org/packages/a7/e0/42f4db25a162b2dd8149b8b5140adda3f4481530baba349bd9dc0bccc53e/django_fast_ratelimit-0.3.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "0a81626b2ed95e91dabf4dfaafaed8e0", "sha256": "7b3d160e46ffeadbb0f9473cfde5f259e20fca02368e290f5bdb411a3a4a6201" }, "downloads": -1, "filename": "django-fast-ratelimit-0.3.2.tar.gz", "has_sig": false, "md5_digest": "0a81626b2ed95e91dabf4dfaafaed8e0", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 6691, "upload_time": "2019-05-02T08:21:38", "upload_time_iso_8601": "2019-05-02T08:21:38.999019Z", "url": "https://files.pythonhosted.org/packages/bb/d3/432bcc0f4fde31f01f20721233678828ad425fe17bda82c26612f72d9bba/django-fast-ratelimit-0.3.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "ed2640b1ed2664a519d7340fcc8fc122", "sha256": "ed85f1c91afc5b62b438b296d6de288abb0935202c7bec2bcf86fa969f40782d" }, "downloads": -1, "filename": "django_fast_ratelimit-0.3.3-py3-none-any.whl", "has_sig": false, "md5_digest": "ed2640b1ed2664a519d7340fcc8fc122", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 7703, "upload_time": "2019-05-02T11:27:03", "upload_time_iso_8601": "2019-05-02T11:27:03.778381Z", "url": "https://files.pythonhosted.org/packages/a6/a0/3fbdccf14bb70e3a8cce4898b1132b5e8f58c25c86fb7220bfca7fad4e1e/django_fast_ratelimit-0.3.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "333889ab1194815e39781199f9d6d347", "sha256": "b21da64bd7577f50364655e67481f70a596715a1dc46fdc93eb6016ea196f6d0" }, "downloads": -1, "filename": "django-fast-ratelimit-0.3.3.tar.gz", "has_sig": false, "md5_digest": "333889ab1194815e39781199f9d6d347", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 7039, "upload_time": "2019-05-02T11:27:02", "upload_time_iso_8601": "2019-05-02T11:27:02.265972Z", "url": "https://files.pythonhosted.org/packages/56/08/3df433428ce8549c4625f436d91a0cde4fc1b7e853bb60d82d908a48bc6a/django-fast-ratelimit-0.3.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4": [ { "comment_text": "", "digests": { "md5": "5caf1ced1bc7549191e65d81c0b93a0a", "sha256": "d41475c50e5d5c081cd35f80f33a754d973d86ead32cc211526dff6fa5bf7064" }, "downloads": -1, "filename": "django_fast_ratelimit-0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "5caf1ced1bc7549191e65d81c0b93a0a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 7949, "upload_time": "2019-05-12T11:56:57", "upload_time_iso_8601": "2019-05-12T11:56:57.691138Z", "url": "https://files.pythonhosted.org/packages/85/2c/e204782e1980e2188b46ea858852e9825c75e7744efa6ca1d52aa21c3557/django_fast_ratelimit-0.4-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "1208ff3f456bbbac919eb6ac4dd56c01", "sha256": "813c9b32935f04527640aa4f1adf90ccddc2a9546e14dcf4ab5ff6910c8bcaa9" }, "downloads": -1, "filename": "django-fast-ratelimit-0.4.tar.gz", "has_sig": false, "md5_digest": "1208ff3f456bbbac919eb6ac4dd56c01", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 7552, "upload_time": "2019-05-12T11:56:55", "upload_time_iso_8601": "2019-05-12T11:56:55.842422Z", "url": "https://files.pythonhosted.org/packages/5d/59/7fec3c9a27bb1dd903fc757685fe7aa3ae4ef4387cac9e2e6fe644fb43fc/django-fast-ratelimit-0.4.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5": [ { "comment_text": "", "digests": { "md5": "5cde75a870c2caebecc0ee1da0169b0a", "sha256": "e75657439f1a233919f2ce3bfaeb34bd8b8b5d08d81fb20dd8fb0297dbf4fdc0" }, "downloads": -1, "filename": "django_fast_ratelimit-0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "5cde75a870c2caebecc0ee1da0169b0a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 8632, "upload_time": "2019-09-28T20:47:55", "upload_time_iso_8601": "2019-09-28T20:47:55.793627Z", "url": "https://files.pythonhosted.org/packages/dc/47/928f3186df3f0362ef79e8a994c40a5ed0336413b846c8abadfd3e2a9ee1/django_fast_ratelimit-0.5-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "7d6cf4b89eda8e1f91f7a746eb4f4a8f", "sha256": "d0bb5baf57deb0dd8b69f7ace36b534c598896064543c21e521b56c72399dd6a" }, "downloads": -1, "filename": "django-fast-ratelimit-0.5.tar.gz", "has_sig": false, "md5_digest": "7d6cf4b89eda8e1f91f7a746eb4f4a8f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 8308, "upload_time": "2019-09-28T20:47:53", "upload_time_iso_8601": "2019-09-28T20:47:53.661170Z", "url": "https://files.pythonhosted.org/packages/d3/16/688a956052c67c214548a1f20d59d1f2c818cd17bc0b7bf1c1fba53a11ee/django-fast-ratelimit-0.5.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5.0.1": [ { "comment_text": "", "digests": { "md5": "d98936cfd4393469dfdbf3f37b441fcc", "sha256": "8766d94f7834ed5e5c27a5fe103c1332c83a60321e090366551068ee8c38c4ce" }, "downloads": -1, "filename": "django_fast_ratelimit-0.5.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "d98936cfd4393469dfdbf3f37b441fcc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 8732, "upload_time": "2019-10-26T21:43:09", "upload_time_iso_8601": "2019-10-26T21:43:09.529347Z", "url": "https://files.pythonhosted.org/packages/44/68/a793c1b909ea46ba52195ec3de7fe62ef22e948be013958c9b77fda348ce/django_fast_ratelimit-0.5.0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "2ca00309c66785507eec6d988e73de6f", "sha256": "f6029285b264e3fefc5140dccf772b4e12fa7544a51a1bf7403a042dc8c871a9" }, "downloads": -1, "filename": "django-fast-ratelimit-0.5.0.1.tar.gz", "has_sig": false, "md5_digest": "2ca00309c66785507eec6d988e73de6f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 8426, "upload_time": "2019-10-26T21:43:07", "upload_time_iso_8601": "2019-10-26T21:43:07.930174Z", "url": "https://files.pythonhosted.org/packages/02/a9/89c33fa2f87334da1ad6f6c19140d3f7bab6f1d3fbb60dbe89c33587947e/django-fast-ratelimit-0.5.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5.0.2": [ { "comment_text": "", "digests": { "md5": "e4399c8e7b5c29e5af48eee7b81c30ac", "sha256": "05786cea9d313b84739d60993c3e1a02382169c6a730d84a91a87586af56ae09" }, "downloads": -1, "filename": "django_fast_ratelimit-0.5.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "e4399c8e7b5c29e5af48eee7b81c30ac", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 9194, "upload_time": "2019-11-09T23:33:48", "upload_time_iso_8601": "2019-11-09T23:33:48.855448Z", "url": "https://files.pythonhosted.org/packages/e9/d4/d7c28bd11300507a619e51e1da374fd8de4ba61eabbef67c731428564fc3/django_fast_ratelimit-0.5.0.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "adf523c204919d2e6629f7ce1220420b", "sha256": "f6262c2fbd1aa868893a95da669a7e1ca0d353b71e557c13411bc6946a4a2f71" }, "downloads": -1, "filename": "django-fast-ratelimit-0.5.0.2.tar.gz", "has_sig": false, "md5_digest": "adf523c204919d2e6629f7ce1220420b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 8876, "upload_time": "2019-11-09T23:33:47", "upload_time_iso_8601": "2019-11-09T23:33:47.418768Z", "url": "https://files.pythonhosted.org/packages/c7/11/4ffb731fc2fa2a21d12a026c79f6997a84cc03c8e9f7c4581efb92716409/django-fast-ratelimit-0.5.0.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.5.0.3": [ { "comment_text": "", "digests": { "md5": "516c0ea74091bf95e0aec5645ba5ddbc", "sha256": "072c1e448fe11bae1df469f0271a8feb4fc349c910cc5d6cb445f994b9602b16" }, "downloads": -1, "filename": "django_fast_ratelimit-0.5.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "516c0ea74091bf95e0aec5645ba5ddbc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 9196, "upload_time": "2020-08-16T12:39:00", "upload_time_iso_8601": "2020-08-16T12:39:00.780334Z", "url": "https://files.pythonhosted.org/packages/1b/e6/eb4ce2a97acc0d985e8cd16a122b20bb32788284d02477515471be58cbdd/django_fast_ratelimit-0.5.0.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "8341315c105bea305aed75b3d18d9fba", "sha256": "f8e3dbfe97fda0a248d15d57fe3be2fa93965097dfc5164f07b681a5afbd63a0" }, "downloads": -1, "filename": "django-fast-ratelimit-0.5.0.3.tar.gz", "has_sig": false, "md5_digest": "8341315c105bea305aed75b3d18d9fba", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 10349, "upload_time": "2020-08-16T12:38:59", "upload_time_iso_8601": "2020-08-16T12:38:59.349795Z", "url": "https://files.pythonhosted.org/packages/13/17/68c8a83ba58a46e76377dc87de33b6f96854b9b84c090b8ab85891c09e26/django-fast-ratelimit-0.5.0.3.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "516c0ea74091bf95e0aec5645ba5ddbc", "sha256": "072c1e448fe11bae1df469f0271a8feb4fc349c910cc5d6cb445f994b9602b16" }, "downloads": -1, "filename": "django_fast_ratelimit-0.5.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "516c0ea74091bf95e0aec5645ba5ddbc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 9196, "upload_time": "2020-08-16T12:39:00", "upload_time_iso_8601": "2020-08-16T12:39:00.780334Z", "url": "https://files.pythonhosted.org/packages/1b/e6/eb4ce2a97acc0d985e8cd16a122b20bb32788284d02477515471be58cbdd/django_fast_ratelimit-0.5.0.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "8341315c105bea305aed75b3d18d9fba", "sha256": "f8e3dbfe97fda0a248d15d57fe3be2fa93965097dfc5164f07b681a5afbd63a0" }, "downloads": -1, "filename": "django-fast-ratelimit-0.5.0.3.tar.gz", "has_sig": false, "md5_digest": "8341315c105bea305aed75b3d18d9fba", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 10349, "upload_time": "2020-08-16T12:38:59", "upload_time_iso_8601": "2020-08-16T12:38:59.349795Z", "url": "https://files.pythonhosted.org/packages/13/17/68c8a83ba58a46e76377dc87de33b6f96854b9b84c090b8ab85891c09e26/django-fast-ratelimit-0.5.0.3.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }