diff --git a/README.md b/README.md index 8300315817254..53de38bd99b65 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ The key features are: + diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 4949e6c56d7ea..baa2e440d9cbc 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -2,6 +2,9 @@ gold: - url: https://bit.ly/2QSouzH title: "Jina: build neural search-as-a-service for any kind of data in just minutes." img: https://fastapi.tiangolo.com/img/sponsors/jina.svg + - url: https://cryptapi.io/ + title: "CryptAPI: Your easy to use, secure and privacy oriented payment gateway." + img: https://fastapi.tiangolo.com/img/sponsors/cryptapi.svg silver: - url: https://www.deta.sh/?ref=fastapi title: The launchpad for all your (team's) ideas diff --git a/docs/en/data/sponsors_badge.yml b/docs/en/data/sponsors_badge.yml index 0496c62797f2e..759748728ec23 100644 --- a/docs/en/data/sponsors_badge.yml +++ b/docs/en/data/sponsors_badge.yml @@ -6,3 +6,4 @@ logins: - mikeckennedy - koaning - deepset-ai + - cryptapi diff --git a/docs/en/docs/img/sponsors/cryptapi-banner.svg b/docs/en/docs/img/sponsors/cryptapi-banner.svg new file mode 100644 index 0000000000000..29cd772da1408 --- /dev/null +++ b/docs/en/docs/img/sponsors/cryptapi-banner.svg @@ -0,0 +1,1375 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/en/docs/img/sponsors/cryptapi.svg b/docs/en/docs/img/sponsors/cryptapi.svg new file mode 100644 index 0000000000000..db4e09347b7a9 --- /dev/null +++ b/docs/en/docs/img/sponsors/cryptapi.svg @@ -0,0 +1,1216 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 31953a786c7bf..ca7553855915f 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -2,6 +2,17 @@ ## Latest Changes +* 🌐 Add Korean translation for `docs/tutorial/response-status-code.md`. PR [#3742](https://github.com/tiangolo/fastapi/pull/3742) by [@NinaHwang](https://github.com/NinaHwang). +* 🌐 Add Korean translation for Tutorial - JSON Compatible Encoder. PR [#3152](https://github.com/tiangolo/fastapi/pull/3152) by [@NEONKID](https://github.com/NEONKID). +* 🌐 Add Korean translation for Tutorial - Path Parameters and Numeric Validations. PR [#2432](https://github.com/tiangolo/fastapi/pull/2432) by [@hard-coders](https://github.com/hard-coders). +* 🌐 Add Korean translation for `docs/ko/docs/deployment/versions.md`. PR [#4121](https://github.com/tiangolo/fastapi/pull/4121) by [@DevDae](https://github.com/DevDae). +* 🌐 Fix Korean translation for `docs/ko/docs/tutorial/index.md`. PR [#4193](https://github.com/tiangolo/fastapi/pull/4193) by [@kimjaeyoonn](https://github.com/kimjaeyoonn). +* 🔧 Add CryptAPI sponsor. PR [#4264](https://github.com/tiangolo/fastapi/pull/4264) by [@tiangolo](https://github.com/tiangolo). +* 📝 Update `docs/tutorial/dependencies/classes-as-dependencies`: Add type of query parameters in a description of `Classes as dependencies`. PR [#4015](https://github.com/tiangolo/fastapi/pull/4015) by [@0417taehyun](https://github.com/0417taehyun). +* 🌐 Add French translation for Tutorial - First steps. PR [#3455](https://github.com/tiangolo/fastapi/pull/3455) by [@Smlep](https://github.com/Smlep). +* 🌐 Add French translation for `docs/tutorial/path-params.md`. PR [#3548](https://github.com/tiangolo/fastapi/pull/3548) by [@Smlep](https://github.com/Smlep). +* 🌐 Add French translation for `docs/tutorial/query-params.md`. PR [#3556](https://github.com/tiangolo/fastapi/pull/3556) by [@Smlep](https://github.com/Smlep). +* 🌐 Add Turkish translation for `docs/python-types.md`. PR [#3926](https://github.com/tiangolo/fastapi/pull/3926) by [@BilalAlpaslan](https://github.com/BilalAlpaslan). ## 0.70.0 diff --git a/docs/en/docs/tutorial/dependencies/classes-as-dependencies.md b/docs/en/docs/tutorial/dependencies/classes-as-dependencies.md index 8c00374bf9409..7747e3e1b454b 100644 --- a/docs/en/docs/tutorial/dependencies/classes-as-dependencies.md +++ b/docs/en/docs/tutorial/dependencies/classes-as-dependencies.md @@ -91,9 +91,9 @@ Those parameters are what **FastAPI** will use to "solve" the dependency. In both cases, it will have: -* an optional `q` query parameter. -* a `skip` query parameter, with a default of `0`. -* a `limit` query parameter, with a default of `100`. +* An optional `q` query parameter that is a `str`. +* A `skip` query parameter that is an `int`, with a default of `0`. +* A `limit` query parameter that is an `int`, with a default of `100`. In both cases the data will be converted, validated, documented on the OpenAPI schema, etc. diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html index aa381faa37f4c..70b0253bd5fa4 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -40,6 +40,12 @@ +
+ + + + +
{% endblock %} diff --git a/docs/fr/docs/tutorial/first-steps.md b/docs/fr/docs/tutorial/first-steps.md new file mode 100644 index 0000000000000..3a81362f608a7 --- /dev/null +++ b/docs/fr/docs/tutorial/first-steps.md @@ -0,0 +1,334 @@ +# Démarrage + +Le fichier **FastAPI** le plus simple possible pourrait ressembler à cela : + +```Python +{!../../../docs_src/first_steps/tutorial001.py!} +``` + +Copiez ce code dans un fichier nommé `main.py`. + +Démarrez le serveur : + +
+ +```console +$ uvicorn main:app --reload + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +INFO: Started reloader process [28720] +INFO: Started server process [28722] +INFO: Waiting for application startup. +INFO: Application startup complete. +``` + +
+ +!!! note + La commande `uvicorn main:app` fait référence à : + + * `main` : le fichier `main.py` (le module Python). + * `app` : l'objet créé dans `main.py` via la ligne `app = FastAPI()`. + * `--reload` : l'option disant à uvicorn de redémarrer le serveur à chaque changement du code. À ne pas utiliser en production ! + +Vous devriez voir dans la console, une ligne semblable à la suivante : + +```hl_lines="4" +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +Cette ligne montre l'URL par laquelle l'app est actuellement accessible, sur votre machine locale. + +### Allez voir le résultat + +Ouvrez votre navigateur à l'adresse http://127.0.0.1:8000. + +Vous obtiendrez cette réponse JSON : + +```JSON +{"message": "Hello World"} +``` + +### Documentation interactive de l'API + +Rendez-vous sur http://127.0.0.1:8000/docs. + +Vous verrez la documentation interactive de l'API générée automatiquement (via Swagger UI) : + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) + +### Documentation alternative + +Ensuite, rendez-vous sur http://127.0.0.1:8000/redoc. + +Vous y verrez la documentation alternative (via ReDoc) : + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) + +### OpenAPI + +**FastAPI** génère un "schéma" contenant toute votre API dans le standard de définition d'API **OpenAPI**. + +#### "Schéma" + +Un "schéma" est une définition ou une description de quelque chose. Pas le code qui l'implémente, uniquement une description abstraite. + +#### "Schéma" d'API + +Ici, OpenAPI est une spécification qui dicte comment définir le schéma de votre API. + +Le schéma inclut les chemins de votre API, les paramètres potentiels de chaque chemin, etc. + +#### "Schéma" de données + +Le terme "schéma" peut aussi faire référence à la forme de la donnée, comme un contenu JSON. + +Dans ce cas, cela signifierait les attributs JSON, ainsi que les types de ces attributs, etc. + +#### OpenAPI et JSON Schema + +**OpenAPI** définit un schéma d'API pour votre API. Il inclut des définitions (ou "schémas") de la donnée envoyée et reçue par votre API en utilisant **JSON Schema**, le standard des schémas de données JSON. + +#### Allez voir `openapi.json` + +Si vous êtes curieux d'à quoi ressemble le schéma brut **OpenAPI**, **FastAPI** génère automatiquement un (schéma) JSON avec les descriptions de toute votre API. + +Vous pouvez le voir directement à cette adresse : http://127.0.0.1:8000/openapi.json. + +Le schéma devrait ressembler à ceci : + + +```JSON +{ + "openapi": "3.0.2", + "info": { + "title": "FastAPI", + "version": "0.1.0" + }, + "paths": { + "/items/": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + + + +... +``` + +#### À quoi sert OpenAPI + +Le schéma **OpenAPI** est ce qui alimente les deux systèmes de documentation interactive. + +Et il existe des dizaines d'alternatives, toutes basées sur **OpenAPI**. Vous pourriez facilement ajouter n'importe laquelle de ces alternatives à votre application **FastAPI**. + +Vous pourriez aussi l'utiliser pour générer du code automatiquement, pour les clients qui communiquent avec votre API. Comme par exemple, des applications frontend, mobiles ou IOT. + +## Récapitulatif, étape par étape + +### Étape 1 : import `FastAPI` + +```Python hl_lines="1" +{!../../../docs_src/first_steps/tutorial001.py!} +``` + +`FastAPI` est une classe Python qui fournit toutes les fonctionnalités nécessaires au lancement de votre API. + +!!! note "Détails techniques" + `FastAPI` est une classe héritant directement de `Starlette`. + + Vous pouvez donc aussi utiliser toutes les fonctionnalités de Starlette depuis `FastAPI`. + +### Étape 2 : créer une "instance" `FastAPI` + +```Python hl_lines="3" +{!../../../docs_src/first_steps/tutorial001.py!} +``` + +Ici la variable `app` sera une "instance" de la classe `FastAPI`. + +Ce sera le point principal d'interaction pour créer toute votre API. + +Cette `app` est la même que celle à laquelle fait référence `uvicorn` dans la commande : + +
+ +```console +$ uvicorn main:app --reload + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +Si vous créez votre app avec : + +```Python hl_lines="3" +{!../../../docs_src/first_steps/tutorial002.py!} +``` + +Et la mettez dans un fichier `main.py`, alors vous appeleriez `uvicorn` avec : + +
+ +```console +$ uvicorn main:my_awesome_api --reload + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +### Étape 3: créer une *opération de chemin* + +#### Chemin + +Chemin, ou "path" fait référence ici à la dernière partie de l'URL démarrant au premier `/`. + +Donc, dans un URL tel que : + +``` +https://example.com/items/foo +``` + +...le "path" serait : + +``` +/items/foo +``` + +!!! info + Un chemin, ou "path" est aussi souvent appelé route ou "endpoint". + + +#### Opération + +"Opération" fait référence à une des "méthodes" HTTP. + +Une de : + +* `POST` +* `GET` +* `PUT` +* `DELETE` + +...ou une des plus exotiques : + +* `OPTIONS` +* `HEAD` +* `PATCH` +* `TRACE` + +Dans le protocol HTTP, vous pouvez communiquer avec chaque chemin en utilisant une (ou plus) de ces "méthodes". + +--- + +En construisant des APIs, vous utilisez généralement ces méthodes HTTP spécifiques pour effectuer une action précise. + +Généralement vous utilisez : + +* `POST` : pour créer de la donnée. +* `GET` : pour lire de la donnée. +* `PUT` : pour mettre à jour de la donnée. +* `DELETE` : pour supprimer de la donnée. + +Donc, dans **OpenAPI**, chaque méthode HTTP est appelée une "opération". + +Nous allons donc aussi appeler ces dernières des "**opérations**". + + +#### Définir un *décorateur d'opération de chemin* + +```Python hl_lines="6" +{!../../../docs_src/first_steps/tutorial001.py!} +``` + +Le `@app.get("/")` dit à **FastAPI** que la fonction en dessous est chargée de gérer les requêtes qui vont sur : + +* le chemin `/` +* en utilisant une opération get + +!!! info "`@décorateur` Info" + Cette syntaxe `@something` en Python est appelée un "décorateur". + + Vous la mettez au dessus d'une fonction. Comme un joli chapeau décoratif (j'imagine que ce terme vient de là 🤷🏻‍♂). + + Un "décorateur" prend la fonction en dessous et en fait quelque chose. + + Dans notre cas, ce décorateur dit à **FastAPI** que la fonction en dessous correspond au **chemin** `/` avec l'**opération** `get`. + + C'est le "**décorateur d'opération de chemin**". + +Vous pouvez aussi utiliser les autres opérations : + +* `@app.post()` +* `@app.put()` +* `@app.delete()` + +Tout comme celles les plus exotiques : + +* `@app.options()` +* `@app.head()` +* `@app.patch()` +* `@app.trace()` + +!!! tip "Astuce" + Vous êtes libres d'utiliser chaque opération (méthode HTTP) comme vous le désirez. + + **FastAPI** n'impose pas de sens spécifique à chacune d'elle. + + Les informations qui sont présentées ici forment une directive générale, pas des obligations. + + Par exemple, quand l'on utilise **GraphQL**, toutes les actions sont effectuées en utilisant uniquement des opérations `POST`. + +### Étape 4 : définir la **fonction de chemin**. + +Voici notre "**fonction de chemin**" (ou fonction d'opération de chemin) : + +* **chemin** : `/`. +* **opération** : `get`. +* **fonction** : la fonction sous le "décorateur" (sous `@app.get("/")`). + +```Python hl_lines="7" +{!../../../docs_src/first_steps/tutorial001.py!} +``` + +C'est une fonction Python. + +Elle sera appelée par **FastAPI** quand une requête sur l'URL `/` sera reçue via une opération `GET`. + +Ici, c'est une fonction asynchrone (définie avec `async def`). + +--- + +Vous pourriez aussi la définir comme une fonction classique plutôt qu'avec `async def` : + +```Python hl_lines="7" +{!../../../docs_src/first_steps/tutorial003.py!} +``` + +!!! note + Si vous ne connaissez pas la différence, allez voir la section [Concurrence : *"Vous êtes pressés ?"*](../async.md#vous-etes-presses){.internal-link target=_blank}. + +### Étape 5 : retourner le contenu + +```Python hl_lines="8" +{!../../../docs_src/first_steps/tutorial001.py!} +``` + +Vous pouvez retourner un dictionnaire (`dict`), une liste (`list`), des valeurs seules comme des chaines de caractères (`str`) et des entiers (`int`), etc. + +Vous pouvez aussi retourner des models **Pydantic** (qui seront détaillés plus tard). + +Il y a de nombreux autres objets et modèles qui seront automatiquement convertis en JSON. Essayez d'utiliser vos favoris, il est fort probable qu'ils soient déjà supportés. + +## Récapitulatif + +* Importez `FastAPI`. +* Créez une instance d'`app`. +* Ajoutez une **décorateur d'opération de chemin** (tel que `@app.get("/")`). +* Ajoutez une **fonction de chemin** (telle que `def root(): ...` comme ci-dessus). +* Lancez le serveur de développement (avec `uvicorn main:app --reload`). diff --git a/docs/fr/docs/tutorial/path-params.md b/docs/fr/docs/tutorial/path-params.md new file mode 100644 index 0000000000000..58f53e008ea78 --- /dev/null +++ b/docs/fr/docs/tutorial/path-params.md @@ -0,0 +1,254 @@ +# Paramètres de chemin + +Vous pouvez déclarer des "paramètres" ou "variables" de chemin avec la même syntaxe que celle utilisée par le +formatage de chaîne Python : + + +```Python hl_lines="6-7" +{!../../../docs_src/path_params/tutorial001.py!} +``` + +La valeur du paramètre `item_id` sera transmise à la fonction dans l'argument `item_id`. + +Donc, si vous exécutez cet exemple et allez sur http://127.0.0.1:8000/items/foo, +vous verrez comme réponse : + +```JSON +{"item_id":"foo"} +``` + +## Paramètres de chemin typés + +Vous pouvez déclarer le type d'un paramètre de chemin dans la fonction, en utilisant les annotations de type Python : + + +```Python hl_lines="7" +{!../../../docs_src/path_params/tutorial002.py!} +``` + +Ici, `item_id` est déclaré comme `int`. + +!!! hint "Astuce" + Ceci vous permettra d'obtenir des fonctionnalités de l'éditeur dans votre fonction, telles + que des vérifications d'erreur, de l'auto-complétion, etc. + +## Conversion de données + +Si vous exécutez cet exemple et allez sur http://127.0.0.1:8000/items/3, vous aurez comme réponse : + +```JSON +{"item_id":3} +``` + +!!! hint "Astuce" + Comme vous l'avez remarqué, la valeur reçue par la fonction (et renvoyée ensuite) est `3`, + en tant qu'entier (`int`) Python, pas la chaîne de caractères (`string`) `"3"`. + + Grâce aux déclarations de types, **FastAPI** fournit du + "parsing" automatique. + +## Validation de données + +Si vous allez sur http://127.0.0.1:8000/items/foo, vous aurez une belle erreur HTTP : + +```JSON +{ + "detail": [ + { + "loc": [ + "path", + "item_id" + ], + "msg": "value is not a valid integer", + "type": "type_error.integer" + } + ] +} +``` + +car le paramètre de chemin `item_id` possède comme valeur `"foo"`, qui ne peut pas être convertie en entier (`int`). + +La même erreur se produira si vous passez un nombre flottant (`float`) et non un entier, comme ici +http://127.0.0.1:8000/items/4.2. + + +!!! hint "Astuce" + Donc, avec ces mêmes déclarations de type Python, **FastAPI** vous fournit de la validation de données. + + Notez que l'erreur mentionne le point exact où la validation n'a pas réussi. + + Ce qui est incroyablement utile au moment de développer et débugger du code qui interagit avec votre API. + +## Documentation + +Et quand vous vous rendez sur http://127.0.0.1:8000/docs, vous verrez la +documentation générée automatiquement et interactive : + + + +!!! info + À nouveau, en utilisant uniquement les déclarations de type Python, **FastAPI** vous fournit automatiquement une documentation interactive (via Swagger UI). + + On voit bien dans la documentation que `item_id` est déclaré comme entier. + +## Les avantages d'avoir une documentation basée sur une norme, et la documentation alternative. + +Le schéma généré suivant la norme OpenAPI, +il existe de nombreux outils compatibles. + +Grâce à cela, **FastAPI** lui-même fournit une documentation alternative (utilisant ReDoc), qui peut être lue +sur http://127.0.0.1:8000/redoc : + + + +De la même façon, il existe bien d'autres outils compatibles, y compris des outils de génération de code +pour de nombreux langages. + +## Pydantic + +Toute la validation de données est effectué en arrière-plan avec Pydantic, +dont vous bénéficierez de tous les avantages. Vous savez donc que vous êtes entre de bonnes mains. + +## L'ordre importe + +Quand vous créez des *fonctions de chemins*, vous pouvez vous retrouver dans une situation où vous avez un chemin fixe. + +Tel que `/users/me`, disons pour récupérer les données sur l'utilisateur actuel. + +Et vous avez un second chemin : `/users/{user_id}` pour récupérer de la donnée sur un utilisateur spécifique grâce à son identifiant d'utilisateur + +Les *fonctions de chemin* étant évaluées dans l'ordre, il faut s'assurer que la fonction correspondant à `/users/me` est déclarée avant celle de `/users/{user_id}` : + +```Python hl_lines="6 11" +{!../../../docs_src/path_params/tutorial003.py!} +``` + +Sinon, le chemin `/users/{user_id}` correspondrait aussi à `/users/me`, la fonction "croyant" qu'elle a reçu un paramètre `user_id` avec pour valeur `"me"`. + +## Valeurs prédéfinies + +Si vous avez une *fonction de chemin* qui reçoit un *paramètre de chemin*, mais que vous voulez que les valeurs possibles des paramètres soient prédéfinies, vous pouvez utiliser les `Enum` de Python. + +### Création d'un `Enum` + +Importez `Enum` et créez une sous-classe qui hérite de `str` et `Enum`. + +En héritant de `str` la documentation sera capable de savoir que les valeurs doivent être de type `string` et pourra donc afficher cette `Enum` correctement. + +Créez ensuite des attributs de classe avec des valeurs fixes, qui seront les valeurs autorisées pour cette énumération. + +```Python hl_lines="1 6-9" +{!../../../docs_src/path_params/tutorial005.py!} +``` + +!!! info + Les énumérations (ou enums) sont disponibles en Python depuis la version 3.4. + +!!! tip "Astuce" + Pour ceux qui se demandent, "AlexNet", "ResNet", et "LeNet" sont juste des noms de modèles de Machine Learning. + +### Déclarer un paramètre de chemin + +Créez ensuite un *paramètre de chemin* avec une annotation de type désignant l'énumération créée précédemment (`ModelName`) : + +```Python hl_lines="16" +{!../../../docs_src/path_params/tutorial005.py!} +``` + +### Documentation + +Les valeurs disponibles pour le *paramètre de chemin* sont bien prédéfinies, la documentation les affiche correctement : + + + +### Manipuler les *énumérations* Python + +La valeur du *paramètre de chemin* sera un des "membres" de l'énumération. + +#### Comparer les *membres d'énumération* + +Vous pouvez comparer ce paramètre avec les membres de votre énumération `ModelName` : + +```Python hl_lines="17" +{!../../../docs_src/path_params/tutorial005.py!} +``` + +#### Récupérer la *valeur de l'énumération* + +Vous pouvez obtenir la valeur réel d'un membre (une chaîne de caractères ici), avec `model_name.value`, ou en général, `votre_membre_d'enum.value` : + +```Python hl_lines="20" +{!../../../docs_src/path_params/tutorial005.py!} +``` + +!!! tip "Astuce" + Vous pouvez aussi accéder la valeur `"lenet"` avec `ModelName.lenet.value`. + +#### Retourner des *membres d'énumération* + +Vous pouvez retourner des *membres d'énumération* dans vos *fonctions de chemin*, même imbriquée dans un JSON (e.g. un `dict`). + +Ils seront convertis vers leurs valeurs correspondantes (chaînes de caractères ici) avant d'être transmis au client : + +```Python hl_lines="18 21 23" +{!../../../docs_src/path_params/tutorial005.py!} +``` + +Le client recevra une réponse JSON comme celle-ci : + +```JSON +{ + "model_name": "alexnet", + "message": "Deep Learning FTW!" +} +``` + +## Paramètres de chemin contenant des chemins + +Disons que vous avez une *fonction de chemin* liée au chemin `/files/{file_path}`. + +Mais que `file_path` lui-même doit contenir un *chemin*, comme `home/johndoe/myfile.txt` par exemple. + +Donc, l'URL pour ce fichier pourrait être : `/files/home/johndoe/myfile.txt`. + +### Support d'OpenAPI + +OpenAPI ne supporte pas de manière de déclarer un paramètre de chemin contenant un *chemin*, cela pouvant causer des scénarios difficiles à tester et définir. + +Néanmoins, cela reste faisable dans **FastAPI**, via les outils internes de Starlette. + +Et la documentation fonctionne quand même, bien qu'aucune section ne soit ajoutée pour dire que la paramètre devrait contenir un *chemin*. + +### Convertisseur de *chemin* + +En utilisant une option de Starlette directement, vous pouvez déclarer un *paramètre de chemin* contenant un *chemin* avec une URL comme : + +``` +/files/{file_path:path} +``` + +Dans ce cas, le nom du paramètre est `file_path`, et la dernière partie, `:path`, indique à Starlette que le paramètre devrait correspondre à un *chemin*. + +Vous pouvez donc l'utilisez comme tel : + +```Python hl_lines="6" +{!../../../docs_src/path_params/tutorial004.py!} +``` + +!!! tip "Astuce" + Vous pourriez avoir besoin que le paramètre contienne `/home/johndoe/myfile.txt`, avec un slash au début (`/`). + + Dans ce cas, l'URL serait : `/files//home/johndoe/myfile.txt`, avec un double slash (`//`) entre `files` et `home`. + +## Récapitulatif + +Avec **FastAPI**, en utilisant les déclarations de type rapides, intuitives et standards de Python, vous bénéficiez de : + +* Support de l'éditeur : vérification d'erreurs, auto-complétion, etc. +* "Parsing" de données. +* Validation de données. +* Annotations d'API et documentation automatique. + +Et vous n'avez besoin de le déclarer qu'une fois. + +C'est probablement l'avantage visible principal de **FastAPI** comparé aux autres *frameworks* (outre les performances pures). diff --git a/docs/fr/docs/tutorial/query-params.md b/docs/fr/docs/tutorial/query-params.md new file mode 100644 index 0000000000000..f1f2a605db14d --- /dev/null +++ b/docs/fr/docs/tutorial/query-params.md @@ -0,0 +1,198 @@ +# Paramètres de requête + +Quand vous déclarez des paramètres dans votre fonction de chemin qui ne font pas partie des paramètres indiqués dans le chemin associé, ces paramètres sont automatiquement considérés comme des paramètres de "requête". + +```Python hl_lines="9" +{!../../../docs_src/query_params/tutorial001.py!} +``` + +La partie appelée requête (ou **query**) dans une URL est l'ensemble des paires clés-valeurs placées après le `?` , séparées par des `&`. + +Par exemple, dans l'URL : + +``` +http://127.0.0.1:8000/items/?skip=0&limit=10 +``` + +...les paramètres de requête sont : + +* `skip` : avec une valeur de`0` +* `limit` : avec une valeur de `10` + +Faisant partie de l'URL, ces valeurs sont des chaînes de caractères (`str`). + +Mais quand on les déclare avec des types Python (dans l'exemple précédent, en tant qu'`int`), elles sont converties dans les types renseignés. + +Toutes les fonctionnalités qui s'appliquent aux paramètres de chemin s'appliquent aussi aux paramètres de requête : + +* Support de l'éditeur : vérification d'erreurs, auto-complétion, etc. +* "Parsing" de données. +* Validation de données. +* Annotations d'API et documentation automatique. + +## Valeurs par défaut + +Les paramètres de requête ne sont pas une partie fixe d'un chemin, ils peuvent être optionnels et avoir des valeurs par défaut. + +Dans l'exemple ci-dessus, ils ont des valeurs par défaut qui sont `skip=0` et `limit=10`. + +Donc, accéder à l'URL : + +``` +http://127.0.0.1:8000/items/ +``` + +serait équivalent à accéder à l'URL : + +``` +http://127.0.0.1:8000/items/?skip=0&limit=10 +``` + +Mais si vous accédez à, par exemple : + +``` +http://127.0.0.1:8000/items/?skip=20 +``` + +Les valeurs des paramètres de votre fonction seront : + +* `skip=20` : car c'est la valeur déclarée dans l'URL. +* `limit=10` : car `limit` n'a pas été déclaré dans l'URL, et que la valeur par défaut était `10`. + +## Paramètres optionnels + +De la même façon, vous pouvez définir des paramètres de requête comme optionnels, en leur donnant comme valeur par défaut `None` : + +```Python hl_lines="9" +{!../../../docs_src/query_params/tutorial002.py!} +``` + +Ici, le paramètre `q` sera optionnel, et aura `None` comme valeur par défaut. + +!!! check "Remarque" + On peut voir que **FastAPI** est capable de détecter que le paramètre de chemin `item_id` est un paramètre de chemin et que `q` n'en est pas un, c'est donc un paramètre de requête. + +!!! note + **FastAPI** saura que `q` est optionnel grâce au `=None`. + + Le `Optional` dans `Optional[str]` n'est pas utilisé par **FastAPI** (**FastAPI** n'en utilisera que la partie `str`), mais il servira tout de même à votre editeur de texte pour détecter des erreurs dans votre code. + + +## Conversion des types des paramètres de requête + +Vous pouvez aussi déclarer des paramètres de requête comme booléens (`bool`), **FastAPI** les convertira : + +```Python hl_lines="9" +{!../../../docs_src/query_params/tutorial003.py!} +``` + +Avec ce code, en allant sur : + +``` +http://127.0.0.1:8000/items/foo?short=1 +``` + +ou + +``` +http://127.0.0.1:8000/items/foo?short=True +``` + +ou + +``` +http://127.0.0.1:8000/items/foo?short=true +``` + +ou + +``` +http://127.0.0.1:8000/items/foo?short=on +``` + +ou + +``` +http://127.0.0.1:8000/items/foo?short=yes +``` + +ou n'importe quelle autre variation de casse (tout en majuscules, uniquement la première lettre en majuscule, etc.), votre fonction considérera le paramètre `short` comme ayant une valeur booléenne à `True`. Sinon la valeur sera à `False`. + +## Multiples paramètres de chemin et de requête + +Vous pouvez déclarer plusieurs paramètres de chemin et paramètres de requête dans la même fonction, **FastAPI** saura comment les gérer. + +Et vous n'avez pas besoin de les déclarer dans un ordre spécifique. + +Ils seront détectés par leurs noms : + +```Python hl_lines="8 10" +{!../../../docs_src/query_params/tutorial004.py!} +``` + +## Paramètres de requête requis + +Quand vous déclarez une valeur par défaut pour un paramètre qui n'est pas un paramètre de chemin (actuellement, nous n'avons vu que les paramètres de requête), alors ce paramètre n'est pas requis. + +Si vous ne voulez pas leur donner de valeur par défaut mais juste les rendre optionnels, utilisez `None` comme valeur par défaut. + +Mais si vous voulez rendre un paramètre de requête obligatoire, vous pouvez juste ne pas y affecter de valeur par défaut : + +```Python hl_lines="6-7" +{!../../../docs_src/query_params/tutorial005.py!} +``` + +Ici le paramètre `needy` est un paramètre requis (ou obligatoire) de type `str`. + +Si vous ouvrez une URL comme : + +``` +http://127.0.0.1:8000/items/foo-item +``` + +...sans ajouter le paramètre requis `needy`, vous aurez une erreur : + +```JSON +{ + "detail": [ + { + "loc": [ + "query", + "needy" + ], + "msg": "field required", + "type": "value_error.missing" + } + ] +} +``` + +La présence de `needy` étant nécessaire, vous auriez besoin de l'insérer dans l'URL : + +``` +http://127.0.0.1:8000/items/foo-item?needy=sooooneedy +``` + +...ce qui fonctionnerait : + +```JSON +{ + "item_id": "foo-item", + "needy": "sooooneedy" +} +``` + +Et bien sur, vous pouvez définir certains paramètres comme requis, certains avec des valeurs par défaut et certains entièrement optionnels : + +```Python hl_lines="10" +{!../../../docs_src/query_params/tutorial006.py!} +``` + +Ici, on a donc 3 paramètres de requête : + +* `needy`, requis et de type `str`. +* `skip`, un `int` avec comme valeur par défaut `0`. +* `limit`, un `int` optionnel. + +!!! tip "Astuce" + Vous pouvez utiliser les `Enum`s de la même façon qu'avec les [Paramètres de chemin](path-params.md#valeurs-predefinies){.internal-link target=_blank}. diff --git a/docs/fr/mkdocs.yml b/docs/fr/mkdocs.yml index 940e4ff6980a8..6242a88fdd9d6 100644 --- a/docs/fr/mkdocs.yml +++ b/docs/fr/mkdocs.yml @@ -59,6 +59,9 @@ nav: - fastapi-people.md - python-types.md - Tutoriel - Guide utilisateur: + - tutorial/first-steps.md + - tutorial/path-params.md + - tutorial/query-params.md - tutorial/body.md - tutorial/background-tasks.md - async.md diff --git a/docs/ko/docs/deployment/versions.md b/docs/ko/docs/deployment/versions.md new file mode 100644 index 0000000000000..4c1bcdc2e4392 --- /dev/null +++ b/docs/ko/docs/deployment/versions.md @@ -0,0 +1,88 @@ +# FastAPI 버전들에 대하여 + +**FastAPI** 는 이미 많은 응용 프로그램과 시스템들을 만드는데 사용되고 있습니다. 그리고 100%의 테스트 정확성을 가지고 있습니다. 하지만 이것은 아직까지도 빠르게 발전하고 있습니다. + +새로운 특징들이 빈번하게 추가되고, 오류들이 지속적으로 수정되고 있습니다. 그리고 코드가 계속적으로 향상되고 있습니다. + +이것이 아직도 최신 버전이 `0.x.x`인 이유입니다. 이것은 각각의 버전들이 잠재적으로 변할 수 있다는 것을 보여줍니다. 이는 유의적 버전 관습을 따릅니다. + +지금 바로 **FastAPI**로 응용 프로그램을 만들 수 있습니다. 이때 (아마 지금까지 그래 왔던 것처럼), 사용하는 버전이 코드와 잘 맞는지 확인해야합니다. + +## `fastapi` 버전을 표시 + +가장 먼저 해야할 것은 응용 프로그램이 잘 작동하는 가장 최신의 구체적인 **FastAPI** 버전을 표시하는 것입니다. + +예를 들어, 응용 프로그램에 `0.45.0` 버전을 사용했다고 가정합니다. + +만약에 `requirements.txt` 파일을 사용했다면, 다음과 같이 버전을 명세할 수 있습니다: + +```txt +fastapi==0.45.0 +``` + +이것은 `0.45.0` 버전을 사용했다는 것을 의미합니다. + +또는 다음과 같이 표시할 수 있습니다: + +```txt +fastapi>=0.45.0,<0.46.0 +``` + +이것은 `0.45.0` 버전과 같거나 높으면서 `0.46.0` 버전 보다는 낮은 버전을 사용했다는 것을 의미합니다. 예를 들어, `0.45.2` 버전과 같은 경우는 해당 조건을 만족합니다. + +만약에 Poetry, Pipenv, 또는 그밖의 다양한 설치 도구를 사용한다면, 패키지에 구체적인 버전을 정의할 수 있는 방법을 가지고 있을 것입니다. + +## 이용가능한 버전들 + +[Release Notes](../release-notes.md){.internal-link target=_blank}를 통해 사용할 수 있는 버전들을 확인할 수 있습니다.(예를 들어, 가장 최신의 버전을 확인할 수 있습니다.) + + +## 버전들에 대해 + +유의적 버전 관습을 따라서, `1.0.0` 이하의 모든 버전들은 잠재적으로 급변할 수 있습니다. + +FastAPI는 오류를 수정하고, 일반적인 변경사항을 위해 "패치"버전의 관습을 따릅니다. + +!!! tip "팁" + 여기서 말하는 "패치"란 버전의 마지막 숫자로, 예를 들어 `0.2.3` 버전에서 "패치"는 `3`을 의미합니다. + +따라서 다음과 같이 버전을 표시할 수 있습니다: + +```txt +fastapi>=0.45.0,<0.46.0 +``` + +수정된 사항과 새로운 요소들이 "마이너" 버전에 추가되었습니다. + +!!! tip "팁" + "마이너"란 버전 넘버의 가운데 숫자로, 예를 들어서 `0.2.3`의 "마이너" 버전은 `2`입니다. + +## FastAPI 버전의 업그레이드 + +응용 프로그램을 검사해야합니다. + +(Starlette 덕분에), **FastAPI** 를 이용하여 굉장히 쉽게 할 수 있습니다. [Testing](../tutorial/testing.md){.internal-link target=_blank}문서를 확인해 보십시오: + +검사를 해보고 난 후에, **FastAPI** 버전을 더 최신으로 업그레이드 할 수 있습니다. 그리고 코드들이 테스트에 정상적으로 작동하는지 확인을 해야합니다. + +만약에 모든 것이 정상 작동하거나 필요한 부분을 변경하고, 모든 검사를 통과한다면, 새로운 버전의 `fastapi`를 표시할 수 있습니다. + +## Starlette에 대해 + +`starlette`의 버전은 표시할 수 없습니다. + +서로다른 버전의 **FastAPI**가 구체적이고 새로운 버전의 Starlette을 사용할 것입니다. + +그러므로 **FastAPI**가 알맞은 Starlette 버전을 사용하도록 하십시오. + +## Pydantic에 대해 + +Pydantic은 **FastAPI** 를 위한 검사를 포함하고 있습니다. 따라서, 새로운 버전의 Pydantic(`1.0.0`이상)은 항상 FastAPI와 호환됩니다. + +작업을 하고 있는 `1.0.0` 이상의 모든 버전과 `2.0.0` 이하의 Pydantic 버전을 표시할 수 있습니다. + +예를 들어 다음과 같습니다: + +```txt +pydantic>=1.2.0,<2.0.0 +``` diff --git a/docs/ko/docs/tutorial/encoder.md b/docs/ko/docs/tutorial/encoder.md new file mode 100644 index 0000000000000..8b5fdb8b7ea16 --- /dev/null +++ b/docs/ko/docs/tutorial/encoder.md @@ -0,0 +1,34 @@ +# JSON 호환 가능 인코더 + +데이터 유형(예: Pydantic 모델)을 JSON과 호환된 형태로 반환해야 하는 경우가 있습니다. (예: `dict`, `list` 등) + +예를 들면, 데이터베이스에 저장해야하는 경우입니다. + +이를 위해, **FastAPI** 에서는 `jsonable_encoder()` 함수를 제공합니다. + +## `jsonable_encoder` 사용 + +JSON 호환 가능 데이터만 수신하는 `fake_db` 데이터베이스가 존재한다고 가정하겠습니다. + +예를 들면, `datetime` 객체는 JSON과 호환되는 데이터가 아니므로 이 데이터는 받아들여지지 않습니다. + +따라서 `datetime` 객체는 ISO format 데이터를 포함하는 `str`로 변환되어야 합니다. + +같은 방식으로 이 데이터베이스는 Pydantic 모델(속성이 있는 객체)을 받지 않고, `dict` 만을 받습니다. + +이를 위해 `jsonable_encoder` 를 사용할 수 있습니다. + +Pydantic 모델과 같은 객체를 받고 JSON 호환 가능한 버전으로 반환합니다: + +```Python hl_lines="5 22" +{!../../../docs_src/encoder/tutorial001.py!} +``` + +이 예시는 Pydantic 모델을 `dict`로, `datetime` 형식을 `str`로 변환합니다. + +이렇게 호출한 결과는 파이썬 표준인 `json.dumps()`로 인코딩 할 수 있습니다. + +길이가 긴 문자열 형태의 JSON 형식(문자열)의 데이터가 들어있는 상황에서는 `str`로 반환하지 않습니다. JSON과 모두 호환되는 값과 하위 값이 있는 Python 표준 데이터 구조 (예: `dict`)를 반환합니다. + +!!! note "참고" + 실제로 `jsonable_encoder`는 **FastAPI** 에서 내부적으로 데이터를 변환하는 데 사용하지만, 다른 많은 곳에서도 이는 유용합니다. diff --git a/docs/ko/docs/tutorial/index.md b/docs/ko/docs/tutorial/index.md index a18a9ffc77cc9..622aad1aa6ac8 100644 --- a/docs/ko/docs/tutorial/index.md +++ b/docs/ko/docs/tutorial/index.md @@ -2,11 +2,11 @@ 이 자습서는 **FastAPI**의 대부분의 기능을 단계별로 사용하는 방법을 보여줍니다. -각 섹션은 이전 섹션을 기반해서 점진적으로 만들어 졌지만, 주제를 구분하여 구성 되었기 때문에 특정 API 요구사항을 해결하기 위해 어떤 특정 항목이던지 직접 이동할 수 있습니다. +각 섹션은 이전 섹션을 기반해서 점진적으로 만들어 졌지만, 주제에 따라 다르게 구성되었기 때문에 특정 API 요구사항을 해결하기 위해서라면 어느 특정 항목으로던지 직접 이동할 수 있습니다. 또한 향후 참조가 될 수 있도록 만들어졌습니다. -그러므로 다시 돌아와서 정확히 필요한 것을 볼 수 있습니다. +그러므로 다시 돌아와서 정확히 필요한 것을 확인할 수 있습니다. ## 코드 실행하기 @@ -30,7 +30,7 @@ $ uvicorn main:app --reload 코드를 작성하거나 복사, 편집할 때, 로컬에서 실행하는 것을 **강력히 장려**합니다. -편집기에서 이렇게 사용하면, 모든 타입 검사, 자동완성 등 작성해야 하는 코드가 얼마나 적은지 보면서 FastAPI의 장점을 실제로 확인할 수 있습니다. +편집기에서 이렇게 사용한다면, 모든 타입 검사와 자동완성 등 작성해야 하는 코드가 얼마나 적은지 보면서 FastAPI의 장점을 실제로 확인할 수 있습니다. --- @@ -77,4 +77,4 @@ $ pip install fastapi[all] 하지만 (지금 읽고 있는) **자습서 - 사용자 안내서**를 먼저 읽는게 좋습니다. -**자습서 - 사용자 안내서**만으로 완전한 애플리케이션을 구축한 다음, **고급 사용자 안내서**의 몇 가지 추가 아이디어를 사용하여 필요에 따라 다양한 방식으로 확장할 수 있도록 설계되었습니다. +**자습서 - 사용자 안내서**만으로도 완전한 애플리케이션을 구축할 수 있으며, 필요에 따라 **고급 사용자 안내서**에서 제공하는 몇 가지 추가적인 기능을 사용하여 다양한 방식으로 확장할 수 있도록 설계되었습니다. diff --git a/docs/ko/docs/tutorial/path-params-numeric-validations.md b/docs/ko/docs/tutorial/path-params-numeric-validations.md new file mode 100644 index 0000000000000..abb9d03dbb50c --- /dev/null +++ b/docs/ko/docs/tutorial/path-params-numeric-validations.md @@ -0,0 +1,122 @@ +# 경로 매개변수와 숫자 검증 + +`Query`를 사용하여 쿼리 매개변수에 더 많은 검증과 메타데이터를 선언하는 방법과 동일하게 `Path`를 사용하여 경로 매개변수에 검증과 메타데이터를 같은 타입으로 선언할 수 있습니다. + +## 경로 임포트 + +먼저 `fastapi`에서 `Path`를 임포트합니다: + +```Python hl_lines="3" +{!../../../docs_src/path_params_numeric_validations/tutorial001.py!} +``` + +## 메타데이터 선언 + +`Query`에 동일한 매개변수를 선언할 수 있습니다. + +예를 들어, `title` 메타데이터 값을 경로 매개변수 `item_id`에 선언하려면 다음과 같이 입력할 수 있습니다: + +```Python hl_lines="10" +{!../../../docs_src/path_params_numeric_validations/tutorial001.py!} +``` + +!!! note "참고" + 경로 매개변수는 경로의 일부여야 하므로 언제나 필수적입니다. + + 즉, `...`로 선언해서 필수임을 나타내는게 좋습니다. + + 그럼에도 `None`으로 선언하거나 기본값을 지정할지라도 아무 영향을 끼치지 않으며 언제나 필수입니다. + +## 필요한 경우 매개변수 정렬하기 + +`str` 형인 쿼리 매개변수 `q`를 필수로 선언하고 싶다고 해봅시다. + +해당 매개변수에 대해 아무런 선언을 할 필요가 없으므로 `Query`를 정말로 써야할 필요는 없습니다. + +하지만 `item_id` 경로 매개변수는 여전히 `Path`를 사용해야 합니다. + +파이썬은 "기본값"이 없는 값 앞에 "기본값"이 있는 값을 입력하면 불평합니다. + +그러나 매개변수들을 재정렬함으로써 기본값(쿼리 매개변수 `q`)이 없는 값을 처음 부분에 위치 할 수 있습니다. + +**FastAPI**에서는 중요하지 않습니다. 이름, 타입 그리고 선언구(`Query`, `Path` 등)로 매개변수를 감지하며 순서는 신경 쓰지 않습니다. + +따라서 함수를 다음과 같이 선언 할 수 있습니다: + +```Python hl_lines="8" +{!../../../docs_src/path_params_numeric_validations/tutorial002.py!} +``` + +## 필요한 경우 매개변수 정렬하기, 트릭 + +`Query`나 아무런 기본값으로도 `q` 경로 매개변수를 선언하고 싶지 않지만 `Path`를 사용하여 경로 매개변수를 `item_id` 다른 순서로 선언하고 싶다면, 파이썬은 이를 위한 작고 특별한 문법이 있습니다. + +`*`를 함수의 첫 번째 매개변수로 전달하세요. + +파이썬은 `*`으로 아무런 행동도 하지 않지만, 따르는 매개변수들은 kwargs로도 알려진 키워드 인자(키-값 쌍)여야 함을 인지합니다. 기본값을 가지고 있지 않더라도 그렇습니다. + +```Python hl_lines="8" +{!../../../docs_src/path_params_numeric_validations/tutorial003.py!} +``` + +## 숫자 검증: 크거나 같음 + +`Query`와 `Path`(나중에 볼 다른 것들도)를 사용하여 문자열 뿐만 아니라 숫자의 제약을 선언할 수 있습니다. + +여기서 `ge=1`인 경우, `item_id`는 `1`보다 "크거나(`g`reater) 같은(`e`qual)" 정수형 숫자여야 합니다. + +```Python hl_lines="8" +{!../../../docs_src/path_params_numeric_validations/tutorial004.py!} +``` + +## 숫자 검증: 크거나 같음 및 작거나 같음 + +동일하게 적용됩니다: + +* `gt`: 크거나(`g`reater `t`han) +* `le`: 작거나 같은(`l`ess than or `e`qual) + +```Python hl_lines="9" +{!../../../docs_src/path_params_numeric_validations/tutorial005.py!} +``` + +## 숫자 검증: 부동소수, 크거나 및 작거나 + +숫자 검증은 `float` 값에도 동작합니다. + +여기에서 ge뿐만 아니라 gt를 선언 할 수있는 것이 중요해집니다. 예를 들어 필요한 경우, 값이 `1`보다 작더라도 반드시 `0`보다 커야합니다. + +즉, `0.5`는 유효한 값입니다. 그러나 `0.0` 또는 `0`은 그렇지 않습니다. + +lt 역시 마찬가지입니다. + +```Python hl_lines="11" +{!../../../docs_src/path_params_numeric_validations/tutorial006.py!} +``` + +## 요약 + +`Query`, `Path`(아직 보지 못한 다른 것들도)를 사용하면 [쿼리 매개변수와 문자열 검증](query-params-str-validations.md){.internal-link target=_blank}에서와 마찬가지로 메타데이터와 문자열 검증을 선언할 수 있습니다. + +그리고 숫자 검증 또한 선언할 수 있습니다: + +* `gt`: 크거나(`g`reater `t`han) +* `ge`: 크거나 같은(`g`reater than or `e`qual) +* `lt`: 작거나(`l`ess `t`han) +* `le`: 작거나 같은(`l`ess than or `e`qual) + +!!! info "정보" + `Query`, `Path`, 그리고 나중에게 보게될 것들은 (여러분이 사용할 필요가 없는) 공통 `Param` 클래스의 서브 클래스입니다. + + 그리고 이들 모두는 여태까지 본 추가 검증과 메타데이터의 동일한 모든 매개변수를 공유합니다. + +!!! note "기술 세부사항" + `fastapi`에서 `Query`, `Path` 등을 임포트 할 때, 이것들은 실제로 함수입니다. + + 호출되면 동일한 이름의 클래스의 인스턴스를 반환합니다. + + 즉, 함수인 `Query`를 임포트한 겁니다. 그리고 호출하면 `Query`라는 이름을 가진 클래스의 인스턴스를 반환합니다. + + 편집기에서 타입에 대한 오류를 표시하지 않도록 하기 위해 (클래스를 직접 사용하는 대신) 이러한 함수들이 있습니다. + + 이렇게 하면 오류를 무시하기 위한 사용자 설정을 추가하지 않고도 일반 편집기와 코딩 도구를 사용할 수 있습니다. diff --git a/docs/ko/docs/tutorial/request-files.md b/docs/ko/docs/tutorial/request-files.md new file mode 100644 index 0000000000000..769a676cd82db --- /dev/null +++ b/docs/ko/docs/tutorial/request-files.md @@ -0,0 +1,144 @@ +# 파일 요청 + +`File`을 사용하여 클라이언트가 업로드할 파일들을 정의할 수 있습니다. + +!!! info "정보" + 업로드된 파일을 전달받기 위해 먼저 `python-multipart`를 설치해야합니다. + + 예시) `pip install python-multipart`. + + 업로드된 파일들은 "폼 데이터"의 형태로 전송되기 때문에 이 작업이 필요합니다. + +## `File` 임포트 + +`fastapi` 에서 `File` 과 `UploadFile` 을 임포트 합니다: + +```Python hl_lines="1" +{!../../../docs_src/request_files/tutorial001.py!} +``` + +## `File` 매개변수 정의 + +`Body` 및 `Form` 과 동일한 방식으로 파일의 매개변수를 생성합니다: + +```Python hl_lines="7" +{!../../../docs_src/request_files/tutorial001.py!} +``` + +!!! info "정보" + `File` 은 `Form` 으로부터 직접 상속된 클래스입니다. + + 하지만 `fastapi`로부터 `Query`, `Path`, `File` 등을 임포트 할 때, 이것들은 특별한 클래스들을 반환하는 함수라는 것을 기억하기 바랍니다. + +!!! tip "팁" + File의 본문을 선언할 때, 매개변수가 쿼리 매개변수 또는 본문(JSON) 매개변수로 해석되는 것을 방지하기 위해 `File` 을 사용해야합니다. + +파일들은 "폼 데이터"의 형태로 업로드 됩니다. + +*경로 작동 함수*의 매개변수를 `bytes` 로 선언하는 경우 **FastAPI**는 파일을 읽고 `bytes` 형태의 내용을 전달합니다. + +이것은 전체 내용이 메모리에 저장된다는 것을 의미한다는 걸 염두하기 바랍니다. 이는 작은 크기의 파일들에 적합합니다. + +어떤 경우에는 `UploadFile` 을 사용하는 것이 더 유리합니다. + +## `File` 매개변수와 `UploadFile` + +`File` 매개변수를 `UploadFile` 타입으로 정의합니다: + +```Python hl_lines="12" +{!../../../docs_src/request_files/tutorial001.py!} +``` + +`UploadFile` 을 사용하는 것은 `bytes` 과 비교해 다음과 같은 장점이 있습니다: + +* "스풀 파일"을 사용합니다. + * 최대 크기 제한까지만 메모리에 저장되며, 이를 초과하는 경우 디스크에 저장됩니다. +* 따라서 이미지, 동영상, 큰 이진코드와 같은 대용량 파일들을 많은 메모리를 소모하지 않고 처리하기에 적합합니다. +* 업로드 된 파일의 메타데이터를 얻을 수 있습니다. +* file-like `async` 인터페이스를 갖고 있습니다. +* file-like object를 필요로하는 다른 라이브러리에 직접적으로 전달할 수 있는 파이썬 `SpooledTemporaryFile` 객체를 반환합니다. + +### `UploadFile` + +`UploadFile` 은 다음과 같은 어트리뷰트가 있습니다: + +* `filename` : 문자열(`str`)로 된 업로드된 파일의 파일명입니다 (예: `myimage.jpg`). +* `content_type` : 문자열(`str`)로 된 파일 형식(MIME type / media type)입니다 (예: `image/jpeg`). +* `file` : `SpooledTemporaryFile` (파일류 객체)입니다. 이것은 "파일류" 객체를 필요로하는 다른 라이브러리에 직접적으로 전달할 수 있는 실질적인 파이썬 파일입니다. + +`UploadFile` 에는 다음의 `async` 메소드들이 있습니다. 이들은 내부적인 `SpooledTemporaryFile` 을 사용하여 해당하는 파일 메소드를 호출합니다. + +* `write(data)`: `data`(`str` 또는 `bytes`)를 파일에 작성합니다. +* `read(size)`: 파일의 바이트 및 글자의 `size`(`int`)를 읽습니다. +* `seek(offset)`: 파일 내 `offset`(`int`) 위치의 바이트로 이동합니다. + * 예) `await myfile.seek(0)` 를 사용하면 파일의 시작부분으로 이동합니다. + * `await myfile.read()` 를 사용한 후 내용을 다시 읽을 때 유용합니다. +* `close()`: 파일을 닫습니다. + +상기 모든 메소드들이 `async` 메소드이기 때문에 “await”을 사용하여야 합니다. + +예를들어, `async` *경로 작동 함수*의 내부에서 다음과 같은 방식으로 내용을 가져올 수 있습니다: + +```Python +contents = await myfile.read() +``` + +만약 일반적인 `def` *경로 작동 함수*의 내부라면, 다음과 같이 `UploadFile.file` 에 직접 접근할 수 있습니다: + +```Python +contents = myfile.file.read() +``` + +!!! note "`async` 기술적 세부사항" + `async` 메소드들을 사용할 때 **FastAPI**는 스레드풀에서 파일 메소드들을 실행하고 그들을 기다립니다. + +!!! note "Starlette 기술적 세부사항" + **FastAPI**의 `UploadFile` 은 **Starlette**의 `UploadFile` 을 직접적으로 상속받지만, **Pydantic** 및 FastAPI의 다른 부분들과의 호환성을 위해 필요한 부분들이 추가되었습니다. + +## "폼 데이터"란 + +HTML의 폼들(`
`)이 서버에 데이터를 전송하는 방식은 대개 데이터에 JSON과는 다른 "특별한" 인코딩을 사용합니다. + +**FastAPI**는 JSON 대신 올바른 위치에서 데이터를 읽을 수 있도록 합니다. + +!!! note "기술적 세부사항" + 폼의 데이터는 파일이 포함되지 않은 경우 일반적으로 "미디어 유형" `application/x-www-form-urlencoded` 을 사용해 인코딩 됩니다. + + 하지만 파일이 포함된 경우, `multipart/form-data`로 인코딩됩니다. `File`을 사용하였다면, **FastAPI**는 본문의 적합한 부분에서 파일을 가져와야 한다는 것을 인지합니다. + + 인코딩과 폼 필드에 대해 더 알고싶다면, POST에 관한MDN웹 문서 를 참고하기 바랍니다,. + +!!! warning "주의" + 다수의 `File` 과 `Form` 매개변수를 한 *경로 작동*에 선언하는 것이 가능하지만, 요청의 본문이 `application/json` 가 아닌 `multipart/form-data` 로 인코딩 되기 때문에 JSON으로 받아야하는 `Body` 필드를 함께 선언할 수는 없습니다. + + 이는 **FastAPI**의 한계가 아니라, HTTP 프로토콜에 의한 것입니다. + +## 다중 파일 업로드 + +여러 파일을 동시에 업로드 할 수 있습니다. + +그들은 "폼 데이터"를 사용하여 전송된 동일한 "폼 필드"에 연결됩니다. + +이 기능을 사용하기 위해 , `bytes` 의 `List` 또는 `UploadFile` 를 선언하기 바랍니다: + +```Python hl_lines="10 15" +{!../../../docs_src/request_files/tutorial002.py!} +``` + +선언한대로, `bytes` 의 `list` 또는 `UploadFile` 들을 전송받을 것입니다. + +!!! note "참고" + 2019년 4월 14일부터 Swagger UI가 하나의 폼 필드로 다수의 파일을 업로드하는 것을 지원하지 않습니다. 더 많은 정보를 원하면, #4276#3641을 참고하세요. + + 그럼에도, **FastAPI**는 표준 Open API를 사용해 이미 호환이 가능합니다. + + 따라서 Swagger UI 또는 기타 그 외의 OpenAPI를 지원하는 툴이 다중 파일 업로드를 지원하는 경우, 이들은 **FastAPI**와 호환됩니다. + +!!! note "기술적 세부사항" + `from starlette.responses import HTMLResponse` 역시 사용할 수 있습니다. + + **FastAPI**는 개발자의 편의를 위해 `fastapi.responses` 와 동일한 `starlette.responses` 도 제공합니다. 하지만 대부분의 응답들은 Starlette로부터 직접 제공됩니다. + +## 요약 + +폼 데이터로써 입력 매개변수로 업로드할 파일을 선언할 경우 `File` 을 사용하기 바랍니다. diff --git a/docs/ko/docs/tutorial/response-status-code.md b/docs/ko/docs/tutorial/response-status-code.md new file mode 100644 index 0000000000000..d201867a186b9 --- /dev/null +++ b/docs/ko/docs/tutorial/response-status-code.md @@ -0,0 +1,89 @@ +# 응답 상태 코드 + +응답 모델과 같은 방법으로, 어떤 *경로 작동*이든 `status_code` 매개변수를 사용하여 응답에 대한 HTTP 상태 코드를 선언할 수 있습니다. + +* `@app.get()` +* `@app.post()` +* `@app.put()` +* `@app.delete()` +* 기타 + +```Python hl_lines="6" +{!../../../docs_src/response_status_code/tutorial001.py!} +``` + +!!! note "참고" + `status_code` 는 "데코레이터" 메소드(`get`, `post` 등)의 매개변수입니다. 모든 매개변수들과 본문처럼 *경로 작동 함수*가 아닙니다. + +`status_code` 매개변수는 HTTP 상태 코드를 숫자로 입력받습니다. + +!!! info "정보" + `status_code` 는 파이썬의 `http.HTTPStatus` 와 같은 `IntEnum` 을 입력받을 수도 있습니다. + +`status_code` 매개변수는: + +* 응답에서 해당 상태 코드를 반환합니다. +* 상태 코드를 OpenAPI 스키마(및 사용자 인터페이스)에 문서화 합니다. + + + +!!! note "참고" + 어떤 응답 코드들은 해당 응답에 본문이 없다는 것을 의미하기도 합니다 (다음 항목 참고). + + 이에 따라 FastAPI는 응답 본문이 없음을 명시하는 OpenAPI를 생성합니다. + +## HTTP 상태 코드에 대하여 + +!!! note "참고" + 만약 HTTP 상태 코드에 대하여 이미 알고있다면, 다음 항목으로 넘어가십시오. + +HTTP는 세자리의 숫자 상태 코드를 응답의 일부로 전송합니다. + +이 상태 코드들은 각자를 식별할 수 있도록 지정된 이름이 있으나, 중요한 것은 숫자 코드입니다. + +요약하자면: + +* `**1xx**` 상태 코드는 "정보"용입니다. 이들은 직접적으로는 잘 사용되지는 않습니다. 이 상태 코드를 갖는 응답들은 본문을 가질 수 없습니다. +* `**2xx**` 상태 코드는 "성공적인" 응답을 위해 사용됩니다. 가장 많이 사용되는 유형입니다. + * `200` 은 디폴트 상태 코드로, 모든 것이 "성공적임"을 의미합니다. + * 다른 예로는 `201` "생성됨"이 있습니다. 일반적으로 데이터베이스에 새로운 레코드를 생성한 후 사용합니다. + * 단, `204` "내용 없음"은 특별한 경우입니다. 이것은 클라이언트에게 반환할 내용이 없는 경우 사용합니다. 따라서 응답은 본문을 가질 수 없습니다. +* `**3xx**` 상태 코드는 "리다이렉션"용입니다. 본문을 가질 수 없는 `304` "수정되지 않음"을 제외하고, 이 상태 코드를 갖는 응답에는 본문이 있을 수도, 없을 수도 있습니다. +* `**4xx**` 상태 코드는 "클라이언트 오류" 응답을 위해 사용됩니다. 이것은 아마 가장 많이 사용하게 될 두번째 유형입니다. + * 일례로 `404` 는 "찾을 수 없음" 응답을 위해 사용합니다. + * 일반적인 클라이언트 오류의 경우 `400` 을 사용할 수 있습니다. +* `**5xx**` 상태 코드는 서버 오류에 사용됩니다. 이것들을 직접 사용할 일은 거의 없습니다. 응용 프로그램 코드나 서버의 일부에서 문제가 발생하면 자동으로 이들 상태 코드 중 하나를 반환합니다. + +!!! tip "팁" + 각각의 상태 코드와 이들이 의미하는 내용에 대해 더 알고싶다면 MDN HTTP 상태 코드에 관한 문서 를 확인하십시오. + +## 이름을 기억하는 쉬운 방법 + +상기 예시 참고: + +```Python hl_lines="6" +{!../../../docs_src/response_status_code/tutorial001.py!} +``` + +`201` 은 "생성됨"를 의미하는 상태 코드입니다. + +하지만 모든 상태 코드들이 무엇을 의미하는지 외울 필요는 없습니다. + +`fastapi.status` 의 편의 변수를 사용할 수 있습니다. + +```Python hl_lines="1 6" +{!../../../docs_src/response_status_code/tutorial002.py!} +``` + +이것은 단순히 작업을 편리하게 하기 위한 것으로, HTTP 상태 코드와 동일한 번호를 갖고있지만, 이를 사용하면 편집기의 자동완성 기능을 사용할 수 있습니다: + + + +!!! note "기술적 세부사항" + `from starlette import status` 역시 사용할 수 있습니다. + + **FastAPI**는 개발자인 당신의 편의를 위해 `fastapi.status` 와 동일한 `starlette.status` 도 제공합니다. 하지만 이것은 Starlette로부터 직접 제공됩니다. + +## 기본값 변경 + +추후 여기서 선언하는 기본 상태 코드가 아닌 다른 상태 코드를 반환하는 방법을 [숙련된 사용자 지침서](https://fastapi.tiangolo.com/ko/advanced/response-change-status-code/){.internal-link target=_blank}에서 확인할 수 있습니다. diff --git a/docs/ko/mkdocs.yml b/docs/ko/mkdocs.yml index 762c5b45ab1c1..08bf9f5bce8f3 100644 --- a/docs/ko/mkdocs.yml +++ b/docs/ko/mkdocs.yml @@ -61,6 +61,9 @@ nav: - tutorial/path-params.md - tutorial/query-params.md - tutorial/header-params.md + - tutorial/path-params-numeric-validations.md + - tutorial/response-status-code.md + - tutorial/request-files.md - async.md markdown_extensions: - toc: diff --git a/docs/pt/docs/tutorial/query-params-str-validations.md b/docs/pt/docs/tutorial/query-params-str-validations.md new file mode 100644 index 0000000000000..baac5f4931549 --- /dev/null +++ b/docs/pt/docs/tutorial/query-params-str-validations.md @@ -0,0 +1,303 @@ +# Parâmetros de consulta e validações de texto + +O **FastAPI** permite que você declare informações adicionais e validações aos seus parâmetros. + +Vamos utilizar essa aplicação como exemplo: + +```Python hl_lines="9" +{!../../../docs_src/query_params_str_validations/tutorial001.py!} +``` + +O parâmetro de consulta `q` é do tipo `Optional[str]`, o que significa que é do tipo `str` mas que também pode ser `None`, e de fato, o valor padrão é `None`, então o FastAPI saberá que não é obrigatório. + +!!! note "Observação" + O FastAPI saberá que o valor de `q` não é obrigatório por causa do valor padrão `= None`. + + O `Optional` em `Optional[str]` não é usado pelo FastAPI, mas permitirá que seu editor lhe dê um melhor suporte e detecte erros. + +## Validação adicional + +Nós iremos forçar que mesmo o parâmetro `q` seja opcional, sempre que informado, **seu tamanho não exceda 50 caracteres**. + +### Importe `Query` + +Para isso, primeiro importe `Query` de `fastapi`: + +```Python hl_lines="3" +{!../../../docs_src/query_params_str_validations/tutorial002.py!} +``` + +## Use `Query` como o valor padrão + +Agora utilize-o como valor padrão do seu parâmetro, definindo o parâmetro `max_length` para 50: + +```Python hl_lines="9" +{!../../../docs_src/query_params_str_validations/tutorial002.py!} +``` + +Note que substituímos o valor padrão de `None` para `Query(None)`, o primeiro parâmetro de `Query` serve para o mesmo propósito: definir o valor padrão do parâmetro. + +Então: + +```Python +q: Optional[str] = Query(None) +``` + +...Torna o parâmetro opcional, da mesma maneira que: + +```Python +q: Optional[str] = None +``` + +Mas o declara explicitamente como um parâmetro de consulta. + +!!! info "Informação" + Tenha em mente que o FastAPI se preocupa com a parte: + + ```Python + = None + ``` + + Ou com: + + ```Python + = Query(None) + ``` + + E irá utilizar o `None` para detectar que o parâmetro de consulta não é obrigatório. + + O `Optional` é apenas para permitir que seu editor de texto lhe dê um melhor suporte. + +Então, podemos passar mais parâmetros para `Query`. Neste caso, o parâmetro `max_length` que se aplica a textos: + +```Python +q: str = Query(None, max_length=50) +``` + +Isso irá validar os dados, mostrar um erro claro quando os dados forem inválidos, e documentar o parâmetro na *operação de rota* do esquema OpenAPI.. + +## Adicionando mais validações + +Você também pode incluir um parâmetro `min_length`: + +```Python hl_lines="9" +{!../../../docs_src/query_params_str_validations/tutorial003.py!} +``` + +## Adicionando expressões regulares + +Você pode definir uma expressão regular que combine com um padrão esperado pelo parâmetro: + +```Python hl_lines="10" +{!../../../docs_src/query_params_str_validations/tutorial004.py!} +``` + +Essa expressão regular específica verifica se o valor recebido no parâmetro: + +* `^`: Inicia com os seguintes caracteres, ou seja, não contém caracteres anteriores. +* `fixedquery`: contém o valor exato `fixedquery`. +* `$`: termina aqui, não contém nenhum caractere após `fixedquery`. + +Se você se sente perdido com todo esse assunto de **"expressão regular"**, não se preocupe. Esse é um assunto complicado para a maioria das pessoas. Você ainda pode fazer muitas coisas sem utilizar expressões regulares. + +Mas assim que você precisar e já tiver aprendido sobre, saiba que você poderá usá-las diretamente no **FastAPI**. + +## Valores padrão + +Da mesma maneira que você utiliza `None` como o primeiro argumento para ser utilizado como um valor padrão, você pode usar outros valores. + +Vamos dizer que você queira que o parâmetro de consulta `q` tenha um `min_length` de `3`, e um valor padrão de `"fixedquery"`, então declararíamos assim: + +```Python hl_lines="7" +{!../../../docs_src/query_params_str_validations/tutorial005.py!} +``` + +!!! note "Observação" + O parâmetro torna-se opcional quando possui um valor padrão. + +## Torne-o obrigatório + +Quando você não necessita de validações ou de metadados adicionais, podemos fazer com que o parâmetro de consulta `q` seja obrigatório por não declarar um valor padrão, dessa forma: + +```Python +q: str +``` + +em vez desta: + +```Python +q: Optional[str] = None +``` + +Mas agora nós o estamos declarando como `Query`, conforme abaixo: + +```Python +q: Optional[str] = Query(None, min_length=3) +``` + +Então, quando você precisa declarar um parâmetro obrigatório utilizando o `Query`, você pode utilizar `...` como o primeiro argumento: + +```Python hl_lines="7" +{!../../../docs_src/query_params_str_validations/tutorial006.py!} +``` + +!!! info "Informação" + Se você nunca viu os `...` antes: é um valor único especial, faz parte do Python e é chamado "Ellipsis". + +Dessa forma o **FastAPI** saberá que o parâmetro é obrigatório. + +## Lista de parâmetros de consulta / múltiplos valores + +Quando você declara explicitamente um parâmetro com `Query` você pode declará-lo para receber uma lista de valores, ou podemos dizer, que irá receber mais de um valor. + +Por exemplo, para declarar que o parâmetro `q` pode aparecer diversas vezes na URL, você escreveria: + +```Python hl_lines="9" +{!../../../docs_src/query_params_str_validations/tutorial011.py!} +``` + +Então, com uma URL assim: + +``` +http://localhost:8000/items/?q=foo&q=bar +``` + +você receberá os múltiplos *parâmetros de consulta* `q` com os valores (`foo` e `bar`) em uma lista (`list`) Python dentro da *função de operação de rota*, no *parâmetro da função* `q`. + +Assim, a resposta para essa URL seria: + +```JSON +{ + "q": [ + "foo", + "bar" + ] +} +``` + +!!! tip "Dica" + Para declarar um parâmetro de consulta com o tipo `list`, como no exemplo acima, você precisa usar explicitamente o `Query`, caso contrário será interpretado como um corpo da requisição. + +A documentação interativa da API irá atualizar de acordo, permitindo múltiplos valores: + + + +### Lista de parâmetros de consulta / múltiplos valores por padrão + +E você também pode definir uma lista (`list`) de valores padrão caso nenhum seja informado: + +```Python hl_lines="9" +{!../../../docs_src/query_params_str_validations/tutorial012.py!} +``` + +Se você for até: + +``` +http://localhost:8000/items/ +``` + +O valor padrão de `q` será: `["foo", "bar"]` e sua resposta será: + +```JSON +{ + "q": [ + "foo", + "bar" + ] +} +``` + +#### Usando `list` + +Você também pode utilizar o tipo `list` diretamente em vez de `List[str]`: + +```Python hl_lines="7" +{!../../../docs_src/query_params_str_validations/tutorial013.py!} +``` + +!!! note "Observação" + Tenha em mente que neste caso, o FastAPI não irá validar os conteúdos da lista. + + Por exemplo, um `List[int]` iria validar (e documentar) que os contéudos da lista são números inteiros. Mas apenas `list` não. + +## Declarando mais metadados + +Você pode adicionar mais informações sobre o parâmetro. + +Essa informações serão inclusas no esquema do OpenAPI e utilizado pela documentação interativa e ferramentas externas. + +!!! note "Observação" + Tenha em mente que cada ferramenta oferece diferentes níveis de suporte ao OpenAPI. + + Algumas delas não exibem todas as informações extras que declaramos, ainda que na maioria dos casos, esses recursos estão planejados para desenvolvimento. + +Você pode adicionar um `title`: + +```Python hl_lines="10" +{!../../../docs_src/query_params_str_validations/tutorial007.py!} +``` + +E uma `description`: + +```Python hl_lines="13" +{!../../../docs_src/query_params_str_validations/tutorial008.py!} +``` + +## Apelidos (alias) de parâmetros + +Imagine que você queira que um parâmetro tenha o nome `item-query`. + +Desta maneira: + +``` +http://127.0.0.1:8000/items/?item-query=foobaritems +``` + +Mas o nome `item-query` não é um nome de váriavel válido no Python. + +O que mais se aproxima é `item_query`. + +Mas ainda você precisa que o nome seja exatamente `item-query`... + +Então você pode declarar um `alias`, e esse apelido (alias) que será utilizado para encontrar o valor do parâmetro: + +```Python hl_lines="9" +{!../../../docs_src/query_params_str_validations/tutorial009.py!} +``` + +## Parâmetros descontinuados + +Agora vamos dizer que você não queria mais utilizar um parâmetro. + +Você tem que deixá-lo ativo por um tempo, já que existem clientes o utilizando. Mas você quer que a documentação deixe claro que este parâmetro será descontinuado. + +Então você passa o parâmetro `deprecated=True` para `Query`: + +```Python hl_lines="18" +{!../../../docs_src/query_params_str_validations/tutorial010.py!} +``` + +Na documentação aparecerá assim: + + + +## Recapitulando + +Você pode adicionar validações e metadados adicionais aos seus parâmetros. + +Validações genéricas e metadados: + +* `alias` +* `title` +* `description` +* `deprecated` + +Validações específicas para textos: + +* `min_length` +* `max_length` +* `regex` + +Nesses exemplos você viu como declarar validações em valores do tipo `str`. + +Leia os próximos capítulos para ver como declarar validação de outros tipos, como números. diff --git a/docs/pt/mkdocs.yml b/docs/pt/mkdocs.yml index 219f41b81c573..ea4af852eb824 100644 --- a/docs/pt/mkdocs.yml +++ b/docs/pt/mkdocs.yml @@ -62,6 +62,7 @@ nav: - tutorial/first-steps.md - tutorial/path-params.md - tutorial/body-fields.md + - tutorial/query-params-str-validations.md - Segurança: - tutorial/security/index.md - Guia de Usuário Avançado: diff --git a/docs/tr/docs/python-types.md b/docs/tr/docs/python-types.md new file mode 100644 index 0000000000000..7e46bd0314dee --- /dev/null +++ b/docs/tr/docs/python-types.md @@ -0,0 +1,314 @@ +# Python Veri Tiplerine Giriş + +Python isteğe bağlı olarak "tip belirteçlerini" destekler. + + **"Tip belirteçleri"** bir değişkenin tipinin belirtilmesine olanak sağlayan özel bir sözdizimidir. + +Değişkenlerin tiplerini belirterek editör ve araçlardan daha fazla destek alabilirsiniz. + +Bu pythonda tip belirteçleri için **hızlı bir başlangıç / bilgi tazeleme** rehberidir . Bu rehber **FastAPI** kullanmak için gereken minimum konuyu kapsar ki bu da çok az bir miktardır. + +**FastAPI' nin** tamamı bu tür tip belirteçleri ile donatılmıştır ve birçok avantaj sağlamaktadır. + +**FastAPI** kullanmayacak olsanız bile tür belirteçleri hakkında bilgi edinmenizde fayda var. + +!!! not + Python uzmanıysanız ve tip belirteçleri ilgili her şeyi zaten biliyorsanız, sonraki bölüme geçin. + +## Motivasyon + +Basit bir örnek ile başlayalım: + +```Python +{!../../../docs_src/python_types/tutorial001.py!} +``` + +Programın çıktısı: + +``` +John Doe +``` + +Fonksiyon sırayla şunları yapar: + +* `first_name` ve `last_name` değerlerini alır. +* `title()` ile değişkenlerin ilk karakterlerini büyütür. +* Değişkenleri aralarında bir boşlukla beraber Birleştirir. + +```Python hl_lines="2" +{!../../../docs_src/python_types/tutorial001.py!} +``` + +### Düzenle + +Bu çok basit bir program. + +Ama şimdi sıfırdan yazdığınızı hayal edin. + +Bir noktada fonksiyonun tanımına başlayacaktınız, parametreleri hazır hale getirdiniz... + +Ama sonra "ilk harfi büyük harfe dönüştüren yöntemi" çağırmanız gerekir. + + `upper` mıydı ? Yoksa `uppercase`' mi? `first_uppercase`? `capitalize`? + +Ardından, programcıların en iyi arkadaşı olan otomatik tamamlama ile denediniz. + +'first_name', ardından bir nokta ('.') yazıp otomatik tamamlamayı tetiklemek için 'Ctrl+Space' tuşlarına bastınız. + +Ancak, ne yazık ki, yararlı hiçbir şey elde edemediniz: + + + +### Tipleri ekle + +Önceki sürümden sadece bir satırı değiştirelim. + +Tam olarak bu parçayı, işlevin parametrelerini değiştireceğiz: + +```Python + first_name, last_name +``` + +ve bu hale getireceğiz: + +```Python + first_name: str, last_name: str +``` + +Bu kadar. + +İşte bunlar "tip belirteçleri": + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial002.py!} +``` + +Bu, aşağıdaki gibi varsayılan değerleri bildirmekle aynı şey değildir: + +```Python + first_name="john", last_name="doe" +``` + +Bu tamamen farklı birşey + +İki nokta üst üste (`:`) kullanıyoruz , eşittir (`=`) değil. + +Normalde tip belirteçleri eklemek, kod üzerinde olacakları değiştirmez. + +Şimdi programı sıfırdan birdaha yazdığınızı hayal edin. + +Aynı noktada, `Ctrl+Space` ile otomatik tamamlamayı tetiklediniz ve şunu görüyorsunuz: + + + +Aradığınızı bulana kadar seçenekleri kaydırabilirsiniz: + + + +## Daha fazla motivasyon + +Bu fonksiyon, zaten tür belirteçlerine sahip: + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial003.py!} +``` + +Editör değişkenlerin tiplerini bildiğinden, yalnızca otomatik tamamlama değil, hata kontrolleri de sağlar: + + + +Artık `age` değişkenini `str(age)` olarak kullanmanız gerektiğini biliyorsunuz: + +```Python hl_lines="2" +{!../../../docs_src/python_types/tutorial004.py!} +``` + +## Tip bildirme + +Az önce tip belirteçlerinin en çok kullanıldığı yeri gördünüz. + + **FastAPI**ile çalışırken tip belirteçlerini en çok kullanacağımız yer yine fonksiyonlardır. + +### Basit tipler + +Yalnızca `str` değil, tüm standart Python tiplerinin bildirebilirsiniz. + +Örneğin şunları kullanabilirsiniz: + +* `int` +* `float` +* `bool` +* `bytes` + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial005.py!} +``` + +### Tip parametreleri ile Generic tipler + +"dict", "list", "set" ve "tuple" gibi diğer değerleri içerebilen bazı veri yapıları vardır. Ve dahili değerlerinin de tip belirtecleri olabilir. + +Bu tipleri ve dahili tpileri bildirmek için standart Python modülünü "typing" kullanabilirsiniz. + +Bu tür tip belirteçlerini desteklemek için özel olarak mevcuttur. + +#### `List` + +Örneğin `str` değerlerden oluşan bir `list` tanımlayalım. + +From `typing`, import `List` (büyük harf olan `L` ile): + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial006.py!} +``` + +Değişkenin tipini yine iki nokta üstüste (`:`) ile belirleyin. + +tip olarak `List` kullanın. + +Liste, bazı dahili tipleri içeren bir tür olduğundan, bunları köşeli parantez içine alırsınız: + +```Python hl_lines="4" +{!../../../docs_src/python_types/tutorial006.py!} +``` + +!!! ipucu + Köşeli parantez içindeki bu dahili tiplere "tip parametreleri" denir. + + Bu durumda `str`, `List`e iletilen tür parametresidir. + +Bunun anlamı şudur: "`items` değişkeni bir `list`tir ve bu listedeki öğelerin her biri bir `str`dir". + +Bunu yaparak, düzenleyicinizin listedeki öğeleri işlerken bile destek sağlamasını sağlayabilirsiniz: + + + +Tip belirteçleri olmadan, bunu başarmak neredeyse imkansızdır. + +`item` değişkeninin `items` listesindeki öğelerden biri olduğuna dikkat edin. + +Ve yine, editör bunun bir `str` ​​olduğunu biliyor ve bunun için destek sağlıyor. + +#### `Tuple` ve `Set` + +`Tuple` ve `set`lerin tiplerini bildirmek için de aynısını yapıyoruz: + +```Python hl_lines="1 4" +{!../../../docs_src/python_types/tutorial007.py!} +``` + +Bu şu anlama geliyor: + +* `items_t` değişkeni sırasıyla `int`, `int`, ve `str` tiplerinden oluşan bir `tuple` türündedir . +* `items_s` ise her öğesi `bytes` türünde olan bir `set` örneğidir. + +#### `Dict` + +Bir `dict` tanımlamak için virgülle ayrılmış iki parametre verebilirsiniz. + +İlk tip parametresi `dict` değerinin `key` değeri içindir. + +İkinci parametre ise `dict` değerinin `value` değeri içindir: + +```Python hl_lines="1 4" +{!../../../docs_src/python_types/tutorial008.py!} +``` + +Bu şu anlama gelir: + +* `prices` değişkeni `dict` tipindedir: + * `dict` değişkeninin `key` değeri `str` tipindedir (herbir item'ın "name" değeri). + * `dict` değişkeninin `value` değeri `float` tipindedir (lherbir item'ın "price" değeri). + +#### `Optional` + +`Optional` bir değişkenin `str`gibi bir tipi olabileceğini ama isteğe bağlı olarak tipinin `None` olabileceğini belirtir: + +```Python hl_lines="1 4" +{!../../../docs_src/python_types/tutorial009.py!} +``` + +`str` yerine `Optional[str]` kullanmak editorün bu değerin her zaman `str` tipinde değil bazen `None` tipinde de olabileceğini belirtir ve hataları tespit etmemizde yardımcı olur. + +#### Generic tipler + +Köşeli parantez içinde tip parametreleri alan bu türler, örneğin: + +* `List` +* `Tuple` +* `Set` +* `Dict` +* `Optional` +* ...and others. + +**Generic types** yada **Generics** olarak adlandırılır. + +### Tip olarak Sınıflar + +Bir değişkenin tipini bir sınıf ile bildirebilirsiniz. + +Diyelim ki `name` değerine sahip `Person` sınıfınız var: + +```Python hl_lines="1-3" +{!../../../docs_src/python_types/tutorial010.py!} +``` + +Sonra bir değişkeni 'Person' tipinde tanımlayabilirsiniz: + +```Python hl_lines="6" +{!../../../docs_src/python_types/tutorial010.py!} +``` + +Ve yine bütün editör desteğini alırsınız: + + + +## Pydantic modelleri + +Pydantic veri doğrulaması yapmak için bir Python kütüphanesidir. + +Verilerin "biçimini" niteliklere sahip sınıflar olarak düzenlersiniz. + +Ve her niteliğin bir türü vardır. + +Sınıfın bazı değerlerle bir örneğini oluşturursunuz ve değerleri doğrular, bunları uygun türe dönüştürür ve size tüm verileri içeren bir nesne verir. + +Ve ortaya çıkan nesne üzerindeki bütün editör desteğini alırsınız. + +Resmi Pydantic dokümanlarından alınmıştır: + +```Python +{!../../../docs_src/python_types/tutorial011.py!} +``` + +!!! info + Daha fazla şey öğrenmek için Pydantic'i takip edin. + +**FastAPI** tamamen Pydantic'e dayanmaktadır. + +Daha fazlasini görmek için [Tutorial - User Guide](tutorial/index.md){.internal-link target=_blank}. + +## **FastAPI** tip belirteçleri + +**FastAPI** birkaç şey yapmak için bu tür tip belirteçlerinden faydalanır. + +**FastAPI** ile parametre tiplerini bildirirsiniz ve şunları elde edersiniz: + +* **Editor desteği**. +* **Tip kontrolü**. + +...ve **FastAPI** aynı belirteçleri şunlar için de kullanıyor: + +* **Gereksinimleri tanımlama**: request path parameters, query parameters, headers, bodies, dependencies, ve benzeri gereksinimlerden +* **Verileri çevirme**: Gönderilen veri tipinden istenilen veri tipine çevirme. +* **Verileri doğrulama**: Her gönderilen verinin: + * doğrulanması ve geçersiz olduğunda **otomatik hata** oluşturma. +* OpenAPI kullanarak apinizi **Belgeleyin** : + * bu daha sonra otomatik etkileşimli dokümantasyon kullanıcı arayüzü tarafından kullanılır. + +Bütün bunlar kulağa soyut gelebilir. Merak etme. Tüm bunları çalışırken göreceksiniz. [Tutorial - User Guide](tutorial/index.md){.internal-link target=_blank}. + +Önemli olan, standart Python türlerini tek bir yerde kullanarak (daha fazla sınıf, dekoratör vb. eklemek yerine), **FastAPI**'nin bizim için işi yapmasını sağlamak. + +!!! info + Tüm öğreticiyi zaten okuduysanız ve türler hakkında daha fazla bilgi için geri döndüyseniz, iyi bir kaynak: the "cheat sheet" from `mypy`. diff --git a/docs/tr/mkdocs.yml b/docs/tr/mkdocs.yml index 6fe2b0b626c75..5ef8fd6a75bff 100644 --- a/docs/tr/mkdocs.yml +++ b/docs/tr/mkdocs.yml @@ -57,6 +57,7 @@ nav: - zh: /zh/ - features.md - fastapi-people.md +- python-types.md markdown_extensions: - toc: permalink: true