__init__.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import json
  2. import os
  3. import sys
  4. # pylint: disable=wrong-import-position,wrong-import-order
  5. import eventlet.tpool
  6. eventlet.tpool.set_num_threads(2)
  7. from munch import munchify
  8. from pathlib import Path
  9. from flask import Flask
  10. from flask_htpasswd import HtPasswdAuth
  11. from flask_migrate import Migrate
  12. from flask_sqlalchemy import SQLAlchemy
  13. from sqlalchemy import event
  14. from sqlalchemy import pool
  15. from sqlalchemy.engine import Engine
  16. from pycs.util.JSONEncoder import JSONEncoder
  17. settings_file = os.environ.get("PYCS_SETTINGS", "settings.json")
  18. print(f'=== Loading settings from "{settings_file}" ===')
  19. with open(settings_file, encoding='utf8') as file:
  20. settings = munchify(json.load(file))
  21. # create projects folder
  22. if not os.path.exists(settings.projects_folder):
  23. os.mkdir(settings.projects_folder) # pragma: no-cover
  24. DB_FILE = Path.cwd() / settings.database
  25. app = Flask(__name__)
  26. app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///{DB_FILE}"
  27. app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
  28. # Protect via http basic authentication
  29. app.config['FLASK_HTPASSWD_PATH'] = '.htpasswd'
  30. if not os.path.isfile(app.config['FLASK_HTPASSWD_PATH']):
  31. raise FileNotFoundError("You need to specify a .htpasswd-file."
  32. f"The following file could not be located: {app.config['FLASK_HTPASSWD_PATH']}!")
  33. app.config['FLASK_SECRET'] = 'Hey Hey Kids, secure me!'
  34. htpasswd = HtPasswdAuth(app)
  35. # set json encoder so database objects are serialized correctly
  36. app.json_encoder = JSONEncoder
  37. # pylint: disable=unused-argument
  38. @event.listens_for(Engine, "connect")
  39. def set_sqlite_pragma(dbapi_connection, connection_record):
  40. """ enables foreign keys on every established connection """
  41. cursor = dbapi_connection.cursor()
  42. cursor.execute("PRAGMA foreign_keys=ON")
  43. cursor.close()
  44. db = SQLAlchemy(app, engine_options=dict(
  45. poolclass=pool.SingletonThreadPool,
  46. connect_args=dict(
  47. check_same_thread=False
  48. )
  49. )
  50. )
  51. migrate = Migrate(app, db)