123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- import os
- from flask import Flask, url_for, redirect, render_template, request, abort
- from flask_sqlalchemy import SQLAlchemy
- from flask_security import Security, SQLAlchemyUserDatastore, \
- UserMixin, RoleMixin, login_required, current_user
- from flask_security.utils import encrypt_password
- import flask_admin
- from flask_admin.contrib import sqla
- from flask_admin import helpers as admin_helpers
- # Create Flask application
- app = Flask(__name__)
- app.config.from_pyfile('config.py')
- db = SQLAlchemy(app)
- # Define models
- roles_users = db.Table(
- 'roles_users',
- db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
- db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))
- )
- class Role(db.Model, RoleMixin):
- id = db.Column(db.Integer(), primary_key=True)
- name = db.Column(db.String(80), unique=True)
- description = db.Column(db.String(255))
- def __str__(self):
- return self.name
- class User(db.Model, UserMixin):
- id = db.Column(db.Integer, primary_key=True)
- first_name = db.Column(db.String(255))
- last_name = db.Column(db.String(255))
- email = db.Column(db.String(255), unique=True)
- password = db.Column(db.String(255))
- active = db.Column(db.Boolean())
- confirmed_at = db.Column(db.DateTime())
- roles = db.relationship('Role', secondary=roles_users,
- backref=db.backref('users', lazy='dynamic'))
- def __str__(self):
- return self.email
- # Setup Flask-Security
- user_datastore = SQLAlchemyUserDatastore(db, User, Role)
- security = Security(app, user_datastore)
- # Create customized model view class
- class MyModelView(sqla.ModelView):
- def is_accessible(self):
- if not current_user.is_active or not current_user.is_authenticated:
- return False
- if current_user.has_role('superuser'):
- return True
- return False
- def _handle_view(self, name, **kwargs):
- """
- Override builtin _handle_view in order to redirect users when a view is not accessible.
- """
- if not self.is_accessible():
- if current_user.is_authenticated:
- # permission denied
- abort(403)
- else:
- # login
- return redirect(url_for('security.login', next=request.url))
- # Flask views
- @app.route('/')
- def index():
- return render_template('index.html')
- # Create admin
- admin = flask_admin.Admin(
- app,
- 'Example: Auth',
- base_template='my_master.html',
- template_mode='bootstrap3',
- )
- # Add model views
- admin.add_view(MyModelView(Role, db.session))
- admin.add_view(MyModelView(User, db.session))
- # define a context processor for merging flask-admin's template context into the
- # flask-security views.
- @security.context_processor
- def security_context_processor():
- return dict(
- admin_base_template=admin.base_template,
- admin_view=admin.index_view,
- h=admin_helpers,
- get_url=url_for
- )
- def build_sample_db():
- """
- Populate a small db with some example entries.
- """
- import string
- import random
- db.drop_all()
- db.create_all()
- with app.app_context():
- user_role = Role(name='user')
- super_user_role = Role(name='superuser')
- db.session.add(user_role)
- db.session.add(super_user_role)
- db.session.commit()
- test_user = user_datastore.create_user(
- first_name='Admin',
- email='admin',
- password=encrypt_password('admin'),
- roles=[user_role, super_user_role]
- )
- first_names = [
- 'Harry', 'Amelia', 'Oliver', 'Jack', 'Isabella', 'Charlie', 'Sophie', 'Mia',
- 'Jacob', 'Thomas', 'Emily', 'Lily', 'Ava', 'Isla', 'Alfie', 'Olivia', 'Jessica',
- 'Riley', 'William', 'James', 'Geoffrey', 'Lisa', 'Benjamin', 'Stacey', 'Lucy'
- ]
- last_names = [
- 'Brown', 'Smith', 'Patel', 'Jones', 'Williams', 'Johnson', 'Taylor', 'Thomas',
- 'Roberts', 'Khan', 'Lewis', 'Jackson', 'Clarke', 'James', 'Phillips', 'Wilson',
- 'Ali', 'Mason', 'Mitchell', 'Rose', 'Davis', 'Davies', 'Rodriguez', 'Cox', 'Alexander'
- ]
- for i in range(len(first_names)):
- tmp_email = first_names[i].lower() + "." + last_names[i].lower() + "@example.com"
- tmp_pass = ''.join(random.choice(string.ascii_lowercase + string.digits) for i in range(10))
- user_datastore.create_user(
- first_name=first_names[i],
- last_name=last_names[i],
- email=tmp_email,
- password=encrypt_password(tmp_pass),
- roles=[user_role, ]
- )
- db.session.commit()
- return
- if __name__ == '__main__':
- # Build a sample db on the fly, if one does not exist yet.
- app_dir = os.path.realpath(os.path.dirname(__file__))
- database_path = os.path.join(app_dir, app.config['DATABASE_FILE'])
- if not os.path.exists(database_path):
- build_sample_db()
- # Start app
- app.run(debug=True)
|