]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
🐛 Fix Query\Header\Cookie parameter model alias (#14360)
authorMotov Yurii <109919500+YuriiMotov@users.noreply.github.com>
Tue, 2 Dec 2025 07:24:09 +0000 (08:24 +0100)
committerGitHub <noreply@github.com>
Tue, 2 Dec 2025 07:24:09 +0000 (07:24 +0000)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
fastapi/dependencies/utils.py
tests/test_request_param_model_by_alias.py [new file with mode: 0644]

index 20cb2c88c83f876a8e0efb23d7fba6ca9b590289..ef3f56417a3f3152826283e7a11a19b2c22d9991 100644 (file)
@@ -787,9 +787,8 @@ def request_params_to_args(
                 )
         value = _get_multidict_value(field, received_params, alias=alias)
         if value is not None:
-            params_to_process[field.name] = value
+            params_to_process[field.alias] = value
         processed_keys.add(alias or field.alias)
-        processed_keys.add(field.name)
 
     for key in received_params.keys():
         if key not in processed_keys:
diff --git a/tests/test_request_param_model_by_alias.py b/tests/test_request_param_model_by_alias.py
new file mode 100644 (file)
index 0000000..a6f759f
--- /dev/null
@@ -0,0 +1,76 @@
+from dirty_equals import IsPartialDict
+from fastapi import Cookie, FastAPI, Header, Query
+from fastapi._compat import PYDANTIC_V2
+from fastapi.testclient import TestClient
+from pydantic import BaseModel, Field
+
+app = FastAPI()
+
+
+class Model(BaseModel):
+    param: str = Field(alias="param_alias")
+
+
+@app.get("/query")
+async def query_model(data: Model = Query()):
+    return {"param": data.param}
+
+
+@app.get("/header")
+async def header_model(data: Model = Header()):
+    return {"param": data.param}
+
+
+@app.get("/cookie")
+async def cookie_model(data: Model = Cookie()):
+    return {"param": data.param}
+
+
+def test_query_model_with_alias():
+    client = TestClient(app)
+    response = client.get("/query", params={"param_alias": "value"})
+    assert response.status_code == 200, response.text
+    assert response.json() == {"param": "value"}
+
+
+def test_header_model_with_alias():
+    client = TestClient(app)
+    response = client.get("/header", headers={"param_alias": "value"})
+    assert response.status_code == 200, response.text
+    assert response.json() == {"param": "value"}
+
+
+def test_cookie_model_with_alias():
+    client = TestClient(app)
+    client.cookies.set("param_alias", "value")
+    response = client.get("/cookie")
+    assert response.status_code == 200, response.text
+    assert response.json() == {"param": "value"}
+
+
+def test_query_model_with_alias_by_name():
+    client = TestClient(app)
+    response = client.get("/query", params={"param": "value"})
+    assert response.status_code == 422, response.text
+    details = response.json()
+    if PYDANTIC_V2:
+        assert details["detail"][0]["input"] == {"param": "value"}
+
+
+def test_header_model_with_alias_by_name():
+    client = TestClient(app)
+    response = client.get("/header", headers={"param": "value"})
+    assert response.status_code == 422, response.text
+    details = response.json()
+    if PYDANTIC_V2:
+        assert details["detail"][0]["input"] == IsPartialDict({"param": "value"})
+
+
+def test_cookie_model_with_alias_by_name():
+    client = TestClient(app)
+    client.cookies.set("param", "value")
+    response = client.get("/cookie")
+    assert response.status_code == 422, response.text
+    details = response.json()
+    if PYDANTIC_V2:
+        assert details["detail"][0]["input"] == {"param": "value"}