mirror of
https://github.com/wassname/flask-security.git
synced 2026-08-18 12:00:35 +08:00
First commit of refactored code and removed default models. Now meant to provide models from app level, not within Flask-Security
This commit is contained in:
+71
-40
@@ -1,128 +1,159 @@
|
||||
# a little trick so you can run:
|
||||
# $ python example/app.py
|
||||
# $ python example/app.py
|
||||
# from the root of the security project
|
||||
import sys, os
|
||||
import os
|
||||
import sys
|
||||
sys.path.pop(0)
|
||||
sys.path.insert(0, os.getcwd())
|
||||
|
||||
from flask import Flask, render_template
|
||||
from flask import Flask, render_template, current_app
|
||||
|
||||
from flask.ext.mongoengine import MongoEngine
|
||||
from flask.ext.sqlalchemy import SQLAlchemy
|
||||
|
||||
from flask.ext.security import (Security, LoginForm, user_datastore,
|
||||
login_required, roles_required, roles_accepted)
|
||||
from flask.ext.security import Security, LoginForm, login_required, \
|
||||
roles_required, roles_accepted, UserMixin, RoleMixin
|
||||
|
||||
from flask.ext.security.datastore import SQLAlchemyUserDatastore, \
|
||||
MongoEngineUserDatastore
|
||||
|
||||
from flask.ext.security.datastore.sqlalchemy import SQLAlchemyUserDatastore
|
||||
from flask.ext.security.datastore.mongoengine import MongoEngineUserDatastore
|
||||
|
||||
def create_roles():
|
||||
for role in ('admin', 'editor', 'author'):
|
||||
user_datastore.create_role(name=role)
|
||||
|
||||
current_app.security.datastore.create_role(name=role)
|
||||
|
||||
|
||||
def create_users():
|
||||
for u in (('matt','matt@lp.com','password',['admin'],True),
|
||||
('joe','joe@lp.com','password',['editor'],True),
|
||||
('jill','jill@lp.com','password',['author'],True),
|
||||
('tiya','tiya@lp.com','password',[],False)):
|
||||
user_datastore.create_user(username=u[0], email=u[1], password=u[2],
|
||||
roles=u[3], active=u[4])
|
||||
for u in (('matt', 'matt@lp.com', 'password', ['admin'], True),
|
||||
('joe', 'joe@lp.com', 'password', ['editor'], True),
|
||||
('jill', 'jill@lp.com', 'password', ['author'], True),
|
||||
('tiya', 'tiya@lp.com', 'password', [], False)):
|
||||
current_app.security.datastore.create_user(username=u[0], email=u[1],
|
||||
password=u[2], roles=u[3], active=u[4])
|
||||
|
||||
|
||||
def populate_data():
|
||||
create_roles()
|
||||
create_users()
|
||||
|
||||
|
||||
|
||||
def create_app(auth_config):
|
||||
app = Flask(__name__)
|
||||
app.debug = True
|
||||
app.config['SECRET_KEY'] = 'secret'
|
||||
|
||||
|
||||
if auth_config:
|
||||
for key, value in auth_config.items():
|
||||
app.config[key] = value
|
||||
|
||||
|
||||
@app.route('/')
|
||||
def index():
|
||||
return render_template('index.html', content='Home Page')
|
||||
|
||||
|
||||
@app.route('/login')
|
||||
def login():
|
||||
return render_template('login.html', content='Login Page', form=LoginForm())
|
||||
|
||||
|
||||
@app.route('/custom_login')
|
||||
def custom_login():
|
||||
return render_template('login.html', content='Custom Login Page', form=LoginForm())
|
||||
|
||||
|
||||
@app.route('/profile')
|
||||
@login_required
|
||||
def profile():
|
||||
return render_template('index.html', content='Profile Page')
|
||||
|
||||
|
||||
@app.route('/post_login')
|
||||
@login_required
|
||||
def post_login():
|
||||
return render_template('index.html', content='Post Login')
|
||||
|
||||
|
||||
@app.route('/post_logout')
|
||||
def post_logout():
|
||||
return render_template('index.html', content='Post Logout')
|
||||
|
||||
|
||||
@app.route('/admin')
|
||||
@roles_required('admin')
|
||||
def admin():
|
||||
return render_template('index.html', content='Admin Page')
|
||||
|
||||
|
||||
@app.route('/admin_or_editor')
|
||||
@roles_accepted('admin', 'editor')
|
||||
def admin_or_editor():
|
||||
return render_template('index.html', content='Admin or Editor Page')
|
||||
|
||||
|
||||
return app
|
||||
|
||||
|
||||
def create_sqlalchemy_app(auth_config=None):
|
||||
app = create_app(auth_config)
|
||||
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/flask_security_example.sqlite'
|
||||
|
||||
|
||||
db = SQLAlchemy(app)
|
||||
|
||||
class UserAccountMixin():
|
||||
roles_users = db.Table('roles_users',
|
||||
db.Column('user_id', db.Integer(), db.ForeignKey('role.id')),
|
||||
db.Column('role_id', db.Integer(), db.ForeignKey('user.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))
|
||||
|
||||
class User(db.Model, UserMixin):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
username = db.Column(db.String(255), unique=True)
|
||||
email = db.Column(db.String(255), unique=True)
|
||||
password = db.Column(db.String(120))
|
||||
first_name = db.Column(db.String(120))
|
||||
last_name = db.Column(db.String(120))
|
||||
active = db.Column(db.Boolean())
|
||||
created_at = db.Column(db.DateTime())
|
||||
modified_at = db.Column(db.DateTime())
|
||||
roles = db.relationship('Role', secondary=roles_users,
|
||||
backref=db.backref('users', lazy='dynamic'))
|
||||
|
||||
Security(app, SQLAlchemyUserDatastore(db, User, Role))
|
||||
|
||||
Security(app, SQLAlchemyUserDatastore(db, UserAccountMixin))
|
||||
|
||||
@app.before_first_request
|
||||
def before_first_request():
|
||||
db.drop_all()
|
||||
db.create_all()
|
||||
populate_data()
|
||||
|
||||
|
||||
return app
|
||||
|
||||
|
||||
def create_mongoengine_app(auth_config=None):
|
||||
app = create_app(auth_config)
|
||||
app.config['MONGODB_DB'] = 'flask_security_example'
|
||||
app.config['MONGODB_HOST'] = 'localhost'
|
||||
app.config['MONGODB_PORT'] = 27017
|
||||
|
||||
|
||||
db = MongoEngine(app)
|
||||
|
||||
class UserAccountMixin():
|
||||
first_name = db.StringField(max_length=120)
|
||||
last_name = db.StringField(max_length=120)
|
||||
class Role(db.Document, RoleMixin):
|
||||
name = db.StringField(required=True, unique=True, max_length=80)
|
||||
description = db.StringField(max_length=255)
|
||||
|
||||
class User(db.Document, UserMixin):
|
||||
username = db.StringField(unique=True, max_length=255)
|
||||
email = db.StringField(unique=True, max_length=255)
|
||||
password = db.StringField(required=True, max_length=120)
|
||||
active = db.BooleanField(default=True)
|
||||
roles = db.ListField(db.ReferenceField(Role), default=[])
|
||||
|
||||
Security(app, MongoEngineUserDatastore(db, User, Role))
|
||||
|
||||
Security(app, MongoEngineUserDatastore(db, UserAccountMixin))
|
||||
|
||||
@app.before_first_request
|
||||
def before_first_request():
|
||||
from flask.ext.security import User, Role
|
||||
User.drop_collection()
|
||||
Role.drop_collection()
|
||||
populate_data()
|
||||
|
||||
|
||||
return app
|
||||
|
||||
if __name__ == '__main__':
|
||||
app = create_sqlalchemy_app()
|
||||
#app = create_mongoengine_app()
|
||||
app.run()
|
||||
app.run()
|
||||
|
||||
Reference in New Issue
Block a user