Opened 2 years ago
Last modified 2 years 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?