File size: 4,892 Bytes
bdbc1a6 |
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 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
"""
Flask Login System with SQLite
Features:
- Signup (create new account)
- Login (check user credentials)
- Session (to remember login state)
- Cookies (to store last visit info)
- "Remember Me" option (stay logged in even after closing browser)
"""
from flask import Flask, render_template, request, redirect, url_for, session, make_response
import sqlite3
from datetime import timedelta
# Flask App Setup
app = Flask(__name__)
# Secret key is used to sign session data (must be kept secret in real apps!)
app.secret_key = "supersecretkey"
# Permanent sessions last for 7 days (used when "Remember Me" is checked)
app.permanent_session_lifetime = timedelta(days=7)
# Helper function to connect to SQLite database
def get_db_connection():
# Connect to SQLite database (creates file users.db if it doesn’t exist)
conn = sqlite3.connect("users.db")
conn.row_factory = sqlite3.Row # Makes rows behave like dictionaries
return conn
# Initialize database with a "users" table
def init_db():
conn = get_db_connection()
conn.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- Auto-increment ID
username TEXT UNIQUE NOT NULL, -- Unique username
password TEXT NOT NULL -- Password (plain text for demo, should use hashing!)
)
""")
conn.commit()
conn.close()
# Call database initialization at startup
init_db()
# Home Page (only logged-in users can see this)
@app.route("/")
def home():
# Check if the user is logged in using session
if "username" in session:
username = session["username"] # Get logged-in username from session
# Get last visit message from cookie (if not found, show default message)
last_visit = request.cookies.get("last_visit", "First time visiting!")
return render_template("home.html", username=username, last_visit=last_visit)
# If not logged in, redirect to login page
return redirect(url_for("login"))
# Signup Page
@app.route("/signup", methods=["GET", "POST"])
def signup():
if request.method == "POST": # When user submits the form
username = request.form["username"]
password = request.form["password"]
conn = get_db_connection()
try:
# Insert new user into database
conn.execute("INSERT INTO users (username, password) VALUES (?, ?)", (username, password))
conn.commit()
conn.close()
# After signup, redirect to login page
return redirect(url_for("login"))
except sqlite3.IntegrityError:
# This happens if the username already exists
return "Username already exists! Try another."
# If GET request, show signup form
return render_template("signup.html")
# Login Page
@app.route("/login", methods=["GET", "POST"])
def login():
if request.method == "POST": # When user submits login form
username = request.form["username"]
password = request.form["password"]
# Checkbox value: will be "on" if user ticks "Remember Me"
remember = request.form.get("remember")
# Check if username & password exist in database
conn = get_db_connection()
user = conn.execute("SELECT * FROM users WHERE username=? AND password=?",
(username, password)).fetchone()
conn.close()
if user:
# ✅ User found → start session
if remember == "on":
# Session will survive browser close (7 days)
session.permanent = True
else:
# Session ends when browser closes
session.permanent = False
# Store username inside session
session["username"] = username
# Create response with cookie
resp = make_response(redirect(url_for("home")))
# Save a cookie with "last visit" info
# If "Remember Me" checked → cookie valid for 7 days
# Else → cookie lasts only until browser closes
resp.set_cookie("last_visit", "Welcome back, " + username,
max_age=(7*24*60*60 if remember == "on" else None))
return resp
else:
# If username or password is wrong
return "Invalid username or password. Try again."
# If GET request, show login form
return render_template("login.html")
# Logout Page
@app.route("/logout")
def logout():
# Remove username from session
session.pop("username", None)
# Also delete the "last_visit" cookie
resp = make_response(redirect(url_for("login")))
resp.set_cookie("last_visit", "", expires=0)
return resp
# Run the App
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=5000) |