Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- from flask import Flask, redirect, url_for, flash, render_template, g, current_app, request
- import base64
- from io import BytesIO
- from werkzeug.security import generate_password_hash, check_password_hash
- from flask_wtf import FlaskForm, validators
- from wtforms import StringField, PasswordField, SubmitField, SelectField
- from flask_sqlalchemy import SQLAlchemy
- from wtforms.validators import Required, Length, EqualTo
- from flask_bootstrap import Bootstrap
- from flask_login import LoginManager, UserMixin, login_user, logout_user,
- current_user
- # AUTH
- from flask_sqlalchemy import BaseQuery
- from flask_principal import Principal, RoleNeed, UserNeed, Permission, Identity, identity_changed, identity_loaded, AnonymousIdentity
- from werkzeug.utils import cached_property
- app = Flask(__name__)
- app.config.update(
- SQLALCHEMY_DATABASE_URI = 'sqlite:///2028.sqlite',
- DEBUG = True,
- SECRET_KEY = 'secret'
- )
- app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
- # initialize extensions
- bootstrap = Bootstrap(app)
- db = SQLAlchemy(app)
- lm = LoginManager(app)
- Principal(app)
- # User Information providers
- @identity_loaded.connect_via(app)
- def on_identity_loaded(sender, identity):
- g.user = User.query.from_identity(identity)
- # Permission
- admin = Permission(RoleNeed('admin'))
- member = Permission(RoleNeed('member'))
- # MODELS
- class UserQuery(BaseQuery):
- def from_identity(self):
- try:
- user = self.get(int(identity))
- except ValueError:
- user = current_user
- if user:
- identity.provides.update(user.provides)
- identity.user = user
- return user
- class User(UserMixin, db.Model):
- query_class = UserQuery
- MEMBER = 100
- ADMIN = 300
- __tablename__ = 'user'
- id = db.Column(db.Integer, unique=True, nullable=False, primary_key=True)
- username = db.Column(db.String(80), unique=True, nullable=False)
- password_hash = db.Column(db.String(80))
- role = db.Column(db.Integer, default=100)
- player = db.Column(db.String, default=100)
- @property
- def password(self):
- raise AttributeError('password is not a readable attribute')
- @password.setter
- def password(self, password):
- self.password_hash = generate_password_hash(password)
- def verify_password(self, password):
- return check_password_hash(self.password_hash, password)
- @cached_property
- def permissions(self):
- return self.Permissions(self)
- @cached_property
- def provides(self):
- needs = [RoleNeed('authenticated'), UserNeed(self.id)]
- if self.is_member:
- needs.append(RoleNeed('member'))
- if self.is_admin:
- needs.append(RoleNeed('admin'))
- return needs
- @property
- def is_member(self):
- return self.role == self.MEMBER
- @property
- def is_admin(self):
- return self.role == self.ADMIN
- @lm.user_loader
- def load_user(user_id):
- """User loader callback for Flask-Login."""
- return User.query.get(int(user_id))
- # FORMS
- class CMSignupForm(FlaskForm):
- player = SelectField(validators=[Required()],
- choices=[("CM", "CM"),
- ("CA", "CA")])
- username = StringField('Username', validators=[Required(), Length(1, 9)])
- password = PasswordField("Password", validators=[Required(), Length(1, 9)])
- password_again = PasswordField('Password again',
- validators=[Required(), EqualTo('password')])
- submit = SubmitField("Signup")
- class CASignupForm(FlaskForm):
- player = SelectField(validators=[Required()],
- choices=[("CM", "CM"),
- ("CA", "CA")])
- username = StringField('Username', validators=[Required(), Length(1, 9)])
- password = PasswordField("Password", validators=[Required(), Length(1, 9)])
- password_again = PasswordField('Password again',
- validators=[Required(), EqualTo('password')])
- submit = SubmitField("Signup")
- class LoginForm(FlaskForm):
- username = StringField('Username', validators=[Required(), Length(1, 9)])
- password = PasswordField("Password", validators=[Required(), Length(1, 9)])
- submit = SubmitField("Login")
- # VIEWS
- @app.route('/')
- def index():
- user = User.query.all()
- return render_template('index.html', user=user)
- @app.route('/signup', methods=('GET', 'POST'))
- def cmsignup():
- if current_user.is_authenticated:
- # if user is logged in we get out of here
- return redirect(url_for('index'))
- form = CMSignupForm()
- if form.validate_on_submit():
- user = User()
- form.populate_obj(user)
- db.session.add(user)
- db.session.commit()
- flash('Signup Success %s' % user.username, 'success')
- return redirect(url_for('login'))
- return render_template('cmsignup.html', form=form)
- @app.route('/signup', methods=('GET', 'POST'))
- def casignup():
- if current_user.is_authenticated:
- # if user is logged in we get out of here
- return redirect(url_for('index'))
- form = CASignupForm()
- if form.validate_on_submit():
- user = User()
- form.populate_obj(user)
- db.session.add(user)
- db.session.commit()
- flash('Signup Success %s' % user.username, 'success')
- return redirect(url_for('login'))
- return render_template('casignup.html', form=form)
- @app.route('/login', methods=('GET', 'POST',))
- def login():
- """User login route."""
- if current_user.is_authenticated:
- # if user is logged in we get out of here
- return redirect(url_for('index'))
- form = LoginForm()
- if form.validate_on_submit():
- user = User.query.filter_by(username=form.username.data).first()
- if user is None or not user.verify_password(form.password.data):
- flash('ooo!')
- identity_changed.send(current_app._get_current_object(), identity=Identity(user.id))
- flash('ooo, %s' % user.username)
- return redirect(url_for('index'))
- login_user(user)
- flash('You are now logged in!')
- return redirect(url_for('cm_e_11a'))
- return render_template('login.html', form=form)
- @app.route('/logout')
- def logout():
- identity_changed.send(current_app._get_current_object(), identity=AnonymousIdentity())
- flash('oooo!')
- return redirect(url_for('index'))
- @app.route('/page')
- @admin.require(401)
- def page():
- return render_template('page.html')
- @app.errorhandler(401)
- def unauthorized(error):
- flash('Please login to see this page', 'error')
- return redirect(url_for('login', next=request.path))
- db.create_all()
- if __name__ == '__main__':
- app.run()
- File "/home/ubuntu/workspace/pb/auth.py", line 201, in login
- identity_changed.send(current_app._get_current_object(), identity=Identity(user.id))
- AttributeError: 'NoneType' object has no attribute 'id'
Add Comment
Please, Sign In to add comment