implemented basis of login, missing database connection.

This commit is contained in:
2026-03-04 22:16:50 +01:00
parent 35c93a8c10
commit cf4a611231
11 changed files with 170 additions and 6 deletions
+18 -6
View File
@@ -1,18 +1,30 @@
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
db = SQLAlchemy()
login_manager = LoginManager()
def create_app():
app = Flask(__name__)
# Basic config
app.config["SQLALCHEMY_DATABASE_URI"] = ""
app.config["SECRET_KEY"] = "dev-secret-key"
# # ---- Register Blueprints (Routes) ----
# from .routes.auth_routes import auth_bp
# from .routes.solver_routes import solver_bp
db.init_app(app)
login_manager.init_app(app)
login_manager.login_view = "login.login"
from .models.user import User
@login_manager.user_loader
def load_user(user_id):
return db.session.get(User, int(user_id))
from .routes.login_routes import login_bp
from .routes.main_routes import main_bp
# app.register_blueprint(auth_bp)
# app.register_blueprint(solver_bp)
app.register_blueprint(login_bp)
app.register_blueprint(main_bp)
return app
Binary file not shown.
Binary file not shown.
+14
View File
@@ -0,0 +1,14 @@
from .. import db
from flask_login import UserMixin
class User(UserMixin, db.Model):
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
password = db.Column(db.String(255), nullable=False) # <- größer!
email = db.Column(db.String(120), unique=True, nullable=False)
created_at = db.Column(db.DateTime, server_default=db.func.now())
def __repr__(self):
return f"<User {self.username}>"
Binary file not shown.
Binary file not shown.
+49
View File
@@ -0,0 +1,49 @@
from flask import Blueprint, render_template, request, url_for, redirect
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import login_user
from ..models.user import User
from .. import db
login_bp = Blueprint("login", __name__)
@login_bp.route("/register", methods=["GET", "POST"])
def register():
if request.method == "POST":
username = request.form.get("username")
password = request.form.get("password")
email = request.form.get("email")
if User.query.filter_by(username=username).first():
return render_template("sign_up.html", error="Username already taken!")
hashed_password = generate_password_hash(password)
new_user = User(
username=username,
password=hashed_password,
email=email
)
db.session.add(new_user)
db.session.commit()
return redirect(url_for("login.login"))
return render_template("sign_up.html")
@login_bp.route("/login", methods=["GET", "POST"])
def login():
if request.method == "POST":
username = request.form.get("username")
password = request.form.get("password")
user = User.query.filter_by(username=username).first()
if user and check_password_hash(user.password, password):
login_user(user)
return redirect(url_for("main.dashboard"))
return render_template("login.html", error="Invalid username or password")
return render_template("login.html")
+41
View File
@@ -0,0 +1,41 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login</title>
<style>
h1 {
color: green;
}
.error {
color: red;
}
</style>
</head>
<body>
<nav>
<ul>
<li><a href="/login">Login</a></li>
<li><a href="/register">Create account</a></li>
</ul>
</nav>
<h1>Login to your account</h1>
{% if error %}
<p class="error">{{ error }}</p>
{% endif %}
<form action="/login" method="post">
<label for="username">Username:</label>
<input type="text" name="username" required />
<label for="password">Password:</label>
<input type="password" name="password" required />
<button type="submit">Login</button>
</form>
</body>
</html>
+41
View File
@@ -0,0 +1,41 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sign Up</title>
<style>
h1 {
color: green;
}
.error {
color: red;
}
</style>
</head>
<body>
<nav>
<ul>
<li><a href="/login">Login</a></li>
<li><a href="/register">Create account</a></li>
</ul>
</nav>
<h1>Create an account</h1>
{% if error %}
<p class="error">{{ error }}</p>
{% endif %}
<form action="/register" method="post">
<label for="username">Username:</label>
<input type="text" name="username" required />
<label for="password">Password:</label>
<input type="password" name="password" required />
<button type="submit">Sign Up</button>
</form>
</body>
</html>