summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorCarlton Gibson <carlton.gibson@noumenal.es>2023-02-14 14:06:42 +0100
committerGitHub <noreply@github.com>2023-02-14 14:06:42 +0100
commitce8189eea007882bbe6db22f86b0965e718bd341 (patch)
tree6c2a21a9f832ab162e225b871b9dbfe74fca2e50 /docs
parentc5808470aaffda661cb911b06d5b848dd7b75467 (diff)
Fixed #34328 -- Added async-only class-based middleware example.
Diffstat (limited to 'docs')
-rw-r--r--docs/topics/http/middleware.txt19
1 files changed, 19 insertions, 0 deletions
diff --git a/docs/topics/http/middleware.txt b/docs/topics/http/middleware.txt
index f0db49abe5..9a20106618 100644
--- a/docs/topics/http/middleware.txt
+++ b/docs/topics/http/middleware.txt
@@ -371,6 +371,25 @@ Here's an example of how to create a middleware function that supports both::
Thus, even if you are wrapping an async view, you may be called in sync
mode if there is other, synchronous middleware between you and the view.
+When using an asynchronous class-based middleware, you must ensure that
+instances are correctly marked as coroutine functions::
+
+ from asgiref.sync import iscoroutinefunction, markcoroutinefunction
+
+ class AsyncMiddleware:
+ async_capable = True
+ sync_capable = False
+
+ def __init__(self, get_response):
+ self.get_response = get_response
+ if iscoroutinefunction(self.get_response):
+ markcoroutinefunction(self)
+
+ async def __call__(self, request):
+ response = await self.get_response(request)
+ # Some logic ...
+ return response
+
.. _upgrading-middleware:
Upgrading pre-Django 1.10-style middleware