#34174: async process_exception being called as sync from async view/middleware
-------------------------------------+-------------------------------------
               Reporter:  Gabriel    |          Owner:  nobody
  Rado                               |
                   Type:             |         Status:  new
  Cleanup/optimization               |
              Component:             |        Version:  4.1
  Documentation                      |       Keywords:  middleware async
               Severity:  Normal     |  process_exception
           Triage Stage:             |      Has patch:  0
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 following this bold part of the
 docs[https://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
 
here[https://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?

-- 
Ticket URL: <https://code.djangoproject.com/ticket/34174>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/010701849a90f7e4-e68d4713-a0b0-4631-8d23-9cb4a19a8fa4-000000%40eu-central-1.amazonses.com.

Reply via email to