Spaces:
Sleeping
Sleeping
| from flask import Flask, render_template, request, redirect, url_for, flash, session | |
| from werkzeug.security import generate_password_hash, check_password_hash | |
| import json | |
| import os | |
| app = Flask(__name__) | |
| app.secret_key = os.environ.get("FLASK_SECRET", "please-change-this-secret") # change in production | |
| DB_PATH = os.path.join(os.getcwd(), "arshdb") # file named exactly "arshdb" in project root | |
| # Ensure DB file exists and is valid JSON array | |
| def ensure_db(): | |
| if not os.path.exists(DB_PATH): | |
| with open(DB_PATH, "w") as f: | |
| json.dump([], f) | |
| def load_db(): | |
| ensure_db() | |
| with open(DB_PATH, "r") as f: | |
| try: | |
| data = json.load(f) | |
| if not isinstance(data, list): | |
| # Reset to empty list if corrupted | |
| return [] | |
| return data | |
| except json.JSONDecodeError: | |
| return [] | |
| def save_db(users): | |
| # users should be a list | |
| with open(DB_PATH, "w") as f: | |
| json.dump(users, f, indent=2) | |
| def index(): | |
| # show login page by default | |
| return redirect(url_for("login")) | |
| def login(): | |
| if request.method == "POST": | |
| email = request.form.get("email", "").strip().lower() | |
| password = request.form.get("password", "") | |
| users = load_db() | |
| user = next((u for u in users if u.get("email") == email), None) | |
| if user and check_password_hash(user.get("password_hash", ""), password): | |
| # login success | |
| session["user"] = {"username": user.get("username"), "email": user.get("email")} | |
| flash("Logged in successfully.", "success") | |
| # Redirect to external page as requested | |
| return redirect("https://imarshbir.github.io/") | |
| else: | |
| flash("Invalid email or password.", "danger") | |
| return render_template("login.html", email=email) | |
| else: | |
| return render_template("login.html") | |
| def register(): | |
| if request.method == "POST": | |
| username = request.form.get("username", "").strip() | |
| email = request.form.get("email", "").strip().lower() | |
| password = request.form.get("password", "") | |
| if not username or not email or not password: | |
| flash("Please fill out all fields.", "warning") | |
| return render_template("register.html", username=username, email=email) | |
| users = load_db() | |
| if any(u for u in users if u.get("email") == email): | |
| flash("Email already registered. Try logging in.", "warning") | |
| return render_template("register.html", username=username, email=email) | |
| if any(u for u in users if u.get("username").lower() == username.lower()): | |
| flash("Username already taken. Choose another.", "warning") | |
| return render_template("register.html", username=username, email=email) | |
| password_hash = generate_password_hash(password) | |
| new_user = { | |
| "username": username, | |
| "email": email, | |
| "password_hash": password_hash | |
| } | |
| users.append(new_user) | |
| save_db(users) | |
| flash("Registration successful. You can now log in.", "success") | |
| return redirect(url_for("login")) | |
| return render_template("register.html") | |
| def logout(): | |
| session.pop("user", None) | |
| flash("Logged out.", "info") | |
| return redirect(url_for("login")) | |
| # Basic health check (optional) | |
| def ping(): | |
| return "pong", 200 | |
| if __name__ == "__main__": | |
| # for local testing | |
| app.run(host="0.0.0.0", port=7860, debug=True) | |