X-Git-Url: http://git.datanom.net/flask-test.git/blobdiff_plain/43064c75212b8e5f05e362d8ee9acc58287f930b..db4f0ba9d4aec596f179335f1d86b3dd2bb206c6:/app/views.py diff --git a/app/views.py b/app/views.py index d467b15..e00bb0d 100644 --- a/app/views.py +++ b/app/views.py @@ -1,6 +1,129 @@ -from app import app +from flask import render_template, flash, redirect, session, url_for, request, g +from flask_login import login_user, logout_user, current_user, login_required +from datetime import datetime +from app import app, db, lm, oid +from .forms import LoginForm, EditForm +from .models import User + + +@lm.user_loader +def load_user(id): + return User.query.get(int(id)) + + +@app.before_request +def before_request(): + g.user = current_user + if g.user.is_authenticated: + g.user.last_seen = datetime.utcnow() + db.session.add(g.user) + db.session.commit() + + +@app.errorhandler(404) +def not_found_error(error): + return render_template('404.html'), 404 + + +@app.errorhandler(500) +def internal_error(error): + db.session.rollback() + return render_template('500.html'), 500 + @app.route('/') @app.route('/index') +@login_required def index(): - return "Hello, World!" + user = g.user + posts = [ + { + 'author': {'nickname': 'John'}, + 'body': 'Beautiful day in Portland!' + }, + { + 'author': {'nickname': 'Susan'}, + 'body': 'The Avengers movie was so cool!' + } + ] + return render_template('index.html', + title='Home', + user=user, + posts=posts) + + +@app.route('/login', methods=['GET', 'POST']) +@oid.loginhandler +def login(): + if g.user is not None and g.user.is_authenticated: + return redirect(url_for('index')) + form = LoginForm() + if form.validate_on_submit(): + session['remember_me'] = form.remember_me.data + return oid.try_login(form.openid.data, ask_for=['nickname', 'email']) + return render_template('login.html', + title='Sign In', + form=form, + providers=app.config['OPENID_PROVIDERS']) + + +@oid.after_login +def after_login(resp): + if resp.email is None or resp.email == "": + flash('Invalid login. Please try again.') + return redirect(url_for('login')) + user = User.query.filter_by(email=resp.email).first() + if user is None: + nickname = resp.nickname + if nickname is None or nickname == "": + nickname = resp.email.split('@')[0] + nickname = User.make_unique_nickname(nickname) + user = User(nickname=nickname, email=resp.email) + db.session.add(user) + db.session.commit() + remember_me = False + if 'remember_me' in session: + remember_me = session['remember_me'] + session.pop('remember_me', None) + login_user(user, remember=remember_me) + return redirect(request.args.get('next') or url_for('index')) + + +@app.route('/logout') +def logout(): + logout_user() + return redirect(url_for('login')) + + +@app.route('/user/') +@login_required +def user(nickname): + user = User.query.filter_by(nickname=nickname).first() + if user is None: + flash('User %s not found.' % nickname) + return redirect(url_for('index')) + posts = [ + {'author': user, 'body': 'Test post #1'}, + {'author': user, 'body': 'Test post #2'} + ] + return render_template('user.html', + user=user, + posts=posts) + + +@app.route('/edit', methods=['GET', 'POST']) +@login_required +def edit(): + form = EditForm(g.user.nickname) + if form.validate_on_submit(): + g.user.nickname = form.nickname.data + g.user.about_me = form.about_me.data + db.session.add(g.user) + db.session.commit() + flash('Your changes have been saved.') + return redirect(url_for('edit')) + elif request.method != "POST": + form.nickname.data = g.user.nickname + form.about_me.data = g.user.about_me + return render_template('edit.html', form=form) +