Skip to content
Snippets Groups Projects
app.py 2.38 KiB
Newer Older
William Bell's avatar
William Bell committed
import os
import sqlalchemy
from flask import Flask
from models import db


def database_uri() -> sqlalchemy.engine.url.URL:
William Bell's avatar
William Bell committed
    """
    A function to build the database connection string, using environment
    variable settings.
    """

    # If the connection string has been given, use it.
    url = os.environ.get("DB_CONNECTION_STRING", default="")
    if len(url) != 0:
        return url

    # Create a new DB connection string from components.
William Bell's avatar
William Bell committed
    url = sqlalchemy.engine.url.URL.create(
        drivername = os.environ.get("DB_DRIVER", default="mariadb+mariadbconnector"),
William Bell's avatar
William Bell committed
        username = os.environ.get("DB_USER", default="none"),
        password = os.environ.get("DB_PASSWORD", default="none"),
        host = os.environ.get("DB_SERVER", default="127.0.0.1"),
        port = os.environ.get("DB_PORT", default="3306"),
        database = os.environ.get("DB_NAME", default="mydb"))

    return url


def database_connection_args() -> dict:
    """
    A function to build the connection arguments, which are associated 
    with an SSL connection.
    """
    connection_args = {}

    # Check for a SSL certificate.
    ssl_cert_file = os.environ.get("DB_SSL_CERT", default=None)
    if ssl_cert_file is not None:
        connection_args.update({
            "ssl_ca": ssl_cert_file
        })

    # Check if SSL should be enabled.
    ssl_str = os.environ.get("DB_SSL", default=None)
    if ssl_str is not None:
        if ssl_str.strip().lower() == "true":
            connection_args.update({
                "ssl": "1"
            })
    
    return connection_args
William Bell's avatar
William Bell committed


def create_app(test_config:dict = {}):
    """
    A factory function to create a Flask app.
    """
William Bell's avatar
William Bell committed
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = database_uri()
    connection_args = database_connection_args()
William Bell's avatar
William Bell committed
    if len(connection_args) > 0:
        app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {"connect_args": connection_args}
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    if len(test_config) > 0:
        app.config.update(test_config)
    with app.app_context():
        db.init_app(app)
        db.create_all()
    from routes import books_bp
    app.register_blueprint(books_bp)
    return app


if __name__ == '__main__':
    """
    A test program to create one running Flask app.
    """
William Bell's avatar
William Bell committed
    app = create_app()
    svc_host = os.environ.get("SVC_HOST", default=None)
    app.run(debug=True, host=svc_host)