from flask import Flask, render_template, request, redirect, url_for, session, flash from flask_sqlalchemy import SQLAlchemy from werkzeug.security import generate_password_hash, check_password_hash # Initialize Flask app app = Flask(__name__) app.secret_key = 'your_super_secret_key' # Database configuration app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 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 SQLAlchemy db = SQLAlchemy(app) # --------------------- # Database Models # --------------------- class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) password = db.Column(db.String(200), nullable=False) feedbacks = db.relationship('Feedback', backref='user', lazy=True) class Feedback(db.Model): id = db.Column(db.Integer, primary_key=True) message = db.Column(db.Text, nullable=False) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) # --------------------- # Routes # --------------------- @app.before_request def create_tables(): db.create_all() @app.route('/') def home(): return redirect(url_for('register')) @app.route('/register', methods=['GET', 'POST']) def register(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] existing_user = User.query.filter_by(username=username).first() if existing_user: flash('Username already exists. Please choose another.', 'danger') else: hashed_pw = generate_password_hash(password) new_user = User(username=username, password=hashed_pw) db.session.add(new_user) db.session.commit() flash('Registration successful! Please login.', 'success') return redirect(url_for('login')) return render_template('register.html') @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] user = User.query.filter_by(username=username).first() if user and check_password_hash(user.password, password): session['user'] = user.username flash('Logged in successfully!', 'success') return redirect(url_for('welcome')) else: flash('Invalid credentials. Try again.', 'danger') return render_template('login.html') @app.route('/welcome') def welcome(): if 'user' not in session: flash('Please log in first.', 'warning') return redirect(url_for('login')) return render_template('welcome.html', username=session['user']) @app.route('/feedback', methods=['GET', 'POST']) def feedback(): if 'user' not in session: flash('Please log in first.', 'warning') return redirect(url_for('login')) user = User.query.filter_by(username=session['user']).first() if request.method == 'POST': msg = request.form['message'] feedback_entry = Feedback(message=msg, user=user) db.session.add(feedback_entry) db.session.commit() flash('Feedback received! Thank you.', 'success') return render_template('feedback.html', message=msg) return render_template('feedback.html', message=None) @app.route('/logout') def logout(): session.pop('user', None) flash('Logged out successfully.', 'info') return redirect(url_for('login')) # --------------------- # Run the app # --------------------- if __name__ == '__main__': app.run(host="0.0.0.0", port=7860, debug=True)