]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
📝 Use `WSGIMiddleware` from `a2wsgi` instead of deprecated `fastapi.middleware.wsgi...
authorMotov Yurii <109919500+YuriiMotov@users.noreply.github.com>
Wed, 4 Feb 2026 11:54:23 +0000 (14:54 +0300)
committerGitHub <noreply@github.com>
Wed, 4 Feb 2026 11:54:23 +0000 (12:54 +0100)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
docs/en/docs/advanced/wsgi.md
docs/en/docs/reference/middleware.md
docs_src/wsgi/tutorial001_py39.py
fastapi/middleware/wsgi.py
pyproject.toml
uv.lock

index 07147df0a8c6bec91c65e68f4dc0b90aa55417ab..aa68617cf423e92fd3de7b6aac2e494655d978d5 100644 (file)
@@ -6,13 +6,29 @@ For that, you can use the `WSGIMiddleware` and use it to wrap your WSGI applicat
 
 ## Using `WSGIMiddleware` { #using-wsgimiddleware }
 
-You need to import `WSGIMiddleware`.
+/// info
+
+This requires installing `a2wsgi` for example with `pip install a2wsgi`.
+
+///
+
+You need to import `WSGIMiddleware` from `a2wsgi`.
 
 Then wrap the WSGI (e.g. Flask) app with the middleware.
 
 And then mount that under a path.
 
-{* ../../docs_src/wsgi/tutorial001_py39.py hl[2:3,3] *}
+{* ../../docs_src/wsgi/tutorial001_py39.py hl[1,3,23] *}
+
+/// note
+
+Previously, it was recommended to use `WSGIMiddleware` from `fastapi.middleware.wsgi`, but it is now deprecated.
+
+It’s advised to use the `a2wsgi` package instead. The usage remains the same.
+
+Just ensure that you have the `a2wsgi` package installed and import `WSGIMiddleware` correctly from `a2wsgi`.
+
+///
 
 ## Check it { #check-it }
 
index 3c666ccdaaae3f9c8ce1bd9717ee53709b3853dd..48ff85158dd0f5ab7bc2747fa5f5dcdb884353bd 100644 (file)
@@ -35,11 +35,3 @@ It can be imported from `fastapi`:
 ```python
 from fastapi.middleware.trustedhost import TrustedHostMiddleware
 ```
-
-::: fastapi.middleware.wsgi.WSGIMiddleware
-
-It can be imported from `fastapi`:
-
-```python
-from fastapi.middleware.wsgi import WSGIMiddleware
-```
index 7f27a85a19ae7d3f82df2fa80fe58a7aba6714ce..8eeceb829e4aca48997284256e87fd9e19b17355 100644 (file)
@@ -1,5 +1,5 @@
+from a2wsgi import WSGIMiddleware
 from fastapi import FastAPI
-from fastapi.middleware.wsgi import WSGIMiddleware
 from flask import Flask, request
 from markupsafe import escape
 
index c4c6a797d2675e1c13b028be977c64a822fb649b..69e4dcab96370cac0ab93039a1eb9376d1659120 100644 (file)
@@ -1 +1,3 @@
-from starlette.middleware.wsgi import WSGIMiddleware as WSGIMiddleware  # noqa
+from starlette.middleware.wsgi import (
+    WSGIMiddleware as WSGIMiddleware,
+)  # pragma: no cover # noqa
index dea61c6a1063c6c009d70fb08e2e69ea5a902482..0f6bf1e4ac1b4f81dca16352115641bd4ace0ddd 100644 (file)
@@ -178,6 +178,7 @@ tests = [
     "strawberry-graphql>=0.200.0,<1.0.0",
     "types-orjson==3.6.2",
     "types-ujson==5.10.0.20240515",
+    "a2wsgi>=1.9.0,<=2.0.0",
 ]
 translations = [
     "gitpython==3.1.46",
@@ -231,7 +232,6 @@ xfail_strict = true
 junit_family = "xunit2"
 filterwarnings = [
     "error",
-    'ignore:starlette.middleware.wsgi is deprecated and will be removed in a future release\..*:DeprecationWarning:starlette',
     # see https://trio.readthedocs.io/en/stable/history.html#trio-0-22-0-2022-09-28
     "ignore:You seem to already have a custom.*:RuntimeWarning:trio",
     # TODO: remove after upgrading SQLAlchemy to a version that includes the following changes
diff --git a/uv.lock b/uv.lock
index 2df0b256b8b8630f8453471cc0f5e7ce15ee64c6..931a27021baba858013ac992f185716097f46a99 100644 (file)
--- a/uv.lock
+++ b/uv.lock
@@ -7,6 +7,18 @@ resolution-markers = [
     "python_full_version < '3.10'",
 ]
 
+[[package]]
+name = "a2wsgi"
+version = "1.10.10"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+    { name = "typing-extensions", marker = "python_full_version < '3.11'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/9a/cb/822c56fbea97e9eee201a2e434a80437f6750ebcb1ed307ee3a0a7505b14/a2wsgi-1.10.10.tar.gz", hash = "sha256:a5bcffb52081ba39df0d5e9a884fc6f819d92e3a42389343ba77cbf809fe1f45", size = 18799, upload-time = "2025-06-18T09:00:10.843Z" }
+wheels = [
+    { url = "https://files.pythonhosted.org/packages/02/d5/349aba3dc421e73cbd4958c0ce0a4f1aa3a738bc0d7de75d2f40ed43a535/a2wsgi-1.10.10-py3-none-any.whl", hash = "sha256:d2b21379479718539dc15fce53b876251a0efe7615352dfe49f6ad1bc507848d", size = 17389, upload-time = "2025-06-18T09:00:09.676Z" },
+]
+
 [[package]]
 name = "ag-ui-protocol"
 version = "0.1.10"
@@ -1058,6 +1070,7 @@ standard-no-fastapi-cloud-cli = [
 
 [package.dev-dependencies]
 dev = [
+    { name = "a2wsgi" },
     { name = "anyio", extra = ["trio"] },
     { name = "black" },
     { name = "cairosvg" },
@@ -1131,6 +1144,7 @@ github-actions = [
     { name = "smokeshow" },
 ]
 tests = [
+    { name = "a2wsgi" },
     { name = "anyio", extra = ["trio"] },
     { name = "coverage", version = "7.10.7", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version < '3.10'" },
     { name = "coverage", version = "7.13.1", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version >= '3.10'" },
@@ -1197,6 +1211,7 @@ provides-extras = ["standard", "standard-no-fastapi-cloud-cli", "all"]
 
 [package.metadata.requires-dev]
 dev = [
+    { name = "a2wsgi", specifier = ">=1.9.0,<=2.0.0" },
     { name = "anyio", extras = ["trio"], specifier = ">=3.2.1,<5.0.0" },
     { name = "black", specifier = "==25.1.0" },
     { name = "cairosvg", specifier = "==2.8.2" },
@@ -1266,6 +1281,7 @@ github-actions = [
     { name = "smokeshow", specifier = ">=0.5.0" },
 ]
 tests = [
+    { name = "a2wsgi", specifier = ">=1.9.0,<=2.0.0" },
     { name = "anyio", extras = ["trio"], specifier = ">=3.2.1,<5.0.0" },
     { name = "coverage", extras = ["toml"], specifier = ">=6.5.0,<8.0" },
     { name = "dirty-equals", specifier = "==0.9.0" },