Add support for not needing ... as default value in required Query(), Path(), Header(), etc. (#4906)

*  Do not require default value in Query(), Path(), Header(), etc

* 📝 Update source examples for docs with default and required values

*  Update tests with new default values and not required Ellipsis

* 📝 Update docs for Query params and update info about default value, required, Ellipsis
This commit is contained in:
Sebastián Ramírez
2022-05-13 18:38:22 -05:00
committed by GitHub
parent 31690dda2c
commit 9262fa8362
107 changed files with 404 additions and 314 deletions

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI, Query
@@ -6,7 +6,7 @@ app = FastAPI()
@app.get("/items/")
async def read_items(q: Optional[str] = Query(None, max_length=50)):
async def read_items(q: Union[str, None] = Query(default=None, max_length=50)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})

View File

@@ -4,7 +4,7 @@ app = FastAPI()
@app.get("/items/")
async def read_items(q: str | None = Query(None, max_length=50)):
async def read_items(q: str | None = Query(default=None, max_length=50)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI, Query
@@ -6,7 +6,9 @@ app = FastAPI()
@app.get("/items/")
async def read_items(q: Optional[str] = Query(None, min_length=3, max_length=50)):
async def read_items(
q: Union[str, None] = Query(default=None, min_length=3, max_length=50)
):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})

View File

@@ -4,7 +4,7 @@ app = FastAPI()
@app.get("/items/")
async def read_items(q: str | None = Query(None, min_length=3, max_length=50)):
async def read_items(q: str | None = Query(default=None, min_length=3, max_length=50)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI, Query
@@ -7,7 +7,9 @@ app = FastAPI()
@app.get("/items/")
async def read_items(
q: Optional[str] = Query(None, min_length=3, max_length=50, regex="^fixedquery$")
q: Union[str, None] = Query(
default=None, min_length=3, max_length=50, regex="^fixedquery$"
)
):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:

View File

@@ -5,7 +5,8 @@ app = FastAPI()
@app.get("/items/")
async def read_items(
q: str | None = Query(None, min_length=3, max_length=50, regex="^fixedquery$")
q: str
| None = Query(default=None, min_length=3, max_length=50, regex="^fixedquery$")
):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:

View File

@@ -4,7 +4,7 @@ app = FastAPI()
@app.get("/items/")
async def read_items(q: str = Query("fixedquery", min_length=3)):
async def read_items(q: str = Query(default="fixedquery", min_length=3)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})

View File

@@ -4,7 +4,7 @@ app = FastAPI()
@app.get("/items/")
async def read_items(q: str = Query(..., min_length=3)):
async def read_items(q: str = Query(min_length=3)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})

View File

@@ -0,0 +1,11 @@
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: str = Query(default=..., min_length=3)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results

View File

@@ -0,0 +1,13 @@
from typing import Union
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: Union[str, None] = Query(default=..., min_length=3)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results

View File

