66 from typing import Any
77
88
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+
921def patch_views ():
1022 # type: () -> None
1123
@@ -27,17 +39,31 @@ def sentry_patched_make_view_atomic(self, *args, **kwargs):
2739
2840 if integration is not None and integration .middleware_spans :
2941
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 )
3750
3851 else :
3952 sentry_wrapped_callback = callback
4053
4154 return sentry_wrapped_callback
4255
4356 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