From 37563a28aac412bf88a8f82ce491135630ebefc0 Mon Sep 17 00:00:00 2001 From: David Cramer Date: Tue, 21 Feb 2017 15:47:28 -0800 Subject: Add lock around initialization --- raven/contrib/django/models.py | 53 ++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/raven/contrib/django/models.py b/raven/contrib/django/models.py index 8d60aa0..4772e10 100644 --- a/raven/contrib/django/models.py +++ b/raven/contrib/django/models.py @@ -25,8 +25,6 @@ from raven.utils.imports import import_string logger = logging.getLogger('sentry.errors.client') -settings_lock = Lock() - def get_installed_apps(): """ @@ -223,28 +221,39 @@ def install_middleware(): """ name = 'raven.contrib.django.middleware.SentryMiddleware' all_names = (name, 'raven.contrib.django.middleware.SentryLogMiddleware') - with settings_lock: - # default settings.MIDDLEWARE is None - middleware_attr = 'MIDDLEWARE' if getattr(settings, - 'MIDDLEWARE', - None) is not None \ - else 'MIDDLEWARE_CLASSES' - # make sure to get an empty tuple when attr is None - middleware = getattr(settings, middleware_attr, ()) or () - if set(all_names).isdisjoint(set(middleware)): - setattr(settings, - middleware_attr, - type(middleware)((name,)) + middleware) + # default settings.MIDDLEWARE is None + middleware_attr = 'MIDDLEWARE' if getattr(settings, + 'MIDDLEWARE', + None) is not None \ + else 'MIDDLEWARE_CLASSES' + # make sure to get an empty tuple when attr is None + middleware = getattr(settings, middleware_attr, ()) or () + if set(all_names).isdisjoint(set(middleware)): + setattr(settings, + middleware_attr, + type(middleware)((name,)) + middleware) + + +_setup_lock = Lock() +_initialized = False def initialize(): - register_serializers() - install_middleware() + global _initialized + + with _setup_lock: + if _initialized: + return + + register_serializers() + install_middleware() + + # XXX(dcramer): maybe this setting should disable ALL of this? + if not getattr(settings, 'DISABLE_SENTRY_INSTRUMENTATION', False): + handler = SentryDjangoHandler() + handler.install() - # XXX(dcramer): maybe this setting should disable ALL of this? - if not getattr(settings, 'DISABLE_SENTRY_INSTRUMENTATION', False): - handler = SentryDjangoHandler() - handler.install() + # instantiate client so hooks get registered + get_client() # NOQA - # instantiate client so hooks get registered - get_client() # NOQA + _initialized = True -- cgit v1.2.1