An ebook/comic library service and web client
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.

83 lines
2.0 KiB

  1. import os
  2. from logging.config import dictConfig
  3. from flask import Flask
  4. from flask_migrate import Migrate, upgrade
  5. from flask_sqlalchemy import SQLAlchemy
  6. from atheneum import utility
  7. db: SQLAlchemy = SQLAlchemy()
  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=None):
  24. app = Flask(__name__, instance_relative_config=True)
  25. app.logger.debug('Creating Atheneum Server')
  26. data_directory = os.getenv('ATHENEUM_DATA_DIRECTORY', '/tmp')
  27. app.logger.debug('Atheneum Data Directory: %s', data_directory)
  28. app.config.from_mapping(
  29. SECRET_KEY='dev',
  30. SQLALCHEMY_DATABASE_URI='sqlite:///{}/atheneum.db'
  31. .format(data_directory),
  32. SQLALCHEMY_TRACK_MODIFICATIONS=False
  33. )
  34. if test_config is None:
  35. app.logger.debug('Loading configurations')
  36. app.config.from_object('atheneum.default_settings')
  37. app.config.from_pyfile('config.py', silent=True)
  38. if os.getenv('ATHENEUM_SETTINGS', None):
  39. app.config.from_envvar('ATHENEUM_SETTINGS')
  40. else:
  41. app.logger.debug('Loading test configuration')
  42. app.config.from_object(test_config)
  43. try:
  44. os.makedirs(app.instance_path)
  45. except OSError:
  46. pass
  47. app.json_encoder = utility.CustomJSONEncoder
  48. app.logger.debug('Initializing Application')
  49. db.init_app(app)
  50. app.logger.debug('Registering Database Models')
  51. Migrate(app, db)
  52. return app
  53. def register_blueprints(app):
  54. from atheneum.api import auth_blueprint
  55. app.register_blueprint(auth_blueprint)
  56. app = create_app()
  57. register_blueprints(app)
  58. def init_db():
  59. """Clear existing data and create new tables."""
  60. upgrade('migrations')
  61. if __name__ == "__main__":
  62. app.run()