{ "info": { "author": "Bruno Rocha", "author_email": "rochacbruno@gmail.com", "bugtrack_url": null, "classifiers": [ "Framework :: Flask", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.6", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "[![Travis](https://img.shields.io/travis/cuducos/flask_simplelogin.svg?style=flat-square)](https://travis-ci.org/cuducos/flask_simplelogin)\n[![PyPI](https://img.shields.io/pypi/v/flask_simplelogin.svg?style=flat-square)](https://pypi.org/project/flask_simplelogin/)\n[![PyPI versions](https://img.shields.io/pypi/pyversions/flask_simplelogin.svg?style=flat-square)](https://pypi.org/project/flask_simplelogin/)\n[![PyPI formats](https://img.shields.io/pypi/format/flask_simplelogin.svg?style=flat-square)](https://pypi.org/project/flask_simplelogin/)\n[![Flask](https://img.shields.io/badge/Flask-Extension-blue.svg?style=flat-square)](https://github.com/pallets/flask)\n\n# Login Extension for Flask\n\nThe simplest way to add login to flask!\n\n## Top Contributors\n\n[![](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/images/0)](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/links/0)[![](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/images/1)](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/links/1)[![](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/images/2)](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/links/2)[![](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/images/3)](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/links/3)[![](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/images/4)](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/links/4)[![](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/images/5)](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/links/5)[![](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/images/6)](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/links/6)[![](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/images/7)](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/links/7)\n\nAdd yourself, send a PR!\n\n## So why **Flask Simple Login**?\n\nSometimes you need something **simple** for that small project or for\nprototyping.\n\n## Flask Simple Login\n\nWhat it provides:\n\n- Login and Logout forms and pages\n- Function to check if user is logged-in\n- Decorator for views\n- Easy and customizable `login_checker`\n- Basic-Auth for API endpoints\n\nWhat it does not provide:\n\n- ~~Database Integration~~\n- ~~Password management~~\n- ~~API authentication with Token or JWT~~\n- ~~Role or user based access control~~\n\n> of course you can easily implement all above by your own. Take a look at [example](/example).\n\n## How it works\n\nFirst install it from [PyPI](https://pypi.org/project/flask_simplelogin/).\n\n> `pip install flask_simplelogin`\n\n```python\nfrom flask import Flask\nfrom flask_simplelogin import SimpleLogin\n\napp = Flask(__name__)\nSimpleLogin(app)\n```\n\n## **That's it!**\n\nNow you have `/login` and `/logout` routes in your application.\n\nThe username defaults to `admin` and the password defaults to `secret` (yeah that's not clever, let's see how to change it)\n\n\n![Login Screen](/login_screen.png)\n\n\n## Configuring\n\nSimple way\n\n```python\nfrom flask import Flask\nfrom flask_simplelogin import SimpleLogin\n\napp = Flask(__name__)\napp.config['SECRET_KEY'] = 'something-secret'\napp.config['SIMPLELOGIN_USERNAME'] = 'chuck'\napp.config['SIMPLELOGIN_PASSWORD'] = 'norris'\n\nSimpleLogin(app)\n```\n\nThat works, but is not so clever, lets use env vars.\n\n```bash\n$ export SIMPLELOGIN_USERNAME=chuck\n$ export SIMPLELOGIN_PASSWORD=norris\n```\n\nthen `SimpleLogin` will read those env vars automatically.\n\n```python\nfrom flask import Flask\nfrom flask_simplelogin import SimpleLogin\n\napp = Flask(__name__)\napp.config['SECRET_KEY'] = 'something-secret'\nSimpleLogin(app)\n```\n\nBut what if you have more users and more complex auth logic?\n**write a custom login checker**\n\n### Using a custom login checker\n\n```python\nfrom flask import Flask\nfrom flask_simplelogin import SimpleLogin\n\napp = Flask(__name__)\napp.config['SECRET_KEY'] = 'something-secret'\n\n\ndef only_chuck_norris_can_login(user):\n \"\"\":param user: dict {'username': 'foo', 'password': 'bar'}\"\"\"\n if user.get('username') == 'chuck' and user.get('password') == 'norris':\n return True # <--- Allowed\n return False # <--- Denied\n\n\nSimpleLogin(app, login_checker=only_chuck_norris_can_login)\n```\n\n### Using a custom login, logout or home URL\n\n`SimpleLogin` automatically loads Flask configurations prefixed with `SIMPLELOGIN_`, thus to set a custom login, logout or home URL:\n\n\n```python\nfrom flask import Flask\nfrom flask_simplelogin import SimpleLogin\n\napp = Flask(__name__)\napp.config['SECRET_KEY'] = 'something-secret'\napp.config['SIMPLELOGIN_LOGIN_URL'] = '/signin/'\napp.config['SIMPLELOGIN_LOGOUT_URL'] = '/exit/'\napp.config['SIMPLELOGIN_HOME_URL'] = '/en/'\n\nSimpleLogin(app)\n```\n\n### Encrypt passwords\n\nYou can use the `from werkzeug.security import check_password_hash, generate_password_hash`\nutilities to encrypt passwords.\n\nA working example is available in `manage.py` of [example app](https://github.com/cuducos/flask_simplelogin/blob/master/example/)\n\n\n## Checking if user is logged in\n\n```python\n\nfrom flask_simplelogin import is_logged_in\n\nif is_logged_in():\n # do things if anyone is logged in\n\nif is_logged_in('admin'):\n # do things only if admin is logged in\n```\n\n\n## Protecting your views\n\n```python\nfrom flask_simplelogin import login_required\n\n@app.route('/it_is_protected')\n@login_required # < --- simple decorator\ndef foo():\n return 'secret'\n\n@app.route('/only_mary_can_access')\n@login_required(username='mary') # < --- accepts a list of names\ndef bar():\n return \"Mary's secret\"\n\n@app.route('/api', methods=['POST'])\n@login_required(basic=True) # < --- Basic HTTP Auth for API\ndef api():\n # curl -XPOST localhost:5000/api -H \"Authorization: Basic Y2h1Y2s6bm9ycmlz\" -H \"Content-Type: application/json\"\n # Basic-Auth takes base64 encripted username:password\n return jsonify(data='You are logged in with basic auth')\n\nclass ProtectedView(MethodView): # < --- Class Based Views\n decorators = [login_required]\n def get(self):\n return \"only loged in users can see this\"\n```\n\n### Protecting Flask Admin views\n\n```python\n\nfrom flask_admin.contrib.foo import ModelView\nfrom flask_simplelogin import is_logged_in\n\n\nclass AdminView(ModelView)\n def is_accessible(self):\n return is_logged_in('admin')\n```\n\n## Customizing templates\n\nThere are only one template to customize and it is called `login.html`\n\nExample is:\n\n```html\n{% extends 'base.html' %}\n{% block title %}Login{% endblock %}\n{% block messages %}\n {{super()}}\n {%if form.errors %}\n \n {% endif %}\n{% endblock %}\n\n{% block page_body %}\n
\n
\n {{ form.csrf_token }}\n {{form.username.label}}
{{ form.username }}

\n {{form.password.label}}
{{ form.password }}

\n \n \n \n{% endblock %}\n```\n\n> Take a look at the [example app](https://github.com/cuducos/flask_simplelogin/blob/master/example/).\n\nAnd you can customize it in anyway you want and need, it receives a `form` in context and it is a `WTF form` the submit should be done to `request.path` which is the same `/login` view.\n\nYou can also use `{% if is_logged_in() %}` in your template if needed.\n\n## Customizing or translating message alerts\n\nThe default message alerts are:\n\n| key | message |\n|----------------|---------------------------|\n| login_success | login success! |\n| login_failure | invalid credentials |\n| is_logged_in | already logged in |\n| logout | Logged out! |\n| login_required | You need to login first |\n| access_denied | Access Denied |\n| auth_error | Authentication Error: {0} |\n\n> NOTE: the `{0}` in `auth_error` is a required placeholder to pass in the validator error message.\n\nAnd you can customize by passing a dictionary:\n\n```python\napp = Flask(__name__)\nmessages = {\n 'login_success': 'Voc\u00ea est\u00e1 dentro!',\n 'login_failure': 'ung\u00fcltige Anmeldeinformationen',\n 'is_logged_in': 'Iam initium',\n 'logout': 'D\u00e9connect\u00e9!',\n 'login_required': 'Devi prima accedere',\n 'access_denied': 'Acceso denegado',\n 'auth_error': '\u6388\u6b0a\u932f\u8aa4\uff1a {0}'\n}\nSimpleLogin(app, messages=messages)\n```\n\n## Custom validators\n\nPass `must` argument to `login_required` decorator, it can be a `function` or a list of `functions` if function returns `None` means **No** error and validator passed. if function returns an `\"Error message\"` means validator did not passed.\n\n```python\ndef be_admin(username):\n \"\"\"Validator to check if user has admin role\"\"\"\n user_data = my_users.get(username)\n if not user_data or 'admin' not in user_data.get('roles', []):\n return \"User does not have admin role\"\n\n\ndef have_approval(username):\n \"\"\"Validator: all users approved so return None\"\"\"\n return\n\n\n@app.route('/protected')\n@login_required(must=[be_admin, have_approval])\ndef protected():\n return render_template('secret.html')\n\n```\n\n> Take a look at the [example app](https://github.com/cuducos/flask_simplelogin/blob/master/example/).\n\n## Requirements\n\n- Flask-WTF and WTForms\n- `SECRET_KEY` set in your `app.config`\n\n## Integrations\n\n### Do you need Access Control? you can easily mix `flask_simplelogin` with `flask_allows`\n\nhttps://github.com/justanr/flask-allows\n`pip install flask_allows`\n\n```python\nfrom flask import Flask, g\nfrom flask_simplelogin import SimpleLogin\nfrom flask_allows import Allows\n\napp = Flask(__name__)\napp.config['SECRET_KEY'] = 'something-secret'\n\n\ndef is_staff(ident, request):\n return ident.permlevel == 'staff'\n\ndef only_chuck_norris_can_login(user):\n if user.get('username') == 'chuck' and user.get('password') == 'norris':\n # Bind the logged in user data to the `g` global object\n g.user.username = user['username']\n g.user.permlevel = 'staff' # set user permission level\n return True # Allowed\n return False # Denied\n\n# init allows\nallows = Allows(identity_loader=lambda: g.user)\n\n# init SimpleLogin\nSimpleLogin(app, login_checker=only_chuck_norris_can_login)\n\n# a view which requires a logged in user to be member of the staff group\n@app.route('/staff_only')\n@allows.requires(is_staff)\n@login_required\ndef a_view():\n return \"staff only can see this\"\n\n```\n\n### Need JSON Web Token (JWT)?\n\nTake a look at [Flask-JWT-Simple](https://github.com/vimalloc/flask-jwt-simple) and of course you can mix SimpleLogin + JWT Simple\n\n**Alternatives:**\n\n- [Flask-Login](https://flask-login.readthedocs.io)\n- [Flask-User](https://github.com/lingthio/Flask-User)\n- [Flask-Security](https://pythonhosted.org/Flask-Security/)\n- [Flask-Principal](https://pythonhosted.org/Flask-Principal/)\n\nThose extensions are really complete and **production ready**!\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/cuducos/flask_simplelogin", "keywords": "", "license": "", "maintainer": "Eduardo Cuducos", "maintainer_email": "cuducos@gmail.com", "name": "flask_simplelogin", "package_url": "https://pypi.org/project/flask_simplelogin/", "platform": "", "project_url": "https://pypi.org/project/flask_simplelogin/", "project_urls": { "Homepage": "https://github.com/cuducos/flask_simplelogin" }, "release_url": "https://pypi.org/project/flask_simplelogin/0.0.7/", "requires_dist": [ "flask_wtf", "Flask (>=0.12)", "click" ], "requires_python": "", "summary": "Flask Simple Login - Login Extension for Flask", "version": "0.0.7" }, "last_serial": 5969278, "releases": { "0.0.0": [ { "comment_text": "", "digests": { "md5": "7b9bd3814e27c15bf4f0b4232c2859e9", "sha256": "4ca86b2ee893fcc124baf6e14c92f55b929d053d9f48fd6d71ffe984cc11c549" }, "downloads": -1, "filename": "flask_simplelogin-0.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7b9bd3814e27c15bf4f0b4232c2859e9", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 10147, "upload_time": "2017-08-23T22:27:31", "url": "https://files.pythonhosted.org/packages/d8/ff/68c6747e62bf776352ecfb85b72d2dfe49d995cf11227dbe661b874add81/flask_simplelogin-0.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "41508ff4e024cf0118924ba091b624b8", "sha256": "ef9b9d2b7bbe3a739e6359c33fda99b620b74d179c3c073995abf18f93464026" }, "downloads": -1, "filename": "flask_simplelogin-0.0.0.tar.gz", "has_sig": false, "md5_digest": "41508ff4e024cf0118924ba091b624b8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26374, "upload_time": "2017-08-23T22:27:35", "url": "https://files.pythonhosted.org/packages/81/2a/eec186e97bb822a08f3e83552eaa072e5358be8362094f062e499bcc3a03/flask_simplelogin-0.0.0.tar.gz" } ], "0.0.1": [ { "comment_text": "", "digests": { "md5": "aec6b2eedac58b33e4ab40d44cc53be7", "sha256": "16c0fb605b7636db984d7a6ef8323780d2cb874329a8ac145a2f9618d348ef20" }, "downloads": -1, "filename": "flask_simplelogin-0.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "aec6b2eedac58b33e4ab40d44cc53be7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 10823, "upload_time": "2017-08-24T03:16:50", "url": "https://files.pythonhosted.org/packages/b6/c8/433b98b91eb6a9f5b20de22e9e79c36b0485b148bbdd2ecfa36b67f1c246/flask_simplelogin-0.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bae1b18912e499a766cbe92e4546fd8f", "sha256": "20926bf29c77d9bdf6f570fbfc5985ca2d43e95898abaeafd3834ed9350e36fb" }, "downloads": -1, "filename": "flask_simplelogin-0.0.1.tar.gz", "has_sig": false, "md5_digest": "bae1b18912e499a766cbe92e4546fd8f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26862, "upload_time": "2017-08-24T03:16:53", "url": "https://files.pythonhosted.org/packages/c0/8f/3ccaff5c993d3db2c3a80ee28d26a7ce86ee346a691a695882e3e0283d90/flask_simplelogin-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "72076cffb1afca153832e063ff0f9f8b", "sha256": "080491c549f51258251742791708ed6cec036e02565ee146f10576d109e2d9c1" }, "downloads": -1, "filename": "flask_simplelogin-0.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "72076cffb1afca153832e063ff0f9f8b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15964, "upload_time": "2017-08-26T23:45:58", "url": "https://files.pythonhosted.org/packages/75/7e/080bdc14d323f53ba7899523e23efc2614fc61c5c0af9128554f745dbccd/flask_simplelogin-0.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e017c4524dd6ee60478a1f20fd31d016", "sha256": "20d67eb3014892d13140e071e9b1fae005112ee18ac8efdd2944be323988f11a" }, "downloads": -1, "filename": "flask_simplelogin-0.0.2.tar.gz", "has_sig": false, "md5_digest": "e017c4524dd6ee60478a1f20fd31d016", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50628, "upload_time": "2017-08-26T23:46:01", "url": "https://files.pythonhosted.org/packages/d5/36/d892ddabba748bc12c0fbb4c004ff163e9adc429aa6f7bb034c9de259819/flask_simplelogin-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "bb56e8a0caac5ea9278df9c7b02ebe1b", "sha256": "f037f3c101852a23291bc93cdd0f5b23bfac4bb483b47135b98544256b81df21" }, "downloads": -1, "filename": "flask_simplelogin-0.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bb56e8a0caac5ea9278df9c7b02ebe1b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15987, "upload_time": "2017-08-26T23:49:02", "url": "https://files.pythonhosted.org/packages/30/80/625cea29fed1e8b851471714e70c4a234a41eba69374710c41faa05eb16e/flask_simplelogin-0.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a4f7decf0c3889c26c19b0f0ed48701b", "sha256": "e948c124c66e1094a99478b9540a91764d7bd5bfa01469e0eb5b387de8e4a203" }, "downloads": -1, "filename": "flask_simplelogin-0.0.3.tar.gz", "has_sig": false, "md5_digest": "a4f7decf0c3889c26c19b0f0ed48701b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50650, "upload_time": "2017-08-26T23:49:04", "url": "https://files.pythonhosted.org/packages/c1/87/efe797c6d50592eb440a2fd796d1839a417cddeb63fa4125a25f3f570c5a/flask_simplelogin-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "5aa1cd35d48e6cd86dd12009c0cfa178", "sha256": "e23d4e367c8a2ff6d1b5801dfd230b1e2dd12485e0dd259cfdb9515627b333e9" }, "downloads": -1, "filename": "flask_simplelogin-0.0.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5aa1cd35d48e6cd86dd12009c0cfa178", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16544, "upload_time": "2017-08-28T06:02:08", "url": "https://files.pythonhosted.org/packages/39/9e/9b256717305e0f658f2cef120a132a046a414dc4e97c174aa1fec68a122d/flask_simplelogin-0.0.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2b66d5cf31172c7735108d0ce8ea7d44", "sha256": "6e5ea93e18e13d12df74e6706e556a227449906967745027ec8ac4ca7db21f40" }, "downloads": -1, "filename": "flask_simplelogin-0.0.4.tar.gz", "has_sig": false, "md5_digest": "2b66d5cf31172c7735108d0ce8ea7d44", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50953, "upload_time": "2017-08-28T06:02:10", "url": "https://files.pythonhosted.org/packages/69/60/f157a2b596c0bfbe805d2a6f8462ae322b6eed1623cea337d1d37ddcbf9b/flask_simplelogin-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "12d4bb27bfe2ddebd7d94894976607c7", "sha256": "c27b95768ae1e42a2d618256532b2a4f7ebf5e0347b8bde26cc10f112f2e182b" }, "downloads": -1, "filename": "flask_simplelogin-0.0.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "12d4bb27bfe2ddebd7d94894976607c7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 17154, "upload_time": "2017-09-02T17:24:04", "url": "https://files.pythonhosted.org/packages/96/99/84781ed189c47dcda260be534c2741c4b96b8a81cbed6506fe9ec6cc2ba3/flask_simplelogin-0.0.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "69d508e39d9aac75b9df8a6a3338e9a9", "sha256": "e51eea4098d0839f69c7789763f890cfa6c11945a824e5144698dd43a818164d" }, "downloads": -1, "filename": "flask_simplelogin-0.0.5.tar.gz", "has_sig": false, "md5_digest": "69d508e39d9aac75b9df8a6a3338e9a9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52906, "upload_time": "2017-09-02T17:24:07", "url": "https://files.pythonhosted.org/packages/f1/67/3442b86b496fd50cb235d6b51d2954ca8a29633b71c6a2597283798d6bf2/flask_simplelogin-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "c56ff71be94c695fa4b5e27f97026210", "sha256": "0be2687456d4717bc44d0506e20c0f5eb4f06edd1a31fca379ff4d235199e374" }, "downloads": -1, "filename": "flask_simplelogin-0.0.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c56ff71be94c695fa4b5e27f97026210", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 17597, "upload_time": "2017-09-06T16:38:14", "url": "https://files.pythonhosted.org/packages/30/bf/533cb931f06d15062d93ccb23c1c3ce87f3ba2b0dae53a7bfd0d0788339f/flask_simplelogin-0.0.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7ed982b7da5dbe6a84fe71c3eccdf1f9", "sha256": "fa58c5c92746c0c29982bddfe0736fdb3f2256373f555e8529e36f610c815a05" }, "downloads": -1, "filename": "flask_simplelogin-0.0.6.tar.gz", "has_sig": false, "md5_digest": "7ed982b7da5dbe6a84fe71c3eccdf1f9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 54568, "upload_time": "2017-09-06T16:38:17", "url": "https://files.pythonhosted.org/packages/a1/7d/bf37a343adae36d33aadcdf8751401c9cfd8901a07d53c5a51a34ab871d2/flask_simplelogin-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "5a29d0127555bca3f44a03d9f324e538", "sha256": "35f4f62ad8d88ab0dabf667a696f931ebc89213775b87753179c7d944702cf9c" }, "downloads": -1, "filename": "flask_simplelogin-0.0.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5a29d0127555bca3f44a03d9f324e538", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 18223, "upload_time": "2019-10-14T00:25:51", "url": "https://files.pythonhosted.org/packages/14/f3/5aa36ed74abdd32ca5c6394e71244df962d795cb9f9c850238c889e5e4da/flask_simplelogin-0.0.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f40c7bae8c0529a5de23e3d9d23c14d5", "sha256": "338d6d54cc00a7df043979e3a362a05fef427855a57ad609707ef8b4eec91b9d" }, "downloads": -1, "filename": "flask_simplelogin-0.0.7.tar.gz", "has_sig": false, "md5_digest": "f40c7bae8c0529a5de23e3d9d23c14d5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37651, "upload_time": "2019-10-14T00:25:55", "url": "https://files.pythonhosted.org/packages/23/fb/732df9ec0725c35d7759d797428c768992ad8ba7c906595d02330b42735c/flask_simplelogin-0.0.7.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "5a29d0127555bca3f44a03d9f324e538", "sha256": "35f4f62ad8d88ab0dabf667a696f931ebc89213775b87753179c7d944702cf9c" }, "downloads": -1, "filename": "flask_simplelogin-0.0.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5a29d0127555bca3f44a03d9f324e538", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 18223, "upload_time": "2019-10-14T00:25:51", "url": "https://files.pythonhosted.org/packages/14/f3/5aa36ed74abdd32ca5c6394e71244df962d795cb9f9c850238c889e5e4da/flask_simplelogin-0.0.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f40c7bae8c0529a5de23e3d9d23c14d5", "sha256": "338d6d54cc00a7df043979e3a362a05fef427855a57ad609707ef8b4eec91b9d" }, "downloads": -1, "filename": "flask_simplelogin-0.0.7.tar.gz", "has_sig": false, "md5_digest": "f40c7bae8c0529a5de23e3d9d23c14d5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37651, "upload_time": "2019-10-14T00:25:55", "url": "https://files.pythonhosted.org/packages/23/fb/732df9ec0725c35d7759d797428c768992ad8ba7c906595d02330b42735c/flask_simplelogin-0.0.7.tar.gz" } ] }