""" routes.py module ---------------- This Python module contains the logic supporting: 1. Navigating between website pages 2. Interpreting user requests to the server 3. Dispatching requested content back to the user Python dependencies: - flask: provides web application features - forms: provides secure user form submission - sqlalchemy: provides communication with database on server. Personal imports: These are used to avoid cluttering this file with placeholder data for posts' content. """ from datetime import datetime from flask import Flask, render_template, flash, redirect, url_for from forms import RegistrationForm, LoginForm from flask_sqlalchemy import SQLAlchemy from placeholder_posts import posts from placeholder_news import news from placeholder_messages import conversations app = Flask(__name__) app.config['SECRET_KEY'] = 'Scooby_Lu,_where_are_you?' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db' db = SQLAlchemy(app) class Alias(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(20), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) image_file = db.Column(db.String(20), nullable=False, default='default.png') password = db.Column(db.String(60), nullable=False) posts = db.relationship('Post', backref='author', lazy=True) def __repr__(self): return f"Alias('{self.username}','{self.email}','{self.image_file}' )" class Post(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100), nullable=False) date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow) content = db.Column(db.Text, nullable=False) user_id = db.Column(db.Integer, db.ForeignKey('alias.id'), nullable=False) def __repr__(self): return f"Post('{self.title}', '{self.date_posted}')" @app.route("/") @app.route("/home") def home(): """This is our homepage.""" home_posts = posts + news + conversations return render_template('home.html', posts=home_posts) @app.route("/yes") def yes(): """Another page, presenting the user with content marked as 'yes'.""" return render_template("yes.html", conversations=conversations, news=news) @app.route("/no") def no(): """This page contains an archive of 'no's, for forgiving user mistakes.""" archives = posts + news + messages return render_template("no.html", archive=archives) @app.route("/register", methods=['GET', 'POST']) def register(): """Account registration page leveraging the form Python package.""" form = RegistrationForm() if form.validate_on_submit(): flash(f"Alias created for {form.alias.data}.", 'success') return redirect(url_for('home')) return render_template('register.html', title="Register", form=form) @app.route("/login") def login(): form = LoginForm() return render_template('login.html', title="Login", form=form) # If this file is executed as a script (i.e. double-clicked), # the Python interpreter will run the Flask process and begin serving # the web pages on the standard localhost address (127.0.0.1). # But if this file is called as a module by another Python script, it will not # serve content to the web pages, but the function definitions contained in # this file will be available to the calling script. # E.g. calling script will know what the yes() function is. if __name__ == '__main__': app.run(debug=True)