* Create a file `main.py` with:
```Python
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
If your code uses `async` / `await`, use `async def`:
```Python hl_lines="9 14"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-async def read_item(item_id: int, q: Optional[str] = None):
+async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
Declare the body using standard Python types, thanks to Pydantic.
```Python hl_lines="4 9-12 25-27"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
- is_offer: Optional[bool] = None
+ is_offer: Union[bool, None] = None
@app.get("/")
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
* Create a file `main.py` with:
```Python
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
If your code uses `async` / `await`, use `async def`:
```Python hl_lines="9 14"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-async def read_item(item_id: int, q: Optional[str] = None):
+async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
Declare the body using standard Python types, thanks to Pydantic.
```Python hl_lines="4 9-12 25-27"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
- is_offer: Optional[bool] = None
+ is_offer: Union[bool, None] = None
@app.get("/")
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
To achieve that, import `JSONResponse`, and return your content there directly, setting the `status_code` that you want:
-```Python hl_lines="4 23"
+```Python hl_lines="4 25"
{!../../../docs_src/additional_status_codes/tutorial001.py!}
```
And then **FastAPI** will call that override instead of the original dependency.
-```Python hl_lines="26-27 30"
+```Python hl_lines="28-29 32"
{!../../../docs_src/dependency_testing/tutorial001.py!}
```
* Create a `main.py` file with:
```Python
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
* Create a file `main.py` with:
```Python
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
If your code uses `async` / `await`, use `async def`:
```Python hl_lines="9 14"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-async def read_item(item_id: int, q: Optional[str] = None):
+async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
Declare the body using standard Python types, thanks to Pydantic.
```Python hl_lines="4 9-12 25-27"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
- is_offer: Optional[bool] = None
+ is_offer: Union[bool, None] = None
@app.get("/")
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
{!> ../../../docs_src/python_types/tutorial009_py310.py!}
```
+#### Using `Union` or `Optional`
+
+If you are using a Python version below 3.10, here's a tip from my very **subjective** point of view:
+
+* 🚨 Avoid using `Optional[SomeType]`
+* Instead ✨ **use `Union[SomeType, None]`** ✨.
+
+Both are equivalent and underneath they are the same, but I would recommend `Union` instead of `Optional` because the word "**optional**" would seem to imply that the value is optional, and it actually means "it can be `None`", even if it's not optional and is still required.
+
+I think `Union[str, SomeType]` is more explicit about what it means.
+
+It's just about the words and names. But those words can affect how you and your teammates think about the code.
+
+As an example, let's take this function:
+
+```Python hl_lines="1 4"
+{!../../../docs_src/python_types/tutorial009c.py!}
+```
+
+The parameter `name` is defined as `Optional[str]`, but it is **not optional**, you cannot call the function without the parameter:
+
+```Python
+say_hi() # Oh, no, this throws an error! 😱
+```
+
+The `name` parameter is **still required** (not *optional*) because it doesn't have a default value. Still, `name` accepts `None` as the value:
+
+```Python
+say_hi(name=None) # This works, None is valid 🎉
+```
+
+The good news is, once you are on Python 3.10 you won't have to worry about that, as you will be able to simply use `|` to define unions of types:
+
+```Python hl_lines="1 4"
+{!../../../docs_src/python_types/tutorial009c_py310.py!}
+```
+
+And then you won't have to worry about names like `Optional` and `Union`. 😎
+
#### Generic types
These types that take type parameters in square brackets are called **Generic types** or **Generics**, for example:
You will see a lot more of all this in practice in the [Tutorial - User Guide](tutorial/index.md){.internal-link target=_blank}.
+!!! tip
+ Pydantic has a special behavior when you use `Optional` or `Union[Something, None]` without a default value, you can read more about it in the Pydantic docs about <a href="https://pydantic-docs.helpmanual.io/usage/models/#required-optional-fields" class="external-link" target="_blank">Required Optional fields</a>.
+
## Type hints in **FastAPI**
**FastAPI** takes advantage of these type hints to do several things.
=== "Python 3.6 and above"
- ```Python hl_lines="23"
+ ```Python hl_lines="22"
{!> ../../../docs_src/body_multiple_params/tutorial003.py!}
```
=== "Python 3.10 and above"
- ```Python hl_lines="21"
+ ```Python hl_lines="20"
{!> ../../../docs_src/body_multiple_params/tutorial003_py310.py!}
```
As, by default, singular values are interpreted as query parameters, you don't have to explicitly add a `Query`, you can just do:
```Python
-q: Optional[str] = None
+q: Union[str, None] = None
```
Or in Python 3.10 and above:
=== "Python 3.6 and above"
- ```Python hl_lines="28"
+ ```Python hl_lines="27"
{!> ../../../docs_src/body_multiple_params/tutorial004.py!}
```
!!! info
`Body` also has all the same extra validation and metadata parameters as `Query`,`Path` and others you will see later.
-
## Embed a single body parameter
Let's say you only have a single `item` body parameter from a Pydantic model `Item`.
But if you want it to expect a JSON with a key `item` and inside of it the model contents, as it does when you declare extra body parameters, you can use the special `Body` parameter `embed`:
```Python
-item: Item = Body(..., embed=True)
+item: Item = Body(embed=True)
```
as in:
!!! note
FastAPI will know that the value of `q` is not required because of the default value `= None`.
- The `Optional` in `Optional[str]` is not used by FastAPI, but will allow your editor to give you better support and detect errors.
+ The `Union` in `Union[str, None]` is not used by FastAPI, but will allow your editor to give you better support and detect errors.
## Without Pydantic
=== "Python 3.6 and above"
- ```Python hl_lines="8"
+ ```Python hl_lines="9"
{!> ../../../docs_src/dependencies/tutorial001.py!}
```
=== "Python 3.6 and above"
- ```Python hl_lines="8-9"
+ ```Python hl_lines="8-11"
{!> ../../../docs_src/dependencies/tutorial001.py!}
```
=== "Python 3.6 and above"
- ```Python hl_lines="13 18"
+ ```Python hl_lines="15 20"
{!> ../../../docs_src/dependencies/tutorial001.py!}
```
=== "Python 3.6 and above"
- ```Python hl_lines="21"
+ ```Python hl_lines="22"
{!> ../../../docs_src/dependencies/tutorial005.py!}
```
So, you can declare your function as:
-```Python hl_lines="8"
+```Python hl_lines="7"
{!../../../docs_src/path_params_numeric_validations/tutorial002.py!}
```
Python won't do anything with that `*`, but it will know that all the following parameters should be called as keyword arguments (key-value pairs), also known as <abbr title="From: K-ey W-ord Arg-uments"><code>kwargs</code></abbr>. Even if they don't have a default value.
-```Python hl_lines="8"
+```Python hl_lines="7"
{!../../../docs_src/path_params_numeric_validations/tutorial003.py!}
```
{!> ../../../docs_src/response_model/tutorial004_py310.py!}
```
-* `description: Optional[str] = None` has a default of `None`.
+* `description: Union[str, None] = None` has a default of `None`.
* `tax: float = 10.5` has a default of `10.5`.
* `tags: List[str] = []` as a default of an empty list: `[]`.
=== "Python 3.6 and above"
- ```Python hl_lines="21-26"
+ ```Python hl_lines="20-25"
{!> ../../../docs_src/schema_extra_example/tutorial003.py!}
```
=== "Python 3.10 and above"
- ```Python hl_lines="19-24"
+ ```Python hl_lines="18-23"
{!> ../../../docs_src/schema_extra_example/tutorial003_py310.py!}
```
=== "Python 3.6 and above"
- ```Python hl_lines="22-48"
+ ```Python hl_lines="21-47"
{!> ../../../docs_src/schema_extra_example/tutorial004.py!}
```
=== "Python 3.10 and above"
- ```Python hl_lines="20-46"
+ ```Python hl_lines="19-45"
{!> ../../../docs_src/schema_extra_example/tutorial004_py310.py!}
```
Para conseguir esto importa `JSONResponse` y devuelve ahí directamente tu contenido, asignando el `status_code` que quieras:
-```Python hl_lines="2 19"
+```Python hl_lines="4 25"
{!../../../docs_src/additional_status_codes/tutorial001.py!}
```
```Python
from fastapi import FastAPI
-from typing import Optional
+from typing import Union
app = FastAPI()
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
```Python hl_lines="7 12"
from fastapi import FastAPI
-from typing import Optional
+from typing import Union
app = FastAPI()
@app.get("/items/{item_id}")
-async def read_item(item_id: int, q: Optional[str] = None):
+async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
```Python hl_lines="2 7-10 23-25"
from fastapi import FastAPI
from pydantic import BaseModel
-from typing import Optional
+from typing import Union
app = FastAPI()
class Item(BaseModel):
name: str
price: float
- is_offer: Optional[bool] = None
+ is_offer: Union[bool, None] = None
@app.get("/")
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
!!! note "Nota"
FastAPI sabrá que `q` es opcional por el `= None`.
- El `Optional` en `Optional[str]` no es usado por FastAPI (FastAPI solo usará la parte `str`), pero el `Optional[str]` le permitirá a tu editor ayudarte a encontrar errores en tu código.
+ El `Union` en `Union[str, None]` no es usado por FastAPI (FastAPI solo usará la parte `str`), pero el `Union[str, None]` le permitirá a tu editor ayudarte a encontrar errores en tu código.
## Conversión de tipos de parámetros de query
* Create a file `main.py` with:
```Python
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
If your code uses `async` / `await`, use `async def`:
```Python hl_lines="9 14"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-async def read_item(item_id: int, q: Optional[str] = None):
+async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
Declare the body using standard Python types, thanks to Pydantic.
```Python hl_lines="4 9-12 25-27"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
- is_offer: Optional[bool] = None
+ is_offer: Union[bool, None] = None
@app.get("/")
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
* Create a file `main.py` with:
```Python
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
If your code uses `async` / `await`, use `async def`:
```Python hl_lines="9 14"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-async def read_item(item_id: int, q: Optional[str] = None):
+async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
Declare the body using standard Python types, thanks to Pydantic.
```Python hl_lines="4 9 10 11 12 25 26 27"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
- is_offer: Optional[bool] = None
+ is_offer: Union[bool, None] = None
@app.get("/")
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
これを達成するには、 `JSONResponse` をインポートし、 `status_code` を設定して直接内容を返します。
-```Python hl_lines="4 23"
+```Python hl_lines="4 25"
{!../../../docs_src/additional_status_codes/tutorial001.py!}
```
{!../../../docs_src/query_params_str_validations/tutorial002.py!}
```
-デフォルト値`None`を`Query(None)`に置き換える必要があるので、`Query`の最初の引数はデフォルト値を定義するのと同じです。
+デフォルト値`None`を`Query(default=None)`に置き換える必要があるので、`Query`の最初の引数はデフォルト値を定義するのと同じです。
なので:
```Python
-q: Optional[str] = Query(None)
+q: Optional[str] = Query(default=None)
```
...を以下と同じようにパラメータをオプションにします:
もしくは:
```Python
- = Query(None)
+ = Query(default=None)
```
そして、 `None` を利用することでクエリパラメータが必須ではないと検知します。
そして、さらに多くのパラメータを`Query`に渡すことができます。この場合、文字列に適用される、`max_length`パラメータを指定します。
```Python
-q: str = Query(None, max_length=50)
+q: Union[str, None] = Query(default=None, max_length=50)
```
これにより、データを検証し、データが有効でない場合は明確なエラーを表示し、OpenAPIスキーマの *path operation* にパラメータを記載します。
パラメータ`min_length`も追加することができます:
-```Python hl_lines="9"
+```Python hl_lines="10"
{!../../../docs_src/query_params_str_validations/tutorial003.py!}
```
パラメータが一致するべき<abbr title="正規表現とは、文字列の検索パターンを定義する文字列です。">正規表現</abbr>を定義することができます:
-```Python hl_lines="10"
+```Python hl_lines="11"
{!../../../docs_src/query_params_str_validations/tutorial004.py!}
```
以下の代わりに:
```Python
-q: Optional[str] = None
+q: Union[str, None] = None
```
現在は以下の例のように`Query`で宣言しています:
```Python
-q: Optional[str] = Query(None, min_length=3)
+q: Union[str, None] = Query(default=None, min_length=3)
```
そのため、`Query`を使用して必須の値を宣言する必要がある場合は、第一引数に`...`を使用することができます:
* `main.py` 파일을 만드십시오:
```Python
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
여러분의 코드가 `async` / `await`을 사용한다면, `async def`를 사용하십시오.
```Python hl_lines="9 14"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-async def read_item(item_id: int, q: Optional[str] = None):
+async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
Pydantic을 이용해 파이썬 표준 타입으로 본문을 선언합니다.
```Python hl_lines="4 9 10 11 12 25 26 27"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
- is_offer: Optional[bool] = None
+ is_offer: Union[bool, None] = None
@app.get("/")
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
따라서 함수를 다음과 같이 선언 할 수 있습니다:
-```Python hl_lines="8"
+```Python hl_lines="7"
{!../../../docs_src/path_params_numeric_validations/tutorial002.py!}
```
파이썬은 `*`으로 아무런 행동도 하지 않지만, 따르는 매개변수들은 <abbr title="유래: K-ey W-ord Arg-uments"><code>kwargs</code></abbr>로도 알려진 키워드 인자(키-값 쌍)여야 함을 인지합니다. 기본값을 가지고 있지 않더라도 그렇습니다.
-```Python hl_lines="8"
+```Python hl_lines="7"
{!../../../docs_src/path_params_numeric_validations/tutorial003.py!}
```
!!! note "참고"
FastAPI는 `q`가 `= None`이므로 선택적이라는 것을 인지합니다.
- `Optional[str]`에 있는 `Optional`은 FastAPI(FastAPI는 `str` 부분만 사용합니다)가 사용하는게 아니지만, `Optional[str]`은 편집기에게 코드에서 오류를 찾아낼 수 있게 도와줍니다.
+ `Union[str, None]`에 있는 `Union`은 FastAPI(FastAPI는 `str` 부분만 사용합니다)가 사용하는게 아니지만, `Union[str, None]`은 편집기에게 코드에서 오류를 찾아낼 수 있게 도와줍니다.
## 쿼리 매개변수 형변환
* Create a file `main.py` with:
```Python
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
If your code uses `async` / `await`, use `async def`:
```Python hl_lines="9 14"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-async def read_item(item_id: int, q: Optional[str] = None):
+async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
Declare the body using standard Python types, thanks to Pydantic.
```Python hl_lines="4 9-12 25-27"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
- is_offer: Optional[bool] = None
+ is_offer: Union[bool, None] = None
@app.get("/")
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
* Utwórz plik o nazwie `main.py` z:
```Python
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
Jeżeli twój kod korzysta z `async` / `await`, użyj `async def`:
```Python hl_lines="9 14"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-async def read_item(item_id: int, q: Optional[str] = None):
+async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
Zadeklaruj treść żądania, używając standardowych typów w Pythonie dzięki Pydantic.
```Python hl_lines="4 9-12 25-27"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
- is_offer: Optional[bool] = None
+ is_offer: Union[bool, None] = None
@app.get("/")
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
* Crie um arquivo `main.py` com:
```Python
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
Se seu código utiliza `async` / `await`, use `async def`:
```Python hl_lines="9 14"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-async def read_item(item_id: int, q: Optional[str] = None):
+async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
Declare o corpo utilizando tipos padrão Python, graças ao Pydantic.
```Python hl_lines="4 9-12 25-27"
+from typing import Union
+
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
- is_offer: Optional[bool] = None
+ is_offer: Union[bool] = None
@app.get("/")
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
!!! note "Observação"
O FastAPI saberá que o valor de `q` não é obrigatório por causa do valor padrão `= None`.
- O `Optional` em `Optional[str]` não é utilizado pelo FastAPI, mas permite ao seu editor de texto lhe dar um suporte melhor e detectar erros.
+ O `Union` em `Union[str, None]` não é utilizado pelo FastAPI, mas permite ao seu editor de texto lhe dar um suporte melhor e detectar erros.
## Sem o Pydantic
{!../../../docs_src/query_params_str_validations/tutorial001.py!}
```
-O parâmetro de consulta `q` é do tipo `Optional[str]`, o que significa que é do tipo `str` mas que também pode ser `None`, e de fato, o valor padrão é `None`, então o FastAPI saberá que não é obrigatório.
+O parâmetro de consulta `q` é do tipo `Union[str, None]`, o que significa que é do tipo `str` mas que também pode ser `None`, e de fato, o valor padrão é `None`, então o FastAPI saberá que não é obrigatório.
!!! note "Observação"
O FastAPI saberá que o valor de `q` não é obrigatório por causa do valor padrão `= None`.
- O `Optional` em `Optional[str]` não é usado pelo FastAPI, mas permitirá que seu editor lhe dê um melhor suporte e detecte erros.
+ O `Union` em `Union[str, None]` não é usado pelo FastAPI, mas permitirá que seu editor lhe dê um melhor suporte e detecte erros.
## Validação adicional
{!../../../docs_src/query_params_str_validations/tutorial002.py!}
```
-Note que substituímos o valor padrão de `None` para `Query(None)`, o primeiro parâmetro de `Query` serve para o mesmo propósito: definir o valor padrão do parâmetro.
+Note que substituímos o valor padrão de `None` para `Query(default=None)`, o primeiro parâmetro de `Query` serve para o mesmo propósito: definir o valor padrão do parâmetro.
Então:
```Python
-q: Optional[str] = Query(None)
+q: Union[str, None] = Query(default=None)
```
...Torna o parâmetro opcional, da mesma maneira que:
```Python
-q: Optional[str] = None
+q: Union[str, None] = None
```
Mas o declara explicitamente como um parâmetro de consulta.
Ou com:
```Python
- = Query(None)
+ = Query(default=None)
```
E irá utilizar o `None` para detectar que o parâmetro de consulta não é obrigatório.
- O `Optional` é apenas para permitir que seu editor de texto lhe dê um melhor suporte.
+ O `Union` é apenas para permitir que seu editor de texto lhe dê um melhor suporte.
Então, podemos passar mais parâmetros para `Query`. Neste caso, o parâmetro `max_length` que se aplica a textos:
```Python
-q: str = Query(None, max_length=50)
+q: str = Query(default=None, max_length=50)
```
Isso irá validar os dados, mostrar um erro claro quando os dados forem inválidos, e documentar o parâmetro na *operação de rota* do esquema OpenAPI..
Você também pode incluir um parâmetro `min_length`:
-```Python hl_lines="9"
+```Python hl_lines="10"
{!../../../docs_src/query_params_str_validations/tutorial003.py!}
```
Você pode definir uma <abbr title="Uma expressão regular, regex ou regexp é uma sequência de caracteres que define um parâmetro de busca para textos.">expressão regular</abbr> que combine com um padrão esperado pelo parâmetro:
-```Python hl_lines="10"
+```Python hl_lines="11"
{!../../../docs_src/query_params_str_validations/tutorial004.py!}
```
em vez desta:
```Python
-q: Optional[str] = None
+q: Union[str, None] = None
```
Mas agora nós o estamos declarando como `Query`, conforme abaixo:
```Python
-q: Optional[str] = Query(None, min_length=3)
+q: Union[str, None] = Query(default=None, min_length=3)
```
Então, quando você precisa declarar um parâmetro obrigatório utilizando o `Query`, você pode utilizar `...` como o primeiro argumento:
* Create a file `main.py` with:
```Python
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
If your code uses `async` / `await`, use `async def`:
```Python hl_lines="9 14"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-async def read_item(item_id: int, q: Optional[str] = None):
+async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
Declare the body using standard Python types, thanks to Pydantic.
```Python hl_lines="4 9-12 25-27"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
- is_offer: Optional[bool] = None
+ is_offer: Union[bool, None] = None
@app.get("/")
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
* Create a file `main.py` with:
```Python
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
If your code uses `async` / `await`, use `async def`:
```Python hl_lines="9 14"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-async def read_item(item_id: int, q: Optional[str] = None):
+async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
Declare the body using standard Python types, thanks to Pydantic.
```Python hl_lines="4 9-12 25-27"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
- is_offer: Optional[bool] = None
+ is_offer: Union[bool, None] = None
@app.get("/")
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
* `main.py` adında bir dosya oluştur :
```Python
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
Eğer kodunda `async` / `await` var ise, `async def` kullan:
```Python hl_lines="9 14"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-async def read_item(item_id: int, q: Optional[str] = None):
+async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
Şimdi Pydantic sayesinde, Python'un standart tiplerini kullanarak bir body tanımlayacağız.
```Python hl_lines="4 9 10 11 12 25 26 27"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
- is_offer: Optional[bool] = None
+ is_offer: Union[bool, None] = None
@app.get("/")
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
* Create a file `main.py` with:
```Python
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
If your code uses `async` / `await`, use `async def`:
```Python hl_lines="9 14"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-async def read_item(item_id: int, q: Optional[str] = None):
+async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
Declare the body using standard Python types, thanks to Pydantic.
```Python hl_lines="4 9-12 25-27"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
- is_offer: Optional[bool] = None
+ is_offer: Union[bool, None] = None
@app.get("/")
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
要实现它,导入 `JSONResponse`,然后在其中直接返回你的内容,并将 `status_code` 设置为为你要的值。
-```Python hl_lines="2 19"
+```Python hl_lines="4 25"
{!../../../docs_src/additional_status_codes/tutorial001.py!}
```
* 创建一个 `main.py` 文件并写入以下内容:
```Python
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
如果你的代码里会出现 `async` / `await`,请使用 `async def`:
```Python hl_lines="9 14"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-async def read_item(item_id: int, q: Optional[str] = None):
+async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
我们借助 Pydantic 来使用标准的 Python 类型声明请求体。
```Python hl_lines="4 9-12 25-27"
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
- is_offer: Optional[bool] = None
+ is_offer: Union[bool, None] = None
@app.get("/")
@app.get("/items/{item_id}")
-def read_item(item_id: int, q: Optional[str] = None):
+def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
但是你可以使用 `Body` 指示 **FastAPI** 将其作为请求体的另一个键进行处理。
-```Python hl_lines="21"
+```Python hl_lines="22"
{!../../../docs_src/body_multiple_params/tutorial003.py!}
```
但是,如果你希望它期望一个拥有 `item` 键并在值中包含模型内容的 JSON,就像在声明额外的请求体参数时所做的那样,则可以使用一个特殊的 `Body` 参数 `embed`:
```Python
-item: Item = Body(..., embed=True)
+item: Item = Body(embed=True)
```
比如:
依赖项就是一个函数,且可以使用与*路径操作函数*相同的参数:
-```Python hl_lines="8-9"
+```Python hl_lines="8-11"
{!../../../docs_src/dependencies/tutorial001.py!}
```
与在*路径操作函数*参数中使用 `Body`、`Query` 的方式相同,声明依赖项需要使用 `Depends` 和一个新的参数:
-```Python hl_lines="13 18"
+```Python hl_lines="15 20"
{!../../../docs_src/dependencies/tutorial001.py!}
```
接下来,就可以使用依赖项:
-```Python hl_lines="21"
+```Python hl_lines="22"
{!../../../docs_src/dependencies/tutorial005.py!}
```
因此,你可以将函数声明为:
-```Python hl_lines="8"
+```Python hl_lines="7"
{!../../../docs_src/path_params_numeric_validations/tutorial002.py!}
```
Python 不会对该 `*` 做任何事情,但是它将知道之后的所有参数都应作为关键字参数(键值对),也被称为 <abbr title="来自:K-ey W-ord Arg-uments"><code>kwargs</code></abbr>,来调用。即使它们没有默认值。
-```Python hl_lines="8"
+```Python hl_lines="7"
{!../../../docs_src/path_params_numeric_validations/tutorial003.py!}
```
{!../../../docs_src/query_params_str_validations/tutorial002.py!}
```
-由于我们必须用 `Query(None)` 替换默认值 `None`,`Query` 的第一个参数同样也是用于定义默认值。
+由于我们必须用 `Query(default=None)` 替换默认值 `None`,`Query` 的第一个参数同样也是用于定义默认值。
所以:
```Python
-q: str = Query(None)
+q: Union[str, None] = Query(default=None)
```
...使得参数可选,等同于:
然后,我们可以将更多的参数传递给 `Query`。在本例中,适用于字符串的 `max_length` 参数:
```Python
-q: str = Query(None, max_length=50)
+q: Union[str, None] = Query(default=None, max_length=50)
```
将会校验数据,在数据无效时展示清晰的错误信息,并在 OpenAPI 模式的*路径操作*中记录该参数。
你还可以添加 `min_length` 参数:
-```Python hl_lines="9"
+```Python hl_lines="10"
{!../../../docs_src/query_params_str_validations/tutorial003.py!}
```
你可以定义一个参数值必须匹配的<abbr title="正则表达式或正则是定义字符串搜索模式的字符序列。">正则表达式</abbr>:
-```Python hl_lines="10"
+```Python hl_lines="11"
{!../../../docs_src/query_params_str_validations/tutorial004.py!}
```
但是现在我们正在用 `Query` 声明它,例如:
```Python
-q: str = Query(None, min_length=3)
+q: Union[str, None] = Query(default=None, min_length=3)
```
因此,当你在使用 `Query` 且需要声明一个值是必需的时,可以将 `...` 用作第一个参数值:
{!../../../docs_src/response_model/tutorial004.py!}
```
-* `description: Optional[str] = None` 具有默认值 `None`。
+* `description: Union[str, None] = None` 具有默认值 `None`。
* `tax: float = 10.5` 具有默认值 `10.5`.
* `tags: List[str] = []` 具有一个空列表作为默认值: `[]`.
比如,你可以将请求体的一个 `example` 传递给 `Body`:
-```Python hl_lines="21-26"
+```Python hl_lines="20-25"
{!../../../docs_src/schema_extra_example/tutorial003.py!}
```
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from fastapi.responses import FileResponse
}
},
)
-async def read_item(item_id: str, img: Optional[bool] = None):
+async def read_item(item_id: str, img: Union[bool, None] = None):
if img:
return FileResponse("image.png", media_type="image/png")
else:
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from fastapi.responses import FileResponse
response_model=Item,
responses={**responses, 200: {"content": {"image/png": {}}}},
)
-async def read_item(item_id: str, img: Optional[bool] = None):
+async def read_item(item_id: str, img: Union[bool, None] = None):
if img:
return FileResponse("image.png", media_type="image/png")
else:
-from typing import Optional
+from typing import Union
from fastapi import BackgroundTasks, Depends, FastAPI
log.write(message)
-def get_query(background_tasks: BackgroundTasks, q: Optional[str] = None):
+def get_query(background_tasks: BackgroundTasks, q: Union[str, None] = None):
if q:
message = f"found query: {q}\n"
background_tasks.add_task(write_log, message)
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
app = FastAPI()
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
app = FastAPI()
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
app = FastAPI()
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
app = FastAPI()
@app.put("/items/{item_id}")
-async def create_item(item_id: int, item: Item, q: Optional[str] = None):
+async def create_item(item_id: int, item: Item, q: Union[str, None] = None):
result = {"item_id": item_id, **item.dict()}
if q:
result.update({"q": q})
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
class User(BaseModel):
username: str
- full_name: Optional[str] = None
+ full_name: Union[str, None] = None
@app.put("/items/{item_id}")
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: list = []
-from typing import List, Optional
+from typing import List, Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: List[str] = []
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: list[str] = []
-from typing import Optional, Set
+from typing import Set, Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: Set[str] = set()
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: set[str] = set()
-from typing import Optional, Set
+from typing import Set, Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: Set[str] = set()
- image: Optional[Image] = None
+ image: Union[Image, None] = None
@app.put("/items/{item_id}")
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: set[str] = set()
- image: Optional[Image] = None
+ image: Union[Image, None] = None
@app.put("/items/{item_id}")
-from typing import Optional, Set
+from typing import Set, Union
from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: Set[str] = set()
- image: Optional[Image] = None
+ image: Union[Image, None] = None
@app.put("/items/{item_id}")
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: set[str] = set()
- image: Optional[Image] = None
+ image: Union[Image, None] = None
@app.put("/items/{item_id}")
-from typing import List, Optional, Set
+from typing import List, Set, Union
from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: Set[str] = set()
- images: Optional[List[Image]] = None
+ images: Union[List[Image], None] = None
@app.put("/items/{item_id}")
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: set[str] = set()
- images: Optional[list[Image]] = None
+ images: Union[list[Image], None] = None
@app.put("/items/{item_id}")
-from typing import List, Optional, Set
+from typing import List, Set, Union
from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: Set[str] = set()
- images: Optional[List[Image]] = None
+ images: Union[List[Image], None] = None
class Offer(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
items: List[Item]
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: set[str] = set()
- images: Optional[list[Image]] = None
+ images: Union[list[Image], None] = None
class Offer(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
items: list[Item]
-from typing import List, Optional
+from typing import List, Union
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
class Item(BaseModel):
- name: Optional[str] = None
- description: Optional[str] = None
- price: Optional[float] = None
+ name: Union[str, None] = None
+ description: Union[str, None] = None
+ price: Union[float, None] = None
tax: float = 10.5
tags: List[str] = []
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
class Item(BaseModel):
- name: Optional[str] = None
- description: Optional[str] = None
- price: Optional[float] = None
+ name: Union[str, None] = None
+ description: Union[str, None] = None
+ price: Union[float, None] = None
tax: float = 10.5
tags: list[str] = []
-from typing import List, Optional
+from typing import List, Union
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
class Item(BaseModel):
- name: Optional[str] = None
- description: Optional[str] = None
- price: Optional[float] = None
+ name: Union[str, None] = None
+ description: Union[str, None] = None
+ price: Union[float, None] = None
tax: float = 10.5
tags: List[str] = []
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
class Item(BaseModel):
- name: Optional[str] = None
- description: Optional[str] = None
- price: Optional[float] = None
+ name: Union[str, None] = None
+ description: Union[str, None] = None
+ price: Union[float, None] = None
tax: float = 10.5
tags: list[str] = []
from dataclasses import dataclass
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
class Item:
name: str
price: float
- description: Optional[str] = None
- tax: Optional[float] = None
+ description: Union[str, None] = None
+ tax: Union[float, None] = None
app = FastAPI()
from dataclasses import dataclass, field
-from typing import List, Optional
+from typing import List, Union
from fastapi import FastAPI
name: str
price: float
tags: List[str] = field(default_factory=list)
- description: Optional[str] = None
- tax: Optional[float] = None
+ description: Union[str, None] = None
+ tax: Union[float, None] = None
app = FastAPI()
from dataclasses import field # (1)
-from typing import List, Optional
+from typing import List, Union
from fastapi import FastAPI
from pydantic.dataclasses import dataclass # (2)
@dataclass
class Item:
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
@dataclass
-from typing import Optional
+from typing import Union
from fastapi import Depends, FastAPI
app = FastAPI()
-async def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 100):
+async def common_parameters(
+ q: Union[str, None] = None, skip: int = 0, limit: int = 100
+):
return {"q": q, "skip": skip, "limit": limit}
-from typing import Optional
+from typing import Union
from fastapi import Depends, FastAPI
class CommonQueryParams:
- def __init__(self, q: Optional[str] = None, skip: int = 0, limit: int = 100):
+ def __init__(self, q: Union[str, None] = None, skip: int = 0, limit: int = 100):
self.q = q
self.skip = skip
self.limit = limit
-from typing import Optional
+from typing import Union
from fastapi import Depends, FastAPI
class CommonQueryParams:
- def __init__(self, q: Optional[str] = None, skip: int = 0, limit: int = 100):
+ def __init__(self, q: Union[str, None] = None, skip: int = 0, limit: int = 100):
self.q = q
self.skip = skip
self.limit = limit
-from typing import Optional
+from typing import Union
from fastapi import Depends, FastAPI
class CommonQueryParams:
- def __init__(self, q: Optional[str] = None, skip: int = 0, limit: int = 100):
+ def __init__(self, q: Union[str, None] = None, skip: int = 0, limit: int = 100):
self.q = q
self.skip = skip
self.limit = limit
-from typing import Optional
+from typing import Union
from fastapi import Cookie, Depends, FastAPI
app = FastAPI()
-def query_extractor(q: Optional[str] = None):
+def query_extractor(q: Union[str, None] = None):
return q
def query_or_cookie_extractor(
- q: str = Depends(query_extractor), last_query: Optional[str] = Cookie(default=None)
+ q: str = Depends(query_extractor),
+ last_query: Union[str, None] = Cookie(default=None),
):
if not q:
return last_query
-from typing import Optional
+from typing import Union
from fastapi import Depends, FastAPI
from fastapi.testclient import TestClient
app = FastAPI()
-async def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 100):
+async def common_parameters(
+ q: Union[str, None] = None, skip: int = 0, limit: int = 100
+):
return {"q": q, "skip": skip, "limit": limit}
client = TestClient(app)
-async def override_dependency(q: Optional[str] = None):
+async def override_dependency(q: Union[str, None] = None):
return {"q": q, "skip": 5, "limit": 10}
from datetime import datetime
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
class Item(BaseModel):
title: str
timestamp: datetime
- description: Optional[str] = None
+ description: Union[str, None] = None
app = FastAPI()
from datetime import datetime, time, timedelta
-from typing import Optional
+from typing import Union
from uuid import UUID
from fastapi import Body, FastAPI
@app.put("/items/{item_id}")
async def read_items(
item_id: UUID,
- start_datetime: Optional[datetime] = Body(default=None),
- end_datetime: Optional[datetime] = Body(default=None),
- repeat_at: Optional[time] = Body(default=None),
- process_after: Optional[timedelta] = Body(default=None),
+ start_datetime: Union[datetime, None] = Body(default=None),
+ end_datetime: Union[datetime, None] = Body(default=None),
+ repeat_at: Union[time, None] = Body(default=None),
+ process_after: Union[timedelta, None] = Body(default=None),
):
start_process = start_datetime + process_after
duration = end_datetime - start_process
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
username: str
password: str
email: EmailStr
- full_name: Optional[str] = None
+ full_name: Union[str, None] = None
class UserOut(BaseModel):
username: str
email: EmailStr
- full_name: Optional[str] = None
+ full_name: Union[str, None] = None
class UserInDB(BaseModel):
username: str
hashed_password: str
email: EmailStr
- full_name: Optional[str] = None
+ full_name: Union[str, None] = None
def fake_password_hasher(raw_password: str):
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
class UserBase(BaseModel):
username: str
email: EmailStr
- full_name: Optional[str] = None
+ full_name: Union[str, None] = None
class UserIn(UserBase):
-from typing import Optional
+from typing import Union
from fastapi import FastAPI, Header
@app.get("/items/")
-async def read_items(user_agent: Optional[str] = Header(default=None)):
+async def read_items(user_agent: Union[str, None] = Header(default=None)):
return {"User-Agent": user_agent}
-from typing import Optional
+from typing import Union
from fastapi import FastAPI, Header
@app.get("/items/")
async def read_items(
- strange_header: Optional[str] = Header(default=None, convert_underscores=False)
+ strange_header: Union[str, None] = Header(default=None, convert_underscores=False)
):
return {"strange_header": strange_header}
-from typing import List, Optional
+from typing import List, Union
from fastapi import FastAPI, Header
@app.get("/items/")
-async def read_items(x_token: Optional[List[str]] = Header(default=None)):
+async def read_items(x_token: Union[List[str], None] = Header(default=None)):
return {"X-Token values": x_token}
-from typing import Optional
+from typing import Union
from fastapi import FastAPI, Header
@app.get("/items/")
-async def read_items(x_token: Optional[list[str]] = Header(default=None)):
+async def read_items(x_token: Union[list[str], None] = Header(default=None)):
return {"X-Token values": x_token}
-from typing import Optional
+from typing import Union
from couchbase import LOCKMODE_WAIT
from couchbase.bucket import Bucket
class User(BaseModel):
username: str
- email: Optional[str] = None
- full_name: Optional[str] = None
- disabled: Optional[bool] = None
+ email: Union[str, None] = None
+ full_name: Union[str, None] = None
+ disabled: Union[bool, None] = None
class UserInDB(User):
-from typing import Optional
+from typing import Union
from fastapi import APIRouter, FastAPI
from pydantic import BaseModel, HttpUrl
class Invoice(BaseModel):
id: str
- title: Optional[str] = None
+ title: Union[str, None] = None
customer: str
total: float
@app.post("/invoices/", callbacks=invoices_callback_router.routes)
-def create_invoice(invoice: Invoice, callback_url: Optional[HttpUrl] = None):
+def create_invoice(invoice: Invoice, callback_url: Union[HttpUrl, None] = None):
"""
Create an invoice.
-from typing import Optional, Set
+from typing import Set, Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: Set[str] = set()
-from typing import Optional, Set
+from typing import Set, Union
from fastapi import FastAPI, status
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: Set[str] = set()
-from typing import Optional
+from typing import Union
from fastapi import FastAPI, status
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: set[str] = set()
-from typing import Optional, Set
+from typing import Set, Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: Set[str] = set()
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: set[str] = set()
-from typing import Optional, Set
+from typing import Set, Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: Set[str] = set()
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: set[str] = set()
-from typing import Optional, Set
+from typing import Set, Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: Set[str] = set()
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: set[str] = set()
-from typing import Optional, Set
+from typing import Set, Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: Set[str] = set()
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: set[str] = set()
--- /dev/null
+from typing import Optional
+
+
+def say_hi(name: Optional[str]):
+ print(f"Hey {name}!")
--- /dev/null
+def say_hi(name: str | None):
+ print(f"Hey {name}!")
from datetime import datetime
-from typing import List, Optional
+from typing import List, Union
from pydantic import BaseModel
class User(BaseModel):
id: int
name = "John Doe"
- signup_ts: Optional[datetime] = None
+ signup_ts: Union[datetime, None] = None
friends: List[int] = []
from datetime import datetime
-from typing import Optional
+from typing import Union
from pydantic import BaseModel
class User(BaseModel):
id: int
name = "John Doe"
- signup_ts: Optional[datetime] = None
+ signup_ts: Union[datetime, None] = None
friends: list[int] = []
--- /dev/null
+from typing import Optional
+
+from pydantic import BaseModel
+
+
+class User(BaseModel):
+ name: str
+ age: Optional[int]
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-async def read_item(item_id: str, q: Optional[str] = None):
+async def read_item(item_id: str, q: Union[str, None] = None):
if q:
return {"item_id": item_id, "q": q}
return {"item_id": item_id}
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
-async def read_item(item_id: str, q: Optional[str] = None, short: bool = False):
+async def read_item(item_id: str, q: Union[str, None] = None, short: bool = False):
item = {"item_id": item_id}
if q:
item.update({"q": q})
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/users/{user_id}/items/{item_id}")
async def read_user_item(
- user_id: int, item_id: str, q: Optional[str] = None, short: bool = False
+ user_id: int, item_id: str, q: Union[str, None] = None, short: bool = False
):
item = {"item_id": item_id, "owner_id": user_id}
if q:
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/{item_id}")
async def read_user_item(
- item_id: str, needy: str, skip: int = 0, limit: Optional[int] = None
+ item_id: str, needy: str, skip: int = 0, limit: Union[int, None] = None
):
item = {"item_id": item_id, "needy": needy, "skip": skip, "limit": limit}
return item
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
@app.get("/items/")
-async def read_items(q: Optional[str] = None):
+async def read_items(q: Union[str, None] = None):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})
-from typing import Optional
+from typing import Union
from fastapi import FastAPI, File, UploadFile
@app.post("/files/")
-async def create_file(file: Optional[bytes] = File(default=None)):
+async def create_file(file: Union[bytes, None] = File(default=None)):
if not file:
return {"message": "No file sent"}
else:
@app.post("/uploadfile/")
-async def create_upload_file(file: Optional[UploadFile] = None):
+async def create_upload_file(file: Union[UploadFile, None] = None):
if not file:
return {"message": "No upload file sent"}
else:
from datetime import datetime
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
class Item(BaseModel):
title: str
timestamp: datetime
- description: Optional[str] = None
+ description: Union[str, None] = None
app = FastAPI()
-from typing import List, Optional
+from typing import List, Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: List[str] = []
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
tags: list[str] = []
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
username: str
password: str
email: EmailStr
- full_name: Optional[str] = None
+ full_name: Union[str, None] = None
# Don't do this in production!
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
username: str
password: str
email: EmailStr
- full_name: Optional[str] = None
+ full_name: Union[str, None] = None
class UserOut(BaseModel):
username: str
email: EmailStr
- full_name: Optional[str] = None
+ full_name: Union[str, None] = None
@app.post("/user/", response_model=UserOut)
-from typing import List, Optional
+from typing import List, Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
tax: float = 10.5
tags: List[str] = []
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
tax: float = 10.5
tags: list[str] = []
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
tax: float = 10.5
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
tax: float = 10.5
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
class Config:
schema_extra = {
-from typing import Optional
+from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel, Field
class Item(BaseModel):
name: str = Field(example="Foo")
- description: Optional[str] = Field(default=None, example="A very nice Item")
+ description: Union[str, None] = Field(default=None, example="A very nice Item")
price: float = Field(example=35.4)
- tax: Optional[float] = Field(default=None, example=3.2)
+ tax: Union[float, None] = Field(default=None, example=3.2)
@app.put("/items/{item_id}")
-from typing import Optional
+from typing import Union
from fastapi import Body, FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
@app.put("/items/{item_id}")
-from typing import Optional
+from typing import Union
from fastapi import Body, FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
- description: Optional[str] = None
+ description: Union[str, None] = None
price: float
- tax: Optional[float] = None
+ tax: Union[float, None] = None
@app.put("/items/{item_id}")
-from typing import Optional
+from typing import Union
from fastapi import Depends, FastAPI
from fastapi.security import OAuth2PasswordBearer
class User(BaseModel):
username: str
- email: Optional[str] = None
- full_name: Optional[str] = None
- disabled: Optional[bool] = None
+ email: Union[str, None] = None
+ full_name: Union[str, None] = None
+ disabled: Union[bool, None] = None
def fake_decode_token(token):
-from typing import Optional
+from typing import Union
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
class User(BaseModel):
username: str
- email: Optional[str] = None
- full_name: Optional[str] = None
- disabled: Optional[bool] = None
+ email: Union[str, None] = None
+ full_name: Union[str, None] = None
+ disabled: Union[bool, None] = None
class UserInDB(User):
from datetime import datetime, timedelta
-from typing import Optional
+from typing import Union
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
class TokenData(BaseModel):
- username: Optional[str] = None
+ username: Union[str, None] = None
class User(BaseModel):
username: str
- email: Optional[str] = None
- full_name: Optional[str] = None
- disabled: Optional[bool] = None
+ email: Union[str, None] = None
+ full_name: Union[str, None] = None
+ disabled: Union[bool, None] = None
class UserInDB(User):
return user
-def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
+def create_access_token(data: dict, expires_delta: Union[timedelta, None] = None):
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta
from datetime import datetime, timedelta
-from typing import List, Optional
+from typing import List, Union
from fastapi import Depends, FastAPI, HTTPException, Security, status
from fastapi.security import (
class TokenData(BaseModel):
- username: Optional[str] = None
+ username: Union[str, None] = None
scopes: List[str] = []
class User(BaseModel):
username: str
- email: Optional[str] = None
- full_name: Optional[str] = None
- disabled: Optional[bool] = None
+ email: Union[str, None] = None
+ full_name: Union[str, None] = None
+ disabled: Union[bool, None] = None
class UserInDB(User):
return user
-def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
+def create_access_token(data: dict, expires_delta: Union[timedelta, None] = None):
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta
from datetime import datetime, timedelta
-from typing import Optional
+from typing import Union
from fastapi import Depends, FastAPI, HTTPException, Security, status
from fastapi.security import (
class TokenData(BaseModel):
- username: Optional[str] = None
+ username: Union[str, None] = None
scopes: list[str] = []
class User(BaseModel):
username: str
- email: Optional[str] = None
- full_name: Optional[str] = None
- disabled: Optional[bool] = None
+ email: Union[str, None] = None
+ full_name: Union[str, None] = None
+ disabled: Union[bool, None] = None
class UserInDB(User):
return user
-def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
+def create_access_token(data: dict, expires_delta: Union[timedelta, None] = None):
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta
-from typing import List, Optional
+from typing import List, Union
from pydantic import BaseModel
class ItemBase(BaseModel):
title: str
- description: Optional[str] = None
+ description: Union[str, None] = None
class ItemCreate(ItemBase):
-from typing import Optional
+from typing import Union
from pydantic import BaseModel
class ItemBase(BaseModel):
title: str
- description: Optional[str] = None
+ description: Union[str, None] = None
class ItemCreate(ItemBase):
-from typing import Any, List, Optional
+from typing import Any, List, Union
import peewee
from pydantic import BaseModel
class ItemBase(BaseModel):
title: str
- description: Optional[str] = None
+ description: Union[str, None] = None
class ItemCreate(ItemBase):
-from typing import Optional
+from typing import Union
from fastapi import Cookie, Depends, FastAPI, Query, WebSocket, status
from fastapi.responses import HTMLResponse
async def get_cookie_or_token(
websocket: WebSocket,
- session: Optional[str] = Cookie(default=None),
- token: Optional[str] = Query(default=None),
+ session: Union[str, None] = Cookie(default=None),
+ token: Union[str, None] = Query(default=None),
):
if session is None and token is None:
await websocket.close(code=status.WS_1008_POLICY_VIOLATION)
async def websocket_endpoint(
websocket: WebSocket,
item_id: str,
- q: Optional[int] = None,
+ q: Union[int, None] = None,
cookie_or_token: str = Depends(get_cookie_or_token),
):
await websocket.accept()