6
6
from typing import Any
7
7
8
8
9
+ try :
10
+ from asyncio import iscoroutinefunction
11
+ except ImportError :
12
+ iscoroutinefunction = None # type: ignore
13
+
14
+
15
+ try :
16
+ from sentry_sdk .integrations .django .asgi import wrap_async_view
17
+ except (ImportError , SyntaxError ):
18
+ wrap_async_view = None # type: ignore
19
+
20
+
9
21
def patch_views ():
10
22
# type: () -> None
11
23
@@ -27,17 +39,31 @@ def sentry_patched_make_view_atomic(self, *args, **kwargs):
27
39
28
40
if integration is not None and integration .middleware_spans :
29
41
30
- @_functools .wraps (callback )
31
- def sentry_wrapped_callback (request , * args , ** kwargs ):
32
- # type: (Any, *Any, **Any) -> Any
33
- with hub .start_span (
34
- op = "django.view" , description = request .resolver_match .view_name
35
- ):
36
- return callback (request , * args , ** kwargs )
42
+ if (
43
+ iscoroutinefunction is not None
44
+ and wrap_async_view is not None
45
+ and iscoroutinefunction (callback )
46
+ ):
47
+ sentry_wrapped_callback = wrap_async_view (hub , callback )
48
+ else :
49
+ sentry_wrapped_callback = _wrap_sync_view (hub , callback )
37
50
38
51
else :
39
52
sentry_wrapped_callback = callback
40
53
41
54
return sentry_wrapped_callback
42
55
43
56
BaseHandler .make_view_atomic = sentry_patched_make_view_atomic
57
+
58
+
59
+ def _wrap_sync_view (hub , callback ):
60
+ # type: (Hub, Any) -> Any
61
+ @_functools .wraps (callback )
62
+ def sentry_wrapped_callback (request , * args , ** kwargs ):
63
+ # type: (Any, *Any, **Any) -> Any
64
+ with hub .start_span (
65
+ op = "django.view" , description = request .resolver_match .view_name
66
+ ):
67
+ return callback (request , * args , ** kwargs )
68
+
69
+ return sentry_wrapped_callback
0 commit comments