{
"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": "[](https://travis-ci.org/cuducos/flask_simplelogin)\n[](https://pypi.org/project/flask_simplelogin/)\n[](https://pypi.org/project/flask_simplelogin/)\n[](https://pypi.org/project/flask_simplelogin/)\n[](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/links/0)[](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/links/1)[](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/links/2)[](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/links/3)[](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/links/4)[](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/links/5)[](https://sourcerer.io/fame/cuducos/cuducos/flask_simplelogin/links/6)[](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\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 {% for field, errors in form.errors.items() %}\n
{{field}} {% for error in errors %}{{ error }}{% endfor %}