Browse Source

📝 Use Optional in docs (#1644)

* Updated .py files with Optional tag (up to body_nested_models)

* Update optionals

* docs_src/ all updates, few I was unsure of

* Updated markdown files with Optional param

* es: Add Optional typing to index.md

* Last of markdown files updated with Optional param

* Update highlight lines

* it: Add Optional typings

* README.md: Update with Optional typings

* Update more highlight increments

* Update highlights

* schema-extra-example.md: Update highlights

* updating highlighting on website to reflect .py changes

* Update highlighting for query-params & response-directly

* Address PR comments

* Get rid of unnecessary comment

*  Revert Optional in Chinese docs as it probably also requires changes in text

* 🎨 Apply format

*  Revert modified example

* ♻️ Simplify example in docs

* 📝 Update OpenAPI callback example to use Optional

*  Add Optional types to tests

* 📝 Update docs about query params, default to using Optional

* 🎨 Update code examples line highlighting

* 📝 Update nested models docs to use "type parameters" instead of "subtypes"

* 📝 Add notes about FastAPI usage of None

including:

= None

and

= Query(None)

and clarify relationship with Optional[str]

* 📝 Add note about response_model_by_alias

* ♻️ Simplify query param list example

* 🔥 Remove test for removed example

*  Update test for updated example

Co-authored-by: Christopher Nguyen <[email protected]>
Co-authored-by: yk396 <[email protected]>
Co-authored-by: Kai Chen <[email protected]>
pull/1669/head
Sebastián Ramírez 5 years ago
committed by GitHub
parent
commit
1f01ce9615
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 18
      README.md
  2. 4
      docs/en/docs/advanced/additional-responses.md
  3. 2
      docs/en/docs/advanced/additional-status-codes.md
  4. 8
      docs/en/docs/advanced/openapi-callbacks.md
  5. 2
      docs/en/docs/advanced/response-directly.md
  6. 2
      docs/en/docs/advanced/testing-dependencies.md
  7. 2
      docs/en/docs/advanced/websockets.md
  8. 4
      docs/en/docs/deployment.md
  9. 18
      docs/en/docs/index.md
  10. 2
      docs/en/docs/tutorial/background-tasks.md
  11. 4
      docs/en/docs/tutorial/body-fields.md
  12. 12
      docs/en/docs/tutorial/body-multiple-params.md
  13. 18
      docs/en/docs/tutorial/body-nested-models.md
  14. 17
      docs/en/docs/tutorial/body.md
  15. 4
      docs/en/docs/tutorial/cookie-params.md
  16. 14
      docs/en/docs/tutorial/dependencies/classes-as-dependencies.md
  17. 6
      docs/en/docs/tutorial/dependencies/index.md
  18. 6
      docs/en/docs/tutorial/dependencies/sub-dependencies.md
  19. 2
      docs/en/docs/tutorial/encoder.md
  20. 4
      docs/en/docs/tutorial/extra-data-types.md
  21. 4
      docs/en/docs/tutorial/extra-models.md
  22. 2
      docs/en/docs/tutorial/handling-errors.md
  23. 6
      docs/en/docs/tutorial/header-params.md
  24. 4
      docs/en/docs/tutorial/path-params-numeric-validations.md
  25. 52
      docs/en/docs/tutorial/query-params-str-validations.md
  26. 46
      docs/en/docs/tutorial/query-params.md
  27. 20
      docs/en/docs/tutorial/response-model.md
  28. 6
      docs/en/docs/tutorial/schema-extra-example.md
  29. 8
      docs/en/docs/tutorial/security/oauth2-jwt.md
  30. 10
      docs/en/docs/tutorial/security/simple-oauth2.md
  31. 11
      docs/es/docs/index.md
  32. 11
      docs/it/docs/index.md
  33. 16
      docs/pt/docs/index.md
  34. 18
      docs/ru/docs/index.md
  35. 4
      docs/zh/docs/deployment.md
  36. 18
      docs/zh/docs/index.md
  37. 4
      docs_src/additional_responses/tutorial002.py
  38. 4
      docs_src/additional_responses/tutorial004.py
  39. 6
      docs_src/additional_status_codes/tutorial001.py
  40. 4
      docs_src/app_testing/main_b.py
  41. 4
      docs_src/background_tasks/tutorial002.py
  42. 6
      docs_src/body/tutorial001.py
  43. 6
      docs_src/body/tutorial002.py
  44. 6
      docs_src/body/tutorial003.py
  45. 8
      docs_src/body/tutorial004.py
  46. 8
      docs_src/body_fields/tutorial001.py
  47. 10
      docs_src/body_multiple_params/tutorial001.py
  48. 8
      docs_src/body_multiple_params/tutorial002.py
  49. 8
      docs_src/body_multiple_params/tutorial003.py
  50. 10
      docs_src/body_multiple_params/tutorial004.py
  51. 6
      docs_src/body_multiple_params/tutorial005.py
  52. 6
      docs_src/body_nested_models/tutorial001.py
  53. 6
      docs_src/body_nested_models/tutorial002.py
  54. 6
      docs_src/body_nested_models/tutorial003.py
  55. 8
      docs_src/body_nested_models/tutorial004.py
  56. 8
      docs_src/body_nested_models/tutorial005.py
  57. 8
      docs_src/body_nested_models/tutorial006.py
  58. 10
      docs_src/body_nested_models/tutorial007.py
  59. 8
      docs_src/body_updates/tutorial001.py
  60. 8
      docs_src/body_updates/tutorial002.py
  61. 4
      docs_src/cookie_params/tutorial001.py
  62. 4
      docs_src/dependencies/tutorial001.py
  63. 4
      docs_src/dependencies/tutorial002.py
  64. 4
      docs_src/dependencies/tutorial003.py
  65. 4
      docs_src/dependencies/tutorial004.py
  66. 6
      docs_src/dependencies/tutorial005.py
  67. 6
      docs_src/dependency_testing/tutorial001.py
  68. 3
      docs_src/encoder/tutorial001.py
  69. 9
      docs_src/extra_data_types/tutorial001.py
  70. 8
      docs_src/extra_models/tutorial001.py
  71. 4
      docs_src/extra_models/tutorial002.py
  72. 4
      docs_src/header_params/tutorial001.py
  73. 6
      docs_src/header_params/tutorial002.py
  74. 4
      docs_src/header_params/tutorial003.py
  75. 6
      docs_src/openapi_callbacks/tutorial001.py
  76. 6
      docs_src/path_operation_advanced_configuration/tutorial004.py
  77. 6
      docs_src/path_operation_configuration/tutorial001.py
  78. 6
      docs_src/path_operation_configuration/tutorial002.py
  79. 6
      docs_src/path_operation_configuration/tutorial003.py
  80. 6
      docs_src/path_operation_configuration/tutorial004.py
  81. 6
      docs_src/path_operation_configuration/tutorial005.py
  82. 4
      docs_src/path_params_numeric_validations/tutorial001.py
  83. 4
      docs_src/query_params/tutorial002.py
  84. 4
      docs_src/query_params/tutorial003.py
  85. 4
      docs_src/query_params/tutorial004.py
  86. 6
      docs_src/query_params/tutorial006.py
  87. 11
      docs_src/query_params/tutorial007.py
  88. 4
      docs_src/query_params_str_validations/tutorial001.py
  89. 4
      docs_src/query_params_str_validations/tutorial002.py
  90. 4
      docs_src/query_params_str_validations/tutorial003.py
  91. 4
      docs_src/query_params_str_validations/tutorial004.py
  92. 6
      docs_src/query_params_str_validations/tutorial007.py
  93. 4
      docs_src/query_params_str_validations/tutorial008.py
  94. 4
      docs_src/query_params_str_validations/tutorial009.py
  95. 4
      docs_src/query_params_str_validations/tutorial010.py
  96. 4
      docs_src/query_params_str_validations/tutorial011.py
  97. 2
      docs_src/query_params_str_validations/tutorial013.py
  98. 3
      docs_src/response_directly/tutorial001.py
  99. 6
      docs_src/response_model/tutorial001.py
  100. 4
      docs_src/response_model/tutorial002.py

18
README.md

@ -131,6 +131,8 @@ $ pip install uvicorn
* Create a file `main.py` with:
```Python
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@ -142,7 +144,7 @@ def read_root():
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
```
@ -151,7 +153,9 @@ def read_item(item_id: int, q: str = None):
If your code uses `async` / `await`, use `async def`:
```Python hl_lines="7 12"
```Python hl_lines="9 14"
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@ -163,7 +167,7 @@ async def read_root():
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
async def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
```
@ -241,7 +245,9 @@ Now modify the file `main.py` to receive a body from a `PUT` request.
Declare the body using standard Python types, thanks to Pydantic.
```Python hl_lines="2 7 8 9 10 23 24 25"
```Python hl_lines="4 9 10 11 12 25 26 27"
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
@ -251,7 +257,7 @@ app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
is_offer: Optional[bool] = None
@app.get("/")
@ -260,7 +266,7 @@ def read_root():
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}

4
docs/en/docs/advanced/additional-responses.md

@ -168,7 +168,7 @@ You can use this same `responses` parameter to add different media types for the
For example, you can add an additional media type of `image/png`, declaring that your *path operation* can return a JSON object (with media type `application/json`) or a PNG image:
```Python hl_lines="17 18 19 20 21 22 23 24 28"
```Python hl_lines="19 20 21 22 23 24 28"
{!../../../docs_src/additional_responses/tutorial002.py!}
```
@ -228,7 +228,7 @@ You can use that technique to re-use some predefined responses in your *path ope
For example:
```Python hl_lines="11 12 13 14 15 24"
```Python hl_lines="13 14 15 16 17 26"
{!../../../docs_src/additional_responses/tutorial004.py!}
```

2
docs/en/docs/advanced/additional-status-codes.md

@ -14,7 +14,7 @@ But you also want it to accept new items. And when the items didn't exist before
To achieve that, import `JSONResponse`, and return your content there directly, setting the `status_code` that you want:
```Python hl_lines="2 19"
```Python hl_lines="4 23"
{!../../../docs_src/additional_status_codes/tutorial001.py!}
```

8
docs/en/docs/advanced/openapi-callbacks.md

@ -31,7 +31,7 @@ It will have a *path operation* that will receive an `Invoice` body, and a query
This part is pretty normal, most of the code is probably already familiar to you:
```Python hl_lines="8 9 10 11 12 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53"
```Python hl_lines="10 11 12 13 14 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54"
{!../../../docs_src/openapi_callbacks/tutorial001.py!}
```
@ -92,7 +92,7 @@ Because of that, you need to declare what will be the `default_response_class`,
But as we are never calling `app.include_router(some_router)`, we need to set the `default_response_class` during creation of the `APIRouter`.
```Python hl_lines="3 24"
```Python hl_lines="5 26"
{!../../../docs_src/openapi_callbacks/tutorial001.py!}
```
@ -105,7 +105,7 @@ It should look just like a normal FastAPI *path operation*:
* It should probably have a declaration of the body it should receive, e.g. `body: InvoiceEvent`.
* And it could also have a declaration of the response it should return, e.g. `response_model=InvoiceEventReceived`.
```Python hl_lines="15 16 17 20 21 27 28 29 30 31"
```Python hl_lines="17 18 19 22 23 29 30 31 32 33"
{!../../../docs_src/openapi_callbacks/tutorial001.py!}
```
@ -172,7 +172,7 @@ At this point you have the *callback path operation(s)* needed (the one(s) that
Now use the parameter `callbacks` in *your API's path operation decorator* to pass the attribute `.routes` (that's actually just a `list` of routes/*path operations*) from that callback router:
```Python hl_lines="34"
```Python hl_lines="36"
{!../../../docs_src/openapi_callbacks/tutorial001.py!}
```

2
docs/en/docs/advanced/response-directly.md

@ -31,7 +31,7 @@ For example, you cannot put a Pydantic model in a `JSONResponse` without first c
For those cases, you can use the `jsonable_encoder` to convert your data before passing it to a response:
```Python hl_lines="4 6 20 21"
```Python hl_lines="6 7 21 22"
{!../../../docs_src/response_directly/tutorial001.py!}
```

2
docs/en/docs/advanced/testing-dependencies.md

@ -28,7 +28,7 @@ To override a dependency for testing, you put as a key the original dependency (
And then **FastAPI** will call that override instead of the original dependency.
```Python hl_lines="24 25 28"
```Python hl_lines="26 27 30"
{!../../../docs_src/dependency_testing/tutorial001.py!}
```

2
docs/en/docs/advanced/websockets.md

@ -98,7 +98,7 @@ In WebSocket endpoints you can import from `fastapi` and use:
They work the same way as for other FastAPI endpoints/*path operations*:
```Python hl_lines="56 57 58 59 60 61 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79"
```Python hl_lines="58 59 60 61 62 63 64 65 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83"
{!../../../docs_src/websockets/tutorial002.py!}
```

4
docs/en/docs/deployment.md

@ -161,6 +161,8 @@ CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
* Create a `main.py` file with:
```Python
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@ -172,7 +174,7 @@ def read_root():
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
```

18
docs/en/docs/index.md

@ -131,6 +131,8 @@ $ pip install uvicorn
* Create a file `main.py` with:
```Python
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@ -142,7 +144,7 @@ def read_root():
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
```
@ -151,7 +153,9 @@ def read_item(item_id: int, q: str = None):
If your code uses `async` / `await`, use `async def`:
```Python hl_lines="7 12"
```Python hl_lines="9 14"
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@ -163,7 +167,7 @@ async def read_root():
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
async def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
```
@ -241,7 +245,9 @@ Now modify the file `main.py` to receive a body from a `PUT` request.
Declare the body using standard Python types, thanks to Pydantic.
```Python hl_lines="2 7 8 9 10 23 24 25"
```Python hl_lines="4 9 10 11 12 25 26 27"
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
@ -251,7 +257,7 @@ app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
is_offer: Optional[bool] = None
@app.get("/")
@ -260,7 +266,7 @@ def read_root():
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}

2
docs/en/docs/tutorial/background-tasks.md

@ -57,7 +57,7 @@ Using `BackgroundTasks` also works with the dependency injection system, you can
**FastAPI** knows what to do in each case and how to re-use the same object, so that all the background tasks are merged together and are run in the background afterwards:
```Python hl_lines="11 14 20 23"
```Python hl_lines="13 15 22 25"
{!../../../docs_src/background_tasks/tutorial002.py!}
```

4
docs/en/docs/tutorial/body-fields.md

@ -6,7 +6,7 @@ The same way you can declare additional validation and metadata in *path operati
First, you have to import it:
```Python hl_lines="2"
```Python hl_lines="4"
{!../../../docs_src/body_fields/tutorial001.py!}
```
@ -17,7 +17,7 @@ First, you have to import it:
You can then use `Field` with model attributes:
```Python hl_lines="9 10"
```Python hl_lines="11 12 13 14"
{!../../../docs_src/body_fields/tutorial001.py!}
```

12
docs/en/docs/tutorial/body-multiple-params.md

@ -8,7 +8,7 @@ First, of course, you can mix `Path`, `Query` and request body parameter declara
And you can also declare body parameters as optional, by setting the default to `None`:
```Python hl_lines="17 18 19"
```Python hl_lines="19 20 21"
{!../../../docs_src/body_multiple_params/tutorial001.py!}
```
@ -30,7 +30,7 @@ In the previous example, the *path operations* would expect a JSON body with the
But you can also declare multiple body parameters, e.g. `item` and `user`:
```Python hl_lines="20"
```Python hl_lines="22"
{!../../../docs_src/body_multiple_params/tutorial002.py!}
```
@ -72,7 +72,7 @@ If you declare it as is, because it is a singular value, **FastAPI** will assume
But you can instruct **FastAPI** to treat it as another body key using `Body`:
```Python hl_lines="21"
```Python hl_lines="23"
{!../../../docs_src/body_multiple_params/tutorial003.py!}
```
@ -104,12 +104,12 @@ Of course, you can also declare additional query parameters whenever you need, a
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: str = None
q: Optional[str] = None
```
as in:
```Python hl_lines="25"
```Python hl_lines="27"
{!../../../docs_src/body_multiple_params/tutorial004.py!}
```
@ -131,7 +131,7 @@ item: Item = Body(..., embed=True)
as in:
```Python hl_lines="15"
```Python hl_lines="17"
{!../../../docs_src/body_multiple_params/tutorial005.py!}
```

18
docs/en/docs/tutorial/body-nested-models.md

@ -6,15 +6,15 @@ With **FastAPI**, you can define, validate, document, and use arbitrarily deeply
You can define an attribute to be a subtype. For example, a Python `list`:
```Python hl_lines="12"
```Python hl_lines="14"
{!../../../docs_src/body_nested_models/tutorial001.py!}
```
This will make `tags` be a list of items. Although it doesn't declare the type of each of the items.
## List fields with subtype
## List fields with type parameter
But Python has a specific way to declare lists with subtypes:
But Python has a specific way to declare lists with internal types, or "type parameters":
### Import typing's `List`
@ -24,12 +24,12 @@ First, import `List` from standard Python's `typing` module:
{!../../../docs_src/body_nested_models/tutorial002.py!}
```
### Declare a `List` with a subtype
### Declare a `List` with a type parameter
To declare types that have subtypes, like `list`, `dict`, `tuple`:
To declare types that have type parameters (internal types), like `list`, `dict`, `tuple`:
* Import them from the `typing` module
* Pass the subtype(s) as "type arguments" using square brackets: `[` and `]`
* Pass the internal type(s) as "type parameters" using square brackets: `[` and `]`
```Python
from typing import List
@ -39,7 +39,7 @@ my_list: List[str]
That's all standard Python syntax for type declarations.
Use that same standard syntax for model attributes with subtypes.
Use that same standard syntax for model attributes with internal types.
So, in our example, we can make `tags` be specifically a "list of strings":
@ -71,7 +71,7 @@ Each attribute of a Pydantic model has a type.
But that type can itself be another Pydantic model.
So, you can declare deeply nested JSON `object`s with specific attribute names, types and validations.
So, you can declare deeply nested JSON "objects" with specific attribute names, types and validations.
All that, arbitrarily nested.
@ -174,7 +174,7 @@ You can define arbitrarily deeply nested models:
```
!!! info
Notice how `Offer` as a list of `Item`s, which in turn have an optional list of `Image`s
Notice how `Offer` has a list of `Item`s, which in turn have an optional list of `Image`s
## Bodies of pure lists

17
docs/en/docs/tutorial/body.md

@ -17,7 +17,7 @@ To declare a **request** body, you use <a href="https://pydantic-docs.helpmanual
First, you need to import `BaseModel` from `pydantic`:
```Python hl_lines="2"
```Python hl_lines="4"
{!../../../docs_src/body/tutorial001.py!}
```
@ -27,7 +27,7 @@ Then you declare your data model as a class that inherits from `BaseModel`.
Use standard Python types for all the attributes:
```Python hl_lines="5 6 7 8 9"
```Python hl_lines="7 8 9 10 11"
{!../../../docs_src/body/tutorial001.py!}
```
@ -57,7 +57,7 @@ For example, this model above declares a JSON "`object`" (or Python `dict`) like
To add it to your *path operation*, declare it the same way you declared path and query parameters:
```Python hl_lines="16"
```Python hl_lines="18"
{!../../../docs_src/body/tutorial001.py!}
```
@ -123,7 +123,7 @@ But you would get the same editor support with <a href="https://www.jetbrains.co
Inside of the function, you can access all the attributes of the model object directly:
```Python hl_lines="19"
```Python hl_lines="21"
{!../../../docs_src/body/tutorial002.py!}
```
@ -133,7 +133,7 @@ You can declare path parameters and body requests at the same time.
**FastAPI** will recognize that the function parameters that match path parameters should be **taken from the path**, and that function parameters that are declared to be Pydantic models should be **taken from the request body**.
```Python hl_lines="15 16"
```Python hl_lines="17 18"
{!../../../docs_src/body/tutorial003.py!}
```
@ -143,7 +143,7 @@ You can also declare **body**, **path** and **query** parameters, all at the sam
**FastAPI** will recognize each of them and take the data from the correct place.
```Python hl_lines="16"
```Python hl_lines="18"
{!../../../docs_src/body/tutorial004.py!}
```
@ -153,6 +153,11 @@ The function parameters will be recognized as follows:
* If the parameter is of a **singular type** (like `int`, `float`, `str`, `bool`, etc) it will be interpreted as a **query** parameter.
* If the parameter is declared to be of the type of a **Pydantic model**, it will be interpreted as a request **body**.
!!! 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.
## Without Pydantic
If you don't want to use Pydantic models, you can also use **Body** parameters. See the docs for [Body - Multiple Parameters: Singular values in body](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank}.

4
docs/en/docs/tutorial/cookie-params.md

@ -6,7 +6,7 @@ You can define Cookie parameters the same way you define `Query` and `Path` para
First import `Cookie`:
```Python hl_lines="1"
```Python hl_lines="3"
{!../../../docs_src/cookie_params/tutorial001.py!}
```
@ -16,7 +16,7 @@ Then declare the cookie parameters using the same structure as with `Path` and `
The first value is the default value, you can pass all the extra validation or annotation parameters:
```Python hl_lines="7"
```Python hl_lines="9"
{!../../../docs_src/cookie_params/tutorial001.py!}
```

14
docs/en/docs/tutorial/dependencies/classes-as-dependencies.md

@ -6,7 +6,7 @@ Before diving deeper into the **Dependency Injection** system, let's upgrade the
In the previous example, we were returning a `dict` from our dependency ("dependable"):
```Python hl_lines="7"
```Python hl_lines="9"
{!../../../docs_src/dependencies/tutorial001.py!}
```
@ -71,19 +71,19 @@ That also applies to callables with no parameters at all. The same as it would b
Then, we can change the dependency "dependable" `common_parameters` from above to the class `CommonQueryParameters`:
```Python hl_lines="9 10 11 12 13"
```Python hl_lines="11 12 13 14 15"
{!../../../docs_src/dependencies/tutorial002.py!}
```
Pay attention to the `__init__` method used to create the instance of the class:
```Python hl_lines="10"
```Python hl_lines="12"
{!../../../docs_src/dependencies/tutorial002.py!}
```
...it has the same parameters as our previous `common_parameters`:
```Python hl_lines="6"
```Python hl_lines="8"
{!../../../docs_src/dependencies/tutorial001.py!}
```
@ -103,7 +103,7 @@ Now you can declare your dependency using this class.
And as when **FastAPI** calls that class the value that will be passed as `commons` to your function will be an "instance" of the class, you can declare that parameter `commons` to be of type of the class, `CommonQueryParams`.
```Python hl_lines="17"
```Python hl_lines="19"
{!../../../docs_src/dependencies/tutorial002.py!}
```
@ -143,7 +143,7 @@ commons = Depends(CommonQueryParams)
..as in:
```Python hl_lines="17"
```Python hl_lines="19"
{!../../../docs_src/dependencies/tutorial003.py!}
```
@ -179,7 +179,7 @@ So, you can declare the dependency as the type of the variable, and use `Depends
So, the same example would look like:
```Python hl_lines="17"
```Python hl_lines="19"
{!../../../docs_src/dependencies/tutorial004.py!}
```

6
docs/en/docs/tutorial/dependencies/index.md

@ -31,7 +31,7 @@ Let's first focus on the dependency.
It is just a function that can take all the same parameters that a *path operation function* can take:
```Python hl_lines="6 7"
```Python hl_lines="8 9"
{!../../../docs_src/dependencies/tutorial001.py!}
```
@ -55,7 +55,7 @@ And then it just returns a `dict` containing those values.
### Import `Depends`
```Python hl_lines="1"
```Python hl_lines="3"
{!../../../docs_src/dependencies/tutorial001.py!}
```
@ -63,7 +63,7 @@ And then it just returns a `dict` containing those values.
The same way you use `Body`, `Query`, etc. with your *path operation function* parameters, use `Depends` with a new parameter:
```Python hl_lines="11 16"
```Python hl_lines="13 18"
{!../../../docs_src/dependencies/tutorial001.py!}
```

6
docs/en/docs/tutorial/dependencies/sub-dependencies.md

@ -10,7 +10,7 @@ They can be as **deep** as you need them to be.
You could create a first dependency ("dependable") like:
```Python hl_lines="6 7"
```Python hl_lines="8 9"
{!../../../docs_src/dependencies/tutorial005.py!}
```
@ -22,7 +22,7 @@ This is quite simple (not very useful), but will help us focus on how the sub-de
Then you can create another dependency function (a "dependable") that at the same time declares a dependency of its own (so it is a "dependant" too):
```Python hl_lines="11"
```Python hl_lines="13"
{!../../../docs_src/dependencies/tutorial005.py!}
```
@ -37,7 +37,7 @@ Let's focus on the parameters declared:
Then we can use the dependency with:
```Python hl_lines="19"
```Python hl_lines="21"
{!../../../docs_src/dependencies/tutorial005.py!}
```

2
docs/en/docs/tutorial/encoder.md

@ -20,7 +20,7 @@ You can use `jsonable_encoder` for that.
It receives an object, like a Pydantic model, and returns a JSON compatible version:
```Python hl_lines="4 21"
```Python hl_lines="5 22"
{!../../../docs_src/encoder/tutorial001.py!}
```

4
docs/en/docs/tutorial/extra-data-types.md

@ -54,12 +54,12 @@ Here are some of the additional data types you can use:
Here's an example *path operation* with parameters using some of the above types.
```Python hl_lines="1 2 11 12 13 14 15"
```Python hl_lines="1 3 12 13 14 15 16"
{!../../../docs_src/extra_data_types/tutorial001.py!}
```
Note that the parameters inside the function have their natural data type, and you can, for example, perform normal date manipulations, like:
```Python hl_lines="17 18"
```Python hl_lines="18 19"
{!../../../docs_src/extra_data_types/tutorial001.py!}
```

4
docs/en/docs/tutorial/extra-models.md

@ -17,7 +17,7 @@ This is especially the case for user models, because:
Here's a general idea of how the models could look like with their password fields and the places where they are used:
```Python hl_lines="7 9 14 20 22 27 28 31 32 33 38 39"
```Python hl_lines="9 11 16 22 24 29 30 33 34 35 40 41"
{!../../../docs_src/extra_models/tutorial001.py!}
```
@ -150,7 +150,7 @@ All the data conversion, validation, documentation, etc. will still work as norm
That way, we can declare just the differences between the models (with plaintext `password`, with `hashed_password` and without password):
```Python hl_lines="7 13 14 17 18 21 22"
```Python hl_lines="9 15 16 19 20 23 24"
{!../../../docs_src/extra_models/tutorial002.py!}
```

2
docs/en/docs/tutorial/handling-errors.md

@ -209,7 +209,7 @@ Now try sending an invalid item like:
You will receive a response telling you that the data is invalid containing the received body:
```JSON hl_lines="13 14 15 16"
```JSON hl_lines="12 13 14 15"
{
"detail": [
{

6
docs/en/docs/tutorial/header-params.md

@ -6,7 +6,7 @@ You can define Header parameters the same way you define `Query`, `Path` and `Co
First import `Header`:
```Python hl_lines="1"
```Python hl_lines="3"
{!../../../docs_src/header_params/tutorial001.py!}
```
@ -16,7 +16,7 @@ Then declare the header parameters using the same structure as with `Path`, `Que
The first value is the default value, you can pass all the extra validation or annotation parameters:
```Python hl_lines="7"
```Python hl_lines="9"
{!../../../docs_src/header_params/tutorial001.py!}
```
@ -44,7 +44,7 @@ So, you can use `user_agent` as you normally would in Python code, instead of ne
If for some reason you need to disable automatic conversion of underscores to hyphens, set the parameter `convert_underscores` of `Header` to `False`:
```Python hl_lines="7"
```Python hl_lines="10"
{!../../../docs_src/header_params/tutorial002.py!}
```

4
docs/en/docs/tutorial/path-params-numeric-validations.md

@ -6,7 +6,7 @@ The same way you can declare more validations and metadata for query parameters
First, import `Path` from `fastapi`:
```Python hl_lines="1"
```Python hl_lines="3"
{!../../../docs_src/path_params_numeric_validations/tutorial001.py!}
```
@ -16,7 +16,7 @@ You can declare all the same parameters as for `Query`.
For example, to declare a `title` metadata value for the path parameter `item_id` you can type:
```Python hl_lines="8"
```Python hl_lines="10"
{!../../../docs_src/path_params_numeric_validations/tutorial001.py!}
```

52
docs/en/docs/tutorial/query-params-str-validations.md

@ -4,11 +4,16 @@
Let's take this application as example:
```Python hl_lines="7"
```Python hl_lines="9"
{!../../../docs_src/query_params_str_validations/tutorial001.py!}
```
The query parameter `q` is of type `str`, and by default is `None`, so it is optional.
The query parameter `q` is of type `Optional[str]`, that means that it's of type `str` but could also be `None`, and indeed, the default value is `None`, so FastAPI will know it's not required.
!!! 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.
## Additional validation
@ -18,7 +23,7 @@ We are going to enforce that even though `q` is optional, whenever it is provide
To achieve that, first import `Query` from `fastapi`:
```Python hl_lines="1"
```Python hl_lines="3"
{!../../../docs_src/query_params_str_validations/tutorial002.py!}
```
@ -26,7 +31,7 @@ To achieve that, first import `Query` from `fastapi`:
And now use it as the default value of your parameter, setting the parameter `max_length` to 50:
```Python hl_lines="7"
```Python hl_lines="9"
{!../../../docs_src/query_params_str_validations/tutorial002.py!}
```
@ -35,18 +40,35 @@ As we have to replace the default value `None` with `Query(None)`, the first par
So:
```Python
q: str = Query(None)
q: Optional[str] = Query(None)
```
...makes the parameter optional, the same as:
```Python
q: str = None
q: Optional[str] = None
```
But it declares it explicitly as being a query parameter.
And then, we can pass more parameters to `Query`. In this case, the `max_length` parameter that applies to strings:
!!! info
Have in mind that FastAPI cares about the part:
```Python
= None
```
or the:
```Python
= Query(None)
```
and will use that `None` to detect that the query parameter is not required.
The `Optional` part is only to allow your editor to provide better support.
Then, we can pass more parameters to `Query`. In this case, the `max_length` parameter that applies to strings:
```Python
q: str = Query(None, max_length=50)
@ -58,7 +80,7 @@ This will validate the data, show a clear error when the data is not valid, and
You can also add a parameter `min_length`:
```Python hl_lines="7"
```Python hl_lines="9"
{!../../../docs_src/query_params_str_validations/tutorial003.py!}
```
@ -66,7 +88,7 @@ You can also add a parameter `min_length`:
You can define a <abbr title="A regular expression, regex or regexp is a sequence of characters that define a search pattern for strings.">regular expression</abbr> that the parameter should match:
```Python hl_lines="8"
```Python hl_lines="10"
{!../../../docs_src/query_params_str_validations/tutorial004.py!}
```
@ -104,13 +126,13 @@ q: str
instead of:
```Python
q: str = None
q: Optional[str] = None
```
But we are now declaring it with `Query`, for example like:
```Python
q: str = Query(None, min_length=3)
q: Optional[str] = Query(None, min_length=3)
```
So, when you need to declare a value as required while using `Query`, you can use `...` as the first argument:
@ -211,13 +233,13 @@ That information will be included in the generated OpenAPI and used by the docum
You can add a `title`:
```Python hl_lines="7"
```Python hl_lines="10"
{!../../../docs_src/query_params_str_validations/tutorial007.py!}
```
And a `description`:
```Python hl_lines="11"
```Python hl_lines="13"
{!../../../docs_src/query_params_str_validations/tutorial008.py!}
```
@ -239,7 +261,7 @@ But you still need it to be exactly `item-query`...
Then you can declare an `alias`, and that alias is what will be used to find the parameter value:
```Python hl_lines="7"
```Python hl_lines="9"
{!../../../docs_src/query_params_str_validations/tutorial009.py!}
```
@ -251,7 +273,7 @@ You have to leave it there a while because there are clients using it, but you w
Then pass the parameter `deprecated=True` to `Query`:
```Python hl_lines="16"
```Python hl_lines="18"
{!../../../docs_src/query_params_str_validations/tutorial010.py!}
```

46
docs/en/docs/tutorial/query-params.md

@ -63,7 +63,7 @@ The parameter values in your function will be:
The same way, you can declare optional query parameters, by setting their default to `None`:
```Python hl_lines="7"
```Python hl_lines="9"
{!../../../docs_src/query_params/tutorial002.py!}
```
@ -72,11 +72,16 @@ In this case, the function parameter `q` will be optional, and will be `None` by
!!! check
Also notice that **FastAPI** is smart enough to notice that the path parameter `item_id` is a path parameter and `q` is not, so, it's a query parameter.
!!! note
FastAPI will know that `q` is optional because of the `= None`.
The `Optional` in `Optional[str]` is not used by FastAPI (FastAPI will only use the `str` part), but the `Optional[str]` will let your editor help you finding errors in your code.
## Query parameter type conversion
You can also declare `bool` types, and they will be converted:
```Python hl_lines="7"
```Python hl_lines="9"
{!../../../docs_src/query_params/tutorial003.py!}
```
@ -121,7 +126,7 @@ And you don't have to declare them in any specific order.
They will be detected by name:
```Python hl_lines="6 8"
```Python hl_lines="8 10"
{!../../../docs_src/query_params/tutorial004.py!}
```
@ -179,7 +184,7 @@ http://127.0.0.1:8000/items/foo-item?needy=sooooneedy
And of course, you can define some parameters as required, some as having a default value, and some entirely optional:
```Python hl_lines="7"
```Python hl_lines="10"
{!../../../docs_src/query_params/tutorial006.py!}
```
@ -191,36 +196,3 @@ In this case, there are 3 query parameters:
!!! tip
You could also use `Enum`s the same way as with [Path Parameters](path-params.md#predefined-values){.internal-link target=_blank}.
## Optional type declarations
!!! warning
This might be an advanced use case.
You might want to skip it.
If you are using `mypy` it could complain with type declarations like:
```Python
limit: int = None
```
With an error like:
```
Incompatible types in assignment (expression has type "None", variable has type "int")
```
In those cases you can use `Optional` to tell `mypy` that the value could be `None`, like:
```Python
from typing import Optional
limit: Optional[int] = None
```
In a *path operation* that could look like:
```Python hl_lines="9"
{!../../../docs_src/query_params/tutorial007.py!}
```

20
docs/en/docs/tutorial/response-model.md

@ -35,13 +35,13 @@ But most importantly:
Here we are declaring a `UserIn` model, it will contain a plaintext password:
```Python hl_lines="7 9"
```Python hl_lines="9 11"
{!../../../docs_src/response_model/tutorial002.py!}
```
And we are using this model to declare our input and the same model to declare our output:
```Python hl_lines="15 16"
```Python hl_lines="17 18"
{!../../../docs_src/response_model/tutorial002.py!}
```
@ -58,19 +58,19 @@ But if we use the same model for another *path operation*, we could be sending o
We can instead create an input model with the plaintext password and an output model without it:
```Python hl_lines="7 9 14"
```Python hl_lines="9 11 16"
{!../../../docs_src/response_model/tutorial003.py!}
```
Here, even though our *path operation function* is returning the same input user that contains the password:
```Python hl_lines="22"
```Python hl_lines="24"
{!../../../docs_src/response_model/tutorial003.py!}
```
...we declared the `response_model` to be our model `UserOut`, that doesn't include the password:
```Python hl_lines="20"
```Python hl_lines="22"
{!../../../docs_src/response_model/tutorial003.py!}
```
@ -94,9 +94,9 @@ Your response model could have default values, like:
{!../../../docs_src/response_model/tutorial004.py!}
```
* `description: str = None` has a default of `None`.
* `description: Optional[str] = None` has a default of `None`.
* `tax: float = 10.5` has a default of `10.5`.
* `tags: List[str] = []` has a default of an empty list: `[]`.
* `tags: List[str] = []` as a default of an empty list: `[]`.
but you might want to omit them from the result if they were not actually stored.
@ -183,7 +183,9 @@ This can be used as a quick shortcut if you have only one Pydantic model and wan
This is because the JSON Schema generated in your app's OpenAPI (and the docs) will still be the one for the complete model, even if you use `response_model_include` or `response_model_exclude` to omit some attributes.
```Python hl_lines="29 35"
This also applies to `response_model_by_alias` that works similarly.
```Python hl_lines="31 37"
{!../../../docs_src/response_model/tutorial005.py!}
```
@ -196,7 +198,7 @@ This can be used as a quick shortcut if you have only one Pydantic model and wan
If you forget to use a `set` and use a `list` or `tuple` instead, FastAPI will still convert it to a `set` and it will work correctly:
```Python hl_lines="29 35"
```Python hl_lines="31 37"
{!../../../docs_src/response_model/tutorial006.py!}
```

6
docs/en/docs/tutorial/schema-extra-example.md

@ -10,7 +10,7 @@ There are several ways you can declare extra JSON Schema information.
You can declare an example for a Pydantic model using `Config` and `schema_extra`, as described in <a href="https://pydantic-docs.helpmanual.io/usage/schema/#schema-customization" class="external-link" target="_blank">Pydantic's docs: Schema customization</a>:
```Python hl_lines="13 14 15 16 17 18 19 20 21"
```Python hl_lines="15 16 17 18 19 20 21 22 23"
{!../../../docs_src/schema_extra_example/tutorial001.py!}
```
@ -20,7 +20,7 @@ That extra info will be added as-is to the output JSON Schema.
In `Field`, `Path`, `Query`, `Body` and others you'll see later, you can also declare extra info for the JSON Schema by passing any other arbitrary arguments to the function, for example, to add an `example`:
```Python hl_lines="2 8 9 10 11"
```Python hl_lines="4 10 11 12 13"
{!../../../docs_src/schema_extra_example/tutorial002.py!}
```
@ -33,7 +33,7 @@ The same way you can pass extra info to `Field`, you can do the same with `Path`
For example, you can pass an `example` for a body request to `Body`:
```Python hl_lines="19 20 21 22 23 24"
```Python hl_lines="21 22 23 24 25 26"
{!../../../docs_src/schema_extra_example/tutorial003.py!}
```

8
docs/en/docs/tutorial/security/oauth2-jwt.md

@ -100,7 +100,7 @@ And another utility to verify if a received password matches the hash stored.
And another one to authenticate and return a user.
```Python hl_lines="7 48 55 56 59 60 69 70 71 72 73 74 75"
```Python hl_lines="8 49 56 57 60 61 70 71 72 73 74 75 76"
{!../../../docs_src/security/tutorial004.py!}
```
@ -135,7 +135,7 @@ Define a Pydantic Model that will be used in the token endpoint for the response
Create a utility function to generate a new access token.
```Python hl_lines="3 6 12 13 14 28 29 30 78 79 80 81 82 83 84 85 86"
```Python hl_lines="4 7 13 14 15 29 30 31 79 80 81 82 83 84 85 86 87"
{!../../../docs_src/security/tutorial004.py!}
```
@ -147,7 +147,7 @@ Decode the received token, verify it, and return the current user.
If the token is invalid, return an HTTP error right away.
```Python hl_lines="89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106"
```Python hl_lines="90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107"
{!../../../docs_src/security/tutorial004.py!}
```
@ -157,7 +157,7 @@ Create a `timedelta` with the expiration time of the token.
Create a real JWT access token and return it.
```Python hl_lines="115 116 117 118 119 120 121 122 123 124 125 126 127 128"
```Python hl_lines="116 117 118 119 120 121 122 123 124 125 126 127 128 129"
{!../../../docs_src/security/tutorial004.py!}
```

10
docs/en/docs/tutorial/security/simple-oauth2.md

@ -49,7 +49,7 @@ Now let's use the utilities provided by **FastAPI** to handle this.
First, import `OAuth2PasswordRequestForm`, and use it as a dependency with `Depends` for the path `/token`:
```Python hl_lines="2 74"
```Python hl_lines="4 76"
{!../../../docs_src/security/tutorial003.py!}
```
@ -90,7 +90,7 @@ If there is no such user, we return an error saying "incorrect username or passw
For the error, we use the exception `HTTPException`:
```Python hl_lines="1 75 76 77"
```Python hl_lines="3 77 78 79"
{!../../../docs_src/security/tutorial003.py!}
```
@ -118,7 +118,7 @@ If your database is stolen, the thief won't have your users' plaintext passwords
So, the thief won't be able to try to use those same passwords in another system (as many users use the same password everywhere, this would be dangerous).
```Python hl_lines="78 79 80 81"
```Python hl_lines="80 81 82 83"
{!../../../docs_src/security/tutorial003.py!}
```
@ -156,7 +156,7 @@ For this simple example, we are going to just be completely insecure and return
But for now, let's focus on the specific details we need.
```Python hl_lines="83"
```Python hl_lines="85"
{!../../../docs_src/security/tutorial003.py!}
```
@ -181,7 +181,7 @@ Both of these dependencies will just return an HTTP error if the user doesn't ex
So, in our endpoint, we will only get a user if the user exists, was correctly authenticated, and is active:
```Python hl_lines="56 57 58 59 60 61 62 63 64 65 67 68 69 70 88"
```Python hl_lines="58 59 60 61 62 63 64 65 66 67 69 70 71 72 90"
{!../../../docs_src/security/tutorial003.py!}
```

11
docs/es/docs/index.md

@ -131,6 +131,7 @@ $ pip install uvicorn
```Python
from fastapi import FastAPI
from typing import Optional
app = FastAPI()
@ -141,7 +142,7 @@ def read_root():
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
```
@ -152,6 +153,7 @@ Si tu código usa `async` / `await`, usa `async def`:
```Python hl_lines="7 12"
from fastapi import FastAPI
from typing import Optional
app = FastAPI()
@ -162,7 +164,7 @@ async def read_root():
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
async def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
```
@ -243,6 +245,7 @@ Declara el body usando las declaraciones de tipo estándares de Python gracias a
```Python hl_lines="2 7 8 9 10 23 24 25"
from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional
app = FastAPI()
@ -250,7 +253,7 @@ app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
is_offer: Optional[bool] = None
@app.get("/")
@ -259,7 +262,7 @@ def read_root():
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}

11
docs/it/docs/index.md

@ -136,6 +136,7 @@ $ pip install uvicorn
```Python
from fastapi import FastAPI
from typing import Optional
app = FastAPI()
@ -146,7 +147,7 @@ def read_root():
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
def read_item(item_id: int, q: str = Optional[None]):
return {"item_id": item_id, "q": q}
```
@ -157,6 +158,7 @@ If your code uses `async` / `await`, use `async def`:
```Python hl_lines="7 12"
from fastapi import FastAPI
from typing import Optional
app = FastAPI()
@ -167,7 +169,7 @@ async def read_root():
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
async def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
```
@ -248,6 +250,7 @@ Declare the body using standard Python types, thanks to Pydantic.
```Python hl_lines="2 7 8 9 10 23 24 25"
from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional
app = FastAPI()
@ -255,7 +258,7 @@ app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
is_offer: bool = Optional[None]
@app.get("/")
@ -264,7 +267,7 @@ def read_root():
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}

16
docs/pt/docs/index.md

@ -124,6 +124,8 @@ $ pip install uvicorn
* Crie um arquivo `main.py` com:
```Python
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@ -135,7 +137,7 @@ def read_root():
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
```
@ -144,7 +146,9 @@ def read_item(item_id: int, q: str = None):
Se seu código utiliza `async` / `await`, use `async def`:
```Python hl_lines="7 12"
```Python hl_lines="9 14"
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@ -156,7 +160,7 @@ async def read_root():
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
async def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
```
@ -234,7 +238,7 @@ Agora modifique o arquivo `main.py` para receber um corpo para uma requisição
Declare o corpo utilizando tipos padrão Python, graças ao Pydantic.
```Python hl_lines="2 7 8 9 10 23 24 25"
```Python hl_lines="4 9 10 11 12 25 26 27"
from fastapi import FastAPI
from pydantic import BaseModel
@ -244,7 +248,7 @@ app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
is_offer: Optional[bool] = None
@app.get("/")
@ -253,7 +257,7 @@ def read_root():
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}

18
docs/ru/docs/index.md

@ -135,6 +135,8 @@ $ pip install uvicorn
* Create a file `main.py` with:
```Python
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@ -146,7 +148,7 @@ def read_root():
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
```
@ -155,7 +157,9 @@ def read_item(item_id: int, q: str = None):
If your code uses `async` / `await`, use `async def`:
```Python hl_lines="7 12"
```Python hl_lines="9 14"
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@ -167,7 +171,7 @@ async def read_root():
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
async def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
```
@ -245,7 +249,9 @@ Now modify the file `main.py` to receive a body from a `PUT` request.
Declare the body using standard Python types, thanks to Pydantic.
```Python hl_lines="2 7 8 9 10 23 24 25"
```Python hl_lines="4 9 10 11 12 25 26 27"
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
@ -255,7 +261,7 @@ app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
is_offer: Optional[bool] = None
@app.get("/")
@ -264,7 +270,7 @@ def read_root():
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}

4
docs/zh/docs/deployment.md

@ -162,6 +162,8 @@ CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
* 创建一个 `main.py` 文件,内容如下:
```Python
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@ -173,7 +175,7 @@ def read_root():
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
```

18
docs/zh/docs/index.md

@ -131,6 +131,8 @@ $ pip install uvicorn
* 创建一个 `main.py` 文件并写入以下内容:
```Python
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@ -142,7 +144,7 @@ def read_root():
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
```
@ -151,7 +153,9 @@ def read_item(item_id: int, q: str = None):
如果你的代码里会出现 `async` / `await`,请使用 `async def`
```Python hl_lines="7 12"
```Python hl_lines="9 14"
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@ -163,7 +167,7 @@ async def read_root():
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
async def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
```
@ -241,7 +245,9 @@ INFO: Application startup complete.
我们借助 Pydantic 来使用标准的 Python 类型声明请求体。
```Python hl_lines="2 7 8 9 10 23 24 25"
```Python hl_lines="4 9 10 11 12 25 26 27"
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
@ -251,7 +257,7 @@ app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: bool = None
is_offer: Optional[bool] = None
@app.get("/")
@ -260,7 +266,7 @@ def read_root():
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}

4
docs_src/additional_responses/tutorial002.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import FastAPI
from fastapi.responses import FileResponse
from pydantic import BaseModel
@ -21,7 +23,7 @@ app = FastAPI()
}
},
)
async def read_item(item_id: str, img: bool = None):
async def read_item(item_id: str, img: Optional[bool] = None):
if img:
return FileResponse("image.png", media_type="image/png")
else:

4
docs_src/additional_responses/tutorial004.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import FastAPI
from fastapi.responses import FileResponse
from pydantic import BaseModel
@ -23,7 +25,7 @@ app = FastAPI()
response_model=Item,
responses={**responses, 200: {"content": {"image/png": {}}}},
)
async def read_item(item_id: str, img: bool = None):
async def read_item(item_id: str, img: Optional[bool] = None):
if img:
return FileResponse("image.png", media_type="image/png")
else:

6
docs_src/additional_status_codes/tutorial001.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import Body, FastAPI, status
from fastapi.responses import JSONResponse
@ -7,7 +9,9 @@ items = {"foo": {"name": "Fighters", "size": 6}, "bar": {"name": "Tenders", "siz
@app.put("/items/{item_id}")
async def upsert_item(item_id: str, name: str = Body(None), size: int = Body(None)):
async def upsert_item(
item_id: str, name: Optional[str] = Body(None), size: Optional[int] = Body(None)
):
if item_id in items:
item = items[item_id]
item["name"] = name

4
docs_src/app_testing/main_b.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import FastAPI, Header, HTTPException
from pydantic import BaseModel
@ -14,7 +16,7 @@ app = FastAPI()
class Item(BaseModel):
id: str
title: str
description: str = None
description: Optional[str] = None
@app.get("/items/{item_id}", response_model=Item)

4
docs_src/background_tasks/tutorial002.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import BackgroundTasks, Depends, FastAPI
app = FastAPI()
@ -8,7 +10,7 @@ def write_log(message: str):
log.write(message)
def get_query(background_tasks: BackgroundTasks, q: str = None):
def get_query(background_tasks: BackgroundTasks, q: Optional[str] = None):
if q:
message = f"found query: {q}\n"
background_tasks.add_task(write_log, message)

6
docs_src/body/tutorial001.py

@ -1,12 +1,14 @@
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
app = FastAPI()

6
docs_src/body/tutorial002.py

@ -1,12 +1,14 @@
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
app = FastAPI()

6
docs_src/body/tutorial003.py

@ -1,12 +1,14 @@
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
app = FastAPI()

8
docs_src/body/tutorial004.py

@ -1,19 +1,21 @@
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
app = FastAPI()
@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item, q: str = None):
async def create_item(item_id: int, item: Item, q: Optional[str] = None):
result = {"item_id": item_id, **item.dict()}
if q:
result.update({"q": q})

8
docs_src/body_fields/tutorial001.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import Body, FastAPI
from pydantic import BaseModel, Field
@ -6,9 +8,11 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: str = Field(None, title="The description of the item", max_length=300)
description: Optional[str] = Field(
None, title="The description of the item", max_length=300
)
price: float = Field(..., gt=0, description="The price must be greater than zero")
tax: float = None
tax: Optional[float] = None
@app.put("/items/{item_id}")

10
docs_src/body_multiple_params/tutorial001.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import FastAPI, Path
from pydantic import BaseModel
@ -6,17 +8,17 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
@app.put("/items/{item_id}")
async def update_item(
*,
item_id: int = Path(..., title="The ID of the item to get", ge=0, le=1000),
q: str = None,
item: Item = None,
q: Optional[str] = None,
item: Optional[Item] = None,
):
results = {"item_id": item_id}
if q:

8
docs_src/body_multiple_params/tutorial002.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
@ -6,14 +8,14 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
class User(BaseModel):
username: str
full_name: str = None
full_name: Optional[str] = None
@app.put("/items/{item_id}")

8
docs_src/body_multiple_params/tutorial003.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import Body, FastAPI
from pydantic import BaseModel
@ -6,14 +8,14 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
class User(BaseModel):
username: str
full_name: str = None
full_name: Optional[str] = None
@app.put("/items/{item_id}")

10
docs_src/body_multiple_params/tutorial004.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import Body, FastAPI
from pydantic import BaseModel
@ -6,14 +8,14 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
class User(BaseModel):
username: str
full_name: str = None
full_name: Optional[str] = None
@app.put("/items/{item_id}")
@ -23,7 +25,7 @@ async def update_item(
item: Item,
user: User,
importance: int = Body(..., gt=0),
q: str = None
q: Optional[str] = None
):
results = {"item_id": item_id, "item": item, "user": user, "importance": importance}
if q:

6
docs_src/body_multiple_params/tutorial005.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import Body, FastAPI
from pydantic import BaseModel
@ -6,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
@app.put("/items/{item_id}")

6
docs_src/body_nested_models/tutorial001.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
@ -6,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
tags: list = []

6
docs_src/body_nested_models/tutorial002.py

@ -1,4 +1,4 @@
from typing import List
from typing import List, Optional
from fastapi import FastAPI
from pydantic import BaseModel
@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
tags: List[str] = []

6
docs_src/body_nested_models/tutorial003.py

@ -1,4 +1,4 @@
from typing import Set
from typing import Optional, Set
from fastapi import FastAPI
from pydantic import BaseModel
@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
tags: Set[str] = set()

8
docs_src/body_nested_models/tutorial004.py

@ -1,4 +1,4 @@
from typing import Set
from typing import Optional, Set
from fastapi import FastAPI
from pydantic import BaseModel
@ -13,11 +13,11 @@ class Image(BaseModel):
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
tags: Set[str] = []
image: Image = None
image: Optional[Image] = None
@app.put("/items/{item_id}")

8
docs_src/body_nested_models/tutorial005.py

@ -1,4 +1,4 @@
from typing import Set
from typing import Optional, Set
from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl
@ -13,11 +13,11 @@ class Image(BaseModel):
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
tags: Set[str] = []
image: Image = None
image: Optional[Image] = None
@app.put("/items/{item_id}")

8
docs_src/body_nested_models/tutorial006.py

@ -1,4 +1,4 @@
from typing import List, Set
from typing import List, Optional, Set
from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl
@ -13,11 +13,11 @@ class Image(BaseModel):
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
tags: Set[str] = []
images: List[Image] = None
images: Optional[List[Image]] = None
@app.put("/items/{item_id}")

10
docs_src/body_nested_models/tutorial007.py

@ -1,4 +1,4 @@
from typing import List, Set
from typing import List, Optional, Set
from fastapi import FastAPI
from pydantic import BaseModel, HttpUrl
@ -13,16 +13,16 @@ class Image(BaseModel):
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
tags: Set[str] = []
images: List[Image] = None
images: Optional[List[Image]] = None
class Offer(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
items: List[Item]

8
docs_src/body_updates/tutorial001.py

@ -1,4 +1,4 @@
from typing import List
from typing import List, Optional
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str = None
description: str = None
price: float = None
name: Optional[str] = None
description: Optional[str] = None
price: Optional[float] = None
tax: float = 10.5
tags: List[str] = []

8
docs_src/body_updates/tutorial002.py

@ -1,4 +1,4 @@
from typing import List
from typing import List, Optional
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str = None
description: str = None
price: float = None
name: Optional[str] = None
description: Optional[str] = None
price: Optional[float] = None
tax: float = 10.5
tags: List[str] = []

4
docs_src/cookie_params/tutorial001.py

@ -1,8 +1,10 @@
from typing import Optional
from fastapi import Cookie, FastAPI
app = FastAPI()
@app.get("/items/")
async def read_items(ads_id: str = Cookie(None)):
async def read_items(ads_id: Optional[str] = Cookie(None)):
return {"ads_id": ads_id}

4
docs_src/dependencies/tutorial001.py

@ -1,9 +1,11 @@
from typing import Optional
from fastapi import Depends, FastAPI
app = FastAPI()
async def common_parameters(q: str = None, skip: int = 0, limit: int = 100):
async def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 100):
return {"q": q, "skip": skip, "limit": limit}

4
docs_src/dependencies/tutorial002.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import Depends, FastAPI
app = FastAPI()
@ -7,7 +9,7 @@ fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"
class CommonQueryParams:
def __init__(self, q: str = None, skip: int = 0, limit: int = 100):
def __init__(self, q: Optional[str] = None, skip: int = 0, limit: int = 100):
self.q = q
self.skip = skip
self.limit = limit

4
docs_src/dependencies/tutorial003.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import Depends, FastAPI
app = FastAPI()
@ -7,7 +9,7 @@ fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"
class CommonQueryParams:
def __init__(self, q: str = None, skip: int = 0, limit: int = 100):
def __init__(self, q: Optional[str] = None, skip: int = 0, limit: int = 100):
self.q = q
self.skip = skip
self.limit = limit

4
docs_src/dependencies/tutorial004.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import Depends, FastAPI
app = FastAPI()
@ -7,7 +9,7 @@ fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"
class CommonQueryParams:
def __init__(self, q: str = None, skip: int = 0, limit: int = 100):
def __init__(self, q: Optional[str] = None, skip: int = 0, limit: int = 100):
self.q = q
self.skip = skip
self.limit = limit

6
docs_src/dependencies/tutorial005.py

@ -1,14 +1,16 @@
from typing import Optional
from fastapi import Cookie, Depends, FastAPI
app = FastAPI()
def query_extractor(q: str = None):
def query_extractor(q: Optional[str] = None):
return q
def query_or_cookie_extractor(
q: str = Depends(query_extractor), last_query: str = Cookie(None)
q: str = Depends(query_extractor), last_query: Optional[str] = Cookie(None)
):
if not q:
return last_query

6
docs_src/dependency_testing/tutorial001.py

@ -1,10 +1,12 @@
from typing import Optional
from fastapi import Depends, FastAPI
from fastapi.testclient import TestClient
app = FastAPI()
async def common_parameters(q: str = None, skip: int = 0, limit: int = 100):
async def common_parameters(q: Optional[str] = None, skip: int = 0, limit: int = 100):
return {"q": q, "skip": skip, "limit": limit}
@ -21,7 +23,7 @@ async def read_users(commons: dict = Depends(common_parameters)):
client = TestClient(app)
async def override_dependency(q: str = None):
async def override_dependency(q: Optional[str] = None):
return {"q": q, "skip": 5, "limit": 10}

3
docs_src/encoder/tutorial001.py

@ -1,4 +1,5 @@
from datetime import datetime
from typing import Optional
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
@ -10,7 +11,7 @@ fake_db = {}
class Item(BaseModel):
title: str
timestamp: datetime
description: str = None
description: Optional[str] = None
app = FastAPI()

9
docs_src/extra_data_types/tutorial001.py

@ -1,4 +1,5 @@
from datetime import datetime, time, timedelta
from typing import Optional
from uuid import UUID
from fastapi import Body, FastAPI
@ -9,10 +10,10 @@ app = FastAPI()
@app.put("/items/{item_id}")
async def read_items(
item_id: UUID,
start_datetime: datetime = Body(None),
end_datetime: datetime = Body(None),
repeat_at: time = Body(None),
process_after: timedelta = Body(None),
start_datetime: Optional[datetime] = Body(None),
end_datetime: Optional[datetime] = Body(None),
repeat_at: Optional[time] = Body(None),
process_after: Optional[timedelta] = Body(None),
):
start_process = start_datetime + process_after
duration = end_datetime - start_process

8
docs_src/extra_models/tutorial001.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
@ -8,20 +10,20 @@ class UserIn(BaseModel):
username: str
password: str
email: EmailStr
full_name: str = None
full_name: Optional[str] = None
class UserOut(BaseModel):
username: str
email: EmailStr
full_name: str = None
full_name: Optional[str] = None
class UserInDB(BaseModel):
username: str
hashed_password: str
email: EmailStr
full_name: str = None
full_name: Optional[str] = None
def fake_password_hasher(raw_password: str):

4
docs_src/extra_models/tutorial002.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
@ -7,7 +9,7 @@ app = FastAPI()
class UserBase(BaseModel):
username: str
email: EmailStr
full_name: str = None
full_name: Optional[str] = None
class UserIn(UserBase):

4
docs_src/header_params/tutorial001.py

@ -1,8 +1,10 @@
from typing import Optional
from fastapi import FastAPI, Header
app = FastAPI()
@app.get("/items/")
async def read_items(user_agent: str = Header(None)):
async def read_items(user_agent: Optional[str] = Header(None)):
return {"User-Agent": user_agent}

6
docs_src/header_params/tutorial002.py

@ -1,8 +1,12 @@
from typing import Optional
from fastapi import FastAPI, Header
app = FastAPI()
@app.get("/items/")
async def read_items(strange_header: str = Header(None, convert_underscores=False)):
async def read_items(
strange_header: Optional[str] = Header(None, convert_underscores=False)
):
return {"strange_header": strange_header}

4
docs_src/header_params/tutorial003.py

@ -1,4 +1,4 @@
from typing import List
from typing import List, Optional
from fastapi import FastAPI, Header
@ -6,5 +6,5 @@ app = FastAPI()
@app.get("/items/")
async def read_items(x_token: List[str] = Header(None)):
async def read_items(x_token: Optional[List[str]] = Header(None)):
return {"X-Token values": x_token}

6
docs_src/openapi_callbacks/tutorial001.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import APIRouter, FastAPI
from fastapi.responses import JSONResponse
from pydantic import BaseModel, HttpUrl
@ -7,7 +9,7 @@ app = FastAPI()
class Invoice(BaseModel):
id: str
title: str = None
title: Optional[str] = None
customer: str
total: float
@ -32,7 +34,7 @@ def invoice_notification(body: InvoiceEvent):
@app.post("/invoices/", callbacks=invoices_callback_router.routes)
def create_invoice(invoice: Invoice, callback_url: HttpUrl = None):
def create_invoice(invoice: Invoice, callback_url: Optional[HttpUrl] = None):
"""
Create an invoice.

6
docs_src/path_operation_advanced_configuration/tutorial004.py

@ -1,4 +1,4 @@
from typing import Set
from typing import Optional, Set
from fastapi import FastAPI
from pydantic import BaseModel
@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
tags: Set[str] = []

6
docs_src/path_operation_configuration/tutorial001.py

@ -1,4 +1,4 @@
from typing import Set
from typing import Optional, Set
from fastapi import FastAPI, status
from pydantic import BaseModel
@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
tags: Set[str] = []

6
docs_src/path_operation_configuration/tutorial002.py

@ -1,4 +1,4 @@
from typing import Set
from typing import Optional, Set
from fastapi import FastAPI
from pydantic import BaseModel
@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
tags: Set[str] = []

6
docs_src/path_operation_configuration/tutorial003.py

@ -1,4 +1,4 @@
from typing import Set
from typing import Optional, Set
from fastapi import FastAPI
from pydantic import BaseModel
@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
tags: Set[str] = []

6
docs_src/path_operation_configuration/tutorial004.py

@ -1,4 +1,4 @@
from typing import Set
from typing import Optional, Set
from fastapi import FastAPI
from pydantic import BaseModel
@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
tags: Set[str] = []

6
docs_src/path_operation_configuration/tutorial005.py

@ -1,4 +1,4 @@
from typing import Set
from typing import Optional, Set
from fastapi import FastAPI
from pydantic import BaseModel
@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
tags: Set[str] = []

4
docs_src/path_params_numeric_validations/tutorial001.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import FastAPI, Path, Query
app = FastAPI()
@ -6,7 +8,7 @@ app = FastAPI()
@app.get("/items/{item_id}")
async def read_items(
item_id: int = Path(..., title="The ID of the item to get"),
q: str = Query(None, alias="item-query"),
q: Optional[str] = Query(None, alias="item-query"),
):
results = {"item_id": item_id}
if q:

4
docs_src/query_params/tutorial002.py

@ -1,10 +1,12 @@
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: str = None):
async def read_item(item_id: str, q: Optional[str] = None):
if q:
return {"item_id": item_id, "q": q}
return {"item_id": item_id}

4
docs_src/query_params/tutorial003.py

@ -1,10 +1,12 @@
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: str = None, short: bool = False):
async def read_item(item_id: str, q: Optional[str] = None, short: bool = False):
item = {"item_id": item_id}
if q:
item.update({"q": q})

4
docs_src/query_params/tutorial004.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@ -5,7 +7,7 @@ app = FastAPI()
@app.get("/users/{user_id}/items/{item_id}")
async def read_user_item(
user_id: int, item_id: str, q: str = None, short: bool = False
user_id: int, item_id: str, q: Optional[str] = None, short: bool = False
):
item = {"item_id": item_id, "owner_id": user_id}
if q:

6
docs_src/query_params/tutorial006.py

@ -1,9 +1,13 @@
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_user_item(item_id: str, needy: str, skip: int = 0, limit: int = None):
async def read_user_item(
item_id: str, needy: str, skip: int = 0, limit: Optional[int] = None
):
item = {"item_id": item_id, "needy": needy, "skip": skip, "limit": limit}
return item

11
docs_src/query_params/tutorial007.py

@ -1,11 +0,0 @@
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_user_item(item_id: str, limit: Optional[int] = None):
item = {"item_id": item_id, "limit": limit}
return item

4
docs_src/query_params_str_validations/tutorial001.py

@ -1,10 +1,12 @@
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/")
async def read_items(q: str = None):
async def read_items(q: Optional[str] = None):
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
if q:
results.update({"q": q})

4
docs_src/query_params_str_validations/tutorial002.py

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

4
docs_src/query_params_str_validations/tutorial003.py

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

4
docs_src/query_params_str_validations/tutorial004.py

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

6
docs_src/query_params_str_validations/tutorial007.py

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

4
docs_src/query_params_str_validations/tutorial008.py

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

4
docs_src/query_params_str_validations/tutorial009.py

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

4
docs_src/query_params_str_validations/tutorial010.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import FastAPI, Query
app = FastAPI()
@ -5,7 +7,7 @@ app = FastAPI()
@app.get("/items/")
async def read_items(
q: str = Query(
q: Optional[str] = Query(
None,
alias="item-query",
title="Query string",

4
docs_src/query_params_str_validations/tutorial011.py

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

2
docs_src/query_params_str_validations/tutorial013.py

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

3
docs_src/response_directly/tutorial001.py

@ -1,4 +1,5 @@
from datetime import datetime
from typing import Optional
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
@ -9,7 +10,7 @@ from pydantic import BaseModel
class Item(BaseModel):
title: str
timestamp: datetime
description: str = None
description: Optional[str] = None
app = FastAPI()

6
docs_src/response_model/tutorial001.py

@ -1,4 +1,4 @@
from typing import List
from typing import List, Optional
from fastapi import FastAPI
from pydantic import BaseModel
@ -8,9 +8,9 @@ app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
description: Optional[str] = None
price: float
tax: float = None
tax: Optional[float] = None
tags: List[str] = []

4
docs_src/response_model/tutorial002.py

@ -1,3 +1,5 @@
from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel, EmailStr
@ -8,7 +10,7 @@ class UserIn(BaseModel):
username: str
password: str
email: EmailStr
full_name: str = None
full_name: Optional[str] = None
# Don't do this in production!

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save