import functools from flask import ( Blueprint, flash, g, redirect, render_template, request, session, url_for ) from werkzeug.exceptions import abort from werkzeug.security import check_password_hash from www.db import get_db bp = Blueprint('admin', __name__, url_prefix='/admin') @bp.route('/login', methods=('GET', 'POST')) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] db = get_db() error = None user = db.execute( 'SELECT * FROM users WHERE username = ?', (username,) ).fetchone() if user is None: error = 'Incorrect username.' elif not check_password_hash(user['password'], password): error = 'Incorrect password.' if error is None: session.clear() session['user_id'] = user['id'] return redirect(url_for('blog.index')) flash(error) return render_template('admin/login.html') @bp.route('/logout') def logout(): session.clear() return redirect(url_for('blog.index')) @bp.before_app_request def load_logged_in_user(): user_id = session.get('user_id') if user_id is None: g.user = None else: g.user = get_db().execute( 'SELECT * FROM users WHERE id = ?', (user_id,) ).fetchone() def admin_required(view): @functools.wraps(view) def wrapped_view(**kwargs): if g.user is None: return redirect(abort(404)) return view(**kwargs) return wrapped_view