Opened 22 months ago

Last modified 22 months ago

#34174 closed Cleanup/optimization

async process_exception being called as sync from async view/middleware — at Initial Version

Reported by: Gabriel Rado Owned by: nobody
Component: Documentation Version: 4.1
Severity: Normal Keywords: middleware async process_exception
Cc: Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

following this bold part of the docshttps://docs.djangoproject.com/en/4.1/topics/http/middleware/#asynchronous-support:

process_view, process_template_response and process_exception methods, if they are provided, should also be adapted to match the sync/async mode. However, Django will individually adapt them as required if you do not, at an additional performance penalty.

I' using this middleware to parse errors from sync and async views:

@sync_and_async_middleware
def custom_error(get_response):
    if asyncio.iscoroutinefunction(get_response):

        async def middleware(request):
            response = await get_response(request)
            return response

        async def _process_exception(request, exception):
            return my_custom_process_exception(exception)

    else:

        def middleware(request):
            response = get_response(request)
            return response

        def _process_exception(request, exception):
            return my_custom_process_exception(exception)

    middleware.process_exception = _process_exception
    return middleware

and I'm getting "ValueError: The view my_view.view_func didn't return an HttpResponse object. It returned an unawaited coroutine instead. You may need to add an 'await' into your view." from herehttps://github.com/django/django/blob/main/django/core/handlers/base.py#L257

i thought that with an async middleware + async view, all my hooks (process_view, process_template_response and process_exception) should be also async, but it appears that is mandatory to use sync process_exception with async capable middlewares. if this is intended, could the official docs be changed to expose this mandatory behavior?

Change History (0)

Note: See TracTickets for help on using tickets.
Back to Top