summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Cramer <dcramer@gmail.com>2017-02-15 10:19:42 -0800
committerDavid Cramer <dcramer@gmail.com>2017-02-15 10:20:04 -0800
commit3991bec5af471ee6031a55e3d7073fab5c6c9f57 (patch)
treefb48ba0457f46ab829a2d47aee3e3cb4fe6b5b2f
parent17b823d69b70d8a92982b140a1763a84905faeb2 (diff)
downloadraven-3991bec5af471ee6031a55e3d7073fab5c6c9f57.tar.gz
[django] fix shared request not being available in thread contextfix/django-request
-rw-r--r--raven/contrib/django/client.py4
-rw-r--r--raven/contrib/django/middleware/__init__.py19
-rw-r--r--tests/contrib/django/tests.py16
-rw-r--r--tests/contrib/django/urls.py1
-rw-r--r--tests/contrib/django/views.py14
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('')