diff options
author | David Cramer <dcramer@gmail.com> | 2017-02-15 10:19:42 -0800 |
---|---|---|
committer | David Cramer <dcramer@gmail.com> | 2017-02-15 10:20:04 -0800 |
commit | 3991bec5af471ee6031a55e3d7073fab5c6c9f57 (patch) | |
tree | fb48ba0457f46ab829a2d47aee3e3cb4fe6b5b2f | |
parent | 17b823d69b70d8a92982b140a1763a84905faeb2 (diff) | |
download | raven-3991bec5af471ee6031a55e3d7073fab5c6c9f57.tar.gz |
[django] fix shared request not being available in thread contextfix/django-request
-rw-r--r-- | raven/contrib/django/client.py | 4 | ||||
-rw-r--r-- | raven/contrib/django/middleware/__init__.py | 19 | ||||
-rw-r--r-- | tests/contrib/django/tests.py | 16 | ||||
-rw-r--r-- | tests/contrib/django/urls.py | 1 | ||||
-rw-r--r-- | tests/contrib/django/views.py | 14 |
5 files changed, 35 insertions, 19 deletions
diff --git a/raven/contrib/django/client.py b/raven/contrib/django/client.py index 5cd8d53..6f81a62 100644 --- a/raven/contrib/django/client.py +++ b/raven/contrib/django/client.py @@ -27,7 +27,7 @@ except ImportError: from raven.base import Client from raven.contrib.django.utils import get_data_from_template, get_host -from raven.contrib.django.middleware import SentryLogMiddleware +from raven.contrib.django.middleware import SentryMiddleware from raven.utils.compat import string_types, binary_type, iterlists from raven.contrib.django.resolver import RouteResolver from raven.utils.wsgi import get_headers, get_environ @@ -263,7 +263,7 @@ class DjangoClient(Client): data = kwargs['data'] if request is None: - request = getattr(SentryLogMiddleware.thread, 'request', None) + request = getattr(SentryMiddleware.thread, 'request', None) is_http_request = isinstance(request, HttpRequest) if is_http_request: diff --git a/raven/contrib/django/middleware/__init__.py b/raven/contrib/django/middleware/__init__.py index a19fad0..b4c6c20 100644 --- a/raven/contrib/django/middleware/__init__.py +++ b/raven/contrib/django/middleware/__init__.py @@ -76,25 +76,12 @@ class SentryResponseErrorIdMiddleware(MiddlewareMixin): return response -# We need to make a base class for our sentry middleware that is thread -# local but at the same time has the new fnagled middleware mixin applied -# if such a thing exists. -if MiddlewareMixin is object: - _SentryMiddlewareBase = threading.local -else: - _SentryMiddlewareBase = type('_SentryMiddlewareBase', (MiddlewareMixin, threading.local), {}) - - -class SentryMiddleware(_SentryMiddlewareBase): - - # backwards compat - @property - def thread(self): - return self +class SentryMiddleware(MiddlewareMixin): + thread = threading.local() def process_request(self, request): self._txid = None - self.thread.request = request + SentryMiddleware.thread.request = request def process_view(self, request, func, args, kwargs): from raven.contrib.django.models import client diff --git a/tests/contrib/django/tests.py b/tests/contrib/django/tests.py index 995a56b..bfff82a 100644 --- a/tests/contrib/django/tests.py +++ b/tests/contrib/django/tests.py @@ -163,7 +163,8 @@ class DjangoClientTest(TestCase): @pytest.mark.skipif(sys.version_info[:2] == (2, 6), reason='Python 2.6') def test_view_exception(self): - self.assertRaises(Exception, self.client.get, reverse('sentry-raise-exc')) + path = reverse('sentry-raise-exc') + self.assertRaises(Exception, self.client.get, path) assert len(self.raven.events) == 1 event = self.raven.events.pop(0) @@ -173,6 +174,19 @@ class DjangoClientTest(TestCase): assert exc['value'] == 'view exception' assert event['level'] == logging.ERROR assert event['message'] == 'Exception: view exception' + assert 'request' in event + assert event['request']['url'] == 'http://testserver{}'.format(path) + + def test_capture_event_with_request_middleware(self): + path = reverse('sentry-trigger-event') + resp = self.client.get(path) + assert resp.status_code == 200 + + assert len(self.raven.events) == 1 + event = self.raven.events.pop(0) + assert event['message'] == 'test' + assert 'request' in event + assert event['request']['url'] == 'http://testserver{}'.format(path) def test_user_info(self): with Settings(MIDDLEWARE_CLASSES=[ diff --git a/tests/contrib/django/urls.py b/tests/contrib/django/urls.py index c4b3abf..86ebdf7 100644 --- a/tests/contrib/django/urls.py +++ b/tests/contrib/django/urls.py @@ -30,4 +30,5 @@ urlpatterns = ( url(r'^trigger-500-django$', tests.contrib.django.views.django_exc, name='sentry-django-exc'), url(r'^trigger-500-template$', tests.contrib.django.views.template_exc, name='sentry-template-exc'), url(r'^trigger-500-log-request$', tests.contrib.django.views.logging_request_exc, name='sentry-log-request-exc'), + url(r'^trigger-event$', tests.contrib.django.views.capture_event, name='sentry-trigger-event'), ) diff --git a/tests/contrib/django/views.py b/tests/contrib/django/views.py index 72a37af..b288e85 100644 --- a/tests/contrib/django/views.py +++ b/tests/contrib/django/views.py @@ -2,30 +2,39 @@ from __future__ import absolute_import from django.http import HttpResponse from django.shortcuts import get_object_or_404, render_to_response +from raven.contrib.django.models import client import logging + def no_error(request): return HttpResponse('') + def fake_login(request): return HttpResponse('') + def django_exc(request): return get_object_or_404(Exception, pk=1) + def raise_exc(request): raise Exception(request.GET.get('message', 'view exception')) + def raise_ioerror(request): raise IOError(request.GET.get('message', 'view exception')) + def decorated_raise_exc(request): return raise_exc(request) + def template_exc(request): return render_to_response('error.html') + def logging_request_exc(request): logger = logging.getLogger(__name__) try: @@ -33,3 +42,8 @@ def logging_request_exc(request): except Exception as e: logger.error(e, exc_info=True, extra={'request': request}) return HttpResponse('') + + +def capture_event(request): + client.captureMessage('test') + return HttpResponse('') |