# Renvoyer directement une réponse { #return-a-response-directly }
Lorsque vous créez une *opération de chemins***FastAPI**, vous pouvez normalement retourner n'importe quelle donnée : un `dict`, une `list`, un modèle Pydantic, un modèle de base de données, etc.
Lorsque vous créez une *opération de chemins***FastAPI**, vous pouvez normalement retourner n'importe quelle donnée : un `dict`, une `list`, un modèle Pydantic, un modèle de base de données, etc.
@ -10,7 +10,7 @@ Mais vous pouvez retourner une `JSONResponse` directement à partir de vos *opé
Cela peut être utile, par exemple, pour retourner des en-têtes personnalisés ou des cookies.
Cela peut être utile, par exemple, pour retourner des en-têtes personnalisés ou des cookies.
## Renvoyer une `Response`
## Renvoyer une `Response` { #return-a-response }
En fait, vous pouvez retourner n'importe quelle `Response` ou n'importe quelle sous-classe de celle-ci.
En fait, vous pouvez retourner n'importe quelle `Response` ou n'importe quelle sous-classe de celle-ci.
@ -26,7 +26,7 @@ Elle ne fera aucune conversion de données avec les modèles Pydantic, elle ne c
Cela vous donne beaucoup de flexibilité. Vous pouvez retourner n'importe quel type de données, surcharger n'importe quelle déclaration ou validation de données.
Cela vous donne beaucoup de flexibilité. Vous pouvez retourner n'importe quel type de données, surcharger n'importe quelle déclaration ou validation de données.
## Utiliser le `jsonable_encoder` dans une `Response`
## Utiliser le `jsonable_encoder` dans une `Response` { #using-the-jsonable-encoder-in-a-response }
Parce que **FastAPI** n'apporte aucune modification à une `Response` que vous retournez, vous devez vous assurer que son contenu est prêt à être utilisé (sérialisable).
Parce que **FastAPI** n'apporte aucune modification à une `Response` que vous retournez, vous devez vous assurer que son contenu est prêt à être utilisé (sérialisable).
@ -34,7 +34,7 @@ Par exemple, vous ne pouvez pas mettre un modèle Pydantic dans une `JSONRespons
Pour ces cas, vous pouvez spécifier un appel à `jsonable_encoder` pour convertir vos données avant de les passer à une réponse :
Pour ces cas, vous pouvez spécifier un appel à `jsonable_encoder` pour convertir vos données avant de les passer à une réponse :
## Renvoyer une `Response` personnalisée { #returning-a-custom-response }
L'exemple ci-dessus montre toutes les parties dont vous avez besoin, mais il n'est pas encore très utile, car vous auriez pu retourner l'`item` directement, et **FastAPI** l'aurait mis dans une `JSONResponse` pour vous, en le convertissant en `dict`, etc. Tout cela par défaut.
L'exemple ci-dessus montre toutes les parties dont vous avez besoin, mais il n'est pas encore très utile, car vous auriez pu retourner l'`item` directement, et **FastAPI** l'aurait mis dans une `JSONResponse` pour vous, en le convertissant en `dict`, etc. Tout cela par défaut.
@ -54,9 +54,9 @@ Disons que vous voulez retourner une réponse <a href="https://en.wikipedia.org/
Vous pouvez mettre votre contenu XML dans une chaîne de caractères, la placer dans une `Response`, et la retourner :
Vous pouvez mettre votre contenu XML dans une chaîne de caractères, la placer dans une `Response`, et la retourner :
C'est le framework Python le plus populaire et il bénéficie d'une grande confiance. Il est utilisé pour construire
C'est le framework Python le plus populaire et il bénéficie d'une grande confiance. Il est utilisé pour construire
des systèmes tel qu'Instagram.
des systèmes tel qu'Instagram.
@ -28,7 +28,7 @@ stockage.
Il a été créé pour générer le HTML en backend, pas pour créer des API consommées par un frontend moderne (comme React, Vue.js et Angular) ou par d'autres systèmes (comme les appareils <abbrtitle="Internet of Things">IoT</abbr>) communiquant avec lui.
Il a été créé pour générer le HTML en backend, pas pour créer des API consommées par un frontend moderne (comme React, Vue.js et Angular) ou par d'autres systèmes (comme les appareils <abbrtitle="Internet of Things">IoT</abbr>) communiquant avec lui.
Django REST framework a été conçu comme une boîte à outils flexible permettant de construire des API Web à partir de Django, afin d'améliorer ses capacités en matière d'API.
Django REST framework a été conçu comme une boîte à outils flexible permettant de construire des API Web à partir de Django, afin d'améliorer ses capacités en matière d'API.
@ -49,7 +49,7 @@ Avoir une interface de documentation automatique de l'API.
Ces mêmes générateurs full-stack ont servi de base aux [Générateurs de projets pour **FastAPI**](project-generation.md){.internal-link target=\_blank}.
Ces mêmes générateurs full-stack ont servi de base aux [Générateurs de projets pour **FastAPI**](project-generation.md){.internal-link target=_blank}.
/// info
/// info
@ -258,7 +258,7 @@ Générer le schéma OpenAPI automatiquement, à partir du même code qui défin
///
///
### <ahref="https://nestjs.com/"class="external-link"target="_blank">NestJS</a> (et <ahref="https://angular.io/"class="external-link"target="_blank">Angular</a>)
### <ahref="https://nestjs.com/"class="external-link"target="_blank">NestJS</a> (et <ahref="https://angular.io/"class="external-link"target="_blank">Angular</a>) { #nestjs-and-angular }
Ce n'est même pas du Python, NestJS est un framework JavaScript (TypeScript) NodeJS inspiré d'Angular.
Ce n'est même pas du Python, NestJS est un framework JavaScript (TypeScript) NodeJS inspiré d'Angular.
@ -281,7 +281,7 @@ Disposer d'un puissant système d'injection de dépendances. Trouver un moyen de
Falcon est un autre framework Python haute performance, il est conçu pour être minimal, et est utilisé comme fondation pour d'autres frameworks comme Hug.
Falcon est un autre framework Python haute performance, il est conçu pour être minimal, et est utilisé comme fondation pour d'autres frameworks comme Hug.
@ -323,7 +323,7 @@ Bien que dans FastAPI, il est facultatif, et est utilisé principalement pour d
Hug a été l'un des premiers frameworks à implémenter la déclaration des types de paramètres d'API en utilisant les type hints Python. C'était une excellente idée qui a inspiré d'autres outils à faire de même.
Hug a été l'un des premiers frameworks à implémenter la déclaration des types de paramètres d'API en utilisant les type hints Python. C'était une excellente idée qui a inspiré d'autres outils à faire de même.
@ -383,7 +383,7 @@ Hug a inspiré **FastAPI** pour déclarer un paramètre `response` dans les fonc
Pydantic est une bibliothèque permettant de définir la validation, la sérialisation et la documentation des données (à l'aide de JSON Schema) en se basant sur les Python type hints.
Pydantic est une bibliothèque permettant de définir la validation, la sérialisation et la documentation des données (à l'aide de JSON Schema) en se basant sur les Python type hints.
@ -452,7 +452,7 @@ Gérer toute la validation des données, leur sérialisation et la documentation
Starlette est un framework/toolkit léger <abbrtitle="Le nouveau standard pour construire des applications web asynchrones en Python">ASGI</abbr>, qui est idéal pour construire des services asyncio performants.
Starlette est un framework/toolkit léger <abbrtitle="Le nouveau standard pour construire des applications web asynchrones en Python">ASGI</abbr>, qui est idéal pour construire des services asyncio performants.
@ -498,7 +498,7 @@ Ainsi, tout ce que vous pouvez faire avec Starlette, vous pouvez le faire direct
Uvicorn est un serveur ASGI rapide comme l'éclair, basé sur uvloop et httptools.
Uvicorn est un serveur ASGI rapide comme l'éclair, basé sur uvloop et httptools.
@ -517,6 +517,6 @@ Pour plus de détails, consultez la section [Déploiement](deployment/index.md){
///
///
## Benchmarks et vitesse
## Benchmarks et vitesse { #benchmarks-and-speed }
Pour comprendre, comparer et voir la différence entre Uvicorn, Starlette et FastAPI, consultez la section sur les [Benchmarks](benchmarks.md){.internal-link target=\_blank}.
Pour comprendre, comparer et voir la différence entre Uvicorn, Starlette et FastAPI, consultez la section sur les [Benchmarks](benchmarks.md){.internal-link target=_blank}.
Les tests de performance de TechEmpower montrent que les applications **FastAPI** tournant sous Uvicorn comme <ahref="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7"class="external-link"target="_blank">étant l'un des frameworks Python les plus rapides disponibles</a>, seulement inférieur à Starlette et Uvicorn (tous deux utilisés au cœur de FastAPI). (*)
Les tests de performance de TechEmpower montrent que les applications **FastAPI** tournant sous Uvicorn comme <ahref="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7"class="external-link"target="_blank">étant l'un des frameworks Python les plus rapides disponibles</a>, seulement inférieur à Starlette et Uvicorn (tous deux utilisés au cœur de FastAPI). (*)
Mais en prêtant attention aux tests de performance et aux comparaisons, il faut tenir compte de ce qu'il suit.
Mais en prêtant attention aux tests de performance et aux comparaisons, il faut tenir compte de ce qu'il suit.
## Tests de performance et rapidité
## Tests de performance et rapidité { #benchmarks-and-speed }
Lorsque vous vérifiez les tests de performance, il est commun de voir plusieurs outils de différents types comparés comme équivalents.
Lorsque vous vérifiez les tests de performance, il est commun de voir plusieurs outils de différents types comparés comme équivalents.
## Fonctionnalités de FastAPI { #fastapi-features }
**FastAPI** vous offre ceci:
**FastAPI** vous offre ceci:
### Basé sur des standards ouverts
### Basé sur des standards ouverts { #based-on-open-standards }
* <ahref="https://github.com/OAI/OpenAPI-Specification"class="external-link"target="_blank"><strong>OpenAPI</strong></a> pour la création d'API, incluant la déclaration de <abbrtitle="en français: routes. Aussi connu sous le nom anglais endpoints ou routes">path</abbr><abbrtitle="Aussi connu sous le nom de méthodes HTTP. À savoir POST, GET, PUT, DELETE">operations</abbr>, paramètres, corps de requêtes, sécurité, etc.
* <ahref="https://github.com/OAI/OpenAPI-Specification"class="external-link"target="_blank"><strong>OpenAPI</strong></a> pour la création d'API, incluant la déclaration de <abbrtitle="en français: routes. Aussi connu sous le nom anglais endpoints ou routes">path</abbr><abbrtitle="Aussi connu sous le nom de méthodes HTTP. À savoir POST, GET, PUT, DELETE">operations</abbr>, paramètres, corps de requêtes, sécurité, etc.
* Documentation automatique des modèles de données avec <ahref="http://json-schema.org/"class="external-link"target="_blank"><strong>JSON Schema</strong></a> (comme OpenAPI est aussi basée sur JSON Schema).
* Documentation automatique des modèles de données avec <ahref="https://json-schema.org/"class="external-link"target="_blank"><strong>JSON Schema</strong></a> (comme OpenAPI est aussi basée sur JSON Schema).
* Conçue avec ces standards après une analyse méticuleuse. Plutôt qu'en rajoutant des surcouches après coup.
* Conçue avec ces standards après une analyse méticuleuse. Plutôt qu'en rajoutant des surcouches après coup.
* Cela permet d'utiliser de la **génération automatique de code client** dans beaucoup de langages.
* Cela permet d'utiliser de la **génération automatique de code client** dans beaucoup de langages.
### Documentation automatique
### Documentation automatique { #automatic-docs }
Documentation d'API interactive et interface web d'exploration. Comme le framework est basé sur OpenAPI, de nombreuses options sont disponibles. Deux d'entre-elles sont incluses par défaut.
Documentation d'API interactive et interface web d'exploration. Comme le framework est basé sur OpenAPI, de nombreuses options sont disponibles. Deux d'entre-elles sont incluses par défaut.
@ -23,7 +23,7 @@ Documentation d'API interactive et interface web d'exploration. Comme le framewo
### Faite en python moderne { #just-modern-python }
Tout est basé sur la déclaration de type standard de **Python 3.8** (grâce à Pydantic). Pas de nouvelles syntaxes à apprendre. Juste du Python standard et moderne.
Tout est basé sur la déclaration de type standard de **Python 3.8** (grâce à Pydantic). Pas de nouvelles syntaxes à apprendre. Juste du Python standard et moderne.
@ -70,7 +70,7 @@ Utilise les clés et valeurs du dictionnaire `second_user_data` directement comm
///
///
### Support d'éditeurs
### Support d'éditeurs { #editor-support }
Tout le framework a été conçu pour être facile et intuitif d'utilisation, toutes les décisions de design ont été testées sur de nombreux éditeurs avant même de commencer le développement final afin d'assurer la meilleure expérience de développement possible.
Tout le framework a été conçu pour être facile et intuitif d'utilisation, toutes les décisions de design ont été testées sur de nombreux éditeurs avant même de commencer le développement final afin d'assurer la meilleure expérience de développement possible.
@ -94,13 +94,13 @@ Vous aurez des propositions de complétion que vous n'auriez jamais imaginées.
Plus jamais vous ne vous tromperez en tapant le nom d'une clé, vous ne ferez des aller-retour entre votre code et la documentation ou vous ne scrollerez de haut en bas afin d'enfin savoir si vous devez taper `username` ou `user_name`.
Plus jamais vous ne vous tromperez en tapant le nom d'une clé, vous ne ferez des aller-retour entre votre code et la documentation ou vous ne scrollerez de haut en bas afin d'enfin savoir si vous devez taper `username` ou `user_name`.
### Court
### Court { #short }
Des **valeurs par défaut** sont définies pour tout, des configurations optionnelles sont présentent partout. Tous ces paramètres peuvent être ajustés afin de faire ce que vous voulez et définir l'API dont vous avez besoin.
Des **valeurs par défaut** sont définies pour tout, des configurations optionnelles sont présentent partout. Tous ces paramètres peuvent être ajustés afin de faire ce que vous voulez et définir l'API dont vous avez besoin.
Mais, **tout fonctionne** par défaut.
Mais, **tout fonctionne** par défaut.
### Validation
### Validation { #validation }
* Validation pour la plupart (ou tous?) les **types de données** Python incluant:
* Validation pour la plupart (ou tous?) les **types de données** Python incluant:
* objets JSON (`dict`).
* objets JSON (`dict`).
@ -116,7 +116,7 @@ Mais, **tout fonctionne** par défaut.
Toutes les validations sont gérées par le bien établi et robuste **Pydantic**.
Toutes les validations sont gérées par le bien établi et robuste **Pydantic**.
### Sécurité et authentification
### Sécurité et authentification { #security-and-authentication }
La sécurité et l'authentification sont intégrées. Sans aucun compromis avec les bases de données ou les modèles de données.
La sécurité et l'authentification sont intégrées. Sans aucun compromis avec les bases de données ou les modèles de données.
@ -133,7 +133,7 @@ Plus toutes les fonctionnalités de sécurités venant de Starlette (incluant le
Le tout conçu en composant réutilisable facilement intégrable à vos systèmes, data stores, base de données relationnelle ou NoSQL, etc.
Le tout conçu en composant réutilisable facilement intégrable à vos systèmes, data stores, base de données relationnelle ou NoSQL, etc.
### Injection de dépendances
### Injection de dépendances { #dependency-injection }
FastAPI contient un système simple mais extrêmement puissant d'<abbrtitle='aussi connus sous le nom de "composants", "ressources", "services", "providers"'><strong>Injection de Dépendances</strong></abbr>.
FastAPI contient un système simple mais extrêmement puissant d'<abbrtitle='aussi connus sous le nom de "composants", "ressources", "services", "providers"'><strong>Injection de Dépendances</strong></abbr>.
@ -144,19 +144,19 @@ FastAPI contient un système simple mais extrêmement puissant d'<abbr title='au
* Supporte les systèmes d'authentification d'utilisateurs complexes, les **connexions de base de données**, etc.
* Supporte les systèmes d'authentification d'utilisateurs complexes, les **connexions de base de données**, etc.
* **Aucun compromis** avec les bases de données, les frontends, etc. Mais une intégration facile avec n'importe lequel d'entre eux.
* **Aucun compromis** avec les bases de données, les frontends, etc. Mais une intégration facile avec n'importe lequel d'entre eux.
### "Plug-ins" illimités
### "Plug-ins" illimités { #unlimited-plug-ins }
Ou, en d'autres termes, pas besoin d'eux, importez le code que vous voulez et utilisez le.
Ou, en d'autres termes, pas besoin d'eux, importez le code que vous voulez et utilisez le.
Tout intégration est conçue pour être si simple à utiliser (avec des dépendances) que vous pouvez créer un "plug-in" pour votre application en deux lignes de code utilisant la même syntaxe que celle de vos *path operations*
Tout intégration est conçue pour être si simple à utiliser (avec des dépendances) que vous pouvez créer un "plug-in" pour votre application en deux lignes de code utilisant la même syntaxe que celle de vos *path operations*
### Testé
### Testé { #tested }
* 100% <abbrtitle="La quantité de code qui est testé automatiquement">de couverture de test</abbr>.
* 100% <abbrtitle="La quantité de code qui est testé automatiquement">de couverture de test</abbr>.
* 100% <abbrtitle="Annotation de types Python, avec cela votre éditeur et autres outils externes peuvent vous fournir un meilleur support">d'annotations de type</abbr> dans le code.
* 100% <abbrtitle="Annotation de types Python, avec cela votre éditeur et autres outils externes peuvent vous fournir un meilleur support">d'annotations de type</abbr> dans le code.
* Utilisé dans des applications mises en production.
* Utilisé dans des applications mises en production.
## Fonctionnalités de Starlette
## Fonctionnalités de Starlette { #starlette-features }
**FastAPI** est complètement compatible (et basé sur) <ahref="https://www.starlette.dev/"class="external-link"target="_blank"><strong>Starlette</strong></a>. Le code utilisant Starlette que vous ajouterez fonctionnera donc aussi.
**FastAPI** est complètement compatible (et basé sur) <ahref="https://www.starlette.dev/"class="external-link"target="_blank"><strong>Starlette</strong></a>. Le code utilisant Starlette que vous ajouterez fonctionnera donc aussi.
@ -175,7 +175,7 @@ Avec **FastAPI** vous aurez toutes les fonctionnalités de **Starlette** (FastAP
* Une couverture de test à 100 %.
* Une couverture de test à 100 %.
* 100 % de la base de code avec des annotations de type.
* 100 % de la base de code avec des annotations de type.
## Fonctionnalités de Pydantic
## Fonctionnalités de Pydantic { #pydantic-features }
**FastAPI** est totalement compatible avec (et basé sur) <ahref="https://docs.pydantic.dev/"class="external-link"target="_blank"><strong>Pydantic</strong></a>. Le code utilisant Pydantic que vous ajouterez fonctionnera donc aussi.
**FastAPI** est totalement compatible avec (et basé sur) <ahref="https://docs.pydantic.dev/"class="external-link"target="_blank"><strong>Pydantic</strong></a>. Le code utilisant Pydantic que vous ajouterez fonctionnera donc aussi.
# Histoire, conception et avenir { #history-design-and-future }
Il y a quelque temps, <ahref="https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920"class="external-link"target="_blank">un utilisateur de **FastAPI** a demandé</a> :
Il y a quelque temps, <ahref="https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920"class="external-link"target="_blank">un utilisateur de **FastAPI** a demandé</a> :
@ -6,7 +6,7 @@ Il y a quelque temps, <a href="https://github.com/fastapi/fastapi/issues/3#issue
Voici un petit bout de cette histoire.
Voici un petit bout de cette histoire.
## Alternatives
## Alternatives { #alternatives }
Je crée des API avec des exigences complexes depuis plusieurs années (Machine Learning, systèmes distribués, jobs asynchrones, bases de données NoSQL, etc), en dirigeant plusieurs équipes de développeurs.
Je crée des API avec des exigences complexes depuis plusieurs années (Machine Learning, systèmes distribués, jobs asynchrones, bases de données NoSQL, etc), en dirigeant plusieurs équipes de développeurs.
@ -14,7 +14,7 @@ Dans ce cadre, j'ai dû étudier, tester et utiliser de nombreuses alternatives.
L'histoire de **FastAPI** est en grande partie l'histoire de ses prédécesseurs.
L'histoire de **FastAPI** est en grande partie l'histoire de ses prédécesseurs.
Comme dit dans la section [Alternatives](alternatives.md){.internal-link target=\_blank} :
Comme dit dans la section [Alternatives](alternatives.md){.internal-link target=_blank} :
<blockquotemarkdown="1">
<blockquotemarkdown="1">
@ -28,7 +28,7 @@ Mais à un moment donné, il n'y avait pas d'autre option que de créer quelque
</blockquote>
</blockquote>
## Recherche
## Recherche { #investigation }
En utilisant toutes les alternatives précédentes, j'ai eu la chance d'apprendre de toutes, de prendre des idées, et de les combiner de la meilleure façon que j'ai pu trouver pour moi-même et les équipes de développeurs avec lesquelles j'ai travaillé.
En utilisant toutes les alternatives précédentes, j'ai eu la chance d'apprendre de toutes, de prendre des idées, et de les combiner de la meilleure façon que j'ai pu trouver pour moi-même et les équipes de développeurs avec lesquelles j'ai travaillé.
@ -38,7 +38,7 @@ De plus, la meilleure approche était d'utiliser des normes déjà existantes.
Ainsi, avant même de commencer à coder **FastAPI**, j'ai passé plusieurs mois à étudier les spécifications d'OpenAPI, JSON Schema, OAuth2, etc. Comprendre leurs relations, leurs similarités et leurs différences.
Ainsi, avant même de commencer à coder **FastAPI**, j'ai passé plusieurs mois à étudier les spécifications d'OpenAPI, JSON Schema, OAuth2, etc. Comprendre leurs relations, leurs similarités et leurs différences.
## Conception
## Conception { #design }
Ensuite, j'ai passé du temps à concevoir l'"API" de développeur que je voulais avoir en tant qu'utilisateur (en tant que développeur utilisant FastAPI).
Ensuite, j'ai passé du temps à concevoir l'"API" de développeur que je voulais avoir en tant qu'utilisateur (en tant que développeur utilisant FastAPI).
@ -52,7 +52,7 @@ Ainsi, j'ai pu trouver les meilleurs moyens de réduire autant que possible la d
Le tout de manière à offrir la meilleure expérience de développement à tous les développeurs.
Le tout de manière à offrir la meilleure expérience de développement à tous les développeurs.
## Exigences
## Exigences { #requirements }
Après avoir testé plusieurs alternatives, j'ai décidé que j'allais utiliser <ahref="https://docs.pydantic.dev/"class="external-link"target="_blank">**Pydantic**</a> pour ses avantages.
Après avoir testé plusieurs alternatives, j'ai décidé que j'allais utiliser <ahref="https://docs.pydantic.dev/"class="external-link"target="_blank">**Pydantic**</a> pour ses avantages.
@ -60,11 +60,11 @@ J'y ai ensuite contribué, pour le rendre entièrement compatible avec JSON Sche
Pendant le développement, j'ai également contribué à <ahref="https://www.starlette.dev/"class="external-link"target="_blank">**Starlette**</a>, l'autre exigence clé.
Pendant le développement, j'ai également contribué à <ahref="https://www.starlette.dev/"class="external-link"target="_blank">**Starlette**</a>, l'autre exigence clé.
## Développement
## Développement { #development }
Au moment où j'ai commencé à créer **FastAPI** lui-même, la plupart des pièces étaient déjà en place, la conception était définie, les exigences et les outils étaient prêts, et la connaissance des normes et des spécifications était claire et fraîche.
Au moment où j'ai commencé à créer **FastAPI** lui-même, la plupart des pièces étaient déjà en place, la conception était définie, les exigences et les outils étaient prêts, et la connaissance des normes et des spécifications était claire et fraîche.
## Futur
## Futur { #future }
À ce stade, il est déjà clair que **FastAPI** et ses idées sont utiles pour de nombreuses personnes.
À ce stade, il est déjà clair que **FastAPI** et ses idées sont utiles pour de nombreuses personnes.
@ -76,4 +76,4 @@ Mais il y a encore de nombreuses améliorations et fonctionnalités à venir.
**FastAPI** a un grand avenir devant lui.
**FastAPI** a un grand avenir devant lui.
Et [votre aide](help-fastapi.md){.internal-link target=\_blank} est grandement appréciée.
Et [votre aide](help-fastapi.md){.internal-link target=_blank} est grandement appréciée.
Vous pouvez définir des tâches d'arrière-plan qui seront exécutées après avoir retourné une réponse.
Vous pouvez définir des tâches d'arrière-plan qui seront exécutées après avoir retourné une réponse.
@ -12,15 +12,15 @@ Cela comprend, par exemple :
* Par exemple, si vous recevez un fichier qui doit passer par un traitement lent, vous pouvez retourner une réponse «Accepted» (HTTP 202) puis faire le traitement en arrière-plan.
* Par exemple, si vous recevez un fichier qui doit passer par un traitement lent, vous pouvez retourner une réponse «Accepted» (HTTP 202) puis faire le traitement en arrière-plan.
## Ajouter une tâche d'arrière-plan { #add-the-background-task }
Dans votre *fonction de chemin*, passez votre fonction de tâche à l'objet de type `BackgroundTasks` (`background_tasks` ici) grâce à la méthode `.add_task()` :
Dans votre *fonction de chemin*, passez votre fonction de tâche à l'objet de type `BackgroundTasks` (`background_tasks` ici) grâce à la méthode `.add_task()` :
@ -45,13 +45,13 @@ Dans votre *fonction de chemin*, passez votre fonction de tâche à l'objet de t
* Les arguments positionnels à passer à la fonction de tâche dans l'ordre (`email`).
* Les arguments positionnels à passer à la fonction de tâche dans l'ordre (`email`).
* Les arguments nommés à passer à la fonction de tâche (`message="some notification"`).
* Les arguments nommés à passer à la fonction de tâche (`message="some notification"`).
## Injection de dépendances
## Injection de dépendances { #dependency-injection }
Utiliser `BackgroundTasks` fonctionne aussi avec le système d'injection de dépendances. Vous pouvez déclarer un paramètre de type `BackgroundTasks` à différents niveaux : dans une *fonction de chemin*, dans une dépendance, dans une sous-dépendance...
Utiliser `BackgroundTasks` fonctionne aussi avec le système d'injection de dépendances. Vous pouvez déclarer un paramètre de type `BackgroundTasks` à différents niveaux : dans une *fonction de chemin*, dans une dépendance, dans une sous-dépendance...
**FastAPI** sait quoi faire dans chaque cas et comment réutiliser le même objet, afin que tous les paramètres de type `BackgroundTasks` soient fusionnés et que les tâches soient exécutées en arrière-plan :
**FastAPI** sait quoi faire dans chaque cas et comment réutiliser le même objet, afin que tous les paramètres de type `BackgroundTasks` soient fusionnés et que les tâches soient exécutées en arrière-plan :
Dans cet exemple, les messages seront écrits dans le fichier `log.txt` après que la réponse soit envoyée.
Dans cet exemple, les messages seront écrits dans le fichier `log.txt` après que la réponse soit envoyée.
@ -59,7 +59,7 @@ S'il y avait une `query` (paramètre nommé `q`) dans la requête, alors elle se
Et ensuite une autre tâche d'arrière-plan (générée dans les paramètres de la *la fonction de chemin*) écrira un message dans `log.txt` comprenant le paramètre de chemin `email`.
Et ensuite une autre tâche d'arrière-plan (générée dans les paramètres de la *la fonction de chemin*) écrira un message dans `log.txt` comprenant le paramètre de chemin `email`.
## Détails techniques
## Détails techniques { #technical-details }
La classe `BackgroundTasks` provient directement de <ahref="https://www.starlette.dev/background/"class="external-link"target="_blank">`starlette.background`</a>.
La classe `BackgroundTasks` provient directement de <ahref="https://www.starlette.dev/background/"class="external-link"target="_blank">`starlette.background`</a>.
@ -71,7 +71,7 @@ Il est tout de même possible d'utiliser `BackgroundTask` seul dans **FastAPI**,
Plus de détails sont disponibles dans <ahref="https://www.starlette.dev/background/"class="external-link"target="_blank">la documentation officielle de Starlette sur les tâches d'arrière-plan</a> (via leurs classes `BackgroundTasks`et `BackgroundTask`).
Plus de détails sont disponibles dans <ahref="https://www.starlette.dev/background/"class="external-link"target="_blank">la documentation officielle de Starlette sur les tâches d'arrière-plan</a> (via leurs classes `BackgroundTasks`et `BackgroundTask`).
## Avertissement
## Avertissement { #caveat }
Si vous avez besoin de réaliser des traitements lourds en tâche d'arrière-plan et que vous n'avez pas besoin que ces traitements aient lieu dans le même process (par exemple, pas besoin de partager la mémoire, les variables, etc.), il peut s'avérer profitable d'utiliser des outils plus importants tels que <ahref="https://docs.celeryq.dev"class="external-link"target="_blank">Celery</a>.
Si vous avez besoin de réaliser des traitements lourds en tâche d'arrière-plan et que vous n'avez pas besoin que ces traitements aient lieu dans le même process (par exemple, pas besoin de partager la mémoire, les variables, etc.), il peut s'avérer profitable d'utiliser des outils plus importants tels que <ahref="https://docs.celeryq.dev"class="external-link"target="_blank">Celery</a>.
@ -79,6 +79,6 @@ Ces outils nécessitent généralement des configurations plus complexes ainsi q
Mais si vous avez besoin d'accéder aux variables et objets de la même application **FastAPI**, ou si vous avez besoin d'effectuer de petites tâches d'arrière-plan (comme envoyer des notifications par email), vous pouvez simplement vous contenter d'utiliser `BackgroundTasks`.
Mais si vous avez besoin d'accéder aux variables et objets de la même application **FastAPI**, ou si vous avez besoin d'effectuer de petites tâches d'arrière-plan (comme envoyer des notifications par email), vous pouvez simplement vous contenter d'utiliser `BackgroundTasks`.
## Résumé
## Résumé { #recap }
Importez et utilisez `BackgroundTasks` grâce aux paramètres de *fonction de chemin* et les dépendances pour ajouter des tâches d'arrière-plan.
Importez et utilisez `BackgroundTasks` grâce aux paramètres de *fonction de chemin* et les dépendances pour ajouter des tâches d'arrière-plan.
Tout comme pour la déclaration de paramètres de requête, quand un attribut de modèle a une valeur par défaut, il n'est pas nécessaire. Sinon, cet attribut doit être renseigné dans le corps de la requête. Pour rendre ce champ optionnel simplement, utilisez `None` comme valeur par défaut.
Tout comme pour la déclaration de paramètres de requête, quand un attribut de modèle a une valeur par défaut, il n'est pas nécessaire. Sinon, cet attribut doit être renseigné dans le corps de la requête. Pour rendre ce champ optionnel simplement, utilisez `None` comme valeur par défaut.
@ -54,15 +54,15 @@ Par exemple, le modèle ci-dessus déclare un "objet" JSON (ou `dict` Python) te
}
}
```
```
## Déclarez-le comme paramètre
## Déclarez-le comme paramètre { #declare-it-as-a-parameter }
Pour l'ajouter à votre *opération de chemin*, déclarez-le comme vous déclareriez des paramètres de chemin ou de requête :
Pour l'ajouter à votre *opération de chemin*, déclarez-le comme vous déclareriez des paramètres de chemin ou de requête :
...et déclarez que son type est le modèle que vous avez créé : `Item`.
...et déclarez que son type est le modèle que vous avez créé : `Item`.
## Résultats
## Résultats { #results }
En utilisant uniquement les déclarations de type Python, **FastAPI** réussit à :
En utilisant uniquement les déclarations de type Python, **FastAPI** réussit à :
@ -75,7 +75,7 @@ En utilisant uniquement les déclarations de type Python, **FastAPI** réussit
* Générer des définitions <ahref="https://json-schema.org"class="external-link"target="_blank">JSON Schema</a> pour votre modèle, qui peuvent être utilisées où vous en avez besoin dans votre projet ensuite.
* Générer des définitions <ahref="https://json-schema.org"class="external-link"target="_blank">JSON Schema</a> pour votre modèle, qui peuvent être utilisées où vous en avez besoin dans votre projet ensuite.
* Ces schémas participeront à la constitution du schéma généré OpenAPI, et seront donc utilisés par les documentations automatiquement générées.
* Ces schémas participeront à la constitution du schéma généré OpenAPI, et seront donc utilisés par les documentations automatiquement générées.
## Documentation automatique
## Documentation automatique { #automatic-docs }
Les schémas JSON de vos modèles seront intégrés au schéma OpenAPI global de votre application, et seront donc affichés dans la documentation interactive de l'API :
Les schémas JSON de vos modèles seront intégrés au schéma OpenAPI global de votre application, et seront donc affichés dans la documentation interactive de l'API :
@ -85,7 +85,7 @@ Et seront aussi utilisés dans chaque *opération de chemin* de la documentation
<imgsrc="/img/tutorial/body/image02.png">
<imgsrc="/img/tutorial/body/image02.png">
## Support de l'éditeur
## Support de l'éditeur { #editor-support }
Dans votre éditeur, vous aurez des annotations de types et de l'auto-complétion partout dans votre fonction (ce qui n'aurait pas été le cas si vous aviez utilisé un classique `dict` plutôt qu'un modèle Pydantic) :
Dans votre éditeur, vous aurez des annotations de types et de l'auto-complétion partout dans votre fonction (ce qui n'aurait pas été le cas si vous aviez utilisé un classique `dict` plutôt qu'un modèle Pydantic) :
@ -121,27 +121,27 @@ Ce qui améliore le support pour les modèles Pydantic avec :
///
///
## Utilisez le modèle
## Utilisez le modèle { #use-the-model }
Dans la fonction, vous pouvez accéder à tous les attributs de l'objet du modèle directement :
Dans la fonction, vous pouvez accéder à tous les attributs de l'objet du modèle directement :
{* ../../docs_src/body/tutorial002.py hl[21] *}
{* ../../docs_src/body/tutorial002_py310.py *}
## Corps de la requête + paramètres de chemin
## Corps de la requête + paramètres de chemin { #request-body-path-parameters }
Vous pouvez déclarer des paramètres de chemin et un corps de requête pour la même *opération de chemin*.
Vous pouvez déclarer des paramètres de chemin et un corps de requête pour la même *opération de chemin*.
**FastAPI** est capable de reconnaître que les paramètres de la fonction qui correspondent aux paramètres de chemin doivent être **récupérés depuis le chemin**, et que les paramètres de fonctions déclarés comme modèles Pydantic devraient être **récupérés depuis le corps de la requête**.
**FastAPI** est capable de reconnaître que les paramètres de la fonction qui correspondent aux paramètres de chemin doivent être **récupérés depuis le chemin**, et que les paramètres de fonctions déclarés comme modèles Pydantic devraient être **récupérés depuis le corps de la requête**.
Les paramètres de la fonction seront reconnus comme tel :
Les paramètres de la fonction seront reconnus comme tel :
@ -157,6 +157,6 @@ Le type `Optional` dans `Optional[str]` n'est pas utilisé par **FastAPI**, mais
///
///
## Sans Pydantic
## Sans Pydantic { #without-pydantic }
Si vous ne voulez pas utiliser des modèles Pydantic, vous pouvez aussi utiliser des paramètres de **Corps**. Pour cela, allez voir la partie de la documentation sur [Corps de la requête - Paramètres multiples](body-multiple-params.md){.internal-link target=_blank}.
Si vous ne voulez pas utiliser des modèles Pydantic, vous pouvez aussi utiliser des paramètres de **Corps**. Pour cela, allez voir la partie de la documentation sur [Corps de la requête - Paramètres multiples](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank}.
* API作成のための<ahref="https://github.com/OAI/OpenAPI-Specification"class="external-link"target="_blank"><strong>OpenAPI</strong></a>。これは、<abbrtitle="also known as: endpoints, routes">path</abbr><abbrtitle="also known as HTTP methods, as POST, GET, PUT, DELETE">operations</abbr>の宣言、パラメータ、ボディリクエスト、セキュリティなどを含んでいます。
* API作成のための<ahref="https://github.com/OAI/OpenAPI-Specification"class="external-link"target="_blank"><strong>OpenAPI</strong></a>。これは、<abbrtitle="also known as: endpoints, routes">path</abbr><abbrtitle="also known as HTTP methods, as POST, GET, PUT, DELETE">operations</abbr>の宣言、パラメータ、ボディリクエスト、セキュリティなどを含んでいます。
* Pydanticでは「ISO 8601 time diff encoding」として表現することも可能です。<ahref="https://docs.pydantic.dev/latest/concepts/serialization/"class="external-link"target="_blank">詳細はドキュメントを参照してください</a>。
* Pydanticでは「ISO 8601 time diff encoding」として表現することも可能です。<ahref="https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers"class="external-link"target="_blank">詳細はドキュメントを参照してください</a>。
* `frozenset`:
* `frozenset`:
* リクエストとレスポンスでは`set`と同じように扱われます:
* リクエストとレスポンスでは`set`と同じように扱われます:
* リクエストでは、リストが読み込まれ、重複を排除して`set`に変換されます。
* リクエストでは、リストが読み込まれ、重複を排除して`set`に変換されます。
@ -50,13 +50,13 @@
* Pythonの標準的な`Decimal`です。
* Pythonの標準的な`Decimal`です。
* リクエストやレスポンスでは`float`と同じように扱います。
* リクエストやレスポンスでは`float`と同じように扱います。
* Pydanticの全ての有効な型はこちらで確認できます: <ahref="https://docs.pydantic.dev/latest/concepts/types/"class="external-link"target="_blank">Pydantic data types</a>。
* Pydanticの全ての有効な型はこちらで確認できます: <ahref="https://docs.pydantic.dev/latest/usage/types/types/"class="external-link"target="_blank">Pydantic data types</a>。
то теперь у нас есть `dict` с данными модели в переменной `user_dict` (это `dict` вместо объекта Pydantic-модели).
то теперь у нас есть `dict` с данными модели в переменной `user_dict` (это `dict` вместо объекта Pydantic-модели).
@ -106,14 +106,14 @@ UserInDB(
Как в примере выше мы получили `user_dict` из `user_in.dict()`, этот код:
Как в примере выше мы получили `user_dict` из `user_in.dict()`, этот код:
```Python
```Python
user_dict = user_in.dict()
user_dict = user_in.model_dump()
UserInDB(**user_dict)
UserInDB(**user_dict)
```
```
будет равнозначен такому:
будет равнозначен такому:
```Python
```Python
UserInDB(**user_in.dict())
UserInDB(**user_in.model_dump())
```
```
...потому что `user_in.dict()` - это `dict`, и затем мы указываем, чтобы Python его "распаковал", когда передаём его в `UserInDB` и ставим перед ним `**`.
...потому что `user_in.dict()` - это `dict`, и затем мы указываем, чтобы Python его "распаковал", когда передаём его в `UserInDB` и ставим перед ним `**`.
@ -125,7 +125,7 @@ UserInDB(**user_in.dict())
И затем, если мы добавим дополнительный именованный аргумент `hashed_password=hashed_password` как здесь:
И затем, если мы добавим дополнительный именованный аргумент `hashed_password=hashed_password` как здесь:
[Tutorial - User Guide: Security](../../tutorial/security/index.md){.internal-link target=_blank} sayfasında ele alınanların dışında güvenlikle ilgili bazı ek özellikler vardır.
[Tutorial - User Guide: Security](../../tutorial/security/index.md){.internal-link target=_blank} sayfasında ele alınanların dışında güvenlikle ilgili bazı ek özellikler vardır.
@ -12,7 +12,7 @@ Kullanım şeklinize bağlı olarak, çözümünüz bu bölümlerden birinde ola
///
///
## Önce Öğreticiyi Okuyun
## Önce Öğreticiyi Okuyun { #read-the-tutorial-first }
Sonraki bölümler [Tutorial - User Guide: Security](../../tutorial/security/index.md){.internal-link target=_blank} sayfasını okuduğunuzu varsayarak hazırlanmıştır.
Sonraki bölümler [Tutorial - User Guide: Security](../../tutorial/security/index.md){.internal-link target=_blank} sayfasını okuduğunuzu varsayarak hazırlanmıştır.
Daha fazla detay için Starlette'in <ahref="https://www.starlette.dev/staticfiles/"class="external-link"target="_blank">Websockets'i Test Etmek</a> dokümantasyonunu inceleyin.
Daha fazla detay için Starlette'in <ahref="https://www.starlette.dev/testclient/#testing-websocket-sessions"class="external-link"target="_blank">Websockets'i Test Etmek</a> dokümantasyonunu inceleyin.
Artık `/v1/` yolunun altındaki her istek Flask uygulaması tarafından işlenecektir.
Artık `/v1/` yolunun altındaki her istek Flask uygulaması tarafından işlenecektir.
@ -26,7 +26,7 @@ Eğer uygulamanızı çalıştırıp <a href="http://localhost:8000/v1/" class="
Hello, World from Flask!
Hello, World from Flask!
```
```
Eğer <ahref="http://localhost:8000/v2/"class="external-link"target="_blank">http://localhost:8000/v2/</a> adresine giderseniz, FastAPI'dan gelen yanıtı göreceksiniz:
Eğer <ahref="http://localhost:8000/v2"class="external-link"target="_blank">http://localhost:8000/v2/</a> adresine giderseniz, FastAPI'dan gelen yanıtı göreceksiniz:
# Alternatifler, İlham Kaynakları ve Karşılaştırmalar
# Alternatifler, İlham Kaynakları ve Karşılaştırmalar { #alternatives-inspiration-and-comparisons }
**FastAPI**'ya neler ilham verdi? Diğer alternatiflerle karşılaştırıldığında farkları neler? **FastAPI** diğer alternatiflerinden neler öğrendi?
**FastAPI**'ya neler ilham verdi? Diğer alternatiflerle karşılaştırıldığında farkları neler? **FastAPI** diğer alternatiflerinden neler öğrendi?
## Giriş
## Giriş { #intro }
Başkalarının daha önceki çalışmaları olmasaydı, **FastAPI** var olmazdı.
Başkalarının daha önceki çalışmaları olmasaydı, **FastAPI** var olmazdı.
@ -12,9 +12,9 @@ Yıllardır yeni bir framework oluşturmaktan kaçınıyordum. Başlangıçta **
Ancak bir noktada, geçmişteki diğer araçlardan en iyi fikirleri alarak bütün bu çözümleri kapsayan, ayrıca bütün bunları Python'ın daha önce mevcut olmayan özelliklerini (Python 3.6+ ile gelen <abbrtitle="Tip belirteçleri: Type Hints">tip belirteçleri</abbr>) kullanarak yapan bir şey üretmekten başka seçenek kalmamıştı.
Ancak bir noktada, geçmişteki diğer araçlardan en iyi fikirleri alarak bütün bu çözümleri kapsayan, ayrıca bütün bunları Python'ın daha önce mevcut olmayan özelliklerini (Python 3.6+ ile gelen <abbrtitle="Tip belirteçleri: Type Hints">tip belirteçleri</abbr>) kullanarak yapan bir şey üretmekten başka seçenek kalmamıştı.
## Daha Önce Geliştirilen Araçlar
## Daha Önce Geliştirilen Araçlar { #previous-tools }
Django geniş çapta güvenilen, Python ekosistemindeki en popüler web framework'üdür. Instagram gibi sistemleri geliştirmede kullanılmıştır.
Django geniş çapta güvenilen, Python ekosistemindeki en popüler web framework'üdür. Instagram gibi sistemleri geliştirmede kullanılmıştır.
@ -22,7 +22,7 @@ MySQL ve PostgreSQL gibi ilişkisel veritabanlarıyla nispeten sıkı bir şekil
Modern ön uçlarda (React, Vue.js ve Angular gibi) veya diğer sistemler (örneğin <abbrtitle="Nesnelerin interneti: IoT (Internet of Things)">nesnelerin interneti</abbr> cihazları) tarafından kullanılan API'lar yerine arka uçta HTML üretmek için oluşturuldu.
Modern ön uçlarda (React, Vue.js ve Angular gibi) veya diğer sistemler (örneğin <abbrtitle="Nesnelerin interneti: IoT (Internet of Things)">nesnelerin interneti</abbr> cihazları) tarafından kullanılan API'lar yerine arka uçta HTML üretmek için oluşturuldu.
Flask bir <abbrtitle="Mikro Framework: Micro Framework">mikro framework</abbr> olduğundan Django gibi framework'lerin aksine veritabanı entegrasyonu gibi Django ile gelen pek çok özelliği direkt barındırmaz.
Flask bir <abbrtitle="Mikro Framework: Micro Framework">mikro framework</abbr> olduğundan Django gibi framework'lerin aksine veritabanı entegrasyonu gibi Django ile gelen pek çok özelliği direkt barındırmaz.
@ -64,7 +64,7 @@ Basit ve kullanması kolay bir <abbr title="Yönlendirme: Routing">yönlendirme
Pek çok Flask REST framework'ü var, fakat bunları biraz araştırdıktan sonra pek çoğunun artık geliştirilmediğini ve göze batan bazı sorunlarının olduğunu gördüm.
Pek çok Flask REST framework'ü var, fakat bunları biraz araştırdıktan sonra pek çoğunun artık geliştirilmediğini ve göze batan bazı sorunlarının olduğunu gördüm.
API sistemlerine gereken ana özelliklerden biri de koddan veriyi alıp ağ üzerinde gönderilebilecek bir şeye çevirmek, yani veri <abbrtitle="Dönüşüm: serialization, marshalling olarak da biliniyor">dönüşümü</abbr>. Bu işleme veritabanındaki veriyi içeren bir objeyi JSON objesine çevirmek, `datetime` objelerini metinlere çevirmek gibi örnekler verilebilir.
API sistemlerine gereken ana özelliklerden biri de koddan veriyi alıp ağ üzerinde gönderilebilecek bir şeye çevirmek, yani veri <abbrtitle="Dönüşüm: serialization, marshalling olarak da biliniyor">dönüşümü</abbr>. Bu işleme veritabanındaki veriyi içeren bir objeyi JSON objesine çevirmek, `datetime` objelerini metinlere çevirmek gibi örnekler verilebilir.
@ -153,7 +153,7 @@ Kod kullanarak otomatik olarak veri tipini ve veri doğrulamayı belirten "şema
API'ların ihtiyacı olan bir diğer önemli özellik ise gelen isteklerdeki verileri Python objelerine <abbrtitle="Parsing: dönüştürmek, ayrıştırmak, çözümlemek">ayrıştırabilmektir</abbr>.
API'ların ihtiyacı olan bir diğer önemli özellik ise gelen isteklerdeki verileri Python objelerine <abbrtitle="Parsing: dönüştürmek, ayrıştırmak, çözümlemek">ayrıştırabilmektir</abbr>.
@ -175,7 +175,7 @@ Gelen istek verisi için otomatik veri doğrulamaya sahip olmalı.
Hug, Python tip belirteçlerini kullanarak API parametrelerinin tipini belirlemeyi uygulayan ilk framework'lerdendi. Bu, diğer araçlara da ilham kaynağı olan harika bir fikirdi.
Hug, Python tip belirteçlerini kullanarak API parametrelerinin tipini belirlemeyi uygulayan ilk framework'lerdendi. Bu, diğer araçlara da ilham kaynağı olan harika bir fikirdi.
@ -349,7 +349,7 @@ Hug, APIStar'ın çeşitli kısımlarında esin kaynağı oldu ve APIStar'la bir
**FastAPI**'ı geliştirmeye başlamadan hemen önce **APIStar** sunucusunu buldum. Benim aradığım şeylerin neredeyse hepsine sahipti ve harika bir tasarımı vardı.
**FastAPI**'ı geliştirmeye başlamadan hemen önce **APIStar** sunucusunu buldum. Benim aradığım şeylerin neredeyse hepsine sahipti ve harika bir tasarımı vardı.
@ -397,9 +397,9 @@ Ben bu önceki araçlardan öğrendiklerime dayanarak **FastAPI**'ın özellikle
///
///
## **FastAPI** Tarafından Kullanılanlar
## **FastAPI** Tarafından Kullanılanlar { #used-by-fastapi }
Starlette hafif bir <abbrtitle="ASGI (Asynchronous Server Gateway Interface): Asenkron Sunucu Ağ Geçidi Arabirimi, asenkron Python web uygulamaları geliştirmek için yeni standart.">ASGI</abbr> framework'ü ve yüksek performanslı asyncio servisleri oluşturmak için ideal.
Starlette hafif bir <abbrtitle="ASGI (Asynchronous Server Gateway Interface): Asenkron Sunucu Ağ Geçidi Arabirimi, asenkron Python web uygulamaları geliştirmek için yeni standart.">ASGI</abbr> framework'ü ve yüksek performanslı asyncio servisleri oluşturmak için ideal.
@ -460,7 +460,7 @@ Yani, Starlette ile yapabileceğiniz her şeyi, Starlette'in bir nevi güçlendi
Uvicorn, uvlook ile httptools üzerine kurulu ışık hzında bir ASGI sunucusudur.
Uvicorn, uvlook ile httptools üzerine kurulu ışık hzında bir ASGI sunucusudur.
@ -478,6 +478,6 @@ Daha fazla detay için [Deployment](deployment/index.md){.internal-link target=_
///
///
## Karşılaştırma ve Hız
## Karşılaştırma ve Hız { #benchmarks-and-speed }
Uvicorn, Starlette ve FastAPI arasındakı farkı daha iyi anlamak ve karşılaştırma yapmak için [Kıyaslamalar](benchmarks.md){.internal-link target=_blank} bölümüne bakın!
Uvicorn, Starlette ve FastAPI arasındakı farkı daha iyi anlamak ve karşılaştırma yapmak için [Kıyaslamalar](benchmarks.md){.internal-link target=_blank} bölümüne bakın!
Bağımsız TechEmpower kıyaslamaları gösteriyor ki <ahref="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7"class="external-link"target="_blank">en hızlı Python frameworklerinden birisi</a> olan Uvicorn ile çalıştırılan **FastAPI** uygulamaları, sadece Starlette ve Uvicorn'dan daha düşük sıralamada (FastAPI bu frameworklerin üzerine kurulu) yer alıyor. (*)
Bağımsız TechEmpower kıyaslamaları gösteriyor ki <ahref="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7"class="external-link"target="_blank">en hızlı Python frameworklerinden birisi</a> olan Uvicorn ile çalıştırılan **FastAPI** uygulamaları, sadece Starlette ve Uvicorn'dan daha düşük sıralamada (FastAPI bu frameworklerin üzerine kurulu) yer alıyor. (*)
Fakat kıyaslamaları ve karşılaştırmaları incelerken şunları aklınızda bulundurmalısınız.
Fakat kıyaslamaları ve karşılaştırmaları incelerken şunları aklınızda bulundurmalısınız.
## Kıyaslamalar ve Hız
## Kıyaslamalar ve Hız { #benchmarks-and-speed }
Kıyaslamaları incelediğinizde, farklı özelliklere sahip araçların eşdeğer olarak karşılaştırıldığını yaygın bir şekilde görebilirsiniz.
Kıyaslamaları incelediğinizde, farklı özelliklere sahip araçların eşdeğer olarak karşılaştırıldığını yaygın bir şekilde görebilirsiniz.
# Geçmişi, Tasarımı ve Geleceği { #history-design-and-future }
Bir süre önce, <ahref="https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920"class="external-link"target="_blank">bir **FastAPI** kullanıcısı sordu</a>:
Bir süre önce, <ahref="https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920"class="external-link"target="_blank">bir **FastAPI** kullanıcısı sordu</a>:
@ -6,7 +6,7 @@ Bir süre önce, <a href="https://github.com/fastapi/fastapi/issues/3#issuecomme
İşte o geçmişin bir kısmı.
İşte o geçmişin bir kısmı.
## Alternatifler
## Alternatifler { #alternatives }
Bir süredir karmaşık gereksinimlere sahip API'lar oluşturuyor (Makine Öğrenimi, dağıtık sistemler, asenkron işler, NoSQL veritabanları vb.) ve farklı geliştirici ekiplerini yönetiyorum.
Bir süredir karmaşık gereksinimlere sahip API'lar oluşturuyor (Makine Öğrenimi, dağıtık sistemler, asenkron işler, NoSQL veritabanları vb.) ve farklı geliştirici ekiplerini yönetiyorum.
@ -28,7 +28,7 @@ Ancak bir noktada, geçmişteki diğer araçlardan en iyi fikirleri alarak büt
</blockquote>
</blockquote>
## Araştırma
## Araştırma { #investigation }
Önceki alternatifleri kullanarak hepsinden bir şeyler öğrenip, fikirler alıp, bunları kendim ve çalıştığım geliştirici ekipler için en iyi şekilde birleştirebilme şansım oldu.
Önceki alternatifleri kullanarak hepsinden bir şeyler öğrenip, fikirler alıp, bunları kendim ve çalıştığım geliştirici ekipler için en iyi şekilde birleştirebilme şansım oldu.
@ -38,7 +38,7 @@ Ayrıca, en iyi yaklaşım zaten mevcut olan standartları kullanmaktı.
Sonuç olarak, **FastAPI**'ı kodlamaya başlamadan önce, birkaç ay boyunca OpenAPI, JSON Schema, OAuth2 ve benzerlerinin tanımlamalarını inceledim. İlişkilerini, örtüştükleri noktaları ve farklılıklarını anlamaya çalıştım.
Sonuç olarak, **FastAPI**'ı kodlamaya başlamadan önce, birkaç ay boyunca OpenAPI, JSON Schema, OAuth2 ve benzerlerinin tanımlamalarını inceledim. İlişkilerini, örtüştükleri noktaları ve farklılıklarını anlamaya çalıştım.
## Tasarım
## Tasarım { #design }
Sonrasında, (**FastAPI** kullanan bir geliştirici olarak) sahip olmak istediğim "API"ı tasarlamak için biraz zaman harcadım.
Sonrasında, (**FastAPI** kullanan bir geliştirici olarak) sahip olmak istediğim "API"ı tasarlamak için biraz zaman harcadım.
@ -52,7 +52,7 @@ Bu şekilde, kod tekrarını mümkün olduğunca azaltmak, her yerde <abbr title
Hepsi, tüm geliştiriciler için en iyi geliştirme deneyimini sağlayacak şekilde.
Hepsi, tüm geliştiriciler için en iyi geliştirme deneyimini sağlayacak şekilde.
## Gereksinimler
## Gereksinimler { #requirements }
Çeşitli alternatifleri test ettikten sonra, avantajlarından dolayı <ahref="https://docs.pydantic.dev/"class="external-link"target="_blank">**Pydantic**</a>'i kullanmaya karar verdim.
Çeşitli alternatifleri test ettikten sonra, avantajlarından dolayı <ahref="https://docs.pydantic.dev/"class="external-link"target="_blank">**Pydantic**</a>'i kullanmaya karar verdim.
@ -60,11 +60,11 @@ Sonra, JSON Schema ile tamamen uyumlu olmasını sağlamak, kısıtlama bildirim
Geliştirme sırasında, diğer ana gereksinim olan <ahref="https://www.starlette.dev/"class="external-link"target="_blank">**Starlette**</a>'e de katkıda bulundum.
Geliştirme sırasında, diğer ana gereksinim olan <ahref="https://www.starlette.dev/"class="external-link"target="_blank">**Starlette**</a>'e de katkıda bulundum.
## Geliştirme
## Geliştirme { #development }
**FastAPI**'ı oluşturmaya başladığımda, parçaların çoğu zaten yerindeydi, tasarım tanımlanmıştı, gereksinimler ve araçlar hazırdı, standartlar ve tanımlamalar hakkındaki bilgi net ve tazeydi.
**FastAPI**'ı oluşturmaya başladığımda, parçaların çoğu zaten yerindeydi, tasarım tanımlanmıştı, gereksinimler ve araçlar hazırdı, standartlar ve tanımlamalar hakkındaki bilgi net ve tazeydi.
## Gelecek
## Gelecek { #future }
Şimdiye kadar, **FastAPI**'ın fikirleriyle birçok kişiye faydalı olduğu apaçık ortada.
Şimdiye kadar, **FastAPI**'ın fikirleriyle birçok kişiye faydalı olduğu apaçık ortada.
# Genel - Nasıl Yapılır - Tarifler { #general-how-to-recipes }
Bu sayfada genel ve sıkça sorulan sorular için dokümantasyonun diğer sayfalarına yönlendirmeler bulunmaktadır.
Bu sayfada genel ve sıkça sorulan sorular için dokümantasyonun diğer sayfalarına yönlendirmeler bulunmaktadır.
## Veri Filtreleme - Güvenlik
## Veri Filtreleme - Güvenlik { #filter-data-security }
Döndürmeniz gereken veriden fazlasını döndürmediğinizden emin olmak için, [Tutorial - Response Model - Return Type](../tutorial/response-model.md){.internal-link target=_blank} sayfasını okuyun.
Döndürmeniz gereken veriden fazlasını döndürmediğinizden emin olmak için, [Tutorial - Response Model - Return Type](../tutorial/response-model.md){.internal-link target=_blank} sayfasını okuyun.
Bir *yol işlemi*ni kullanımdan kaldırmak ve bunu dokümantasyon arayüzünde göstermek için, [Tutorial - Path Operation Configurations - Deprecation](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank} sayfasını okuyun.
Bir *yol işlemi*ni kullanımdan kaldırmak ve bunu dokümantasyon arayüzünde göstermek için, [Tutorial - Path Operation Configurations - Deprecation](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank} sayfasını okuyun.
## Herhangi Bir Veriyi JSON Uyumlu Hale Getirme
## Herhangi Bir Veriyi JSON Uyumlu Hale Getirme { #convert-any-data-to-json-compatible }
Herhangi bir veriyi JSON uyumlu hale getirmek için, [Tutorial - JSON Compatible Encoder](../tutorial/encoder.md){.internal-link target=_blank} sayfasını okuyun.
Herhangi bir veriyi JSON uyumlu hale getirmek için, [Tutorial - JSON Compatible Encoder](../tutorial/encoder.md){.internal-link target=_blank} sayfasını okuyun.
## OpenAPI Meta Verileri - Dokümantasyon
## OpenAPI Meta Verileri - Dokümantasyon { #openapi-metadata-docs }
OpenAPI şemanıza lisans, sürüm, iletişim vb. meta veriler eklemek için, [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md){.internal-link target=_blank} sayfasını okuyun.
OpenAPI şemanıza lisans, sürüm, iletişim vb. meta veriler eklemek için, [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md){.internal-link target=_blank} sayfasını okuyun.
## OpenAPI Bağlantı Özelleştirme
## OpenAPI Bağlantı Özelleştirme { #openapi-custom-url }
OpenAPI bağlantısını özelleştirmek (veya kaldırmak) için, [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md#openapi-url){.internal-link target=_blank} sayfasını okuyun.
OpenAPI bağlantısını özelleştirmek (veya kaldırmak) için, [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md#openapi-url){.internal-link target=_blank} sayfasını okuyun.
Dokümantasyonu arayüzünde kullanılan bağlantıları güncellemek için, [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md#docs-urls){.internal-link target=_blank} sayfasını okuyun.
Dokümantasyonu arayüzünde kullanılan bağlantıları güncellemek için, [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md#docs-urls){.internal-link target=_blank} sayfasını okuyun.
veya adres, herhangi farklı bir harf varyasyonu içermesi durumuna rağmen (büyük harf, sadece baş harfi büyük kelime, vb.) fonksiyonunuz, `bool` tipli `short` parametresini `True` olarak algılayacaktır. Aksi halde `False` olarak algılanacaktır.
veya adres, herhangi farklı bir harf varyasyonu içermesi durumuna rağmen (büyük harf, sadece baş harfi büyük kelime, vb.) fonksiyonunuz, `bool` tipli `short` parametresini `True` olarak algılayacaktır. Aksi halde `False` olarak algılanacaktır.
## Çoklu Yol ve Sorgu Parametreleri
## Çoklu Yol ve Sorgu Parametreleri { #multiple-path-and-query-parameters }
**FastAPI** neyin ne olduğunu ayırt edebileceğinden dolayı aynı anda birden fazla yol ve sorgu parametresi tanımlayabilirsiniz.
**FastAPI** neyin ne olduğunu ayırt edebileceğinden dolayı aynı anda birden fazla yol ve sorgu parametresi tanımlayabilirsiniz.
@ -120,7 +120,7 @@ Ve parametreleri, herhangi bir sıraya koymanıza da gerek yoktur.
## Zorunlu Sorgu Parametreleri { #required-query-parameters }
Türü yol olmayan bir parametre (şu ana kadar sadece sorgu parametrelerini gördük) için varsayılan değer tanımlarsanız o parametre zorunlu olmayacaktır.
Türü yol olmayan bir parametre (şu ana kadar sadece sorgu parametrelerini gördük) için varsayılan değer tanımlarsanız o parametre zorunlu olmayacaktır.
@ -128,7 +128,7 @@ Parametre için belirli bir değer atamak istemeyip parametrenin sadece isteğe
Fakat, bir sorgu parametresini zorunlu yapmak istiyorsanız varsayılan bir değer atamamanız yeterli olacaktır:
Fakat, bir sorgu parametresini zorunlu yapmak istiyorsanız varsayılan bir değer atamamanız yeterli olacaktır:
Burada `needy` parametresi `str` tipinden oluşan zorunlu bir sorgu parametresidir.
Burada `needy` parametresi `str` tipinden oluşan zorunlu bir sorgu parametresidir.
@ -183,6 +183,6 @@ Bu durumda, 3 tane sorgu parametresi var olacaktır:
/// tip | İpucu
/// tip | İpucu
Ayrıca, [Yol Parametrelerinde](path-params.md#on-tanml-degerler){.internal-link target=_blank} de kullanıldığı şekilde `Enum` sınıfından faydalanabilirsiniz.
Ayrıca, [Yol Parametrelerinde](path-params.md#predefined-values){.internal-link target=_blank} de kullanıldığı şekilde `Enum` sınıfından faydalanabilirsiniz.
"Bağlamak", belirli bir yola tamamen "bağımsız" bir uygulama eklemek anlamına gelir ve ardından tüm alt yollara gelen istekler bu uygulama tarafından işlenir.
"Bağlamak", belirli bir yola tamamen "bağımsız" bir uygulama eklemek anlamına gelir ve ardından tüm alt yollara gelen istekler bu uygulama tarafından işlenir.
@ -25,7 +25,7 @@ Bu, bir `APIRouter` kullanmaktan farklıdır çünkü bağlanmış bir uygulama
[Advanced User Guide](../advanced/index.md){.internal-link target=_blank} bölümünde daha fazla bilgi edinebilirsiniz.
[Advanced User Guide](../advanced/index.md){.internal-link target=_blank} bölümünde daha fazla bilgi edinebilirsiniz.
## Detaylar
## Detaylar { #details }
`"/static"` ifadesi, bu "alt uygulamanın" "bağlanacağı" alt yolu belirtir. Bu nedenle, `"/static"` ile başlayan her yol, bu uygulama tarafından işlenir.
`"/static"` ifadesi, bu "alt uygulamanın" "bağlanacağı" alt yolu belirtir. Bu nedenle, `"/static"` ile başlayan her yol, bu uygulama tarafından işlenir.
@ -35,6 +35,6 @@ Bu, bir `APIRouter` kullanmaktan farklıdır çünkü bağlanmış bir uygulama
Bu parametrelerin hepsi "`static`"den farklı olabilir, bunları kendi uygulamanızın ihtiyaçlarına göre belirleyebilirsiniz.
Bu parametrelerin hepsi "`static`"den farklı olabilir, bunları kendi uygulamanızın ihtiyaçlarına göre belirleyebilirsiniz.
## Daha Fazla Bilgi
## Daha Fazla Bilgi { #more-info }
Daha fazla detay ve seçenek için <ahref="https://www.starlette.dev/staticfiles/"class="external-link"target="_blank">Starlette'in Statik Dosyalar hakkındaki dokümantasyonunu</a> incelleyin.
Daha fazla detay ve seçenek için <ahref="https://www.starlette.dev/staticfiles/"class="external-link"target="_blank">Starlette'in Statik Dosyalar hakkındaki dokümantasyonunu</a> incelleyin.
# Альтернативи, натхнення та порівняння { #alternatives-inspiration-and-comparisons }
Що надихнуло на створення **FastAPI**, який він у порінянні з іншими альтернативами та чого він у них навчився.
Що надихнуло на створення **FastAPI**, який він у порінянні з іншими альтернативами та чого він у них навчився.
## Вступ
## Вступ { #intro }
**FastAPI** не існувало б, якби не попередні роботи інших.
**FastAPI** не існувало б, якби не попередні роботи інших.
@ -12,9 +12,9 @@
Але в якийсь момент не було іншого виходу, окрім створення чогось, що надавало б усі ці функції, взявши найкращі ідеї з попередніх інструментів і поєднавши їх найкращим чином, використовуючи мовні функції, які навіть не були доступні раніше (Python 3.6+ підказки типів).
Але в якийсь момент не було іншого виходу, окрім створення чогось, що надавало б усі ці функції, взявши найкращі ідеї з попередніх інструментів і поєднавши їх найкращим чином, використовуючи мовні функції, які навіть не були доступні раніше (Python 3.6+ підказки типів).
Це найпопулярніший фреймворк Python, який користується широкою довірою. Він використовується для створення таких систем, як Instagram.
Це найпопулярніший фреймворк Python, який користується широкою довірою. Він використовується для створення таких систем, як Instagram.
@ -22,7 +22,7 @@
Він був створений для створення HTML у серверній частині, а не для створення API, які використовуються сучасним інтерфейсом (як-от React, Vue.js і Angular) або іншими системами (як-от <abbrtitle="Internet of Things">IoT</abbr> пристрої), які спілкуються з ним.
Він був створений для створення HTML у серверній частині, а не для створення API, які використовуються сучасним інтерфейсом (як-от React, Vue.js і Angular) або іншими системами (як-от <abbrtitle="Internet of Things">IoT</abbr> пристрої), які спілкуються з ним.
Фреймворк Django REST був створений як гнучкий інструментарій для створення веб-інтерфейсів API використовуючи Django в основі, щоб покращити його можливості API.
Фреймворк Django REST був створений як гнучкий інструментарій для створення веб-інтерфейсів API використовуючи Django в основі, щоб покращити його можливості API.
@ -42,7 +42,7 @@ Django REST Framework створив Том Крісті. Той самий тв
Головною функцією, яку я хотів від Django REST Framework, була автоматична API документація.
Головною функцією, яку я хотів від Django REST Framework, була автоматична API документація.
@ -131,11 +131,11 @@ def read_url():
///
///
### Фреймворки REST для Flask
### Фреймворки REST для Flask { #flask-rest-frameworks }
Існує кілька фреймворків Flask REST, але, витративши час і роботу на їх дослідження, я виявив, що багато з них припинено або залишено, з кількома постійними проблемами, які зробили їх непридатними.
Існує кілька фреймворків Flask REST, але, витративши час і роботу на їх дослідження, я виявив, що багато з них припинено або залишено, з кількома постійними проблемами, які зробили їх непридатними.
Однією з головних функцій, необхідних для систем API, є "<abbrtitle="також звана marshalling, conversion">серіалізація</abbr>", яка бере дані з коду (Python) і перетворює їх на щось, що можна надіслати через мережу. Наприклад, перетворення об’єкта, що містить дані з бази даних, на об’єкт JSON. Перетворення об’єктів `datetime` на строки тощо.
Однією з головних функцій, необхідних для систем API, є "<abbrtitle="також звана marshalling, conversion">серіалізація</abbr>", яка бере дані з коду (Python) і перетворює їх на щось, що можна надіслати через мережу. Наприклад, перетворення об’єкта, що містить дані з бази даних, на об’єкт JSON. Перетворення об’єктів `datetime` на строки тощо.
@ -153,7 +153,7 @@ Marshmallow створено для забезпечення цих функці
Hug був одним із перших фреймворків, який реалізував оголошення типів параметрів API за допомогою підказок типу Python. Це була чудова ідея, яка надихнула інші інструменти зробити те саме.
Hug був одним із перших фреймворків, який реалізував оголошення типів параметрів API за допомогою підказок типу Python. Це була чудова ідея, яка надихнула інші інструменти зробити те саме.
@ -351,7 +351,7 @@ Hug надихнув частину APIStar і був одним із найбі
Starlette — це легкий фреймворк/набір інструментів <abbrtitle="The new standard for build asynchronous Python web">ASGI</abbr>, який ідеально підходить для створення високопродуктивних asyncio сервісів.
Starlette — це легкий фреймворк/набір інструментів <abbrtitle="The new standard for build asynchronous Python web">ASGI</abbr>, який ідеально підходить для створення високопродуктивних asyncio сервісів.
@ -460,7 +460,7 @@ ASGI — це новий «стандарт», який розробляєтьс
## Орієнтири та швидкість { #benchmarks-and-speed }
Щоб зрозуміти, порівняти та побачити різницю між Uvicorn, Starlette і FastAPI, перегляньте розділ про [Бенчмарки](benchmarks.md){.internal-link target=_blank}.
Щоб зрозуміти, порівняти та побачити різницю між Uvicorn, Starlette і FastAPI, перегляньте розділ про [Бенчмарки](benchmarks.md){.internal-link target=_blank}.
你可以同时拥有并行性和异步性,你可以获得比大多数经过测试的 NodeJS 框架更高的性能,并且与 Go 不相上下, Go 是一种更接近于 C 的编译语言(<ahref="https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1"class="external-link"target="_blank">全部归功于 Starlette</a>)。
你可以同时拥有并行性和异步性,你可以获得比大多数经过测试的 NodeJS 框架更高的性能,并且与 Go 不相上下, Go 是一种更接近于 C 的编译语言(<ahref="https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1"class="external-link"target="_blank">全部归功于 Starlette</a>)。