| @ -0,0 +1,11 @@ | |||
| from flask_wtf import FlaskForm | |||
| from wtforms import StringField, PasswordField, BooleanField, SubmitField | |||
| from wtforms.validators import DataRequired, Length, Email | |||
| class LoginForm(FlaskForm): | |||
| email = StringField('Email', validators=[DataRequired(), Length(1, 64), | |||
| Email()]) | |||
| password = PasswordField('Password', validators=[DataRequired()]) | |||
| remember_me = BooleanField('Keep me logged in') | |||
| submit = SubmitField('Log in') | |||
| @ -1,7 +1,28 @@ | |||
| from flask import render_template | |||
| from flask import render_template, redirect, request, url_for, flash | |||
| from flask_login import login_user, logout_user, login_required | |||
| from . import auth | |||
| from ..models import User | |||
| from .forms import LoginForm | |||
| @auth.route('/login') | |||
| @auth.route('/login', methods=['GET', 'POST']) | |||
| def login(): | |||
| return render_template('auth/login.html') | |||
| form = LoginForm() | |||
| if form.validate_on_submit(): | |||
| user = User.query.filter_by(email=form.email.data).first() | |||
| if user is not None and user.verify_password(form.password.data): | |||
| login_user(user, form.remember_me.data) | |||
| next = request.args.get('next') | |||
| if next is None or not next.startswith('/'): | |||
| next = url_for('main.index') | |||
| return redirect(next) | |||
| flash('Invalid username or password') | |||
| return render_template('auth/login.html', form=form) | |||
| @auth.route('/logout') | |||
| @login_required | |||
| def logout(): | |||
| logout_user() | |||
| flash('You have been logged out.') | |||
| return redirect(url_for('main.index')) | |||
| @ -1,29 +1,7 @@ | |||
| from flask import render_template, session, redirect, url_for, current_app | |||
| from .. import db | |||
| from ..models import User | |||
| from ..email import send_email | |||
| from flask import render_template | |||
| from . import main | |||
| from .forms import NameForm | |||
| @main.route('/', methods=['GET', 'POST']) | |||
| def index(): | |||
| form = NameForm() | |||
| if form.validate_on_submit(): | |||
| user = User.query.filter_by(username=form.name.data).first() | |||
| if user is None: | |||
| user = User(username=form.name.data) | |||
| db.session.add(user) | |||
| db.session.commit() | |||
| session['known'] = False | |||
| if current_app.config['FLASKY_ADMIN']: | |||
| send_email(current_app.config['FLASKY_ADMIN'], 'New user', | |||
| 'mail/new_user', user=user) | |||
| else: | |||
| session['known'] = True | |||
| session['name'] = form.name.data | |||
| form.name.data = '' | |||
| return redirect(url_for('.index')) | |||
| return render_template('index.html', | |||
| form=form, name=session.get('name'), | |||
| known=session.get('known', False)) | |||
| return render_template('index.html') | |||
| @ -1,16 +1,9 @@ | |||
| {% extends "base.html" %} | |||
| {% import "bootstrap/wtf.html" as wtf %} | |||
| {% block title %}Flasky{% endblock %} | |||
| {% block page_content %} | |||
| <div class="page-header"> | |||
| <h1>Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!</h1> | |||
| {% if not known %} | |||
| <p>Pleased to meet you!</p> | |||
| {% else %} | |||
| <p>Happy to see you again!</p> | |||
| {% endif %} | |||
| <h1>Hello, {% if current_user.is_authenticated %}{{ current_user.username }}{% else %}Stranger{% endif %}!</h1> | |||
| </div> | |||
| {{ wtf.quick_form(form) }} | |||
| {% endblock %} | |||
| @ -0,0 +1,30 @@ | |||
| """empty message | |||
| Revision ID: 655013143dbb | |||
| Revises: e7148b675688 | |||
| Create Date: 2018-11-01 23:41:21.492859 | |||
| """ | |||
| from alembic import op | |||
| import sqlalchemy as sa | |||
| # revision identifiers, used by Alembic. | |||
| revision = '655013143dbb' | |||
| down_revision = 'e7148b675688' | |||
| branch_labels = None | |||
| depends_on = None | |||
| def upgrade(): | |||
| # ### commands auto generated by Alembic - please adjust! ### | |||
| op.add_column('users', sa.Column('email', sa.String(length=64), nullable=True)) | |||
| op.create_index(op.f('ix_users_email'), 'users', ['email'], unique=True) | |||
| # ### end Alembic commands ### | |||
| def downgrade(): | |||
| # ### commands auto generated by Alembic - please adjust! ### | |||
| op.drop_index(op.f('ix_users_email'), table_name='users') | |||
| op.drop_column('users', 'email') | |||
| # ### end Alembic commands ### | |||