from flask import Flask, render_template, request, redirect, session from flask_bcrypt import Bcrypt from database import database, User, Meme import os app = Flask(__name__) app.secret_key = "secret" app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + os.path.join(os.path.abspath(os.path.dirname(__file__)), 'db.sqlite') database.init_app(app) bcrypt = Bcrypt(app) with app.app_context(): database.create_all() def usernameValid ( username ): # Allowed Characters characters = "abcdefghijklmnopqrstuvwxyzABDEFGHIJKLMNOPQRSTUVWXYZ_0123456789" if len(username) < 4: return False for char in username: if not char in characters: return False return True def passwordValid ( password ): if len(password) < 1: return False return True @app.route("/") def root (): memes = database.session.execute(database.Select(Meme).order_by(Meme.id.desc())).all() if session.get("username"): return render_template("index.html", memes = memes, loggedIn = True) else: return render_template("index.html", memes = memes, loggedIn = False) @app.route("/sign-up", methods = [ "GET", "POST"]) def signUp (): if session.get("username"): return redirect("/") if request.method == "GET": return render_template("sign-up.html", loggedIn = False) else: if usernameValid(request.form.get("username")) and passwordValid(request.form.get("password")) and request.form.get("password") == request.form.get("repeatPassword"): users = database.session.execute(database.select(User).filter_by(username=request.form.get("username"))).first() if users == None: database.session.add(User(username = request.form.get("username"), password = bcrypt.generate_password_hash(request.form.get("password")))) database.session.commit() return redirect("/sign-in") return "Username taken" else: return "Invalid username and / or password" @app.route("/sign-in", methods = [ "GET", "POST"]) def signIn (): if session.get("username"): return redirect("/") if request.method == "GET": return render_template("sign-in.html", loggedIn = False) else: if usernameValid(request.form.get("username")) and passwordValid(request.form.get("password")): print("val") user = database.session.execute(database.select(User).filter_by(username=request.form.get("username"))).first() if user != None: if bcrypt.check_password_hash(user[0].password, request.form.get("password")): session["username"] = request.form.get("username") return redirect("/") return render_template("sign-in.html", loggedIn = False) @app.route("/sign-out") def signOut(): if session.get("username"): session.pop("username") return redirect("/") @app.route("/upload", methods = ["GET", "POST"]) def upload (): if session.get("username") == None: return redirect("/") if request.method == "GET": return render_template("upload.html", loggedIn = True) else: if request.files.get("image").filename.split(".")[-1] in ["png", "jpg", "jpeg", "webp"]: meme = database.session.execute(database.select(Meme).order_by(Meme.id.desc())).first() if meme == None: image_num = 1 else: image_num = meme[0].id + 1 database.session.add(Meme( user = session.get("username") ,title = request.form.get("title"), image = str(image_num) + ".png")) database.session.commit() request.files.get("image").save(os.path.join("./static/memes", str(image_num) + ".png")) return redirect("/upload") return "oof" @app.route("/user/") def user ( name ): user = database.session.execute(database.select(User).filter_by(username = name )).first() if user != None: memes = database.session.execute(database.select(Meme).filter_by(user=name).order_by(Meme.id.desc())).all() if session.get("username"): return render_template("user.html", username = user[0].username, memes = memes, loggedIn = True) else: return render_template("user.html", username = user[0].username, memes = memes, loggedIn = False) else: return "no user" app.run(debug=True)