import os from flask import Flask, render_template, request, session, redirect, flash, url_for, jsonify from flask_sqlalchemy import SQLAlchemy from markupsafe import escape BASE_DIR_PATH = os.path.abspath(os.path.dirname(__file__)) DATABASE_PATH = os.path.join(BASE_DIR_PATH, 'db.sqlite3') app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///'+DATABASE_PATH app.config['SECRET_KEY'] = 'mysecretkey' db = SQLAlchemy(app) class Utente(db.Model): __tablename__ = 'utente' id = db.Column(db.Integer, primary_key=True, autoincrement=True) nickname = db.Column(db.String(80), unique=True, nullable=False) username = db.Column(db.String(80), unique=True, nullable=False) password = db.Column(db.String(30), nullable=False) # messaggi = db.relationship('Messaggio', backref=db.backref('utente', lazy='dynamic')) # --- OR --- messaggi = db.relationship('Messaggio', back_populates='utente', lazy='dynamic') class Messaggio(db.Model): __tablename__ = 'messaggio' id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('utente.id'), nullable=False) messaggio = db.Column(db.Text, nullable=False) timestamp = db.Column(db.DateTime, default=db.func.now(), nullable=False) # utente = db.relationship('Utente', backref=db.backref('messaggi', lazy='dynamic')) # --- OR --- utente = db.relationship('Utente', back_populates='messaggi') @app.route('/') def home(): if 'user_id' in session: utente = db.session.query(Utente).get(session['user_id']) return render_template('home.html', user=utente) return render_template('home.html') @app.route('/guestbook') def guestbook(): if 'user_id' not in session: return redirect(url_for('login')) return render_template('guestbook.html') @app.route('/api/guestbook', methods=['GET', 'POST']) def api_guestbook(): if 'user_id' not in session: return jsonify({'error': 'Accesso non autorizzato.'}), 401 if request.method == 'POST': messaggio = request.json.get('messaggio') if not messaggio: return jsonify({'error': 'Il messaggio non può essere vuoto!'}), 400 new_message = Messaggio(user_id=session['user_id'], messaggio=escape(messaggio)) db.session.add(new_message) db.session.commit() return jsonify({'success': True}), 201 messages = Messaggio.query.order_by(Messaggio.timestamp.desc()).all() response = [ {'nickname': message.utente.nickname, 'messaggio': message.messaggio} for message in messages ] return jsonify(response), 200 @app.route('/signup', methods=['GET', 'POST']) def signup(): if request.method == 'POST': nickname = request.form.get('nickname') username = request.form.get('username') password = request.form.get('password') if not nickname or not username or not password: flash('Tutti i campi sono obbligatori!') return redirect(url_for('signup')) if Utente.query.filter_by(username=username).first() or Utente.query.filter_by(nickname=nickname).first(): flash("Il nickname o l'username sono già in uso!") return redirect(url_for('signup')) new_user = Utente(nickname=nickname, username=username, password=password) db.session.add(new_user) db.session.commit() flash('Registrazione effettuata con successo!') return redirect(url_for('login')) return render_template('signup.html') @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] utente = Utente.query.filter_by(username=username, password=password).first() if utente: session['user_id'] = utente.id flash('Login riuscito!') return redirect(url_for('guestbook')) else: flash('Credenziali non valide!') return redirect(url_for('login')) return render_template('login.html') @app.route('/logout') def logout(): session.pop('user_id', None) flash('Logout effettuato con successo!') return redirect(url_for('home')) with app.app_context(): db.create_all() if __name__ == '__main__': app.run(host="0.0.0.0", port=7860)