mirror of
https://github.com/fastapi/fastapi.git
synced 2026-06-25 23:56:18 -04:00
✏️ Fix grammar, typos, and broken links in docs (#15694)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
This commit is contained in:
@@ -232,7 +232,7 @@ would mean:
|
||||
|
||||
But that file doesn't exist, our dependencies are in a file at `app/dependencies.py`.
|
||||
|
||||
Remember how our app/file structure looks like:
|
||||
Remember what our app/file structure looks like:
|
||||
|
||||
<img src="/img/tutorial/bigger-applications/package.drawio.svg">
|
||||
|
||||
|
||||
@@ -96,7 +96,7 @@ Again, doing just that declaration, with **FastAPI** you get:
|
||||
|
||||
Apart from normal singular types like `str`, `int`, `float`, etc. you can use more complex singular types that inherit from `str`.
|
||||
|
||||
To see all the options you have, checkout [Pydantic's Type Overview](https://docs.pydantic.dev/latest/concepts/types/). You will see some examples in the next chapter.
|
||||
To see all the options you have, check out [Pydantic's Type Overview](https://docs.pydantic.dev/latest/concepts/types/). You will see some examples in the next chapter.
|
||||
|
||||
For example, as in the `Image` model we have a `url` field, we can declare it to be an instance of Pydantic's `HttpUrl` instead of a `str`:
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ To declare a **request** body, you use [Pydantic](https://docs.pydantic.dev/) mo
|
||||
|
||||
/// note
|
||||
|
||||
To send data, you should use one of: `POST` (the more common), `PUT`, `DELETE` or `PATCH`.
|
||||
To send data, you should use one of: `POST` (the most common), `PUT`, `DELETE` or `PATCH`.
|
||||
|
||||
Sending a body with a `GET` request has an undefined behavior in the specifications, nevertheless, it is supported by FastAPI, only for very complex/extreme use cases.
|
||||
|
||||
|
||||
@@ -99,7 +99,7 @@ Here's how it might look:
|
||||
|
||||
---
|
||||
|
||||
If you use Pycharm, you can:
|
||||
If you use PyCharm, you can:
|
||||
|
||||
* Open the "Run" menu.
|
||||
* Select the option "Debug...".
|
||||
|
||||
@@ -234,6 +234,7 @@ participant operation as Path Operation
|
||||
Dependencies with `yield` have evolved over time to cover different use cases and fix some issues.
|
||||
|
||||
If you want to see what has changed in different versions of FastAPI, you can read more about it in the advanced guide, in [Advanced Dependencies - Dependencies with `yield`, `HTTPException`, `except` and Background Tasks](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks).
|
||||
|
||||
## Context Managers { #context-managers }
|
||||
|
||||
### What are "Context Managers" { #what-are-context-managers }
|
||||
|
||||
@@ -36,7 +36,7 @@ Here are some of the additional data types you can use:
|
||||
* `datetime.timedelta`:
|
||||
* A Python `datetime.timedelta`.
|
||||
* In requests and responses will be represented as a `float` of total seconds.
|
||||
* Pydantic also allows representing it as a "ISO 8601 time diff encoding", [see the docs for more info](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers).
|
||||
* Pydantic also allows representing it as an "ISO 8601 time diff encoding", [see the docs for more info](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers).
|
||||
* `frozenset`:
|
||||
* In requests and responses, treated the same as a `set`:
|
||||
* In requests, a list will be read, eliminating duplicates and converting it to a `set`.
|
||||
|
||||
@@ -18,7 +18,7 @@ If you don't know, you will learn what a "password hash" is in the [security cha
|
||||
|
||||
## Multiple models { #multiple-models }
|
||||
|
||||
Here's a general idea of how the models could look like with their password fields and the places where they are used:
|
||||
Here's a general idea of what the models could look like with their password fields and the places where they are used:
|
||||
|
||||
{* ../../docs_src/extra_models/tutorial001_py310.py hl[7,9,14,20,22,27:28,31:33,38:39] *}
|
||||
|
||||
@@ -142,7 +142,7 @@ The supporting additional functions `fake_password_hasher` and `fake_save_user`
|
||||
|
||||
Reducing code duplication is one of the core ideas in **FastAPI**.
|
||||
|
||||
As code duplication increments the chances of bugs, security issues, code desynchronization issues (when you update in one place but not in the others), etc.
|
||||
As code duplication increases the chances of bugs, security issues, code desynchronization issues (when you update in one place but not in the others), etc.
|
||||
|
||||
And these models are all sharing a lot of the data and duplicating attribute names and types.
|
||||
|
||||
@@ -208,4 +208,4 @@ In this case, you can use `dict`:
|
||||
|
||||
Use multiple Pydantic models and inherit freely for each case.
|
||||
|
||||
You don't need to have a single data model per entity if that entity must be able to have different "states". As the case with the user "entity" with a state including `password`, `password_hash` and no password.
|
||||
You don't need to have a single data model per entity if that entity must be able to have different "states". The **user** "entity" is an example, with states that include `password`, `password_hash`, or no password.
|
||||
|
||||
@@ -108,7 +108,7 @@ OpenAPI defines an API schema for your API. And that schema includes definitions
|
||||
|
||||
#### Check the `openapi.json` { #check-the-openapi-json }
|
||||
|
||||
If you are curious about how the raw OpenAPI schema looks like, FastAPI automatically generates a JSON (schema) with the descriptions of all your API.
|
||||
If you are curious about what the raw OpenAPI schema looks like, FastAPI automatically generates a JSON (schema) with the descriptions of all your API.
|
||||
|
||||
You can see it directly at: [http://127.0.0.1:8000/openapi.json](http://127.0.0.1:8000/openapi.json).
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Handling Errors { #handling-errors }
|
||||
|
||||
There are many situations in which you need to notify an error to a client that is using your API.
|
||||
There are many situations in which you need to report an error to a client that is using your API.
|
||||
|
||||
This client could be a browser with a frontend, a code from someone else, an IoT device, etc.
|
||||
|
||||
@@ -71,7 +71,7 @@ They are handled automatically by **FastAPI** and converted to JSON.
|
||||
|
||||
## Add custom headers { #add-custom-headers }
|
||||
|
||||
There are some situations in where it's useful to be able to add custom headers to the HTTP error. For example, for some types of security.
|
||||
There are some situations where it's useful to be able to add custom headers to the HTTP error. For example, for some types of security.
|
||||
|
||||
You probably won't need to use it directly in your code.
|
||||
|
||||
|
||||
@@ -92,7 +92,7 @@ FastAPI has an [official extension for VS Code](https://marketplace.visualstudio
|
||||
|
||||
## Advanced User Guide { #advanced-user-guide }
|
||||
|
||||
There is also an **Advanced User Guide** that you can read later after this **Tutorial - User guide**.
|
||||
There is also an **Advanced User Guide** that you can read later after this **Tutorial - User Guide**.
|
||||
|
||||
The **Advanced User Guide** builds on this one, uses the same concepts, and teaches you some extra features.
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ You can set the following fields that are used in the OpenAPI specification and
|
||||
| `title` | `str` | The title of the API. |
|
||||
| `summary` | `str` | A short summary of the API. <small>Available since OpenAPI 3.1.0, FastAPI 0.99.0.</small> |
|
||||
| `description` | `str` | A short description of the API. It can use Markdown. |
|
||||
| `version` | `string` | The version of the API. This is the version of your own application, not of OpenAPI. For example `2.5.0`. |
|
||||
| `version` | `str` | The version of the API. This is the version of your own application, not of OpenAPI. For example `2.5.0`. |
|
||||
| `terms_of_service` | `str` | A URL to the Terms of Service for the API. If provided, this has to be a URL. |
|
||||
| `contact` | `dict` | The contact information for the exposed API. It can contain several fields. <details><summary><code>contact</code> fields</summary><table><thead><tr><th>Parameter</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td>The identifying name of the contact person/organization.</td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>The URL pointing to the contact information. MUST be in the format of a URL.</td></tr><tr><td><code>email</code></td><td><code>str</code></td><td>The email address of the contact person/organization. MUST be in the format of an email address.</td></tr></tbody></table></details> |
|
||||
| `license_info` | `dict` | The license information for the exposed API. It can contain several fields. <details><summary><code>license_info</code> fields</summary><table><thead><tr><th>Parameter</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td><code>name</code></td><td><code>str</code></td><td><strong>REQUIRED</strong> (if a <code>license_info</code> is set). The license name used for the API.</td></tr><tr><td><code>identifier</code></td><td><code>str</code></td><td>An [SPDX](https://spdx.org/licenses/) license expression for the API. The <code>identifier</code> field is mutually exclusive of the <code>url</code> field. <small>Available since OpenAPI 3.1.0, FastAPI 0.99.0.</small></td></tr><tr><td><code>url</code></td><td><code>str</code></td><td>A URL to the license used for the API. MUST be in the format of a URL.</td></tr></tbody></table></details> |
|
||||
|
||||
@@ -98,7 +98,7 @@ It will be clearly marked as deprecated in the interactive docs:
|
||||
|
||||
<img src="/img/tutorial/path-operation-configuration/image04.png">
|
||||
|
||||
Check how deprecated and non-deprecated *path operations* look like:
|
||||
Check how deprecated and non-deprecated *path operations* look:
|
||||
|
||||
<img src="/img/tutorial/path-operation-configuration/image05.png">
|
||||
|
||||
|
||||
@@ -406,7 +406,7 @@ But if you're curious about this specific code example and you're still entertai
|
||||
|
||||
#### String with `value.startswith()` { #string-with-value-startswith }
|
||||
|
||||
Did you notice? a string using `value.startswith()` can take a tuple, and it will check each value in the tuple:
|
||||
Did you notice? A string using `value.startswith()` can take a tuple, and it will check each value in the tuple:
|
||||
|
||||
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[16:19] hl[17] *}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ As they are part of the URL, they are "naturally" strings.
|
||||
|
||||
But when you declare them with Python types (in the example above, as `int`), they are converted to that type and validated against it.
|
||||
|
||||
All the same process that applied for path parameters also applies for query parameters:
|
||||
All the same processes that apply to path parameters also apply to query parameters:
|
||||
|
||||
* Editor support (obviously)
|
||||
* Data <dfn title="converting the string that comes from an HTTP request into Python data">"parsing"</dfn>
|
||||
|
||||
@@ -60,7 +60,7 @@ Using `UploadFile` has several advantages over `bytes`:
|
||||
|
||||
* You don't have to use `File()` in the default value of the parameter.
|
||||
* It uses a "spooled" file:
|
||||
* A file stored in memory up to a maximum size limit, and after passing this limit it will be stored in disk.
|
||||
* A file stored in memory up to a maximum size limit, and after passing this limit it will be stored on disk.
|
||||
* This means that it will work well for large files like images, videos, large binaries, etc. without consuming all the memory.
|
||||
* You can get metadata from the uploaded file.
|
||||
* It has a [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) `async` interface.
|
||||
@@ -111,7 +111,7 @@ When you use the `async` methods, **FastAPI** runs the file methods in a threadp
|
||||
|
||||
## What is "Form Data" { #what-is-form-data }
|
||||
|
||||
The way HTML forms (`<form></form>`) sends the data to the server normally uses a "special" encoding for that data, it's different from JSON.
|
||||
The way HTML forms (`<form></form>`) send the data to the server normally uses a "special" encoding for that data, it's different from JSON.
|
||||
|
||||
**FastAPI** will make sure to read that data from the right place instead of JSON.
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ To declare form bodies, you need to use `Form` explicitly, because without it th
|
||||
|
||||
## About "Form Fields" { #about-form-fields }
|
||||
|
||||
The way HTML forms (`<form></form>`) sends the data to the server normally uses a "special" encoding for that data, it's different from JSON.
|
||||
The way HTML forms (`<form></form>`) send the data to the server normally uses a "special" encoding for that data, it's different from JSON.
|
||||
|
||||
**FastAPI** will make sure to read that data from the right place instead of JSON.
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ If you already know what HTTP status codes are, skip to the next section.
|
||||
|
||||
In HTTP, you send a numeric status code of 3 digits as part of the response.
|
||||
|
||||
These status codes have a name associated to recognize them, but the important part is the number.
|
||||
These status codes have an associated name to help recognize them, but the important part is the number.
|
||||
|
||||
In short:
|
||||
|
||||
|
||||
@@ -78,7 +78,7 @@ Nevertheless, at the <dfn title="2023-08-26">time of writing this</dfn>, Swagger
|
||||
|
||||
### OpenAPI-specific `examples` { #openapi-specific-examples }
|
||||
|
||||
Since before **JSON Schema** supported `examples` OpenAPI had support for a different field also called `examples`.
|
||||
Since before **JSON Schema** supported `examples`, OpenAPI had support for a different field also called `examples`.
|
||||
|
||||
This **OpenAPI-specific** `examples` goes in another section in the OpenAPI specification. It goes in the **details for each *path operation***, not inside each JSON Schema.
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@ And it can also be used by yourself, to debug, check and test the same applicati
|
||||
|
||||
## The `password` flow { #the-password-flow }
|
||||
|
||||
Now let's go back a bit and understand what is all that.
|
||||
Now let's go back a bit and understand what all that is.
|
||||
|
||||
The `password` "flow" is one of the ways ("flows") defined in OAuth2, to handle security and authentication.
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ First, let's create a Pydantic user model.
|
||||
|
||||
The same way we use Pydantic to declare bodies, we can use it anywhere else:
|
||||
|
||||
{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
|
||||
{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
|
||||
|
||||
## Create a `get_current_user` dependency { #create-a-get-current-user-dependency }
|
||||
|
||||
|
||||
@@ -124,7 +124,7 @@ This ensures the endpoint takes roughly the same amount of time to respond wheth
|
||||
|
||||
/// note
|
||||
|
||||
If you check the new (fake) database `fake_users_db`, you will see how the hashed password looks like now: `"$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc"`.
|
||||
If you check the new (fake) database `fake_users_db`, you will see what the hashed password looks like now: `"$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc"`.
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ Now let's build from the previous chapter and add the missing parts to have a co
|
||||
|
||||
We are going to use **FastAPI** security utilities to get the `username` and `password`.
|
||||
|
||||
OAuth2 specifies that when using the "password flow" (that we are using) the client/user must send a `username` and `password` fields as form data.
|
||||
OAuth2 specifies that when using the "password flow" (that we are using) the client/user must send `username` and `password` fields as form data.
|
||||
|
||||
And the spec says that the fields have to be named like that. So `user-name` or `email` wouldn't work.
|
||||
|
||||
@@ -146,7 +146,7 @@ UserInDB(
|
||||
|
||||
/// note
|
||||
|
||||
For a more complete explanation of `**user_dict` check back in [the documentation for **Extra Models**](../extra-models.md#about-user-in-dict).
|
||||
For a more complete explanation of `**user_dict` check back in [the documentation for **Extra Models**](../extra-models.md#about-user-in-model-dump).
|
||||
|
||||
///
|
||||
|
||||
@@ -190,7 +190,7 @@ We want to get the `current_user` *only* if this user is active.
|
||||
|
||||
So, we create an additional dependency `get_current_active_user` that in turn uses `get_current_user` as a dependency.
|
||||
|
||||
Both of these dependencies will just return an HTTP error if the user doesn't exist, or if is inactive.
|
||||
Both of these dependencies will just return an HTTP error if the user doesn't exist, or is inactive.
|
||||
|
||||
So, in our endpoint, we will only get a user if the user exists, was correctly authenticated, and is active:
|
||||
|
||||
|
||||
@@ -201,7 +201,7 @@ Then let's create `Hero`, the actual *table model*, with the **extra fields** th
|
||||
* `id`
|
||||
* `secret_name`
|
||||
|
||||
Because `Hero` inherits form `HeroBase`, it **also** has the **fields** declared in `HeroBase`, so all the fields for `Hero` are:
|
||||
Because `Hero` inherits from `HeroBase`, it **also** has the **fields** declared in `HeroBase`, so all the fields for `Hero` are:
|
||||
|
||||
* `id`
|
||||
* `name`
|
||||
|
||||
@@ -33,7 +33,7 @@ The `directory="static"` refers to the name of the directory that contains your
|
||||
|
||||
The `name="static"` gives it a name that can be used internally by **FastAPI**.
|
||||
|
||||
All these parameters can be different than "`static`", adjust them with the needs and specific details of your own application.
|
||||
All these parameters can be different than "`static`", adjust them to the needs and specific details of your own application.
|
||||
|
||||
## More info { #more-info }
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ Import `TestClient`.
|
||||
|
||||
Create a `TestClient` by passing your **FastAPI** application to it.
|
||||
|
||||
Create functions with a name that starts with `test_` (this is standard `pytest` conventions).
|
||||
Create functions with a name that starts with `test_` (this is a standard `pytest` convention).
|
||||
|
||||
Use the `TestClient` object the same way as you do with `httpx`.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user