import logging import os import colors from flask import Flask, request from flask_atlas_auth import AuthManager from src import config from src.admin import init_app from src.config import SQLALCHEMY_DATABASE_URI from src.db import db def create_app(): app = Flask("Decibel-CMS") app.secret_key = os.environ.get("SECRET_KEY", "SECRET KEY") app.config.from_object(config) app.config["ADMIN_RAISE_ON_INTEGRITY_ERROR"] = False app.config["SQLALCHEMY_DATABASE_URI"] = SQLALCHEMY_DATABASE_URI app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {"pool_pre_ping": True} app.config["FLASK_ADMIN_SWATCH"] = "slate" init_app(app) db.init_app(app) auth_manager = AuthManager() auth_manager.init_app(app) return app app = create_app() @app.before_first_request def setup_logging(): if not app.debug: app.logger.addHandler(logging.StreamHandler()) app.logger.setLevel(logging.INFO) @app.after_request def log_request(response): if request.path == "/favicon.ico": return response elif request.path.startswith("/static"): return response ip = request.headers.get("X-Forwarded-For", request.remote_addr) host = request.host.split(":", 1)[0] args = dict(request.args) log_params = [ ("[{}] {}".format(request.method, request.path), "blue"), ("Code: {}".format(response.status_code), "yellow"), ("Host: {} ({})".format(host, ip), "red"), ("Params: {}".format(args), "blue"), ] if config.DEBUG: parts = [ colors.color("{}".format(value), fg=color) for value, color in log_params ] else: parts = [value for value, color in log_params] app.logger.info(" ".join(parts)) return response