switch to flask_login, finish login implementation, add basic home page

This commit is contained in:
2026-02-24 17:34:55 +01:00
parent 6d53b40118
commit 3970507239
5 changed files with 67 additions and 6 deletions
+8 -1
View File
@@ -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
+16
View File
@@ -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
+12 -4
View File
@@ -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")
+16 -1
View File
@@ -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")
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)
+15
View File
@@ -0,0 +1,15 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Home Page</title>
<link
rel="stylesheet"
href="{{ url_for('static', filename='style.css') }}"
/>
</head>
<body>
<h1>logged in</h1>
<p>hi, {{ username }}!</p>
</html>