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
133 lines
4.4 KiB
Python
1 year ago
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
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)
|