""" ___ _ _ / _ \ _ __ | |_ _| | ___ __ _ ___ | | | | '_ \| | | | | | / _ \/ _` / __| | |_| | | | | | |_| | |__| __/ (_| \__ \ \___/|_| |_|_|\__, |_____\___|\__, |___/ |___/ |___/ Created by Fluffy Bean - Version 23.03.04 """ # Import system modules import os import sys import logging # Flask from flask_compress import Compress from flask import Flask, render_template # Configuration from dotenv import load_dotenv import platformdirs import yaml from . import theme_manager USER_DIR = platformdirs.user_config_dir('onlylegs') INSTANCE_PATH = os.path.join(USER_DIR, 'instance') # Check if any of the required files are missing if not os.path.exists(platformdirs.user_config_dir('onlylegs')): from . import setup setup.SetupApp() # Get environment variables if os.path.exists(os.path.join(USER_DIR, '.env')): load_dotenv(os.path.join(USER_DIR, '.env')) print("Loaded environment variables") else: print("No environment variables found!") sys.exit(1) # Get config file if os.path.exists(os.path.join(USER_DIR, 'conf.yml')): with open(os.path.join(USER_DIR, 'conf.yml'), encoding='utf-8') as f: conf = yaml.load(f, Loader=yaml.FullLoader) print("Loaded gallery config") else: print("No config file found!") sys.exit(1) # Setup the logging config LOGS_PATH = os.path.join(platformdirs.user_config_dir('onlylegs'), 'logs') if not os.path.isdir(LOGS_PATH): os.mkdir(LOGS_PATH) logging.getLogger('werkzeug').disabled = True logging.basicConfig( filename=os.path.join(LOGS_PATH, 'only.log'), level=logging.INFO, datefmt='%Y-%m-%d %H:%M:%S', format='%(asctime)s %(levelname)s %(name)s %(threadName)s : %(message)s', encoding='utf-8') def create_app(test_config=None): """ Create and configure the main app """ app = Flask(__name__,instance_path=INSTANCE_PATH) compress = Compress() # App configuration app.config.from_mapping( SECRET_KEY=os.environ.get('FLASK_SECRET'), DATABASE=os.path.join(app.instance_path, 'gallery.sqlite'), UPLOAD_FOLDER=os.path.join(USER_DIR, 'uploads'), ALLOWED_EXTENSIONS=conf['upload']['allowed-extensions'], MAX_CONTENT_LENGTH=1024 * 1024 * conf['upload']['max-size'], WEBSITE=conf['website'], ) if test_config is None: app.config.from_pyfile('config.py', silent=True) else: app.config.from_mapping(test_config) try: os.makedirs(app.instance_path) except OSError: pass theme_manager.CompileTheme('default', app.root_path) @app.errorhandler(405) def method_not_allowed(err): error = '405' msg = err.description return render_template('error.html', error=error, msg=msg), 404 @app.errorhandler(404) def page_not_found(err): error = '404' msg = err.description return render_template('error.html', error=error, msg=msg), 404 @app.errorhandler(403) def forbidden(err): error = '403' msg = err.description return render_template('error.html', error=error, msg=msg), 403 @app.errorhandler(410) def gone(err): error = '410' msg = err.description return render_template('error.html', error=error, msg=msg), 410 @app.errorhandler(500) def internal_server_error(err): error = '500' msg = err.description return render_template('error.html', error=error, msg=msg), 500 # Load login, registration and logout manager from . import auth app.register_blueprint(auth.blueprint) # Load routes for home and images from . import routing app.register_blueprint(routing.blueprint) app.add_url_rule('/', endpoint='index') # Load routes for settings from . import settings app.register_blueprint(settings.blueprint) # Load APIs from . import api app.register_blueprint(api.blueprint) compress.init_app(app) return app