from urllib.parse import urlparse as url_parse from flask import Flask, render_template, request, redirect, url_for, flash from markdown import markdown, Markdown from config import config from models import Post, db, get_replies, Faccet, get_previous from models import User as NewUser from forms import PostForm, LoginForm from flask_login import ( login_user, logout_user, login_required, current_user, LoginManager, ) import os app = Flask(__name__) app.config.from_object("config") SECRET_KEY = os.urandom(32) app.config["SECRET_KEY"] = SECRET_KEY app.jinja_options = app.jinja_options.copy() app.jinja_env.add_extension(Markdown) app.jinja_env.filters["markdown"] = markdown login = LoginManager(app) login.login_view = "login" @login.user_loader def load_user(uid): return NewUser.get(NewUser.id == uid) @app.route("/login", methods=["GET", "POST"]) def login(): form = LoginForm() if form.validate_on_submit(): # noqa user = NewUser.get(NewUser.username == form.username.data) if user is None or not user.check_password(form.password.data): flash("Invalid username or password") return redirect(url_for("login")) login_user(user, remember=form.remember_me.data) next_page = request.args.get("next") if not next_page or url_parse(next_page).netloc != "": next_page = url_for("index") return redirect(next_page) return render_template("login.html", form=form) @app.before_request def before_request(): db.connect() @app.after_request def after_request(response): db.close() return response @app.route("/") @login_required def index(): posts = Post.select().where(Post.parent == 0).order_by(Post.created_at.desc()) return render_template("index.html", posts=posts) @app.route("/logout") @login_required def logout(): flash("Goodbye!") logout_user() return redirect(url_for("login")) @app.route("/post/") @login_required def post(post_id): post = Post.get(Post.id == post_id) previous = get_previous(post_id) replies = get_replies(post_id) return render_template("post.html", post=post, replies=replies, previous=previous) @app.route("/create", methods=["GET", "POST"]) @login_required def create(): form = PostForm() replyto = request.args.get("reply", 0) userctx = NewUser.get(NewUser.username == current_user.username) asfaccet = Faccet.get(Faccet.name == userctx.default_faccet) if form.validate_on_submit(): Post.create( title=form.title.data, content=form.content.data, authour=asfaccet, parent=replyto, ) return redirect(url_for("index")) return render_template("create.html", form=form) if __name__ == "__main__": app.run(debug=True, port=5052)