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.

90 lines
2.3 KiB

  1. """Corvus Flask Application."""
  2. import os
  3. from logging.config import dictConfig
  4. from flask import Flask
  5. from flask_migrate import Migrate
  6. from corvus.db import db
  7. from corvus.utility import json_utility
  8. dictConfig({
  9. 'version': 1,
  10. 'formatters': {'default': {
  11. 'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
  12. }},
  13. 'handlers': {'wsgi': {
  14. 'class': 'logging.StreamHandler',
  15. 'stream': 'ext://flask.logging.wsgi_errors_stream',
  16. 'formatter': 'default'
  17. }},
  18. 'root': {
  19. 'level': 'INFO',
  20. 'handlers': ['wsgi']
  21. }
  22. })
  23. def create_app(test_config: dict = None) -> Flask:
  24. """
  25. Create an instance of Corvus.
  26. :param test_config:
  27. :return:
  28. """
  29. app = Flask(__name__, instance_relative_config=True)
  30. app.logger.debug('Creating Corvus Server')
  31. data_directory = os.getenv('CORVUS_DATA_DIRECTORY', '/tmp')
  32. app.logger.debug('Corvus Data Directory: %s', data_directory)
  33. default_database_uri = 'sqlite:///{}/corvus.db'.format(data_directory)
  34. app.config.from_mapping(
  35. SECRET_KEY='dev',
  36. SQLALCHEMY_DATABASE_URI=default_database_uri,
  37. SQLALCHEMY_TRACK_MODIFICATIONS=False
  38. )
  39. if test_config is None:
  40. app.logger.debug('Loading configurations')
  41. app.config.from_object('corvus.default_settings')
  42. app.config.from_pyfile('config.py', silent=True)
  43. if os.getenv('CORVUS_SETTINGS', None):
  44. app.config.from_envvar('CORVUS_SETTINGS')
  45. else:
  46. app.logger.debug('Loading test configuration')
  47. app.config.from_object(test_config)
  48. try:
  49. os.makedirs(app.instance_path)
  50. except OSError:
  51. pass
  52. app.json_encoder = json_utility.CustomJSONEncoder
  53. app.logger.debug('Initializing Application')
  54. db.init_app(app)
  55. app.logger.debug('Registering Database Models')
  56. Migrate(app, db)
  57. return app
  58. def register_blueprints(app: Flask) -> None:
  59. """
  60. Register blueprints for the application.
  61. :param app:
  62. :return:
  63. """
  64. from corvus.api import AUTH_BLUEPRINT
  65. app.register_blueprint(AUTH_BLUEPRINT)
  66. corvus = create_app() # pylint: disable=C0103
  67. register_blueprints(corvus)
  68. logger = corvus.logger # pylint: disable=C0103
  69. if __name__ == "__main__":
  70. corvus.run()