diff options
Diffstat (limited to 'django/core/handlers/exception.py')
| -rw-r--r-- | django/core/handlers/exception.py | 29 |
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): |
