#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.