8 changed files with 145 additions and 41 deletions
@ -1,40 +0,0 @@ |
|||||
When you need to receive form data instead of JSON, you can use `Form`. |
|
||||
|
|
||||
## Import Form |
|
||||
|
|
||||
Import `Form` from `fastapi`: |
|
||||
|
|
||||
```Python hl_lines="1" |
|
||||
{!./tutorial/src/form-data/tutorial001.py!} |
|
||||
``` |
|
||||
|
|
||||
## Define Form parameters |
|
||||
|
|
||||
Create form parameters the same way you would for `Body`: |
|
||||
|
|
||||
```Python hl_lines="7" |
|
||||
{!./tutorial/src/form-data/tutorial001.py!} |
|
||||
``` |
|
||||
|
|
||||
For example, for one of the ways the OAuth2 specification can be used (called "password flow") it is required to send a `username` and `password` fields as form data. |
|
||||
|
|
||||
The <abbr title="specification">spec</abbr> requires the fields to be specifically named `username` and `password`, and to be sent as form data, not JSON. |
|
||||
|
|
||||
With `Form` you can declare the same metadata and validation as with `Body` (and `Query`, `Path`, `Cookie`). |
|
||||
|
|
||||
!!! info |
|
||||
`Form` is a class that inherits directly from `Body`. |
|
||||
|
|
||||
!!! info |
|
||||
To declare form bodies, you need to use `Form`, because otherwise the parameters would be interpreted as query parameteres or body (JSON) parameters. |
|
||||
|
|
||||
## "Form Data"? |
|
||||
|
|
||||
"Form data" is the way HTML forms (`<form></form>`) send the data to the server. |
|
||||
|
|
||||
!!! note "Technical Details" |
|
||||
Data from forms is normally encoded using the "media type" `application/x-www-form-urlencoded`. To read more about it head to the <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" target="_blank"><abbr title="Mozilla Developer Network">MDN</abbr> web docs for <code>POST</code></a>. |
|
||||
|
|
||||
## Recap |
|
||||
|
|
||||
Use `Form` to declare form data input parameters. |
|
@ -0,0 +1,48 @@ |
|||||
|
You can define files to be uploaded by the client using `File`. |
||||
|
|
||||
|
## Import `File` |
||||
|
|
||||
|
Import `File` from `fastapi`: |
||||
|
|
||||
|
```Python hl_lines="1" |
||||
|
{!./tutorial/src/request-files/tutorial001.py!} |
||||
|
``` |
||||
|
|
||||
|
## Define `File` parameters |
||||
|
|
||||
|
Create file parameters the same way you would for `Body` or `Form`: |
||||
|
|
||||
|
```Python hl_lines="7" |
||||
|
{!./tutorial/src/request-files/tutorial001.py!} |
||||
|
``` |
||||
|
|
||||
|
The files will be uploaded as form data and you will receive the contents as `bytes`. |
||||
|
|
||||
|
!!! info |
||||
|
`File` is a class that inherits directly from `Form`. |
||||
|
|
||||
|
!!! info |
||||
|
To declare File bodies, you need to use `File`, because otherwise the parameters would be interpreted as query parameteres or body (JSON) parameters. |
||||
|
|
||||
|
## "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. |
||||
|
|
||||
|
**FastAPI** will make sure to read that data from the right place instead of JSON. |
||||
|
|
||||
|
!!! note "Technical Details" |
||||
|
Data from forms is normally encoded using the "media type" `application/x-www-form-urlencoded` when it doesn't include files. |
||||
|
|
||||
|
But when the form includes files, it is encoded as `multipart/form-data`. If you use `File`, **FastAPI** will know it has to get the files from the correct part of the body. |
||||
|
|
||||
|
If you want to read more about these encondings and form fields, head to the <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" target="_blank"><abbr title="Mozilla Developer Network">MDN</abbr> web docs for <code>POST</code></a>. |
||||
|
|
||||
|
|
||||
|
!!! warning |
||||
|
You can declare multiple `File` and `Form` parameters in an endpoint, but you can't also declare `Body` fields that you expect to receive as JSON, as the request will have the body encoded using `multipart/form-data` instead of `application/json`. |
||||
|
|
||||
|
This is not a limitation of **FastAPI**, it's part of the HTTP protocol. |
||||
|
|
||||
|
## Recap |
||||
|
|
||||
|
Use `File` to declare files to be uploaded as input parameters (as form data). |
@ -0,0 +1,26 @@ |
|||||
|
You can define files and form fields at the same time using `File` and `Form`. |
||||
|
|
||||
|
## Import `File` and `Form` |
||||
|
|
||||
|
```Python hl_lines="1" |
||||
|
{!./tutorial/src/request-forms-and-files/tutorial001.py!} |
||||
|
``` |
||||
|
|
||||
|
## Define `File` and `Form` parameters |
||||
|
|
||||
|
Create file and form parameters the same way you would for `Body` or `Query`: |
||||
|
|
||||
|
```Python hl_lines="7" |
||||
|
{!./tutorial/src/request-forms-and-files/tutorial001.py!} |
||||
|
``` |
||||
|
|
||||
|
The files and form fields will be uploaded as form data and you will receive the files and form fields. |
||||
|
|
||||
|
!!! warning |
||||
|
You can declare multiple `File` and `Form` parameters in an endpoint, but you can't also declare `Body` fields that you expect to receive as JSON, as the request will have the body encoded using `multipart/form-data` instead of `application/json`. |
||||
|
|
||||
|
This is not a limitation of **FastAPI**, it's part of the HTTP protocol. |
||||
|
|
||||
|
## Recap |
||||
|
|
||||
|
Use `File` and `Form` together when you need to receive data and files in the same request. |
@ -0,0 +1,52 @@ |
|||||
|
When you need to receive form fields instead of JSON, you can use `Form`. |
||||
|
|
||||
|
## Import `Form` |
||||
|
|
||||
|
Import `Form` from `fastapi`: |
||||
|
|
||||
|
```Python hl_lines="1" |
||||
|
{!./tutorial/src/request-forms/tutorial001.py!} |
||||
|
``` |
||||
|
|
||||
|
## Define `Form` parameters |
||||
|
|
||||
|
Create form parameters the same way you would for `Body` or `Query`: |
||||
|
|
||||
|
```Python hl_lines="7" |
||||
|
{!./tutorial/src/request-forms/tutorial001.py!} |
||||
|
``` |
||||
|
|
||||
|
For example, in one of the ways the OAuth2 specification can be used (called "password flow") it is required to send a `username` and `password` as form fields. |
||||
|
|
||||
|
The <abbr title="specification">spec</abbr> requires the fields to be exactly named `username` and `password`, and to be sent as form fields, not JSON. |
||||
|
|
||||
|
With `Form` you can declare the same metadata and validation as with `Body` (and `Query`, `Path`, `Cookie`). |
||||
|
|
||||
|
!!! info |
||||
|
`Form` is a class that inherits directly from `Body`. |
||||
|
|
||||
|
!!! info |
||||
|
To declare form bodies, you need to use `Form` explicitly, because without it the parameters would be interpreted as query parameteres or body (JSON) parameters. |
||||
|
|
||||
|
## "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. |
||||
|
|
||||
|
**FastAPI** will make sure to read that data from the right place instead of JSON. |
||||
|
|
||||
|
!!! note "Technical Details" |
||||
|
Data from forms is normally encoded using the "media type" `application/x-www-form-urlencoded`. |
||||
|
|
||||
|
But when the form includes files, it is encoded as `multipart/form-data`. You'll read about handling files in the next chapter. |
||||
|
|
||||
|
If you want to read more about these encondings and form fields, head to the <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST" target="_blank"><abbr title="Mozilla Developer Network">MDN</abbr> web docs for <code>POST</code></a>. |
||||
|
|
||||
|
|
||||
|
!!! warning |
||||
|
You can declare multiple `Form` parameters in an endpoint, but you can't also declare `Body` fields that you expect to receive as JSON, as the request will have the body encoded using `application/x-www-form-urlencoded` instead of `application/json`. |
||||
|
|
||||
|
This is not a limitation of **FastAPI**, it's part of the HTTP protocol. |
||||
|
|
||||
|
## Recap |
||||
|
|
||||
|
Use `Form` to declare form data input parameters. |
@ -0,0 +1,8 @@ |
|||||
|
from fastapi import FastAPI, File |
||||
|
|
||||
|
app = FastAPI() |
||||
|
|
||||
|
|
||||
|
@app.post("/files/") |
||||
|
async def create_file(*, file: bytes = File(...)): |
||||
|
return {"file_size": len(file)} |
@ -0,0 +1,8 @@ |
|||||
|
from fastapi import FastAPI, File, Form |
||||
|
|
||||
|
app = FastAPI() |
||||
|
|
||||
|
|
||||
|
@app.post("/files/") |
||||
|
async def create_file(*, file: bytes = File(...), token: str = Form(...)): |
||||
|
return {"file_size": len(file), "token": token} |
Loading…
Reference in new issue