import sentry_sdk from flask import Flask from sentry_sdk.integrations.flask import FlaskIntegration from werkzeug.middleware.proxy_fix import ProxyFix from . import usm from .accounts_validation import accounts_validation from .admin_settings import admin_settings from .api import api_v1, api_v2 from .api.v1.docs import register_apispec as register_apispec_v1 from .api.v2.docs import register_apispec as register_apispec_v2 from .applications import applications from .cli_commands import register_cli_commands from .common import common from .context_processors import register_context_processors from .dna_accounts import dna_accounts from .errors import register_errors_handlers from .extensions import register_extensions from .logs import ( configure_logging, register_logging_context_hooks, register_logging_events_hooks, ) from .oauth import oauth from .settings import Settings from .template_filters import register_template_filters def create_app(config=None): configure_logging() app = Flask("atlas_um") app.wsgi_app = ProxyFix(app.wsgi_app) configure_app(app, config) sentry_conditional_init(app.config) register_extensions(app) register_blueprints(app) if app.config.get("API_DOCS_ENABLED"): register_apispec_v1(app) register_apispec_v2(app) register_context_processors(app) register_template_filters(app) register_errors_handlers(app) register_cli_commands(app) register_logging_context_hooks(app) register_logging_events_hooks(app) return app def configure_app(app, config=None): app.config.from_object(Settings) if config: app.config.from_object(config) def register_blueprints(app): app.register_blueprint(common) app.register_blueprint(admin_settings, url_prefix="/settings") app.register_blueprint(dna_accounts, url_prefix="/accounts") app.register_blueprint(usm.login, url_prefix="/usm/login") app.register_blueprint(usm.logout, url_prefix="/usm/logout") app.register_blueprint(usm.graph, url_prefix="/usm/graph") app.register_blueprint(usm.token, url_prefix="/usm/token") app.register_blueprint(api_v1, url_prefix="/api/v1") app.register_blueprint(api_v2, url_prefix="/api/v2") app.register_blueprint(applications, url_prefix="/applications") app.register_blueprint(oauth, url_prefix="/oauth") app.register_blueprint( accounts_validation, url_prefix="/accounts_validation" ) def sentry_conditional_init(config): dsn = config.get("SENTRY_DSN", None) if dsn is not None: # pragma: no cover sentry_sdk.init( dsn=dsn, environment=config.get("ENV"), integrations=[FlaskIntegration()], )