From 397050723956207d186394bd46e00eb233f21dc5 Mon Sep 17 00:00:00 2001 From: tototomate123 Date: Tue, 24 Feb 2026 17:34:55 +0100 Subject: [PATCH] switch to flask_login, finish login implementation, add basic home page --- app/__init__.py | 9 ++++++++- app/models/user.py | 16 ++++++++++++++++ app/routes/auth.py | 16 ++++++++++++---- app/routes/main.py | 17 ++++++++++++++++- app/templates/home.html | 15 +++++++++++++++ 5 files changed, 67 insertions(+), 6 deletions(-) create mode 100644 app/models/user.py create mode 100644 app/templates/home.html diff --git a/app/__init__.py b/app/__init__.py index 863e1f9..1d44a5e 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,9 +1,15 @@ from flask import Flask from flask_socketio import SocketIO +from flask_login import LoginManager from .db import close_db, init_db - +from app.models.user import User sIO = SocketIO() +login_manager = LoginManager() + +@login_manager.user_loader +def load_user(user_id): + return User.get(user_id) def create_app(): app = Flask(__name__) @@ -12,6 +18,7 @@ def create_app(): app.teardown_appcontext(close_db) sIO.init_app(app) + login_manager.init_app(app) from .routes.auth import auth_bp from .routes.main import main_bp diff --git a/app/models/user.py b/app/models/user.py new file mode 100644 index 0000000..170c538 --- /dev/null +++ b/app/models/user.py @@ -0,0 +1,16 @@ +from typing import Optional +from app.db import get_db +from flask_login import UserMixin + +class User(UserMixin): + def __init__(self, id: int, username: str ): + self.id: int = id + self.username: str = username + + @staticmethod + def get(user_id: int | str) -> Optional["User"]: + db = get_db() + user = db.execute("SELECT * FROM users WHERE id = ?", (user_id,)).fetchone() + if user: + return User(user["id"], user["username"]) + return None \ No newline at end of file diff --git a/app/routes/auth.py b/app/routes/auth.py index 8a0944a..2998c5a 100644 --- a/app/routes/auth.py +++ b/app/routes/auth.py @@ -1,7 +1,10 @@ from flask import Blueprint, render_template, request, redirect, url_for, session, flash +from flask_login import login_user from app.db import get_db from werkzeug.security import generate_password_hash, check_password_hash +from app.models.user import User + auth_bp = Blueprint("auth", __name__) @auth_bp.route("/login", methods=["GET", "POST"]) @@ -11,11 +14,16 @@ def login(): password = request.form["password"] db = get_db() - user = db.execute("SELECT * FROM users WHERE username = ?", (username,)).fetchone() + row = db.execute( + "SELECT * FROM users WHERE username = ?", + (username,) + ).fetchone() - if user and check_password_hash(user["password"], password): - session["user_id"] = user["id"] - return redirect(url_for("main.main")) + if row and check_password_hash(row["password"], password): + user = User(id=row["id"], username=row["username"]) + login_user(user) + + return redirect(url_for("main.home")) else: flash("Invalid username or password") diff --git a/app/routes/main.py b/app/routes/main.py index b1b57dc..61d1e67 100644 --- a/app/routes/main.py +++ b/app/routes/main.py @@ -1,7 +1,22 @@ from flask import Blueprint, render_template +from flask_login import login_required, current_user main_bp = Blueprint("main", __name__) +""" def login_required(view): + @wraps(view) + def wrapped_view(**kwargs): + if "user_id" not in session: + return redirect(url_for("auth.login")) + return view(**kwargs) + return wrapped_view + """ + @main_bp.route("/", methods=["GET", "POST"]) def main(): - return render_template("main.html") \ No newline at end of file + return render_template("main.html") + +@main_bp.route("/home", methods=["GET", "POST"]) +@login_required +def home(): + return render_template("home.html", username=current_user.username) \ No newline at end of file diff --git a/app/templates/home.html b/app/templates/home.html new file mode 100644 index 0000000..7efd7dd --- /dev/null +++ b/app/templates/home.html @@ -0,0 +1,15 @@ + + + + + + Home Page + + + +

logged in

+

hi, {{ username }}!

+