switch to flask_login, finish login implementation, add basic home page
This commit is contained in:
+8
-1
@@ -1,9 +1,15 @@
|
|||||||
from flask import Flask
|
from flask import Flask
|
||||||
from flask_socketio import SocketIO
|
from flask_socketio import SocketIO
|
||||||
|
from flask_login import LoginManager
|
||||||
from .db import close_db, init_db
|
from .db import close_db, init_db
|
||||||
|
from app.models.user import User
|
||||||
|
|
||||||
sIO = SocketIO()
|
sIO = SocketIO()
|
||||||
|
login_manager = LoginManager()
|
||||||
|
|
||||||
|
@login_manager.user_loader
|
||||||
|
def load_user(user_id):
|
||||||
|
return User.get(user_id)
|
||||||
|
|
||||||
def create_app():
|
def create_app():
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
@@ -12,6 +18,7 @@ def create_app():
|
|||||||
app.teardown_appcontext(close_db)
|
app.teardown_appcontext(close_db)
|
||||||
|
|
||||||
sIO.init_app(app)
|
sIO.init_app(app)
|
||||||
|
login_manager.init_app(app)
|
||||||
|
|
||||||
from .routes.auth import auth_bp
|
from .routes.auth import auth_bp
|
||||||
from .routes.main import main_bp
|
from .routes.main import main_bp
|
||||||
|
|||||||
@@ -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
@@ -1,7 +1,10 @@
|
|||||||
from flask import Blueprint, render_template, request, redirect, url_for, session, flash
|
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 app.db import get_db
|
||||||
from werkzeug.security import generate_password_hash, check_password_hash
|
from werkzeug.security import generate_password_hash, check_password_hash
|
||||||
|
|
||||||
|
from app.models.user import User
|
||||||
|
|
||||||
auth_bp = Blueprint("auth", __name__)
|
auth_bp = Blueprint("auth", __name__)
|
||||||
|
|
||||||
@auth_bp.route("/login", methods=["GET", "POST"])
|
@auth_bp.route("/login", methods=["GET", "POST"])
|
||||||
@@ -11,11 +14,16 @@ def login():
|
|||||||
password = request.form["password"]
|
password = request.form["password"]
|
||||||
|
|
||||||
db = get_db()
|
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):
|
if row and check_password_hash(row["password"], password):
|
||||||
session["user_id"] = user["id"]
|
user = User(id=row["id"], username=row["username"])
|
||||||
return redirect(url_for("main.main"))
|
login_user(user)
|
||||||
|
|
||||||
|
return redirect(url_for("main.home"))
|
||||||
else:
|
else:
|
||||||
flash("Invalid username or password")
|
flash("Invalid username or password")
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,22 @@
|
|||||||
from flask import Blueprint, render_template
|
from flask import Blueprint, render_template
|
||||||
|
from flask_login import login_required, current_user
|
||||||
|
|
||||||
main_bp = Blueprint("main", __name__)
|
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"])
|
@main_bp.route("/", methods=["GET", "POST"])
|
||||||
def main():
|
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)
|
||||||
@@ -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>
|
||||||
Reference in New Issue
Block a user