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


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(
William Bell's avatar
William Bell committed
        drivername = os.environ.get("DB_DRIVER", default="mysql+pymysql"),
        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({
        })

    return connection_args
William Bell's avatar
William Bell committed


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


William Bell's avatar
William Bell committed
def main() -> None:
William Bell's avatar
William Bell committed
    A function to create an instance of the app and run it.
William Bell's avatar
William Bell committed
    flask_app = create_app()
William Bell's avatar
William Bell committed
    svc_host = os.environ.get("SVC_HOST", default=None)
William Bell's avatar
William Bell committed
    print(svc_host)
    flask_app.run(debug=True, host=svc_host)


if __name__ == '__main__':
    main()