from flask import Flask, render_template, request, redirect, url_for, session, flash from werkzeug.security import generate_password_hash, check_password_hash from supabase import create_client import joblib import numpy as np import os import skops.io as sio app = Flask(__name__) app.secret_key = "supersecretkey" # change in production # -------- Supabase setup -------- SUPABASE_URL = os.environ.get("SUPABASE_URL") SUPABASE_KEY = os.environ.get("SUPABASE_KEY") if not SUPABASE_URL or not SUPABASE_KEY: raise ValueError("Supabase URL or KEY not set in environment variables") supabase = create_client(SUPABASE_URL, SUPABASE_KEY) # -------- Load ML model -------- # model = joblib.load("rf_house_price_model.joblib") model = sio.load("rf_house_price_model.skops") #titanic_model = joblib.load("titanic_rf_model.joblib") titanic_model = sio.load("titanic_rf_model.skops") # Load Heart Disease model heart_model = sio.load("heart_rf.skops") # -------- Routes -------- @app.route("/") def index(): if "username" in session: return redirect(url_for("home")) return redirect(url_for("login")) # Signup @app.route("/signup", methods=["GET", "POST"]) def signup(): if request.method == "POST": username = request.form["username"] password_hashed = generate_password_hash(request.form["password"]) # Check if username exists res = supabase.table("users").select("*").eq("username", username).execute() if res.data: flash("Username already exists. Try another one.", "error") return redirect(url_for("signup")) # Insert new user supabase.table("users").insert({"username": username, "password": password_hashed}).execute() flash("Signup successful! Please log in.", "success") return redirect(url_for("login")) return render_template("signup.html") # Login @app.route("/login", methods=["GET", "POST"]) def login(): if request.method == "POST": username = request.form["username"] password = request.form["password"] res = supabase.table("users").select("*").eq("username", username).execute() if res.data and check_password_hash(res.data[0]["password"], password): session["username"] = username flash("Login successful!", "success") return redirect(url_for("home")) flash("Invalid credentials. Try again.", "error") return redirect(url_for("login")) return render_template("login.html") # Logout @app.route("/logout") def logout(): session.pop("username", None) flash("You have been logged out.", "info") return redirect(url_for("login")) # Home page @app.route("/home") def home(): if "username" not in session: return redirect(url_for("login")) return render_template("home.html", username=session["username"]) #COUNTDOWN @app.route("/countdown") def countdown(): if "username" not in session: return redirect(url_for("login")) return render_template("countdown.html", username=session["username"]) # Predict page @app.route("/predict", methods=["GET", "POST"]) def predict(): if "username" not in session: return redirect(url_for("login")) prediction = None if request.method == "POST": features = [ float(request.form["longitude"]), float(request.form["latitude"]), float(request.form["housing_median_age"]), float(request.form["total_rooms"]), float(request.form["total_bedrooms"]), float(request.form["population"]), float(request.form["households"]), float(request.form["median_income"]), float(request.form["rooms_per_household"]) ] prediction = round(model.predict([features])[0], 2) return render_template("predict.html", prediction=prediction) @app.route("/titanic", methods=["GET", "POST"]) def titanic(): if "username" not in session: return redirect(url_for("login")) prediction = None if request.method == "POST": # Example Titanic features (adjust to your model) features = [ float(request.form["pclass"]), float(request.form["sex"]), # encode 0=male,1=female float(request.form["age"]), float(request.form["sibsp"]), float(request.form["parch"]), float(request.form["fare"]), float(request.form["alone"]), # encode 0=False,1=True float(request.form["IsAlone"]), # encode 0=False,1=True float(request.form["FamilySize"]), float(request.form["embarked_Q"]), # encode 0=False,1=True float(request.form["embarked_S"]) # encode 0=False,1=True ] prediction = titanic_model.predict([features])[0] return render_template("titanic.html", prediction=prediction) @app.route("/heart", methods=["GET", "POST"]) def heart(): if "username" not in session: return redirect(url_for("login")) prediction = None if request.method == "POST": features = [ float(request.form["age"]), float(request.form["sex"]), float(request.form["cp"]), float(request.form["trestbps"]), float(request.form["chol"]), float(request.form["fbs"]), float(request.form["restecg"]), float(request.form["thalach"]), float(request.form["exang"]), float(request.form["oldpeak"]), float(request.form["slope"]), float(request.form["ca"]), float(request.form["thal"]) ] prediction = heart_model.predict([features])[0] return render_template("heart.html", prediction=prediction) if __name__ == "__main__": app.run(host="0.0.0.0", port=7860)