Spaces:
Sleeping
Sleeping
File size: 3,668 Bytes
e1da24d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
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)
@app.route("/")
def index():
# show login page by default
return redirect(url_for("login"))
@app.route("/login", methods=["GET", "POST"])
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")
@app.route("/register", methods=["GET", "POST"])
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")
@app.route("/logout")
def logout():
session.pop("user", None)
flash("Logged out.", "info")
return redirect(url_for("login"))
# Basic health check (optional)
@app.route("/ping")
def ping():
return "pong", 200
if __name__ == "__main__":
# for local testing
app.run(host="0.0.0.0", port=7860, debug=True)
|