Skip to content
This repository was archived by the owner on Sep 17, 2025. It is now read-only.

Commit b1075ce

Browse files
wsabranskyc24t
authored andcommitted
Prevent middleware error on older Django versions (<1.8) (#603)
1 parent 0c0684b commit b1075ce

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

contrib/opencensus-ext-django/opencensus/ext/django/middleware.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,12 @@ def _set_django_attributes(span, request):
9999
return
100100

101101
user_id = django_user.pk
102-
user_name = django_user.get_username()
102+
try:
103+
user_name = django_user.get_username()
104+
except AttributeError:
105+
# AnonymousUser in some older versions of Django doesn't implement
106+
# get_username
107+
return
103108

104109
# User id is the django autofield for User model as the primary key
105110
if user_id is not None:

contrib/opencensus-ext-django/tests/test_django_middleware.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,43 @@ def test_process_response(self):
430430

431431
self.assertEqual(span.attributes, expected_attributes)
432432

433+
def test_process_response_no_get_username(self):
434+
from opencensus.ext.django import middleware
435+
436+
trace_id = '2dd43a1d6b2549c6bc2a1a54c2fc0b05'
437+
span_id = '6e0c63257de34c92'
438+
django_trace_id = '{}/{}'.format(trace_id, span_id)
439+
440+
django_request = RequestFactory().get('/', **{
441+
google_cloud_format._TRACE_CONTEXT_HEADER_NAME: django_trace_id})
442+
443+
middleware_obj = middleware.OpencensusMiddleware()
444+
445+
middleware_obj.process_request(django_request)
446+
tracer = middleware._get_current_tracer()
447+
span = tracer.current_span()
448+
449+
exporter_mock = mock.Mock()
450+
tracer.exporter = exporter_mock
451+
452+
django_response = mock.Mock()
453+
django_response.status_code = 200
454+
455+
expected_attributes = {
456+
'http.url': u'/',
457+
'http.method': 'GET',
458+
'http.status_code': '200',
459+
}
460+
461+
mock_user = mock.Mock()
462+
mock_user.pk = 123
463+
mock_user.get_username.side_effect = AttributeError
464+
django_request.user = mock_user
465+
466+
middleware_obj.process_response(django_request, django_response)
467+
468+
self.assertEqual(span.attributes, expected_attributes)
469+
433470
def test_process_response_unfinished_child_span(self):
434471
from opencensus.ext.django import middleware
435472

0 commit comments

Comments
 (0)