From 3db994916f2e20fb78284ff198957fed263133d3 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Tue, 18 Mar 2025 10:02:14 +0100 Subject: [PATCH 1/7] feat(django): Use @wraps in more places --- sentry_sdk/integrations/django/__init__.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sentry_sdk/integrations/django/__init__.py b/sentry_sdk/integrations/django/__init__.py index e8aa673787..c17c250906 100644 --- a/sentry_sdk/integrations/django/__init__.py +++ b/sentry_sdk/integrations/django/__init__.py @@ -1,3 +1,4 @@ +import functools import inspect import sys import threading @@ -168,6 +169,7 @@ def setup_once(): old_app = WSGIHandler.__call__ @ensure_integration_enabled(DjangoIntegration, old_app) + @functools.wraps(old_app) def sentry_patched_wsgi_handler(self, environ, start_response): # type: (Any, Dict[str, str], Callable[..., Any]) -> _ScopedResponse bound_old_app = old_app.__get__(self, WSGIHandler) @@ -321,6 +323,7 @@ def _patch_drf(): else: old_drf_initial = APIView.initial + @functools.wraps(old_drf_initial) def sentry_patched_drf_initial(self, request, *args, **kwargs): # type: (APIView, Any, *Any, **Any) -> Any with capture_internal_exceptions(): @@ -471,6 +474,7 @@ def _patch_get_response(): old_get_response = BaseHandler.get_response + @functools.wraps(old_get_response) def sentry_patched_get_response(self, request): # type: (Any, WSGIRequest) -> Union[HttpResponse, BaseException] _before_get_response(request) @@ -637,6 +641,7 @@ def install_sql_hook(): return @ensure_integration_enabled(DjangoIntegration, real_execute) + @functools.wraps(real_execute) def execute(self, sql, params=None): # type: (CursorWrapper, Any, Optional[Any]) -> Any with record_sql_queries( @@ -656,6 +661,7 @@ def execute(self, sql, params=None): return result @ensure_integration_enabled(DjangoIntegration, real_executemany) + @functools.wraps(real_executemany) def executemany(self, sql, param_list): # type: (CursorWrapper, Any, List[Any]) -> Any with record_sql_queries( @@ -676,6 +682,7 @@ def executemany(self, sql, param_list): return result @ensure_integration_enabled(DjangoIntegration, real_connect) + @functools.wraps(real_connect) def connect(self): # type: (BaseDatabaseWrapper) -> None with capture_internal_exceptions(): From 82814963e92fb1c845152617e07960ab5a482974 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Tue, 18 Mar 2025 10:05:18 +0100 Subject: [PATCH 2/7] ordering --- sentry_sdk/integrations/django/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sentry_sdk/integrations/django/__init__.py b/sentry_sdk/integrations/django/__init__.py index c17c250906..f757a001a4 100644 --- a/sentry_sdk/integrations/django/__init__.py +++ b/sentry_sdk/integrations/django/__init__.py @@ -168,8 +168,8 @@ def setup_once(): old_app = WSGIHandler.__call__ - @ensure_integration_enabled(DjangoIntegration, old_app) @functools.wraps(old_app) + @ensure_integration_enabled(DjangoIntegration, old_app) def sentry_patched_wsgi_handler(self, environ, start_response): # type: (Any, Dict[str, str], Callable[..., Any]) -> _ScopedResponse bound_old_app = old_app.__get__(self, WSGIHandler) @@ -640,8 +640,8 @@ def install_sql_hook(): # This won't work on Django versions < 1.6 return - @ensure_integration_enabled(DjangoIntegration, real_execute) @functools.wraps(real_execute) + @ensure_integration_enabled(DjangoIntegration, real_execute) def execute(self, sql, params=None): # type: (CursorWrapper, Any, Optional[Any]) -> Any with record_sql_queries( @@ -660,8 +660,8 @@ def execute(self, sql, params=None): return result - @ensure_integration_enabled(DjangoIntegration, real_executemany) @functools.wraps(real_executemany) + @ensure_integration_enabled(DjangoIntegration, real_executemany) def executemany(self, sql, param_list): # type: (CursorWrapper, Any, List[Any]) -> Any with record_sql_queries( @@ -681,8 +681,8 @@ def executemany(self, sql, param_list): return result - @ensure_integration_enabled(DjangoIntegration, real_connect) @functools.wraps(real_connect) + @ensure_integration_enabled(DjangoIntegration, real_connect) def connect(self): # type: (BaseDatabaseWrapper) -> None with capture_internal_exceptions(): From ebc82a68391438aed80488921c77131eed1b84d9 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Tue, 18 Mar 2025 10:22:19 +0100 Subject: [PATCH 3/7] more wraps --- sentry_sdk/integrations/django/asgi.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sentry_sdk/integrations/django/asgi.py b/sentry_sdk/integrations/django/asgi.py index daa1498c58..abc9c2b57a 100644 --- a/sentry_sdk/integrations/django/asgi.py +++ b/sentry_sdk/integrations/django/asgi.py @@ -88,6 +88,7 @@ def patch_django_asgi_handler_impl(cls): old_app = cls.__call__ + @functools.wraps(old_app) async def sentry_patched_asgi_handler(self, scope, receive, send): # type: (Any, Any, Any, Any) -> Any integration = sentry_sdk.get_client().get_integration(DjangoIntegration) @@ -109,6 +110,7 @@ async def sentry_patched_asgi_handler(self, scope, receive, send): if modern_django_asgi_support: old_create_request = cls.create_request + @functools.wrap(old_create_request) @ensure_integration_enabled(DjangoIntegration, old_create_request) def sentry_patched_create_request(self, *args, **kwargs): # type: (Any, *Any, **Any) -> Any @@ -125,6 +127,7 @@ def patch_get_response_async(cls, _before_get_response): # type: (Any, Any) -> None old_get_response_async = cls.get_response_async + @functools.wraps(old_get_response_async) async def sentry_patched_get_response_async(self, request): # type: (Any, Any) -> Union[HttpResponse, BaseException] _before_get_response(request) @@ -142,6 +145,7 @@ def patch_channels_asgi_handler_impl(cls): if channels.__version__ < "3.0.0": old_app = cls.__call__ + @functools.wraps(old_app) async def sentry_patched_asgi_handler(self, receive, send): # type: (Any, Any, Any) -> Any integration = sentry_sdk.get_client().get_integration(DjangoIntegration) From 50ecbc407dcce7d0fedd1220dbaaa585cabe5c0f Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Tue, 18 Mar 2025 10:49:11 +0100 Subject: [PATCH 4/7] . --- sentry_sdk/integrations/django/asgi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry_sdk/integrations/django/asgi.py b/sentry_sdk/integrations/django/asgi.py index abc9c2b57a..5e38b71508 100644 --- a/sentry_sdk/integrations/django/asgi.py +++ b/sentry_sdk/integrations/django/asgi.py @@ -110,7 +110,7 @@ async def sentry_patched_asgi_handler(self, scope, receive, send): if modern_django_asgi_support: old_create_request = cls.create_request - @functools.wrap(old_create_request) + @functools.wraps(old_create_request) @ensure_integration_enabled(DjangoIntegration, old_create_request) def sentry_patched_create_request(self, *args, **kwargs): # type: (Any, *Any, **Any) -> Any From 5f7c7295db2b187fed74cee1c4a8a4a94a048acd Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Tue, 18 Mar 2025 10:59:17 +0100 Subject: [PATCH 5/7] even more wraps --- sentry_sdk/integrations/django/signals_handlers.py | 1 + sentry_sdk/integrations/django/templates.py | 1 + sentry_sdk/integrations/django/views.py | 1 + 3 files changed, 3 insertions(+) diff --git a/sentry_sdk/integrations/django/signals_handlers.py b/sentry_sdk/integrations/django/signals_handlers.py index ae948cec2a..69c1a3cdfb 100644 --- a/sentry_sdk/integrations/django/signals_handlers.py +++ b/sentry_sdk/integrations/django/signals_handlers.py @@ -50,6 +50,7 @@ def patch_signals(): old_live_receivers = Signal._live_receivers + @wraps(old_live_receivers) def _sentry_live_receivers(self, sender): # type: (Signal, Any) -> Union[tuple[list[Callable[..., Any]], list[Callable[..., Any]]], list[Callable[..., Any]]] if DJANGO_VERSION >= (5, 0): diff --git a/sentry_sdk/integrations/django/templates.py b/sentry_sdk/integrations/django/templates.py index c9e41e24a0..d49f7defec 100644 --- a/sentry_sdk/integrations/django/templates.py +++ b/sentry_sdk/integrations/django/templates.py @@ -64,6 +64,7 @@ def patch_templates(): real_rendered_content = SimpleTemplateResponse.rendered_content + @functools.wraps(real_rendered_content) @property # type: ignore @ensure_integration_enabled(DjangoIntegration, real_rendered_content.fget) def rendered_content(self): diff --git a/sentry_sdk/integrations/django/views.py b/sentry_sdk/integrations/django/views.py index e8dfa8abb6..aa2140764c 100644 --- a/sentry_sdk/integrations/django/views.py +++ b/sentry_sdk/integrations/django/views.py @@ -31,6 +31,7 @@ def patch_views(): old_make_view_atomic = BaseHandler.make_view_atomic old_render = SimpleTemplateResponse.render + @functools.wraps(old_render) def sentry_patched_render(self): # type: (SimpleTemplateResponse) -> Any with sentry_sdk.start_span( From 75ebc444f68bceb38d1352d7ded146902ed054a5 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Tue, 18 Mar 2025 11:01:48 +0100 Subject: [PATCH 6/7] .. --- sentry_sdk/integrations/django/templates.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sentry_sdk/integrations/django/templates.py b/sentry_sdk/integrations/django/templates.py index d49f7defec..c9e41e24a0 100644 --- a/sentry_sdk/integrations/django/templates.py +++ b/sentry_sdk/integrations/django/templates.py @@ -64,7 +64,6 @@ def patch_templates(): real_rendered_content = SimpleTemplateResponse.rendered_content - @functools.wraps(real_rendered_content) @property # type: ignore @ensure_integration_enabled(DjangoIntegration, real_rendered_content.fget) def rendered_content(self): From c6c1bf2dc8f004e707b1b6331fa9babed3989484 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Tue, 18 Mar 2025 13:28:01 +0100 Subject: [PATCH 7/7] Apply suggestions from code review Co-authored-by: Daniel Szoke <7881302+szokeasaurusrex@users.noreply.github.com> --- sentry_sdk/integrations/django/__init__.py | 4 ---- sentry_sdk/integrations/django/asgi.py | 1 - 2 files changed, 5 deletions(-) diff --git a/sentry_sdk/integrations/django/__init__.py b/sentry_sdk/integrations/django/__init__.py index f757a001a4..f6cbd8c657 100644 --- a/sentry_sdk/integrations/django/__init__.py +++ b/sentry_sdk/integrations/django/__init__.py @@ -168,7 +168,6 @@ def setup_once(): old_app = WSGIHandler.__call__ - @functools.wraps(old_app) @ensure_integration_enabled(DjangoIntegration, old_app) def sentry_patched_wsgi_handler(self, environ, start_response): # type: (Any, Dict[str, str], Callable[..., Any]) -> _ScopedResponse @@ -640,7 +639,6 @@ def install_sql_hook(): # This won't work on Django versions < 1.6 return - @functools.wraps(real_execute) @ensure_integration_enabled(DjangoIntegration, real_execute) def execute(self, sql, params=None): # type: (CursorWrapper, Any, Optional[Any]) -> Any @@ -660,7 +658,6 @@ def execute(self, sql, params=None): return result - @functools.wraps(real_executemany) @ensure_integration_enabled(DjangoIntegration, real_executemany) def executemany(self, sql, param_list): # type: (CursorWrapper, Any, List[Any]) -> Any @@ -681,7 +678,6 @@ def executemany(self, sql, param_list): return result - @functools.wraps(real_connect) @ensure_integration_enabled(DjangoIntegration, real_connect) def connect(self): # type: (BaseDatabaseWrapper) -> None diff --git a/sentry_sdk/integrations/django/asgi.py b/sentry_sdk/integrations/django/asgi.py index 5e38b71508..0ca1c080fd 100644 --- a/sentry_sdk/integrations/django/asgi.py +++ b/sentry_sdk/integrations/django/asgi.py @@ -110,7 +110,6 @@ async def sentry_patched_asgi_handler(self, scope, receive, send): if modern_django_asgi_support: old_create_request = cls.create_request - @functools.wraps(old_create_request) @ensure_integration_enabled(DjangoIntegration, old_create_request) def sentry_patched_create_request(self, *args, **kwargs): # type: (Any, *Any, **Any) -> Any