"""Login and logout.""" from __future__ import annotations from flask import Blueprint, flash, redirect, render_template, request, session, url_for from flask_wtf import FlaskForm from wtforms import PasswordField, StringField, SubmitField from wtforms.validators import DataRequired, Length bp = Blueprint("auth", __name__) class LoginForm(FlaskForm): username = StringField("Username", validators=[DataRequired(), Length(max=64)]) password = PasswordField("Password", validators=[DataRequired(), Length(max=128)]) submit = SubmitField("Sign in") def repo(): """The request-scoped repository (one Mongo client per request).""" from flask import current_app return current_app.extensions["beer_repo"]() @bp.route("/login", methods=["GET", "POST"]) def login(): form = LoginForm() if form.validate_on_submit(): ok = repo().user_check(form.username.data.strip(), form.password.data) if ok: session.clear() session["logged_in"] = True session["username"] = form.username.data.strip() return redirect(request.args.get("next") or url_for("brews.index")) flash("Those credentials were not recognised.", "error") return render_template("login.html", form=form) @bp.route("/logout", methods=["POST"]) def logout(): session.clear() flash("Signed out.", "info") return redirect(url_for("auth.login"))