{
"info": {
"author": "orsinium",
"author_email": "master_fess@mail.ru",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 5 - Production/Stable",
"Environment :: Plugins",
"Framework :: Django",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)",
"Programming Language :: Python"
],
"description": "DjBrut\n======\n\n.. figure:: logo.png\n :alt: DjBrut logo\n\n DjBrut logo\n\n|Build Status| |PyPI version| |Status| |Code size| |License|\n\nDjBrut -- simple brutforce protection for Django project.\n\nDefault checkers:\n\n- Max requests for IP.\n- Max requests for user.\n- Max requests for one CSRF-token (stupid but effective).\n- Max requests frequency limitation.\n\nDjBrut use Redis as storage for all counters.\n\nInstallation\n------------\n\n::\n\n pip install djbrut\n\nUsage\n-----\n\n.. code:: python\n\n from django.http import HttpResponse\n from djbrut import Attempt\n\n def some_view(request):\n attempt = Attempt('some rule type name', request)\n # check\n if not attempt.check():\n # error\n return HttpResponse(attempt.error)\n # success\n ...\n\nYou can see `example project `__ for more details.\n\nConfiguring\n-----------\n\nJust set up rules:\n\n.. code:: python\n\n BRUTEFORCE_LIMITS = {\n 'default': Rule(\n user=100, # max requests for one user by BRUTEFORCE_TIMELIMIT\n ip=300, # max requests for one IP by BRUTEFORCE_TIMELIMIT\n csrf=50, # max requests with one CSRF token by BRUTEFORCE_TIMELIMIT\n freq=0, # max request frequency for client [seconds]\n ),\n 'some rule type name': Rule(\n user=100, # max requests for one user by BRUTEFORCE_TIMELIMIT\n ip=300, # max requests for one IP by BRUTEFORCE_TIMELIMIT\n csrf=50, # max requests with one CSRF token by BRUTEFORCE_TIMELIMIT\n freq=0, # max request frequency for client [seconds]\n ),\n }\n\n``Attempt`` get rule type name as first arg. If rule type name not found\nin keys of BRUTEFORCE\\_LIMITS, 'default' will be used. If you don't set\ndefault rule then passed rule type must be exists in BRUTEFORCE\\_LIMITS\nkeys.\n\n``BRUTEFORCE_TIMELIMIT`` -- time to live for all attempts counters.\n\nYou can see `default settings `__ for more\nparams such as custom error message.\n\n.. |Build Status| image:: https://travis-ci.org/orsinium/django-bruteforce-protection.svg?branch=master\n :target: https://travis-ci.org/orsinium/django-bruteforce-protection\n.. |PyPI version| image:: https://img.shields.io/pypi/v/djbrut.svg\n :target: https://pypi.python.org/pypi/djbrut\n.. |Status| image:: https://img.shields.io/pypi/status/djbrut.svg\n :target: https://pypi.python.org/pypi/djbrut\n.. |Code size| image:: https://img.shields.io/github/languages/code-size/orsinium/django-bruteforce-protection.svg\n :target: https://github.com/orsinium/django-bruteforce-protection\n.. |License| image:: https://img.shields.io/pypi/l/djbrut.svg\n :target: LICENSE",
"description_content_type": "",
"docs_url": null,
"download_url": "https://github.com/orsinium/django-bruteforce-protection/tarball/master",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "https://github.com/orsinium/django-bruteforce-protection",
"keywords": "djbrut django bruteforce protection security redis",
"license": "GNU Lesser General Public License v3.0",
"maintainer": "",
"maintainer_email": "",
"name": "djbrut",
"package_url": "https://pypi.org/project/djbrut/",
"platform": "",
"project_url": "https://pypi.org/project/djbrut/",
"project_urls": {
"Download": "https://github.com/orsinium/django-bruteforce-protection/tarball/master",
"Homepage": "https://github.com/orsinium/django-bruteforce-protection"
},
"release_url": "https://pypi.org/project/djbrut/1.0.0/",
"requires_dist": null,
"requires_python": "",
"summary": "Framework for views in big projects on Django.",
"version": "1.0.0"
},
"last_serial": 3736933,
"releases": {
"0.8.0": [
{
"comment_text": "",
"digests": {
"md5": "5573fd67c02b7020fed623adf026f597",
"sha256": "b6db7523bd63f918c01759a47044930292441a1978b804ada8aed3190ab50a82"
},
"downloads": -1,
"filename": "djbrut-0.8.0.tar.gz",
"has_sig": false,
"md5_digest": "5573fd67c02b7020fed623adf026f597",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 6216,
"upload_time": "2018-03-06T08:11:23",
"url": "https://files.pythonhosted.org/packages/67/75/be0e948b00bc25bfe9a1174940c855f7a10c89aed411986a92f795c2f5be/djbrut-0.8.0.tar.gz"
}
],
"0.8.1": [
{
"comment_text": "",
"digests": {
"md5": "bcc39f36df2a215d237185faeddd6ac1",
"sha256": "2ec6ca5f82d586e904142307037e02aecf76555b26e9846376ff73175412795a"
},
"downloads": -1,
"filename": "djbrut-0.8.1.tar.gz",
"has_sig": false,
"md5_digest": "bcc39f36df2a215d237185faeddd6ac1",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 7139,
"upload_time": "2018-03-06T08:39:41",
"url": "https://files.pythonhosted.org/packages/6d/8c/df017c23eae64535d92a8d8ab3ed06ae6800fec42fb3b4313c569ad0591e/djbrut-0.8.1.tar.gz"
}
],
"1.0.0": [
{
"comment_text": "",
"digests": {
"md5": "da6d8ac05e4c88722e961df324f717da",
"sha256": "b9dafe927e75b1718f0794d16212bde49b8e457d81c04adc8b6641218589208b"
},
"downloads": -1,
"filename": "djbrut-1.0.0.tar.gz",
"has_sig": false,
"md5_digest": "da6d8ac05e4c88722e961df324f717da",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 7706,
"upload_time": "2018-04-05T10:22:00",
"url": "https://files.pythonhosted.org/packages/76/ba/f910e67250984909d7cc9dd5c501514ba66443d02ab5564e9b9137e8e4e0/djbrut-1.0.0.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "da6d8ac05e4c88722e961df324f717da",
"sha256": "b9dafe927e75b1718f0794d16212bde49b8e457d81c04adc8b6641218589208b"
},
"downloads": -1,
"filename": "djbrut-1.0.0.tar.gz",
"has_sig": false,
"md5_digest": "da6d8ac05e4c88722e961df324f717da",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 7706,
"upload_time": "2018-04-05T10:22:00",
"url": "https://files.pythonhosted.org/packages/76/ba/f910e67250984909d7cc9dd5c501514ba66443d02ab5564e9b9137e8e4e0/djbrut-1.0.0.tar.gz"
}
]
}