summaryrefslogtreecommitdiff
path: root/django/core/handlers/exception.py
diff options
context:
space:
mode:
Diffstat (limited to 'django/core/handlers/exception.py')
-rw-r--r--django/core/handlers/exception.py29
1 files changed, 21 insertions, 8 deletions
diff --git a/django/core/handlers/exception.py b/django/core/handlers/exception.py
index 66443ce560..50880f2784 100644
--- a/django/core/handlers/exception.py
+++ b/django/core/handlers/exception.py
@@ -1,7 +1,10 @@
+import asyncio
import logging
import sys
from functools import wraps
+from asgiref.sync import sync_to_async
+
from django.conf import settings
from django.core import signals
from django.core.exceptions import (
@@ -28,14 +31,24 @@ def convert_exception_to_response(get_response):
no middleware leaks an exception and that the next middleware in the stack
can rely on getting a response instead of an exception.
"""
- @wraps(get_response)
- def inner(request):
- try:
- response = get_response(request)
- except Exception as exc:
- response = response_for_exception(request, exc)
- return response
- return inner
+ if asyncio.iscoroutinefunction(get_response):
+ @wraps(get_response)
+ async def inner(request):
+ try:
+ response = await get_response(request)
+ except Exception as exc:
+ response = await sync_to_async(response_for_exception)(request, exc)
+ return response
+ return inner
+ else:
+ @wraps(get_response)
+ def inner(request):
+ try:
+ response = get_response(request)
+ except Exception as exc:
+ response = response_for_exception(request, exc)
+ return response
+ return inner
def response_for_exception(request, exc):