@@ -0,0 +1,11 @@
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/items/")
async def read_items(q: str | None = Query(default=..., min_length=3)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results

View File

@@ -0,0 +1,12 @@
from fastapi import FastAPI, Query
from pydantic import Required
app = FastAPI()
@app.get("/items/")
async def read_items(q: str = Query(default=Required, min_length=3)):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
return results

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI, Query
@@ -7,7 +7,7 @@ app = FastAPI()
@app.get("/items/")
async def read_items(
q: Optional[str] = Query(None, title="Query string", min_length=3)
q: Union[str, None] = Query(default=None, title="Query string", min_length=3)
):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:

View File

@@ -4,7 +4,9 @@ app = FastAPI()
@app.get("/items/")
async def read_items(q: str | None = Query(None, title="Query string", min_length=3)):
async def read_items(
q: str | None = Query(default=None, title="Query string", min_length=3)
):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI, Query
@@ -7,8 +7,8 @@ app = FastAPI()
@app.get("/items/")
async def read_items(
q: Optional[str] = Query(
None,
q: Union[str, None] = Query(
default=None,
title="Query string",
description="Query string for the items to search in the database that have a good match",
min_length=3,

View File

@@ -7,7 +7,7 @@ app = FastAPI()
async def read_items(
q: str
| None = Query(
None,
default=None,
title="Query string",
description="Query string for the items to search in the database that have a good match",
min_length=3,

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI, Query
@@ -6,7 +6,7 @@ app = FastAPI()
@app.get("/items/")
async def read_items(q: Optional[str] = Query(None, alias="item-query")):
async def read_items(q: Union[str, None] = Query(default=None, alias="item-query")):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})

View File

@@ -4,7 +4,7 @@ app = FastAPI()
@app.get("/items/")
async def read_items(q: str | None = Query(None, alias="item-query")):
async def read_items(q: str | None = Query(default=None, alias="item-query")):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI, Query
@@ -7,8 +7,8 @@ app = FastAPI()
@app.get("/items/")
async def read_items(
q: Optional[str] = Query(
None,
q: Union[str, None] = Query(
default=None,
alias="item-query",
title="Query string",
description="Query string for the items to search in the database that have a good match",

View File

@@ -7,7 +7,7 @@ app = FastAPI()
async def read_items(
q: str
| None = Query(
None,
default=None,
alias="item-query",
title="Query string",
description="Query string for the items to search in the database that have a good match",

View File

@@ -1,4 +1,4 @@
from typing import List, Optional
from typing import List, Union
from fastapi import FastAPI, Query
@@ -6,6 +6,6 @@ app = FastAPI()
@app.get("/items/")
async def read_items(q: Optional[List[str]] = Query(None)):
async def read_items(q: Union[List[str], None] = Query(default=None)):
query_items = {"q": q}
return query_items

View File

@@ -4,6 +4,6 @@ app = FastAPI()
@app.get("/items/")
async def read_items(q: list[str] | None = Query(None)):
async def read_items(q: list[str] | None = Query(default=None)):
query_items = {"q": q}
return query_items

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI, Query
@@ -6,6 +6,6 @@ app = FastAPI()
@app.get("/items/")
async def read_items(q: Optional[list[str]] = Query(None)):
async def read_items(q: Union[list[str], None] = Query(default=None)):
query_items = {"q": q}
return query_items

View File

@@ -6,6 +6,6 @@ app = FastAPI()
@app.get("/items/")
async def read_items(q: List[str] = Query(["foo", "bar"])):
async def read_items(q: List[str] = Query(default=["foo", "bar"])):
query_items = {"q": q}
return query_items

View File

@@ -4,6 +4,6 @@ app = FastAPI()
@app.get("/items/")
async def read_items(q: list[str] = Query(["foo", "bar"])):
async def read_items(q: list[str] = Query(default=["foo", "bar"])):
query_items = {"q": q}
return query_items

View File

@@ -4,6 +4,6 @@ app = FastAPI()
@app.get("/items/")
async def read_items(q: list = Query([])):
async def read_items(q: list = Query(default=[])):
query_items = {"q": q}
return query_items

View File

@@ -1,4 +1,4 @@
from typing import Optional
from typing import Union
from fastapi import FastAPI, Query
@@ -7,7 +7,7 @@ app = FastAPI()
@app.get("/items/")
async def read_items(
hidden_query: Optional[str] = Query(None, include_in_schema=False)
hidden_query: Union[str, None] = Query(default=None, include_in_schema=False)
):
if hidden_query:
return {"hidden_query": hidden_query}

View File

@@ -4,7 +4,9 @@ app = FastAPI()
@app.get("/items/")
async def read_items(hidden_query: str | None = Query(None, include_in_schema=False)):
async def read_items(
hidden_query: str | None = Query(default=None, include_in_schema=False)
):
if hidden_query:
return {"hidden_query": hidden_query}
else: