We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
DjangoIntegration conflict with MiddlewareMixin & TemplateView
django version: 3.0
sentry-sdk version: 0.14.3

My project has a middleware using Django's `django.utils.deprecation.MiddlewareMixin`. Visiting a view which subclasses `django.views.generic.TemplateView` while Sentry is active results in the following exception:
```
AttributeError: 'function' object has no attribute '__self__'
  File "django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "django/core/handlers/base.py", line 196, in _get_response
    middleware_method.__self__.__class__.__name__,
```

The following classes & url config should be sufficient to demonstrate the problem:

```
from django.utils.deprecation import MiddlewareMixin
from django.views.generic import TemplateView

# ...in myapp.middleware.py
class DemonstratesConflictMiddleware(MiddlewareMixin):
    def process_template_response(self, request, response):
        return response

# ...in myapp.views.py
class DemonstratesConflictView(TemplateView): 
    template_name = "index.html"


# ...in urls.py
import myapp.views
urlpatterns += [
    path('/', myapp.views.DemonstratesConflictView.as_view(), name='throws-exception'),
]

# ... in settings.py

MIDDLEWARE += ['myapp.middleware.DemonstratesConflictMiddleware']

sentry_sdk.init(
    dsn="OMITTED",
    integrations=[DjangoIntegration()],
)

```

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `sentry_sdk/integrations/django/middleware.py`
Content:
```
1 """
2 Create spans from Django middleware invocations
3 """
4 
5 from django import VERSION as DJANGO_VERSION
6 
7 from sentry_sdk import Hub
8 from sentry_sdk._functools import wraps
9 from sentry_sdk._types import MYPY
10 from sentry_sdk.utils import (
11     ContextVar,
12     transaction_from_function,
13     capture_internal_exceptions,
14 )
15 
16 if MYPY:
17     from typing import Any
18     from typing import Callable
19     from typing import TypeVar
20 
21     F = TypeVar("F", bound=Callable[..., Any])
22 
23 _import_string_should_wrap_middleware = ContextVar(
24     "import_string_should_wrap_middleware"
25 )
26 
27 if DJANGO_VERSION < (1, 7):
28     import_string_name = "import_by_path"
29 else:
30     import_string_name = "import_string"
31 
32 
33 def patch_django_middlewares():
34     # type: () -> None
35     from django.core.handlers import base
36 
37     old_import_string = getattr(base, import_string_name)
38 
39     def sentry_patched_import_string(dotted_path):
40         # type: (str) -> Any
41         rv = old_import_string(dotted_path)
42 
43         if _import_string_should_wrap_middleware.get(None):
44             rv = _wrap_middleware(rv, dotted_path)
45 
46         return rv
47 
48     setattr(base, import_string_name, sentry_patched_import_string)
49 
50     old_load_middleware = base.BaseHandler.load_middleware
51 
52     def sentry_patched_load_middleware(*args, **kwargs):
53         # type: (Any, Any) -> Any
54         _import_string_should_wrap_middleware.set(True)
55         try:
56             return old_load_middleware(*args, **kwargs)
57         finally:
58             _import_string_should_wrap_middleware.set(False)
59 
60     base.BaseHandler.load_middleware = sentry_patched_load_middleware
61 
62 
63 def _wrap_middleware(middleware, middleware_name):
64     # type: (Any, str) -> Any
65     from sentry_sdk.integrations.django import DjangoIntegration
66 
67     def _get_wrapped_method(old_method):
68         # type: (F) -> F
69         with capture_internal_exceptions():
70 
71             def sentry_wrapped_method(*args, **kwargs):
72                 # type: (*Any, **Any) -> Any
73                 hub = Hub.current
74                 integration = hub.get_integration(DjangoIntegration)
75                 if integration is None or not integration.middleware_spans:
76                     return old_method(*args, **kwargs)
77 
78                 function_name = transaction_from_function(old_method)
79 
80                 description = middleware_name
81                 function_basename = getattr(old_method, "__name__", None)
82                 if function_basename:
83                     description = "{}.{}".format(description, function_basename)
84 
85                 with hub.start_span(
86                     op="django.middleware", description=description
87                 ) as span:
88                     span.set_tag("django.function_name", function_name)
89                     span.set_tag("django.middleware_name", middleware_name)
90                     return old_method(*args, **kwargs)
91 
92             try:
93                 # fails for __call__ of function on Python 2 (see py2.7-django-1.11)
94                 return wraps(old_method)(sentry_wrapped_method)  # type: ignore
95             except Exception:
96                 return sentry_wrapped_method  # type: ignore
97 
98         return old_method
99 
100     class SentryWrappingMiddleware(object):
101         def __init__(self, *args, **kwargs):
102             # type: (*Any, **Any) -> None
103             self._inner = middleware(*args, **kwargs)
104             self._call_method = None
105 
106         # We need correct behavior for `hasattr()`, which we can only determine
107         # when we have an instance of the middleware we're wrapping.
108         def __getattr__(self, method_name):
109             # type: (str) -> Any
110             if method_name not in (
111                 "process_request",
112                 "process_view",
113                 "process_template_response",
114                 "process_response",
115                 "process_exception",
116             ):
117                 raise AttributeError()
118 
119             old_method = getattr(self._inner, method_name)
120             rv = _get_wrapped_method(old_method)
121             self.__dict__[method_name] = rv
122             return rv
123 
124         def __call__(self, *args, **kwargs):
125             # type: (*Any, **Any) -> Any
126             f = self._call_method
127             if f is None:
128                 self._call_method = f = _get_wrapped_method(self._inner.__call__)
129             return f(*args, **kwargs)
130 
131     if hasattr(middleware, "__name__"):
132         SentryWrappingMiddleware.__name__ = middleware.__name__
133 
134     return SentryWrappingMiddleware
135
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/sentry_sdk/integrations/django/middleware.py b/sentry_sdk/integrations/django/middleware.py
--- a/sentry_sdk/integrations/django/middleware.py
+++ b/sentry_sdk/integrations/django/middleware.py
@@ -91,9 +91,14 @@
 
             try:
                 # fails for __call__ of function on Python 2 (see py2.7-django-1.11)
-                return wraps(old_method)(sentry_wrapped_method)  # type: ignore
+                sentry_wrapped_method = wraps(old_method)(sentry_wrapped_method)
+
+                # Necessary for Django 3.1
+                sentry_wrapped_method.__self__ = old_method.__self__  # type: ignore
             except Exception:
-                return sentry_wrapped_method  # type: ignore
+                pass
+
+            return sentry_wrapped_method  # type: ignore
 
         return old_method

{"golden_diff": "diff --git a/sentry_sdk/integrations/django/middleware.py b/sentry_sdk/integrations/django/middleware.py\n--- a/sentry_sdk/integrations/django/middleware.py\n+++ b/sentry_sdk/integrations/django/middleware.py\n@@ -91,9 +91,14 @@\n \n             try:\n                 # fails for __call__ of function on Python 2 (see py2.7-django-1.11)\n-                return wraps(old_method)(sentry_wrapped_method)  # type: ignore\n+                sentry_wrapped_method = wraps(old_method)(sentry_wrapped_method)\n+\n+                # Necessary for Django 3.1\n+                sentry_wrapped_method.__self__ = old_method.__self__  # type: ignore\n             except Exception:\n-                return sentry_wrapped_method  # type: ignore\n+                pass\n+\n+            return sentry_wrapped_method  # type: ignore\n \n         return old_method\n", "issue": "DjangoIntegration conflict with MiddlewareMixin & TemplateView\ndjango version: 3.0\r\nsentry-sdk version: 0.14.3\r\n\r\nMy project has a middleware using Django's `django.utils.deprecation.MiddlewareMixin`. Visiting a view which subclasses `django.views.generic.TemplateView` while Sentry is active results in the following exception:\r\n```\r\nAttributeError: 'function' object has no attribute '__self__'\r\n  File \"django/core/handlers/exception.py\", line 47, in inner\r\n    response = get_response(request)\r\n  File \"django/core/handlers/base.py\", line 196, in _get_response\r\n    middleware_method.__self__.__class__.__name__,\r\n```\r\n\r\nThe following classes & url config should be sufficient to demonstrate the problem:\r\n\r\n```\r\nfrom django.utils.deprecation import MiddlewareMixin\r\nfrom django.views.generic import TemplateView\r\n\r\n# ...in myapp.middleware.py\r\nclass DemonstratesConflictMiddleware(MiddlewareMixin):\r\n    def process_template_response(self, request, response):\r\n        return response\r\n\r\n# ...in myapp.views.py\r\nclass DemonstratesConflictView(TemplateView): \r\n    template_name = \"index.html\"\r\n\r\n\r\n# ...in urls.py\r\nimport myapp.views\r\nurlpatterns += [\r\n    path('/', myapp.views.DemonstratesConflictView.as_view(), name='throws-exception'),\r\n]\r\n\r\n# ... in settings.py\r\n\r\nMIDDLEWARE += ['myapp.middleware.DemonstratesConflictMiddleware']\r\n\r\nsentry_sdk.init(\r\n    dsn=\"OMITTED\",\r\n    integrations=[DjangoIntegration()],\r\n)\r\n\r\n```\n", "before_files": [{"content": "\"\"\"\nCreate spans from Django middleware invocations\n\"\"\"\n\nfrom django import VERSION as DJANGO_VERSION\n\nfrom sentry_sdk import Hub\nfrom sentry_sdk._functools import wraps\nfrom sentry_sdk._types import MYPY\nfrom sentry_sdk.utils import (\n    ContextVar,\n    transaction_from_function,\n    capture_internal_exceptions,\n)\n\nif MYPY:\n    from typing import Any\n    from typing import Callable\n    from typing import TypeVar\n\n    F = TypeVar(\"F\", bound=Callable[..., Any])\n\n_import_string_should_wrap_middleware = ContextVar(\n    \"import_string_should_wrap_middleware\"\n)\n\nif DJANGO_VERSION < (1, 7):\n    import_string_name = \"import_by_path\"\nelse:\n    import_string_name = \"import_string\"\n\n\ndef patch_django_middlewares():\n    # type: () -> None\n    from django.core.handlers import base\n\n    old_import_string = getattr(base, import_string_name)\n\n    def sentry_patched_import_string(dotted_path):\n        # type: (str) -> Any\n        rv = old_import_string(dotted_path)\n\n        if _import_string_should_wrap_middleware.get(None):\n            rv = _wrap_middleware(rv, dotted_path)\n\n        return rv\n\n    setattr(base, import_string_name, sentry_patched_import_string)\n\n    old_load_middleware = base.BaseHandler.load_middleware\n\n    def sentry_patched_load_middleware(*args, **kwargs):\n        # type: (Any, Any) -> Any\n        _import_string_should_wrap_middleware.set(True)\n        try:\n            return old_load_middleware(*args, **kwargs)\n        finally:\n            _import_string_should_wrap_middleware.set(False)\n\n    base.BaseHandler.load_middleware = sentry_patched_load_middleware\n\n\ndef _wrap_middleware(middleware, middleware_name):\n    # type: (Any, str) -> Any\n    from sentry_sdk.integrations.django import DjangoIntegration\n\n    def _get_wrapped_method(old_method):\n        # type: (F) -> F\n        with capture_internal_exceptions():\n\n            def sentry_wrapped_method(*args, **kwargs):\n                # type: (*Any, **Any) -> Any\n                hub = Hub.current\n                integration = hub.get_integration(DjangoIntegration)\n                if integration is None or not integration.middleware_spans:\n                    return old_method(*args, **kwargs)\n\n                function_name = transaction_from_function(old_method)\n\n                description = middleware_name\n                function_basename = getattr(old_method, \"__name__\", None)\n                if function_basename:\n                    description = \"{}.{}\".format(description, function_basename)\n\n                with hub.start_span(\n                    op=\"django.middleware\", description=description\n                ) as span:\n                    span.set_tag(\"django.function_name\", function_name)\n                    span.set_tag(\"django.middleware_name\", middleware_name)\n                    return old_method(*args, **kwargs)\n\n            try:\n                # fails for __call__ of function on Python 2 (see py2.7-django-1.11)\n                return wraps(old_method)(sentry_wrapped_method)  # type: ignore\n            except Exception:\n                return sentry_wrapped_method  # type: ignore\n\n        return old_method\n\n    class SentryWrappingMiddleware(object):\n        def __init__(self, *args, **kwargs):\n            # type: (*Any, **Any) -> None\n            self._inner = middleware(*args, **kwargs)\n            self._call_method = None\n\n        # We need correct behavior for `hasattr()`, which we can only determine\n        # when we have an instance of the middleware we're wrapping.\n        def __getattr__(self, method_name):\n            # type: (str) -> Any\n            if method_name not in (\n                \"process_request\",\n                \"process_view\",\n                \"process_template_response\",\n                \"process_response\",\n                \"process_exception\",\n            ):\n                raise AttributeError()\n\n            old_method = getattr(self._inner, method_name)\n            rv = _get_wrapped_method(old_method)\n            self.__dict__[method_name] = rv\n            return rv\n\n        def __call__(self, *args, **kwargs):\n            # type: (*Any, **Any) -> Any\n            f = self._call_method\n            if f is None:\n                self._call_method = f = _get_wrapped_method(self._inner.__call__)\n            return f(*args, **kwargs)\n\n    if hasattr(middleware, \"__name__\"):\n        SentryWrappingMiddleware.__name__ = middleware.__name__\n\n    return SentryWrappingMiddleware\n", "path": "sentry_sdk/integrations/django/middleware.py"}], "after_files": [{"content": "\"\"\"\nCreate spans from Django middleware invocations\n\"\"\"\n\nfrom django import VERSION as DJANGO_VERSION\n\nfrom sentry_sdk import Hub\nfrom sentry_sdk._functools import wraps\nfrom sentry_sdk._types import MYPY\nfrom sentry_sdk.utils import (\n    ContextVar,\n    transaction_from_function,\n    capture_internal_exceptions,\n)\n\nif MYPY:\n    from typing import Any\n    from typing import Callable\n    from typing import TypeVar\n\n    F = TypeVar(\"F\", bound=Callable[..., Any])\n\n_import_string_should_wrap_middleware = ContextVar(\n    \"import_string_should_wrap_middleware\"\n)\n\nif DJANGO_VERSION < (1, 7):\n    import_string_name = \"import_by_path\"\nelse:\n    import_string_name = \"import_string\"\n\n\ndef patch_django_middlewares():\n    # type: () -> None\n    from django.core.handlers import base\n\n    old_import_string = getattr(base, import_string_name)\n\n    def sentry_patched_import_string(dotted_path):\n        # type: (str) -> Any\n        rv = old_import_string(dotted_path)\n\n        if _import_string_should_wrap_middleware.get(None):\n            rv = _wrap_middleware(rv, dotted_path)\n\n        return rv\n\n    setattr(base, import_string_name, sentry_patched_import_string)\n\n    old_load_middleware = base.BaseHandler.load_middleware\n\n    def sentry_patched_load_middleware(*args, **kwargs):\n        # type: (Any, Any) -> Any\n        _import_string_should_wrap_middleware.set(True)\n        try:\n            return old_load_middleware(*args, **kwargs)\n        finally:\n            _import_string_should_wrap_middleware.set(False)\n\n    base.BaseHandler.load_middleware = sentry_patched_load_middleware\n\n\ndef _wrap_middleware(middleware, middleware_name):\n    # type: (Any, str) -> Any\n    from sentry_sdk.integrations.django import DjangoIntegration\n\n    def _get_wrapped_method(old_method):\n        # type: (F) -> F\n        with capture_internal_exceptions():\n\n            def sentry_wrapped_method(*args, **kwargs):\n                # type: (*Any, **Any) -> Any\n                hub = Hub.current\n                integration = hub.get_integration(DjangoIntegration)\n                if integration is None or not integration.middleware_spans:\n                    return old_method(*args, **kwargs)\n\n                function_name = transaction_from_function(old_method)\n\n                description = middleware_name\n                function_basename = getattr(old_method, \"__name__\", None)\n                if function_basename:\n                    description = \"{}.{}\".format(description, function_basename)\n\n                with hub.start_span(\n                    op=\"django.middleware\", description=description\n                ) as span:\n                    span.set_tag(\"django.function_name\", function_name)\n                    span.set_tag(\"django.middleware_name\", middleware_name)\n                    return old_method(*args, **kwargs)\n\n            try:\n                # fails for __call__ of function on Python 2 (see py2.7-django-1.11)\n                sentry_wrapped_method = wraps(old_method)(sentry_wrapped_method)\n\n                # Necessary for Django 3.1\n                sentry_wrapped_method.__self__ = old_method.__self__  # type: ignore\n            except Exception:\n                pass\n\n            return sentry_wrapped_method  # type: ignore\n\n        return old_method\n\n    class SentryWrappingMiddleware(object):\n        def __init__(self, *args, **kwargs):\n            # type: (*Any, **Any) -> None\n            self._inner = middleware(*args, **kwargs)\n            self._call_method = None\n\n        # We need correct behavior for `hasattr()`, which we can only determine\n        # when we have an instance of the middleware we're wrapping.\n        def __getattr__(self, method_name):\n            # type: (str) -> Any\n            if method_name not in (\n                \"process_request\",\n                \"process_view\",\n                \"process_template_response\",\n                \"process_response\",\n                \"process_exception\",\n            ):\n                raise AttributeError()\n\n            old_method = getattr(self._inner, method_name)\n            rv = _get_wrapped_method(old_method)\n            self.__dict__[method_name] = rv\n            return rv\n\n        def __call__(self, *args, **kwargs):\n            # type: (*Any, **Any) -> Any\n            f = self._call_method\n            if f is None:\n                self._call_method = f = _get_wrapped_method(self._inner.__call__)\n            return f(*args, **kwargs)\n\n    if hasattr(middleware, \"__name__\"):\n        SentryWrappingMiddleware.__name__ = middleware.__name__\n\n    return SentryWrappingMiddleware\n", "path": "sentry_sdk/integrations/django/middleware.py"}]}