A multipurpose python flask API server and administration SPA
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.
 
 
 
 
 
 

108 lines
2.8 KiB

"""Flask Application."""
import os
from logging.config import dictConfig
from flask import Flask
from flask_migrate import Migrate
from server.db import db
from server.errors import BaseError, handle_base_error, \
handle_404_error
from server.utility import json_utility, session_utility
dictConfig({
'version': 1,
'formatters': {'default': {
'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
}},
'handlers': {'wsgi': {
'class': 'logging.StreamHandler',
'stream': 'ext://flask.logging.wsgi_errors_stream',
'formatter': 'default'
}},
'root': {
'level': 'INFO',
'handlers': ['wsgi']
}
})
def create_app(test_config: dict = None) -> Flask:
"""
Create a server instance.
:param test_config:
:return:
"""
app = Flask(__name__, instance_relative_config=True)
app.logger.debug('Creating Server')
data_directory = os.getenv('SERVER_DATA_DIRECTORY', '/tmp')
app.logger.debug('Server Data Directory: %s', data_directory)
default_database_uri = 'sqlite:///{}/server.db'.format(data_directory)
app.config.from_mapping(
SECRET_KEY='dev',
SQLALCHEMY_DATABASE_URI=default_database_uri,
SQLALCHEMY_TRACK_MODIFICATIONS=False,
TRAP_HTTP_EXCEPTIONS=True,
)
if test_config is None:
app.logger.debug('Loading configurations')
app.config.from_object('server.default_settings')
app.config.from_pyfile('config.py', silent=True)
if os.getenv('SERVER_SETTINGS', None):
app.config.from_envvar('SERVER_SETTINGS')
else:
app.logger.debug('Loading test configuration')
app.config.from_mapping(test_config)
try:
os.makedirs(app.instance_path)
except OSError:
pass
app.json_encoder = json_utility.CustomJSONEncoder
app.session_interface = session_utility.DisableSessionInterface()
app.logger.debug('Initializing Application')
db.init_app(app)
app.logger.debug('Registering Database Models')
Migrate(app, db)
return app
def register_blueprints(app: Flask) -> None:
"""
Register blueprints for the application.
:param app:
:return:
"""
from server.api import AUTH_BLUEPRINT, USER_BLUEPRINT, HEALTH_BLUEPRINT
app.register_blueprint(AUTH_BLUEPRINT)
app.register_blueprint(USER_BLUEPRINT)
app.register_blueprint(HEALTH_BLUEPRINT)
def register_error_handlers(app: Flask) -> None:
"""
Register error handlers for the application.
:param app:
:return:
"""
app.register_error_handler(404, handle_404_error)
app.register_error_handler(BaseError, handle_base_error)
server = create_app() # pylint: disable=C0103
register_blueprints(server)
register_error_handlers(server)
logger = server.logger # pylint: disable=C0103
if __name__ == "__main__":
server.run()