You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

115 lines
3.6 KiB

import logging
from logging.config import dictConfig
from flask_api import FlaskAPI
from flask_marshmallow import Marshmallow
"""https://blog.miguelgrinberg.com/post/how-to-add-flask-migrate-to-an-existing-project""" # noqa
import os
from flask_migrate import Migrate
from flask_security import Security
from sqlalchemy import create_engine
from sqlalchemy_utils import create_database
from sqlalchemy_utils import database_exists
from . import access
from . import command_execution
from . import database
from . import error
from . import models
from .endpoints import admin
from .endpoints import command
from .endpoints import login
from .endpoints import logout
__title__ = "monsun_backend"
__author__ = "Andreas Berthoud, Fabian Klein"
__version__ = "0.0.0"
__email__ = "andreasberthoud@gmail.com"
__copyright__ = f"2021 {__author__}"
os.environ.update(
{
"DATABASE_URI": "postgresql+psycopg2://"
"{dbuser}:{dbpass}@{dbhost}/{dbname}{sslmode}".format(
dbuser=os.getenv("POSTGRES_USER", "usr"),
dbpass=os.getenv("POSTGRES_PASSWORD", "pass"),
dbhost=os.getenv("POSTGRES_HOST", "localhost"),
dbname=os.getenv("POSTGRES_DB_NAME", "monsun_backend"),
sslmode="?sslmode=require" if os.getenv("ENABLE_SSL") is not None else "",
),
},
)
migrate = Migrate()
def create_app() -> FlaskAPI:
app = FlaskAPI(__name__)
app.register_blueprint(command.bp)
app.register_blueprint(login.bp)
app.register_blueprint(logout.bp)
app.register_blueprint(admin.bp)
# somehow the 'flask db upgrade' does not create the DB as promised...
# so let's do it here instead
engine = create_engine(os.getenv("DATABASE_URI"))
if not database_exists(engine.url):
create_database(engine.url)
dictConfig(
{
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"default": {
"format": "[%(asctime)s] %(levelname)s in %(module)s: %(message)s",
},
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"formatter": "default",
"stream": "ext://sys.stdout",
},
},
"root": {"level": "NOTSET", "handlers": ["console"]},
"logger": {
"monsun_backend": {
"level": "DEBUG",
"propagate": "no",
},
},
},
)
logger = logging.getLogger("monsun_backend.init")
_exception_logger = logging.getLogger("monsun_backend.exception")
app.secret_key = os.getenv("SECRET")
app.config.update(
SQLALCHEMY_TRACK_MODIFICATIONS=False,
SQLALCHEMY_DATABASE_URI=os.getenv("DATABASE_URI"),
)
logger.info(f"DATABASE_URI: {os.getenv('DATABASE_URI')}")
database.db.init_app(app)
migrate.init_app(app, database.db)
Marshmallow(app)
Security(app=app, datastore=models.user_datastore)
access.init_app(app)
# register error handler
@app.errorhandler(error.MonsunError)
def monsun_error_handler(e: error.MonsunError):
if 500 > e.status_code >= 400:
_exception_logger.info(f"Exception raised ({e.status_code}): {e.data}")
if e.status_code >= 500:
_exception_logger.error(f"Exception raised ({e.status_code}): {e.data}")
return e.response
if os.environ.get("WERKZEUG_RUN_MAIN") != "true":
# prevent from be called twice in debug mode
command_execution.start_backgroup_process()
return app