You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

133 lines
4.4 KiB
Python

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/<name>")
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)