from flask import Flask, render_template, redirect, request, session, url_for from flask_sqlalchemy import SQLAlchemy from flask_admin import Admin from flask_admin.contrib.sqla import ModelView from flask_security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin app = Flask(__name__) app.secret_key = 'bebra' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///Picture_Puzzle_web.db' app.config['SECURITY_PASSWORD_SALT'] = app.config['SECRET_KEY'] db = SQLAlchemy(app) # Define models for Flask-Security roles_users = db.Table('roles_users', db.Column('user_id', db.Integer(), db.ForeignKey('user.id')), db.Column('role_id', db.Integer(), db.ForeignKey('role.id')) ) class Role(db.Model, RoleMixin): id = db.Column(db.Integer(), primary_key=True) name = db.Column(db.String(80), unique=True) class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(255), unique=True) email = db.Column(db.String(255), unique=True) password = db.Column(db.String(255)) active = db.Column(db.Boolean()) roles = db.relationship('Role', secondary=roles_users, backref=db.backref('users', lazy='dynamic')) class Post(db.Model): id = db.Column(db.Integer, primary_key=True) date_created = db.Column(db.String(100), unique=False, nullable=False) alias = db.Column(db.String(100), unique=True, nullable=False) title = db.Column(db.String(100), nullable=False) image = db.Column(db.String(100), nullable=False) user_datastore = SQLAlchemyUserDatastore(db, User, Role) security = Security(app, user_datastore) admin = Admin(app, name='Admin Panel', template_mode='bootstrap3') admin.add_view(ModelView(User, db.session)) admin.add_view(ModelView(Role, db.session)) def create_tables(): with app.app_context(): db.create_all() def register_admin_views(): admin = Admin(app, name='Admin Panel', template_mode='bootstrap3') admin.add_view(ModelView(User, db.session)) admin.add_view(ModelView(Post, db.session)) @app.route("/") def index(): latest_posts = Post.query.all() return render_template("index.html", latest_posts=latest_posts) @app.route("/posts") def all_posts(): all_posts = Post.query.all() return render_template("posts.html", posts=all_posts) @app.route("/about") def about(): return render_template("about.html") @app.route("/posts/") def post(alias): post_info = Post.query.filter_by(alias=alias).first() if post_info: return render_template(f"{alias}.html", post_info=post_info) else: return "Post not found", 404 @app.route("/login", methods=["GET", "POST"]) def login(): if request.method == "POST": username = request.form["username"] password = request.form["password"] user = User.query.filter_by(username=username, password=password).first() if user: session["username"] = username return redirect(url_for("index")) return render_template("auth/login.html") @app.route("/logout") def logout(): session.pop("username", None) return redirect(url_for("index")) @app.route("/register", methods=["GET", "POST"]) def register(): if request.method == "POST": username = request.form["username"] email = request.form["email"] password = request.form["password"] existing_user = User.query.filter_by(email=email).first() if existing_user: error_msg = "Email already exists" return render_template("auth/register.html", error_msg=error_msg) existing_username = User.query.filter_by(username=username).first() if existing_username: error_msg = "Username already exists" return render_template("auth/register.html", error_msg=error_msg) new_user = User(username=username, email=email, password=password) db.session.add(new_user) db.session.commit() return redirect(url_for("login")) return render_template("auth/register.html") if __name__ == '__main__': register_admin_views() app.run(debug=True)