committed by
GitHub
90 changed files with 842 additions and 206 deletions
@ -1,5 +0,0 @@ |
|||||
[flake8] |
|
||||
max-line-length = 88 |
|
||||
select = C,E,F,W,B,B9 |
|
||||
ignore = E203, E501, W503 |
|
||||
exclude = __init__.py |
|
@ -0,0 +1,240 @@ |
|||||
|
# Réponses supplémentaires dans OpenAPI |
||||
|
|
||||
|
!!! Attention |
||||
|
Ceci concerne un sujet plutôt avancé. |
||||
|
|
||||
|
Si vous débutez avec **FastAPI**, vous n'en aurez peut-être pas besoin. |
||||
|
|
||||
|
Vous pouvez déclarer des réponses supplémentaires, avec des codes HTTP, des types de médias, des descriptions, etc. |
||||
|
|
||||
|
Ces réponses supplémentaires seront incluses dans le schéma OpenAPI, elles apparaîtront donc également dans la documentation de l'API. |
||||
|
|
||||
|
Mais pour ces réponses supplémentaires, vous devez vous assurer de renvoyer directement une `Response` comme `JSONResponse`, avec votre code HTTP et votre contenu. |
||||
|
|
||||
|
## Réponse supplémentaire avec `model` |
||||
|
|
||||
|
Vous pouvez ajouter à votre décorateur de *paramètre de chemin* un paramètre `responses`. |
||||
|
|
||||
|
Il prend comme valeur un `dict` dont les clés sont des codes HTTP pour chaque réponse, comme `200`, et la valeur de ces clés sont d'autres `dict` avec des informations pour chacun d'eux. |
||||
|
|
||||
|
Chacun de ces `dict` de réponse peut avoir une clé `model`, contenant un modèle Pydantic, tout comme `response_model`. |
||||
|
|
||||
|
**FastAPI** prendra ce modèle, générera son schéma JSON et l'inclura au bon endroit dans OpenAPI. |
||||
|
|
||||
|
Par exemple, pour déclarer une autre réponse avec un code HTTP `404` et un modèle Pydantic `Message`, vous pouvez écrire : |
||||
|
|
||||
|
```Python hl_lines="18 22" |
||||
|
{!../../../docs_src/additional_responses/tutorial001.py!} |
||||
|
``` |
||||
|
|
||||
|
!!! Remarque |
||||
|
Gardez à l'esprit que vous devez renvoyer directement `JSONResponse`. |
||||
|
|
||||
|
!!! Info |
||||
|
La clé `model` ne fait pas partie d'OpenAPI. |
||||
|
|
||||
|
**FastAPI** prendra le modèle Pydantic à partir de là, générera le `JSON Schema` et le placera au bon endroit. |
||||
|
|
||||
|
Le bon endroit est : |
||||
|
|
||||
|
* Dans la clé `content`, qui a pour valeur un autre objet JSON (`dict`) qui contient : |
||||
|
* Une clé avec le type de support, par ex. `application/json`, qui contient comme valeur un autre objet JSON, qui contient : |
||||
|
* Une clé `schema`, qui a pour valeur le schéma JSON du modèle, voici le bon endroit. |
||||
|
* **FastAPI** ajoute ici une référence aux schémas JSON globaux à un autre endroit de votre OpenAPI au lieu de l'inclure directement. De cette façon, d'autres applications et clients peuvent utiliser ces schémas JSON directement, fournir de meilleurs outils de génération de code, etc. |
||||
|
|
||||
|
Les réponses générées au format OpenAPI pour cette *opération de chemin* seront : |
||||
|
|
||||
|
```JSON hl_lines="3-12" |
||||
|
{ |
||||
|
"responses": { |
||||
|
"404": { |
||||
|
"description": "Additional Response", |
||||
|
"content": { |
||||
|
"application/json": { |
||||
|
"schema": { |
||||
|
"$ref": "#/components/schemas/Message" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"200": { |
||||
|
"description": "Successful Response", |
||||
|
"content": { |
||||
|
"application/json": { |
||||
|
"schema": { |
||||
|
"$ref": "#/components/schemas/Item" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"422": { |
||||
|
"description": "Validation Error", |
||||
|
"content": { |
||||
|
"application/json": { |
||||
|
"schema": { |
||||
|
"$ref": "#/components/schemas/HTTPValidationError" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
Les schémas sont référencés à un autre endroit du modèle OpenAPI : |
||||
|
|
||||
|
```JSON hl_lines="4-16" |
||||
|
{ |
||||
|
"components": { |
||||
|
"schemas": { |
||||
|
"Message": { |
||||
|
"title": "Message", |
||||
|
"required": [ |
||||
|
"message" |
||||
|
], |
||||
|
"type": "object", |
||||
|
"properties": { |
||||
|
"message": { |
||||
|
"title": "Message", |
||||
|
"type": "string" |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"Item": { |
||||
|
"title": "Item", |
||||
|
"required": [ |
||||
|
"id", |
||||
|
"value" |
||||
|
], |
||||
|
"type": "object", |
||||
|
"properties": { |
||||
|
"id": { |
||||
|
"title": "Id", |
||||
|
"type": "string" |
||||
|
}, |
||||
|
"value": { |
||||
|
"title": "Value", |
||||
|
"type": "string" |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"ValidationError": { |
||||
|
"title": "ValidationError", |
||||
|
"required": [ |
||||
|
"loc", |
||||
|
"msg", |
||||
|
"type" |
||||
|
], |
||||
|
"type": "object", |
||||
|
"properties": { |
||||
|
"loc": { |
||||
|
"title": "Location", |
||||
|
"type": "array", |
||||
|
"items": { |
||||
|
"type": "string" |
||||
|
} |
||||
|
}, |
||||
|
"msg": { |
||||
|
"title": "Message", |
||||
|
"type": "string" |
||||
|
}, |
||||
|
"type": { |
||||
|
"title": "Error Type", |
||||
|
"type": "string" |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
"HTTPValidationError": { |
||||
|
"title": "HTTPValidationError", |
||||
|
"type": "object", |
||||
|
"properties": { |
||||
|
"detail": { |
||||
|
"title": "Detail", |
||||
|
"type": "array", |
||||
|
"items": { |
||||
|
"$ref": "#/components/schemas/ValidationError" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
## Types de médias supplémentaires pour la réponse principale |
||||
|
|
||||
|
Vous pouvez utiliser ce même paramètre `responses` pour ajouter différents types de médias pour la même réponse principale. |
||||
|
|
||||
|
Par exemple, vous pouvez ajouter un type de média supplémentaire `image/png`, en déclarant que votre *opération de chemin* peut renvoyer un objet JSON (avec le type de média `application/json`) ou une image PNG : |
||||
|
|
||||
|
```Python hl_lines="19-24 28" |
||||
|
{!../../../docs_src/additional_responses/tutorial002.py!} |
||||
|
``` |
||||
|
|
||||
|
!!! Remarque |
||||
|
Notez que vous devez retourner l'image en utilisant directement un `FileResponse`. |
||||
|
|
||||
|
!!! Info |
||||
|
À moins que vous ne spécifiiez explicitement un type de média différent dans votre paramètre `responses`, FastAPI supposera que la réponse a le même type de média que la classe de réponse principale (par défaut `application/json`). |
||||
|
|
||||
|
Mais si vous avez spécifié une classe de réponse personnalisée avec `None` comme type de média, FastAPI utilisera `application/json` pour toute réponse supplémentaire associée à un modèle. |
||||
|
|
||||
|
## Combinaison d'informations |
||||
|
|
||||
|
Vous pouvez également combiner des informations de réponse provenant de plusieurs endroits, y compris les paramètres `response_model`, `status_code` et `responses`. |
||||
|
|
||||
|
Vous pouvez déclarer un `response_model`, en utilisant le code HTTP par défaut `200` (ou un code personnalisé si vous en avez besoin), puis déclarer des informations supplémentaires pour cette même réponse dans `responses`, directement dans le schéma OpenAPI. |
||||
|
|
||||
|
**FastAPI** conservera les informations supplémentaires des `responses` et les combinera avec le schéma JSON de votre modèle. |
||||
|
|
||||
|
Par exemple, vous pouvez déclarer une réponse avec un code HTTP `404` qui utilise un modèle Pydantic et a une `description` personnalisée. |
||||
|
|
||||
|
Et une réponse avec un code HTTP `200` qui utilise votre `response_model`, mais inclut un `example` personnalisé : |
||||
|
|
||||
|
```Python hl_lines="20-31" |
||||
|
{!../../../docs_src/additional_responses/tutorial003.py!} |
||||
|
``` |
||||
|
|
||||
|
Tout sera combiné et inclus dans votre OpenAPI, et affiché dans la documentation de l'API : |
||||
|
|
||||
|
<img src="/img/tutorial/additional-responses/image01.png"> |
||||
|
|
||||
|
## Combinez les réponses prédéfinies et les réponses personnalisées |
||||
|
|
||||
|
Vous voulez peut-être avoir des réponses prédéfinies qui s'appliquent à de nombreux *paramètre de chemin*, mais vous souhaitez les combiner avec des réponses personnalisées nécessaires à chaque *opération de chemin*. |
||||
|
|
||||
|
Dans ces cas, vous pouvez utiliser la technique Python "d'affection par décomposition" (appelé _unpacking_ en anglais) d'un `dict` avec `**dict_to_unpack` : |
||||
|
|
||||
|
``` Python |
||||
|
old_dict = { |
||||
|
"old key": "old value", |
||||
|
"second old key": "second old value", |
||||
|
} |
||||
|
new_dict = {**old_dict, "new key": "new value"} |
||||
|
``` |
||||
|
|
||||
|
Ici, `new_dict` contiendra toutes les paires clé-valeur de `old_dict` plus la nouvelle paire clé-valeur : |
||||
|
|
||||
|
``` Python |
||||
|
{ |
||||
|
"old key": "old value", |
||||
|
"second old key": "second old value", |
||||
|
"new key": "new value", |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
Vous pouvez utiliser cette technique pour réutiliser certaines réponses prédéfinies dans vos *paramètres de chemin* et les combiner avec des réponses personnalisées supplémentaires. |
||||
|
|
||||
|
Par exemple: |
||||
|
|
||||
|
```Python hl_lines="13-17 26" |
||||
|
{!../../../docs_src/additional_responses/tutorial004.py!} |
||||
|
``` |
||||
|
|
||||
|
## Plus d'informations sur les réponses OpenAPI |
||||
|
|
||||
|
Pour voir exactement ce que vous pouvez inclure dans les réponses, vous pouvez consulter ces sections dans la spécification OpenAPI : |
||||
|
|
||||
|
* <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#responsesObject" class="external-link" target="_blank">Objet Responses de OpenAPI </a>, il inclut le `Response Object`. |
||||
|
* <a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md#responseObject" class="external-link" target="_blank">Objet Response de OpenAPI </a>, vous pouvez inclure n'importe quoi directement dans chaque réponse à l'intérieur de votre paramètre `responses`. Y compris `description`, `headers`, `content` (à l'intérieur de cela, vous déclarez différents types de médias et schémas JSON) et `links`. |
@ -0,0 +1,37 @@ |
|||||
|
# Codes HTTP supplémentaires |
||||
|
|
||||
|
Par défaut, **FastAPI** renverra les réponses à l'aide d'une structure de données `JSONResponse`, en plaçant la réponse de votre *chemin d'accès* à l'intérieur de cette `JSONResponse`. |
||||
|
|
||||
|
Il utilisera le code HTTP par défaut ou celui que vous avez défini dans votre *chemin d'accès*. |
||||
|
|
||||
|
## Codes HTTP supplémentaires |
||||
|
|
||||
|
Si vous souhaitez renvoyer des codes HTTP supplémentaires en plus du code principal, vous pouvez le faire en renvoyant directement une `Response`, comme une `JSONResponse`, et en définissant directement le code HTTP supplémentaire. |
||||
|
|
||||
|
Par exemple, disons que vous voulez avoir un *chemin d'accès* qui permet de mettre à jour les éléments et renvoie les codes HTTP 200 "OK" en cas de succès. |
||||
|
|
||||
|
Mais vous voulez aussi qu'il accepte de nouveaux éléments. Et lorsque les éléments n'existaient pas auparavant, il les crée et renvoie un code HTTP de 201 "Créé". |
||||
|
|
||||
|
Pour y parvenir, importez `JSONResponse` et renvoyez-y directement votre contenu, en définissant le `status_code` que vous souhaitez : |
||||
|
|
||||
|
```Python hl_lines="4 25" |
||||
|
{!../../../docs_src/additional_status_codes/tutorial001.py!} |
||||
|
``` |
||||
|
|
||||
|
!!! Attention |
||||
|
Lorsque vous renvoyez une `Response` directement, comme dans l'exemple ci-dessus, elle sera renvoyée directement. |
||||
|
|
||||
|
Elle ne sera pas sérialisée avec un modèle. |
||||
|
|
||||
|
Assurez-vous qu'il contient les données souhaitées et que les valeurs soient dans un format JSON valides (si vous utilisez une `JSONResponse`). |
||||
|
|
||||
|
!!! note "Détails techniques" |
||||
|
Vous pouvez également utiliser `from starlette.responses import JSONResponse`. |
||||
|
|
||||
|
Pour plus de commodités, **FastAPI** fournit les objets `starlette.responses` sous forme d'un alias accessible par `fastapi.responses`. Mais la plupart des réponses disponibles proviennent directement de Starlette. Il en est de même avec l'objet `statut`. |
||||
|
|
||||
|
## Documents OpenAPI et API |
||||
|
|
||||
|
Si vous renvoyez directement des codes HTTP et des réponses supplémentaires, ils ne seront pas inclus dans le schéma OpenAPI (la documentation de l'API), car FastAPI n'a aucun moyen de savoir à l'avance ce que vous allez renvoyer. |
||||
|
|
||||
|
Mais vous pouvez documenter cela dans votre code, en utilisant : [Réponses supplémentaires dans OpenAPI](additional-responses.md){.internal-link target=_blank}. |
@ -0,0 +1,186 @@ |
|||||
|
# WebSocket |
||||
|
|
||||
|
**FastAPI**で<a href="https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API" class="external-link" target="_blank">WebSocket</a>が使用できます。 |
||||
|
|
||||
|
## `WebSockets`のインストール |
||||
|
|
||||
|
まず `WebSockets`のインストールが必要です。 |
||||
|
|
||||
|
<div class="termy"> |
||||
|
|
||||
|
```console |
||||
|
$ pip install websockets |
||||
|
|
||||
|
---> 100% |
||||
|
``` |
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
## WebSocket クライアント |
||||
|
|
||||
|
### 本番環境 |
||||
|
|
||||
|
本番環境では、React、Vue.js、Angularなどの最新のフレームワークで作成されたフロントエンドを使用しているでしょう。 |
||||
|
|
||||
|
そして、バックエンドとWebSocketを使用して通信するために、おそらくフロントエンドのユーティリティを使用することになるでしょう。 |
||||
|
|
||||
|
または、ネイティブコードでWebSocketバックエンドと直接通信するネイティブモバイルアプリケーションがあるかもしれません。 |
||||
|
|
||||
|
他にも、WebSocketのエンドポイントと通信する方法があるかもしれません。 |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
ただし、この例では非常にシンプルなHTML文書といくつかのJavaScriptを、すべてソースコードの中に入れて使用することにします。 |
||||
|
|
||||
|
もちろん、これは最適な方法ではありませんし、本番環境で使うことはないでしょう。 |
||||
|
|
||||
|
本番環境では、上記の方法のいずれかの選択肢を採用することになるでしょう。 |
||||
|
|
||||
|
しかし、これはWebSocketのサーバーサイドに焦点を当て、実用的な例を示す最も簡単な方法です。 |
||||
|
|
||||
|
```Python hl_lines="2 6-38 41-43" |
||||
|
{!../../../docs_src/websockets/tutorial001.py!} |
||||
|
``` |
||||
|
|
||||
|
## `websocket` を作成する |
||||
|
|
||||
|
**FastAPI** アプリケーションで、`websocket` を作成します。 |
||||
|
|
||||
|
```Python hl_lines="1 46-47" |
||||
|
{!../../../docs_src/websockets/tutorial001.py!} |
||||
|
``` |
||||
|
|
||||
|
!!! note "技術詳細" |
||||
|
`from starlette.websockets import WebSocket` を使用しても構いません. |
||||
|
|
||||
|
**FastAPI** は開発者の利便性のために、同じ `WebSocket` を提供します。しかし、こちらはStarletteから直接提供されるものです。 |
||||
|
|
||||
|
## メッセージの送受信 |
||||
|
|
||||
|
WebSocketルートでは、 `await` を使ってメッセージの送受信ができます。 |
||||
|
|
||||
|
```Python hl_lines="48-52" |
||||
|
{!../../../docs_src/websockets/tutorial001.py!} |
||||
|
``` |
||||
|
|
||||
|
バイナリやテキストデータ、JSONデータを送受信できます。 |
||||
|
|
||||
|
## 試してみる |
||||
|
|
||||
|
ファイル名が `main.py` である場合、以下の方法でアプリケーションを実行します。 |
||||
|
|
||||
|
<div class="termy"> |
||||
|
|
||||
|
```console |
||||
|
$ uvicorn main:app --reload |
||||
|
|
||||
|
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) |
||||
|
``` |
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
ブラウザで <a href="http://127.0.0.1:8000" class="external-link" target="_blank">http://127.0.0.1:8000</a> を開きます。 |
||||
|
|
||||
|
次のようなシンプルなページが表示されます。 |
||||
|
|
||||
|
<img src="/img/tutorial/websockets/image01.png"> |
||||
|
|
||||
|
入力ボックスにメッセージを入力して送信できます。 |
||||
|
|
||||
|
<img src="/img/tutorial/websockets/image02.png"> |
||||
|
|
||||
|
そして、 WebSocketを使用した**FastAPI**アプリケーションが応答します。 |
||||
|
|
||||
|
<img src="/img/tutorial/websockets/image03.png"> |
||||
|
|
||||
|
複数のメッセージを送信(および受信)できます。 |
||||
|
|
||||
|
<img src="/img/tutorial/websockets/image04.png"> |
||||
|
|
||||
|
そして、これらの通信はすべて同じWebSocket接続を使用します。 |
||||
|
|
||||
|
## 依存関係 |
||||
|
|
||||
|
WebSocketエンドポイントでは、`fastapi` から以下をインポートして使用できます。 |
||||
|
|
||||
|
* `Depends` |
||||
|
* `Security` |
||||
|
* `Cookie` |
||||
|
* `Header` |
||||
|
* `Path` |
||||
|
* `Query` |
||||
|
|
||||
|
これらは、他のFastAPI エンドポイント/*path operation* の場合と同じように機能します。 |
||||
|
|
||||
|
```Python hl_lines="58-65 68-83" |
||||
|
{!../../../docs_src/websockets/tutorial002.py!} |
||||
|
``` |
||||
|
|
||||
|
!!! info "情報" |
||||
|
WebSocket で `HTTPException` を発生させることはあまり意味がありません。したがって、WebSocketの接続を直接閉じる方がよいでしょう。 |
||||
|
|
||||
|
クロージングコードは、<a href="https://tools.ietf.org/html/rfc6455#section-7.4.1" class="external-link" target="_blank">仕様で定義された有効なコード</a>の中から使用することができます。 |
||||
|
|
||||
|
将来的には、どこからでも `raise` できる `WebSocketException` が用意され、専用の例外ハンドラを追加できるようになる予定です。これは、Starlette の <a href="https://github.com/encode/starlette/pull/527" class="external-link" target="_blank">PR #527</a> に依存するものです。 |
||||
|
|
||||
|
### 依存関係を用いてWebSocketsを試してみる |
||||
|
|
||||
|
ファイル名が `main.py` である場合、以下の方法でアプリケーションを実行します。 |
||||
|
|
||||
|
<div class="termy"> |
||||
|
|
||||
|
```console |
||||
|
$ uvicorn main:app --reload |
||||
|
|
||||
|
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) |
||||
|
``` |
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
ブラウザで <a href="http://127.0.0.1:8000" class="external-link" target="_blank">http://127.0.0.1:8000</a> を開きます。 |
||||
|
|
||||
|
クライアントが設定できる項目は以下の通りです。 |
||||
|
|
||||
|
* パスで使用される「Item ID」 |
||||
|
* クエリパラメータとして使用される「Token」 |
||||
|
|
||||
|
!!! tip "豆知識" |
||||
|
クエリ `token` は依存パッケージによって処理されることに注意してください。 |
||||
|
|
||||
|
これにより、WebSocketに接続してメッセージを送受信できます。 |
||||
|
|
||||
|
<img src="/img/tutorial/websockets/image05.png"> |
||||
|
|
||||
|
## 切断や複数クライアントへの対応 |
||||
|
|
||||
|
WebSocket接続が閉じられると、 `await websocket.receive_text()` は例外 `WebSocketDisconnect` を発生させ、この例のようにキャッチして処理することができます。 |
||||
|
|
||||
|
```Python hl_lines="81-83" |
||||
|
{!../../../docs_src/websockets/tutorial003.py!} |
||||
|
``` |
||||
|
|
||||
|
試してみるには、 |
||||
|
|
||||
|
* いくつかのブラウザタブでアプリを開きます。 |
||||
|
* それらのタブでメッセージを記入してください。 |
||||
|
* そして、タブのうち1つを閉じてください。 |
||||
|
|
||||
|
これにより例外 `WebSocketDisconnect` が発生し、他のすべてのクライアントは次のようなメッセージを受信します。 |
||||
|
|
||||
|
``` |
||||
|
Client #1596980209979 left the chat |
||||
|
``` |
||||
|
|
||||
|
!!! tip "豆知識" |
||||
|
上記のアプリは、複数の WebSocket 接続に対してメッセージを処理し、ブロードキャストする方法を示すための最小限のシンプルな例です。 |
||||
|
|
||||
|
しかし、すべての接続がメモリ内の単一のリストで処理されるため、プロセスの実行中にのみ機能し、単一のプロセスでのみ機能することに注意してください。 |
||||
|
|
||||
|
もしFastAPIと簡単に統合できて、RedisやPostgreSQLなどでサポートされている、より堅牢なものが必要なら、<a href="https://github.com/encode/broadcaster" class="external-link" target="_blank">encode/broadcaster</a> を確認してください。 |
||||
|
|
||||
|
## その他のドキュメント |
||||
|
|
||||
|
オプションの詳細については、Starletteのドキュメントを確認してください。 |
||||
|
|
||||
|
* <a href="https://www.starlette.io/websockets/" class="external-link" target="_blank"> `WebSocket` クラス</a> |
||||
|
* <a href="https://www.starlette.io/endpoints/#websocketendpoint" class="external-link" target="_blank">クラスベースのWebSocket処理</a> |
@ -0,0 +1,36 @@ |
|||||
|
# Formulários e Arquivos da Requisição |
||||
|
|
||||
|
Você pode definir arquivos e campos de formulário ao mesmo tempo usando `File` e `Form`. |
||||
|
|
||||
|
!!! info "Informação" |
||||
|
Para receber arquivos carregados e/ou dados de formulário, primeiro instale <a href="https://andrew-d.github.io/python-multipart/" class="external-link" target="_blank">`python-multipart`</a>. |
||||
|
|
||||
|
Por exemplo: `pip install python-multipart`. |
||||
|
|
||||
|
|
||||
|
## Importe `File` e `Form` |
||||
|
|
||||
|
```Python hl_lines="1" |
||||
|
{!../../../docs_src/request_forms_and_files/tutorial001.py!} |
||||
|
``` |
||||
|
|
||||
|
## Defina parâmetros de `File` e `Form` |
||||
|
|
||||
|
Crie parâmetros de arquivo e formulário da mesma forma que você faria para `Body` ou `Query`: |
||||
|
|
||||
|
```Python hl_lines="8" |
||||
|
{!../../../docs_src/request_forms_and_files/tutorial001.py!} |
||||
|
``` |
||||
|
|
||||
|
Os arquivos e campos de formulário serão carregados como dados de formulário e você receberá os arquivos e campos de formulário. |
||||
|
|
||||
|
E você pode declarar alguns dos arquivos como `bytes` e alguns como `UploadFile`. |
||||
|
|
||||
|
!!! warning "Aviso" |
||||
|
Você pode declarar vários parâmetros `File` e `Form` em uma *operação de caminho*, mas não é possível declarar campos `Body` para receber como JSON, pois a requisição terá o corpo codificado usando `multipart/form-data` ao invés de `application/json`. |
||||
|
|
||||
|
Isso não é uma limitação do **FastAPI** , é parte do protocolo HTTP. |
||||
|
|
||||
|
## Recapitulando |
||||
|
|
||||
|
Usar `File` e `Form` juntos quando precisar receber dados e arquivos na mesma requisição. |
@ -1,6 +1,6 @@ |
|||||
#!/bin/sh -e |
#!/bin/sh -e |
||||
set -x |
set -x |
||||
|
|
||||
autoflake --remove-all-unused-imports --recursive --remove-unused-variables --in-place docs_src fastapi tests scripts --exclude=__init__.py |
ruff fastapi tests docs_src scripts --fix |
||||
black fastapi tests docs_src scripts |
black fastapi tests docs_src scripts |
||||
isort fastapi tests docs_src scripts |
isort fastapi tests docs_src scripts |
||||
|
Loading…
Reference in new issue