import sentry_sdk from flask import Flask from sentry_sdk.integrations.flask import FlaskIntegration from werkzeug.middleware.proxy_fix import ProxyFix from core_notifications import views from core_notifications.api import v1 from core_notifications.extensions import register_extensions, register_docs from core_notifications.logs import ( configure_logging, register_logging_context_hooks, register_logging_events_hooks, ) from core_notifications.settings import Settings from core_notifications.templating import templating from core_notifications.images import images from core_notifications.analytics.views import analytics from .errors import register_errors_handlers from .context_processors import register_context_processors from .template_filters import register_template_filters def create_app(config=None): configure_logging() app = Flask("core_notifications") app.wsgi_app = ProxyFix(app.wsgi_app) configure_app(app, config) sentry_conditional_init(app.config) register_blueprints(app) register_extensions(app) register_context_processors(app) register_errors_handlers(app) register_docs(app, "api_v1") register_logging_context_hooks(app) register_logging_events_hooks(app) register_template_filters(app) return app def configure_app(app, config=None): app.config.from_object(Settings) app.config["WTF_CSRF_ENABLED"] = False if config: app.config.from_object(config) def register_blueprints(app): app.register_blueprint(views.core) app.register_blueprint(v1.api, url_prefix="/api/v1") app.register_blueprint(templating, url_prefix="/admin") app.register_blueprint(images, url_prefix="/admin") app.register_blueprint(analytics, url_prefix="/analytics") 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()], )