Skip to content

Commit a88810a

Browse files
willgittoes-ddEmanuele Palazzetti
authored andcommitted
[django] Ensure that ONLY one of MIDDLEWARE and MIDDLEWARE_CLASSES gets patched. (#446)
1 parent 22b24d5 commit a88810a

File tree

1 file changed

+24
-19
lines changed

1 file changed

+24
-19
lines changed

ddtrace/contrib/django/middleware.py

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
# 3p
1212
from django.core.exceptions import MiddlewareNotUsed
1313
from django.conf import settings as django_settings
14+
import django
1415

1516
try:
1617
from django.utils.deprecation import MiddlewareMixin
@@ -22,33 +23,37 @@
2223

2324
EXCEPTION_MIDDLEWARE = 'ddtrace.contrib.django.TraceExceptionMiddleware'
2425
TRACE_MIDDLEWARE = 'ddtrace.contrib.django.TraceMiddleware'
25-
MIDDLEWARE_ATTRIBUTES = ['MIDDLEWARE', 'MIDDLEWARE_CLASSES']
26+
MIDDLEWARE = 'MIDDLEWARE'
27+
MIDDLEWARE_CLASSES = 'MIDDLEWARE_CLASSES'
28+
29+
def get_middleware_insertion_point():
30+
"""Returns the attribute name and collection object for the Django middleware.
31+
If middleware cannot be found, returns None for the middleware collection."""
32+
middleware = getattr(django_settings, MIDDLEWARE, None)
33+
# Prioritise MIDDLEWARE over ..._CLASSES, but only in 1.10 and later.
34+
if middleware and django.VERSION >= (1, 10):
35+
return MIDDLEWARE, middleware
36+
return MIDDLEWARE_CLASSES, getattr(django_settings, MIDDLEWARE_CLASSES, None)
2637

2738
def insert_trace_middleware():
28-
for middleware_attribute in MIDDLEWARE_ATTRIBUTES:
29-
middleware = getattr(django_settings, middleware_attribute, None)
30-
if middleware is not None and TRACE_MIDDLEWARE not in set(middleware):
31-
setattr(django_settings, middleware_attribute, type(middleware)((TRACE_MIDDLEWARE,)) + middleware)
32-
break
39+
middleware_attribute, middleware = get_middleware_insertion_point()
40+
if middleware is not None and TRACE_MIDDLEWARE not in set(middleware):
41+
setattr(django_settings, middleware_attribute, type(middleware)((TRACE_MIDDLEWARE,)) + middleware)
3342

3443
def remove_trace_middleware():
35-
for middleware_attribute in MIDDLEWARE_ATTRIBUTES:
36-
middleware = getattr(django_settings, middleware_attribute, None)
37-
if middleware and TRACE_MIDDLEWARE in set(middleware):
38-
middleware.remove(TRACE_MIDDLEWARE)
44+
_, middleware = get_middleware_insertion_point()
45+
if middleware and TRACE_MIDDLEWARE in set(middleware):
46+
middleware.remove(TRACE_MIDDLEWARE)
3947

4048
def insert_exception_middleware():
41-
for middleware_attribute in MIDDLEWARE_ATTRIBUTES:
42-
middleware = getattr(django_settings, middleware_attribute, None)
43-
if middleware is not None and EXCEPTION_MIDDLEWARE not in set(middleware):
44-
setattr(django_settings, middleware_attribute, middleware + type(middleware)((EXCEPTION_MIDDLEWARE,)))
45-
break
49+
middleware_attribute, middleware = get_middleware_insertion_point()
50+
if middleware is not None and EXCEPTION_MIDDLEWARE not in set(middleware):
51+
setattr(django_settings, middleware_attribute, middleware + type(middleware)((EXCEPTION_MIDDLEWARE,)))
4652

4753
def remove_exception_middleware():
48-
for middleware_attribute in MIDDLEWARE_ATTRIBUTES:
49-
middleware = getattr(django_settings, middleware_attribute, None)
50-
if middleware and EXCEPTION_MIDDLEWARE in set(middleware):
51-
middleware.remove(EXCEPTION_MIDDLEWARE)
54+
_, middleware = get_middleware_insertion_point()
55+
if middleware and EXCEPTION_MIDDLEWARE in set(middleware):
56+
middleware.remove(EXCEPTION_MIDDLEWARE)
5257

5358
class InstrumentationMixin(MiddlewareClass):
5459
"""

0 commit comments

Comments
 (0)