Spaces:
Runtime error
Runtime error
| import functools | |
| from flask import Blueprint | |
| from flask import flash | |
| from flask import g | |
| from flask import redirect | |
| from flask import render_template | |
| from flask import request | |
| from flask import session | |
| from flask import url_for | |
| from werkzeug.security import check_password_hash | |
| from werkzeug.security import generate_password_hash | |
| bp = Blueprint("auth", __name__, url_prefix="/auth") | |
| def login_required(view): | |
| """View decorator that redirects anonymous users to the login page.""" | |
| def wrapped_view(**kwargs): | |
| if g.user is None: | |
| return redirect(url_for("auth.login")) | |
| return view(**kwargs) | |
| return wrapped_view | |
| def load_logged_in_user(): | |
| """If a user id is stored in the session, load the user object from | |
| the database into ``g.user``.""" | |
| user_id = session.get("user_id") | |
| if user_id is None: | |
| g.user = None | |
| else: | |
| g.user = ( | |
| get_db().execute("SELECT * FROM user WHERE id = ?", (user_id,)).fetchone() | |
| ) | |
| def register(): | |
| """Register a new user. | |
| Validates that the username is not already taken. Hashes the | |
| password for security. | |
| """ | |
| if request.method == "POST": | |
| username = request.form["username"] | |
| password = request.form["password"] | |
| db = get_db() | |
| error = None | |
| if not username: | |
| error = "Username is required." | |
| elif not password: | |
| error = "Password is required." | |
| if error is None: | |
| try: | |
| db.execute( | |
| "INSERT INTO user (username, password) VALUES (?, ?)", | |
| (username, generate_password_hash(password)), | |
| ) | |
| db.commit() | |
| except db.IntegrityError: | |
| # The username was already taken, which caused the | |
| # commit to fail. Show a validation error. | |
| error = f"User {username} is already registered." | |
| else: | |
| # Success, go to the login page. | |
| return redirect(url_for("auth.login")) | |
| flash(error) | |
| return render_template("auth/register.html") | |
| def login(): | |
| """Log in a registered user by adding the user id to the session.""" | |
| if request.method == "POST": | |
| team_number = request.form["team_number"] | |
| team_size = request.form["team_size"] | |
| if user is None: | |
| error = "Incorrect username." | |
| elif not check_password_hash(user["password"], password): | |
| error = "Incorrect password." | |
| if error is None: | |
| # store the user id in a new session and return to the index | |
| session.clear() | |
| session["user_id"] = user["id"] | |
| return redirect(url_for("index")) | |
| flash(error) | |
| return render_template("auth/login.html") | |
| def logout(): | |
| """Clear the current session, including the stored user id.""" | |
| session.clear() | |
| return redirect(url_for("index")) | |