-
-
-
-
+
@@ -116,7 +116,7 @@ Jetzt, da Sie wissen, dass Sie das reparieren müssen, konvertieren Sie `age` mi
{* ../../docs_src/python_types/tutorial004_py310.py hl[2] *}
-## Deklarieren von Typen { #declaring-types }
+## Typen deklarieren { #declaring-types }
Sie haben gerade den Haupt-Einsatzort für die Deklaration von Typhinweisen gesehen. Als Funktionsparameter.
@@ -180,7 +180,7 @@ In diesem Fall ist `str` der Typ-Parameter, der an `list` übergeben wird.
///
-Das bedeutet: Die Variable `items` ist eine Liste – `list` – und jedes der Elemente in dieser Liste ist ein String – `str`.
+Das bedeutet: „Die Variable `items` ist eine `list`, und jedes der Elemente in dieser Liste ist ein `str`“.
Auf diese Weise kann Ihr Editor Sie auch bei der Bearbeitung von Einträgen aus der Liste unterstützen:
@@ -263,9 +263,9 @@ Und wiederum bekommen Sie die volle Editor-Unterstützung:
-Beachten Sie, das bedeutet: „`one_person` ist eine **Instanz** der Klasse `Person`“.
+Beachten Sie, dass das bedeutet: „`one_person` ist eine **Instanz** der Klasse `Person`“.
-Es bedeutet nicht: „`one_person` ist die **Klasse** genannt `Person`“.
+Es bedeutet nicht: „`one_person` ist die **Klasse** namens `Person`“.
## Pydantic-Modelle { #pydantic-models }
@@ -279,7 +279,7 @@ Dann erzeugen Sie eine Instanz dieser Klasse mit einigen Werten, und Pydantic va
Und Sie erhalten volle Editor-Unterstützung für dieses Objekt.
-Ein Beispiel aus der offiziellen Pydantic Dokumentation:
+Ein Beispiel aus der offiziellen Pydantic-Dokumentation:
{* ../../docs_src/python_types/tutorial011_py310.py *}
@@ -301,11 +301,11 @@ Sie können `Annotated` von `typing` importieren.
{* ../../docs_src/python_types/tutorial013_py310.py hl[1,4] *}
-Python selbst macht nichts mit `Annotated`. Für Editoren und andere Tools ist der Typ immer noch `str`.
+Python selbst macht nichts mit diesem `Annotated`. Für Editoren und andere Tools ist der Typ immer noch `str`.
-Aber Sie können `Annotated` nutzen, um **FastAPI** mit Metadaten zu versorgen, die ihm sagen, wie sich Ihre Anwendung verhalten soll.
+Aber Sie können diesen Platz in `Annotated` nutzen, um **FastAPI** zusätzliche Metadaten darüber bereitzustellen, wie sich Ihre Anwendung verhalten soll.
-Wichtig ist, dass **der erste *Typ-Parameter***, den Sie `Annotated` übergeben, der **tatsächliche Typ** ist. Der Rest sind Metadaten für andere Tools.
+Wichtig ist, dass **der erste *Typ-Parameter***, den Sie `Annotated` übergeben, der **tatsächliche Typ** ist. Der Rest sind nur Metadaten für andere Tools.
Im Moment müssen Sie nur wissen, dass `Annotated` existiert, und dass es Standard-Python ist. 😎
@@ -335,7 +335,7 @@ Mit **FastAPI** deklarieren Sie Parameter mit Typhinweisen, und Sie erhalten:
* **Daten zu validieren**: aus jedem Request:
* **Automatische Fehler** generieren, die an den Client zurückgegeben werden, wenn die Daten ungültig sind.
* Die API mit OpenAPI zu **dokumentieren**:
- * Die dann von den Benutzeroberflächen der automatisch generierten interaktiven Dokumentation verwendet wird.
+ * die dann von den Benutzeroberflächen der automatisch generierten interaktiven Dokumentation verwendet wird.
Das mag alles abstrakt klingen. Machen Sie sich keine Sorgen. Sie werden all das in Aktion sehen im [Tutorial – Benutzerhandbuch](tutorial/index.md).
diff --git a/docs/de/docs/tutorial/bigger-applications.md b/docs/de/docs/tutorial/bigger-applications.md
index c6fec3f6a..119f3e8c0 100644
--- a/docs/de/docs/tutorial/bigger-applications.md
+++ b/docs/de/docs/tutorial/bigger-applications.md
@@ -17,16 +17,16 @@ Nehmen wir an, Sie haben eine Dateistruktur wie diese:
```
.
├── app
-│ ├── __init__.py
-│ ├── main.py
-│ ├── dependencies.py
-│ └── routers
-│ │ ├── __init__.py
-│ │ ├── items.py
-│ │ └── users.py
-│ └── internal
-│ ├── __init__.py
-│ └── admin.py
+│ ├── __init__.py
+│ ├── main.py
+│ ├── dependencies.py
+│ └── routers
+│ │ ├── __init__.py
+│ │ ├── items.py
+│ │ └── users.py
+│ └── internal
+│ ├── __init__.py
+│ └── admin.py
```
/// tip | Tipp
@@ -396,9 +396,9 @@ Es wird alle Routen von diesem Router als Teil von dieser inkludieren.
/// note | Technische Details
-Tatsächlich wird intern eine *Pfadoperation* für jede *Pfadoperation* erstellt, die im `APIRouter` deklariert wurde.
+FastAPI behält den ursprünglichen `APIRouter` und seine `APIRoute`s aktiv, wenn der Router in die Hauptanwendung eingebunden wird.
-Hinter den Kulissen wird es also tatsächlich so funktionieren, als ob alles dieselbe einzige Anwendung wäre.
+Das bedeutet, dass benutzerdefinierte Subklassen von `APIRouter` und `APIRoute` auch nach dem Einbinden weiterhin beteiligt sein können.
///
@@ -406,7 +406,7 @@ Hinter den Kulissen wird es also tatsächlich so funktionieren, als ob alles die
Bei der Einbindung von Routern müssen Sie sich keine Gedanken über die Leistung machen.
-Dies dauert Mikrosekunden und geschieht nur beim Start.
+Dies ist so konzipiert, dass es leichtgewichtig ist und keinen Overhead pro Request hinzufügt.
Es hat also keinen Einfluss auf die Leistung. ⚡
@@ -459,9 +459,9 @@ und es wird korrekt funktionieren, zusammen mit allen anderen *Pfadoperationen*,
Die `APIRouter` sind nicht „gemountet“, sie sind nicht vom Rest der Anwendung isoliert.
-Das liegt daran, dass wir deren *Pfadoperationen* in das OpenAPI-Schema und die Benutzeroberflächen einbinden möchten.
+Das liegt daran, dass wir ihre *Pfadoperationen* im OpenAPI-Schema und in den Benutzeroberflächen inkludieren möchten.
-Da wir sie nicht einfach isolieren und unabhängig vom Rest „mounten“ können, werden die *Pfadoperationen* „geklont“ (neu erstellt) und nicht direkt einbezogen.
+FastAPI behält die ursprünglichen Router und Pfadoperationen aktiv und kombiniert Router-Präfixe, Abhängigkeiten, Tags, Responses und weitere Metadaten beim Bearbeiten von Requests und beim Generieren von OpenAPI.
///
@@ -532,4 +532,16 @@ Auf die gleiche Weise, wie Sie einen `APIRouter` in eine `FastAPI`-Anwendung ein
router.include_router(other_router)
```
-Stellen Sie sicher, dass Sie dies tun, bevor Sie `router` in die `FastAPI`-App einbinden, damit auch die *Pfadoperationen* von `other_router` inkludiert werden.
+Sie können dies vor oder nach dem Einbinden von `router` in die `FastAPI`-App tun. FastAPI inkludiert die *Pfadoperationen* von `other_router` dennoch in Routing und OpenAPI.
+
+Gleiches gilt für später zu den Routern hinzugefügte *Pfadoperationen*. Sie sind auch über die frühere Inklusion sichtbar.
+
+/// warning | Technische Details
+
+Vermeiden Sie es, `router.routes` direkt zu mutieren, nachdem ein Router inkludiert wurde. FastAPI behandelt Router-Inklusion als „live“, sodass der ursprüngliche Router und seine Routen Teil des Routings und der OpenAPI-Generierung bleiben.
+
+Verwenden Sie dokumentierte APIs wie Pfadoperation-Dekoratoren und `.include_router()`, um Routen und Router hinzuzufügen.
+
+Betrachten Sie `router.routes` als eine Low-Level-Routenstruktur, die sowohl Routendefinitionen als auch inkludierte Router enthalten kann, und verlassen Sie sich nicht darauf als flache Liste endgültiger Pfadoperationen.
+
+///
diff --git a/docs/de/docs/tutorial/body-multiple-params.md b/docs/de/docs/tutorial/body-multiple-params.md
index 60a0ceefe..2d5765dcd 100644
--- a/docs/de/docs/tutorial/body-multiple-params.md
+++ b/docs/de/docs/tutorial/body-multiple-params.md
@@ -108,7 +108,7 @@ Zum Beispiel:
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info | Info
+/// note | Hinweis
`Body` hat die gleichen zusätzlichen Validierungs- und Metadaten-Parameter wie `Query`, `Path` und andere, die Sie später kennenlernen werden.
@@ -123,7 +123,7 @@ Standardmäßig wird **FastAPI** dann seinen Body direkt erwarten.
Aber wenn Sie möchten, dass es einen JSON-Body mit einem Schlüssel `item` erwartet, und darin den Inhalt des Modells, so wie es das tut, wenn Sie mehrere Body-Parameter deklarieren, dann können Sie den speziellen `Body`-Parameter `embed` setzen:
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
so wie in:
diff --git a/docs/de/docs/tutorial/body-nested-models.md b/docs/de/docs/tutorial/body-nested-models.md
index 62f04a37d..f95b65e57 100644
--- a/docs/de/docs/tutorial/body-nested-models.md
+++ b/docs/de/docs/tutorial/body-nested-models.md
@@ -4,7 +4,7 @@ Mit **FastAPI** können Sie (dank Pydantic) beliebig tief verschachtelte Modelle
## Listen als Felder { #list-fields }
-Sie können ein Attribut als Kindtyp definieren, zum Beispiel eine Python-`list`.
+Sie können ein Attribut als Kindtyp definieren. Zum Beispiel eine Python-`list`:
{* ../../docs_src/body_nested_models/tutorial001_py310.py hl[12] *}
@@ -12,11 +12,12 @@ Das bewirkt, dass `tags` eine Liste ist, wenngleich es nichts über den Typ der
## Listen mit Typ-Parametern als Felder { #list-fields-with-type-parameter }
-Aber Python erlaubt es, Listen mit inneren Typen, auch „Typ-Parameter“ genannt, zu deklarieren.
+Aber Python hat eine spezifische Möglichkeit, Listen mit inneren Typen, auch „Typ-Parameter“ genannt, zu deklarieren:
### Eine `list` mit einem Typ-Parameter deklarieren { #declare-a-list-with-a-type-parameter }
-Um Typen zu deklarieren, die Typ-Parameter (innere Typen) haben, wie `list`, `dict`, `tuple`, übergeben Sie den/die inneren Typ(en) als „Typ-Parameter“ in eckigen Klammern: `[` und `]`
+Um Typen zu deklarieren, die Typ-Parameter (innere Typen) haben, wie `list`, `dict`, `tuple`,
+übergeben Sie den/die inneren Typ(en) als „Typ-Parameter“ in eckigen Klammern: `[` und `]`
```Python
my_list: list[str]
@@ -32,19 +33,19 @@ In unserem Beispiel können wir also bewirken, dass `tags` spezifisch eine „Li
## Set-Typen { #set-types }
-Aber dann denken wir darüber nach und stellen fest, dass sich die Tags nicht wiederholen sollen, es sollen eindeutige Strings sein.
+Aber dann denken wir darüber nach und stellen fest, dass sich die Tags nicht wiederholen sollten, sie wären wahrscheinlich eindeutige Strings.
-Python hat einen Datentyp speziell für Mengen eindeutiger Dinge: das `set`.
+Und Python hat einen speziellen Datentyp für Mengen eindeutiger Elemente, das `set`.
-Deklarieren wir also `tags` als Set von Strings.
+Dann können wir `tags` als Set von Strings deklarieren:
{* ../../docs_src/body_nested_models/tutorial003_py310.py hl[12] *}
-Jetzt, selbst wenn Sie einen Request mit duplizierten Daten erhalten, werden diese zu einem Set eindeutiger Dinge konvertiert.
+Damit wird, selbst wenn Sie einen Request mit duplizierten Daten erhalten, dieser zu einem Set eindeutiger Elemente konvertiert.
-Und wann immer Sie diese Daten ausgeben, selbst wenn die Quelle Duplikate hatte, wird es als Set von eindeutigen Dingen ausgegeben.
+Und wann immer Sie diese Daten ausgeben, selbst wenn die Quelle Duplikate hatte, wird es als Set von eindeutigen Elementen ausgegeben.
-Und es wird entsprechend annotiert/dokumentiert.
+Und es wird entsprechend annotiert / dokumentiert.
## Verschachtelte Modelle { #nested-models }
@@ -52,13 +53,13 @@ Jedes Attribut eines Pydantic-Modells hat einen Typ.
Aber dieser Typ kann selbst ein anderes Pydantic-Modell sein.
-Sie können also tief verschachtelte JSON-„Objekte“ deklarieren, mit spezifischen Attributnamen, -typen, und -validierungen.
+Sie können also tief verschachtelte JSON-„Objekte“ deklarieren, mit spezifischen Attributnamen, Typen und Validierungen.
Alles das beliebig tief verschachtelt.
### Ein Kindmodell definieren { #define-a-submodel }
-Für ein Beispiel können wir ein `Image`-Modell definieren.
+Zum Beispiel können wir ein `Image`-Modell definieren:
{* ../../docs_src/body_nested_models/tutorial004_py310.py hl[7:9] *}
@@ -68,7 +69,7 @@ Und dann können wir es als Typ eines Attributes verwenden:
{* ../../docs_src/body_nested_models/tutorial004_py310.py hl[18] *}
-Das würde bedeuten, dass **FastAPI** einen Body wie folgt erwartet:
+Das würde bedeuten, dass **FastAPI** einen Body ähnlich dem folgenden erwartet:
```JSON
{
@@ -84,7 +85,7 @@ Das würde bedeuten, dass **FastAPI** einen Body wie folgt erwartet:
}
```
-Wiederum, nur mit dieser Deklaration erhalten Sie von **FastAPI**:
+Wiederum, nur mit dieser Deklaration erhalten Sie mit **FastAPI**:
* Editor-Unterstützung (Codevervollständigung, usw.), selbst für verschachtelte Modelle
* Datenkonvertierung
@@ -105,7 +106,7 @@ Es wird getestet, ob der String eine gültige URL ist, und als solche wird er in
## Attribute mit Listen von Kindmodellen { #attributes-with-lists-of-submodels }
-Sie können Pydantic-Modelle auch als Typen innerhalb von `list`, `set`, usw. verwenden:
+Sie können Pydantic-Modelle auch als Kindtypen von `list`, `set`, usw. verwenden:
{* ../../docs_src/body_nested_models/tutorial006_py310.py hl[18] *}
@@ -135,7 +136,7 @@ Das wird einen JSON-Body erwarten (konvertieren, validieren, dokumentieren, usw.
}
```
-/// info | Info
+/// note | Hinweis
Beachten Sie, dass der `images`-Schlüssel jetzt eine Liste von Bild-Objekten hat.
@@ -147,15 +148,15 @@ Sie können beliebig tief verschachtelte Modelle definieren:
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info | Info
+/// note | Hinweis
-Beachten Sie, wie `Offer` eine Liste von `Item`s hat, die ihrerseits eine optionale Liste von `Image`s haben.
+Beachten Sie, wie `Offer` eine Liste von `Item`s hat, die ihrerseits eine optionale Liste von `Image`s haben
///
## Bodys aus reinen Listen { #bodies-of-pure-lists }
-Wenn das äußerste Element des JSON-Bodys, das Sie erwarten, ein JSON-`array` (eine Python-`list`) ist, können Sie den Typ im Funktionsparameter deklarieren, mit der gleichen Syntax wie in Pydantic-Modellen:
+Wenn der Wert auf oberster Ebene des JSON-Bodys, den Sie erwarten, ein JSON-`array` (eine Python-`list`) ist, können Sie den Typ im Parameter der Funktion deklarieren, genau wie in Pydantic-Modellen:
```Python
images: list[Image]
@@ -169,29 +170,29 @@ so wie in:
Und Sie erhalten Editor-Unterstützung überall.
-Selbst für Dinge in Listen:
+Selbst für Elemente innerhalb von Listen:
-Sie würden diese Editor-Unterstützung nicht erhalten, wenn Sie direkt mit `dict`, statt mit Pydantic-Modellen arbeiten würden.
+Sie würden diese Art von Editor-Unterstützung nicht erhalten, wenn Sie direkt mit `dict`, statt mit Pydantic-Modellen arbeiten würden.
-Aber Sie müssen sich auch nicht weiter um die Modelle kümmern, hereinkommende Dicts werden automatisch in sie konvertiert. Und was Sie zurückgeben, wird automatisch nach JSON konvertiert.
+Aber Sie müssen sich auch nicht um diese kümmern, hereinkommende Dicts werden automatisch konvertiert und Ihre Ausgabe wird ebenfalls automatisch nach JSON konvertiert.
## Bodys mit beliebigen `dict`s { #bodies-of-arbitrary-dicts }
Sie können einen Body auch als `dict` deklarieren, mit Schlüsseln eines Typs und Werten eines anderen Typs.
-So brauchen Sie vorher nicht zu wissen, wie die Feld-/Attributnamen lauten (wie es bei Pydantic-Modellen der Fall wäre).
+So brauchen Sie vorher nicht zu wissen, wie die gültigen Feld-/Attributnamen lauten (wie es bei Pydantic-Modellen der Fall wäre).
-Das ist nützlich, wenn Sie Schlüssel empfangen, deren Namen Sie nicht bereits kennen.
+Das ist nützlich, wenn Sie Schlüssel empfangen wollen, die Sie nicht bereits kennen.
---
Ein anderer nützlicher Anwendungsfall ist, wenn Sie Schlüssel eines anderen Typs haben wollen, z. B. `int`.
-Das schauen wir uns mal an.
+Das schauen wir uns hier an.
-Im folgenden Beispiel akzeptieren Sie irgendein `dict`, solange es `int`-Schlüssel und `float`-Werte hat:
+In diesem Fall akzeptieren Sie irgendein `dict`, solange es `int`-Schlüssel mit `float`-Werten hat:
{* ../../docs_src/body_nested_models/tutorial009_py310.py hl[7] *}
@@ -201,9 +202,9 @@ Bedenken Sie, dass JSON nur `str` als Schlüssel unterstützt.
Aber Pydantic hat automatische Datenkonvertierung.
-Das bedeutet, dass Ihre API-Clients nur Strings senden können, aber solange diese Strings nur Zahlen enthalten, wird Pydantic sie konvertieren und validieren.
+Das bedeutet, dass Ihre API-Clients zwar nur Strings als Schlüssel senden können, Pydantic diese aber konvertieren und validieren wird, solange diese Strings nur Ganzzahlen enthalten.
-Und das `dict`, welches Sie als `weights` erhalten, wird `int`-Schlüssel und `float`-Werte haben.
+Und das `dict`, welches Sie als `weights` erhalten, wird tatsächlich `int`-Schlüssel und `float`-Werte haben.
///
@@ -213,8 +214,8 @@ Mit **FastAPI** haben Sie die maximale Flexibilität von Pydantic-Modellen, wäh
Aber mit all den Vorzügen:
-* Editor-Unterstützung (Codevervollständigung überall)
-* Datenkonvertierung (auch bekannt als Parsen, Serialisierung)
+* Editor-Unterstützung (Codevervollständigung überall!)
+* Datenkonvertierung (auch bekannt als Parsen / Serialisierung)
* Datenvalidierung
* Schema-Dokumentation
* Automatische Dokumentation
diff --git a/docs/de/docs/tutorial/body.md b/docs/de/docs/tutorial/body.md
index 9e87dfccf..6ced5f732 100644
--- a/docs/de/docs/tutorial/body.md
+++ b/docs/de/docs/tutorial/body.md
@@ -8,13 +8,13 @@ Ihre API muss fast immer einen **Response**body senden. Aber Clients müssen nic
Um einen **Request**body zu deklarieren, verwenden Sie [Pydantic](https://docs.pydantic.dev/)-Modelle mit all deren Fähigkeiten und Vorzügen.
-/// info | Info
+/// note | Hinweis
Um Daten zu senden, sollten Sie eines von: `POST` (meistverwendet), `PUT`, `DELETE` oder `PATCH` verwenden.
Das Senden eines Bodys mit einem `GET`-Request hat ein undefiniertes Verhalten in den Spezifikationen, wird aber dennoch von FastAPI unterstützt, nur für sehr komplexe/extreme Anwendungsfälle.
-Da davon abgeraten wird, zeigt die interaktive Dokumentation mit Swagger-Benutzeroberfläche die Dokumentation für den Body nicht an, wenn `GET` verwendet wird, und zwischengeschaltete Proxys unterstützen es möglicherweise nicht.
+Da davon abgeraten wird, zeigt die interaktive Dokumentation mit Swagger UI die Dokumentation für den Body nicht an, wenn `GET` verwendet wird, und zwischengeschaltete Proxys unterstützen es möglicherweise nicht.
///
@@ -32,6 +32,7 @@ Verwenden Sie Standard-Python-Typen für alle Attribute:
{* ../../docs_src/body/tutorial001_py310.py hl[5:9] *}
+
Wie auch bei der Deklaration von Query-Parametern gilt: Wenn ein Modellattribut einen Defaultwert hat, ist das Attribut nicht erforderlich. Andernfalls ist es erforderlich. Verwenden Sie `None`, um es einfach optional zu machen.
Zum Beispiel deklariert das obige Modell ein JSON „`object`“ (oder Python-`dict`) wie dieses:
@@ -45,7 +46,7 @@ Zum Beispiel deklariert das obige Modell ein JSON „`object`“ (oder Python-
-/// info | Info
+/// note | Hinweis
Bitte beachten Sie, dass Browser Cookies auf spezielle Weise und im Hintergrund bearbeiten, sodass sie **nicht** leicht **JavaScript** erlauben, diese zu berühren.
diff --git a/docs/de/docs/tutorial/cookie-params.md b/docs/de/docs/tutorial/cookie-params.md
index 81a753211..db5f3332c 100644
--- a/docs/de/docs/tutorial/cookie-params.md
+++ b/docs/de/docs/tutorial/cookie-params.md
@@ -24,13 +24,13 @@ Aber denken Sie daran, dass, wenn Sie `Query`, `Path`, `Cookie` und andere von `
///
-/// info | Info
+/// note | Hinweis
Um Cookies zu deklarieren, müssen Sie `Cookie` verwenden, da die Parameter sonst als Query-Parameter interpretiert würden.
///
-/// info | Info
+/// note | Hinweis
Beachten Sie, dass **Browser Cookies auf besondere Weise und hinter den Kulissen handhaben** und **JavaScript** **nicht** ohne Weiteres erlauben, auf sie zuzugreifen.
diff --git a/docs/de/docs/tutorial/debugging.md b/docs/de/docs/tutorial/debugging.md
index 5e5f748ba..f7949d027 100644
--- a/docs/de/docs/tutorial/debugging.md
+++ b/docs/de/docs/tutorial/debugging.md
@@ -99,7 +99,7 @@ So könnte es aussehen:
---
-Wenn Sie Pycharm verwenden, können Sie:
+Wenn Sie PyCharm verwenden, können Sie:
* Das Menü „Run“ öffnen.
* Die Option „Debug ...“ auswählen.
diff --git a/docs/de/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/de/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
index 028d280dc..a3ef1d5a8 100644
--- a/docs/de/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
+++ b/docs/de/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
@@ -28,7 +28,7 @@ Damit wird auch vermieden, neue Entwickler möglicherweise zu verwirren, die ein
///
-/// info | Info
+/// note | Hinweis
In diesem Beispiel verwenden wir zwei erfundene benutzerdefinierte Header `X-Key` und `X-Token`.
diff --git a/docs/de/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/de/docs/tutorial/dependencies/dependencies-with-yield.md
index e1eec2350..5bb8868fc 100644
--- a/docs/de/docs/tutorial/dependencies/dependencies-with-yield.md
+++ b/docs/de/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -2,7 +2,7 @@
FastAPI unterstützt Abhängigkeiten, die einige zusätzliche Schritte nach Abschluss ausführen.
-Verwenden Sie dazu `yield` statt `return` und schreiben Sie die zusätzlichen Schritte / den zusätzlichen Code danach.
+Verwenden Sie dazu `yield` statt `return` und schreiben Sie die zusätzlichen Schritte (Code) danach.
/// tip | Tipp
@@ -77,7 +77,7 @@ Und wiederum benötigt `dependency_b` den Wert von `dependency_a` (hier `dep_a`
{* ../../docs_src/dependencies/tutorial008_an_py310.py hl[18:19,26:27] *}
-Auf die gleiche Weise könnten Sie einige Abhängigkeiten mit `yield` und einige andere Abhängigkeiten mit `return` haben, und alle können beliebig voneinander abhängen.
+Auf die gleiche Weise könnten Sie einige Abhängigkeiten mit `yield` und einige andere Abhängigkeiten mit `return` haben, und einige davon von einigen der anderen abhängen lassen.
Und Sie könnten eine einzelne Abhängigkeit haben, die auf mehreren ge`yield`eten Abhängigkeiten basiert, usw.
@@ -170,7 +170,7 @@ participant tasks as Hintergrundtasks
end
```
-/// info | Info
+/// note | Hinweis
Es wird nur **eine Response** an den Client gesendet. Es kann eine Error-Response oder die Response der *Pfadoperation* sein.
@@ -234,6 +234,7 @@ participant operation as Pfadoperation
Abhängigkeiten mit `yield` haben sich im Laufe der Zeit weiterentwickelt, um verschiedene Anwendungsfälle abzudecken und einige Probleme zu beheben.
Wenn Sie sehen möchten, was sich in verschiedenen Versionen von FastAPI geändert hat, lesen Sie mehr dazu im fortgeschrittenen Teil, unter [Fortgeschrittene Abhängigkeiten – Abhängigkeiten mit `yield`, `HTTPException`, `except` und Hintergrundtasks](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks).
+
## Kontextmanager { #context-managers }
### Was sind „Kontextmanager“ { #what-are-context-managers }
@@ -266,18 +267,19 @@ Wenn Sie gerade erst mit **FastAPI** beginnen, möchten Sie das vielleicht vorer
In Python können Sie Kontextmanager erstellen, indem Sie [eine Klasse mit zwei Methoden erzeugen: `__enter__()` und `__exit__()`](https://docs.python.org/3/reference/datamodel.html#context-managers).
-Sie können solche auch innerhalb von **FastAPI**-Abhängigkeiten mit `yield` verwenden, indem Sie `with`- oder `async with`-Anweisungen innerhalb der Abhängigkeits-Funktion verwenden:
+Sie können solche auch innerhalb von **FastAPI**-Abhängigkeiten mit `yield` verwenden, indem Sie
+`with`- oder `async with`-Anweisungen innerhalb der Abhängigkeits-Funktion verwenden:
{* ../../docs_src/dependencies/tutorial010_py310.py hl[1:9,13] *}
/// tip | Tipp
-Andere Möglichkeiten, einen Kontextmanager zu erstellen, sind:
+Eine weitere Möglichkeit, einen Kontextmanager zu erstellen, ist:
* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) oder
* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager)
-Verwenden Sie diese, um eine Funktion zu dekorieren, die ein einziges `yield` hat.
+indem Sie damit eine Funktion dekorieren, die ein einziges `yield` hat.
Das ist es auch, was **FastAPI** intern für Abhängigkeiten mit `yield` verwendet.
diff --git a/docs/de/docs/tutorial/dependencies/index.md b/docs/de/docs/tutorial/dependencies/index.md
index 49c65eb37..e631e7863 100644
--- a/docs/de/docs/tutorial/dependencies/index.md
+++ b/docs/de/docs/tutorial/dependencies/index.md
@@ -50,7 +50,7 @@ In diesem Fall erwartet diese Abhängigkeit:
Und dann wird einfach ein `dict` zurückgegeben, welches diese Werte enthält.
-/// info | Info
+/// note | Hinweis
FastAPI unterstützt (und empfiehlt die Verwendung von) `Annotated` seit Version 0.95.0.
@@ -105,7 +105,7 @@ common_parameters --> read_users
Auf diese Weise schreiben Sie gemeinsam genutzten Code nur einmal, und **FastAPI** kümmert sich darum, ihn für Ihre *Pfadoperationen* aufzurufen.
-/// check | Testen
+/// tip | Tipp
Beachten Sie, dass Sie keine spezielle Klasse erstellen und diese irgendwo an **FastAPI** übergeben müssen, um sie zu „registrieren“ oder so ähnlich.
diff --git a/docs/de/docs/tutorial/dependencies/sub-dependencies.md b/docs/de/docs/tutorial/dependencies/sub-dependencies.md
index b01cc80a7..d6a2056cd 100644
--- a/docs/de/docs/tutorial/dependencies/sub-dependencies.md
+++ b/docs/de/docs/tutorial/dependencies/sub-dependencies.md
@@ -35,7 +35,7 @@ Diese Abhängigkeit verwenden wir nun wie folgt:
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
-/// info | Info
+/// note | Hinweis
Beachten Sie, dass wir in der *Pfadoperation-Funktion* nur eine einzige Abhängigkeit deklarieren, den `query_or_cookie_extractor`.
diff --git a/docs/de/docs/tutorial/extra-data-types.md b/docs/de/docs/tutorial/extra-data-types.md
index 92401172b..d1feab1a0 100644
--- a/docs/de/docs/tutorial/extra-data-types.md
+++ b/docs/de/docs/tutorial/extra-data-types.md
@@ -1,5 +1,6 @@
# Zusätzliche Datentypen { #extra-data-types }
+
Bisher haben Sie gängige Datentypen verwendet, wie zum Beispiel:
* `int`
diff --git a/docs/de/docs/tutorial/extra-models.md b/docs/de/docs/tutorial/extra-models.md
index 59580d73a..8e0b094ad 100644
--- a/docs/de/docs/tutorial/extra-models.md
+++ b/docs/de/docs/tutorial/extra-models.md
@@ -63,7 +63,7 @@ würden wir ein Python-`dict` erhalten mit:
#### Ein `dict` entpacken { #unpacking-a-dict }
-Wenn wir ein `dict` wie `user_dict` nehmen und es einer Funktion (oder Klasse) mit `**user_dict` übergeben, wird Python es „entpacken“. Es wird die Schlüssel und Werte von `user_dict` direkt als Schlüsselwort-Argumente übergeben.
+Wenn wir ein `dict` wie `user_dict` nehmen und es einer Funktion (oder Klasse) mit `**user_dict` übergeben, wird Python es „entpacken“. Es wird die Schlüssel und Werte von `user_dict` direkt als Schlüssel-Wert-Argumente übergeben.
Setzen wir also das `user_dict` von oben ein:
@@ -196,7 +196,7 @@ Dafür verwenden Sie Pythons Standard-`list`:
## Response mit beliebigem `dict` { #response-with-arbitrary-dict }
-Sie können auch eine Response deklarieren, die ein beliebiges `dict` zurückgibt, indem Sie nur die Typen der Schlüssel und Werte ohne ein Pydantic-Modell deklarieren.
+Sie können auch eine Response deklarieren, die ein einfaches beliebiges `dict` verwendet, indem Sie nur den Typ der Schlüssel und Werte deklarieren, ohne ein Pydantic-Modell zu verwenden.
Dies ist nützlich, wenn Sie die gültigen Feld-/Attributnamen nicht im Voraus kennen (die für ein Pydantic-Modell benötigt werden würden).
@@ -208,4 +208,4 @@ In diesem Fall können Sie `dict` verwenden:
Verwenden Sie gerne mehrere Pydantic-Modelle und vererben Sie je nach Bedarf.
-Sie brauchen kein einzelnes Datenmodell pro Einheit, wenn diese Einheit in der Lage sein muss, verschiedene „Zustände“ zu haben. Wie im Fall der Benutzer-„Einheit“ mit einem Zustand einschließlich `password`, `password_hash` und ohne Passwort.
+Sie brauchen kein einzelnes Datenmodell pro Entität, wenn diese Entität in der Lage sein muss, verschiedene „Zustände“ zu haben. Die **Benutzer**-„Entität“ ist ein Beispiel, mit Zuständen, die `password`, `password_hash` oder kein Passwort umfassen.
diff --git a/docs/de/docs/tutorial/first-steps.md b/docs/de/docs/tutorial/first-steps.md
index 0cf3d03a9..8e97b5b5d 100644
--- a/docs/de/docs/tutorial/first-steps.md
+++ b/docs/de/docs/tutorial/first-steps.md
@@ -180,7 +180,7 @@ was äquivalent wäre zu:
from backend.main import app
```
-### `fastapi dev` mit Pfad { #fastapi-dev-with-path }
+### `fastapi dev` mit Pfad oder mit der CLI-Option `--entrypoint` { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
Sie können auch den Dateipfad an den Befehl `fastapi dev` übergeben, und er wird das zu verwendende FastAPI-App-Objekt erraten:
@@ -188,29 +188,19 @@ Sie können auch den Dateipfad an den Befehl `fastapi dev` übergeben, und er wi
$ fastapi dev main.py
```
-Aber Sie müssten sich daran erinnern, bei jedem Aufruf des `fastapi`-Befehls den korrekten Pfad zu übergeben.
-
-Zusätzlich könnten andere Tools es nicht finden, z. B. die [VS Code-Erweiterung](../editor-support.md) oder [FastAPI Cloud](https://fastapicloud.com). Daher wird empfohlen, den `entrypoint` in `pyproject.toml` zu verwenden.
-
-### Ihre App deployen (optional) { #deploy-your-app-optional }
-
-Sie können optional Ihre FastAPI-App in der [FastAPI Cloud](https://fastapicloud.com) deployen, treten Sie der Warteliste bei, falls Sie es noch nicht getan haben. 🚀
-
-Wenn Sie bereits ein **FastAPI Cloud**-Konto haben (wir haben Sie von der Warteliste eingeladen 😉), können Sie Ihre Anwendung mit einem Befehl deployen.
-
-Vor dem Deployen, stellen Sie sicher, dass Sie eingeloggt sind:
-
-get-Operation gehen
-/// info | `@decorator` Info
+/// note | `@decorator` Info
Diese `@something`-Syntax wird in Python „Dekorator“ genannt.
@@ -361,7 +353,7 @@ Wenn Sie beispielsweise GraphQL verwenden, führen Sie normalerweise alle Aktion
///
-### Schritt 4: Definieren der **Pfadoperation-Funktion** { #step-4-define-the-path-operation-function }
+### Schritt 4: Die **Pfadoperation-Funktion** definieren { #step-4-define-the-path-operation-function }
Das ist unsere „**Pfadoperation-Funktion**“:
@@ -407,11 +399,11 @@ Stellen Sie Ihre App in der **[FastAPI Cloud](https://fastapicloud.com)** mit ei
**[FastAPI Cloud](https://fastapicloud.com)** wird vom selben Autor und Team hinter **FastAPI** entwickelt.
-Es vereinfacht den Prozess des Erstellens, Deployens und des Zugriffs auf eine API mit minimalem Aufwand.
+Es vereinfacht den Prozess des **Erstellens**, **Deployens** und des **Zugriffs** auf eine API mit minimalem Aufwand.
Es bringt die gleiche **Developer-Experience** beim Erstellen von Apps mit FastAPI auch zum **Deployment** in der Cloud. 🎉
-FastAPI Cloud ist der Hauptsponsor und Finanzierer der „FastAPI and friends“ Open-Source-Projekte. ✨
+FastAPI Cloud ist der Hauptsponsor und Finanzierer der *FastAPI and friends*-Open-Source-Projekte. ✨
#### Zu anderen Cloudanbietern deployen { #deploy-to-other-cloud-providers }
@@ -422,7 +414,7 @@ Folgen Sie den Anleitungen Ihres Cloudanbieters, um dort FastAPI-Apps bereitzust
## Zusammenfassung { #recap }
* Importieren Sie `FastAPI`.
-* Erstellen Sie eine `app` Instanz.
+* Erstellen Sie eine `app`-Instanz.
* Schreiben Sie einen **Pfadoperation-Dekorator** unter Verwendung von Dekoratoren wie `@app.get("/")`.
* Definieren Sie eine **Pfadoperation-Funktion**, zum Beispiel `def root(): ...`.
* Starten Sie den Entwicklungsserver mit dem Befehl `fastapi dev`.
diff --git a/docs/de/docs/tutorial/frontend.md b/docs/de/docs/tutorial/frontend.md
new file mode 100644
index 000000000..9cd4644d9
--- /dev/null
+++ b/docs/de/docs/tutorial/frontend.md
@@ -0,0 +1,133 @@
+# Frontend { #frontend }
+
+Sie können statische Frontend-Apps mit `app.frontend()` (oder `router.frontend()`) bereitstellen.
+
+Das ist nützlich für Frontend-Tools, die statische Dateien generieren, wie React mit Vite, TanStack Router, Astro, Vue, Svelte, Angular, Solid und andere.
+
+Mit diesen Tools haben Sie normalerweise einen Schritt, der das Frontend baut, mit einem Befehl wie:
+
+```bash
+npm run build
+```
+
+Das würde ein Verzeichnis wie `./dist/` mit Ihren Frontend-Dateien generieren.
+
+Sie können `app.frontend()` verwenden, um dieses Verzeichnis gemäß den Konventionen bereitzustellen, die von diesen Frontend-Frameworks benötigt werden.
+
+**FastAPI** prüft zuerst *Pfadoperationen*. Die Frontend-Dateien werden nur geprüft, wenn keine normale Route gepasst hat, sodass Ihre API nicht beeinträchtigt wird.
+
+## Ein Frontend bereitstellen { #serve-a-frontend }
+
+Nachdem Sie Ihr Frontend gebaut haben, zum Beispiel mit `npm run build`, legen Sie die generierten Dateien in ein Verzeichnis, zum Beispiel `dist`.
+
+Ihre Projektstruktur könnte so aussehen:
+
+```text
+.
+├── pyproject.toml
+├── app
+│ ├── __init__.py
+│ └── main.py
+└── dist
+ ├── index.html
+ └── assets
+ └── app.js
+```
+
+Stellen Sie es dann mit `app.frontend()` bereit:
+
+{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
+
+Damit kann ein Request für `/assets/app.js` `dist/assets/app.js` ausliefern.
+
+Wenn Sie außerdem eine **FastAPI**-*Pfadoperation* haben, gewinnt die *Pfadoperation*.
+
+## Clientseitiges Routing { #client-side-routing }
+
+Viele Frontend-Apps, einschließlich **Single-Page-Apps** (SPAs), verwenden clientseitiges Routing. Ein Pfad wie `/dashboard/settings` ist möglicherweise keine echte Datei, aber das Framework würde sich darum kümmern, ihn zu handhaben.
+
+Wenn also direkt auf diese URL zugegriffen wird (statt durch die App zu navigieren), sollte das Backend die Frontend-App von `index.html` bereitstellen, sodass das Frontend-Framework anschließend das clientseitige Routing handhaben kann.
+
+Verwenden Sie dafür `fallback="index.html"`:
+
+{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *}
+
+**FastAPI** verwendet diesen Fallback nur für `GET`- und `HEAD`-Requests, die wie Browser-Navigation aussehen. Fehlende Dateien wie JavaScript, CSS und Bilder geben weiterhin `404` zurück.
+
+Requests mit anderen Methoden, wie `POST` oder `PUT`, an Pfade, die nur zum Frontend-Fallback passen, geben ebenfalls `404` zurück. Reguläre **FastAPI**-*Pfadoperationen* haben weiterhin eine höhere Priorität als Frontend-Routen.
+
+/// tip | Tipp
+
+Standardmäßig hat `fallback` einen Wert von `fallback="auto"`. In den meisten Fällen müssen Sie `fallback` nicht angeben. Lesen Sie weiter unten die Details.
+
+///
+
+Das ist das, was Sie bei vielen Frontend-Apps möchten, die clientseitiges Routing verwenden, zum Beispiel React mit TanStack Router, Vue, Angular, SvelteKit oder Solid.
+
+## Benutzerdefinierte 404-Seite { #custom-404-page }
+
+Sie können auch eine statische `404.html`-Seite für fehlende Frontend-Pfade ausliefern:
+
+{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *}
+
+Diese Response behält einen Statuscode von `404`.
+
+In diesem Fall liefert **FastAPI** für fehlende Frontend-Pfade nicht `index.html` aus. Stattdessen wird die Datei `404.html` zurückgegeben.
+
+/// tip | Tipp
+
+Standardmäßig hat `fallback` einen Wert von `fallback="auto"`. Damit wird, wenn eine `404.html`-Datei gefunden wird, diese automatisch als Fallback verwendet.
+
+Sie können das `fallback`-Argument also normalerweise weglassen.
+
+///
+
+Das ist nützlich bei Frontend-Tools, die für jede Seite statische HTML-Dateien generieren, wie Astro.
+
+## Automatischer Fallback { #fallback-auto }
+
+Standardmäßig verwendet `app.frontend()` `fallback="auto"`.
+
+Wenn es im Frontend-Verzeichnis eine `404.html`-Datei gibt, liefern fehlende Frontend-Pfade diese Datei mit dem Statuscode `404` aus.
+
+Andernfalls, wenn es eine `index.html`-Datei gibt, liefern fehlende Browser-Navigationspfade `index.html` aus, was viele Frontend-Apps mit clientseitigem Routing erwarten.
+
+In den meisten Fällen können Sie also `app.frontend("/", directory="dist")` verwenden, ohne das `fallback`-Argument anzugeben.
+
+{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
+
+## Fallback deaktivieren { #disable-fallback }
+
+Wenn Sie keine Fallback-Datei für fehlende Frontend-Pfade ausliefern möchten, verwenden Sie `fallback=None`:
+
+{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *}
+
+Dann geben fehlende Frontend-Pfade das normale `404` zurück.
+
+## Verzeichnis prüfen { #check-directory }
+
+Standardmäßig prüft `app.frontend()`, dass das Verzeichnis existiert, wenn die App erstellt wird.
+
+Das hilft, Konfigurationsfehler früh zu erkennen. Wenn zum Beispiel das Output-Verzeichnis des Frontend-Builds fehlt, löst **FastAPI** beim Startup einen Fehler aus.
+
+Wenn Ihre Frontend-Dateien später erstellt werden, zum Beispiel durch einen separaten Build-Schritt, nachdem das App-Objekt erstellt wurde, setzen Sie `check_dir=False`:
+
+{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *}
+
+Mit `check_dir=False` prüft **FastAPI** das Verzeichnis nicht, wenn die App erstellt wird. Wenn das konfigurierte Verzeichnis beim Verarbeiten eines Requests immer noch fehlt, löst **FastAPI** dann einen Fehler aus.
+
+## Mit `APIRouter` verwenden { #use-it-with-apirouter }
+
+Sie können Frontend-Dateien auch zu einem `APIRouter` hinzufügen und ihn mit einem Präfix einbinden:
+
+{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *}
+
+In diesem Beispiel werden Frontend-Pfade unter `/app` bereitgestellt.
+
+Alle regulären *Pfadoperationen* in der App haben weiterhin Vorrang, auch in anderen Routern.
+
+## Nur statischer Build-Output { #static-build-output-only }
+
+`app.frontend()` liefert Dateien aus, die bereits von Ihrem Frontend-Build generiert wurden.
+
+Es führt kein serverseitiges Rendering aus. Es ist für Frontend-Frameworks gedacht, die statische Dateien generieren, nicht für Frameworks, die dynamisches Rendering auf dem Server für jeden Request benötigen.
diff --git a/docs/de/docs/tutorial/handling-errors.md b/docs/de/docs/tutorial/handling-errors.md
index 261831a8e..17e2767fe 100644
--- a/docs/de/docs/tutorial/handling-errors.md
+++ b/docs/de/docs/tutorial/handling-errors.md
@@ -8,12 +8,12 @@ Sie könnten dem Client mitteilen müssen, dass:
* Der Client nicht genügend Berechtigungen für diese Operation hat.
* Der Client keinen Zugriff auf diese Ressource hat.
-* Die Ressource, auf die der Client versucht hat, zuzugreifen, nicht existiert.
+* Das Item, auf das der Client versucht hat zuzugreifen, nicht existiert.
* usw.
In diesen Fällen würden Sie normalerweise einen **HTTP-Statuscode** im Bereich **400** (von 400 bis 499) zurückgeben.
-Dies ist vergleichbar mit den HTTP-Statuscodes im Bereich 200 (von 200 bis 299). Diese „200“-Statuscodes bedeuten, dass der Request in irgendeiner Weise erfolgreich war.
+Dies ist vergleichbar mit den HTTP-Statuscodes im Bereich 200 (von 200 bis 299). Diese „200“-Statuscodes bedeuten, dass der Request irgendwie ein „Erfolg“ war.
Die Statuscodes im Bereich 400 bedeuten hingegen, dass es einen Fehler seitens des Clients gab.
@@ -37,7 +37,7 @@ Das bedeutet auch, wenn Sie sich innerhalb einer Hilfsfunktion befinden, die Sie
Der Vorteil des Auslösens einer Exception gegenüber dem Zurückgeben eines Wertes wird im Abschnitt über Abhängigkeiten und Sicherheit deutlicher werden.
-In diesem Beispiel lösen wir eine Exception mit einem Statuscode von `404` aus, wenn der Client einen Artikel mit einer nicht existierenden ID anfordert:
+In diesem Beispiel lösen wir eine Exception mit einem Statuscode von `404` aus, wenn der Client ein Item mit einer nicht existierenden ID anfordert:
{* ../../docs_src/handling_errors/tutorial001_py310.py hl[11] *}
@@ -51,7 +51,7 @@ Wenn der Client `http://example.com/items/foo` anfordert (ein `item_id` `"foo"`)
}
```
-Aber wenn der Client `http://example.com/items/bar` anfordert (ein nicht-existierendes `item_id` `"bar"`), erhält er einen HTTP-Statuscode 404 (der „Not Found“-Error) und eine JSON-Response wie:
+Aber wenn der Client `http://example.com/items/bar` anfordert (ein nicht-existierendes `item_id` `"bar"`), erhält er einen HTTP-Statuscode 404 (der „not found“-Error) und eine JSON-Response wie:
```JSON
{
@@ -71,7 +71,7 @@ Diese werden von **FastAPI** automatisch gehandhabt und in JSON konvertiert.
## Benutzerdefinierte Header hinzufügen { #add-custom-headers }
-Es gibt Situationen, in denen es nützlich ist, dem HTTP-Error benutzerdefinierte Header hinzuzufügen. Zum Beispiel in einigen Sicherheitsszenarien.
+Es gibt Situationen, in denen es nützlich ist, dem HTTP-Error benutzerdefinierte Header hinzuzufügen. Zum Beispiel für einige Arten von Sicherheit.
Sie werden es wahrscheinlich nicht direkt in Ihrem Code verwenden müssen.
@@ -117,7 +117,7 @@ Diese Handler sind dafür verantwortlich, die Default-JSON-Responses zurückzuge
Sie können diese Exceptionhandler mit Ihren eigenen überschreiben.
-### Überschreiben von Request-Validierungs-Exceptions { #override-request-validation-exceptions }
+### Request-Validierungs-Exceptions überschreiben { #override-request-validation-exceptions }
Wenn ein Request ungültige Daten enthält, löst **FastAPI** intern einen `RequestValidationError` aus.
@@ -153,7 +153,7 @@ Validation errors:
Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to parse string as an integer
```
-### Überschreiben des `HTTPException`-Fehlerhandlers { #override-the-httpexception-error-handler }
+### Den `HTTPException`-Fehlerhandler überschreiben { #override-the-httpexception-error-handler }
Auf die gleiche Weise können Sie den `HTTPException`-Handler überschreiben.
@@ -177,7 +177,7 @@ Das bedeutet aber auch, dass, wenn Sie ihn einfach in einen String umwandeln und
///
-### Verwenden des `RequestValidationError`-Bodys { #use-the-requestvalidationerror-body }
+### Den `RequestValidationError`-Body verwenden { #use-the-requestvalidationerror-body }
Der `RequestValidationError` enthält den empfangenen `body` mit den ungültigen Daten.
@@ -185,7 +185,7 @@ Sie könnten diesen während der Entwicklung Ihrer Anwendung verwenden, um den B
{* ../../docs_src/handling_errors/tutorial005_py310.py hl[14] *}
-Versuchen Sie nun, einen ungültigen Artikel zu senden:
+Versuchen Sie nun, ein ungültiges Item zu senden:
```JSON
{
@@ -194,7 +194,7 @@ Versuchen Sie nun, einen ungültigen Artikel zu senden:
}
```
-Sie erhalten eine Response, die Ihnen sagt, dass die Daten ungültig sind und die den empfangenen Body enthält:
+Sie erhalten eine Response, die Ihnen sagt, dass die Daten ungültig sind, und die den empfangenen Body enthält:
```JSON hl_lines="12-15"
{
diff --git a/docs/de/docs/tutorial/index.md b/docs/de/docs/tutorial/index.md
index 4b5272ebd..c0f25c916 100644
--- a/docs/de/docs/tutorial/index.md
+++ b/docs/de/docs/tutorial/index.md
@@ -1,5 +1,6 @@
# Tutorial – Benutzerhandbuch { #tutorial-user-guide }
+
Dieses Tutorial zeigt Ihnen Schritt für Schritt, wie Sie **FastAPI** mit den meisten seiner Funktionen verwenden können.
Jeder Abschnitt baut schrittweise auf den vorhergehenden auf, ist jedoch in einzelne Themen gegliedert, sodass Sie direkt zu einem bestimmten Thema übergehen können, um Ihre spezifischen API-Anforderungen zu lösen.
diff --git a/docs/de/docs/tutorial/metadata.md b/docs/de/docs/tutorial/metadata.md
index 498ad83a8..e6549aa3c 100644
--- a/docs/de/docs/tutorial/metadata.md
+++ b/docs/de/docs/tutorial/metadata.md
@@ -11,7 +11,7 @@ Sie können die folgenden Felder festlegen, die in der OpenAPI-Spezifikation und
| `title` | `str` | Der Titel der API. |
| `summary` | `str` | Eine kurze Zusammenfassung der API. Verfügbar seit OpenAPI 3.1.0, FastAPI 0.99.0. |
| `description` | `str` | Eine kurze Beschreibung der API. Kann Markdown verwenden. |
-| `version` | `string` | Die Version der API. Das ist die Version Ihrer eigenen Anwendung, nicht die von OpenAPI. Zum Beispiel `2.5.0`. |
+| `version` | `str` | Die Version der API. Das ist die Version Ihrer eigenen Anwendung, nicht die von OpenAPI. Zum Beispiel `2.5.0`. |
| `terms_of_service` | `str` | Eine URL zu den Nutzungsbedingungen für die API. Falls angegeben, muss es sich um eine URL handeln. |
| `contact` | `dict` | Die Kontaktinformationen für die freigegebene API. Kann mehrere Felder enthalten. contact-Felder| Parameter | Typ | Beschreibung |
|---|---|---|
name | str | Der identifizierende Name der Kontaktperson/Organisation. |
url | str | Die URL, die auf die Kontaktinformationen verweist. MUSS im Format einer URL vorliegen. |
email | str | Die E-Mail-Adresse der Kontaktperson/Organisation. MUSS im Format einer E-Mail-Adresse vorliegen. |
license_info-Felder| Parameter | Typ | Beschreibung |
|---|---|---|
name | str | ERFORDERLICH (wenn eine license_info festgelegt ist). Der für die API verwendete Lizenzname. |
identifier | str | Ein [SPDX](https://spdx.org/licenses/)-Lizenzausdruck für die API. Das Feld identifier und das Feld url schließen sich gegenseitig aus. Verfügbar seit OpenAPI 3.1.0, FastAPI 0.99.0. |
url | str | Eine URL zur Lizenz, die für die API verwendet wird. MUSS im Format einer URL vorliegen. |
-### Tags mittels Enumeration { #tags-with-enums }
+### Tags mit Enums { #tags-with-enums }
-Wenn Sie eine große Anwendung haben, können sich am Ende **viele Tags** anhäufen, und Sie möchten sicherstellen, dass Sie für verwandte *Pfadoperationen* immer den **gleichen Tag** verwenden.
+Wenn Sie eine große Anwendung haben, können sich am Ende **mehrere Tags** anhäufen, und Sie möchten sicherstellen, dass Sie für verwandte *Pfadoperationen* immer den **gleichen Tag** verwenden.
-In diesem Fall macht es Sinn, die Tags in einem `Enum` zu speichern.
+In diesen Fällen kann es sinnvoll sein, die Tags in einem `Enum` zu speichern.
**FastAPI** unterstützt das auf die gleiche Weise wie einfache Strings:
@@ -72,13 +72,13 @@ Sie können die Response mit dem Parameter `response_description` beschreiben:
{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[18] *}
-/// info | Info
+/// note | Hinweis
Beachten Sie, dass sich `response_description` speziell auf die Response bezieht, während `description` sich generell auf die *Pfadoperation* bezieht.
///
-/// check | Testen
+/// tip | Tipp
OpenAPI verlangt, dass jede *Pfadoperation* über eine Beschreibung der Response verfügt.
@@ -104,4 +104,4 @@ Vergleichen Sie, wie deprecatete und nicht-deprecatete *Pfadoperationen* aussehe
## Zusammenfassung { #recap }
-Sie können auf einfache Weise Metadaten für Ihre *Pfadoperationen* definieren, indem Sie den *Pfadoperation-Dekoratoren* Parameter hinzufügen.
+Sie können Ihre *Pfadoperationen* einfach konfigurieren und Metadaten hinzufügen, indem Sie den *Pfadoperation-Dekoratoren* Parameter übergeben.
diff --git a/docs/de/docs/tutorial/path-params-numeric-validations.md b/docs/de/docs/tutorial/path-params-numeric-validations.md
index 76c782c52..59464ac8f 100644
--- a/docs/de/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/de/docs/tutorial/path-params-numeric-validations.md
@@ -8,7 +8,7 @@ Importieren Sie zuerst `Path` von `fastapi`, und importieren Sie `Annotated`:
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
-/// info | Info
+/// note | Hinweis
FastAPI hat in Version 0.95.0 Unterstützung für `Annotated` hinzugefügt und es zur Verwendung empfohlen.
@@ -131,7 +131,7 @@ Und Sie können auch Zahlenvalidierungen deklarieren:
* `lt`: `l`ess `t`han (kleiner als)
* `le`: `l`ess than or `e`qual (kleiner oder gleich)
-/// info | Info
+/// note | Hinweis
`Query`, `Path`, und andere Klassen, die Sie später sehen werden, sind Unterklassen einer gemeinsamen `Param`-Klasse.
diff --git a/docs/de/docs/tutorial/path-params.md b/docs/de/docs/tutorial/path-params.md
index 0e0a3bdbd..d462a7407 100644
--- a/docs/de/docs/tutorial/path-params.md
+++ b/docs/de/docs/tutorial/path-params.md
@@ -20,7 +20,7 @@ Sie können den Typ eines Pfad-Parameters in der Argumentliste der Funktion dekl
In diesem Fall wird `item_id` als `int` deklariert, also als Ganzzahl.
-/// check | Testen
+/// tip | Tipp
Dadurch erhalten Sie Editor-Unterstützung innerhalb Ihrer Funktion, mit Fehlerprüfungen, Codevervollständigung, usw.
@@ -34,7 +34,7 @@ Wenn Sie dieses Beispiel ausführen und Ihren Browser unter [http://127.0.0.1:80
{"item_id":3}
```
-/// check | Testen
+/// tip | Tipp
Beachten Sie, dass der Wert, den Ihre Funktion erhält und zurückgibt, die Zahl `3` ist, also ein `int`. Nicht der String „3“, also ein `str`.
@@ -66,7 +66,7 @@ Der Pfad-Parameter `item_id` hatte den Wert „foo“, was kein `int` ist.
Die gleiche Fehlermeldung würde angezeigt werden, wenn Sie ein `float` (also eine Kommazahl) statt eines `int`s übergeben würden, wie etwa in: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
-/// check | Testen
+/// tip | Tipp
Sprich, mit der gleichen Python-Typdeklaration gibt Ihnen **FastAPI** Datenvalidierung.
@@ -82,7 +82,7 @@ Wenn Sie die Seite [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) in I
-/// check | Testen
+/// tip | Tipp
Wiederum, mit dieser gleichen Python-Typdeklaration gibt Ihnen **FastAPI** eine automatische, interaktive Dokumentation (verwendet die Swagger-Benutzeroberfläche).
diff --git a/docs/de/docs/tutorial/query-params-str-validations.md b/docs/de/docs/tutorial/query-params-str-validations.md
index ed277456e..bec5f574a 100644
--- a/docs/de/docs/tutorial/query-params-str-validations.md
+++ b/docs/de/docs/tutorial/query-params-str-validations.md
@@ -29,7 +29,7 @@ Um dies zu erreichen, importieren Sie zuerst:
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | Info
+/// note | Hinweis
FastAPI hat Unterstützung für `Annotated` hinzugefügt (und begonnen, es zu empfehlen) in der Version 0.95.0.
@@ -81,7 +81,7 @@ FastAPI wird nun:
* Die Daten **validieren**, um sicherzustellen, dass die Länge maximal 50 Zeichen beträgt
* Einen **klaren Fehler** für den Client anzeigen, wenn die Daten ungültig sind
-* Den Parameter in der OpenAPI-Schema-*Pfadoperation* **dokumentieren** (sodass er in der **automatischen Dokumentation** angezeigt wird)
+* Den Parameter in der OpenAPI-Schema-*Pfadoperation* **dokumentieren** (sodass er in der **automatischen Dokumentationsoberfläche** angezeigt wird)
## Alternative (alt): `Query` als Defaultwert { #alternative-old-query-as-the-default-value }
@@ -179,7 +179,7 @@ Dieses spezielle Suchmuster im regulären Ausdruck überprüft, dass der erhalte
Wenn Sie sich mit all diesen **„regulärer Ausdruck“**-Ideen verloren fühlen, keine Sorge. Sie sind ein schwieriges Thema für viele Menschen. Sie können noch viele Dinge tun, ohne reguläre Ausdrücke direkt zu benötigen.
-Aber nun wissen Sie, dass Sie sie in **FastAPI** immer dann verwenden können, wenn Sie sie brauchen.
+Nun wissen Sie, dass Sie sie in **FastAPI** immer dann verwenden können, wenn Sie sie brauchen.
## Defaultwerte { #default-values }
@@ -276,7 +276,7 @@ Wenn Sie zu:
http://localhost:8000/items/
```
-gehen, wird der Default für `q` sein: `["foo", "bar"]`, und Ihre Response wird sein:
+gehen, wird der Defaultwert für `q` sein: `["foo", "bar"]`, und Ihre Response wird sein:
```JSON
{
@@ -311,7 +311,7 @@ Diese Informationen werden in das generierte OpenAPI aufgenommen und von den Dok
Beachten Sie, dass verschiedene Tools möglicherweise unterschiedliche Unterstützungslevels für OpenAPI haben.
-Einige davon könnten noch nicht alle zusätzlichen Informationen anzuzeigen, die Sie erklärten, obwohl in den meisten Fällen die fehlende Funktionalität bereits in der Entwicklung geplant ist.
+Einige davon könnten noch nicht alle zusätzlichen Informationen anzeigen, die Sie deklariert haben, obwohl in den meisten Fällen die fehlende Funktionalität bereits in der Entwicklung geplant ist.
///
@@ -335,7 +335,7 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
Aber `item-query` ist kein gültiger Name für eine Variable in Python.
-Der am ähnlichsten wäre `item_query`.
+Am ähnlichsten wäre `item_query`.
Aber Sie benötigen dennoch, dass er genau `item-query` ist ...
@@ -347,7 +347,7 @@ Dann können Sie ein `alias` deklarieren, und dieser Alias wird verwendet, um de
Nehmen wir an, Ihnen gefällt dieser Parameter nicht mehr.
-Sie müssen ihn eine Weile dort belassen, da es Clients gibt, die ihn verwenden, aber Sie möchten, dass die Dokumentation ihn klar als deprecatet anzeigt.
+Sie müssen ihn eine Weile dort belassen, da es Clients gibt, die ihn verwenden, aber Sie möchten, dass die Dokumentation ihn klar als deprecatet anzeigt.
Dann übergeben Sie den Parameter `deprecated=True` an `Query`:
@@ -381,7 +381,7 @@ Zum Beispiel überprüft dieser benutzerdefinierte Validator, ob die Artikel-ID
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | Info
+/// note | Hinweis
Dies ist verfügbar seit Pydantic Version 2 oder höher. 😎
@@ -395,7 +395,7 @@ Diese benutzerdefinierten Validatoren sind für Dinge gedacht, die einfach mit d
///
-### Dieses Codebeispiel verstehen { #understand-that-code }
+### Diesen Code verstehen { #understand-that-code }
Der wichtige Punkt ist einfach die Verwendung von **`AfterValidator` mit einer Funktion innerhalb von `Annotated`**. Fühlen Sie sich frei, diesen Teil zu überspringen. 🤸
@@ -403,9 +403,9 @@ Der wichtige Punkt ist einfach die Verwendung von **`AfterValidator` mit einer F
Aber wenn Sie neugierig auf dieses spezielle Codebeispiel sind und immer noch Spaß haben, hier sind einige zusätzliche Details.
-#### Zeichenkette mit `value.startswith()` { #string-with-value-startswith }
+#### String mit `value.startswith()` { #string-with-value-startswith }
-Haben Sie bemerkt? Eine Zeichenkette mit `value.startswith()` kann ein Tuple übernehmen, und es wird jeden Wert im Tuple überprüfen:
+Haben Sie bemerkt? Ein String mit `value.startswith()` kann ein Tuple übernehmen, und es wird jeden Wert im Tuple überprüfen:
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[16:19] hl[17] *}
diff --git a/docs/de/docs/tutorial/query-params.md b/docs/de/docs/tutorial/query-params.md
index 56aca4c2e..86ec9f4ab 100644
--- a/docs/de/docs/tutorial/query-params.md
+++ b/docs/de/docs/tutorial/query-params.md
@@ -23,7 +23,7 @@ Aber wenn Sie sie mit Python-Typen deklarieren (im obigen Beispiel als `int`), w
Die gleichen Prozesse, die für Pfad-Parameter gelten, werden auch auf Query-Parameter angewendet:
-* Editor Unterstützung (natürlich)
+* Editor-Unterstützung (natürlich)
* Daten-„Parsen“
* Datenvalidierung
* Automatische Dokumentation
@@ -65,19 +65,19 @@ Auf die gleiche Weise können Sie optionale Query-Parameter deklarieren, indem S
In diesem Fall wird der Funktionsparameter `q` optional und standardmäßig `None` sein.
-/// check | Testen
+/// tip | Tipp
-Beachten Sie auch, dass **FastAPI** intelligent genug ist, um zu erkennen, dass `item_id` ein Pfad-Parameter ist und `q` keiner, daher muss letzteres ein Query-Parameter sein.
+Beachten Sie auch, dass **FastAPI** intelligent genug ist, um zu erkennen, dass der Pfad-Parameter `item_id` ein Pfad-Parameter ist und `q` keiner, daher muss letzteres ein Query-Parameter sein.
///
-## Query-Parameter Typkonvertierung { #query-parameter-type-conversion }
+## Typkonvertierung von Query-Parametern { #query-parameter-type-conversion }
Sie können auch `bool`-Typen deklarieren, und sie werden konvertiert:
{* ../../docs_src/query_params/tutorial003_py310.py hl[7] *}
-Wenn Sie nun zu:
+Wenn Sie in diesem Fall zu:
```
http://127.0.0.1:8000/items/foo?short=1
@@ -109,6 +109,7 @@ http://127.0.0.1:8000/items/foo?short=yes
gehen, oder zu irgendeiner anderen Variante der Groß-/Kleinschreibung (Alles groß, Anfangsbuchstabe groß, usw.), dann wird Ihre Funktion den Parameter `short` mit dem `bool`-Wert `True` sehen, ansonsten mit dem Wert `False`.
+
## Mehrere Pfad- und Query-Parameter { #multiple-path-and-query-parameters }
Sie können mehrere Pfad-Parameter und Query-Parameter gleichzeitig deklarieren, **FastAPI** weiß, welches welcher ist.
@@ -121,7 +122,7 @@ Parameter werden anhand ihres Namens erkannt:
## Erforderliche Query-Parameter { #required-query-parameters }
-Wenn Sie einen Defaultwert für Nicht-Pfad-Parameter deklarieren (Bis jetzt haben wir nur Query-Parameter gesehen), dann ist der Parameter nicht erforderlich.
+Wenn Sie einen Defaultwert für Nicht-Pfad-Parameter deklarieren (bis jetzt haben wir nur Query-Parameter gesehen), dann ist der Parameter nicht erforderlich.
Wenn Sie keinen spezifischen Wert haben wollen, sondern der Parameter einfach optional sein soll, dann setzen Sie den Defaultwert auf `None`.
@@ -129,7 +130,7 @@ Aber wenn Sie wollen, dass ein Query-Parameter erforderlich ist, vergeben Sie ei
{* ../../docs_src/query_params/tutorial005_py310.py hl[6:7] *}
-Hier ist `needy` ein erforderlicher Query-Parameter vom Typ `str`.
+Hier ist der Query-Parameter `needy` ein erforderlicher Query-Parameter vom Typ `str`.
Wenn Sie in Ihrem Browser eine URL wie:
@@ -137,7 +138,7 @@ Wenn Sie in Ihrem Browser eine URL wie:
http://127.0.0.1:8000/items/foo-item
```
-... öffnen, ohne den benötigten Parameter `needy`, dann erhalten Sie einen Fehler wie den folgenden:
+... öffnen, ohne den erforderlichen Parameter `needy` hinzuzufügen, dann erhalten Sie einen Fehler wie den folgenden:
```JSON
{
@@ -161,7 +162,7 @@ Da `needy` ein erforderlicher Parameter ist, müssen Sie ihn in der URL setzen:
http://127.0.0.1:8000/items/foo-item?needy=sooooneedy
```
-... Das funktioniert:
+... das funktioniert:
```JSON
{
@@ -174,7 +175,7 @@ Und natürlich können Sie einige Parameter als erforderlich, einige mit Default
{* ../../docs_src/query_params/tutorial006_py310.py hl[8] *}
-In diesem Fall gibt es drei Query-Parameter:
+In diesem Fall gibt es 3 Query-Parameter:
* `needy`, ein erforderlicher `str`.
* `skip`, ein `int` mit einem Defaultwert `0`.
diff --git a/docs/de/docs/tutorial/request-files.md b/docs/de/docs/tutorial/request-files.md
index a4c1318ef..7a344604a 100644
--- a/docs/de/docs/tutorial/request-files.md
+++ b/docs/de/docs/tutorial/request-files.md
@@ -2,7 +2,7 @@
Sie können Dateien, die vom Client hochgeladen werden, mithilfe von `File` definieren.
-/// info | Info
+/// note | Hinweis
Um hochgeladene Dateien zu empfangen, installieren Sie zuerst [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -24,11 +24,11 @@ Importieren Sie `File` und `UploadFile` von `fastapi`:
## `File`-Parameter definieren { #define-file-parameters }
-Erstellen Sie Datei-Parameter, so wie Sie es auch mit `Body` und `Form` machen würden:
+Erstellen Sie Datei-Parameter, so wie Sie es auch mit `Body` oder `Form` machen würden:
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info | Info
+/// note | Hinweis
`File` ist eine Klasse, die direkt von `Form` erbt.
@@ -44,7 +44,7 @@ Um Dateibodys zu deklarieren, müssen Sie `File` verwenden, da diese Parameter s
Die Dateien werden als „Formulardaten“ hochgeladen.
-Wenn Sie den Typ Ihrer *Pfadoperation-Funktion* als `bytes` deklarieren, wird **FastAPI** die Datei für Sie auslesen, und Sie erhalten den Inhalt als `bytes`.
+Wenn Sie den Typ des Parameters Ihrer *Pfadoperation-Funktion* als `bytes` deklarieren, wird **FastAPI** die Datei für Sie auslesen, und Sie erhalten den Inhalt als `bytes`.
Bedenken Sie, dass das bedeutet, dass sich der gesamte Inhalt der Datei im Arbeitsspeicher befindet. Das wird für kleinere Dateien gut funktionieren.
@@ -63,27 +63,27 @@ Definieren Sie einen Datei-Parameter mit dem Typ `UploadFile`:
* Eine Datei, die bis zu einem bestimmten Größen-Limit im Arbeitsspeicher behalten wird, und wenn das Limit überschritten wird, auf der Festplatte gespeichert wird.
* Das bedeutet, es wird für große Dateien wie Bilder, Videos, große Binärdateien, usw. gut funktionieren, ohne den ganzen Arbeitsspeicher aufzubrauchen.
* Sie können Metadaten aus der hochgeladenen Datei auslesen.
-* Es hat eine [dateiartige](https://docs.python.org/3/glossary.html#term-file-like-object) `async`hrone Schnittstelle.
+* Es hat eine [dateiartige](https://docs.python.org/3/glossary.html#term-file-like-object) `async`-Schnittstelle.
* Es stellt ein tatsächliches Python-[`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile)-Objekt bereit, welches Sie direkt anderen Bibliotheken übergeben können, die ein dateiartiges Objekt erwarten.
### `UploadFile` { #uploadfile }
`UploadFile` hat die folgenden Attribute:
-* `filename`: Ein `str` mit dem ursprünglichen Namen der hochgeladenen Datei (z. B. `meinbild.jpg`).
+* `filename`: Ein `str` mit dem ursprünglichen Namen der hochgeladenen Datei (z. B. `myimage.jpg`).
* `content_type`: Ein `str` mit dem Inhaltstyp (MIME-Typ / Medientyp) (z. B. `image/jpeg`).
-* `file`: Ein [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) (ein [dateiartiges](https://docs.python.org/3/glossary.html#term-file-like-object) Objekt). Das ist das tatsächliche Python-Objekt, das Sie direkt anderen Funktionen oder Bibliotheken übergeben können, welche ein „file-like“-Objekt erwarten.
+* `file`: Ein [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) (ein [dateiartiges](https://docs.python.org/3/glossary.html#term-file-like-object) Objekt). Das ist das tatsächliche Python-Dateiobjekt, das Sie direkt anderen Funktionen oder Bibliotheken übergeben können, welche ein „file-like“-Objekt erwarten.
-`UploadFile` hat die folgenden `async`hronen Methoden. Sie alle rufen die entsprechenden Methoden des darunterliegenden Datei-Objekts auf (wobei intern `SpooledTemporaryFile` verwendet wird).
+`UploadFile` hat die folgenden `async`-Methoden. Sie alle rufen die entsprechenden Methoden des darunterliegenden Datei-Objekts auf (wobei intern `SpooledTemporaryFile` verwendet wird).
-* `write(daten)`: Schreibt `daten` (`str` oder `bytes`) in die Datei.
-* `read(anzahl)`: Liest `anzahl` (`int`) bytes/Zeichen aus der Datei.
-* `seek(versatz)`: Geht zur Position `versatz` (`int`) in der Datei.
+* `write(data)`: Schreibt `data` (`str` oder `bytes`) in die Datei.
+* `read(size)`: Liest `size` (`int`) Bytes/Zeichen aus der Datei.
+* `seek(offset)`: Geht zur Byte-Position `offset` (`int`) in der Datei.
* z. B. würde `await myfile.seek(0)` zum Anfang der Datei gehen.
* Das ist besonders dann nützlich, wenn Sie `await myfile.read()` einmal ausführen und dann diese Inhalte erneut auslesen müssen.
* `close()`: Schließt die Datei.
-Da alle diese Methoden `async`hron sind, müssen Sie sie „await“en („erwarten“).
+Da alle diese Methoden `async`-Methoden sind, müssen Sie sie „await“en („erwarten“).
Zum Beispiel können Sie innerhalb einer `async` *Pfadoperation-Funktion* den Inhalt wie folgt auslesen:
@@ -105,7 +105,7 @@ Wenn Sie die `async`-Methoden verwenden, führt **FastAPI** die Datei-Methoden i
/// note | Technische Details zu Starlette
-FastAPIs `UploadFile` erbt direkt von Starlettes `UploadFile`, fügt aber ein paar notwendige Teile hinzu, um es kompatibel mit **Pydantic** und anderen Teilen von FastAPI zu machen.
+**FastAPI**s `UploadFile` erbt direkt von **Starlette**s `UploadFile`, fügt aber ein paar notwendige Teile hinzu, um es kompatibel mit **Pydantic** und anderen Teilen von FastAPI zu machen.
///
@@ -113,15 +113,15 @@ FastAPIs `UploadFile` erbt direkt von Starlettes `UploadFile`, fügt aber ein pa
Der Weg, wie HTML-Formulare (``) die Daten zum Server senden, verwendet normalerweise eine „spezielle“ Kodierung für diese Daten. Diese unterscheidet sich von JSON.
-**FastAPI** stellt sicher, dass diese Daten korrekt ausgelesen werden, statt JSON zu erwarten.
+**FastAPI** stellt sicher, dass diese Daten von der richtigen Stelle ausgelesen werden, statt JSON zu erwarten.
/// note | Technische Details
-Daten aus Formularen werden, wenn es keine Dateien sind, normalerweise mit dem „media type“ `application/x-www-form-urlencoded` kodiert.
+Daten aus Formularen werden, wenn sie keine Dateien enthalten, normalerweise mit dem „media type“ `application/x-www-form-urlencoded` kodiert.
Sollte das Formular aber Dateien enthalten, dann werden diese mit `multipart/form-data` kodiert. Wenn Sie `File` verwenden, wird **FastAPI** wissen, dass es die Dateien vom korrekten Teil des Bodys holen muss.
-Wenn Sie mehr über diese Kodierungen und Formularfelder lesen möchten, besuchen Sie die [MDN-Webdokumentation für `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
+Wenn Sie mehr über diese Kodierungen und Formularfelder lesen möchten, besuchen Sie die [MDN-Webdokumentation für `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
///
@@ -149,7 +149,7 @@ Sie können auch `File()` mit `UploadFile` verwenden, um zum Beispiel zusätzlic
Es ist auch möglich, mehrere Dateien gleichzeitig hochzuladen.
-Diese werden demselben Formularfeld zugeordnet, welches mit den Formulardaten gesendet wird.
+Diese werden demselben „Formularfeld“ zugeordnet, welches mittels „Formulardaten“ gesendet wird.
Um das zu machen, deklarieren Sie eine Liste von `bytes` oder `UploadFile`s:
diff --git a/docs/de/docs/tutorial/request-form-models.md b/docs/de/docs/tutorial/request-form-models.md
index f3ddaee81..b40d60d0b 100644
--- a/docs/de/docs/tutorial/request-form-models.md
+++ b/docs/de/docs/tutorial/request-form-models.md
@@ -2,7 +2,7 @@
Sie können **Pydantic-Modelle** verwenden, um **Formularfelder** in FastAPI zu deklarieren.
-/// info | Info
+/// note | Hinweis
Um Formulare zu verwenden, installieren Sie zuerst [`python-multipart`](https://github.com/Kludex/python-multipart).
diff --git a/docs/de/docs/tutorial/request-forms-and-files.md b/docs/de/docs/tutorial/request-forms-and-files.md
index 8b4e85c0d..98e542851 100644
--- a/docs/de/docs/tutorial/request-forms-and-files.md
+++ b/docs/de/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
Sie können gleichzeitig Dateien und Formulardaten mit `File` und `Form` definieren.
-/// info | Info
+/// note | Hinweis
Um hochgeladene Dateien und/oder Formulardaten zu empfangen, installieren Sie zuerst [`python-multipart`](https://github.com/Kludex/python-multipart).
diff --git a/docs/de/docs/tutorial/request-forms.md b/docs/de/docs/tutorial/request-forms.md
index bc2578c01..aedcd4a51 100644
--- a/docs/de/docs/tutorial/request-forms.md
+++ b/docs/de/docs/tutorial/request-forms.md
@@ -1,8 +1,9 @@
# Formulardaten { #form-data }
+
Wenn Sie Felder aus Formularen statt JSON empfangen müssen, können Sie `Form` verwenden.
-/// info | Info
+/// note | Hinweis
Um Formulare zu verwenden, installieren Sie zuerst [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -22,7 +23,7 @@ Importieren Sie `Form` von `fastapi`:
## `Form`-Parameter definieren { #define-form-parameters }
-Erstellen Sie Formular-Parameter, so wie Sie es auch mit `Body` und `Query` machen würden:
+Erstellen Sie Formular-Parameter, so wie Sie es auch mit `Body` oder `Query` machen würden:
{* ../../docs_src/request_forms/tutorial001_an_py310.py hl[9] *}
@@ -32,7 +33,7 @@ Die Spezifikation erfordert, dass die Felder ex
Mit `Form` haben Sie die gleichen Konfigurationsmöglichkeiten wie mit `Body` (und `Query`, `Path`, `Cookie`), inklusive Validierung, Beispielen, einem Alias (z. B. `user-name` statt `username`), usw.
-/// info | Info
+/// note | Hinweis
`Form` ist eine Klasse, die direkt von `Body` erbt.
@@ -56,7 +57,7 @@ Daten aus Formularen werden normalerweise mit dem „med
Wenn das Formular stattdessen Dateien enthält, werden diese mit `multipart/form-data` kodiert. Im nächsten Kapitel erfahren Sie mehr über die Handhabung von Dateien.
-Wenn Sie mehr über Formularfelder und ihre Kodierungen lesen möchten, besuchen Sie die [MDN-Webdokumentation für `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
+Wenn Sie mehr über Formularfelder und ihre Kodierungen lesen möchten, besuchen Sie die [MDN-Webdokumentation für `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
///
diff --git a/docs/de/docs/tutorial/response-model.md b/docs/de/docs/tutorial/response-model.md
index 0aafda954..2b580bd6d 100644
--- a/docs/de/docs/tutorial/response-model.md
+++ b/docs/de/docs/tutorial/response-model.md
@@ -72,7 +72,7 @@ Im Folgenden deklarieren wir ein `UserIn`-Modell; es enthält ein Klartext-Passw
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | Info
+/// note | Hinweis
Um `EmailStr` zu verwenden, installieren Sie zuerst [`email-validator`](https://github.com/JoshData/python-email-validator).
@@ -251,7 +251,7 @@ Wenn Sie also den Artikel mit der ID `foo` bei der *Pfadoperation* anfragen, wir
}
```
-/// info | Info
+/// note | Hinweis
Sie können auch:
diff --git a/docs/de/docs/tutorial/response-status-code.md b/docs/de/docs/tutorial/response-status-code.md
index a0018a13d..63962829d 100644
--- a/docs/de/docs/tutorial/response-status-code.md
+++ b/docs/de/docs/tutorial/response-status-code.md
@@ -1,5 +1,6 @@
# Response-Statuscode { #response-status-code }
+
Genauso wie Sie ein Responsemodell angeben können, können Sie auch den HTTP-Statuscode für die Response mit dem Parameter `status_code` in jeder der *Pfadoperationen* deklarieren:
* `@app.get()`
@@ -18,7 +19,7 @@ Beachten Sie, dass `status_code` ein Parameter der „Dekorator“-Methode ist (
Dem `status_code`-Parameter wird eine Zahl mit dem HTTP-Statuscode übergeben.
-/// info | Info
+/// note | Hinweis
Alternativ kann `status_code` auch ein `IntEnum` erhalten, wie etwa Pythons [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus).
diff --git a/docs/de/docs/tutorial/schema-extra-example.md b/docs/de/docs/tutorial/schema-extra-example.md
index bdb67bd68..9bf0eafec 100644
--- a/docs/de/docs/tutorial/schema-extra-example.md
+++ b/docs/de/docs/tutorial/schema-extra-example.md
@@ -14,7 +14,7 @@ Diese zusätzlichen Informationen werden unverändert zum für dieses Modell aus
Sie können das Attribut `model_config` verwenden, das ein `dict` akzeptiert, wie beschrieben in [Pydantic-Dokumentation: Configuration](https://docs.pydantic.dev/latest/api/config/).
-Sie können `json_schema_extra` setzen, mit einem `dict`, das alle zusätzlichen Daten enthält, die im generierten JSON-Schema angezeigt werden sollen, einschließlich `examples`.
+Sie können `"json_schema_extra"` setzen, mit einem `dict`, das alle zusätzlichen Daten enthält, die im generierten JSON-Schema angezeigt werden sollen, einschließlich `examples`.
/// tip | Tipp
@@ -24,7 +24,7 @@ Sie könnten das beispielsweise verwenden, um Metadaten für eine Frontend-Benut
///
-/// info | Info
+/// note | Hinweis
OpenAPI 3.1.0 (verwendet seit FastAPI 0.99.0) hat Unterstützung für `examples` hinzugefügt, was Teil des **JSON Schema** Standards ist.
@@ -88,7 +88,7 @@ Das Format dieses OpenAPI-spezifischen Felds `examples` ist ein `dict` mit **meh
Dies erfolgt nicht innerhalb jedes in OpenAPI enthaltenen JSON-Schemas, sondern außerhalb, in der *Pfadoperation*.
-### Verwendung des Parameters `openapi_examples` { #using-the-openapi-examples-parameter }
+### Den Parameter `openapi_examples` verwenden { #using-the-openapi-examples-parameter }
Sie können die OpenAPI-spezifischen `examples` in FastAPI mit dem Parameter `openapi_examples` deklarieren, für:
@@ -155,7 +155,7 @@ OpenAPI fügte auch die Felder `example` und `examples` zu anderen Teilen der Sp
* `File()`
* `Form()`
-/// info | Info
+/// note | Hinweis
Dieser alte, OpenAPI-spezifische `examples`-Parameter heißt seit FastAPI `0.103.0` jetzt `openapi_examples`.
@@ -171,7 +171,7 @@ Und jetzt hat dieses neue `examples`-Feld Vorrang vor dem alten (und benutzerdef
Dieses neue `examples`-Feld in JSON Schema ist **nur eine `list`** von Beispielen, kein Dict mit zusätzlichen Metadaten wie an den anderen Stellen in OpenAPI (oben beschrieben).
-/// info | Info
+/// note | Hinweis
Selbst, nachdem OpenAPI 3.1.0 veröffentlicht wurde, mit dieser neuen, einfacheren Integration mit JSON Schema, unterstützte Swagger UI, das Tool, das die automatische Dokumentation bereitstellt, eine Zeit lang OpenAPI 3.1.0 nicht (das tut es seit Version 5.0.0 🎉).
@@ -189,9 +189,9 @@ In Versionen von FastAPI vor 0.99.0 (0.99.0 und höher verwenden das neuere Open
Aber jetzt, da FastAPI 0.99.0 und höher, OpenAPI 3.1.0 verwendet, das JSON Schema 2020-12 verwendet, und Swagger UI 5.0.0 und höher, ist alles konsistenter und die Beispiele sind in JSON Schema enthalten.
-### Swagger-Benutzeroberfläche und OpenAPI-spezifische `examples` { #swagger-ui-and-openapi-specific-examples }
+### Swagger UI und OpenAPI-spezifische `examples` { #swagger-ui-and-openapi-specific-examples }
-Da die Swagger-Benutzeroberfläche derzeit nicht mehrere JSON Schema Beispiele unterstützt (Stand: 26.08.2023), hatten Benutzer keine Möglichkeit, mehrere Beispiele in der Dokumentation anzuzeigen.
+Da Swagger UI derzeit nicht mehrere JSON Schema Beispiele unterstützt (Stand: 26.08.2023), hatten Benutzer keine Möglichkeit, mehrere Beispiele in der Dokumentation anzuzeigen.
Um dieses Problem zu lösen, hat FastAPI `0.103.0` **Unterstützung** für die Deklaration desselben alten **OpenAPI-spezifischen** `examples`-Felds mit dem neuen Parameter `openapi_examples` hinzugefügt. 🤓
diff --git a/docs/de/docs/tutorial/security/first-steps.md b/docs/de/docs/tutorial/security/first-steps.md
index 8a1d2fbf1..69e8abec0 100644
--- a/docs/de/docs/tutorial/security/first-steps.md
+++ b/docs/de/docs/tutorial/security/first-steps.md
@@ -1,5 +1,6 @@
# Sicherheit – Erste Schritte { #security-first-steps }
+
Stellen wir uns vor, dass Sie Ihre **Backend**-API auf einer Domain haben.
Und Sie haben ein **Frontend** auf einer anderen Domain oder in einem anderen Pfad derselben Domain (oder in einer Mobile-Anwendung).
@@ -24,7 +25,7 @@ Kopieren Sie das Beispiel in eine Datei `main.py`:
## Ausführen { #run-it }
-/// info | Info
+/// note | Hinweis
Das Paket [`python-multipart`](https://github.com/Kludex/python-multipart) wird automatisch mit **FastAPI** installiert, wenn Sie den Befehl `pip install "fastapi[standard]"` ausführen.
@@ -62,7 +63,7 @@ Sie werden etwa Folgendes sehen:
-/// check | Authorize-Button!
+/// tip | Authorize-Button!
Sie haben bereits einen glänzenden, neuen „Authorize“-Button.
@@ -120,7 +121,7 @@ Betrachten wir es also aus dieser vereinfachten Sicht:
In diesem Beispiel verwenden wir **OAuth2** mit dem **Password**-Flow und einem **Bearer**-Token. Wir machen das mit der Klasse `OAuth2PasswordBearer`.
-/// info | Info
+/// note | Hinweis
Ein „Bearer“-Token ist nicht die einzige Option.
@@ -150,7 +151,7 @@ Dieser Parameter erstellt nicht diesen Endpunkt / diese *Pfadoperation*, sondern
Wir werden demnächst auch die eigentliche Pfadoperation erstellen.
-/// info | Info
+/// note | Hinweis
Wenn Sie ein sehr strenger „Pythonista“ sind, missfällt Ihnen möglicherweise die Schreibweise des Parameternamens `tokenUrl` anstelle von `token_url`.
@@ -178,7 +179,7 @@ Diese Abhängigkeit stellt einen `str` bereit, der dem Parameter `token` der *Pf
**FastAPI** weiß, dass es diese Abhängigkeit verwenden kann, um ein „Sicherheitsschema“ im OpenAPI-Schema (und der automatischen API-Dokumentation) zu definieren.
-/// info | Technische Details
+/// note | Technische Details
**FastAPI** weiß, dass es die Klasse `OAuth2PasswordBearer` (deklariert in einer Abhängigkeit) verwenden kann, um das Sicherheitsschema in OpenAPI zu definieren, da es von `fastapi.security.oauth2.OAuth2` erbt, das wiederum von `fastapi.security.base.SecurityBase` erbt.
diff --git a/docs/de/docs/tutorial/security/get-current-user.md b/docs/de/docs/tutorial/security/get-current-user.md
index cfb59ff12..1bcccfd82 100644
--- a/docs/de/docs/tutorial/security/get-current-user.md
+++ b/docs/de/docs/tutorial/security/get-current-user.md
@@ -14,7 +14,7 @@ Erstellen wir zunächst ein Pydantic-Benutzermodell.
So wie wir Pydantic zum Deklarieren von Bodys verwenden, können wir es auch überall sonst verwenden:
-{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
+{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## Eine `get_current_user`-Abhängigkeit erstellen { #create-a-get-current-user-dependency }
@@ -52,7 +52,7 @@ Weil Sie `Depends` verwenden, wird **FastAPI** hier aber nicht verwirrt.
///
-/// check | Testen
+/// tip | Tipp
Die Art und Weise, wie dieses System von Abhängigkeiten konzipiert ist, ermöglicht es uns, verschiedene Abhängigkeiten (verschiedene „Dependables“) zu haben, die alle ein `User`-Modell zurückgeben.
diff --git a/docs/de/docs/tutorial/security/oauth2-jwt.md b/docs/de/docs/tutorial/security/oauth2-jwt.md
index 2f727b167..d04bd00d4 100644
--- a/docs/de/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/de/docs/tutorial/security/oauth2-jwt.md
@@ -4,7 +4,7 @@ Da wir nun über den gesamten Sicherheitsablauf verfügen, machen wir die Anwend
Diesen Code können Sie tatsächlich in Ihrer Anwendung verwenden, die Passwort-Hashes in Ihrer Datenbank speichern, usw.
-Wir bauen auf dem vorherigen Kapitel auf.
+Wir bauen auf dem vorherigen Kapitel auf und erweitern es.
## Über JWT { #about-jwt }
@@ -42,7 +42,7 @@ $ pip install pyjwt
-/// info | Info
+/// note | Hinweis
Wenn Sie planen, digitale Signaturalgorithmen wie RSA oder ECDSA zu verwenden, sollten Sie die Kryptografie-Abhängigkeit `pyjwt[crypto]` installieren.
@@ -120,7 +120,7 @@ Und noch eine, um einen Benutzer zu authentifizieren und zurückzugeben.
Wenn `authenticate_user` mit einem Benutzernamen aufgerufen wird, der in der Datenbank nicht existiert, führen wir dennoch `verify_password` gegen einen Dummy-Hash aus.
-So stellt man sicher, dass der Endpunkt ungefähr gleich viel Zeit für die Antwort benötigt, unabhängig davon, ob der Benutzername gültig ist oder nicht. Dadurch werden Timing-Angriffe verhindert, mit denen vorhandene Benutzernamen ermittelt werden könnten.
+So stellt man sicher, dass der Endpunkt ungefähr gleich viel Zeit für die Antwort benötigt, unabhängig davon, ob der Benutzername gültig ist oder nicht. Dadurch werden **Timing-Angriffe** verhindert, mit denen vorhandene Benutzernamen ermittelt werden könnten.
/// note | Hinweis
@@ -168,7 +168,7 @@ Wenn der Token ungültig ist, geben Sie sofort einen HTTP-Fehler zurück.
{* ../../docs_src/security/tutorial004_an_py310.py hl[93:110] *}
-## Die *Pfadoperation* `/token` aktualisieren { #update-the-token-path-operation }
+## Die `/token`-*Pfadoperation* aktualisieren { #update-the-token-path-operation }
Erstellen Sie ein `timedelta` mit der Ablaufzeit des Tokens.
@@ -213,7 +213,7 @@ Verwenden Sie die Anmeldeinformationen:
Benutzername: `johndoe`
Passwort: `secret`
-/// check | Testen
+/// tip | Tipp
Beachten Sie, dass im Code nirgendwo das Klartext-Passwort „`secret`“ steht, wir haben nur die gehashte Version.
diff --git a/docs/de/docs/tutorial/security/simple-oauth2.md b/docs/de/docs/tutorial/security/simple-oauth2.md
index 32720706e..b7b041bc1 100644
--- a/docs/de/docs/tutorial/security/simple-oauth2.md
+++ b/docs/de/docs/tutorial/security/simple-oauth2.md
@@ -20,7 +20,7 @@ Die Spezifikation besagt auch, dass `username` und `password` als Formulardaten
### `scope` { #scope }
-Ferner sagt die Spezifikation, dass der Client ein weiteres Formularfeld "`scope`" („Geltungsbereich“) senden kann.
+Ferner sagt die Spezifikation, dass der Client ein weiteres Formularfeld „`scope`“ senden kann.
Der Name des Formularfelds lautet `scope` (im Singular), tatsächlich handelt es sich jedoch um einen langen String mit durch Leerzeichen getrennten „Scopes“.
@@ -32,7 +32,7 @@ Diese werden normalerweise verwendet, um bestimmte Sicherheitsberechtigungen zu
* `instagram_basic` wird von Facebook / Instagram verwendet.
* `https://www.googleapis.com/auth/drive` wird von Google verwendet.
-/// info | Info
+/// note | Hinweis
In OAuth2 ist ein „Scope“ nur ein String, der eine bestimmte erforderliche Berechtigung deklariert.
@@ -72,7 +72,7 @@ Wenn Sie es erzwingen müssen, verwenden Sie `OAuth2PasswordRequestFormStrict` a
* Eine optionale `client_id` (benötigen wir für unser Beispiel nicht).
* Ein optionales `client_secret` (benötigen wir für unser Beispiel nicht).
-/// info | Info
+/// note | Hinweis
`OAuth2PasswordRequestForm` ist keine spezielle Klasse für **FastAPI**, so wie `OAuth2PasswordBearer`.
@@ -120,7 +120,7 @@ Immer wenn Sie genau den gleichen Inhalt (genau das gleiche Passwort) übergeben
Sie können jedoch nicht vom Kauderwelsch zurück zum Passwort konvertieren.
-##### Warum Passwort-Hashing verwenden? { #why-use-password-hashing }
+##### Warum Passwort-Hashing verwenden { #why-use-password-hashing }
Wenn Ihre Datenbank gestohlen wird, hat der Dieb nicht die Klartext-Passwörter Ihrer Benutzer, sondern nur die Hashes.
@@ -144,9 +144,9 @@ UserInDB(
)
```
-/// info | Info
+/// note | Hinweis
-Eine ausführlichere Erklärung von `**user_dict` finden Sie in [der Dokumentation für **Extra Modelle**](../extra-models.md#about-user-in-dict).
+Eine ausführlichere Erklärung von `**user_dict` finden Sie in [der Dokumentation für **Extra Modelle**](../extra-models.md#about-user-in-model-dump).
///
@@ -196,7 +196,7 @@ In unserem Endpunkt erhalten wir also nur dann einen Benutzer, wenn der Benutzer
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
-/// info | Info
+/// note | Hinweis
Der zusätzliche Header `WWW-Authenticate` mit dem Wert `Bearer`, den wir hier zurückgeben, ist ebenfalls Teil der Spezifikation.
@@ -226,7 +226,7 @@ Verwenden Sie die Anmeldedaten:
Benutzer: `johndoe`
-Passwort: `secret`.
+Passwort: `secret`
@@ -264,9 +264,9 @@ Wenn Sie auf das Schlosssymbol klicken und sich abmelden und dann den gleichen V
Versuchen Sie es nun mit einem inaktiven Benutzer und authentisieren Sie sich mit:
-Benutzer: `alice`.
+Benutzer: `alice`
-Passwort: `secret2`.
+Passwort: `secret2`
Und versuchen Sie, die Operation `GET` mit dem Pfad `/users/me` zu verwenden.
diff --git a/docs/de/docs/tutorial/server-sent-events.md b/docs/de/docs/tutorial/server-sent-events.md
index f465c1131..8e6f35c71 100644
--- a/docs/de/docs/tutorial/server-sent-events.md
+++ b/docs/de/docs/tutorial/server-sent-events.md
@@ -2,9 +2,9 @@
Sie können Daten mithilfe von **Server-Sent Events** (SSE) an den Client streamen.
-Das ist ähnlich wie [JSON Lines streamen](stream-json-lines.md), verwendet aber das Format `text/event-stream`, das von Browsern nativ mit der [die `EventSource`-API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) unterstützt wird.
+Das ist ähnlich wie [JSON Lines streamen](stream-json-lines.md), verwendet aber das Format `text/event-stream`, das von Browsern nativ mit der [`EventSource`-API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) unterstützt wird.
-/// info | Info
+/// note | Hinweis
Hinzugefügt in FastAPI 0.135.0.
@@ -29,7 +29,7 @@ SSE wird häufig für KI-Chat-Streaming, Live-Benachrichtigungen, Logs und Obser
/// tip | Tipp
-Wenn Sie Binärdaten streamen wollen, z. B. Video oder Audio, sehen Sie im fortgeschrittenen Handbuch nach: [Daten streamen](../advanced/stream-data.md).
+Wenn Sie Binärdaten streamen wollen, z. B. Video oder Audio, sehen Sie im Handbuch für fortgeschrittene Benutzer nach: [Daten streamen](../advanced/stream-data.md).
///
@@ -103,7 +103,7 @@ Sie können ihn als Header-Parameter einlesen und verwenden, um den Stream dort
## SSE mit POST { #sse-with-post }
-SSE funktioniert mit **jedem HTTP-Method**, nicht nur mit `GET`.
+SSE funktioniert mit **jeder HTTP-Methode**, nicht nur mit `GET`.
Das ist nützlich für Protokolle wie [MCP](https://modelcontextprotocol.io), die SSE über `POST` streamen:
@@ -113,7 +113,7 @@ Das ist nützlich für Protokolle wie [MCP](https://modelcontextprotocol.io), di
FastAPI implementiert einige bewährte SSE-Praktiken direkt out of the box.
-- Alle 15 Sekunden, wenn keine Nachricht gesendet wurde, einen **„keep alive“-`ping`-Kommentar** senden, um zu verhindern, dass einige Proxys die Verbindung schließen, wie in der [HTML-Spezifikation: Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes) vorgeschlagen.
+- Einen **„keep alive“-`ping`-Kommentar** alle 15 Sekunden senden, wenn keine Nachricht gesendet wurde, um zu verhindern, dass einige Proxys die Verbindung schließen, wie in der [HTML-Spezifikation: Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes) vorgeschlagen.
- Den Header `Cache-Control: no-cache` setzen, um **Caching** des Streams zu verhindern.
- Einen speziellen Header `X-Accel-Buffering: no` setzen, um **Buffering** in einigen Proxys wie Nginx zu verhindern.
diff --git a/docs/de/docs/tutorial/sql-databases.md b/docs/de/docs/tutorial/sql-databases.md
index d7988f9a2..3c7aabae3 100644
--- a/docs/de/docs/tutorial/sql-databases.md
+++ b/docs/de/docs/tutorial/sql-databases.md
@@ -8,7 +8,7 @@ Hier werden wir ein Beispiel mit [SQLModel](https://sqlmodel.tiangolo.com/) sehe
/// tip | Tipp
-Sie könnten jede andere SQL- oder NoSQL-Datenbankbibliothek verwenden, die Sie möchten (in einigen Fällen als „ORMs“ bezeichnet), FastAPI zwingt Sie nicht, irgendetwas zu verwenden. 😎
+Sie könnten jede andere SQL- oder NoSQL-Datenbankbibliothek verwenden, die Sie möchten (in einigen Fällen als „ORMs“ bezeichnet), FastAPI zwingt Sie nicht, irgendetwas zu verwenden. 😎
///
@@ -121,7 +121,7 @@ Da jedes SQLModel-Modell auch ein Pydantic-Modell ist, können Sie es in denselb
Wenn Sie beispielsweise einen Parameter vom Typ `Hero` deklarieren, wird er aus dem **JSON-Body** gelesen.
-Auf die gleiche Weise können Sie es als **Rückgabetyp** der Funktion deklarieren, und dann wird die Form der Daten in der automatischen API-Dokumentation angezeigt.
+Auf die gleiche Weise können Sie es als **Rückgabetyp** der Funktion deklarieren, und dann wird die Form der Daten in der automatischen API-Dokumentations-UI angezeigt.
{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[40:45] hl[40:45] *}
@@ -266,7 +266,7 @@ In der vorherigen Version der App hatten wir keine Möglichkeit, einen Helden **
Das `HeroUpdate`-*Datenmodell* ist etwas Besonderes, es hat **die selben Felder**, die benötigt werden, um einen neuen Helden zu erstellen, aber alle Felder sind **optional** (sie haben alle einen Defaultwert). Auf diese Weise, wenn Sie einen Helden aktualisieren, können Sie nur die Felder senden, die Sie aktualisieren möchten.
-Da sich tatsächlich **alle Felder ändern** (der Typ enthält jetzt `None` und sie haben jetzt einen Standardwert von `None`), müssen wir sie erneut **deklarieren**.
+Da sich tatsächlich **alle Felder ändern** (der Typ enthält jetzt `None` und sie haben jetzt einen Defaultwert von `None`), müssen wir sie erneut **deklarieren**.
Wir müssen wirklich nicht von `HeroBase` erben, weil wir alle Felder neu deklarieren. Ich lasse es aus Konsistenzgründen erben, aber das ist nicht notwendig. Es ist mehr eine Frage des persönlichen Geschmacks. 🤷
diff --git a/docs/de/docs/tutorial/static-files.md b/docs/de/docs/tutorial/static-files.md
index 8fb4c1908..ef75ca91a 100644
--- a/docs/de/docs/tutorial/static-files.md
+++ b/docs/de/docs/tutorial/static-files.md
@@ -2,6 +2,14 @@
Mit `StaticFiles` können Sie statische Dateien aus einem Verzeichnis automatisch bereitstellen.
+/// tip | Tipp
+
+Wenn Sie ein Frontend hosten müssen, verwenden Sie stattdessen `app.frontend()`; lesen Sie mehr dazu unter [Frontend](frontend.md).
+
+`app.frontend()` verwendet darunter `StaticFiles`, mit mehreren zusätzlichen Vorteilen für Frontends, wie der Handhabung von clientseitigem Routing.
+
+///
+
## `StaticFiles` verwenden { #use-staticfiles }
* Importieren Sie `StaticFiles`.
diff --git a/docs/de/docs/tutorial/stream-json-lines.md b/docs/de/docs/tutorial/stream-json-lines.md
index 3625853b5..61bf3fafa 100644
--- a/docs/de/docs/tutorial/stream-json-lines.md
+++ b/docs/de/docs/tutorial/stream-json-lines.md
@@ -2,7 +2,7 @@
Sie könnten eine Folge von Daten haben, die Sie in einem „Stream“ senden möchten, das können Sie mit **JSON Lines** tun.
-/// info | Info
+/// note | Hinweis
Hinzugefügt in FastAPI 0.134.0.
@@ -48,7 +48,7 @@ Eine Response hätte einen Content-Type von `application/jsonl` (anstelle von `a
Es ist einem JSON-Array (entspricht einer Python-Liste) sehr ähnlich, aber anstatt in `[]` eingeschlossen zu sein und `,` zwischen den Elementen zu haben, gibt es hier **ein JSON-Objekt pro Zeile**, sie sind durch ein Zeilenumbruchzeichen getrennt.
-/// info | Info
+/// note | Hinweis
Der wichtige Punkt ist, dass Ihre App in der Lage ist, jede Zeile der Reihe nach zu erzeugen, während der Client die vorherigen Zeilen konsumiert.
diff --git a/docs/de/docs/tutorial/testing.md b/docs/de/docs/tutorial/testing.md
index f7b0b87eb..59d0be6bb 100644
--- a/docs/de/docs/tutorial/testing.md
+++ b/docs/de/docs/tutorial/testing.md
@@ -8,7 +8,7 @@ Damit können Sie [pytest](https://docs.pytest.org/) direkt mit **FastAPI** verw
## `TestClient` verwenden { #using-testclient }
-/// info | Info
+/// note | Hinweis
Um `TestClient` zu verwenden, installieren Sie zunächst [`httpx`](https://www.python-httpx.org).
@@ -24,7 +24,7 @@ Importieren Sie `TestClient`.
Erstellen Sie einen `TestClient`, indem Sie ihm Ihre **FastAPI**-Anwendung übergeben.
-Erstellen Sie Funktionen mit einem Namen, der mit `test_` beginnt (das sind `pytest`-Konventionen).
+Erstellen Sie Funktionen mit einem Namen, der mit `test_` beginnt (das ist eine Standard-`pytest`-Konvention).
Verwenden Sie das `TestClient`-Objekt auf die gleiche Weise wie `httpx`.
@@ -36,7 +36,7 @@ Schreiben Sie einfache `assert`-Anweisungen mit den Standard-Python-Ausdrücken,
Beachten Sie, dass die Testfunktionen normal `def` und nicht `async def` sind.
-Und die Anrufe an den Client sind ebenfalls normale Anrufe, die nicht `await` verwenden.
+Und die Aufrufe an den Client sind ebenfalls normale Aufrufe, die nicht `await` verwenden.
Dadurch können Sie `pytest` ohne Komplikationen direkt nutzen.
@@ -62,7 +62,7 @@ In einer echten Anwendung würden Sie Ihre Tests wahrscheinlich in einer anderen
Und Ihre **FastAPI**-Anwendung könnte auch aus mehreren Dateien/Modulen, usw. bestehen.
-### **FastAPI** Anwendungsdatei { #fastapi-app-file }
+### **FastAPI**-Anwendungsdatei { #fastapi-app-file }
Nehmen wir an, Sie haben eine Dateistruktur wie in [Größere Anwendungen](bigger-applications.md) beschrieben:
@@ -131,7 +131,7 @@ Anschließend könnten Sie `test_main.py` mit den erweiterten Tests aktualisiere
{* ../../docs_src/app_testing/app_b_an_py310/test_main.py *}
-Wenn Sie möchten, dass der Client Informationen im Request übergibt und Sie nicht wissen, wie das geht, können Sie suchen (googeln), wie es mit `httpx` gemacht wird, oder sogar, wie es mit `requests` gemacht wird, da das Design von HTTPX auf dem Design von Requests basiert.
+Immer wenn der Client Informationen im Request übergeben soll und Sie nicht wissen, wie, können Sie danach suchen (googeln), wie es mit `httpx` gemacht wird, oder sogar, wie es mit `requests` gemacht wird, da das Design von HTTPX auf dem Design von Requests basiert.
Dann machen Sie in Ihren Tests einfach das gleiche.
@@ -145,7 +145,7 @@ Z. B.:
Weitere Informationen zum Übergeben von Daten an das Backend (mithilfe von `httpx` oder dem `TestClient`) finden Sie in der [HTTPX-Dokumentation](https://www.python-httpx.org).
-/// info | Info
+/// note | Hinweis
Beachten Sie, dass der `TestClient` Daten empfängt, die nach JSON konvertiert werden können, keine Pydantic-Modelle.
diff --git a/docs/de/docs/virtual-environments.md b/docs/de/docs/virtual-environments.md
index 81d13cc91..782d1cdcf 100644
--- a/docs/de/docs/virtual-environments.md
+++ b/docs/de/docs/virtual-environments.md
@@ -443,6 +443,8 @@ Auf diese Weise, wenn Sie `python` ausführen, wird nicht versucht, es aus diese
Jetzt sind Sie bereit, mit Ihrem Projekt zu arbeiten.
+
+
/// tip | Tipp
Möchten Sie verstehen, was das alles oben bedeutet?
@@ -455,7 +457,7 @@ Lesen Sie weiter. 👇🤓
Um mit FastAPI zu arbeiten, müssen Sie [Python](https://www.python.org/) installieren.
-Danach müssen Sie FastAPI und alle anderen Pakete, die Sie verwenden möchten, **installieren**.
+Danach müssen Sie FastAPI und alle anderen **Pakete**, die Sie verwenden möchten, **installieren**.
Um Pakete zu installieren, würden Sie normalerweise den `pip`-Befehl verwenden, der mit Python geliefert wird (oder ähnliche Alternativen).
@@ -639,7 +641,7 @@ $ source .venv/Scripts/activate
Dieser Befehl erstellt oder ändert einige [Umgebungsvariablen](environment-variables.md), die für die nächsten Befehle verfügbar sein werden.
-Eine dieser Variablen ist die `PATH`-Umgebungsvariable.
+Eine dieser Variablen ist die `PATH`-Variable.
/// tip | Tipp
@@ -649,7 +651,7 @@ Sie können mehr über die `PATH`-Umgebungsvariable im Abschnitt [Umgebungsvaria
Das Aktivieren einer virtuellen Umgebung fügt deren Pfad `.venv/bin` (auf Linux und macOS) oder `.venv\Scripts` (auf Windows) zur `PATH`-Umgebungsvariable hinzu.
-Angenommen, die `PATH`-Umgebungsvariable sah vor dem Aktivieren der Umgebung so aus:
+Angenommen, die `PATH`-Variable sah vor dem Aktivieren der Umgebung so aus:
//// tab | Linux, macOS
@@ -678,7 +680,7 @@ Das bedeutet, dass das System nach Programmen sucht in:
////
-Nach dem Aktivieren der virtuellen Umgebung würde die `PATH`-Umgebungsvariable folgendermaßen aussehen:
+Nach dem Aktivieren der virtuellen Umgebung würde die `PATH`-Variable folgendermaßen aussehen:
//// tab | Linux, macOS
@@ -728,7 +730,7 @@ finden und dieses verwenden.
////
-Ein wichtiger Punkt ist, dass es den Pfad der virtuellen Umgebung am **Anfang** der `PATH`-Umgebungsvariable platziert. Das System wird es **vor** allen anderen verfügbaren Pythons finden. Auf diese Weise, wenn Sie `python` ausführen, wird das Python **aus der virtuellen Umgebung** verwendet anstelle eines anderen `python` (zum Beispiel, einem `python` aus einer globalen Umgebung).
+Ein wichtiger Punkt ist, dass es den Pfad der virtuellen Umgebung am **Anfang** der `PATH`-Variable platziert. Das System wird es **vor** allen anderen verfügbaren Pythons finden. Auf diese Weise, wenn Sie `python` ausführen, wird das Python **aus der virtuellen Umgebung** verwendet anstelle eines anderen `python` (zum Beispiel, einem `python` aus einer globalen Umgebung).
Das Aktivieren einer virtuellen Umgebung ändert auch ein paar andere Dinge, aber dies ist eines der wichtigsten Dinge, die es tut.
diff --git a/docs/en/data/contributors.yml b/docs/en/data/contributors.yml
index 7e1572146..b22e0975b 100644
--- a/docs/en/data/contributors.yml
+++ b/docs/en/data/contributors.yml
@@ -1,21 +1,21 @@
tiangolo:
login: tiangolo
- count: 961
+ count: 1005
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
url: https://github.com/tiangolo
dependabot:
login: dependabot
- count: 201
+ count: 221
avatarUrl: https://avatars.githubusercontent.com/in/29110?v=4
url: https://github.com/apps/dependabot
YuriiMotov:
login: YuriiMotov
- count: 78
+ count: 82
avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4
url: https://github.com/YuriiMotov
alejsdev:
login: alejsdev
- count: 56
+ count: 57
avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=0facffe3abf87f57a1f05fa773d1119cc5c2f6a5&v=4
url: https://github.com/alejsdev
pre-commit-ci:
diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml
index 1466536d0..ae2c0f6e2 100644
--- a/docs/en/data/sponsors.yml
+++ b/docs/en/data/sponsors.yml
@@ -1,67 +1,66 @@
keystone:
- url: https://fastapicloud.com
title: FastAPI Cloud. By the same team behind FastAPI. You code. We Cloud.
- img: https://fastapi.tiangolo.com/img/sponsors/fastapicloud.png
+ img: /img/sponsors/fastapicloud.png
gold:
- url: https://blockbee.io?ref=fastapi
title: BlockBee Cryptocurrency Payment Gateway
- img: https://fastapi.tiangolo.com/img/sponsors/blockbee.png
- - url: https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge
- title: "Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files"
- img: https://fastapi.tiangolo.com/img/sponsors/scalar.svg
+ img: /img/sponsors/blockbee.png
+ banner_img: /img/sponsors/blockbee-banner.png
- url: https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge
title: Auth, user management and more for your B2B product
- img: https://fastapi.tiangolo.com/img/sponsors/propelauth.png
- - url: https://liblab.com?utm_source=fastapi
- title: liblab - Generate SDKs from FastAPI
- img: https://fastapi.tiangolo.com/img/sponsors/liblab.png
+ img: /img/sponsors/propelauth.png
+ banner_url: https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=topbanner
+ banner_img: /img/sponsors/propelauth-banner.png
- url: https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi
title: Deploy & scale any full-stack web app on Render. Focus on building apps, not infra.
- img: https://fastapi.tiangolo.com/img/sponsors/render.svg
+ img: /img/sponsors/render.svg
+ banner_img: /img/sponsors/render-banner.svg
- url: https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=badge&utm_campaign=fastapi
title: Cut Code Review Time & Bugs in Half with CodeRabbit
- img: https://fastapi.tiangolo.com/img/sponsors/coderabbit.png
+ img: /img/sponsors/coderabbit.png
+ banner_url: https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=banner&utm_campaign=fastapi
+ banner_img: /img/sponsors/coderabbit-banner.png
- url: https://subtotal.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=open-source
title: The Gold Standard in Retail Account Linking
- img: https://fastapi.tiangolo.com/img/sponsors/subtotal.svg
+ img: /img/sponsors/subtotal.svg
+ banner_title: Making Retail Purchases Actionable for Brands and Developers
+ banner_img: /img/sponsors/subtotal-banner.svg
- url: https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi
title: Deploy enterprise applications at startup speed
- img: https://fastapi.tiangolo.com/img/sponsors/railway.png
+ img: /img/sponsors/railway.png
+ banner_img: /img/sponsors/railway-banner.png
- url: https://serpapi.com/?utm_source=fastapi_website
title: "SerpApi: Web Search API"
- img: https://fastapi.tiangolo.com/img/sponsors/serpapi.png
+ img: /img/sponsors/serpapi.png
+ banner_img: /img/sponsors/serpapi-banner.png
- url: https://www.greptile.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=fastapi_sponsor_page
title: "Greptile: The AI Code Reviewer"
- img: https://fastapi.tiangolo.com/img/sponsors/greptile.png
+ img: /img/sponsors/greptile.png
+ banner_img: /img/sponsors/greptile-banner.png
silver:
- url: https://databento.com/?utm_source=fastapi&utm_medium=sponsor&utm_content=display
title: Pay as you go for market data
- img: https://fastapi.tiangolo.com/img/sponsors/databento.svg
+ img: /img/sponsors/databento.svg
- url: https://www.svix.com/
title: Svix - Webhooks as a service
- img: https://fastapi.tiangolo.com/img/sponsors/svix.svg
- - url: https://www.stainlessapi.com/?utm_source=fastapi&utm_medium=referral
- title: Stainless | Generate best-in-class SDKs
- img: https://fastapi.tiangolo.com/img/sponsors/stainless.png
+ img: /img/sponsors/svix.svg
- url: https://www.permit.io/blog/implement-authorization-in-fastapi?utm_source=github&utm_medium=referral&utm_campaign=fastapi
title: Fine-Grained Authorization for FastAPI
- img: https://fastapi.tiangolo.com/img/sponsors/permit.png
- - url: https://www.interviewpal.com/?utm_source=fastapi&utm_medium=open-source&utm_campaign=dev-hiring
- title: InterviewPal - AI Interview Coach for Engineers and Devs
- img: https://fastapi.tiangolo.com/img/sponsors/interviewpal.png
+ img: /img/sponsors/permit.png
- url: https://dribia.com/en/
title: Dribia - Data Science within your reach
- img: https://fastapi.tiangolo.com/img/sponsors/dribia.png
- - url: https://talordata.com/?campaignid=oh5dVZ3Zc3YGiAI2&utm_source=fastapi&utm_term=fastapi
- title: TalorData SERP API - Multi-Engine Search Results Data
- img: https://fastapi.tiangolo.com/img/sponsors/talordata.png
+ img: /img/sponsors/dribia.png
- url: https://www.rapidproxy.io/?ref=fastapi
title: Try RapidProxy for free - Residential Proxies with 90M+ Global IPs. Starting from $0.65/GB for web scraping, automation, and data collection.
- img: https://fastapi.tiangolo.com/img/sponsors/rapidproxy.png
+ img: /img/sponsors/rapidproxy.png
+ - url: https://www.bairesdev.com/
+ title: "BairesDev | Nearshore Software Development & Staff Augmentation Company"
+ img: /img/sponsors/bairesdev.svg
bronze:
- - url: https://www.exoflare.com/open-source/?utm_source=FastAPI&utm_campaign=open_source
- title: Biosecurity risk assessments made easy.
- img: https://fastapi.tiangolo.com/img/sponsors/exoflare.png
# - url: https://testdriven.io/courses/tdd-fastapi/
# title: Learn to build high-quality web apps with best practices
- # img: https://fastapi.tiangolo.com/img/sponsors/testdriven.svg
+ # img: /img/sponsors/testdriven.svg
+ - url: https://www.testmu.ai/?utm_source=fastapi&utm_medium=partner&utm_campaign=sponsor&utm_term=opensource&utm_content=webpage
+ title: TestMu AI. The Native AI-Agentic Cloud Platform to Supercharge Quality Engineering.
+ img: /img/sponsors/testmu.png
diff --git a/docs/en/data/topic_repos.yml b/docs/en/data/topic_repos.yml
index 9013ebc1c..ecfad6cb4 100644
--- a/docs/en/data/topic_repos.yml
+++ b/docs/en/data/topic_repos.yml
@@ -1,186 +1,191 @@
+- name: headroom
+ html_url: https://github.com/headroomlabs-ai/headroom
+ stars: 55017
+ owner_login: headroomlabs-ai
+ owner_html_url: https://github.com/headroomlabs-ai
- name: full-stack-fastapi-template
html_url: https://github.com/fastapi/full-stack-fastapi-template
- stars: 43447
+ stars: 43994
owner_login: fastapi
owner_html_url: https://github.com/fastapi
- name: Hello-Python
html_url: https://github.com/mouredev/Hello-Python
- stars: 35831
+ stars: 36226
owner_login: mouredev
owner_html_url: https://github.com/mouredev
- name: serve
html_url: https://github.com/jina-ai/serve
- stars: 21864
+ stars: 21862
owner_login: jina-ai
owner_html_url: https://github.com/jina-ai
- name: HivisionIDPhotos
html_url: https://github.com/Zeyi-Lin/HivisionIDPhotos
- stars: 21144
+ stars: 21212
owner_login: Zeyi-Lin
owner_html_url: https://github.com/Zeyi-Lin
- name: Douyin_TikTok_Download_API
html_url: https://github.com/Evil0ctal/Douyin_TikTok_Download_API
- stars: 18122
+ stars: 18599
owner_login: Evil0ctal
owner_html_url: https://github.com/Evil0ctal
- name: sqlmodel
html_url: https://github.com/fastapi/sqlmodel
- stars: 17987
+ stars: 18156
owner_login: fastapi
owner_html_url: https://github.com/fastapi
- name: fastapi-best-practices
html_url: https://github.com/zhanymkanov/fastapi-best-practices
- stars: 17401
+ stars: 17608
owner_login: zhanymkanov
owner_html_url: https://github.com/zhanymkanov
- name: SurfSense
html_url: https://github.com/MODSetter/SurfSense
- stars: 14374
+ stars: 15161
owner_login: MODSetter
owner_html_url: https://github.com/MODSetter
- name: machine-learning-zoomcamp
html_url: https://github.com/DataTalksClub/machine-learning-zoomcamp
- stars: 13169
+ stars: 13445
owner_login: DataTalksClub
owner_html_url: https://github.com/DataTalksClub
+- name: peewee
+ html_url: https://github.com/coleifer/peewee
+ stars: 11976
+ owner_login: coleifer
+ owner_html_url: https://github.com/coleifer
- name: fastapi_mcp
html_url: https://github.com/tadata-org/fastapi_mcp
- stars: 11885
+ stars: 11932
owner_login: tadata-org
owner_html_url: https://github.com/tadata-org
-- name: awesome-fastapi
- html_url: https://github.com/mjhea0/awesome-fastapi
- stars: 11406
- owner_login: mjhea0
- owner_html_url: https://github.com/mjhea0
- name: XHS-Downloader
html_url: https://github.com/JoeanAmier/XHS-Downloader
- stars: 11375
+ stars: 11768
owner_login: JoeanAmier
owner_html_url: https://github.com/JoeanAmier
+- name: awesome-fastapi
+ html_url: https://github.com/mjhea0/awesome-fastapi
+ stars: 11478
+ owner_login: mjhea0
+ owner_html_url: https://github.com/mjhea0
- name: polar
html_url: https://github.com/polarsource/polar
- stars: 9894
+ stars: 9999
owner_login: polarsource
owner_html_url: https://github.com/polarsource
- name: pycaret
html_url: https://github.com/pycaret/pycaret
- stars: 9801
+ stars: 9818
owner_login: pycaret
owner_html_url: https://github.com/pycaret
- name: FastUI
html_url: https://github.com/pydantic/FastUI
- stars: 8966
+ stars: 8970
owner_login: pydantic
owner_html_url: https://github.com/pydantic
- name: FileCodeBox
html_url: https://github.com/vastsa/FileCodeBox
- stars: 8305
+ stars: 8376
owner_login: vastsa
owner_html_url: https://github.com/vastsa
- name: nonebot2
html_url: https://github.com/nonebot/nonebot2
- stars: 7544
+ stars: 7593
owner_login: nonebot
owner_html_url: https://github.com/nonebot
- name: hatchet
html_url: https://github.com/hatchet-dev/hatchet
- stars: 7258
+ stars: 7441
owner_login: hatchet-dev
owner_html_url: https://github.com/hatchet-dev
- name: fastapi-users
html_url: https://github.com/fastapi-users/fastapi-users
- stars: 6152
+ stars: 6182
owner_login: fastapi-users
owner_html_url: https://github.com/fastapi-users
-- name: serge
- html_url: https://github.com/serge-chat/serge
- stars: 5726
- owner_login: serge-chat
- owner_html_url: https://github.com/serge-chat
- name: Yuxi
html_url: https://github.com/xerrors/Yuxi
- stars: 5323
+ stars: 5926
owner_login: xerrors
owner_html_url: https://github.com/xerrors
+- name: serge
+ html_url: https://github.com/serge-chat/serge
+ stars: 5723
+ owner_login: serge-chat
+ owner_html_url: https://github.com/serge-chat
+- name: honcho
+ html_url: https://github.com/plastic-labs/honcho
+ stars: 5680
+ owner_login: plastic-labs
+ owner_html_url: https://github.com/plastic-labs
- name: Kokoro-FastAPI
html_url: https://github.com/remsky/Kokoro-FastAPI
- stars: 4936
+ stars: 5085
owner_login: remsky
owner_html_url: https://github.com/remsky
- name: devpush
html_url: https://github.com/hunvreus/devpush
- stars: 4664
+ stars: 4693
owner_login: hunvreus
owner_html_url: https://github.com/hunvreus
- name: strawberry
html_url: https://github.com/strawberry-graphql/strawberry
- stars: 4663
+ stars: 4677
owner_login: strawberry-graphql
owner_html_url: https://github.com/strawberry-graphql
-- name: honcho
- html_url: https://github.com/plastic-labs/honcho
- stars: 4606
- owner_login: plastic-labs
- owner_html_url: https://github.com/plastic-labs
- name: poem
html_url: https://github.com/poem-web/poem
- stars: 4398
+ stars: 4415
owner_login: poem-web
owner_html_url: https://github.com/poem-web
-- name: dynaconf
- html_url: https://github.com/dynaconf/dynaconf
- stars: 4302
- owner_login: dynaconf
- owner_html_url: https://github.com/dynaconf
- name: logfire
html_url: https://github.com/pydantic/logfire
- stars: 4276
+ stars: 4340
owner_login: pydantic
owner_html_url: https://github.com/pydantic
+- name: dynaconf
+ html_url: https://github.com/dynaconf/dynaconf
+ stars: 4310
+ owner_login: dynaconf
+ owner_html_url: https://github.com/dynaconf
- name: chatgpt-web-share
html_url: https://github.com/chatpire/chatgpt-web-share
- stars: 4273
+ stars: 4269
owner_login: chatpire
owner_html_url: https://github.com/chatpire
- name: huma
html_url: https://github.com/danielgtaylor/huma
- stars: 4133
+ stars: 4203
owner_login: danielgtaylor
owner_html_url: https://github.com/danielgtaylor
- name: atrilabs-engine
html_url: https://github.com/Atri-Labs/atrilabs-engine
- stars: 4073
+ stars: 4071
owner_login: Atri-Labs
owner_html_url: https://github.com/Atri-Labs
+- name: mcp-context-forge
+ html_url: https://github.com/IBM/mcp-context-forge
+ stars: 3989
+ owner_login: IBM
+ owner_html_url: https://github.com/IBM
- name: datamodel-code-generator
html_url: https://github.com/koxudaxi/datamodel-code-generator
- stars: 3918
+ stars: 3952
owner_login: koxudaxi
owner_html_url: https://github.com/koxudaxi
- name: LitServe
html_url: https://github.com/Lightning-AI/LitServe
- stars: 3886
+ stars: 3901
owner_login: Lightning-AI
owner_html_url: https://github.com/Lightning-AI
-- name: mcp-context-forge
- html_url: https://github.com/IBM/mcp-context-forge
- stars: 3797
- owner_login: IBM
- owner_html_url: https://github.com/IBM
- name: fastapi-admin
html_url: https://github.com/fastapi-admin/fastapi-admin
- stars: 3784
+ stars: 3799
owner_login: fastapi-admin
owner_html_url: https://github.com/fastapi-admin
-- name: headroom
- html_url: https://github.com/chopratejas/headroom
- stars: 3701
- owner_login: chopratejas
- owner_html_url: https://github.com/chopratejas
- name: tracecat
html_url: https://github.com/TracecatHQ/tracecat
- stars: 3624
+ stars: 3703
owner_login: TracecatHQ
owner_html_url: https://github.com/TracecatHQ
- name: farfalle
@@ -188,139 +193,159 @@
stars: 3535
owner_login: rashadphz
owner_html_url: https://github.com/rashadphz
+- name: Rapid-MLX
+ html_url: https://github.com/raullenchai/Rapid-MLX
+ stars: 3155
+ owner_login: raullenchai
+ owner_html_url: https://github.com/raullenchai
- name: opyrator
html_url: https://github.com/ml-tooling/opyrator
- stars: 3136
+ stars: 3133
owner_login: ml-tooling
owner_html_url: https://github.com/ml-tooling
- name: docarray
html_url: https://github.com/docarray/docarray
- stars: 3119
+ stars: 3121
owner_login: docarray
owner_html_url: https://github.com/docarray
- name: fastapi-realworld-example-app
html_url: https://github.com/nsidnev/fastapi-realworld-example-app
- stars: 3110
+ stars: 3109
owner_login: nsidnev
owner_html_url: https://github.com/nsidnev
- name: uvicorn-gunicorn-fastapi-docker
html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker
- stars: 2910
+ stars: 2914
owner_login: tiangolo
owner_html_url: https://github.com/tiangolo
+- name: any-auto-register
+ html_url: https://github.com/lxf746/any-auto-register
+ stars: 2832
+ owner_login: lxf746
+ owner_html_url: https://github.com/lxf746
- name: FastAPI-template
html_url: https://github.com/s3rius/FastAPI-template
- stars: 2800
+ stars: 2810
owner_login: s3rius
owner_html_url: https://github.com/s3rius
- name: YC-Killer
html_url: https://github.com/sahibzada-allahyar/YC-Killer
- stars: 2770
+ stars: 2779
owner_login: sahibzada-allahyar
owner_html_url: https://github.com/sahibzada-allahyar
- name: sqladmin
html_url: https://github.com/smithyhq/sqladmin
- stars: 2739
+ stars: 2759
owner_login: smithyhq
owner_html_url: https://github.com/smithyhq
- name: best-of-web-python
html_url: https://github.com/ml-tooling/best-of-web-python
- stars: 2723
+ stars: 2731
owner_login: ml-tooling
owner_html_url: https://github.com/ml-tooling
-- name: Rapid-MLX
- html_url: https://github.com/raullenchai/Rapid-MLX
- stars: 2640
- owner_login: raullenchai
- owner_html_url: https://github.com/raullenchai
+- name: NoteDiscovery
+ html_url: https://github.com/gamosoft/NoteDiscovery
+ stars: 2595
+ owner_login: gamosoft
+ owner_html_url: https://github.com/gamosoft
- name: fastapi-react
html_url: https://github.com/Buuntu/fastapi-react
stars: 2588
owner_login: Buuntu
owner_html_url: https://github.com/Buuntu
-- name: any-auto-register
- html_url: https://github.com/lxf746/any-auto-register
- stars: 2542
- owner_login: lxf746
- owner_html_url: https://github.com/lxf746
-- name: NoteDiscovery
- html_url: https://github.com/gamosoft/NoteDiscovery
- stars: 2531
- owner_login: gamosoft
- owner_html_url: https://github.com/gamosoft
- name: supabase-py
html_url: https://github.com/supabase/supabase-py
- stars: 2518
+ stars: 2530
owner_login: supabase
owner_html_url: https://github.com/supabase
- name: 30-Days-of-Python
html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python
- stars: 2470
+ stars: 2483
owner_login: codingforentrepreneurs
owner_html_url: https://github.com/codingforentrepreneurs
- name: RasaGPT
html_url: https://github.com/paulpierre/RasaGPT
- stars: 2466
+ stars: 2462
owner_login: paulpierre
owner_html_url: https://github.com/paulpierre
-- name: AIstudioProxyAPI
- html_url: https://github.com/CJackHwang/AIstudioProxyAPI
- stars: 2396
- owner_login: CJackHwang
- owner_html_url: https://github.com/CJackHwang
- name: fastapi-langgraph-agent-production-ready-template
html_url: https://github.com/wassim249/fastapi-langgraph-agent-production-ready-template
- stars: 2338
+ stars: 2456
owner_login: wassim249
owner_html_url: https://github.com/wassim249
+- name: AIstudioProxyAPI
+ html_url: https://github.com/CJackHwang/AIstudioProxyAPI
+ stars: 2445
+ owner_login: CJackHwang
+ owner_html_url: https://github.com/CJackHwang
- name: nextpy
html_url: https://github.com/dot-agent/nextpy
- stars: 2336
+ stars: 2341
owner_login: dot-agent
owner_html_url: https://github.com/dot-agent
- name: langserve
html_url: https://github.com/langchain-ai/langserve
- stars: 2330
+ stars: 2329
owner_login: langchain-ai
owner_html_url: https://github.com/langchain-ai
-- name: fastapi-utils
- html_url: https://github.com/fastapiutils/fastapi-utils
- stars: 2310
- owner_login: fastapiutils
- owner_html_url: https://github.com/fastapiutils
- name: fastapi-best-architecture
html_url: https://github.com/fastapi-practices/fastapi-best-architecture
- stars: 2256
+ stars: 2318
owner_login: fastapi-practices
owner_html_url: https://github.com/fastapi-practices
-- name: solara
- html_url: https://github.com/widgetti/solara
- stars: 2162
- owner_login: widgetti
- owner_html_url: https://github.com/widgetti
+- name: fastapi-utils
+ html_url: https://github.com/fastapiutils/fastapi-utils
+ stars: 2308
+ owner_login: fastapiutils
+ owner_html_url: https://github.com/fastapiutils
- name: vue-fastapi-admin
html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin
- stars: 2148
+ stars: 2184
owner_login: mizhexiaoxiao
owner_html_url: https://github.com/mizhexiaoxiao
+- name: solara
+ html_url: https://github.com/widgetti/solara
+ stars: 2166
+ owner_login: widgetti
+ owner_html_url: https://github.com/widgetti
- name: mangum
html_url: https://github.com/Kludex/mangum
- stars: 2119
+ stars: 2125
owner_login: Kludex
owner_html_url: https://github.com/Kludex
+- name: codex-lb
+ html_url: https://github.com/Soju06/codex-lb
+ stars: 2122
+ owner_login: Soju06
+ owner_html_url: https://github.com/Soju06
+- name: kiro-gateway
+ html_url: https://github.com/jwadow/kiro-gateway
+ stars: 2068
+ owner_login: jwadow
+ owner_html_url: https://github.com/jwadow
+- name: open-wearables
+ html_url: https://github.com/the-momentum/open-wearables
+ stars: 2036
+ owner_login: the-momentum
+ owner_html_url: https://github.com/the-momentum
- name: slowapi
html_url: https://github.com/laurentS/slowapi
- stars: 2000
+ stars: 2022
owner_login: laurentS
owner_html_url: https://github.com/laurentS
- name: xhs_ai_publisher
html_url: https://github.com/BetaStreetOmnis/xhs_ai_publisher
- stars: 1980
+ stars: 2004
owner_login: BetaStreetOmnis
owner_html_url: https://github.com/BetaStreetOmnis
+- name: FastAPI-boilerplate
+ html_url: https://github.com/benavlabs/FastAPI-boilerplate
+ stars: 1984
+ owner_login: benavlabs
+ owner_html_url: https://github.com/benavlabs
- name: openapi-python-client
html_url: https://github.com/openapi-generators/openapi-python-client
- stars: 1960
+ stars: 1967
owner_login: openapi-generators
owner_html_url: https://github.com/openapi-generators
- name: agentkit
@@ -328,34 +353,24 @@
stars: 1944
owner_login: BCG-X-Official
owner_html_url: https://github.com/BCG-X-Official
-- name: FastAPI-boilerplate
- html_url: https://github.com/benavlabs/FastAPI-boilerplate
- stars: 1931
- owner_login: benavlabs
- owner_html_url: https://github.com/benavlabs
- name: piccolo
html_url: https://github.com/piccolo-orm/piccolo
- stars: 1904
+ stars: 1922
owner_login: piccolo-orm
owner_html_url: https://github.com/piccolo-orm
- name: manage-fastapi
html_url: https://github.com/ycd/manage-fastapi
- stars: 1903
+ stars: 1905
owner_login: ycd
owner_html_url: https://github.com/ycd
- name: fastapi-cache
html_url: https://github.com/long2ice/fastapi-cache
- stars: 1865
+ stars: 1866
owner_login: long2ice
owner_html_url: https://github.com/long2ice
-- name: kiro-gateway
- html_url: https://github.com/jwadow/kiro-gateway
- stars: 1853
- owner_login: jwadow
- owner_html_url: https://github.com/jwadow
- name: ormar
html_url: https://github.com/ormar-orm/ormar
- stars: 1809
+ stars: 1806
owner_login: ormar-orm
owner_html_url: https://github.com/ormar-orm
- name: python-week-2022
@@ -363,39 +378,29 @@
stars: 1806
owner_login: rochacbruno
owner_html_url: https://github.com/rochacbruno
-- name: open-wearables
- html_url: https://github.com/the-momentum/open-wearables
- stars: 1782
- owner_login: the-momentum
- owner_html_url: https://github.com/the-momentum
+- name: WebRPA
+ html_url: https://github.com/pmh1314520/WebRPA
+ stars: 1781
+ owner_login: pmh1314520
+ owner_html_url: https://github.com/pmh1314520
- name: termpair
html_url: https://github.com/cs01/termpair
stars: 1735
owner_login: cs01
owner_html_url: https://github.com/cs01
-- name: WebRPA
- html_url: https://github.com/pmh1314520/WebRPA
- stars: 1718
- owner_login: pmh1314520
- owner_html_url: https://github.com/pmh1314520
-- name: codex-lb
- html_url: https://github.com/Soju06/codex-lb
- stars: 1709
- owner_login: Soju06
- owner_html_url: https://github.com/Soju06
- name: fastapi-crudrouter
html_url: https://github.com/awtkns/fastapi-crudrouter
- stars: 1692
+ stars: 1694
owner_login: awtkns
owner_html_url: https://github.com/awtkns
- name: bracket
html_url: https://github.com/evroon/bracket
- stars: 1682
+ stars: 1694
owner_login: evroon
owner_html_url: https://github.com/evroon
- name: fastapi-pagination
html_url: https://github.com/uriyyo/fastapi-pagination
- stars: 1658
+ stars: 1670
owner_login: uriyyo
owner_html_url: https://github.com/uriyyo
- name: langchain-serve
@@ -405,91 +410,86 @@
owner_html_url: https://github.com/jina-ai
- name: awesome-fastapi-projects
html_url: https://github.com/Kludex/awesome-fastapi-projects
- stars: 1603
+ stars: 1608
owner_login: Kludex
owner_html_url: https://github.com/Kludex
- name: coronavirus-tracker-api
html_url: https://github.com/ExpDev07/coronavirus-tracker-api
- stars: 1567
+ stars: 1568
owner_login: ExpDev07
owner_html_url: https://github.com/ExpDev07
- name: fastapi-amis-admin
html_url: https://github.com/amisadmin/fastapi-amis-admin
- stars: 1554
+ stars: 1559
owner_login: amisadmin
owner_html_url: https://github.com/amisadmin
- name: fastcrud
html_url: https://github.com/benavlabs/fastcrud
- stars: 1519
+ stars: 1531
owner_login: benavlabs
owner_html_url: https://github.com/benavlabs
- name: tavily-key-generator
html_url: https://github.com/skernelx/tavily-key-generator
- stars: 1507
+ stars: 1526
owner_login: skernelx
owner_html_url: https://github.com/skernelx
- name: fastapi-boilerplate
html_url: https://github.com/teamhide/fastapi-boilerplate
- stars: 1490
+ stars: 1491
owner_login: teamhide
owner_html_url: https://github.com/teamhide
+- name: full-stack-ai-agent-template
+ html_url: https://github.com/vstorm-co/full-stack-ai-agent-template
+ stars: 1484
+ owner_login: vstorm-co
+ owner_html_url: https://github.com/vstorm-co
- name: prometheus-fastapi-instrumentator
html_url: https://github.com/trallnag/prometheus-fastapi-instrumentator
- stars: 1458
+ stars: 1471
owner_login: trallnag
owner_html_url: https://github.com/trallnag
- name: awesome-python-resources
html_url: https://github.com/DjangoEx/awesome-python-resources
- stars: 1448
+ stars: 1451
owner_login: DjangoEx
owner_html_url: https://github.com/DjangoEx
-- name: fastapi-tutorial
- html_url: https://github.com/liaogx/fastapi-tutorial
- stars: 1404
- owner_login: liaogx
- owner_html_url: https://github.com/liaogx
-- name: fastapi-code-generator
- html_url: https://github.com/koxudaxi/fastapi-code-generator
- stars: 1397
- owner_login: koxudaxi
- owner_html_url: https://github.com/koxudaxi
- name: aktools
html_url: https://github.com/akfamily/aktools
- stars: 1394
+ stars: 1431
owner_login: akfamily
owner_html_url: https://github.com/akfamily
- name: RuoYi-Vue3-FastAPI
html_url: https://github.com/insistence/RuoYi-Vue3-FastAPI
- stars: 1364
+ stars: 1419
owner_login: insistence
owner_html_url: https://github.com/insistence
+- name: fastapi-tutorial
+ html_url: https://github.com/liaogx/fastapi-tutorial
+ stars: 1418
+ owner_login: liaogx
+ owner_html_url: https://github.com/liaogx
+- name: fastapi-code-generator
+ html_url: https://github.com/koxudaxi/fastapi-code-generator
+ stars: 1396
+ owner_login: koxudaxi
+ owner_html_url: https://github.com/koxudaxi
+- name: yubal
+ html_url: https://github.com/guillevc/yubal
+ stars: 1388
+ owner_login: guillevc
+ owner_html_url: https://github.com/guillevc
- name: budgetml
html_url: https://github.com/ebhy/budgetml
- stars: 1345
+ stars: 1343
owner_login: ebhy
owner_html_url: https://github.com/ebhy
-- name: full-stack-ai-agent-template
- html_url: https://github.com/vstorm-co/full-stack-ai-agent-template
- stars: 1316
- owner_login: vstorm-co
- owner_html_url: https://github.com/vstorm-co
-- name: bolt-python
- html_url: https://github.com/slackapi/bolt-python
- stars: 1308
- owner_login: slackapi
- owner_html_url: https://github.com/slackapi
-- name: bedrock-chat
- html_url: https://github.com/aws-samples/bedrock-chat
- stars: 1304
- owner_login: aws-samples
- owner_html_url: https://github.com/aws-samples
+- name: Chatterbox-TTS-Server
+ html_url: https://github.com/devnen/Chatterbox-TTS-Server
+ stars: 1328
+ owner_login: devnen
+ owner_html_url: https://github.com/devnen
- name: restish
html_url: https://github.com/rest-sh/restish
- stars: 1303
+ stars: 1321
owner_login: rest-sh
owner_html_url: https://github.com/rest-sh
-- name: yubal
- html_url: https://github.com/guillevc/yubal
- stars: 1302
- owner_login: guillevc
- owner_html_url: https://github.com/guillevc
diff --git a/docs/en/data/translation_reviewers.yml b/docs/en/data/translation_reviewers.yml
index 3ed7d09d9..ccc4d604f 100644
--- a/docs/en/data/translation_reviewers.yml
+++ b/docs/en/data/translation_reviewers.yml
@@ -28,6 +28,11 @@ hard-coders:
count: 102
avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=78d12d1acdf853c817700145e73de7fd9e5d068b&v=4
url: https://github.com/hard-coders
+YuriiMotov:
+ login: YuriiMotov
+ count: 95
+ avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4
+ url: https://github.com/YuriiMotov
hasansezertasan:
login: hasansezertasan
count: 95
@@ -38,11 +43,6 @@ alv2017:
count: 88
avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4
url: https://github.com/alv2017
-YuriiMotov:
- login: YuriiMotov
- count: 87
- avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4
- url: https://github.com/YuriiMotov
nazarepiedady:
login: nazarepiedady
count: 87
@@ -383,6 +383,11 @@ mastizada:
count: 16
avatarUrl: https://avatars.githubusercontent.com/u/1975818?u=0751a06d7271c8bf17cb73b1b845644ab4d2c6dc&v=4
url: https://github.com/mastizada
+waketzheng:
+ login: waketzheng
+ count: 16
+ avatarUrl: https://avatars.githubusercontent.com/u/35413830?u=df19e4fd5bb928e7d086e053ef26a46aad23bf84&v=4
+ url: https://github.com/waketzheng
Joao-Pedro-P-Holanda:
login: Joao-Pedro-P-Holanda
count: 16
@@ -448,11 +453,6 @@ impocode:
count: 13
avatarUrl: https://avatars.githubusercontent.com/u/109408819?u=9cdfc5ccb31a2094c520f41b6087012fa9048982&v=4
url: https://github.com/impocode
-waketzheng:
- login: waketzheng
- count: 13
- avatarUrl: https://avatars.githubusercontent.com/u/35413830?u=df19e4fd5bb928e7d086e053ef26a46aad23bf84&v=4
- url: https://github.com/waketzheng
wesinalves:
login: wesinalves
count: 13
@@ -563,6 +563,11 @@ Pyth3rEx:
count: 11
avatarUrl: https://avatars.githubusercontent.com/u/26427764?u=087724f74d813c95925d51e354554bd4b6d6bb60&v=4
url: https://github.com/Pyth3rEx
+ABcDexter:
+ login: ABcDexter
+ count: 11
+ avatarUrl: https://avatars.githubusercontent.com/u/7236257?u=baa7e62eb4d0014b5854bfd0d5c2b20bd9617e0d&v=4
+ url: https://github.com/ABcDexter
mariacamilagl:
login: mariacamilagl
count: 10
@@ -661,7 +666,7 @@ eVery1337:
aykhans:
login: aykhans
count: 9
- avatarUrl: https://avatars.githubusercontent.com/u/88669260?u=798da457cc3276d3c6dd7fd628d0005ad8b298cc&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/88669260?u=2760f6f6728ed11108b56265682bcf68d46067a5&v=4
url: https://github.com/aykhans
riroan:
login: riroan
@@ -671,7 +676,7 @@ riroan:
MinLee0210:
login: MinLee0210
count: 9
- avatarUrl: https://avatars.githubusercontent.com/u/57653278?u=e7c4d8d7eeb7bceed1680ef0e5dafec0695f57e0&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/57653278?u=9fef84dd2f7497e8b43db01ba517a5b2bd66ad88&v=4
url: https://github.com/MinLee0210
yodai-yodai:
login: yodai-yodai
@@ -693,11 +698,6 @@ Yarous:
count: 9
avatarUrl: https://avatars.githubusercontent.com/u/61277193?u=5b462347458a373b2d599c6f416d2b75eddbffad&v=4
url: https://github.com/Yarous
-ABcDexter:
- login: ABcDexter
- count: 9
- avatarUrl: https://avatars.githubusercontent.com/u/7236257?u=baa7e62eb4d0014b5854bfd0d5c2b20bd9617e0d&v=4
- url: https://github.com/ABcDexter
dimaqq:
login: dimaqq
count: 8
@@ -756,7 +756,7 @@ EdmilsonRodrigues:
roli2py:
login: roli2py
count: 8
- avatarUrl: https://avatars.githubusercontent.com/u/61126128?u=bcb7a286e435a6b9d6a84b07db1232580ee796d4&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/61126128?u=d20921080d6b9499b39ef3431e850432fe68f903&v=4
url: https://github.com/roli2py
Serrones:
login: Serrones
@@ -1281,7 +1281,7 @@ rafsaf:
frnsimoes:
login: frnsimoes
count: 3
- avatarUrl: https://avatars.githubusercontent.com/u/66239468?u=be491199e4695bb0ac43d17d59cf7d41f9df629f&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/66239468?u=c86ceed4afa180477e28b9ff0019ab894a1e1eb9&v=4
url: https://github.com/frnsimoes
lieryan:
login: lieryan
diff --git a/docs/en/data/translators.yml b/docs/en/data/translators.yml
index d0ca9a1d6..ccad6767f 100644
--- a/docs/en/data/translators.yml
+++ b/docs/en/data/translators.yml
@@ -5,7 +5,7 @@ nilslindemann:
url: https://github.com/nilslindemann
tiangolo:
login: tiangolo
- count: 78
+ count: 100
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
url: https://github.com/tiangolo
jaystone776:
@@ -23,6 +23,11 @@ valentinDruzhinin:
count: 29
avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
url: https://github.com/valentinDruzhinin
+YuriiMotov:
+ login: YuriiMotov
+ count: 24
+ avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4
+ url: https://github.com/YuriiMotov
tokusumi:
login: tokusumi
count: 23
@@ -33,11 +38,6 @@ SwftAlpc:
count: 23
avatarUrl: https://avatars.githubusercontent.com/u/52768429?u=6a3aa15277406520ad37f6236e89466ed44bc5b8&v=4
url: https://github.com/SwftAlpc
-YuriiMotov:
- login: YuriiMotov
- count: 23
- avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4
- url: https://github.com/YuriiMotov
hasansezertasan:
login: hasansezertasan
count: 22
@@ -466,7 +466,7 @@ ArtemKhymenko:
hasnatsajid:
login: hasnatsajid
count: 2
- avatarUrl: https://avatars.githubusercontent.com/u/86589885?u=3712c0362d7a4000d76022339c545cf46aa5903f&v=4
+ avatarUrl: https://avatars.githubusercontent.com/u/86589885?u=a1f0d462a558e4fc7271bfcdc7e5e7de92b9e10b&v=4
url: https://github.com/hasnatsajid
alperiox:
login: alperiox
diff --git a/docs/en/docs/_llm-test.md b/docs/en/docs/_llm-test.md
index 2b548064d..603474cfc 100644
--- a/docs/en/docs/_llm-test.md
+++ b/docs/en/docs/_llm-test.md
@@ -185,7 +185,7 @@ See section `### Links` in the general prompt in `scripts/translate.py`.
//// tab | Test
-Here some things wrapped in HTML "abbr" elements (Some are invented):
+Here are some things wrapped in HTML "abbr" elements (Some are invented):
### The abbr gives a full phrase { #the-abbr-gives-a-full-phrase }
@@ -488,7 +488,7 @@ For some language specific instructions, see e.g. section `### Headings` in `doc
//// tab | Info
-This is a not complete and not normative list of (mostly) technical terms seen in the docs. It may be helpful for the prompt designer to figure out for which terms the LLM needs a helping hand. For example when it keeps reverting a good translation to a suboptimal translation. Or when it has problems conjugating/declinating a term in your language.
+This is neither a complete nor a normative list of (mostly) technical terms seen in the docs. It may be helpful for the prompt designer to figure out for which terms the LLM needs a helping hand. For example when it keeps reverting a good translation to a suboptimal translation. Or when it has problems conjugating/declinating a term in your language.
See e.g. section `### List of English terms and their preferred German translations` in `docs/de/llm-prompt.md`.
diff --git a/docs/en/docs/advanced/additional-status-codes.md b/docs/en/docs/advanced/additional-status-codes.md
index 3b6da2355..c4f1bf389 100644
--- a/docs/en/docs/advanced/additional-status-codes.md
+++ b/docs/en/docs/advanced/additional-status-codes.md
@@ -8,7 +8,7 @@ It will use the default status code or the one you set in your *path operation*.
If you want to return additional status codes apart from the main one, you can do that by returning a `Response` directly, like a `JSONResponse`, and set the additional status code directly.
-For example, let's say that you want to have a *path operation* that allows to update items, and returns HTTP status codes of 200 "OK" when successful.
+For example, let's say that you want to have a *path operation* that allows updating items, and returns HTTP status codes of 200 "OK" when successful.
But you also want it to accept new items. And when the items didn't exist before, it creates them, and returns an HTTP status code of 201 "Created".
diff --git a/docs/en/docs/advanced/advanced-dependencies.md b/docs/en/docs/advanced/advanced-dependencies.md
index 59ab62bf0..e039788ae 100644
--- a/docs/en/docs/advanced/advanced-dependencies.md
+++ b/docs/en/docs/advanced/advanced-dependencies.md
@@ -54,7 +54,7 @@ checker(q="somequery")
/// tip
-All this might seem contrived. And it might not be very clear how is it useful yet.
+All this might seem contrived. And it might not be very clear how it is useful yet.
These examples are intentionally simple, but show how it all works.
@@ -112,7 +112,7 @@ For example, imagine you have code that uses a database session in a dependency
In this case, the database session would be held until the response is finished being sent, but if you don't use it, then it wouldn't be necessary to hold it.
-Here's how it could look like:
+Here's how it could look:
{* ../../docs_src/dependencies/tutorial013_an_py310.py *}
diff --git a/docs/en/docs/advanced/dataclasses.md b/docs/en/docs/advanced/dataclasses.md
index 292dc3fba..fbabe0c87 100644
--- a/docs/en/docs/advanced/dataclasses.md
+++ b/docs/en/docs/advanced/dataclasses.md
@@ -24,7 +24,7 @@ Keep in mind that dataclasses can't do everything Pydantic models can do.
So, you might still need to use Pydantic models.
-But if you have a bunch of dataclasses laying around, this is a nice trick to use them to power a web API using FastAPI. 🤓
+But if you have a bunch of dataclasses lying around, this is a nice trick to use them to power a web API using FastAPI. 🤓
///
diff --git a/docs/en/docs/advanced/events.md b/docs/en/docs/advanced/events.md
index 3e65854e7..8f8cdb017 100644
--- a/docs/en/docs/advanced/events.md
+++ b/docs/en/docs/advanced/events.md
@@ -142,7 +142,7 @@ So, we declare the event handler function with standard `def` instead of `async
There's a high chance that the logic for your *startup* and *shutdown* is connected, you might want to start something and then finish it, acquire a resource and then release it, etc.
-Doing that in separated functions that don't share logic or variables together is more difficult as you would need to store values in global variables or similar tricks.
+Doing that in separate functions that don't share logic or variables together is more difficult as you would need to store values in global variables or similar tricks.
Because of that, it's now recommended to instead use the `lifespan` as explained above.
diff --git a/docs/en/docs/advanced/generate-clients.md b/docs/en/docs/advanced/generate-clients.md
index 1fff3c9dc..67dfe736f 100644
--- a/docs/en/docs/advanced/generate-clients.md
+++ b/docs/en/docs/advanced/generate-clients.md
@@ -20,21 +20,6 @@ FastAPI automatically generates **OpenAPI 3.1** specifications, so any tool you
///
-## SDK Generators from FastAPI Sponsors { #sdk-generators-from-fastapi-sponsors }
-
-This section highlights **venture-backed** and **company-supported** solutions from companies that sponsor FastAPI. These products provide **additional features** and **integrations** on top of high-quality generated SDKs.
-
-By ✨ [**sponsoring FastAPI**](../help-fastapi.md#sponsor-the-author) ✨, these companies help ensure the framework and its **ecosystem** remain healthy and **sustainable**.
-
-Their sponsorship also demonstrates a strong commitment to the FastAPI **community** (you), showing that they care not only about offering a **great service** but also about supporting a **robust and thriving framework**, FastAPI. 🙇
-
-For example, you might want to try:
-
-* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
-* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi)
-
-Some of these solutions may also be open source or offer free tiers, so you can try them without a financial commitment. Other commercial SDK generators are available and can be found online. 🤓
-
## Create a TypeScript SDK { #create-a-typescript-sdk }
Let's start with a simple FastAPI application:
diff --git a/docs/en/docs/advanced/json-base64-bytes.md b/docs/en/docs/advanced/json-base64-bytes.md
index 9f0602c54..55f4a99b4 100644
--- a/docs/en/docs/advanced/json-base64-bytes.md
+++ b/docs/en/docs/advanced/json-base64-bytes.md
@@ -4,7 +4,7 @@ If your app needs to receive and send JSON data, but you need to include binary
## Base64 vs Files { #base64-vs-files }
-Consider first if you can use [Request Files](../tutorial/request-files.md) for uploading binary data and [Custom Response - FileResponse](./custom-response.md#fileresponse--fileresponse-) for sending binary data, instead of encoding it in JSON.
+Consider first if you can use [Request Files](../tutorial/request-files.md) for uploading binary data and [Custom Response - FileResponse](./custom-response.md#fileresponse) for sending binary data, instead of encoding it in JSON.
JSON can only contain UTF-8 encoded strings, so it can't contain raw bytes.
diff --git a/docs/en/docs/advanced/openapi-callbacks.md b/docs/en/docs/advanced/openapi-callbacks.md
index 40cf47956..17910e1cf 100644
--- a/docs/en/docs/advanced/openapi-callbacks.md
+++ b/docs/en/docs/advanced/openapi-callbacks.md
@@ -4,7 +4,7 @@ You could create an API with a *path operation* that could trigger a request to
The process that happens when your API app calls the *external API* is named a "callback". Because the software that the external developer wrote sends a request to your API and then your API *calls back*, sending a request to an *external API* (that was probably created by the same developer).
-In this case, you could want to document how that external API *should* look like. What *path operation* it should have, what body it should expect, what response it should return, etc.
+In this case, you could want to document how that external API *should* look. What *path operation* it should have, what body it should expect, what response it should return, etc.
## An app with callbacks { #an-app-with-callbacks }
@@ -25,7 +25,7 @@ Then your API will (let's imagine):
## The normal **FastAPI** app { #the-normal-fastapi-app }
-Let's first see how the normal API app would look like before adding the callback.
+Let's first see how the normal API app would look before adding the callback.
It will have a *path operation* that will receive an `Invoice` body, and a query parameter `callback_url` that will contain the URL for the callback.
@@ -56,7 +56,7 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True})
But possibly the most important part of the callback is making sure that your API user (the external developer) implements the *external API* correctly, according to the data that *your API* is going to send in the request body of the callback, etc.
-So, what we will do next is add the code to document how that *external API* should look like to receive the callback from *your API*.
+So, what we will do next is add the code to document how that *external API* should look to receive the callback from *your API*.
That documentation will show up in the Swagger UI at `/docs` in your API, and it will let external developers know how to build the *external API*.
@@ -72,11 +72,11 @@ When implementing the callback yourself, you could use something like [HTTPX](ht
## Write the callback documentation code { #write-the-callback-documentation-code }
-This code won't be executed in your app, we only need it to *document* how that *external API* should look like.
+This code won't be executed in your app, we only need it to *document* how that *external API* should look.
But, you already know how to easily create automatic documentation for an API with **FastAPI**.
-So we are going to use that same knowledge to document how the *external API* should look like... by creating the *path operation(s)* that the external API should implement (the ones your API will call).
+So we are going to use that same knowledge to document how the *external API* should look... by creating the *path operation(s)* that the external API should implement (the ones your API will call).
/// tip
@@ -167,13 +167,13 @@ Notice how the callback URL used contains the URL received as a query parameter
At this point you have the *callback path operation(s)* needed (the one(s) that the *external developer* should implement in the *external API*) in the callback router you created above.
-Now use the parameter `callbacks` in *your API's path operation decorator* to pass the attribute `.routes` (that's actually just a `list` of routes/*path operations*) from that callback router:
+Now use the parameter `callbacks` in *your API's path operation decorator* to pass the attribute `.routes` from that callback router:
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
/// tip
-Notice that you are not passing the router itself (`invoices_callback_router`) to `callback=`, but the attribute `.routes`, as in `invoices_callback_router.routes`.
+Notice that you are not passing the router itself (`invoices_callback_router`) to `callbacks=`, but its `.routes`, as in `invoices_callback_router.routes`. FastAPI will use those routes to generate the callback OpenAPI documentation.
///
@@ -181,6 +181,6 @@ Notice that you are not passing the router itself (`invoices_callback_router`) t
Now you can start your app and go to [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
-You will see your docs including a "Callbacks" section for your *path operation* that shows how the *external API* should look like:
+You will see your docs including a "Callbacks" section for your *path operation* that shows how the *external API* should look:
diff --git a/docs/en/docs/advanced/path-operation-advanced-configuration.md b/docs/en/docs/advanced/path-operation-advanced-configuration.md
index 800bf305d..9dca4d712 100644
--- a/docs/en/docs/advanced/path-operation-advanced-configuration.md
+++ b/docs/en/docs/advanced/path-operation-advanced-configuration.md
@@ -16,17 +16,11 @@ You would have to make sure that it is unique for each operation.
### Using the *path operation function* name as the operationId { #using-the-path-operation-function-name-as-the-operationid }
-If you want to use your APIs' function names as `operationId`s, you can iterate over all of them and override each *path operation's* `operation_id` using their `APIRoute.name`.
+If you want to use your APIs' function names as `operationId`s, you can pass a custom `generate_unique_id_function` to `FastAPI`.
-You should do it after adding all your *path operations*.
+The function receives each `APIRoute` and returns the `operationId` to use for that path operation.
-{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}
-
-/// tip
-
-If you manually call `app.openapi()`, you should update the `operationId`s before that.
-
-///
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *}
/// warning
diff --git a/docs/en/docs/advanced/response-change-status-code.md b/docs/en/docs/advanced/response-change-status-code.md
index 8efd63198..747016722 100644
--- a/docs/en/docs/advanced/response-change-status-code.md
+++ b/docs/en/docs/advanced/response-change-status-code.md
@@ -18,7 +18,7 @@ For those cases, you can use a `Response` parameter.
You can declare a parameter of type `Response` in your *path operation function* (as you can do for cookies and headers).
-And then you can set the `status_code` in that *temporal* response object.
+And then you can set the `status_code` in that *temporary* response object.
{* ../../docs_src/response_change_status_code/tutorial001_py310.py hl[1,9,12] *}
@@ -26,6 +26,6 @@ And then you can return any object you need, as you normally would (a `dict`, a
And if you declared a `response_model`, it will still be used to filter and convert the object you returned.
-**FastAPI** will use that *temporal* response to extract the status code (also cookies and headers), and will put them in the final response that contains the value you returned, filtered by any `response_model`.
+**FastAPI** will use that *temporary* response to extract the status code (also cookies and headers), and will put them in the final response that contains the value you returned, filtered by any `response_model`.
You can also declare the `Response` parameter in dependencies, and set the status code in them. But keep in mind that the last one to be set will win.
diff --git a/docs/en/docs/advanced/response-cookies.md b/docs/en/docs/advanced/response-cookies.md
index a7ad90cad..f523a5c63 100644
--- a/docs/en/docs/advanced/response-cookies.md
+++ b/docs/en/docs/advanced/response-cookies.md
@@ -4,7 +4,7 @@
You can declare a parameter of type `Response` in your *path operation function*.
-And then you can set cookies in that *temporal* response object.
+And then you can set cookies in that *temporary* response object.
{* ../../docs_src/response_cookies/tutorial002_py310.py hl[1, 8:9] *}
@@ -12,7 +12,7 @@ And then you can return any object you need, as you normally would (a `dict`, a
And if you declared a `response_model`, it will still be used to filter and convert the object you returned.
-**FastAPI** will use that *temporal* response to extract the cookies (also headers and status code), and will put them in the final response that contains the value you returned, filtered by any `response_model`.
+**FastAPI** will use that *temporary* response to extract the cookies (also headers and status code), and will put them in the final response that contains the value you returned, filtered by any `response_model`.
You can also declare the `Response` parameter in dependencies, and set cookies (and headers) in them.
diff --git a/docs/en/docs/advanced/response-headers.md b/docs/en/docs/advanced/response-headers.md
index d7738635d..cbc28e495 100644
--- a/docs/en/docs/advanced/response-headers.md
+++ b/docs/en/docs/advanced/response-headers.md
@@ -4,7 +4,7 @@
You can declare a parameter of type `Response` in your *path operation function* (as you can do for cookies).
-And then you can set headers in that *temporal* response object.
+And then you can set headers in that *temporary* response object.
{* ../../docs_src/response_headers/tutorial002_py310.py hl[1, 7:8] *}
@@ -12,7 +12,7 @@ And then you can return any object you need, as you normally would (a `dict`, a
And if you declared a `response_model`, it will still be used to filter and convert the object you returned.
-**FastAPI** will use that *temporal* response to extract the headers (also cookies and status code), and will put them in the final response that contains the value you returned, filtered by any `response_model`.
+**FastAPI** will use that *temporary* response to extract the headers (also cookies and status code), and will put them in the final response that contains the value you returned, filtered by any `response_model`.
You can also declare the `Response` parameter in dependencies, and set headers (and cookies) in them.
diff --git a/docs/en/docs/advanced/security/oauth2-scopes.md b/docs/en/docs/advanced/security/oauth2-scopes.md
index 92b604757..60e900d2c 100644
--- a/docs/en/docs/advanced/security/oauth2-scopes.md
+++ b/docs/en/docs/advanced/security/oauth2-scopes.md
@@ -194,11 +194,11 @@ For this, we use `security_scopes.scopes`, that contains a `list` with all these
Let's review again this dependency tree and the scopes.
-As the `get_current_active_user` dependency has as a sub-dependency on `get_current_user`, the scope `"me"` declared at `get_current_active_user` will be included in the list of required scopes in the `security_scopes.scopes` passed to `get_current_user`.
+As the `get_current_active_user` dependency has `get_current_user` as a sub-dependency, the scope `"me"` declared at `get_current_active_user` will be included in the list of required scopes in the `security_scopes.scopes` passed to `get_current_user`.
The *path operation* itself also declares a scope, `"items"`, so this will also be in the list of `security_scopes.scopes` passed to `get_current_user`.
-Here's how the hierarchy of dependencies and scopes looks like:
+Here's what the hierarchy of dependencies and scopes looks like:
* The *path operation* `read_own_items` has:
* Required scopes `["items"]` with the dependency:
diff --git a/docs/en/docs/advanced/settings.md b/docs/en/docs/advanced/settings.md
index f0f3bb41d..ff313f088 100644
--- a/docs/en/docs/advanced/settings.md
+++ b/docs/en/docs/advanced/settings.md
@@ -14,7 +14,7 @@ To understand environment variables you can read [Environment Variables](../envi
## Types and validation { #types-and-validation }
-These environment variables can only handle text strings, as they are external to Python and have to be compatible with other programs and the rest of the system (and even with different operating systems, as Linux, Windows, macOS).
+These environment variables can only handle text strings, as they are external to Python and have to be compatible with other programs and the rest of the system (and even with different operating systems, such as Linux, Windows, and macOS).
That means that any value read in Python from an environment variable will be a `str`, and any conversion to a different type or any validation has to be done in code.
diff --git a/docs/en/docs/advanced/stream-data.md b/docs/en/docs/advanced/stream-data.md
index 3e7c89a93..40ea33743 100644
--- a/docs/en/docs/advanced/stream-data.md
+++ b/docs/en/docs/advanced/stream-data.md
@@ -14,7 +14,7 @@ Added in FastAPI 0.134.0.
You could use this if you want to stream pure strings, for example directly from the output of an **AI LLM** service.
-You could also use it to stream **large binary files**, where you stream each chunk of data as you read it, without having to read it all in memory at once.
+You could also use it to stream **large binary files**, where you stream each chunk of data as you read it, without having to read it all into memory at once.
You could also stream **video** or **audio** this way, it could even be generated as you process and send it.
diff --git a/docs/en/docs/advanced/wsgi.md b/docs/en/docs/advanced/wsgi.md
index 39a492eb6..8dcc3c401 100644
--- a/docs/en/docs/advanced/wsgi.md
+++ b/docs/en/docs/advanced/wsgi.md
@@ -24,7 +24,7 @@ And then mount that under a path.
Previously, it was recommended to use `WSGIMiddleware` from `fastapi.middleware.wsgi`, but it is now deprecated.
-It’s advised to use the `a2wsgi` package instead. The usage remains the same.
+It's advised to use the `a2wsgi` package instead. The usage remains the same.
Just ensure that you have the `a2wsgi` package installed and import `WSGIMiddleware` correctly from `a2wsgi`.
diff --git a/docs/en/docs/alternatives.md b/docs/en/docs/alternatives.md
index 0e7dc8571..d4942a37b 100644
--- a/docs/en/docs/alternatives.md
+++ b/docs/en/docs/alternatives.md
@@ -24,7 +24,7 @@ It was created to generate the HTML in the backend, not to create APIs used by a
### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework }
-Django REST framework was created to be a flexible toolkit for building Web APIs using Django underneath, to improve its API capabilities.
+Django REST Framework was created to be a flexible toolkit for building Web APIs using Django underneath, to improve its API capabilities.
It is used by many companies including Mozilla, Red Hat and Eventbrite.
@@ -345,7 +345,7 @@ Hug was created by Timothy Crosley, the same creator of [`isort`](https://github
Hug inspired parts of APIStar, and was one of the tools I found most promising, alongside APIStar.
-Hug helped inspiring **FastAPI** to use Python type hints to declare parameters, and to generate a schema defining the API automatically.
+Hug helped inspire **FastAPI** to use Python type hints to declare parameters, and to generate a schema defining the API automatically.
Hug inspired **FastAPI** to declare a `response` parameter in functions to set headers and cookies.
@@ -380,7 +380,7 @@ Now APIStar is a set of tools to validate OpenAPI specifications, not a web fram
APIStar was created by Tom Christie. The same guy that created:
* Django REST Framework
-* Starlette (in which **FastAPI** is based)
+* Starlette (on which **FastAPI** is based)
* Uvicorn (used by Starlette and **FastAPI**)
///
@@ -393,7 +393,7 @@ The idea of declaring multiple things (data validation, serialization and docume
And after searching for a long time for a similar framework and testing many different alternatives, APIStar was the best option available.
-Then APIStar stopped to exist as a server and Starlette was created, and was a new better foundation for such a system. That was the final inspiration to build **FastAPI**.
+Then APIStar stopped existing as a server and Starlette was created, and was a new better foundation for such a system. That was the final inspiration to build **FastAPI**.
I consider **FastAPI** a "spiritual successor" to APIStar, while improving and increasing the features, typing system, and other parts, based on the learnings from all these previous tools.
diff --git a/docs/en/docs/async.md b/docs/en/docs/async.md
index 1ad996034..d975ddb53 100644
--- a/docs/en/docs/async.md
+++ b/docs/en/docs/async.md
@@ -70,7 +70,7 @@ Asynchronous code just means that the language 💬 has a way to tell the comput
So, during that time, the computer can go and do some other work, while "slow-file" 📝 finishes.
-Then the computer / program 🤖 will come back every time it has a chance because it's waiting again, or whenever it 🤖 finished all the work it had at that point. And it 🤖 will see if any of the tasks it was waiting for have already finished, doing whatever it had to do.
+Then the computer / program 🤖 will come back every time it has a chance because it's waiting again, or whenever it 🤖 finishes all the work it had at that point. And it 🤖 will see if any of the tasks it was waiting for have already finished, doing whatever it had to do.
Next, it 🤖 takes the first task to finish (let's say, our "slow-file" 📝) and continues whatever it had to do with it.
@@ -78,7 +78,7 @@ That "wait for something else" normally refers to
-
-```console
-$ fastapi login
-
-You are logged in to FastAPI Cloud 🚀
-```
-
-
-
-## Deploy { #deploy }
-
-Now deploy your app, with **one command**:
+You can deploy your FastAPI app to [FastAPI Cloud](https://fastapicloud.com) with just **one command**. 🚀
contact fields| Parameter | Type | Description |
|---|---|---|
name | str | The identifying name of the contact person/organization. |
url | str | The URL pointing to the contact information. MUST be in the format of a URL. |
email | str | The email address of the contact person/organization. MUST be in the format of an email address. |
license_info fields| Parameter | Type | Description |
|---|---|---|
name | str | REQUIRED (if a license_info is set). The license name used for the API. |
identifier | str | An [SPDX](https://spdx.org/licenses/) license expression for the API. The identifier field is mutually exclusive of the url field. Available since OpenAPI 3.1.0, FastAPI 0.99.0. |
url | str | A URL to the license used for the API. MUST be in the format of a URL. |
-Check how deprecated and non-deprecated *path operations* look like:
+Check how deprecated and non-deprecated *path operations* look:
diff --git a/docs/en/docs/tutorial/query-params-str-validations.md b/docs/en/docs/tutorial/query-params-str-validations.md
index 0714d8beb..eb9fa2607 100644
--- a/docs/en/docs/tutorial/query-params-str-validations.md
+++ b/docs/en/docs/tutorial/query-params-str-validations.md
@@ -406,7 +406,7 @@ But if you're curious about this specific code example and you're still entertai
#### String with `value.startswith()` { #string-with-value-startswith }
-Did you notice? a string using `value.startswith()` can take a tuple, and it will check each value in the tuple:
+Did you notice? A string using `value.startswith()` can take a tuple, and it will check each value in the tuple:
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[16:19] hl[17] *}
diff --git a/docs/en/docs/tutorial/query-params.md b/docs/en/docs/tutorial/query-params.md
index 563d39f7d..cb89e23e7 100644
--- a/docs/en/docs/tutorial/query-params.md
+++ b/docs/en/docs/tutorial/query-params.md
@@ -21,7 +21,7 @@ As they are part of the URL, they are "naturally" strings.
But when you declare them with Python types (in the example above, as `int`), they are converted to that type and validated against it.
-All the same process that applied for path parameters also applies for query parameters:
+All the same processes that apply to path parameters also apply to query parameters:
* Editor support (obviously)
* Data "parsing"
diff --git a/docs/en/docs/tutorial/request-files.md b/docs/en/docs/tutorial/request-files.md
index fe4290449..df7894781 100644
--- a/docs/en/docs/tutorial/request-files.md
+++ b/docs/en/docs/tutorial/request-files.md
@@ -60,7 +60,7 @@ Using `UploadFile` has several advantages over `bytes`:
* You don't have to use `File()` in the default value of the parameter.
* It uses a "spooled" file:
- * A file stored in memory up to a maximum size limit, and after passing this limit it will be stored in disk.
+ * A file stored in memory up to a maximum size limit, and after passing this limit it will be stored on disk.
* This means that it will work well for large files like images, videos, large binaries, etc. without consuming all the memory.
* You can get metadata from the uploaded file.
* It has a [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) `async` interface.
@@ -111,7 +111,7 @@ When you use the `async` methods, **FastAPI** runs the file methods in a threadp
## What is "Form Data" { #what-is-form-data }
-The way HTML forms (``) sends the data to the server normally uses a "special" encoding for that data, it's different from JSON.
+The way HTML forms (``) send the data to the server normally uses a "special" encoding for that data, it's different from JSON.
**FastAPI** will make sure to read that data from the right place instead of JSON.
diff --git a/docs/en/docs/tutorial/request-forms.md b/docs/en/docs/tutorial/request-forms.md
index 64e90a244..45af663c8 100644
--- a/docs/en/docs/tutorial/request-forms.md
+++ b/docs/en/docs/tutorial/request-forms.md
@@ -46,7 +46,7 @@ To declare form bodies, you need to use `Form` explicitly, because without it th
## About "Form Fields" { #about-form-fields }
-The way HTML forms (``) sends the data to the server normally uses a "special" encoding for that data, it's different from JSON.
+The way HTML forms (``) send the data to the server normally uses a "special" encoding for that data, it's different from JSON.
**FastAPI** will make sure to read that data from the right place instead of JSON.
diff --git a/docs/en/docs/tutorial/response-status-code.md b/docs/en/docs/tutorial/response-status-code.md
index a5f82ffb6..2dabc0617 100644
--- a/docs/en/docs/tutorial/response-status-code.md
+++ b/docs/en/docs/tutorial/response-status-code.md
@@ -49,7 +49,7 @@ If you already know what HTTP status codes are, skip to the next section.
In HTTP, you send a numeric status code of 3 digits as part of the response.
-These status codes have a name associated to recognize them, but the important part is the number.
+These status codes have an associated name to help recognize them, but the important part is the number.
In short:
diff --git a/docs/en/docs/tutorial/schema-extra-example.md b/docs/en/docs/tutorial/schema-extra-example.md
index 67c7ac37c..280162531 100644
--- a/docs/en/docs/tutorial/schema-extra-example.md
+++ b/docs/en/docs/tutorial/schema-extra-example.md
@@ -78,7 +78,7 @@ Nevertheless, at the time of writing this, Swagger
### OpenAPI-specific `examples` { #openapi-specific-examples }
-Since before **JSON Schema** supported `examples` OpenAPI had support for a different field also called `examples`.
+Since before **JSON Schema** supported `examples`, OpenAPI had support for a different field also called `examples`.
This **OpenAPI-specific** `examples` goes in another section in the OpenAPI specification. It goes in the **details for each *path operation***, not inside each JSON Schema.
diff --git a/docs/en/docs/tutorial/security/first-steps.md b/docs/en/docs/tutorial/security/first-steps.md
index 095b8b901..7dae3edf4 100644
--- a/docs/en/docs/tutorial/security/first-steps.md
+++ b/docs/en/docs/tutorial/security/first-steps.md
@@ -88,7 +88,7 @@ And it can also be used by yourself, to debug, check and test the same applicati
## The `password` flow { #the-password-flow }
-Now let's go back a bit and understand what is all that.
+Now let's go back a bit and understand what all that is.
The `password` "flow" is one of the ways ("flows") defined in OAuth2, to handle security and authentication.
diff --git a/docs/en/docs/tutorial/security/get-current-user.md b/docs/en/docs/tutorial/security/get-current-user.md
index f8a5fdf82..59a90a7e1 100644
--- a/docs/en/docs/tutorial/security/get-current-user.md
+++ b/docs/en/docs/tutorial/security/get-current-user.md
@@ -14,7 +14,7 @@ First, let's create a Pydantic user model.
The same way we use Pydantic to declare bodies, we can use it anywhere else:
-{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
+{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## Create a `get_current_user` dependency { #create-a-get-current-user-dependency }
diff --git a/docs/en/docs/tutorial/security/oauth2-jwt.md b/docs/en/docs/tutorial/security/oauth2-jwt.md
index 6c1ab27b2..68bad4e10 100644
--- a/docs/en/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/en/docs/tutorial/security/oauth2-jwt.md
@@ -124,7 +124,7 @@ This ensures the endpoint takes roughly the same amount of time to respond wheth
/// note
-If you check the new (fake) database `fake_users_db`, you will see how the hashed password looks like now: `"$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc"`.
+If you check the new (fake) database `fake_users_db`, you will see what the hashed password looks like now: `"$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc"`.
///
diff --git a/docs/en/docs/tutorial/security/simple-oauth2.md b/docs/en/docs/tutorial/security/simple-oauth2.md
index afe3ba128..72e08b19a 100644
--- a/docs/en/docs/tutorial/security/simple-oauth2.md
+++ b/docs/en/docs/tutorial/security/simple-oauth2.md
@@ -6,7 +6,7 @@ Now let's build from the previous chapter and add the missing parts to have a co
We are going to use **FastAPI** security utilities to get the `username` and `password`.
-OAuth2 specifies that when using the "password flow" (that we are using) the client/user must send a `username` and `password` fields as form data.
+OAuth2 specifies that when using the "password flow" (that we are using) the client/user must send `username` and `password` fields as form data.
And the spec says that the fields have to be named like that. So `user-name` or `email` wouldn't work.
@@ -146,7 +146,7 @@ UserInDB(
/// note
-For a more complete explanation of `**user_dict` check back in [the documentation for **Extra Models**](../extra-models.md#about-user-in-dict).
+For a more complete explanation of `**user_dict` check back in [the documentation for **Extra Models**](../extra-models.md#about-user-in-model-dump).
///
@@ -190,7 +190,7 @@ We want to get the `current_user` *only* if this user is active.
So, we create an additional dependency `get_current_active_user` that in turn uses `get_current_user` as a dependency.
-Both of these dependencies will just return an HTTP error if the user doesn't exist, or if is inactive.
+Both of these dependencies will just return an HTTP error if the user doesn't exist, or is inactive.
So, in our endpoint, we will only get a user if the user exists, was correctly authenticated, and is active:
diff --git a/docs/en/docs/tutorial/sql-databases.md b/docs/en/docs/tutorial/sql-databases.md
index b8cbac295..1f4b12ca9 100644
--- a/docs/en/docs/tutorial/sql-databases.md
+++ b/docs/en/docs/tutorial/sql-databases.md
@@ -201,7 +201,7 @@ Then let's create `Hero`, the actual *table model*, with the **extra fields** th
* `id`
* `secret_name`
-Because `Hero` inherits form `HeroBase`, it **also** has the **fields** declared in `HeroBase`, so all the fields for `Hero` are:
+Because `Hero` inherits from `HeroBase`, it **also** has the **fields** declared in `HeroBase`, so all the fields for `Hero` are:
* `id`
* `name`
diff --git a/docs/en/docs/tutorial/static-files.md b/docs/en/docs/tutorial/static-files.md
index 38c2ef248..4b5057c08 100644
--- a/docs/en/docs/tutorial/static-files.md
+++ b/docs/en/docs/tutorial/static-files.md
@@ -2,6 +2,14 @@
You can serve static files automatically from a directory using `StaticFiles`.
+/// tip
+
+If you need to host a frontend, use `app.frontend()` instead, read about it in [Frontend](frontend.md).
+
+`app.frontend()` uses `StaticFiles` underneath, with several additional advantages for frontends, like handling client-side routing.
+
+///
+
## Use `StaticFiles` { #use-staticfiles }
* Import `StaticFiles`.
@@ -33,7 +41,7 @@ The `directory="static"` refers to the name of the directory that contains your
The `name="static"` gives it a name that can be used internally by **FastAPI**.
-All these parameters can be different than "`static`", adjust them with the needs and specific details of your own application.
+All these parameters can be different than "`static`", adjust them to the needs and specific details of your own application.
## More info { #more-info }
diff --git a/docs/en/docs/tutorial/testing.md b/docs/en/docs/tutorial/testing.md
index 72f849f4b..38976dc31 100644
--- a/docs/en/docs/tutorial/testing.md
+++ b/docs/en/docs/tutorial/testing.md
@@ -24,7 +24,7 @@ Import `TestClient`.
Create a `TestClient` by passing your **FastAPI** application to it.
-Create functions with a name that starts with `test_` (this is standard `pytest` conventions).
+Create functions with a name that starts with `test_` (this is a standard `pytest` convention).
Use the `TestClient` object the same way as you do with `httpx`.
diff --git a/docs/en/docs/virtual-environments.md b/docs/en/docs/virtual-environments.md
index 119a6926a..7f95cad24 100644
--- a/docs/en/docs/virtual-environments.md
+++ b/docs/en/docs/virtual-environments.md
@@ -100,7 +100,7 @@ $ uv venv
By default, `uv` will create a virtual environment in a directory called `.venv`.
-But you could customize it passing an additional argument with the directory name.
+But you could customize it by passing an additional argument with the directory name.
///
@@ -258,7 +258,7 @@ $ python -m ensurepip --upgrade
-This command will install pip if it is not already installed and also ensures that the installed version of pip is at least as recent as the one available in `ensurepip`.
+This command will install pip if it is not already installed and also ensure that the installed version of pip is at least as recent as the one available in `ensurepip`.
///
@@ -447,7 +447,7 @@ Now you're ready to start working on your project.
/// tip
-Do you want to understand what's all that above?
+Do you want to understand what all that above is?
Continue reading. 👇🤓
@@ -548,7 +548,7 @@ Also, depending on your operating system (e.g. Linux, Windows, macOS), it could
## Where are Packages Installed { #where-are-packages-installed }
-When you install Python, it creates some directories with some files in your computer.
+When you install Python, it creates some directories with some files on your computer.
Some of these directories are the ones in charge of having all the packages you install.
@@ -568,7 +568,7 @@ That will download a compressed file with the FastAPI code, normally from [PyPI]
It will also **download** files for other packages that FastAPI depends on.
-Then it will **extract** all those files and put them in a directory in your computer.
+Then it will **extract** all those files and put them in a directory on your computer.
By default, it will put those files downloaded and extracted in the directory that comes with your Python installation, that's the **global environment**.
@@ -846,7 +846,7 @@ This is a simple guide to get you started and teach you how everything works **u
There are many **alternatives** to managing virtual environments, package dependencies (requirements), projects.
-Once you are ready and want to use a tool to **manage the entire project**, packages dependencies, virtual environments, etc. I would suggest you try [uv](https://github.com/astral-sh/uv).
+Once you are ready and want to use a tool to **manage the entire project**, package dependencies, virtual environments, etc. I would suggest you try [uv](https://github.com/astral-sh/uv).
`uv` can do a lot of things, it can:
diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml
index 6393f3844..884307dcf 100644
--- a/docs/en/mkdocs.yml
+++ b/docs/en/mkdocs.yml
@@ -133,6 +133,7 @@ nav:
- tutorial/server-sent-events.md
- tutorial/background-tasks.md
- tutorial/metadata.md
+ - tutorial/frontend.md
- tutorial/static-files.md
- tutorial/testing.md
- tutorial/debugging.md
@@ -303,6 +304,8 @@ extra:
name: es - español
- link: /fr/
name: fr - français
+ - link: /hi/
+ name: hi - हिन्दी
- link: /ja/
name: ja - 日本語
- link: /ko/
diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html
index 7559de529..1905a6573 100644
--- a/docs/en/overrides/main.html
+++ b/docs/en/overrides/main.html
@@ -7,7 +7,7 @@
{% include ".icons/material/cloud-arrow-up.svg" %}
- Join the FastAPI Cloud waiting list 🚀
+ Deploy on FastAPI Cloud 🚀
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-## Cambiar el tema { #change-the-theme }
+## Cambia el tema { #change-the-theme }
De la misma manera, podrías configurar el tema del resaltado de sintaxis con la clave `"syntaxHighlight.theme"` (ten en cuenta que tiene un punto en el medio):
@@ -34,7 +34,7 @@ Esa configuración cambiaría el tema de color del resaltado de sintaxis:
-## Cambiar los parámetros por defecto de Swagger UI { #change-default-swagger-ui-parameters }
+## Cambia los parámetros por defecto de Swagger UI { #change-default-swagger-ui-parameters }
FastAPI incluye algunos parámetros de configuración por defecto apropiados para la mayoría de los casos de uso.
diff --git a/docs/es/docs/how-to/custom-request-and-route.md b/docs/es/docs/how-to/custom-request-and-route.md
index 56013a5c7..5b4d8570f 100644
--- a/docs/es/docs/how-to/custom-request-and-route.md
+++ b/docs/es/docs/how-to/custom-request-and-route.md
@@ -18,8 +18,8 @@ Si apenas estás comenzando con **FastAPI**, quizás quieras saltar esta secció
Algunos casos de uso incluyen:
-* Convertir cuerpos de requests no-JSON a JSON (por ejemplo, [`msgpack`](https://msgpack.org/index.html)).
-* Descomprimir cuerpos de requests comprimidos con gzip.
+* Convertir request bodies no-JSON a JSON (por ejemplo, [`msgpack`](https://msgpack.org/index.html)).
+* Descomprimir request bodies comprimidos con gzip.
* Registrar automáticamente todos los request bodies.
## Manejo de codificaciones personalizadas de request body { #handling-custom-request-body-encodings }
@@ -32,7 +32,7 @@ Y una subclase de `APIRoute` para usar esa clase de request personalizada.
/// tip | Consejo
-Este es un ejemplo sencillo para demostrar cómo funciona. Si necesitas soporte para Gzip, puedes usar el [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware) proporcionado.
+Este es un ejemplo de juguete para demostrar cómo funciona, si necesitas soporte para Gzip, puedes usar el [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware) proporcionado.
///
@@ -60,11 +60,11 @@ Aquí lo usamos para crear un `GzipRequest` a partir del request original.
Un `Request` tiene un atributo `request.scope`, que es simplemente un `dict` de Python que contiene los metadatos relacionados con el request.
-Un `Request` también tiene un `request.receive`, que es una función para "recibir" el request body.
+Un `Request` también tiene un `request.receive`, que es una función para "recibir" el body del request.
El `dict` `scope` y la función `receive` son ambos parte de la especificación ASGI.
-Y esas dos cosas, `scope` y `receive`, son lo que se necesita para crear una nueva *Request instance*.
+Y esas dos cosas, `scope` y `receive`, son lo que se necesita para crear una nueva instance de `Request`.
Para aprender más sobre el `Request`, revisa [la documentación de Starlette sobre Requests](https://www.starlette.dev/requests/).
@@ -94,7 +94,7 @@ Todo lo que necesitamos hacer es manejar el request dentro de un bloque `try`/`e
{* ../../docs_src/custom_request_and_route/tutorial002_an_py310.py hl[14,16] *}
-Si ocurre una excepción, la `Request instance` aún estará en el alcance, así que podemos leer y hacer uso del request body cuando manejamos el error:
+Si ocurre una excepción, el instance de `Request` todavía estará en el alcance, así que podemos leer y hacer uso del request body cuando manejamos el error:
{* ../../docs_src/custom_request_and_route/tutorial002_an_py310.py hl[17:19] *}
diff --git a/docs/es/docs/how-to/extending-openapi.md b/docs/es/docs/how-to/extending-openapi.md
index d00455afd..b0fa23024 100644
--- a/docs/es/docs/how-to/extending-openapi.md
+++ b/docs/es/docs/how-to/extending-openapi.md
@@ -25,9 +25,17 @@ Y esa función `get_openapi()` recibe como parámetros:
* `openapi_version`: La versión de la especificación OpenAPI utilizada. Por defecto, la más reciente: `3.1.0`.
* `summary`: Un breve resumen de la API.
* `description`: La descripción de tu API, esta puede incluir markdown y se mostrará en la documentación.
-* `routes`: Una list de rutas, estas son cada una de las *path operations* registradas. Se toman de `app.routes`.
+* `routes`: Las rutas de la aplicación, tomadas de `app.routes`. FastAPI las usa para recolectar las *path operations* registradas, incluidas las de los routers incluidos.
-/// info | Información
+/// tip | Detalles técnicos
+
+`app.routes` es un árbol de rutas de nivel inferior. Puede incluir rutas candidatas que FastAPI usa internamente para routers incluidos, no solo objetos `APIRoute` finales.
+
+Aun así puedes pasar `app.routes` a `get_openapi()`. FastAPI recorrerá ese árbol de rutas para recolectar las path operations efectivas.
+
+///
+
+/// note | Nota
El parámetro `summary` está disponible en OpenAPI 3.1.0 y versiones superiores, soportado por FastAPI 0.99.0 y superiores.
diff --git a/docs/es/docs/how-to/graphql.md b/docs/es/docs/how-to/graphql.md
index 11c0cc23c..a58a11764 100644
--- a/docs/es/docs/how-to/graphql.md
+++ b/docs/es/docs/how-to/graphql.md
@@ -29,7 +29,7 @@ Aquí algunos de los paquetes de **GraphQL** que tienen soporte **ASGI**. Podrí
## GraphQL con Strawberry { #graphql-with-strawberry }
-Si necesitas o quieres trabajar con **GraphQL**, [**Strawberry**](https://strawberry.rocks/) es el paquete **recomendado** ya que tiene un diseño muy similar al diseño de **FastAPI**, todo basado en **anotaciones de tipos**.
+Si necesitas o quieres trabajar con **GraphQL**, [**Strawberry**](https://strawberry.rocks/) es el paquete **recomendado** ya que tiene el diseño más cercano al diseño de **FastAPI**, todo basado en **anotaciones de tipos**.
Dependiendo de tu caso de uso, podrías preferir usar un paquete diferente, pero si me preguntas, probablemente te sugeriría probar **Strawberry**.
diff --git a/docs/es/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/es/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
index 22d51674d..571554cad 100644
--- a/docs/es/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
+++ b/docs/es/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
@@ -8,6 +8,8 @@ FastAPI versión 0.119.0 introdujo compatibilidad parcial con Pydantic v1 desde
FastAPI 0.126.0 eliminó la compatibilidad con Pydantic v1, aunque siguió soportando `pydantic.v1` por un poquito más de tiempo.
+FastAPI 0.128.0 también eliminó la compatibilidad con `pydantic.v1`, así que las versiones más recientes de FastAPI requieren Pydantic v2.
+
/// warning | Advertencia
El equipo de Pydantic dejó de dar soporte a Pydantic v1 para las versiones más recientes de Python, comenzando con **Python 3.14**.
@@ -54,6 +56,16 @@ Esto significa que puedes instalar la versión más reciente de Pydantic v2 e im
### Compatibilidad de FastAPI con Pydantic v1 en v2 { #fastapi-support-for-pydantic-v1-in-v2 }
+/// warning | Advertencia
+
+Esta compatibilidad de FastAPI con modelos de `pydantic.v1` se añadió en **FastAPI 0.119.0** y se eliminó en **FastAPI 0.128.0**. Estaba pensada para ser una ayuda temporal para la migración a Pydantic v2.
+
+En las versiones actuales de FastAPI, usar un modelo de `pydantic.v1` en tu app generará un error.
+
+El resto de esta sección describe la compatibilidad temporal disponible solo en esas versiones antiguas.
+
+///
+
Desde FastAPI 0.119.0, también hay compatibilidad parcial para Pydantic v1 desde dentro de Pydantic v2, para facilitar la migración a v2.
Así que podrías actualizar Pydantic a la última versión 2 y cambiar los imports para usar el submódulo `pydantic.v1`, y en muchos casos simplemente funcionaría.
@@ -122,6 +134,12 @@ Si necesitas usar algunas de las herramientas específicas de FastAPI para pará
### Migra por pasos { #migrate-in-steps }
+/// warning | Advertencia
+
+La migración gradual usando tanto modelos de Pydantic v1 como de v2 en la misma app descrita abajo solo funciona en **FastAPI 0.119.0 a 0.127.x**. Se eliminó en **FastAPI 0.128.0**, las versiones más recientes requieren modelos de **Pydantic v2**.
+
+///
+
/// tip | Consejo
Primero prueba con `bump-pydantic`, si tus tests pasan y eso funciona, entonces terminaste con un solo comando. ✨
diff --git a/docs/es/docs/how-to/separate-openapi-schemas.md b/docs/es/docs/how-to/separate-openapi-schemas.md
index db9b46ddb..14990a79a 100644
--- a/docs/es/docs/how-to/separate-openapi-schemas.md
+++ b/docs/es/docs/how-to/separate-openapi-schemas.md
@@ -77,7 +77,7 @@ Pero para `Item-Output`, `description` **es requerido**, tiene un asterisco rojo
Con esta funcionalidad de **Pydantic v2**, la documentación de tu API es más **precisa**, y si tienes clientes y SDKs autogenerados, también serán más precisos, con una mejor **experiencia para desarrolladores** y consistencia. 🎉
-## No Separar Esquemas { #do-not-separate-schemas }
+## No separes esquemas { #do-not-separate-schemas }
Ahora, hay algunos casos donde podrías querer tener el **mismo esquema para entrada y salida**.
@@ -85,7 +85,7 @@ Probablemente el caso principal para esto es si ya tienes algún código cliente
En ese caso, puedes desactivar esta funcionalidad en **FastAPI**, con el parámetro `separate_input_output_schemas=False`.
-/// info | Información
+/// note | Nota
El soporte para `separate_input_output_schemas` fue agregado en FastAPI `0.102.0`. 🤓
diff --git a/docs/es/docs/index.md b/docs/es/docs/index.md
index 1217c4c6f..7a9caec51 100644
--- a/docs/es/docs/index.md
+++ b/docs/es/docs/index.md
@@ -45,7 +45,7 @@ Las funcionalidades clave son:
* **Rápido**: Muy alto rendimiento, a la par con **NodeJS** y **Go** (gracias a Starlette y Pydantic). [Uno de los frameworks Python más rápidos disponibles](#performance).
* **Rápido de programar**: Aumenta la velocidad para desarrollar funcionalidades en aproximadamente un 200% a 300%. *
* **Menos bugs**: Reduce en aproximadamente un 40% los errores inducidos por humanos (desarrolladores). *
-* **Intuitivo**: Gran soporte para editores. Autocompletado en todas partes. Menos tiempo depurando.
+* **Intuitivo**: Gran soporte para editores. Autocompletado en todas partes. Menos tiempo depurando.
* **Fácil**: Diseñado para ser fácil de usar y aprender. Menos tiempo leyendo documentación.
* **Corto**: Minimiza la duplicación de código. Múltiples funcionalidades desde cada declaración de parámetro. Menos bugs.
* **Robusto**: Obtén código listo para producción. Con documentación interactiva automática.
@@ -479,7 +479,7 @@ Para un ejemplo más completo incluyendo más funcionalidades, ve al Inyección de Dependencias** muy poderoso y fácil de usar.
+* Un sistema de **Inyección de Dependencias** muy poderoso y fácil de usar.
* Seguridad y autenticación, incluyendo soporte para **OAuth2** con **tokens JWT** y autenticación **HTTP Basic**.
* Técnicas más avanzadas (pero igualmente fáciles) para declarar **modelos JSON profundamente anidados** (gracias a Pydantic).
* Integración con **GraphQL** usando [Strawberry](https://strawberry.rocks) y otros paquetes.
@@ -492,9 +492,7 @@ Para un ejemplo más completo incluyendo más funcionalidades, ve al
@@ -510,6 +508,8 @@ Deploying to FastAPI Cloud...
+La CLI detectará automáticamente tu aplicación de FastAPI y la desplegará en la nube. Si no has iniciado sesión, se abrirá tu navegador para completar el proceso de autenticación.
+
¡Eso es todo! Ahora puedes acceder a tu app en esa URL. ✨
#### Acerca de FastAPI Cloud { #about-fastapi-cloud }
diff --git a/docs/es/docs/project-generation.md b/docs/es/docs/project-generation.md
index 11a560eba..fd0fd7017 100644
--- a/docs/es/docs/project-generation.md
+++ b/docs/es/docs/project-generation.md
@@ -9,18 +9,18 @@ Repositorio de GitHub: [Plantilla Full Stack FastAPI](https://github.com/tiangol
## Plantilla Full Stack FastAPI - Stack de tecnología y funcionalidades { #full-stack-fastapi-template-technology-stack-and-features }
- ⚡ [**FastAPI**](https://fastapi.tiangolo.com/es) para la API del backend en Python.
- - 🧰 [SQLModel](https://sqlmodel.tiangolo.com) para las interacciones con bases de datos SQL en Python (ORM).
- - 🔍 [Pydantic](https://docs.pydantic.dev), utilizado por FastAPI, para la validación de datos y gestión de configuraciones.
- - 💾 [PostgreSQL](https://www.postgresql.org) como base de datos SQL.
+ - 🧰 [SQLModel](https://sqlmodel.tiangolo.com) para las interacciones con bases de datos SQL en Python (ORM).
+ - 🔍 [Pydantic](https://docs.pydantic.dev), utilizado por FastAPI, para la validación de datos y gestión de configuraciones.
+ - 💾 [PostgreSQL](https://www.postgresql.org) como base de datos SQL.
- 🚀 [React](https://react.dev) para el frontend.
- - 💃 Usando TypeScript, hooks, Vite, y otras partes de una stack moderna de frontend.
- - 🎨 [Tailwind CSS](https://tailwindcss.com) y [shadcn/ui](https://ui.shadcn.com) para los componentes del frontend.
- - 🤖 Un cliente de frontend generado automáticamente.
- - 🧪 [Playwright](https://playwright.dev) para escribir pruebas End-to-End.
- - 🦇 Soporte para modo oscuro.
+ - 💃 Usando TypeScript, hooks, Vite, y otras partes de una stack moderna de frontend.
+ - 🎨 [Tailwind CSS](https://tailwindcss.com) y [shadcn/ui](https://ui.shadcn.com) para los componentes del frontend.
+ - 🤖 Un cliente de frontend generado automáticamente.
+ - 🧪 [Playwright](https://playwright.dev) para escribir pruebas End-to-End.
+ - 🦇 Soporte para modo oscuro.
- 🐋 [Docker Compose](https://www.docker.com) para desarrollo y producción.
- 🔒 Hashing seguro de contraseñas por defecto.
-- 🔑 Autenticación con tokens JWT.
+- 🔑 Autenticación con JWT (JSON Web Token).
- 📫 Recuperación de contraseñas basada en email.
- ✅ Pruebas con [Pytest](https://pytest.org).
- 📞 [Traefik](https://traefik.io) como proxy inverso / load balancer.
diff --git a/docs/es/docs/python-types.md b/docs/es/docs/python-types.md
index 878c8be03..6a13b97eb 100644
--- a/docs/es/docs/python-types.md
+++ b/docs/es/docs/python-types.md
@@ -1,8 +1,8 @@
# Introducción a Tipos en Python { #python-types-intro }
-Python tiene soporte para "anotaciones de tipos" opcionales (también llamadas "type hints").
+Python tiene soporte para "anotaciones de tipos" opcionales (también llamadas "anotaciones de tipos").
-Estas **"anotaciones de tipos"** o type hints son una sintaxis especial que permite declarar el tipo de una variable.
+Estas **"anotaciones de tipos"** o anotaciones son una sintaxis especial que permite declarar el tipo de una variable.
Al declarar tipos para tus variables, los editores y herramientas te pueden proporcionar un mejor soporte.
@@ -44,7 +44,7 @@ Es un programa muy simple.
Pero ahora imagina que lo escribieras desde cero.
-En algún momento habrías empezado la definición de la función, tenías los parámetros listos...
+En algún momento empiezas a definir la función, y tienes los parámetros listos...
Pero luego tienes que llamar "ese método que convierte la primera letra a mayúscula".
@@ -58,7 +58,7 @@ Pero, tristemente, no obtienes nada útil:
-### Añadir tipos { #add-types }
+### Añade tipos { #add-types }
Modifiquemos una sola línea de la versión anterior.
@@ -120,7 +120,7 @@ Ahora sabes que debes corregirlo, convertir `age` a un string con `str(age)`:
Acabas de ver el lugar principal para declarar anotaciones de tipos. Como parámetros de función.
-Este también es el lugar principal donde los utilizarías con **FastAPI**.
+Este también es el lugar principal donde las utilizarías con **FastAPI**.
### Tipos simples { #simple-types }
@@ -137,7 +137,7 @@ Puedes usar, por ejemplo:
### Módulo `typing` { #typing-module }
-Para algunos casos adicionales, podrías necesitar importar algunas cosas del módulo `typing` de la standard library, por ejemplo cuando quieres declarar que algo tiene "cualquier tipo", puedes usar `Any` de `typing`:
+Para algunos casos adicionales, podrías necesitar importar algunas cosas del módulo `typing` del paquete estándar, por ejemplo cuando quieres declarar que algo tiene "cualquier tipo", puedes usar `Any` de `typing`:
```python
from typing import Any
@@ -149,7 +149,7 @@ def some_function(data: Any):
### Tipos genéricos { #generic-types }
-Algunos tipos pueden tomar "parámetros de tipo" entre corchetes, para definir sus tipos internos, por ejemplo una "lista de strings" se declararía `list[str]`.
+Algunos tipos pueden tomar "parámetros de tipo" entre corchetes, para definir sus tipos internos, por ejemplo una "list de strings" se declararía `list[str]`.
Estos tipos que pueden tomar parámetros de tipo se llaman **Tipos Genéricos** o **Genéricos**.
@@ -160,7 +160,7 @@ Puedes usar los mismos tipos integrados como genéricos (con corchetes y tipos d
* `set`
* `dict`
-#### Lista { #list }
+#### List { #list }
Por ejemplo, vamos a definir una variable para ser una `list` de `str`.
@@ -168,7 +168,7 @@ Declara la variable, con la misma sintaxis de dos puntos (`:`).
Como tipo, pon `list`.
-Como la lista es un tipo que contiene algunos tipos internos, los pones entre corchetes:
+Como la `list` es un tipo que contiene algunos tipos internos, los pones entre corchetes:
{* ../../docs_src/python_types/tutorial006_py310.py hl[1] *}
@@ -180,15 +180,15 @@ En este caso, `str` es el parámetro de tipo pasado a `list`.
///
-Eso significa: "la variable `items` es una `list`, y cada uno de los ítems en esta lista es un `str`".
+Eso significa: "la variable `items` es una `list`, y cada uno de los ítems en esta `list` es un `str`".
-Al hacer eso, tu editor puede proporcionar soporte incluso mientras procesa elementos de la lista:
+Al hacer eso, tu editor puede proporcionar soporte incluso mientras procesa elementos de la `list`:
Sin tipos, eso es casi imposible de lograr.
-Nota que la variable `item` es uno de los elementos en la lista `items`.
+Nota que la variable `item` es uno de los elementos en la `list` `items`.
Y aún así, el editor sabe que es un `str` y proporciona soporte para eso.
diff --git a/docs/es/docs/tutorial/bigger-applications.md b/docs/es/docs/tutorial/bigger-applications.md
index 583cc380e..31688d8ab 100644
--- a/docs/es/docs/tutorial/bigger-applications.md
+++ b/docs/es/docs/tutorial/bigger-applications.md
@@ -17,16 +17,16 @@ Digamos que tienes una estructura de archivos como esta:
```
.
├── app
-│ ├── __init__.py
-│ ├── main.py
-│ ├── dependencies.py
-│ └── routers
-│ │ ├── __init__.py
-│ │ ├── items.py
-│ │ └── users.py
-│ └── internal
-│ ├── __init__.py
-│ └── admin.py
+│ ├── __init__.py
+│ ├── main.py
+│ ├── dependencies.py
+│ └── routers
+│ │ ├── __init__.py
+│ │ ├── items.py
+│ │ └── users.py
+│ └── internal
+│ ├── __init__.py
+│ └── admin.py
```
/// tip | Consejo
@@ -181,12 +181,12 @@ El resultado final es que los paths de item son ahora:
...como pretendíamos.
* Serán marcados con una lista de tags que contiene un solo string `"items"`.
- * Estos "tags" son especialmente útiles para los sistemas de documentación interactiva automática (usando OpenAPI).
+ * Estos "tags" son especialmente útiles para los sistemas de documentación interactiva automática (usando OpenAPI).
* Todos incluirán las `responses` predefinidas.
* Todas estas *path operations* tendrán la lista de `dependencies` evaluadas/ejecutadas antes de ellas.
- * Si también declaras dependencias en una *path operation* específica, **también se ejecutarán**.
- * Las dependencias del router se ejecutan primero, luego las [`dependencies` en el decorador](dependencies/dependencies-in-path-operation-decorators.md), y luego las dependencias de parámetros normales.
- * También puedes agregar [dependencias de `Security` con `scopes`](../advanced/security/oauth2-scopes.md).
+ * Si también declaras dependencias en una *path operation* específica, **también se ejecutarán**.
+ * Las dependencias del router se ejecutan primero, luego las [`dependencies` en el decorador](dependencies/dependencies-in-path-operation-decorators.md), y luego las dependencias de parámetros normales.
+ * También puedes agregar [dependencias de `Security` con `scopes`](../advanced/security/oauth2-scopes.md).
/// tip | Consejo
@@ -396,9 +396,9 @@ Incluirá todas las rutas de ese router como parte de ella.
/// note | Detalles Técnicos
-En realidad creará internamente una *path operation* para cada *path operation* que fue declarada en el `APIRouter`.
+FastAPI mantiene activo el `APIRouter` original y sus `APIRoute`s cuando el router se incluye en la aplicación principal.
-Así, detrás de escena, funcionará como si todo fuera la misma única app.
+Eso significa que las subclases personalizadas de `APIRouter` y `APIRoute` aún pueden participar después de incluir el router.
///
@@ -406,7 +406,7 @@ Así, detrás de escena, funcionará como si todo fuera la misma única app.
No tienes que preocuparte por el rendimiento al incluir routers.
-Esto tomará microsegundos y solo sucederá al inicio.
+Esto está diseñado para ser liviano y evitar añadir sobrecarga a cada request.
Así que no afectará el rendimiento. ⚡
@@ -461,7 +461,7 @@ Los `APIRouter`s no están "montados", no están aislados del resto de la aplica
Esto se debe a que queremos incluir sus *path operations* en el esquema de OpenAPI y las interfaces de usuario.
-Como no podemos simplemente aislarlos y "montarlos" independientemente del resto, las *path operations* se "clonan" (se vuelven a crear), no se incluyen directamente.
+FastAPI mantiene los routers y path operations originales activos, y combina los prefijos del router, dependencias, tags, responses y otros metadatos al manejar requests y generar OpenAPI.
///
@@ -532,4 +532,16 @@ De la misma manera que puedes incluir un `APIRouter` en una aplicación `FastAPI
router.include_router(other_router)
```
-Asegúrate de hacerlo antes de incluir `router` en la app de `FastAPI`, para que las *path operations* de `other_router` también se incluyan.
+Puedes hacerlo antes o después de incluir `router` en la app de `FastAPI`. FastAPI seguirá incluyendo las *path operations* de `other_router` en el ruteo y en OpenAPI.
+
+Lo mismo aplica a las *path operations* añadidas después a los routers. También serán visibles a través de la inclusión anterior.
+
+/// warning | Detalles Técnicos
+
+Evita mutar directamente `router.routes` después de incluir un router. FastAPI trata la inclusión de routers como “en vivo”, así que el router original y sus rutas siguen formando parte del ruteo y de la generación de OpenAPI.
+
+Usa APIs documentadas como los decoradores de *path operations* y `.include_router()` para agregar rutas y routers.
+
+Trata `router.routes` como un árbol de rutas de nivel bajo que puede contener definiciones de rutas y routers incluidos, y evita depender de él como una lista plana de *path operations* finales.
+
+///
diff --git a/docs/es/docs/tutorial/body-multiple-params.md b/docs/es/docs/tutorial/body-multiple-params.md
index c78dd2881..e1b0d4b1c 100644
--- a/docs/es/docs/tutorial/body-multiple-params.md
+++ b/docs/es/docs/tutorial/body-multiple-params.md
@@ -108,7 +108,7 @@ Por ejemplo:
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info | Información
+/// note | Nota
`Body` también tiene todos los mismos parámetros de validación y metadatos extras que `Query`, `Path` y otros que verás luego.
@@ -123,7 +123,7 @@ Por defecto, **FastAPI** esperará su cuerpo directamente.
Pero si deseas que espere un JSON con una clave `item` y dentro de ella los contenidos del modelo, como lo hace cuando declaras parámetros de cuerpo extra, puedes usar el parámetro especial `Body` `embed`:
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
como en:
diff --git a/docs/es/docs/tutorial/body-nested-models.md b/docs/es/docs/tutorial/body-nested-models.md
index 742f78d42..3ca586014 100644
--- a/docs/es/docs/tutorial/body-nested-models.md
+++ b/docs/es/docs/tutorial/body-nested-models.md
@@ -23,7 +23,7 @@ pasa el/los tipo(s) interno(s) como "parámetros de tipo" usando corchetes: `[`
my_list: list[str]
```
-Eso es toda la sintaxis estándar de Python para declaraciones de tipo.
+Esa es toda la sintaxis estándar de Python para declaraciones de tipo.
Usa esa misma sintaxis estándar para atributos de modelos con tipos internos.
@@ -136,7 +136,7 @@ Esto esperará (convertirá, validará, documentará, etc.) un cuerpo JSON como:
}
```
-/// info | Información
+/// note | Nota
Nota cómo la clave `images` ahora tiene una lista de objetos de imagen.
@@ -148,7 +148,7 @@ Puedes definir modelos anidados tan profundamente como desees:
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info | Información
+/// note | Nota
Observa cómo `Offer` tiene una lista de `Item`s, que a su vez tienen una lista opcional de `Image`s
diff --git a/docs/es/docs/tutorial/body.md b/docs/es/docs/tutorial/body.md
index 7c3b8e9d9..a71b81a40 100644
--- a/docs/es/docs/tutorial/body.md
+++ b/docs/es/docs/tutorial/body.md
@@ -1,5 +1,6 @@
# Request Body { #request-body }
+
Cuando necesitas enviar datos desde un cliente (digamos, un navegador) a tu API, los envías como un **request body**.
Un **request** body es un dato enviado por el cliente a tu API. Un **response** body es el dato que tu API envía al cliente.
@@ -8,7 +9,7 @@ Tu API casi siempre tiene que enviar un **response** body. Pero los clientes no
Para declarar un **request** body, usas modelos de [Pydantic](https://docs.pydantic.dev/) con todo su poder y beneficios.
-/// info | Información
+/// note | Nota
Para enviar datos, deberías usar uno de estos métodos: `POST` (el más común), `PUT`, `DELETE` o `PATCH`.
diff --git a/docs/es/docs/tutorial/cookie-param-models.md b/docs/es/docs/tutorial/cookie-param-models.md
index 4e6038a46..3fbf0bcb5 100644
--- a/docs/es/docs/tutorial/cookie-param-models.md
+++ b/docs/es/docs/tutorial/cookie-param-models.md
@@ -32,7 +32,7 @@ Puedes ver las cookies definidas en la UI de la documentación en `/docs`:
-/// info | Información
+/// note | Nota
Ten en cuenta que, como los **navegadores manejan las cookies** de maneras especiales y detrás de escenas, **no** permiten fácilmente que **JavaScript** las toque.
diff --git a/docs/es/docs/tutorial/cookie-params.md b/docs/es/docs/tutorial/cookie-params.md
index 598872c0a..eecd61907 100644
--- a/docs/es/docs/tutorial/cookie-params.md
+++ b/docs/es/docs/tutorial/cookie-params.md
@@ -24,13 +24,13 @@ Pero recuerda que cuando importas `Query`, `Path`, `Cookie` y otros desde `fasta
///
-/// info | Información
+/// note | Nota
Para declarar cookies, necesitas usar `Cookie`, porque de lo contrario los parámetros serían interpretados como parámetros de query.
///
-/// info | Información
+/// note | Nota
Ten en cuenta que, como **los navegadores manejan las cookies** de formas especiales y por detrás, **no** permiten fácilmente que **JavaScript** las toque.
diff --git a/docs/es/docs/tutorial/debugging.md b/docs/es/docs/tutorial/debugging.md
index b5d0704e0..95e19c149 100644
--- a/docs/es/docs/tutorial/debugging.md
+++ b/docs/es/docs/tutorial/debugging.md
@@ -1,5 +1,6 @@
# Depuración { #debugging }
+
Puedes conectar el depurador en tu editor, por ejemplo con Visual Studio Code o PyCharm.
## Llama a `uvicorn` { #call-uvicorn }
@@ -62,7 +63,7 @@ from myapp import app
# Algún código adicional
```
-en ese caso, la variable creada automáticamente dentro de `myapp.py` no tendrá la variable `__name__` con un valor de `"__main__"`.
+en ese caso, la variable creada automáticamente `__name__` dentro de `myapp.py` no tendrá el valor `"__main__"`.
Así que, la línea:
@@ -72,7 +73,7 @@ Así que, la línea:
no se ejecutará.
-/// info | Información
+/// note | Nota
Para más información, revisa [la documentación oficial de Python](https://docs.python.org/3/library/__main__.html).
@@ -88,7 +89,7 @@ Por ejemplo, en Visual Studio Code, puedes:
* Ir al panel de "Debug".
* "Add configuration...".
-* Seleccionar "Python".
+* Seleccionar "Python"
* Ejecutar el depurador con la opción "`Python: Current File (Integrated Terminal)`".
Luego, iniciará el servidor con tu código **FastAPI**, deteniéndose en tus puntos de interrupción, etc.
diff --git a/docs/es/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/es/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
index 72e4e973e..3c5796b8b 100644
--- a/docs/es/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
+++ b/docs/es/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md
@@ -28,7 +28,7 @@ También puede ayudar a evitar confusiones para nuevos desarrolladores que vean
///
-/// info | Información
+/// note | Nota
En este ejemplo usamos headers personalizados inventados `X-Key` y `X-Token`.
diff --git a/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md
index 084d72aa4..aab8eca7b 100644
--- a/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md
+++ b/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -170,7 +170,7 @@ participant tasks as Background tasks
end
```
-/// info | Información
+/// note | Nota
Solo **un response** será enviado al cliente. Podría ser uno de los responses de error o será el response de la *path operation*.
@@ -234,6 +234,7 @@ participant operation as Path Operation
Las dependencias con `yield` han evolucionado con el tiempo para cubrir diferentes casos de uso y corregir algunos problemas.
Si quieres ver qué ha cambiado en diferentes versiones de FastAPI, puedes leer más al respecto en la guía avanzada, en [Dependencias avanzadas - Dependencias con `yield`, `HTTPException`, `except` y Tareas en Background](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks).
+
## Context Managers { #context-managers }
### Qué son los "Context Managers" { #what-are-context-managers }
diff --git a/docs/es/docs/tutorial/dependencies/index.md b/docs/es/docs/tutorial/dependencies/index.md
index ed5783f39..f725f4061 100644
--- a/docs/es/docs/tutorial/dependencies/index.md
+++ b/docs/es/docs/tutorial/dependencies/index.md
@@ -1,6 +1,6 @@
# Dependencias { #dependencies }
-**FastAPI** tiene un sistema de **Inyección de Dependencias** muy poderoso pero intuitivo.
+**FastAPI** tiene un sistema de **Inyección de Dependencias** muy poderoso pero intuitivo.
Está diseñado para ser muy simple de usar, y para hacer que cualquier desarrollador integre otros componentes con **FastAPI** de forma muy sencilla.
@@ -51,7 +51,7 @@ En este caso, esta dependencia espera:
Y luego solo devuelve un `dict` que contiene esos valores.
-/// info | Información
+/// note | Nota
FastAPI agregó soporte para `Annotated` (y comenzó a recomendarlo) en la versión 0.95.0.
@@ -106,7 +106,7 @@ common_parameters --> read_users
De esta manera escribes código compartido una vez y **FastAPI** se encarga de llamarlo para tus *path operations*.
-/// check | Revisa
+/// tip | Consejo
Nota que no tienes que crear una clase especial y pasarla en algún lugar a **FastAPI** para "registrarla" o algo similar.
diff --git a/docs/es/docs/tutorial/dependencies/sub-dependencies.md b/docs/es/docs/tutorial/dependencies/sub-dependencies.md
index 95f3fe817..2432707f7 100644
--- a/docs/es/docs/tutorial/dependencies/sub-dependencies.md
+++ b/docs/es/docs/tutorial/dependencies/sub-dependencies.md
@@ -35,7 +35,7 @@ Entonces podemos usar la dependencia con:
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
-/// info | Información
+/// note | Nota
Fíjate que solo estamos declarando una dependencia en la *path operation function*, `query_or_cookie_extractor`.
diff --git a/docs/es/docs/tutorial/extra-data-types.md b/docs/es/docs/tutorial/extra-data-types.md
index b92d0fcd4..bd5fdc073 100644
--- a/docs/es/docs/tutorial/extra-data-types.md
+++ b/docs/es/docs/tutorial/extra-data-types.md
@@ -1,5 +1,6 @@
# Tipos de Datos Extra { #extra-data-types }
+
Hasta ahora, has estado usando tipos de datos comunes, como:
* `int`
diff --git a/docs/es/docs/tutorial/extra-models.md b/docs/es/docs/tutorial/extra-models.md
index 4a3b75b5b..903a13c70 100644
--- a/docs/es/docs/tutorial/extra-models.md
+++ b/docs/es/docs/tutorial/extra-models.md
@@ -208,4 +208,4 @@ En este caso, puedes usar `dict`:
Usa múltiples modelos Pydantic y hereda libremente para cada caso.
-No necesitas tener un solo modelo de datos por entidad si esa entidad debe poder tener diferentes "estados". Como el caso con la "entidad" usuario con un estado que incluye `password`, `password_hash` y sin contraseña.
+No necesitas tener un solo modelo de datos por entidad si esa entidad debe poder tener diferentes "estados". La "entidad" **usuario** es un ejemplo, con estados que incluyen `password`, `password_hash` o ninguna contraseña.
diff --git a/docs/es/docs/tutorial/first-steps.md b/docs/es/docs/tutorial/first-steps.md
index 1fcfdc140..61e5f4099 100644
--- a/docs/es/docs/tutorial/first-steps.md
+++ b/docs/es/docs/tutorial/first-steps.md
@@ -90,13 +90,13 @@ Verás la documentación alternativa automática (proporcionada por [ReDoc](http
Un "esquema" es una definición o descripción de algo. No el código que lo implementa, sino solo una descripción abstracta.
-#### Esquema de la API { #api-schema }
+#### "Esquema" de la API { #api-schema }
En este caso, [OpenAPI](https://github.com/OAI/OpenAPI-Specification) es una especificación que dicta cómo definir un esquema de tu API.
Esta definición de esquema incluye los paths de tu API, los posibles parámetros que toman, etc.
-#### Esquema de Datos { #data-schema }
+#### "Esquema" de datos { #data-schema }
El término "esquema" también podría referirse a la forma de algunos datos, como el contenido JSON.
@@ -180,7 +180,7 @@ lo cual sería equivalente a:
from backend.main import app
```
-### `fastapi dev` con path { #fastapi-dev-with-path }
+### `fastapi dev` con path o con la opción de CLI `--entrypoint` { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
También puedes pasar el path del archivo al comando `fastapi dev`, y adivinará el objeto app de FastAPI que debe usar:
@@ -188,29 +188,19 @@ También puedes pasar el path del archivo al comando `fastapi dev`, y adivinará
$ fastapi dev main.py
```
-Pero tendrías que recordar pasar el path correcto cada vez que llames al comando `fastapi`.
-
-Además, otras herramientas podrían no ser capaces de encontrarlo, por ejemplo la [Extensión de VS Code](../editor-support.md) o [FastAPI Cloud](https://fastapicloud.com), así que se recomienda usar el `entrypoint` en `pyproject.toml`.
-
-### Despliega tu app (opcional) { #deploy-your-app-optional }
-
-Opcionalmente puedes desplegar tu app de FastAPI en [FastAPI Cloud](https://fastapicloud.com), ve y únete a la lista de espera si aún no lo has hecho. 🚀
-
-Si ya tienes una cuenta de **FastAPI Cloud** (te invitamos desde la lista de espera 😉), puedes desplegar tu aplicación con un solo comando.
-
-Antes de desplegar, asegúrate de haber iniciado sesión:
-
-get operación
-/// info | Información sobre `@decorator`
+/// note | Información sobre `@decorator`
Esa sintaxis `@algo` en Python se llama un "decorador".
diff --git a/docs/es/docs/tutorial/frontend.md b/docs/es/docs/tutorial/frontend.md
new file mode 100644
index 000000000..707772467
--- /dev/null
+++ b/docs/es/docs/tutorial/frontend.md
@@ -0,0 +1,133 @@
+# Frontend { #frontend }
+
+Puedes servir apps frontend estáticas con `app.frontend()` (o `router.frontend()`).
+
+Esto es útil para herramientas de frontend que generan archivos estáticos, como React con Vite, TanStack Router, Astro, Vue, Svelte, Angular, Solid y otras.
+
+Con estas herramientas, normalmente tienes un paso que construye el frontend, con un comando como:
+
+```bash
+npm run build
+```
+
+Eso generaría un directorio como `./dist/` con tus archivos frontend.
+
+Puedes usar `app.frontend()` para servir ese directorio siguiendo las convenciones que necesitan estos frameworks frontend.
+
+**FastAPI** revisa primero las *path operations*. Los archivos frontend se revisan solo si ninguna ruta normal coincide, así que tu API no se verá afectada.
+
+## Sirve un Frontend { #serve-a-frontend }
+
+Después de construir tu frontend, por ejemplo con `npm run build`, pon los archivos generados en un directorio, por ejemplo, `dist`.
+
+La estructura de tu proyecto podría verse así:
+
+```text
+.
+├── pyproject.toml
+├── app
+│ ├── __init__.py
+│ └── main.py
+└── dist
+ ├── index.html
+ └── assets
+ └── app.js
+```
+
+Luego sírvelo con `app.frontend()`:
+
+{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
+
+Con esto, un request a `/assets/app.js` puede servir `dist/assets/app.js`.
+
+Si también tienes una *path operation* de **FastAPI**, la *path operation* gana.
+
+## Routing del lado del cliente { #client-side-routing }
+
+Muchas apps frontend, incluidas las **single-page apps** (SPAs), usan routing del lado del cliente. Un path como `/dashboard/settings` podría no ser un archivo real, pero el framework se encargaría de manejarlo.
+
+Entonces, si se accede a esa URL directamente (en lugar de navegar por la app), el backend debería servir la app frontend desde `index.html`, para que el framework frontend pueda manejar el routing del lado del cliente.
+
+Para eso, usa `fallback="index.html"`:
+
+{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *}
+
+**FastAPI** usa este fallback solo para requests `GET` y `HEAD` que parecen navegación del navegador. Los archivos faltantes como JavaScript, CSS e imágenes siguen devolviendo `404`.
+
+Los requests con otros métodos, como `POST` o `PUT`, a paths que solo coinciden con el fallback del frontend también devuelven `404`. Las *path operations* normales de **FastAPI** siguen teniendo mayor prioridad que las rutas frontend.
+
+/// tip | Consejo
+
+Por defecto, `fallback` tiene un valor de `fallback="auto"`. En la mayoría de los casos no necesitarás especificar `fallback`. Lee más abajo para los detalles.
+
+///
+
+Esto es lo que querrías con muchas apps frontend que usan routing del lado del cliente, por ejemplo, React con TanStack Router, Vue, Angular, SvelteKit o Solid.
+
+## Página 404 personalizada { #custom-404-page }
+
+También puedes servir una página estática `404.html` para paths frontend faltantes:
+
+{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *}
+
+Esa response mantiene un código de estado `404`.
+
+En este caso, **FastAPI** no servirá `index.html` para paths frontend faltantes. En su lugar, devolverá el archivo `404.html`.
+
+/// tip | Consejo
+
+Por defecto, `fallback` tiene un valor de `fallback="auto"`. Con esto, si se encuentra un archivo `404.html`, se usará automáticamente como fallback.
+
+Así que normalmente puedes omitir el argumento `fallback`.
+
+///
+
+Esto es útil con herramientas de frontend que generan archivos HTML estáticos para cada página, como Astro.
+
+## Fallback automático { #fallback-auto }
+
+Por defecto, `app.frontend()` usa `fallback="auto"`.
+
+Si hay un archivo `404.html` en el directorio frontend, los paths frontend faltantes sirven ese archivo con código de estado `404`.
+
+De lo contrario, si hay un archivo `index.html`, los paths faltantes de navegación del navegador sirven `index.html`, que es lo que muchas apps frontend con routing del lado del cliente esperan.
+
+Así que, en la mayoría de los casos, puedes usar `app.frontend("/", directory="dist")` sin especificar el argumento `fallback`.
+
+{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
+
+## Desactiva el fallback { #disable-fallback }
+
+Si no quieres servir un archivo fallback para paths frontend faltantes, usa `fallback=None`:
+
+{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *}
+
+Entonces los paths frontend faltantes devuelven el `404` normal.
+
+## Revisa el directorio { #check-directory }
+
+Por defecto, `app.frontend()` revisa que el directorio exista cuando se crea la app.
+
+Esto ayuda a detectar errores de configuración temprano. Por ejemplo, si falta el directorio de salida del build del frontend, **FastAPI** lanzará un error al iniciar.
+
+Si tus archivos frontend se crean más tarde, por ejemplo mediante un paso de build separado después de crear el objeto app, configura `check_dir=False`:
+
+{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *}
+
+Con `check_dir=False`, **FastAPI** no revisará el directorio cuando se cree la app. Si el directorio configurado todavía falta cuando se maneja un request, **FastAPI** lanzará un error en ese momento.
+
+## Úsalo con `APIRouter` { #use-it-with-apirouter }
+
+También puedes agregar archivos frontend a un `APIRouter` e incluirlo con un prefijo:
+
+{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *}
+
+En este ejemplo, los paths frontend se sirven bajo `/app`.
+
+Cualquier *path operation* regular en la app seguirá teniendo prioridad, incluso en otros routers.
+
+## Solo salida estática del build { #static-build-output-only }
+
+`app.frontend()` sirve archivos ya generados por tu build del frontend.
+
+No ejecuta renderizado del lado del servidor. Es para frameworks frontend que generan archivos estáticos, no para frameworks que necesitan renderizado dinámico en el servidor para cada request.
diff --git a/docs/es/docs/tutorial/handling-errors.md b/docs/es/docs/tutorial/handling-errors.md
index 737c43e41..f64064231 100644
--- a/docs/es/docs/tutorial/handling-errors.md
+++ b/docs/es/docs/tutorial/handling-errors.md
@@ -101,7 +101,7 @@ Así que recibirás un error limpio, con un código de estado HTTP de `418` y un
{"message": "Oops! yolo did something. There goes a rainbow..."}
```
-/// note | Nota Técnica
+/// note | Detalles Técnicos
También podrías usar `from starlette.requests import Request` y `from starlette.responses import JSONResponse`.
@@ -109,11 +109,11 @@ También podrías usar `from starlette.requests import Request` y `from starlett
///
-## Sobrescribir los manejadores de excepciones predeterminados { #override-the-default-exception-handlers }
+## Sobrescribir los manejadores de excepciones por defecto { #override-the-default-exception-handlers }
-**FastAPI** tiene algunos manejadores de excepciones predeterminados.
+**FastAPI** tiene algunos manejadores de excepciones por defecto.
-Estos manejadores se encargan de devolver los responses JSON predeterminadas cuando lanzas un `HTTPException` y cuando el request tiene datos inválidos.
+Estos manejadores se encargan de devolver los responses JSON por defecto cuando lanzas un `HTTPException` y cuando el request tiene datos inválidos.
Puedes sobrescribir estos manejadores de excepciones con los tuyos propios.
@@ -121,7 +121,7 @@ Puedes sobrescribir estos manejadores de excepciones con los tuyos propios.
Cuando un request contiene datos inválidos, **FastAPI** lanza internamente un `RequestValidationError`.
-Y también incluye un manejador de excepciones predeterminado para ello.
+Y también incluye un manejador de excepciones por defecto para ello.
Para sobrescribirlo, importa el `RequestValidationError` y úsalo con `@app.exception_handler(RequestValidationError)` para decorar el manejador de excepciones.
@@ -161,7 +161,7 @@ Por ejemplo, podrías querer devolver un response de texto plano en lugar de JSO
{* ../../docs_src/handling_errors/tutorial004_py310.py hl[3:4,9:11,25] *}
-/// note | Nota Técnica
+/// note | Detalles Técnicos
También podrías usar `from starlette.responses import PlainTextResponse`.
@@ -237,8 +237,8 @@ from starlette.exceptions import HTTPException as StarletteHTTPException
### Reutilizar los manejadores de excepciones de **FastAPI** { #reuse-fastapis-exception-handlers }
-Si quieres usar la excepción junto con los mismos manejadores de excepciones predeterminados de **FastAPI**, puedes importar y reutilizar los manejadores de excepciones predeterminados de `fastapi.exception_handlers`:
+Si quieres usar la excepción junto con los mismos manejadores de excepciones por defecto de **FastAPI**, puedes importar y reutilizar los manejadores de excepciones por defecto de `fastapi.exception_handlers`:
{* ../../docs_src/handling_errors/tutorial006_py310.py hl[2:5,15,21] *}
-En este ejemplo solo estás `print`eando el error con un mensaje muy expresivo, pero te haces una idea. Puedes usar la excepción y luego simplemente reutilizar los manejadores de excepciones predeterminados.
+En este ejemplo solo estás `print`eando el error con un mensaje muy expresivo, pero te haces una idea. Puedes usar la excepción y luego simplemente reutilizar los manejadores de excepciones por defecto.
diff --git a/docs/es/docs/tutorial/index.md b/docs/es/docs/tutorial/index.md
index 414e865b2..59b9e4164 100644
--- a/docs/es/docs/tutorial/index.md
+++ b/docs/es/docs/tutorial/index.md
@@ -54,7 +54,7 @@ $ fastapi dev
Es **ALTAMENTE recomendable** que escribas o copies el código, lo edites y lo ejecutes localmente.
-Usarlo en tu editor es lo que realmente te muestra los beneficios de FastAPI, al ver cuán poco código tienes que escribir, todos los chequeos de tipos, autocompletado, etc.
+Usarlo en tu editor es lo que realmente te muestra los beneficios de FastAPI, al ver cuán poco código tienes que escribir, todo el chequeo de tipos, autocompletado, etc.
---
diff --git a/docs/es/docs/tutorial/metadata.md b/docs/es/docs/tutorial/metadata.md
index 35bc98a26..d8b7176d5 100644
--- a/docs/es/docs/tutorial/metadata.md
+++ b/docs/es/docs/tutorial/metadata.md
@@ -1,4 +1,4 @@
-# Metadata y URLs de Docs { #metadata-and-docs-urls }
+# Metadata y URLs de documentación { #metadata-and-docs-urls }
Puedes personalizar varias configuraciones de metadata en tu aplicación **FastAPI**.
@@ -11,7 +11,7 @@ Puedes establecer los siguientes campos que se usan en la especificación OpenAP
| `title` | `str` | El título de la API. |
| `summary` | `str` | Un resumen corto de la API. Disponible desde OpenAPI 3.1.0, FastAPI 0.99.0. |
| `description` | `str` | Una breve descripción de la API. Puede usar Markdown. |
-| `version` | `string` | La versión de la API. Esta es la versión de tu propia aplicación, no de OpenAPI. Por ejemplo, `2.5.0`. |
+| `version` | `str` | La versión de la API. Esta es la versión de tu propia aplicación, no de OpenAPI. Por ejemplo, `2.5.0`. |
| `terms_of_service` | `str` | Una URL a los Términos de Servicio para la API. Si se proporciona, debe ser una URL. |
| `contact` | `dict` | La información de contacto para la API expuesta. Puede contener varios campos. contact fields| Parámetro | Tipo | Descripción |
|---|---|---|
name | str | El nombre identificativo de la persona/organización de contacto. |
url | str | La URL que apunta a la información de contacto. DEBE tener el formato de una URL. |
email | str | La dirección de correo electrónico de la persona/organización de contacto. DEBE tener el formato de una dirección de correo. |
license_info fields| Parámetro | Tipo | Descripción |
|---|---|---|
name | str | REQUERIDO (si se establece un license_info). El nombre de la licencia utilizada para la API. |
identifier | str | Una expresión de licencia [SPDX](https://spdx.org/licenses/) para la API. El campo identifier es mutuamente excluyente del campo url. Disponible desde OpenAPI 3.1.0, FastAPI 0.99.0. |
url | str | Una URL a la licencia utilizada para la API. DEBE tener el formato de una URL. |
diff --git a/docs/es/docs/tutorial/path-params-numeric-validations.md b/docs/es/docs/tutorial/path-params-numeric-validations.md
index 5e7b9a978..24cd5117e 100644
--- a/docs/es/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/es/docs/tutorial/path-params-numeric-validations.md
@@ -8,7 +8,7 @@ Primero, importa `Path` de `fastapi`, e importa `Annotated`:
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
-/// info | Información
+/// note | Nota
FastAPI agregó soporte para `Annotated` (y comenzó a recomendar su uso) en la versión 0.95.0.
@@ -131,7 +131,7 @@ Y también puedes declarar validaciones numéricas:
* `lt`: `l`ess `t`han
* `le`: `l`ess than or `e`qual
-/// info | Información
+/// note | Nota
`Query`, `Path` y otras clases que verás más adelante son subclases de una clase común `Param`.
diff --git a/docs/es/docs/tutorial/path-params.md b/docs/es/docs/tutorial/path-params.md
index f1aa4ef8b..94465013e 100644
--- a/docs/es/docs/tutorial/path-params.md
+++ b/docs/es/docs/tutorial/path-params.md
@@ -20,7 +20,7 @@ Puedes declarar el tipo de un parámetro de path en la función, usando anotacio
En este caso, `item_id` se declara como un `int`.
-/// check | Revisa
+/// tip | Consejo
Esto te dará soporte del editor dentro de tu función, con chequeo de errores, autocompletado, etc.
@@ -34,7 +34,7 @@ Si ejecutas este ejemplo y abres tu navegador en [http://127.0.0.1:8000/items/3]
{"item_id":3}
```
-/// check | Revisa
+/// tip | Consejo
Nota que el valor que tu función recibió (y devolvió) es `3`, como un `int` de Python, no un string `"3"`.
@@ -66,7 +66,7 @@ porque el parámetro de path `item_id` tenía un valor de `"foo"`, que no es un
El mismo error aparecería si proporcionaras un `float` en lugar de un `int`, como en: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
-/// check | Revisa
+/// tip | Consejo
Entonces, con la misma declaración de tipo de Python, **FastAPI** te ofrece validación de datos.
@@ -82,7 +82,7 @@ Y cuando abras tu navegador en [http://127.0.0.1:8000/docs](http://127.0.0.1:800
-/// check | Revisa
+/// tip | Consejo
Nuevamente, solo con esa misma declaración de tipo de Python, **FastAPI** te ofrece documentación automática e interactiva (integrando Swagger UI).
@@ -130,7 +130,7 @@ La primera siempre será utilizada ya que el path coincide primero.
## Valores predefinidos { #predefined-values }
-Si tienes una *path operation* que recibe un *path parameter*, pero quieres que los valores posibles válidos del *path parameter* estén predefinidos, puedes usar un `Enum` estándar de Python.
+Si tienes una *path operation* que recibe un *path parameter*, pero quieres que los valores posibles válidos del *path parameter* estén predefinidos, puedes usar un `Enum` estándar de Python.
### Crear una clase `Enum` { #create-an-enum-class }
diff --git a/docs/es/docs/tutorial/query-params-str-validations.md b/docs/es/docs/tutorial/query-params-str-validations.md
index 44beba2d3..fab02dd35 100644
--- a/docs/es/docs/tutorial/query-params-str-validations.md
+++ b/docs/es/docs/tutorial/query-params-str-validations.md
@@ -18,7 +18,7 @@ Tener `str | None` permitirá que tu editor te dé un mejor soporte y detecte er
## Validaciones adicionales { #additional-validation }
-Vamos a hacer que, aunque `q` sea opcional, siempre que se proporcione, su longitud no exceda los 50 caracteres.
+Vamos a hacer que, aunque `q` sea opcional, siempre que se proporcione, **su longitud no exceda los 50 caracteres**.
### Importar `Query` y `Annotated` { #import-query-and-annotated }
@@ -29,7 +29,7 @@ Para lograr eso, primero importa:
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | Información
+/// note | Nota
FastAPI añadió soporte para `Annotated` (y empezó a recomendarlo) en la versión 0.95.0.
@@ -69,7 +69,7 @@ Ahora que tenemos este `Annotated` donde podemos poner más información (en est
Nota que el valor por defecto sigue siendo `None`, por lo que el parámetro sigue siendo opcional.
-Pero ahora, al tener `Query(max_length=50)` dentro de `Annotated`, le estamos diciendo a FastAPI que queremos que tenga validación adicional para este valor, queremos que tenga un máximo de 50 caracteres. 😎
+Pero ahora, al tener `Query(max_length=50)` dentro de `Annotated`, le estamos diciendo a FastAPI que queremos que tenga **validación adicional** para este valor, queremos que tenga un máximo de 50 caracteres. 😎
/// tip | Consejo
@@ -79,9 +79,9 @@ Aquí estamos usando `Query()` porque este es un **parámetro de query**. Más a
FastAPI ahora:
-* Validará los datos asegurándose de que la longitud máxima sea de 50 caracteres
-* Mostrará un error claro para el cliente cuando los datos no sean válidos
-* Documentará el parámetro en el OpenAPI esquema *path operation* (así aparecerá en la UI de documentación automática)
+* **Validará** los datos asegurándose de que la longitud máxima sea de 50 caracteres
+* Mostrará un **error claro** para el cliente cuando los datos no sean válidos
+* **Documentará** el parámetro en el esquema de OpenAPI *path operation* (así aparecerá en la **UI de documentación automática**)
## Alternativa (antigua): `Query` como valor por defecto { #alternative-old-query-as-the-default-value }
@@ -120,7 +120,7 @@ Luego, podemos pasar más parámetros a `Query`. En este caso, el parámetro `ma
q: str | None = Query(default=None, max_length=50)
```
-Esto validará los datos, mostrará un error claro cuando los datos no sean válidos, y documentará el parámetro en el esquema del *path operation* de OpenAPI.
+Esto validará los datos, mostrará un error claro cuando los datos no sean válidos, y documentará el parámetro en el esquema de OpenAPI *path operation*.
### `Query` como valor por defecto o en `Annotated` { #query-as-the-default-value-or-in-annotated }
@@ -150,13 +150,13 @@ q: str = Query(default="rick")
### Ventajas de `Annotated` { #advantages-of-annotated }
-Usar `Annotated` es recomendado en lugar del valor por defecto en los parámetros de función, es mejor por múltiples razones. 🤓
+**Usar `Annotated` es recomendado** en lugar del valor por defecto en los parámetros de función, es **mejor** por múltiples razones. 🤓
-El valor por defecto del parámetro de función es el valor real por defecto, eso es más intuitivo con Python en general. 😌
+El valor **por defecto** del **parámetro de función** es el **valor real por defecto**, eso es más intuitivo con Python en general. 😌
-Podrías llamar a esa misma función en otros lugares sin FastAPI, y funcionaría como se espera. Si hay un parámetro requerido (sin un valor por defecto), tu editor te avisará con un error, Python también se quejará si lo ejecutas sin pasar el parámetro requerido.
+Podrías **llamar** a esa misma función en **otros lugares** sin FastAPI, y **funcionaría como se espera**. Si hay un parámetro **requerido** (sin un valor por defecto), tu **editor** te avisará con un error, **Python** también se quejará si lo ejecutas sin pasar el parámetro requerido.
-Cuando no usas `Annotated` y en su lugar usas el estilo de valor por defecto (antiguo), si llamas a esa función sin FastAPI en otros lugares, tienes que recordar pasar los argumentos a la función para que funcione correctamente, de lo contrario, los valores serán diferentes de lo que esperas (por ejemplo, `QueryInfo` o algo similar en lugar de `str`). Y tu editor no se quejará, y Python no se quejará al ejecutar esa función, solo cuando los errores dentro de las operaciones hagan que funcione incorrectamente.
+Cuando no usas `Annotated` y en su lugar usas el **estilo de valor por defecto (antiguo)**, si llamas a esa función sin FastAPI en **otros lugares**, tienes que **recordar** pasar los argumentos a la función para que funcione correctamente, de lo contrario, los valores serán diferentes de lo que esperas (por ejemplo, `QueryInfo` o algo similar en lugar de `str`). Y tu editor no se quejará, y Python no se quejará al ejecutar esa función, solo cuando las operaciones internas generen errores.
Dado que `Annotated` puede tener más de una anotación de metadato, ahora podrías incluso usar la misma función con otras herramientas, como [Typer](https://typer.tiangolo.com/). 🚀
@@ -172,13 +172,13 @@ Puedes definir una ISBN o con `imdb-` para un ID de URL de película de IMDB:
+Por ejemplo, este validador personalizado revisa que el ID del ítem empiece con `isbn-` para un número de libro ISBN o con `imdb-` para un ID de URL de película de IMDB:
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | Información
+/// note | Nota
Esto está disponible con Pydantic versión 2 o superior. 😎
@@ -390,15 +390,15 @@ Esto está disponible con Pydantic versión 2 o superior. 😎
/// tip | Consejo
-Si necesitas hacer cualquier tipo de validación que requiera comunicarte con algún componente externo, como una base de datos u otra API, deberías usar Dependencias de FastAPI, las aprenderás más adelante.
+Si necesitas hacer cualquier tipo de validación que requiera comunicarte con algún **componente externo**, como una base de datos u otra API, deberías usar **Dependencias de FastAPI**, las aprenderás más adelante.
-Estos validadores personalizados son para cosas que pueden comprobarse solo con los mismos datos provistos en el request.
+Estos validadores personalizados son para cosas que pueden revisarse **solo** con los **mismos datos** provistos en el request.
///
### Entiende ese código { #understand-that-code }
-El punto importante es solo usar `AfterValidator` con una función dentro de `Annotated`. Si quieres, sáltate esta parte. 🤸
+El punto importante es solo usar **`AfterValidator` con una función dentro de `Annotated`**. Si quieres, sáltate esta parte. 🤸
---
@@ -406,7 +406,7 @@ Pero si te da curiosidad este ejemplo de código específico y sigues entretenid
#### String con `value.startswith()` { #string-with-value-startswith }
-¿Lo notaste? un string usando `value.startswith()` puede recibir una tupla, y comprobará cada valor en la tupla:
+¿Lo notaste? Un string usando `value.startswith()` puede recibir una tupla, y revisará cada valor en la tupla:
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[16:19] hl[17] *}
@@ -416,13 +416,13 @@ Con `data.items()` obtenemos un `) envían los datos al
/// note | Detalles Técnicos
-Los datos de los forms normalmente se codifican usando el "media type" `application/x-www-form-urlencoded` cuando no incluyen archivos.
+Los datos de los formularios normalmente se codifican usando el "media type" `application/x-www-form-urlencoded` cuando no incluyen archivos.
Pero cuando el formulario incluye archivos, se codifica como `multipart/form-data`. Si usas `File`, **FastAPI** sabrá que tiene que obtener los archivos de la parte correcta del cuerpo.
diff --git a/docs/es/docs/tutorial/request-form-models.md b/docs/es/docs/tutorial/request-form-models.md
index b20421bd0..e0685d4be 100644
--- a/docs/es/docs/tutorial/request-form-models.md
+++ b/docs/es/docs/tutorial/request-form-models.md
@@ -2,7 +2,7 @@
Puedes usar **modelos de Pydantic** para declarar **campos de formulario** en FastAPI.
-/// info | Información
+/// note | Nota
Para usar formularios, primero instala [`python-multipart`](https://github.com/Kludex/python-multipart).
diff --git a/docs/es/docs/tutorial/request-forms-and-files.md b/docs/es/docs/tutorial/request-forms-and-files.md
index f7b5000b7..434a665c9 100644
--- a/docs/es/docs/tutorial/request-forms-and-files.md
+++ b/docs/es/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
Puedes definir archivos y campos de formulario al mismo tiempo usando `File` y `Form`.
-/// info | Información
+/// note | Nota
Para recibir archivos subidos y/o form data, primero instala [`python-multipart`](https://github.com/Kludex/python-multipart).
diff --git a/docs/es/docs/tutorial/request-forms.md b/docs/es/docs/tutorial/request-forms.md
index 7b78aee69..640e02282 100644
--- a/docs/es/docs/tutorial/request-forms.md
+++ b/docs/es/docs/tutorial/request-forms.md
@@ -1,8 +1,8 @@
-# Datos de formulario { #form-data }
+# Form Data { #form-data }
Cuando necesitas recibir campos de formulario en lugar de JSON, puedes usar `Form`.
-/// info | Información
+/// note | Nota
Para usar formularios, primero instala [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -14,13 +14,13 @@ $ pip install python-multipart
///
-## Importar `Form` { #import-form }
+## Importa `Form` { #import-form }
-Importar `Form` desde `fastapi`:
+Importa `Form` desde `fastapi`:
{* ../../docs_src/request_forms/tutorial001_an_py310.py hl[3] *}
-## Definir parámetros de `Form` { #define-form-parameters }
+## Define parámetros de `Form` { #define-form-parameters }
Crea parámetros de formulario de la misma manera que lo harías para `Body` o `Query`:
@@ -32,7 +32,7 @@ La especificación requiere que los campos se
Con `Form` puedes declarar las mismas configuraciones que con `Body` (y `Query`, `Path`, `Cookie`), incluyendo validación, ejemplos, un alias (por ejemplo, `user-name` en lugar de `username`), etc.
-/// info | Información
+/// note | Nota
`Form` es una clase que hereda directamente de `Body`.
@@ -70,4 +70,4 @@ Esto no es una limitación de **FastAPI**, es parte del protocolo HTTP.
## Recapitulación { #recap }
-Usa `Form` para declarar parámetros de entrada de datos de formulario.
+Usa `Form` para declarar parámetros de entrada de form data.
diff --git a/docs/es/docs/tutorial/response-model.md b/docs/es/docs/tutorial/response-model.md
index fc9028bee..2c97a6764 100644
--- a/docs/es/docs/tutorial/response-model.md
+++ b/docs/es/docs/tutorial/response-model.md
@@ -72,7 +72,7 @@ Aquí estamos declarando un modelo `UserIn`, contendrá una contraseña en texto
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | Información
+/// note | Nota
Para usar `EmailStr`, primero instala [`email-validator`](https://github.com/JoshData/python-email-validator).
@@ -251,7 +251,7 @@ Entonces, si envías un request a esa *path operation* para el ítem con ID `foo
}
```
-/// info | Información
+/// note | Nota
También puedes usar:
diff --git a/docs/es/docs/tutorial/response-status-code.md b/docs/es/docs/tutorial/response-status-code.md
index a070819bb..2e0b88c5d 100644
--- a/docs/es/docs/tutorial/response-status-code.md
+++ b/docs/es/docs/tutorial/response-status-code.md
@@ -1,5 +1,6 @@
# Código de Estado del Response { #response-status-code }
+
De la misma manera que puedes especificar un modelo de response, también puedes declarar el código de estado HTTP usado para el response con el parámetro `status_code` en cualquiera de las *path operations*:
* `@app.get()`
@@ -18,7 +19,7 @@ Observa que `status_code` es un parámetro del método "decorador" (`get`, `post
El parámetro `status_code` recibe un número con el código de estado HTTP.
-/// info | Información
+/// note | Nota
`status_code` también puede recibir un `IntEnum`, como por ejemplo el [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus) de Python.
diff --git a/docs/es/docs/tutorial/schema-extra-example.md b/docs/es/docs/tutorial/schema-extra-example.md
index 73d0cdbe4..310697d0b 100644
--- a/docs/es/docs/tutorial/schema-extra-example.md
+++ b/docs/es/docs/tutorial/schema-extra-example.md
@@ -1,4 +1,4 @@
-# Declarar Datos de Ejemplo de Request { #declare-request-example-data }
+# Declara Datos de Ejemplo de Request { #declare-request-example-data }
Puedes declarar ejemplos de los datos que tu aplicación puede recibir.
@@ -24,7 +24,7 @@ Por ejemplo, podrías usarlo para añadir metadatos para una interfaz de usuario
///
-/// info | Información
+/// note | Nota
OpenAPI 3.1.0 (usado desde FastAPI 0.99.0) añadió soporte para `examples`, que es parte del estándar de **JSON Schema**.
@@ -155,7 +155,7 @@ OpenAPI también añadió los campos `example` y `examples` a otras partes de la
* `File()`
* `Form()`
-/// info | Información
+/// note | Nota
Este viejo parámetro `examples` específico de OpenAPI ahora es `openapi_examples` desde FastAPI `0.103.0`.
@@ -171,7 +171,7 @@ Y ahora este nuevo campo `examples` tiene precedencia sobre el viejo campo únic
Este nuevo campo `examples` en JSON Schema es **solo una `list`** de ejemplos, no un dict con metadatos adicionales como en los otros lugares en OpenAPI (descritos arriba).
-/// info | Información
+/// note | Nota
Incluso después de que OpenAPI 3.1.0 fue lanzado con esta nueva integración más sencilla con JSON Schema, por un tiempo, Swagger UI, la herramienta que proporciona la documentación automática, no soportaba OpenAPI 3.1.0 (lo hace desde la versión 5.0.0 🎉).
diff --git a/docs/es/docs/tutorial/security/first-steps.md b/docs/es/docs/tutorial/security/first-steps.md
index 8118906e5..a8df7e9a5 100644
--- a/docs/es/docs/tutorial/security/first-steps.md
+++ b/docs/es/docs/tutorial/security/first-steps.md
@@ -24,7 +24,7 @@ Copia el ejemplo en un archivo `main.py`:
## Ejecútalo { #run-it }
-/// info | Información
+/// note | Nota
El paquete [`python-multipart`](https://github.com/Kludex/python-multipart) se instala automáticamente con **FastAPI** cuando ejecutas el comando `pip install "fastapi[standard]"`.
@@ -60,7 +60,7 @@ Verás algo así:
-/// check | ¡Botón de autorización!
+/// tip | ¡Botón de autorización!
Ya tienes un nuevo y brillante botón de "Authorize".
@@ -118,7 +118,7 @@ Así que, revisémoslo desde ese punto de vista simplificado:
En este ejemplo vamos a usar **OAuth2**, con el flujo **Password**, usando un token **Bearer**. Hacemos eso utilizando la clase `OAuth2PasswordBearer`.
-/// info | Información
+/// note | Nota
Un token "bearer" no es la única opción.
@@ -146,9 +146,9 @@ Usar una URL relativa es importante para asegurarse de que tu aplicación siga f
Este parámetro no crea ese endpoint / *path operation*, pero declara que la URL `/token` será la que el cliente deberá usar para obtener el token. Esa información se usa en OpenAPI, y luego en los sistemas de documentación interactiva del API.
-Pronto también crearemos la verdadera *path operation*.
+Pronto también crearemos la path operation real.
-/// info | Información
+/// note | Nota
Si eres un "Pythonista" muy estricto, tal vez no te guste el estilo del nombre del parámetro `tokenUrl` en lugar de `token_url`.
@@ -174,13 +174,13 @@ Ahora puedes pasar ese `oauth2_scheme` en una dependencia con `Depends`.
Esta dependencia proporcionará un `str` que se asigna al parámetro `token` de la *path operation function*.
-**FastAPI** sabrá que puede usar esta dependencia para definir un "security scheme" en el esquema OpenAPI (y en los docs automáticos del API).
+**FastAPI** sabrá que puede usar esta dependencia para definir un "security scheme" en el esquema OpenAPI (y en la documentación automática de la API).
-/// info | Detalles técnicos
+/// note | Detalles técnicos
**FastAPI** sabrá que puede usar la clase `OAuth2PasswordBearer` (declarada en una dependencia) para definir el esquema de seguridad en OpenAPI porque hereda de `fastapi.security.oauth2.OAuth2`, que a su vez hereda de `fastapi.security.base.SecurityBase`.
-Todas las utilidades de seguridad que se integran con OpenAPI (y los docs automáticos del API) heredan de `SecurityBase`, así es como **FastAPI** puede saber cómo integrarlas en OpenAPI.
+Todas las utilidades de seguridad que se integran con OpenAPI (y la documentación automática de la API) heredan de `SecurityBase`, así es como **FastAPI** puede saber cómo integrarlas en OpenAPI.
///
diff --git a/docs/es/docs/tutorial/security/get-current-user.md b/docs/es/docs/tutorial/security/get-current-user.md
index 67b6c5835..a47cfb0bc 100644
--- a/docs/es/docs/tutorial/security/get-current-user.md
+++ b/docs/es/docs/tutorial/security/get-current-user.md
@@ -4,7 +4,9 @@ En el capítulo anterior, el sistema de seguridad (que se basa en el sistema de
{* ../../docs_src/security/tutorial001_an_py310.py hl[12] *}
-Pero eso aún no es tan útil. Vamos a hacer que nos dé el usuario actual.
+Pero eso aún no es tan útil.
+
+Vamos a hacer que nos dé el usuario actual.
## Crear un modelo de usuario { #create-a-user-model }
@@ -12,7 +14,7 @@ Primero, vamos a crear un modelo de usuario con Pydantic.
De la misma manera que usamos Pydantic para declarar cuerpos, podemos usarlo en cualquier otra parte:
-{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
+{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## Crear una dependencia `get_current_user` { #create-a-get-current-user-dependency }
@@ -50,7 +52,7 @@ Aquí **FastAPI** no se confundirá porque estás usando `Depends`.
///
-/// check | Revisa
+/// tip | Consejo
El modo en que este sistema de dependencias está diseñado nos permite tener diferentes dependencias (diferentes "dependables") que todas devuelven un modelo `User`.
@@ -66,7 +68,7 @@ Y puedes usar cualquier modelo o datos para los requisitos de seguridad (en este
Pero no estás limitado a usar algún modelo de datos, clase o tipo específico.
-¿Quieres tener un `id` y `email` y no tener un `username` en tu modelo? Claro. Puedes usar estas mismas herramientas.
+¿Quieres tener un `id` y `email` y no tener ningún `username` en tu modelo? Claro. Puedes usar estas mismas herramientas.
¿Quieres solo tener un `str`? ¿O solo un `dict`? ¿O un instance de clase modelo de base de datos directamente? Todo funciona de la misma manera.
diff --git a/docs/es/docs/tutorial/security/oauth2-jwt.md b/docs/es/docs/tutorial/security/oauth2-jwt.md
index af1140d1b..5b74ffd11 100644
--- a/docs/es/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/es/docs/tutorial/security/oauth2-jwt.md
@@ -1,5 +1,6 @@
# OAuth2 con Password (y hashing), Bearer con tokens JWT { #oauth2-with-password-and-hashing-bearer-with-jwt-tokens }
+
Ahora que tenemos todo el flujo de seguridad, hagamos que la aplicación sea realmente segura, usando tokens JWT y hashing de contraseñas seguras.
Este código es algo que puedes usar realmente en tu aplicación, guardar los hashes de las contraseñas en tu base de datos, etc.
@@ -42,7 +43,7 @@ $ pip install pyjwt
-/// info | Información
+/// note | Nota
Si planeas usar algoritmos de firma digital como RSA o ECDSA, deberías instalar la dependencia del paquete de criptografía `pyjwt[crypto]`.
@@ -213,7 +214,7 @@ Usando las credenciales:
Usuario: `johndoe`
Contraseña: `secret`
-/// check | Revisa
+/// tip | Consejo
Observa que en ninguna parte del código está la contraseña en texto claro "`secret`", solo tenemos la versión con hash.
diff --git a/docs/es/docs/tutorial/security/simple-oauth2.md b/docs/es/docs/tutorial/security/simple-oauth2.md
index 15c7146bd..d3e2bd2cb 100644
--- a/docs/es/docs/tutorial/security/simple-oauth2.md
+++ b/docs/es/docs/tutorial/security/simple-oauth2.md
@@ -32,7 +32,7 @@ Normalmente se utilizan para declarar permisos de seguridad específicos, por ej
* `instagram_basic` es usado por Facebook / Instagram.
* `https://www.googleapis.com/auth/drive` es usado por Google.
-/// info | Información
+/// note | Nota
En OAuth2 un "scope" es solo un string que declara un permiso específico requerido.
@@ -72,7 +72,7 @@ Si necesitas imponerlo, utiliza `OAuth2PasswordRequestFormStrict` en lugar de `O
* Un `client_id` opcional (no lo necesitamos para nuestro ejemplo).
* Un `client_secret` opcional (no lo necesitamos para nuestro ejemplo).
-/// info | Información
+/// note | Nota
`OAuth2PasswordRequestForm` no es una clase especial para **FastAPI** como lo es `OAuth2PasswordBearer`.
@@ -94,7 +94,7 @@ No estamos usando `scopes` en este ejemplo, pero la funcionalidad está ahí si
///
-Ahora, obtén los datos del usuario desde la base de datos (falsa), usando el `username` del campo del form.
+Ahora, obtén los datos del usuario desde la base de datos (falsa), usando el `username` del campo del formulario.
Si no existe tal usuario, devolvemos un error diciendo "Incorrect username or password".
@@ -144,9 +144,9 @@ UserInDB(
)
```
-/// info | Información
+/// note | Nota
-Para una explicación más completa de `**user_dict` revisa en [la documentación para **Extra Models**](../extra-models.md#about-user-in-dict).
+Para una explicación más completa de `**user_dict` revisa en [la documentación para **Extra Models**](../extra-models.md#about-user-in-model-dump).
///
@@ -196,7 +196,7 @@ Así que, en nuestro endpoint, solo obtendremos un usuario si el usuario existe,
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
-/// info | Información
+/// note | Nota
El header adicional `WWW-Authenticate` con el valor `Bearer` que estamos devolviendo aquí también es parte de la especificación.
diff --git a/docs/es/docs/tutorial/server-sent-events.md b/docs/es/docs/tutorial/server-sent-events.md
index 0a008c0de..79716ac85 100644
--- a/docs/es/docs/tutorial/server-sent-events.md
+++ b/docs/es/docs/tutorial/server-sent-events.md
@@ -4,7 +4,7 @@ Puedes enviar datos en streaming al cliente usando **Server-Sent Events** (SSE).
Esto es similar a [Stream JSON Lines](stream-json-lines.md), pero usa el formato `text/event-stream`, que los navegadores soportan de forma nativa con la [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource).
-/// info | Información
+/// note | Nota
Añadido en FastAPI 0.135.0.
diff --git a/docs/es/docs/tutorial/sql-databases.md b/docs/es/docs/tutorial/sql-databases.md
index 7131716ee..3bb3209b2 100644
--- a/docs/es/docs/tutorial/sql-databases.md
+++ b/docs/es/docs/tutorial/sql-databases.md
@@ -65,7 +65,7 @@ Hay algunas diferencias:
* `Field(primary_key=True)` le dice a SQLModel que `id` es la **clave primaria** en la base de datos SQL (puedes aprender más sobre claves primarias de SQL en la documentación de SQLModel).
- Nota: Usamos `int | None` para el campo de clave primaria para que en el código Python podamos *crear un objeto sin un `id`* (`id=None`), asumiendo que la base de datos lo *generará al guardar*. SQLModel entiende que la base de datos proporcionará el `id` y *define la columna como un `INTEGER` no nulo* en el esquema de la base de datos. Consulta la [documentación de SQLModel sobre claves primarias](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id) para más detalles.
+ **Nota:** Usamos `int | None` para el campo de clave primaria para que en el código Python podamos *crear un objeto sin un `id`* (`id=None`), asumiendo que la base de datos lo *generará al guardar*. SQLModel entiende que la base de datos proporcionará el `id` y *define la columna como un `INTEGER` no nulo* en el esquema de la base de datos. Consulta la [documentación de SQLModel sobre claves primarias](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id) para más detalles.
* `Field(index=True)` le dice a SQLModel que debe crear un **índice SQL** para esta columna, lo que permitirá búsquedas más rápidas en la base de datos cuando se lean datos filtrados por esta columna.
@@ -181,7 +181,7 @@ Arreglaremos estas cosas añadiendo unos **modelos extra**. Aquí es donde SQLMo
En **SQLModel**, cualquier clase de modelo que tenga `table=True` es un **modelo de tabla**.
-Y cualquier clase de modelo que no tenga `table=True` es un **modelo de datos**, estos son en realidad solo modelos de Pydantic (con un par de características extra pequeñas). 🤓
+Y cualquier clase de modelo que no tenga `table=True` es un **modelo de datos**, estos son en realidad solo modelos de Pydantic (con un par de pequeñas funcionalidades extra). 🤓
Con SQLModel, podemos usar **herencia** para **evitar duplicar** todos los campos en todos los casos.
@@ -296,7 +296,7 @@ Ahora usamos `response_model=HeroPublic` en lugar de la **anotación de tipo de
Si hubiéramos declarado `-> HeroPublic`, tu editor y linter se quejarían (con razón) de que estás devolviendo un `Hero` en lugar de un `HeroPublic`.
-Al declararlo en `response_model` le estamos diciendo a **FastAPI** que haga lo suyo, sin interferir con las anotaciones de tipo y la ayuda de tu editor y otras herramientas.
+Al declararlo en `response_model` le estamos diciendo a **FastAPI** que haga lo suyo, sin interferir con las anotaciones de tipos y la ayuda de tu editor y otras herramientas.
///
diff --git a/docs/es/docs/tutorial/static-files.md b/docs/es/docs/tutorial/static-files.md
index b99ed5f9c..177be6302 100644
--- a/docs/es/docs/tutorial/static-files.md
+++ b/docs/es/docs/tutorial/static-files.md
@@ -2,6 +2,14 @@
Puedes servir archivos estáticos automáticamente desde un directorio utilizando `StaticFiles`.
+/// tip | Consejo
+
+Si necesitas alojar un frontend, usa `app.frontend()` en su lugar, lee sobre ello en [Frontend](frontend.md).
+
+`app.frontend()` usa `StaticFiles` por debajo, con varias ventajas adicionales para frontends, como manejar el routing del lado del cliente.
+
+///
+
## Usa `StaticFiles` { #use-staticfiles }
* Importa `StaticFiles`.
diff --git a/docs/es/docs/tutorial/stream-json-lines.md b/docs/es/docs/tutorial/stream-json-lines.md
index e7fe18f5e..356b4e0bf 100644
--- a/docs/es/docs/tutorial/stream-json-lines.md
+++ b/docs/es/docs/tutorial/stream-json-lines.md
@@ -2,7 +2,7 @@
Podrías tener una secuencia de datos que quieras enviar en un "**stream**", podrías hacerlo con **JSON Lines**.
-/// info | Información
+/// note | Nota
Añadido en FastAPI 0.134.0.
@@ -48,7 +48,7 @@ Una response tendría un tipo de contenido `application/jsonl` (en lugar de `app
Es muy similar a un array JSON (equivalente de una list de Python), pero en lugar de estar envuelto en `[]` y tener `,` entre los ítems, tiene **un objeto JSON por línea**, separados por un carácter de nueva línea.
-/// info | Información
+/// note | Nota
El punto importante es que tu app podrá producir cada línea a su turno, mientras el cliente consume las líneas anteriores.
diff --git a/docs/es/docs/tutorial/testing.md b/docs/es/docs/tutorial/testing.md
index a40d90c5e..9c4ff69b8 100644
--- a/docs/es/docs/tutorial/testing.md
+++ b/docs/es/docs/tutorial/testing.md
@@ -1,4 +1,4 @@
-# Testing { #testing }
+# Pruebas { #testing }
Gracias a [Starlette](https://www.starlette.dev/testclient/), escribir pruebas para aplicaciones de **FastAPI** es fácil y agradable.
@@ -8,7 +8,7 @@ Con él, puedes usar [pytest](https://docs.pytest.org/) directamente con **FastA
## Usando `TestClient` { #using-testclient }
-/// info | Información
+/// note | Nota
Para usar `TestClient`, primero instala [`httpx`](https://www.python-httpx.org).
@@ -28,7 +28,7 @@ Crea funciones con un nombre que comience con `test_` (esta es la convención es
Usa el objeto `TestClient` de la misma manera que con `httpx`.
-Escribe declaraciones `assert` simples con las expresiones estándar de Python que necesites revisar (otra vez, estándar de `pytest`).
+Escribe statements `assert` simples con las expresiones estándar de Python que necesites revisar (otra vez, estándar de `pytest`).
{* ../../docs_src/app_testing/tutorial001_py310.py hl[2,12,15:18] *}
@@ -90,7 +90,7 @@ Entonces podrías tener un archivo `test_main.py` con tus pruebas. Podría estar
│ └── test_main.py
```
-Debido a que este archivo está en el mismo paquete, puedes usar importaciones relativas para importar el objeto `app` desde el módulo `main` (`main.py`):
+Debido a que este archivo está en el mismo paquete, puedes usar imports relativos para importar el objeto `app` desde el módulo `main` (`main.py`):
{* ../../docs_src/app_testing/app_a_py310/test_main.py hl[3] *}
@@ -142,7 +142,7 @@ Por ejemplo:
Para más información sobre cómo pasar datos al backend (usando `httpx` o el `TestClient`) revisa la [documentación de HTTPX](https://www.python-httpx.org).
-/// info | Información
+/// note | Nota
Ten en cuenta que el `TestClient` recibe datos que pueden ser convertidos a JSON, no modelos de Pydantic.
diff --git a/docs/es/docs/virtual-environments.md b/docs/es/docs/virtual-environments.md
index 1679fd02b..92cb83ba2 100644
--- a/docs/es/docs/virtual-environments.md
+++ b/docs/es/docs/virtual-environments.md
@@ -288,8 +288,8 @@ $ echo "*" > .venv/.gitignore
/// details | Qué significa ese comando
-* `echo "*"`: "imprimirá" el texto `*` en el terminal (la siguiente parte cambia eso un poco)
-* `>`: cualquier cosa impresa en el terminal por el comando a la izquierda de `>` no debería imprimirse, sino escribirse en el archivo que va a la derecha de `>`
+* `echo "*"`: "imprimirá" el texto `*` en la terminal (la siguiente parte cambia eso un poco)
+* `>`: cualquier cosa impresa en la terminal por el comando a la izquierda de `>` no debería imprimirse, sino escribirse en el archivo que va a la derecha de `>`
* `.gitignore`: el nombre del archivo donde debería escribirse el texto
Y `*` para Git significa "todo". Así que, ignorará todo en el directorio `.venv`.
@@ -443,6 +443,8 @@ De esta manera, cuando ejecutes `python` no intentará ejecutarse desde ese ento
Ahora estás listo para empezar a trabajar en tu proyecto.
+
+
/// tip | Consejo
¿Quieres entender todo lo anterior?
@@ -694,7 +696,7 @@ Eso significa que el sistema ahora comenzará a buscar primero los programas en:
antes de buscar en los otros directorios.
-Así que, cuando escribas `python` en el terminal, el sistema encontrará el programa Python en
+Así que, cuando escribas `python` en la terminal, el sistema encontrará el programa Python en
```plaintext
/home/user/code/awesome-project/.venv/bin/python
@@ -718,7 +720,7 @@ C:\Users\user\code\awesome-project\.venv\Scripts
antes de buscar en los otros directorios.
-Así que, cuando escribas `python` en el terminal, el sistema encontrará el programa Python en
+Así que, cuando escribas `python` en la terminal, el sistema encontrará el programa Python en
```plaintext
C:\Users\user\code\awesome-project\.venv\Scripts\python
@@ -800,7 +802,7 @@ $ cd ~/code/prisoner-of-azkaban
-Si no desactivas el entorno virtual para `philosophers-stone`, cuando ejecutes `python` en el terminal, intentará usar el Python de `philosophers-stone`.
+Si no desactivas el entorno virtual para `philosophers-stone`, cuando ejecutes `python` en la terminal, intentará usar el Python de `philosophers-stone`.
diff --git a/docs/fr/docs/advanced/openapi-webhooks.md b/docs/fr/docs/advanced/openapi-webhooks.md
index c36c2f82b..722455063 100644
--- a/docs/fr/docs/advanced/openapi-webhooks.md
+++ b/docs/fr/docs/advanced/openapi-webhooks.md
@@ -16,13 +16,13 @@ Et vos utilisateurs définissent aussi, d'une manière ou d'une autre (par exemp
Toute la logique de gestion des URL des webhooks et le code qui envoie effectivement ces requêtes vous incombent. Vous l'implémentez comme vous le souhaitez dans votre propre code.
-## Documenter des webhooks avec FastAPI et OpenAPI { #documenting-webhooks-with-fastapi-and-openapi }
+## Documenter des webhooks avec **FastAPI** et OpenAPI { #documenting-webhooks-with-fastapi-and-openapi }
-Avec FastAPI, en utilisant OpenAPI, vous pouvez définir les noms de ces webhooks, les types d'opérations HTTP que votre application peut envoyer (par exemple `POST`, `PUT`, etc.) et les corps des requêtes que votre application enverra.
+Avec **FastAPI**, en utilisant OpenAPI, vous pouvez définir les noms de ces webhooks, les types d'opérations HTTP que votre application peut envoyer (par exemple `POST`, `PUT`, etc.) et les **corps** des requêtes que votre application enverra.
-Cela peut grandement faciliter la tâche de vos utilisateurs pour implémenter leurs API afin de recevoir vos requêtes de webhook ; ils pourront même peut-être générer automatiquement une partie de leur propre code d'API.
+Cela peut grandement faciliter la tâche de vos utilisateurs pour **implémenter leurs API** afin de recevoir vos requêtes de **webhook** ; ils pourront même peut-être générer automatiquement une partie de leur propre code d'API.
-/// info
+/// note | Remarque
Les webhooks sont disponibles dans OpenAPI 3.1.0 et versions ultérieures, pris en charge par FastAPI `0.99.0` et versions ultérieures.
@@ -30,13 +30,13 @@ Les webhooks sont disponibles dans OpenAPI 3.1.0 et versions ultérieures, pris
## Créer une application avec des webhooks { #an-app-with-webhooks }
-Lorsque vous créez une application FastAPI, il existe un attribut `webhooks` que vous pouvez utiliser pour définir des webhooks, de la même manière que vous définiriez des chemins d'accès, par exemple avec `@app.webhooks.post()`.
+Lorsque vous créez une application **FastAPI**, il existe un attribut `webhooks` que vous pouvez utiliser pour définir des webhooks, de la même manière que vous définiriez des chemins d'accès, par exemple avec `@app.webhooks.post()`.
{* ../../docs_src/openapi_webhooks/tutorial001_py310.py hl[9:12,15:20] *}
-Les webhooks que vous définissez apparaîtront dans le schéma OpenAPI et dans l'interface de documentation automatique.
+Les webhooks que vous définissez apparaîtront dans le schéma **OpenAPI** et dans l'**interface de documentation** automatique.
-/// info
+/// note | Remarque
L'objet `app.webhooks` est en fait simplement un `APIRouter`, le même type que vous utiliseriez pour structurer votre application en plusieurs fichiers.
@@ -50,6 +50,6 @@ C'est parce qu'on s'attend à ce que vos utilisateurs définissent, par un autre
Vous pouvez maintenant démarrer votre application et aller sur [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
-Vous verrez que votre documentation contient les chemins d'accès habituels et désormais aussi des webhooks :
+Vous verrez que votre documentation contient les *chemins d'accès* habituels et désormais aussi des **webhooks** :
diff --git a/docs/fr/docs/advanced/path-operation-advanced-configuration.md b/docs/fr/docs/advanced/path-operation-advanced-configuration.md
index 67a5d46d4..0c56a1406 100644
--- a/docs/fr/docs/advanced/path-operation-advanced-configuration.md
+++ b/docs/fr/docs/advanced/path-operation-advanced-configuration.md
@@ -16,17 +16,11 @@ Vous devez vous assurer qu’il est unique pour chaque opération.
### Utiliser le nom de la fonction de chemin d’accès comme operationId { #using-the-path-operation-function-name-as-the-operationid }
-Si vous souhaitez utiliser les noms de fonction de vos API comme `operationId`, vous pouvez les parcourir tous et remplacer l’`operation_id` de chaque chemin d’accès en utilisant leur `APIRoute.name`.
+Si vous souhaitez utiliser les noms de fonction de vos API comme `operationId`, vous pouvez passer une fonction personnalisée `generate_unique_id_function` à `FastAPI`.
-Vous devez le faire après avoir ajouté tous vos chemins d’accès.
+Cette fonction reçoit chaque `APIRoute` et renvoie l’`operationId` à utiliser pour ce chemin d’accès.
-{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}
-
-/// tip | Astuce
-
-Si vous appelez manuellement `app.openapi()`, vous devez mettre à jour les `operationId` avant cela.
-
-///
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *}
/// warning | Alertes
diff --git a/docs/fr/docs/advanced/response-change-status-code.md b/docs/fr/docs/advanced/response-change-status-code.md
index 222825702..317fcb03d 100644
--- a/docs/fr/docs/advanced/response-change-status-code.md
+++ b/docs/fr/docs/advanced/response-change-status-code.md
@@ -16,7 +16,7 @@ Pour ces cas, vous pouvez utiliser un paramètre `Response`.
## Utiliser un paramètre `Response` { #use-a-response-parameter }
-Vous pouvez déclarer un paramètre de type `Response` dans votre fonction de chemin d'accès (comme vous pouvez le faire pour les cookies et les en-têtes).
+Vous pouvez déclarer un paramètre de type `Response` dans votre *fonction de chemin d'accès* (comme vous pouvez le faire pour les cookies et les en-têtes).
Vous pouvez ensuite définir le `status_code` dans cet objet de réponse *temporaire*.
diff --git a/docs/fr/docs/advanced/response-cookies.md b/docs/fr/docs/advanced/response-cookies.md
index 174c9a72d..9efa045b1 100644
--- a/docs/fr/docs/advanced/response-cookies.md
+++ b/docs/fr/docs/advanced/response-cookies.md
@@ -1,5 +1,6 @@
# Cookies de réponse { #response-cookies }
+
## Utiliser un paramètre `Response` { #use-a-response-parameter }
Vous pouvez déclarer un paramètre de type `Response` dans votre *fonction de chemin d'accès*.
diff --git a/docs/fr/docs/advanced/response-directly.md b/docs/fr/docs/advanced/response-directly.md
index 5ef479584..3c3827d66 100644
--- a/docs/fr/docs/advanced/response-directly.md
+++ b/docs/fr/docs/advanced/response-directly.md
@@ -18,7 +18,7 @@ Vous aurez normalement une bien meilleure performance en utilisant un [Modèle d
Vous pouvez renvoyer une `Response` ou n'importe laquelle de ses sous-classes.
-/// info
+/// note | Remarque
`JSONResponse` est elle-même une sous-classe de `Response`.
diff --git a/docs/fr/docs/advanced/response-headers.md b/docs/fr/docs/advanced/response-headers.md
index b7568b51f..e319ffefb 100644
--- a/docs/fr/docs/advanced/response-headers.md
+++ b/docs/fr/docs/advanced/response-headers.md
@@ -2,9 +2,9 @@
## Utiliser un paramètre `Response` { #use-a-response-parameter }
-Vous pouvez déclarer un paramètre de type `Response` dans votre fonction de chemin d'accès (comme vous pouvez le faire pour les cookies).
+Vous pouvez déclarer un paramètre de type `Response` dans votre *fonction de chemin d'accès* (comme vous pouvez le faire pour les cookies).
-Vous pouvez ensuite définir des en-têtes dans cet objet de réponse temporaire.
+Vous pouvez ensuite définir des en-têtes dans cet objet de réponse *temporaire*.
{* ../../docs_src/response_headers/tutorial002_py310.py hl[1, 7:8] *}
@@ -12,7 +12,7 @@ Ensuite, vous pouvez renvoyer n'importe quel objet dont vous avez besoin, comme
Et si vous avez déclaré un `response_model`, il sera toujours utilisé pour filtrer et convertir l'objet que vous avez renvoyé.
-**FastAPI** utilisera cette réponse temporaire pour extraire les en-têtes (ainsi que les cookies et le code de statut), et les placera dans la réponse finale qui contient la valeur que vous avez renvoyée, filtrée par tout `response_model`.
+**FastAPI** utilisera cette réponse *temporaire* pour extraire les en-têtes (ainsi que les cookies et le code de statut), et les placera dans la réponse finale qui contient la valeur que vous avez renvoyée, filtrée par tout `response_model`.
Vous pouvez également déclarer le paramètre `Response` dans des dépendances, et y définir des en-têtes (et des cookies).
diff --git a/docs/fr/docs/advanced/security/oauth2-scopes.md b/docs/fr/docs/advanced/security/oauth2-scopes.md
index f27b95b4b..a193aeacd 100644
--- a/docs/fr/docs/advanced/security/oauth2-scopes.md
+++ b/docs/fr/docs/advanced/security/oauth2-scopes.md
@@ -2,11 +2,11 @@
Vous pouvez utiliser des scopes OAuth2 directement avec **FastAPI**, ils sont intégrés pour fonctionner de manière transparente.
-Cela vous permettrait d’avoir un système d’autorisations plus fin, conforme au standard OAuth2, intégré à votre application OpenAPI (et à la documentation de l’API).
+Cela vous permettrait d’avoir un système d’autorisations plus fin, conforme au standard OAuth2, intégré à votre application OpenAPI (et aux documents de l’API).
OAuth2 avec scopes est le mécanisme utilisé par de nombreux grands fournisseurs d’authentification, comme Facebook, Google, GitHub, Microsoft, X (Twitter), etc. Ils l’utilisent pour fournir des permissions spécifiques aux utilisateurs et aux applications.
-Chaque fois que vous « log in with » Facebook, Google, GitHub, Microsoft, X (Twitter), cette application utilise OAuth2 avec scopes.
+Chaque fois que vous utilisez « se connecter avec » Facebook, Google, GitHub, Microsoft, X (Twitter), cette application utilise OAuth2 avec scopes.
Dans cette section, vous verrez comment gérer l’authentification et l’autorisation avec le même OAuth2 avec scopes dans votre application **FastAPI**.
@@ -16,7 +16,7 @@ C’est une section plus ou moins avancée. Si vous débutez, vous pouvez la pas
Vous n’avez pas nécessairement besoin des scopes OAuth2, et vous pouvez gérer l’authentification et l’autorisation comme vous le souhaitez.
-Mais OAuth2 avec scopes peut s’intégrer élégamment à votre API (avec OpenAPI) et à votre documentation d’API.
+Mais OAuth2 avec scopes peut s’intégrer élégamment à votre API (avec OpenAPI) et à vos documents d’API.
Néanmoins, c’est toujours à vous de faire appliquer ces scopes, ou toute autre exigence de sécurité/autorisation, selon vos besoins, dans votre code.
@@ -34,7 +34,7 @@ Le contenu de chacune de ces chaînes peut avoir n’importe quel format, mais n
Ces scopes représentent des « permissions ».
-Dans OpenAPI (par ex. la documentation de l’API), vous pouvez définir des « schémas de sécurité ».
+Dans OpenAPI (par ex. les documents de l’API), vous pouvez définir des « schémas de sécurité ».
Lorsqu’un de ces schémas de sécurité utilise OAuth2, vous pouvez aussi déclarer et utiliser des scopes.
@@ -46,7 +46,7 @@ Ils sont généralement utilisés pour déclarer des permissions de sécurité s
* `instagram_basic` est utilisé par Facebook / Instagram.
* `https://www.googleapis.com/auth/drive` est utilisé par Google.
-/// info
+/// note | Remarque
Dans OAuth2, un « scope » est simplement une chaîne qui déclare une permission spécifique requise.
@@ -74,7 +74,7 @@ Le paramètre `scopes` reçoit un `dict` avec chaque scope en clé et la descrip
{* ../../docs_src/security/tutorial005_an_py310.py hl[63:66] *}
-Comme nous déclarons maintenant ces scopes, ils apparaîtront dans la documentation de l’API lorsque vous vous authentifiez/autorisez.
+Comme nous déclarons maintenant ces scopes, ils apparaîtront dans les documents de l’API lorsque vous vous authentifiez/autorisez.
Et vous pourrez sélectionner à quels scopes vous souhaitez accorder l’accès : `me` et `items`.
@@ -126,7 +126,7 @@ Nous le faisons ici pour montrer comment **FastAPI** gère des scopes déclarés
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
-/// info | Détails techniques
+/// note | Détails techniques
`Security` est en réalité une sous-classe de `Depends`, et elle n’a qu’un paramètre supplémentaire que nous verrons plus tard.
@@ -235,11 +235,11 @@ Elles seront vérifiées indépendamment pour chaque *chemin d’accès*.
## Tester { #check-it }
-Si vous ouvrez la documentation de l’API, vous pouvez vous authentifier et spécifier quels scopes vous voulez autoriser.
+Si vous ouvrez les documents de l’API, vous pouvez vous authentifier et spécifier quels scopes vous voulez autoriser.
-Si vous ne sélectionnez aucun scope, vous serez « authenticated », mais lorsque vous essayerez d’accéder à `/users/me/` ou `/users/me/items/`, vous obtiendrez une erreur indiquant que vous n’avez pas suffisamment de permissions. Vous pourrez toujours accéder à `/status/`.
+Si vous ne sélectionnez aucun scope, vous serez « authentifié », mais lorsque vous essayerez d’accéder à `/users/me/` ou `/users/me/items/`, vous obtiendrez une erreur indiquant que vous n’avez pas suffisamment de permissions. Vous pourrez toujours accéder à `/status/`.
Et si vous sélectionnez le scope `me` mais pas le scope `items`, vous pourrez accéder à `/users/me/` mais pas à `/users/me/items/`.
diff --git a/docs/fr/docs/advanced/settings.md b/docs/fr/docs/advanced/settings.md
index e6eb52a4e..722274d57 100644
--- a/docs/fr/docs/advanced/settings.md
+++ b/docs/fr/docs/advanced/settings.md
@@ -144,7 +144,7 @@ Pour l'instant, vous pouvez supposer que `get_settings()` est une fonction norma
///
-Nous pouvons ensuite l'exiger depuis la fonction de chemin d'accès comme dépendance et l'utiliser où nous en avons besoin.
+Nous pouvons ensuite l'exiger depuis la *fonction de chemin d'accès* comme dépendance et l'utiliser où nous en avons besoin.
{* ../../docs_src/settings/app02_an_py310/main.py hl[17,19:21] *}
diff --git a/docs/fr/docs/advanced/stream-data.md b/docs/fr/docs/advanced/stream-data.md
index 3b22910a1..23884b2f0 100644
--- a/docs/fr/docs/advanced/stream-data.md
+++ b/docs/fr/docs/advanced/stream-data.md
@@ -2,9 +2,9 @@
Si vous voulez diffuser des données pouvant être structurées en JSON, vous devez [Diffuser des JSON Lines](../tutorial/stream-json-lines.md).
-Mais si vous voulez diffuser des données binaires pures ou des chaînes, voici comment procéder.
+Mais si vous voulez **diffuser des données binaires pures** ou des chaînes, voici comment procéder.
-/// info
+/// note | Remarque
Ajouté dans FastAPI 0.134.0.
@@ -14,7 +14,7 @@ Ajouté dans FastAPI 0.134.0.
Vous pouvez l'utiliser si vous souhaitez diffuser des chaînes pures, par exemple directement depuis la sortie d'un service d'**IA LLM**.
-Vous pouvez également l'utiliser pour diffuser de gros fichiers binaires, en envoyant chaque bloc de données au fur et à mesure de la lecture, sans tout charger en mémoire d'un coup.
+Vous pouvez également l'utiliser pour diffuser de **gros fichiers binaires**, en envoyant chaque bloc de données au fur et à mesure de la lecture, sans tout charger en mémoire d'un coup.
Vous pouvez aussi diffuser de la **vidéo** ou de l'**audio** de cette manière ; cela peut même être généré au fil du traitement et de l'envoi.
@@ -26,7 +26,7 @@ Si vous déclarez un `response_class=StreamingResponse` dans votre *fonction de
FastAPI transmettra chaque bloc de données à la `StreamingResponse` tel quel ; il n'essaiera pas de le convertir en JSON ni autre chose similaire.
-### Fonctions de chemin d'accès non async { #non-async-path-operation-functions }
+### *Fonctions de chemin d'accès* non async { #non-async-path-operation-functions }
Vous pouvez également utiliser des fonctions `def` classiques (sans `async`), et utiliser `yield` de la même manière.
@@ -40,7 +40,7 @@ Comme FastAPI n'essaiera pas de convertir les données en JSON avec Pydantic ni
{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *}
-Cela signifie aussi qu'avec `StreamingResponse` vous avez la liberté — et la responsabilité — de produire et d'encoder les octets de données exactement comme vous avez besoin de les envoyer, indépendamment des annotations de type. 🤓
+Cela signifie aussi qu'avec `StreamingResponse` vous avez la **liberté** et la **responsabilité** de produire et d'encoder les octets de données exactement comme vous avez besoin de les envoyer, indépendamment des annotations de type. 🤓
### Diffuser des bytes { #stream-bytes }
@@ -90,7 +90,7 @@ Par exemple, ils n'ont pas de `await file.read()`, ni de `async for chunk in fil
Et dans de nombreux cas, leur lecture serait une opération bloquante (pouvant bloquer la boucle d'événements), car ils sont lus depuis le disque ou le réseau.
-/// info
+/// note | Remarque
L'exemple ci-dessus est en réalité une exception, car l'objet `io.BytesIO` est déjà en mémoire ; sa lecture ne bloquera donc rien.
diff --git a/docs/fr/docs/advanced/strict-content-type.md b/docs/fr/docs/advanced/strict-content-type.md
index d5c749e9d..bd4ba3b80 100644
--- a/docs/fr/docs/advanced/strict-content-type.md
+++ b/docs/fr/docs/advanced/strict-content-type.md
@@ -81,7 +81,7 @@ Si vous devez prendre en charge des clients qui n’envoient pas d’en-tête `C
Avec ce paramètre, les requêtes sans en-tête `Content-Type` verront leur corps analysé comme JSON, ce qui correspond au comportement des anciennes versions de FastAPI.
-/// info
+/// note | Remarque
Ce comportement et cette configuration ont été ajoutés dans FastAPI 0.132.0.
diff --git a/docs/fr/docs/advanced/websockets.md b/docs/fr/docs/advanced/websockets.md
index 737bbc72e..b544c6d06 100644
--- a/docs/fr/docs/advanced/websockets.md
+++ b/docs/fr/docs/advanced/websockets.md
@@ -111,7 +111,7 @@ Ils fonctionnent de la même manière que pour les autres endpoints/*chemins d'a
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
-/// info
+/// note | Remarque
Comme il s'agit d'un WebSocket, il n'est pas vraiment logique de lever une `HTTPException`, nous levons plutôt une `WebSocketException`.
diff --git a/docs/fr/docs/advanced/wsgi.md b/docs/fr/docs/advanced/wsgi.md
index fe39729f7..6e6ce85c8 100644
--- a/docs/fr/docs/advanced/wsgi.md
+++ b/docs/fr/docs/advanced/wsgi.md
@@ -1,12 +1,13 @@
# Inclure WSGI - Flask, Django, autres { #including-wsgi-flask-django-others }
+
Vous pouvez monter des applications WSGI comme vous l'avez vu avec [Sous-applications - Montages](sub-applications.md), [Derrière un proxy](behind-a-proxy.md).
Pour cela, vous pouvez utiliser `WSGIMiddleware` et l'utiliser pour envelopper votre application WSGI, par exemple Flask, Django, etc.
## Utiliser `WSGIMiddleware` { #using-wsgimiddleware }
-/// info
+/// note | Remarque
Cela nécessite l'installation de `a2wsgi`, par exemple avec `pip install a2wsgi`.
diff --git a/docs/fr/docs/alternatives.md b/docs/fr/docs/alternatives.md
index b56d10481..91a81e2dc 100644
--- a/docs/fr/docs/alternatives.md
+++ b/docs/fr/docs/alternatives.md
@@ -39,19 +39,19 @@ premières idées qui a inspiré « la recherche de » **FastAPI**.
/// note | Remarque
-Django REST Framework a été créé par Tom Christie. Le créateur de Starlette et Uvicorn, sur lesquels **FastAPI** est basé.
+Django REST Framework a été créé par Tom Christie. Le même créateur de Starlette et Uvicorn, sur lesquels **FastAPI** est basé.
///
/// tip | A inspiré **FastAPI** à
-Avoir une interface de documentation automatique de l'API.
+Avoir une interface utilisateur web de documentation automatique de l'API.
///
### [Flask](https://flask.palletsprojects.com) { #flask }
-Flask est un « micro‑framework », il ne comprend pas d'intégrations de bases de données ni beaucoup de choses qui sont fournies par défaut dans Django.
+Flask est un « microframework », il ne comprend pas d'intégrations de bases de données ni beaucoup de choses qui sont fournies par défaut dans Django.
Cette simplicité et cette flexibilité permettent d'utiliser des bases de données NoSQL comme principal système de stockage de données.
@@ -60,22 +60,22 @@ technique par moments.
Il est aussi couramment utilisé pour d'autres applications qui n'ont pas nécessairement besoin d'une base de données, de gestion des utilisateurs ou de l'une des nombreuses fonctionnalités préinstallées dans Django. Bien que beaucoup de ces fonctionnalités puissent être ajoutées avec des plug-ins.
-Ce découplage des parties, et le fait d'être un « micro‑framework » qui puisse être étendu pour couvrir exactement ce
+Ce découplage des parties, et le fait d'être un « microframework » qui puisse être étendu pour couvrir exactement ce
qui est nécessaire, était une caractéristique clé que je voulais conserver.
Compte tenu de la simplicité de Flask, il semblait bien adapté à la création d'API. La prochaine chose à trouver était un « Django REST Framework » pour Flask.
/// tip | A inspiré **FastAPI** à
-Être un micro‑framework. Il est donc facile de combiner les outils et les pièces nécessaires.
+Être un micro-framework. Il est donc facile de combiner les outils et les pièces nécessaires.
-Proposer un système de routage simple et facile à utiliser.
+Proposer un système de routing simple et facile à utiliser.
///
### [Requests](https://requests.readthedocs.io) { #requests }
-**FastAPI** n'est pas réellement une alternative à **Requests**. Leur cadre est très différent.
+**FastAPI** n'est pas réellement une alternative à **Requests**. Leur portée est très différente.
Il serait en fait plus courant d'utiliser Requests _à l'intérieur_ d'une application FastAPI.
@@ -85,7 +85,7 @@ Mais quand même, FastAPI s'est inspiré de Requests.
Ils sont, plus ou moins, aux extrémités opposées, se complétant l'un l'autre.
-Requests a un design très simple et intuitif, il est très facile à utiliser, avec des valeurs par défaut raisonnables, tout en étant très puissant et personnalisable.
+Requests a un design très simple et intuitif, il est très facile à utiliser, avec des valeurs par défaut raisonnables. Mais en même temps, il est très puissant et personnalisable.
C'est pourquoi, comme le dit le site officiel :
@@ -97,7 +97,7 @@ La façon dont vous l'utilisez est très simple. Par exemple, pour faire une req
response = requests.get("http://example.com/some/url")
```
-L’opération de chemin d'accès correspondante dans **FastAPI** pourrait ressembler à ceci :
+Le *chemin d'accès* d'API correspondant dans **FastAPI** pourrait ressembler à ceci :
```Python hl_lines="1"
@app.get("/some/url")
@@ -117,7 +117,7 @@ Notez les similitudes entre `requests.get(...)` et `@app.get(...)`.
### [Swagger](https://swagger.io/) / [OpenAPI](https://github.com/OAI/OpenAPI-Specification/) { #swagger-openapi }
-La principale fonctionnalité que j'ai emprunté à Django REST Framework était la documentation automatique des API.
+La principale fonctionnalité que j'ai empruntée à Django REST Framework était la documentation automatique des API.
Puis j'ai découvert qu'il existait une norme pour documenter les API, en utilisant JSON (ou YAML, une extension de JSON) appelée Swagger.
@@ -132,12 +132,12 @@ C'est pourquoi, lorsqu'on parle de la version 2.0, il est courant de dire « Swa
Adopter et utiliser une norme ouverte pour les spécifications des API, au lieu d'un schéma personnalisé.
-Intégrer des outils d'interface utilisateur basés sur des normes :
+Et intégrer des outils d'interface utilisateur basés sur des normes :
* [Swagger UI](https://github.com/swagger-api/swagger-ui)
* [ReDoc](https://github.com/Rebilly/ReDoc)
-Ces deux-là ont été choisis parce qu'ils sont populaires et stables, mais en faisant une recherche rapide, vous pourriez trouver des dizaines d'alternatives supplémentaires pour OpenAPI (que vous pouvez utiliser avec **FastAPI**).
+Ces deux-là ont été choisis parce qu'ils sont populaires et stables, mais en faisant une recherche rapide, vous pourriez trouver des dizaines d'interfaces utilisateur alternatives pour OpenAPI (que vous pouvez utiliser avec **FastAPI**).
///
@@ -149,14 +149,13 @@ permanents qui les rendent inadaptés.
### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow }
-L'une des principales fonctionnalités nécessaires aux systèmes API est la « sérialisation » des données, qui consiste à prendre les données du code (Python) et à
+L'une des principales fonctionnalités nécessaires aux systèmes API est la « sérialisation » des données, qui consiste à prendre les données du code (Python) et à
les convertir en quelque chose qui peut être envoyé sur le réseau. Par exemple, convertir un objet contenant des
données provenant d'une base de données en un objet JSON. Convertir des objets `datetime` en strings, etc.
La validation des données est une autre fonctionnalité importante dont ont besoin les API. Elle permet de s'assurer
que les données sont valides, compte tenu de certains paramètres. Par exemple, qu'un champ est un `int`, et non un
-string.
-Ceci est particulièrement utile pour les données entrantes.
+string. Ceci est particulièrement utile pour les données entrantes.
Sans un système de validation des données, vous devriez effectuer toutes les vérifications à la main, dans le code.
@@ -182,7 +181,7 @@ C'est un outil formidable et je l'ai beaucoup utilisé aussi, avant d'avoir **Fa
/// note | Remarque
-Webargs a été créé par les développeurs de Marshmallow.
+Webargs a été créé par les mêmes développeurs de Marshmallow.
///
@@ -206,13 +205,13 @@ Et il génère des schémas OpenAPI.
C'est ainsi que cela fonctionne dans Flask, Starlette, Responder, etc.
-Mais alors, nous avons à nouveau le problème d'avoir une micro-syntaxe, dans une docstring Python (un gros morceau de YAML).
+Mais alors, nous avons à nouveau le problème d'avoir une micro-syntaxe, dans une string Python (un gros morceau de YAML).
L'éditeur ne peut guère aider en la matière. Et si nous modifions les paramètres ou les schémas Marshmallow et que nous oublions de modifier également cette docstring YAML, le schéma généré deviendrait obsolète.
/// note | Remarque
-APISpec a été créé par les développeurs de Marshmallow.
+APISpec a été créé par les mêmes développeurs de Marshmallow.
///
@@ -241,11 +240,11 @@ j'ai (ainsi que plusieurs équipes externes) utilisées jusqu'à présent :
* [https://github.com/tiangolo/full-stack-flask-couchbase](https://github.com/tiangolo/full-stack-flask-couchbase)
* [https://github.com/tiangolo/full-stack-flask-couchdb](https://github.com/tiangolo/full-stack-flask-couchdb)
-Ces mêmes générateurs full-stack ont servi de base aux [Générateurs de projets pour **FastAPI**](project-generation.md).
+Et ces mêmes générateurs full-stack ont servi de base aux [Générateurs de projets **FastAPI**](project-generation.md).
/// note | Remarque
-Flask-apispec a été créé par les développeurs de Marshmallow.
+Flask-apispec a été créé par les mêmes développeurs de Marshmallow.
///
@@ -284,9 +283,9 @@ C'était l'un des premiers frameworks Python extrêmement rapides basés sur `as
/// note | Détails techniques
-Il utilisait [`uvloop`](https://github.com/MagicStack/uvloop) au lieu du système par défaut de Python `asyncio`. C'est ce qui l'a rendu si rapide.
+Il utilisait [`uvloop`](https://github.com/MagicStack/uvloop) au lieu de la boucle par défaut de Python `asyncio`. C'est ce qui l'a rendu si rapide.
-Il a clairement inspiré Uvicorn et Starlette, qui sont actuellement plus rapides que Sanic dans les benchmarks.
+Il a clairement inspiré Uvicorn et Starlette, qui sont actuellement plus rapides que Sanic dans les benchmarks ouverts.
///
@@ -304,7 +303,7 @@ Falcon est un autre framework Python haute performance, il est conçu pour être
Il est conçu pour avoir des fonctions qui reçoivent deux paramètres, une « requête » et une « réponse ». Ensuite, vous
« lisez » des parties de la requête et « écrivez » des parties dans la réponse. En raison de cette conception, il n'est
-pas possible de déclarer des paramètres de requête et des corps avec des indications de type Python standard comme paramètres de fonction.
+pas possible de déclarer des paramètres de requête et des corps avec des annotations de type Python standard comme paramètres de fonction.
Ainsi, la validation, la sérialisation et la documentation des données doivent être effectuées dans le code, et non pas automatiquement. Ou bien elles doivent être implémentées comme un framework au-dessus de Falcon, comme Hug. Cette même distinction se retrouve dans d'autres frameworks qui s'inspirent de la conception de Falcon, qui consiste à avoir un objet de requête et un objet de réponse comme paramètres.
@@ -326,7 +325,7 @@ J'ai découvert Molten lors des premières étapes de développement de **FastAP
* Validation et documentation via ces types.
* Système d'injection de dépendances.
-Il n'utilise pas une librairie tiers de validation, sérialisation et de documentation tel que Pydantic, il utilise son propre système. Ainsi, ces définitions de types de données ne sont pas réutilisables aussi facilement.
+Il n'utilise pas une librairie tierce de validation, sérialisation et de documentation telle que Pydantic, il utilise son propre système. Ainsi, ces définitions de types de données ne sont pas réutilisables aussi facilement.
Il nécessite une configuration un peu plus verbeuse. Et comme il est basé sur WSGI (au lieu d'ASGI), il n'est pas
conçu pour profiter des hautes performances fournies par des outils comme Uvicorn, Starlette et Sanic.
@@ -363,7 +362,7 @@ Comme il est basé sur l'ancienne norme pour les frameworks web Python synchrone
/// note | Remarque
-Hug a été créé par Timothy Crosley, le créateur de [`isort`](https://github.com/timothycrosley/isort), un excellent outil pour trier automatiquement les imports dans les fichiers Python.
+Hug a été créé par Timothy Crosley, le même créateur de [`isort`](https://github.com/timothycrosley/isort), un excellent outil pour trier automatiquement les imports dans les fichiers Python.
///
@@ -388,11 +387,11 @@ et les requêtes que j'ai vues (avant NestJS et Molten). Je l'ai trouvé plus ou
Il disposait de la validation automatique, sérialisation des données et d'une génération de schéma OpenAPI basée sur les mêmes annotations de type à plusieurs endroits.
-La définition du schéma de corps de requête n'utilisait pas les mêmes annotations de type Python que Pydantic, il était un peu plus proche de Marshmallow, donc le support de l'éditeur n'était pas aussi bon, mais APIStar était quand même la meilleure option disponible.
+Les définitions de schéma de corps n'utilisaient pas les mêmes annotations de type Python que Pydantic, c'était un peu plus proche de Marshmallow, donc le support de l'éditeur n'était pas aussi bon, mais APIStar était quand même la meilleure option disponible.
Il avait les meilleures performances d'après les benchmarks de l'époque (seulement surpassé par Starlette).
-Au départ, il ne disposait pas d'une interface web de documentation automatique de l'API, mais je savais que je pouvais lui ajouter une interface Swagger.
+Au départ, il ne disposait pas d'une interface utilisateur web de documentation automatique de l'API, mais je savais que je pouvais lui ajouter Swagger UI.
Il avait un système d'injection de dépendances. Il nécessitait un pré-enregistrement des composants, comme d'autres outils discutés ci-dessus. Mais c'était quand même une excellente fonctionnalité.
@@ -422,7 +421,7 @@ L'idée de déclarer plusieurs choses (validation des données, sérialisation e
Et après avoir longtemps cherché un framework similaire et testé de nombreuses alternatives, APIStar était la meilleure option disponible.
-Puis APIStar a cessé d'exister en tant que serveur et Starlette a été créé, et a constitué une meilleure base pour un tel système. Ce fut l'inspiration finale pour construire **FastAPI**.
+Puis APIStar a cessé d'exister en tant que serveur et Starlette a été créé, et a constitué une nouvelle base meilleure pour un tel système. Ce fut l'inspiration finale pour construire **FastAPI**.
Je considère **FastAPI** comme un « successeur spirituel » d'APIStar, tout en améliorant et en augmentant les fonctionnalités, le système de typage et d'autres parties, sur la base des enseignements tirés de tous ces outils précédents.
@@ -441,7 +440,7 @@ basé sur les mêmes annotations de type Python, le support de l'éditeur est gr
/// tip | **FastAPI** l'utilise pour
-Gérer toute la validation des données, leur sérialisation et la documentation automatique du modèle (basée sur le schéma JSON).
+Gérer toute la validation des données, leur sérialisation et la documentation automatique du modèle (basée sur JSON Schema).
**FastAPI** prend ensuite ces données JSON Schema et les place dans OpenAPI, en plus de toutes les autres choses qu'il fait.
@@ -455,20 +454,20 @@ Il est très simple et intuitif. Il est conçu pour être facilement extensible
Il offre :
-- Des performances vraiment impressionnantes.
-- Le support des WebSockets.
-- Les tâches d'arrière-plan.
-- Les événements de démarrage et d'arrêt.
-- Un client de test basé sur HTTPX.
-- CORS, GZip, fichiers statiques, streaming des réponses.
-- Le support des sessions et des cookies.
-- Une couverture de test à 100 %.
-- 100 % de la base de code avec des annotations de type.
-- Peu de dépendances strictes.
+* Des performances vraiment impressionnantes.
+* Le support de WebSocket.
+* Les tâches d'arrière-plan in-process.
+* Les événements de démarrage et d'arrêt.
+* Un client de test basé sur HTTPX.
+* CORS, GZip, fichiers statiques, streaming des réponses.
+* Le support des sessions et des cookies.
+* Une couverture de test à 100 %.
+* 100 % de la base de code avec des annotations de type.
+* Peu de dépendances strictes.
Starlette est actuellement le framework Python le plus rapide testé. Seulement dépassé par Uvicorn, qui n'est pas un framework, mais un serveur.
-Starlette fournit toutes les fonctionnalités de base d'un micro‑framework web.
+Starlette fournit toutes les fonctionnalités de base d'un microframework web.
Mais il ne fournit pas de validation automatique des données, de sérialisation ou de documentation.
@@ -496,7 +495,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.
-Il ne s'agit pas d'un framework web, mais d'un serveur. Par exemple, il ne fournit pas d'outils pour le routing. C'est
+Il ne s'agit pas d'un framework web, mais d'un serveur. Par exemple, il ne fournit pas d'outils pour le routing par chemins. C'est
quelque chose qu'un framework comme Starlette (ou **FastAPI**) fournirait par-dessus.
C'est le serveur recommandé pour Starlette et **FastAPI**.
diff --git a/docs/fr/docs/async.md b/docs/fr/docs/async.md
index b3fc9169a..ccd176072 100644
--- a/docs/fr/docs/async.md
+++ b/docs/fr/docs/async.md
@@ -44,19 +44,19 @@ Si votre application (d'une certaine manière) n'a pas à communiquer avec une a
---
-Si vous ne savez pas, utilisez seulement `def`.
+Si vous ne savez pas, utilisez un `def` normal.
---
-Note : vous pouvez mélanger `def` et `async def` dans vos *fonctions de chemin d'accès* autant que nécessaire, et définir chacune avec l’option la plus adaptée pour vous. FastAPI fera ce qu'il faut avec elles.
+**Remarque** : vous pouvez mélanger `def` et `async def` dans vos *fonctions de chemin d'accès* autant que nécessaire, et définir chacune avec l’option la plus adaptée pour vous. FastAPI fera ce qu'il faut avec elles.
Au final, peu importe le cas parmi ceux ci-dessus, FastAPI fonctionnera de manière asynchrone et sera extrêmement rapide.
-Mais si vous suivez bien les instructions ci-dessus, il pourra effectuer quelques optimisations et ainsi améliorer les performances.
+Mais si vous suivez bien les étapes ci-dessus, il pourra effectuer quelques optimisations de performance.
## Détails techniques { #technical-details }
-Les versions modernes de Python supportent le **code asynchrone** grâce aux **« coroutines »** avec les syntaxes **`async` et `await`**.
+Les versions modernes de Python supportent le **« code asynchrone »** en utilisant quelque chose appelé **« coroutines »**, avec la syntaxe **`async` et `await`**.
Analysons les différentes parties de cette phrase dans les sections suivantes :
@@ -70,7 +70,7 @@ Faire du code asynchrone signifie que le langage 💬 est capable de dire à l'o
Donc, pendant ce temps, l'ordinateur pourra effectuer d'autres tâches, pendant que « slow-file » 📝 se termine.
-Ensuite l'ordinateur / le programme 🤖 reviendra à chaque fois qu'il en a la chance que ce soit parce qu'il attend à nouveau, ou car il 🤖 a fini tout le travail qu'il avait à faire. Il 🤖 regardera donc si les tâches qu'il attend ont terminé d'être effectuées.
+Ensuite l'ordinateur / le programme 🤖 reviendra à chaque fois qu'il en a la chance, parce qu'il attend à nouveau, ou quand il 🤖 a fini tout le travail qu'il avait à faire à ce moment-là. Et il 🤖 regardera si des tâches qu'il attendait ont déjà terminé, en faisant ce qu'il devait faire.
Ensuite, il 🤖 prendra la première tâche à finir (disons, notre « slow-file » 📝) et continuera à faire avec cette dernière ce qu'il était censé.
@@ -80,18 +80,18 @@ Ce « attendre quelque chose d'autre » fait généralement référence à des o
* de la donnée envoyée depuis votre programme soit reçue par le client à travers le réseau
* le contenu d'un fichier sur le disque soit lu par le système et passé à votre programme
* le contenu que votre programme a passé au système soit écrit sur le disque
-* une opération effectuée à distance par une API se termine
+* une opération effectuée à distance par une API
* une opération en base de données se termine
* une requête à une base de données renvoie un résultat
* etc.
Le temps d'exécution étant consommé majoritairement par l'attente d'opérations I/O, on appelle ceci des opérations « I/O bound ».
-Ce concept se nomme « asynchrone » car l'ordinateur / le programme n'a pas besoin d'être « synchronisé » avec la tâche, attendant le moment exact où cette dernière se terminera en ne faisant rien, pour être capable de récupérer le résultat de la tâche et l'utiliser dans la suite des opérations.
+Ce concept se nomme « asynchrone » car l'ordinateur / le programme n'a pas besoin d'être « synchronisé » avec la tâche lente, attendant le moment exact où cette dernière se terminera en ne faisant rien, pour être capable de récupérer le résultat de la tâche et l'utiliser dans la suite des opérations.
-À la place, en étant « asynchrone », une fois terminée, une tâche peut légèrement attendre (quelques microsecondes) que l'ordinateur / le programme finisse ce qu'il était en train de faire, et revienne récupérer le résultat.
+À la place, en étant un système « asynchrone », une fois terminée, la tâche peut attendre un peu dans la file (quelques microsecondes) que l'ordinateur / le programme finisse ce qu'il était en train de faire, puis revienne récupérer les résultats et continue à travailler avec eux.
-Pour parler de tâches « synchrones » (en opposition à « asynchrones »), on utilise souvent le terme « séquentiel », car l'ordinateur / le programme va effectuer toutes les étapes d'une tâche séquentiellement avant de passer à une autre tâche, même si ces étapes impliquent de l'attente.
+Pour parler de tâches « synchrones » (en opposition à « asynchrones »), on utilise souvent aussi le terme « séquentiel », car l'ordinateur / le programme va effectuer toutes les étapes d'une tâche séquentiellement avant de passer à une autre tâche, même si ces étapes impliquent de l'attente.
### Concurrence et Burgers { #concurrency-and-burgers }
@@ -99,49 +99,49 @@ L'idée de code **asynchrone** décrite ci-dessus est parfois aussi appelée **
La **concurrence** et le **parallélisme** sont tous deux liés à l'idée de « différentes choses arrivant plus ou moins au même moment ».
-Mais les détails entre la **concurrence** et le **parallélisme** diffèrent sur de nombreux points.
+Mais les détails entre la *concurrence* et le *parallélisme* sont assez différents.
-Pour expliquer la différence, voici une histoire de burgers :
+Pour expliquer la différence, imaginez l'histoire suivante à propos de burgers :
### Burgers concurrents { #concurrent-burgers }
-Vous amenez votre crush 😍 dans votre fast food 🍔 favori, et faites la queue pendant que le serveur 💁 prend les commandes des personnes devant vous.
+Vous allez avec votre crush chercher de la nourriture dans un fast food, vous faites la queue pendant que le caissier prend les commandes des personnes devant vous. 😍
-Puis vient votre tour, vous commandez alors 2 magnifiques burgers 🍔 pour votre crush 😍 et vous.
+Puis vient votre tour, vous commandez alors 2 burgers très sophistiqués pour votre crush et vous. 🍔🍔
-Le serveur 💁 dit quelque chose à son collègue dans la cuisine 👨🍳 pour qu'il sache qu'il doit préparer vos burgers 🍔 (bien qu'il soit déjà en train de préparer ceux des clients précédents).
+Le caissier dit quelque chose au cuisinier dans la cuisine pour qu'il sache qu'il doit préparer vos burgers (bien qu'il soit déjà en train de préparer ceux des clients précédents).
-Vous payez 💸.
+Vous payez. 💸
-Le serveur 💁 vous donne le numéro assigné à votre commande.
+Le caissier vous donne le numéro de votre tour.
-Pendant que vous attendez, vous allez choisir une table avec votre crush 😍, vous discutez avec votre crush 😍 pendant un long moment (les burgers étant « magnifiques » ils sont très longs à préparer ✨🍔✨).
+Pendant que vous attendez, vous allez choisir une table avec votre crush, vous vous asseyez et discutez avec votre crush pendant un long moment (vos burgers étant très sophistiqués, ils prennent du temps à préparer).
-Pendant que vous êtes assis à table, en attendant que les burgers 🍔 soient prêts, vous pouvez passer ce temps à admirer à quel point votre crush 😍 est géniale, mignonne et intelligente ✨😍✨.
+Pendant que vous êtes assis à table avec votre crush, en attendant les burgers, vous pouvez passer ce temps à admirer à quel point votre crush est géniale, mignonne et intelligente ✨😍✨.
-Pendant que vous discutez avec votre crush 😍, de temps en temps vous jetez un coup d’œil au nombre affiché au-dessus du comptoir pour savoir si c'est à votre tour d'être servis.
+Pendant que vous attendez et discutez avec votre crush, de temps en temps, vous jetez un coup d’œil au nombre affiché au-dessus du comptoir pour savoir si c'est déjà votre tour.
-Jusqu'au moment où c'est (enfin) votre tour. Vous allez au comptoir, récupérez vos burgers 🍔 et revenez à votre table.
+Puis, à un moment, c'est enfin votre tour. Vous allez au comptoir, récupérez vos burgers et revenez à votre table.
-Vous et votre crush 😍 mangez les burgers 🍔 et passez un bon moment ✨.
+Vous et votre crush mangez les burgers et passez un bon moment. ✨
/// note | Remarque
-Illustrations proposées par [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨
+Belles illustrations par [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨
///
@@ -149,103 +149,103 @@ Illustrations proposées par [Ketrina Thompson](https://www.instagram.com/ketrin
Imaginez que vous êtes l'ordinateur / le programme 🤖 dans cette histoire.
-Pendant que vous faites la queue, vous être simplement inactif 😴, attendant votre tour, ne faisant rien de « productif ». Mais la queue est rapide car le serveur 💁 prend seulement les commandes (et ne les prépare pas), donc tout va bien.
+Pendant que vous faites la queue, vous êtes simplement inactif 😴, attendant votre tour, ne faisant rien de très « productif ». Mais la queue est rapide car le caissier prend seulement les commandes (et ne les prépare pas), donc tout va bien.
-Ensuite, quand c'est votre tour, vous faites des actions « productives » 🤓, vous étudiez le menu, décidez ce que vous voulez, demandez à votre crush 😍 son choix, payez 💸, vérifiez que vous utilisez la bonne carte de crédit, vérifiez que le montant débité sur la carte est correct, vérifiez que la commande contient les bons produits, etc.
+Ensuite, quand c'est votre tour, vous faites du vrai travail « productif », vous étudiez le menu, décidez ce que vous voulez, demandez à votre crush son choix, payez, vérifiez que vous donnez le bon billet ou la bonne carte, vérifiez que le montant débité est correct, vérifiez que la commande contient les bons produits, etc.
-Mais ensuite, même si vous n'avez pas encore vos burgers 🍔, votre travail avec le serveur 💁 est « en pause » ⏸, car vous devez attendre 🕙 que vos burgers soient prêts.
+Mais ensuite, même si vous n'avez toujours pas vos burgers, votre travail avec le caissier est « en pause » ⏸, car vous devez attendre 🕙 que vos burgers soient prêts.
-Après vous être écarté du comptoir et vous être assis à votre table avec le numéro de votre commande, vous pouvez tourner 🔀 votre attention vers votre crush 😍, et « travailler » ⏯ 🤓 là-dessus. Vous êtes donc à nouveau en train de faire quelque chose de « productif » 🤓, vous flirtez avec votre crush 😍.
+Mais lorsque vous vous écartez du comptoir et vous asseyez à table avec un numéro pour votre tour, vous pouvez tourner 🔀 votre attention vers votre crush, et « travailler » ⏯ 🤓 là-dessus. Vous êtes donc à nouveau en train de faire quelque chose de très « productif », comme flirter avec votre crush 😍.
-Puis le serveur 💁 dit « J'ai fini de préparer les burgers » 🍔 en mettant votre numéro sur l'affichage du comptoir, mais vous ne courez pas immédiatement au moment où votre numéro s'affiche. Vous savez que personne ne volera vos burgers 🍔 car vous avez votre numéro et les autres clients ont le leur.
+Puis le caissier 💁 dit « J'ai fini de faire les burgers » en mettant votre numéro sur l'affichage du comptoir, mais vous ne sautez pas comme un fou immédiatement quand le numéro affiché change pour devenir votre numéro. Vous savez que personne ne volera vos burgers car vous avez le numéro de votre tour, et les autres ont le leur.
-Vous attendez donc que votre crush 😍 finisse son histoire, souriez gentiment et dites que vous allez chercher les burgers ⏸.
+Vous attendez donc que votre crush finisse son histoire (termine le travail actuel ⏯ / la tâche en cours de traitement 🤓), souriez gentiment et dites que vous allez chercher les burgers ⏸.
-Pour finir vous allez au comptoir 🔀, vers la tâche initiale qui est désormais terminée ⏯, récupérez les burgers 🍔, remerciez le serveur et ramenez les burgers 🍔 à votre table. Ceci termine l'étape / la tâche d'interaction avec le comptoir ⏹. Ce qui ensuite, crée une nouvelle tâche de « manger les burgers » 🔀 ⏯, mais la précédente, « récupérer les burgers » est terminée ⏹.
+Puis vous allez au comptoir 🔀, vers la tâche initiale qui est désormais terminée ⏯, récupérez les burgers, remerciez et ramenez les burgers à votre table. Ceci termine l'étape / la tâche d'interaction avec le comptoir ⏹. Ce qui ensuite crée une nouvelle tâche, « manger les burgers » 🔀 ⏯, mais la précédente, « récupérer les burgers », est terminée ⏹.
### Burgers parallèles { #parallel-burgers }
-Imaginons désormais que ce ne sont pas des « burgers concurrents » mais des « burgers parallèles ».
+Imaginons désormais que ce ne sont pas des « Burgers concurrents » mais des « Burgers parallèles ».
-Vous allez avec votre crush 😍 dans un fast food 🍔 parallélisé.
+Vous allez avec votre crush chercher de la nourriture dans un fast food parallèle.
-Vous attendez pendant que plusieurs (disons 8) serveurs qui sont aussi des cuisiniers 👨🍳👨🍳👨🍳👨🍳👨🍳👨🍳👨🍳👨🍳 prennent les commandes des personnes devant vous.
+Vous attendez pendant que plusieurs (disons 8) caissiers qui sont en même temps cuisiniers prennent les commandes des personnes devant vous.
-Chaque personne devant vous attend 🕙 que son burger 🍔 soit prêt avant de quitter le comptoir car chacun des 8 serveurs va lui-même préparer le burger directement avant de prendre la commande suivante.
+Chaque personne devant vous attend que son burger soit prêt avant de quitter le comptoir car chacun des 8 caissiers va préparer le burger directement avant de prendre la commande suivante.
-Puis c'est enfin votre tour, vous commandez 2 magnifiques burgers 🍔 pour vous et votre crush 😍.
+Puis c'est enfin votre tour, vous commandez 2 burgers très sophistiqués pour vous et votre crush.
Vous payez 💸.
-Le serveur va dans la cuisine 👨🍳.
+Le caissier va dans la cuisine.
-Vous attendez devant le comptoir afin que personne ne prenne vos burgers 🍔 avant vous, vu qu'il n'y a pas de numéro de commande.
+Vous attendez, debout devant le comptoir 🕙, afin que personne d'autre ne prenne vos burgers avant vous, vu qu'il n'y a pas de numéros pour les tours.
-Vous et votre crush 😍 étant occupés à vérifier que personne ne passe devant vous prendre vos burgers au moment où ils arriveront 🕙, vous ne pouvez pas vous préoccuper de votre crush 😞.
+Vous et votre crush étant occupés à ne laisser personne passer devant vous et prendre vos burgers au moment où ils arriveront, vous ne pouvez pas prêter attention à votre crush. 😞
-C'est du travail « synchrone », vous être « synchronisés » avec le serveur/cuisinier 👨🍳. Vous devez attendre 🕙 et être présent au moment exact où le serveur/cuisinier 👨🍳 finira les burgers 🍔 et vous les donnera, sinon quelqu'un risque de vous les prendre.
+C'est du travail « synchrone », vous être « synchronisés » avec le caissier/cuisinier 👨🍳. Vous devez attendre 🕙 et être présent au moment exact où le caissier/cuisinier 👨🍳 finira les burgers et vous les donnera, sinon quelqu'un d'autre risque de vous les prendre.
-Puis le serveur/cuisinier 👨🍳 revient enfin avec vos burgers 🍔, après un long moment d'attente 🕙 devant le comptoir.
+Puis votre caissier/cuisinier 👨🍳 revient enfin avec vos burgers, après un long moment d'attente 🕙 devant le comptoir.
-Vous prenez vos burgers 🍔 et allez à une table avec votre crush 😍
+Vous prenez vos burgers et allez à une table avec votre crush.
-Vous les mangez, et vous avez terminé 🍔 ⏹.
+Vous les mangez simplement, et vous avez terminé. ⏹
-Durant tout ce processus, il n'y a presque pas eu de discussions ou de flirts car la plupart de votre temps à été passé à attendre 🕙 devant le comptoir 😞.
+Il n'y a pas eu beaucoup de discussions ou de flirts car la plupart du temps a été passé à attendre 🕙 devant le comptoir. 😞
/// note | Remarque
-Illustrations proposées par [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨
+Belles illustrations par [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨
///
---
-Dans ce scénario de burgers parallèles, vous êtes un ordinateur / programme 🤖 avec deux processeurs (vous et votre crush 😍) attendant 🕙 à deux et dédiant votre attention ⏯ à « attendre devant le comptoir » 🕙 pour une longue durée.
+Dans ce scénario de burgers parallèles, vous êtes un ordinateur / programme 🤖 avec deux processeurs (vous et votre crush), tous deux attendant 🕙 et dédiant leur attention ⏯ à « attendre devant le comptoir » 🕙 pour une longue durée.
-Le fast-food a 8 processeurs (serveurs/cuisiniers) 👨🍳👨🍳👨🍳👨🍳👨🍳👨🍳👨🍳👨🍳. Alors que le fast-food de burgers concurrents en avait 2 (un serveur et un cuisinier).
+Le fast food a 8 processeurs (caissiers/cuisiniers). Alors que le fast food de burgers concurrents aurait pu n'en avoir que 2 (un caissier et un cuisinier).
-Et pourtant l'expérience finale n'est pas meilleure 😞.
+Mais tout de même, l'expérience finale n'est pas la meilleure. 😞
---
-C'est donc l'histoire équivalente parallèle pour les burgers 🍔.
+Ce serait donc l'histoire équivalente parallèle pour les burgers. 🍔
-Pour un exemple plus courant dans la « vie réelle », imaginez une banque.
+Pour un exemple plus « vie réelle », imaginez une banque.
-Jusqu'à récemment, la plupart des banques avaient plusieurs caisses (et banquiers) 👨💼👨💼👨💼👨💼 et une unique file d'attente 🕙🕙🕙🕙🕙🕙🕙🕙.
+Jusqu'à récemment, la plupart des banques avaient plusieurs caissiers 👨💼👨💼👨💼👨💼 et une grande file d'attente 🕙🕙🕙🕙🕙🕙🕙🕙.
-Tous les banquiers faisaient l'intégralité du travail avec chaque client avant de passer au suivant 👨💼⏯.
+Tous les caissiers faisaient tout le travail avec chaque client avant de passer au suivant 👨💼⏯.
-Et vous deviez attendre 🕙 dans la file pendant un long moment ou vous perdiez votre place.
+Et vous devez attendre 🕙 dans la file pendant un long moment ou vous perdez votre tour.
-Vous n'auriez donc probablement pas envie d'amener votre crush 😍 avec vous à la banque 🏦.
+Vous n'auriez donc probablement pas envie d'amener votre crush 😍 avec vous pour faire des démarches à la banque 🏦.
### Conclusion sur les burgers { #burger-conclusion }
-Dans ce scénario des « burgers du fast-food avec votre crush », comme il y a beaucoup d'attente 🕙, il est très logique d'avoir un système concurrent ⏸🔀⏯.
+Dans ce scénario des « burgers de fast food avec votre crush », comme il y a beaucoup d'attente 🕙, il est beaucoup plus logique d'avoir un système concurrent ⏸🔀⏯.
-Et c'est le cas pour la plupart des applications web.
+C'est le cas pour la plupart des applications web.
-Vous aurez de nombreux, nombreux utilisateurs, mais votre serveur attendra 🕙 que leur connexion peu performante envoie des requêtes.
+De très, très nombreux utilisateurs, mais votre serveur attend 🕙 que leur connexion pas très bonne envoie leurs requêtes.
-Puis vous attendrez 🕙 de nouveau que leurs réponses reviennent.
+Puis attend 🕙 de nouveau que les réponses reviennent.
-Cette « attente » 🕙 se mesure en microsecondes, mais tout de même, en cumulé cela fait beaucoup d'attente.
+Cette « attente » 🕙 se mesure en microsecondes, mais tout de même, en les cumulant toutes, cela fait beaucoup d'attente au final.
-C'est pourquoi il est logique d'utiliser du code asynchrone ⏸🔀⏯ pour des APIs web.
+C'est pourquoi il est très logique d'utiliser du code asynchrone ⏸🔀⏯ pour des APIs web.
Ce type d'asynchronicité est ce qui a rendu NodeJS populaire (bien que NodeJS ne soit pas parallèle) et c'est la force de Go en tant que langage de programmation.
@@ -255,11 +255,11 @@ Et comme on peut avoir du parallélisme et de l'asynchronicité en même temps,
### Est-ce que la concurrence est mieux que le parallélisme ? { #is-concurrency-better-than-parallelism }
-Nope ! C'est ça la morale de l'histoire.
+Nope ! Ce n'est pas la morale de l'histoire.
-La concurrence est différente du parallélisme. C'est mieux sur des scénarios **spécifiques** qui impliquent beaucoup d'attente. À cause de ça, c'est généralement bien meilleur que le parallélisme pour le développement d'applications web. Mais pas pour tout.
+La concurrence est différente du parallélisme. Et c'est mieux dans des scénarios **spécifiques** qui impliquent beaucoup d'attente. À cause de ça, c'est généralement bien meilleur que le parallélisme pour le développement d'applications web. Mais pas pour tout.
-Donc pour équilibrer tout ça, imaginez l'histoire suivante :
+Donc pour équilibrer tout ça, imaginez l'histoire courte suivante :
> Vous devez nettoyer une grande et sale maison.
@@ -269,42 +269,42 @@ Donc pour équilibrer tout ça, imaginez l'histoire suivante :
Il n'y a plus d'attente 🕙 nulle part, juste beaucoup de travail à effectuer, dans différentes pièces de la maison.
-Vous pourriez diviser en différentes sections comme avec les burgers, d'abord le salon, puis la cuisine, etc. Mais vous n'attendez 🕙 rien, vous ne faites que nettoyer et nettoyer, la séparation en sections ne changerait rien au final.
+Vous pourriez avoir des tours comme dans l'exemple des burgers, d'abord le salon, puis la cuisine, mais comme vous n'attendez 🕙 rien, vous ne faites que nettoyer et nettoyer, les tours ne changeraient rien.
-Cela prendrait autant de temps pour finir avec ou sans sections (concurrence) et vous auriez effectué la même quantité de travail.
+Cela prendrait autant de temps pour finir avec ou sans tours (concurrence) et vous auriez effectué la même quantité de travail.
-Mais dans ce cas, si pouviez amener 8 ex-serveurs/cuisiniers/devenus-nettoyeurs 👨🍳👨🍳👨🍳👨🍳👨🍳👨🍳👨🍳👨🍳, et que chacun d'eux (plus vous) pouvait prendre une zone de la maison pour la nettoyer, vous pourriez faire tout le travail en parallèle, et finir plus tôt.
+Mais dans ce cas, si vous pouviez amener les 8 ex-caissiers/cuisiniers/désormais-nettoyeurs, et que chacun d'eux (plus vous) pouvait prendre une zone de la maison pour la nettoyer, vous pourriez faire tout le travail en **parallèle**, avec l'aide supplémentaire, et finir beaucoup plus tôt.
Dans ce scénario, chacun des nettoyeurs (vous y compris) serait un processeur, faisant sa partie du travail.
-Et comme la plupart du temps d'exécution est pris par du « vrai » travail (et non de l'attente), et que le travail dans un ordinateur est fait par un CPU, ce sont des problèmes dits « CPU bound ».
+Et comme la plupart du temps d'exécution est pris par du vrai travail (et non de l'attente), et que le travail dans un ordinateur est fait par un CPU, ce sont des problèmes dits « CPU bound ».
---
-Des exemples communs d'opérations « CPU bound » sont les procédés qui requièrent des traitements mathématiques complexes.
+Des exemples communs d'opérations CPU bound sont les choses qui requièrent des traitements mathématiques complexes.
Par exemple :
-* Traitements d'**audio** et d'**images**.
-* La **vision par ordinateur** : une image est composée de millions de pixels, chaque pixel ayant 3 valeurs / couleurs, les traiter tous va nécessiter d'effectuer des traitements sur chaque pixel, et de préférence tous en même temps.
-* L'apprentissage automatique (ou **Machine Learning**) : cela nécessite de nombreuses multiplications de matrices et vecteurs. Imaginez une énorme feuille de calcul remplie de nombres que vous multiplierez entre eux tous au même moment.
-* L'apprentissage profond (ou **Deep Learning**) : est un sous-domaine du **Machine Learning**, donc les mêmes raisons s'appliquent. Avec la différence qu'il n'y a pas une unique feuille de calcul de nombres à multiplier, mais une énorme quantité d'entre elles, et dans de nombreux cas, on utilise un processeur spécial pour construire et / ou utiliser ces modèles.
+* Traitements d'**audio** ou d'**images**.
+* **Computer vision** : une image est composée de millions de pixels, chaque pixel ayant 3 valeurs / couleurs, les traiter nécessite normalement d'effectuer des calculs sur ces pixels, tous en même temps.
+* **Machine Learning** : cela nécessite normalement de nombreuses multiplications de « matrices » et de « vecteurs ». Imaginez une énorme feuille de calcul remplie de nombres et les multiplier tous ensemble au même moment.
+* **Deep Learning** : c'est un sous-domaine du Machine Learning, donc les mêmes raisons s'appliquent. C'est juste qu'il n'y a pas une unique feuille de calcul de nombres à multiplier, mais une énorme quantité d'entre elles, et dans de nombreux cas, on utilise un processeur spécial pour construire et / ou utiliser ces modèles.
### Concurrence + Parallélisme : Web + Machine Learning { #concurrency-parallelism-web-machine-learning }
-Avec **FastAPI** vous pouvez bénéficier de la concurrence qui est très courante en développement web (c'est l'attrait principal de NodeJS).
+Avec **FastAPI** vous pouvez bénéficier de la concurrence qui est très courante en développement web (le même attrait principal de NodeJS).
-Mais vous pouvez aussi profiter du parallélisme et du multiprocessing (plusieurs processus s'exécutant en parallèle) afin de gérer des charges **CPU bound** qui sont récurrentes dans les systèmes de *Machine Learning*.
+Mais vous pouvez aussi profiter du parallélisme et du multiprocessing (plusieurs processus s'exécutant en parallèle) afin de gérer des charges **CPU bound** comme celles des systèmes de Machine Learning.
-Ça, ajouté au fait que Python soit le langage le plus populaire pour la **Data Science**, le **Machine Learning** et surtout le **Deep Learning**, font de **FastAPI** un très bon choix pour les APIs et applications de **Data Science** / **Machine Learning**.
+Ça, ajouté au simple fait que Python soit le langage principal pour la **Data Science**, le Machine Learning et surtout le Deep Learning, fait de FastAPI un très bon choix pour les APIs web et applications de Data Science / Machine Learning (entre autres).
-Pour comprendre comment mettre en place ce parallélisme en production, allez lire la section [Déploiement](deployment/index.md).
+Pour comprendre comment mettre en place ce parallélisme en production, consultez la section sur le [Déploiement](deployment/index.md).
## `async` et `await` { #async-and-await }
-Les versions modernes de Python ont une manière très intuitive de définir le code asynchrone, tout en gardant une apparence de code « séquentiel » classique en laissant Python faire l'attente pour vous au bon moment.
+Les versions modernes de Python ont une manière très intuitive de définir le code asynchrone. Cela le fait ressembler à du code « séquentiel » normal et effectue l'« attente » pour vous aux bons moments.
-Pour une opération qui nécessite de l'attente avant de donner un résultat et qui supporte ces nouvelles fonctionnalités Python, vous pouvez l'utiliser comme tel :
+Pour une opération qui nécessite de l'attente avant de donner un résultat et qui supporte ces nouvelles fonctionnalités Python, vous pouvez l'écrire comme ceci :
```Python
burgers = await get_burgers(2)
@@ -312,7 +312,7 @@ burgers = await get_burgers(2)
Le mot-clé important ici est `await`. Il informe Python qu'il faut attendre ⏸ que `get_burgers(2)` finisse d'effectuer ses opérations 🕙 avant de stocker les résultats dans la variable `burgers`. Grâce à cela, Python saura qu'il peut aller effectuer d'autres opérations 🔀 ⏯ pendant ce temps (comme par exemple recevoir une autre requête).
-Pour que `await` fonctionne, il doit être placé dans une fonction qui supporte l'asynchronicité. Pour que ça soit le cas, il faut déclarer cette dernière avec `async def` :
+Pour que `await` fonctionne, il doit être placé dans une fonction qui supporte cette asynchronicité. Pour que ça soit le cas, il faut déclarer cette dernière avec `async def` :
```Python hl_lines="1"
async def get_burgers(number: int):
@@ -320,7 +320,7 @@ async def get_burgers(number: int):
return burgers
```
-... et non `def` :
+... au lieu de `def` :
```Python hl_lines="2"
# Ceci n'est pas asynchrone
@@ -331,16 +331,16 @@ def get_sequential_burgers(number: int):
Avec `async def`, Python sait que dans cette fonction il doit prendre en compte les expressions `await`, et qu'il peut mettre en pause ⏸ l'exécution de la fonction pour aller faire autre chose 🔀 avant de revenir.
-Pour appeler une fonction définie avec `async def`, vous devez utiliser `await`. Donc ceci ne marche pas :
+Lorsque vous voulez appeler une fonction `async def`, vous devez l'« attendre ». Donc ceci ne marche pas :
```Python
-# Ceci ne fonctionne pas, car get_burgers a été défini avec async def
+# Ceci ne fonctionne pas, car get_burgers a été défini avec : async def
burgers = get_burgers(2)
```
---
-Donc, si vous utilisez une bibliothèque qui nécessite que ses fonctions soient appelées avec `await`, vous devez définir la *fonction de chemin d'accès* en utilisant `async def` comme dans :
+Donc, si vous utilisez une bibliothèque qui vous indique que vous pouvez l'appeler avec `await`, vous devez créer les *fonctions de chemin d'accès* qui l'utilisent avec `async def`, comme dans :
```Python hl_lines="2-3"
@app.get('/burgers')
@@ -351,13 +351,13 @@ async def read_burgers():
### Plus de détails techniques { #more-technical-details }
-Vous avez donc compris que `await` peut seulement être utilisé dans des fonctions définies avec `async def`.
+Vous avez peut-être remarqué que `await` peut seulement être utilisé dans des fonctions définies avec `async def`.
-Mais en même temps, les fonctions définies avec `async def` doivent être appelées avec `await` et donc dans des fonctions définies elles aussi avec `async def`.
+Mais en même temps, les fonctions définies avec `async def` doivent être « attendues ». Donc, les fonctions avec `async def` peuvent seulement être appelées à l'intérieur de fonctions définies elles aussi avec `async def`.
-Vous avez donc remarqué ce paradoxe d'œuf et de la poule, comment appelle-t-on la première fonction `async` ?
+Donc, à propos de l'œuf et de la poule, comment appelle-t-on la première fonction `async` ?
-Si vous utilisez **FastAPI**, pas besoin de vous en inquiéter, car cette « première » fonction sera votre *fonction de chemin d'accès* ; et **FastAPI** saura comment arriver au résultat attendu.
+Si vous utilisez **FastAPI**, pas besoin de vous en inquiéter, car cette « première » fonction sera votre *fonction de chemin d'accès*, et FastAPI saura comment faire ce qu'il faut.
Mais si vous souhaitez utiliser `async` / `await` sans FastAPI, vous pouvez également le faire.
@@ -367,7 +367,7 @@ Starlette (et **FastAPI**) s’appuie sur [AnyIO](https://anyio.readthedocs.io/e
En particulier, vous pouvez utiliser directement [AnyIO](https://anyio.readthedocs.io/en/stable/) pour vos cas d’usage de concurrence avancés qui nécessitent des schémas plus élaborés dans votre propre code.
-Et même si vous n’utilisiez pas FastAPI, vous pourriez aussi écrire vos propres applications async avec [AnyIO](https://anyio.readthedocs.io/en/stable/) pour une grande compatibilité et pour bénéficier de ses avantages (par ex. la « structured concurrency »).
+Et même si vous n’utilisiez pas FastAPI, vous pourriez aussi écrire vos propres applications async avec [AnyIO](https://anyio.readthedocs.io/en/stable/) pour une grande compatibilité et pour bénéficier de ses avantages (par ex. la *structured concurrency*).
J’ai créé une autre bibliothèque au-dessus d’AnyIO, comme une fine surcouche, pour améliorer un peu les annotations de type et obtenir une meilleure **autocomplétion**, des **erreurs en ligne**, etc. Elle propose également une introduction et un tutoriel accessibles pour vous aider à **comprendre** et écrire **votre propre code async** : [Asyncer](https://asyncer.tiangolo.com/). Elle sera particulièrement utile si vous devez **combiner du code async avec du code classique** (bloquant/synchrone).
@@ -377,25 +377,25 @@ L'utilisation d'`async` et `await` est relativement nouvelle dans ce langage.
Mais cela rend la programmation asynchrone bien plus simple.
-Cette même syntaxe (ou presque) a aussi été incluse récemment dans les versions modernes de JavaScript (dans les navigateurs et NodeJS).
+Cette même syntaxe (ou presque) a aussi été incluse récemment dans les versions modernes de JavaScript (dans le navigateur et NodeJS).
Mais avant ça, gérer du code asynchrone était bien plus complexe et difficile.
-Dans les versions précédentes de Python, vous auriez utilisé des threads ou [Gevent](https://www.gevent.org/). Mais le code aurait été bien plus difficile à comprendre, débugger, et concevoir.
+Dans les versions précédentes de Python, vous auriez pu utiliser des threads ou [Gevent](https://www.gevent.org/). Mais le code est bien plus difficile à comprendre, débugger, et concevoir.
-Dans les versions précédentes de JavaScript côté navigateur / NodeJS, vous auriez utilisé des « callbacks ». Menant potentiellement à ce que l'on appelle le « callback hell ».
+Dans les versions précédentes de NodeJS / JavaScript de navigateur, vous auriez utilisé des « callbacks ». Ce qui mène au « callback hell ».
## Coroutines { #coroutines }
-« Coroutine » est juste un terme élaboré pour désigner ce qui est retourné par une fonction définie avec `async def`. Python sait que c'est comme une fonction classique qui va démarrer à un moment et terminer à un autre, mais qu'elle peut aussi être mise en pause ⏸, du moment qu'il y a un `await` dans son contenu.
+**Coroutine** est juste un terme élaboré pour désigner ce qui est retourné par une fonction définie avec `async def`. Python sait que c'est comme une fonction, qui peut démarrer et qui se terminera à un moment, mais qu'elle peut aussi être mise en pause ⏸ en interne, quand il y a un `await` à l'intérieur.
Mais toutes ces fonctionnalités d'utilisation de code asynchrone avec `async` et `await` sont souvent résumées comme l'utilisation des « coroutines ». On peut comparer cela à la principale fonctionnalité clé de Go, les « Goroutines ».
## Conclusion { #conclusion }
-Reprenons la phrase du début de la page :
+Reprenons la même phrase ci-dessus :
-> Les versions modernes de Python supportent le **code asynchrone** grâce aux **« coroutines »** avec les syntaxes **`async` et `await`**.
+> Les versions modernes de Python supportent le **« code asynchrone »** en utilisant quelque chose appelé **« coroutines »**, avec la syntaxe **`async` et `await`**.
Ceci devrait être plus compréhensible désormais. ✨
@@ -409,25 +409,25 @@ Vous pouvez probablement ignorer cela.
Ce sont des détails très poussés sur comment **FastAPI** fonctionne en arrière-plan.
-Si vous avez de bonnes connaissances techniques (coroutines, threads, code bloquant, etc.) et êtes curieux de comment **FastAPI** gère `async def` versus le `def` classique, cette partie est faite pour vous.
+Si vous avez de bonnes connaissances techniques (coroutines, threads, code bloquant, etc.) et êtes curieux de comment FastAPI gère `async def` versus le `def` classique, cette partie est faite pour vous.
///
### Fonctions de chemin d'accès { #path-operation-functions }
-Quand vous déclarez une *fonction de chemin d'accès* avec un `def` normal et non `async def`, elle est exécutée dans un groupe de threads (threadpool) externe qui est ensuite attendu, plutôt que d'être appelée directement (car cela bloquerait le serveur).
+Quand vous déclarez une *fonction de chemin d'accès* avec un `def` normal et non `async def`, elle est exécutée dans une threadpool externe qui est ensuite attendue, plutôt que d'être appelée directement (car cela bloquerait le serveur).
-Si vous venez d'un autre framework asynchrone qui ne fonctionne pas comme de la façon décrite ci-dessus et que vous êtes habitué à définir des *fonctions de chemin d'accès* basiques et purement calculatoires avec un simple `def` pour un faible gain de performance (environ 100 nanosecondes), veuillez noter que dans **FastAPI**, l'effet serait plutôt contraire. Dans ces cas-là, il vaut mieux utiliser `async def` à moins que votre *fonction de chemin d'accès* utilise du code qui effectue des opérations I/O bloquantes.
+Si vous venez d'un autre framework async qui ne fonctionne pas de la façon décrite ci-dessus et que vous êtes habitué à définir des *fonctions de chemin d'accès* triviales faisant uniquement du calcul avec un simple `def` pour un faible gain de performance (environ 100 nanosecondes), veuillez noter que dans **FastAPI**, l'effet serait plutôt contraire. Dans ces cas-là, il vaut mieux utiliser `async def` à moins que vos *fonctions de chemin d'accès* utilisent du code qui effectue des opérations I/O bloquantes.
-Au final, dans les deux situations, il est fort probable que **FastAPI** soit tout de même [plus rapide](index.md#performance) que (ou au moins de vitesse égale à) votre framework précédent.
+Au final, dans les deux situations, il est fort probable que **FastAPI** soit [tout de même plus rapide](index.md#performance) que (ou au moins comparable à) votre framework précédent.
### Dépendances { #dependencies }
-La même chose s'applique aux [dépendances](tutorial/dependencies/index.md). Si une dépendance est définie avec `def` plutôt que `async def`, elle est exécutée dans la threadpool externe.
+La même chose s'applique aux [dépendances](tutorial/dependencies/index.md). Si une dépendance est une fonction standard `def` plutôt qu'`async def`, elle est exécutée dans la threadpool externe.
### Sous-dépendances { #sub-dependencies }
-Vous pouvez avoir de multiples dépendances et [sous-dépendances](tutorial/dependencies/sub-dependencies.md) dépendant les unes des autres (en tant que paramètres de la définition de la *fonction de chemin d'accès*), certaines créées avec `async def` et d'autres avec `def`. Cela fonctionnerait aussi, et celles définies avec un simple `def` seraient exécutées sur un thread externe (venant de la threadpool) plutôt que d'être « attendues ».
+Vous pouvez avoir de multiples dépendances et [sous-dépendances](tutorial/dependencies/sub-dependencies.md) dépendant les unes des autres (en tant que paramètres des définitions des fonctions), certaines créées avec `async def` et d'autres avec un `def` normal. Cela fonctionnerait aussi, et celles définies avec un `def` normal seraient appelées sur un thread externe (venant de la threadpool) plutôt que d'être « attendues ».
### Autres fonctions utilitaires { #other-utility-functions }
@@ -435,10 +435,10 @@ Toute autre fonction utilitaire que vous appelez directement peut être créée
Contrairement aux fonctions que FastAPI appelle pour vous : les *fonctions de chemin d'accès* et dépendances.
-Si votre fonction utilitaire est une fonction classique définie avec `def`, elle sera appelée directement (telle qu'écrite dans votre code), pas dans une threadpool ; si la fonction est définie avec `async def` alors vous devrez attendre (avec `await`) que cette fonction se termine avant de passer à la suite du code.
+Si votre fonction utilitaire est une fonction classique définie avec `def`, elle sera appelée directement (telle qu'écrite dans votre code), pas dans une threadpool ; si la fonction est définie avec `async def` alors vous devez `await` cette fonction lorsque vous l'appelez dans votre code.
---
Encore une fois, ce sont des détails très techniques qui peuvent être utiles si vous venez ici les chercher.
-Sinon, les instructions de la section Vous êtes pressés ? ci-dessus sont largement suffisantes.
+Sinon, les instructions de la section ci-dessus sont largement suffisantes : Vous êtes pressés ?.
diff --git a/docs/fr/docs/deployment/cloud.md b/docs/fr/docs/deployment/cloud.md
index 1ed030f0a..368966372 100644
--- a/docs/fr/docs/deployment/cloud.md
+++ b/docs/fr/docs/deployment/cloud.md
@@ -1,6 +1,6 @@
# Déployer FastAPI sur des fournisseurs cloud { #deploy-fastapi-on-cloud-providers }
-Vous pouvez utiliser pratiquement n'importe quel fournisseur cloud pour déployer votre application FastAPI.
+Vous pouvez utiliser pratiquement **n'importe quel fournisseur cloud** pour déployer votre application FastAPI.
Dans la plupart des cas, les principaux fournisseurs cloud proposent des guides pour déployer FastAPI avec leurs services.
@@ -16,7 +16,7 @@ FastAPI Cloud est le sponsor principal et le financeur des projets open source *
## Fournisseurs cloud - Sponsors { #cloud-providers-sponsors }
-D'autres fournisseurs cloud ✨ [**parrainent FastAPI**](../help-fastapi.md#sponsor-the-author) ✨ également. 🙇
+Certains autres fournisseurs cloud ✨ [**parrainent FastAPI**](https://github.com/sponsors/tiangolo) ✨ également. 🙇
Vous pouvez également envisager ces fournisseurs pour suivre leurs guides et essayer leurs services :
diff --git a/docs/fr/docs/deployment/concepts.md b/docs/fr/docs/deployment/concepts.md
index 1d5497d93..d6940c683 100644
--- a/docs/fr/docs/deployment/concepts.md
+++ b/docs/fr/docs/deployment/concepts.md
@@ -1,5 +1,6 @@
# Concepts de déploiement { #deployments-concepts }
+
Lorsque vous déployez une application **FastAPI**, ou en fait n'importe quel type de web API, il existe plusieurs concepts qui vous importent probablement, et en les utilisant vous pouvez trouver la manière la **plus appropriée** de **déployer votre application**.
Parmi les concepts importants, on trouve :
diff --git a/docs/fr/docs/deployment/docker.md b/docs/fr/docs/deployment/docker.md
index 1567e1d58..688f3b5d8 100644
--- a/docs/fr/docs/deployment/docker.md
+++ b/docs/fr/docs/deployment/docker.md
@@ -132,7 +132,7 @@ Successfully installed fastapi pydantic
diff --git a/docs/fr/docs/index.md b/docs/fr/docs/index.md
index 4c5bea3e4..ccc00236a 100644
--- a/docs/fr/docs/index.md
+++ b/docs/fr/docs/index.md
@@ -45,7 +45,7 @@ Les principales fonctionnalités sont :
* **Rapide** : très hautes performances, au niveau de **NodeJS** et **Go** (grâce à Starlette et Pydantic). [L'un des frameworks Python les plus rapides](#performance).
* **Rapide à coder** : augmente la vitesse de développement des fonctionnalités d'environ 200 % à 300 %. *
* **Moins de bugs** : réduit d'environ 40 % les erreurs induites par le développeur. *
-* **Intuitif** : excellente compatibilité avec les éditeurs. Autocomplétion partout. Moins de temps passé à déboguer.
+* **Intuitif** : excellente compatibilité avec les éditeurs. Autocomplétion partout. Moins de temps passé à déboguer.
* **Facile** : conçu pour être facile à utiliser et à apprendre. Moins de temps passé à lire les documents.
* **Concis** : diminue la duplication de code. Plusieurs fonctionnalités à partir de chaque déclaration de paramètre. Moins de bugs.
* **Robuste** : obtenez un code prêt pour la production. Avec une documentation interactive automatique.
@@ -143,7 +143,7 @@ Les principales fonctionnalités sont :
---
-« _Si quelqu’un cherche à construire une API Python de production, je recommande vivement **FastAPI**. Il est **magnifiquement conçu**, **simple à utiliser** et **hautement scalable** — il est devenu un **composant clé** de notre stratégie de développement API-first._ »
+« _Si quelqu’un cherche à construire une API Python de production, je recommande vivement **FastAPI**. Il est **magnifiquement conçu**, **simple à utiliser** et **hautement scalable**, il est devenu un **composant clé** de notre stratégie de développement API-first et alimente de nombreuses automatisations et services tels que notre Virtual TAC Engineer._ »
@@ -532,4 +532,16 @@ De la même manière que vous pouvez inclure un `APIRouter` dans une application
router.include_router(other_router)
```
-Vous devez vous assurer de le faire avant d'inclure `router` dans l'application `FastAPI`, afin que les *chemins d'accès* de `other_router` soient également inclus.
+Vous pouvez le faire avant ou après avoir inclus `router` dans l'application `FastAPI`. FastAPI inclura quand même les *chemins d'accès* de `other_router` dans le routage et dans OpenAPI.
+
+Il en va de même pour les *chemins d'accès* ajoutés plus tard aux routeurs. Ils seront visibles via l'inclusion antérieure également.
+
+/// warning | Détails techniques
+
+Évitez de modifier directement `router.routes` après avoir inclus un routeur. FastAPI considère l'inclusion d'un routeur comme « en direct », de sorte que le routeur original et ses routes restent utilisés pour le routage et la génération d'OpenAPI.
+
+Utilisez les API documentées comme les décorateurs de *chemin d'accès* et `.include_router()` pour ajouter des routes et des routeurs.
+
+Considérez `router.routes` comme un arbre de routes de plus bas niveau pouvant contenir des définitions de routes et des routeurs inclus, et évitez de vous y fier comme à une liste plate de *chemins d'accès* finaux.
+
+///
diff --git a/docs/fr/docs/tutorial/body-multiple-params.md b/docs/fr/docs/tutorial/body-multiple-params.md
index 1c1ab0fca..d8d1af94f 100644
--- a/docs/fr/docs/tutorial/body-multiple-params.md
+++ b/docs/fr/docs/tutorial/body-multiple-params.md
@@ -108,7 +108,7 @@ Par exemple :
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info
+/// note | Remarque
`Body` possède également les mêmes paramètres supplémentaires de validation et de métadonnées que `Query`, `Path` et d'autres que vous verrez plus tard.
@@ -123,7 +123,7 @@ Par défaut, **FastAPI** attendra alors son contenu directement.
Mais si vous voulez qu'il attende un JSON avec une clé `item` contenant le contenu du modèle, comme lorsqu'on déclare des paramètres supplémentaires du corps de la requête, vous pouvez utiliser le paramètre spécial `embed` de `Body` :
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
comme dans :
diff --git a/docs/fr/docs/tutorial/body-nested-models.md b/docs/fr/docs/tutorial/body-nested-models.md
index 2d4064310..051317a8c 100644
--- a/docs/fr/docs/tutorial/body-nested-models.md
+++ b/docs/fr/docs/tutorial/body-nested-models.md
@@ -1,6 +1,6 @@
# Corps - Modèles imbriqués { #body-nested-models }
-Avec FastAPI, vous pouvez définir, valider, documenter et utiliser des modèles imbriqués à n'importe quelle profondeur (grâce à Pydantic).
+Avec **FastAPI**, vous pouvez définir, valider, documenter et utiliser des modèles imbriqués à n'importe quelle profondeur (grâce à Pydantic).
## Déclarer des champs de liste { #list-fields }
@@ -69,7 +69,7 @@ Nous pouvons ensuite l'utiliser comme type d'un attribut :
{* ../../docs_src/body_nested_models/tutorial004_py310.py hl[18] *}
-Cela signifie que FastAPI attendrait un corps similaire à :
+Cela signifie que **FastAPI** attendrait un corps similaire à :
```JSON
{
@@ -85,7 +85,7 @@ Cela signifie que FastAPI attendrait un corps similaire à :
}
```
-Là encore, avec cette simple déclaration, avec FastAPI vous obtenez :
+Là encore, avec cette simple déclaration, avec **FastAPI** vous obtenez :
- Prise en charge par l'éditeur (autocomplétion, etc.), même pour les modèles imbriqués
- Conversion des données
@@ -135,7 +135,7 @@ Cela attendra (convertira, validera, documentera, etc.) un corps JSON comme :
]
}
```
-/// info
+/// note | Remarque
Remarquez que la clé `images` contient maintenant une liste d'objets image.
@@ -147,7 +147,7 @@ Vous pouvez définir des modèles imbriqués à une profondeur arbitraire :
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info
+/// note | Remarque
Remarquez que `Offer` a une liste d’`Item`, qui à leur tour ont une liste optionnelle d’`Image`.
@@ -209,7 +209,7 @@ Et le `dict` que vous recevez dans `weights` aura en réalité des clés `int` e
## Récapitulatif { #recap }
-Avec FastAPI, vous bénéficiez de la flexibilité maximale fournie par les modèles Pydantic, tout en gardant votre code simple, concis et élégant.
+Avec **FastAPI**, vous bénéficiez de la flexibilité maximale fournie par les modèles Pydantic, tout en gardant votre code simple, concis et élégant.
Mais avec tous les avantages :
diff --git a/docs/fr/docs/tutorial/body.md b/docs/fr/docs/tutorial/body.md
index 6a9466798..2ff716125 100644
--- a/docs/fr/docs/tutorial/body.md
+++ b/docs/fr/docs/tutorial/body.md
@@ -1,18 +1,18 @@
# Corps de la requête { #request-body }
-Quand vous avez besoin d'envoyer de la donnée depuis un client (comme un navigateur) vers votre API, vous l'envoyez en tant que **corps de requête**.
+Quand vous avez besoin d'envoyer de la donnée depuis un client (comme un navigateur) vers votre API, vous l'envoyez en tant que **corps de la requête**.
Le corps d'une **requête** est de la donnée envoyée par le client à votre API. Le corps d'une **réponse** est la donnée envoyée par votre API au client.
-Votre API aura presque toujours à envoyer un corps de **réponse**. Mais un client n'a pas toujours à envoyer un **corps de requête** : parfois il demande seulement un chemin, peut-être avec quelques paramètres de requête, mais n'envoie pas de corps.
+Votre API aura presque toujours à envoyer un corps de **réponse**. Mais un client n'a pas toujours à envoyer un **corps de la requête** : parfois il demande seulement un chemin, peut-être avec quelques paramètres de requête, mais n'envoie pas de corps.
Pour déclarer un corps de **requête**, on utilise les modèles de [Pydantic](https://docs.pydantic.dev/) en profitant de tous leurs avantages et fonctionnalités.
-/// info
+/// note | Remarque
-Pour envoyer de la donnée, vous devez utiliser : `POST` (le plus populaire), `PUT`, `DELETE` ou `PATCH`.
+Pour envoyer de la donnée, vous devez utiliser l'une de ces méthodes : `POST` (le plus populaire), `PUT`, `DELETE` ou `PATCH`.
-Envoyer un corps dans une requête `GET` a un comportement non défini dans les spécifications, cela est néanmoins supporté par **FastAPI**, seulement pour des cas d'utilisation très complexes/extrêmes.
+Envoyer un corps dans une requête `GET` a un comportement non défini dans les spécifications, cela est néanmoins supporté par FastAPI, seulement pour des cas d'utilisation très complexes/extrêmes.
Ceci étant découragé, la documentation interactive générée par Swagger UI ne montrera pas de documentation pour le corps d'une requête `GET`, et les proxys intermédiaires risquent de ne pas le supporter.
@@ -32,6 +32,7 @@ Utilisez les types Python standard pour tous les attributs :
{* ../../docs_src/body/tutorial001_py310.py hl[5:9] *}
+
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, il est requis. Utilisez `None` pour le rendre simplement optionnel.
Par exemple, le modèle ci-dessus déclare un JSON « `object` » (ou `dict` Python) tel que :
@@ -73,7 +74,7 @@ En utilisant uniquement les déclarations de type Python, **FastAPI** réussit
* Passer la donnée reçue dans le paramètre `item`.
* Ce paramètre ayant été déclaré dans la fonction comme étant de type `Item`, vous aurez aussi tout le support offert par l'éditeur (autocomplétion, etc.) pour tous les attributs de ce paramètre et les types de ces attributs.
* Générer des définitions [JSON Schema](https://json-schema.org) pour votre modèle ; vous pouvez également les utiliser partout ailleurs si cela a du sens pour votre projet.
-* Ces schémas participeront à la constitution du schéma généré OpenAPI, et seront utilisés par les documentations automatiques UIs.
+* Ces schémas feront partie du schéma OpenAPI généré, et seront utilisés par les UIs de la documentation automatique.
## Documentation automatique { #automatic-docs }
@@ -97,11 +98,11 @@ Et vous obtenez aussi des vérifications d'erreurs pour les opérations de types
Ce n'est pas un hasard, ce framework entier a été bâti avec ce design comme objectif.
-Et cela a été rigoureusement testé durant la phase de design, avant toute implémentation, pour vous assurer que cela fonctionnerait avec tous les éditeurs.
+Et cela a été rigoureusement testé durant la phase de design, avant toute implémentation, pour s'assurer que cela fonctionnerait avec tous les éditeurs.
Des changements sur Pydantic ont même été faits pour supporter cela.
-Les captures d'écran précédentes ont été prises sur [Visual Studio Code](https://code.visualstudio.com).
+Les captures d'écran précédentes ont été prises avec [Visual Studio Code](https://code.visualstudio.com).
Mais vous auriez le même support de l'éditeur avec [PyCharm](https://www.jetbrains.com/pycharm/) et la majorité des autres éditeurs de code Python :
@@ -129,15 +130,16 @@ Dans la fonction, vous pouvez accéder à tous les attributs de l'objet du modè
## 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 *chemin d'accès*.
+Vous pouvez déclarer des paramètres de chemin et le corps de la requête en même temps.
-**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 la fonction déclarés comme modèles Pydantic devraient être **récupérés depuis le corps de la requête**.
{* ../../docs_src/body/tutorial003_py310.py hl[15:16] *}
+
## Corps de la requête + paramètres de chemin et de requête { #request-body-path-query-parameters }
-Vous pouvez aussi déclarer un **corps**, et des paramètres de **chemin** et de **requête** dans la même *chemin d'accès*.
+Vous pouvez aussi déclarer un **corps**, et des paramètres de **chemin** et de **requête**, tous en même temps.
**FastAPI** saura reconnaître chacun d'entre eux et récupérer la bonne donnée au bon endroit.
@@ -151,9 +153,9 @@ Les paramètres de la fonction seront reconnus comme tel :
/// note | Remarque
-**FastAPI** saura que la valeur de `q` n'est pas requise grâce à la valeur par défaut `= None`.
+FastAPI saura que la valeur de `q` n'est pas requise grâce à la valeur par défaut `= None`.
-L'annotation de type `str | None` n'est pas utilisée par **FastAPI** pour déterminer que la valeur n'est pas requise, il le saura parce qu'elle a une valeur par défaut `= None`.
+L'annotation de type `str | None` n'est pas utilisée par FastAPI pour déterminer que la valeur n'est pas requise, il le saura parce qu'elle a une valeur par défaut `= None`.
Mais ajouter ces annotations de type permettra à votre éditeur de vous offrir un meilleur support et de détecter des erreurs.
diff --git a/docs/fr/docs/tutorial/cookie-param-models.md b/docs/fr/docs/tutorial/cookie-param-models.md
index c6fc2f826..2b8edbab7 100644
--- a/docs/fr/docs/tutorial/cookie-param-models.md
+++ b/docs/fr/docs/tutorial/cookie-param-models.md
@@ -32,7 +32,7 @@ Vous pouvez voir les cookies définis dans l'interface de la documentation à `/
get opération
-/// info | `@decorator` Info
+/// note | Informations sur `@decorator`
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 c’est de là que vient le terme 🤷🏻♂).
+Vous la mettez au-dessus d’une fonction. Comme un joli chapeau décoratif (j’imagine que c’est de là que vient le terme).
Un « décorateur » prend la fonction en dessous et fait quelque chose avec.
Dans notre cas, ce décorateur indique à **FastAPI** que la fonction en dessous correspond au **chemin** `/` avec une **opération** `get`.
-C’est le « décorateur de chemin d’accès ».
+C’est le **« décorateur de chemin d’accès »**.
///
@@ -363,7 +355,7 @@ Par exemple, lorsque vous utilisez GraphQL, vous effectuez normalement toutes le
### Étape 4 : définir la **fonction de chemin d’accès** { #step-4-define-the-path-operation-function }
-Voici notre « fonction de chemin d’accès » :
+Voici notre **« fonction de chemin d’accès »** :
* **chemin** : `/`.
* **opération** : `get`.
@@ -373,7 +365,7 @@ Voici notre « fonction de chemin d’accès » :
C’est une fonction Python.
-Elle sera appelée par **FastAPI** chaque fois qu’il recevra une requête vers l’URL « / » en utilisant une opération `GET`.
+Elle sera appelée par **FastAPI** chaque fois qu’il recevra une requête vers l’URL « `/` » en utilisant une opération `GET`.
Dans ce cas, c’est une fonction `async`.
@@ -385,7 +377,7 @@ Vous pouvez aussi la définir comme une fonction normale au lieu de `async def`
/// note | Remarque
-Si vous ne connaissez pas la différence, consultez [Asynchrone : « Pressé ? »](../async.md#in-a-hurry).
+Si vous ne connaissez pas la différence, consultez [Asynchrone : *« Pressé ? »*](../async.md#in-a-hurry).
///
diff --git a/docs/fr/docs/tutorial/frontend.md b/docs/fr/docs/tutorial/frontend.md
new file mode 100644
index 000000000..6adb8a241
--- /dev/null
+++ b/docs/fr/docs/tutorial/frontend.md
@@ -0,0 +1,133 @@
+# Frontend { #frontend }
+
+Vous pouvez servir des applications frontend statiques avec `app.frontend()` (ou `router.frontend()`).
+
+C'est utile pour les outils frontend qui génèrent des fichiers statiques, comme React avec Vite, TanStack Router, Astro, Vue, Svelte, Angular, Solid, et d'autres.
+
+Avec ces outils, vous avez normalement une étape qui build le frontend, avec une commande comme :
+
+```bash
+npm run build
+```
+
+Cela générerait un répertoire comme `./dist/` avec vos fichiers frontend.
+
+Vous pouvez utiliser `app.frontend()` pour servir ce répertoire en suivant les conventions nécessaires à ces frameworks frontend.
+
+**FastAPI** vérifie d'abord les *chemins d'accès*. Les fichiers frontend ne sont vérifiés que si aucune route normale ne correspond, donc votre API ne sera pas affectée.
+
+## Servir un frontend { #serve-a-frontend }
+
+Après avoir build votre frontend, par exemple avec `npm run build`, placez les fichiers générés dans un répertoire, par exemple `dist`.
+
+La structure de votre projet pourrait ressembler à ceci :
+
+```text
+.
+├── pyproject.toml
+├── app
+│ ├── __init__.py
+│ └── main.py
+└── dist
+ ├── index.html
+ └── assets
+ └── app.js
+```
+
+Servez-le ensuite avec `app.frontend()` :
+
+{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
+
+Avec cela, une requête vers `/assets/app.js` peut servir `dist/assets/app.js`.
+
+Si vous avez également un *chemin d'accès* **FastAPI**, le *chemin d'accès* est prioritaire.
+
+## Routage côté client { #client-side-routing }
+
+De nombreuses applications frontend, y compris les **applications monopages** (SPAs), utilisent le routage côté client. Un chemin comme `/dashboard/settings` peut ne pas être un vrai fichier, mais le framework se chargerait de le gérer.
+
+Ainsi, si vous accédez directement à cette URL (au lieu de naviguer via l'application), le backend doit servir l'application frontend depuis `index.html`, afin que le framework frontend puisse ensuite gérer le routage côté client.
+
+Pour cela, utilisez `fallback="index.html"` :
+
+{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *}
+
+**FastAPI** utilise ce fallback uniquement pour les requêtes `GET` et `HEAD` qui ressemblent à une navigation de navigateur. Les fichiers manquants comme JavaScript, CSS et les images renvoient toujours `404`.
+
+Les requêtes avec d'autres méthodes, comme `POST` ou `PUT`, vers des chemins qui ne correspondent qu'au fallback frontend renvoient également `404`. Les *chemins d'accès* **FastAPI** réguliers ont toujours une priorité plus élevée que les routes frontend.
+
+/// tip | Astuce
+
+Par défaut, `fallback` a une valeur de `fallback="auto"`. Dans la plupart des cas, vous n'avez pas besoin de spécifier `fallback`. Lisez ci-dessous pour plus de détails.
+
+///
+
+C'est ce que vous souhaitez avec de nombreuses applications frontend qui utilisent le routage côté client, par exemple React avec TanStack Router, Vue, Angular, SvelteKit ou Solid.
+
+## Page 404 personnalisée { #custom-404-page }
+
+Vous pouvez également servir une page statique `404.html` pour les chemins frontend manquants :
+
+{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *}
+
+Cette réponse conserve un code de statut `404`.
+
+Dans ce cas, **FastAPI** ne servira pas `index.html` pour les chemins frontend manquants. Il renverra le fichier `404.html` à la place.
+
+/// tip | Astuce
+
+Par défaut, `fallback` a une valeur de `fallback="auto"`. Avec cela, si un fichier `404.html` est trouvé, il sera utilisé automatiquement comme fallback.
+
+Vous pouvez donc normalement omettre l'argument `fallback`.
+
+///
+
+C'est utile avec les outils frontend qui génèrent des fichiers HTML statiques pour chaque page, comme Astro.
+
+## Fallback automatique { #fallback-auto }
+
+Par défaut, `app.frontend()` utilise `fallback="auto"`.
+
+S'il y a un fichier `404.html` dans le répertoire frontend, les chemins frontend manquants servent ce fichier avec le code de statut `404`.
+
+Sinon, s'il y a un fichier `index.html`, les chemins de navigation de navigateur manquants servent `index.html`, ce qui est attendu par de nombreuses applications frontend avec routage côté client.
+
+Ainsi, dans la plupart des cas, vous pouvez utiliser `app.frontend("/", directory="dist")` sans spécifier l'argument `fallback`.
+
+{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
+
+## Désactiver le fallback { #disable-fallback }
+
+Si vous ne souhaitez pas servir de fichier fallback pour les chemins frontend manquants, utilisez `fallback=None` :
+
+{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *}
+
+Les chemins frontend manquants renvoient alors le `404` normal.
+
+## Vérifier le répertoire { #check-directory }
+
+Par défaut, `app.frontend()` vérifie que le répertoire existe lorsque l'application est créée.
+
+Cela permet de détecter tôt les erreurs de configuration. Par exemple, si le répertoire de sortie du build frontend est manquant, **FastAPI** lèvera une erreur au démarrage.
+
+Si vos fichiers frontend sont créés plus tard, par exemple par une étape de build séparée après la création de l'objet app, définissez `check_dir=False` :
+
+{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *}
+
+Avec `check_dir=False`, **FastAPI** ne vérifiera pas le répertoire lorsque l'application est créée. Si le répertoire configuré est toujours manquant lorsqu'une requête est traitée, **FastAPI** lèvera alors une erreur.
+
+## L'utiliser avec `APIRouter` { #use-it-with-apirouter }
+
+Vous pouvez également ajouter des fichiers frontend à un `APIRouter` et l'inclure avec un préfixe :
+
+{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *}
+
+Dans cet exemple, les chemins frontend sont servis sous `/app`.
+
+Tous les *chemins d'accès* réguliers dans l'application seront toujours prioritaires, y compris dans d'autres routers.
+
+## Sortie de build statique uniquement { #static-build-output-only }
+
+`app.frontend()` sert des fichiers déjà générés par votre build frontend.
+
+Il n'exécute pas de rendu côté serveur. Il est destiné aux frameworks frontend qui génèrent des fichiers statiques, pas aux frameworks qui nécessitent un rendu dynamique sur le serveur pour chaque requête.
diff --git a/docs/fr/docs/tutorial/handling-errors.md b/docs/fr/docs/tutorial/handling-errors.md
index a697571f3..5c52e7be1 100644
--- a/docs/fr/docs/tutorial/handling-errors.md
+++ b/docs/fr/docs/tutorial/handling-errors.md
@@ -43,7 +43,7 @@ Dans cet exemple, lorsque le client demande un élément par un ID qui n'existe
### Réponse résultante { #the-resulting-response }
-Si le client demande `http://example.com/items/foo` (un `item_id` « foo »), il recevra un code d'état HTTP 200 et une réponse JSON :
+Si le client demande `http://example.com/items/foo` (un `item_id` `"foo"`), il recevra un code d'état HTTP 200 et une réponse JSON :
```JSON
{
@@ -51,7 +51,7 @@ Si le client demande `http://example.com/items/foo` (un `item_id` « foo »), il
}
```
-Mais si le client demande `http://example.com/items/bar` (un `item_id` inexistant « bar »), il recevra un code d'état HTTP 404 (l'erreur « not found ») et une réponse JSON :
+Mais si le client demande `http://example.com/items/bar` (un `item_id` inexistant `"bar"`), il recevra un code d'état HTTP 404 (l'erreur « not found ») et une réponse JSON :
```JSON
{
diff --git a/docs/fr/docs/tutorial/index.md b/docs/fr/docs/tutorial/index.md
index 2fc177ed9..1e28cfc6d 100644
--- a/docs/fr/docs/tutorial/index.md
+++ b/docs/fr/docs/tutorial/index.md
@@ -1,5 +1,6 @@
# Tutoriel - Guide utilisateur { #tutorial-user-guide }
+
Ce tutoriel vous montre comment utiliser **FastAPI** avec la plupart de ses fonctionnalités, étape par étape.
Chaque section s'appuie progressivement sur les précédentes, mais elle est structurée de manière à séparer les sujets, afin que vous puissiez aller directement à l'un d'entre eux pour répondre à vos besoins spécifiques d'API.
diff --git a/docs/fr/docs/tutorial/metadata.md b/docs/fr/docs/tutorial/metadata.md
index 87f72fefa..1f1859eed 100644
--- a/docs/fr/docs/tutorial/metadata.md
+++ b/docs/fr/docs/tutorial/metadata.md
@@ -11,7 +11,7 @@ Vous pouvez définir les champs suivants qui sont utilisés dans la spécificati
| `title` | `str` | Le titre de l’API. |
| `summary` | `str` | Un court résumé de l’API. Disponible depuis OpenAPI 3.1.0, FastAPI 0.99.0. |
| `description` | `str` | Une brève description de l’API. Elle peut utiliser Markdown. |
-| `version` | `string` | La version de l’API. C’est la version de votre propre application, pas d’OpenAPI. Par exemple `2.5.0`. |
+| `version` | `str` | La version de l’API. C’est la version de votre propre application, pas d’OpenAPI. Par exemple `2.5.0`. |
| `terms_of_service` | `str` | Une URL vers les Conditions d’utilisation de l’API. Le cas échéant, il doit s’agir d’une URL. |
| `contact` | `dict` | Les informations de contact pour l’API exposée. Cela peut contenir plusieurs champs. contact| Paramètre | Type | Description |
|---|---|---|
name | str | Le nom identifiant de la personne/organisation de contact. |
url | str | L’URL pointant vers les informations de contact. DOIT être au format d’une URL. |
email | str | L’adresse e-mail de la personne/organisation de contact. DOIT être au format d’une adresse e-mail. |
license_info| Paramètre | Type | Description |
|---|---|---|
name | str | OBLIGATOIRE (si un license_info est défini). Le nom de la licence utilisée pour l’API. |
identifier | str | Une expression de licence [SPDX](https://spdx.org/licenses/) pour l’API. Le champ identifier est mutuellement exclusif du champ url. Disponible depuis OpenAPI 3.1.0, FastAPI 0.99.0. |
url | str | Une URL vers la licence utilisée pour l’API. DOIT être au format d’une URL. |
-/// check | Vérifications
+/// tip | Astuce
À nouveau, simplement avec cette même déclaration de type Python, **FastAPI** vous fournit une documentation interactive automatique (intégrant Swagger UI).
diff --git a/docs/fr/docs/tutorial/query-params-str-validations.md b/docs/fr/docs/tutorial/query-params-str-validations.md
index 57d358758..1b0fa88b3 100644
--- a/docs/fr/docs/tutorial/query-params-str-validations.md
+++ b/docs/fr/docs/tutorial/query-params-str-validations.md
@@ -29,7 +29,7 @@ Pour ce faire, importez d’abord :
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info
+/// note | Remarque
FastAPI a ajouté la prise en charge de `Annotated` (et a commencé à le recommander) dans la version 0.95.0.
@@ -81,7 +81,7 @@ FastAPI va maintenant :
- **Valider** les données en s’assurant que la longueur maximale est de 50 caractères
- Afficher une **erreur claire** au client quand les données ne sont pas valides
-- **Documenter** le paramètre dans la *chemin d'accès* du schéma OpenAPI (il apparaîtra donc dans l’**interface de documentation automatique**)
+- **Documenter** le paramètre dans le *chemin d'accès* du schéma OpenAPI (il apparaîtra donc dans l’**interface de documentation automatique**)
## Alternative (ancienne) : `Query` comme valeur par défaut { #alternative-old-query-as-the-default-value }
@@ -89,7 +89,7 @@ Les versions précédentes de FastAPI (avant 0.95.0
/// tip | Astuce
-Pour du nouveau code et dès que possible, utilisez `Annotated` comme expliqué ci-dessus. Il y a de multiples avantages (expliqués ci-dessous) et aucun inconvénient. 🍰
+Pour du nouveau code et chaque fois que possible, utilisez `Annotated` comme expliqué ci-dessus. Il y a de multiples avantages (expliqués ci-dessous) et aucun inconvénient. 🍰
///
@@ -119,7 +119,7 @@ Ensuite, nous pouvons passer plus de paramètres à `Query`. Dans ce cas, le par
q: str | None = Query(default=None, max_length=50)
```
-Cela validera les données, affichera une erreur claire lorsque les données ne sont pas valides et documentera le paramètre dans la *chemin d'accès* du schéma OpenAPI.
+Cela validera les données, affichera une erreur claire lorsque les données ne sont pas valides et documentera le paramètre dans le *chemin d'accès* du schéma OpenAPI.
### `Query` comme valeur par défaut ou dans `Annotated` { #query-as-the-default-value-or-in-annotated }
@@ -241,7 +241,7 @@ Ensuite, avec une URL comme :
http://localhost:8000/items/?q=foo&q=bar
```
-vous recevriez les valeurs des multiples paramètres de requête `q` (`foo` et `bar`) dans une `list` Python à l’intérieur de votre fonction de *chemin d'accès*, dans le *paramètre de fonction* `q`.
+vous recevriez les valeurs des multiples paramètres de requête `q` (`foo` et `bar`) dans une `list` Python à l’intérieur de votre *fonction de chemin d'accès*, dans le *paramètre de fonction* `q`.
Donc, la réponse pour cette URL serait :
@@ -381,7 +381,7 @@ Par exemple, ce validateur personnalisé vérifie que l’ID d’item commence p
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info
+/// note | Remarque
C’est disponible avec Pydantic version 2 ou supérieure. 😎
diff --git a/docs/fr/docs/tutorial/query-params.md b/docs/fr/docs/tutorial/query-params.md
index 8ecbc2853..629e1f91a 100644
--- a/docs/fr/docs/tutorial/query-params.md
+++ b/docs/fr/docs/tutorial/query-params.md
@@ -1,6 +1,6 @@
# Paramètres de requête { #query-parameters }
-Quand vous déclarez d'autres paramètres de fonction qui ne font pas partie des paramètres de chemin, ils sont automatiquement interprétés comme des paramètres de « query ».
+Quand vous déclarez d'autres paramètres de fonction qui ne font pas partie des paramètres de chemin, ils sont automatiquement interprétés comme des paramètres de requête.
{* ../../docs_src/query_params/tutorial001_py310.py hl[9] *}
@@ -65,7 +65,7 @@ De la même façon, vous pouvez déclarer des paramètres de requête optionnels
Dans ce cas, le paramètre de fonction `q` sera optionnel et vaudra `None` par défaut.
-/// check | Vérifications
+/// tip | Astuce
Notez également que **FastAPI** est suffisamment intelligent pour remarquer que le paramètre de chemin `item_id` est un paramètre de chemin et que `q` ne l'est pas, c'est donc un paramètre de requête.
@@ -109,6 +109,7 @@ 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 verra le paramètre `short` avec une valeur `bool` à `True`. Sinon la valeur sera à `False`.
+
## Multiples paramètres de chemin et de requête { #multiple-path-and-query-parameters }
Vous pouvez déclarer plusieurs paramètres de chemin et paramètres de requête en même temps, **FastAPI** sait lequel est lequel.
diff --git a/docs/fr/docs/tutorial/request-files.md b/docs/fr/docs/tutorial/request-files.md
index e55f8e57f..79b28d7e6 100644
--- a/docs/fr/docs/tutorial/request-files.md
+++ b/docs/fr/docs/tutorial/request-files.md
@@ -1,8 +1,9 @@
# Envoyer des fichiers { #request-files }
+
Vous pouvez définir des fichiers à téléverser par le client en utilisant `File`.
-/// info
+/// note | Remarque
Pour recevoir des fichiers téléversés, installez d'abord [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -28,7 +29,7 @@ Créez des paramètres de fichier de la même manière que pour `Body` ou `Form`
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info
+/// note | Remarque
`File` est une classe qui hérite directement de `Form`.
@@ -44,7 +45,7 @@ Pour déclarer des fichiers dans le corps de la requête, vous devez utiliser `F
Les fichiers seront téléversés en « données de formulaire ».
-Si vous déclarez le type de votre paramètre de *fonction de chemin d'accès* comme `bytes`, **FastAPI** lira le fichier pour vous et vous recevrez le contenu sous forme de `bytes`.
+Si vous déclarez le type de votre *fonction de chemin d'accès* comme `bytes`, **FastAPI** lira le fichier pour vous et vous recevrez le contenu sous forme de `bytes`.
Gardez à l'esprit que cela signifie que tout le contenu sera stocké en mémoire. Cela fonctionnera bien pour de petits fichiers.
diff --git a/docs/fr/docs/tutorial/request-form-models.md b/docs/fr/docs/tutorial/request-form-models.md
index 0f1e6dcfd..ae1da248d 100644
--- a/docs/fr/docs/tutorial/request-form-models.md
+++ b/docs/fr/docs/tutorial/request-form-models.md
@@ -2,7 +2,7 @@
Vous pouvez utiliser des **modèles Pydantic** pour déclarer des **champs de formulaire** dans FastAPI.
-/// info
+/// note | Remarque
Pour utiliser les formulaires, installez d'abord [`python-multipart`](https://github.com/Kludex/python-multipart).
diff --git a/docs/fr/docs/tutorial/request-forms-and-files.md b/docs/fr/docs/tutorial/request-forms-and-files.md
index 2e3f5b58b..4b930dea2 100644
--- a/docs/fr/docs/tutorial/request-forms-and-files.md
+++ b/docs/fr/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
Vous pouvez définir des fichiers et des champs de formulaire en même temps à l'aide de `File` et `Form`.
-/// info
+/// note | Remarque
Pour recevoir des fichiers téléversés et/ou des données de formulaire, installez d'abord [`python-multipart`](https://github.com/Kludex/python-multipart).
diff --git a/docs/fr/docs/tutorial/request-forms.md b/docs/fr/docs/tutorial/request-forms.md
index 9596f68ce..442d50558 100644
--- a/docs/fr/docs/tutorial/request-forms.md
+++ b/docs/fr/docs/tutorial/request-forms.md
@@ -2,11 +2,11 @@
Lorsque vous devez recevoir des champs de formulaire au lieu de JSON, vous pouvez utiliser `Form`.
-/// info
+/// note | Remarque
Pour utiliser les formulaires, installez d'abord [`python-multipart`](https://github.com/Kludex/python-multipart).
-Assurez-vous de créer un [environnement virtuel](../virtual-environments.md), de l'activer, puis installez-le, par exemple :
+Vous devez créer un [environnement virtuel](../virtual-environments.md), l'activer, puis installer le paquet, par exemple :
```console
$ pip install python-multipart
@@ -32,7 +32,7 @@ La spécification exige que les champs soient
Avec `Form`, vous pouvez déclarer les mêmes configurations que pour `Body` (ainsi que `Query`, `Path`, `Cookie`), y compris la validation, des exemples, un alias (p. ex. `user-name` au lieu de `username`), etc.
-/// info
+/// note | Remarque
`Form` est une classe qui hérite directement de `Body`.
@@ -56,7 +56,7 @@ Les données issues des formulaires sont normalement encodées avec le « type d
Mais lorsque le formulaire inclut des fichiers, il est encodé en `multipart/form-data`. Vous lirez la gestion des fichiers dans le chapitre suivant.
-Si vous voulez en savoir plus sur ces encodages et les champs de formulaire, consultez la [MDN web docs pour `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
+Si vous voulez en savoir plus sur ces encodages et les champs de formulaire, consultez les [documents web de la MDN pour `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
///
diff --git a/docs/fr/docs/tutorial/response-model.md b/docs/fr/docs/tutorial/response-model.md
index e3926a0c1..322b17044 100644
--- a/docs/fr/docs/tutorial/response-model.md
+++ b/docs/fr/docs/tutorial/response-model.md
@@ -72,7 +72,7 @@ Ici, nous déclarons un modèle `UserIn`, il contiendra un mot de passe en clair
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | Info
+/// note | Remarque
Pour utiliser `EmailStr`, installez d'abord [`email-validator`](https://github.com/JoshData/python-email-validator).
@@ -251,7 +251,7 @@ Ainsi, si vous envoyez une requête à ce *chemin d'accès* pour l'article avec
}
```
-/// info | Info
+/// note | Remarque
Vous pouvez également utiliser :
diff --git a/docs/fr/docs/tutorial/response-status-code.md b/docs/fr/docs/tutorial/response-status-code.md
index c8e45cd40..398d1f1a1 100644
--- a/docs/fr/docs/tutorial/response-status-code.md
+++ b/docs/fr/docs/tutorial/response-status-code.md
@@ -1,5 +1,6 @@
# Code d'état de la réponse { #response-status-code }
+
De la même manière que vous pouvez spécifier un modèle de réponse, vous pouvez également déclarer le code d'état HTTP utilisé pour la réponse avec le paramètre `status_code` dans n'importe lequel des chemins d'accès :
* `@app.get()`
@@ -18,7 +19,7 @@ Remarquez que `status_code` est un paramètre de la méthode « decorator » (`g
Le paramètre `status_code` reçoit un nombre correspondant au code d'état HTTP.
-/// info
+/// note | Remarque
`status_code` peut aussi recevoir un `IntEnum`, comme le [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus) de Python.
diff --git a/docs/fr/docs/tutorial/schema-extra-example.md b/docs/fr/docs/tutorial/schema-extra-example.md
index 404edff46..85905f5f5 100644
--- a/docs/fr/docs/tutorial/schema-extra-example.md
+++ b/docs/fr/docs/tutorial/schema-extra-example.md
@@ -1,6 +1,6 @@
# Déclarer des exemples de données de requête { #declare-request-example-data }
-Vous pouvez déclarer des exemples des données que votre application peut recevoir.
+Vous pouvez déclarer des exemples de données que votre application peut recevoir.
Voici plusieurs façons de le faire.
@@ -10,9 +10,9 @@ Vous pouvez déclarer `examples` pour un modèle Pydantic qui seront ajoutés au
{* ../../docs_src/schema_extra_example/tutorial001_py310.py hl[13:24] *}
-Ces informations supplémentaires seront ajoutées telles quelles au **JSON Schema** de sortie pour ce modèle, et elles seront utilisées dans la documentation de l'API.
+Ces informations supplémentaires seront ajoutées telles quelles au **JSON Schema** de sortie pour ce modèle, et elles seront utilisées dans les documents de l'API.
-Vous pouvez utiliser l'attribut `model_config` qui accepte un `dict` comme décrit dans [Documentation de Pydantic : Configuration](https://docs.pydantic.dev/latest/api/config/).
+Vous pouvez utiliser l'attribut `model_config` qui accepte un `dict` comme décrit dans [documents de Pydantic : Configuration](https://docs.pydantic.dev/latest/api/config/).
Vous pouvez définir `"json_schema_extra"` avec un `dict` contenant toutes les données supplémentaires que vous souhaitez voir apparaître dans le JSON Schema généré, y compris `examples`.
@@ -24,11 +24,11 @@ Par exemple, vous pourriez l'utiliser pour ajouter des métadonnées pour une in
///
-/// info
+/// note | Remarque
OpenAPI 3.1.0 (utilisé depuis FastAPI 0.99.0) a ajouté la prise en charge de `examples`, qui fait partie du standard **JSON Schema**.
-Avant cela, seule la clé `example` avec un exemple unique était prise en charge. Elle l'est toujours par OpenAPI 3.1.0, mais elle est dépréciée et ne fait pas partie du standard JSON Schema. Vous êtes donc encouragé à migrer de `example` vers `examples`. 🤓
+Avant cela, seul le mot-clé `example` avec un exemple unique était pris en charge. Il l'est toujours par OpenAPI 3.1.0, mais il est déprécié et ne fait pas partie du standard JSON Schema. Vous êtes donc encouragé à migrer de `example` vers `examples`. 🤓
Vous pouvez en lire davantage à la fin de cette page.
@@ -155,7 +155,7 @@ OpenAPI a également ajouté les champs `example` et `examples` à d'autres part
* `File()`
* `Form()`
-/// info
+/// note | Remarque
Ce paramètre `examples` ancien et spécifique à OpenAPI est désormais `openapi_examples` depuis FastAPI `0.103.0`.
@@ -171,9 +171,9 @@ Et désormais, ce nouveau champ `examples` a priorité sur l'ancien champ unique
Ce nouveau champ `examples` dans JSON Schema est **juste une `list`** d'exemples, et non pas un dict avec des métadonnées supplémentaires comme dans les autres endroits d'OpenAPI (décrits ci-dessus).
-/// info
+/// note | Remarque
-Même après la sortie d'OpenAPI 3.1.0 avec cette nouvelle intégration plus simple avec JSON Schema, pendant un temps, Swagger UI, l'outil qui fournit la documentation automatique, ne prenait pas en charge OpenAPI 3.1.0 (il le fait depuis la version 5.0.0 🎉).
+Même après la sortie d'OpenAPI 3.1.0 avec cette nouvelle intégration plus simple avec JSON Schema, pendant un temps, Swagger UI, l'outil qui fournit les documents automatiques, ne prenait pas en charge OpenAPI 3.1.0 (il le fait depuis la version 5.0.0 🎉).
À cause de cela, les versions de FastAPI antérieures à 0.99.0 utilisaient encore des versions d'OpenAPI inférieures à 3.1.0.
@@ -183,7 +183,7 @@ Même après la sortie d'OpenAPI 3.1.0 avec cette nouvelle intégration plus sim
Lorsque vous ajoutez `examples` dans un modèle Pydantic, en utilisant `schema_extra` ou `Field(examples=["something"])`, cet exemple est ajouté au **JSON Schema** de ce modèle Pydantic.
-Et ce **JSON Schema** du modèle Pydantic est inclus dans l'**OpenAPI** de votre API, puis il est utilisé dans l'interface de la documentation.
+Et ce **JSON Schema** du modèle Pydantic est inclus dans l'**OpenAPI** de votre API, puis il est utilisé dans l'interface des documents.
Dans les versions de FastAPI antérieures à 0.99.0 (0.99.0 et supérieures utilisent le nouveau OpenAPI 3.1.0), lorsque vous utilisiez `example` ou `examples` avec l'une des autres utilitaires (`Query()`, `Body()`, etc.), ces exemples n'étaient pas ajoutés au JSON Schema qui décrit ces données (pas même à la version de JSON Schema propre à OpenAPI), ils étaient ajoutés directement à la déclaration du *chemin d'accès* dans OpenAPI (en dehors des parties d'OpenAPI qui utilisent JSON Schema).
@@ -191,7 +191,7 @@ Mais maintenant que FastAPI 0.99.0 et supérieures utilisent OpenAPI 3.1.0, qui
### Swagger UI et `examples` spécifiques à OpenAPI { #swagger-ui-and-openapi-specific-examples }
-Comme Swagger UI ne prenait pas en charge plusieurs exemples JSON Schema (au 2023-08-26), les utilisateurs n'avaient pas de moyen d'afficher plusieurs exemples dans les documents.
+Maintenant, comme Swagger UI ne prenait pas en charge plusieurs exemples JSON Schema (au 2023-08-26), les utilisateurs n'avaient pas de moyen d'afficher plusieurs exemples dans les documents.
Pour résoudre cela, FastAPI `0.103.0` a **ajouté la prise en charge** de la déclaration du même ancien champ `examples` **spécifique à OpenAPI** avec le nouveau paramètre `openapi_examples`. 🤓
diff --git a/docs/fr/docs/tutorial/security/first-steps.md b/docs/fr/docs/tutorial/security/first-steps.md
index c1d36d501..66005d907 100644
--- a/docs/fr/docs/tutorial/security/first-steps.md
+++ b/docs/fr/docs/tutorial/security/first-steps.md
@@ -24,7 +24,7 @@ Copiez l'exemple dans un fichier `main.py` :
## Exécuter { #run-it }
-/// info
+/// note | Remarque
Le package [`python-multipart`](https://github.com/Kludex/python-multipart) est installé automatiquement avec **FastAPI** lorsque vous exécutez la commande `pip install "fastapi[standard]"`.
@@ -54,13 +54,13 @@ $ fastapi dev
## Vérifier { #check-it }
-Allez à la documentation interactive à l'adresse : [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
+Allez aux documents interactifs à l'adresse : [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
Vous verrez quelque chose comme ceci :
-/// check | Bouton « Authorize » !
+/// tip | Bouton « Authorize » !
Vous avez déjà un tout nouveau bouton « Authorize ».
@@ -98,19 +98,19 @@ Mais dans ce cas, la même application **FastAPI** gérera l'API et l'authentifi
Voyons cela selon ce point de vue simplifié :
-- L'utilisateur saisit le `username` et le `password` dans le frontend, puis appuie sur Entrée.
-- Le frontend (exécuté dans le navigateur de l'utilisateur) envoie ce `username` et ce `password` vers une URL spécifique de notre API (déclarée avec `tokenUrl="token"`).
-- L'API vérifie ce `username` et ce `password`, et répond avec un « token » (nous n'avons encore rien implémenté de tout cela).
- - Un « token » n'est qu'une chaîne contenant des informations que nous pouvons utiliser plus tard pour vérifier cet utilisateur.
- - Normalement, un token est configuré pour expirer après un certain temps.
- - Ainsi, l'utilisateur devra se reconnecter à un moment donné.
- - Et si le token est volé, le risque est moindre. Ce n'est pas une clé permanente qui fonctionnerait indéfiniment (dans la plupart des cas).
-- Le frontend stocke ce token temporairement quelque part.
-- L'utilisateur clique dans le frontend pour aller vers une autre section de l'application web frontend.
-- Le frontend doit récupérer d'autres données depuis l'API.
- - Mais cela nécessite une authentification pour cet endpoint spécifique.
- - Donc, pour s'authentifier auprès de notre API, il envoie un en-tête `Authorization` avec une valeur `Bearer ` suivie du token.
- - Si le token contient `foobar`, le contenu de l'en-tête `Authorization` serait : `Bearer foobar`.
+* L'utilisateur saisit le `username` et le `password` dans le frontend, puis appuie sur Entrée.
+* Le frontend (exécuté dans le navigateur de l'utilisateur) envoie ce `username` et ce `password` vers une URL spécifique de notre API (déclarée avec `tokenUrl="token"`).
+* L'API vérifie ce `username` et ce `password`, et répond avec un « token » (nous n'avons encore rien implémenté de tout cela).
+ * Un « token » n'est qu'une chaîne contenant des informations que nous pouvons utiliser plus tard pour vérifier cet utilisateur.
+ * Normalement, un token est configuré pour expirer après un certain temps.
+ * Ainsi, l'utilisateur devra se reconnecter à un moment donné.
+ * Et si le token est volé, le risque est moindre. Ce n'est pas une clé permanente qui fonctionnerait indéfiniment (dans la plupart des cas).
+* Le frontend stocke ce token temporairement quelque part.
+* L'utilisateur clique dans le frontend pour aller vers une autre section de l'application web frontend.
+* Le frontend doit récupérer d'autres données depuis l'API.
+ * Mais cela nécessite une authentification pour cet endpoint spécifique.
+ * Donc, pour s'authentifier auprès de notre API, il envoie un en-tête `Authorization` avec une valeur `Bearer ` suivie du token.
+ * Si le token contient `foobar`, le contenu de l'en-tête `Authorization` serait : `Bearer foobar`.
## Le `OAuth2PasswordBearer` de **FastAPI** { #fastapis-oauth2passwordbearer }
@@ -118,7 +118,7 @@ Voyons cela selon ce point de vue simplifié :
Dans cet exemple, nous allons utiliser **OAuth2**, avec le flux **Password**, en utilisant un token **Bearer**. Nous le faisons avec la classe `OAuth2PasswordBearer`.
-/// info
+/// note | Remarque
Un token « bearer » n'est pas la seule option.
@@ -148,7 +148,7 @@ Ce paramètre ne crée pas cet endpoint / *chemin d'accès*, mais déclare que l
Nous créerons bientôt aussi le véritable chemin d'accès.
-/// info
+/// note | Remarque
Si vous êtes un « Pythonista » très strict, vous pourriez ne pas apprécier le style du nom de paramètre `tokenUrl` au lieu de `token_url`.
@@ -172,15 +172,15 @@ Vous pouvez maintenant passer ce `oauth2_scheme` en dépendance avec `Depends`.
{* ../../docs_src/security/tutorial001_an_py310.py hl[12] *}
-Cette dépendance fournira une `str` qui est affectée au paramètre `token` de la fonction de *chemin d'accès*.
+Cette dépendance fournira une `str` qui est affectée au paramètre `token` de la *fonction de chemin d'accès*.
-**FastAPI** saura qu'il peut utiliser cette dépendance pour définir un « schéma de sécurité » dans le schéma OpenAPI (et la documentation API automatique).
+**FastAPI** saura qu'il peut utiliser cette dépendance pour définir un « schéma de sécurité » dans le schéma OpenAPI (et les documents automatiques de l'API).
-/// info | Détails techniques
+/// note | Détails techniques
**FastAPI** saura qu'il peut utiliser la classe `OAuth2PasswordBearer` (déclarée dans une dépendance) pour définir le schéma de sécurité dans OpenAPI parce qu'elle hérite de `fastapi.security.oauth2.OAuth2`, qui hérite à son tour de `fastapi.security.base.SecurityBase`.
-Tous les utilitaires de sécurité qui s'intègrent à OpenAPI (et à la documentation API automatique) héritent de `SecurityBase`, c'est ainsi que **FastAPI** sait comment les intégrer dans OpenAPI.
+Tous les utilitaires de sécurité qui s'intègrent à OpenAPI (et aux documents automatiques de l'API) héritent de `SecurityBase`, c'est ainsi que **FastAPI** sait comment les intégrer dans OpenAPI.
///
@@ -192,7 +192,7 @@ S'il ne voit pas d'en-tête `Authorization`, ou si la valeur n'a pas de token `B
Vous n'avez même pas à vérifier si le token existe pour renvoyer une erreur. Vous pouvez être sûr que si votre fonction est exécutée, elle aura une `str` dans ce token.
-Vous pouvez déjà l'essayer dans la documentation interactive :
+Vous pouvez déjà l'essayer dans les documents interactifs :
diff --git a/docs/fr/docs/tutorial/security/get-current-user.md b/docs/fr/docs/tutorial/security/get-current-user.md
index 5f73efea9..664814bc3 100644
--- a/docs/fr/docs/tutorial/security/get-current-user.md
+++ b/docs/fr/docs/tutorial/security/get-current-user.md
@@ -14,7 +14,7 @@ Commençons par créer un modèle d'utilisateur Pydantic.
De la même manière que nous utilisons Pydantic pour déclarer des corps de requête, nous pouvons l'utiliser ailleurs :
-{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
+{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## Créer une dépendance `get_current_user` { #create-a-get-current-user-dependency }
@@ -52,7 +52,7 @@ Ici, **FastAPI** ne s'y trompera pas car vous utilisez `Depends`.
///
-/// check | Vérifications
+/// tip | Astuce
La manière dont ce système de dépendances est conçu nous permet d'avoir différentes dépendances (différents « dependables ») qui retournent toutes un modèle `User`.
diff --git a/docs/fr/docs/tutorial/security/oauth2-jwt.md b/docs/fr/docs/tutorial/security/oauth2-jwt.md
index eec5ab13c..f92fd75a6 100644
--- a/docs/fr/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/fr/docs/tutorial/security/oauth2-jwt.md
@@ -42,7 +42,7 @@ $ pip install pyjwt
-Appelez le point de terminaison `/users/me/`, vous obtiendrez la réponse suivante :
+Appelez l'endpoint `/users/me/`, vous obtiendrez la réponse suivante :
```JSON
{
diff --git a/docs/fr/docs/tutorial/security/simple-oauth2.md b/docs/fr/docs/tutorial/security/simple-oauth2.md
index f47d94aa2..1ee9e61ec 100644
--- a/docs/fr/docs/tutorial/security/simple-oauth2.md
+++ b/docs/fr/docs/tutorial/security/simple-oauth2.md
@@ -14,13 +14,13 @@ Mais ne vous inquiétez pas, vous pouvez l'afficher comme vous le souhaitez à v
Et vos modèles de base de données peuvent utiliser les noms que vous voulez.
-Mais pour le chemin d'accès de connexion, nous devons utiliser ces noms pour être compatibles avec la spécification (et pouvoir, par exemple, utiliser le système de documentation API intégré).
+Mais pour le *chemin d'accès* de connexion, nous devons utiliser ces noms pour être compatibles avec la spécification (et pouvoir, par exemple, utiliser le système de documentation API intégré).
La spécification précise également que `username` et `password` doivent être envoyés en données de formulaire (donc pas de JSON ici).
### `scope` { #scope }
-La spécification indique aussi que le client peut envoyer un autre champ de formulaire « scope ».
+La spécification indique aussi que le client peut envoyer un autre champ de formulaire « `scope` ».
Le nom du champ de formulaire est `scope` (au singulier), mais il s'agit en fait d'une longue chaîne contenant des « scopes » séparés par des espaces.
@@ -32,7 +32,7 @@ Ils sont normalement utilisés pour déclarer des permissions de sécurité spé
* `instagram_basic` est utilisé par Facebook / Instagram.
* `https://www.googleapis.com/auth/drive` est utilisé par Google.
-/// info
+/// note | Remarque
En OAuth2, un « scope » est simplement une chaîne qui déclare une permission spécifique requise.
@@ -50,7 +50,7 @@ Utilisons maintenant les utilités fournies par **FastAPI** pour gérer cela.
### `OAuth2PasswordRequestForm` { #oauth2passwordrequestform }
-Tout d'abord, importez `OAuth2PasswordRequestForm`, et utilisez-la en tant que dépendance avec `Depends` dans le chemin d'accès pour `/token` :
+Tout d'abord, importez `OAuth2PasswordRequestForm`, et utilisez-la en tant que dépendance avec `Depends` dans le *chemin d'accès* pour `/token` :
{* ../../docs_src/security/tutorial003_an_py310.py hl[4,78] *}
@@ -63,7 +63,7 @@ Tout d'abord, importez `OAuth2PasswordRequestForm`, et utilisez-la en tant que d
/// tip | Astuce
-La spécification OAuth2 exige en réalité un champ `grant_type` avec la valeur fixe `password`, mais `OAuth2PasswordRequestForm` ne l'impose pas.
+La spécification OAuth2 *exige* en réalité un champ `grant_type` avec la valeur fixe `password`, mais `OAuth2PasswordRequestForm` ne l'impose pas.
Si vous avez besoin de l'imposer, utilisez `OAuth2PasswordRequestFormStrict` au lieu de `OAuth2PasswordRequestForm`.
@@ -72,7 +72,7 @@ Si vous avez besoin de l'imposer, utilisez `OAuth2PasswordRequestFormStrict` au
* Un `client_id` optionnel (nous n'en avons pas besoin pour notre exemple).
* Un `client_secret` optionnel (nous n'en avons pas besoin pour notre exemple).
-/// info
+/// note | Remarque
La classe `OAuth2PasswordRequestForm` n'est pas une classe spéciale pour **FastAPI** comme l'est `OAuth2PasswordBearer`.
@@ -132,7 +132,7 @@ Ainsi, il ne pourra pas essayer d'utiliser ces mêmes mots de passe dans un autr
`UserInDB(**user_dict)` signifie :
-Passez les clés et valeurs de `user_dict` directement comme arguments clé‑valeur, équivalent à :
+*Passez les clés et valeurs de `user_dict` directement comme arguments clé‑valeur, équivalent à :*
```Python
UserInDB(
@@ -144,9 +144,9 @@ UserInDB(
)
```
-/// info
+/// note | Remarque
-Pour une explication plus complète de `**user_dict`, consultez [la documentation pour **Modèles supplémentaires**](../extra-models.md#about-user-in-dict).
+Pour une explication plus complète de `**user_dict`, consultez [la documentation pour **Modèles supplémentaires**](../extra-models.md#about-user-in-model-dump).
///
@@ -154,7 +154,7 @@ Pour une explication plus complète de `**user_dict`, consultez [la documentatio
La réponse de l'endpoint `token` doit être un objet JSON.
-Il doit contenir un `token_type`. Dans notre cas, comme nous utilisons des jetons « Bearer », le type de jeton doit être « bearer ».
+Il doit contenir un `token_type`. Dans notre cas, comme nous utilisons des jetons « Bearer », le type de jeton doit être « `bearer` ».
Et il doit contenir un `access_token`, avec une chaîne contenant notre jeton d'accès.
@@ -186,7 +186,7 @@ Pour le reste, **FastAPI** s'en charge pour vous.
Nous allons maintenant mettre à jour nos dépendances.
-Nous voulons obtenir `current_user` uniquement si cet utilisateur est actif.
+Nous voulons obtenir `current_user` *uniquement* si cet utilisateur est actif.
Nous créons donc une dépendance supplémentaire `get_current_active_user` qui utilise à son tour `get_current_user` comme dépendance.
@@ -196,7 +196,7 @@ Ainsi, dans notre endpoint, nous n'obtiendrons un utilisateur que si l'utilisate
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
-/// info
+/// note | Remarque
L'en‑tête supplémentaire `WWW-Authenticate` avec la valeur `Bearer` que nous renvoyons ici fait également partie de la spécification.
@@ -216,7 +216,7 @@ C'est l'avantage des standards ...
## Voir en action { #see-it-in-action }
-Ouvrez la documentation interactive : [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
+Ouvrez les documents interactifs : [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
### S'authentifier { #authenticate }
diff --git a/docs/fr/docs/tutorial/server-sent-events.md b/docs/fr/docs/tutorial/server-sent-events.md
index f4ed506f6..d62e3bfa7 100644
--- a/docs/fr/docs/tutorial/server-sent-events.md
+++ b/docs/fr/docs/tutorial/server-sent-events.md
@@ -4,7 +4,7 @@ Vous pouvez diffuser des données vers le client en utilisant les **Server-Sent
C'est similaire à [Diffuser des JSON Lines](stream-json-lines.md), mais cela utilise le format `text/event-stream`, pris en charge nativement par les navigateurs via l’API [`EventSource`](https://developer.mozilla.org/en-US/docs/Web/API/EventSource).
-/// info | Info
+/// note | Remarque
Ajouté dans FastAPI 0.135.0.
diff --git a/docs/fr/docs/tutorial/sql-databases.md b/docs/fr/docs/tutorial/sql-databases.md
index 70e5b1dba..2f6aad3a9 100644
--- a/docs/fr/docs/tutorial/sql-databases.md
+++ b/docs/fr/docs/tutorial/sql-databases.md
@@ -30,7 +30,7 @@ Il existe un générateur de projet officiel avec **FastAPI** et **PostgreSQL**,
///
-Il s'agit d'un tutoriel très simple et court ; si vous souhaitez apprendre sur les bases de données en général, sur SQL, ou des fonctionnalités plus avancées, allez voir la [documentation SQLModel](https://sqlmodel.tiangolo.com/).
+Il s'agit d'un tutoriel très simple et court ; si vous souhaitez apprendre sur les bases de données en général, sur SQL, ou des fonctionnalités plus avancées, allez voir les [documents de SQLModel](https://sqlmodel.tiangolo.com/).
## Installer `SQLModel` { #install-sqlmodel }
@@ -57,15 +57,15 @@ Importez `SQLModel` et créez un modèle de base de données :
{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[1:11] hl[7:11] *}
-La classe `Hero` est très similaire à un modèle Pydantic (en fait, en dessous, c'est réellement un modèle Pydantic).
+La classe `Hero` est très similaire à un modèle Pydantic (en fait, en dessous, c'est réellement *un modèle Pydantic*).
Il y a quelques différences :
* `table=True` indique à SQLModel qu'il s'agit d'un *modèle de table*, il doit représenter une **table** dans la base SQL, ce n'est pas seulement un *modèle de données* (comme le serait n'importe quelle autre classe Pydantic classique).
-* `Field(primary_key=True)` indique à SQLModel que `id` est la **clé primaire** dans la base SQL (vous pouvez en savoir plus sur les clés primaires SQL dans la documentation SQLModel).
+* `Field(primary_key=True)` indique à SQLModel que `id` est la **clé primaire** dans la base SQL (vous pouvez en savoir plus sur les clés primaires SQL dans les documents de SQLModel).
- Remarque : nous utilisons `int | None` pour le champ clé primaire afin qu'en Python nous puissions *créer un objet sans `id`* (`id=None`), en supposant que la base *le génère à l'enregistrement*. SQLModel comprend que la base fournira l'`id` et *définit la colonne comme un `INTEGER` non nul* dans le schéma de base. Voir la [documentation SQLModel sur les clés primaires](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id) pour plus de détails.
+ **Remarque :** nous utilisons `int | None` pour le champ clé primaire afin qu'en Python nous puissions *créer un objet sans `id`* (`id=None`), en supposant que la base *le génère à l'enregistrement*. SQLModel comprend que la base fournira l'`id` et *définit la colonne comme un `INTEGER` non nul* dans le schéma de base. Voir les [documents de SQLModel sur les clés primaires](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id) pour plus de détails.
* `Field(index=True)` indique à SQLModel qu'il doit créer un **index SQL** pour cette colonne, ce qui permettra des recherches plus rapides dans la base lors de la lecture de données filtrées par cette colonne.
@@ -121,7 +121,7 @@ Comme chaque modèle SQLModel est aussi un modèle Pydantic, vous pouvez l'utili
Par exemple, si vous déclarez un paramètre de type `Hero`, il sera lu depuis le **corps JSON**.
-De la même manière, vous pouvez le déclarer comme **type de retour** de la fonction, et alors la forme des données apparaîtra dans l'UI automatique de documentation de l'API.
+De la même manière, vous pouvez le déclarer comme **type de retour** de la fonction, et alors la forme des données apparaîtra dans l'UI automatique des documents de l'API.
{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[40:45] hl[40:45] *}
@@ -173,7 +173,7 @@ Si vous vérifiez l'application précédente, dans l'UI vous pouvez voir que, ju
Nous ne devrions pas laisser cela se produire, ils pourraient écraser un `id` que nous avons déjà attribué dans la base. Décider de l'`id` doit être fait par le **backend** ou la **base**, **pas par le client**.
-De plus, nous créons un `secret_name` pour le héros, mais jusqu'ici, nous le renvoyons partout, ce n'est pas très « secret » ... 😅
+De plus, nous créons un `secret_name` pour le héros, mais jusqu'ici, nous le renvoyons partout, ce n'est pas très **secret** ... 😅
Nous allons corriger ces choses en ajoutant quelques **modèles supplémentaires**. C'est là que SQLModel brille. ✨
@@ -354,4 +354,4 @@ Si vous allez sur l'UI `/docs` de l'API, vous verrez qu'elle est maintenant à j
Vous pouvez utiliser [**SQLModel**](https://sqlmodel.tiangolo.com/) pour interagir avec une base SQL et simplifier le code avec des *modèles de données* et des *modèles de table*.
-Vous pouvez en apprendre beaucoup plus dans la documentation **SQLModel**, il y a un mini [tutoriel plus long sur l'utilisation de SQLModel avec **FastAPI**](https://sqlmodel.tiangolo.com/tutorial/fastapi/). 🚀
+Vous pouvez en apprendre beaucoup plus dans les documents de **SQLModel**, il y a un mini [tutoriel plus long sur l'utilisation de SQLModel avec **FastAPI**](https://sqlmodel.tiangolo.com/tutorial/fastapi/). 🚀
diff --git a/docs/fr/docs/tutorial/static-files.md b/docs/fr/docs/tutorial/static-files.md
index 6a54840af..cfbbe86b9 100644
--- a/docs/fr/docs/tutorial/static-files.md
+++ b/docs/fr/docs/tutorial/static-files.md
@@ -2,6 +2,14 @@
Vous pouvez servir des fichiers statiques automatiquement à partir d'un répertoire en utilisant `StaticFiles`.
+/// tip | Astuce
+
+Si vous devez héberger un frontend, utilisez plutôt `app.frontend()`, lisez-en davantage dans [Frontend](frontend.md).
+
+`app.frontend()` utilise `StaticFiles` en interne, avec plusieurs avantages supplémentaires pour les frontends, comme la gestion du routing côté client.
+
+///
+
## Utiliser `StaticFiles` { #use-staticfiles }
- Importer `StaticFiles`.
diff --git a/docs/fr/docs/tutorial/stream-json-lines.md b/docs/fr/docs/tutorial/stream-json-lines.md
index aed0205cb..c06c0e006 100644
--- a/docs/fr/docs/tutorial/stream-json-lines.md
+++ b/docs/fr/docs/tutorial/stream-json-lines.md
@@ -1,8 +1,8 @@
# Diffuser des JSON Lines { #stream-json-lines }
-Vous pouvez avoir une séquence de données que vous souhaitez envoyer en « flux » ; vous pouvez le faire avec « JSON Lines ».
+Vous pouvez avoir une séquence de données que vous souhaitez envoyer en « flux », vous pouvez le faire avec « JSON Lines ».
-/// info
+/// note | Remarque
Ajouté dans FastAPI 0.134.0.
@@ -48,7 +48,7 @@ Une réponse aurait un type de contenu `application/jsonl` (au lieu de `applicat
C'est très similaire à un tableau JSON (équivalent d'une liste Python), mais au lieu d'être entouré de `[]` et d'avoir des `,` entre les éléments, il y a un objet JSON par ligne, ils sont séparés par un caractère de saut de ligne.
-/// info
+/// note | Remarque
Le point important est que votre application pourra produire chaque ligne à son tour, tandis que le client consomme les lignes précédentes.
diff --git a/docs/fr/docs/tutorial/testing.md b/docs/fr/docs/tutorial/testing.md
index 5cb2ee629..883a61155 100644
--- a/docs/fr/docs/tutorial/testing.md
+++ b/docs/fr/docs/tutorial/testing.md
@@ -8,11 +8,11 @@ Avec cela, vous pouvez utiliser [pytest](https://docs.pytest.org/) directement a
## Utiliser `TestClient` { #using-testclient }
-/// info
+/// note | Remarque
Pour utiliser `TestClient`, installez d’abord [`httpx`](https://www.python-httpx.org).
-Vous devez créer un [environnement virtuel](../virtual-environments.md), l’activer, puis y installer le paquet, par exemple :
+Vous devez vous assurer de créer un [environnement virtuel](../virtual-environments.md), de l’activer, puis d’y installer le paquet, par exemple :
```console
$ pip install httpx
@@ -144,7 +144,7 @@ Par exemple :
Pour plus d’informations sur la manière de transmettre des données au backend (en utilisant `httpx` ou le `TestClient`), consultez la [documentation HTTPX](https://www.python-httpx.org).
-/// info
+/// note | Remarque
Notez que le `TestClient` reçoit des données qui peuvent être converties en JSON, pas des modèles Pydantic.
@@ -156,7 +156,7 @@ Si vous avez un modèle Pydantic dans votre test et que vous souhaitez envoyer s
Après cela, vous avez simplement besoin d’installer `pytest`.
-Vous devez créer un [environnement virtuel](../virtual-environments.md), l’activer, puis y installer le paquet, par exemple :
+Vous devez vous assurer de créer un [environnement virtuel](../virtual-environments.md), de l’activer, puis d’y installer le paquet, par exemple :
lt
+* XWT
+* PSGI
+
+### abbr एक पूरा वाक्यांश और उसका स्पष्टीकरण देता है { #the-abbr-gives-a-full-phrase-and-an-explanation }
+
+* MDN
+* I/O.
+
+////
+
+//// tab | जानकारी
+
+"abbr" एलिमेंट्स के "title" ऐट्रिब्यूट्स का अनुवाद कुछ विशिष्ट निर्देशों का पालन करते हुए किया जाता है।
+
+अनुवाद अपने स्वयं के "abbr" एलिमेंट्स जोड़ सकते हैं जिन्हें LLM को हटाना नहीं चाहिए। जैसे अंग्रेज़ी शब्दों को समझाने के लिए।
+
+`scripts/translate.py` में जनरल प्रॉम्प्ट के सेक्शन `### HTML abbr elements` देखें।
+
+////
+
+## HTML "dfn" एलिमेंट्स { #html-dfn-elements }
+
+* क्लस्टर
+* डीप लर्निंग
+
+## शीर्षक { #headings }
+
+//// tab | परीक्षण
+
+### एक वेबऐप विकसित करें - एक ट्यूटोरियल { #develop-a-webapp-a-tutorial }
+
+नमस्ते।
+
+### टाइप हिंट्स और -एनोटेशन्स { #type-hints-and-annotations }
+
+फिर से नमस्ते।
+
+### सुपर- और सबक्लासेज़ { #super-and-subclasses }
+
+फिर से नमस्ते।
+
+////
+
+//// tab | जानकारी
+
+शीर्षकों के लिए एकमात्र कड़ा नियम यह है कि LLM कर्ली ब्रैकेट्स के अंदर के हैश-पार्ट को अपरिवर्तित छोड़े, जिससे लिंक न टूटें।
+
+`scripts/translate.py` में जनरल प्रॉम्प्ट के सेक्शन `### Headings` देखें।
+
+कुछ भाषा-विशिष्ट निर्देशों के लिए, जैसे `docs/de/llm-prompt.md` में सेक्शन `### Headings` देखें।
+
+////
+
+## डॉक्स में प्रयुक्त शब्द { #terms-used-in-the-docs }
+
+//// tab | परीक्षण
+
+* आप
+* आपका
+
+* उदा.
+* आदि
+
+* `foo` एक `int` के रूप में
+* `bar` एक `str` के रूप में
+* `baz` एक `list` के रूप में
+
+* ट्यूटोरियल - उपयोगकर्ता गाइड
+* उन्नत उपयोगकर्ता गाइड
+* SQLModel डॉक्स
+* API डॉक्स
+* स्वचालित डॉक्स
+
+* डेटा साइंस
+* डीप लर्निंग
+* मशीन लर्निंग
+* डिपेंडेंसी इंजेक्शन
+* HTTP बेसिक ऑथेंटिकेशन
+* HTTP डाइजेस्ट
+* ISO फ़ॉरमैट
+* JSON Schema मानक
+* JSON स्कीमा
+* स्कीमा परिभाषा
+* पासवर्ड फ्लो
+* मोबाइल
+
+* अप्रचलित
+* डिज़ाइन किया गया
+* अमान्य
+* तुरंत
+* मानक
+* डिफ़ॉल्ट
+* केस-संवेदी
+* केस-असंवेदी
+
+* एप्लिकेशन को सर्व करना
+* पेज को सर्व करना
+
+* ऐप
+* एप्लिकेशन
+
+* रिक्वेस्ट
+* रिस्पांस
+* त्रुटि रिस्पांस
+
+* पाथ ऑपरेशन
+* पाथ ऑपरेशन डेकोरेटर
+* पाथ ऑपरेशन फ़ंक्शन
+
+* बॉडी
+* रिक्वेस्ट बॉडी
+* रिस्पांस बॉडी
+* JSON बॉडी
+* फॉर्म बॉडी
+* फ़ाइल बॉडी
+* फ़ंक्शन बॉडी
+
+* पैरामीटर
+* बॉडी पैरामीटर
+* पाथ पैरामीटर
+* क्वेरी पैरामीटर
+* कुकी पैरामीटर
+* हेडर पैरामीटर
+* फॉर्म पैरामीटर
+* फ़ंक्शन पैरामीटर
+
+* इवेंट
+* स्टार्टअप इवेंट
+* सर्वर का स्टार्टअप
+* शटडाउन इवेंट
+* लाइफस्पैन इवेंट
+
+* हैंडलर
+* इवेंट हैंडलर
+* एक्सेप्शन हैंडलर
+* हैंडल करना
+
+* मॉडल
+* Pydantic मॉडल
+* डेटा मॉडल
+* डेटाबेस मॉडल
+* फॉर्म मॉडल
+* मॉडल ऑब्जेक्ट
+
+* क्लास
+* बेस क्लास
+* पैरेंट क्लास
+* सबक्लास
+* चाइल्ड क्लास
+* सिब्लिंग क्लास
+* क्लास मेथड
+
+* हेडर
+* हेडर्स
+* ऑथराइज़ेशन हेडर
+* `Authorization` हेडर
+* फॉरवर्डेड हेडर
+
+* डिपेंडेंसी इंजेक्शन सिस्टम
+* डिपेंडेंसी
+* डिपेंडेबल
+* डिपेन्डन्ट
+
+* I/O बाउंड
+* CPU बाउंड
+* समकालिकता
+* समान्तरता
+* मल्टीप्रोसेसिंग
+
+* env var
+* पर्यावरण चर
+* `PATH`
+* `PATH` वेरिएबल
+
+* प्रमाणीकरण
+* प्रमाणीकरण प्रदाता
+* अधिकारीकरण
+* अधिकारीकरण फॉर्म
+* अधिकारीकरण प्रदाता
+* उपयोगकर्ता प्रमाणीकरण करता है
+* सिस्टम उपयोगकर्ता का प्रमाणीकरण करता है
+
+* CLI
+* कमांड लाइन इंटरफेस
+
+* सर्वर
+* क्लाइंट
+
+* क्लाउड प्रदाता
+* क्लाउड सेवा
+
+* विकास
+* विकास चरण
+
+* dict
+* डिक्शनरी
+* एन्युमरेशन
+* एनम
+* एनम सदस्य
+
+* एन्कोडर
+* डीकोडर
+* एन्कोड करना
+* डीकोड करना
+
+* एक्सेप्शन
+* रेज़ करना
+
+* एक्सप्रेशन
+* स्टेटमेंट
+
+* फ्रंटएंड
+* बैकएंड
+
+* GitHub चर्चा
+* GitHub इश्यू
+
+* प्रदर्शन
+* प्रदर्शन अनुकूलन
+
+* रिटर्न टाइप
+* रिटर्न वैल्यू
+
+* सुरक्षा
+* सुरक्षा स्कीम
+
+* टास्क
+* बैकग्राउंड टास्क
+* टास्क फ़ंक्शन
+
+* टेम्पलेट
+* टेम्पलेट इंजन
+
+* टाइप एनोटेशन
+* टाइप हिंट
+
+* सर्वर वर्कर
+* Uvicorn वर्कर
+* Gunicorn Worker
+* वर्कर प्रोसेस
+* वर्कर क्लास
+* वर्कलोड
+
+* डिप्लॉयमेंट
+* डिप्लॉय करना
+
+* SDK
+* सॉफ़्टवेयर डेवलपमेंट किट
+
+* `APIRouter`
+* `requirements.txt`
+* Bearer Token
+* ब्रेकिंग चेंज
+* बग
+* बटन
+* कॉल करने योग्य
+* कोड
+* कमिट
+* कॉन्टेक्स्ट मैनेजर
+* कोरूटीन
+* डेटाबेस सेशन
+* डिस्क
+* डोमेन
+* इंजन
+* नकली X
+* HTTP GET मेथड
+* आइटम
+* लाइब्रेरी
+* लाइफस्पैन
+* लॉक
+* मिडलवेयर
+* मोबाइल एप्लिकेशन
+* मॉड्यूल
+* माउंटिंग
+* नेटवर्क
+* ओरिजिन
+* ओवरराइड
+* पेलोड
+* प्रोसेसर
+* प्रॉपर्टी
+* प्रॉक्सी
+* पुल रिक्वेस्ट
+* क्वेरी
+* RAM
+* रिमोट मशीन
+* स्टेटस कोड
+* स्ट्रिंग
+* टैग
+* वेब फ़्रेमवर्क
+* वाइल्डकार्ड
+* वापस करना
+* सत्यापित करना
+
+////
+
+//// tab | जानकारी
+
+यह डॉक्स में दिखने वाले (ज़्यादातर) तकनीकी शब्दों की न तो पूर्ण और न ही मानक सूची है। यह प्रॉम्प्ट डिज़ाइनर को यह समझने में मदद कर सकती है कि किन शब्दों के लिए LLM को सहायक निर्देशों की ज़रूरत है। उदाहरण के लिए जब यह एक अच्छे अनुवाद को कमतर अनुवाद में वापस बदल देता है। या जब इसे आपकी भाषा में किसी शब्द का रूपांतरण/विभक्ति करने में समस्या होती है।
+
+उदाहरण के लिए `docs/de/llm-prompt.md` में सेक्शन `### List of English terms and their preferred German translations` देखें।
+
+////
diff --git a/docs/hi/docs/index.md b/docs/hi/docs/index.md
new file mode 100644
index 000000000..cbc81dbe5
--- /dev/null
+++ b/docs/hi/docs/index.md
@@ -0,0 +1,585 @@
+---
+include_yaml:
+ sponsors: data/sponsors.yml
+---
+
+# FastAPI { #fastapi }
+
+
+
+
++ FastAPI फ़्रेमवर्क, उच्च प्रदर्शन, सीखने में आसान, कोड लिखने में तेज़, प्रोडक्शन के लिए तैयार +
+ + +--- + +**दस्तावेज़**: [https://fastapi.tiangolo.com](https://fastapi.tiangolo.com/hi) + +**स्रोत कोड**: [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi) + +--- + +FastAPI एक आधुनिक, तेज़ (उच्च-प्रदर्शन) वेब फ़्रेमवर्क है जो मानक Python type hints के आधार पर Python से APIs बनाने के लिए है। + +मुख्य विशेषताएँ: + +* **तेज़**: बहुत उच्च प्रदर्शन, **NodeJS** और **Go** के समकक्ष (Starlette और Pydantic की बदौलत)। [उपलब्ध सबसे तेज़ Python फ़्रेमवर्क्स में से एक](#performance)। +* **कोड लिखने में तेज़**: फ़ीचर्स विकसित करने की गति लगभग 200% से 300% तक बढ़ाएँ। * +* **कम बग्स**: मानवीय (डेवलपर) त्रुटियों में लगभग 40% की कमी। * +* **सहज**: बेहतरीन एडिटर सपोर्ट। हर जगह ऑटो-कम्प्लीट। डिबगिंग में कम समय। +* **आसान**: इस्तेमाल और सीखने में आसान। दस्तावेज़ पढ़ने में कम समय। +* **संक्षिप्त**: कोड डुप्लीकेशन को न्यूनतम करें। प्रत्येक parameter declaration से कई फ़ीचर्स। कम बग्स। +* **मजबूत**: प्रोडक्शन-रेडी कोड प्राप्त करें। स्वतः इंटरैक्टिव दस्तावेज़ीकरण के साथ। +* **मानकों पर आधारित**: APIs के खुले मानकों पर आधारित (और पूर्णतः अनुकूल): [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (जिसे पहले Swagger कहा जाता था) और [JSON Schema](https://json-schema.org/)। + +* आंतरिक डेवलपमेंट टीम द्वारा प्रोडक्शन ऐप्स बनाते समय किए गए परीक्षणों के आधार पर अनुमान। + +## प्रायोजक { #sponsors } + + + +### कीस्टोन प्रायोजक { #keystone-sponsor } + + + +### गोल्ड प्रायोजक { #gold-sponsors } + + + +### सिल्वर प्रायोजक { #silver-sponsors } + + + + + +[अन्य प्रायोजक](https://fastapi.tiangolo.com/hi/fastapi-people/#sponsors) + +## विचार { #opinions } + + +"मैं इन दिनों FastAPI का बहुत उपयोग कर रहा/रही हूँ। वास्तव में मैं अपनी टीम की Microsoft में ML सेवाओं के लिए इसे उपयोग करने की योजना बना रहा/रही हूँ। इनमें से कुछ को मुख्य Windows प्रोडक्ट और कुछ Office प्रोडक्ट्स में इंटीग्रेट किया जा रहा है।"+
"हमने FastAPI लाइब्रेरी अपनाई ताकि एक REST सर्वर स्पॉन किया जा सके जिसे अन्दाज़ों/अनुमानों को प्राप्त करने के लिए क्वेरी किया जा सके।" [Ludwig के लिए]+
"Netflix हमारे संकट प्रबंधन ऑर्केस्ट्रेशन फ़्रेमवर्क: Dispatch के ओपन-सोर्स रिलीज़ की घोषणा करते हुए प्रसन्न है!" [FastAPI के साथ बनाया गया]+
"यदि कोई प्रोडक्शन Python API बनाना चाहता है, तो मैं FastAPI की अत्यधिक अनुशंसा करूंगा/करूंगी। यह सुंदरता से डिज़ाइन किया गया है, उपयोग में सरल है और बेहद स्केलेबल है — यह हमारी API-फर्स्ट डेवलपमेंट रणनीति का मुख्य घटक बन गया है।"+
+
+## FastAPI मिनी डॉक्यूमेंट्री { #fastapi-mini-documentary }
+
+साल 2025 के अंत में एक [FastAPI मिनी डॉक्यूमेंट्री](https://www.youtube.com/watch?v=mpR8ngthqiE) रिलीज़ हुई, आप इसे ऑनलाइन देख सकते हैं:
+
+
+
+## **Typer**, CLIs का FastAPI { #typer-the-fastapi-of-clis }
+
+async def का उपयोग करें...fastapi dev कमांड के बारे में...fastapi dev コマンドについてfastapi dev コマンドについて...
get オペレーション
-/// info | `@decorator` 情報
+/// note | `@decorator` 情報
Pythonにおける`@something`シンタックスはデコレータと呼ばれます。
diff --git a/docs/ja/docs/tutorial/frontend.md b/docs/ja/docs/tutorial/frontend.md
new file mode 100644
index 000000000..facbbc1d1
--- /dev/null
+++ b/docs/ja/docs/tutorial/frontend.md
@@ -0,0 +1,133 @@
+# フロントエンド { #frontend }
+
+`app.frontend()`(または `router.frontend()`)で静的なフロントエンドアプリを配信できます。
+
+これは、Vite を使った React、TanStack Router、Astro、Vue、Svelte、Angular、Solid など、静的ファイルを生成するフロントエンドツールで役立ちます。
+
+これらのツールでは、通常、次のようなコマンドでフロントエンドをビルドするステップがあります。
+
+```bash
+npm run build
+```
+
+これにより、フロントエンドファイルを含む `./dist/` のようなディレクトリが生成されます。
+
+`app.frontend()` を使うと、これらのフロントエンドフレームワークが必要とする規約に従って、そのディレクトリを配信できます。
+
+**FastAPI** は最初に *path operations* をチェックします。通常のルートに一致しなかった場合にのみフロントエンドファイルがチェックされるため、API には影響しません。
+
+## フロントエンドの配信 { #serve-a-frontend }
+
+たとえば `npm run build` でフロントエンドをビルドした後、生成されたファイルを `dist` などのディレクトリに配置します。
+
+プロジェクト構成は次のようになります。
+
+```text
+.
+├── pyproject.toml
+├── app
+│ ├── __init__.py
+│ └── main.py
+└── dist
+ ├── index.html
+ └── assets
+ └── app.js
+```
+
+そして `app.frontend()` で配信します。
+
+{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
+
+これにより、`/assets/app.js` へのリクエストで `dist/assets/app.js` を配信できます。
+
+**FastAPI** の *path operation* もある場合は、*path operation* が優先されます。
+
+## クライアントサイドルーティング { #client-side-routing }
+
+**single-page apps**(SPA)を含む多くのフロントエンドアプリは、クライアントサイドルーティングを使います。`/dashboard/settings` のようなパスは実際のファイルではなく、フレームワークが処理するものかもしれません。
+
+そのため、その URL に直接アクセスした場合(アプリ内で遷移するのではなく)、バックエンドは `index.html` からフロントエンドアプリを配信し、フロントエンドフレームワークがクライアントサイドルーティングを処理できるようにする必要があります。
+
+そのためには、`fallback="index.html"` を使います。
+
+{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *}
+
+**FastAPI** は、このフォールバックをブラウザのナビゲーションに見える `GET` および `HEAD` リクエストにのみ使用します。JavaScript、CSS、画像などの存在しないファイルは引き続き `404` を返します。
+
+`POST` や `PUT` など、他のメソッドのリクエストがフロントエンドのフォールバックにのみ一致するパスへ送られた場合も、`404` を返します。通常の **FastAPI** の *path operations* は、フロントエンドのルートよりも引き続き高い優先順位を持ちます。
+
+/// tip | 豆知識
+
+デフォルトでは、`fallback` の値は `fallback="auto"` です。ほとんどの場合、`fallback` を指定する必要はありません。詳細は以下を参照してください。
+
+///
+
+これは、TanStack Router を使った React、Vue、Angular、SvelteKit、Solid など、クライアントサイドルーティングを使う多くのフロントエンドアプリで望まれる動作です。
+
+## カスタム 404 ページ { #custom-404-page }
+
+存在しないフロントエンドパスに対して、静的な `404.html` ページを配信することもできます。
+
+{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *}
+
+そのレスポンスはステータスコード `404` を保持します。
+
+この場合、**FastAPI** は存在しないフロントエンドパスに対して `index.html` を配信しません。代わりに `404.html` ファイルを返します。
+
+/// tip | 豆知識
+
+デフォルトでは、`fallback` の値は `fallback="auto"` です。これにより、`404.html` ファイルが見つかった場合、自動的にフォールバックとして使われます。
+
+そのため、通常は `fallback` 引数を省略できます。
+
+///
+
+これは、Astro のように各ページの静的 HTML ファイルを生成するフロントエンドツールで役立ちます。
+
+## 自動フォールバック { #fallback-auto }
+
+デフォルトでは、`app.frontend()` は `fallback="auto"` を使います。
+
+フロントエンドディレクトリに `404.html` ファイルがある場合、存在しないフロントエンドパスはそのファイルをステータスコード `404` で配信します。
+
+そうでない場合、`index.html` ファイルがあれば、存在しないブラウザナビゲーションのパスは `index.html` を配信します。これは、クライアントサイドルーティングを使う多くのフロントエンドアプリが期待する動作です。
+
+そのため、ほとんどの場合、`fallback` 引数を指定せずに `app.frontend("/", directory="dist")` を使用できます。
+
+{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
+
+## フォールバックの無効化 { #disable-fallback }
+
+存在しないフロントエンドパスに対してフォールバックファイルを配信したくない場合は、`fallback=None` を使います。
+
+{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *}
+
+すると、存在しないフロントエンドパスは通常の `404` を返します。
+
+## ディレクトリのチェック { #check-directory }
+
+デフォルトでは、`app.frontend()` はアプリ作成時にディレクトリが存在することをチェックします。
+
+これにより、設定エラーを早期に検出できます。たとえば、フロントエンドのビルド出力ディレクトリが存在しない場合、**FastAPI** は起動時にエラーを発生させます。
+
+アプリオブジェクトの作成後に別のビルドステップなどでフロントエンドファイルが作成される場合は、`check_dir=False` を設定します。
+
+{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *}
+
+`check_dir=False` を指定すると、**FastAPI** はアプリ作成時にディレクトリをチェックしません。リクエストが処理される時点で設定されたディレクトリがまだ存在しない場合、**FastAPI** はその時点でエラーを発生させます。
+
+## `APIRouter` での使用 { #use-it-with-apirouter }
+
+フロントエンドファイルを `APIRouter` に追加し、prefix 付きで include することもできます。
+
+{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *}
+
+この例では、フロントエンドのパスは `/app` 配下で配信されます。
+
+他の router 内のものを含め、アプリ内の通常の *path operations* は引き続き優先されます。
+
+## 静的ビルド出力のみ { #static-build-output-only }
+
+`app.frontend()` は、フロントエンドのビルドで既に生成されたファイルを配信します。
+
+server-side rendering は実行しません。これは静的ファイルを生成するフロントエンドフレームワーク向けであり、各リクエストごとにサーバー上で動的レンダリングを必要とするフレームワーク向けではありません。
diff --git a/docs/ja/docs/tutorial/handling-errors.md b/docs/ja/docs/tutorial/handling-errors.md
index 8d0190cb0..491b72da2 100644
--- a/docs/ja/docs/tutorial/handling-errors.md
+++ b/docs/ja/docs/tutorial/handling-errors.md
@@ -1,5 +1,6 @@
# エラーハンドリング { #handling-errors }
+
APIを使用しているクライアントにエラーを通知する必要がある状況はたくさんあります。
このクライアントは、フロントエンドを持つブラウザ、誰かのコード、IoTデバイスなどが考えられます。
diff --git a/docs/ja/docs/tutorial/index.md b/docs/ja/docs/tutorial/index.md
index 8182c92ae..42b0eb523 100644
--- a/docs/ja/docs/tutorial/index.md
+++ b/docs/ja/docs/tutorial/index.md
@@ -1,5 +1,6 @@
# チュートリアル - ユーザーガイド { #tutorial-user-guide }
+
このチュートリアルでは、**FastAPI**のほとんどの機能を使う方法を段階的に紹介します。
各セクションは前のセクションを踏まえた内容になっています。しかし、トピックごとに分割されているので、特定のAPIのニーズを満たすために、任意の特定のトピックに直接進めるようになっています。
diff --git a/docs/ja/docs/tutorial/metadata.md b/docs/ja/docs/tutorial/metadata.md
index 6802e6c9a..0f5f0cb6c 100644
--- a/docs/ja/docs/tutorial/metadata.md
+++ b/docs/ja/docs/tutorial/metadata.md
@@ -11,10 +11,10 @@ OpenAPI仕様および自動APIドキュメントUIで使用される次のフ
| `title` | `str` | APIのタイトルです。 |
| `summary` | `str` | APIの短い要約です。 OpenAPI 3.1.0、FastAPI 0.99.0 以降で利用できます。 |
| `description` | `str` | APIの短い説明です。Markdownを使用できます。 |
-| `version` | `string` | APIのバージョンです。これはOpenAPIのバージョンではなく、あなた自身のアプリケーションのバージョンです。たとえば `2.5.0` です。 |
+| `version` | `str` | APIのバージョンです。これはOpenAPIのバージョンではなく、あなた自身のアプリケーションのバージョンです。たとえば `2.5.0` です。 |
| `terms_of_service` | `str` | APIの利用規約へのURLです。指定する場合、URLである必要があります。 |
-| `contact` | `dict` | 公開されるAPIの連絡先情報です。複数のフィールドを含められます。 contact fields| Parameter | Type | Description |
|---|---|---|
name | str | 連絡先の個人/組織を識別する名前です。 |
url | str | 連絡先情報を指すURLです。URL形式である必要があります。 |
email | str | 連絡先の個人/組織のメールアドレスです。メールアドレス形式である必要があります。 |
license_info fields| Parameter | Type | Description |
|---|---|---|
name | str | 必須(license_info が設定されている場合)。APIに使用されるライセンス名です。 |
identifier | str | APIの [SPDX](https://spdx.org/licenses/) ライセンス式です。identifier フィールドは url フィールドと同時に指定できません。 OpenAPI 3.1.0、FastAPI 0.99.0 以降で利用できます。 |
url | str | APIに使用されるライセンスへのURLです。URL形式である必要があります。 |
contact のフィールド| パラメータ | 型 | 説明 |
|---|---|---|
name | str | 連絡先の個人/組織を識別する名前です。 |
url | str | 連絡先情報を指すURLです。URL形式である必要があります。 |
email | str | 連絡先の個人/組織のメールアドレスです。メールアドレス形式である必要があります。 |
license_info のフィールド| パラメータ | 型 | 説明 |
|---|---|---|
name | str | 必須(license_info が設定されている場合)。APIに使用されるライセンス名です。 |
identifier | str | APIの [SPDX](https://spdx.org/licenses/) ライセンス式です。identifier フィールドは url フィールドと同時に指定できません。 OpenAPI 3.1.0、FastAPI 0.99.0 以降で利用できます。 |
url | str | APIに使用されるライセンスへのURLです。URL形式である必要があります。 |
-/// check | 確認
+/// tip | 豆知識
繰り返しになりますが、同じPython型宣言を使用するだけで、**FastAPI**は対話的なドキュメントを自動的に生成します(Swagger UIを統合)。
diff --git a/docs/ja/docs/tutorial/query-params-str-validations.md b/docs/ja/docs/tutorial/query-params-str-validations.md
index d34059801..38d2b5c68 100644
--- a/docs/ja/docs/tutorial/query-params-str-validations.md
+++ b/docs/ja/docs/tutorial/query-params-str-validations.md
@@ -24,12 +24,12 @@ FastAPIは、 `q` はデフォルト値が `= None` であるため、必須で
そのために、まずは以下をインポートします:
-* `fastapi` から `Query`
-* `typing` から `Annotated`
+- `fastapi` から `Query`
+- `typing` から `Annotated`
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | 情報
+/// note | 備考
FastAPI はバージョン 0.95.0 で `Annotated` のサポートを追加し(推奨し始め)ました。
@@ -41,7 +41,7 @@ FastAPI はバージョン 0.95.0 で `Annotated` のサポートを追加し(
## `q` パラメータの型で `Annotated` を使う { #use-annotated-in-the-type-for-the-q-parameter }
-以前、[Python Types Intro](../python-types.md#type-hints-with-metadata-annotations) で `Annotated` を使ってパラメータにメタデータを追加できると説明したことを覚えていますか?
+以前、[Python 型入門](../python-types.md#type-hints-with-metadata-annotations) で `Annotated` を使ってパラメータにメタデータを追加できると説明したことを覚えていますか?
いよいよ FastAPI で使うときです。 🚀
@@ -79,9 +79,9 @@ q: Annotated[str | None] = None
FastAPI は次を行います:
-* 最大長が 50 文字であることを確かめるようデータを **検証** する
-* データが有効でないときに、クライアントに **明確なエラー** を表示する
-* OpenAPI スキーマの *path operation* にパラメータを **ドキュメント化** する(その結果、**自動ドキュメント UI** に表示されます)
+- 最大長が 50 文字であることを確かめるようデータを **検証** する
+- データが有効でないときに、クライアントに **明確なエラー** を表示する
+- OpenAPI スキーマの *path operation* にパラメータを **ドキュメント化** する(その結果、**自動ドキュメント UI** に表示されます)
## 代替(古い方法): デフォルト値としての `Query` { #alternative-old-query-as-the-default-value }
@@ -174,9 +174,9 @@ FastAPI なしで同じ関数を **別の場所** から **呼び出しても**
この特定の正規表現パターンは受け取ったパラメータの値をチェックします:
-* `^`: は、これ以降の文字で始まり、これより以前には文字はありません。
-* `fixedquery`: は、正確な`fixedquery`を持っています.
-* `$`: で終わる場合、`fixedquery`以降には文字はありません.
+- `^`: は、これ以降の文字で始まり、これより以前には文字はありません。
+- `fixedquery`: は、正確な`fixedquery`を持っています.
+- `$`: で終わる場合、`fixedquery`以降には文字はありません.
もしこれらすべての **「正規表現」** のアイデアについて迷っていても、心配しないでください。多くの人にとって難しい話題です。正規表現を必要としなくても、まだ、多くのことができます。
@@ -242,7 +242,7 @@ q: Annotated[str | None, Query(min_length=3)] = None
http://localhost:8000/items/?q=foo&q=bar
```
-*path operation function* 内の *function parameter* `q` で、複数の `q` *query parameters'* 値(`foo` と `bar`)を Python の `list` として受け取ります。
+*path operation function* 内の *function parameter* `q` で、複数の `q` *クエリパラメータ*の値(`foo` と `bar`)を Python の `list` として受け取ります。
そのため、このURLのレスポンスは以下のようになります:
@@ -382,7 +382,7 @@ Pydantic には [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/va
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | 情報
+/// note | 備考
これは Pydantic バージョン 2 以上で利用できます。 😎
@@ -432,16 +432,16 @@ Pydantic には [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/va
一般的なバリデーションとメタデータ:
-* `alias`
-* `title`
-* `description`
-* `deprecated`
+- `alias`
+- `title`
+- `description`
+- `deprecated`
文字列に固有のバリデーション:
-* `min_length`
-* `max_length`
-* `pattern`
+- `min_length`
+- `max_length`
+- `pattern`
`AfterValidator` を使ったカスタムバリデーション。
diff --git a/docs/ja/docs/tutorial/query-params.md b/docs/ja/docs/tutorial/query-params.md
index 51e4eb944..2bca43a95 100644
--- a/docs/ja/docs/tutorial/query-params.md
+++ b/docs/ja/docs/tutorial/query-params.md
@@ -1,5 +1,6 @@
# クエリパラメータ { #query-parameters }
+
パスパラメータではない関数パラメータを宣言すると、それらは自動的に「クエリ」パラメータとして解釈されます。
{* ../../docs_src/query_params/tutorial001_py310.py hl[9] *}
@@ -65,7 +66,7 @@ http://127.0.0.1:8000/items/?skip=20
この場合、関数パラメータ `q` はオプショナルとなり、デフォルトでは `None` になります。
-/// check | 確認
+/// tip | 豆知識
パスパラメータ `item_id` はパスパラメータであり、`q` はそれとは違ってクエリパラメータであると判別できるほど**FastAPI** が賢いということにも注意してください。
diff --git a/docs/ja/docs/tutorial/request-files.md b/docs/ja/docs/tutorial/request-files.md
index 30a494afb..f4bd2314b 100644
--- a/docs/ja/docs/tutorial/request-files.md
+++ b/docs/ja/docs/tutorial/request-files.md
@@ -1,8 +1,9 @@
# リクエストファイル { #request-files }
+
`File` を使って、クライアントがアップロードするファイルを定義できます。
-/// info | 情報
+/// note | 備考
アップロードされたファイルを受け取るには、まず [`python-multipart`](https://github.com/Kludex/python-multipart) をインストールします。
@@ -28,7 +29,7 @@ $ pip install python-multipart
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info | 情報
+/// note | 備考
`File` は `Form` を直接継承したクラスです。
diff --git a/docs/ja/docs/tutorial/request-form-models.md b/docs/ja/docs/tutorial/request-form-models.md
index 62aa9e298..6a71c149d 100644
--- a/docs/ja/docs/tutorial/request-form-models.md
+++ b/docs/ja/docs/tutorial/request-form-models.md
@@ -2,7 +2,7 @@
FastAPI では、フォームフィールドを宣言するために **Pydantic モデル**を使用できます。
-/// info | 情報
+/// note | 備考
フォームを使うには、まず [`python-multipart`](https://github.com/Kludex/python-multipart) をインストールします。
diff --git a/docs/ja/docs/tutorial/request-forms-and-files.md b/docs/ja/docs/tutorial/request-forms-and-files.md
index 651f07ff0..4865f29ae 100644
--- a/docs/ja/docs/tutorial/request-forms-and-files.md
+++ b/docs/ja/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
`File`と`Form`を同時に使うことでファイルとフォームフィールドを定義することができます。
-/// info | 情報
+/// note | 備考
アップロードされたファイルやフォームデータを受信するには、まず[`python-multipart`](https://github.com/Kludex/python-multipart)をインストールします。
diff --git a/docs/ja/docs/tutorial/request-forms.md b/docs/ja/docs/tutorial/request-forms.md
index c6b2a921a..0478a5439 100644
--- a/docs/ja/docs/tutorial/request-forms.md
+++ b/docs/ja/docs/tutorial/request-forms.md
@@ -2,7 +2,7 @@
JSONの代わりにフィールドを受け取る場合は、`Form`を使用します。
-/// info | 情報
+/// note | 備考
フォームを使うためには、まず[`python-multipart`](https://github.com/Kludex/python-multipart)をインストールします。
@@ -32,7 +32,7 @@ $ pip install python-multipart
`Form`では`Body`(および`Query`や`Path`、`Cookie`)と同じ設定を宣言することができます。これには、バリデーション、例、エイリアス(例えば`username`の代わりに`user-name`)などが含まれます。
-/// info | 情報
+/// note | 備考
`Form`は`Body`を直接継承するクラスです。
@@ -56,7 +56,7 @@ HTMLフォーム(``)がサーバにデータを送信する方
しかし、フォームがファイルを含む場合は、`multipart/form-data`としてエンコードされます。ファイルの扱いについては次の章で説明します。
-これらのエンコーディングやフォームフィールドの詳細については、[MDN の `POST` ウェブドキュメント](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST)を参照してください。
+これらのエンコーディングやフォームフィールドの詳細については、[MDN の `POST` のウェブドキュメント](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST)を参照してください。
///
@@ -70,4 +70,4 @@ HTMLフォーム(``)がサーバにデータを送信する方
## まとめ { #recap }
-フォームデータの入力パラメータを宣言するには、`Form`を使用する。
+フォームデータの入力パラメータを宣言するには、`Form`を使用します。
diff --git a/docs/ja/docs/tutorial/response-model.md b/docs/ja/docs/tutorial/response-model.md
index b4024e0a0..4b38e6de9 100644
--- a/docs/ja/docs/tutorial/response-model.md
+++ b/docs/ja/docs/tutorial/response-model.md
@@ -72,7 +72,7 @@ FastAPIはこの `response_model` を使って、データのドキュメント
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | 情報
+/// note | 備考
`EmailStr` を使用するには、最初に [`email-validator`](https://github.com/JoshData/python-email-validator) をインストールしてください。
@@ -251,7 +251,7 @@ Pydanticフィールドとして有効ではないものを返し、ツール(
}
```
-/// info | 情報
+/// note | 備考
以下も使用できます:
diff --git a/docs/ja/docs/tutorial/response-status-code.md b/docs/ja/docs/tutorial/response-status-code.md
index 9237ac784..e4239e11a 100644
--- a/docs/ja/docs/tutorial/response-status-code.md
+++ b/docs/ja/docs/tutorial/response-status-code.md
@@ -1,5 +1,6 @@
# レスポンスステータスコード { #response-status-code }
+
レスポンスモデルを指定するのと同じ方法で、レスポンスに使用されるHTTPステータスコードを以下の*path operations*のいずれかの`status_code`パラメータで宣言することもできます。
* `@app.get()`
@@ -18,7 +19,7 @@
`status_code`パラメータはHTTPステータスコードを含む数値を受け取ります。
-/// info | 情報
+/// note | 備考
`status_code`は代わりに、Pythonの[`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus)のように、`IntEnum`を受け取ることもできます。
diff --git a/docs/ja/docs/tutorial/schema-extra-example.md b/docs/ja/docs/tutorial/schema-extra-example.md
index 87ee85f40..e44e2471d 100644
--- a/docs/ja/docs/tutorial/schema-extra-example.md
+++ b/docs/ja/docs/tutorial/schema-extra-example.md
@@ -1,5 +1,6 @@
# リクエストのExampleデータの宣言 { #declare-request-example-data }
+
アプリが受け取れるデータの例を宣言できます。
ここでは、それを行ういくつかの方法を紹介します。
@@ -24,7 +25,7 @@
///
-/// info | 情報
+/// note | 備考
OpenAPI 3.1.0(FastAPI 0.99.0以降で使用)では、**JSON Schema**標準の一部である`examples`がサポートされました。
@@ -155,7 +156,7 @@ OpenAPIは、仕様の他の部分にも`example`と`examples`フィールドを
* `File()`
* `Form()`
-/// info | 情報
+/// note | 備考
この古いOpenAPI固有の`examples`パラメータは、FastAPI `0.103.0`以降は`openapi_examples`になりました。
@@ -171,7 +172,7 @@ OpenAPIは、仕様の他の部分にも`example`と`examples`フィールドを
JSON Schemaのこの新しい`examples`フィールドは、OpenAPIの他の場所(上で説明)にあるような追加メタデータを持つdictではなく、**単なる例の`list`**です。
-/// info | 情報
+/// note | 備考
OpenAPI 3.1.0がこのJSON Schemaとの新しいよりシンプルな統合とともにリリースされた後も、しばらくの間、自動ドキュメントを提供するツールであるSwagger UIはOpenAPI 3.1.0をサポートしていませんでした(バージョン5.0.0からサポートされています🎉)。
diff --git a/docs/ja/docs/tutorial/security/first-steps.md b/docs/ja/docs/tutorial/security/first-steps.md
index e678ebce1..e5d7c58b5 100644
--- a/docs/ja/docs/tutorial/security/first-steps.md
+++ b/docs/ja/docs/tutorial/security/first-steps.md
@@ -24,7 +24,7 @@
## 実行 { #run-it }
-/// info | 情報
+/// note | 備考
[`python-multipart`](https://github.com/Kludex/python-multipart) パッケージは、`pip install "fastapi[standard]"` コマンドを実行すると **FastAPI** と一緒に自動的にインストールされます。
@@ -60,7 +60,7 @@ $ fastapi dev
-/// check | Authorizeボタン!
+/// tip | Authorizeボタン!
すでにピカピカの新しい「Authorize」ボタンがあります。
@@ -109,7 +109,7 @@ OAuth2は、バックエンドやAPIがユーザーを認証するサーバー
* ユーザーがフロントエンドでクリックして、フロントエンドのWebアプリの別のセクションに移動します。
* フロントエンドはAPIからさらにデータを取得する必要があります。
* しかし、特定のエンドポイントの認証が必要です。
- * したがって、APIで認証するため、HTTPヘッダー`Authorization`に`Bearer`の文字列とトークンを加えた値を送信します。
+ * したがって、APIで認証するため、HTTPヘッダー`Authorization`に`Bearer `の文字列とトークンを加えた値を送信します。
* トークンに`foobar`が含まれている場合、`Authorization`ヘッダーの内容は次のようになります: `Bearer foobar`。
## **FastAPI**の`OAuth2PasswordBearer` { #fastapis-oauth2passwordbearer }
@@ -118,7 +118,7 @@ OAuth2は、バックエンドやAPIがユーザーを認証するサーバー
この例では、**Bearer**トークンを使用して**OAuth2**を**Password**フローで使用します。これには`OAuth2PasswordBearer`クラスを使用します。
-/// info | 情報
+/// note | 備考
「bearer」トークンが、唯一の選択肢ではありません。
@@ -148,7 +148,7 @@ OAuth2は、バックエンドやAPIがユーザーを認証するサーバー
実際の path operation もすぐに作ります。
-/// info | 情報
+/// note | 備考
非常に厳格な「Pythonista」であれば、パラメーター名のスタイルが`tokenUrl`ではなく`token_url`であることを気に入らないかもしれません。
@@ -176,9 +176,9 @@ oauth2_scheme(some, parameters)
**FastAPI**は、この依存関係を使用してOpenAPIスキーマ (および自動APIドキュメント) で「セキュリティスキーム」を定義できることを知っています。
-/// info | 技術詳細
+/// note | 技術詳細
-**FastAPI**は、`OAuth2PasswordBearer` クラス (依存関係で宣言されている) を使用してOpenAPIのセキュリティスキームを定義できることを知っています。これは`fastapi.security.oauth2.OAuth2`、`fastapi.security.base.SecurityBase`を継承しているからです。
+**FastAPI**は、`OAuth2PasswordBearer` クラス (依存関係で宣言されている) を使用してOpenAPIのセキュリティスキームを定義できることを知っています。これは、このクラスが`fastapi.security.oauth2.OAuth2`を継承しており、さらにそれが`fastapi.security.base.SecurityBase`を継承しているからです。
OpenAPIと統合するセキュリティユーティリティ (および自動APIドキュメント) はすべて`SecurityBase`を継承しています。それにより、**FastAPI**はそれらをOpenAPIに統合する方法を知ることができます。
diff --git a/docs/ja/docs/tutorial/security/get-current-user.md b/docs/ja/docs/tutorial/security/get-current-user.md
index 60378fd98..f8e4295bf 100644
--- a/docs/ja/docs/tutorial/security/get-current-user.md
+++ b/docs/ja/docs/tutorial/security/get-current-user.md
@@ -14,7 +14,7 @@
ボディを宣言するのにPydanticを使用するのと同じやり方で、Pydanticを別のどんなところでも使うことができます:
-{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
+{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## 依存関係 `get_current_user` を作成 { #create-a-get-current-user-dependency }
@@ -52,7 +52,7 @@ Pydanticモデルの `User` として、 `current_user` の型を宣言するこ
///
-/// check | 確認
+/// tip | 豆知識
依存関係システムがこのように設計されているおかげで、 `User` モデルを返却する別の依存関係(別の「dependables」)を持つことができます。
diff --git a/docs/ja/docs/tutorial/security/oauth2-jwt.md b/docs/ja/docs/tutorial/security/oauth2-jwt.md
index 9c527121e..40cefad9d 100644
--- a/docs/ja/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/ja/docs/tutorial/security/oauth2-jwt.md
@@ -1,6 +1,6 @@
# パスワード(およびハッシュ化)によるOAuth2、JWTトークンによるBearer { #oauth2-with-password-and-hashing-bearer-with-jwt-tokens }
-これでセキュリティの流れが全てわかったので、JWTトークンと安全なパスワードのハッシュ化を使用して、実際にアプリケーションを安全にしてみましょう。
+これでセキュリティの流れが全てわかったので、JWTトークンと安全なパスワードのハッシュ化を使用して、実際にアプリケーションを安全にしてみましょう。
このコードは、アプリケーションで実際に使用したり、パスワードハッシュをデータベースに保存するといった用途に利用できます。
@@ -42,11 +42,11 @@ $ pip install pyjwt
+
@@ -141,14 +141,14 @@
**본문**, **경로** 그리고 **쿼리** 매개변수 모두 동시에 선언할 수도 있습니다.
-**FastAPI**는 각각을 인지하고 데이터를 올바른 위치에 가져올 것입니다.
+**FastAPI**는 각각을 인지하고 데이터를 올바른 위치에서 가져올 것입니다.
{* ../../docs_src/body/tutorial004_py310.py hl[16] *}
함수 매개변수는 다음을 따라서 인지하게 됩니다:
* 만약 매개변수가 **경로**에도 선언되어 있다면, 이는 경로 매개변수로 사용될 것입니다.
-* 만약 매개변수가 (`int`, `float`, `str`, `bool` 등과 같은) **유일한 타입**으로 되어있으면, **쿼리** 매개변수로 해석될 것입니다.
+* 만약 매개변수가 (`int`, `float`, `str`, `bool` 등과 같은) **단일 타입**으로 되어있으면, **쿼리** 매개변수로 해석될 것입니다.
* 만약 매개변수가 **Pydantic 모델** 타입으로 선언되어 있으면, 요청 **본문**으로 해석될 것입니다.
/// note | 참고
@@ -163,4 +163,4 @@ FastAPI는 `q`의 값이 필요없음을 기본 값 `= None` 때문에 알게
## Pydantic없이 { #without-pydantic }
-만약 Pydantic 모델을 사용하고 싶지 않다면, **Body** 매개변수를 사용할 수도 있습니다. [Body - Multiple Parameters: Singular values in body](body-multiple-params.md#singular-values-in-body) 문서를 확인하세요.
+만약 Pydantic 모델을 사용하고 싶지 않다면, **Body** 매개변수를 사용할 수도 있습니다. [Body - 여러 매개변수: 본문의 단일 값](body-multiple-params.md#singular-values-in-body) 문서를 확인하세요.
diff --git a/docs/ko/docs/tutorial/cookie-param-models.md b/docs/ko/docs/tutorial/cookie-param-models.md
index 70b76e09c..2105bea86 100644
--- a/docs/ko/docs/tutorial/cookie-param-models.md
+++ b/docs/ko/docs/tutorial/cookie-param-models.md
@@ -32,7 +32,7 @@
-/// check | Authorize 버튼!
+/// tip | Authorize 버튼!
반짝이는 새 "Authorize" 버튼이 이미 있습니다.
@@ -118,7 +119,7 @@ OAuth2는 backend 또는 API가 사용자를 인증하는 서버와 독립적일
이 예제에서는 **OAuth2**의 **Password** 플로우와 **Bearer** token을 사용합니다. 이를 위해 `OAuth2PasswordBearer` 클래스를 사용합니다.
-/// info | 정보
+/// note | 참고
"bearer" token만이 유일한 선택지는 아닙니다.
@@ -148,7 +149,7 @@ OAuth2는 backend 또는 API가 사용자를 인증하는 서버와 독립적일
곧 실제 경로 처리를 만들 것입니다.
-/// info | 정보
+/// note | 참고
엄격한 "Pythonista"라면 `token_url` 대신 `tokenUrl` 같은 파라미터 이름 스타일이 마음에 들지 않을 수도 있습니다.
@@ -176,7 +177,7 @@ oauth2_scheme(some, parameters)
**FastAPI**는 이 의존성을 사용해 OpenAPI 스키마(및 자동 API 문서)에 "security scheme"를 정의할 수 있다는 것을 알게 됩니다.
-/// info | 기술 세부사항
+/// note | 기술 세부사항
**FastAPI**는 (의존성에 선언된) `OAuth2PasswordBearer` 클래스를 사용해 OpenAPI에서 보안 스킴을 정의할 수 있다는 것을 알고 있습니다. 이는 `OAuth2PasswordBearer`가 `fastapi.security.oauth2.OAuth2`를 상속하고, 이것이 다시 `fastapi.security.base.SecurityBase`를 상속하기 때문입니다.
diff --git a/docs/ko/docs/tutorial/security/get-current-user.md b/docs/ko/docs/tutorial/security/get-current-user.md
index eab599e27..4ff6ab4d2 100644
--- a/docs/ko/docs/tutorial/security/get-current-user.md
+++ b/docs/ko/docs/tutorial/security/get-current-user.md
@@ -14,7 +14,7 @@
Pydantic을 사용해 본문을 선언하는 것과 같은 방식으로, 다른 곳에서도 어디서든 사용할 수 있습니다:
-{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
+{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## `get_current_user` 의존성 생성하기 { #create-a-get-current-user-dependency }
@@ -52,7 +52,7 @@ Pydantic을 사용해 본문을 선언하는 것과 같은 방식으로, 다른
///
-/// check | 확인
+/// tip | 팁
이 의존성 시스템이 설계된 방식은 모두 `User` 모델을 반환하는 서로 다른 의존성(서로 다른 "dependables")을 가질 수 있도록 합니다.
diff --git a/docs/ko/docs/tutorial/security/oauth2-jwt.md b/docs/ko/docs/tutorial/security/oauth2-jwt.md
index 3c3b93e3a..f0b0176e0 100644
--- a/docs/ko/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/ko/docs/tutorial/security/oauth2-jwt.md
@@ -1,6 +1,7 @@
# 패스워드(해싱 포함)를 사용하는 OAuth2, JWT 토큰을 사용하는 Bearer { #oauth2-with-password-and-hashing-bearer-with-jwt-tokens }
-모든 보안 흐름을 구성했으므로, 이제 JWT 토큰과 안전한 패스워드 해싱을 사용해 애플리케이션을 실제로 안전하게 만들겠습니다.
+
+모든 보안 흐름을 구성했으므로, 이제 JWT 토큰과 안전한 패스워드 해싱을 사용해 애플리케이션을 실제로 안전하게 만들겠습니다.
이 코드는 실제로 애플리케이션에서 사용할 수 있으며, 패스워드 해시를 데이터베이스에 저장하는 등의 작업에 활용할 수 있습니다.
@@ -42,7 +43,7 @@ $ pip install pyjwt
lt
-* XWT
-* PSGI
+* GTD
+* lt
+* XWT
+* PSGI
### O abbr fornece uma frase completa e uma explicação { #the-abbr-gives-a-full-phrase-and-an-explanation }
-* MDN
-* I/O.
+* MDN
+* I/O.
////
diff --git a/docs/pt/docs/advanced/additional-responses.md b/docs/pt/docs/advanced/additional-responses.md
index 1df4b9851..1e68134d3 100644
--- a/docs/pt/docs/advanced/additional-responses.md
+++ b/docs/pt/docs/advanced/additional-responses.md
@@ -34,7 +34,7 @@ Lembre-se que você deve retornar o `JSONResponse` diretamente.
///
-/// info | Informação
+/// note | Nota
A chave `model` não é parte do OpenAPI.
@@ -183,7 +183,7 @@ Note que você deve retornar a imagem utilizando um `FileResponse` diretamente.
///
-/// info | Informação
+/// note | Nota
A menos que você especifique um media type diferente explicitamente em seu parâmetro `responses`, o FastAPI assumirá que o retorno possui o mesmo media type contido na classe principal de retorno (padrão `application/json`).
diff --git a/docs/pt/docs/advanced/additional-status-codes.md b/docs/pt/docs/advanced/additional-status-codes.md
index af1cefaf2..b702b8b41 100644
--- a/docs/pt/docs/advanced/additional-status-codes.md
+++ b/docs/pt/docs/advanced/additional-status-codes.md
@@ -30,12 +30,12 @@ Garanta que ele tenha toda informação que você deseja, e que os valores sejam
Você também pode utilizar `from starlette.responses import JSONResponse`.
-O **FastAPI** disponibiliza o `starlette.responses` como `fastapi.responses` apenas por conveniência para você, o programador. Porém a maioria dos retornos disponíveis vem diretamente do Starlette. O mesmo com `status`.
+O **FastAPI** disponibiliza o `starlette.responses` como `fastapi.responses` apenas por conveniência para você, o programador. Porém a maioria das respostas disponíveis vem diretamente do Starlette. O mesmo com `status`.
///
## OpenAPI e documentação da API { #openapi-and-api-docs }
-Se você retorna códigos de status adicionais e retornos diretamente, eles não serão incluídos no esquema do OpenAPI (a documentação da API), porque o FastAPI não tem como saber de antemão o que será retornado.
+Se você retorna códigos de status adicionais e respostas diretamente, eles não serão incluídos no esquema do OpenAPI (a documentação da API), porque o FastAPI não tem como saber de antemão o que será retornado.
-Mas você pode documentar isso no seu código, utilizando: [Retornos Adicionais](additional-responses.md).
+Mas você pode documentar isso no seu código, utilizando: [Respostas Adicionais](additional-responses.md).
diff --git a/docs/pt/docs/advanced/advanced-dependencies.md b/docs/pt/docs/advanced/advanced-dependencies.md
index dbcf99390..21c1490ff 100644
--- a/docs/pt/docs/advanced/advanced-dependencies.md
+++ b/docs/pt/docs/advanced/advanced-dependencies.md
@@ -1,5 +1,6 @@
# Dependências avançadas { #advanced-dependencies }
+
## Dependências parametrizadas { #parameterized-dependencies }
Todas as dependências que vimos até agora são funções ou classes fixas.
@@ -98,7 +99,7 @@ Por exemplo, se você tivesse uma sessão de banco de dados em uma dependência
Esse comportamento foi revertido na versão 0.118.0, para que o código de saída após o `yield` seja executado depois que a resposta for enviada.
-/// info | Informação
+/// note | Nota
Como você verá abaixo, isso é muito semelhante ao comportamento antes da versão 0.106.0, mas com várias melhorias e correções de bugs para casos extremos.
@@ -108,7 +109,7 @@ Como você verá abaixo, isso é muito semelhante ao comportamento antes da vers
Há alguns casos de uso, com condições específicas, que poderiam se beneficiar do comportamento antigo de executar o código de saída das dependências com `yield` antes de enviar a resposta.
-Por exemplo, imagine que você tem código que usa uma sessão de banco de dados em uma dependência com `yield` apenas para verificar um usuário, mas a sessão de banco de dados nunca é usada novamente na *função de operação de rota*, somente na dependência, e a resposta demora a ser enviada, como um `StreamingResponse` que envia dados lentamente, mas por algum motivo não usa o banco de dados.
+Por exemplo, imagine que você tem código que usa uma sessão de banco de dados em uma dependência com `yield` apenas para verificar um usuário, mas a sessão de banco de dados nunca é usada novamente na *função de operação de rota*, somente na dependência, e a response demora a ser enviada, como um `StreamingResponse` que envia dados lentamente, mas por algum motivo não usa o banco de dados.
Nesse caso, a sessão de banco de dados seria mantida até que a resposta termine de ser enviada, mas se você não a usa, então não seria necessário mantê-la.
diff --git a/docs/pt/docs/advanced/custom-response.md b/docs/pt/docs/advanced/custom-response.md
index a360bd3c9..3f8e8461c 100644
--- a/docs/pt/docs/advanced/custom-response.md
+++ b/docs/pt/docs/advanced/custom-response.md
@@ -41,7 +41,7 @@ Para retornar uma resposta com HTML diretamente do **FastAPI**, utilize `HTMLRes
{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *}
-/// info | Informação
+/// note | Nota
O parâmetro `response_class` também será usado para definir o "media type" da resposta.
@@ -65,7 +65,7 @@ Uma `Response` retornada diretamente em sua *função de operação de rota* nã
///
-/// info | Informação
+/// note | Nota
Obviamente, o cabeçalho `Content-Type`, o código de status, etc, virão do objeto `Response` que você retornou.
diff --git a/docs/pt/docs/advanced/dataclasses.md b/docs/pt/docs/advanced/dataclasses.md
index 9a1f212d6..f1cc5a070 100644
--- a/docs/pt/docs/advanced/dataclasses.md
+++ b/docs/pt/docs/advanced/dataclasses.md
@@ -8,7 +8,7 @@ Mas o FastAPI também suporta o uso de [`dataclasses`](https://docs.python.org/3
Isso ainda é suportado graças ao **Pydantic**, pois ele tem [suporte interno para `dataclasses`](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel).
-Então, mesmo com o código acima que não usa Pydantic explicitamente, o FastAPI está usando Pydantic para converter essas dataclasses padrão para a versão do Pydantic.
+Então, mesmo com o código acima que não usa Pydantic explicitamente, o FastAPI está usando Pydantic para converter essas dataclasses padrão para a própria versão de dataclasses do Pydantic.
E claro, ele suporta o mesmo:
@@ -18,7 +18,7 @@ E claro, ele suporta o mesmo:
Isso funciona da mesma forma que com os modelos Pydantic. E na verdade é alcançado da mesma maneira por baixo dos panos, usando Pydantic.
-/// info | Informação
+/// note | Nota
Lembre-se de que dataclasses não podem fazer tudo o que os modelos Pydantic podem fazer.
diff --git a/docs/pt/docs/advanced/events.md b/docs/pt/docs/advanced/events.md
index 7f15d833e..eee4dc880 100644
--- a/docs/pt/docs/advanced/events.md
+++ b/docs/pt/docs/advanced/events.md
@@ -1,5 +1,6 @@
# Eventos de lifespan { #lifespan-events }
+
Você pode definir a lógica (código) que deve ser executada antes da aplicação **inicializar**. Isso significa que esse código será executado **uma vez**, **antes** de a aplicação **começar a receber requisições**.
Da mesma forma, você pode definir a lógica (código) que deve ser executada quando a aplicação estiver **encerrando**. Nesse caso, esse código será executado **uma vez**, **depois** de possivelmente ter tratado **várias requisições**.
@@ -120,7 +121,7 @@ Para adicionar uma função que deve ser executada quando a aplicação estiver
Aqui, a função de manipulador do evento `shutdown` escreverá uma linha de texto `"Application shutdown"` no arquivo `log.txt`.
-/// info | Informação
+/// note | Nota
Na função `open()`, o `mode="a"` significa "acrescentar", então a linha será adicionada depois do que já estiver naquele arquivo, sem sobrescrever o conteúdo anterior.
@@ -152,7 +153,7 @@ Apenas um detalhe técnico para nerds curiosos. 🤓
Por baixo, na especificação técnica do ASGI, isso é parte do [Protocolo Lifespan](https://asgi.readthedocs.io/en/latest/specs/lifespan.html), e define eventos chamados `startup` e `shutdown`.
-/// info | Informação
+/// note | Nota
Você pode ler mais sobre os manipuladores de `lifespan` do Starlette na [Documentação do Lifespan do Starlette](https://www.starlette.dev/lifespan/).
diff --git a/docs/pt/docs/advanced/generate-clients.md b/docs/pt/docs/advanced/generate-clients.md
index e6279a48b..975fb902d 100644
--- a/docs/pt/docs/advanced/generate-clients.md
+++ b/docs/pt/docs/advanced/generate-clients.md
@@ -20,28 +20,13 @@ O FastAPI gera automaticamente especificações **OpenAPI 3.1**, então qualquer
///
-## Geradores de SDK dos patrocinadores do FastAPI { #sdk-generators-from-fastapi-sponsors }
-
-Esta seção destaca soluções **financiadas por investimento** e **com suporte de empresas** que patrocinam o FastAPI. Esses produtos fornecem **funcionalidades adicionais** e **integrações** além de SDKs gerados com alta qualidade.
-
-Ao ✨ [**patrocinar o FastAPI**](../help-fastapi.md#sponsor-the-author) ✨, essas empresas ajudam a garantir que o framework e seu **ecossistema** continuem saudáveis e **sustentáveis**.
-
-O patrocínio também demonstra um forte compromisso com a **comunidade** FastAPI (você), mostrando que elas se importam não apenas em oferecer um **ótimo serviço**, mas também em apoiar um **framework robusto e próspero**, o FastAPI. 🙇
-
-Por exemplo, você pode querer experimentar:
-
-* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
-* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi)
-
-Algumas dessas soluções também podem ser open source ou oferecer planos gratuitos, para que você possa testá-las sem compromisso financeiro. Outros geradores comerciais de SDK estão disponíveis e podem ser encontrados online. 🤓
-
## Crie um SDK em TypeScript { #create-a-typescript-sdk }
Vamos começar com uma aplicação FastAPI simples:
{* ../../docs_src/generate_clients/tutorial001_py310.py hl[7:9,12:13,16:17,21] *}
-Observe que as *operações de rota* definem os modelos que usam para o corpo da requisição e o corpo da resposta, usando os modelos `Item` e `ResponseMessage`.
+Observe que as *operações de rota* definem os modelos que usam para o payload da requisição e o payload da resposta, usando os modelos `Item` e `ResponseMessage`.
### Documentação da API { #api-docs }
@@ -73,7 +58,7 @@ Agora você pode importar e usar o código do cliente. Poderia ser assim, observ
-Você também obterá preenchimento automático para o corpo a ser enviado:
+Você também obterá preenchimento automático para o payload a enviar:
@@ -122,7 +107,7 @@ ItemsService.createItemItemsPost({name: "Plumbus", price: 5})
...isso ocorre porque o gerador de clientes usa o **ID de operação interno do OpenAPI** para cada *operação de rota*.
-O OpenAPI exige que cada ID de operação seja único em todas as *operações de rota*, então o FastAPI usa o **nome da função**, o **path** e o **método HTTP** para gerar esse ID de operação, porque dessa forma ele pode garantir que os IDs de operação sejam únicos.
+O OpenAPI exige que cada ID de operação seja único em todas as *operações de rota*, então o FastAPI usa o **nome da função**, o **path** e o **método/operação HTTP** para gerar esse ID de operação, porque dessa forma ele pode garantir que os IDs de operação sejam únicos.
Mas eu vou te mostrar como melhorar isso a seguir. 🤓
@@ -195,8 +180,8 @@ Depois de gerar o novo cliente, você terá agora **nomes de métodos “limpos
Ao usar os clientes gerados automaticamente, você terá **preenchimento automático** para:
* Métodos.
-* Corpos de requisições, parâmetros de query, etc.
-* Corpos de respostas.
+* Payloads de requisições no body, parâmetros de query, etc.
+* Payloads de respostas.
Você também terá **erros em linha** para tudo.
diff --git a/docs/pt/docs/advanced/json-base64-bytes.md b/docs/pt/docs/advanced/json-base64-bytes.md
index cc956da4f..8034430ab 100644
--- a/docs/pt/docs/advanced/json-base64-bytes.md
+++ b/docs/pt/docs/advanced/json-base64-bytes.md
@@ -4,7 +4,7 @@ Se sua aplicação precisa receber e enviar dados JSON, mas você precisa inclui
## Base64 vs Arquivos { #base64-vs-files }
-Primeiro, considere se você pode usar [Arquivos na request](../tutorial/request-files.md) para fazer upload de dados binários e [Response personalizada - FileResponse](./custom-response.md#fileresponse--fileresponse-) para enviar dados binários, em vez de codificá-los em JSON.
+Primeiro, considere se você pode usar [Arquivos na request](../tutorial/request-files.md) para fazer upload de dados binários e [Response personalizada - FileResponse](./custom-response.md#fileresponse) para enviar dados binários, em vez de codificá-los em JSON.
JSON só pode conter strings codificadas em UTF-8, portanto não pode conter bytes puros.
diff --git a/docs/pt/docs/advanced/openapi-callbacks.md b/docs/pt/docs/advanced/openapi-callbacks.md
index df9e7e0bf..08877e4f7 100644
--- a/docs/pt/docs/advanced/openapi-callbacks.md
+++ b/docs/pt/docs/advanced/openapi-callbacks.md
@@ -1,16 +1,16 @@
# Callbacks na OpenAPI { #openapi-callbacks }
-Você poderia criar uma API com uma *operação de rota* que poderia acionar um request a uma *API externa* criada por outra pessoa (provavelmente o mesmo desenvolvedor que estaria *usando* sua API).
+Você poderia criar uma API com uma *operação de rota* que poderia acionar um request para uma *API externa* criada por outra pessoa (provavelmente o mesmo desenvolvedor que estaria *usando* sua API).
O processo que acontece quando sua aplicação de API chama a *API externa* é chamado de "callback". Porque o software que o desenvolvedor externo escreveu envia um request para sua API e então sua API *chama de volta*, enviando um request para uma *API externa* (que provavelmente foi criada pelo mesmo desenvolvedor).
Nesse caso, você poderia querer documentar como essa API externa *deveria* ser. Que *operação de rota* ela deveria ter, que corpo ela deveria esperar, que resposta ela deveria retornar, etc.
-## Um aplicativo com callbacks { #an-app-with-callbacks }
+## Uma aplicação com callbacks { #an-app-with-callbacks }
Vamos ver tudo isso com um exemplo.
-Imagine que você desenvolve um aplicativo que permite criar faturas.
+Imagine que você desenvolve uma aplicação que permite criar faturas.
Essas faturas terão um `id`, `title` (opcional), `customer` e `total`.
@@ -23,11 +23,11 @@ Então sua API irá (vamos imaginar):
* Enviar a notificação de volta para o usuário da API (o desenvolvedor externo).
* Isso será feito enviando um request POST (de *sua API*) para alguma *API externa* fornecida por esse desenvolvedor externo (este é o "callback").
-## O aplicativo **FastAPI** normal { #the-normal-fastapi-app }
+## A aplicação **FastAPI** normal { #the-normal-fastapi-app }
-Vamos primeiro ver como o aplicativo da API normal se pareceria antes de adicionar o callback.
+Vamos primeiro ver como a aplicação da API normal se pareceria antes de adicionar o callback.
-Ele terá uma *operação de rota* que receberá um corpo `Invoice`, e um parâmetro de consulta `callback_url` que conterá a URL para o callback.
+Ela terá uma *operação de rota* que receberá um corpo `Invoice`, e um parâmetro de consulta `callback_url` que conterá a URL para o callback.
Essa parte é bastante normal, a maior parte do código provavelmente já é familiar para você:
@@ -45,7 +45,7 @@ A única novidade é o `callbacks=invoices_callback_router.routes` como argument
O código real do callback dependerá muito da sua própria aplicação de API.
-E provavelmente variará muito de um aplicativo para o outro.
+E provavelmente variará muito de uma aplicação para outra.
Poderia ser apenas uma ou duas linhas de código, como:
@@ -72,7 +72,7 @@ Ao implementar o callback por conta própria, você pode usar algo como [HTTPX](
## Escreva o código de documentação do callback { #write-the-callback-documentation-code }
-Esse código não será executado em seu aplicativo, nós só precisamos dele para *documentar* como essa *API externa* deveria ser.
+Esse código não será executado em sua aplicação, nós só precisamos dele para *documentar* como essa *API externa* deveria ser.
Mas, você já sabe como criar facilmente documentação automática para uma API com o **FastAPI**.
@@ -105,7 +105,7 @@ Ela deve parecer exatamente como uma *operação de rota* normal do FastAPI:
Há 2 diferenças principais de uma *operação de rota* normal:
-* Ela não necessita ter nenhum código real, porque seu aplicativo nunca chamará esse código. Ele é usado apenas para documentar a *API externa*. Então, a função poderia ter apenas `pass`.
+* Ela não necessita ter nenhum código real, porque sua aplicação nunca chamará esse código. Ele é usado apenas para documentar a *API externa*. Então, a função poderia ter apenas `pass`.
* O *path* pode conter uma [expressão OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) (veja mais abaixo) em que pode usar variáveis com parâmetros e partes do request original enviado para *sua API*.
### A expressão do path do callback { #the-callback-path-expression }
@@ -163,23 +163,23 @@ Perceba como a URL de callback usada contém a URL recebida como um parâmetro d
///
-### Adicione o roteador de callback { #add-the-callback-router }
+### Adicione o router de callback { #add-the-callback-router }
-Nesse ponto você tem a(s) *operação(ões) de rota de callback* necessária(s) (a(s) que o *desenvolvedor externo* deveria implementar na *API externa*) no roteador de callback que você criou acima.
+Nesse ponto você tem a(s) *operação(ões) de rota de callback* necessária(s) (a(s) que o *desenvolvedor externo* deveria implementar na *API externa*) no router de callback que você criou acima.
-Agora use o parâmetro `callbacks` no decorador da *operação de rota da sua API* para passar o atributo `.routes` (que é na verdade apenas uma `list` de rotas/*operações de path*) do roteador de callback:
+Agora use o parâmetro `callbacks` no decorador da *operação de rota da sua API* para passar o atributo `.routes` desse router de callback:
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
/// tip | Dica
-Perceba que você não está passando o roteador em si (`invoices_callback_router`) para `callback=`, mas o atributo `.routes`, como em `invoices_callback_router.routes`.
+Perceba que você não está passando o router em si (`invoices_callback_router`) para `callbacks=`, mas seu `.routes`, como em `invoices_callback_router.routes`. FastAPI usará essas rotas para gerar a documentação OpenAPI do callback.
///
### Verifique a documentação { #check-the-docs }
-Agora você pode iniciar seu aplicativo e ir para [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
+Agora você pode iniciar sua aplicação e ir para [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
Você verá sua documentação incluindo uma seção "Callbacks" para sua *operação de rota* que mostra como a *API externa* deveria ser:
diff --git a/docs/pt/docs/advanced/openapi-webhooks.md b/docs/pt/docs/advanced/openapi-webhooks.md
index 0c675089c..0e474c042 100644
--- a/docs/pt/docs/advanced/openapi-webhooks.md
+++ b/docs/pt/docs/advanced/openapi-webhooks.md
@@ -22,7 +22,7 @@ Com o **FastAPI**, utilizando o OpenAPI, você pode definir os nomes destes webh
Isto pode facilitar bastante para os seus usuários **implementarem as APIs deles** para receber as requisições dos seus **webhooks**, eles podem inclusive ser capazes de gerar parte do código da API deles.
-/// info | Informação
+/// note | Nota
Webhooks estão disponíveis a partir do OpenAPI 3.1.0, e possui suporte do FastAPI a partir da versão `0.99.0`.
@@ -36,7 +36,7 @@ Quando você cria uma aplicação com o **FastAPI**, existe um atributo chamado
Os webhooks que você define aparecerão no esquema do **OpenAPI** e na **página de documentação** gerada automaticamente.
-/// info | Informação
+/// note | Nota
O objeto `app.webhooks` é na verdade apenas um `APIRouter`, o mesmo tipo que você utilizaria ao estruturar a sua aplicação com diversos arquivos.
diff --git a/docs/pt/docs/advanced/path-operation-advanced-configuration.md b/docs/pt/docs/advanced/path-operation-advanced-configuration.md
index b9862876c..8aca43e08 100644
--- a/docs/pt/docs/advanced/path-operation-advanced-configuration.md
+++ b/docs/pt/docs/advanced/path-operation-advanced-configuration.md
@@ -16,17 +16,11 @@ Você deveria ter certeza que ele é único para cada operação.
### Utilizando o nome da *função de operação de rota* como o operationId { #using-the-path-operation-function-name-as-the-operationid }
-Se você quiser utilizar o nome das funções da sua API como `operationId`s, você pode iterar sobre todos esses nomes e sobrescrever o `operation_id` em cada *operação de rota* utilizando o `APIRoute.name` dela.
+Se você quiser utilizar os nomes das funções da sua API como `operationId`s, você pode passar uma `generate_unique_id_function` personalizada para o `FastAPI`.
-Você deveria fazer isso depois de adicionar todas as suas *operações de rota*.
+A função recebe cada `APIRoute` e retorna o `operationId` a ser usado para aquela operação de rota.
-{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}
-
-/// tip | Dica
-
-Se você chamar `app.openapi()` manualmente, você deveria atualizar os `operationId`s antes dessa chamada.
-
-///
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *}
/// warning | Atenção
diff --git a/docs/pt/docs/advanced/response-change-status-code.md b/docs/pt/docs/advanced/response-change-status-code.md
index 44ca6062a..1e902338b 100644
--- a/docs/pt/docs/advanced/response-change-status-code.md
+++ b/docs/pt/docs/advanced/response-change-status-code.md
@@ -18,7 +18,7 @@ Para estes casos, você pode utilizar um parâmetro `Response`.
Você pode declarar um parâmetro do tipo `Response` em sua *função de operação de rota* (assim como você pode fazer para cookies e headers).
-E então você pode definir o `status_code` neste objeto de retorno *temporal*.
+E então você pode definir o `status_code` neste objeto de retorno *temporário*.
{* ../../docs_src/response_change_status_code/tutorial001_py310.py hl[1,9,12] *}
@@ -26,6 +26,6 @@ E então você pode retornar qualquer objeto que você precise, como você faria
E se você declarar um `response_model`, ele ainda será utilizado para filtrar e converter o objeto que você retornou.
-O **FastAPI** utilizará este retorno *temporal* para extrair o código de status (e também cookies e headers), e irá colocá-los no retorno final que contém o valor que você retornou, filtrado por qualquer `response_model`.
+O **FastAPI** utilizará este retorno *temporário* para extrair o código de status (e também cookies e headers), e irá colocá-los no retorno final que contém o valor que você retornou, filtrado por qualquer `response_model`.
Você também pode declarar o parâmetro `Response` nas dependências, e definir o código de status nelas. Mas lembre-se que o último que for definido é o que prevalecerá.
diff --git a/docs/pt/docs/advanced/response-cookies.md b/docs/pt/docs/advanced/response-cookies.md
index 691bd1b9c..e77502750 100644
--- a/docs/pt/docs/advanced/response-cookies.md
+++ b/docs/pt/docs/advanced/response-cookies.md
@@ -30,7 +30,7 @@ Então, defina os cookies nela e a retorne:
Lembre-se de que se você retornar uma resposta diretamente em vez de usar o parâmetro `Response`, FastAPI a retornará diretamente.
-Portanto, você terá que garantir que seus dados sejam do tipo correto. E.g. será compatível com JSON se você estiver retornando um `JSONResponse`.
+Portanto, você terá que garantir que seus dados sejam do tipo correto. Por exemplo, será compatível com JSON se você estiver retornando um `JSONResponse`.
E também que você não esteja enviando nenhum dado que deveria ter sido filtrado por um `response_model`.
diff --git a/docs/pt/docs/advanced/response-directly.md b/docs/pt/docs/advanced/response-directly.md
index 9024897c1..cc1a630c3 100644
--- a/docs/pt/docs/advanced/response-directly.md
+++ b/docs/pt/docs/advanced/response-directly.md
@@ -18,7 +18,7 @@ Normalmente você terá um desempenho muito melhor usando um [Modelo de resposta
Você pode retornar uma `Response` ou qualquer subclasse dela.
-/// info | Informação
+/// note | Nota
A própria `JSONResponse` é uma subclasse de `Response`.
diff --git a/docs/pt/docs/advanced/response-headers.md b/docs/pt/docs/advanced/response-headers.md
index 7235b5eb8..08a1b6708 100644
--- a/docs/pt/docs/advanced/response-headers.md
+++ b/docs/pt/docs/advanced/response-headers.md
@@ -1,5 +1,6 @@
# Cabeçalhos de resposta { #response-headers }
+
## Use um parâmetro `Response` { #use-a-response-parameter }
Você pode declarar um parâmetro do tipo `Response` na sua *função de operação de rota* (assim como você pode fazer para cookies).
diff --git a/docs/pt/docs/advanced/security/oauth2-scopes.md b/docs/pt/docs/advanced/security/oauth2-scopes.md
index 7ea61ad60..b0b9e8348 100644
--- a/docs/pt/docs/advanced/security/oauth2-scopes.md
+++ b/docs/pt/docs/advanced/security/oauth2-scopes.md
@@ -2,9 +2,9 @@
Você pode utilizar escopos do OAuth2 diretamente com o **FastAPI**, eles são integrados para funcionar perfeitamente.
-Isso permitiria que você tivesse um sistema de permissionamento mais refinado, seguindo o padrão do OAuth2 integrado na sua aplicação OpenAPI (e as documentações da API).
+Isso permitiria que você tivesse um sistema de permissionamento mais refinado, seguindo o padrão OAuth2, integrado na sua aplicação OpenAPI (e a documentação da API).
-OAuth2 com escopos é o mecanismo utilizado por muitos provedores de autenticação, como o Facebook, Google, GitHub, Microsoft, X (Twitter), etc. Eles utilizam isso para prover permissões específicas para os usuários e aplicações.
+OAuth2 com escopos é o mecanismo utilizado por muitos grandes provedores de autenticação, como o Facebook, Google, GitHub, Microsoft, X (Twitter), etc. Eles utilizam isso para prover permissões específicas para os usuários e aplicações.
Toda vez que você "se autentica com" Facebook, Google, GitHub, Microsoft, X (Twitter), aquela aplicação está utilizando o OAuth2 com escopos.
@@ -34,7 +34,7 @@ O conteúdo de cada uma dessas strings pode ter qualquer formato, mas não devem
Estes escopos representam "permissões".
-No OpenAPI (e.g. os documentos da API), você pode definir "esquemas de segurança".
+No OpenAPI (por exemplo, a documentação da API), você pode definir "esquemas de segurança".
Quando um desses esquemas de segurança utiliza OAuth2, você pode também declarar e utilizar escopos.
@@ -42,11 +42,11 @@ Cada "escopo" é apenas uma string (sem espaços).
Eles são normalmente utilizados para declarar permissões de segurança específicas, como por exemplo:
-* `users:read` or `users:write` são exemplos comuns.
+* `users:read` ou `users:write` são exemplos comuns.
* `instagram_basic` é utilizado pelo Facebook / Instagram.
* `https://www.googleapis.com/auth/drive` é utilizado pelo Google.
-/// info | Informação
+/// note | Nota
No OAuth2, um "escopo" é apenas uma string que declara uma permissão específica necessária.
@@ -60,7 +60,7 @@ Para o OAuth2, eles são apenas strings.
## Visão global { #global-view }
-Primeiro, vamos olhar rapidamente as partes que mudam dos exemplos do **Tutorial - Guia de Usuário** para [OAuth2 com Senha (e hash), Bearer com tokens JWT](../../tutorial/security/oauth2-jwt.md). Agora utilizando escopos OAuth2:
+Primeiro, vamos olhar rapidamente as partes que mudam dos exemplos no **Tutorial - Guia de Usuário** principal para [OAuth2 com Senha (e hash), Bearer com tokens JWT](../../tutorial/security/oauth2-jwt.md). Agora utilizando escopos OAuth2:
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *}
@@ -74,7 +74,7 @@ O parâmetro `scopes` recebe um `dict` contendo cada escopo como chave e a descr
{* ../../docs_src/security/tutorial005_an_py310.py hl[63:66] *}
-Pelo motivo de estarmos declarando estes escopos, eles aparecerão nos documentos da API quando você se autenticar/autorizar.
+Pelo motivo de estarmos declarando estes escopos, eles aparecerão na documentação da API quando você se autenticar/autorizar.
E você poderá selecionar quais escopos você deseja dar acesso: `me` e `items`.
@@ -108,7 +108,7 @@ Para isso, nós importamos e utilizamos `Security` de `fastapi`.
Você pode utilizar `Security` para declarar dependências (assim como `Depends`), porém o `Security` também recebe o parâmetro `scopes` com uma lista de escopos (strings).
-Neste caso, nós passamos a função `get_current_active_user` como dependência para `Security` (da mesma forma que nós faríamos com `Depends`).
+Neste caso, nós passamos a função de dependência `get_current_active_user` para `Security` (da mesma forma que nós faríamos com `Depends`).
Mas nós também passamos uma `list` de escopos, neste caso com apenas um escopo: `items` (poderia ter mais).
@@ -142,7 +142,7 @@ Agora atualize a dependência `get_current_user`.
Este é o usado pelas dependências acima.
-Aqui é onde estamos utilizando o mesmo esquema OAuth2 que nós declaramos antes, declarando-o como uma dependência: `oauth2_scheme`.
+Aqui é onde estamos utilizando o mesmo esquema OAuth2 que nós criamos antes, declarando-o como uma dependência: `oauth2_scheme`.
Porque esta função de dependência não possui nenhum requerimento de escopo, nós podemos utilizar `Depends` com o `oauth2_scheme`. Nós não precisamos utilizar `Security` quando nós não precisamos especificar escopos de segurança.
@@ -235,7 +235,7 @@ Todos eles serão validados independentemente para cada *operação de rota*.
## Verifique { #check-it }
-Se você abrir os documentos da API, você pode autenticar e especificar quais escopos você quer autorizar.
+Se você abrir a documentação da API, você pode autenticar e especificar quais escopos você quer autorizar.
@@ -249,11 +249,11 @@ Isso é o que aconteceria se uma aplicação terceira que tentou acessar uma des
Neste exemplo nós estamos utilizando o fluxo de senha do OAuth2.
-Isso é apropriado quando nós estamos autenticando em nossa própria aplicação, provavelmente com o nosso próprio "*frontend*".
+Isso é apropriado quando nós estamos autenticando em nossa própria aplicação, provavelmente com o nosso próprio frontend.
Porque nós podemos confiar nele para receber o `username` e o `password`, pois nós controlamos isso.
-Mas se nós estamos construindo uma aplicação OAuth2 que outros poderiam conectar (i.e., se você está construindo um provedor de autenticação equivalente ao Facebook, Google, GitHub, etc.) você deveria utilizar um dos outros fluxos.
+Mas se nós estamos construindo uma aplicação OAuth2 que outros poderiam conectar (ou seja, se você está construindo um provedor de autenticação equivalente ao Facebook, Google, GitHub, etc.) você deveria utilizar um dos outros fluxos.
O mais comum é o fluxo implícito.
diff --git a/docs/pt/docs/advanced/settings.md b/docs/pt/docs/advanced/settings.md
index 371d5711b..029290aed 100644
--- a/docs/pt/docs/advanced/settings.md
+++ b/docs/pt/docs/advanced/settings.md
@@ -1,5 +1,6 @@
# Configurações e Variáveis de Ambiente { #settings-and-environment-variables }
+
Em muitos casos, sua aplicação pode precisar de configurações externas, por exemplo chaves secretas, credenciais de banco de dados, credenciais para serviços de e-mail, etc.
A maioria dessas configurações é variável (pode mudar), como URLs de banco de dados. E muitas podem ser sensíveis, como segredos.
diff --git a/docs/pt/docs/advanced/stream-data.md b/docs/pt/docs/advanced/stream-data.md
index 8e0bf08b6..1a9284a91 100644
--- a/docs/pt/docs/advanced/stream-data.md
+++ b/docs/pt/docs/advanced/stream-data.md
@@ -2,9 +2,9 @@
Se você quer transmitir dados que podem ser estruturados como JSON, você deveria [Transmitir JSON Lines](../tutorial/stream-json-lines.md).
-Mas se você quer transmitir dados binários puros ou strings, veja como fazer.
+Mas se você quer **transmitir dados binários puros** ou strings, veja como fazer.
-/// info | Informação
+/// note | Nota
Adicionado no FastAPI 0.134.0.
@@ -12,15 +12,15 @@ Adicionado no FastAPI 0.134.0.
## Casos de uso { #use-cases }
-Você pode usar isto para transmitir strings puras, por exemplo diretamente da saída de um serviço de AI LLM.
+Você pode usar isto para transmitir strings puras, por exemplo diretamente da saída de um serviço de **AI LLM**.
-Você também pode usá-lo para transmitir arquivos binários grandes, enviando cada bloco de dados à medida que o lê, sem precisar carregar tudo na memória de uma vez.
+Você também pode usá-lo para transmitir **arquivos binários grandes**, enviando cada bloco de dados à medida que o lê, sem precisar carregar tudo na memória de uma vez.
-Você também pode transmitir vídeo ou áudio desta forma; pode até ser gerado enquanto você processa e envia.
+Você também pode transmitir **vídeo** ou **áudio** desta forma; pode até ser gerado enquanto você processa e envia.
## Um `StreamingResponse` com `yield` { #a-streamingresponse-with-yield }
-Se você declarar `response_class=StreamingResponse` na sua função de operação de rota, você pode usar `yield` para enviar cada bloco de dados em sequência.
+Se você declarar `response_class=StreamingResponse` na sua *função de operação de rota*, você pode usar `yield` para enviar cada bloco de dados em sequência.
{* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *}
@@ -40,7 +40,7 @@ Como o FastAPI não tentará converter os dados para JSON com Pydantic nem seria
{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *}
-Isso também significa que, com `StreamingResponse`, você tem a liberdade e a responsabilidade de produzir e codificar os bytes exatamente como precisam ser enviados, independentemente das anotações de tipo. 🤓
+Isso também significa que, com `StreamingResponse`, você tem a **liberdade** e a **responsabilidade** de produzir e codificar os bytes exatamente como precisam ser enviados, independentemente das anotações de tipo. 🤓
### Transmitir bytes { #stream-bytes }
@@ -50,7 +50,7 @@ Um dos principais casos de uso é transmitir `bytes` em vez de strings; você po
## Um `PNGStreamingResponse` personalizado { #a-custom-pngstreamingresponse }
-Nos exemplos acima, os bytes eram transmitidos, mas a resposta não tinha um cabeçalho `Content-Type`, então o cliente não sabia que tipo de dado estava recebendo.
+Nos exemplos acima, os bytes eram transmitidos, mas a response não tinha um cabeçalho `Content-Type`, então o cliente não sabia que tipo de dado estava recebendo.
Você pode criar uma subclasse personalizada de `StreamingResponse` que define o cabeçalho `Content-Type` para o tipo de dado que você está transmitindo.
@@ -58,7 +58,7 @@ Por exemplo, você pode criar um `PNGStreamingResponse` que define o cabeçalho
{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *}
-Em seguida, você pode usar essa nova classe em `response_class=PNGStreamingResponse` na sua função de operação de rota:
+Em seguida, você pode usar essa nova classe em `response_class=PNGStreamingResponse` na sua *função de operação de rota*:
{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *}
@@ -78,7 +78,7 @@ Apenas para que possa viver no mesmo arquivo deste exemplo e você possa copiar
///
-Ao usar um bloco `with`, garantimos que o objeto semelhante a arquivo seja fechado após a função geradora (a função com `yield`) terminar. Ou seja, após terminar de enviar a resposta.
+Ao usar um bloco `with`, garantimos que o objeto semelhante a arquivo seja fechado após a função geradora (a função com `yield`) terminar. Ou seja, após terminar de enviar a response.
Isso não seria tão importante neste exemplo específico porque é um arquivo falso em memória (com `io.BytesIO`), mas com um arquivo real, seria importante garantir que o arquivo fosse fechado ao final do trabalho.
@@ -90,7 +90,7 @@ Por exemplo, eles não têm `await file.read()`, nem `async for chunk in file`.
E, em muitos casos, lê-los seria uma operação bloqueante (que poderia bloquear o loop de eventos), pois são lidos do disco ou da rede.
-/// info | Informação
+/// note | Nota
O exemplo acima é, na verdade, uma exceção, porque o objeto `io.BytesIO` já está em memória, então lê-lo não bloqueará nada.
@@ -98,7 +98,7 @@ Mas, em muitos casos, ler um arquivo ou um objeto semelhante a arquivo bloqueari
///
-Para evitar bloquear o loop de eventos, você pode simplesmente declarar a função de operação de rota com `def` normal em vez de `async def`. Assim, o FastAPI a executará em um worker de threadpool, evitando bloquear o loop principal.
+Para evitar bloquear o loop de eventos, você pode simplesmente declarar a *função de operação de rota* com `def` normal em vez de `async def`. Assim, o FastAPI a executará em um worker de threadpool, evitando bloquear o loop principal.
{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *}
diff --git a/docs/pt/docs/advanced/strict-content-type.md b/docs/pt/docs/advanced/strict-content-type.md
index 9530501d4..843caa848 100644
--- a/docs/pt/docs/advanced/strict-content-type.md
+++ b/docs/pt/docs/advanced/strict-content-type.md
@@ -1,6 +1,6 @@
# Verificação Estrita de Content-Type { #strict-content-type-checking }
-Por padrão, o **FastAPI** usa verificação estrita do cabeçalho `Content-Type` para corpos de requisição JSON; isso significa que requisições JSON devem incluir um `Content-Type` válido (por exemplo, `application/json`) para que o corpo seja interpretado como JSON.
+Por padrão, o **FastAPI** usa verificação estrita do cabeçalho `Content-Type` para corpos de requisição JSON; isso significa que requisições JSON **devem** incluir um `Content-Type` válido (por exemplo, `application/json`) para que o corpo seja interpretado como JSON.
## Risco de CSRF { #csrf-risk }
@@ -40,7 +40,7 @@ Observe que ambos têm o mesmo host.
Usando o frontend, você pode fazer o agente de IA executar ações em seu nome.
-Como está em execução localmente e não na Internet aberta, você decide não configurar autenticação, confiando apenas no acesso à rede local.
+Como está em execução **localmente** e não na Internet aberta, você decide **não configurar autenticação**, confiando apenas no acesso à rede local.
Então um de seus usuários poderia instalá-lo e executá-lo localmente.
@@ -69,9 +69,9 @@ Se sua aplicação está na Internet aberta, você não “confiaria na rede”
Atacantes poderiam simplesmente executar um script para enviar requisições à sua API, sem necessidade de interação do navegador, então você provavelmente já está protegendo quaisquer endpoints privilegiados.
-Nesse caso, esse ataque/risco não se aplica a você.
+Nesse caso, **esse ataque/risco não se aplica a você**.
-Esse risco e ataque é relevante principalmente quando a aplicação roda na rede local e essa é a única proteção presumida.
+Esse risco e ataque é relevante principalmente quando a aplicação roda na **rede local** e essa é a **única proteção presumida**.
## Permitindo Requisições sem Content-Type { #allowing-requests-without-content-type }
@@ -81,7 +81,7 @@ Se você precisa dar suporte a clientes que não enviam um cabeçalho `Content-T
Com essa configuração, requisições sem um cabeçalho `Content-Type` terão o corpo interpretado como JSON, o mesmo comportamento das versões mais antigas do FastAPI.
-/// info | Informação
+/// note | Nota
Esse comportamento e configuração foram adicionados no FastAPI 0.132.0.
diff --git a/docs/pt/docs/advanced/websockets.md b/docs/pt/docs/advanced/websockets.md
index 70b2ee853..5367a91be 100644
--- a/docs/pt/docs/advanced/websockets.md
+++ b/docs/pt/docs/advanced/websockets.md
@@ -111,7 +111,7 @@ Eles funcionam da mesma forma que para outros endpoints FastAPI/*operações de
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
-/// info | Informação
+/// note | Nota
Como isso é um WebSocket, não faz muito sentido levantar uma `HTTPException`, em vez disso levantamos uma `WebSocketException`.
diff --git a/docs/pt/docs/advanced/wsgi.md b/docs/pt/docs/advanced/wsgi.md
index 110bba053..fafa147fa 100644
--- a/docs/pt/docs/advanced/wsgi.md
+++ b/docs/pt/docs/advanced/wsgi.md
@@ -1,12 +1,13 @@
# Adicionando WSGI - Flask, Django, entre outros { #including-wsgi-flask-django-others }
+
Como você viu em [Subaplicações - Montagens](sub-applications.md) e [Atrás de um Proxy](behind-a-proxy.md), você pode montar aplicações WSGI.
Para isso, você pode utilizar o `WSGIMiddleware` para encapsular a sua aplicação WSGI, como por exemplo Flask, Django, etc.
## Usando `WSGIMiddleware` { #using-wsgimiddleware }
-/// info | Informação
+/// note | Nota
Isso requer instalar `a2wsgi`, por exemplo com `pip install a2wsgi`.
diff --git a/docs/pt/docs/alternatives.md b/docs/pt/docs/alternatives.md
index b32b260c3..8a63a3073 100644
--- a/docs/pt/docs/alternatives.md
+++ b/docs/pt/docs/alternatives.md
@@ -18,13 +18,13 @@ Mas em algum momento, não havia outra opção senão criar algo que fornecesse
É o framework Python mais popular e amplamente confiável. É utilizado para construir sistemas como o Instagram.
-É relativamente bem acoplado com bancos de dados relacionais (como MySQL ou PostgreSQL), então, ter um banco de dados NoSQL (como Couchbase, MongoDB, Cassandra, etc.) como mecanismo principal de armazenamento não é muito fácil.
+É relativamente fortemente acoplado com bancos de dados relacionais (como MySQL ou PostgreSQL), então, ter um banco de dados NoSQL (como Couchbase, MongoDB, Cassandra, etc.) como mecanismo principal de armazenamento não é muito fácil.
Foi criado para gerar o HTML no backend, não para criar APIs usadas por um frontend moderno (como React, Vue.js e Angular) ou por outros sistemas (como dispositivos IoT) comunicando com ele.
### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework }
-Django REST framework foi criado para ser uma caixa de ferramentas flexível para construção de APIs Web utilizando Django por baixo, para melhorar suas capacidades de API.
+Django REST Framework foi criado para ser uma caixa de ferramentas flexível para construção de APIs Web utilizando Django por baixo, para melhorar suas capacidades de API.
Ele é utilizado por muitas empresas incluindo Mozilla, Red Hat e Eventbrite.
@@ -88,7 +88,7 @@ O jeito de usar é muito simples. Por exemplo, para fazer uma requisição `GET`
response = requests.get("http://example.com/some/url")
```
-A contra-parte na aplicação FastAPI, a operação de rota, poderia ficar assim:
+A *operação de rota* da API equivalente no FastAPI poderia ficar assim:
```Python hl_lines="1"
@app.get("/some/url")
@@ -377,7 +377,7 @@ Agora APIStar é um conjunto de ferramentas para validar especificações OpenAP
/// note | Nota
-APIStar foi criado por Tom Christie. O mesmo cara que criou:
+APIStar foi criado por Tom Christie. A mesma pessoa que criou:
* Django REST Framework
* Starlette (no qual **FastAPI** é baseado)
diff --git a/docs/pt/docs/async.md b/docs/pt/docs/async.md
index 8c497d451..3fa92b085 100644
--- a/docs/pt/docs/async.md
+++ b/docs/pt/docs/async.md
@@ -44,11 +44,11 @@ Se sua aplicação (de alguma forma) não tem que se comunicar com nada mais e e
---
-Se você simplesmente não sabe, use apenas `def`.
+Se você simplesmente não sabe, use `def` normal.
---
-**Note**: Você pode misturar `def` e `async def` nas suas *funções de operação de rota* tanto quanto necessário e definir cada função usando a melhor opção para você. FastAPI irá fazer a coisa certa com elas.
+**Nota**: Você pode misturar `def` e `async def` nas suas *funções de operação de rota* tanto quanto necessário e definir cada função usando a melhor opção para você. FastAPI irá fazer a coisa certa com elas.
De qualquer forma, em ambos os casos acima, FastAPI irá trabalhar assincronamente e ser extremamente rápido.
@@ -82,10 +82,10 @@ Esse "esperar por algo" normalmente se refere a operações I/O, essas operações são chamadas operações "limitadas por I/O".
+Como o tempo de execução é consumido majoritariamente pela espera de operações I/O, essas operações são chamadas operações "limitadas por I/O".
Isso é chamado de "assíncrono" porque o computador / programa não tem que ser "sincronizado" com a tarefa lenta, esperando pelo momento exato em que a tarefa finaliza, enquanto não faz nada, para ser capaz de pegar o resultado da tarefa e dar continuidade ao trabalho.
@@ -109,7 +109,7 @@ Você vai com seu _crush_ na lanchonete, e fica na fila enquanto o caixa pega os
-Então chega a sua vez, você pede dois saborosos hambúrgueres para você e seu _crush_. 🍔🍔
+Então chega a sua vez, você pede dois saborosos hambúrgueres para você e seu _crush_. 🍔🍔
@@ -189,17 +189,17 @@ Você espera, na frente do balcão 🕙, para que ninguém pegue seus hambúrgue
Como você e seu _crush_ estão ocupados não permitindo que ninguém passe na frente e pegue seus hambúrgueres assim que estiverem prontos, você não pode dar atenção ao seu _crush_. 😞
-Isso é trabalho "síncrono", você está "sincronizado" com o caixa / cozinheiro 👨🍳. Você tem que esperar 🕙 e estar lá no exato momento que o caixa / cozinheiro 👨🍳 terminar os hambúrgueres e os der a você, ou então, outro alguém pode pegá-los.
+Isso é trabalho "síncrono", você está "sincronizado" com o caixa/cozinheiro 👨🍳. Você tem que esperar 🕙 e estar lá no exato momento que o caixa/cozinheiro 👨🍳 terminar os hambúrgueres e os der a você, ou então, outro alguém pode pegá-los.
-Então seu caixa / cozinheiro 👨🍳 finalmente volta com seus hambúrgueres, depois de um longo tempo esperando 🕙 por eles em frente ao balcão.
+Então seu caixa/cozinheiro 👨🍳 finalmente volta com seus hambúrgueres, depois de um longo tempo esperando 🕙 por eles em frente ao balcão.
Você pega seus hambúrgueres e vai para a mesa com seu _crush_.
-Vocês comem os hambúrgueres, e o trabalho está terminado. ⏹
+Vocês apenas os comem, e o trabalho está terminado. ⏹
@@ -213,15 +213,15 @@ Belas ilustrações de [Ketrina Thompson](https://www.instagram.com/ketrinadraws
---
-Nesse cenário dos hambúrgueres paralelos, você é um computador / programa 🤖 com dois processadores (você e seu _crush_), ambos esperando 🕙 e dedicando sua atenção ⏯ "esperando no balcão" 🕙 por um bom tempo.
+Nesse cenário dos hambúrgueres paralelos, você é um computador / programa 🤖 com dois processadores (você e seu _crush_), ambos esperando 🕙 e dedicando sua atenção ⏯ a "esperar no balcão" 🕙 por um bom tempo.
-A lanchonete paralela tem 8 processadores (caixas / cozinheiros), enquanto a lanchonete dos hambúrgueres concorrentes tinha apenas 2 (um caixa e um cozinheiro).
+A lanchonete tem 8 processadores (caixas/cozinheiros). Enquanto a lanchonete dos hambúrgueres concorrentes poderia ter apenas 2 (um caixa e um cozinheiro).
Ainda assim, a experiência final não foi a melhor. 😞
---
-Essa seria o equivalente paralelo à história dos hambúrgueres. 🍔
+Essa seria a história equivalente paralela para hambúrgueres. 🍔
Para um exemplo "mais real", imagine um banco.
@@ -231,15 +231,15 @@ Todos os caixas fazendo todo o trabalho, um cliente após o outro 👨💼⏯
E você tinha que esperar 🕙 na fila por um longo tempo ou poderia perder a vez.
-Você provavelmente não gostaria de levar seu _crush_ 😍 com você para um rolezinho no banco 🏦.
+Você provavelmente não gostaria de levar seu _crush_ 😍 com você para resolver assuntos no banco 🏦.
### Conclusão dos hambúrgueres { #burger-conclusion }
-Nesse cenário dos "hambúrgueres com seu _crush_", como tem muita espera, faz mais sentido ter um sistema concorrente ⏸🔀⏯.
+Nesse cenário dos "hambúrgueres de fast food com seu _crush_", como tem muita espera 🕙, faz mais sentido ter um sistema concorrente ⏸🔀⏯.
Esse é o caso da maioria das aplicações web.
-Muitos, muitos usuários, mas seu servidor está esperando 🕙 pela sua conexão não tão boa enviar suas requisições.
+Muitos, muitos usuários, mas seu servidor está esperando 🕙 pela conexão não tão boa deles enviar suas requisições.
E então esperando 🕙 novamente as respostas voltarem.
@@ -269,11 +269,11 @@ Então, para equilibrar tudo, imagine a seguinte historinha:
Não há espera 🕙 em lugar algum, apenas um monte de trabalho para ser feito, em múltiplos cômodos da casa.
-Você poderia ter turnos como no exemplo dos hambúrgueres, primeiro a sala de estar, então a cozinha, mas como você não está esperando por nada, apenas limpando e limpando, as chamadas não afetariam em nada.
+Você poderia ter turnos como no exemplo dos hambúrgueres, primeiro a sala de estar, então a cozinha, mas como você não está esperando 🕙 por nada, apenas limpando e limpando, as chamadas não afetariam em nada.
Levaria o mesmo tempo para finalizar com ou sem turnos (concorrência) e você teria feito o mesmo tanto de trabalho.
-Mas nesse caso, se você trouxesse os 8 ex-caixas / cozinheiros / agora-faxineiros, e cada um deles (mais você) pudessem dividir a casa para limpá-la, vocês fariam toda a limpeza em **paralelo**, com a ajuda extra, e terminariam muito mais cedo.
+Mas nesse caso, se você trouxesse os 8 ex-caixas/cozinheiros/agora-faxineiros, e cada um deles (mais você) pudessem dividir a casa para limpá-la, vocês fariam toda a limpeza em **paralelo**, com a ajuda extra, e terminariam muito mais cedo.
Nesse cenário, cada um dos faxineiros (incluindo você) poderia ser um processador, fazendo a sua parte do trabalho.
@@ -285,18 +285,18 @@ Exemplos comuns de operações limitadas por CPU são coisas que exigem processa
Por exemplo:
-* **Processamento de áudio** ou **imagem**
-* **Visão Computacional**: uma imagem é composta por milhões de pixels, cada pixel tem 3 valores / cores, processar isso normalmente exige alguma computação em todos esses pixels ao mesmo tempo
-* **Aprendizado de Máquina**: Normalmente exige muita multiplicação de matrizes e vetores. Pense numa grande planilha com números e em multiplicar todos eles juntos e ao mesmo tempo.
-* **Deep Learning**: Esse é um subcampo do Aprendizado de Máquina, então, o mesmo se aplica. A diferença é que não há apenas uma grande planilha com números para multiplicar, mas um grande conjunto delas, e em muitos casos, você utiliza um processador especial para construir e/ou usar esses modelos.
+* **Processamento de áudio** ou **imagem**.
+* **Visão Computacional**: uma imagem é composta por milhões de pixels, cada pixel tem 3 valores / cores, processar isso normalmente exige alguma computação nesses pixels, todos ao mesmo tempo.
+* **Aprendizado de Máquina**: normalmente exige muita multiplicação de "matrizes" e "vetores". Pense numa grande planilha com números e em multiplicar todos eles juntos e ao mesmo tempo.
+* **Deep Learning**: esse é um subcampo do Aprendizado de Máquina, então, o mesmo se aplica. A diferença é que não há apenas uma planilha com números para multiplicar, mas um grande conjunto delas, e em muitos casos, você utiliza um processador especial para construir e / ou usar esses modelos.
### Concorrência + Paralelismo: Web + Aprendizado de Máquina { #concurrency-parallelism-web-machine-learning }
Com **FastAPI** você pode levar a vantagem da concorrência que é muito comum para desenvolvimento web (o mesmo atrativo de NodeJS).
-Mas você também pode explorar os benefícios do paralelismo e multiprocessamento (tendo múltiplos processadores rodando em paralelo) para trabalhos **limitados por CPU** como aqueles em sistemas de Aprendizado de Máquina.
+Mas você também pode explorar os benefícios do paralelismo e multiprocessamento (tendo múltiplos processos rodando em paralelo) para trabalhos **limitados por CPU** como aqueles em sistemas de Aprendizado de Máquina.
-Isso, somado ao simples fato que Python é a principal linguagem para **Data Science**, Aprendizado de Máquina e especialmente Deep Learning, faz do FastAPI uma ótima escolha para APIs web e aplicações com Data Science / Aprendizado de Máquina (entre muitas outras).
+Isso, somado ao simples fato que Python é a principal linguagem para **Data Science**, Aprendizado de Máquina e especialmente Deep Learning, faz do FastAPI uma ótima escolha para APIs web e aplicações de Data Science / Aprendizado de Máquina (entre muitas outras).
Para ver como alcançar esse paralelismo em produção veja a seção sobre [Implantação](deployment/index.md).
@@ -340,7 +340,7 @@ burgers = get_burgers(2)
---
-Então, se você está usando uma biblioteca que diz que você pode chamá-la com `await`, você precisa criar as *funções de operação de rota* com `async def`, como em:
+Então, se você está usando uma biblioteca que diz que você pode chamá-la com `await`, você precisa criar as *funções de operação de rota* que a utilizam com `async def`, como em:
```Python hl_lines="2-3"
@app.get('/burgers')
@@ -355,9 +355,9 @@ Você deve ter observado que `await` pode ser usado somente dentro de funções
Mas ao mesmo tempo, funções definidas com `async def` têm que ser "aguardadas". Então, funções com `async def` podem ser chamadas somente dentro de funções definidas com `async def` também.
-Então, sobre o ovo e a galinha, como você chama a primeira função async?
+Então, sobre o ovo e a galinha, como você chama a primeira função `async`?
-Se você estivar trabalhando com **FastAPI** não terá que se preocupar com isso, porquê essa "primeira" função será a sua *função de operação de rota*, e o FastAPI saberá como fazer a coisa certa.
+Se você estiver trabalhando com **FastAPI** não terá que se preocupar com isso, porquê essa "primeira" função será a sua *função de operação de rota*, e o FastAPI saberá como fazer a coisa certa.
Mas se você quiser usar `async` / `await` sem FastAPI, você também pode fazê-lo.
@@ -423,7 +423,7 @@ Ainda, em ambas as situações, as chances são que o **FastAPI** [ainda será m
### Dependências { #dependencies }
-O mesmo se aplica para as [dependências](tutorial/dependencies/index.md). Se uma dependência tem as funções com padrão `def` ao invés de `async def`, ela é rodada no threadpool externo.
+O mesmo se aplica para as [dependências](tutorial/dependencies/index.md). Se uma dependência é uma função `def` padrão ao invés de `async def`, ela é rodada no threadpool externo.
### Sub-dependências { #sub-dependencies }
@@ -435,7 +435,7 @@ Qualquer outra função de utilidade que você chame diretamente pode ser criada
Isso está em contraste às funções que o FastAPI chama para você: *funções de operação de rota* e dependências.
-Se sua função de utilidade é uma função normal com `def`, ela será chamada diretamente (como você a escreve no código), não em uma threadpool, se a função é criada com `async def` então você deve esperar por essa função quando você chamá-la no seu código.
+Se sua função de utilidade é uma função normal com `def`, ela será chamada diretamente (como você a escreve no código), não em uma threadpool, se a função é criada com `async def` então você deveria usar `await` nessa função quando você chamá-la no seu código.
---
diff --git a/docs/pt/docs/deployment/cloud.md b/docs/pt/docs/deployment/cloud.md
index 4b0eb9553..68a2fd003 100644
--- a/docs/pt/docs/deployment/cloud.md
+++ b/docs/pt/docs/deployment/cloud.md
@@ -16,7 +16,7 @@ FastAPI Cloud é o patrocinador principal e provedor de financiamento dos projet
## Provedores de Nuvem - Patrocinadores { #cloud-providers-sponsors }
-Alguns outros provedores de nuvem ✨ [**patrocinam o FastAPI**](../help-fastapi.md#sponsor-the-author) ✨ também. 🙇
+Alguns outros provedores de nuvem ✨ [**patrocinam o FastAPI**](https://github.com/sponsors/tiangolo) ✨ também. 🙇
Você também pode considerá-los para seguir seus tutoriais e experimentar seus serviços:
diff --git a/docs/pt/docs/deployment/concepts.md b/docs/pt/docs/deployment/concepts.md
index e6338d5ea..0625c6d64 100644
--- a/docs/pt/docs/deployment/concepts.md
+++ b/docs/pt/docs/deployment/concepts.md
@@ -1,6 +1,6 @@
# Conceitos de Implantações { #deployments-concepts }
-Ao implantar um aplicativo **FastAPI**, ou na verdade, qualquer tipo de API da web, há vários conceitos com os quais você provavelmente se importa e, usando-os, você pode encontrar a maneira **mais apropriada** de **implantar seu aplicativo**.
+Ao implantar uma aplicação **FastAPI**, ou na verdade, qualquer tipo de API da web, há vários conceitos com os quais você provavelmente se importa e, usando-os, você pode encontrar a maneira **mais apropriada** de **implantar sua aplicação**.
Alguns dos conceitos importantes são:
@@ -19,7 +19,7 @@ Vou lhe contar um pouco mais sobre esses **conceitos** aqui, e espero que isso l
Ao considerar esses conceitos, você será capaz de **avaliar e projetar** a melhor maneira de implantar **suas próprias APIs**.
-Nos próximos capítulos, darei a você mais **receitas concretas** para implantar aplicativos FastAPI.
+Nos próximos capítulos, darei a você mais **receitas concretas** para implantar aplicações FastAPI.
Mas por enquanto, vamos verificar essas importantes **ideias conceituais**. Esses conceitos também se aplicam a qualquer outro tipo de API da web. 💡
@@ -27,7 +27,7 @@ Mas por enquanto, vamos verificar essas importantes **ideias conceituais**. Esse
No [capítulo anterior sobre HTTPS](https.md) aprendemos como o HTTPS fornece criptografia para sua API.
-Também vimos que o HTTPS normalmente é fornecido por um componente **externo** ao seu servidor de aplicativos, um **Proxy de terminação TLS**.
+Também vimos que o HTTPS normalmente é fornecido por um componente **externo** ao seu servidor de aplicações, um **Proxy de terminação TLS**.
E tem que haver algo responsável por **renovar os certificados HTTPS**, pode ser o mesmo componente ou pode ser algo diferente.
@@ -75,7 +75,7 @@ A palavra **processo** normalmente é usada de forma mais específica, referindo
* Isso não se refere ao arquivo, nem ao código, refere-se **especificamente** à coisa que está sendo **executada** e gerenciada pelo sistema operacional.
* Qualquer programa, qualquer código, **só pode fazer coisas** quando está sendo **executado**. Então, quando há um **processo em execução**.
* O processo pode ser **terminado** (ou "morto") por você, ou pelo sistema operacional. Nesse ponto, ele para de rodar/ser executado, e ele **não pode mais fazer coisas**.
-* Cada aplicativo que você tem em execução no seu computador tem algum processo por trás dele, cada programa em execução, cada janela, etc. E normalmente há muitos processos em execução **ao mesmo tempo** enquanto um computador está ligado.
+* Cada aplicação que você tem em execução no seu computador tem algum processo por trás dela, cada programa em execução, cada janela, etc. E normalmente há muitos processos em execução **ao mesmo tempo** enquanto um computador está ligado.
* Pode haver **vários processos** do **mesmo programa** em execução ao mesmo tempo.
Se você verificar o "gerenciador de tarefas" ou o "monitor do sistema" (ou ferramentas semelhantes) no seu sistema operacional, poderá ver muitos desses processos em execução.
@@ -104,11 +104,11 @@ E se o servidor for reiniciado (por exemplo, após atualizações ou migrações
### Executar automaticamente na inicialização { #run-automatically-on-startup }
-Em geral, você provavelmente desejará que o programa do servidor (por exemplo, Uvicorn) seja iniciado automaticamente na inicialização do servidor e, sem precisar de nenhuma **intervenção humana**, tenha um processo sempre em execução com sua API (por exemplo, Uvicorn executando seu aplicativo FastAPI).
+Em geral, você provavelmente desejará que o programa do servidor (por exemplo, Uvicorn) seja iniciado automaticamente na inicialização do servidor e, sem precisar de nenhuma **intervenção humana**, tenha um processo sempre em execução com sua API (por exemplo, Uvicorn executando sua aplicação FastAPI).
### Programa separado { #separate-program }
-Para conseguir isso, você normalmente terá um **programa separado** que garantiria que seu aplicativo fosse executado na inicialização. E em muitos casos, ele também garantiria que outros componentes ou aplicativos também fossem executados, por exemplo, um banco de dados.
+Para conseguir isso, você normalmente terá um **programa separado** que garantiria que sua aplicação fosse executada na inicialização. E em muitos casos, ele também garantiria que outros componentes ou aplicações também fossem executados, por exemplo, um banco de dados.
### Ferramentas de exemplo para executar na inicialização { #example-tools-to-run-at-startup }
@@ -127,7 +127,7 @@ Darei exemplos mais concretos nos próximos capítulos.
## Reinicializações { #restarts }
-Semelhante a garantir que seu aplicativo seja executado na inicialização, você provavelmente também deseja garantir que ele seja **reiniciado** após falhas.
+Semelhante a garantir que sua aplicação seja executada na inicialização, você provavelmente também deseja garantir que ela seja **reiniciada** após falhas.
### Nós cometemos erros { #we-make-mistakes }
@@ -137,15 +137,15 @@ E nós, como desenvolvedores, continuamos aprimorando o código à medida que en
### Pequenos erros são tratados automaticamente { #small-errors-automatically-handled }
-Ao criar APIs da web com FastAPI, se houver um erro em nosso código, o FastAPI normalmente o conterá na única solicitação que acionou o erro. 🛡
+Ao criar APIs da web com FastAPI, se houver um erro em nosso código, o FastAPI normalmente o conterá na única request que acionou o erro. 🛡
-O cliente receberá um **Erro Interno do Servidor 500** para essa solicitação, mas o aplicativo continuará funcionando para as próximas solicitações em vez de travar completamente.
+O cliente receberá um **Erro Interno do Servidor 500** para essa request, mas a aplicação continuará funcionando para as próximas requests em vez de travar completamente.
### Erros maiores - Travamentos { #bigger-errors-crashes }
-No entanto, pode haver casos em que escrevemos algum código que **trava todo o aplicativo**, fazendo com que o Uvicorn e o Python travem. 💥
+No entanto, pode haver casos em que escrevemos algum código que **trava toda a aplicação**, fazendo com que o Uvicorn e o Python travem. 💥
-E ainda assim, você provavelmente não gostaria que o aplicativo permanecesse inativo porque houve um erro em um lugar, você provavelmente quer que ele **continue em execução** pelo menos para as *operações de rota* que não estão quebradas.
+E ainda assim, você provavelmente não gostaria que a aplicação permanecesse inativa porque houve um erro em um lugar, você provavelmente quer que ela **continue em execução** pelo menos para as *operações de rota* que não estão quebradas.
### Reiniciar após falha { #restart-after-crash }
@@ -153,13 +153,13 @@ Mas nos casos com erros realmente graves que travam o **processo** em execução
/// tip | Dica
-...Embora se o aplicativo inteiro estiver **travando imediatamente**, provavelmente não faça sentido reiniciá-lo para sempre. Mas nesses casos, você provavelmente notará isso durante o desenvolvimento, ou pelo menos logo após a implantação.
+...Embora se a aplicação inteira estiver **travando imediatamente**, provavelmente não faça sentido reiniciá-la para sempre. Mas nesses casos, você provavelmente notará isso durante o desenvolvimento, ou pelo menos logo após a implantação.
-Então, vamos nos concentrar nos casos principais, onde ele pode travar completamente em alguns casos específicos **no futuro**, e ainda faz sentido reiniciá-lo.
+Então, vamos nos concentrar nos casos principais, onde ela pode travar completamente em alguns casos específicos **no futuro**, e ainda faz sentido reiniciá-la.
///
-Você provavelmente gostaria de ter a coisa responsável por reiniciar seu aplicativo como um **componente externo**, porque a essa altura, o mesmo aplicativo com Uvicorn e Python já havia travado, então não há nada no mesmo código do mesmo aplicativo que possa fazer algo a respeito.
+Você provavelmente gostaria de ter a coisa responsável por reiniciar sua aplicação como um **componente externo**, porque a essa altura, a mesma aplicação com Uvicorn e Python já havia travado, então não há nada no mesmo código da mesma aplicação que possa fazer algo a respeito.
### Ferramentas de exemplo para reiniciar automaticamente { #example-tools-to-restart-automatically }
@@ -178,13 +178,13 @@ Por exemplo, isso poderia ser resolvido por:
## Replicação - Processos e Memória { #replication-processes-and-memory }
-Com um aplicativo FastAPI, usando um programa de servidor como o comando `fastapi` que executa o Uvicorn, executá-lo uma vez em **um processo** pode atender a vários clientes simultaneamente.
+Com uma aplicação FastAPI, usando um programa de servidor como o comando `fastapi` que executa o Uvicorn, executá-lo uma vez em **um processo** pode atender a vários clientes simultaneamente.
Mas em muitos casos, você desejará executar vários processos de trabalho ao mesmo tempo.
### Processos Múltiplos - Trabalhadores { #multiple-processes-workers }
-Se você tiver mais clientes do que um único processo pode manipular (por exemplo, se a máquina virtual não for muito grande) e tiver **vários núcleos** na CPU do servidor, você poderá ter **vários processos** em execução com o mesmo aplicativo ao mesmo tempo e distribuir todas as solicitações entre eles.
+Se você tiver mais clientes do que um único processo pode manipular (por exemplo, se a máquina virtual não for muito grande) e tiver **vários núcleos** na CPU do servidor, você poderá ter **vários processos** em execução com a mesma aplicação ao mesmo tempo e distribuir todas as requests entre eles.
Quando você executa **vários processos** do mesmo programa de API, eles são comumente chamados de **trabalhadores**.
@@ -214,11 +214,11 @@ Neste exemplo, há um **Processo Gerenciador** que inicia e controla dois **Proc
Este Processo de Gerenciador provavelmente seria o que escutaria na **porta** no IP. E ele transmitiria toda a comunicação para os processos de trabalho.
-Esses processos de trabalho seriam aqueles que executariam seu aplicativo, eles executariam os cálculos principais para receber uma **solicitação** e retornar uma **resposta**, e carregariam qualquer coisa que você colocasse em variáveis na RAM.
+Esses processos de trabalho seriam aqueles que executariam sua aplicação, eles executariam os cálculos principais para receber uma **request** e retornar uma **resposta**, e carregariam qualquer coisa que você colocasse em variáveis na RAM.
contact| Parâmetro | Tipo | Descrição |
|---|---|---|
name | str | O nome identificador da pessoa/organização de contato. |
url | str | A URL que aponta para as informações de contato. DEVE estar no formato de uma URL. |
email | str | O endereço de e-mail da pessoa/organização de contato. DEVE estar no formato de um endereço de e-mail. |
license_info| Parâmetro | Tipo | Descrição |
|---|---|---|
name | str | OBRIGATÓRIO (se um license_info for definido). O nome da licença usada para a API. |
identifier | str | Uma expressão de licença [SPDX](https://spdx.org/licenses/) para a API. O campo identifier é mutuamente exclusivo do campo url. Disponível desde OpenAPI 3.1.0, FastAPI 0.99.0. |
url | str | Uma URL para a licença usada para a API. DEVE estar no formato de uma URL. |
-/// check | Verifique
+/// tip | Dica
Novamente, apenas com a mesma declaração de tipo do Python, o **FastAPI** fornece documentação automática e interativa (integrando o Swagger UI).
Observe que o parâmetro de path está declarado como um inteiro.
diff --git a/docs/pt/docs/tutorial/query-params-str-validations.md b/docs/pt/docs/tutorial/query-params-str-validations.md
index 5ee41684a..d37db2875 100644
--- a/docs/pt/docs/tutorial/query-params-str-validations.md
+++ b/docs/pt/docs/tutorial/query-params-str-validations.md
@@ -18,7 +18,7 @@ Ter `str | None` permitirá que seu editor lhe ofereça melhor suporte e detecte
## Validação adicional { #additional-validation }
-Vamos impor que, embora `q` seja opcional, sempre que for fornecido, seu comprimento não exceda 50 caracteres.
+Vamos impor que, embora `q` seja opcional, sempre que for fornecido, **seu comprimento não exceda 50 caracteres**.
### Importe `Query` e `Annotated` { #import-query-and-annotated }
@@ -29,7 +29,7 @@ Para isso, primeiro importe:
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | Informação
+/// note | Nota
O FastAPI adicionou suporte a `Annotated` (e passou a recomendá-lo) na versão 0.95.0.
@@ -69,19 +69,19 @@ Agora que temos esse `Annotated` onde podemos colocar mais informações (neste
Perceba que o valor padrão continua sendo `None`, então o parâmetro ainda é opcional.
-Mas agora, com `Query(max_length=50)` dentro de `Annotated`, estamos dizendo ao FastAPI que queremos validação adicional para este valor, queremos que tenha no máximo 50 caracteres. 😎
+Mas agora, com `Query(max_length=50)` dentro de `Annotated`, estamos dizendo ao FastAPI que queremos **validação adicional** para este valor, queremos que tenha no máximo 50 caracteres. 😎
/// tip | Dica
-Aqui estamos usando `Query()` porque este é um parâmetro de consulta. Mais adiante veremos outros como `Path()`, `Body()`, `Header()` e `Cookie()`, que também aceitam os mesmos argumentos que `Query()`.
+Aqui estamos usando `Query()` porque este é um **parâmetro de consulta**. Mais adiante veremos outros como `Path()`, `Body()`, `Header()` e `Cookie()`, que também aceitam os mesmos argumentos que `Query()`.
///
Agora o FastAPI vai:
-* Validar os dados garantindo que o comprimento máximo seja de 50 caracteres
-* Mostrar um erro claro para o cliente quando os dados não forem válidos
-* Documentar o parâmetro na operação de rota do esquema OpenAPI (então ele aparecerá na UI de docs automática)
+* **Validar** os dados garantindo que o comprimento máximo seja de 50 caracteres
+* Mostrar um **erro claro** para o cliente quando os dados não forem válidos
+* **Documentar** o parâmetro na *operação de rota* do esquema OpenAPI (então ele aparecerá na **UI de documentação automática**)
## Alternativa (antiga): `Query` como valor padrão { #alternative-old-query-as-the-default-value }
@@ -120,7 +120,7 @@ Então, podemos passar mais parâmetros para `Query`. Neste caso, o parâmetro `
q: str | None = Query(default=None, max_length=50)
```
-Isso validará os dados, mostrará um erro claro quando os dados não forem válidos e documentará o parâmetro na operação de rota do esquema OpenAPI.
+Isso validará os dados, mostrará um erro claro quando os dados não forem válidos e documentará o parâmetro na *operação de rota* do esquema OpenAPI.
### `Query` como valor padrão ou em `Annotated` { #query-as-the-default-value-or-in-annotated }
@@ -150,13 +150,13 @@ q: str = Query(default="rick")
### Vantagens de `Annotated` { #advantages-of-annotated }
-Usar `Annotated` é recomendado em vez do valor padrão nos parâmetros da função, é melhor por vários motivos. 🤓
+**Usar `Annotated` é recomendado** em vez do valor padrão nos parâmetros da função, é **melhor** por vários motivos. 🤓
-O valor padrão do parâmetro da função é o valor padrão real, isso é mais intuitivo com Python em geral. 😌
+O valor **padrão** do **parâmetro da função** é o valor **padrão real**, isso é mais intuitivo com Python em geral. 😌
-Você poderia chamar essa mesma função em outros lugares sem FastAPI, e ela funcionaria como esperado. Se houver um parâmetro obrigatório (sem valor padrão), seu editor vai avisar com um erro, e o Python também reclamará se você executá-la sem passar o parâmetro obrigatório.
+Você poderia **chamar** essa mesma função em **outros lugares** sem FastAPI, e ela **funcionaria como esperado**. Se houver um parâmetro **obrigatório** (sem valor padrão), seu **editor** vai avisar com um erro, e o **Python** também reclamará se você executá-la sem passar o parâmetro obrigatório.
-Quando você não usa `Annotated` e em vez disso usa o estilo de valor padrão (antigo), se você chamar essa função sem FastAPI em outros lugares, terá que lembrar de passar os argumentos para a função para que funcione corretamente, caso contrário os valores serão diferentes do esperado (por exemplo, `QueryInfo` ou algo parecido em vez de `str`). E seu editor não vai avisar, e o Python também não vai reclamar ao executar a função, apenas quando as operações internas falharem.
+Quando você não usa `Annotated` e em vez disso usa o **estilo de valor padrão (antigo)**, se você chamar essa função sem FastAPI em **outros lugares**, terá que **lembrar** de passar os argumentos para a função para que funcione corretamente, caso contrário os valores serão diferentes do esperado (por exemplo, `QueryInfo` ou algo parecido em vez de `str`). E seu editor não vai avisar, e o Python também não vai reclamar ao executar a função, apenas quando as operações internas falharem.
Como `Annotated` pode ter mais de uma anotação de metadados, você agora pode até usar a mesma função com outras ferramentas, como o [Typer](https://typer.tiangolo.com/). 🚀
@@ -168,7 +168,7 @@ Você também pode adicionar um parâmetro `min_length`:
## Adicione expressões regulares { #add-regular-expressions }
-Você pode definir um `pattern` de expressão regular que o parâmetro deve corresponder:
+Você pode definir um `pattern` de expressão regular que o parâmetro deve corresponder:
{* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *}
@@ -178,9 +178,9 @@ Esse padrão específico de expressão regular verifica se o valor recebido no p
* `fixedquery`: tem exatamente o valor `fixedquery`.
* `$`: termina ali, não tem mais caracteres depois de `fixedquery`.
-Se você se sentir perdido com essas ideias de "expressão regular", não se preocupe. Esse é um assunto difícil para muitas pessoas. Você ainda pode fazer muitas coisas sem precisar de expressões regulares por enquanto.
+Se você se sentir perdido com essas ideias de **"expressão regular"**, não se preocupe. Esse é um assunto difícil para muitas pessoas. Você ainda pode fazer muitas coisas sem precisar de expressões regulares por enquanto.
-Agora você sabe que, sempre que precisar delas, pode usá-las no FastAPI.
+Agora você sabe que, sempre que precisar delas, pode usá-las no **FastAPI**.
## Valores padrão { #default-values }
@@ -242,7 +242,7 @@ Então, com uma URL como:
http://localhost:8000/items/?q=foo&q=bar
```
-você receberia os múltiplos valores dos parâmetros de consulta `q` (`foo` e `bar`) em uma `list` Python dentro da sua função de operação de rota, no parâmetro da função `q`.
+você receberia os múltiplos valores dos *parâmetros de consulta* `q` (`foo` e `bar`) em uma `list` Python dentro da sua *função de operação de rota*, no *parâmetro da função* `q`.
Assim, a resposta para essa URL seria:
@@ -298,7 +298,7 @@ Você também pode usar `list` diretamente em vez de `list[str]`:
Tenha em mente que, neste caso, o FastAPI não verificará o conteúdo da lista.
-Por exemplo, `list[int]` verificaria (and documentaria) que os conteúdos da lista são inteiros. Mas `list` sozinho não.
+Por exemplo, `list[int]` verificaria (e documentaria) que os conteúdos da lista são inteiros. Mas `list` sozinho não.
///
@@ -360,15 +360,15 @@ A documentação vai mostrar assim:
## Excluir parâmetros do OpenAPI { #exclude-parameters-from-openapi }
-Para excluir um parâmetro de consulta do OpenAPI gerado (e portanto, dos sistemas de documentação automáticos), defina o parâmetro `include_in_schema` de `Query` como `False`:
+Para excluir um parâmetro de consulta do esquema OpenAPI gerado (e portanto, dos sistemas de documentação automáticos), defina o parâmetro `include_in_schema` de `Query` como `False`:
{* ../../docs_src/query_params_str_validations/tutorial014_an_py310.py hl[10] *}
## Validação personalizada { #custom-validation }
-Podem existir casos em que você precise fazer alguma validação personalizada que não pode ser feita com os parâmetros mostrados acima.
+Podem existir casos em que você precise fazer alguma **validação personalizada** que não pode ser feita com os parâmetros mostrados acima.
-Nesses casos, você pode usar uma função validadora personalizada que é aplicada após a validação normal (por exemplo, depois de validar que o valor é uma `str`).
+Nesses casos, você pode usar uma **função validadora personalizada** que é aplicada após a validação normal (por exemplo, depois de validar que o valor é uma `str`).
Você pode fazer isso usando o [`AfterValidator` do Pydantic](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) dentro de `Annotated`.
@@ -382,7 +382,7 @@ Por exemplo, este validador personalizado verifica se o ID do item começa com `
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | Informação
+/// note | Nota
Isso está disponível com a versão 2 do Pydantic ou superior. 😎
@@ -390,15 +390,15 @@ Isso está disponível com a versão 2 do Pydantic ou superior. 😎
/// tip | Dica
-Se você precisar fazer qualquer tipo de validação que exija comunicação com algum componente externo, como um banco de dados ou outra API, você deveria usar Dependências do FastAPI em vez disso; você aprenderá sobre elas mais adiante.
+Se você precisar fazer qualquer tipo de validação que exija comunicação com algum **componente externo**, como um banco de dados ou outra API, você deveria usar **Dependências do FastAPI** em vez disso; você aprenderá sobre elas mais adiante.
-Esses validadores personalizados são para coisas que podem ser verificadas apenas com os mesmos dados fornecidos na requisição.
+Esses validadores personalizados são para coisas que podem ser verificadas **apenas** com os **mesmos dados** fornecidos na requisição.
///
### Entenda esse código { #understand-that-code }
-O ponto importante é apenas usar `AfterValidator` com uma função dentro de `Annotated`. Sinta-se à vontade para pular esta parte. 🤸
+O ponto importante é apenas usar **`AfterValidator` com uma função dentro de `Annotated`**. Sinta-se à vontade para pular esta parte. 🤸
---
@@ -414,15 +414,15 @@ Percebeu? Uma string usando `value.startswith()` pode receber uma tupla, e verif
Com `data.items()` obtemos um objeto iterável com tuplas contendo a chave e o valor de cada item do dicionário.
-Convertimos esse objeto iterável em uma `list` adequada com `list(data.items())`.
+Convertemos esse objeto iterável em uma `list` adequada com `list(data.items())`.
-Em seguida, com `random.choice()` podemos obter um valor aleatório da lista, então obtemos uma tupla com `(id, name)`. Será algo como `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`.
+Em seguida, com `random.choice()` podemos obter um **valor aleatório** da lista, então obtemos uma tupla com `(id, name)`. Será algo como `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`.
-Depois atribuímos esses dois valores da tupla às variáveis `id` e `name`.
+Depois **atribuímos esses dois valores** da tupla às variáveis `id` e `name`.
Assim, se o usuário não fornecer um ID de item, ele ainda receberá uma sugestão aleatória.
-...fazemos tudo isso em uma única linha simples. 🤯 Você não ama Python? 🐍
+...fazemos tudo isso em uma **única linha simples**. 🤯 Você não ama Python? 🐍
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[22:30] hl[29] *}
diff --git a/docs/pt/docs/tutorial/query-params.md b/docs/pt/docs/tutorial/query-params.md
index 472c12be6..1f098ee7a 100644
--- a/docs/pt/docs/tutorial/query-params.md
+++ b/docs/pt/docs/tutorial/query-params.md
@@ -54,8 +54,8 @@ http://127.0.0.1:8000/items/?skip=20
Os valores dos parâmetros na sua função serão:
-* `skip=20`: Por que você definiu isso na URL
-* `limit=10`: Por que esse era o valor padrão
+* `skip=20`: porque você definiu isso na URL
+* `limit=10`: porque esse era o valor padrão
## Parâmetros opcionais { #optional-parameters }
@@ -65,7 +65,7 @@ Da mesma forma, você pode declarar parâmetros de consulta opcionais, definindo
Nesse caso, o parâmetro da função `q` será opcional, e `None` será o padrão.
-/// check | Verifique
+/// tip | Dica
Você também pode notar que o **FastAPI** é esperto o suficiente para perceber que o parâmetro da rota `item_id` é um parâmetro da rota, e `q` não é, portanto, `q` é o parâmetro de consulta.
@@ -109,6 +109,7 @@ http://127.0.0.1:8000/items/foo?short=yes
ou qualquer outra variação (tudo em maiúscula, primeira letra em maiúscula, etc), a sua função vai ver o parâmetro `short` com um valor `bool` de `True`. Caso contrário `False`.
+
## Múltiplos parâmetros de rota e consulta { #multiple-path-and-query-parameters }
Você pode declarar múltiplos parâmetros de rota e parâmetros de consulta ao mesmo tempo, o **FastAPI** vai saber o quê é o quê.
@@ -129,9 +130,9 @@ Porém, quando você quiser fazer com que o parâmetro de consulta seja obrigat
{* ../../docs_src/query_params/tutorial005_py310.py hl[6:7] *}
-Aqui o parâmetro da consulta `needy` é um valor obrigatório, do tipo `str`.
+Aqui o parâmetro da consulta `needy` é um parâmetro de consulta obrigatório, do tipo `str`.
-Se você abrir no seu navegador a URL:
+Se você abrir no seu navegador uma URL como:
```
http://127.0.0.1:8000/items/foo-item
diff --git a/docs/pt/docs/tutorial/request-files.md b/docs/pt/docs/tutorial/request-files.md
index 912878cd5..8b3463036 100644
--- a/docs/pt/docs/tutorial/request-files.md
+++ b/docs/pt/docs/tutorial/request-files.md
@@ -2,7 +2,7 @@
Você pode definir arquivos para serem enviados pelo cliente usando `File`.
-/// info | Informação
+/// note | Nota
Para receber arquivos enviados, primeiro instale [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -28,7 +28,7 @@ Crie parâmetros de arquivo da mesma forma que você faria para `Body` ou `Form`
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info | Informação
+/// note | Nota
`File` é uma classe que herda diretamente de `Form`.
@@ -44,7 +44,7 @@ Para declarar corpos de arquivos, você precisa usar `File`, caso contrário, os
Os arquivos serão enviados como "dados de formulário".
-Se você declarar o tipo do parâmetro da função da sua *operação de rota* como `bytes`, o **FastAPI** lerá o arquivo para você e você receberá o conteúdo como `bytes`.
+Se você declarar o tipo do parâmetro da sua *função de operação de rota* como `bytes`, o **FastAPI** lerá o arquivo para você e você receberá o conteúdo como `bytes`.
Mantenha em mente que isso significa que todo o conteúdo será armazenado na memória. Isso funcionará bem para arquivos pequenos.
@@ -63,8 +63,8 @@ Utilizar `UploadFile` tem várias vantagens sobre `bytes`:
* Um arquivo armazenado na memória até um limite máximo de tamanho, e após passar esse limite, ele será armazenado no disco.
* Isso significa que funcionará bem para arquivos grandes como imagens, vídeos, binários grandes, etc., sem consumir toda a memória.
* Você pode receber metadados do arquivo enviado.
-* Ele tem uma [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) interface `assíncrona`.
-* Ele expõe um objeto python [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) que você pode passar diretamente para outras bibliotecas que esperam um objeto semelhante a um arquivo.
+* Ele tem uma interface [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) `async`.
+* Ele expõe um objeto Python [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) real que você pode passar diretamente para outras bibliotecas que esperam um objeto semelhante a um arquivo.
### `UploadFile` { #uploadfile }
@@ -72,9 +72,9 @@ Utilizar `UploadFile` tem várias vantagens sobre `bytes`:
* `filename`: Uma `str` com o nome do arquivo original que foi enviado (por exemplo, `myimage.jpg`).
* `content_type`: Uma `str` com o tipo de conteúdo (MIME type / media type) (por exemplo, `image/jpeg`).
-* `file`: Um [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) (um [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) objeto). Este é o objeto de arquivo Python que você pode passar diretamente para outras funções ou bibliotecas que esperam um objeto semelhante a um arquivo.
+* `file`: Um [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) (um objeto [file-like](https://docs.python.org/3/glossary.html#term-file-like-object)). Este é o objeto de arquivo Python que você pode passar diretamente para outras funções ou bibliotecas que esperam um objeto semelhante a um arquivo.
-`UploadFile` tem os seguintes métodos `assíncronos`. Todos eles chamam os métodos de arquivo correspondentes por baixo dos panos (usando o `SpooledTemporaryFile` interno).
+`UploadFile` tem os seguintes métodos `async`. Todos eles chamam os métodos de arquivo correspondentes por baixo dos panos (usando o `SpooledTemporaryFile` interno).
* `write(data)`: Escreve `data` (`str` ou `bytes`) no arquivo.
* `read(size)`: Lê `size` (`int`) bytes/caracteres do arquivo.
@@ -83,15 +83,15 @@ Utilizar `UploadFile` tem várias vantagens sobre `bytes`:
* Isso é especialmente útil se você executar `await myfile.read()` uma vez e precisar ler o conteúdo novamente.
* `close()`: Fecha o arquivo.
-Como todos esses métodos são métodos `assíncronos`, você precisa "aguardar" por eles.
+Como todos esses métodos são métodos `async`, você precisa "aguardar" por eles.
-Por exemplo, dentro de uma função de *operação de rota* `assíncrona`, você pode obter o conteúdo com:
+Por exemplo, dentro de uma *função de operação de rota* `async`, você pode obter o conteúdo com:
```Python
contents = await myfile.read()
```
-Se você estiver dentro de uma função de *operação de rota* normal `def`, você pode acessar o `UploadFile.file` diretamente, por exemplo:
+Se você estiver dentro de uma *função de operação de rota* normal `def`, você pode acessar o `UploadFile.file` diretamente, por exemplo:
```Python
contents = myfile.file.read()
@@ -109,7 +109,7 @@ O `UploadFile` do **FastAPI** herda diretamente do `UploadFile` do **Starlette**
///
-## O que é "Form Data" { #what-is-form-data }
+## O que são "Dados de Formulário" { #what-is-form-data }
O jeito que os formulários HTML (``) enviam os dados para o servidor normalmente usa uma codificação "especial" para esses dados, a qual é diferente do JSON.
@@ -119,9 +119,9 @@ O jeito que os formulários HTML (``) enviam os dados para o servid
Dados de formulários normalmente são codificados usando o "media type" `application/x-www-form-urlencoded` quando não incluem arquivos.
-Mas quando o formulário inclui arquivos, ele é codificado como `multipart/form-data`. Se você usar `File`, o **FastAPI** saberá que tem que pegar os arquivos da parte correta do corpo da requisição.
+Mas quando o formulário inclui arquivos, ele é codificado como `multipart/form-data`. Se você usar `File`, o **FastAPI** saberá que tem que pegar os arquivos da parte correta do corpo.
-Se você quiser ler mais sobre essas codificações e campos de formulário, vá para a [MDN web docs para `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
+Se você quiser ler mais sobre essas codificações e campos de formulário, vá para a [documentação web da MDN para `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
///
diff --git a/docs/pt/docs/tutorial/request-form-models.md b/docs/pt/docs/tutorial/request-form-models.md
index 953c3fdce..8e265d6ad 100644
--- a/docs/pt/docs/tutorial/request-form-models.md
+++ b/docs/pt/docs/tutorial/request-form-models.md
@@ -2,7 +2,7 @@
Você pode utilizar **Modelos Pydantic** para declarar **campos de formulários** no FastAPI.
-/// info | Informação
+/// note | Nota
Para utilizar formulários, instale primeiramente o [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -28,7 +28,7 @@ Você precisa apenas declarar um **modelo Pydantic** com os campos que deseja re
O **FastAPI** irá **extrair** as informações para **cada campo** dos **dados do formulário** na requisição e dar para você o modelo Pydantic que você definiu.
-## Confira os Documentos { #check-the-docs }
+## Confira a Documentação { #check-the-docs }
Você pode verificar na UI de documentação em `/docs`:
diff --git a/docs/pt/docs/tutorial/request-forms-and-files.md b/docs/pt/docs/tutorial/request-forms-and-files.md
index 04d7f9a4e..45d6f5c2c 100644
--- a/docs/pt/docs/tutorial/request-forms-and-files.md
+++ b/docs/pt/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
Você pode definir arquivos e campos de formulário ao mesmo tempo usando `File` e `Form`.
-/// info | Informação
+/// note | Nota
Para receber arquivos carregados e/ou dados de formulário, primeiro instale [`python-multipart`](https://github.com/Kludex/python-multipart).
diff --git a/docs/pt/docs/tutorial/request-forms.md b/docs/pt/docs/tutorial/request-forms.md
index 5b7c4d809..bfca3562a 100644
--- a/docs/pt/docs/tutorial/request-forms.md
+++ b/docs/pt/docs/tutorial/request-forms.md
@@ -2,7 +2,7 @@
Quando você precisar receber campos de formulário em vez de JSON, você pode usar `Form`.
-/// info | Informação
+/// note | Nota
Para usar formulários, primeiro instale [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -32,7 +32,7 @@ A especificação exige que os campos sejam e
Com `Form` você pode declarar as mesmas configurações que com `Body` (e `Query`, `Path`, `Cookie`), incluindo validação, exemplos, um alias (por exemplo, `user-name` em vez de `username`), etc.
-/// info | Informação
+/// note | Nota
`Form` é uma classe que herda diretamente de `Body`.
@@ -56,7 +56,7 @@ Os dados dos formulários são normalmente codificados usando o "media type" `ap
Mas quando o formulário inclui arquivos, ele é codificado como `multipart/form-data`. Você lerá sobre como lidar com arquivos no próximo capítulo.
-Se você quiser ler mais sobre essas codificações e campos de formulário, vá para o [MDN web docs para `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
+Se você quiser ler mais sobre essas codificações e campos de formulário, vá para a [documentação web da MDN para `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
///
diff --git a/docs/pt/docs/tutorial/response-model.md b/docs/pt/docs/tutorial/response-model.md
index 7a28bcecd..1753f9dae 100644
--- a/docs/pt/docs/tutorial/response-model.md
+++ b/docs/pt/docs/tutorial/response-model.md
@@ -72,7 +72,7 @@ Aqui estamos declarando um modelo `UserIn`, ele conterá uma senha em texto simp
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | Informação
+/// note | Nota
Para usar `EmailStr`, primeiro instale [`email-validator`](https://github.com/JoshData/python-email-validator).
@@ -251,7 +251,7 @@ Então, se você enviar uma solicitação para essa *operação de rota* para o
}
```
-/// info | Informação
+/// note | Nota
Você também pode usar:
diff --git a/docs/pt/docs/tutorial/response-status-code.md b/docs/pt/docs/tutorial/response-status-code.md
index d5a81fa03..aeeaf225d 100644
--- a/docs/pt/docs/tutorial/response-status-code.md
+++ b/docs/pt/docs/tutorial/response-status-code.md
@@ -12,13 +12,13 @@ Da mesma forma que você pode especificar um modelo de resposta, você também p
/// note | Nota
-Observe que `status_code` é um parâmetro do método "decorador" (`get`, `post`, etc). Não da sua função de *operação de rota*, como todos os parâmetros e corpo.
+Observe que `status_code` é um parâmetro do método "decorador" (`get`, `post`, etc). Não da sua *função de operação de rota*, como todos os parâmetros e corpo.
///
O parâmetro `status_code` recebe um número com o código de status HTTP.
-/// info | Informação
+/// note | Nota
`status_code` também pode receber um `IntEnum`, como [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus) do Python.
@@ -35,7 +35,7 @@ Dessa forma:
Alguns códigos de resposta (consulte a próxima seção) indicam que a resposta não possui um corpo.
-O FastAPI sabe disso e produzirá documentos OpenAPI informando que não há corpo de resposta.
+O FastAPI sabe disso e produzirá documentação OpenAPI informando que não há corpo de resposta.
///
@@ -84,7 +84,7 @@ Você pode usar as variáveis de conveniência de `fastapi.status`.
{* ../../docs_src/response_status_code/tutorial002_py310.py hl[1,6] *}
-Eles são apenas uma conveniência, eles possuem o mesmo número, mas dessa forma você pode usar o preenchimento automático do editor para encontrá-los:
+Eles são apenas uma conveniência, eles possuem o mesmo número, mas dessa forma você pode usar o autocompletar do editor para encontrá-los:
diff --git a/docs/pt/docs/tutorial/schema-extra-example.md b/docs/pt/docs/tutorial/schema-extra-example.md
index cd2ac13c5..6e10c5857 100644
--- a/docs/pt/docs/tutorial/schema-extra-example.md
+++ b/docs/pt/docs/tutorial/schema-extra-example.md
@@ -1,5 +1,6 @@
# Declare dados de exemplo da requisição { #declare-request-example-data }
+
Você pode declarar exemplos dos dados que sua aplicação pode receber.
Aqui estão várias maneiras de fazer isso.
@@ -24,7 +25,7 @@ Por exemplo, você poderia usá-la para adicionar metadados para uma interface d
///
-/// info | Informação
+/// note | Nota
O OpenAPI 3.1.0 (usado desde o FastAPI 0.99.0) adicionou suporte a `examples`, que faz parte do padrão **JSON Schema**.
@@ -155,7 +156,7 @@ O OpenAPI também adicionou os campos `example` e `examples` a outras partes da
* `File()`
* `Form()`
-/// info | Informação
+/// note | Nota
Esse parâmetro antigo `examples` específico do OpenAPI agora é `openapi_examples` desde o FastAPI `0.103.0`.
@@ -171,7 +172,7 @@ E agora esse novo campo `examples` tem precedência sobre o antigo campo único
Esse novo campo `examples` no JSON Schema é **apenas uma `list`** de exemplos, não um dict com metadados extras como nos outros lugares do OpenAPI (descritos acima).
-/// info | Informação
+/// note | Nota
Mesmo após o lançamento do OpenAPI 3.1.0 com essa nova integração mais simples com o JSON Schema, por um tempo o Swagger UI, a ferramenta que fornece a documentação automática, não suportava OpenAPI 3.1.0 (passou a suportar desde a versão 5.0.0 🎉).
diff --git a/docs/pt/docs/tutorial/security/first-steps.md b/docs/pt/docs/tutorial/security/first-steps.md
index d16c15140..9780f8a69 100644
--- a/docs/pt/docs/tutorial/security/first-steps.md
+++ b/docs/pt/docs/tutorial/security/first-steps.md
@@ -24,7 +24,7 @@ Copie o exemplo em um arquivo `main.py`:
## Execute-o { #run-it }
-/// info | Informação
+/// note | Nota
O pacote [`python-multipart`](https://github.com/Kludex/python-multipart) é instalado automaticamente com o **FastAPI** quando você executa o comando `pip install "fastapi[standard]"`.
@@ -60,11 +60,11 @@ Você verá algo deste tipo:
-/// check | Botão Autorizar!
+/// tip | Botão Autorizar!
-Você já tem um novo botão 'Authorize'.
+Você já tem um novo e brilhante botão "Authorize".
-E sua operação de rota tem um pequeno cadeado no canto superior direito em que você pode clicar.
+E sua *operação de rota* tem um pequeno cadeado no canto superior direito em que você pode clicar.
///
@@ -80,7 +80,7 @@ Não importa o que você digite no formulário, ainda não vai funcionar. Mas n
Claro que este não é o frontend para os usuários finais, mas é uma ótima ferramenta automática para documentar interativamente toda a sua API.
-Pode ser usada pelo time de frontend (que pode ser você mesmo).
+Pode ser usada pela equipe de frontend (que pode ser você mesmo).
Pode ser usada por aplicações e sistemas de terceiros.
@@ -106,7 +106,7 @@ Então, vamos rever de um ponto de vista simplificado:
* Então, o usuário terá que fazer login novamente em algum momento.
* E se o token for roubado, o risco é menor. Não é como uma chave permanente que funcionará para sempre (na maioria dos casos).
* O frontend armazena esse token temporariamente em algum lugar.
-* O usuário clica no frontend para ir para outra seção do aplicativo web.
+* O usuário clica no frontend para ir para outra seção da aplicação web do frontend.
* O frontend precisa buscar mais dados da API.
* Mas precisa de autenticação para aquele endpoint específico.
* Então, para autenticar com nossa API, ele envia um header `Authorization` com o valor `Bearer ` mais o token.
@@ -118,7 +118,7 @@ O **FastAPI** fornece várias ferramentas, em diferentes níveis de abstração,
Neste exemplo, vamos usar **OAuth2**, com o fluxo **Password**, usando um token **Bearer**. Fazemos isso usando a classe `OAuth2PasswordBearer`.
-/// info | Informação
+/// note | Nota
Um token "bearer" não é a única opção.
@@ -144,11 +144,11 @@ Usar uma URL relativa é importante para garantir que sua aplicação continue f
///
-Esse parâmetro não cria aquele endpoint/operação de rota, mas declara que a URL `/token` será aquela que o client deve usar para obter o token. Essa informação é usada no OpenAPI e depois nos sistemas de documentação interativa da API.
+Esse parâmetro não cria aquele endpoint / *operação de rota*, mas declara que a URL `/token` será aquela que o client deve usar para obter o token. Essa informação é usada no OpenAPI e depois nos sistemas de documentação interativa da API.
Em breve também criaremos a operação de rota real.
-/// info | Informação
+/// note | Nota
Se você é um "Pythonista" muito rigoroso, pode não gostar do estilo do nome do parâmetro `tokenUrl` em vez de `token_url`.
@@ -176,7 +176,7 @@ Essa dependência fornecerá uma `str` que é atribuída ao parâmetro `token` d
O **FastAPI** saberá que pode usar essa dependência para definir um "esquema de segurança" no esquema OpenAPI (e na documentação automática da API).
-/// info | Detalhes Técnicos
+/// note | Detalhes Técnicos
O **FastAPI** saberá que pode usar a classe `OAuth2PasswordBearer` (declarada em uma dependência) para definir o esquema de segurança no OpenAPI porque ela herda de `fastapi.security.oauth2.OAuth2`, que por sua vez herda de `fastapi.security.base.SecurityBase`.
diff --git a/docs/pt/docs/tutorial/security/get-current-user.md b/docs/pt/docs/tutorial/security/get-current-user.md
index 4c6397c31..d56de4f8f 100644
--- a/docs/pt/docs/tutorial/security/get-current-user.md
+++ b/docs/pt/docs/tutorial/security/get-current-user.md
@@ -14,11 +14,11 @@ Primeiro, vamos criar um modelo de usuário com Pydantic.
Da mesma forma que usamos o Pydantic para declarar corpos, podemos usá-lo em qualquer outro lugar:
-{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
+{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## Criar uma dependência `get_current_user` { #create-a-get-current-user-dependency }
-Vamos criar uma dependência chamada `get_current_user`.
+Vamos criar uma dependência `get_current_user`.
Lembra que as dependências podem ter subdependências?
@@ -52,7 +52,7 @@ Aqui, o **FastAPI** não ficará confuso porque você está usando `Depends`.
///
-/// check | Verifique
+/// tip | Dica
A forma como esse sistema de dependências foi projetado nos permite ter diferentes dependências (diferentes "dependables") que retornam um modelo `User`.
diff --git a/docs/pt/docs/tutorial/security/oauth2-jwt.md b/docs/pt/docs/tutorial/security/oauth2-jwt.md
index 6397664fb..dbbbdc79d 100644
--- a/docs/pt/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/pt/docs/tutorial/security/oauth2-jwt.md
@@ -1,6 +1,6 @@
# OAuth2 com Senha (e hashing), Bearer com tokens JWT { #oauth2-with-password-and-hashing-bearer-with-jwt-tokens }
-Agora que temos todo o fluxo de segurança, vamos tornar a aplicação realmente segura, usando tokens JWT e hashing de senhas seguras.
+Agora que temos todo o fluxo de segurança, vamos tornar a aplicação realmente segura, usando tokens JWT e hashing seguro de senhas.
Este código é algo que você pode realmente usar na sua aplicação, salvar os hashes das senhas no seu banco de dados, etc.
@@ -42,9 +42,9 @@ $ pip install pyjwt
-/// info | Informação
+/// note | Nota
-Se você pretente utilizar algoritmos de assinatura digital como o RSA ou o ECDSA, você deve instalar a dependência da biblioteca de criptografia `pyjwt[crypto]`.
+Se você pretende utilizar algoritmos de assinatura digital como o RSA ou o ECDSA, você deveria instalar a dependência da biblioteca de criptografia `pyjwt[crypto]`.
Você pode ler mais sobre isso na [documentação de instalação do PyJWT](https://pyjwt.readthedocs.io/en/latest/installation.html).
@@ -88,7 +88,7 @@ $ pip install "pwdlib[argon2]"
Com o `pwdlib`, você poderia até configurá-lo para ser capaz de ler senhas criadas pelo **Django**, um plug-in de segurança do **Flask** ou muitos outros.
-Assim, você poderia, por exemplo, compartilhar os mesmos dados de um aplicativo Django em um banco de dados com um aplicativo FastAPI. Ou migrar gradualmente uma aplicação Django usando o mesmo banco de dados.
+Assim, você poderia, por exemplo, compartilhar os mesmos dados de uma aplicação Django em um banco de dados com uma aplicação FastAPI. Ou migrar gradualmente uma aplicação Django usando o mesmo banco de dados.
E seus usuários poderiam fazer login tanto pela sua aplicação Django quanto pela sua aplicação **FastAPI**, ao mesmo tempo.
@@ -213,7 +213,7 @@ Usando as credenciais:
Username: `johndoe`
Password: `secret`
-/// check | Verifique
+/// tip | Dica
Observe que em nenhuma parte do código está a senha em texto puro "`secret`", nós temos apenas o hash.
@@ -260,7 +260,7 @@ Com o que você viu até agora, você pode configurar uma aplicação **FastAPI*
Em quase qualquer framework, lidar com a segurança se torna rapidamente um assunto bastante complexo.
-Muitos pacotes que simplificam bastante isso precisam fazer muitas concessões com o modelo de dados, o banco de dados e os recursos disponíveis. E alguns desses pacotes que simplificam demais na verdade têm falhas de segurança subjacentes.
+Muitos pacotes que simplificam bastante isso precisam fazer muitas concessões com o modelo de dados, o banco de dados e as funcionalidades disponíveis. E alguns desses pacotes que simplificam demais na verdade têm falhas de segurança subjacentes.
---
diff --git a/docs/pt/docs/tutorial/security/simple-oauth2.md b/docs/pt/docs/tutorial/security/simple-oauth2.md
index f582a8141..802879a53 100644
--- a/docs/pt/docs/tutorial/security/simple-oauth2.md
+++ b/docs/pt/docs/tutorial/security/simple-oauth2.md
@@ -4,9 +4,9 @@ Agora vamos construir a partir do capítulo anterior e adicionar as partes que f
## Obtenha o `username` e a `password` { #get-the-username-and-password }
-É utilizado o utils de segurança da **FastAPI** para obter o `username` e a `password`.
+Vamos usar os utilitários de segurança da **FastAPI** para obter o `username` e a `password`.
-OAuth2 especifica que ao usar o "password flow" (fluxo de senha), que estamos usando, o cliente/usuário deve enviar os campos `username` e `password` como dados do formulário.
+OAuth2 especifica que, ao usar o "fluxo de senha" (que estamos usando), o cliente/usuário deve enviar os campos `username` e `password` como dados do formulário.
E a especificação diz que os campos devem ser nomeados assim. Portanto, `user-name` ou `email` não funcionariam.
@@ -29,10 +29,10 @@ Cada “scope” é apenas uma string (sem espaços).
Normalmente são usados para declarar permissões de segurança específicas, por exemplo:
* `users:read` ou `users:write` são exemplos comuns.
-* `instagram_basic` é usado pelo Facebook e Instagram.
+* `instagram_basic` é usado pelo Facebook / Instagram.
* `https://www.googleapis.com/auth/drive` é usado pelo Google.
-/// info | Informação
+/// note | Nota
No OAuth2, um "scope" é apenas uma string que declara uma permissão específica necessária.
@@ -72,13 +72,13 @@ Se você precisar aplicá-lo, use `OAuth2PasswordRequestFormStrict` em vez de `O
* Um `client_id` opcional (não precisamos dele em nosso exemplo).
* Um `client_secret` opcional (não precisamos dele em nosso exemplo).
-/// info | Informação
+/// note | Nota
O `OAuth2PasswordRequestForm` não é uma classe especial para **FastAPI** como é `OAuth2PasswordBearer`.
`OAuth2PasswordBearer` faz com que **FastAPI** saiba que é um esquema de segurança. Portanto, é adicionado dessa forma ao OpenAPI.
-Mas `OAuth2PasswordRequestForm` é apenas uma dependência de classe que você mesmo poderia ter escrito ou poderia ter declarado os parâmetros do `Form` (formulário) diretamente.
+Mas `OAuth2PasswordRequestForm` é apenas uma dependência de classe que você mesmo poderia ter escrito ou poderia ter declarado os parâmetros de `Form` diretamente.
Mas como é um caso de uso comum, ele é fornecido diretamente pelo **FastAPI**, apenas para facilitar.
@@ -108,7 +108,7 @@ Neste ponto temos os dados do usuário do nosso banco de dados, mas não verific
Vamos colocar esses dados primeiro no modelo `UserInDB` do Pydantic.
-Você nunca deve salvar senhas em texto simples, portanto, usaremos o sistema de hashing de senhas (falsas).
+Você nunca deveria salvar senhas em texto simples, portanto, usaremos o sistema (falso) de hashing de senhas.
Se as senhas não corresponderem, retornaremos o mesmo erro.
@@ -120,7 +120,7 @@ Sempre que você passa exatamente o mesmo conteúdo (exatamente a mesma senha),
Mas você não pode converter a sequência aleatória de caracteres de volta para a senha.
-##### Porque usar hashing de senha { #why-use-password-hashing }
+##### Por que usar hashing de senha { #why-use-password-hashing }
Se o seu banco de dados for roubado, o ladrão não terá as senhas em texto simples dos seus usuários, apenas os hashes.
@@ -144,10 +144,9 @@ UserInDB(
)
```
+/// note | Nota
-/// info | Informação
-
-Para uma explicação mais completa de `**user_dict`, verifique [a documentação para **Extra Models**](../extra-models.md#about-user-in-dict).
+Para uma explicação mais completa de `**user_dict`, verifique [a documentação para **Extra Models**](../extra-models.md#about-user-in-model-dump).
///
@@ -173,7 +172,7 @@ Mas, por enquanto, vamos nos concentrar nos detalhes específicos de que precisa
/// tip | Dica
-Pela especificação, você deve retornar um JSON com um `access_token` e um `token_type`, o mesmo que neste exemplo.
+Pela especificação, você deveria retornar um JSON com um `access_token` e um `token_type`, o mesmo que neste exemplo.
Isso é algo que você mesmo deve fazer em seu código e certifique-se de usar essas chaves JSON.
@@ -197,7 +196,7 @@ Portanto, em nosso endpoint, só obteremos um usuário se o usuário existir, ti
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
-/// info | Informação
+/// note | Nota
O cabeçalho adicional `WWW-Authenticate` com valor `Bearer` que estamos retornando aqui também faz parte da especificação.
@@ -217,7 +216,7 @@ Esse é o benefício dos padrões...
## Veja em ação { #see-it-in-action }
-Abra o docs interativo: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
+Abra a documentação interativa: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
### Autentique-se { #authenticate }
diff --git a/docs/pt/docs/tutorial/server-sent-events.md b/docs/pt/docs/tutorial/server-sent-events.md
index 33389873c..63d82c321 100644
--- a/docs/pt/docs/tutorial/server-sent-events.md
+++ b/docs/pt/docs/tutorial/server-sent-events.md
@@ -4,7 +4,7 @@ Você pode transmitir dados para o cliente usando Server-Sent Events (SSE).
Isso é semelhante a [Stream de JSON Lines](stream-json-lines.md), mas usa o formato `text/event-stream`, que é suportado nativamente pelos navegadores com a [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource).
-/// info | Informação
+/// note | Nota
Adicionado no FastAPI 0.135.0.
diff --git a/docs/pt/docs/tutorial/sql-databases.md b/docs/pt/docs/tutorial/sql-databases.md
index 10be4c865..e715007eb 100644
--- a/docs/pt/docs/tutorial/sql-databases.md
+++ b/docs/pt/docs/tutorial/sql-databases.md
@@ -4,7 +4,7 @@
Aqui veremos um exemplo usando [SQLModel](https://sqlmodel.tiangolo.com/).
-**SQLModel** é construído sobre [SQLAlchemy](https://www.sqlalchemy.org/) e Pydantic. Ele foi criado pelo mesmo autor do **FastAPI** para ser o par perfeito para aplicações **FastAPI** que precisam usar **bancos de dados SQL**.
+**SQLModel** é construído sobre [SQLAlchemy](https://www.sqlalchemy.org/) e Pydantic. Ele foi criado pelo mesmo autor do **FastAPI** para ser o par perfeito para aplicações FastAPI que precisam usar **bancos de dados SQL**.
/// tip | Dica
@@ -32,7 +32,7 @@ Existe um gerador de projetos oficial com **FastAPI** e **PostgreSQL** incluindo
Este é um tutorial muito simples e curto, se você quiser aprender sobre bancos de dados em geral, sobre SQL ou recursos mais avançados, acesse a [documentação do SQLModel](https://sqlmodel.tiangolo.com/).
-## Instalar o `SQLModel` { #install-sqlmodel }
+## Instale o `SQLModel` { #install-sqlmodel }
Primeiro, certifique-se de criar seu [ambiente virtual](../virtual-environments.md), ativá-lo e, em seguida, instalar o `sqlmodel`:
@@ -45,13 +45,13 @@ $ pip install sqlmodel
-## Crear o App com um Único Modelo { #create-the-app-with-a-single-model }
+## Crie o App com um Único Modelo { #create-the-app-with-a-single-model }
Vamos criar a primeira versão mais simples do app com um único modelo **SQLModel**.
Depois, vamos melhorá-lo aumentando a segurança e versatilidade com **múltiplos modelos** abaixo. 🤓
-### Criar Modelos { #create-models }
+### Crie Modelos { #create-models }
Importe o `SQLModel` e crie um modelo de banco de dados:
@@ -71,7 +71,8 @@ Existem algumas diferenças:
O SQLModel saberá que algo declarado como `str` será uma coluna SQL do tipo `TEXT` (ou `VARCHAR`, dependendo do banco de dados).
-### Criar um Engine { #create-an-engine }
+### Crie um Engine { #create-an-engine }
+
Um `engine` SQLModel (por baixo dos panos, ele é na verdade um `engine` do SQLAlchemy) é o que **mantém as conexões** com o banco de dados.
Você teria **um único objeto `engine`** para todo o seu código se conectar ao mesmo banco de dados.
@@ -82,13 +83,13 @@ Usar `check_same_thread=False` permite que o FastAPI use o mesmo banco de dados
Não se preocupe, com a forma como o código está estruturado, garantiremos que usamos **uma única *sessão* SQLModel por requisição** mais tarde, isso é realmente o que o `check_same_thread` está tentando conseguir.
-### Criar as Tabelas { #create-the-tables }
+### Crie as Tabelas { #create-the-tables }
Em seguida, adicionamos uma função que usa `SQLModel.metadata.create_all(engine)` para **criar as tabelas** para todos os *modelos de tabela*.
{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[21:22] hl[21:22] *}
-### Criar uma Dependência de Sessão { #create-a-session-dependency }
+### Crie uma Dependência de Sessão { #create-a-session-dependency }
Uma **`Session`** é o que armazena os **objetos na memória** e acompanha as alterações necessárias nos dados, para então **usar o `engine`** para se comunicar com o banco de dados.
@@ -98,7 +99,7 @@ Então, criamos uma dependência `Annotated` chamada `SessionDep` para simplific
{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[25:30] hl[25:27,30] *}
-### Criar Tabelas de Banco de Dados na Inicialização { #create-database-tables-on-startup }
+### Crie Tabelas de Banco de Dados na Inicialização { #create-database-tables-on-startup }
Vamos criar as tabelas do banco de dados quando o aplicativo for iniciado.
@@ -114,7 +115,7 @@ O SQLModel terá utilitários de migração envolvendo o Alembic, mas por enquan
///
-### Criar um Hero { #create-a-hero }
+### Crie um Hero { #create-a-hero }
Como cada modelo SQLModel também é um modelo Pydantic, você pode usá-lo nas mesmas **anotações de tipo** que usaria para modelos Pydantic.
@@ -126,25 +127,25 @@ Da mesma forma, você pode declará-lo como o **tipo de retorno** da função, e
Aqui, usamos a dependência `SessionDep` (uma `Session`) para adicionar o novo `Hero` à instância `Session`, fazer commit das alterações no banco de dados, atualizar os dados no `hero` e então retorná-lo.
-### Ler Heroes { #read-heroes }
+### Leia Heroes { #read-heroes }
Podemos **ler** `Hero`s do banco de dados usando um `select()`. Podemos incluir um `limit` e `offset` para paginar os resultados.
{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[48:55] hl[51:52,54] *}
-### Ler um Único Hero { #read-one-hero }
+### Leia um Único Hero { #read-one-hero }
Podemos **ler** um único `Hero`.
{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[58:63] hl[60] *}
-### Deletar um Hero { #delete-a-hero }
+### Delete um Hero { #delete-a-hero }
Também podemos **deletar** um `Hero`.
{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[66:73] hl[71] *}
-### Executar o App { #run-the-app }
+### Execute o App { #run-the-app }
Você pode executar o app:
@@ -164,19 +165,19 @@ Então, vá para a interface `/docs`, você verá que o **FastAPI** está usando
-## Atualizar o App com Múltiplos Modelos { #update-the-app-with-multiple-models }
+## Atualize o App com Múltiplos Modelos { #update-the-app-with-multiple-models }
Agora vamos **refatorar** este app um pouco para aumentar a **segurança** e **versatilidade**.
-Se você verificar o app anterior, na interface você pode ser que, até agora, ele permite que o cliente decida o `id` do `Hero` a ser criado. 😱
+Se você verificar o app anterior, na interface você pode ver que, até agora, ele permite que o cliente decida o `id` do `Hero` a ser criado. 😱
-Não deveríamos deixar isso acontecer, eles poderiam sobrescrever um `id` que já atribuimos na base de dados. Decidir o `id` deve ser feito pelo **backend** ou pelo **banco de dados**, **não pelo cliente**.
+Não deveríamos deixar isso acontecer, eles poderiam sobrescrever um `id` que já atribuímos no banco de dados. Decidir o `id` deve ser feito pelo **backend** ou pelo **banco de dados**, **não pelo cliente**.
Além disso, criamos um `secret_name` para o hero, mas até agora estamos retornando ele em todos os lugares, isso não é muito **secreto**... 😅
Vamos corrigir essas coisas adicionando alguns **modelos extras**. Aqui é onde o SQLModel vai brilhar. ✨
-### Criar Múltiplos Modelos { #create-multiple-models }
+### Crie Múltiplos Modelos { #create-multiple-models }
No **SQLModel**, qualquer classe de modelo que tenha `table=True` é um **modelo de tabela**.
@@ -277,7 +278,7 @@ Os campos de `HeroUpdate` são:
{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[7:28] hl[25:28] *}
-### Criar com `HeroCreate` e retornar um `HeroPublic` { #create-with-herocreate-and-return-a-heropublic }
+### Crie com `HeroCreate` e retorne um `HeroPublic` { #create-with-herocreate-and-return-a-heropublic }
Agora que temos **múltiplos modelos**, podemos atualizar as partes do app que os utilizam.
@@ -299,19 +300,19 @@ Ao declará-lo no `response_model`, estamos dizendo ao **FastAPI** para fazer o
///
-### Ler Heroes com `HeroPublic` { #read-heroes-with-heropublic }
+### Leia Heroes com `HeroPublic` { #read-heroes-with-heropublic }
Podemos fazer o mesmo que antes para **ler** `Hero`s, novamente, usamos `response_model=list[HeroPublic]` para garantir que os dados sejam validados e serializados corretamente.
{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[65:72] hl[65] *}
-### Ler Um Hero com `HeroPublic` { #read-one-hero-with-heropublic }
+### Leia Um Hero com `HeroPublic` { #read-one-hero-with-heropublic }
Podemos **ler** um único herói:
{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[75:80] hl[77] *}
-### Atualizar um Hero com `HeroUpdate` { #update-a-hero-with-heroupdate }
+### Atualize um Hero com `HeroUpdate` { #update-a-hero-with-heroupdate }
Podemos **atualizar um hero**. Para isso, usamos uma operação HTTP `PATCH`.
@@ -321,7 +322,7 @@ Em seguida, usamos `hero_db.sqlmodel_update(hero_data)` para atualizar o `hero_d
{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[83:93] hl[83:84,88:89] *}
-### Deletar um Hero Novamente { #delete-a-hero-again }
+### Delete um Hero Novamente { #delete-a-hero-again }
**Deletar** um hero permanece praticamente o mesmo.
@@ -329,7 +330,7 @@ Não vamos satisfazer o desejo de refatorar tudo neste aqui. 😅
{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[96:103] hl[101] *}
-### Executar o App Novamente { #run-the-app-again }
+### Execute o App Novamente { #run-the-app-again }
Você pode executar o app novamente:
diff --git a/docs/pt/docs/tutorial/static-files.md b/docs/pt/docs/tutorial/static-files.md
index e9150facd..4e8d4319a 100644
--- a/docs/pt/docs/tutorial/static-files.md
+++ b/docs/pt/docs/tutorial/static-files.md
@@ -2,6 +2,14 @@
Você pode servir arquivos estáticos automaticamente a partir de um diretório usando `StaticFiles`.
+/// tip | Dica
+
+Se você precisar hospedar um frontend, use `app.frontend()` em vez disso, leia sobre isso em [Frontend](frontend.md).
+
+`app.frontend()` usa `StaticFiles` por baixo, com várias vantagens adicionais para frontends, como lidar com roteamento do lado do cliente.
+
+///
+
## Use `StaticFiles` { #use-staticfiles }
* Importe `StaticFiles`.
diff --git a/docs/pt/docs/tutorial/stream-json-lines.md b/docs/pt/docs/tutorial/stream-json-lines.md
index f6d5c26f0..a76bacd11 100644
--- a/docs/pt/docs/tutorial/stream-json-lines.md
+++ b/docs/pt/docs/tutorial/stream-json-lines.md
@@ -2,7 +2,7 @@
Você pode ter uma sequência de dados que deseja enviar em um "**Stream**"; é possível fazer isso com **JSON Lines**.
-/// info | Informação
+/// note | Nota
Adicionado no FastAPI 0.134.0.
@@ -48,7 +48,7 @@ Uma response teria um tipo de conteúdo `application/jsonl` (em vez de `applicat
É muito semelhante a um array JSON (equivalente a uma list do Python), mas em vez de estar envolto em `[]` e ter `,` entre os itens, há **um objeto JSON por linha**, separados por um caractere de nova linha.
-/// info | Informação
+/// note | Nota
O ponto importante é que sua aplicação poderá produzir cada linha em sequência, enquanto o cliente consome as anteriores.
diff --git a/docs/pt/docs/tutorial/testing.md b/docs/pt/docs/tutorial/testing.md
index 1730511e6..9d94cddcd 100644
--- a/docs/pt/docs/tutorial/testing.md
+++ b/docs/pt/docs/tutorial/testing.md
@@ -8,7 +8,7 @@ Com ele, você pode usar o [pytest](https://docs.pytest.org/) diretamente com **
## Usando `TestClient` { #using-testclient }
-/// info | Informação
+/// note | Nota
Para usar o `TestClient`, primeiro instale [`httpx`](https://www.python-httpx.org).
@@ -52,7 +52,7 @@ Você também pode usar `from starlette.testclient import TestClient`.
/// tip | Dica
-Se você quiser chamar funções `async` em seus testes além de enviar solicitações à sua aplicação FastAPI (por exemplo, funções de banco de dados assíncronas), dê uma olhada em [Testes assíncronos](../advanced/async-tests.md) no tutorial avançado.
+Se você quiser chamar funções `async` em seus testes além de enviar requests à sua aplicação FastAPI (por exemplo, funções de banco de dados assíncronas), dê uma olhada em [Testes assíncronos](../advanced/async-tests.md) no tutorial avançado.
///
@@ -94,6 +94,7 @@ Como esse arquivo está no mesmo pacote, você pode usar importações relativas
{* ../../docs_src/app_testing/app_a_py310/test_main.py hl[3] *}
+
...e ter o código para os testes como antes.
## Testando: exemplo estendido { #testing-extended-example }
@@ -112,13 +113,13 @@ Vamos continuar com a mesma estrutura de arquivo de antes:
│ └── test_main.py
```
-Digamos que agora o arquivo `main.py` com sua aplicação **FastAPI** tenha algumas outras **operações de rotas**.
+Digamos que agora o arquivo `main.py` com sua aplicação **FastAPI** tenha algumas outras **operações de rota**.
Ele tem uma operação `GET` que pode retornar um erro.
Ele tem uma operação `POST` que pode retornar vários erros.
-Ambas as *operações de rotas* requerem um cabeçalho `X-Token`.
+Ambas as *operações de rota* requerem um cabeçalho `X-Token`.
{* ../../docs_src/app_testing/app_b_an_py310/main.py *}
@@ -128,6 +129,7 @@ Você pode então atualizar `test_main.py` com os testes estendidos:
{* ../../docs_src/app_testing/app_b_an_py310/test_main.py *}
+
Sempre que você precisar que o cliente passe informações na requisição e não souber como, você pode pesquisar (no Google) como fazer isso no `httpx`, ou até mesmo como fazer isso com `requests`, já que o design do HTTPX é baseado no design do Requests.
Depois é só fazer o mesmo nos seus testes.
@@ -142,11 +144,11 @@ Por exemplo:
Para mais informações sobre como passar dados para o backend (usando `httpx` ou `TestClient`), consulte a [documentação do HTTPX](https://www.python-httpx.org).
-/// info | Informação
+/// note | Nota
Observe que o `TestClient` recebe dados que podem ser convertidos para JSON, não para modelos Pydantic.
-Se você tiver um modelo Pydantic em seu teste e quiser enviar seus dados para o aplicativo durante o teste, poderá usar o `jsonable_encoder` descrito em [Codificador compatível com JSON](encoder.md).
+Se você tiver um modelo Pydantic em seu teste e quiser enviar seus dados para a aplicação durante o teste, poderá usar o `jsonable_encoder` descrito em [Codificador compatível com JSON](encoder.md).
///
diff --git a/docs/pt/docs/virtual-environments.md b/docs/pt/docs/virtual-environments.md
index 245919608..121032d6c 100644
--- a/docs/pt/docs/virtual-environments.md
+++ b/docs/pt/docs/virtual-environments.md
@@ -26,7 +26,7 @@ Se você estiver pronto para adotar uma **ferramenta que gerencia tudo** para vo
///
-## Criar um Projeto { #create-a-project }
+## Crie um Projeto { #create-a-project }
Primeiro, crie um diretório para seu projeto.
@@ -212,7 +212,7 @@ Se ele mostrar o binário `python` em `.venv\Scripts\python`, dentro do seu proj
////
-## Atualizar `pip` { #upgrade-pip }
+## Atualize `pip` { #upgrade-pip }
/// tip | Dica
@@ -262,7 +262,7 @@ Esse comando instalará o pip caso ele ainda não esteja instalado e também gar
///
-## Adicionar `.gitignore` { #add-gitignore }
+## Adicione `.gitignore` { #add-gitignore }
Se você estiver usando **Git** (você deveria), adicione um arquivo `.gitignore` para excluir tudo em seu `.venv` do Git.
@@ -302,7 +302,7 @@ Esse comando criará um arquivo `.gitignore` com o conteúdo:
///
-## Instalar Pacotes { #install-packages }
+## Instale Pacotes { #install-packages }
Após ativar o ambiente, você pode instalar pacotes nele.
@@ -314,7 +314,7 @@ Se precisar atualizar uma versão ou adicionar um novo pacote, você **fará iss
///
-### Instalar pacotes diretamente { #install-packages-directly }
+### Instale pacotes diretamente { #install-packages-directly }
Se estiver com pressa e não quiser usar um arquivo para declarar os requisitos de pacote do seu projeto, você pode instalá-los diretamente.
@@ -353,7 +353,7 @@ $ uv pip install "fastapi[standard]"
////
-### Instalar a partir de `requirements.txt` { #install-from-requirements-txt }
+### Instale a partir de `requirements.txt` { #install-from-requirements-txt }
Se você tiver um `requirements.txt`, agora poderá usá-lo para instalar seus pacotes.
@@ -425,7 +425,7 @@ Normalmente, você só precisa fazer isso **uma vez**, ao criar o ambiente virtu
///
-## Desativar o ambiente virtual { #deactivate-the-virtual-environment }
+## Desative o ambiente virtual { #deactivate-the-virtual-environment }
Quando terminar de trabalhar no seu projeto, você pode **desativar** o ambiente virtual.
@@ -768,7 +768,7 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python
Isso significa que o programa `python` que será usado é aquele **no ambiente virtual**.
-você usa `which` no Linux e macOS e `Get-Command` no Windows PowerShell.
+Você usa `which` no Linux e macOS e `Get-Command` no Windows PowerShell.
A maneira como esse comando funciona é que ele vai e verifica na variável de ambiente `PATH`, passando por **cada caminho em ordem**, procurando pelo programa chamado `python`. Uma vez que ele o encontre, ele **mostrará o caminho** para esse programa.
@@ -811,7 +811,7 @@ $ cd ~/code/prisoner-of-azkaban
$ python main.py
-// Erro ao importar o Sirius, ele não está instalado 😱
+// Erro ao importar sirius, ele não está instalado 😱
Traceback (most recent call last):
File "main.py", line 1, in
@@ -186,7 +171,7 @@ FastAPI использует **уникальный ID** для каждой *о
npx @hey-api/openapi-ts -i ./openapi.json -o src/client
```
-После генерации нового клиента у вас будут **чистые имена методов**, со всем **автозавершением**, **ошибками прямо в редакторе** и т.д.:
+После генерации нового клиента у вас будут **чистые имена методов**, со всем **автозавершением**, **ошибками прямо в редакторе кода** и т.д.:
@@ -198,7 +183,7 @@ npx @hey-api/openapi-ts -i ./openapi.json -o src/client
* Данных запроса — в теле запроса, query‑параметрах и т.д.
* Данных ответа.
-У вас также будут **ошибки прямо в редакторе** для всего.
+У вас также будут **ошибки прямо в редакторе кода** для всего.
И каждый раз, когда вы обновляете код бэкенда и **перегенерируете** фронтенд, в нём появятся новые *операции пути* как методы, старые будут удалены, а любые другие изменения отразятся в сгенерированном коде. 🤓
diff --git a/docs/ru/docs/advanced/json-base64-bytes.md b/docs/ru/docs/advanced/json-base64-bytes.md
index 390dd17fa..262766889 100644
--- a/docs/ru/docs/advanced/json-base64-bytes.md
+++ b/docs/ru/docs/advanced/json-base64-bytes.md
@@ -4,7 +4,7 @@
## Base64 и файлы { #base64-vs-files }
-Сначала рассмотрите возможность использовать [Файлы в запросе](../tutorial/request-files.md) для загрузки бинарных данных и [Пользовательский HTTP-ответ — FileResponse](./custom-response.md#fileresponse--fileresponse-) для отправки бинарных данных вместо кодирования их в JSON.
+Сначала рассмотрите возможность использовать [Файлы в запросе](../tutorial/request-files.md) для загрузки бинарных данных и [Пользовательский HTTP-ответ — FileResponse](./custom-response.md#fileresponse) для отправки бинарных данных вместо кодирования их в JSON.
JSON может содержать только строки в кодировке UTF-8, поэтому он не может содержать «сырые» байты.
@@ -14,7 +14,7 @@ Base64 может кодировать бинарные данные в стро
## Pydantic `bytes` { #pydantic-bytes }
-Вы можете объявить Pydantic-модель с полями `bytes`, а затем использовать `val_json_bytes` в конфиге модели, чтобы указать использовать base64 для валидации входящих JSON-данных; как часть этой валидации строка base64 будет декодирована в байты.
+Вы можете объявить Pydantic-модель с полями `bytes`, а затем использовать `val_json_bytes` в конфиге модели, чтобы указать использовать base64 для *валидации* входящих JSON-данных; как часть этой валидации строка base64 будет декодирована в байты.
{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *}
@@ -52,12 +52,12 @@ Base64 может кодировать бинарные данные в стро
## Pydantic `bytes` для выходных данных { #pydantic-bytes-for-output-data }
-Вы также можете использовать поля `bytes` с `ser_json_bytes` в конфиге модели для выходных данных, и Pydantic будет сериализовать байты в base64 при формировании JSON-ответа.
+Вы также можете использовать поля `bytes` с `ser_json_bytes` в конфиге модели для выходных данных, и Pydantic будет *сериализовать* байты в base64 при формировании JSON-ответа.
{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *}
## Pydantic `bytes` для входных и выходных данных { #pydantic-bytes-for-input-and-output-data }
-И, конечно, вы можете использовать одну и ту же модель, настроенную на использование base64, чтобы обрабатывать и входящие данные (валидация) с `val_json_bytes`, и исходящие данные (сериализация) с `ser_json_bytes` при приеме и отправке JSON-данных.
+И, конечно, вы можете использовать одну и ту же модель, настроенную на использование base64, чтобы обрабатывать и входящие данные (*валидировать*) с `val_json_bytes`, и исходящие данные (*сериализовать*) с `ser_json_bytes` при приеме и отправке JSON-данных.
{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *}
diff --git a/docs/ru/docs/advanced/openapi-callbacks.md b/docs/ru/docs/advanced/openapi-callbacks.md
index 3d791de2c..002b69c7c 100644
--- a/docs/ru/docs/advanced/openapi-callbacks.md
+++ b/docs/ru/docs/advanced/openapi-callbacks.md
@@ -1,10 +1,10 @@
# Обратные вызовы в OpenAPI { #openapi-callbacks }
-Вы можете создать API с *операцией пути* (обработчиком пути), которая будет инициировать HTTP-запрос к *внешнему API*, созданному кем-то другим (скорее всего тем же разработчиком, который будет использовать ваш API).
+Вы можете создать API с *операцией пути* (обработчиком пути), которая будет инициировать HTTP-запрос к *внешнему API*, созданному кем-то другим (скорее всего тем же разработчиком, который будет *использовать* ваш API).
-Процесс, происходящий, когда ваше приложение API обращается к *внешнему API*, называется «callback» (обратный вызов). Программное обеспечение, написанное внешним разработчиком, отправляет HTTP-запрос вашему API, а затем ваш API выполняет обратный вызов, отправляя HTTP-запрос во *внешний API* (который, вероятно, тоже создал тот же разработчик).
+Процесс, происходящий, когда ваше приложение API обращается к *внешнему API*, называется «callback» (обратный вызов). Потому что программное обеспечение, написанное внешним разработчиком, отправляет HTTP-запрос вашему API, а затем ваш API выполняет обратный вызов, отправляя HTTP-запрос во *внешний API* (который, вероятно, тоже создал тот же разработчик).
-В этом случае вам может понадобиться задокументировать, как должно выглядеть это внешнее API: какую *операцию пути* оно должно иметь, какое тело запроса ожидать, какой ответ возвращать и т.д.
+В этом случае вам может понадобиться задокументировать, как это внешнее API *должно* выглядеть: какую *операцию пути* оно должно иметь, какое тело запроса ожидать, какой HTTP-ответ возвращать и т.д.
## Приложение с обратными вызовами { #an-app-with-callbacks }
@@ -82,7 +82,7 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True})
Когда вы пишете код для документирования обратного вызова, полезно представить, что вы — тот самый *внешний разработчик*. И что вы сейчас реализуете *внешний API*, а не *свой API*.
-Временное принятие этой точки зрения (внешнего разработчика) поможет интуитивно понять, куда поместить параметры, какую Pydantic-модель использовать для тела запроса, для ответа и т.д. во *внешнем API*.
+Временное принятие этой точки зрения (внешнего разработчика) поможет интуитивно понять, куда поместить параметры, какую Pydantic-модель использовать для тела запроса, для HTTP-ответа и т.д. во *внешнем API*.
///
@@ -99,7 +99,7 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True})
Она должна выглядеть как обычная *операция пути* FastAPI:
* Вероятно, в ней должно быть объявление тела запроса, например `body: InvoiceEvent`.
-* А также может быть объявление модели ответа, например `response_model=InvoiceEventReceived`.
+* А также может быть объявление HTTP-ответа, который она должна возвращать, например `response_model=InvoiceEventReceived`.
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[14:16,19:20,26:30] *}
@@ -124,7 +124,7 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True})
https://yourapi.com/invoices/?callback_url=https://www.external.org/events
```
-с телом JSON:
+с телом запроса JSON:
```JSON
{
@@ -140,7 +140,7 @@ https://yourapi.com/invoices/?callback_url=https://www.external.org/events
https://www.external.org/events/invoices/2expen51ve
```
-с телом JSON примерно такого вида:
+с телом запроса JSON примерно такого вида:
```JSON
{
@@ -149,7 +149,7 @@ https://www.external.org/events/invoices/2expen51ve
}
```
-и будет ожидать от *внешнего API* ответ с телом JSON вида:
+и будет ожидать от *внешнего API* HTTP-ответ с JSON в теле ответа:
```JSON
{
@@ -163,17 +163,17 @@ https://www.external.org/events/invoices/2expen51ve
///
-### Подключите маршрутизатор обратного вызова { #add-the-callback-router }
+### Добавьте роутер обратного вызова { #add-the-callback-router }
-К этому моменту у вас есть необходимые *операции пути* обратного вызова (те, которые *внешний разработчик* должен реализовать во *внешнем API*) в созданном выше маршрутизаторе обратных вызовов.
+К этому моменту у вас есть необходимые *операции пути* обратного вызова (те, которые *внешний разработчик* должен реализовать во *внешнем API*) в созданном выше роутере обратных вызовов.
-Теперь используйте параметр `callbacks` в *декораторе операции пути вашего API*, чтобы передать атрибут `.routes` (это, по сути, просто `list` маршрутов/*операций пути*) из этого маршрутизатора обратных вызовов:
+Теперь используйте параметр `callbacks` в *декораторе операции пути вашего API*, чтобы передать атрибут `.routes` из этого роутера обратных вызовов:
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
/// tip | Совет
-Обратите внимание, что вы передаёте не сам маршрутизатор (`invoices_callback_router`) в `callback=`, а его атрибут `.routes`, то есть `invoices_callback_router.routes`.
+Обратите внимание, что вы передаёте не сам роутер (`invoices_callback_router`) в `callbacks=`, а его атрибут `.routes`, то есть `invoices_callback_router.routes`. FastAPI будет использовать эти маршруты для генерации документации OpenAPI для обратных вызовов.
///
diff --git a/docs/ru/docs/advanced/openapi-webhooks.md b/docs/ru/docs/advanced/openapi-webhooks.md
index 9b1988ff3..cd4d23e7e 100644
--- a/docs/ru/docs/advanced/openapi-webhooks.md
+++ b/docs/ru/docs/advanced/openapi-webhooks.md
@@ -22,7 +22,7 @@
Это значительно упростит вашим пользователям реализацию их API для приема ваших вебхук-запросов; возможно, они даже смогут автоматически сгенерировать часть кода своего API.
-/// info | Информация
+/// note | Примечание
Вебхуки доступны в OpenAPI 3.1.0 и выше, поддерживаются в FastAPI `0.99.0` и новее.
@@ -36,7 +36,7 @@
Определенные вами вебхуки попадут в схему **OpenAPI** и в автоматический **интерфейс документации**.
-/// info | Информация
+/// note | Примечание
Объект `app.webhooks` на самом деле — это обычный `APIRouter`, тот же тип, который вы используете при структурировании приложения по нескольким файлам.
diff --git a/docs/ru/docs/advanced/path-operation-advanced-configuration.md b/docs/ru/docs/advanced/path-operation-advanced-configuration.md
index fe2996362..e3bd78d50 100644
--- a/docs/ru/docs/advanced/path-operation-advanced-configuration.md
+++ b/docs/ru/docs/advanced/path-operation-advanced-configuration.md
@@ -16,17 +16,11 @@
### Использование имени *функции-обработчика пути* как operationId { #using-the-path-operation-function-name-as-the-operationid }
-Если вы хотите использовать имена функций ваших API в качестве `operationId`, вы можете пройти по всем из них и переопределить `operation_id` каждой *операции пути* с помощью их `APIRoute.name`.
+Если вы хотите использовать имена функций ваших API в качестве `operationId`, вы можете передать пользовательскую `generate_unique_id_function` в `FastAPI`.
-Делать это следует после добавления всех *операций пути*.
+Эта функция получает каждый `APIRoute` и возвращает `operationId`, который нужно использовать для этой операции пути.
-{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}
-
-/// tip | Совет
-
-Если вы вызываете `app.openapi()` вручную, обновите `operationId` до этого.
-
-///
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *}
/// warning | Предупреждение
diff --git a/docs/ru/docs/advanced/response-change-status-code.md b/docs/ru/docs/advanced/response-change-status-code.md
index 3dd0c9446..a4ebd4fbc 100644
--- a/docs/ru/docs/advanced/response-change-status-code.md
+++ b/docs/ru/docs/advanced/response-change-status-code.md
@@ -1,6 +1,6 @@
# Response - Изменение статус-кода { #response-change-status-code }
-Вы, вероятно, уже читали о том, что можно установить [статус-код ответа по умолчанию](../tutorial/response-status-code.md).
+Вы, вероятно, уже читали о том, что можно установить [статус-код ответа](../tutorial/response-status-code.md) по умолчанию.
Но в некоторых случаях нужно вернуть другой статус-код, отличный от значения по умолчанию.
@@ -16,7 +16,7 @@
## Использование параметра `Response` { #use-a-response-parameter }
-Вы можете объявить параметр типа `Response` в вашей *функции обработки пути* (как и для cookies и HTTP-заголовков).
+Вы можете объявить параметр типа `Response` в вашей *функции-обработчике пути* (как и для cookies и HTTP-заголовков).
И затем вы можете установить `status_code` в этом *временном* объекте ответа.
diff --git a/docs/ru/docs/advanced/response-cookies.md b/docs/ru/docs/advanced/response-cookies.md
index 2adc1af85..3e16fe892 100644
--- a/docs/ru/docs/advanced/response-cookies.md
+++ b/docs/ru/docs/advanced/response-cookies.md
@@ -1,5 +1,6 @@
# Cookies в ответе { #response-cookies }
+
## Использование параметра `Response` { #use-a-response-parameter }
Вы можете объявить параметр типа `Response` в вашей функции-обработчике пути.
diff --git a/docs/ru/docs/advanced/response-directly.md b/docs/ru/docs/advanced/response-directly.md
index fcb8d533d..c9a229018 100644
--- a/docs/ru/docs/advanced/response-directly.md
+++ b/docs/ru/docs/advanced/response-directly.md
@@ -18,7 +18,7 @@
Вы можете возвращать `Response` или любой его подкласс.
-/// info | Информация
+/// note | Примечание
`JSONResponse` сам по себе является подклассом `Response`.
diff --git a/docs/ru/docs/advanced/response-headers.md b/docs/ru/docs/advanced/response-headers.md
index 806b89e1f..e0cfa66ed 100644
--- a/docs/ru/docs/advanced/response-headers.md
+++ b/docs/ru/docs/advanced/response-headers.md
@@ -2,7 +2,7 @@
## Использовать параметр `Response` { #use-a-response-parameter }
-Вы можете объявить параметр типа `Response` в вашей функции-обработчике пути (как можно сделать и для cookie).
+Вы можете объявить параметр типа `Response` в вашей *функции-обработчике пути* (как можно сделать и для cookie).
А затем вы можете устанавливать HTTP-заголовки в этом *временном* объекте ответа.
@@ -14,13 +14,13 @@
**FastAPI** использует этот *временный* ответ, чтобы извлечь HTTP-заголовки (а также cookie и статус-код) и поместит их в финальный HTTP-ответ, который содержит возвращённое вами значение, отфильтрованное согласно `response_model`.
-Вы также можете объявлять параметр `Response` в зависимостях и устанавливать в них заголовки (и cookie).
+Вы также можете объявлять параметр `Response` в зависимостях и устанавливать в них HTTP-заголовки (и cookie).
## Вернуть `Response` напрямую { #return-a-response-directly }
Вы также можете добавить HTTP-заголовки, когда возвращаете `Response` напрямую.
-Создайте ответ, как описано в [Вернуть Response напрямую](response-directly.md), и передайте заголовки как дополнительный параметр:
+Создайте ответ, как описано в [Вернуть Response напрямую](response-directly.md), и передайте HTTP-заголовки как дополнительный параметр:
{* ../../docs_src/response_headers/tutorial001_py310.py hl[10:12] *}
@@ -30,12 +30,12 @@
**FastAPI** предоставляет те же самые `starlette.responses` как `fastapi.responses` — для вашего удобства как разработчика. Но большинство доступных классов ответов поступают напрямую из Starlette.
-И поскольку `Response` часто используется для установки заголовков и cookie, **FastAPI** также предоставляет его как `fastapi.Response`.
+И поскольку `Response` часто используется для установки HTTP-заголовков и cookie, **FastAPI** также предоставляет его как `fastapi.Response`.
///
## Пользовательские HTTP-заголовки { #custom-headers }
-Помните, что собственные проприетарные заголовки можно добавлять, [используя префикс `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers).
+Помните, что собственные проприетарные HTTP-заголовки можно добавлять, [используя префикс `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers).
-Но если у вас есть пользовательские заголовки, которые вы хотите показывать клиенту в браузере, вам нужно добавить их в настройки CORS (подробнее см. в [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md)), используя параметр `expose_headers`, описанный в [документации Starlette по CORS](https://www.starlette.dev/middleware/#corsmiddleware).
+Но если у вас есть пользовательские HTTP-заголовки, которые вы хотите показывать клиенту в браузере, вам нужно добавить их в настройки CORS (подробнее см. в [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md)), используя параметр `expose_headers`, описанный в [документации Starlette по CORS](https://www.starlette.dev/middleware/#corsmiddleware).
diff --git a/docs/ru/docs/advanced/security/oauth2-scopes.md b/docs/ru/docs/advanced/security/oauth2-scopes.md
index 944baeeeb..7b1731c5d 100644
--- a/docs/ru/docs/advanced/security/oauth2-scopes.md
+++ b/docs/ru/docs/advanced/security/oauth2-scopes.md
@@ -46,7 +46,7 @@ OAuth2 со scopes — это механизм, который использу
- `instagram_basic` используется Facebook / Instagram.
- `https://www.googleapis.com/auth/drive` используется Google.
-/// info | Информация
+/// note | Примечание
В OAuth2 «scope» — это просто строка, объявляющая требуемое конкретное разрешение.
@@ -76,7 +76,7 @@ OAuth2 со scopes — это механизм, который использу
Так как теперь мы объявляем эти scopes, они появятся в документации API при входе/авторизации.
-И вы сможете выбрать, какие scopes вы хотите выдать доступ: `me` и `items`.
+И вы сможете выбрать, для каких scopes хотите предоставить доступ: `me` и `items`.
Это тот же механизм, когда вы даёте разрешения при входе через Facebook, Google, GitHub и т.д.:
@@ -100,7 +100,7 @@ OAuth2 со scopes — это механизм, который использу
{* ../../docs_src/security/tutorial005_an_py310.py hl[157] *}
-## Объявление scopes в *обработчиках путей* и зависимостях { #declare-scopes-in-path-operations-and-dependencies }
+## Объявление scopes в *операциях пути* и зависимостях { #declare-scopes-in-path-operations-and-dependencies }
Теперь объявим, что операция пути для `/users/me/items/` требует scope `items`.
@@ -126,7 +126,7 @@ OAuth2 со scopes — это механизм, который использу
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
-/// info | Технические детали
+/// note | Технические детали
`Security` на самом деле является подклассом `Depends` и имеет всего один дополнительный параметр, который мы рассмотрим позже.
diff --git a/docs/ru/docs/advanced/settings.md b/docs/ru/docs/advanced/settings.md
index 3ae063340..b85aa3959 100644
--- a/docs/ru/docs/advanced/settings.md
+++ b/docs/ru/docs/advanced/settings.md
@@ -205,7 +205,7 @@ APP_NAME="ChimichangApp"
### Создание `Settings` только один раз с помощью `lru_cache` { #creating-the-settings-only-once-with-lru-cache }
-Чтение файла с диска обычно затратная (медленная) операция, поэтому, вероятно, вы захотите сделать это один раз и затем переиспользовать один и тот же объект настроек, а не читать файл при каждом запросе.
+Чтение файла с диска обычно затратная (медленная) операция, поэтому, вероятно, вы захотите сделать это один раз и затем переиспользовать один и тот же объект настроек, а не читать файл при каждом HTTP-запросе.
Но каждый раз, когда мы делаем:
@@ -222,13 +222,13 @@ def get_settings():
return Settings()
```
-мы бы создавали этот объект для каждого запроса и читали файл `.env` на каждый запрос. ⚠️
+мы бы создавали этот объект для каждого HTTP-запроса и читали файл `.env` на каждый HTTP-запрос. ⚠️
Но так как мы используем декоратор `@lru_cache` сверху, объект `Settings` будет создан только один раз — при первом вызове. ✔️
{* ../../docs_src/settings/app03_an_py310/main.py hl[1,11] *}
-Затем при любых последующих вызовах `get_settings()` в зависимостях для следующих запросов, вместо выполнения внутреннего кода `get_settings()` и создания нового объекта `Settings`, будет возвращаться тот же объект, что был возвращен при первом вызове, снова и снова.
+Затем при любых последующих вызовах `get_settings()` в зависимостях для следующих HTTP-запросов, вместо выполнения внутреннего кода `get_settings()` и создания нового объекта `Settings`, будет возвращаться тот же объект, что был возвращен при первом вызове, снова и снова.
#### Технические детали `lru_cache` { #lru-cache-technical-details }
@@ -299,4 +299,4 @@ participant execute as Execute function
* Используя зависимость, вы упрощаете тестирование.
* Можно использовать файлы `.env`.
-* `@lru_cache` позволяет не читать файл dotenv снова и снова для каждого запроса, при этом давая возможность переопределять его во время тестирования.
+* `@lru_cache` позволяет не читать файл dotenv снова и снова для каждого HTTP-запроса, при этом давая возможность переопределять его во время тестирования.
diff --git a/docs/ru/docs/advanced/stream-data.md b/docs/ru/docs/advanced/stream-data.md
index 4c373db1a..d6957a6cf 100644
--- a/docs/ru/docs/advanced/stream-data.md
+++ b/docs/ru/docs/advanced/stream-data.md
@@ -2,9 +2,9 @@
Если вам нужно передавать потоковые данные, которые можно представить как JSON, воспользуйтесь [стримингом JSON Lines](../tutorial/stream-json-lines.md).
-Но если вы хотите передавать в потоке чистые бинарные данные или строки, ниже показано, как это сделать.
+Но если вы хотите передавать в потоке **чистые бинарные данные** или строки, ниже показано, как это сделать.
-/// info | Информация
+/// note | Примечание
Добавлено в FastAPI 0.134.0.
@@ -40,7 +40,7 @@ FastAPI будет передавать каждый чанк данных в `S
{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *}
-Это также означает, что с `StreamingResponse` у вас есть и свобода, и ответственность — производить и кодировать байты данных ровно в том виде, в котором они должны быть отправлены, независимо от аннотаций типов. 🤓
+Это также означает, что с `StreamingResponse` у вас есть и **свобода**, и **ответственность** — производить и кодировать байты данных ровно в том виде, в котором они должны быть отправлены, независимо от аннотаций типов. 🤓
### Потоковая передача байтов { #stream-bytes }
@@ -90,7 +90,7 @@ FastAPI будет передавать каждый чанк данных в `S
И во многих случаях чтение таких объектов будет блокирующей операцией (которая может заблокировать цикл событий), потому что данные читаются с диска или из сети.
-/// info | Информация
+/// note | Примечание
Приведённый выше пример — исключение, потому что объект `io.BytesIO` уже находится в памяти, поэтому чтение ничего не блокирует.
diff --git a/docs/ru/docs/advanced/strict-content-type.md b/docs/ru/docs/advanced/strict-content-type.md
index 1a0cbbc31..1d732421c 100644
--- a/docs/ru/docs/advanced/strict-content-type.md
+++ b/docs/ru/docs/advanced/strict-content-type.md
@@ -81,7 +81,7 @@ http://localhost:8000/v1/agents/multivac
С этой настройкой запросы без заголовка `Content-Type` будут иметь тело запроса, обработанное как JSON — это такое же поведение, как в более старых версиях FastAPI.
-/// info | Информация
+/// note | Примечание
Это поведение и настройка были добавлены в FastAPI 0.132.0.
diff --git a/docs/ru/docs/advanced/websockets.md b/docs/ru/docs/advanced/websockets.md
index abfd789a4..0f69f57b3 100644
--- a/docs/ru/docs/advanced/websockets.md
+++ b/docs/ru/docs/advanced/websockets.md
@@ -111,7 +111,7 @@ $ fastapi dev
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
-/// info | Примечание
+/// note | Примечание
В веб-сокете вызывать `HTTPException` не имеет смысла. Вместо этого нужно использовать `WebSocketException`.
diff --git a/docs/ru/docs/advanced/wsgi.md b/docs/ru/docs/advanced/wsgi.md
index 3ed85d0e9..99ba50938 100644
--- a/docs/ru/docs/advanced/wsgi.md
+++ b/docs/ru/docs/advanced/wsgi.md
@@ -6,7 +6,7 @@
## Использование `WSGIMiddleware` { #using-wsgimiddleware }
-/// info | Информация
+/// note | Примечание
Для этого требуется установить `a2wsgi`, например с помощью `pip install a2wsgi`.
@@ -14,7 +14,7 @@
Нужно импортировать `WSGIMiddleware` из `a2wsgi`.
-Затем оберните WSGI‑приложение (например, Flask) в middleware (Промежуточный слой).
+Затем оберните WSGI‑приложение (например, Flask) в middleware (промежуточный слой).
После этого смонтируйте его на путь.
@@ -26,7 +26,7 @@
Вместо него рекомендуется использовать пакет `a2wsgi`. Использование остаётся таким же.
-Просто убедитесь, что пакет `a2wsgi` установлен, и импортируйте `WSGIMiddleware` из `a2wsgi`.
+Просто убедитесь, что пакет `a2wsgi` установлен, и правильно импортируйте `WSGIMiddleware` из `a2wsgi`.
///
diff --git a/docs/ru/docs/alternatives.md b/docs/ru/docs/alternatives.md
index 13f099da8..e1b8e277d 100644
--- a/docs/ru/docs/alternatives.md
+++ b/docs/ru/docs/alternatives.md
@@ -20,7 +20,7 @@
Он относительно тесно связан с реляционными базами данных (например, MySQL или PostgreSQL), поэтому использовать NoSQL-базу данных (например, Couchbase, MongoDB, Cassandra и т. п.) в качестве основного хранилища не очень просто.
-Он был создан для генерации HTML на бэкенде, а не для создания API, используемых современным фронтендом (например, React, Vue.js и Angular) или другими системами (например, устройствами IoT), которые с ним общаются.
+Он был создан для генерации HTML на бэкенде, а не для создания API, используемых современным фронтендом (например, React, Vue.js и Angular) или другими системами (например, устройствами IoT), которые с ним общаются.
### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework }
@@ -88,7 +88,7 @@ Requests имеет очень простой и понятный дизайн,
response = requests.get("http://example.com/some/url")
```
-Соответствующая в FastAPI API-операция пути могла бы выглядеть так:
+Соответствующая в FastAPI API-*операция пути* могла бы выглядеть так:
```Python hl_lines="1"
@app.get("/some/url")
diff --git a/docs/ru/docs/async.md b/docs/ru/docs/async.md
index e2b98bd61..aba77a96b 100644
--- a/docs/ru/docs/async.md
+++ b/docs/ru/docs/async.md
@@ -12,7 +12,7 @@
results = await some_library()
```
-Тогда объявляйте *функции-обработчиков пути* с `async def`, например:
+Тогда объявляйте *функции-обработчики пути* с `async def`, например:
```Python hl_lines="2"
@app.get('/')
@@ -29,7 +29,7 @@ async def read_results():
---
-Если вы используете стороннюю библиотеку, которая взаимодействует с чем-то (база данных, API, файловая система и т.д.) и не поддерживает использование `await` (сейчас это относится к большинству библиотек для БД), тогда объявляйте *функции-обработчиков пути* как обычно, просто с `def`, например:
+Если вы используете стороннюю библиотеку, которая взаимодействует с чем-то (база данных, API, файловая система и т.д.) и не поддерживает использование `await` (сейчас это относится к большинству библиотек для БД), тогда объявляйте *функции-обработчики пути* как обычно, просто с `def`, например:
```Python hl_lines="2"
@app.get('/')
@@ -48,7 +48,7 @@ def results():
---
-**Примечание**: вы можете смешивать `def` и `async def` в *функциях-обработчиков пути* столько, сколько нужно, и объявлять каждую так, как лучше для вашего случая. FastAPI сделает с ними всё как надо.
+**Примечание**: вы можете смешивать `def` и `async def` в *функциях-обработчиках пути* столько, сколько нужно, и объявлять каждую так, как лучше для вашего случая. FastAPI сделает с ними всё как надо.
В любом из случаев выше FastAPI всё равно работает асинхронно и очень быстро.
@@ -249,7 +249,7 @@ def results():
Именно такая асинхронность сделала NodeJS популярным (хотя NodeJS — не параллельный), и это сильная сторона Go как языка программирования.
-Того же уровня производительности вы получаете с **FastAPI**.
+Тот же уровень производительности вы получаете с **FastAPI**.
А так как можно одновременно использовать параллелизм и асинхронность, вы получаете производительность выше, чем у большинства протестированных фреймворков на NodeJS и на уровне Go, который — компилируемый язык, ближе к C [(всё благодаря Starlette)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1).
@@ -340,7 +340,7 @@ burgers = get_burgers(2)
---
-Итак, если вы используете библиотеку, которую можно вызывать с `await`, вам нужно создать *функцию-обработчик пути*, которая её использует, с `async def`, например:
+Итак, если вы используете библиотеку, которую можно вызывать с `await`, вам нужно создать *функции-обработчики пути*, которые её используют, с `async def`, например:
```Python hl_lines="2-3"
@app.get('/burgers')
diff --git a/docs/ru/docs/deployment/cloud.md b/docs/ru/docs/deployment/cloud.md
index cbd517e36..eb1b49aa5 100644
--- a/docs/ru/docs/deployment/cloud.md
+++ b/docs/ru/docs/deployment/cloud.md
@@ -1,6 +1,6 @@
# Развертывание FastAPI у облачных провайдеров { #deploy-fastapi-on-cloud-providers }
-Вы можете использовать практически любого облачного провайдера, чтобы развернуть свое приложение на FastAPI.
+Вы можете использовать практически **любого облачного провайдера**, чтобы развернуть свое приложение на FastAPI.
В большинстве случаев у основных облачных провайдеров есть руководства по развертыванию FastAPI на их платформе.
@@ -16,7 +16,7 @@ FastAPI Cloud — основной спонсор и источник финан
## Облачные провайдеры — спонсоры { #cloud-providers-sponsors }
-Некоторые другие облачные провайдеры ✨ [**спонсируют FastAPI**](../help-fastapi.md#sponsor-the-author) ✨ тоже. 🙇
+Некоторые другие облачные провайдеры ✨ [**спонсируют FastAPI**](https://github.com/sponsors/tiangolo) ✨ тоже. 🙇
Возможно, вы захотите попробовать их сервисы и воспользоваться их руководствами:
diff --git a/docs/ru/docs/deployment/concepts.md b/docs/ru/docs/deployment/concepts.md
index 900b842f9..23c62b8d3 100644
--- a/docs/ru/docs/deployment/concepts.md
+++ b/docs/ru/docs/deployment/concepts.md
@@ -243,7 +243,7 @@
Не беспокойтесь, если некоторые пункты про **контейнеры**, Docker или Kubernetes пока кажутся неочевидными.
-Я расскажу больше про образы контейнеров, Docker, Kubernetes и т.п. в следующей главе: [FastAPI внутри контейнеров — Docker](docker.md).
+Я расскажу больше про образы контейнеров, Docker, Kubernetes и т.п. в одной из будущих глав: [FastAPI внутри контейнеров — Docker](docker.md).
///
@@ -281,7 +281,7 @@
/// tip | Совет
-Я приведу более конкретные примеры с контейнерами в следующей главе: [FastAPI внутри контейнеров — Docker](docker.md).
+Я приведу более конкретные примеры с контейнерами в одной из будущих глав: [FastAPI внутри контейнеров — Docker](docker.md).
///
@@ -301,9 +301,9 @@
Также возможен **всплеск** использования вашего API: он мог «взорваться» по популярности, или какие‑то сервисы/боты начали его активно использовать. На такие случаи стоит иметь запас ресурсов.
-Можно задать **целевое значение**, например **между 50% и 90%** использования ресурсов. Скорее всего, именно эти вещи вы будете измерять и на их основе настраивать развёртывание.
+Можно задать **произвольное число** в качестве цели, например **между 50% и 90%** использования ресурсов. Скорее всего, именно эти вещи вы будете измерять и на их основе настраивать развёртывание.
-Можно использовать простые инструменты вроде `htop`, чтобы смотреть загрузку CPU и RAM на сервере или по процессам. Или более сложные распределённые системы мониторинга.
+Можно использовать простые инструменты вроде `htop`, чтобы смотреть загрузку CPU и RAM на сервере или по процессам. Или более сложные инструменты мониторинга, которые могут быть распределены по серверам и т.п.
## Резюме { #recap }
diff --git a/docs/ru/docs/deployment/docker.md b/docs/ru/docs/deployment/docker.md
index 3b16d7798..c3cf9a328 100644
--- a/docs/ru/docs/deployment/docker.md
+++ b/docs/ru/docs/deployment/docker.md
@@ -132,7 +132,7 @@ Successfully installed fastapi pydantic
-/// info | Информация
+/// note | Заметка
Существуют и другие форматы и инструменты для описания и установки зависимостей.
@@ -275,7 +275,7 @@ CMD fastapi run app/main.py --port 80
#### За прокси-сервером TSL-терминации { #behind-a-tls-termination-proxy }
-Если вы запускаете контейнер за прокси-сервером TSL-терминации (балансировщиком нагрузки), таким как Nginx или Traefik, добавьте опцию `--proxy-headers`. Это сообщит Uvicorn (через FastAPI CLI), что приложение работает за HTTPS и можно доверять соответствующим заголовкам.
+Если вы запускаете контейнер за прокси-сервером TSL-терминации (балансировщиком нагрузки), таким как Nginx или Traefik, добавьте опцию `--proxy-headers`. Это сообщит Uvicorn (через FastAPI CLI), что можно доверять заголовкам, отправленным этим прокси и сообщающим, что приложение работает за HTTPS, и т.д.
```Dockerfile
CMD ["fastapi", "run", "app/main.py", "--proxy-headers", "--port", "80"]
@@ -407,9 +407,9 @@ CMD ["fastapi", "run", "main.py", "--port", "80"]
1. Копируем файл `main.py` напрямую в `/code` (без директории `./app`).
-2. Используем `fastapi run` для запуска приложения из одного файла `main.py`.
+2. Используем `fastapi run`, чтобы «отдавать» приложение из одного файла `main.py`.
-Когда вы передаёте файл в `fastapi run`, он автоматически определит, что это одиночный файл, а не часть пакета, и поймёт, как его импортировать и запустить ваше FastAPI-приложение. 😎
+Когда вы передаёте файл в `fastapi run`, он автоматически определит, что это одиночный файл, а не часть пакета, и поймёт, как импортировать и «отдавать» ваше FastAPI-приложение. 😎
## Концепции развертывания { #deployment-concepts }
@@ -525,7 +525,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
Вы можете развёртывать на **одном сервере** (не кластере) с **Docker Compose**, и у вас не будет простого способа управлять репликацией контейнеров (в Docker Compose), сохраняя общую сеть и **балансировку нагрузки**.
-Тогда вы можете захотеть **один контейнер** с **менеджером процессов**, который запускает **несколько воркеров** внутри.
+Тогда вы можете захотеть **один контейнер** с **менеджером процессов**, который запускает **несколько воркер-процессов** внутри.
---
@@ -556,7 +556,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
Если у вас **несколько контейнеров**, и, вероятно, каждый запускает **один процесс** (например, в кластере **Kubernetes**), то вы, скорее всего, захотите иметь **отдельный контейнер**, выполняющий **предварительные шаги** в одном контейнере и одном процессе **до** запуска реплицированных контейнеров-воркеров.
-/// info | Информация
+/// note | Заметка
Если вы используете Kubernetes, это, вероятно, будет [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/).
@@ -566,7 +566,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
### Один контейнер { #single-container }
-Если у вас простая схема с **одним контейнером**, который затем запускает несколько **воркеров** (или один процесс), можно выполнить подготовительные шаги в этом же контейнере непосредственно перед запуском процесса с приложением.
+Если у вас простая схема с **одним контейнером**, который затем запускает несколько **воркер-процессов** (или один процесс), можно выполнить подготовительные шаги в этом же контейнере непосредственно перед запуском процесса с приложением.
### Базовый Docker-образ { #base-docker-image }
@@ -580,7 +580,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
/// note | Технические подробности
-Этот Docker-образ был создан в то время, когда Uvicorn не умел управлять и перезапускать «упавших» воркеров, и приходилось использовать Gunicorn вместе с Uvicorn, что добавляло заметную сложность, лишь бы Gunicorn управлял и перезапускал воркеров Uvicorn.
+Этот Docker-образ был создан в то время, когда Uvicorn не умел управлять и перезапускать «упавших» воркеров, и приходилось использовать Gunicorn вместе с Uvicorn, что добавляло заметную сложность, лишь бы Gunicorn управлял и перезапускал воркер-процессы Uvicorn.
Но теперь, когда Uvicorn (и команда `fastapi`) поддерживают `--workers`, нет причин использовать базовый Docker-образ вместо сборки своего (кода получается примерно столько же 😅).
@@ -615,4 +615,4 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
В большинстве случаев вы, вероятно, не захотите использовать какой-либо базовый образ, а вместо этого **соберёте образ контейнера с нуля** на основе официального Docker-образа Python.
-Заботясь о **порядке** инструкций в `Dockerfile` и используя **кэш Docker**, вы можете **минимизировать время сборки**, чтобы повысить продуктивность (и не скучать). 😎
+Заботясь о **порядке** инструкций в `Dockerfile` и используя **кэш Docker**, вы можете **минимизировать время сборки**, чтобы повысить продуктивность (и не скучать). 😎
diff --git a/docs/ru/docs/deployment/fastapicloud.md b/docs/ru/docs/deployment/fastapicloud.md
index 95db3387f..fa3160519 100644
--- a/docs/ru/docs/deployment/fastapicloud.md
+++ b/docs/ru/docs/deployment/fastapicloud.md
@@ -1,26 +1,6 @@
# FastAPI Cloud { #fastapi-cloud }
-Вы можете развернуть своё приложение FastAPI в [FastAPI Cloud](https://fastapicloud.com) одной командой, присоединяйтесь к списку ожидания, если ещё не сделали этого. 🚀
-
-## Вход { #login }
-
-Убедитесь, что у вас уже есть аккаунт **FastAPI Cloud** (мы пригласили вас из списка ожидания 😉).
-
-Затем выполните вход:
-
-
+
## **Typer**, FastAPI для CLI { #typer-the-fastapi-of-clis }
@@ -364,11 +364,11 @@ def update_item(item_id: int, item: Item):
* Нажмите кнопку «Try it out», это позволит вам заполнить параметры и напрямую взаимодействовать с API:
-
+
* Затем нажмите кнопку «Execute», интерфейс свяжется с вашим API, отправит параметры, получит результаты и отобразит их на экране:
-
+
### Обновление альтернативной документации API { #alternative-api-docs-upgrade }
@@ -471,7 +471,7 @@ item: Item
...и посмотрите, как ваш редактор кода будет автоматически дополнять атрибуты и знать их типы:
-
+
Более полный пример с дополнительными возможностями см. в Учебник - Руководство пользователя.
@@ -492,9 +492,7 @@ item: Item
### Разверните приложение (опционально) { #deploy-your-app-optional }
-При желании вы можете развернуть своё приложение FastAPI в [FastAPI Cloud](https://fastapicloud.com), присоединяйтесь к списку ожидания, если ещё не сделали этого. 🚀
-
-Если у вас уже есть аккаунт **FastAPI Cloud** (мы пригласили вас из списка ожидания 😉), вы можете развернуть ваше приложение одной командой.
+При желании вы можете развернуть своё приложение FastAPI в [FastAPI Cloud](https://fastapicloud.com) одной командой. 🚀
-## Подключение одного и того же маршрутизатора несколько раз с разными `prefix` { #include-the-same-router-multiple-times-with-different-prefix }
+## Подключение одного и того же роутера несколько раз с разными `prefix` { #include-the-same-router-multiple-times-with-different-prefix }
-Вы можете использовать `.include_router()` несколько раз с *одним и тем же* маршрутизатором, используя разные префиксы.
+Вы можете использовать `.include_router()` несколько раз с *одним и тем же* роутером, используя разные префиксы.
Это может быть полезно, например, чтобы предоставить доступ к одному и тому же API с разными префиксами, например `/api/v1` и `/api/latest`.
Это продвинутое использование, которое вам может и не понадобиться, но оно есть на случай, если понадобится.
-## Подключение `APIRouter` в другой `APIRouter` { #include-an-apirouter-in-another }
+## Подключение `APIRouter` в другой `APIRouter` { #include-an-apirouter-in-another }
Точно так же, как вы можете подключить `APIRouter` к приложению `FastAPI`, вы можете подключить `APIRouter` к другому `APIRouter`, используя:
@@ -532,4 +532,16 @@ $ fastapi dev
router.include_router(other_router)
```
-Убедитесь, что вы сделали это до подключения `router` к приложению `FastAPI`, чтобы *операции пути* из `other_router` также были подключены.
+Вы можете сделать это до или после подключения `router` к приложению `FastAPI`. FastAPI всё равно включит *операции пути* из `other_router` в маршрутизацию и OpenAPI.
+
+То же относится к *операциям пути*, добавленным позже в роутеры. Они также будут видны через более раннее включение.
+
+/// warning | Технические детали
+
+Избегайте прямой мутации `router.routes` после включения роутера. FastAPI рассматривает включение роутера как «живое», поэтому исходный роутер и его маршруты остаются частью маршрутизации и генерации OpenAPI.
+
+Используйте документированные API, такие как декораторы операций пути и `.include_router()`, чтобы добавлять маршруты и роутеры.
+
+Считайте `router.routes` низкоуровневым деревом маршрутов, которое может содержать определения маршрутов и включённые роутеры, и избегайте воспринимать его как плоский список итоговых операций пути.
+
+///
diff --git a/docs/ru/docs/tutorial/body-multiple-params.md b/docs/ru/docs/tutorial/body-multiple-params.md
index ddd9c6fdd..cd9c56012 100644
--- a/docs/ru/docs/tutorial/body-multiple-params.md
+++ b/docs/ru/docs/tutorial/body-multiple-params.md
@@ -108,7 +108,7 @@ q: str | None = None
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info | Информация
+/// note | Заметка
`Body` также имеет все те же дополнительные параметры валидации и метаданных, как у `Query`, `Path` и других, которые вы увидите позже.
@@ -123,7 +123,7 @@ q: str | None = None
Но если вы хотите чтобы он ожидал JSON с ключом `item` с содержимым модели внутри, также как это происходит при объявлении дополнительных body-параметров, вы можете использовать специальный параметр `embed` у типа `Body`:
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
так же, как в этом примере:
diff --git a/docs/ru/docs/tutorial/body-nested-models.md b/docs/ru/docs/tutorial/body-nested-models.md
index fab025dbc..5dc06d28a 100644
--- a/docs/ru/docs/tutorial/body-nested-models.md
+++ b/docs/ru/docs/tutorial/body-nested-models.md
@@ -12,11 +12,12 @@
## Поля-списки с параметром типа { #list-fields-with-type-parameter }
-В Python есть специальный способ объявлять списки с внутренними типами, или «параметрами типа»:
+Но в Python есть специальный способ объявлять списки с внутренними типами, или «параметрами типа»:
### Объявите `list` с параметром типа { #declare-a-list-with-a-type-parameter }
-Для объявления типов, у которых есть параметры типа (внутренние типы), таких как `list`, `dict`, `tuple`, передайте внутренний(ие) тип(ы) как «параметры типа», используя квадратные скобки: `[` и `]`
+Для объявления типов, у которых есть параметры типа (внутренние типы), таких как `list`, `dict`, `tuple`,
+передайте внутренний(ие) тип(ы) как «параметры типа», используя квадратные скобки: `[` и `]`
```Python
my_list: list[str]
@@ -109,7 +110,7 @@ my_list: list[str]
{* ../../docs_src/body_nested_models/tutorial006_py310.py hl[18] *}
-Такая реализация будет ожидать (конвертировать, валидировать, документировать и т.д.) JSON-содержимое в следующем формате:
+Такая реализация будет ожидать (конвертировать, валидировать, документировать и т.д.) JSON-тело запроса в следующем формате:
```JSON hl_lines="11"
{
@@ -135,7 +136,7 @@ my_list: list[str]
}
```
-/// info | Информация
+/// note | Примечание
Заметьте, что теперь у ключа `images` есть список объектов изображений.
@@ -147,15 +148,15 @@ my_list: list[str]
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info | Информация
+/// note | Примечание
Заметьте, что у объекта `Offer` есть список объектов `Item`, которые, в свою очередь, могут содержать необязательный список объектов `Image`
///
-## Тела с чистыми списками элементов { #bodies-of-pure-lists }
+## Тела запросов с чистыми списками элементов { #bodies-of-pure-lists }
-Если верхний уровень значения тела JSON-объекта представляет собой JSON `array` (в Python — `list`), вы можете объявить тип в параметре функции, так же как в моделях Pydantic:
+Если верхний уровень значения JSON-тела запроса представляет собой JSON `array` (в Python — `list`), вы можете объявить тип в параметре функции, так же как в моделях Pydantic:
```Python
images: list[Image]
@@ -211,7 +212,7 @@ images: list[Image]
С помощью **FastAPI** вы получаете максимальную гибкость, предоставляемую моделями Pydantic, сохраняя при этом простоту, краткость и элегантность вашего кода.
-И дополнительно вы получаете:
+Но со всеми преимуществами:
* Поддержку редактора кода (автозавершение доступно везде!)
* Преобразование данных (также известно как парсинг / сериализация)
diff --git a/docs/ru/docs/tutorial/body.md b/docs/ru/docs/tutorial/body.md
index 8a67c8f51..f1b76cba3 100644
--- a/docs/ru/docs/tutorial/body.md
+++ b/docs/ru/docs/tutorial/body.md
@@ -8,7 +8,7 @@
Чтобы объявить тело **запроса**, используйте модели [Pydantic](https://docs.pydantic.dev/), со всей их мощью и преимуществами.
-/// info | Информация
+/// note | Заметка
Чтобы отправить данные, используйте один из методов: `POST` (чаще всего), `PUT`, `DELETE` или `PATCH`.
@@ -70,7 +70,7 @@
* Считает тело запроса как JSON.
* Приведёт данные к соответствующим типам (если потребуется).
* Проведёт валидацию данных.
- * Если данные некорректны, вернёт понятную и наглядную ошибку, указывающую, где именно и что было некорректно.
+ * Если данные некорректны, вернёт понятную и наглядную ошибку, указывающую, где именно and что было некорректно.
* Передаст полученные данные в параметр `item`.
* Поскольку внутри функции вы объявили его с типом `Item`, у вас будет поддержка со стороны редактора кода (автозавершение и т.п.) для всех атрибутов и их типов.
* Сгенерирует определения [JSON Schema](https://json-schema.org) для вашей модели; вы можете использовать их и в других местах, если это имеет смысл для вашего проекта.
diff --git a/docs/ru/docs/tutorial/cookie-param-models.md b/docs/ru/docs/tutorial/cookie-param-models.md
index 9b34cf030..2b9681433 100644
--- a/docs/ru/docs/tutorial/cookie-param-models.md
+++ b/docs/ru/docs/tutorial/cookie-param-models.md
@@ -32,7 +32,7 @@
get операции
+* с использованием операции get
-/// info | Информация о `@decorator`
+/// note | Информация о `@decorator`
Синтаксис `@something` в Python называется «декоратор».
@@ -361,9 +353,9 @@ https://example.com/items/foo
///
-### Шаг 4: определите **функцию операции пути** { #step-4-define-the-path-operation-function }
+### Шаг 4: определите **функцию-обработчик пути** { #step-4-define-the-path-operation-function }
-Вот наша «функция операции пути»:
+Вот наша «**функция-обработчик пути**»:
* **путь**: `/`.
* **операция**: `get`.
@@ -373,7 +365,7 @@ https://example.com/items/foo
Это функция на Python.
-**FastAPI** будет вызывать её каждый раз, когда получает запрос к URL «`/`» с операцией `GET`.
+**FastAPI** будет вызывать её каждый раз, когда получает HTTP-запрос к URL «`/`» с операцией `GET`.
В данном случае это асинхронная (`async`) функция.
@@ -411,7 +403,7 @@ https://example.com/items/foo
Он переносит тот же **опыт разработчика** при создании приложений с FastAPI на их **развертывание** в облаке. 🎉
-FastAPI Cloud — основной спонсор и источник финансирования для open-source проектов «FastAPI и друзья». ✨
+FastAPI Cloud — основной спонсор и источник финансирования для open-source проектов *FastAPI и друзья*. ✨
#### Развертывание у других облачных провайдеров { #deploy-to-other-cloud-providers }
@@ -424,6 +416,6 @@ FastAPI — open-source и основан на стандартах. Вы мож
* Импортируйте `FastAPI`.
* Создайте экземпляр `app`.
* Напишите **декоратор операции пути**, например `@app.get("/")`.
-* Определите **функцию операции пути**; например, `def root(): ...`.
+* Определите **функцию-обработчик пути**; например, `def root(): ...`.
* Запустите сервер разработки командой `fastapi dev`.
* При желании разверните приложение командой `fastapi deploy`.
diff --git a/docs/ru/docs/tutorial/frontend.md b/docs/ru/docs/tutorial/frontend.md
new file mode 100644
index 000000000..3b3e43809
--- /dev/null
+++ b/docs/ru/docs/tutorial/frontend.md
@@ -0,0 +1,133 @@
+# Фронтенд { #frontend }
+
+Вы можете «отдавать» статические фронтенд-приложения с помощью `app.frontend()` (или `router.frontend()`).
+
+Это полезно для фронтенд-инструментов, которые генерируют статические файлы, таких как React с Vite, TanStack Router, Astro, Vue, Svelte, Angular, Solid и других.
+
+С такими инструментами обычно есть этап сборки фронтенда с помощью команды вроде:
+
+```bash
+npm run build
+```
+
+Она сгенерирует директорию вроде `./dist/` с файлами вашего фронтенда.
+
+Вы можете использовать `app.frontend()`, чтобы «отдавать» эту директорию, следуя соглашениям, которые требуются этим фронтенд-фреймворкам.
+
+**FastAPI** сначала проверяет *операции пути*. Файлы фронтенда проверяются только если не совпал ни один обычный маршрут, поэтому ваш API не будет затронут.
+
+## Отдача фронтенда { #serve-a-frontend }
+
+После сборки фронтенда, например с помощью `npm run build`, поместите сгенерированные файлы в директорию, например `dist`.
+
+Структура вашего проекта может выглядеть так:
+
+```text
+.
+├── pyproject.toml
+├── app
+│ ├── __init__.py
+│ └── main.py
+└── dist
+ ├── index.html
+ └── assets
+ └── app.js
+```
+
+Затем «отдавайте» её с помощью `app.frontend()`:
+
+{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
+
+При этом запрос к `/assets/app.js` может отдать `dist/assets/app.js`.
+
+Если у вас также есть *операция пути* **FastAPI**, приоритет будет у *операции пути*.
+
+## Маршрутизация на стороне клиента { #client-side-routing }
+
+Многие фронтенд-приложения, включая **single-page apps** (SPA), используют маршрутизацию на стороне клиента. Путь вроде `/dashboard/settings` может не быть реальным файлом, но фреймворк возьмёт на себя его обработку.
+
+Поэтому, если обратиться к этому URL напрямую (а не перейти к нему через приложение), backend должен отдать фронтенд-приложение из `index.html`, чтобы затем фронтенд-фреймворк мог обработать маршрутизацию на стороне клиента.
+
+Для этого используйте `fallback="index.html"`:
+
+{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *}
+
+**FastAPI** использует этот fallback только для запросов `GET` и `HEAD`, которые похожи на навигацию в браузере. Отсутствующие файлы, такие как JavaScript, CSS и изображения, по-прежнему возвращают `404`.
+
+Запросы с другими методами, например `POST` или `PUT`, к путям, которые совпадают только с fallback фронтенда, также возвращают `404`. Обычные *операции пути* **FastAPI** по-прежнему имеют более высокий приоритет, чем маршруты фронтенда.
+
+/// tip | Совет
+
+По умолчанию `fallback` имеет значение `fallback="auto"`. В большинстве случаев вам не нужно будет указывать `fallback`. Подробности ниже.
+
+///
+
+Именно такое поведение нужно для многих фронтенд-приложений, которые используют маршрутизацию на стороне клиента, например React с TanStack Router, Vue, Angular, SvelteKit или Solid.
+
+## Кастомная страница 404 { #custom-404-page }
+
+Вы также можете отдавать статическую страницу `404.html` для отсутствующих путей фронтенда:
+
+{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *}
+
+Этот HTTP-ответ сохраняет статус-код `404`.
+
+В этом случае **FastAPI** не будет отдавать `index.html` для отсутствующих путей фронтенда. Вместо этого он вернёт файл `404.html`.
+
+/// tip | Совет
+
+По умолчанию `fallback` имеет значение `fallback="auto"`. При этом, если найден файл `404.html`, он будет автоматически использован как fallback.
+
+Поэтому обычно можно не указывать аргумент `fallback`.
+
+///
+
+Это полезно с фронтенд-инструментами, которые генерируют статические HTML-файлы для каждой страницы, например Astro.
+
+## Автоматический fallback { #fallback-auto }
+
+По умолчанию `app.frontend()` использует `fallback="auto"`.
+
+Если в директории фронтенда есть файл `404.html`, отсутствующие пути фронтенда отдают этот файл со статус-кодом `404`.
+
+В противном случае, если есть файл `index.html`, отсутствующие пути навигации в браузере отдают `index.html`, что и ожидают многие фронтенд-приложения с маршрутизацией на стороне клиента.
+
+Поэтому в большинстве случаев можно использовать `app.frontend("/", directory="dist")` без указания аргумента `fallback`.
+
+{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
+
+## Отключение fallback { #disable-fallback }
+
+Если вы не хотите отдавать fallback-файл для отсутствующих путей фронтенда, используйте `fallback=None`:
+
+{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *}
+
+Тогда отсутствующие пути фронтенда будут возвращать обычный `404`.
+
+## Проверка директории { #check-directory }
+
+По умолчанию `app.frontend()` проверяет, что директория существует, при создании приложения.
+
+Это помогает рано обнаруживать ошибки конфигурации. Например, если отсутствует директория с результатом сборки фронтенда, **FastAPI** вызовет ошибку при запуске.
+
+Если ваши фронтенд-файлы создаются позже, например отдельным этапом сборки после создания объекта приложения, установите `check_dir=False`:
+
+{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *}
+
+С `check_dir=False` **FastAPI** не будет проверять директорию при создании приложения. Если настроенная директория всё ещё отсутствует во время обработки HTTP-запроса, **FastAPI** вызовет ошибку тогда.
+
+## Использование с `APIRouter` { #use-it-with-apirouter }
+
+Вы также можете добавить фронтенд-файлы в `APIRouter` и включить его с префиксом:
+
+{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *}
+
+В этом примере пути фронтенда отдаются под `/app`.
+
+Любые обычные *операции пути* в приложении всё равно будут иметь приоритет, включая операции в других роутерах.
+
+## Только статический результат сборки { #static-build-output-only }
+
+`app.frontend()` отдаёт файлы, уже сгенерированные сборкой вашего фронтенда.
+
+Он не запускает server-side rendering. Он предназначен для фронтенд-фреймворков, которые генерируют статические файлы, а не для фреймворков, которым требуется динамический рендеринг на сервере для каждого HTTP-запроса.
diff --git a/docs/ru/docs/tutorial/handling-errors.md b/docs/ru/docs/tutorial/handling-errors.md
index fde188f09..9676ac78b 100644
--- a/docs/ru/docs/tutorial/handling-errors.md
+++ b/docs/ru/docs/tutorial/handling-errors.md
@@ -13,11 +13,11 @@
В таких случаях обычно возвращают **HTTP статус-код** в диапазоне **400** (от 400 до 499).
-Они похожи на двухсотые HTTP статус-коды (от 200 до 299), которые означают, что запрос обработан успешно.
+Они похожи на двухсотые HTTP статус-коды (от 200 до 299). Эти статус-коды "200" означают, что в HTTP-запросе в каком-то смысле был "успех".
-Четырёхсотые статус-коды означают, что ошибка произошла по вине клиента.
+HTTP статус-коды в диапазоне 400 означают, что произошла ошибка со стороны клиента.
-Помните ли ошибки **"404 Not Found "** (и шутки) ?
+Помните все эти ошибки **"404 Not Found"** (и шутки)?
## Использование `HTTPException` { #use-httpexception }
@@ -31,19 +31,19 @@
`HTTPException` - это обычное исключение Python с дополнительными данными, актуальными для API.
-Поскольку это исключение Python, то его не `возвращают`, а `вызывают`.
+Поскольку это исключение Python, то его не `return`, а `raise`.
-Это также означает, что если вы находитесь внутри функции, которая вызывается внутри вашей *функции операции пути*, и вы поднимаете `HTTPException` внутри этой функции, то она не будет выполнять остальной код в *функции операции пути*, а сразу завершит запрос и отправит HTTP-ошибку из `HTTPException` клиенту.
+Это также означает, что если вы находитесь внутри вспомогательной функции, которая вызывается внутри вашей *функции-обработчика пути*, и вы вызываете `HTTPException` изнутри этой вспомогательной функции, то остальной код в *функции-обработчике пути* выполняться не будет, запрос сразу завершится, а HTTP-ошибка из `HTTPException` будет отправлена клиенту.
-О том, насколько выгоднее `вызывать` исключение, чем `возвращать` значение, будет рассказано в разделе, посвященном зависимостям и безопасности.
+Преимущество вызова исключения перед возвратом значения станет более очевидным в разделе о зависимостях и безопасности.
-В данном примере, когда клиент запрашивает элемент по несуществующему ID, возникает исключение со статус-кодом `404`:
+В данном примере, когда клиент запрашивает элемент по несуществующему ID, вызовите исключение со статус-кодом `404`:
{* ../../docs_src/handling_errors/tutorial001_py310.py hl[11] *}
### Возвращаемый ответ { #the-resulting-response }
-Если клиент запросит `http://example.com/items/foo` (`item_id` `"foo"`), то он получит статус-код 200 и ответ в формате JSON:
+Если клиент запросит `http://example.com/items/foo` (`item_id` `"foo"`), то он получит HTTP статус-код 200 и ответ в формате JSON:
```JSON
{
@@ -51,7 +51,7 @@
}
```
-Но если клиент запросит `http://example.com/items/bar` (несуществующий `item_id` `"bar"`), то он получит статус-код 404 (ошибка "не найдено") и JSON-ответ в виде:
+Но если клиент запросит `http://example.com/items/bar` (несуществующий `item_id` `"bar"`), то он получит HTTP статус-код 404 (ошибка "не найдено") и JSON-ответ в виде:
```JSON
{
@@ -69,13 +69,13 @@
///
-## Добавление пользовательских заголовков { #add-custom-headers }
+## Добавление пользовательских HTTP-заголовков { #add-custom-headers }
-В некоторых ситуациях полезно иметь возможность добавлять пользовательские HTTP-заголовки к ошибке HTTP. Например, для некоторых типов безопасности.
+В некоторых ситуациях полезно иметь возможность добавлять пользовательские HTTP-заголовки к HTTP-ошибке. Например, для некоторых типов безопасности.
-Скорее всего, вам не потребуется использовать его непосредственно в коде.
+Скорее всего, вам не потребуется использовать это непосредственно в коде.
-Но в случае, если это необходимо для продвинутого сценария, можно добавить пользовательские заголовки:
+Но в случае, если это необходимо для продвинутого сценария, можно добавить пользовательские HTTP-заголовки:
{* ../../docs_src/handling_errors/tutorial002_py310.py hl[14] *}
@@ -83,7 +83,7 @@
Вы можете добавить пользовательские обработчики исключений с помощью [тех же утилит обработки исключений из Starlette](https://www.starlette.dev/exceptions/).
-Допустим, у вас есть пользовательское исключение `UnicornException`, которое вы (или используемая вами библиотека) можете `вызвать`.
+Допустим, у вас есть пользовательское исключение `UnicornException`, которое вы (или используемая вами библиотека) можете вызвать с помощью `raise`.
И вы хотите обрабатывать это исключение глобально с помощью FastAPI.
@@ -95,7 +95,7 @@
Но оно будет обработано `unicorn_exception_handler`.
-Таким образом, вы получите чистую ошибку с кодом состояния HTTP `418` и содержимым JSON:
+Таким образом, вы получите чистую ошибку с HTTP статус-кодом `418` и содержимым JSON:
```JSON
{"message": "Oops! yolo did something. There goes a rainbow..."}
@@ -113,17 +113,17 @@
**FastAPI** имеет некоторые обработчики исключений по умолчанию.
-Эти обработчики отвечают за возврат стандартных JSON-ответов при `вызове` `HTTPException` и при наличии в запросе недопустимых данных.
+Эти обработчики отвечают за возврат стандартных JSON-ответов при вызове `HTTPException` с помощью `raise` и при наличии в HTTP-запросе недопустимых данных.
Вы можете переопределить эти обработчики исключений на свои собственные.
-### Переопределение обработчика исключений проверки запроса { #override-request-validation-exceptions }
+### Переопределение исключений валидации запроса { #override-request-validation-exceptions }
-Когда запрос содержит недопустимые данные, **FastAPI** внутренне вызывает ошибку `RequestValidationError`.
+Когда HTTP-запрос содержит недопустимые данные, **FastAPI** внутренне вызывает `RequestValidationError`.
-А также включает в себя обработчик исключений по умолчанию.
+А также включает в себя обработчик исключений по умолчанию для него.
-Чтобы переопределить его, импортируйте `RequestValidationError` и используйте его с `@app.exception_handler(RequestValidationError)` для создания обработчика исключений.
+Чтобы переопределить его, импортируйте `RequestValidationError` и используйте его с `@app.exception_handler(RequestValidationError)`, чтобы декорировать обработчик исключений.
Обработчик исключения получит объект `Request` и исключение.
@@ -146,7 +146,7 @@
}
```
-вы получите текстовую версию:
+вы получите текстовую версию с:
```
Validation errors:
@@ -171,7 +171,7 @@ Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to pa
/// warning | Внимание
-Имейте в виду, что `RequestValidationError` содержит информацию об имени файла и строке, где произошла ошибка валидации, чтобы вы могли при желании отобразить её в логах с релевантными данными.
+Имейте в виду, что `RequestValidationError` содержит информацию об имени файла и строке, где происходит ошибка валидации, чтобы вы могли при желании отобразить её в логах вместе с релевантной информацией.
Но это означает, что если вы просто преобразуете её в строку и вернёте эту информацию напрямую, вы можете допустить небольшую утечку информации о своей системе, поэтому здесь код извлекает и показывает каждую ошибку отдельно.
@@ -179,13 +179,13 @@ Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to pa
### Используйте тело `RequestValidationError` { #use-the-requestvalidationerror-body }
-Ошибка `RequestValidationError` содержит полученное `тело` с недопустимыми данными.
+Ошибка `RequestValidationError` содержит `body` (тело запроса), которое она получила с недопустимыми данными.
-Вы можете использовать его при разработке приложения для регистрации тела и его отладки, возврата пользователю и т.д.
+Вы можете использовать его при разработке приложения для логирования тела запроса и его отладки, возврата пользователю и т.д.
{* ../../docs_src/handling_errors/tutorial005_py310.py hl[14] *}
-Теперь попробуйте отправить недействительный элемент, например:
+Теперь попробуйте отправить недопустимый элемент, например:
```JSON
{
@@ -194,7 +194,7 @@ Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to pa
}
```
-Вы получите ответ о том, что данные недействительны, содержащий следующее тело:
+Вы получите ответ о том, что данные недопустимы, содержащий полученное тело запроса:
```JSON hl_lines="12-15"
{
@@ -215,7 +215,7 @@ Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to pa
}
```
-#### `HTTPException` в FastAPI или в Starlette { #fastapis-httpexception-vs-starlettes-httpexception }
+#### `HTTPException` в FastAPI и `HTTPException` в Starlette { #fastapis-httpexception-vs-starlettes-httpexception }
**FastAPI** имеет собственный `HTTPException`.
@@ -227,9 +227,9 @@ Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to pa
Но когда вы регистрируете обработчик исключений, вы должны зарегистрировать его для `HTTPException` от Starlette.
-Таким образом, если какая-либо часть внутреннего кодa Starlette, расширение или плагин Starlette вызовет исключение Starlette `HTTPException`, ваш обработчик сможет перехватить и обработать его.
+Таким образом, если какая-либо часть внутреннего кода Starlette, расширение или плагин Starlette вызовет исключение Starlette `HTTPException`, ваш обработчик сможет перехватить и обработать его.
-В данном примере, чтобы иметь возможность использовать оба `HTTPException` в одном коде, исключения Starlette переименованы в `StarletteHTTPException`:
+В данном примере, чтобы иметь возможность использовать оба `HTTPException` в одном коде, исключение Starlette переименовано в `StarletteHTTPException`:
```Python
from starlette.exceptions import HTTPException as StarletteHTTPException
@@ -241,4 +241,4 @@ from starlette.exceptions import HTTPException as StarletteHTTPException
{* ../../docs_src/handling_errors/tutorial006_py310.py hl[2:5,15,21] *}
-В этом примере вы просто `выводите в терминал` ошибку с очень выразительным сообщением, но идея вам понятна. Вы можете использовать исключение, а затем просто повторно использовать стандартные обработчики исключений.
+В этом примере вы просто выводите ошибку с очень выразительным сообщением, но идея вам понятна. Вы можете использовать исключение, а затем просто повторно использовать стандартные обработчики исключений.
diff --git a/docs/ru/docs/tutorial/index.md b/docs/ru/docs/tutorial/index.md
index eec217b75..b843515f8 100644
--- a/docs/ru/docs/tutorial/index.md
+++ b/docs/ru/docs/tutorial/index.md
@@ -1,5 +1,6 @@
# Учебник - Руководство пользователя { #tutorial-user-guide }
+
В этом руководстве шаг за шагом показано, как использовать **FastAPI** с большинством его функций.
Каждый раздел постепенно основывается на предыдущих, но структура разделяет темы, так что вы можете сразу перейти к нужной теме для решения ваших конкретных задач по API.
diff --git a/docs/ru/docs/tutorial/metadata.md b/docs/ru/docs/tutorial/metadata.md
index 261cc43f5..958c9cbbb 100644
--- a/docs/ru/docs/tutorial/metadata.md
+++ b/docs/ru/docs/tutorial/metadata.md
@@ -11,10 +11,10 @@
| `title` | `str` | Заголовок API. |
| `summary` | `str` | Краткое резюме API. Доступно начиная с OpenAPI 3.1.0, FastAPI 0.99.0. |
| `description` | `str` | Краткое описание API. Может быть использован Markdown. |
-| `version` | `string` | Версия API. Версия вашего собственного приложения, а не OpenAPI. К примеру `2.5.0`. |
-| `terms_of_service` | `str` | Ссылка к условиям пользования API. Если указано, то это должен быть URL-адрес. |
-| `contact` | `dict` | Контактная информация для открытого API. Может содержать несколько полей. contact| Параметр | Тип | Описание |
|---|---|---|
name | str | Идентификационное имя контактного лица/организации. |
url | str | URL указывающий на контактную информацию. ДОЛЖЕН быть в формате URL. |
email | str | Email адрес контактного лица/организации. ДОЛЖЕН быть в формате email адреса. |
license_info| Параметр | Тип | Описание |
|---|---|---|
name | str | ОБЯЗАТЕЛЬНО (если установлен параметр license_info). Название лицензии, используемой для API. |
identifier | str | Выражение лицензии [SPDX](https://spdx.org/licenses/) для API. Поле identifier взаимоисключающее с полем url. Доступно начиная с OpenAPI 3.1.0, FastAPI 0.99.0. |
url | str | URL, указывающий на лицензию, используемую для API. ДОЛЖЕН быть в формате URL. |
contact| Параметр | Тип | Описание |
|---|---|---|
name | str | Идентификационное имя контактного лица/организации. |
url | str | URL, указывающий на контактную информацию. ДОЛЖЕН быть в формате URL. |
email | str | Email-адрес контактного лица/организации. ДОЛЖЕН быть в формате email-адреса. |
license_info| Параметр | Тип | Описание |
|---|---|---|
name | str | ОБЯЗАТЕЛЬНО (если установлен параметр license_info). Название лицензии, используемой для API. |
identifier | str | Выражение лицензии [SPDX](https://spdx.org/licenses/) для API. Поле identifier является взаимоисключающим с полем url. Доступно начиная с OpenAPI 3.1.0, FastAPI 0.99.0. |
url | str | URL, указывающий на лицензию, используемую для API. ДОЛЖЕН быть в формате URL. |
@@ -56,7 +56,7 @@
## Описание из строк документации { #description-from-docstring }
-Так как описания обычно длинные и содержат много строк, вы можете объявить описание *операции пути* в строке документации функции, и **FastAPI** прочитает её оттуда.
+Так как описания обычно длинные и содержат много строк, вы можете объявить описание *операции пути* в строке документации функции, и **FastAPI** прочитает её оттуда.
Вы можете использовать [Markdown](https://en.wikipedia.org/wiki/Markdown) в строке документации, и он будет интерпретирован и отображён корректно (с учетом отступа в строке документации).
@@ -72,13 +72,13 @@
{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[18] *}
-/// info | Дополнительная информация
+/// note | Примечание
Помните, что `response_description` относится конкретно к ответу, а `description` относится к *операции пути* в целом.
///
-/// check | Проверка
+/// tip | Совет
OpenAPI указывает, что каждой *операции пути* необходимо описание ответа.
@@ -94,7 +94,7 @@ OpenAPI указывает, что каждой *операции пути* не
{* ../../docs_src/path_operation_configuration/tutorial006_py310.py hl[16] *}
-Он будет четко помечен как устаревший в интерактивной документации:
+Она будет четко помечена как устаревшая в интерактивной документации:
diff --git a/docs/ru/docs/tutorial/path-params-numeric-validations.md b/docs/ru/docs/tutorial/path-params-numeric-validations.md
index 34eeb80cb..dbbc025f1 100644
--- a/docs/ru/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/ru/docs/tutorial/path-params-numeric-validations.md
@@ -8,7 +8,7 @@
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
-/// info | Информация
+/// note | Примечание
Поддержка `Annotated` была добавлена в FastAPI начиная с версии 0.95.0 (и с этой версии рекомендуется использовать этот подход).
@@ -131,7 +131,7 @@ Python не будет ничего делать с `*`, но он будет з
* `lt`: меньше (`l`ess `t`han)
* `le`: меньше или равно (`l`ess than or `e`qual)
-/// info | Информация
+/// note | Примечание
`Query`, `Path` и другие классы, которые вы разберёте позже, являются наследниками общего класса `Param`.
diff --git a/docs/ru/docs/tutorial/path-params.md b/docs/ru/docs/tutorial/path-params.md
index 79343a158..cfc96189c 100644
--- a/docs/ru/docs/tutorial/path-params.md
+++ b/docs/ru/docs/tutorial/path-params.md
@@ -20,7 +20,7 @@
Здесь, `item_id` объявлен типом `int`.
-/// check | Заметка
+/// tip | Подсказка
Это обеспечит поддержку редактора кода внутри функции (проверка ошибок, автозавершение и т.п.).
@@ -34,7 +34,7 @@
{"item_id":3}
```
-/// check | Заметка
+/// tip | Подсказка
Обратите внимание на значение `3`, которое получила (и вернула) функция. Это целочисленный Python `int`, а не строка `"3"`.
@@ -66,7 +66,7 @@
Та же ошибка возникнет, если вместо `int` передать `float`, например: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
-/// check | Заметка
+/// tip | Подсказка
**FastAPI** обеспечивает валидацию данных, используя всё те же определения типов.
@@ -82,7 +82,7 @@
-/// check | Заметка
+/// tip | Подсказка
Ещё раз, просто используя определения типов, **FastAPI** обеспечивает автоматическую интерактивную документацию (с интеграцией Swagger UI).
diff --git a/docs/ru/docs/tutorial/query-params-str-validations.md b/docs/ru/docs/tutorial/query-params-str-validations.md
index 08a5e11a5..5783b0cdf 100644
--- a/docs/ru/docs/tutorial/query-params-str-validations.md
+++ b/docs/ru/docs/tutorial/query-params-str-validations.md
@@ -29,7 +29,7 @@ FastAPI поймёт, что значение `q` не обязательно,
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | Дополнительная информация
+/// note | Примечание
Поддержка `Annotated` (и рекомендация использовать его) появилась в FastAPI версии 0.95.0.
@@ -80,8 +80,8 @@ q: Annotated[str | None] = None
Теперь FastAPI будет:
* **валидировать** данные, удостоверяясь, что максимальная длина — 50 символов;
-* показывать **понятную ошибку** клиенту, если данные невалидны;
-* **документировать** параметр в *операции пути* схемы OpenAPI (он будет показан в **UI автоматической документации**).
+* отображать **понятную ошибку** клиенту, если данные невалидны;
+* **документировать** параметр в *операции пути* схемы OpenAPI (он будет отображаться в **UI автоматической документации**).
## Альтернатива (устаревшее): `Query` как значение по умолчанию { #alternative-old-query-as-the-default-value }
@@ -119,7 +119,7 @@ q: str | None = None
q: str | None = Query(default=None, max_length=50)
```
-Это провалидирует данные, покажет понятную ошибку, если данные невалидны, и задокументирует параметр в *операции пути* схемы OpenAPI.
+Это провалидирует данные, отобразит понятную ошибку, если данные невалидны, и задокументирует параметр в *операции пути* схемы OpenAPI.
### `Query` как значение по умолчанию или внутри `Annotated` { #query-as-the-default-value-or-in-annotated }
@@ -141,7 +141,7 @@ q: Annotated[str, Query(default="rick")] = "morty"
q: Annotated[str, Query()] = "rick"
```
-...или в старой кодовой базе вы увидите:
+...или в старых кодовых базах вы увидите:
```Python
q: str = Query(default="rick")
@@ -153,19 +153,19 @@ q: str = Query(default="rick")
**Значение по умолчанию** у **параметра функции** — это **настоящее значение по умолчанию**, что более интуитивно для Python. 😌
-Вы можете **вызвать** эту же функцию в **других местах** без FastAPI, и она будет **работать как ожидается**. Если есть **обязательный** параметр (без значения по умолчанию), ваш **редактор** сообщит об ошибке, **Python** тоже пожалуется, если вы запустите её без передачи обязательного параметра.
+Вы можете **вызвать** эту же функцию в **других местах** без FastAPI, и она будет **работать как ожидается**. Если есть **обязательный** параметр (без значения по умолчанию), ваш **редактор кода** сообщит об ошибке, **Python** тоже пожалуется, если вы запустите её без передачи обязательного параметра.
-Если вы не используете `Annotated`, а применяете **(устаревший) стиль со значением по умолчанию**, то при вызове этой функции без FastAPI в **других местах** вам нужно **помнить** о том, что надо передать аргументы, чтобы всё работало корректно, иначе значения будут не такими, как вы ожидаете (например, вместо `str` будет `QueryInfo` или что-то подобное). И ни редактор, ни Python не будут ругаться при самом вызове функции — ошибка проявится лишь при операциях внутри.
+Если вы не используете `Annotated`, а применяете **(устаревший) стиль со значением по умолчанию**, то при вызове этой функции без FastAPI в **других местах** вам нужно **помнить** о том, что надо передать аргументы, чтобы всё работало корректно, иначе значения будут не такими, как вы ожидаете (например, вместо `str` будет `QueryInfo` или что-то подобное). И ни редактор кода, ни Python не будут ругаться при самом вызове функции — ошибка проявится лишь при операциях внутри.
Так как `Annotated` может содержать больше одной аннотации метаданных, теперь вы можете использовать ту же функцию и с другими инструментами, например с [Typer](https://typer.tiangolo.com/). 🚀
-## Больше валидаций { #add-more-validations }
+## Добавим больше валидаций { #add-more-validations }
Можно также добавить параметр `min_length`:
{* ../../docs_src/query_params_str_validations/tutorial003_an_py310.py hl[10] *}
-## Регулярные выражения { #add-regular-expressions }
+## Добавим регулярные выражения { #add-regular-expressions }
Вы можете определить регулярное выражение `pattern`, которому должен соответствовать параметр:
@@ -173,7 +173,7 @@ q: str = Query(default="rick")
Данный шаблон регулярного выражения проверяет, что полученное значение параметра:
-* `^`: начинается с следующих символов, до них нет символов.
+* `^`: начинается со следующих символов, до них нет символов.
* `fixedquery`: имеет точное значение `fixedquery`.
* `$`: заканчивается здесь, после `fixedquery` нет никаких символов.
@@ -191,7 +191,7 @@ q: str = Query(default="rick")
/// note | Примечание
-Наличие значения по умолчанию любого типа, включая `None`, делает параметр необязательным.
+Наличие значения по умолчанию любого типа, включая `None`, делает параметр необязательным (не обязательным).
///
@@ -243,7 +243,7 @@ http://localhost:8000/items/?q=foo&q=bar
вы получите множественные значения *query-параметров* `q` (`foo` и `bar`) в виде Python-`list` внутри вашей *функции-обработчика пути*, в *параметре функции* `q`.
-Таким образом, ответ на этот URL будет:
+Таким образом, HTTP-ответом на этот URL будет:
```JSON
{
@@ -276,7 +276,7 @@ http://localhost:8000/items/?q=foo&q=bar
http://localhost:8000/items/
```
-значение по умолчанию для `q` будет: `["foo", "bar"]`, и ответом будет:
+значение по умолчанию для `q` будет: `["foo", "bar"]`, и вашим HTTP-ответом будет:
```JSON
{
@@ -301,7 +301,7 @@ http://localhost:8000/items/
///
-## Больше метаданных { #declare-more-metadata }
+## Объявление дополнительных метаданных { #declare-more-metadata }
Можно добавить больше информации о параметре.
@@ -369,7 +369,7 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
В таких случаях можно использовать **кастомную функцию-валидатор**, которая применяется после обычной валидации (например, после проверки, что значение — это `str`).
-Этого можно добиться, используя [`AfterValidator` Pydantic](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) внутри `Annotated`.
+Этого можно добиться, используя [Pydantic `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) внутри `Annotated`.
/// tip | Совет
@@ -377,11 +377,11 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
///
-Например, эта кастомная проверка убеждается, что ID элемента начинается с `isbn-` для номера книги ISBN или с `imdb-` для ID URL фильма на IMDB:
+Например, эта кастомная проверка убеждается, что ID элемента начинается с `isbn-` для номера книги ISBN или с `imdb-` для ID URL фильма в IMDB:
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | Дополнительная информация
+/// note | Примечание
Это доступно в Pydantic версии 2 и выше. 😎
@@ -391,7 +391,7 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
Если вам нужна валидация, требующая общения с каким‑либо **внешним компонентом** — базой данных или другим API — вместо этого используйте **Зависимости FastAPI**, вы познакомитесь с ними позже.
-Эти кастомные валидаторы предназначены для проверок, которые можно выполнить, имея **только** те же **данные**, что пришли в запросе.
+Эти кастомные валидаторы предназначены для проверок, которые можно выполнить, имея **только** те же **данные**, что пришли в HTTP-запросе.
///
@@ -429,7 +429,7 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
Вы можете объявлять дополнительные проверки и метаданные для параметров.
-Общие метаданные и настройки:
+Общие проверки и метаданные:
* `alias`
* `title`
diff --git a/docs/ru/docs/tutorial/query-params.md b/docs/ru/docs/tutorial/query-params.md
index 99f2a98ae..65c0c2d9a 100644
--- a/docs/ru/docs/tutorial/query-params.md
+++ b/docs/ru/docs/tutorial/query-params.md
@@ -1,10 +1,10 @@
# Query-параметры { #query-parameters }
-Когда вы объявляете параметры функции, которые не являются параметрами пути, они автоматически интерпретируются как "query"-параметры.
+Когда вы объявляете параметры функции, которые не являются частью path-параметров, они автоматически интерпретируются как "query"-параметры.
{* ../../docs_src/query_params/tutorial001_py310.py hl[9] *}
-Query-параметры представляют из себя набор пар ключ-значение, которые идут после знака `?` в URL-адресе, разделенные символами `&`.
+Query — это набор пар ключ-значение, которые идут после знака `?` в URL-адресе, разделенные символами `&`.
Например, в этом URL-адресе:
@@ -12,25 +12,25 @@ Query-параметры представляют из себя набор па
http://127.0.0.1:8000/items/?skip=0&limit=10
```
-...параметры запроса такие:
+...query-параметры такие:
* `skip`: со значением `0`
* `limit`: со значением `10`
-Будучи частью URL-адреса, они "по умолчанию" являются строками.
+Будучи частью URL-адреса, они "естественным образом" являются строками.
Но когда вы объявляете их с использованием типов Python (в примере выше, как `int`), они конвертируются в указанный тип данных и проходят проверку на соответствие ему.
-Все те же правила, которые применяются к path-параметрам, также применяются и query-параметрам:
+Все те же процессы, которые применяются к path-параметрам, также применяются и к query-параметрам:
* Поддержка от редактора кода (очевидно)
-* "Парсинг" данных
-* Проверка на соответствие данных (Валидация)
+* "Парсинг" данных
+* Валидация данных
* Автоматическая документация
## Значения по умолчанию { #defaults }
-Поскольку query-параметры не являются фиксированной частью пути, они могут быть не обязательными и иметь значения по умолчанию.
+Поскольку query-параметры не являются фиксированной частью пути, они могут быть необязательными и иметь значения по умолчанию.
В примере выше значения по умолчанию равны `skip=0` и `limit=10`.
@@ -40,13 +40,13 @@ http://127.0.0.1:8000/items/?skip=0&limit=10
http://127.0.0.1:8000/items/
```
-будет таким же, как если перейти используя параметры по умолчанию:
+будет таким же, как если перейти по:
```
http://127.0.0.1:8000/items/?skip=0&limit=10
```
-Но если вы введёте, например:
+Но если вы перейдёте, например, по:
```
http://127.0.0.1:8000/items/?skip=20
@@ -55,7 +55,7 @@ http://127.0.0.1:8000/items/?skip=20
Значения параметров в вашей функции будут:
* `skip=20`: потому что вы установили это в URL-адресе
-* `limit=10`: т.к это было значение по умолчанию
+* `limit=10`: потому что это было значение по умолчанию
## Необязательные параметры { #optional-parameters }
@@ -63,21 +63,21 @@ http://127.0.0.1:8000/items/?skip=20
{* ../../docs_src/query_params/tutorial002_py310.py hl[7] *}
-В этом случае, параметр `q` будет не обязательным и будет иметь значение `None` по умолчанию.
+В этом случае параметр функции `q` будет необязательным и будет иметь значение `None` по умолчанию.
-/// check | Важно
+/// tip | Подсказка
-Также обратите внимание, что **FastAPI** достаточно умён чтобы заметить, что параметр `item_id` является path-параметром, а `q` нет, поэтому, это параметр запроса.
+Также обратите внимание, что **FastAPI** достаточно умён, чтобы заметить, что path-параметр `item_id` является path-параметром, а `q` — нет, поэтому это query-параметр.
///
-## Преобразование типа параметра запроса { #query-parameter-type-conversion }
+## Преобразование типа query-параметра { #query-parameter-type-conversion }
-Вы также можете объявлять параметры с типом `bool`, которые будут преобразованы соответственно:
+Вы также можете объявлять типы `bool`, и они будут преобразованы:
{* ../../docs_src/query_params/tutorial003_py310.py hl[7] *}
-В этом случае, если вы сделаете запрос:
+В этом случае, если вы перейдёте по:
```
http://127.0.0.1:8000/items/foo?short=1
@@ -107,11 +107,12 @@ http://127.0.0.1:8000/items/foo?short=on
http://127.0.0.1:8000/items/foo?short=yes
```
-или в любом другом варианте написания (в верхнем регистре, с заглавной буквой, и т.п), внутри вашей функции параметр `short` будет иметь значение `True` типа данных `bool` . В противном случае - `False`.
+или в любом другом варианте написания (в верхнем регистре, с заглавной буквой и т.п.), внутри вашей функции параметр `short` будет иметь значение `True` типа данных `bool`. В противном случае — `False`.
+
-## Смешивание query-параметров и path-параметров { #multiple-path-and-query-parameters }
+## Несколько path-параметров и query-параметров { #multiple-path-and-query-parameters }
-Вы можете объявлять несколько query-параметров и path-параметров одновременно, **FastAPI** сам разберётся, что чем является.
+Вы можете объявлять несколько path-параметров и query-параметров одновременно, **FastAPI** знает, что чем является.
И вы не обязаны объявлять их в каком-либо определенном порядке.
@@ -123,21 +124,21 @@ http://127.0.0.1:8000/items/foo?short=yes
Когда вы объявляете значение по умолчанию для параметра, который не является path-параметром (в этом разделе мы пока что рассмотрели только query-параметры), то он не является обязательным.
-Если вы не хотите задавать конкретное значение, но хотите сделать параметр необязательным, вы можете установить значение по умолчанию равным `None`.
+Если вы не хотите задавать конкретное значение, но хотите просто сделать параметр необязательным, установите значение по умолчанию равным `None`.
Но если вы хотите сделать query-параметр обязательным, вы можете просто не указывать значение по умолчанию:
{* ../../docs_src/query_params/tutorial005_py310.py hl[6:7] *}
-Здесь параметр запроса `needy` является обязательным параметром с типом данных `str`.
+Здесь query-параметр `needy` является обязательным query-параметром с типом данных `str`.
-Если вы откроете в браузере URL-адрес, например:
+Если вы откроете в браузере URL-адрес вроде:
```
http://127.0.0.1:8000/items/foo-item
```
-...без добавления обязательного параметра `needy`, вы увидите подобного рода ошибку:
+...без добавления обязательного параметра `needy`, вы увидите ошибку вроде:
```JSON
{
@@ -170,18 +171,18 @@ http://127.0.0.1:8000/items/foo-item?needy=sooooneedy
}
```
-Конечно, вы можете определить некоторые параметры как обязательные, некоторые — со значением по умолчанию, а некоторые — полностью необязательные:
+И, конечно, вы можете определить некоторые параметры как обязательные, некоторые — со значением по умолчанию, а некоторые — полностью необязательные:
{* ../../docs_src/query_params/tutorial006_py310.py hl[8] *}
-В этом примере, у нас есть 3 параметра запроса:
+В этом случае есть 3 query-параметра:
* `needy`, обязательный `str`.
-* `skip`, типа `int` и со значением по умолчанию `0`.
+* `skip`, `int` со значением по умолчанию `0`.
* `limit`, необязательный `int`.
/// tip | Подсказка
-Вы можете использовать класс `Enum` также, как ранее применяли его с [Path-параметрами](path-params.md#predefined-values).
+Вы можете использовать `Enum` так же, как ранее применяли его с [Path-параметрами](path-params.md#predefined-values).
///
diff --git a/docs/ru/docs/tutorial/request-files.md b/docs/ru/docs/tutorial/request-files.md
index e8500adba..6d40aaac6 100644
--- a/docs/ru/docs/tutorial/request-files.md
+++ b/docs/ru/docs/tutorial/request-files.md
@@ -2,7 +2,7 @@
Используя класс `File`, мы можем позволить клиентам загружать файлы.
-/// info | Дополнительная информация
+/// note | Примечание
Чтобы получать загруженные файлы, сначала установите [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -28,7 +28,7 @@ $ pip install python-multipart
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info | Дополнительная информация
+/// note | Примечание
`File` - это класс, который наследуется непосредственно от `Form`.
@@ -38,13 +38,13 @@ $ pip install python-multipart
/// tip | Подсказка
-Для объявления тела файла необходимо использовать `File`, поскольку в противном случае параметры будут интерпретироваться как параметры запроса или параметры тела (JSON).
+Чтобы объявить файлы в теле запроса, необходимо использовать `File`, поскольку иначе параметры будут интерпретироваться как параметры запроса или body-параметры (JSON).
///
Файлы будут загружены как данные формы.
-Если вы объявите тип параметра у *функции операции пути* как `bytes`, то **FastAPI** прочитает файл за вас, и вы получите его содержимое в виде `bytes`.
+Если вы объявите тип параметра у *функции-обработчика пути* как `bytes`, то **FastAPI** прочитает файл за вас, и вы получите его содержимое в виде `bytes`.
Следует иметь в виду, что все содержимое будет храниться в памяти. Это хорошо подходит для небольших файлов.
@@ -64,15 +64,15 @@ $ pip install python-multipart
* Это означает, что он будет хорошо работать с большими файлами, такими как изображения, видео, большие бинарные файлы и т.д., не потребляя при этом всю память.
* Из загруженного файла можно получить метаданные.
* Он реализует [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) `async` интерфейс.
-* Он предоставляет реальный объект Python [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile), который вы можете передать непосредственно другим библиотекам, которые ожидают файл в качестве объекта.
+* Он предоставляет реальный объект Python [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile), который вы можете передать непосредственно другим библиотекам, которые ожидают file-like объект.
### `UploadFile` { #uploadfile }
`UploadFile` имеет следующие атрибуты:
* `filename`: Строка `str` с исходным именем файла, который был загружен (например, `myimage.jpg`).
-* `content_type`: Строка `str` с типом содержимого (MIME type / media type) (например, `image/jpeg`).
-* `file`: [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) (a [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) объект). Это фактический файл Python, который можно передавать непосредственно другим функциям или библиотекам, ожидающим файл в качестве объекта.
+* `content_type`: Строка `str` с типом содержимого (MIME-тип / тип содержимого) (например, `image/jpeg`).
+* `file`: [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) ([file-like](https://docs.python.org/3/glossary.html#term-file-like-object) объект). Это фактический файл Python, который можно передавать непосредственно другим функциям или библиотекам, ожидающим file-like объект.
`UploadFile` имеет следующие методы `async`. Все они вызывают соответствующие файловые методы (используя внутренний `SpooledTemporaryFile`).
@@ -85,19 +85,18 @@ $ pip install python-multipart
Поскольку все эти методы являются `async` методами, вам следует использовать "await" вместе с ними.
-Например, внутри `async` *функции операции пути* можно получить содержимое с помощью:
+Например, внутри `async` *функции-обработчика пути* можно получить содержимое с помощью:
```Python
contents = await myfile.read()
```
-Если вы находитесь внутри обычной `def` *функции операции пути*, можно получить прямой доступ к файлу `UploadFile.file`, например:
+Если вы находитесь внутри обычной `def` *функции-обработчика пути*, можно получить прямой доступ к файлу `UploadFile.file`, например:
```Python
contents = myfile.file.read()
```
-
/// note | Технические детали `async`
При использовании методов `async` **FastAPI** запускает файловые методы в пуле потоков и ожидает их.
@@ -106,7 +105,7 @@ contents = myfile.file.read()
/// note | Технические детали Starlette
-**FastAPI** наследует `UploadFile` непосредственно из **Starlette**, но добавляет некоторые детали для совместимости с **Pydantic** и другими частями FastAPI.
+`UploadFile` из **FastAPI** наследуется непосредственно от `UploadFile` из **Starlette**, но добавляет некоторые необходимые части для совместимости с **Pydantic** и другими частями FastAPI.
///
@@ -118,17 +117,17 @@ contents = myfile.file.read()
/// note | Технические детали
-Данные из форм обычно кодируются с использованием "media type" `application/x-www-form-urlencoded` когда он не включает файлы.
+Данные из форм обычно кодируются с использованием типа содержимого `application/x-www-form-urlencoded`, когда они не включают файлы.
-Но когда форма включает файлы, она кодируется как `multipart/form-data`. Если вы используете `File`, **FastAPI** будет знать, что ему нужно получить файлы из нужной части тела.
+Но когда форма включает файлы, она кодируется как `multipart/form-data`. Если вы используете `File`, **FastAPI** будет знать, что ему нужно получить файлы из нужной части тела запроса.
-Если вы хотите узнать больше об этих кодировках и полях форм, перейдите по ссылке [MDN web docs for `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
+Если вы хотите узнать больше об этих кодировках и полях форм, перейдите к [веб-документации MDN по `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
///
/// warning | Внимание
-В операции *функции операции пути* можно объявить несколько параметров `File` и `Form`, но нельзя также объявлять поля `Body`, которые предполагается получить в виде JSON, поскольку тело запроса будет закодировано с помощью `multipart/form-data`, а не `application/json`.
+В *операции пути* можно объявить несколько параметров `File` и `Form`, но нельзя также объявлять поля `Body`, которые предполагается получить в виде JSON, поскольку HTTP-запрос будет иметь тело, закодированное с помощью `multipart/form-data`, а не `application/json`.
Это не является ограничением **FastAPI**, это часть протокола HTTP.
@@ -174,4 +173,4 @@ contents = myfile.file.read()
## Резюме { #recap }
-Используйте `File`, `bytes` и `UploadFile` для работы с файлами, которые будут загружаться и передаваться в виде данных формы.
+Используйте `File`, `bytes` и `UploadFile`, чтобы объявлять файлы для загрузки в HTTP-запросе, передаваемые как данные формы.
diff --git a/docs/ru/docs/tutorial/request-form-models.md b/docs/ru/docs/tutorial/request-form-models.md
index c7f37c2ba..3852e3a03 100644
--- a/docs/ru/docs/tutorial/request-form-models.md
+++ b/docs/ru/docs/tutorial/request-form-models.md
@@ -2,7 +2,7 @@
Вы можете использовать **Pydantic-модели** для объявления **полей формы** в FastAPI.
-/// info | Дополнительная информация
+/// note | Заметка
Чтобы использовать формы, сначала установите [`python-multipart`](https://github.com/Kludex/python-multipart).
diff --git a/docs/ru/docs/tutorial/request-forms-and-files.md b/docs/ru/docs/tutorial/request-forms-and-files.md
index f291d5347..347818ae3 100644
--- a/docs/ru/docs/tutorial/request-forms-and-files.md
+++ b/docs/ru/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
Вы можете определять файлы и поля формы одновременно, используя `File` и `Form`.
-/// info | Информация
+/// note | Примечание
Чтобы получать загруженные файлы и/или данные форм, сначала установите [`python-multipart`](https://github.com/Kludex/python-multipart).
diff --git a/docs/ru/docs/tutorial/request-forms.md b/docs/ru/docs/tutorial/request-forms.md
index 3760a8a3b..2067195dd 100644
--- a/docs/ru/docs/tutorial/request-forms.md
+++ b/docs/ru/docs/tutorial/request-forms.md
@@ -1,8 +1,9 @@
# Данные формы { #form-data }
+
Когда вам нужно получить поля формы вместо JSON, вы можете использовать `Form`.
-/// info | Дополнительная информация
+/// note | Примечание
Чтобы использовать формы, сначала установите [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -32,7 +33,7 @@ $ pip install python-multipart
С помощью `Form` вы можете объявить те же настройки, что и с `Body` (и `Query`, `Path`, `Cookie`), включая валидацию, примеры, псевдоним (например, `user-name` вместо `username`) и т.д.
-/// info | Дополнительная информация
+/// note | Примечание
`Form` — это класс, который наследуется непосредственно от `Body`.
diff --git a/docs/ru/docs/tutorial/response-model.md b/docs/ru/docs/tutorial/response-model.md
index 510143d7b..bf0a6fc0a 100644
--- a/docs/ru/docs/tutorial/response-model.md
+++ b/docs/ru/docs/tutorial/response-model.md
@@ -72,11 +72,11 @@ FastAPI будет использовать этот `response_model` для д
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | Информация
+/// note | Примечание
Чтобы использовать `EmailStr`, сначала установите [`email-validator`](https://github.com/JoshData/python-email-validator).
-Убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md), активировали его, а затем установите пакет, например:
+Убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md), активировали его, а затем установили пакет, например:
```console
$ pip install email-validator
@@ -178,7 +178,7 @@ FastAPI делает несколько вещей внутри вместе с
## Другие аннотации возвращаемых типов { #other-return-type-annotations }
-Бывают случаи, когда вы возвращаете что-то, что не является валидным полем Pydantic, и аннотируете это в функции только ради поддержки инструментов (редактор кода, mypy и т.д.).
+Бывают случаи, когда вы возвращаете что-то, что не является валидным полем Pydantic, и аннотируете это в функции только ради поддержки инструментов (редактор коды, mypy и т.д.).
### Возврат Response напрямую { #return-a-response-directly }
@@ -251,7 +251,7 @@ FastAPI делает несколько вещей внутри вместе с
}
```
-/// info | Информация
+/// note | Примечание
Вы также можете использовать:
diff --git a/docs/ru/docs/tutorial/response-status-code.md b/docs/ru/docs/tutorial/response-status-code.md
index f3144a33a..16f83cd61 100644
--- a/docs/ru/docs/tutorial/response-status-code.md
+++ b/docs/ru/docs/tutorial/response-status-code.md
@@ -1,6 +1,6 @@
# Статус-код ответа { #response-status-code }
-Подобно тому, как вы можете задать модель/схему ответа, вы можете объявить HTTP статус-код, используемый для ответа, с помощью параметра `status_code` в любой из *операций пути*:
+Подобно тому, как вы можете задать модель ответа, вы можете объявить HTTP статус-код, используемый для ответа, с помощью параметра `status_code` в любой из *операций пути*:
* `@app.get()`
* `@app.post()`
@@ -18,7 +18,7 @@
Параметр `status_code` принимает число, обозначающее HTTP статус-код.
-/// info | Информация
+/// note | Примечание
В качестве значения параметра `status_code` также может использоваться `IntEnum`, например, из библиотеки [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus) в Python.
@@ -26,8 +26,8 @@
Это позволит:
-* Возвращать указанный код статуса в ответе.
-* Документировать его как код статуса ответа в OpenAPI схеме (а значит, и в пользовательских интерфейсах):
+* Возвращать указанный статус-код в ответе.
+* Документировать его как статус-код ответа в OpenAPI схеме (а значит, и в пользовательских интерфейсах):
@@ -47,26 +47,26 @@ FastAPI знает об этом и создаст документацию Open
///
-В протоколе HTTP числовой код состояния из 3 цифр отправляется как часть ответа.
+В протоколе HTTP числовой статус-код из 3 цифр отправляется как часть ответа.
-У кодов статуса есть названия, чтобы упростить их распознавание, но важны именно числовые значения.
+У статус-кодов есть названия, чтобы упростить их распознавание, но важны именно числовые значения.
Кратко:
-* `100 - 199` – статус-коды информационного типа. Они редко используются разработчиками напрямую. Ответы с этими кодами не могут иметь тела.
+* `100 - 199` – статус-коды информационного типа. Они редко используются разработчиками напрямую. Ответы с этими статус-кодами не могут иметь тела.
* **`200 - 299`** – статус-коды, сообщающие об успешной обработке запроса. Они используются чаще всего.
- * `200` – это код статуса ответа по умолчанию, который означает, что все прошло "OK".
+ * `200` – это статус-код по умолчанию, который означает, что все прошло "OK".
* Другим примером может быть статус `201`, "Created". Он обычно используется после создания новой записи в базе данных.
* Особый случай – `204`, "No Content". Этот статус ответа используется, когда нет содержимого для возврата клиенту, и поэтому ответ не должен иметь тела.
-* **`300 - 399`** – статус-коды, сообщающие о перенаправлениях. Ответы с этими кодами статуса могут иметь или не иметь тело, за исключением ответов со статусом `304`, "Not Modified", у которых не должно быть тела.
+* **`300 - 399`** – статус-коды, сообщающие о перенаправлениях. Ответы с этими статус-кодами могут иметь или не иметь тело, за исключением ответов со статусом `304`, "Not Modified", у которых не должно быть тела.
* **`400 - 499`** – статус-коды, сообщающие о клиентской ошибке. Это ещё одна наиболее часто используемая категория.
* Пример – код `404` для статуса "Not Found".
* Для общих ошибок со стороны клиента можно просто использовать код `400`.
-* `500 - 599` – статус-коды, сообщающие о серверной ошибке. Они почти никогда не используются разработчиками напрямую. Когда что-то идет не так в какой-то части кода вашего приложения или на сервере, он автоматически вернёт один из этих кодов статуса.
+* `500 - 599` – статус-коды, сообщающие о серверной ошибке. Они почти никогда не используются разработчиками напрямую. Когда что-то идет не так в какой-то части кода вашего приложения или на сервере, он автоматически вернёт один из этих статус-кодов.
/// tip | Подсказка
-Чтобы узнать больше о HTTP кодах статуса и о том, для чего каждый из них предназначен, ознакомьтесь с [MDN документацией об HTTP статус-кодах](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status).
+Чтобы узнать больше о HTTP статус-кодах и о том, для чего каждый из них предназначен, ознакомьтесь с [MDN документацией об HTTP статус-кодах](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status).
///
@@ -76,7 +76,7 @@ FastAPI знает об этом и создаст документацию Open
{* ../../docs_src/response_status_code/tutorial001_py310.py hl[6] *}
-`201` – это код статуса "Создано".
+`201` – это статус-код для "Created".
Но вам не обязательно запоминать, что означает каждый из этих кодов.
@@ -84,7 +84,7 @@ FastAPI знает об этом и создаст документацию Open
{* ../../docs_src/response_status_code/tutorial002_py310.py hl[1,6] *}
-Они содержат те же числовые значения, но позволяют использовать автозавершение редактора кода для выбора кода статуса:
+Они существуют только для удобства, содержат те же числовые значения, но позволяют использовать автозавершение редактора кода для выбора статус-кода:
diff --git a/docs/ru/docs/tutorial/schema-extra-example.md b/docs/ru/docs/tutorial/schema-extra-example.md
index ee2f5b991..917e80838 100644
--- a/docs/ru/docs/tutorial/schema-extra-example.md
+++ b/docs/ru/docs/tutorial/schema-extra-example.md
@@ -1,4 +1,4 @@
-# Объявление примеров данных запроса { #declare-request-example-data }
+# Объявление примеров данных HTTP-запроса { #declare-request-example-data }
Вы можете объявлять примеры данных, которые ваше приложение может получать.
@@ -12,7 +12,7 @@
Эта дополнительная информация будет добавлена как есть в выходную **JSON Schema** этой модели и будет использоваться в документации API.
-Вы можете использовать атрибут `model_config`, который принимает `dict`, как описано в [Документация Pydantic: Конфигурация](https://docs.pydantic.dev/latest/api/config/).
+Вы можете использовать атрибут `model_config`, который принимает `dict`, как описано в [документации Pydantic: Конфигурация](https://docs.pydantic.dev/latest/api/config/).
Вы можете задать `"json_schema_extra"` с `dict`, содержащим любые дополнительные данные, которые вы хотите видеть в сгенерированной JSON Schema, включая `examples`.
@@ -24,9 +24,9 @@
///
-/// info | Информация
+/// note | Примечание
-OpenAPI 3.1.0 (используется начиная с FastAPI 0.99.0) добавил поддержку `examples`, который является частью стандарта **JSON Schema**.
+OpenAPI 3.1.0 (используется начиная с FastAPI 0.99.0) добавил поддержку `examples`, которое является частью стандарта **JSON Schema**.
До этого поддерживалось только ключевое слово `example` с одним примером. Оно всё ещё поддерживается в OpenAPI 3.1.0, но помечено как устаревшее и не является частью стандарта JSON Schema. Поэтому рекомендуется мигрировать `example` на `examples`. 🤓
@@ -80,13 +80,13 @@ OpenAPI 3.1.0 (используется начиная с FastAPI 0.99.0) доб
Ещё до того как **JSON Schema** поддержала `examples`, в OpenAPI была поддержка другого поля, также называемого `examples`.
-Эти **специфические для OpenAPI** `examples` находятся в другой секции спецификации OpenAPI. Они находятся в **подробностях для каждой операции пути (обработчика пути)**, а не внутри каждого объекта Schema.
+Эти **специфические для OpenAPI** `examples` находятся в другой секции спецификации OpenAPI. Они находятся в **подробностях каждой *операции пути***, а не внутри каждой JSON Schema.
И Swagger UI уже какое‑то время поддерживает именно это поле `examples`. Поэтому вы можете использовать его, чтобы **отобразить** разные **примеры в UI документации**.
Структура этого специфичного для OpenAPI поля `examples` — это `dict` с **несколькими примерами** (вместо `list`), каждый с дополнительной информацией, которая также будет добавлена в **OpenAPI**.
-Это не помещается внутрь каждого объекта Schema в OpenAPI, это находится снаружи, непосредственно на уровне самой *операции пути*.
+Это не помещается внутрь каждой JSON Schema, содержащейся в OpenAPI, это находится снаружи, непосредственно на уровне самой *операции пути*.
### Использование параметра `openapi_examples` { #using-the-openapi-examples-parameter }
@@ -155,7 +155,7 @@ OpenAPI также добавила поля `example` и `examples` в друг
* `File()`
* `Form()`
-/// info | Информация
+/// note | Примечание
Этот старый специфичный для OpenAPI параметр `examples` теперь называется `openapi_examples`, начиная с FastAPI `0.103.0`.
@@ -171,7 +171,7 @@ OpenAPI также добавила поля `example` и `examples` в друг
Это новое поле `examples` в JSON Schema — это **просто `list`** примеров, а не dict с дополнительными метаданными, как в других местах OpenAPI (описанных выше).
-/// info | Информация
+/// note | Примечание
Даже после того как OpenAPI 3.1.0 была выпущена с этой новой, более простой интеграцией с JSON Schema, какое‑то время Swagger UI, инструмент, предоставляющий автоматическую документацию, не поддерживал OpenAPI 3.1.0 (поддержка появилась начиная с версии 5.0.0 🎉).
diff --git a/docs/ru/docs/tutorial/security/first-steps.md b/docs/ru/docs/tutorial/security/first-steps.md
index c55e832f4..35d63c843 100644
--- a/docs/ru/docs/tutorial/security/first-steps.md
+++ b/docs/ru/docs/tutorial/security/first-steps.md
@@ -24,7 +24,7 @@
## Запуск { #run-it }
-/// info | Дополнительная информация
+/// note | Примечание
Пакет [`python-multipart`](https://github.com/Kludex/python-multipart) автоматически устанавливается вместе с **FastAPI**, если вы запускаете команду `pip install "fastapi[standard]"`.
@@ -60,7 +60,7 @@ $ fastapi dev
-/// check | Кнопка авторизации!
+/// tip | Кнопка авторизации!
У вас уже появилась новая кнопка «Authorize».
@@ -118,7 +118,7 @@ OAuth2 был спроектирован так, чтобы бэкенд или
В этом примере мы будем использовать **OAuth2**, с потоком **Password**, используя токен **Bearer**. Для этого мы используем класс `OAuth2PasswordBearer`.
-/// info | Дополнительная информация
+/// note | Примечание
Токен «bearer» — не единственный вариант.
@@ -148,7 +148,7 @@ OAuth2 был спроектирован так, чтобы бэкенд или
Скоро мы также создадим и саму операцию пути.
-/// info | Дополнительная информация
+/// note | Примечание
Если вы очень строгий «питонист», вам может не понравиться стиль имени параметра `tokenUrl` вместо `token_url`.
@@ -176,7 +176,7 @@ oauth2_scheme(some, parameters)
**FastAPI** будет знать, что может использовать эту зависимость для определения «схемы безопасности» в схеме OpenAPI (и в автоматической документации по API).
-/// info | Технические детали
+/// note | Технические детали
**FastAPI** будет знать, что может использовать класс `OAuth2PasswordBearer` (объявленный в зависимости) для определения схемы безопасности в OpenAPI, потому что он наследуется от `fastapi.security.oauth2.OAuth2`, который, в свою очередь, наследуется от `fastapi.security.base.SecurityBase`.
@@ -186,9 +186,9 @@ oauth2_scheme(some, parameters)
## Что он делает { #what-it-does }
-Он будет искать в запросе заголовок `Authorization`, проверять, что его значение — это `Bearer ` плюс некоторый токен, и вернет токен как `str`.
+Он будет искать в HTTP-запросе HTTP-заголовок `Authorization`, проверять, что его значение — это `Bearer ` плюс некоторый токен, и вернет токен как `str`.
-Если заголовок `Authorization` отсутствует или его значение не содержит токен `Bearer `, он сразу ответит ошибкой со статус-кодом 401 (`UNAUTHORIZED`).
+Если HTTP-заголовок `Authorization` отсутствует или его значение не содержит токен `Bearer `, он сразу ответит ошибкой со статус-кодом 401 (`UNAUTHORIZED`).
Вам даже не нужно проверять наличие токена, чтобы вернуть ошибку. Вы можете быть уверены: если ваша функция была выполнена, в этом токене будет `str`.
diff --git a/docs/ru/docs/tutorial/security/get-current-user.md b/docs/ru/docs/tutorial/security/get-current-user.md
index 8388b672c..8beebc51d 100644
--- a/docs/ru/docs/tutorial/security/get-current-user.md
+++ b/docs/ru/docs/tutorial/security/get-current-user.md
@@ -14,7 +14,7 @@
Точно так же, как мы используем Pydantic для объявления тел запросов, мы можем использовать его где угодно:
-{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
+{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## Создать зависимость `get_current_user` { #create-a-get-current-user-dependency }
@@ -30,7 +30,7 @@
## Получить пользователя { #get-the-user }
-`get_current_user` будет использовать созданную нами (ненастоящую) служебную функцию, которая принимает токен типа `str` и возвращает нашу Pydantic-модель `User`:
+`get_current_user` будет использовать созданную нами (ненастоящую) вспомогательную функцию, которая принимает токен типа `str` и возвращает нашу Pydantic-модель `User`:
{* ../../docs_src/security/tutorial002_an_py310.py hl[19:22,26:27] *}
@@ -52,9 +52,9 @@
///
-/// check | Заметка
+/// tip | Подсказка
-То, как устроена эта система зависимостей, позволяет иметь разные зависимости, которые возвращают модель `User`.
+То, как устроена эта система зависимостей, позволяет иметь разные зависимости (разные "dependables"), которые все возвращают модель `User`.
Мы не ограничены наличием только одной зависимости, которая может возвращать такой тип данных.
@@ -78,7 +78,7 @@
## Размер кода { #code-size }
-Этот пример может показаться многословным. Имейте в виду, что в одном файле мы смешиваем безопасность, модели данных, служебные функции и *операции пути*.
+Этот пример может показаться многословным. Имейте в виду, что в одном файле мы смешиваем безопасность, модели данных, вспомогательные функции и *операции пути*.
Но вот ключевой момент.
diff --git a/docs/ru/docs/tutorial/security/oauth2-jwt.md b/docs/ru/docs/tutorial/security/oauth2-jwt.md
index e3729dfc8..63492e630 100644
--- a/docs/ru/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/ru/docs/tutorial/security/oauth2-jwt.md
@@ -28,7 +28,7 @@ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4
## Установка `PyJWT` { #install-pyjwt }
-Нам необходимо установить `pyjwt` для генерации и проверки JWT-токенов на языке Python.
+Нам необходимо установить `PyJWT` для генерации и проверки JWT-токенов на языке Python.
Убедитесь, что вы создали [виртуальное окружение](../../virtual-environments.md), активируйте его, а затем установите `pyjwt`:
@@ -42,7 +42,7 @@ $ pip install pyjwt
-/// note | Техническая информация
+/// note | Примечание
Обратите внимание на HTTP-заголовок `Authorization`, значение которого начинается с `Bearer `.
diff --git a/docs/ru/docs/tutorial/security/simple-oauth2.md b/docs/ru/docs/tutorial/security/simple-oauth2.md
index 4ef5109e4..5ce89730c 100644
--- a/docs/ru/docs/tutorial/security/simple-oauth2.md
+++ b/docs/ru/docs/tutorial/security/simple-oauth2.md
@@ -14,7 +14,7 @@ OAuth2 определяет, что при использовании "password
А ваши модели баз данных могут использовать любые другие имена.
-Но для логин-операции пути нам нужно использовать именно эти имена, чтобы быть совместимыми со спецификацией (и иметь возможность, например, использовать встроенную систему документации API).
+Но для *операции пути* входа в систему нам нужно использовать именно эти имена, чтобы быть совместимыми со спецификацией (и иметь возможность, например, использовать встроенную систему документации API).
В спецификации также указано, что `username` и `password` должны передаваться в виде данных формы (так что никакого JSON здесь нет).
@@ -32,7 +32,7 @@ OAuth2 определяет, что при использовании "password
* `instagram_basic` используется Facebook / Instagram.
* `https://www.googleapis.com/auth/drive` используется Google.
-/// info | Дополнительная информация
+/// note | Примечание
В OAuth2 "scope" — это просто строка, которая указывает требуемое конкретное разрешение.
Не имеет значения, содержит ли она другие символы, например `:`, или является ли это URL.
@@ -68,7 +68,7 @@ OAuth2 определяет, что при использовании "password
* Необязательное поле `client_id` (в нашем примере оно не нужно).
* Необязательное поле `client_secret` (в нашем примере оно не нужно).
-/// info | Дополнительная информация
+/// note | Примечание
`OAuth2PasswordRequestForm` — это не специальный класс для **FastAPI**, как `OAuth2PasswordBearer`.
`OAuth2PasswordBearer` сообщает **FastAPI**, что это схема безопасности. Поэтому она добавляется в OpenAPI соответствующим образом.
@@ -88,7 +88,7 @@ OAuth2 определяет, что при использовании "password
Теперь получим данные о пользователе из (ненастоящей) базы данных, используя `username` из поля формы.
-Если такого пользователя нет, то мы возвращаем ошибку "Incorrect username or password" (неверное имя пользователя или пароль).
+Если такого пользователя нет, то мы возвращаем ошибку "Incorrect username or password".
Для ошибки используем исключение `HTTPException`:
@@ -136,13 +136,13 @@ UserInDB(
)
```
-/// info | Дополнительная информация
-Более полное объяснение `**user_dict` можно найти в [документации к **Дополнительным моделям**](../extra-models.md#about-user-in-dict).
+/// note | Примечание
+Более полное объяснение `**user_dict` можно найти в [документации к **Дополнительным моделям**](../extra-models.md#about-user-in-model-dump).
///
## Возврат токена { #return-the-token }
-Ответ операции пути `/token` должен быть объектом JSON.
+Ответ эндпоинта `token` должен быть объектом JSON.
В нём должен быть `token_type`. В нашем случае, поскольку мы используем токены типа "Bearer", тип токена должен быть `bearer`.
@@ -151,7 +151,7 @@ UserInDB(
В этом простом примере мы намеренно поступим небезопасно и вернём тот же `username` в качестве токена.
/// tip | Подсказка
-В следующей главе вы увидите реальную защищённую реализацию с хешированием паролей и токенами JWT.
+В следующей главе вы увидите реальную защищённую реализацию с хешированием паролей и токенами JWT.
Но пока давайте сосредоточимся на необходимых нам деталях.
///
@@ -182,7 +182,7 @@ UserInDB(
{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *}
-/// info | Дополнительная информация
+/// note | Примечание
Дополнительный HTTP-заголовок `WWW-Authenticate` со значением `Bearer`, который мы здесь возвращаем, также является частью спецификации.
Любой HTTP статус-код 401 "UNAUTHORIZED" должен также возвращать заголовок `WWW-Authenticate`.
@@ -266,8 +266,8 @@ UserInDB(
Теперь у вас есть инструменты для реализации полноценной системы безопасности на основе `username` и `password` для вашего API.
-Используя эти средства, можно сделать систему безопасности совместимой с любой базой данных и с любой пользовательской или моделью данных.
+Используя эти средства, можно сделать систему безопасности совместимой с любой базой данных и с любой моделью пользователя или моделью данных.
Единственная деталь, которой не хватает, — система пока ещё не "защищена" по-настоящему.
-В следующей главе вы увидите, как использовать библиотеку безопасного хеширования паролей и токены JWT.
+В следующей главе вы увидите, как использовать библиотеку безопасного хеширования паролей и токены JWT.
diff --git a/docs/ru/docs/tutorial/server-sent-events.md b/docs/ru/docs/tutorial/server-sent-events.md
index be6bd2366..ea49f85c8 100644
--- a/docs/ru/docs/tutorial/server-sent-events.md
+++ b/docs/ru/docs/tutorial/server-sent-events.md
@@ -4,7 +4,7 @@
Это похоже на [Стриминг JSON Lines](stream-json-lines.md), но использует формат `text/event-stream`, который нативно поддерживается браузерами через [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource).
-/// info | Информация
+/// note | Примечание
Добавлено в FastAPI 0.135.0.
@@ -29,7 +29,7 @@ SSE часто используют для стриминга ответов И
/// tip | Совет
-Если вам нужно стримить бинарные данные, например видео или аудио, посмотрите расширенное руководство: [Stream Data](../advanced/stream-data.md).
+Если вам нужно стримить бинарные данные, например видео или аудио, посмотрите расширенное руководство: [Потоковая передача данных](../advanced/stream-data.md).
///
@@ -113,7 +113,7 @@ SSE работает с любым HTTP-методом, не только с `GE
FastAPI из коробки реализует некоторые лучшие практики для SSE.
-- Отправлять комментарий «ping» для поддержания соединения («keep alive») каждые 15 секунд, когда нет сообщений, чтобы предотвратить закрытие соединения некоторыми прокси, как рекомендовано в [HTML specification: Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes).
+- Отправлять комментарий «ping» для поддержания соединения («keep alive») каждые 15 секунд, когда нет сообщений, чтобы предотвратить закрытие соединения некоторыми прокси, как рекомендовано в [Спецификация HTML: Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes).
- Устанавливать заголовок `Cache-Control: no-cache`, чтобы предотвратить кэширование потока.
- Устанавливать специальный заголовок `X-Accel-Buffering: no`, чтобы предотвратить буферизацию в некоторых прокси, например Nginx.
diff --git a/docs/ru/docs/tutorial/sql-databases.md b/docs/ru/docs/tutorial/sql-databases.md
index ae8637338..bf2e16fb9 100644
--- a/docs/ru/docs/tutorial/sql-databases.md
+++ b/docs/ru/docs/tutorial/sql-databases.md
@@ -1,6 +1,6 @@
# SQL (реляционные) базы данных { #sql-relational-databases }
-**FastAPI** не требует использовать SQL (реляционную) базу данных. Но вы можете использовать любую базу данных, которую хотите.
+**FastAPI** не требует использовать SQL (реляционную) базу данных. Но вы можете использовать **любую базу данных**, которую хотите.
Здесь мы рассмотрим пример с использованием [SQLModel](https://sqlmodel.tiangolo.com/).
@@ -8,7 +8,7 @@
/// tip | Подсказка
-Вы можете использовать любую другую библиотеку для работы с SQL или NoSQL базами данных (иногда их называют "ORMs"), FastAPI ничего не навязывает. 😎
+Вы можете использовать любую другую библиотеку для работы с SQL или NoSQL базами данных (иногда их называют "ORMs"), FastAPI ничего не навязывает. 😎
///
@@ -119,7 +119,7 @@ $ pip install sqlmodel
Так как каждая модель SQLModel также является моделью Pydantic, вы можете использовать её в тех же **аннотациях типов**, в которых используете модели Pydantic.
-Например, если вы объявите параметр типа `Hero`, он будет прочитан из **JSON body (тела запроса)**.
+Например, если вы объявите параметр типа `Hero`, он будет прочитан из **JSON-тела запроса**.
Аналогично вы можете объявить её как **тип возвращаемого значения** функции, и тогда форма данных отобразится в автоматически сгенерированном UI документации API.
diff --git a/docs/ru/docs/tutorial/static-files.md b/docs/ru/docs/tutorial/static-files.md
index dfcc77b6f..84084ffac 100644
--- a/docs/ru/docs/tutorial/static-files.md
+++ b/docs/ru/docs/tutorial/static-files.md
@@ -2,6 +2,14 @@
Вы можете предоставлять статические файлы автоматически из директории, используя `StaticFiles`.
+/// tip | Совет
+
+Если вам нужно разместить фронтенд, используйте вместо этого `app.frontend()`, подробнее читайте в разделе [Фронтенд](frontend.md).
+
+`app.frontend()` использует `StaticFiles` под капотом, с несколькими дополнительными преимуществами для фронтендов, такими как обработка маршрутизации на стороне клиента.
+
+///
+
## Использование `StaticFiles` { #use-staticfiles }
* Импортируйте `StaticFiles`.
@@ -21,8 +29,7 @@
"Монтирование" означает добавление полноценного "независимого" приложения на определённый путь, которое затем обрабатывает все подпути.
-Это отличается от использования `APIRouter`, так как примонтированное приложение является полностью независимым.
-OpenAPI и документация из вашего главного приложения не будут содержать ничего из примонтированного приложения, и т.д.
+Это отличается от использования `APIRouter`, так как примонтированное приложение является полностью независимым. OpenAPI и документация из вашего главного приложения не будут содержать ничего из примонтированного приложения, и т.д.
Вы можете прочитать больше об этом в [Расширенном руководстве пользователя](../advanced/index.md).
diff --git a/docs/ru/docs/tutorial/stream-json-lines.md b/docs/ru/docs/tutorial/stream-json-lines.md
index d8bb9132b..a9390685e 100644
--- a/docs/ru/docs/tutorial/stream-json-lines.md
+++ b/docs/ru/docs/tutorial/stream-json-lines.md
@@ -2,7 +2,7 @@
У вас может быть последовательность данных, которую вы хотите отправлять в «**потоке**». Это можно сделать с помощью **JSON Lines**.
-/// info | Информация
+/// note | Примечание
Добавлено в FastAPI 0.134.0.
@@ -48,7 +48,7 @@ sequenceDiagram
Это очень похоже на JSON-массив (эквивалент списка Python), но вместо того чтобы быть обернутым в `[]` и иметь `,` между элементами, здесь **один JSON-объект на строку**, они разделены символом новой строки.
-/// info | Информация
+/// note | Примечание
Важный момент в том, что ваше приложение сможет по очереди производить каждую строку, пока клиент потребляет предыдущие строки.
diff --git a/docs/ru/docs/tutorial/testing.md b/docs/ru/docs/tutorial/testing.md
index aef7b86de..d6038a3de 100644
--- a/docs/ru/docs/tutorial/testing.md
+++ b/docs/ru/docs/tutorial/testing.md
@@ -8,7 +8,7 @@
## Использование класса `TestClient` { #using-testclient }
-/// info | Информация
+/// note | Примечание
Для использования класса `TestClient` сначала установите [`httpx`](https://www.python-httpx.org).
@@ -90,7 +90,7 @@ $ pip install httpx
│ └── test_main.py
```
-Так как оба файла находятся в одной директории, для импорта объекта приложения из файла `main` в файл `test_main` Вы можете использовать относительный импорт:
+Так как этот файл находится в том же пакете, для импорта объекта `app` из модуля `main` (`main.py`) Вы можете использовать относительный импорт:
{* ../../docs_src/app_testing/app_a_py310/test_main.py hl[3] *}
@@ -113,7 +113,7 @@ $ pip install httpx
│ └── test_main.py
```
-Предположим, что в файле `main.py` с приложением **FastAPI** есть несколько **операций пути**.
+Предположим, что теперь в файле `main.py` с приложением **FastAPI** есть несколько других **операций пути**.
В нём описана операция `GET`, которая может вернуть ошибку.
@@ -125,26 +125,26 @@ $ pip install httpx
### Расширенный файл тестов { #extended-testing-file }
-Теперь обновим файл `test_main.py`, добавив в него тестов:
+Теперь можно обновить файл `test_main.py`, добавив в него расширенные тесты:
{* ../../docs_src/app_testing/app_b_an_py310/test_main.py *}
-Если Вы не знаете, как передать информацию в запросе, можете воспользоваться поисковиком (погуглить) и задать вопрос: "Как передать информацию в запросе с помощью `httpx`", можно даже спросить: "Как передать информацию в запросе с помощью `requests`", поскольку дизайн HTTPX основан на дизайне Requests.
+Если Вы не знаете, как передать информацию в запросе, можете воспользоваться поиском (Google) и задать вопрос: "Как передать информацию в запросе с помощью `httpx`", можно даже спросить: "Как передать информацию в запросе с помощью `requests`", поскольку дизайн HTTPX основан на дизайне Requests.
Затем Вы просто применяете найденные ответы в тестах.
Например:
-* Передаёте *path*-параметры или *query*-параметры, вписав их непосредственно в строку URL.
+* Чтобы передать *path*-параметр или *query*-параметр, добавьте его непосредственно в URL.
* Передаёте JSON в теле запроса, передав Python-объект (например: `dict`) через именованный параметр `json`.
-* Если же Вам необходимо отправить *форму с данными* вместо JSON, то используйте параметр `data` вместо `json`.
+* Если же Вам необходимо отправить *данные формы* вместо JSON, то используйте параметр `data` вместо `json`.
* Для передачи *HTTP-заголовков*, передайте объект `dict` через параметр `headers`.
* Для передачи *cookies* также передайте `dict`, но через параметр `cookies`.
Для получения дополнительной информации о передаче данных на бэкенд с помощью `httpx` или `TestClient` ознакомьтесь с [документацией HTTPX](https://www.python-httpx.org).
-/// info | Информация
+/// note | Примечание
Обратите внимание, что `TestClient` принимает данные, которые можно конвертировать в JSON, но не модели Pydantic.
diff --git a/docs/ru/docs/virtual-environments.md b/docs/ru/docs/virtual-environments.md
index 119f3645e..b7c750842 100644
--- a/docs/ru/docs/virtual-environments.md
+++ b/docs/ru/docs/virtual-environments.md
@@ -811,7 +811,7 @@ $ cd ~/code/prisoner-of-azkaban
$ python main.py
-// Error importing sirius, it's not installed 😱
+// Ошибка при импорте sirius, он не установлен 😱
Traceback (most recent call last):
File "main.py", line 1, in
-/// note | Bilgi
+/// note | Not
Harika çizimler: [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨
@@ -205,7 +205,7 @@ Sadece yiyorsunuz ve iş bitiyor. ⏹
Vaktin çoğu tezgâhın önünde 🕙 beklemekle geçtiğinden, pek konuşma ya da flört olmadı. 😞
-/// note | Bilgi
+/// note | Not
Harika çizimler: [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨
@@ -239,9 +239,9 @@ Muhtemelen, bankada 🏦 işlerini hallederken aşkını 😍 yanında götürme
Bu, çoğu web uygulaması için de geçerlidir.
-Çok fazla kullanıcı vardır; ancak sunucunuz, iyi olmayan bağlantılarından gelen istekleri 🕙 bekler.
+Çok fazla kullanıcı vardır; ancak sunucunuz, onların pek iyi olmayan bağlantıları üzerinden request'lerin gelmesini 🕙 bekler.
-Ve sonra yanıtların geri gelmesini yine 🕙 bekler.
+Ardından response'ların geri gelmesini yine 🕙 bekler.
Bu "beklemeler" 🕙 mikrosaniyelerle ölçülür; ama hepsi toplandığında sonuçta oldukça fazla bekleme olur.
diff --git a/docs/tr/docs/deployment/cloud.md b/docs/tr/docs/deployment/cloud.md
index b263ecc57..92a631734 100644
--- a/docs/tr/docs/deployment/cloud.md
+++ b/docs/tr/docs/deployment/cloud.md
@@ -16,7 +16,7 @@ FastAPI Cloud, *FastAPI and friends* açık kaynak projelerinin birincil sponsor
## Bulut Sağlayıcılar - Sponsorlar { #cloud-providers-sponsors }
-Diğer bazı bulut sağlayıcılar da ✨ [**FastAPI'ye sponsor olur**](../help-fastapi.md#sponsor-the-author) ✨. 🙇
+Diğer bazı bulut sağlayıcılar da ✨ [**FastAPI'ye sponsor olur**](https://github.com/sponsors/tiangolo) ✨. 🙇
Kılavuzlarını takip etmek ve servislerini denemek için onları da değerlendirmek isteyebilirsiniz:
diff --git a/docs/tr/docs/deployment/concepts.md b/docs/tr/docs/deployment/concepts.md
index 211e2ab51..ee62ef647 100644
--- a/docs/tr/docs/deployment/concepts.md
+++ b/docs/tr/docs/deployment/concepts.md
@@ -1,5 +1,6 @@
# Deployment Kavramları { #deployments-concepts }
+
Bir **FastAPI** uygulamasını (hatta genel olarak herhangi bir web API'yi) deploy ederken, muhtemelen önemseyeceğiniz bazı kavramlar vardır. Bu kavramları kullanarak, **uygulamanızı deploy etmek** için **en uygun** yöntemi bulabilirsiniz.
Önemli kavramlardan bazıları şunlardır:
diff --git a/docs/tr/docs/deployment/docker.md b/docs/tr/docs/deployment/docker.md
index 0b2da213c..aebde767b 100644
--- a/docs/tr/docs/deployment/docker.md
+++ b/docs/tr/docs/deployment/docker.md
@@ -26,7 +26,7 @@ COPY ./app /code/app
CMD ["fastapi", "run", "app/main.py", "--port", "80"]
-# If running behind a proxy like Nginx or Traefik add --proxy-headers
+# Nginx veya Traefik gibi bir proxy arkasında çalıştırıyorsanız --proxy-headers ekleyin
# CMD ["fastapi", "run", "app/main.py", "--port", "80", "--proxy-headers"]
```
@@ -132,7 +132,7 @@ Successfully installed fastapi pydantic
-/// info | Bilgi
+/// note | Not
Paket bağımlılıklarını tanımlamak ve yüklemek için başka formatlar ve araçlar da vardır.
@@ -243,14 +243,14 @@ Aşağıda açıklandığı gibi `CMD` talimatının **her zaman** **exec form**
✅ **Exec** form:
```Dockerfile
-# ✅ Do this
+# ✅ Bunu yapın
CMD ["fastapi", "run", "app/main.py", "--port", "80"]
```
⛔️ **Shell** form:
```Dockerfile
-# ⛔️ Don't do this
+# ⛔️ Bunu yapmayın
CMD fastapi run app/main.py --port 80
```
@@ -556,7 +556,7 @@ Container kullanıyorsanız (örn. Docker, Kubernetes), temelde iki yaklaşım v
**Birden fazla container**'ınız varsa ve muhtemelen her biri **tek process** çalıştırıyorsa (ör. bir **Kubernetes** cluster'ında), replication yapılan worker container'lar çalışmadan **önce**, **başlatmadan önceki adımlar**ın işini yapan **ayrı bir container** kullanmak isteyebilirsiniz (tek container, tek process).
-/// info | Bilgi
+/// note | Not
Kubernetes kullanıyorsanız, bu muhtemelen bir [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/) olur.
diff --git a/docs/tr/docs/deployment/fastapicloud.md b/docs/tr/docs/deployment/fastapicloud.md
index 890e31915..eecf25d66 100644
--- a/docs/tr/docs/deployment/fastapicloud.md
+++ b/docs/tr/docs/deployment/fastapicloud.md
@@ -1,26 +1,6 @@
# FastAPI Cloud { #fastapi-cloud }
-FastAPI uygulamanızı [FastAPI Cloud](https://fastapicloud.com)'a **tek bir komutla** deploy edebilirsiniz. Henüz yapmadıysanız gidip bekleme listesine katılın. 🚀
-
-## Giriş Yapma { #login }
-
-Önceden bir **FastAPI Cloud** hesabınız olduğundan emin olun (sizi bekleme listesinden davet ettik 😉).
-
-Ardından giriş yapın:
-
-
get operation kullanarak
-/// info | `@decorator` Bilgisi
+/// note | `@decorator` Bilgisi
Python'daki `@something` söz dizimi "decorator" olarak adlandırılır.
diff --git a/docs/tr/docs/tutorial/frontend.md b/docs/tr/docs/tutorial/frontend.md
new file mode 100644
index 000000000..7918ca593
--- /dev/null
+++ b/docs/tr/docs/tutorial/frontend.md
@@ -0,0 +1,133 @@
+# Frontend { #frontend }
+
+Statik frontend uygulamalarını `app.frontend()` (veya `router.frontend()`) ile sunabilirsiniz.
+
+Bu, Vite ile React, TanStack Router, Astro, Vue, Svelte, Angular, Solid ve benzeri statik dosyalar üreten frontend araçları için kullanışlıdır.
+
+Bu araçlarda genellikle frontend'i build eden bir adım olur, örneğin şöyle bir komutla:
+
+```bash
+npm run build
+```
+
+Bu komut, frontend dosyalarınızla birlikte `./dist/` gibi bir dizin oluşturur.
+
+Bu dizini, frontend framework'lerinin ihtiyaç duyduğu kurallara uygun şekilde sunmak için `app.frontend()` kullanabilirsiniz.
+
+**FastAPI** önce *path operation*'ları kontrol eder. Frontend dosyaları yalnızca hiçbir normal route eşleşmezse kontrol edilir, bu yüzden API'niz bundan etkilenmez.
+
+## Frontend Sunma { #serve-a-frontend }
+
+Frontend'inizi build ettikten sonra, örneğin `npm run build` ile, oluşturulan dosyaları bir dizine koyun; örneğin `dist`.
+
+Proje yapınız şöyle görünebilir:
+
+```text
+.
+├── pyproject.toml
+├── app
+│ ├── __init__.py
+│ └── main.py
+└── dist
+ ├── index.html
+ └── assets
+ └── app.js
+```
+
+Ardından bunu `app.frontend()` ile sunun:
+
+{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
+
+Böylece `/assets/app.js` için gelen bir request, `dist/assets/app.js` dosyasını sunabilir.
+
+Aynı zamanda bir **FastAPI** *path operation*'ınız varsa, öncelik *path operation*'dadır.
+
+## Client-Side Routing { #client-side-routing }
+
+**Single-page app**'ler (SPA'ler) dahil birçok frontend uygulaması client-side routing kullanır. `/dashboard/settings` gibi bir path gerçek bir dosya olmayabilir; bunu frontend framework'ü ele alır.
+
+Bu yüzden, o URL'ye doğrudan erişildiğinde (uygulama içinde gezinmek yerine), backend frontend uygulamasını `index.html` üzerinden sunmalıdır. Böylece frontend framework'ü client-side routing'i işleyebilir.
+
+Bunun için `fallback="index.html"` kullanın:
+
+{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *}
+
+**FastAPI** bu fallback'i yalnızca tarayıcı gezinmesi gibi görünen `GET` ve `HEAD` request'leri için kullanır. JavaScript, CSS ve görseller gibi eksik dosyalar yine `404` döndürür.
+
+`POST` veya `PUT` gibi diğer metotlarla, yalnızca frontend fallback'i ile eşleşen path'lere yapılan request'ler de `404` döndürür. Normal **FastAPI** *path operation*'ları frontend route'larından yine daha yüksek önceliğe sahiptir.
+
+/// tip | İpucu
+
+Varsayılan olarak `fallback`, `fallback="auto"` değerine sahiptir. Çoğu durumda `fallback` belirtmeniz gerekmez. Detaylar için aşağıyı okuyun.
+
+///
+
+Client-side routing kullanan birçok frontend uygulamasında istediğiniz davranış budur; örneğin TanStack Router ile React, Vue, Angular, SvelteKit veya Solid.
+
+## Özel 404 Sayfası { #custom-404-page }
+
+Bulunamayan frontend path'leri için statik bir `404.html` sayfası da sunabilirsiniz:
+
+{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *}
+
+Bu response, `404` status code'unu korur.
+
+Bu durumda **FastAPI**, bulunamayan frontend path'leri için `index.html` sunmaz. Bunun yerine `404.html` dosyasını döndürür.
+
+/// tip | İpucu
+
+Varsayılan olarak `fallback`, `fallback="auto"` değerine sahiptir. Bu durumda bir `404.html` dosyası bulunursa, otomatik olarak fallback olarak kullanılır.
+
+Bu yüzden normalde `fallback` argümanını atlayabilirsiniz.
+
+///
+
+Bu, Astro gibi her sayfa için statik HTML dosyaları üreten frontend araçlarıyla kullanışlıdır.
+
+## Otomatik Fallback { #fallback-auto }
+
+Varsayılan olarak `app.frontend()`, `fallback="auto"` kullanır.
+
+Frontend dizininde bir `404.html` dosyası varsa, bulunamayan frontend path'leri bu dosyayı `404` status code'u ile sunar.
+
+Aksi halde bir `index.html` dosyası varsa, bulunamayan tarayıcı gezinme path'leri `index.html` sunar. Client-side routing kullanan birçok frontend uygulamasının beklediği davranış budur.
+
+Bu yüzden çoğu durumda `fallback` argümanını belirtmeden `app.frontend("/", directory="dist")` kullanabilirsiniz.
+
+{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
+
+## Fallback'i Devre Dışı Bırakma { #disable-fallback }
+
+Bulunamayan frontend path'leri için fallback dosyası sunmak istemiyorsanız `fallback=None` kullanın:
+
+{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *}
+
+Bundan sonra bulunamayan frontend path'leri normal `404` döndürür.
+
+## Dizini Kontrol Etme { #check-directory }
+
+Varsayılan olarak `app.frontend()`, uygulama oluşturulduğunda dizinin var olduğunu kontrol eder.
+
+Bu, yapılandırma hatalarını erken yakalamaya yardımcı olur. Örneğin frontend build çıktısı dizini yoksa, **FastAPI** başlangıçta hata verir.
+
+Frontend dosyalarınız daha sonra oluşturuluyorsa, örneğin app nesnesi oluşturulduktan sonra ayrı bir build adımıyla, `check_dir=False` ayarlayın:
+
+{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *}
+
+`check_dir=False` ile **FastAPI**, app oluşturulduğunda dizini kontrol etmez. Yapılandırılan dizin bir request işlendiği sırada hâlâ yoksa, **FastAPI** o zaman hata verir.
+
+## `APIRouter` ile Kullanma { #use-it-with-apirouter }
+
+Frontend dosyalarını bir `APIRouter`'a da ekleyebilir ve bunu bir prefix ile dahil edebilirsiniz:
+
+{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *}
+
+Bu örnekte frontend path'leri `/app` altında sunulur.
+
+Uygulamadaki herhangi bir normal *path operation*, diğer router'larda olanlar dahil, yine öncelikli olur.
+
+## Yalnızca Statik Build Çıktısı { #static-build-output-only }
+
+`app.frontend()`, frontend build'iniz tarafından önceden oluşturulmuş dosyaları sunar.
+
+Server-side rendering çalıştırmaz. Her request için server'da dinamik rendering gerektiren framework'ler için değil, statik dosyalar üreten frontend framework'leri içindir.
diff --git a/docs/tr/docs/tutorial/handling-errors.md b/docs/tr/docs/tutorial/handling-errors.md
index b90e186a6..0339bde14 100644
--- a/docs/tr/docs/tutorial/handling-errors.md
+++ b/docs/tr/docs/tutorial/handling-errors.md
@@ -93,7 +93,7 @@ Ve bu exception’ı FastAPI ile global olarak handle etmek istiyorsunuz.
Burada `/unicorns/yolo` için request atarsanız, *path operation* bir `UnicornException` `raise` eder.
-Namun bu, `unicorn_exception_handler` tarafından handle edilir.
+Ancak bu, `unicorn_exception_handler` tarafından handle edilir.
Böylece HTTP status code’u `418` olan, JSON içeriği şu şekilde temiz bir hata response’u alırsınız:
diff --git a/docs/tr/docs/tutorial/index.md b/docs/tr/docs/tutorial/index.md
index 5dacd280a..e30f3bfbb 100644
--- a/docs/tr/docs/tutorial/index.md
+++ b/docs/tr/docs/tutorial/index.md
@@ -76,11 +76,11 @@ $ pip install "fastapi[standard]"
/// note | Not
-`pip install "fastapi[standard]"` ile kurduğunuzda, bazı varsayılan opsiyonel standard bağımlılıklarla birlikte gelir. Bunlara `fastapi-cloud-cli` da dahildir; bu sayede [FastAPI Cloud](https://fastapicloud.com)'a deploy edebilirsiniz.
+`pip install "fastapi[standard]"` ile kurduğunuzda, bazı varsayılan opsiyonel standart bağımlılıklarla birlikte gelir. Bunlara `fastapi-cloud-cli` da dahildir; bu sayede [FastAPI Cloud](https://fastapicloud.com)'a deploy edebilirsiniz.
Bu opsiyonel bağımlılıkları istemiyorsanız bunun yerine `pip install fastapi` kurabilirsiniz.
-Standard bağımlılıkları kurmak istiyor ama `fastapi-cloud-cli` olmasın diyorsanız, `pip install "fastapi[standard-no-fastapi-cloud-cli]"` ile kurabilirsiniz.
+Standart bağımlılıkları kurmak istiyor ama `fastapi-cloud-cli` olmasın diyorsanız, `pip install "fastapi[standard-no-fastapi-cloud-cli]"` ile kurabilirsiniz.
///
diff --git a/docs/tr/docs/tutorial/metadata.md b/docs/tr/docs/tutorial/metadata.md
index a8d44570f..8b97505e4 100644
--- a/docs/tr/docs/tutorial/metadata.md
+++ b/docs/tr/docs/tutorial/metadata.md
@@ -11,7 +11,7 @@ OpenAPI spesifikasyonunda ve otomatik API doküman arayüzlerinde kullanılan ş
| `title` | `str` | API'nin başlığı. |
| `summary` | `str` | API'nin kısa özeti. OpenAPI 3.1.0, FastAPI 0.99.0 sürümünden itibaren mevcut. |
| `description` | `str` | API'nin kısa açıklaması. Markdown kullanabilir. |
-| `version` | `string` | API'nin sürümü. Bu, OpenAPI'nin değil, kendi uygulamanızın sürümüdür. Örneğin `2.5.0`. |
+| `version` | `str` | API'nin sürümü. Bu, OpenAPI'nin değil, kendi uygulamanızın sürümüdür. Örneğin `2.5.0`. |
| `terms_of_service` | `str` | API'nin Kullanım Koşulları (Terms of Service) için bir URL. Verilirse, URL formatında olmalıdır. |
| `contact` | `dict` | Yayınlanan API için iletişim bilgileri. Birden fazla alan içerebilir. contact alanları| Parametre | Tip | Açıklama |
|---|---|---|
name | str | İletişim kişisi/kuruluşunu tanımlayan ad. |
url | str | İletişim bilgilerine işaret eden URL. URL formatında OLMALIDIR. |
email | str | İletişim kişisi/kuruluşunun e-posta adresi. E-posta adresi formatında OLMALIDIR. |
license_info alanları| Parametre | Tip | Açıklama |
|---|---|---|
name | str | ZORUNLU (license_info ayarlanmışsa). API için kullanılan lisans adı. |
identifier | str | API için bir [SPDX](https://spdx.org/licenses/) lisans ifadesi. identifier alanı, url alanıyla karşılıklı olarak dışlayıcıdır (ikisi aynı anda kullanılamaz). OpenAPI 3.1.0, FastAPI 0.99.0 sürümünden itibaren mevcut. |
url | str | API için kullanılan lisansa ait URL. URL formatında OLMALIDIR. |
-## Response description { #response-description }
+## Response Açıklaması { #response-description }
`response_description` parametresi ile response açıklamasını belirtebilirsiniz:
{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[18] *}
-/// info | Bilgi
+/// note | Not
`response_description` özellikle response’u ifade eder; `description` ise genel olarak *path operation*’ı ifade eder.
///
-/// check | Ek bilgi
+/// tip | İpucu
OpenAPI, her *path operation* için bir response description zorunlu kılar.
diff --git a/docs/tr/docs/tutorial/path-params-numeric-validations.md b/docs/tr/docs/tutorial/path-params-numeric-validations.md
index 43da894bb..1e6121f99 100644
--- a/docs/tr/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/tr/docs/tutorial/path-params-numeric-validations.md
@@ -8,7 +8,7 @@
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
-/// info | Bilgi
+/// note | Not
FastAPI, 0.95.0 sürümünde `Annotated` desteğini ekledi (ve bunu önermeye başladı).
@@ -56,7 +56,7 @@ Dolayısıyla fonksiyonunuzu şöyle tanımlayabilirsiniz:
{* ../../docs_src/path_params_numeric_validations/tutorial002_py310.py hl[7] *}
-Namun şunu unutmayın: `Annotated` kullanırsanız bu problem olmaz; çünkü `Query()` veya `Path()` için fonksiyon parametresi default değerlerini kullanmıyorsunuz.
+Ancak şunu unutmayın: `Annotated` kullanırsanız bu problem olmaz; çünkü `Query()` veya `Path()` için fonksiyon parametresi default değerlerini kullanmıyorsunuz.
{* ../../docs_src/path_params_numeric_validations/tutorial002_an_py310.py *}
@@ -131,7 +131,7 @@ Ayrıca sayısal doğrulamalar da tanımlayabilirsiniz:
* `lt`: `l`ess `t`han
* `le`: `l`ess than or `e`qual
-/// info | Bilgi
+/// note | Not
`Query`, `Path` ve ileride göreceğiniz diğer class'lar ortak bir `Param` class'ının alt class'larıdır.
diff --git a/docs/tr/docs/tutorial/path-params.md b/docs/tr/docs/tutorial/path-params.md
index c29d8567e..d1a9b6fca 100644
--- a/docs/tr/docs/tutorial/path-params.md
+++ b/docs/tr/docs/tutorial/path-params.md
@@ -20,7 +20,7 @@ Standart Python tip belirteçlerini kullanarak path parametresinin tipini fonksi
Bu durumda, `item_id` bir `int` olarak tanımlanır.
-/// check | Ek bilgi
+/// tip | İpucu
Bu sayede, fonksiyon içinde hata denetimi, kod tamamlama vb. konularda editör desteğine kavuşursunuz.
@@ -34,7 +34,7 @@ Bu örneği çalıştırıp tarayıcınızda [http://127.0.0.1:8000/items/3](htt
{"item_id":3}
```
-/// check | Ek bilgi
+/// tip | İpucu
Dikkat edin: fonksiyonunuzun aldığı (ve döndürdüğü) değer olan `3`, string `"3"` değil, bir Python `int`'idir.
@@ -66,7 +66,7 @@ Ancak tarayıcınızda [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/i
Aynı hata, şu örnekte olduğu gibi `int` yerine `float` verirseniz de ortaya çıkar: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
-/// check | Ek bilgi
+/// tip | İpucu
Yani, aynı Python tip tanımıyla birlikte **FastAPI** size veri doğrulama sağlar.
@@ -82,7 +82,7 @@ Tarayıcınızı [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) adresi
-/// check | Ek bilgi
+/// tip | İpucu
Yine, sadece aynı Python tip tanımıyla **FastAPI** size otomatik ve interaktif dokümantasyon (Swagger UI entegrasyonuyla) sağlar.
diff --git a/docs/tr/docs/tutorial/query-params-str-validations.md b/docs/tr/docs/tutorial/query-params-str-validations.md
index 7012cca20..831cfcb1d 100644
--- a/docs/tr/docs/tutorial/query-params-str-validations.md
+++ b/docs/tr/docs/tutorial/query-params-str-validations.md
@@ -1,5 +1,6 @@
# Query Parametreleri ve String Doğrulamaları { #query-parameters-and-string-validations }
+
**FastAPI**, parametreleriniz için ek bilgi ve doğrulamalar (validation) tanımlamanıza izin verir.
Örnek olarak şu uygulamayı ele alalım:
@@ -29,7 +30,7 @@ Bunu yapmak için önce şunları import edin:
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | Bilgi
+/// note | Not
FastAPI, 0.95.0 sürümünde `Annotated` desteğini ekledi (ve önermeye başladı).
@@ -348,7 +349,7 @@ O zaman bir `alias` tanımlayabilirsiniz; bu alias, parametre değerini bulmak i
Diyelim ki artık bu parametreyi istemiyorsunuz.
-Bazı client’lar hâlâ kullandığı için bir süre tutmanız gerekiyor, ama dokümanların bunu açıkça deprecated olarak göstermesini istiyorsunuz.
+Bazı client’lar hâlâ kullandığı için bir süre tutmanız gerekiyor, ama dokümanların bunu açıkça kullanımdan kalkmış olarak göstermesini istiyorsunuz.
O zaman `Query`’ye `deprecated=True` parametresini geçin:
@@ -382,7 +383,7 @@ Pydantic’te [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/vali
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | Bilgi
+/// note | Not
Bu özellik Pydantic 2 ve üzeri sürümlerde mevcuttur. 😎
diff --git a/docs/tr/docs/tutorial/query-params.md b/docs/tr/docs/tutorial/query-params.md
index fa485f51a..4f12c4fad 100644
--- a/docs/tr/docs/tutorial/query-params.md
+++ b/docs/tr/docs/tutorial/query-params.md
@@ -1,4 +1,4 @@
-# Sorgu Parametreleri { #query-parameters }
+# Query Parametreleri { #query-parameters }
Fonksiyonda path parametrelerinin parçası olmayan diğer parametreleri tanımladığınızda, bunlar otomatik olarak "query" parametreleri olarak yorumlanır.
@@ -65,13 +65,13 @@ Aynı şekilde, varsayılan değerlerini `None` yaparak isteğe bağlı query pa
Bu durumda, fonksiyon parametresi `q` isteğe bağlı olur ve varsayılan olarak `None` olur.
-/// check | Ek bilgi
+/// tip | İpucu
Ayrıca, **FastAPI** path parametresi olan `item_id`'nin bir path parametresi olduğunu ve `q`'nun path olmadığını fark edecek kadar akıllıdır; dolayısıyla bu bir query parametresidir.
///
-## Sorgu parametresi tip dönüşümü { #query-parameter-type-conversion }
+## Query parametresi tip dönüşümü { #query-parameter-type-conversion }
`bool` tipleri de tanımlayabilirsiniz, ve bunlar dönüştürülür:
diff --git a/docs/tr/docs/tutorial/request-files.md b/docs/tr/docs/tutorial/request-files.md
index 0ba4f8af6..ab54cfd39 100644
--- a/docs/tr/docs/tutorial/request-files.md
+++ b/docs/tr/docs/tutorial/request-files.md
@@ -2,11 +2,11 @@
İstemcinin upload edeceği dosyaları `File` kullanarak tanımlayabilirsiniz.
-/// info | Bilgi
+/// note | Not
Upload edilen dosyaları alabilmek için önce [`python-multipart`](https://github.com/Kludex/python-multipart) yükleyin.
-Bir [virtual environment](../virtual-environments.md) oluşturduğunuzdan, aktive ettiğinizden ve ardından paketi yüklediğinizden emin olun. Örneğin:
+Bir [Sanal ortam](../virtual-environments.md) oluşturduğunuzdan, aktive ettiğinizden ve ardından paketi yüklediğinizden emin olun. Örneğin:
```console
$ pip install python-multipart
@@ -28,7 +28,7 @@ Bunun nedeni, upload edilen dosyaların "form data" olarak gönderilmesidir.
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info | Bilgi
+/// note | Not
`File`, doğrudan `Form`’dan türeyen bir sınıftır.
@@ -64,7 +64,7 @@ Tipi `UploadFile` olan bir dosya parametresi tanımlayın:
* Bu sayede görüntüler, videolar, büyük binary’ler vb. gibi büyük dosyalarda tüm belleği tüketmeden iyi çalışır.
* Upload edilen dosyadan metadata alabilirsiniz.
* [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) bir `async` arayüze sahiptir.
-* [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) nesnesini dışa açar; bunu, file-like nesne bekleyen diğer library’lere doğrudan geçebilirsiniz.
+* Gerçek bir Python [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) nesnesini dışa açar; bunu, file-like nesne bekleyen diğer library’lere doğrudan geçebilirsiniz.
### `UploadFile` { #uploadfile }
diff --git a/docs/tr/docs/tutorial/request-form-models.md b/docs/tr/docs/tutorial/request-form-models.md
index 30fdaee13..6f5532b58 100644
--- a/docs/tr/docs/tutorial/request-form-models.md
+++ b/docs/tr/docs/tutorial/request-form-models.md
@@ -2,11 +2,11 @@
FastAPI'de **form field**'larını tanımlamak için **Pydantic model**'lerini kullanabilirsiniz.
-/// info | Bilgi
+/// note | Not
Form'ları kullanmak için önce [`python-multipart`](https://github.com/Kludex/python-multipart)'ı yükleyin.
-Bir [virtual environment](../virtual-environments.md) oluşturduğunuzdan, onu etkinleştirdiğinizden ve ardından paketi kurduğunuzdan emin olun. Örneğin:
+Bir [Sanal ortam](../virtual-environments.md) oluşturduğunuzdan, onu etkinleştirdiğinizden ve ardından paketi kurduğunuzdan emin olun. Örneğin:
```console
$ pip install python-multipart
diff --git a/docs/tr/docs/tutorial/request-forms-and-files.md b/docs/tr/docs/tutorial/request-forms-and-files.md
index 96f5adcc2..fc50491ce 100644
--- a/docs/tr/docs/tutorial/request-forms-and-files.md
+++ b/docs/tr/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
`File` ve `Form` kullanarak aynı anda hem dosyaları hem de form alanlarını tanımlayabilirsiniz.
-/// info | Bilgi
+/// note | Not
Yüklenen dosyaları ve/veya form verisini almak için önce [`python-multipart`](https://github.com/Kludex/python-multipart) paketini kurun.
diff --git a/docs/tr/docs/tutorial/request-forms.md b/docs/tr/docs/tutorial/request-forms.md
index 0b2f39f13..57f10fb1b 100644
--- a/docs/tr/docs/tutorial/request-forms.md
+++ b/docs/tr/docs/tutorial/request-forms.md
@@ -1,8 +1,9 @@
# Form Verisi { #form-data }
+
JSON yerine form alanlarını almanız gerektiğinde `Form` kullanabilirsiniz.
-/// info | Bilgi
+/// note | Not
Formları kullanmak için önce [`python-multipart`](https://github.com/Kludex/python-multipart) paketini kurun.
@@ -28,11 +29,11 @@ Form parametrelerini `Body` veya `Query` için yaptığınız gibi oluşturun:
Örneğin OAuth2 spesifikasyonunun kullanılabileceği ("password flow" olarak adlandırılan) yollardan birinde, form alanları olarak bir `username` ve `password` göndermek zorunludur.
-Spesifikasyon, alanların adının tam olarak `username` ve `password` olmasını ve JSON değil form alanları olarak gönderilmesini gerektirir.
+spesifikasyon, alanların adının tam olarak `username` ve `password` olmasını ve JSON değil form alanları olarak gönderilmesini gerektirir.
`Form` ile `Body` (ve `Query`, `Path`, `Cookie`) ile yaptığınız aynı konfigürasyonları tanımlayabilirsiniz; validasyon, örnekler, alias (örn. `username` yerine `user-name`) vb. dahil.
-/// info | Bilgi
+/// note | Not
`Form`, doğrudan `Body`'den miras alan bir sınıftır.
@@ -62,7 +63,7 @@ Bu encoding'ler ve form alanları hakkında daha fazla okumak isterseniz, [
-/// check | Authorize butonu!
+/// tip | Authorize butonu!
Artık parıl parıl yeni bir "Authorize" butonunuz var.
@@ -118,7 +118,7 @@ O yüzden basitleştirilmiş bu bakış açısından üzerinden geçelim:
Bu örnekte **OAuth2**’yi, **Password** flow ile, **Bearer** token kullanarak uygulayacağız. Bunu `OAuth2PasswordBearer` sınıfı ile yaparız.
-/// info | Bilgi
+/// note | Not
"Bearer" token tek seçenek değildir.
@@ -140,7 +140,7 @@ Burada `tokenUrl="token"`, henüz oluşturmadığımız göreli bir URL olan `to
Göreli URL kullandığımız için, API’niz `https://example.com/` adresinde olsaydı `https://example.com/token` anlamına gelirdi. Ama API’niz `https://example.com/api/v1/` adresinde olsaydı, bu kez `https://example.com/api/v1/token` anlamına gelirdi.
-Göreli URL kullanmak, [Behind a Proxy](../../advanced/behind-a-proxy.md) gibi daha ileri kullanım senaryolarında bile uygulamanızın çalışmaya devam etmesini garanti etmek açısından önemlidir.
+Göreli URL kullanmak, [Bir Proxy Arkasında](../../advanced/behind-a-proxy.md) gibi daha ileri kullanım senaryolarında bile uygulamanızın çalışmaya devam etmesini garanti etmek açısından önemlidir.
///
@@ -148,7 +148,7 @@ Bu parametre o endpoint’i / *path operation*’ı oluşturmaz; fakat `/token`
Birazdan gerçek path operation’ı da oluşturacağız.
-/// info | Teknik Detaylar
+/// note | Teknik Detaylar
Eğer çok katı bir "Pythonista" iseniz, `token_url` yerine `tokenUrl` şeklindeki parametre adlandırma stilini sevmeyebilirsiniz.
@@ -176,7 +176,7 @@ Bu dependency, *path operation function* içindeki `token` parametresine atanaca
**FastAPI**, bu dependency’yi OpenAPI şemasında (ve otomatik API dokümanlarında) bir "security scheme" tanımlamak için kullanabileceğini bilir.
-/// info | Teknik Detaylar
+/// note | Teknik Detaylar
**FastAPI**, bir dependency içinde tanımlanan `OAuth2PasswordBearer` sınıfını OpenAPI’de security scheme tanımlamak için kullanabileceğini bilir; çünkü bu sınıf `fastapi.security.oauth2.OAuth2`’den kalıtım alır, o da `fastapi.security.base.SecurityBase`’den kalıtım alır.
diff --git a/docs/tr/docs/tutorial/security/get-current-user.md b/docs/tr/docs/tutorial/security/get-current-user.md
index cc7f7a51b..2883c06fe 100644
--- a/docs/tr/docs/tutorial/security/get-current-user.md
+++ b/docs/tr/docs/tutorial/security/get-current-user.md
@@ -14,7 +14,7 @@ Bize mevcut kullanıcıyı verecek şekilde düzenleyelim.
Body'leri bildirmek için Pydantic'i nasıl kullanıyorsak, aynı şekilde onu başka her yerde de kullanabiliriz:
-{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
+{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## `get_current_user` dependency'si oluşturun { #create-a-get-current-user-dependency }
@@ -52,7 +52,7 @@ Burada `Depends` kullandığınız için **FastAPI** karışıklık yaşamaz.
///
-/// check | Ek bilgi
+/// tip | İpucu
Bu dependency sisteminin tasarımı, hepsi `User` modeli döndüren farklı dependency'lere (farklı "dependable"lara) sahip olmamıza izin verir.
diff --git a/docs/tr/docs/tutorial/security/oauth2-jwt.md b/docs/tr/docs/tutorial/security/oauth2-jwt.md
index 4b68bc451..df893ec82 100644
--- a/docs/tr/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/tr/docs/tutorial/security/oauth2-jwt.md
@@ -42,7 +42,7 @@ $ pip install pyjwt
diff --git a/docs/uk/docs/advanced/openapi-webhooks.md b/docs/uk/docs/advanced/openapi-webhooks.md
index bf51f5466..b46b0ce46 100644
--- a/docs/uk/docs/advanced/openapi-webhooks.md
+++ b/docs/uk/docs/advanced/openapi-webhooks.md
@@ -22,7 +22,7 @@
Це значно спростить для ваших користувачів **реалізацію їхніх API** для отримання ваших запитів **вебхуків**; вони навіть зможуть згенерувати частину власного коду API автоматично.
-/// info | Інформація
+/// note | Примітка
Вебхуки доступні в OpenAPI 3.1.0 і вище, підтримуються FastAPI `0.99.0` і вище.
@@ -36,7 +36,7 @@
Визначені вами вебхуки потраплять до **схеми OpenAPI** та автоматичного **інтерфейсу документації**.
-/// info | Інформація
+/// note | Примітка
Об'єкт `app.webhooks` насправді є просто `APIRouter` - тим самим типом, який ви використовуєте, структуризуючи застосунок у кількох файлах.
diff --git a/docs/uk/docs/advanced/path-operation-advanced-configuration.md b/docs/uk/docs/advanced/path-operation-advanced-configuration.md
index f760209ab..07508422c 100644
--- a/docs/uk/docs/advanced/path-operation-advanced-configuration.md
+++ b/docs/uk/docs/advanced/path-operation-advanced-configuration.md
@@ -16,17 +16,11 @@
### Використання назви *функції операції шляху* як operationId { #using-the-path-operation-function-name-as-the-operationid }
-Якщо ви хочете використовувати назви функцій ваших API як `operationId`, ви можете пройтися по всіх них і переписати `operation_id` кожної *операції шляху*, використовуючи їхній `APIRoute.name`.
+Якщо ви хочете використовувати назви функцій ваших API як `operationId`, ви можете передати власну `generate_unique_id_function` до `FastAPI`.
-Зробіть це після додавання всіх *операцій шляху*.
+Функція отримує кожен `APIRoute` і повертає `operationId`, який слід використовувати для цієї операції шляху.
-{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}
-
-/// tip | Порада
-
-Якщо ви вручну викликаєте `app.openapi()`, оновіть усі `operationId` до цього.
-
-///
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *}
/// warning | Попередження
diff --git a/docs/uk/docs/advanced/response-change-status-code.md b/docs/uk/docs/advanced/response-change-status-code.md
index 167df8313..e52479228 100644
--- a/docs/uk/docs/advanced/response-change-status-code.md
+++ b/docs/uk/docs/advanced/response-change-status-code.md
@@ -1,5 +1,6 @@
# Відповідь - зміна коду статусу { #response-change-status-code }
+
Ймовірно, ви вже читали, що можна встановити типовий [код статусу відповіді](../tutorial/response-status-code.md).
Але інколи потрібно повернути інший код статусу, ніж типовий.
diff --git a/docs/uk/docs/advanced/response-cookies.md b/docs/uk/docs/advanced/response-cookies.md
index f4a79fb98..2e062adff 100644
--- a/docs/uk/docs/advanced/response-cookies.md
+++ b/docs/uk/docs/advanced/response-cookies.md
@@ -26,7 +26,7 @@
{* ../../docs_src/response_cookies/tutorial001_py310.py hl[10:12] *}
-/// tip
+/// tip | Порада
Майте на увазі, що якщо ви повертаєте відповідь безпосередньо замість використання параметра `Response`, FastAPI поверне її напряму.
diff --git a/docs/uk/docs/advanced/response-directly.md b/docs/uk/docs/advanced/response-directly.md
index 30d8f5860..18318e6f3 100644
--- a/docs/uk/docs/advanced/response-directly.md
+++ b/docs/uk/docs/advanced/response-directly.md
@@ -18,7 +18,7 @@
Ви можете повертати `Response` або будь-який його підклас.
-/// info | Інформація
+/// note | Примітка
`JSONResponse` сам є підкласом `Response`.
diff --git a/docs/uk/docs/advanced/response-headers.md b/docs/uk/docs/advanced/response-headers.md
index 95ab57fe0..67f1f0c6a 100644
--- a/docs/uk/docs/advanced/response-headers.md
+++ b/docs/uk/docs/advanced/response-headers.md
@@ -38,4 +38,4 @@
Майте на увазі, що власні пропрієтарні заголовки можна додавати [за допомогою префікса `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers).
-Але якщо у вас є власні заголовки, які клієнт у браузері має бачити, вам потрібно додати їх у вашу конфігурацію CORS (докладніше в [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md)), використовуючи параметр `expose_headers`, задокументований у [документації Starlette щодо CORS](https://www.starlette.dev/middleware/#corsmiddleware).
+Але якщо у вас є власні заголовки, які клієнт у браузері має бачити, вам потрібно додати їх у вашу конфігурацію CORS (докладніше в [CORS (спільне використання ресурсів між різними джерелами)](../tutorial/cors.md)), використовуючи параметр `expose_headers`, задокументований у [документації Starlette щодо CORS](https://www.starlette.dev/middleware/#corsmiddleware).
diff --git a/docs/uk/docs/advanced/security/oauth2-scopes.md b/docs/uk/docs/advanced/security/oauth2-scopes.md
index 7f5ba9692..7c898da70 100644
--- a/docs/uk/docs/advanced/security/oauth2-scopes.md
+++ b/docs/uk/docs/advanced/security/oauth2-scopes.md
@@ -46,7 +46,7 @@ OAuth2 зі scopes - це механізм, який використовуют
- `instagram_basic` використовується Facebook / Instagram.
- `https://www.googleapis.com/auth/drive` використовується Google.
-/// info | Інформація
+/// note | Примітка
В OAuth2 «scope» - це просто строка, що декларує конкретний потрібний дозвіл.
@@ -76,7 +76,7 @@ OAuth2 зі scopes - це механізм, який використовуют
Оскільки тепер ми оголошуємо ці scopes, вони з’являться в документації API, коли ви увійдете/авторизуєтеся.
-І ви зможете обрати, які scopes надати доступ: `me` і `items`.
+І ви зможете обрати, яким scopes надати доступ: `me` і `items`.
Це той самий механізм, який використовується, коли ви надаєте дозволи під час входу через Facebook, Google, GitHub тощо:
@@ -126,13 +126,13 @@ OAuth2 зі scopes - це механізм, який використовуют
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
-/// info | Технічні деталі
+/// note | Технічні деталі
`Security` насправді є підкласом `Depends`, і має лише один додатковий параметр, який ми побачимо пізніше.
Але використовуючи `Security` замість `Depends`, **FastAPI** знатиме, що можна оголошувати scopes безпеки, використовувати їх внутрішньо та документувати API через OpenAPI.
-Коли ви імпортуєте `Query`, `Path`, `Depends`, `Security` та інші з `fastapi`, це насправді функції, що повертають спеціальні класи.
+Але коли ви імпортуєте `Query`, `Path`, `Depends`, `Security` та інші з `fastapi`, це насправді функції, що повертають спеціальні класи.
///
@@ -152,7 +152,7 @@ OAuth2 зі scopes - це механізм, який використовуют
{* ../../docs_src/security/tutorial005_an_py310.py hl[9,106] *}
-## Використовуйте scopes { #use-the-scopes }
+## Використовуйте `scopes` { #use-the-scopes }
Параметр `security_scopes` матиме тип `SecurityScopes`.
@@ -194,9 +194,9 @@ OAuth2 зі scopes - це механізм, який використовуют
Ще раз розгляньмо дерево залежностей і scopes.
-Оскільки залежність `get_current_active_user` має підзалежність `get_current_user`, scope «me», оголошений у `get_current_active_user`, буде включений до списку потрібних scopes у `security_scopes.scopes`, переданого до `get_current_user`.
+Оскільки залежність `get_current_active_user` має підзалежність `get_current_user`, scope `"me"`, оголошений у `get_current_active_user`, буде включений до списку потрібних scopes у `security_scopes.scopes`, переданого до `get_current_user`.
-Сама операція шляху також оголошує scope «items», отже він також буде у списку `security_scopes.scopes`, переданому до `get_current_user`.
+Сама операція шляху також оголошує scope `"items"`, отже він також буде у списку `security_scopes.scopes`, переданому до `get_current_user`.
Ось як виглядає ієрархія залежностей і scopes:
diff --git a/docs/uk/docs/advanced/settings.md b/docs/uk/docs/advanced/settings.md
index b369e2f12..867eb23b0 100644
--- a/docs/uk/docs/advanced/settings.md
+++ b/docs/uk/docs/advanced/settings.md
@@ -100,7 +100,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.p
## Налаштування в іншому модулі { #settings-in-another-module }
-Ви можете розмістити ці налаштування в іншому модулі, як ви бачили в [Більші застосунки - кілька файлів](../tutorial/bigger-applications.md).
+Ви можете розмістити ці налаштування в іншому файлі модуля, як ви бачили в [Більші застосунки - кілька файлів](../tutorial/bigger-applications.md).
Наприклад, у вас може бути файл `config.py` з:
@@ -297,6 +297,6 @@ participant execute as Execute function
Ви можете використовувати Pydantic Settings для обробки налаштувань або конфігурацій вашого застосунку, з усією потужністю моделей Pydantic.
-- Використовуючи залежність, ви можете спростити тестування.
-- Ви можете використовувати з ним файли `.env`.
-- Використання `@lru_cache` дає змогу уникнути повторного читання файла dotenv для кожного запиту, водночас дозволяючи переписувати його під час тестування.
+* Використовуючи залежність, ви можете спростити тестування.
+* Ви можете використовувати з ним файли `.env`.
+* Використання `@lru_cache` дає змогу уникнути повторного читання файла dotenv для кожного запиту, водночас дозволяючи переписувати його під час тестування.
diff --git a/docs/uk/docs/advanced/stream-data.md b/docs/uk/docs/advanced/stream-data.md
index 4f12132e0..29d66739e 100644
--- a/docs/uk/docs/advanced/stream-data.md
+++ b/docs/uk/docs/advanced/stream-data.md
@@ -2,9 +2,9 @@
Якщо ви хочете передавати потоком дані, які можна структурувати як JSON, див. [Потокова передача JSON Lines](../tutorial/stream-json-lines.md).
-Але якщо ви хочете передавати потоком чисті бінарні дані або строки, ось як це зробити.
+Але якщо ви хочете передавати потоком **чисті бінарні дані** або строки, ось як це зробити.
-/// info | Інформація
+/// note | Примітка
Додано у FastAPI 0.134.0.
@@ -12,21 +12,21 @@
## Варіанти використання { #use-cases }
-Це можна використовувати, якщо ви хочете передавати потоком чисті строки, наприклад безпосередньо з виводу сервісу AI LLM.
+Це можна використовувати, якщо ви хочете передавати потоком чисті строки, наприклад безпосередньо з виводу сервісу **AI LLM**.
-Також це можна використати для потокової передачі великих бінарних файлів, коли ви надсилаєте кожний фрагмент даних під час читання, без потреби завантажувати все в пам'ять одразу.
+Також це можна використати для потокової передачі **великих бінарних файлів**, коли ви надсилаєте кожний фрагмент даних під час читання, без потреби завантажувати все в пам'ять одразу.
-Так само можна стрімити відео чи аудіо; їх навіть можна генерувати під час обробки та надсилання.
+Так само можна стрімити **відео** чи **аудіо**; їх навіть можна генерувати під час обробки та надсилання.
## `StreamingResponse` з `yield` { #a-streamingresponse-with-yield }
-Якщо ви оголосите `response_class=StreamingResponse` у вашій функції операції шляху, ви можете використовувати `yield`, щоб послідовно надсилати кожний фрагмент даних.
+Якщо ви оголосите `response_class=StreamingResponse` у вашій *функції операції шляху*, ви можете використовувати `yield`, щоб послідовно надсилати кожний фрагмент даних.
{* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *}
FastAPI передаватиме кожний фрагмент даних до `StreamingResponse` як є; він не намагатиметься перетворити його на JSON чи щось подібне.
-### Не-async функції операції шляху { #non-async-path-operation-functions }
+### Не-async *функції операції шляху* { #non-async-path-operation-functions }
Можна також використовувати звичайні функції `def` (без `async`) і так само застосовувати `yield`.
@@ -40,7 +40,7 @@ FastAPI передаватиме кожний фрагмент даних до `
{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *}
-Це також означає, що з `StreamingResponse` у вас є свобода і відповідальність формувати та кодувати байти даних саме так, як їх потрібно надіслати, незалежно від анотацій типів. 🤓
+Це також означає, що з `StreamingResponse` у вас є **свобода** і **відповідальність** формувати та кодувати байти даних саме так, як їх потрібно надіслати, незалежно від анотацій типів. 🤓
### Потік байтів { #stream-bytes }
@@ -58,7 +58,7 @@ FastAPI передаватиме кожний фрагмент даних до `
{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *}
-Потім ви можете використати цей новий клас у `response_class=PNGStreamingResponse` у вашій функції операції шляху:
+Потім ви можете використати цей новий клас у `response_class=PNGStreamingResponse` у вашій *функції операції шляху*:
{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *}
@@ -90,7 +90,7 @@ FastAPI передаватиме кожний фрагмент даних до `
І часто їх читання є блокувальною операцією (що може блокувати цикл подій), адже дані зчитуються з диска або мережі.
-/// info | Інформація
+/// note | Примітка
Наведений вище приклад - виняток, адже об'єкт `io.BytesIO` вже в пам'яті, тож читання нічого не блокує.
@@ -98,7 +98,7 @@ FastAPI передаватиме кожний фрагмент даних до `
///
-Щоб уникнути блокування циклу подій, просто оголосіть функцію операції шляху зі звичайним `def` замість `async def`. Тоді FastAPI виконуватиме її в працівнику пулу потоків, щоб не блокувати головний цикл.
+Щоб уникнути блокування циклу подій, просто оголосіть *функцію операції шляху* зі звичайним `def` замість `async def`. Тоді FastAPI виконуватиме її в працівнику пулу потоків, щоб не блокувати головний цикл.
{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *}
diff --git a/docs/uk/docs/advanced/strict-content-type.md b/docs/uk/docs/advanced/strict-content-type.md
index a244ec901..7d3156b09 100644
--- a/docs/uk/docs/advanced/strict-content-type.md
+++ b/docs/uk/docs/advanced/strict-content-type.md
@@ -40,7 +40,7 @@ http://localhost:8000
Використовуючи фронтенд, ви можете змушувати AI-агента виконувати дії від вашого імені.
-Оскільки він працює локально, а не у відкритому інтернеті, ви вирішуєте не налаштовувати жодної автентифікації, просто покладаючись на доступ до локальної мережі.
+Оскільки він працює **локально**, а не у відкритому інтернеті, ви вирішуєте **не налаштовувати жодної автентифікації**, просто покладаючись на доступ до локальної мережі.
Один із ваших користувачів може встановити його і запустити локально.
@@ -81,7 +81,7 @@ http://localhost:8000/v1/agents/multivac
З цим налаштуванням запити без заголовка `Content-Type` матимуть тіло, розібране як JSON, що відповідає поведінці старіших версій FastAPI.
-/// info | Інформація
+/// note | Примітка
Цю поведінку і конфігурацію додано у FastAPI 0.132.0.
diff --git a/docs/uk/docs/advanced/websockets.md b/docs/uk/docs/advanced/websockets.md
index aa290b389..1d96933be 100644
--- a/docs/uk/docs/advanced/websockets.md
+++ b/docs/uk/docs/advanced/websockets.md
@@ -111,7 +111,7 @@ $ fastapi dev
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
-/// info
+/// note
Оскільки це WebSocket, не має сенсу піднімати `HTTPException`, натомість ми піднімаємо `WebSocketException`.
diff --git a/docs/uk/docs/advanced/wsgi.md b/docs/uk/docs/advanced/wsgi.md
index 84d4aa460..aa4dcb6b0 100644
--- a/docs/uk/docs/advanced/wsgi.md
+++ b/docs/uk/docs/advanced/wsgi.md
@@ -1,12 +1,13 @@
# Підключення WSGI - Flask, Django та інші { #including-wsgi-flask-django-others }
+
Ви можете монтувати застосунки WSGI, як ви бачили в [Підзастосунки - монтування](sub-applications.md), [За представником](behind-a-proxy.md).
Для цього ви можете використати `WSGIMiddleware` і обгорнути ним ваш застосунок WSGI, наприклад Flask, Django тощо.
## Використання `WSGIMiddleware` { #using-wsgimiddleware }
-/// info | Інформація
+/// note | Примітка
Для цього потрібно встановити `a2wsgi`, наприклад за допомогою `pip install a2wsgi`.
diff --git a/docs/uk/docs/alternatives.md b/docs/uk/docs/alternatives.md
index 155c727df..f903f3f20 100644
--- a/docs/uk/docs/alternatives.md
+++ b/docs/uk/docs/alternatives.md
@@ -44,11 +44,11 @@ Django REST Framework створив Том Крісті. Той самий тв
### [Flask](https://flask.palletsprojects.com) { #flask }
-Flask — це «мікрофреймворк», він не включає інтеграцію бази даних, а також багато речей, які за замовчуванням є в Django.
+Flask - це «мікрофреймворк», він не включає інтеграцію бази даних, а також багато речей, які за замовчуванням є в Django.
Ця простота та гнучкість дозволяють використовувати бази даних NoSQL як основну систему зберігання даних.
-Оскільки він дуже простий, він порівняно легкий та інтуїтивний для освоєння, хоча в деяких моментах документація стає дещо технічною.
+Оскільки він дуже простий, він порівняно інтуїтивний для освоєння, хоча в деяких моментах документація стає дещо технічною.
Він також зазвичай використовується для інших програм, яким не обов’язково потрібна база даних, керування користувачами або будь-яка з багатьох функцій, які є попередньо вбудованими в Django. Хоча багато з цих функцій можна додати за допомогою плагінів.
@@ -72,7 +72,7 @@ Flask — це «мікрофреймворк», він не включає ін
Але все ж FastAPI черпав натхнення з Requests.
-**Requests** — це бібліотека для *взаємодії* з API (як клієнт), а **FastAPI** — це бібліотека для *створення* API (як сервер).
+**Requests** - це бібліотека для *взаємодії* з API (як клієнт), а **FastAPI** - це бібліотека для *створення* API (як сервер).
Вони більш-менш знаходяться на протилежних кінцях, доповнюючи одна одну.
@@ -88,7 +88,7 @@ Requests мають дуже простий та інтуїтивно зрозу
response = requests.get("http://example.com/some/url")
```
-Відповідна операція шляху API FastAPI може виглядати так:
+Відповідна *операція шляху* API FastAPI може виглядати так:
```Python hl_lines="1"
@app.get("/some/url")
@@ -124,7 +124,7 @@ def read_url():
Інтегрувати інструменти інтерфейсу на основі стандартів:
-* [Інтерфейс Swagger](https://github.com/swagger-api/swagger-ui)
+* [Swagger UI](https://github.com/swagger-api/swagger-ui)
* [ReDoc](https://github.com/Rebilly/ReDoc)
Ці два було обрано через те, що вони досить популярні та стабільні, але, виконавши швидкий пошук, ви можете знайти десятки додаткових альтернативних інтерфейсів для OpenAPI (які можна використовувати з **FastAPI**).
@@ -157,7 +157,7 @@ Marshmallow створено для забезпечення цих функці
Іншою важливою функцією, необхідною для API, є аналіз даних із вхідних запитів.
-Webargs — це інструмент, створений, щоб забезпечити це поверх кількох фреймворків, включаючи Flask.
+Webargs - це інструмент, створений, щоб забезпечити це поверх кількох фреймворків, включаючи Flask.
Він використовує Marshmallow в основі для перевірки даних. І створений тими ж розробниками.
@@ -239,7 +239,7 @@ Flask-apispec був створений тими ж розробниками Mar
### [NestJS](https://nestjs.com/) (та [Angular](https://angular.io/)) { #nestjs-and-angular }
-Це навіть не Python, NestJS — це фреймворк NodeJS JavaScript (TypeScript), натхненний Angular.
+Це навіть не Python, NestJS - це фреймворк NodeJS JavaScript (TypeScript), натхненний Angular.
Це досягає чогось подібного до того, що можна зробити з Flask-apispec.
@@ -281,7 +281,7 @@ Flask-apispec був створений тими ж розробниками Mar
### [Falcon](https://falconframework.org/) { #falcon }
-Falcon — ще один високопродуктивний фреймворк Python, він розроблений як мінімальний і працює як основа інших фреймворків, таких як Hug.
+Falcon - ще один високопродуктивний фреймворк Python, він розроблений як мінімальний і працює як основа інших фреймворків, таких як Hug.
Він розроблений таким чином, щоб мати функції, які отримують два параметри, один «запит» і один «відповідь». Потім ви «читаєте» частини запиту та «записуєте» частини у відповідь. Через такий дизайн неможливо оголосити параметри запиту та тіла за допомогою стандартних підказок типу Python як параметри функції.
@@ -351,7 +351,7 @@ Hug надихнув **FastAPI** оголосити параметр `response`
///
-### [APIStar](https://github.com/encode/apistar) (<= 0,5) { #apistar-0-5 }
+### [APIStar](https://github.com/encode/apistar) (<= 0.5) { #apistar-0-5 }
Безпосередньо перед тим, як вирішити створити **FastAPI**, я знайшов сервер **APIStar**. Він мав майже все, що я шукав, і мав чудовий дизайн.
@@ -373,7 +373,7 @@ Hug надихнув **FastAPI** оголосити параметр `response`
Це вже не був веб-фреймворк API, оскільки творцю потрібно було зосередитися на Starlette.
-Тепер APIStar — це набір інструментів для перевірки специфікацій OpenAPI, а не веб-фреймворк.
+Тепер APIStar - це набір інструментів для перевірки специфікацій OpenAPI, а не веб-фреймворк.
/// note | Примітка
@@ -403,7 +403,7 @@ APIStar створив Том Крісті. Той самий хлопець, я
### [Pydantic](https://docs.pydantic.dev/) { #pydantic }
-Pydantic — це бібліотека для визначення перевірки даних, серіалізації та документації (за допомогою Схеми JSON) на основі підказок типу Python.
+Pydantic - це бібліотека для визначення перевірки даних, серіалізації та документації (за допомогою Схеми JSON) на основі підказок типу Python.
Це робить його надзвичайно інтуїтивним.
@@ -419,7 +419,7 @@ Pydantic — це бібліотека для визначення переві
### [Starlette](https://www.starlette.dev/) { #starlette }
-Starlette — це легкий фреймворк/набір інструментів ASGI, який ідеально підходить для створення високопродуктивних asyncio сервісів.
+Starlette - це легкий фреймворк/набір інструментів ASGI, який ідеально підходить для створення високопродуктивних asyncio сервісів.
Він дуже простий та інтуїтивно зрозумілий. Його розроблено таким чином, щоб його можна було легко розширювати та мати модульні компоненти.
@@ -433,7 +433,7 @@ Starlette — це легкий фреймворк/набір інструмен
* CORS, GZip, статичні файли, потокові відповіді.
* Підтримку сеансів і кукі.
* 100% покриття тестом.
-* 100% анотовану кодову базу.
+* 100% анотовану типами кодову базу.
* Кілька жорстких залежностей.
Starlette наразі є найшвидшим фреймворком Python із перевірених. Перевершує лише Uvicorn, який є не фреймворком, а сервером.
@@ -446,7 +446,7 @@ Starlette надає всі основні функції веб-мікрофр
/// note | Технічні деталі
-ASGI — це новий «стандарт», який розробляється членами основної команди Django. Це ще не «стандарт Python» (PEP), хоча вони в процесі цього.
+ASGI - це новий «стандарт», який розробляється членами основної команди Django. Це ще не «стандарт Python» (PEP), хоча вони в процесі цього.
Тим не менш, він уже використовується як «стандарт» кількома інструментами. Це значно покращує сумісність, оскільки ви можете переключити Uvicorn на будь-який інший сервер ASGI (наприклад, Daphne або Hypercorn), або ви можете додати інструменти, сумісні з ASGI, як-от `python-socketio`.
@@ -464,9 +464,9 @@ ASGI — це новий «стандарт», який розробляєтьс
### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn }
-Uvicorn — це блискавичний сервер ASGI, побудований на uvloop і httptools.
+Uvicorn - це блискавичний сервер ASGI, побудований на uvloop і httptools.
-Це не веб-фреймворк, а сервер. Наприклад, він не надає інструментів для маршрутизації. Це те, що фреймворк на кшталт Starlette (або **FastAPI**) забезпечить поверх нього.
+Це не веб-фреймворк, а сервер. Наприклад, він не надає інструментів для маршрутизації за шляхами. Це те, що фреймворк на кшталт Starlette (або **FastAPI**) забезпечить поверх нього.
Це рекомендований сервер для Starlette і **FastAPI**.
diff --git a/docs/uk/docs/async.md b/docs/uk/docs/async.md
index 72e29b3ea..9a9a90d12 100644
--- a/docs/uk/docs/async.md
+++ b/docs/uk/docs/async.md
@@ -1,6 +1,6 @@
# Рівночасність і async / await { #concurrency-and-async-await }
-Деталі щодо синтаксису `async def` для функцій операції шляху і деякі відомості про асинхронний код, рівночасність і паралелізм.
+Деталі щодо синтаксису `async def` для *функцій операції шляху* і деякі відомості про асинхронний код, рівночасність і паралелізм.
## Поспішаєте? { #in-a-hurry }
@@ -12,7 +12,7 @@
results = await some_library()
```
-Тоді оголошуйте ваші функції операції шляху з `async def`, наприклад:
+Тоді оголошуйте ваші *функції операції шляху* з `async def`, наприклад:
```Python hl_lines="2"
@app.get('/')
@@ -29,7 +29,7 @@ async def read_results():
---
-Якщо ви використовуєте сторонню бібліотеку, яка взаємодіє з чимось (база даних, API, файлова система тощо) і не підтримує використання `await` (наразі це стосується більшості бібліотек баз даних), тоді оголошуйте ваші функції операції шляху як зазвичай, просто з `def`, наприклад:
+Якщо ви використовуєте сторонню бібліотеку, яка взаємодіє з чимось (база даних, API, файлова система тощо) і не підтримує використання `await` (наразі це стосується більшості бібліотек баз даних), тоді оголошуйте ваші *функції операції шляху* як зазвичай, просто з `def`, наприклад:
```Python hl_lines="2"
@app.get('/')
@@ -48,7 +48,7 @@ def results():
---
-Примітка: ви можете змішувати `def` і `async def` у ваших функціях операції шляху скільки завгодно і визначати кожну з них найкращим для вас способом. FastAPI зробить з ними все правильно.
+**Примітка**: ви можете змішувати `def` і `async def` у ваших *функціях операції шляху* скільки завгодно і визначати кожну з них найкращим для вас способом. FastAPI зробить з ними все правильно.
У будь-якому з наведених випадків FastAPI все одно працюватиме асинхронно і буде надзвичайно швидким.
@@ -56,17 +56,17 @@ def results():
## Технічні деталі { #technical-details }
-Сучасні версії Python мають підтримку «асинхронного коду» за допомогою так званих «співпрограм» з синтаксисом **`async` і `await`**.
+Сучасні версії Python мають підтримку **«асинхронного коду»** за допомогою так званих **«співпрограм»** з синтаксисом **`async` і `await`**.
Розгляньмо цю фразу по частинах у секціях нижче:
-- Асинхронний код
-- `async` і `await`
-- Співпрограми
+- **Асинхронний код**
+- **`async` і `await`**
+- **Співпрограми**
## Асинхронний код { #asynchronous-code }
-Асинхронний код означає, що мова 💬 має спосіб сказати комп’ютеру/програмі 🤖, що в певний момент у коді він 🤖 має почекати, поки «щось інше» завершиться десь ще. Скажімо, це «щось інше» називається «slow-file» 📝.
+Асинхронний код означає, що мова 💬 має спосіб сказати комп’ютеру/програмі 🤖, що в певний момент у коді він 🤖 має почекати, поки *«щось інше»* завершиться десь ще. Скажімо, це *«щось інше»* називається «slow-file» 📝.
Отже, в цей час комп’ютер може піти і зробити іншу роботу, доки «slow-file» 📝 завершується.
@@ -97,9 +97,9 @@ def results():
Ідею **асинхронного** коду, описану вище, інколи також називають **«рівночасністю»**. Вона відрізняється від **«паралелізму»**.
-І рівночасність, і паралелізм стосуються «різних речей, що відбуваються більш-менш одночасно».
+**Рівночасність** і **паралелізм** стосуються «різних речей, що відбуваються більш-менш одночасно».
-Але деталі між рівночасністю і паралелізмом досить різні.
+Але деталі між *рівночасністю* і *паралелізмом* досить різні.
Щоб побачити різницю, уявімо таку історію про бургери:
@@ -257,7 +257,7 @@ def results():
Ні! Це не мораль історії.
-Рівночасність відрізняється від паралелізму. І вона краща у конкретних сценаріях, що містять багато очікування. Через це зазвичай вона значно краща за паралелізм для розробки вебзастосунків. Але не для всього.
+Рівночасність відрізняється від паралелізму. І вона краща у **конкретних** сценаріях, що містять багато очікування. Через це зазвичай вона значно краща за паралелізм для розробки вебзастосунків. Але не для всього.
Щоб урівноважити це, уявімо коротку історію:
@@ -273,15 +273,15 @@ def results():
Завершення займе той самий час із «чергами» чи без (рівночасність), і ви виконаєте той самий обсяг роботи.
-Але в цьому випадку, якби ви могли привести 8 колишніх касирів/кухарів/тепер прибиральників, і кожен з них (разом із вами) взяв би свою зону будинку для прибирання, ви могли б виконати всю роботу паралельно — з додатковою допомогою — і завершити значно швидше.
+Але в цьому випадку, якби ви могли привести 8 колишніх касирів/кухарів/тепер прибиральників, і кожен з них (разом із вами) взяв би свою зону будинку для прибирання, ви могли б виконати всю роботу **паралельно** - з додатковою допомогою - і завершити значно швидше.
У цьому сценарії кожен з прибиральників (включно з вами) був би процесором, що виконує свою частину роботи.
-І оскільки більшість часу виконання займає реальна робота (а не очікування), а роботу на комп’ютері виконує CPU, ці проблеми називають «CPU bound».
+І оскільки більшість часу виконання займає реальна робота (а не очікування), а роботу на комп’ютері виконує CPU, ці проблеми називають **«CPU bound»**.
---
-Поширені приклади «CPU bound» операцій - це речі, що потребують складної математичної обробки.
+Поширені приклади **CPU bound** операцій - це речі, що потребують складної математичної обробки.
Наприклад:
@@ -294,7 +294,7 @@ def results():
З **FastAPI** ви можете скористатися рівночасністю, що дуже поширена у веброзробці (та ж головна принада NodeJS).
-Але ви також можете використати переваги паралелізму і багатопроцесорності (наявність кількох процесів, що працюють паралельно) для навантажень «CPU bound», як у системах машинного навчання.
+Але ви також можете використати переваги паралелізму і багатопроцесорності (наявність кількох процесів, що працюють паралельно) для навантажень **«CPU bound»**, як у системах машинного навчання.
Це, плюс простий факт, що Python є основною мовою для **Data Science**, машинного навчання і особливо глибокого навчання, робить FastAPI дуже вдалим вибором для веб API та застосунків Data Science / машинного навчання (серед багатьох інших).
@@ -340,7 +340,7 @@ burgers = get_burgers(2)
---
-Отже, якщо ви використовуєте бібліотеку, яку можна викликати з `await`, вам потрібно створити функцію операції шляху, що її використовує, з `async def`, як тут:
+Отже, якщо ви використовуєте бібліотеку, яку можна викликати з `await`, вам потрібно створити *функцію операції шляху*, що її використовує, з `async def`, як тут:
```Python hl_lines="2-3"
@app.get('/burgers')
@@ -357,7 +357,7 @@ async def read_burgers():
Тож як же викликати першу `async`-функцію - курка чи яйце?
-Якщо ви працюєте з **FastAPI**, вам не потрібно про це турбуватися, адже цією «першою» функцією буде ваша функція операції шляху, і FastAPI знатиме, як учинити правильно.
+Якщо ви працюєте з **FastAPI**, вам не потрібно про це турбуватися, адже цією «першою» функцією буде ваша *функція операції шляху*, і FastAPI знатиме, як учинити правильно.
Але якщо ви хочете використовувати `async` / `await` без FastAPI, ви також можете це зробити.
@@ -395,7 +395,7 @@ Starlette (і **FastAPI**) базуються на [AnyIO](https://anyio.readthe
Погляньмо на ту саму фразу ще раз:
-> Сучасні версії Python мають підтримку «асинхронного коду» за допомогою так званих «співпрограм», з синтаксисом **`async` і `await`**.
+> Сучасні версії Python мають підтримку **«асинхронного коду»** за допомогою так званих **«співпрограм»**, з синтаксисом **`async` і `await`**.
Тепер це має більше сенсу. ✨
@@ -415,11 +415,11 @@ Starlette (і **FastAPI**) базуються на [AnyIO](https://anyio.readthe
### Функції операції шляху { #path-operation-functions }
-Коли ви оголошуєте функцію операції шляху зі звичайним `def` замість `async def`, вона виконується у зовнішньому пулі потоків (threadpool), який потім «очікується», замість прямого виклику (оскільки прямий виклик блокував би сервер).
+Коли ви оголошуєте *функцію операції шляху* зі звичайним `def` замість `async def`, вона виконується у зовнішньому пулі потоків (threadpool), який потім «очікується», замість прямого виклику (оскільки прямий виклик блокував би сервер).
-Якщо ви прийшли з іншого async-фреймворку, який не працює так, як описано вище, і звикли визначати тривіальні, лише обчислювальні функції операції шляху зі звичайним `def` заради крихітного виграшу у продуктивності (близько 100 наносекунд), зверніть увагу, що у **FastAPI** ефект буде протилежним. У таких випадках краще використовувати `async def`, якщо тільки ваші функції операції шляху не використовують код, що виконує блокуюче I/O.
+Якщо ви прийшли з іншого async-фреймворку, який не працює так, як описано вище, і звикли визначати тривіальні, лише обчислювальні *функції операції шляху* зі звичайним `def` заради крихітного виграшу у продуктивності (близько 100 наносекунд), зверніть увагу, що у **FastAPI** ефект буде протилежним. У таких випадках краще використовувати `async def`, якщо тільки ваші *функції операції шляху* не використовують код, що виконує блокуюче I/O.
-Втім, у будь-якій ситуації є велика ймовірність, що **FastAPI** [все одно буде швидшим](index.md#performance) (або принаймні порівнянним) за ваш попередній фреймворк.
+Втім, в обох ситуаціях є велика ймовірність, що **FastAPI** [все одно буде швидшим](index.md#performance) (або принаймні порівнянним) за ваш попередній фреймворк.
### Залежності { #dependencies }
@@ -433,7 +433,7 @@ Starlette (і **FastAPI**) базуються на [AnyIO](https://anyio.readthe
Будь-яка інша допоміжна функція, яку ви викликаєте безпосередньо, може бути створена зі звичайним `def` або `async def`, і FastAPI не впливатиме на спосіб її виклику.
-Це відрізняється від функцій, які FastAPI викликає за вас: функції операції шляху і залежності.
+Це відрізняється від функцій, які FastAPI викликає за вас: *функції операції шляху* і залежності.
Якщо ваша допоміжна функція є звичайною функцією з `def`, її буде викликано безпосередньо (як ви написали у своєму коді), не в пулі потоків; якщо функція створена з `async def`, тоді вам слід використовувати `await` при її виклику у вашому коді.
diff --git a/docs/uk/docs/deployment/cloud.md b/docs/uk/docs/deployment/cloud.md
index 97d972717..8c7259946 100644
--- a/docs/uk/docs/deployment/cloud.md
+++ b/docs/uk/docs/deployment/cloud.md
@@ -16,7 +16,7 @@ FastAPI Cloud є основним спонсором і джерелом фін
## Хмарні постачальники - спонсори { #cloud-providers-sponsors }
-Деякі інші хмарні постачальники ✨ [**спонсорують FastAPI**](../help-fastapi.md#sponsor-the-author) ✨ також. 🙇
+Деякі інші хмарні постачальники ✨ [**спонсорують FastAPI**](https://github.com/sponsors/tiangolo) ✨ також. 🙇
Можливо, ви захочете розглянути їх, щоб дотримуватися їхніх інструкцій і спробувати їхні сервіси:
diff --git a/docs/uk/docs/deployment/concepts.md b/docs/uk/docs/deployment/concepts.md
index a6a5bc80e..cec4d8f01 100644
--- a/docs/uk/docs/deployment/concepts.md
+++ b/docs/uk/docs/deployment/concepts.md
@@ -5,11 +5,11 @@
Деякі важливі концепції:
- Безпека - HTTPS
-- Запуск під час старту
+- Запуск під час запуску
- Перезапуски
- Реплікація (кількість запущених процесів)
- Пам'ять
-- Попередні кроки перед стартом
+- Попередні кроки перед запуском
Подивимось, як вони впливають на **розгортання**.
@@ -88,7 +88,7 @@
Тепер, коли ми знаємо різницю між термінами **процес** і **програма**, продовжимо говорити про розгортання.
-## Запуск під час старту { #running-on-startup }
+## Запуск під час запуску { #running-on-startup }
У більшості випадків, коли ви створюєте веб-API, ви хочете, щоб він **працював постійно**, без перерв, щоб клієнти завжди мали до нього доступ. Звісно, якщо немає особливих причин запускати його лише в певних ситуаціях. Але зазвичай ви хочете, щоб він постійно працював і був **доступний**.
@@ -102,15 +102,15 @@
І якщо сервер буде перезавантажено (наприклад, після оновлень або міграцій у хмарного провайдера), ви, ймовірно, **не помітите цього**. І через це ви навіть не знатимете, що треба вручну перезапустити процес. У результаті ваш API просто залишиться «мертвим». 😱
-### Автоматичний запуск під час старту { #run-automatically-on-startup }
+### Автоматичний запуск під час запуску { #run-automatically-on-startup }
-Загалом ви, напевно, захочете, щоб серверна програма (наприклад, Uvicorn) запускалася автоматично під час старту сервера і без будь-якого **людського втручання**, щоб завжди був запущений процес із вашим API (наприклад, Uvicorn із вашим FastAPI-застосунком).
+Загалом ви, напевно, захочете, щоб серверна програма (наприклад, Uvicorn) запускалася автоматично під час запуску сервера і без будь-якого **людського втручання**, щоб завжди був запущений процес із вашим API (наприклад, Uvicorn із вашим FastAPI-застосунком).
### Окрема програма { #separate-program }
-Щоб цього досягти, зазвичай використовують **окрему програму**, яка гарантує запуск вашого застосунку під час старту. І в багатьох випадках вона також забезпечує запуск інших компонентів або застосунків, наприклад бази даних.
+Щоб цього досягти, зазвичай використовують **окрему програму**, яка гарантує запуск вашого застосунку під час запуску. І в багатьох випадках вона також забезпечує запуск інших компонентів або застосунків, наприклад бази даних.
-### Приклади інструментів для запуску під час старту { #example-tools-to-run-at-startup }
+### Приклади інструментів для запуску під час запуску { #example-tools-to-run-at-startup }
Приклади інструментів, які можуть це робити:
@@ -127,7 +127,7 @@
## Перезапуски { #restarts }
-Подібно до забезпечення запуску застосунку під час старту системи, ви, ймовірно, також захочете гарантувати його **перезапуск** після збоїв.
+Подібно до забезпечення запуску застосунку під час запуску системи, ви, ймовірно, також захочете гарантувати його **перезапуск** після збоїв.
### Ми помиляємося { #we-make-mistakes }
@@ -163,7 +163,7 @@
### Приклади інструментів для автоматичного перезапуску { #example-tools-to-restart-automatically }
-У більшості випадків той самий інструмент, який використовується для **запуску програми під час старту**, також використовується для автоматичних **перезапусків**.
+У більшості випадків той самий інструмент, який використовується для **запуску програми під час запуску**, також використовується для автоматичних **перезапусків**.
Наприклад, це можуть забезпечувати:
@@ -192,7 +192,7 @@
Пам'ятаєте з документації [Про HTTPS](https.md), що на сервері лише один процес може слухати певну комбінацію порту та IP-адреси?
-Это досі так.
+Це досі так.
Отже, щоб мати **кілька процесів** одночасно, має бути **єдиний процес, який слухає порт**, і який далі якимось чином передає комунікацію кожному процесу-працівнику.
@@ -247,9 +247,9 @@
///
-## Попередні кроки перед стартом { #previous-steps-before-starting }
+## Попередні кроки перед запуском { #previous-steps-before-starting }
-Є багато випадків, коли потрібно виконати деякі кроки **перед стартом** вашого застосунку.
+Є багато випадків, коли потрібно виконати деякі кроки **перед запуском** вашого застосунку.
Наприклад, ви можете захотіти запустити **міграції бази даних**.
@@ -310,11 +310,11 @@
Тут ви прочитали про основні концепції, які, ймовірно, потрібно тримати в голові, вирішуючи, як розгортати ваш застосунок:
- Безпека - HTTPS
-- Запуск під час старту
+- Запуск під час запуску
- Перезапуски
- Реплікація (кількість запущених процесів)
- Пам'ять
-- Попередні кроки перед стартом
+- Попередні кроки перед запуском
Розуміння цих ідей і того, як їх застосовувати, має дати вам інтуїцію, необхідну для прийняття рішень під час конфігурування і тонкого налаштування ваших розгортань. 🤓
diff --git a/docs/uk/docs/deployment/docker.md b/docs/uk/docs/deployment/docker.md
index 9d9afc0d1..83799a00f 100644
--- a/docs/uk/docs/deployment/docker.md
+++ b/docs/uk/docs/deployment/docker.md
@@ -1,8 +1,8 @@
# FastAPI у контейнерах - Docker { #fastapi-in-containers-docker }
-Під час розгортання застосунків FastAPI поширений підхід - збирати образи контейнерів Linux. Зазвичай це робиться за допомогою [Docker](https://www.docker.com/). Потім ви можете розгорнути цей образ контейнера кількома різними способами.
+Під час розгортання застосунків FastAPI поширений підхід - збирати **образи контейнерів Linux**. Зазвичай це робиться за допомогою [**Docker**](https://www.docker.com/). Потім ви можете розгорнути цей образ контейнера кількома різними способами.
-Використання контейнерів Linux має кілька переваг, зокрема безпека, відтворюваність, простота та інші.
+Використання контейнерів Linux має кілька переваг, зокрема **безпека**, **відтворюваність**, **простота** та інші.
/// tip | Порада
@@ -34,33 +34,33 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"]
## Що таке контейнер { #what-is-a-container }
-Контейнери (переважно контейнери Linux) - це дуже легкий спосіб упакувати застосунки з усіма їхніми залежностями та потрібними файлами, ізолювавши їх від інших контейнерів (інших застосунків або компонентів) у тій самій системі.
+Контейнери (переважно контейнери Linux) - це дуже **легкий** спосіб упакувати застосунки з усіма їхніми залежностями та потрібними файлами, ізолювавши їх від інших контейнерів (інших застосунків або компонентів) у тій самій системі.
-Контейнери Linux працюють, використовуючи той самий ядро Linux, що й хост (машина, віртуальна машина, хмарний сервер тощо). Це означає, що вони дуже легкі (у порівнянні з повними віртуальними машинами, які емулюють цілу операційну систему).
+Контейнери Linux працюють, використовуючи те саме ядро Linux, що й хост (машина, віртуальна машина, хмарний сервер тощо). Це означає, що вони дуже легкі (у порівнянні з повними віртуальними машинами, які емулюють цілу операційну систему).
-Таким чином контейнери споживають мало ресурсів, приблизно як безпосередньо запущені процеси (віртуальна машина споживала б значно більше).
+Таким чином контейнери споживають **мало ресурсів**, приблизно як безпосередньо запущені процеси (віртуальна машина споживала б значно більше).
-У контейнерів також є власні ізольовані процеси виконання (зазвичай лише один процес), файлові системи та мережі, що спрощує розгортання, безпеку, розробку тощо.
+У контейнерів також є власні **ізольовані** процеси виконання (зазвичай лише один процес), файлові системи та мережі, що спрощує розгортання, безпеку, розробку тощо.
## Що таке образ контейнера { #what-is-a-container-image }
-Контейнер запускається з образу контейнера.
+**Контейнер** запускається з **образу контейнера**.
-Образ контейнера - це статична версія всіх файлів, змінних оточення та типова команда/програма, яка має бути присутня в контейнері. Тут «статична» означає, що образ контейнера не запущений, він не виконується, це лише упаковані файли та метадані.
+Образ контейнера - це **статична** версія всіх файлів, змінних оточення та типова команда/програма, яка має бути присутня в контейнері. Тут **«статична»** означає, що **образ** контейнера не запущений, він не виконується, це лише упаковані файли та метадані.
-На противагу «образу контейнера», що є збереженим статичним вмістом, «контейнер» зазвичай означає запущений екземпляр, те, що виконується.
+На противагу «**образу контейнера**», що є збереженим статичним вмістом, «**контейнер**» зазвичай означає запущений екземпляр, те, що **виконується**.
-Коли контейнер запущено (запущений з образу контейнера), він може створювати або змінювати файли, змінні оточення тощо. Ці зміни існуватимуть лише в цьому контейнері, але не збережуться в базовому образі контейнера (не будуть записані на диск).
+Коли **контейнер** запущено (запущений з **образу контейнера**), він може створювати або змінювати файли, змінні оточення тощо. Ці зміни існуватимуть лише в цьому контейнері, але не збережуться в базовому образі контейнера (не будуть записані на диск).
-Образ контейнера можна порівняти з файлом і вмістом програми, наприклад `python` і файлом `main.py`.
+Образ контейнера можна порівняти з файлом і вмістом **програми**, наприклад `python` і файлом `main.py`.
-А сам контейнер (на відміну від образу) - це фактично запущений екземпляр образу, порівнянний із процесом. Насправді контейнер працює лише тоді, коли в ньому працює процес (і зазвичай це один процес). Контейнер зупиняється, коли в ньому не працює жоден процес.
+А сам **контейнер** (на відміну від **образу контейнера**) - це фактично запущений екземпляр образу, порівнянний із **процесом**. Насправді контейнер працює лише тоді, коли в ньому **працює процес** (і зазвичай це один процес). Контейнер зупиняється, коли в ньому не працює жоден процес.
## Образи контейнерів { #container-images }
-Docker був одним з основних інструментів для створення та керування образами контейнерів і контейнерами.
+Docker був одним з основних інструментів для створення та керування **образами контейнерів** і **контейнерами**.
-Існує публічний [Docker Hub](https://hub.docker.com/) з готовими офіційними образами для багатьох інструментів, середовищ, баз даних і застосунків.
+Існує публічний [Docker Hub](https://hub.docker.com/) з готовими **офіційними образами контейнерів** для багатьох інструментів, середовищ, баз даних і застосунків.
Наприклад, є офіційний [образ Python](https://hub.docker.com/_/python).
@@ -71,43 +71,43 @@ Docker був одним з основних інструментів для с
* [MongoDB](https://hub.docker.com/_/mongo)
* [Redis](https://hub.docker.com/_/redis) тощо.
-Використовуючи готовий образ контейнера, дуже легко поєднувати та використовувати різні інструменти. Наприклад, щоб випробувати нову базу даних. У більшості випадків ви можете використати офіційні образи та просто налаштувати їх змінними оточення.
+Використовуючи готовий образ контейнера, дуже легко **поєднувати** та використовувати різні інструменти. Наприклад, щоб випробувати нову базу даних. У більшості випадків ви можете використати **офіційні образи** та просто налаштувати їх змінними оточення.
Таким чином, у багатьох випадках ви зможете навчитися працювати з контейнерами і Docker та повторно використати ці знання з багатьма різними інструментами і компонентами.
-Тобто ви запускатимете кілька контейнерів з різними речами, як-от базу даних, застосунок на Python, вебсервер із фронтендом на React, і з’єднаєте їх через внутрішню мережу.
+Тобто ви запускатимете **кілька контейнерів** з різними речами, як-от базу даних, застосунок на Python, вебсервер із фронтендом на React, і з’єднаєте їх через внутрішню мережу.
Усі системи керування контейнерами (як Docker чи Kubernetes) мають ці мережеві можливості вбудовано.
## Контейнери і процеси { #containers-and-processes }
-Образ контейнера зазвичай містить у своїх метаданих типову програму або команду, яку слід виконати під час запуску контейнера, і параметри для цієї програми. Дуже схоже на те, що ви б виконали в командному рядку.
+**Образ контейнера** зазвичай містить у своїх метаданих типову програму або команду, яку слід виконати під час запуску **контейнера**, і параметри для цієї програми. Дуже схоже на те, що ви б виконали в командному рядку.
-Коли контейнер запускається, він виконає цю команду/програму (хоча ви можете перевизначити її і запустити іншу команду/програму).
+Коли **контейнер** запускається, він виконає цю команду/програму (хоча ви можете перевизначити її і запустити іншу команду/програму).
-Контейнер працює доти, доки працює головний процес (команда або програма).
+Контейнер працює доти, доки працює **головний процес** (команда або програма).
-Зазвичай контейнер має один процес, але також можливо запускати підпроцеси з головного процесу, і таким чином у вас може бути кілька процесів у тому самому контейнері.
+Зазвичай контейнер має **один процес**, але також можливо запускати підпроцеси з головного процесу, і таким чином у вас може бути **кілька процесів** у тому самому контейнері.
-Але неможливо мати запущений контейнер без принаймні одного запущеного процесу. Якщо головний процес зупиняється, контейнер зупиняється.
+Але неможливо мати запущений контейнер без **принаймні одного запущеного процесу**. Якщо головний процес зупиняється, контейнер зупиняється.
## Зібрати Docker-образ для FastAPI { #build-a-docker-image-for-fastapi }
Гаразд, зберімо щось зараз! 🚀
-Я покажу вам, як зібрати образ Docker для FastAPI з нуля на основі офіційного образу Python.
+Я покажу вам, як зібрати **образ Docker** для FastAPI **з нуля** на основі **офіційного образу Python**.
-Це те, що ви захочете робити у більшості випадків, наприклад:
+Це те, що ви захочете робити у **більшості випадків**, наприклад:
-* Використання Kubernetes або подібних інструментів
-* Під час запуску на Raspberry Pi
+* Використання **Kubernetes** або подібних інструментів
+* Під час запуску на **Raspberry Pi**
* Використання хмарного сервісу, який запустить для вас образ контейнера тощо
### Вимоги до пакетів { #package-requirements }
-Зазвичай ви маєте вимоги до пакетів для вашого застосунку в окремому файлі.
+Зазвичай ви маєте **вимоги до пакетів** для вашого застосунку в окремому файлі.
-Це залежить переважно від інструменту, який ви використовуєте для встановлення цих вимог.
+Це залежить переважно від інструменту, який ви використовуєте для **встановлення** цих вимог.
Найпоширеніший спосіб - мати файл `requirements.txt` з назвами пакетів і їхніми версіями, по одному на рядок.
@@ -132,7 +132,7 @@ Successfully installed fastapi pydantic
@@ -84,7 +85,7 @@
У такому разі ви можете вимкнути цю можливість у **FastAPI** параметром `separate_input_output_schemas=False`.
-/// info | Інформація
+/// note | Примітка
Підтримку `separate_input_output_schemas` додано у FastAPI `0.102.0`. 🤓
diff --git a/docs/uk/docs/index.md b/docs/uk/docs/index.md
index 2b770ff39..fe7d111d7 100644
--- a/docs/uk/docs/index.md
+++ b/docs/uk/docs/index.md
@@ -49,7 +49,7 @@ FastAPI - це сучасний, швидкий (високопродуктив
* **Простий**: спроєктований так, щоб бути простим у використанні та вивченні. Менше часу на читання документації.
* **Короткий**: мінімізує дублювання коду. Кілька можливостей з кожного оголошення параметра. Менше помилок.
* **Надійний**: ви отримуєте код, готовий до продакшну. З автоматичною інтерактивною документацією.
-* **Заснований на стандартах**: базується на (і повністю сумісний з) відкритими стандартами для API: [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (раніше відомий як Swagger) та [JSON Schema](https://json-schema.org/).
+* **Заснований на стандартах**: базується на (і повністю сумісний з) відкритими стандартами для API: [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (раніше відомий як Swagger) та [Схема JSON](https://json-schema.org/).
* оцінка на основі тестів, проведених внутрішньою командою розробників, що створює продакшн-застосунки.
@@ -105,47 +105,47 @@ FastAPI - це сучасний, швидкий (високопродуктив
«Я дуже часто використовую FastAPI останнім часом. Я насправді планую використовувати його для всіх ML-сервісів моєї команди в Microsoft. Деякі з них інтегруються до основного продукту Windows і деякі з продуктів Office».-
«Я дуже часто використовую FastAPI останнім часом. Я насправді планую використовувати його для всіх ML-сервісів моєї команди в Microsoft. Деякі з них інтегруються до основного продукту Windows і деяких продуктів Office».+
«Ми прийняли бібліотеку FastAPI, щоб запустити сервер REST, до якого можна надсилати запити для отримання прогнозів». [для Ludwig]-
«Netflix із задоволенням оголошує про випуск з відкритим кодом нашого фреймворку оркестрації керування кризами: Dispatch!» [побудовано з FastAPI]-
«Якщо хтось хоче створювати продакшн-API на Python, я дуже рекомендую FastAPI. Він чудово спроєктований, простий у використанні і дуже масштабований — він став ключовим компонентом у нашій стратегії розробки з пріоритетом API».-
«Якщо хтось хоче створювати продакшн-API на Python, я дуже рекомендую FastAPI. Він чудово спроєктований, простий у використанні і дуже масштабований - він став ключовим компонентом у нашій стратегії розробки з пріоритетом API».+
-Зверніть увагу, що це означає: «`one_person` — це **екземпляр** класу `Person`».
+Зверніть увагу, що це означає: «`one_person` - це **екземпляр** класу `Person`».
-Це не означає: «`one_person` — це **клас** з назвою `Person`».
+Це не означає: «`one_person` - це **клас** з назвою `Person`».
-## Pydantic моделі { #pydantic-models }
+## Моделі Pydantic { #pydantic-models }
[Pydantic](https://docs.pydantic.dev/) — це бібліотека Python для валідації даних.
@@ -295,7 +295,7 @@ def some_function(data: Any):
## Підказки типів з анотаціями метаданих { #type-hints-with-metadata-annotations }
-У Python також є можливість додавати **додаткові метадані** до цих підказок типів за допомогою `Annotated`.
+У Python також є можливість додавати **додаткові метадані** до цих підказок типів за допомогою `Annotated`.
Ви можете імпортувати `Annotated` з `typing`.
@@ -305,7 +305,7 @@ def some_function(data: Any):
Але ви можете використати це місце в `Annotated`, щоб надати **FastAPI** додаткові метадані про те, як ви хочете, щоб ваш застосунок поводився.
-Важливо пам’ятати, що **перший *параметр типу***, який ви передаєте в `Annotated`, — це **фактичний тип**. Решта — це лише метадані для інших інструментів.
+Важливо пам’ятати, що **перший *параметр типу***, який ви передаєте в `Annotated`, - це **фактичний тип**. Решта - це лише метадані для інших інструментів.
Наразі вам просто потрібно знати, що `Annotated` існує і що це стандартний Python. 😎
@@ -335,7 +335,7 @@ def some_function(data: Any):
* **Перевірки даних**: що надходять від кожного запиту:
* Генерування **автоматичних помилок**, що повертаються клієнту, коли дані недійсні.
* **Документування** API за допомогою OpenAPI:
- * який потім використовується для автоматичної інтерактивної документації користувальницьких інтерфейсів.
+ * що потім використовується автоматичними інтерактивними користувацькими інтерфейсами документації.
Все це може здатися абстрактним. Не хвилюйтеся. Ви побачите все це в дії в [Навчальний посібник - Посібник користувача](tutorial/index.md).
diff --git a/docs/uk/docs/tutorial/bigger-applications.md b/docs/uk/docs/tutorial/bigger-applications.md
index 3a31ece46..85a6c66a0 100644
--- a/docs/uk/docs/tutorial/bigger-applications.md
+++ b/docs/uk/docs/tutorial/bigger-applications.md
@@ -17,16 +17,16 @@
```
.
├── app
-│ ├── __init__.py
-│ ├── main.py
-│ ├── dependencies.py
-│ └── routers
-│ │ ├── __init__.py
-│ │ ├── items.py
-│ │ └── users.py
-│ └── internal
-│ ├── __init__.py
-│ └── admin.py
+│ ├── __init__.py
+│ ├── main.py
+│ ├── dependencies.py
+│ └── routers
+│ │ ├── __init__.py
+│ │ ├── items.py
+│ │ └── users.py
+│ └── internal
+│ ├── __init__.py
+│ └── admin.py
```
/// tip | Порада
@@ -384,9 +384,9 @@ from .routers.users import router
/// note | Примітка
-`users.router` містить `APIRouter` у файлі `app/routers/users.py`.
+`users.router` містить `APIRouter` всередині файлу `app/routers/users.py`.
-А `items.router` містить `APIRouter` у файлі `app/routers/items.py`.
+А `items.router` містить `APIRouter` всередині файлу `app/routers/items.py`.
///
@@ -396,9 +396,9 @@ from .routers.users import router
/// note | Технічні деталі
-Фактично, всередині для кожної *операції шляху*, оголошеної в `APIRouter`, буде створена окрема *операція шляху*.
+FastAPI зберігає оригінальний `APIRouter` і його `APIRoute` активними після включення router'а до основного застосунку.
-Тобто за лаштунками все працюватиме так, ніби це один і той самий застосунок.
+Це означає, що користувацькі підкласи `APIRouter` і `APIRoute` і надалі братимуть участь після включення router'а.
///
@@ -406,7 +406,7 @@ from .routers.users import router
Вам не потрібно перейматися продуктивністю під час включення router'ів.
-Це займе мікросекунди і відбуватиметься лише під час запуску.
+Це спроєктовано як легковагове рішення і не додає накладних витрат до кожного запиту.
Тож це не вплине на продуктивність. ⚡
@@ -453,7 +453,7 @@ from .routers.users import router
/// note | Дуже технічні деталі
-Примітка: це дуже технічна деталь, яку ви, ймовірно, можете просто пропустити.
+**Примітка**: це дуже технічна деталь, яку ви, ймовірно, можете **просто пропустити**.
---
@@ -461,7 +461,7 @@ from .routers.users import router
Це тому, що ми хочемо включати їхні *операції шляху* в схему OpenAPI та інтерфейси користувача.
-Оскільки ми не можемо просто ізолювати їх і «змонтувати» незалежно від решти, *операції шляху* «клонуються» (створюються заново), а не включаються безпосередньо.
+FastAPI зберігає оригінальні router'и та операції шляху активними й поєднує префікси router'ів, залежності, мітки, відповіді та інші метадані під час обробки запитів і генерації OpenAPI.
///
@@ -518,7 +518,7 @@ $ fastapi dev
## Включайте той самий router кілька разів з різними `prefix` { #include-the-same-router-multiple-times-with-different-prefix }
-Ви також можете використовувати `.include_router()` кілька разів з одним і тим самим router'ом, але з різними префіксами.
+Ви також можете використовувати `.include_router()` кілька разів з *тим самим* router'ом, але з різними префіксами.
Це може бути корисно, наприклад, щоб публікувати той самий API під різними префіксами, наприклад `/api/v1` і `/api/latest`.
@@ -532,4 +532,16 @@ $ fastapi dev
router.include_router(other_router)
```
-Переконайтеся, що ви робите це до включення `router` в застосунок `FastAPI`, щоб *операції шляху* з `other_router` також були включені.
+Ви можете зробити це до або після включення `router` у застосунок `FastAPI`. FastAPI все одно включить *операції шляху* з `other_router` у маршрутизацію та OpenAPI.
+
+Те саме стосується *операцій шляху*, доданих пізніше до router'ів. Вони також будуть видимі через попереднє включення.
+
+/// warning | Технічні деталі
+
+Уникайте прямої мутації `router.routes` після включення router'а. FastAPI розглядає включення router'а як «живе», тому оригінальний router і його маршрути залишаються частиною маршрутизації та генерації OpenAPI.
+
+Використовуйте задокументовані API, такі як декоратори *операцій шляху* і `.include_router()`, щоб додавати маршрути та router'и.
+
+Сприймайте `router.routes` як нижчорівневе дерево маршрутів, яке може містити визначення маршрутів і включені router'и, і уникайте покладатися на нього як на плаский список кінцевих *операцій шляху*.
+
+///
diff --git a/docs/uk/docs/tutorial/body-multiple-params.md b/docs/uk/docs/tutorial/body-multiple-params.md
index a0db2b186..8658e4a9b 100644
--- a/docs/uk/docs/tutorial/body-multiple-params.md
+++ b/docs/uk/docs/tutorial/body-multiple-params.md
@@ -111,7 +111,7 @@ q: str | None = None
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info | Інформація
+/// note | Примітка
`Body` також має всі ті самі додаткові параметри валідації та метаданих, що й `Query`, `Path` та інші, які ви побачите пізніше.
@@ -126,7 +126,7 @@ q: str | None = None
Але якщо ви хочете, щоб він очікував JSON з ключем `item`, а всередині нього - вміст моделі, як це відбувається, коли ви оголошуєте додаткові параметри тіла, ви можете використати спеціальний параметр `Body` - `embed`:
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
як у прикладі:
diff --git a/docs/uk/docs/tutorial/body-nested-models.md b/docs/uk/docs/tutorial/body-nested-models.md
index 97fea36dc..c1daaf671 100644
--- a/docs/uk/docs/tutorial/body-nested-models.md
+++ b/docs/uk/docs/tutorial/body-nested-models.md
@@ -27,17 +27,17 @@ my_list: list[str]
Використовуйте той самий стандартний синтаксис для атрибутів моделей з внутрішніми типами.
-Отже, у нашому прикладі, ми можемо зробити `tags` саме «списком рядків»:
+Отже, у нашому прикладі, ми можемо зробити `tags` саме «списком строк»:
{* ../../docs_src/body_nested_models/tutorial002_py310.py hl[12] *}
## Типи множин { #set-types }
-Але потім ми подумали, що теги не повинні повторюватися, вони, ймовірно, повинні бути унікальними рядками.
+Але потім ми подумали, що теги не повинні повторюватися, вони, ймовірно, повинні бути унікальними строками.
-І Python має спеціальний тип даних для множин унікальних елементів — це `set`.
+І Python має спеціальний тип даних для множин унікальних елементів - це `set`.
-Тому ми можемо оголосити `tags` як множину рядків:
+Тому ми можемо оголосити `tags` як множину строк:
{* ../../docs_src/body_nested_models/tutorial003_py310.py hl[12] *}
@@ -45,7 +45,7 @@ my_list: list[str]
І коли ви будете виводити ці дані, навіть якщо джерело містить дублікати, вони будуть виведені як множина унікальних елементів.
-І це буде анотовано/документовано відповідно.
+І це буде анотовано / документовано відповідно.
## Вкладені моделі { #nested-models }
@@ -69,7 +69,7 @@ my_list: list[str]
{* ../../docs_src/body_nested_models/tutorial004_py310.py hl[18] *}
-Це означатиме, що **FastAPI** очікуватиме тіло запиту такого вигляду:
+Це означатиме, що **FastAPI** очікуватиме тіло, подібне до:
```JSON
{
@@ -85,7 +85,7 @@ my_list: list[str]
}
```
-Завдяки такій декларації у **FastAPI** ви отримуєте:
+Знову ж, лише завдяки такому оголошенню, з **FastAPI** ви отримуєте:
* Підтримку в редакторі (автозавершення тощо), навіть для вкладених моделей
* Конвертацію даних
@@ -94,23 +94,23 @@ my_list: list[str]
## Спеціальні типи та валідація { #special-types-and-validation }
-Окрім звичайних типів, таких як `str`, `int`, `float`, та ін. ви можете використовувати складніші типи, які наслідують `str`.
+Окрім звичайних одиничних типів, таких як `str`, `int`, `float`, та ін. ви можете використовувати складніші одиничні типи, які наслідують `str`.
Щоб побачити всі доступні варіанти, ознайомтеся з [Оглядом типів у Pydantic](https://docs.pydantic.dev/latest/concepts/types/). Деякі приклади будуть у наступному розділі.
-Наприклад, у моделі `Image` є поле `url`, тому ми можемо оголосити його як `HttpUrl` від Pydantic замість `str`:
+Наприклад, оскільки в моделі `Image` є поле `url`, ми можемо оголосити його як екземпляр `HttpUrl` від Pydantic замість `str`:
{* ../../docs_src/body_nested_models/tutorial005_py310.py hl[2,8] *}
-Рядок буде перевірено як дійсну URL-адресу і задокументовано в JSON Schema / OpenAPI як URL.
+Строку буде перевірено як дійсну URL-адресу і задокументовано в Схемі JSON / OpenAPI як таку.
## Атрибути зі списками підмоделей { #attributes-with-lists-of-submodels }
-У Pydantic ви можете використовувати моделі як підтипи для `list`, `set` тощо:
+У Pydantic ви також можете використовувати моделі як підтипи для `list`, `set` тощо:
{* ../../docs_src/body_nested_models/tutorial006_py310.py hl[18] *}
-Це означає, що **FastAPI** буде очікувати (конвертувати, валідувати, документувати тощо) JSON тіло запиту у вигляді:
+Це очікуватиме (конвертуватиме, валідуватиме, документуватиме тощо) тіло JSON у вигляді:
```JSON hl_lines="11"
{
@@ -136,7 +136,7 @@ my_list: list[str]
}
```
-/// info | Інформація
+/// note | Примітка
Зверніть увагу, що тепер ключ `images` містить список об'єктів зображень.
@@ -148,63 +148,63 @@ my_list: list[str]
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info | Інформація
+/// note | Примітка
-Зверніть увагу, що в моделі `Offer` є список `Item`ів, які, своєю чергою, можуть мати необов'язковий список `Image`ів.
+Зверніть увагу, що `Offer` має список `Item`ів, які, своєю чергою, мають необов'язковий список `Image`ів
///
## Тіла запитів, що складаються зі списків { #bodies-of-pure-lists }
-Якщо верхній рівень JSON тіла, яке ви очікуєте, є JSON `масивом` (у Python — `list`), ви можете оголосити тип у параметрі функції, як і в моделях Pydantic:
+Якщо значення верхнього рівня JSON тіла, яке ви очікуєте, є JSON `array` (Python `list`), ви можете оголосити тип у параметрі функції так само, як у моделях Pydantic:
```Python
images: list[Image]
```
-наприклад:
+як у:
{* ../../docs_src/body_nested_models/tutorial008_py310.py hl[13] *}
## Підтримка в редакторі всюди { #editor-support-everywhere }
-Ви отримаєте підтримку в редакторі всюди.
+І ви отримаєте підтримку в редакторі всюди.
Навіть для елементів у списках:
-Ви не змогли б отримати таку підтримку в редакторі, якби працювали напряму зі `dict`, а не з моделями Pydantic.
+Ви не змогли б отримати таку підтримку в редакторі, якби працювали напряму зі `dict`, а не з моделями Pydantic.
-Але вам не потрібно турбуватися про це: вхідні dict'и автоматично конвертуються, а вихідні дані автоматично перетворюються в JSON.
+Але вам також не потрібно турбуватися про них: вхідні словники автоматично конвертуються, а вихідні дані автоматично перетворюються в JSON.
## Тіла з довільними `dict` { #bodies-of-arbitrary-dicts }
Ви також можете оголосити тіло як `dict` з ключами одного типу та значеннями іншого типу.
-Це корисно, якщо ви не знаєте наперед, які імена полів будуть дійсними (як у випадку з моделями Pydantic).
+Таким чином, вам не потрібно наперед знати, які імена полів/атрибутів є дійсними (як це було б у випадку з моделями Pydantic).
Це буде корисно, якщо ви хочете приймати ключі, які заздалегідь невідомі.
---
-Це також зручно, якщо ви хочете мати ключі іншого типу (наприклад, `int`).
+Інший корисний випадок - коли ви хочете мати ключі іншого типу (наприклад, `int`).
-Ось що ми розглянемо далі.
+Ось що ми розглянемо тут.
-У цьому випадку ви можете приймати будь-який `dict`, якщо його ключі — це `int`, а значення — `float`:
+У цьому випадку ви можете приймати будь-який `dict`, якщо він має ключі `int` зі значеннями `float`:
{* ../../docs_src/body_nested_models/tutorial009_py310.py hl[7] *}
/// tip | Порада
-Майте на увазі, що в JSON тілі ключі можуть бути лише рядками (`str`).
+Майте на увазі, що JSON підтримує лише `str` як ключі.
-Але Pydantic автоматично конвертує дані.
+Але Pydantic має автоматичну конвертацію даних.
-Це означає, що навіть якщо клієнти вашого API надсилатимуть ключі у вигляді рядків, якщо вони містять цілі числа, Pydantic конвертує їх і проведе валідацію.
+Це означає, що навіть якщо клієнти вашого API можуть надсилати лише строки як ключі, якщо ці строки містять цілі числа, Pydantic конвертує їх і проведе валідацію.
-Тобто `dict`, який ви отримаєте як `weights`, матиме ключі типу `int` та значення типу `float`.
+І `dict`, який ви отримаєте як `weights`, фактично матиме ключі типу `int` та значення типу `float`.
///
@@ -212,10 +212,10 @@ images: list[Image]
З **FastAPI** ви маєте максимальну гнучкість завдяки моделям Pydantic, зберігаючи при цьому код простим, коротким та елегантним.
-А також отримуєте всі переваги:
+Але з усіма перевагами:
-* Підтримка в редакторі (автодоповнення всюди!)
-* Конвертація даних (парсинг/серіалізація)
+* Підтримка в редакторі (автозавершення всюди!)
+* Конвертація даних (також відома як парсинг / серіалізація)
* Валідація даних
* Документація схем
-* Автоматичне створення документації
+* Автоматична документація
diff --git a/docs/uk/docs/tutorial/body.md b/docs/uk/docs/tutorial/body.md
index 91c4b4252..64d9af95e 100644
--- a/docs/uk/docs/tutorial/body.md
+++ b/docs/uk/docs/tutorial/body.md
@@ -4,11 +4,11 @@
Тіло **запиту** - це дані, надіслані клієнтом до вашого API. Тіло **відповіді** - це дані, які ваш API надсилає клієнту.
-Ваш API майже завжди має надсилати тіло **відповіді**. Але клієнтам не обов’язково потрібно постійно надсилати тіла **запитів** — інколи вони лише запитують шлях, можливо з деякими параметрами запиту, але не надсилають тіло.
+Ваш API майже завжди має надсилати тіло **відповіді**. Але клієнтам не обов’язково потрібно постійно надсилати тіла **запитів** - інколи вони лише запитують шлях, можливо з деякими параметрами запиту, але не надсилають тіло.
Щоб оголосити тіло **запиту**, ви використовуєте [Pydantic](https://docs.pydantic.dev/) моделі з усією їх потужністю та перевагами.
-/// info | Інформація
+/// note | Примітка
Щоб надіслати дані, ви повинні використовувати один із: `POST` (більш поширений), `PUT`, `DELETE` або `PATCH`.
diff --git a/docs/uk/docs/tutorial/cookie-param-models.md b/docs/uk/docs/tutorial/cookie-param-models.md
index dab57c536..add562dfd 100644
--- a/docs/uk/docs/tutorial/cookie-param-models.md
+++ b/docs/uk/docs/tutorial/cookie-param-models.md
@@ -32,13 +32,13 @@
get операція
+* використовуючи операцію get
-/// info | `@decorator` Інформація
+/// note | `@decorator` Інформація
Синтаксис `@something` у Python називається «декоратором».
@@ -349,7 +341,7 @@ https://example.com/items/foo
* `@app.patch()`
* `@app.trace()`
-/// tip
+/// tip | Порада
Ви можете використовувати кожну операцію (HTTP-метод) як забажаєте.
@@ -383,7 +375,7 @@ https://example.com/items/foo
{* ../../docs_src/first_steps/tutorial003_py310.py hl[7] *}
-/// note
+/// note | Примітка
Якщо ви не знаєте різницю, подивіться [Асинхронність: *«Поспішаєте?»*](../async.md#in-a-hurry).
@@ -397,7 +389,7 @@ https://example.com/items/foo
Також можна повернути моделі Pydantic (про це ви дізнаєтесь пізніше).
-Існує багато інших обʼєктів і моделей, які будуть автоматично конвертовані в JSON (зокрема ORM тощо). Спробуйте використати свої улюблені — велика ймовірність, що вони вже підтримуються.
+Існує багато інших обʼєктів і моделей, які будуть автоматично конвертовані в JSON (зокрема ORM тощо). Спробуйте використати свої улюблені - велика ймовірність, що вони вже підтримуються.
### Крок 6: розгорніть його { #step-6-deploy-it }
@@ -411,11 +403,11 @@ https://example.com/items/foo
Він переносить той самий **досвід розробника** зі створення застосунків на FastAPI на **розгортання** їх у хмарі. 🎉
-FastAPI Cloud — основний спонсор і джерело фінансування для open source проєктів *FastAPI and friends*. ✨
+FastAPI Cloud - основний спонсор і джерело фінансування для open source проєктів *FastAPI and friends*. ✨
#### Розгортання в інших хмарних провайдерах { #deploy-to-other-cloud-providers }
-FastAPI — це open source і базується на стандартах. Ви можете розгортати FastAPI-застосунки у будь-якого хмарного провайдера на ваш вибір.
+FastAPI - це open source і базується на стандартах. Ви можете розгортати FastAPI-застосунки у будь-якого хмарного провайдера на ваш вибір.
Дотримуйтеся інструкцій вашого хмарного провайдера, щоб розгорнути FastAPI-застосунки з їхньою допомогою. 🤓
diff --git a/docs/uk/docs/tutorial/frontend.md b/docs/uk/docs/tutorial/frontend.md
new file mode 100644
index 000000000..c85e6693e
--- /dev/null
+++ b/docs/uk/docs/tutorial/frontend.md
@@ -0,0 +1,133 @@
+# Фронтенд { #frontend }
+
+Ви можете обслуговувати статичні фронтенд-застосунки за допомогою `app.frontend()` (або `router.frontend()`).
+
+Це корисно для фронтенд-інструментів, які генерують статичні файли, як-от React з Vite, TanStack Router, Astro, Vue, Svelte, Angular, Solid та інші.
+
+З такими інструментами зазвичай є крок, який збирає фронтенд, командою на кшталт:
+
+```bash
+npm run build
+```
+
+Це згенерує директорію на кшталт `./dist/` з вашими фронтенд-файлами.
+
+Ви можете використати `app.frontend()`, щоб обслуговувати цю директорію відповідно до конвенцій, потрібних цим фронтенд-фреймворкам.
+
+**FastAPI** спочатку перевіряє *операції шляху*. Фронтенд-файли перевіряються лише тоді, коли жоден звичайний маршрут не збігся, тому ваш API не буде зачеплено.
+
+## Обслуговування фронтенду { #serve-a-frontend }
+
+Після збірки вашого фронтенду, наприклад за допомогою `npm run build`, помістіть згенеровані файли в директорію, наприклад `dist`.
+
+Структура вашого проєкту може виглядати так:
+
+```text
+.
+├── pyproject.toml
+├── app
+│ ├── __init__.py
+│ └── main.py
+└── dist
+ ├── index.html
+ └── assets
+ └── app.js
+```
+
+Потім обслуговуйте її за допомогою `app.frontend()`:
+
+{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
+
+З цим запит до `/assets/app.js` може обслуговувати `dist/assets/app.js`.
+
+Якщо у вас також є *операція шляху* **FastAPI**, *операція шляху* має пріоритет.
+
+## Маршрутизація на боці клієнта { #client-side-routing }
+
+Багато фронтенд-застосунків, включно з **односторінковими застосунками** (SPA), використовують маршрутизацію на боці клієнта. Шлях на кшталт `/dashboard/settings` може не бути реальним файлом, але фреймворк подбає про його обробку.
+
+Тому, якщо звертатися до цієї URL-адреси напряму (замість навігації через застосунок), бекенд має обслуговувати фронтенд-застосунок з `index.html`, щоб фронтенд-фреймворк потім міг обробити маршрутизацію на боці клієнта.
+
+Для цього використовуйте `fallback="index.html"`:
+
+{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *}
+
+**FastAPI** використовує цей fallback лише для запитів `GET` і `HEAD`, які виглядають як навігація браузера. Відсутні файли, як-от JavaScript, CSS і зображення, все ще повертають `404`.
+
+Запити з іншими методами, як-от `POST` або `PUT`, до шляхів, що збігаються лише з frontend fallback, також повертають `404`. Звичайні *операції шляху* **FastAPI** все ще мають вищий пріоритет, ніж фронтенд-маршрути.
+
+/// tip | Порада
+
+За замовчуванням `fallback` має значення `fallback="auto"`. У більшості випадків вам не потрібно вказувати `fallback`. Деталі читайте нижче.
+
+///
+
+Саме це потрібно для багатьох фронтенд-застосунків, які використовують маршрутизацію на боці клієнта, наприклад React з TanStack Router, Vue, Angular, SvelteKit або Solid.
+
+## Користувацька сторінка 404 { #custom-404-page }
+
+Ви також можете обслуговувати статичну сторінку `404.html` для відсутніх фронтенд-шляхів:
+
+{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *}
+
+Ця відповідь зберігає код статусу `404`.
+
+У цьому випадку **FastAPI** не буде обслуговувати `index.html` для відсутніх фронтенд-шляхів. Натомість він поверне файл `404.html`.
+
+/// tip | Порада
+
+За замовчуванням `fallback` має значення `fallback="auto"`. З ним, якщо файл `404.html` знайдено, він буде використаний як fallback автоматично.
+
+Тому зазвичай ви можете не вказувати аргумент `fallback`.
+
+///
+
+Це корисно з фронтенд-інструментами, які генерують статичні HTML-файли для кожної сторінки, як-от Astro.
+
+## Автоматичний fallback { #fallback-auto }
+
+За замовчуванням `app.frontend()` використовує `fallback="auto"`.
+
+Якщо в директорії фронтенду є файл `404.html`, відсутні фронтенд-шляхи обслуговують цей файл з кодом статусу `404`.
+
+Інакше, якщо є файл `index.html`, відсутні шляхи навігації браузера обслуговують `index.html`, що й очікують багато фронтенд-застосунків з маршрутизацією на боці клієнта.
+
+Отже, у більшості випадків ви можете використовувати `app.frontend("/", directory="dist")` без вказання аргументу `fallback`.
+
+{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
+
+## Вимкнення fallback { #disable-fallback }
+
+Якщо ви не хочете обслуговувати fallback-файл для відсутніх фронтенд-шляхів, використовуйте `fallback=None`:
+
+{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *}
+
+Тоді відсутні фронтенд-шляхи повертають звичайний `404`.
+
+## Перевірка директорії { #check-directory }
+
+За замовчуванням `app.frontend()` перевіряє, що директорія існує, коли застосунок створюється.
+
+Це допомагає виявити помилки конфігурації завчасно. Наприклад, якщо директорія вихідних файлів збірки фронтенду відсутня, **FastAPI** викличе помилку під час запуску.
+
+Якщо ваші фронтенд-файли створюються пізніше, наприклад окремим кроком збірки після створення об'єкта застосунку, встановіть `check_dir=False`:
+
+{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *}
+
+З `check_dir=False` **FastAPI** не перевірятиме директорію під час створення застосунку. Якщо налаштована директорія все ще відсутня під час обробки запиту, **FastAPI** викличе помилку тоді.
+
+## Використання з `APIRouter` { #use-it-with-apirouter }
+
+Ви також можете додати фронтенд-файли до `APIRouter` і включити його з префіксом:
+
+{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *}
+
+У цьому прикладі фронтенд-шляхи обслуговуються під `/app`.
+
+Будь-які звичайні *операції шляху* в застосунку все ще матимуть перевагу, включно з операціями в інших роутерах.
+
+## Лише статичний результат збірки { #static-build-output-only }
+
+`app.frontend()` обслуговує файли, вже згенеровані вашою фронтенд-збіркою.
+
+Він не виконує рендеринг на боці сервера. Він призначений для фронтенд-фреймворків, які генерують статичні файли, а не для фреймворків, що потребують динамічного рендерингу на сервері для кожного запиту.
diff --git a/docs/uk/docs/tutorial/handling-errors.md b/docs/uk/docs/tutorial/handling-errors.md
index 262efa0e0..381e65cc0 100644
--- a/docs/uk/docs/tutorial/handling-errors.md
+++ b/docs/uk/docs/tutorial/handling-errors.md
@@ -33,7 +33,7 @@
Оскільки це помилка Python, ви не `return` її, а `raise` її.
-Це також означає, що якщо ви перебуваєте всередині допоміжної функції, яку викликаєте всередині своєї *функції операції шляху*, і там згенеруєте `HTTPException` всередині цієї допоміжної функції, то решта коду в *функції операції шляху* не буде виконана. Запит одразу завершиться, і HTTP-помилка з `HTTPException` буде надіслана клієнту.
+Це також означає, що якщо ви перебваєте всередині допоміжної функції, яку викликаєте всередині своєї *функції операції шляху*, і там згенеруєте `HTTPException` всередині цієї допоміжної функції, то решта коду в *функції операції шляху* не буде виконана. Запит одразу завершиться, і HTTP-помилка з `HTTPException` буде надіслана клієнту.
Перевага генерації виключення замість повернення значення стане більш очевидною в розділі про залежності та безпеку.
diff --git a/docs/uk/docs/tutorial/index.md b/docs/uk/docs/tutorial/index.md
index 629b71dec..f89656236 100644
--- a/docs/uk/docs/tutorial/index.md
+++ b/docs/uk/docs/tutorial/index.md
@@ -54,7 +54,7 @@ $ fastapi dev
**ДУЖЕ радимо** написати або скопіювати код, відредагувати його та запустити локально.
-Використання його у своєму редакторі – це те, що дійсно показує вам переваги FastAPI, бачите, як мало коду вам потрібно написати, всі перевірки типів, автозаповнення тощо.
+Використання його у своєму редакторі - це те, що дійсно показує вам переваги FastAPI, бачите, як мало коду вам потрібно написати, всі перевірки типів, автозаповнення тощо.
---
@@ -86,7 +86,7 @@ $ pip install "fastapi[standard]"
/// tip | Порада
-FastAPI має [офіційне розширення для VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (та Cursor), яке надає багато можливостей, включно з переглядачем операцій шляху, пошуком операцій шляху, навігацією CodeLens у тестах (перехід до визначення з тестів), а також розгортанням і журналами FastAPI Cloud — усе безпосередньо з вашого редактора.
+FastAPI має [офіційне розширення для VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (та Cursor), яке надає багато можливостей, включно з переглядачем операцій шляху, пошуком операцій шляху, навігацією CodeLens у тестах (перехід до визначення з тестів), а також розгортанням і журналами FastAPI Cloud - усе безпосередньо з вашого редактора.
///
diff --git a/docs/uk/docs/tutorial/metadata.md b/docs/uk/docs/tutorial/metadata.md
index ee1fdaf6d..fd7a13b72 100644
--- a/docs/uk/docs/tutorial/metadata.md
+++ b/docs/uk/docs/tutorial/metadata.md
@@ -1,6 +1,6 @@
# Метадані та URL-адреси документації { #metadata-and-docs-urls }
-Ви можете налаштувати кілька конфігурацій метаданих у Вашому додатку **FastAPI**.
+Ви можете налаштувати кілька конфігурацій метаданих у вашому додатку **FastAPI**.
## Метадані для API { #metadata-for-api }
@@ -11,7 +11,7 @@
| `title` | `str` | Назва API. |
| `summary` | `str` | Короткий підсумок API. Доступно з OpenAPI 3.1.0, FastAPI 0.99.0. |
| `description` | `str` | Короткий опис API. Може використовувати Markdown. |
-| `version` | `string` | Версія API. Це версія Вашого додатка, а не OpenAPI. Наприклад, `2.5.0`. |
+| `version` | `str` | Версія API. Це версія вашого додатка, а не OpenAPI. Наприклад, `2.5.0`. |
| `terms_of_service` | `str` | URL до умов використання API. Якщо вказано, має бути у форматі URL. |
| `contact` | `dict` | Інформація для контакту з опублікованим API. Може містити кілька полів. contact поля| Параметр | Тип | Опис |
|---|---|---|
name | str | Ідентифікаційне ім'я контактної особи або організації. |
url | str | URL, що вказує на контактну інформацію. МАЄ бути у форматі URL. |
email | str | Адреса електронної пошти контактної особи або організації. МАЄ бути у форматі адреси електронної пошти. |
license_info поля| Параметр | Тип | Опис |
|---|---|---|
name | str | ОБОВ'ЯЗКОВО (якщо встановлено license_info). Назва ліцензії для API. |
identifier | str | Ліцензійний вираз за [SPDX](https://spdx.org/licenses/) для API. Поле identifier взаємовиключне з полем url. Доступно з OpenAPI 3.1.0, FastAPI 0.99.0. |
url | str | URL до ліцензії, яка використовується для API. МАЄ бути у форматі URL. |
@@ -96,13 +96,13 @@
За замовчуванням схема OpenAPI надається за адресою `/openapi.json`.
-Але Ви можете налаштувати це за допомогою параметра `openapi_url`.
+Але ви можете налаштувати це за допомогою параметра `openapi_url`.
Наприклад, щоб налаштувати його на `/api/v1/openapi.json`:
{* ../../docs_src/metadata/tutorial002_py310.py hl[3] *}
-Якщо Ви хочете повністю вимкнути схему OpenAPI, Ви можете встановити `openapi_url=None`, це також вимкне інтерфейси документації, які її використовують.
+Якщо ви хочете повністю вимкнути схему OpenAPI, ви можете встановити `openapi_url=None`, це також вимкне інтерфейси документації, які її використовують.
## URL-адреси документації { #docs-urls }
diff --git a/docs/uk/docs/tutorial/path-operation-configuration.md b/docs/uk/docs/tutorial/path-operation-configuration.md
index 292066c1f..151e79d1e 100644
--- a/docs/uk/docs/tutorial/path-operation-configuration.md
+++ b/docs/uk/docs/tutorial/path-operation-configuration.md
@@ -12,7 +12,7 @@
Ви можете визначити (HTTP) `status_code`, який буде використано у відповіді вашої «операції шляху».
-Можна передати безпосередньо цілий код, наприклад `404`.
+Ви можете передати безпосередньо код `int`, наприклад `404`.
Якщо ви не пам'ятаєте призначення числових кодів, скористайтеся скороченими константами в `status`:
@@ -24,7 +24,7 @@
Ви також можете використати `from starlette import status`.
-FastAPI надає той самий `starlette.status` як `fastapi.status` для вашої зручності як розробника. Але він походить безпосередньо зі Starlette.
+**FastAPI** надає той самий `starlette.status` як `fastapi.status` для вашої зручності як розробника. Але він походить безпосередньо зі Starlette.
///
@@ -40,11 +40,11 @@ FastAPI надає той самий `starlette.status` як `fastapi.status` д
### Мітки з переліками { #tags-with-enums }
-У великому застосунку ви можете накопичити багато міток і захочете переконатися, що завжди використовуєте ту саму мітку для пов'язаних «операцій шляху».
+У великому застосунку ви можете накопичити **багато міток** і захочете переконатися, що завжди використовуєте **ту саму мітку** для пов'язаних «операцій шляху».
У таких випадках має сенс зберігати мітки в `Enum`.
-FastAPI підтримує це так само, як і зі звичайними строками:
+**FastAPI** підтримує це так само, як і зі звичайними строками:
{* ../../docs_src/path_operation_configuration/tutorial002b_py310.py hl[1,8:10,13,18] *}
@@ -56,7 +56,7 @@ FastAPI підтримує це так само, як і зі звичайним
## Опис зі строки документації { #description-from-docstring }
-Оскільки описи зазвичай довгі та займають кілька рядків, ви можете оголосити опис «операції шляху» у строці документації функції, і FastAPI прочитає його звідти.
+Оскільки описи зазвичай довгі та займають кілька рядків, ви можете оголосити опис «операції шляху» у строці документації функції, і **FastAPI** прочитає його звідти.
Ви можете писати [Markdown](https://en.wikipedia.org/wiki/Markdown) у строці документації, його буде інтерпретовано та показано коректно (з урахуванням відступів у строці документації).
@@ -72,17 +72,17 @@ FastAPI підтримує це так само, як і зі звичайним
{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[18] *}
-/// info | Інформація
+/// note | Примітка
Зверніть увагу, що `response_description` стосується саме відповіді, а `description` стосується «операції шляху» загалом.
///
-/// check | Перевірте
+/// tip | Порада
OpenAPI визначає, що кожна «операція шляху» потребує опису відповіді.
-Тому, якщо ви його не надасте, FastAPI автоматично згенерує «Successful response».
+Тому, якщо ви його не надасте, **FastAPI** автоматично згенерує «Successful response».
///
@@ -98,7 +98,7 @@ OpenAPI визначає, що кожна «операція шляху» пот
-Подивіться, як виглядають застарілі та незастарілі «операції шляху»:
+Перевірте, як виглядають застарілі та незастарілі «операції шляху»:
diff --git a/docs/uk/docs/tutorial/path-params-numeric-validations.md b/docs/uk/docs/tutorial/path-params-numeric-validations.md
index 39397a3b1..8320ee8c4 100644
--- a/docs/uk/docs/tutorial/path-params-numeric-validations.md
+++ b/docs/uk/docs/tutorial/path-params-numeric-validations.md
@@ -8,7 +8,7 @@
{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *}
-/// info | Інформація
+/// note | Примітка
FastAPI додав підтримку `Annotated` (і почав рекомендувати його використання) у версії 0.95.0.
@@ -131,7 +131,7 @@ Python нічого не зробить із цією `*`, але розпізн
* `lt`: `l`ess `t`han
* `le`: `l`ess than or `e`qual
-/// info | Інформація
+/// note | Примітка
`Query`, `Path` та інші класи, які ви побачите пізніше, є підкласами спільного класу `Param`.
diff --git a/docs/uk/docs/tutorial/path-params.md b/docs/uk/docs/tutorial/path-params.md
index eb05a4412..12fdecae3 100644
--- a/docs/uk/docs/tutorial/path-params.md
+++ b/docs/uk/docs/tutorial/path-params.md
@@ -20,7 +20,7 @@
У цьому випадку `item_id` оголошено як `int`.
-/// check | Перевірте
+/// tip | Порада
Це дасть вам підтримку редактора всередині функції з перевірками помилок, автодоповненням тощо.
@@ -34,7 +34,7 @@
{"item_id":3}
```
-/// check | Перевірте
+/// tip | Порада
Зверніть увагу, що значення, яке отримала (і повернула) ваша функція, — це `3`, як Python `int`, а не рядок `"3"`.
@@ -66,7 +66,7 @@
Та сама помилка з’явиться, якщо ви передасте `float` замість `int`, як у: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2)
-/// check | Перевірте
+/// tip | Порада
Отже, з тим самим оголошенням типу в Python **FastAPI** надає вам валідацію даних.
@@ -82,7 +82,7 @@
-/// check | Перевірте
+/// tip | Порада
Знову ж таки, лише з тим самим оголошенням типу в Python **FastAPI** надає вам автоматичну, інтерактивну документацію (з інтеграцією Swagger UI).
diff --git a/docs/uk/docs/tutorial/query-params-str-validations.md b/docs/uk/docs/tutorial/query-params-str-validations.md
index afe86d482..610e83f41 100644
--- a/docs/uk/docs/tutorial/query-params-str-validations.md
+++ b/docs/uk/docs/tutorial/query-params-str-validations.md
@@ -1,4 +1,4 @@
-# Query параметри та валідація рядків { #query-parameters-and-string-validations }
+# Параметри запиту та валідація строк { #query-parameters-and-string-validations }
**FastAPI** дозволяє оголошувати додаткову інформацію та виконувати валідацію для ваших параметрів.
@@ -6,7 +6,7 @@
{* ../../docs_src/query_params_str_validations/tutorial001_py310.py hl[7] *}
-Query параметр `q` має тип `str | None`, що означає, що він має тип `str`, але також може бути `None`, і справді, значення за замовчуванням — `None`, тож FastAPI знатиме, що він не є обов'язковим.
+Параметр запиту `q` має тип `str | None`, що означає, що він має тип `str`, але також може бути `None`, і справді, значення за замовчуванням - `None`, тож FastAPI знатиме, що він не є обов'язковим.
/// note | Примітка
@@ -18,7 +18,7 @@ FastAPI знатиме, що значення `q` не є обов’язков
## Додаткова валідація { #additional-validation }
-Ми хочемо, щоб навіть якщо `q` є необов’язковим, коли його передають, його довжина не перевищувала 50 символів.
+Ми забезпечимо, що навіть якщо `q` є необов’язковим, коли його передають, **його довжина не перевищувала 50 символів**.
### Імпорт `Query` та `Annotated` { #import-query-and-annotated }
@@ -29,7 +29,7 @@ FastAPI знатиме, що значення `q` не є обов’язков
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | Інформація
+/// note | Примітка
FastAPI додав підтримку `Annotated` (і почав рекомендувати його) у версії 0.95.0.
@@ -45,7 +45,7 @@ FastAPI додав підтримку `Annotated` (і почав рекомен
Зараз саме час використати його разом із FastAPI. 🚀
-Раніше ми мали таку анотацію типу:
+Ми мали таку анотацію типу:
```Python
q: str | None = None
@@ -57,31 +57,31 @@ q: str | None = None
q: Annotated[str | None] = None
```
-Обидві ці версії означають одне й те саме: `q` — це параметр, який може бути `str` або `None`, і за замовчуванням має значення `None`.
+Обидві ці версії означають одне й те саме: `q` - це параметр, який може бути `str` або `None`, і за замовчуванням має значення `None`.
А тепер переходимо до цікавого! 🎉
## Додавання `Query` до `Annotated` у параметр `q` { #add-query-to-annotated-in-the-q-parameter }
-Тепер, коли у нас є `Annotated`, де ми можемо додавати додаткову інформацію (у цьому випадку — додаткову валідацію), додамо `Query` всередину `Annotated` і встановимо параметр `max_length` у `50`:
+Тепер, коли у нас є `Annotated`, де ми можемо додавати додаткову інформацію (у цьому випадку - додаткову валідацію), додамо `Query` всередину `Annotated` і встановимо параметр `max_length` у `50`:
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[9] *}
Зверніть увагу, що значення за замовчуванням усе ще `None`, тому параметр залишається необов'язковим.
-Але тепер, додавши `Query(max_length=50)` всередину `Annotated`, ми повідомляємо FastAPI, що хочемо додаткову валідацію для цього значення: ми хочемо, щоб воно мало максимум 50 символів. 😎
+Але тепер, додавши `Query(max_length=50)` всередину `Annotated`, ми повідомляємо FastAPI, що хочемо **додаткову валідацію** для цього значення: ми хочемо, щоб воно мало максимум 50 символів. 😎
/// tip | Порада
-Тут ми використовуємо `Query()`, оскільки це query параметр. Далі ми розглянемо інші варіанти, як-от `Path()`, `Body()`, `Header()` та `Cookie()`, які приймають ті самі аргументи, що й `Query()`.
+Тут ми використовуємо `Query()`, оскільки це **параметр запиту**. Далі ми розглянемо інші варіанти, як-от `Path()`, `Body()`, `Header()` та `Cookie()`, які приймають ті самі аргументи, що й `Query()`.
///
Тепер FastAPI:
-* Перевірить дані, щоб переконатися, що їхня максимальна довжина — 50 символів
-* Покажe чітку помилку клієнту, якщо дані недійсні
-* Задокументує параметр в OpenAPI-схемі операції шляху (що відобразиться в автоматично згенерованій документації)
+* **Перевірить** дані, щоб переконатися, що їхня максимальна довжина - 50 символів
+* Покажe **чітку помилку** клієнту, якщо дані недійсні
+* **Задокументує** параметр в *операції шляху* схеми OpenAPI (що відобразиться в **автоматичному інтерфейсі документації**)
## Альтернативний (застарілий) метод: `Query` як значення за замовчуванням { #alternative-old-query-as-the-default-value }
@@ -93,7 +93,7 @@ q: Annotated[str | None] = None
///
-Раніше ми писали `Query()` як значення за замовчуванням для параметра функції, встановлюючи `max_length` у 50:
+Раніше ми писали `Query()` як значення за замовчуванням для параметра функції, встановлюючи параметр `max_length` у 50:
{* ../../docs_src/query_params_str_validations/tutorial002_py310.py hl[7] *}
@@ -107,19 +107,20 @@ q: str | None = Query(default=None)
...робить параметр необов’язковим зі значенням за замовчуванням `None`, що еквівалентно:
+
```Python
q: str | None = None
```
-Але у версії з `Query` ми явно вказуємо, що це query параметр.
+Але у версії з `Query` ми явно вказуємо, що це параметр запиту.
-Далі ми можемо передавати `Query` додаткові параметри. У цьому випадку — параметр `max_length`, який застосовується до рядків:
+Далі ми можемо передавати `Query` додаткові параметри. У цьому випадку - параметр `max_length`, який застосовується до строк:
```Python
q: str | None = Query(default=None, max_length=50)
```
-Це забезпечить валідацію даних, виведе зрозумілу помилку у разі недійсних даних і задокументує параметр у схемі OpenAPI операції шляху.
+Це забезпечить валідацію даних, виведе зрозумілу помилку у разі недійсних даних і задокументує параметр у *операції шляху* схеми OpenAPI.
### `Query` як значення за замовчуванням або всередині `Annotated` { #query-as-the-default-value-or-in-annotated }
@@ -149,13 +150,13 @@ q: str = Query(default="rick")
### Переваги використання `Annotated` { #advantages-of-annotated }
-Використання `Annotated` є рекомендованим замість задання значення за замовчуванням у параметрах функції, оскільки воно краще з кількох причин. 🤓
+**Використання `Annotated` є рекомендованим** замість задання значення за замовчуванням у параметрах функції, оскільки воно **краще** з кількох причин. 🤓
-Значення за замовчуванням параметра функції є фактичним значенням за замовчуванням, що є більш інтуїтивним у Python загалом. 😌
+**Значення за замовчуванням** **параметра функції** є **фактичним значенням за замовчуванням**, що є більш інтуїтивним у Python загалом. 😌
-Ви можете викликати ту саму функцію в інших місцях без FastAPI, і вона працюватиме очікувано. Якщо параметр є обов’язковим (без значення за замовчуванням), ваш редактор повідомить про помилку, а Python також видасть помилку, якщо ви виконаєте функцію без передавання цього параметра.
+Ви можете **викликати** ту саму функцію в **інших місцях** без FastAPI, і вона **працюватиме очікувано**. Якщо параметр є **обов’язковим** (без значення за замовчуванням), ваш **редактор** повідомить про помилку, а **Python** також видасть помилку, якщо ви виконаєте функцію без передавання обов’язкового параметра.
-Якщо ви не використовуєте `Annotated`, а використовуєте (старий) стиль значень за замовчуванням, то при виклику цієї функції без FastAPI в інших місцях потрібно пам’ятати передати їй аргументи, щоб вона працювала коректно, інакше значення будуть відрізнятися від очікуваних (наприклад, ви отримаєте `QueryInfo` або щось подібне замість `str`). І ваш редактор не повідомить про помилку, і Python не скаржитиметься під час запуску цієї функції — лише коли операції всередині завершаться помилкою.
+Якщо ви не використовуєте `Annotated`, а використовуєте **(старий) стиль значень за замовчуванням**, то при виклику цієї функції без FastAPI в **інших місцях** потрібно **пам’ятати** передати їй аргументи, щоб вона працювала коректно, інакше значення будуть відрізнятися від очікуваних (наприклад, ви отримаєте `QueryInfo` або щось подібне замість `str`). І ваш редактор не повідомить про помилку, і Python не скаржитиметься під час запуску цієї функції - лише коли операції всередині завершаться помилкою.
Оскільки `Annotated` може містити кілька анотацій метаданих, тепер ви навіть можете використовувати ту саму функцію з іншими інструментами, такими як [Typer](https://typer.tiangolo.com/). 🚀
@@ -167,7 +168,7 @@ q: str = Query(default="rick")
## Додавання регулярних виразів { #add-regular-expressions }
-Ви можете визначити регулярний вираз `pattern`, якому має відповідати параметр:
+Ви можете визначити регулярний вираз `pattern`, якому має відповідати параметр:
{* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *}
@@ -177,7 +178,7 @@ q: str = Query(default="rick")
* `fixedquery`: точно відповідає значенню `fixedquery`.
* `$`: закінчується тут, після `fixedquery` немає жодних символів.
-Якщо ви почуваєтеся розгублено щодо **«regular expression»**, не хвилюйтеся. Це складна тема для багатьох людей. Ви все одно можете робити багато речей без використання регулярних виразів.
+Якщо ви почуваєтеся розгублено щодо всіх цих ідей **«регулярного виразу»**, не хвилюйтеся. Це складна тема для багатьох людей. Ви все одно можете робити багато речей без потреби в регулярних виразах.
Тепер ви знаєте, що коли вони знадобляться, їх можна застосовувати у **FastAPI**.
@@ -185,19 +186,19 @@ q: str = Query(default="rick")
Ви можете, звісно, використовувати значення за замовчуванням, відмінні від `None`.
-Припустімо, що ви хочете оголосити query параметр `q` з `min_length` `3` і значенням за замовчуванням `"fixedquery"`:
+Припустімо, що ви хочете оголосити параметр запиту `q` з `min_length` `3` і значенням за замовчуванням `"fixedquery"`:
{* ../../docs_src/query_params_str_validations/tutorial005_an_py310.py hl[9] *}
/// note | Примітка
-Наявність значення за замовчуванням будь-якого типу, включаючи `None`, робить параметр необов’язковим (not required).
+Наявність значення за замовчуванням будь-якого типу, включаючи `None`, робить параметр необов’язковим (не обов’язковим).
///
## Обов’язкові параметри { #required-parameters }
-Якщо нам не потрібно оголошувати додаткові валідації або метадані, ми можемо зробити query параметр `q` обов’язковим, просто не вказуючи значення за замовчуванням, наприклад:
+Якщо нам не потрібно оголошувати додаткові валідації або метадані, ми можемо зробити параметр запиту `q` обов’язковим, просто не вказуючи значення за замовчуванням, наприклад:
```Python
q: str
@@ -227,11 +228,11 @@ q: Annotated[str | None, Query(min_length=3)] = None
{* ../../docs_src/query_params_str_validations/tutorial006c_an_py310.py hl[9] *}
-## Список query параметрів / кілька значень { #query-parameter-list-multiple-values }
+## Список параметрів запиту / кілька значень { #query-parameter-list-multiple-values }
-Коли ви явно визначаєте query параметр за допомогою `Query`, ви також можете оголосити, що він має приймати список значень, або, іншими словами, кілька значень.
+Коли ви явно визначаєте параметр запиту за допомогою `Query`, ви також можете оголосити, що він має приймати список значень, або, іншими словами, кілька значень.
-Наприклад, щоб оголосити query параметр `q`, який може з’являтися в URL кілька разів, можна написати:
+Наприклад, щоб оголосити параметр запиту `q`, який може з’являтися в URL кілька разів, можна написати:
{* ../../docs_src/query_params_str_validations/tutorial011_an_py310.py hl[9] *}
@@ -241,7 +242,7 @@ q: Annotated[str | None, Query(min_length=3)] = None
http://localhost:8000/items/?q=foo&q=bar
```
-ви отримаєте кілька значень `q` query параметрів (`foo` і `bar`) у вигляді Python `list` у вашій функції операції шляху, у параметрі функції `q`.
+ви отримаєте кілька значень *параметрів запиту* `q` (`foo` і `bar`) у вигляді Python `list` у вашій *функції операції шляху*, у *параметрі функції* `q`.
Отже, відповідь на цей URL буде:
@@ -256,7 +257,7 @@ http://localhost:8000/items/?q=foo&q=bar
/// tip | Порада
-Щоб оголосити query параметр з типом `list`, як у наведеному вище прикладі, потрібно явно використовувати `Query`, інакше він буде інтерпретований як тіло запиту.
+Щоб оголосити параметр запиту з типом `list`, як у наведеному вище прикладі, потрібно явно використовувати `Query`, інакше він буде інтерпретований як тіло запиту.
///
@@ -264,7 +265,7 @@ http://localhost:8000/items/?q=foo&q=bar
-### Список query параметрів / кілька значень за замовчуванням { #query-parameter-list-multiple-values-with-defaults }
+### Список параметрів запиту / кілька значень за замовчуванням { #query-parameter-list-multiple-values-with-defaults }
Ви також можете визначити значення за замовчуванням `list`, якщо жодне значення не було передане:
@@ -297,7 +298,7 @@ http://localhost:8000/items/
Майте на увазі, що в цьому випадку FastAPI не перевірятиме вміст списку.
-Наприклад, `list[int]` перевірятиме (і документуватиме), що вміст списку — цілі числа. Але `list` без уточнення цього не робитиме.
+Наприклад, `list[int]` перевірятиме (і документуватиме), що вміст списку - цілі числа. Але `list` без уточнення цього не робитиме.
///
@@ -305,7 +306,7 @@ http://localhost:8000/items/
Ви можете додати більше інформації про параметр.
-Ця інформація буде включена у згенерований OpenAPI та використана інтерфейсами документації та зовнішніми інструментами.
+Ця інформація буде включена у згенерований OpenAPI та використана користувацькими інтерфейсами документації та зовнішніми інструментами.
/// note | Примітка
@@ -333,9 +334,9 @@ http://localhost:8000/items/
http://127.0.0.1:8000/items/?item-query=foobaritems
```
-Але `item-query` — це некоректна назва змінної в Python.
+Але `item-query` - це некоректна назва змінної в Python.
-Найближчий допустимий варіант — `item_query`.
+Найближчий допустимий варіант - `item_query`.
Проте вам потрібно, щоб параметр залишався саме `item-query`...
@@ -359,17 +360,17 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
## Виняток параметрів з OpenAPI { #exclude-parameters-from-openapi }
-Щоб виключити query параметр зі згенерованої схеми OpenAPI (і, таким чином, з автоматичних систем документації), встановіть параметр `include_in_schema` для `Query` в `False`:
+Щоб виключити параметр запиту зі згенерованої схеми OpenAPI (і, таким чином, з автоматичних систем документації), встановіть параметр `include_in_schema` для `Query` в `False`:
{* ../../docs_src/query_params_str_validations/tutorial014_an_py310.py hl[10] *}
## Кастомна валідація { #custom-validation }
-Можуть бути випадки, коли вам потрібно провести кастомну валідацію, яку не можна реалізувати за допомогою параметрів, показаних вище.
+Можуть бути випадки, коли вам потрібно провести **кастомну валідацію**, яку не можна реалізувати за допомогою параметрів, показаних вище.
-У таких випадках ви можете використати кастомну функцію-валідатор, яка буде застосована після звичайної валідації (наприклад, після перевірки, що значення є типом `str`).
+У таких випадках ви можете використати **кастомну функцію-валідатор**, яка буде застосована після звичайної валідації (наприклад, після перевірки, що значення є типом `str`).
-Це можна досягти за допомогою [Pydantic's `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) в середині `Annotated`.
+Це можна досягти за допомогою [Pydantic's `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) всередині `Annotated`.
/// tip | Порада
@@ -377,11 +378,11 @@ Pydantic також має [`BeforeValidator`](https://docs.pydantic.dev/latest/
///
-Наприклад, цей кастомний валідатор перевіряє, чи починається ID елемента з `isbn-` для номера книги ISBN або з `imdb-` для ID URL фільму на IMDB:
+Наприклад, цей кастомний валідатор перевіряє, чи починається ID предмета з `isbn-` для номера книги ISBN або з `imdb-` для ID URL фільму на IMDB:
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | Інформація
+/// note | Примітка
Це доступно з версії Pydantic 2 або вище. 😎
@@ -389,39 +390,39 @@ Pydantic також має [`BeforeValidator`](https://docs.pydantic.dev/latest/
/// tip | Порада
-Якщо вам потрібно виконати будь-яку валідацію, яка вимагає взаємодії з будь-яким зовнішнім компонентом, таким як база даних чи інший API, замість цього слід використовувати FastAPI Dependencies — ви дізнаєтесь про них пізніше.
+Якщо вам потрібно виконати будь-яку валідацію, яка вимагає взаємодії з будь-яким **зовнішнім компонентом**, таким як база даних чи інший API, замість цього слід використовувати **FastAPI Dependencies** - ви дізнаєтесь про них пізніше.
-Ці кастомні валідатори використовуються для речей, які можна перевірити лише з тими самими даними, що надані в запиті.
+Ці кастомні валідатори використовуються для речей, які можна перевірити **лише** з **тими самими даними**, що надані в запиті.
///
### Зрозумійте цей код { #understand-that-code }
-Головний момент — це використання `AfterValidator` з функцією всередині `Annotated`. Можете пропустити цю частину, якщо хочете. 🤸
+Головний момент - це використання **`AfterValidator` з функцією всередині `Annotated`**. Можете пропустити цю частину, якщо хочете. 🤸
---
Але якщо вам цікаво розібратися в цьому конкретному прикладі коду і вам ще не набридло, ось кілька додаткових деталей.
-#### Рядок із `value.startswith()` { #string-with-value-startswith }
+#### Строка з `value.startswith()` { #string-with-value-startswith }
-Звернули увагу? Рядок із `value.startswith()` може приймати кортеж, і тоді він перевірятиме кожне значення в кортежі:
+Звернули увагу? Строка з `value.startswith()` може приймати кортеж, і тоді він перевірятиме кожне значення в кортежі:
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[16:19] hl[17] *}
-#### Випадковий елемент { #a-random-item }
+#### Випадковий предмет { #a-random-item }
-За допомогою `data.items()` ми отримуємо ітерабельний об'єкт із кортежами, що містять ключ і значення для кожного елемента словника.
+За допомогою `data.items()` ми отримуємо ітерабельний об'єкт із кортежами, що містять ключ і значення для кожного предмета словника.
Ми перетворюємо цей ітерабельний об'єкт у звичайний `list` за допомогою `list(data.items())`.
-Потім, використовуючи `random.choice()`, ми можемо отримати випадкове значення зі списку, тобто отримуємо кортеж із `(id, name)`. Це може бути щось на зразок `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`.
+Потім, використовуючи `random.choice()`, ми можемо отримати **випадкове значення** зі списку, тобто отримуємо кортеж із `(id, name)`. Це може бути щось на зразок `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`.
-Далі ми присвоюємо ці два значення кортежу змінним `id` і `name`.
+Далі ми **присвоюємо ці два значення** кортежу змінним `id` і `name`.
-Тож, якщо користувач не вказав ID елемента, він все одно отримає випадкову рекомендацію.
+Тож, якщо користувач не вказав ID предмета, він все одно отримає випадкову рекомендацію.
-...ми робимо все це в одному простому рядку. 🤯 Хіба ви не любите Python? 🐍
+...ми робимо все це в **одному простому рядку**. 🤯 Хіба ви не любите Python? 🐍
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[22:30] hl[29] *}
@@ -436,7 +437,7 @@ Pydantic також має [`BeforeValidator`](https://docs.pydantic.dev/latest/
* `description`
* `deprecated`
-Валідації, специфічні для рядків:
+Валідації, специфічні для строк:
* `min_length`
* `max_length`
diff --git a/docs/uk/docs/tutorial/query-params.md b/docs/uk/docs/tutorial/query-params.md
index b665a620e..d70fb1fe3 100644
--- a/docs/uk/docs/tutorial/query-params.md
+++ b/docs/uk/docs/tutorial/query-params.md
@@ -1,10 +1,10 @@
-# Query параметри { #query-parameters }
+# Параметри запиту { #query-parameters }
-Коли ви оголошуєте інші параметри функції, які не є частиною параметрів шляху, вони автоматично інтерпретуються як параметри «query».
+Коли ви оголошуєте інші параметри функції, які не є частиною параметрів шляху, вони автоматично інтерпретуються як параметри «запиту».
{* ../../docs_src/query_params/tutorial001_py310.py hl[9] *}
-Query — це набір пар ключ-значення, що йдуть після символу `?` в URL, розділені символами `&`.
+Запит - це набір пар ключ-значення, що йдуть після символу `?` в URL, розділені символами `&`.
Наприклад, в URL:
@@ -12,25 +12,25 @@ Query — це набір пар ключ-значення, що йдуть пі
http://127.0.0.1:8000/items/?skip=0&limit=10
```
-...параметрами query є:
+...параметрами запиту є:
* `skip`: зі значенням `0`
* `limit`: зі значенням `10`
-Оскільки вони є частиною URL, вони «природно» є рядками.
+Оскільки вони є частиною URL, вони «природно» є строками.
Але коли ви оголошуєте їх із типами Python (у наведеному прикладі як `int`), вони перетворюються на цей тип і проходять перевірку відповідності.
-Увесь той самий процес, який застосовується до параметрів шляху, також застосовується до параметрів query:
+Увесь той самий процес, який застосовується до параметрів шляху, також застосовується до параметрів запиту:
* Підтримка в редакторі (очевидно)
-* «парсинг» даних
+* «парсинг» даних
* Валідація даних
* Автоматична документація
## Значення за замовчуванням { #defaults }
-Оскільки параметри query не є фіксованою частиною шляху, вони можуть бути необов’язковими та мати значення за замовчуванням.
+Оскільки параметри запиту не є фіксованою частиною шляху, вони можуть бути необов’язковими та мати значення за замовчуванням.
У наведеному вище прикладі вони мають значення за замовчуванням: `skip=0` і `limit=10`.
@@ -59,19 +59,19 @@ http://127.0.0.1:8000/items/?skip=20
## Необов'язкові параметри { #optional-parameters }
-Так само ви можете оголосити необов’язкові параметри query, встановивши для них значення за замовчуванням `None`:
+Так само ви можете оголосити необов’язкові параметри запиту, встановивши для них значення за замовчуванням `None`:
{* ../../docs_src/query_params/tutorial002_py310.py hl[7] *}
У цьому випадку параметр функції `q` буде необов’язковим і за замовчуванням матиме значення `None`.
-/// check | Перевірте
+/// tip | Порада
-Також зверніть увагу, що **FastAPI** достатньо розумний, щоб визначити, що параметр шляху `item_id` є параметром шляху, а `q` — ні, отже, це параметр query.
+Також зверніть увагу, що **FastAPI** достатньо розумний, щоб визначити, що параметр шляху `item_id` є параметром шляху, а `q` - ні, отже, це параметр запиту.
///
-## Перетворення типу параметра query { #query-parameter-type-conversion }
+## Перетворення типу параметра запиту { #query-parameter-type-conversion }
Ви також можете оголошувати параметри типу `bool`, і вони будуть автоматично конвертовані:
@@ -107,12 +107,12 @@ http://127.0.0.1:8000/items/foo?short=on
http://127.0.0.1:8000/items/foo?short=yes
```
-або будь-який інший варіант написання (великі літери, перша літера велика тощо), ваша функція побачить параметр `short` зі значенням `True` типу `bool`. В іншому випадку — `False`.
+або будь-який інший варіант написання (великі літери, перша літера велика тощо), ваша функція побачить параметр `short` зі значенням `True` типу `bool`. В іншому випадку - `False`.
-## Кілька path і query параметрів { #multiple-path-and-query-parameters }
+## Кілька параметрів шляху та запиту { #multiple-path-and-query-parameters }
-Ви можете одночасно оголошувати кілька параметрів шляху та параметрів query, **FastAPI** знає, який з них який.
+Ви можете одночасно оголошувати кілька параметрів шляху та параметрів запиту, **FastAPI** знає, який з них який.
І вам не потрібно оголошувати їх у якомусь конкретному порядку.
@@ -120,17 +120,17 @@ http://127.0.0.1:8000/items/foo?short=yes
{* ../../docs_src/query_params/tutorial004_py310.py hl[6,8] *}
-## Обов’язкові параметри query { #required-query-parameters }
+## Обов’язкові параметри запиту { #required-query-parameters }
-Коли ви оголошуєте значення за замовчуванням для не-path-параметрів (поки що ми бачили лише параметри query), тоді вони не є обов’язковими.
+Коли ви оголошуєте значення за замовчуванням для параметрів, що не є параметрами шляху (поки що ми бачили лише параметри запиту), тоді вони не є обов’язковими.
Якщо ви не хочете задавати конкретне значення, а просто зробити параметр необов’язковим, задайте `None` як значення за замовчуванням.
-Але якщо ви хочете зробити параметр query обов’язковим, просто не вказуйте для нього значення за замовчуванням:
+Але якщо ви хочете зробити параметр запиту обов’язковим, просто не вказуйте для нього значення за замовчуванням:
{* ../../docs_src/query_params/tutorial005_py310.py hl[6:7] *}
-Тут параметр query `needy` — обов’язковий параметр query типу `str`.
+Тут параметр запиту `needy` - обов’язковий параметр запиту типу `str`.
Якщо ви відкриєте у браузері URL-адресу:
@@ -171,11 +171,11 @@ http://127.0.0.1:8000/items/foo-item?needy=sooooneedy
}
```
-І звісно, ви можете визначити деякі параметри як обов’язкові, деякі — зі значенням за замовчуванням, а деякі — повністю необов’язкові:
+І звісно, ви можете визначити деякі параметри як обов’язкові, деякі - зі значенням за замовчуванням, а деякі - повністю необов’язкові:
{* ../../docs_src/query_params/tutorial006_py310.py hl[8] *}
-У цьому випадку є 3 параметри query:
+У цьому випадку є 3 параметри запиту:
* `needy`, обов’язковий `str`.
* `skip`, `int` зі значенням за замовчуванням `0`.
diff --git a/docs/uk/docs/tutorial/request-files.md b/docs/uk/docs/tutorial/request-files.md
index f81e468d0..0785dd206 100644
--- a/docs/uk/docs/tutorial/request-files.md
+++ b/docs/uk/docs/tutorial/request-files.md
@@ -2,7 +2,7 @@
Ви можете визначити файли, які будуть завантажуватися клієнтом, використовуючи `File`.
-/// info | Інформація
+/// note | Примітка
Щоб отримувати завантажені файли, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -12,7 +12,7 @@
$ pip install python-multipart
```
-Це необхідно, оскільки завантажені файли передаються у вигляді «form data».
+Це необхідно, оскільки завантажені файли передаються як «дані форми».
///
@@ -28,9 +28,9 @@ $ pip install python-multipart
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info | Інформація
+/// note | Примітка
-`File` — це клас, який безпосередньо успадковує `Form`.
+`File` - це клас, який безпосередньо успадковує `Form`.
Але пам’ятайте, що коли ви імпортуєте `Query`, `Path`, `File` та інші з `fastapi`, це насправді функції, які повертають спеціальні класи.
@@ -42,7 +42,7 @@ $ pip install python-multipart
///
-Файли будуть завантажені у вигляді «form data».
+Файли будуть завантажені як «дані форми».
Якщо ви оголосите тип параметра *функції операції шляху* як `bytes`, **FastAPI** прочитає файл за вас, і ви отримаєте його вміст у вигляді `bytes`.
@@ -70,8 +70,8 @@ $ pip install python-multipart
`UploadFile` має такі атрибути:
-* `filename`: Рядок `str` з оригінальною назвою файлу, який був завантажений (наприклад, `myimage.jpg`).
-* `content_type`: Рядок `str` з типом вмісту (MIME type / media type) (наприклад, `image/jpeg`).
+* `filename`: Строка `str` з оригінальною назвою файлу, який був завантажений (наприклад, `myimage.jpg`).
+* `content_type`: Строка `str` з типом вмісту (MIME type / media type) (наприклад, `image/jpeg`).
* `file`: [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) ([file-like](https://docs.python.org/3/glossary.html#term-file-like-object) об'єкт). Це фактичний файловий об'єкт Python, який ви можете передавати безпосередньо іншим функціям або бібліотекам, що очікують «file-like» об'єкт.
`UploadFile` має такі асинхронні `async` методи. Вони всі викликають відповідні методи файлу під капотом (використовуючи внутрішній `SpooledTemporaryFile`).
@@ -109,7 +109,7 @@ contents = myfile.file.read()
///
-## Що таке «Form Data» { #what-is-form-data }
+## Що таке «дані форми» { #what-is-form-data }
Спосіб, у який HTML-форми (``) надсилають дані на сервер, зазвичай використовує «спеціальне» кодування для цих даних, відмінне від JSON.
@@ -121,7 +121,7 @@ contents = myfile.file.read()
Але якщо форма містить файли, вона кодується як `multipart/form-data`. Якщо ви використовуєте `File`, **FastAPI** знатиме, що потрібно отримати файли з правильної частини тіла.
-Якщо ви хочете дізнатися більше про ці типи кодування та формові поля, ознайомтеся з [MDN web docs для `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
+Якщо ви хочете дізнатися більше про ці типи кодування та поля форми, ознайомтеся з [MDN web docs для `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST).
///
@@ -149,7 +149,7 @@ contents = myfile.file.read()
Можна завантажувати кілька файлів одночасно.
-Вони будуть пов’язані з одним і тим самим «form field», який передається у вигляді «form data».
+Вони будуть пов’язані з одним і тим самим «полем форми», яке передається як «дані форми».
Щоб це реалізувати, потрібно оголосити список `bytes` або `UploadFile`:
@@ -173,4 +173,4 @@ contents = myfile.file.read()
## Підсумок { #recap }
-Використовуйте `File`, `bytes` та `UploadFile`, щоб оголошувати файли для завантаження в запиті, надіслані у вигляді form data.
+Використовуйте `File`, `bytes` та `UploadFile`, щоб оголошувати файли для завантаження в запиті, надіслані як дані форми.
diff --git a/docs/uk/docs/tutorial/request-form-models.md b/docs/uk/docs/tutorial/request-form-models.md
index 6f785016d..c61eeeaab 100644
--- a/docs/uk/docs/tutorial/request-form-models.md
+++ b/docs/uk/docs/tutorial/request-form-models.md
@@ -2,7 +2,7 @@
У FastAPI ви можете використовувати **Pydantic-моделі** для оголошення **полів форми**.
-/// info
+/// note | Примітка
Щоб використовувати форми, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -14,7 +14,7 @@ $ pip install python-multipart
///
-/// note
+/// note | Примітка
Це підтримується, починаючи з FastAPI версії `0.113.0`. 🤓
@@ -40,7 +40,7 @@ $ pip install python-multipart
У деяких особливих випадках (ймовірно, не дуже поширених) ви можете **обмежити** поля форми лише тими, які були оголошені в Pydantic-моделі. І **заборонити** будь-які **додаткові** поля.
-/// note
+/// note | Примітка
Це підтримується, починаючи з FastAPI версії `0.114.0`. 🤓
diff --git a/docs/uk/docs/tutorial/request-forms-and-files.md b/docs/uk/docs/tutorial/request-forms-and-files.md
index c6d254808..74de8018c 100644
--- a/docs/uk/docs/tutorial/request-forms-and-files.md
+++ b/docs/uk/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
Ви можете одночасно визначати файли та поля форми, використовуючи `File` і `Form`.
-/// info | Інформація
+/// note | Примітка
Щоб отримувати завантажені файли та/або дані форми, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart).
diff --git a/docs/uk/docs/tutorial/request-forms.md b/docs/uk/docs/tutorial/request-forms.md
index d02b85068..311377908 100644
--- a/docs/uk/docs/tutorial/request-forms.md
+++ b/docs/uk/docs/tutorial/request-forms.md
@@ -2,7 +2,7 @@
Коли вам потрібно отримувати поля форми замість JSON, ви можете використовувати `Form`.
-/// info | Інформація
+/// note | Примітка
Щоб використовувати форми, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart).
@@ -26,15 +26,15 @@ $ pip install python-multipart
{* ../../docs_src/request_forms/tutorial001_an_py310.py hl[9] *}
-Наприклад, один зі способів використання специфікації OAuth2 (так званий «password flow») вимагає надсилати `username` та `password` як поля форми.
+Наприклад, один зі способів використання специфікації OAuth2 (так званий «потік паролю») вимагає надсилати `username` та `password` як поля форми.
специфікація вимагає, щоб ці поля мали точні назви `username` і `password` та надсилалися у вигляді полів форми, а не JSON.
З `Form` ви можете оголошувати ті ж конфігурації, що і з `Body` (та `Query`, `Path`, `Cookie`), включаючи валідацію, приклади, псевдоніми (наприклад, `user-name` замість `username`) тощо.
-/// info | Інформація
+/// note | Примітка
-`Form` — це клас, який безпосередньо наслідується від `Body`.
+`Form` - це клас, який безпосередньо наслідується від `Body`.
///
diff --git a/docs/uk/docs/tutorial/response-model.md b/docs/uk/docs/tutorial/response-model.md
index 86f12bff4..a5c297289 100644
--- a/docs/uk/docs/tutorial/response-model.md
+++ b/docs/uk/docs/tutorial/response-model.md
@@ -72,7 +72,7 @@ FastAPI використовуватиме цей `response_model` для вик
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | Інформація
+/// note | Примітка
Щоб використовувати `EmailStr`, спочатку встановіть [`email-validator`](https://github.com/JoshData/python-email-validator).
@@ -182,7 +182,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
### Повернути Response напряму { #return-a-response-directly }
-Найпоширенішим випадком буде [повернення Response напряму, як пояснюється пізніше у розширеній документації](../advanced/response-directly.md).
+Найпоширенішим випадком буде [повернення Response напряму, як пояснюється пізніше у просунутому посібнику користувача](../advanced/response-directly.md).
{* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *}
@@ -251,7 +251,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd
}
```
-/// info | Інформація
+/// note | Примітка
Ви також можете використовувати:
diff --git a/docs/uk/docs/tutorial/response-status-code.md b/docs/uk/docs/tutorial/response-status-code.md
index d453510f9..4e49cdc60 100644
--- a/docs/uk/docs/tutorial/response-status-code.md
+++ b/docs/uk/docs/tutorial/response-status-code.md
@@ -1,5 +1,6 @@
# Код статусу відповіді { #response-status-code }
+
Так само, як ви можете вказати модель відповіді, ви також можете оголосити HTTP код статусу, що використовується для відповіді, за допомогою параметра `status_code` в будь-якій з *операцій шляху*:
* `@app.get()`
@@ -18,7 +19,7 @@
Параметр `status_code` приймає число з HTTP кодом статусу.
-/// info | Інформація
+/// note | Примітка
`status_code` також може, як альтернативу, приймати `IntEnum`, наприклад, Python [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus).
diff --git a/docs/uk/docs/tutorial/schema-extra-example.md b/docs/uk/docs/tutorial/schema-extra-example.md
index 742871e39..734a06d1a 100644
--- a/docs/uk/docs/tutorial/schema-extra-example.md
+++ b/docs/uk/docs/tutorial/schema-extra-example.md
@@ -1,4 +1,4 @@
-# Декларування прикладів вхідних даних { #declare-request-example-data }
+# Декларування прикладів даних запиту { #declare-request-example-data }
Ви можете задати приклади даних, які ваш застосунок може отримувати.
@@ -24,7 +24,7 @@
///
-/// info | Інформація
+/// note | Примітка
OpenAPI 3.1.0 (який використовується починаючи з FastAPI 0.99.0) додав підтримку `examples`, що є частиною стандарту **Схеми JSON**.
@@ -42,7 +42,7 @@ OpenAPI 3.1.0 (який використовується починаючи з F
## `examples` у Схемі JSON - OpenAPI { #examples-in-json-schema-openapi }
-При використанні будь-кого з наступного:
+Під час використання будь-чого з наведеного:
* `Path()`
* `Query()`
@@ -109,7 +109,7 @@ OpenAPI 3.1.0 (який використовується починаючи з F
* `value`: це сам приклад, який буде показано, наприклад `dict`.
* `externalValue`: альтернатива `value`, URL-адреса, що вказує на приклад. Проте це може не підтримуватися такою кількістю інструментів, як `value`.
-Використання виглядає так:
+Ви можете використати це так:
{* ../../docs_src/schema_extra_example/tutorial005_an_py310.py hl[23:49] *}
@@ -155,7 +155,7 @@ OpenAPI також додала поля `example` і `examples` до інших
* `File()`
* `Form()`
-/// info | Інформація
+/// note | Примітка
Цей старий специфічний для OpenAPI параметр `examples` тепер називається `openapi_examples`, починаючи з FastAPI `0.103.0`.
@@ -171,7 +171,7 @@ OpenAPI також додала поля `example` і `examples` до інших
Це нове поле `examples` у Схемі JSON - це **просто `list`** прикладів, а не `dict` з додатковими метаданими, як в інших місцях OpenAPI (описаних вище).
-/// info | Інформація
+/// note | Примітка
Навіть після релізу OpenAPI 3.1.0 з цією новою простішою інтеграцією зі Схемою JSON, протягом певного часу Swagger UI, інструмент, який надає автоматичну документацію, не підтримував OpenAPI 3.1.0 (тепер підтримує, починаючи з версії 5.0.0 🎉).
diff --git a/docs/uk/docs/tutorial/security/first-steps.md b/docs/uk/docs/tutorial/security/first-steps.md
index bfe196223..7feee1c02 100644
--- a/docs/uk/docs/tutorial/security/first-steps.md
+++ b/docs/uk/docs/tutorial/security/first-steps.md
@@ -4,7 +4,7 @@
А **frontend** - на іншому домені або в іншому шляху того ж домену (або у мобільному застосунку).
-І ви хочете, щоб frontend міг автентифікуватися в backend, використовуючи ім'я користувача та пароль.
+І ви хочете, щоб frontend міг автентифікуватися в backend, використовуючи **ім'я користувача** та **пароль**.
Ми можемо використати **OAuth2**, щоб збудувати це з **FastAPI**.
@@ -24,7 +24,7 @@
## Запустіть { #run-it }
-/// info | Інформація
+/// note | Примітка
Пакет [`python-multipart`](https://github.com/Kludex/python-multipart) автоматично встановлюється з **FastAPI**, коли ви виконуєте команду `pip install "fastapi[standard]"`.
@@ -40,7 +40,7 @@ $ pip install python-multipart
///
-Запустіть приклад:
+Запустіть приклад за допомогою:
-/// check | Кнопка Authorize!
+/// tip | Кнопка «Authorize»!
У вас уже є нова блискуча кнопка «Authorize».
@@ -78,7 +78,7 @@ $ fastapi dev
///
-Звісно, це не frontend для кінцевих користувачів, але це чудовий інструмент для інтерактивної документації всього вашого API.
+Звісно, це не frontend для кінцевих користувачів, але це чудовий автоматичний інструмент для інтерактивного документування всього вашого API.
Ним може користуватися команда frontend (якою можете бути і ви самі).
@@ -86,11 +86,11 @@ $ fastapi dev
І ним також можете користуватися ви самі, щоб налагоджувати, перевіряти та тестувати той самий застосунок.
-## Потік паролю { #the-password-flow }
+## Потік `password` { #the-password-flow }
Тепер повернімося трохи назад і розберімося, що це все таке.
-`password` «flow» - це один зі способів («flows»), визначених в OAuth2, для обробки безпеки та автентифікації.
+`password` «потік» - це один зі способів («потоків»), визначених в OAuth2, для обробки безпеки та автентифікації.
OAuth2 був спроєктований так, щоб backend або API могли бути незалежними від сервера, який автентифікує користувача.
@@ -100,7 +100,7 @@ OAuth2 був спроєктований так, щоб backend або API мо
- Користувач вводить `username` і `password` у frontend і натискає `Enter`.
- Frontend (у браузері користувача) надсилає ці `username` і `password` на специфічну URL-адресу нашого API (оголошену як `tokenUrl="token"`).
-- API перевіряє ці `username` і `password` та повертає «токен» (ми ще нічого з цього не реалізували).
+- API перевіряє ці `username` і `password` та відповідає «токеном» (ми ще нічого з цього не реалізували).
- «Токен» - це просто строка з деяким вмістом, який ми можемо пізніше використати, щоб перевірити цього користувача.
- Зазвичай токен налаштований на завершення строку дії через певний час.
- Тож користувачу доведеться знову увійти пізніше.
@@ -116,11 +116,11 @@ OAuth2 був спроєктований так, щоб backend або API мо
**FastAPI** надає кілька інструментів на різних рівнях абстракції, щоб реалізувати ці функції безпеки.
-У цьому прикладі ми використаємо **OAuth2** з потоком **Password**, використовуючи токен **Bearer**. Це робиться за допомогою класу `OAuth2PasswordBearer`.
+У цьому прикладі ми використаємо **OAuth2** з потоком **Password**, використовуючи **токен носія**. Це робиться за допомогою класу `OAuth2PasswordBearer`.
-/// info | Інформація
+/// note | Примітка
-«Bearer»-токен - не єдиний варіант.
+«Токен носія» - не єдиний варіант.
Але це найкращий для нашого сценарію.
@@ -138,7 +138,7 @@ OAuth2 був спроєктований так, щоб backend або API мо
Тут `tokenUrl="token"` відноситься до відносної URL-адреси `token`, яку ми ще не створили. Оскільки це відносна URL-адреса, вона еквівалентна `./token`.
-Тому, якщо ваш API розміщений на `https://example.com/`, це буде `https://example.com/token`. А якщо на `https://example.com/api/v1/`, тоді це буде `https://example.com/api/v1/token`.
+Оскільки ми використовуємо відносну URL-адресу, якщо ваш API розміщений на `https://example.com/`, це буде `https://example.com/token`. А якщо ваш API розміщений на `https://example.com/api/v1/`, тоді це буде `https://example.com/api/v1/token`.
Використання відносної URL-адреси важливе, щоб ваша програма продовжувала працювати навіть у просунутому сценарії, як-от [За представником](../../advanced/behind-a-proxy.md).
@@ -148,7 +148,7 @@ OAuth2 був спроєктований так, щоб backend або API мо
Незабаром ми також створимо фактичну операцію шляху.
-/// info | Інформація
+/// note | Примітка
Якщо ви дуже строгий «Pythonista», вам може не подобатися стиль імені параметра `tokenUrl` замість `token_url`.
@@ -176,7 +176,7 @@ oauth2_scheme(some, parameters)
**FastAPI** знатиме, що може використати цю залежність, щоб визначити «схему безпеки» в схемі OpenAPI (і в автоматичній документації API).
-/// info | Технічні деталі
+/// note | Технічні деталі
**FastAPI** знатиме, що може використати клас `OAuth2PasswordBearer` (оголошений у залежності), щоб визначити схему безпеки в OpenAPI, тому що він наслідує `fastapi.security.oauth2.OAuth2`, який своєю чергою наслідує `fastapi.security.base.SecurityBase`.
@@ -188,7 +188,7 @@ oauth2_scheme(some, parameters)
Вона шукатиме в запиті заголовок `Authorization`, перевірить, чи його значення - це `Bearer ` плюс деякий токен, і поверне токен як `str`.
-Якщо заголовка `Authorization` немає або значення не містить токена `Bearer `, вона одразу відповість помилкою зі статус-кодом 401 (`UNAUTHORIZED`).
+Якщо заголовка `Authorization` немає або значення не містить токена `Bearer `, вона одразу відповість помилкою з кодом статусу 401 (`UNAUTHORIZED`).
Вам навіть не потрібно перевіряти, чи існує токен, щоб повернути помилку. Ви можете бути певні: якщо ваша функція виконується, у параметрі токена буде `str`.
diff --git a/docs/uk/docs/tutorial/security/get-current-user.md b/docs/uk/docs/tutorial/security/get-current-user.md
index 2371ad9fc..1cd308534 100644
--- a/docs/uk/docs/tutorial/security/get-current-user.md
+++ b/docs/uk/docs/tutorial/security/get-current-user.md
@@ -1,6 +1,6 @@
# Отримати поточного користувача { #get-current-user }
-У попередньому розділі система безпеки (яка базується на системі впровадження залежностей) передавала функції операції шляху `token` як `str`:
+У попередньому розділі система безпеки (яка базується на системі впровадження залежностей) передавала *функції операції шляху* `token` як `str`:
{* ../../docs_src/security/tutorial001_an_py310.py hl[12] *}
@@ -14,7 +14,7 @@
Так само, як ми використовуємо Pydantic для оголошення тіл, ми можемо використовувати його будь-де:
-{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
+{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## Створити залежність `get_current_user` { #create-a-get-current-user-dependency }
@@ -24,19 +24,19 @@
`get_current_user` матиме залежність із тим самим `oauth2_scheme`, який ми створили раніше.
-Так само, як ми робили раніше безпосередньо в операції шляху, наша нова залежність `get_current_user` отримає `token` як `str` від підзалежності `oauth2_scheme`:
+Так само, як ми робили раніше безпосередньо в *операції шляху*, наша нова залежність `get_current_user` отримає `token` як `str` від підзалежності `oauth2_scheme`:
{* ../../docs_src/security/tutorial002_an_py310.py hl[25] *}
## Отримати користувача { #get-the-user }
-`get_current_user` використає (фальшиву) утилітну функцію, яку ми створили, що приймає `token` як `str` і повертає нашу Pydantic-модель `User`:
+`get_current_user` використає (фальшиву) утилітну функцію, яку ми створили, що приймає токен як `str` і повертає нашу Pydantic-модель `User`:
{* ../../docs_src/security/tutorial002_an_py310.py hl[19:22,26:27] *}
## Впровадити поточного користувача { #inject-the-current-user }
-Тепер ми можемо використати той самий `Depends` з нашим `get_current_user` в операції шляху:
+Тепер ми можемо використати той самий `Depends` з нашим `get_current_user` в *операції шляху*:
{* ../../docs_src/security/tutorial002_an_py310.py hl[31] *}
@@ -52,7 +52,7 @@
///
-/// check | Перевірте
+/// tip | Порада
Те, як спроєктована ця система залежностей, дозволяє мати різні залежності (різні «залежні»), які всі повертають модель `User`.
@@ -62,13 +62,13 @@
## Інші моделі { #other-models }
-Тепер ви можете отримувати поточного користувача безпосередньо у функціях операцій шляху та працювати з механізмами безпеки на рівні **впровадження залежностей**, використовуючи `Depends`.
+Тепер ви можете отримувати поточного користувача безпосередньо у *функціях операцій шляху* та працювати з механізмами безпеки на рівні **впровадження залежностей**, використовуючи `Depends`.
І ви можете використовувати будь-яку модель або дані для вимог безпеки (у цьому випадку Pydantic-модель `User`).
-Але ви не обмежені використанням якоїсь конкретної модели даних, класу чи типу.
+Але ви не обмежені використанням якоїсь конкретної моделі даних, класу чи типу.
-Хочете мати id та email і не мати жодного username у вашій моделі? Без проблем. Ви можете використовувати ті самі інструменти.
+Хочете мати `id` та `email` і не мати жодного `username` у вашій моделі? Без проблем. Ви можете використовувати ті самі інструменти.
Хочете мати просто `str`? Або лише `dict`? Або безпосередньо екземпляр класу моделі бази даних? Усе працює так само.
@@ -78,7 +78,7 @@
## Розмір коду { #code-size }
-Цей приклад може здаватися багатослівним. Майте на увазі, що ми змішуємо безпеку, моделі даних, утилітні функції та операції шляху в одному файлі.
+Цей приклад може здаватися багатослівним. Майте на увазі, що ми змішуємо безпеку, моделі даних, утилітні функції та *операції шляху* в одному файлі.
Але ось ключовий момент.
@@ -86,20 +86,20 @@
І ви можете зробити це настільки складним, наскільки потрібно. І все одно мати це написаним лише один раз, в одному місці. З усією гнучкістю.
-Зате ви можете мати тисячі кінцевих точок (операцій шляху), що використовують одну й ту саму систему безпеки.
+Зате ви можете мати тисячі кінцевих точок (*операцій шляху*), що використовують одну й ту саму систему безпеки.
І всі вони (або будь-яка їхня частина, яку ви захочете) можуть скористатися повторним використанням цих залежностей або будь-яких інших, які ви створите.
-І всі ці тисячі операцій шляху можуть бути всього у 3 рядки:
+І всі ці тисячі *операцій шляху* можуть бути всього у 3 рядки:
{* ../../docs_src/security/tutorial002_an_py310.py hl[30:32] *}
## Підсумок { #recap }
-Тепер ви можете отримувати поточного користувача безпосередньо у вашій функції операції шляху.
+Тепер ви можете отримувати поточного користувача безпосередньо у вашій *функції операції шляху*.
Ми вже на півдорозі.
-Потрібно лише додати операцію шляху, щоб користувач/клієнт міг фактично надіслати `username` і `password`.
+Потрібно лише додати *операцію шляху*, щоб користувач/клієнт міг фактично надіслати `username` і `password`.
Далі саме це.
diff --git a/docs/uk/docs/tutorial/security/oauth2-jwt.md b/docs/uk/docs/tutorial/security/oauth2-jwt.md
index 64774af6d..1fb53ff41 100644
--- a/docs/uk/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/uk/docs/tutorial/security/oauth2-jwt.md
@@ -10,7 +10,7 @@
JWT означає «JSON Web Tokens».
-Це стандарт кодування об'єкта JSON у довгий щільний рядок без пробілів. Він виглядає так:
+Це стандарт кодування об'єкта JSON у довгу щільну строку без пробілів. Він виглядає так:
```
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
@@ -42,7 +42,7 @@ $ pip install pyjwt
-收銀員通知廚房準備你的漢堡(儘管他們還在為前面其他顧客準備食物)。
+收銀員通知廚房的廚師,讓他們知道需要準備你的漢堡(儘管他們還在為前面其他顧客準備食物)。
@@ -125,7 +125,7 @@ def results():
在等待漢堡的同時,你可以與戀人選一張桌子,然後坐下來聊很長一段時間(因為漢堡十分豪華,準備特別費工。)
-這段時間,你還能欣賞你的戀人有多麼的可愛、聰明與迷人。✨😍✨
+當你和戀人坐在桌邊等待漢堡時,你可以把這段時間拿來欣賞你的戀人有多麼棒、可愛又聰明 ✨😍✨。
@@ -135,7 +135,7 @@ def results():
-你和戀人享用這頓大餐,整個過程十分開心✨
+你和戀人享用這頓大餐,整個過程十分開心。✨
@@ -147,21 +147,21 @@ def results():
---
-想像你是故事中的電腦或程式 🤖。
+想像你是故事中的電腦 / 程式 🤖。
當你排隊時,你在放空😴,等待輪到你,沒有做任何「生產性」的事情。但這沒關係,因為收銀員只是接單(而不是準備食物),所以排隊速度很快。
-然後,當輪到你時,你開始做真正「有生產力」的工作,處理菜單,決定你想要什麼,替戀人選擇餐點,付款,確認你給了正確的帳單或信用卡,檢查你是否被正確收費,確認訂單中的項目是否正確等等。
+然後,當輪到你時,你開始做真正「有生產力」的工作,處理菜單,決定你想要什麼,取得戀人的選擇,付款,確認你給了正確的帳單或信用卡,檢查你是否被正確收費,確認訂單中的項目是否正確等等。
但是,即使你還沒有拿到漢堡,你與收銀員的工作已經「暫停」了 ⏸,因為你必須等待 🕙 漢堡準備好。
但當你離開櫃檯,坐到桌子旁,拿著屬於你的號碼等待時,你可以把注意力 🔀 轉移到戀人身上,並開始「工作」⏯ 🤓——也就是和戀人調情 😍。這時你又開始做一些非常「有生產力」的事情。
-接著,收銀員 💁 將你的號碼顯示在櫃檯螢幕上,並告訴你「漢堡已經做好了」。但你不會瘋狂地立刻跳起來,因為顯示的號碼變成了你的。你知道沒有人會搶走你的漢堡,因為你有自己的號碼,他們也有他們的號碼。
+接著,收銀員 💁 透過把你的號碼顯示在櫃檯螢幕上,表示「漢堡已經做好了」,但你不會在顯示的號碼變成你的號碼時就瘋狂地立刻跳起來。你知道沒有人會搶走你的漢堡,因為你有自己的號碼,他們也有他們的號碼。
-所以你會等戀人講完故事(完成當前的工作 ⏯/正在進行的任務 🤓),然後微笑著溫柔地說你要去拿漢堡了 ⏸。
+所以你會等戀人講完故事(完成當前的工作 ⏯ / 正在進行的任務 🤓),然後微笑著溫柔地說你要去拿漢堡了 ⏸。
-然後你走向櫃檯 🔀,回到已經完成的最初任務 ⏯,拿起漢堡,說聲謝謝,並帶回桌上。這就結束了與櫃檯的互動步驟/任務 ⏹,接下來會產生一個新的任務,「吃漢堡」 🔀 ⏯,而先前的「拿漢堡」任務已經完成了 ⏹。
+然後你走向櫃檯 🔀,回到已經完成的最初任務 ⏯,拿起漢堡,說聲謝謝,並帶回桌上。這就結束了與櫃檯互動的步驟 / 任務 ⏹。接著,這又產生了一個新的任務,「吃漢堡」🔀 ⏯,而先前的「拿漢堡」任務已經完成了 ⏹。
### 平行漢堡 { #parallel-burgers }
@@ -181,19 +181,19 @@ def results():
-收銀員走進廚房準備食物。
+收銀員走進廚房。
你站在櫃檯前等待 🕙,以免其他人先拿走你的漢堡,因為這裡沒有號碼牌系統。
-由於你和戀人都忙著不讓別人搶走你的漢堡,等漢堡準備好時,你根本無法專心和戀人互動。😞
+由於你和戀人都忙著不讓別人插到你前面並在漢堡送來時拿走你的漢堡,你根本無法專心和戀人互動。😞
-這是「同步」(synchronous)工作,你和收銀員/廚師 👨🍳 是「同步化」的。你必須等到 🕙 收銀員/廚師 👨🍳 完成漢堡並交給你的那一刻,否則別人可能會拿走你的餐點。
+這是「同步」(synchronous)工作,你和收銀員 / 廚師 👨🍳 是「同步化」的。你必須等到 🕙 收銀員 / 廚師 👨🍳 完成漢堡並交給你的那一刻,否則別人可能會拿走你的餐點。
-最終,經過長時間的等待 🕙,收銀員/廚師 👨🍳 拿著漢堡回來了。
+最終,經過長時間在櫃檯前的等待 🕙,收銀員 / 廚師 👨🍳 拿著漢堡回來了。
@@ -203,7 +203,7 @@ def results():
-整個過程中沒有太多的談情說愛,因為大部分時間 🕙 都花在櫃檯前等待。😞
+整個過程中沒有太多聊天或談情說愛,因為大部分時間 🕙 都花在櫃檯前等待。😞
/// note | 注意
@@ -213,15 +213,15 @@ def results():
---
-在這個平行漢堡的情境下,你是一個程式 🤖 且有兩個處理器(你和戀人),兩者都在等待 🕙 並專注於等待櫃檯上的餐點 🕙,等待的時間非常長。
+在這個平行漢堡的情境下,你是一個程式 🤖 且有兩個處理器(你和戀人),兩者都在等待 🕙 並專注 ⏯ 於在櫃檯前等待 🕙,等待的時間非常長。
-這家速食店有 8 個處理器(收銀員/廚師)。而並行漢堡店可能只有 2 個處理器(一位收銀員和一位廚師)。
+這家速食店有 8 個處理器(收銀員 / 廚師)。而並行漢堡店可能只有 2 個處理器(一位收銀員和一位廚師)。
儘管如此,最終的體驗並不是最理想的。😞
---
-這是與漢堡類似的故事。🍔
+這是與漢堡類似的平行版本故事。🍔
一個更「現實」的例子,想像一間銀行。
@@ -241,29 +241,29 @@ def results():
許多用戶正在使用你的應用程式,而你的伺服器則在等待 🕙 這些用戶不那麼穩定的網路來傳送請求。
-接著,再次等待 🕙 回應。
+接著,再次等待 🕙 回應回來。
-這種「等待」 🕙 通常以微秒來衡量,但累加起來,最終還是花費了很多等待時間。
+這種「等待」🕙 通常以微秒來衡量,但累加起來,最終還是花費了很多等待時間。
-這就是為什麼對於 Web API 來說,使用非同步程式碼 ⏸🔀⏯ 是非常有意味的。
+這就是為什麼對於 Web API 來說,使用非同步程式碼 ⏸🔀⏯ 是非常有意義的。
這種類型的非同步性正是 NodeJS 成功的原因(儘管 NodeJS 不是平行的),這也是 Go 語言作為程式語言的一個強大優勢。
-這與 **FastAPI** 所能提供的性能水平相同。
+這與 **FastAPI** 所能提供的效能水準相同。
-你可以同時利用並行性和平行性,進一步提升效能,這比大多數已測試的 NodeJS 框架都更快,並且與 Go 語言相當,而 Go 是一種更接近 C 的編譯語言([感謝 Starlette](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1))。
+你可以同時利用平行性和非同步性,進一步提升效能,這比大多數已測試的 NodeJS 框架都更快,並且與 Go 語言相當,而 Go 是一種更接近 C 的編譯語言([這都要歸功於 Starlette](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1))。
-### 並行比平行更好嗎? { #is-concurrency-better-than-parallelism }
+### 並行比平行更好嗎 { #is-concurrency-better-than-parallelism }
不是的!這不是故事的本意。
並行與平行不同。並行在某些 **特定** 的需要大量等待的情境下表現更好。正因如此,並行在 Web 應用程式開發中通常比平行更有優勢。但並不是所有情境都如此。
-因此,為了平衡報導,想像下面這個短故事
+因此,為了平衡報導,想像下面這個短故事:
> 你需要打掃一間又大又髒的房子。
-*是的,這就是全部的故事。*
+*是的,這就是全部的故事*。
---
@@ -273,32 +273,32 @@ def results():
無論輪流執行與否(並行),你都需要相同的工時完成任務,同時需要執行相同工作量。
-但是,在這種情境下,如果你可以邀請8位前收銀員/廚師(現在是清潔工)來幫忙,每個人(加上你)負責房子的某個區域,這樣你就可以 **平行** 地更快完成工作。
+但是,在這種情境下,如果你可以邀請 8 位前收銀員 / 廚師(現在是清潔工)來幫忙,每個人(加上你)負責房子的某個區域,這樣你就可以在額外協助下 **平行** 地更快完成工作。
在這個場景中,每個清潔工(包括你)都是一個處理器,完成工作的一部分。
-由於大多數的執行時間都花在實際的工作上(而不是等待),而電腦中的工作由 CPU 完成,因此這些問題被稱為「CPU 密集型」。
+由於大多數的執行時間都花在實際的工作上(而不是等待),而電腦中的工作由 CPU 完成,因此這些問題被稱為「CPU bound」。
---
-常見的 CPU 密集型操作範例包括那些需要進行複雜數學計算的任務。
+常見的 CPU bound 操作範例包括那些需要進行複雜數學計算的任務。
例如:
-* **音訊**或**圖像處理**;
-* **電腦視覺**:一張圖片由數百萬個像素組成,每個像素有 3 個值/顏色,處理這些像素通常需要同時進行大量計算;
-* **機器學習**: 通常需要大量的「矩陣」和「向量」運算。想像一個包含數字的巨大電子表格,並所有的數字同時相乘;
-* **深度學習**: 這是機器學習的子領域,同樣適用。只不過這不僅僅是一張數字表格,而是大量的數據集合,並且在很多情況下,你會使用特殊的處理器來構建或使用這些模型。
+* **音訊**或**圖像處理**。
+* **電腦視覺**:一張圖片由數百萬個像素組成,每個像素有 3 個值 / 顏色,處理這些像素通常需要同時進行大量計算。
+* **機器學習**:通常需要大量的「矩陣」和「向量」運算。想像一個包含數字的巨大電子表格,並將所有數字同時相乘。
+* **深度學習**:這是機器學習的子領域,同樣適用。只不過這不僅僅是一張要相乘的數字表格,而是大量的數據集合,並且在很多情況下,你會使用特殊的處理器來構建及 / 或使用這些模型。
### 並行 + 平行: Web + 機器學習 { #concurrency-parallelism-web-machine-learning }
使用 **FastAPI**,你可以利用並行的優勢,這在 Web 開發中非常常見(這也是 NodeJS 的最大吸引力)。
-但你也可以利用平行與多行程 (multiprocessing)(讓多個行程同時運行) 的優勢來處理機器學習系統中的 **CPU 密集型**工作。
+但你也可以利用平行與多行程 (multiprocessing)(讓多個行程同時運行) 的優勢來處理機器學習系統中的 **CPU bound** 工作。
-這一點,再加上 Python 是 **資料科學**、機器學習,尤其是深度學習的主要語言,讓 **FastAPI** 成為資料科學/機器學習 Web API 和應用程式(以及許多其他應用程式)的絕佳選擇。
+這一點,再加上 Python 是 **資料科學**、機器學習,尤其是深度學習的主要語言,讓 **FastAPI** 成為資料科學 / 機器學習 Web API 和應用程式(以及許多其他應用程式)的絕佳選擇。
-想了解如何在生產環境中實現這種平行性,請參見 [部屬](deployment/index.md)。
+想了解如何在生產環境中實現這種平行性,請參見 [部署](deployment/index.md)。
## `async` 和 `await` { #async-and-await }
@@ -310,37 +310,37 @@ def results():
burgers = await get_burgers(2)
```
-這裡的關鍵是 `await`。它告訴 Python 必須等待 ⏸ `get_burgers(2)` 完成它的工作 🕙, 然後將結果儲存在 `burgers` 中。如此,Python 就可以在此期間去處理其他事情 🔀 ⏯ (例如接收另一個請求)。
+這裡的關鍵是 `await`。它告訴 Python 必須等待 ⏸ `get_burgers(2)` 完成它的工作 🕙,然後將結果儲存在 `burgers` 中。如此,Python 就可以在此期間去處理其他事情 🔀 ⏯(例如接收另一個請求)。
-要讓 `await` 運作,它必須位於支持非同步功能的函式內。為此,只需使用 `async def` 宣告函式:
+要讓 `await` 運作,它必須位於支援非同步功能的函式內。為此,只需使用 `async def` 宣告函式:
```Python hl_lines="1"
async def get_burgers(number: int):
- # Do some asynchronous stuff to create the burgers
+ # 做一些非同步的事情來製作漢堡
return burgers
```
-...而不是 `def`:
+...而不是 `def`:
```Python hl_lines="2"
-# This is not asynchronous
+# 這不是非同步的
def get_sequential_burgers(number: int):
- # Do some sequential stuff to create the burgers
+ # 做一些循序的事情來製作漢堡
return burgers
```
-使用 `async def`,Python 知道在該函式內需要注意 `await`,並且它可以「暫停」 ⏸ 執行該函式,然後執行其他任務 🔀 後回來。
+使用 `async def`,Python 知道在該函式內需要注意 `await` 運算式,並且它可以「暫停」⏸ 執行該函式,然後執行其他任務 🔀 後回來。
當你想要呼叫 `async def` 函式時,必須使用「await」。因此,這樣寫將無法運行:
```Python
-# This won't work, because get_burgers was defined with: async def
+# 這不會運作,因為 get_burgers 是用 async def 定義的
burgers = get_burgers(2)
```
---
-如果你正在使用某個函式庫,它告訴你可以使用 `await` 呼叫它,那麼你需要用 `async def` 定義*路徑操作函式*,如:
+如果你正在使用某個函式庫,它告訴你可以使用 `await` 呼叫它,那麼你需要用 `async def` 建立使用它的*路徑操作函式*,如:
```Python hl_lines="2-3"
@app.get('/burgers')
@@ -357,7 +357,7 @@ async def read_burgers():
那麼,這就像「先有雞還是先有蛋」的問題,要如何呼叫第一個 `async` 函式呢?
-如果你使用 FastAPI,無需擔心這個問題,因為「第一個」函式將是你的*路徑操作函式*,FastAPI 會知道如何正確處理這個問題。
+如果你使用 **FastAPI**,無需擔心這個問題,因為「第一個」函式將是你的*路徑操作函式*,FastAPI 會知道如何正確處理這個問題。
但如果你想在沒有 FastAPI 的情況下使用 `async` / `await`,你也可以這樣做。
@@ -367,9 +367,9 @@ Starlette(和 **FastAPI**)是基於 [AnyIO](https://anyio.readthedocs.io/en/
特別是,你可以直接使用 [AnyIO](https://anyio.readthedocs.io/en/stable/) 來處理更複雜的並行使用案例,這些案例需要你在自己的程式碼中使用更高階的模式。
-即使你不使用 **FastAPI**,你也可以使用 [AnyIO](https://anyio.readthedocs.io/en/stable/) 來撰寫自己的非同步應用程式,並獲得高相容性及一些好處(例如「結構化並行」)。
+即使你不使用 FastAPI,你也可以使用 [AnyIO](https://anyio.readthedocs.io/en/stable/) 來撰寫自己的非同步應用程式,並獲得高相容性及一些好處(例如*結構化並行*)。
-我另外在 AnyIO 之上做了一個薄封裝的函式庫,稍微改進型別註解以獲得更好的**自動補全**、**即時錯誤**等。同時它也提供友善的介紹與教學,幫助你**理解**並撰寫**自己的非同步程式碼**:[Asyncer](https://asyncer.tiangolo.com/)。當你需要**將非同步程式碼與一般**(阻塞/同步)**程式碼整合**時,它特別實用。
+我另外在 AnyIO 之上做了一個薄封裝的函式庫,稍微改進型別註解以獲得更好的**自動補全**、**即時錯誤**等。同時它也提供友善的介紹與教學,幫助你**理解**並撰寫**自己的非同步程式碼**:[Asyncer](https://asyncer.tiangolo.com/)。當你需要**將非同步程式碼與一般**(阻塞 / 同步)**程式碼整合**時,它特別實用。
### 其他形式的非同步程式碼 { #other-forms-of-asynchronous-code }
@@ -381,21 +381,21 @@ Starlette(和 **FastAPI**)是基於 [AnyIO](https://anyio.readthedocs.io/en/
但在此之前,處理非同步程式碼要更加複雜和困難。
-在較舊的 Python 版本中,你可能會使用多執行緒或 [Gevent](https://www.gevent.org/)。但這些程式碼要更難以理解、調試和思考。
+在較舊的 Python 版本中,你可能會使用多執行緒或 [Gevent](https://www.gevent.org/)。但這些程式碼要更難以理解、偵錯和思考。
-在較舊的 NodeJS / 瀏覽器 JavaScript 中,你會使用「回呼」,這可能會導致“回呼地獄”。
+在較舊的 NodeJS / 瀏覽器 JavaScript 中,你會使用「回呼」。這可能會導致「回呼地獄」。
## 協程 { #coroutines }
-「協程」只是 `async def` 函式所回傳的非常特殊的事物名稱。Python 知道它是一個類似函式的東西,可以啟動它,並且在某個時刻它會結束,但它也可能在內部暫停 ⏸,只要遇到 `await`。
+**協程**只是 `async def` 函式所回傳的非常特殊的事物名稱。Python 知道它是一個類似函式的東西,可以啟動它,並且在某個時刻它會結束,但它也可能在內部暫停 ⏸,只要遇到 `await`。
-這種使用 `async` 和 `await` 的非同步程式碼功能通常被概括為「協程」。這與 Go 語言的主要特性「Goroutines」相似。
+但這種使用 `async` 和 `await` 的非同步程式碼功能,通常被概括為使用「協程」。這與 Go 語言的主要特性「Goroutines」相似。
## 結論 { #conclusion }
讓我們再次回顧之前的句子:
-> 現代版本的 Python 支持使用 **"協程"** 的 **`async` 和 `await`** 語法來寫 **"非同步程式碼"**。
+> 現代版本的 Python 支援使用稱為 **「協程」** 的東西,透過 **`async` 和 `await`** 語法來寫 **「非同步程式碼」**。
現在應該能明白其含意了。✨
@@ -407,7 +407,7 @@ Starlette(和 **FastAPI**)是基於 [AnyIO](https://anyio.readthedocs.io/en/
你大概可以跳過這段。
-這裡是有關 FastAPI 內部技術細節。
+這裡是有關 **FastAPI** 底層如何運作的非常技術性的細節。
如果你有相當多的技術背景(例如協程、執行緒、阻塞等),並且對 FastAPI 如何處理 `async def` 與常規 `def` 感到好奇,請繼續閱讀。
@@ -415,9 +415,9 @@ Starlette(和 **FastAPI**)是基於 [AnyIO](https://anyio.readthedocs.io/en/
### 路徑操作函式 { #path-operation-functions }
-當你使用 `def` 而不是 `async def` 宣告*路徑操作函式*時,該函式會在外部的執行緒池(threadpool)中執行,然後等待結果,而不是直接呼叫(因為這樣會阻塞伺服器)。
+當你使用一般的 `def` 而不是 `async def` 宣告*路徑操作函式*時,該函式會在外部的執行緒池(threadpool)中執行,然後等待結果,而不是直接呼叫(因為這樣會阻塞伺服器)。
-如果你來自於其他不以這種方式運作的非同步框架,而且你習慣於使用普通的 `def` 定義僅進行簡單計算的*路徑操作函式*,目的是獲得微小的性能增益(大約 100 奈秒),請注意,在 FastAPI 中,效果會完全相反。在這些情況下,最好使用 `async def`,除非你的*路徑操作函式*執行阻塞的 I/O 的程式碼。
+如果你來自於其他不以這種方式運作的非同步框架,而且你習慣於使用普通的 `def` 定義僅進行簡單計算的*路徑操作函式*,目的是獲得微小的效能增益(大約 100 奈秒),請注意,在 **FastAPI** 中,效果會完全相反。在這些情況下,最好使用 `async def`,除非你的*路徑操作函式*執行阻塞的 I/O 的程式碼。
不過,在這兩種情況下,**FastAPI** [仍然很快](index.md#performance),至少與你之前的框架相當(或者更快)。
@@ -427,18 +427,18 @@ Starlette(和 **FastAPI**)是基於 [AnyIO](https://anyio.readthedocs.io/en/
### 子依賴項 { #sub-dependencies }
-你可以擁有多個相互依賴的依賴項和[子依賴項](tutorial/dependencies/sub-dependencies.md)(作為函式定義的參數),其中一些可能是用 `async def` 宣告,也可能是用 `def` 宣告。它們仍然可以正常運作,用 `def` 定義的那些將會在外部的執行緒中呼叫(來自執行緒池),而不是被「等待」。
+你可以擁有多個相互依賴的依賴項和[子依賴項](tutorial/dependencies/sub-dependencies.md)(作為函式定義的參數),其中一些可能是用 `async def` 宣告,也可能是用一般的 `def` 宣告。它們仍然可以正常運作,用一般的 `def` 定義的那些將會在外部的執行緒中呼叫(來自執行緒池),而不是被「等待」。
### 其他輔助函式 { #other-utility-functions }
-你可以直接呼叫任何使用 `def` 或 `async def` 建立的其他輔助函式,FastAPI 不會影響你呼叫它們的方式。
+你可以直接呼叫任何使用一般的 `def` 或 `async def` 建立的其他輔助函式,FastAPI 不會影響你呼叫它們的方式。
-這與 FastAPI 為你呼叫*路徑操作函式*和依賴項的邏輯有所不同。
+這與 FastAPI 為你呼叫的函式有所不同:*路徑操作函式*和依賴項。
-如果你的輔助函式是用 `def` 宣告的,它將會被直接呼叫(按照你在程式碼中撰寫的方式),而不是在執行緒池中。如果該函式是用 `async def` 宣告,那麼你在呼叫時應該使用 `await` 等待其結果。
+如果你的輔助函式是用 `def` 宣告的一般函式,它將會被直接呼叫(按照你在程式碼中撰寫的方式),而不是在執行緒池中。如果該函式是用 `async def` 宣告,那麼你在程式碼中呼叫它時應該使用 `await` 等待其結果。
---
再一次強調,這些都是非常技術性的細節,如果你特地在尋找這些資訊,這些內容可能會對你有幫助。
-否則,只需遵循上面提到的指引即可:趕時間嗎?。
+否則,只需遵循上面提到章節的指引即可:趕時間嗎?。
diff --git a/docs/zh-hant/docs/deployment/cloud.md b/docs/zh-hant/docs/deployment/cloud.md
index 86d216ca6..caf05ec16 100644
--- a/docs/zh-hant/docs/deployment/cloud.md
+++ b/docs/zh-hant/docs/deployment/cloud.md
@@ -16,7 +16,7 @@ FastAPI Cloud 是 *FastAPI and friends* 開源專案的主要贊助與資金提
## 雲端供應商 - 贊助商 { #cloud-providers-sponsors }
-其他一些雲端供應商也會 ✨ [**贊助 FastAPI**](../help-fastapi.md#sponsor-the-author) ✨。🙇
+其他一些雲端供應商也會 ✨ [**贊助 FastAPI**](https://github.com/sponsors/tiangolo) ✨。🙇
你也可以參考他們的指南並試用其服務:
diff --git a/docs/zh-hant/docs/deployment/concepts.md b/docs/zh-hant/docs/deployment/concepts.md
index 0b8677bfd..070bcf544 100644
--- a/docs/zh-hant/docs/deployment/concepts.md
+++ b/docs/zh-hant/docs/deployment/concepts.md
@@ -1,5 +1,6 @@
# 部署概念 { #deployments-concepts }
+
當你要部署一個 FastAPI 應用,或其實任何類型的 Web API 時,有幾個你可能在意的概念。掌握這些概念後,你就能找出最適合部署你應用的方式。
一些重要的概念包括:
diff --git a/docs/zh-hant/docs/deployment/docker.md b/docs/zh-hant/docs/deployment/docker.md
index 03b9f2f76..b10299def 100644
--- a/docs/zh-hant/docs/deployment/docker.md
+++ b/docs/zh-hant/docs/deployment/docker.md
@@ -132,7 +132,7 @@ Successfully installed fastapi pydantic
@@ -34,7 +34,7 @@
{* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py hl[19] *}
-...由於 `description` 有預設值,就算你沒有為該欄位回傳任何內容,它仍會有那個預設值。
+...由於 `description` 有預設值,就算你**沒有為該欄位回傳任何內容**,它仍會有那個**預設值**。
### 輸出回應資料的模型 { #model-for-output-response-data }
@@ -44,20 +44,20 @@
@@ -67,25 +67,25 @@
如果你查看 OpenAPI 中所有可用的結構描述(JSON Schema),會看到有兩個:`Item-Input` 與 `Item-Output`。
-對於 `Item-Input`,`description` 不是必填,沒有紅色星號。
+對於 `Item-Input`,`description` **不是必填**,沒有紅色星號。
-但對於 `Item-Output`,`description` 是必填,有紅色星號。
+但對於 `Item-Output`,`description` 是**必填**,有紅色星號。
diff --git a/docs/zh-hant/docs/index.md b/docs/zh-hant/docs/index.md
index 09974e59d..743357b96 100644
--- a/docs/zh-hant/docs/index.md
+++ b/docs/zh-hant/docs/index.md
@@ -277,7 +277,7 @@ INFO: Application startup complete.
fastapi dev...
-請注意,這表示「`one_person` 是類別 `Person` 的『實例(instance)』」。
+請注意,這表示「`one_person` 是類別 `Person` 的**實例(instance)**」。
-並不是「`one_person` 就是名為 `Person` 的『類別(class)』」。
+並不是「`one_person` 就是名為 `Person` 的**類別(class)**」。
## Pydantic 模型 { #pydantic-models }
@@ -295,7 +295,7 @@ def some_function(data: Any):
## 含中繼資料的型別提示 { #type-hints-with-metadata-annotations }
-Python 也有一個功能,允許使用 `Annotated` 在這些型別提示中放入額外的中繼資料。
+Python 也有一個功能,允許使用 `Annotated` 在這些型別提示中放入**額外的中繼資料**。
你可以從 `typing` 匯入 `Annotated`。
@@ -305,15 +305,15 @@ Python 本身不會對這個 `Annotated` 做任何事。對編輯器與其他工
但你可以利用 `Annotated` 這個空間,來提供 **FastAPI** 額外的中繼資料,告訴它你希望應用程式如何運作。
-重要的是要記住,傳給 `Annotated` 的「第一個型別參數」才是「真正的型別」。其餘的,都是給其他工具用的中繼資料。
+重要的是要記住,傳給 `Annotated` 的**第一個*型別參數***才是**實際型別**。其餘的,都是給其他工具用的中繼資料。
目前你只需要知道 `Annotated` 的存在,而且它是標準的 Python。😎
-之後你會看到它有多「強大」。
+之後你會看到它有多**強大**。
/// tip | 提示
-因為這是「標準 Python」,所以你在編輯器、分析與重構程式碼的工具等方面,仍然能獲得「最佳的開發體驗」。✨
+因為這是**標準 Python**,所以你在編輯器、分析與重構程式碼的工具等方面,仍然能獲得**最佳的開發體驗**。✨
而且你的程式碼也會與許多其他 Python 工具與程式庫非常相容。🚀
@@ -325,17 +325,17 @@ Python 本身不會對這個 `Annotated` 做任何事。對編輯器與其他工
在 **FastAPI** 中,你用型別提示來宣告參數,然後你會得到:
-* 編輯器支援
-* 型別檢查
+* **編輯器支援**。
+* **型別檢查**。
...而 **FastAPI** 也會用同樣的宣告來:
-* 定義需求:來自請求的路徑參數、查詢參數、標頭、主體(body)、相依性等
-* 轉換資料:把請求中的資料轉成所需型別
-* 驗證資料:來自每個請求的資料:
- * 當資料無效時,自動產生錯誤並回傳給用戶端
-* 使用 OpenAPI 書寫 API 文件:
- * 之後會由自動的互動式文件介面所使用
+* **定義需求**:來自請求的路徑參數、查詢參數、標頭、主體(body)、相依性等。
+* **轉換資料**:把請求中的資料轉成所需型別。
+* **驗證資料**:來自每個請求的資料:
+ * 當資料無效時,產生回傳給用戶端的**自動錯誤**。
+* 使用 OpenAPI **記錄** API:
+ * 之後會由自動的互動式文件介面所使用。
這些現在聽起來可能有點抽象。別擔心。你會在[教學 - 使用者指南](tutorial/index.md)中看到它們的實際運作。
diff --git a/docs/zh-hant/docs/tutorial/bigger-applications.md b/docs/zh-hant/docs/tutorial/bigger-applications.md
index 73adef3f0..624b2c2bc 100644
--- a/docs/zh-hant/docs/tutorial/bigger-applications.md
+++ b/docs/zh-hant/docs/tutorial/bigger-applications.md
@@ -17,16 +17,16 @@ FastAPI 提供了一個方便的工具,讓你在維持彈性的同時,幫你
```
.
├── app
-│ ├── __init__.py
-│ ├── main.py
-│ ├── dependencies.py
-│ └── routers
-│ │ ├── __init__.py
-│ │ ├── items.py
-│ │ └── users.py
-│ └── internal
-│ ├── __init__.py
-│ └── admin.py
+│ ├── __init__.py
+│ ├── main.py
+│ ├── dependencies.py
+│ └── routers
+│ │ ├── __init__.py
+│ │ ├── items.py
+│ │ └── users.py
+│ └── internal
+│ ├── __init__.py
+│ └── admin.py
```
/// tip | 提示
@@ -396,9 +396,9 @@ from .routers.users import router
/// note | 技術細節
-實際上,它會在內部為 `APIRouter` 中宣告的每一個「路徑操作」建立一個對應的「路徑操作」。
+當 router 被納入主應用時,FastAPI 會保留原本的 `APIRouter` 與其 `APIRoute` 仍然是活的。
-所以在幕後,它實際運作起來就像是一個單一的應用。
+這表示自訂的 `APIRouter` 與 `APIRoute` 子類別在被納入之後依然會參與運作。
///
@@ -406,7 +406,7 @@ from .routers.users import router
把 router 納入時不需要擔心效能。
-這只會在啟動時花費微秒等級,且只發生一次。
+這個設計相當輕量,且避免為每次請求增加額外負擔。
因此不會影響效能。⚡
@@ -461,7 +461,7 @@ from .routers.users import router
這是因為我們要把它們的路徑操作包含進 OpenAPI 結構與使用者介面中。
-由於無法將它們隔離並獨立「掛載」,所以這些路徑操作會被「複製」(重新建立),而不是直接包含進來。
+FastAPI 會保留原始的 routers 與路徑操作處於活躍狀態,並在處理請求與產生 OpenAPI 時,合併 router 的前綴、相依性、標籤、回應與其他中繼資料。
///
@@ -532,4 +532,16 @@ $ fastapi dev
router.include_router(other_router)
```
-請確保在把 `router` 納入 `FastAPI` 應用之前先這麼做,這樣 `other_router` 的路徑操作也會被包含進去。
+你可以在把 `router` 納入 `FastAPI` 應用的前或後這麼做。FastAPI 仍會在路由與 OpenAPI 中包含 `other_router` 的路徑操作。
+
+同樣地,之後新增到這些 routers 的路徑操作也適用。透過先前的納入,它們也會被看見。
+
+/// warning | 技術細節
+
+避免在納入 router 之後直接修改 `router.routes`。FastAPI 將 router 的納入視為即時的,因此原始 router 與其 routes 仍然是路由與 OpenAPI 產生的一部分。
+
+請使用有文件記載的 API,例如路徑操作的裝飾器與 `.include_router()` 來新增路由與 routers。
+
+把 `router.routes` 視為較低階的路由樹結構,它可能同時包含路由定義與被納入的 routers,避免將它當成最終路徑操作的扁平清單來依賴。
+
+///
diff --git a/docs/zh-hant/docs/tutorial/body-multiple-params.md b/docs/zh-hant/docs/tutorial/body-multiple-params.md
index 1c334f51f..e511b2ea5 100644
--- a/docs/zh-hant/docs/tutorial/body-multiple-params.md
+++ b/docs/zh-hant/docs/tutorial/body-multiple-params.md
@@ -108,7 +108,7 @@ q: str | None = None
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info | 注意
+/// note | 注意
`Body` 也具有與 `Query`、`Path` 以及之後你會看到的其他工具相同的額外驗證與中繼資料參數。
@@ -123,7 +123,7 @@ q: str | None = None
但如果你想讓它像宣告多個 Body 參數時那樣,期望一個帶有 `item` 鍵、其內含模型內容的 JSON,你可以使用 `Body` 的特殊參數 `embed`:
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
如下:
diff --git a/docs/zh-hant/docs/tutorial/body-nested-models.md b/docs/zh-hant/docs/tutorial/body-nested-models.md
index f7b8627b4..4e2e6427c 100644
--- a/docs/zh-hant/docs/tutorial/body-nested-models.md
+++ b/docs/zh-hant/docs/tutorial/body-nested-models.md
@@ -1,5 +1,6 @@
# Body - 巢狀模型 { #body-nested-models }
+
使用 **FastAPI**,你可以定義、驗證、文件化,並使用任意深度的巢狀模型(感謝 Pydantic)。
## 列表欄位 { #list-fields }
@@ -134,8 +135,7 @@ my_list: list[str]
]
}
```
-
-/// info
+/// note
注意 `images` 鍵現在是一個由 image 物件組成的列表。
@@ -147,7 +147,7 @@ my_list: list[str]
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info
+/// note
請注意,`Offer` 具有一個 `Item` 的列表,而每個 `Item` 又有一個可選的 `Image` 列表。
diff --git a/docs/zh-hant/docs/tutorial/body.md b/docs/zh-hant/docs/tutorial/body.md
index 08246f513..f1ba8e954 100644
--- a/docs/zh-hant/docs/tutorial/body.md
+++ b/docs/zh-hant/docs/tutorial/body.md
@@ -8,7 +8,7 @@
要宣告**請求**本文,你會使用 [Pydantic](https://docs.pydantic.dev/) 模型,享受其完整的功能與優點。
-/// info
+/// note
要傳送資料,應使用下列其中一種方法:`POST`(最常見)、`PUT`、`DELETE` 或 `PATCH`。
@@ -32,6 +32,7 @@
{* ../../docs_src/body/tutorial001_py310.py hl[5:9] *}
+
就和宣告查詢參數時一樣,當模型屬性有預設值時,它就不是必填;否則就是必填。使用 `None` 可使其成為選填。
例如,上述模型對應的 JSON「`object`」(或 Python `dict`)如下:
@@ -135,6 +136,7 @@
{* ../../docs_src/body/tutorial003_py310.py hl[15:16] *}
+
## 請求本文 + 路徑 + 查詢參數 { #request-body-path-query-parameters }
你也可以同時宣告**本文**、**路徑**與**查詢**參數。
diff --git a/docs/zh-hant/docs/tutorial/cookie-param-models.md b/docs/zh-hant/docs/tutorial/cookie-param-models.md
index 8997903e3..7eade4b86 100644
--- a/docs/zh-hant/docs/tutorial/cookie-param-models.md
+++ b/docs/zh-hant/docs/tutorial/cookie-param-models.md
@@ -32,7 +32,7 @@
get 操作
+* 使用 get 操作
-/// info | `@decorator` 說明
+/// note | `@decorator` 說明
Python 中的 `@something` 語法被稱為「裝飾器」。
@@ -361,7 +353,7 @@ Python 中的 `@something` 語法被稱為「裝飾器」。
///
-### 第四步:定義「路徑操作函式」 { #step-4-define-the-path-operation-function }
+### 第四步:定義**路徑操作函式** { #step-4-define-the-path-operation-function }
這是我們的「**路徑操作函式**」:
@@ -385,7 +377,7 @@ Python 中的 `@something` 語法被稱為「裝飾器」。
/// note
-如果你不知道差別,請查看 [Async: *"In a hurry?"*](../async.md#in-a-hurry)。
+如果你不知道差別,請查看 [Async:*「很趕時間?」*](../async.md#in-a-hurry)。
///
@@ -407,11 +399,11 @@ Python 中的 `@something` 語法被稱為「裝飾器」。
**[FastAPI Cloud](https://fastapicloud.com)** 由 **FastAPI** 的作者與團隊打造。
-它讓你以最小的成本完成 API 的**建置**、**部署**與**存取**流程。
+它讓你以最少的心力簡化 API 的**建置**、**部署**與**存取**流程。
它把用 FastAPI 開發應用的同樣**開發者體驗**帶到將應用**部署**到雲端的流程中。🎉
-FastAPI Cloud 也是「FastAPI 與其好友」這些開源專案的主要贊助與資金提供者。✨
+FastAPI Cloud 也是 *FastAPI 與其好友* 這些開源專案的主要贊助與資金提供者。✨
#### 部署到其他雲端供應商 { #deploy-to-other-cloud-providers }
@@ -423,7 +415,7 @@ FastAPI 是開源並基於標準的。你可以把 FastAPI 應用部署到你選
* 引入 `FastAPI`。
* 建立一個 `app` 實例。
-* 寫一個「路徑操作裝飾器」,像是 `@app.get("/")`。
-* 定義一個「路徑操作函式」;例如,`def root(): ...`。
+* 寫一個**路徑操作裝飾器**,像是 `@app.get("/")`。
+* 定義一個**路徑操作函式**;例如,`def root(): ...`。
* 使用命令 `fastapi dev` 執行開發伺服器。
* 可選:使用 `fastapi deploy` 部署你的應用程式。
diff --git a/docs/zh-hant/docs/tutorial/frontend.md b/docs/zh-hant/docs/tutorial/frontend.md
new file mode 100644
index 000000000..0c568b9f5
--- /dev/null
+++ b/docs/zh-hant/docs/tutorial/frontend.md
@@ -0,0 +1,133 @@
+# 前端 { #frontend }
+
+你可以使用 `app.frontend()`(或 `router.frontend()`)來提供靜態前端應用程式。
+
+這對會產生靜態檔案的前端工具很有用,例如搭配 Vite 的 React、TanStack Router、Astro、Vue、Svelte、Angular、Solid 等。
+
+使用這些工具時,你通常會有一個建置前端的步驟,使用像這樣的指令:
+
+```bash
+npm run build
+```
+
+那會產生像 `./dist/` 這樣的目錄,裡面包含你的前端檔案。
+
+你可以使用 `app.frontend()` 依照這些前端框架所需的慣例來提供該目錄。
+
+**FastAPI** 會先檢查*路徑操作*。只有在沒有一般路由符合時,才會檢查前端檔案,因此你的 API 不會受到影響。
+
+## 提供前端 { #serve-a-frontend }
+
+在建置前端之後,例如使用 `npm run build`,將產生的檔案放在某個目錄中,例如 `dist`。
+
+你的專案結構可能如下:
+
+```text
+.
+├── pyproject.toml
+├── app
+│ ├── __init__.py
+│ └── main.py
+└── dist
+ ├── index.html
+ └── assets
+ └── app.js
+```
+
+然後使用 `app.frontend()` 來提供它:
+
+{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
+
+如此一來,對 `/assets/app.js` 的請求就可以提供 `dist/assets/app.js`。
+
+如果你也有 **FastAPI** *路徑操作*,則*路徑操作*會優先。
+
+## 用戶端路由 { #client-side-routing }
+
+許多前端應用程式,包括 **single-page apps**(SPAs),都會使用用戶端路由。像 `/dashboard/settings` 這樣的路徑可能不是真實檔案,而是由框架負責處理。
+
+因此,如果直接存取該 URL(而不是透過應用程式內導覽),後端應該從 `index.html` 提供前端應用程式,讓前端框架接著處理用戶端路由。
+
+為此,請使用 `fallback="index.html"`:
+
+{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *}
+
+**FastAPI** 只會對看起來像瀏覽器導覽的 `GET` 和 `HEAD` 請求使用這個 fallback。遺失的檔案,例如 JavaScript、CSS 和圖片,仍會回傳 `404`。
+
+對於只符合前端 fallback 的路徑,使用其他方法的請求,例如 `POST` 或 `PUT`,也會回傳 `404`。一般的 **FastAPI** *路徑操作*仍然比前端路由有更高優先順序。
+
+/// tip
+
+預設情況下,`fallback` 的值是 `fallback="auto"`。在大多數情況下,你不需要指定 `fallback`。請閱讀下方內容以了解詳細資訊。
+
+///
+
+這正是許多使用用戶端路由的前端應用程式所需要的行為,例如搭配 TanStack Router 的 React、Vue、Angular、SvelteKit 或 Solid。
+
+## 自訂 404 頁面 { #custom-404-page }
+
+你也可以為遺失的前端路徑提供靜態 `404.html` 頁面:
+
+{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *}
+
+該回應會保留 `404` 狀態碼。
+
+在這種情況下,**FastAPI** 不會為遺失的前端路徑提供 `index.html`。它會改為回傳 `404.html` 檔案。
+
+/// tip
+
+預設情況下,`fallback` 的值是 `fallback="auto"`。如此一來,如果找到 `404.html` 檔案,就會自動將其用作 fallback。
+
+因此,你通常可以省略 `fallback` 引數。
+
+///
+
+這對會為每個頁面產生靜態 HTML 檔案的前端工具很有用,例如 Astro。
+
+## 自動 Fallback { #fallback-auto }
+
+預設情況下,`app.frontend()` 會使用 `fallback="auto"`。
+
+如果前端目錄中有 `404.html` 檔案,遺失的前端路徑會提供該檔案,並使用狀態碼 `404`。
+
+否則,如果有 `index.html` 檔案,遺失的瀏覽器導覽路徑會提供 `index.html`,這正是許多使用用戶端路由的前端應用程式所預期的行為。
+
+因此,在大多數情況下,你可以使用 `app.frontend("/", directory="dist")`,而不需要指定 `fallback` 引數。
+
+{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
+
+## 停用 Fallback { #disable-fallback }
+
+如果你不想為遺失的前端路徑提供 fallback 檔案,請使用 `fallback=None`:
+
+{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *}
+
+接著,遺失的前端路徑會回傳一般的 `404`。
+
+## 檢查目錄 { #check-directory }
+
+預設情況下,`app.frontend()` 會在建立應用程式時檢查目錄是否存在。
+
+這有助於及早發現設定錯誤。例如,如果缺少前端建置輸出目錄,**FastAPI** 會在啟動時引發錯誤。
+
+如果你的前端檔案稍後才會建立,例如在建立 app 物件之後由另一個建置步驟產生,請設定 `check_dir=False`:
+
+{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *}
+
+使用 `check_dir=False` 時,**FastAPI** 不會在建立應用程式時檢查目錄。如果在處理請求時,設定的目錄仍然不存在,**FastAPI** 會在那時引發錯誤。
+
+## 與 `APIRouter` 搭配使用 { #use-it-with-apirouter }
+
+你也可以將前端檔案加入 `APIRouter`,並使用前綴包含它:
+
+{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *}
+
+在這個範例中,前端路徑會在 `/app` 底下提供。
+
+應用程式中的任何一般*路徑操作*仍會優先,包括其他 router 中的路徑操作。
+
+## 僅限靜態建置輸出 { #static-build-output-only }
+
+`app.frontend()` 會提供你的前端建置已經產生的檔案。
+
+它不會執行 server-side rendering。它適用於會產生靜態檔案的前端框架,不適用於需要在伺服器上為每個請求進行動態 rendering 的框架。
diff --git a/docs/zh-hant/docs/tutorial/handling-errors.md b/docs/zh-hant/docs/tutorial/handling-errors.md
index b1ffd3e03..dc6d7a7cc 100644
--- a/docs/zh-hant/docs/tutorial/handling-errors.md
+++ b/docs/zh-hant/docs/tutorial/handling-errors.md
@@ -11,13 +11,13 @@
* 用戶端嘗試存取的項目不存在。
* 等等。
-在這些情況下,通常會回傳範圍為 400(400 到 499)的 HTTP 狀態碼。
+在這些情況下,通常會回傳範圍為 **400**(400 到 499)的 **HTTP 狀態碼**。
這類似於 200 範圍的 HTTP 狀態碼(200 到 299)。那些「200」狀態碼表示請求在某種程度上是「成功」的。
400 範圍的狀態碼表示用戶端錯誤。
-還記得那些「404 Not Found」錯誤(和梗)嗎?
+還記得那些 **「404 Not Found」** 錯誤(和梗)嗎?
## 使用 `HTTPException` { #use-httpexception }
diff --git a/docs/zh-hant/docs/tutorial/index.md b/docs/zh-hant/docs/tutorial/index.md
index e19121511..e20c9ca24 100644
--- a/docs/zh-hant/docs/tutorial/index.md
+++ b/docs/zh-hant/docs/tutorial/index.md
@@ -98,4 +98,4 @@ FastAPI 提供了 [VS Code 官方擴充功能](https://marketplace.visualstudio.
但首先你應該閱讀**教學 - 使用者指南**(你正在閱讀的內容)。
-它被設計成你可以使用**教學 - 使用者指南**來建立一個完整的應用程式,然後根據你的需求,使用一些額外的想法來擴展它。
+它被設計成你可以使用**教學 - 使用者指南**來建立一個完整的應用程式,然後根據你的需求,使用**進階使用者指南**中的一些額外想法,以不同方式擴展它。
diff --git a/docs/zh-hant/docs/tutorial/metadata.md b/docs/zh-hant/docs/tutorial/metadata.md
index 720b5d87c..55fa4bdbf 100644
--- a/docs/zh-hant/docs/tutorial/metadata.md
+++ b/docs/zh-hant/docs/tutorial/metadata.md
@@ -1,6 +1,6 @@
# 中繼資料與文件 URL { #metadata-and-docs-urls }
-你可以在你的 FastAPI 應用程式中自訂多項中繼資料設定。
+你可以在你的 **FastAPI** 應用程式中自訂多項中繼資料設定。
## API 的中繼資料 { #metadata-for-api }
@@ -11,7 +11,7 @@
| `title` | `str` | API 的標題。 |
| `summary` | `str` | API 的簡短摘要。自 OpenAPI 3.1.0、FastAPI 0.99.0 起可用。 |
| `description` | `str` | API 的簡短說明。可使用 Markdown。 |
-| `version` | `string` | API 的版本號。這是你自己的應用程式版本,不是 OpenAPI 的版本,例如 `2.5.0`。 |
+| `version` | `str` | API 的版本號。這是你自己的應用程式版本,不是 OpenAPI 的版本,例如 `2.5.0`。 |
| `terms_of_service` | `str` | 指向 API 服務條款的 URL。若提供,必須是 URL。 |
| `contact` | `dict` | 對外公開的 API 聯絡資訊。可包含多個欄位。contact 欄位| 參數 | 型別 | 說明 |
|---|---|---|
name | str | 聯絡人/組織的識別名稱。 |
url | str | 指向聯絡資訊的 URL。必須是 URL 格式。 |
email | str | 聯絡人/組織的電子郵件地址。必須是電子郵件格式。 |
license_info 欄位| 參數 | 型別 | 說明 |
|---|---|---|
name | str | 必填(若有設定 license_info)。API 使用的授權名稱。 |
identifier | str | API 的 [SPDX](https://spdx.org/licenses/) 授權表示式。identifier 欄位與 url 欄位互斥。自 OpenAPI 3.1.0、FastAPI 0.99.0 起可用。 |
url | str | API 所採用授權的 URL。必須是 URL 格式。 |
-/// check
+/// tip
同樣地,只要使用那個 Python 型別宣告,**FastAPI** 就會提供自動、互動式的文件(整合 Swagger UI)。
diff --git a/docs/zh-hant/docs/tutorial/query-params-str-validations.md b/docs/zh-hant/docs/tutorial/query-params-str-validations.md
index 0932c8d90..99690708e 100644
--- a/docs/zh-hant/docs/tutorial/query-params-str-validations.md
+++ b/docs/zh-hant/docs/tutorial/query-params-str-validations.md
@@ -1,6 +1,6 @@
# 查詢參數與字串驗證 { #query-parameters-and-string-validations }
-FastAPI 允許你為參數宣告額外的資訊與驗證。
+**FastAPI** 允許你為參數宣告額外的資訊與驗證。
以下面這個應用為例:
@@ -18,18 +18,18 @@ FastAPI 會因為預設值是 `= None` 而知道 `q` 不是必填。
## 額外驗證 { #additional-validation }
-我們要強制:即使 `q` 是可選,只要提供了,長度就不能超過 50 個字元。
+我們要強制:即使 `q` 是可選,只要提供了,**長度就不能超過 50 個字元**。
### 匯入 `Query` 與 `Annotated` { #import-query-and-annotated }
要達成這點,先匯入:
-- 從 `fastapi` 匯入 `Query`
-- 從 `typing` 匯入 `Annotated`
+* 從 `fastapi` 匯入 `Query`
+* 從 `typing` 匯入 `Annotated`
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | 說明
+/// note | 注意
FastAPI 自 0.95.0 版起加入並開始推薦使用 `Annotated`。
@@ -69,19 +69,19 @@ q: Annotated[str | None] = None
注意預設值仍然是 `None`,所以這個參數仍是可選。
-不過,現在在 `Annotated` 裡有 `Query(max_length=50)`,我們就告訴 FastAPI 要對這個值做「額外驗證」,最多 50 個字元即可。😎
+不過,現在在 `Annotated` 裡有 `Query(max_length=50)`,我們就告訴 FastAPI 要對這個值做**額外驗證**,最多 50 個字元即可。😎
/// tip | 提示
-這裡用的是 `Query()`,因為這是「查詢參數」。稍後你會看到 `Path()`、`Body()`、`Header()`、`Cookie()` 等,它們也接受與 `Query()` 相同的參數。
+這裡用的是 `Query()`,因為這是**查詢參數**。稍後你會看到 `Path()`、`Body()`、`Header()`、`Cookie()` 等,它們也接受與 `Query()` 相同的參數。
///
FastAPI 現在會:
-- 驗證資料,確保長度最多 50 個字元
-- 當資料不合法時,回給用戶端清楚的錯誤
-- 在 OpenAPI 的路徑操作中文件化該參數(因此會出現在自動文件 UI)
+* **驗證**資料,確保長度最多 50 個字元
+* 當資料不合法時,回給用戶端**清楚的錯誤**
+* 在 OpenAPI schema *路徑操作*中**文件化**該參數(因此會出現在**自動文件 UI**)
## 替代方式(舊):將 `Query` 作為預設值 { #alternative-old-query-as-the-default-value }
@@ -105,7 +105,8 @@ FastAPI 現在會:
q: str | None = Query(default=None)
```
-…會讓參數變為可選、預設值是 `None`,等同於:
+...會讓參數變為可選、預設值是 `None`,等同於:
+
```Python
q: str | None = None
@@ -119,7 +120,7 @@ q: str | None = None
q: str | None = Query(default=None, max_length=50)
```
-這一樣會驗證資料、在資料不合法時顯示清楚錯誤,並在 OpenAPI 的路徑操作中文件化該參數。
+這一樣會驗證資料、在資料不合法時顯示清楚錯誤,並在 OpenAPI schema *路徑操作*中文件化該參數。
### 將 `Query` 作為預設值或放在 `Annotated` 中 { #query-as-the-default-value-or-in-annotated }
@@ -133,7 +134,7 @@ q: str | None = Query(default=None, max_length=50)
q: Annotated[str, Query(default="rick")] = "morty"
```
-…因為不清楚預設值到底該是 `"rick"` 還是 `"morty"`。
+...因為不清楚預設值到底該是 `"rick"` 還是 `"morty"`。
因此,你可以(且更推薦)這樣寫:
@@ -141,7 +142,7 @@ q: Annotated[str, Query(default="rick")] = "morty"
q: Annotated[str, Query()] = "rick"
```
-…或在較舊的程式碼中你會看到:
+...或在較舊的程式碼中你會看到:
```Python
q: str = Query(default="rick")
@@ -149,13 +150,13 @@ q: str = Query(default="rick")
### `Annotated` 的優點 { #advantages-of-annotated }
-建議使用 `Annotated`,而不是在函式參數上使用(舊式的)預設值寫法,理由很多,且更好。🤓
+建議**使用 `Annotated`**,而不是在函式參數上使用預設值寫法,理由很多,且**更好**。🤓
-函式參數的「預設值」就是「實際的預設值」,這在 Python 的直覺上更一致。😌
+函式參數的**預設值**就是**實際的預設值**,這在 Python 的直覺上更一致。😌
-你也可以在沒有 FastAPI 的其他地方「直接呼叫」同一個函式,而且能「如預期」運作。若有「必填」參數(沒有預設值),你的「編輯器」會提示錯誤,「Python」在執行時也會抱怨你未傳遞必填參數。
+你也可以在沒有 FastAPI 的**其他地方**「**呼叫**」同一個函式,而且能「**如預期**」運作。若有**必填**參數(沒有預設值),你的**編輯器**會提示錯誤,**Python** 在執行時也會抱怨你未傳遞必填參數。
-若不使用 `Annotated`、改用「(舊式)預設值」寫法,你在沒有 FastAPI 的「其他地方」呼叫該函式時,就得「記得」傳入正確參數,否則值會和預期不同(例如會得到 `QueryInfo` 或類似的東西,而不是 `str`)。你的編輯器不會提示,Python 執行該函式時也不會抱怨,只有在內部操作失敗時才會出錯。
+若不使用 `Annotated`、改用**(舊式)預設值**寫法,你在沒有 FastAPI 的**其他地方**呼叫該函式時,就得**記得**傳入正確參數,否則值會和預期不同(例如會得到 `QueryInfo` 或類似的東西,而不是 `str`)。你的編輯器不會提示,Python 執行該函式時也不會抱怨,只有在內部操作失敗時才會出錯。
因為 `Annotated` 可以有多個中繼資料註解,你甚至可以用同一個函式配合其他工具,例如 [Typer](https://typer.tiangolo.com/)。🚀
@@ -167,19 +168,19 @@ q: str = Query(default="rick")
## 加入正規表示式 { #add-regular-expressions }
-你可以定義參數必須符合的 regular expression `pattern`:
+你可以定義參數必須符合的 正規表示式 `pattern`:
{* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *}
這個特定的正規表示式樣式會檢查收到的參數值是否:
-- `^`:以後續的字元開頭,前面不能有其他字元。
-- `fixedquery`:必須正好等於 `fixedquery`。
-- `$`:在此結束,`fixedquery` 後面不能再有其他字元。
+* `^`:以後續的字元開頭,前面不能有其他字元。
+* `fixedquery`:必須正好等於 `fixedquery`。
+* `$`:在此結束,`fixedquery` 後面不能再有其他字元。
-如果你對「正規表示式」感到困惑,別擔心。這對很多人來說都不容易。你仍然可以先不使用正規表示式就完成很多事情。
+如果你對所有這些**「正規表示式」**概念感到困惑,別擔心。這對很多人來說都不容易。你仍然可以先不使用正規表示式就完成很多事情。
-現在你知道,當你需要它們時,可以在 FastAPI 中使用它們。
+現在你知道,當你需要它們時,可以在 **FastAPI** 中使用它們。
## 預設值 { #default-values }
@@ -235,13 +236,13 @@ q: Annotated[str | None, Query(min_length=3)] = None
{* ../../docs_src/query_params_str_validations/tutorial011_an_py310.py hl[9] *}
-若使用這樣的 URL:
+接著,若使用這樣的 URL:
```
http://localhost:8000/items/?q=foo&q=bar
```
-你會在路徑操作函式的參數 `q` 中,收到多個 `q` 查詢參數的值(`foo` 與 `bar`),以 Python 的 `list` 形式。
+你會在*路徑操作函式*的*函式參數* `q` 中,收到多個 `q` *查詢參數*的值(`foo` 與 `bar`),以 Python 的 `list` 形式。
因此,對該 URL 的回應會是:
@@ -276,7 +277,7 @@ http://localhost:8000/items/?q=foo&q=bar
http://localhost:8000/items/
```
-`q` 的預設值會是:`["foo", "bar"]`,而回應會是:
+`q` 的預設值會是:`["foo", "bar"]`,而你的回應會是:
```JSON
{
@@ -359,15 +360,15 @@ http://127.0.0.1:8000/items/?item-query=foobaritems
## 從 OpenAPI 排除參數 { #exclude-parameters-from-openapi }
-若要把某個查詢參數從產生的 OpenAPI(以及自動文件系統)中排除,將 `Query` 的 `include_in_schema` 設為 `False`:
+若要把某個查詢參數從產生的 OpenAPI schema(以及自動文件系統)中排除,將 `Query` 的 `include_in_schema` 設為 `False`:
{* ../../docs_src/query_params_str_validations/tutorial014_an_py310.py hl[10] *}
## 自訂驗證 { #custom-validation }
-有時你需要做一些上述參數無法處理的「自訂驗證」。
+有時你需要做一些上述參數無法處理的**自訂驗證**。
-這種情況下,你可以使用「自訂驗證函式」,它會在一般驗證之後套用(例如先確認值是 `str` 之後)。
+這種情況下,你可以使用**自訂驗證函式**,它會在一般驗證之後套用(例如先確認值是 `str` 之後)。
你可以在 `Annotated` 中使用 [Pydantic 的 `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) 來達成。
@@ -381,7 +382,7 @@ Pydantic 也有 [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/va
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | 說明
+/// note | 注意
這需搭配 Pydantic 2 或以上版本。😎
@@ -389,15 +390,15 @@ Pydantic 也有 [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/va
/// tip | 提示
-如果你需要做任何需要與「外部元件」溝通的驗證(例如資料庫或其他 API),應該改用「FastAPI 依賴」(FastAPI Dependencies),你稍後會學到。
+如果你需要做任何需要與**外部元件**溝通的驗證(例如資料庫或其他 API),應該改用 **FastAPI Dependencies**,你稍後會學到。
-這些自訂驗證器適用於只需使用請求中「同一份資料」即可完成的檢查。
+這些自訂驗證器適用於只需使用請求中**同一份資料**即可完成的檢查。
///
### 理解這段程式碼 { #understand-that-code }
-重點就是在 `Annotated` 中使用「`AfterValidator` 搭配函式」。如果你願意,可以略過這一節。🤸
+重點就是在 `Annotated` 中使用 **`AfterValidator` 搭配函式**。如果你願意,可以略過這一節。🤸
---
@@ -411,17 +412,17 @@ Pydantic 也有 [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/va
#### 隨機項目 { #a-random-item }
-透過 `data.items()` 我們會得到一個包含每個字典項目鍵值對 tuple 的 iterable object。
+透過 `data.items()` 我們會得到一個包含每個字典項目鍵值對 tuple 的 可疊代物件。
我們用 `list(data.items())` 把這個可疊代物件轉成正式的 `list`。
-接著用 `random.choice()` 從清單中取得一個「隨機值」,也就是一個 `(id, name)` 的 tuple。可能像是 `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`。
+接著用 `random.choice()` 從清單中取得一個**隨機值**,也就是一個 `(id, name)` 的 tuple。可能像是 `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`。
-然後把這個 tuple 的兩個值分別指定給變數 `id` 和 `name`。
+然後把這個 tuple 的**兩個值分別指定**給變數 `id` 和 `name`。
因此,即使使用者沒有提供 item ID,仍然會收到一個隨機建議。
-……而這全部只用一行簡單的程式碼完成。🤯 你不愛 Python 嗎?🐍
+...而這全部只用**一行簡單的程式碼**完成。🤯 你不愛 Python 嗎?🐍
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[22:30] hl[29] *}
@@ -431,16 +432,16 @@ Pydantic 也有 [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/va
通用的驗證與中繼資料:
-- `alias`
-- `title`
-- `description`
-- `deprecated`
+* `alias`
+* `title`
+* `description`
+* `deprecated`
字串專用的驗證:
-- `min_length`
-- `max_length`
-- `pattern`
+* `min_length`
+* `max_length`
+* `pattern`
使用 `AfterValidator` 的自訂驗證。
diff --git a/docs/zh-hant/docs/tutorial/query-params.md b/docs/zh-hant/docs/tutorial/query-params.md
index 89c083456..86cf60a5a 100644
--- a/docs/zh-hant/docs/tutorial/query-params.md
+++ b/docs/zh-hant/docs/tutorial/query-params.md
@@ -65,9 +65,9 @@ http://127.0.0.1:8000/items/?skip=20
在這種情況下,函式參數 `q` 為選用,且預設為 `None`。
-/// check | 注意
+/// tip | 提示
-另外請注意,FastAPI 能辨識出路徑參數 `item_id` 是路徑參數,而 `q` 不是,因此 `q` 會被當作查詢參數。
+另外請注意,**FastAPI** 能辨識出路徑參數 `item_id` 是路徑參數,而 `q` 不是,因此 `q` 會被當作查詢參數。
///
@@ -109,9 +109,10 @@ http://127.0.0.1:8000/items/foo?short=yes
或任何其他大小寫變化(全大寫、首字母大寫等),你的函式會將參數 `short` 視為 `bool` 值 `True`。否則為 `False`。
+
## 多個路徑與查詢參數 { #multiple-path-and-query-parameters }
-你可以同時宣告多個路徑參數與查詢參數,FastAPI 會自動分辨。
+你可以同時宣告多個路徑參數與查詢參數,**FastAPI** 會自動分辨。
而且不必按特定順序宣告。
diff --git a/docs/zh-hant/docs/tutorial/request-files.md b/docs/zh-hant/docs/tutorial/request-files.md
index 4e20544ea..979a579eb 100644
--- a/docs/zh-hant/docs/tutorial/request-files.md
+++ b/docs/zh-hant/docs/tutorial/request-files.md
@@ -1,8 +1,9 @@
# 請求中的檔案 { #request-files }
+
你可以使用 `File` 定義由用戶端上傳的檔案。
-/// info
+/// note
若要接收上傳的檔案,請先安裝 [`python-multipart`](https://github.com/Kludex/python-multipart)。
@@ -28,7 +29,7 @@ $ pip install python-multipart
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info
+/// note
`File` 是直接繼承自 `Form` 的類別。
diff --git a/docs/zh-hant/docs/tutorial/request-form-models.md b/docs/zh-hant/docs/tutorial/request-form-models.md
index f8a0e8c6c..9bafb0ef7 100644
--- a/docs/zh-hant/docs/tutorial/request-form-models.md
+++ b/docs/zh-hant/docs/tutorial/request-form-models.md
@@ -2,7 +2,7 @@
你可以使用 **Pydantic 模型** 在 FastAPI 中宣告 **表單欄位**。
-/// info | 說明
+/// note | 注意
要使用表單,首先安裝 [`python-multipart`](https://github.com/Kludex/python-multipart)。
diff --git a/docs/zh-hant/docs/tutorial/request-forms-and-files.md b/docs/zh-hant/docs/tutorial/request-forms-and-files.md
index c508bf7f7..2db9e283b 100644
--- a/docs/zh-hant/docs/tutorial/request-forms-and-files.md
+++ b/docs/zh-hant/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
你可以使用 `File` 與 `Form` 同時定義檔案與表單欄位。
-/// info
+/// note
要接收上傳的檔案與/或表單資料,請先安裝 [`python-multipart`](https://github.com/Kludex/python-multipart)。
diff --git a/docs/zh-hant/docs/tutorial/request-forms.md b/docs/zh-hant/docs/tutorial/request-forms.md
index d38db96f1..590779168 100644
--- a/docs/zh-hant/docs/tutorial/request-forms.md
+++ b/docs/zh-hant/docs/tutorial/request-forms.md
@@ -1,8 +1,9 @@
# 表單資料 { #form-data }
+
當你需要接收表單欄位而不是 JSON 時,可以使用 `Form`。
-/// info
+/// note
要使用表單,請先安裝 [`python-multipart`](https://github.com/Kludex/python-multipart)。
@@ -32,7 +33,7 @@ $ pip install python-multipart
使用 `Form` 時,你可以宣告與 `Body`(以及 `Query`、`Path`、`Cookie`)相同的設定,包括驗證、範例、別名(例如用 `user-name` 取代 `username`)等。
-/// info
+/// note
`Form` 是一個直接繼承自 `Body` 的類別。
diff --git a/docs/zh-hant/docs/tutorial/response-model.md b/docs/zh-hant/docs/tutorial/response-model.md
index d9ad9d9d1..be276945b 100644
--- a/docs/zh-hant/docs/tutorial/response-model.md
+++ b/docs/zh-hant/docs/tutorial/response-model.md
@@ -72,7 +72,7 @@ FastAPI 會使用這個 `response_model` 來做所有的資料文件、驗證等
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | 說明
+/// note | 注意
要使用 `EmailStr`,請先安裝 [`email-validator`](https://github.com/JoshData/python-email-validator)。
@@ -251,7 +251,7 @@ FastAPI 在內部會搭配 Pydantic 做一些事情,來確保不會把類別
}
```
-/// info | 說明
+/// note | 注意
你也可以使用:
diff --git a/docs/zh-hant/docs/tutorial/response-status-code.md b/docs/zh-hant/docs/tutorial/response-status-code.md
index 9ac2e41da..d649dc785 100644
--- a/docs/zh-hant/docs/tutorial/response-status-code.md
+++ b/docs/zh-hant/docs/tutorial/response-status-code.md
@@ -1,5 +1,6 @@
# 回應狀態碼 { #response-status-code }
+
就像你可以指定回應模型一樣,你也可以在任一個「路徑操作(path operation)」的參數 `status_code` 中宣告回應所使用的 HTTP 狀態碼:
* `@app.get()`
@@ -18,7 +19,7 @@
參數 `status_code` 接受一個數字作為 HTTP 狀態碼。
-/// info | 資訊
+/// note | 注意
`status_code` 也可以接收一個 `IntEnum`,例如 Python 的 [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus)。
@@ -27,7 +28,7 @@
它會:
* 在回應中傳回該狀態碼。
-* 在 OpenAPI 結構中如此記錄(因此也會反映在使用者介面中):
+* 在 OpenAPI 構架中如此記錄(因此也會反映在使用者介面中):
diff --git a/docs/zh-hant/docs/tutorial/schema-extra-example.md b/docs/zh-hant/docs/tutorial/schema-extra-example.md
index 1c2caef85..8cca5003a 100644
--- a/docs/zh-hant/docs/tutorial/schema-extra-example.md
+++ b/docs/zh-hant/docs/tutorial/schema-extra-example.md
@@ -10,7 +10,7 @@
{* ../../docs_src/schema_extra_example/tutorial001_py310.py hl[13:24] *}
-這些額外資訊會原封不動加入該模型輸出的 JSON Schema,並且會用在 API 文件裡。
+這些額外資訊會原封不動加入該模型輸出的 **JSON Schema**,並且會用在 API 文件裡。
你可以使用屬性 `model_config`(接收一個 `dict`),詳見 [Pydantic 文件:Configuration](https://docs.pydantic.dev/latest/api/config/)。
@@ -24,7 +24,7 @@
///
-/// info
+/// note
OpenAPI 3.1.0(自 FastAPI 0.99.0 起使用)新增了對 `examples` 的支援,這是 **JSON Schema** 標準的一部分。
@@ -135,7 +135,7 @@ OpenAPI 3.1.0(自 FastAPI 0.99.0 起使用)新增了對 `examples` 的支援
以下是關於 **JSON Schema** 與 **OpenAPI** 標準的技術細節。
-如果上面的做法對你已經足夠可用,就不需要這些細節,儘管直接跳過。
+如果上面的做法對你已經足夠可用,就不需要這些細節,可以直接跳過。
///
@@ -155,7 +155,7 @@ OpenAPI 也在規範的其他部分新增了 `example` 與 `examples` 欄位:
* `File()`
* `Form()`
-/// info
+/// note
這個舊的、OpenAPI 特定的 `examples` 參數,從 FastAPI `0.103.0` 起改名為 `openapi_examples`。
@@ -171,7 +171,7 @@ OpenAPI 也在規範的其他部分新增了 `example` 與 `examples` 欄位:
JSON Schema 中新的 `examples` 欄位「就是一個 `list`」的範例集合,而不是像 OpenAPI 其他地方(如上所述)那樣附帶額外中繼資料的 `dict`。
-/// info
+/// note
即使 OpenAPI 3.1.0 已發佈並與 JSON Schema 有更簡潔的整合,一段時間內提供自動文件的 Swagger UI 並不支援 OpenAPI 3.1.0(自 5.0.0 版起支援 🎉)。
diff --git a/docs/zh-hant/docs/tutorial/security/first-steps.md b/docs/zh-hant/docs/tutorial/security/first-steps.md
index 7f12ec1a3..7640a4556 100644
--- a/docs/zh-hant/docs/tutorial/security/first-steps.md
+++ b/docs/zh-hant/docs/tutorial/security/first-steps.md
@@ -1,16 +1,16 @@
# 安全性 - 入門 { #security-first-steps }
-想像你有一個部署在某個網域的後端 API。
+想像你有一個部署在某個網域的 **後端** API。
-還有一個前端在另一個網域,或同一網域的不同路徑(或是行動應用程式)。
+還有一個 **前端** 在另一個網域,或同一網域的不同路徑(或是行動應用程式)。
-你希望前端能用使用者名稱與密碼向後端進行身分驗證。
+你希望前端能用**使用者名稱**與**密碼**向後端進行身分驗證。
-我們可以用 OAuth2 搭配 FastAPI 來實作。
+我們可以用 **OAuth2** 搭配 **FastAPI** 來實作。
但不必通讀整份冗長規格只為了找出你需要的幾個重點。
-就用 FastAPI 提供的工具處理安全性。
+就用 **FastAPI** 提供的工具處理安全性。
## 看起來如何 { #how-it-looks }
@@ -24,9 +24,9 @@
## 執行 { #run-it }
-/// info
+/// note
-當你使用 `pip install "fastapi[standard]"` 指令安裝時,[`python-multipart`](https://github.com/Kludex/python-multipart) 套件會隨 FastAPI 自動安裝。
+當你使用 `pip install "fastapi[standard]"` 指令安裝時,[`python-multipart`](https://github.com/Kludex/python-multipart) 套件會隨 **FastAPI** 自動安裝。
不過若只執行 `pip install fastapi`,預設不會包含 `python-multipart`。
@@ -36,7 +36,7 @@
$ pip install python-multipart
```
-因為 OAuth2 會以「form data」傳送 `username` 與 `password`。
+因為 **OAuth2** 會以「form data」傳送 `username` 與 `password`。
///
@@ -60,11 +60,11 @@ $ fastapi dev
-/// check | Authorize 按鈕!
+/// tip | Authorize 按鈕!
-你會看到一個新的「Authorize」按鈕。
+你已經有一個亮眼的全新「Authorize」按鈕。
-而你的「路徑操作」右上角也會出現一個小鎖頭可以點擊。
+而你的 *路徑操作* 右上角也會出現一個小鎖頭可以點擊。
///
@@ -94,31 +94,31 @@ $ fastapi dev
OAuth2 的設計讓後端或 API 可以獨立於執行使用者驗證的伺服器。
-但在這個例子中,同一個 FastAPI 應用會同時處理 API 與驗證。
+但在這個例子中,同一個 **FastAPI** 應用會同時處理 API 與驗證。
簡化來看流程如下:
- 使用者在前端輸入 `username` 與 `password`,按下 `Enter`。
- 前端(在使用者的瀏覽器中執行)把 `username` 與 `password` 傳到我們 API 的特定 URL(在程式中宣告為 `tokenUrl="token"`)。
-- API 檢查 `username` 與 `password`,並回傳一個「token(權杖)」(我們還沒實作這部分)。
+- API 檢查 `username` 與 `password`,並回應一個「token(權杖)」(我們還沒實作這部分)。
- 「token(權杖)」就是一段字串,之後可用來識別並驗證此使用者。
- 通常 token 會設定一段時間後失效。
- 因此使用者之後需要重新登入。
- 若 token 被竊取,風險也較低;它不像永遠有效的萬用鑰匙(多數情況下)。
- 前端會暫存這個 token。
-- 使用者在前端點擊前往其他頁面/區段。
+- 使用者在前端點擊,前往前端網頁應用程式的另一個區段。
- 前端需要再向 API 取得資料。
- 但該端點需要驗證。
- 因此為了向 API 驗證,請求會帶上一個 `Authorization` 標頭,值為 `Bearer ` 加上 token。
- 例如 token 是 `foobar`,則 `Authorization` 標頭內容為:`Bearer foobar`。
-## FastAPI 的 `OAuth2PasswordBearer` { #fastapis-oauth2passwordbearer }
+## **FastAPI** 的 `OAuth2PasswordBearer` { #fastapis-oauth2passwordbearer }
-FastAPI 提供多層抽象的工具來實作這些安全機制。
+**FastAPI** 提供多層抽象的工具來實作這些安全機制。
-本例將使用 OAuth2 的 Password 流程,並以 Bearer token 進行驗證;我們會用 `OAuth2PasswordBearer` 類別來完成。
+本例將使用 **OAuth2** 的 **Password** 流程,並以 **Bearer** token 進行驗證;我們會用 `OAuth2PasswordBearer` 類別來完成。
-/// info
+/// note
「Bearer」token 不是唯一選項。
@@ -126,7 +126,7 @@ FastAPI 提供多層抽象的工具來實作這些安全機制。
通常對多數情境也足夠,除非你是 OAuth2 專家並確信有更適合你的選項。
-在那種情況下,FastAPI 也提供相應工具讓你自行組合。
+在那種情況下,**FastAPI** 也提供相應工具讓你自行組合。
///
@@ -144,11 +144,11 @@ FastAPI 提供多層抽象的工具來實作這些安全機制。
///
-這個參數不會建立該端點/「路徑操作」,而是宣告 `/token` 將是客戶端用來取得 token 的 URL。這些資訊會出現在 OpenAPI,並被互動式 API 文件系統使用。
+這個參數不會建立該端點 / *路徑操作*,而是宣告 `/token` 將是客戶端用來取得 token 的 URL。這些資訊會出現在 OpenAPI,並被互動式 API 文件系統使用。
我們很快也會建立實際的路徑操作。
-/// info
+/// note
如果你是非常嚴格的「Pythonista」,可能不喜歡參數名稱用 `tokenUrl` 而不是 `token_url`。
@@ -172,15 +172,15 @@ oauth2_scheme(some, parameters)
{* ../../docs_src/security/tutorial001_an_py310.py hl[12] *}
-此相依性會提供一個 `str`,指派給「路徑操作函式」的參數 `token`。
+此相依性會提供一個 `str`,指派給 *路徑操作函式* 的參數 `token`。
-FastAPI 會知道可以使用這個相依性,在 OpenAPI(以及自動產生的 API 文件)中定義一個「安全性方案」。
+**FastAPI** 會知道可以使用這個相依性,在 OpenAPI schema(以及自動產生的 API 文件)中定義一個「安全性方案」。
-/// info | 技術細節
+/// note | 技術細節
-FastAPI 之所以知道可以用(相依性中宣告的)`OAuth2PasswordBearer` 類別,在 OpenAPI 中定義安全性方案,是因為它繼承自 `fastapi.security.oauth2.OAuth2`,而後者又繼承自 `fastapi.security.base.SecurityBase`。
+**FastAPI** 之所以知道可以用(相依性中宣告的)`OAuth2PasswordBearer` 類別,在 OpenAPI 中定義安全性方案,是因為它繼承自 `fastapi.security.oauth2.OAuth2`,而後者又繼承自 `fastapi.security.base.SecurityBase`。
-所有能與 OpenAPI(以及自動 API 文件)整合的安全工具都繼承自 `SecurityBase`,FastAPI 才能知道如何把它們整合進 OpenAPI。
+所有能與 OpenAPI(以及自動 API 文件)整合的安全工具都繼承自 `SecurityBase`,**FastAPI** 才能知道如何把它們整合進 OpenAPI。
///
@@ -188,7 +188,7 @@ FastAPI 之所以知道可以用(相依性中宣告的)`OAuth2PasswordBearer
它會從請求中尋找 `Authorization` 標頭,檢查其值是否為 `Bearer ` 加上一段 token,並將該 token 以 `str` 回傳。
-若未找到 `Authorization` 標頭,或其值不是 `Bearer ` token,則會直接回傳 401(`UNAUTHORIZED`)錯誤。
+若未找到 `Authorization` 標頭,或其值不是 `Bearer ` token,則會直接回應 401 狀態碼錯誤(`UNAUTHORIZED`)。
你不必再自行檢查 token 是否存在;你可以確信只要你的函式被執行,該 token 參數就一定會是 `str`。
diff --git a/docs/zh-hant/docs/tutorial/security/get-current-user.md b/docs/zh-hant/docs/tutorial/security/get-current-user.md
index b223d4823..5309d78c0 100644
--- a/docs/zh-hant/docs/tutorial/security/get-current-user.md
+++ b/docs/zh-hant/docs/tutorial/security/get-current-user.md
@@ -14,7 +14,7 @@
就像用 Pydantic 宣告請求體一樣,我們也可以在其他地方使用它:
-{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
+{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## 建立 `get_current_user` 依賴 { #create-a-get-current-user-dependency }
@@ -52,7 +52,7 @@
///
-/// check | 檢查
+/// tip | 提示
這個依賴系統的設計讓我們可以有不同的依賴(不同的 "dependables"),都回傳 `User` 模型。
diff --git a/docs/zh-hant/docs/tutorial/security/oauth2-jwt.md b/docs/zh-hant/docs/tutorial/security/oauth2-jwt.md
index abd920ce6..dc75092b4 100644
--- a/docs/zh-hant/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/zh-hant/docs/tutorial/security/oauth2-jwt.md
@@ -42,7 +42,7 @@ $ pip install pyjwt
@@ -167,27 +167,27 @@ $ fastapi dev
## 用多個模型更新應用 { #update-the-app-with-multiple-models }
-現在我們稍微「重構」一下這個應用,以提升「安全性」與「彈性」。
+現在我們稍微**重構**一下這個應用,以提升**安全性**與**彈性**。
如果你檢查前一版的應用,在 UI 中你會看到,到目前為止它讓用戶端自己決定要建立的 `Hero` 的 `id`。😱
-我們不該允許這樣,因為他們可能會覆蓋資料庫中我們已分配的 `id`。決定 `id` 應該由「後端」或「資料庫」來做,「不是用戶端」。
+我們不該允許這樣,因為他們可能會覆蓋資料庫中我們已分配的 `id`。決定 `id` 應該由**後端**或**資料庫**來做,**不是用戶端**。
-另外,我們為 hero 建立了 `secret_name`,但目前我們在各處都把它回傳出去,這一點都不「保密」... 😅
+另外,我們為 hero 建立了 `secret_name`,但目前我們在各處都把它回傳出去,這一點都不**保密**... 😅
-我們會透過加入一些「額外模型」來修正這些問題。這正是 SQLModel 大放異彩的地方。✨
+我們會透過加入一些**額外模型**來修正這些問題。這正是 SQLModel 大放異彩的地方。✨
### 建立多個模型 { #create-multiple-models }
-在 SQLModel 中,任何設了 `table=True` 的模型類別都是「資料表模型」。
+在 **SQLModel** 中,任何設了 `table=True` 的模型類別都是**資料表模型**。
-而沒有設 `table=True` 的模型類別就是「資料模型」,這些其實就是 Pydantic 模型(只有一點小增強)。🤓
+而沒有設 `table=True` 的模型類別就是**資料模型**,這些其實就是 Pydantic 模型(只有一點小增強)。🤓
-使用 SQLModel,我們可以利用「繼承」來「避免重複」在各種情況下一再宣告所有欄位。
+使用 SQLModel,我們可以利用**繼承**來**避免重複**在各種情況下一再宣告所有欄位。
#### `HeroBase` - 基底類別 { #herobase-the-base-class }
-先從 `HeroBase` 模型開始,它包含所有模型「共享」的欄位:
+先從 `HeroBase` 模型開始,它包含所有模型**共享**的欄位:
* `name`
* `age`
@@ -196,12 +196,12 @@ $ fastapi dev
#### `Hero` - 資料表模型 { #hero-the-table-model }
-接著建立 `Hero`,也就是實際的「資料表模型」,它包含不一定會出現在其他模型中的「額外欄位」:
+接著建立 `Hero`,也就是實際的*資料表模型*,它包含不一定會出現在其他模型中的**額外欄位**:
* `id`
* `secret_name`
-因為 `Hero` 繼承自 `HeroBase`,它「也」擁有 `HeroBase` 中宣告的「欄位」,因此 `Hero` 的完整欄位為:
+因為 `Hero` 繼承自 `HeroBase`,它**也**擁有 `HeroBase` 中宣告的**欄位**,因此 `Hero` 的完整欄位為:
* `id`
* `name`
@@ -212,19 +212,19 @@ $ fastapi dev
#### `HeroPublic` - 公開的資料模型 { #heropublic-the-public-data-model }
-接下來建立 `HeroPublic` 模型,它是要「回傳」給 API 用戶端的模型。
+接下來建立 `HeroPublic` 模型,它是要**回傳**給 API 用戶端的模型。
它擁有與 `HeroBase` 相同的欄位,因此不會包含 `secret_name`。
終於,我們英雄的真實身分受保護了!🥷
-它也重新宣告了 `id: int`。這麼做是與 API 用戶端訂立一個「契約」,讓他們可以確定 `id` 一定存在而且是 `int`(不會是 `None`)。
+它也重新宣告了 `id: int`。這麼做是與 API 用戶端訂立一個**契約**,讓他們可以確定 `id` 一定存在而且是 `int`(不會是 `None`)。
/// tip | 提示
讓回傳模型保證某個值一定存在、而且一定是 `int`(不是 `None`),對 API 用戶端非常有幫助。他們在有這個確信下可以寫出更簡單的程式碼。
-此外,透過「自動產生的客戶端」也會有更簡潔的介面,讓要使用你 API 的開發者能有更好的開發體驗。😎
+此外,透過**自動產生的客戶端**也會有更簡潔的介面,讓要使用你 API 的開發者能有更好的開發體驗。😎
///
@@ -238,17 +238,17 @@ $ fastapi dev
#### `HeroCreate` - 用於建立 Hero 的資料模型 { #herocreate-the-data-model-to-create-a-hero }
-現在我們建立 `HeroCreate` 模型,這是用來「驗證」用戶端送來資料的模型。
+現在我們建立 `HeroCreate` 模型,這是用來**驗證**用戶端送來資料的模型。
它具有與 `HeroBase` 相同的欄位,並且還有 `secret_name`。
-接下來,當用戶端「建立新 hero」時,他們會送上 `secret_name`,它會被儲存在資料庫中,但這些祕密名稱不會在 API 中回傳給用戶端。
+接下來,當用戶端**建立新 hero** 時,他們會送上 `secret_name`,它會被儲存在資料庫中,但這些祕密名稱不會在 API 中回傳給用戶端。
/// tip | 提示
-這也就是你處理「密碼」的方式。接收它們,但不要在 API 中回傳。
+這也就是你處理**密碼**的方式。接收它們,但不要在 API 中回傳。
-你也應該在儲存前先對密碼做「雜湊」,「永遠不要以明文儲存」。
+你也應該在儲存前先對密碼做**雜湊**,**永遠不要以明文儲存**。
///
@@ -262,11 +262,11 @@ $ fastapi dev
#### `HeroUpdate` - 用於更新 Hero 的資料模型 { #heroupdate-the-data-model-to-update-a-hero }
-在前一版的應用中,我們沒有「更新 hero」的方式,但現在有了「多個模型」,我們就能做到。🎉
+在前一版的應用中,我們沒有**更新 hero** 的方式,但現在有了**多個模型**,我們就能做到。🎉
-`HeroUpdate` 這個資料模型有點特別,它包含「建立新 hero 所需的所有欄位」,但所有欄位都是「可選的」(都有預設值)。這樣在更新時,你只需要送出想要更新的欄位即可。
+`HeroUpdate` 這個*資料模型*有點特別,它包含**建立新 hero 所需的所有欄位**,但所有欄位都是**可選的**(都有預設值)。這樣在更新時,你只需要送出想要更新的欄位即可。
-因為所有欄位的「型別其實都改變了」(型別現在包含 `None`,而且預設值為 `None`),我們需要「重新宣告」它們。
+因為所有**欄位其實都改變了**(型別現在包含 `None`,而且預設值為 `None`),我們需要**重新宣告**它們。
其實不一定要繼承 `HeroBase`,因為我們會重新宣告所有欄位。我這裡保留繼承只是為了一致性,並非必要。這主要是個人偏好的問題。🤷
@@ -280,43 +280,43 @@ $ fastapi dev
### 用 `HeroCreate` 建立並回傳 `HeroPublic` { #create-with-herocreate-and-return-a-heropublic }
-現在我們有了「多個模型」,可以更新應用中使用它們的部分。
+現在我們有了**多個模型**,可以更新應用中使用它們的部分。
-我們在請求中接收 `HeroCreate`(資料模型),並由它建立一個 `Hero`(資料表模型)。
+我們在請求中接收 `HeroCreate` *資料模型*,並由它建立一個 `Hero` *資料表模型*。
-這個新的資料表模型 `Hero` 會有用戶端傳來的欄位,並且會由資料庫產生一個 `id`。
+這個新的*資料表模型* `Hero` 會有用戶端傳來的欄位,並且會由資料庫產生一個 `id`。
-然後我們直接從函式回傳這個資料表模型 `Hero`。但因為我們用 `HeroPublic` 當作 `response_model`,FastAPI 會用 `HeroPublic` 來驗證與序列化資料。
+然後我們直接從函式回傳這個*資料表模型* `Hero`。但因為我們用 `HeroPublic` *資料模型*當作 `response_model`,**FastAPI** 會用 `HeroPublic` 來驗證與序列化資料。
{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[56:62] hl[56:58] *}
/// tip | 提示
-現在我們用 `response_model=HeroPublic`,而不是用回傳型別標註 `-> HeroPublic`,因為我們實際回傳的值其實「不是」`HeroPublic`。
+現在我們用 `response_model=HeroPublic`,而不是用**回傳型別標註** `-> HeroPublic`,因為我們實際回傳的值其實*不是* `HeroPublic`。
如果我們宣告 `-> HeroPublic`,你的編輯器與 linter 會(理所當然地)抱怨你回傳的是 `Hero` 而不是 `HeroPublic`。
-在 `response_model` 中宣告,就是要讓 FastAPI 去做它該做的事,而不影響型別標註,以及你的編輯器與其他工具提供的協助。
+在 `response_model` 中宣告,就是要讓 **FastAPI** 去做它該做的事,而不影響型別標註,以及你的編輯器與其他工具提供的協助。
///
### 使用 `HeroPublic` 讀取多個 Hero { #read-heroes-with-heropublic }
-我們可以像先前一樣「讀取」多個 `Hero`。同樣地,我們使用 `response_model=list[HeroPublic]` 來確保資料被正確驗證與序列化。
+我們可以像先前一樣**讀取**多個 `Hero`。同樣地,我們使用 `response_model=list[HeroPublic]` 來確保資料被正確驗證與序列化。
{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[65:72] hl[65] *}
### 使用 `HeroPublic` 讀取單一 Hero { #read-one-hero-with-heropublic }
-我們可以「讀取」單一 hero:
+我們可以**讀取**單一 hero:
{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[75:80] hl[77] *}
### 使用 `HeroUpdate` 更新 Hero { #update-a-hero-with-heroupdate }
-我們可以「更新 hero」。為此我們使用 HTTP 的 `PATCH` 操作。
+我們可以**更新 hero**。為此我們使用 HTTP 的 `PATCH` 操作。
-在程式碼中,我們會取得一個只包含用戶端有傳送的資料的 `dict`,不包含只是因為有預設值而存在的欄位。為了達成這點,我們使用 `exclude_unset=True`。這是關鍵。🪄
+在程式碼中,我們會取得一個只包含用戶端有傳送的資料的 `dict`,**只包含用戶端傳送的資料**,不包含只是因為有預設值而存在的欄位。為了達成這點,我們使用 `exclude_unset=True`。這是關鍵。🪄
然後我們使用 `hero_db.sqlmodel_update(hero_data)` 以 `hero_data` 的資料更新 `hero_db`。
@@ -324,7 +324,7 @@ $ fastapi dev
### 再次刪除 Hero { #delete-a-hero-again }
-「刪除」 hero 基本上維持不變。
+**刪除** hero 基本上維持不變。
我們不會為了重構而重構一切。😅
@@ -352,6 +352,6 @@ $ fastapi dev
## 總結 { #recap }
-你可以使用 [SQLModel](https://sqlmodel.tiangolo.com/) 與 SQL 資料庫互動,並用「資料模型」與「資料表模型」讓程式碼更簡潔。
+你可以使用 [**SQLModel**](https://sqlmodel.tiangolo.com/) 與 SQL 資料庫互動,並用*資料模型*與*資料表模型*讓程式碼更簡潔。
-你可以在 SQLModel 文件學到更多內容,這裡還有一份更長的 [使用 SQLModel 與 FastAPI 的教學](https://sqlmodel.tiangolo.com/tutorial/fastapi/)。🚀
+你可以在 **SQLModel** 文件學到更多內容,這裡還有一份更長的 [使用 SQLModel 與 **FastAPI** 的教學](https://sqlmodel.tiangolo.com/tutorial/fastapi/)。🚀
diff --git a/docs/zh-hant/docs/tutorial/static-files.md b/docs/zh-hant/docs/tutorial/static-files.md
index 1b9e92a1c..0d6369eef 100644
--- a/docs/zh-hant/docs/tutorial/static-files.md
+++ b/docs/zh-hant/docs/tutorial/static-files.md
@@ -2,6 +2,14 @@
你可以使用 `StaticFiles` 從某個目錄自動提供靜態檔案。
+/// tip
+
+如果你需要託管前端,請改用 `app.frontend()`,請在 [前端](frontend.md) 閱讀相關內容。
+
+`app.frontend()` 底層使用 `StaticFiles`,並為前端提供幾項額外優勢,例如處理客戶端路由。
+
+///
+
## 使用 `StaticFiles` { #use-staticfiles }
- 匯入 `StaticFiles`。
diff --git a/docs/zh-hant/docs/tutorial/stream-json-lines.md b/docs/zh-hant/docs/tutorial/stream-json-lines.md
index 204d32ffd..6276db788 100644
--- a/docs/zh-hant/docs/tutorial/stream-json-lines.md
+++ b/docs/zh-hant/docs/tutorial/stream-json-lines.md
@@ -2,7 +2,7 @@
當你有一連串資料想以「**串流**」方式傳送時,可以使用 **JSON Lines**。
-/// info
+/// note
在 FastAPI 0.134.0 新增。
@@ -48,7 +48,7 @@ sequenceDiagram
它和 JSON 陣列(相當於 Python 的 list)很像,但不同於用 `[]` 包起來並以 `,` 分隔項目,它是每一行各放一個 JSON 物件,彼此以換行字元分隔。
-/// info
+/// note
重點在於你的應用能夠逐行產生資料,同時用戶端在消耗前一行的資料。
diff --git a/docs/zh-hant/docs/tutorial/testing.md b/docs/zh-hant/docs/tutorial/testing.md
index f6bef5d96..09f6c0ec7 100644
--- a/docs/zh-hant/docs/tutorial/testing.md
+++ b/docs/zh-hant/docs/tutorial/testing.md
@@ -8,7 +8,7 @@
## 使用 `TestClient` { #using-testclient }
-/// info
+/// note
要使用 `TestClient`,請先安裝 [`httpx`](https://www.python-httpx.org)。
@@ -113,13 +113,13 @@ $ pip install httpx
│ └── test_main.py
```
-假設現在你的 **FastAPI** 應用所在的 `main.py` 有一些其他的路徑操作(path operations)。
+假設現在你的 **FastAPI** 應用所在的 `main.py` 有一些其他的 **路徑操作**。
它有一個可能回傳錯誤的 `GET` 操作。
它有一個可能回傳多種錯誤的 `POST` 操作。
-兩個路徑操作都需要一個 `X-Token` 標頭(header)。
+兩個 *路徑操作* 都需要一個 `X-Token` 標頭(header)。
{* ../../docs_src/app_testing/app_b_an_py310/main.py *}
@@ -136,15 +136,15 @@ $ pip install httpx
例如:
-* 要傳遞路徑或查詢參數,直接把它加在 URL 上。
+* 要傳遞 *path* 或 *query* 參數,直接把它加在 URL 上。
* 要傳遞 JSON 本文,將 Python 物件(例如 `dict`)傳給 `json` 參數。
-* 如果需要送出表單資料(Form Data)而不是 JSON,改用 `data` 參數。
-* 要傳遞標頭(headers),在 `headers` 參數中放一個 `dict`。
-* 對於 Cookie(cookies),在 `cookies` 參數中放一個 `dict`。
+* 如果需要送出 *Form Data* 而不是 JSON,改用 `data` 參數。
+* 要傳遞 *headers*,在 `headers` 參數中放一個 `dict`。
+* 對於 *cookies*,在 `cookies` 參數中放一個 `dict`。
關於如何把資料傳給後端(使用 `httpx` 或 `TestClient`),更多資訊請參考 [HTTPX 文件](https://www.python-httpx.org)。
-/// info
+/// note
請注意,`TestClient` 接收的是可轉為 JSON 的資料,而不是 Pydantic models。
diff --git a/docs/zh-hant/docs/virtual-environments.md b/docs/zh-hant/docs/virtual-environments.md
index a4d649c13..550363413 100644
--- a/docs/zh-hant/docs/virtual-environments.md
+++ b/docs/zh-hant/docs/virtual-environments.md
@@ -73,7 +73,7 @@ $ python -m venv .venv
@@ -120,9 +105,9 @@ npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client
ItemsService.createItemItemsPost({name: "Plumbus", price: 5})
```
-...这是因为客户端生成器会把每个*路径操作*的 OpenAPI 内部**操作 ID(operation ID)**用作方法名的一部分。
+...这是因为客户端生成器会使用每个*路径操作*的 OpenAPI 内部**操作 ID(operation ID)**。
-OpenAPI 要求每个操作 ID 在所有*路径操作*中都是唯一的,因此 FastAPI 会使用**函数名**、**路径**和**HTTP 方法/操作**来生成操作 ID,以确保其唯一性。
+OpenAPI 要求每个操作 ID 在所有*路径操作*中都是唯一的,因此 FastAPI 会使用**函数名**、**路径**和**HTTP 方法/操作**来生成操作 ID,因为这样可以确保操作 ID 是唯一的。
接下来我会告诉你如何改进。🤓
@@ -194,9 +179,9 @@ npx @hey-api/openapi-ts -i ./openapi.json -o src/client
使用自动生成的客户端时,你会获得以下内容的**自动补全**:
-* 方法
-* 请求体中的数据、查询参数等
-* 响应数据
+* 方法。
+* 请求体中的数据、查询参数等。
+* 响应数据。
你还会为所有内容获得**内联错误**。
diff --git a/docs/zh/docs/advanced/json-base64-bytes.md b/docs/zh/docs/advanced/json-base64-bytes.md
index 7792282c7..040957c69 100644
--- a/docs/zh/docs/advanced/json-base64-bytes.md
+++ b/docs/zh/docs/advanced/json-base64-bytes.md
@@ -4,7 +4,7 @@
## Base64 与文件 { #base64-vs-files }
-请先考虑是否可以使用 [请求文件](../tutorial/request-files.md) 来上传二进制数据,并使用 [自定义响应 - FileResponse](./custom-response.md#fileresponse--fileresponse-) 来发送二进制数据,而不是把它编码进 JSON。
+请先考虑是否可以使用 [请求文件](../tutorial/request-files.md) 来上传二进制数据,并使用 [自定义响应 - FileResponse](./custom-response.md#fileresponse) 来发送二进制数据,而不是把它编码进 JSON。
JSON 只能包含 UTF-8 编码的字符串,因此无法直接包含原始字节。
@@ -14,7 +14,7 @@ Base64 可以把二进制数据编码为字符串,但为此会使用比原始
## Pydantic `bytes` { #pydantic-bytes }
-你可以声明带有 `bytes` 字段的 Pydantic 模型,然后在模型配置中使用 `val_json_bytes` 指定用 base64 来验证输入的 JSON 数据;作为验证的一部分,它会将该 base64 字符串解码为字节。
+你可以声明带有 `bytes` 字段的 Pydantic 模型,然后在模型配置中使用 `val_json_bytes` 指定用 base64 来*验证*输入的 JSON 数据;作为验证的一部分,它会将该 base64 字符串解码为字节。
{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *}
@@ -52,12 +52,12 @@ Base64 可以把二进制数据编码为字符串,但为此会使用比原始
## 用于输出数据的 Pydantic `bytes` { #pydantic-bytes-for-output-data }
-对于输出数据,你也可以在模型配置中为 `bytes` 字段使用 `ser_json_bytes`,Pydantic 会在生成 JSON 响应时将字节以 base64 进行序列化。
+对于输出数据,你也可以在模型配置中为 `bytes` 字段使用 `ser_json_bytes`,Pydantic 会在生成 JSON 响应时将字节以 base64 进行*序列化*。
{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *}
## 用于输入和输出数据的 Pydantic `bytes` { #pydantic-bytes-for-input-and-output-data }
-当然,你也可以使用同一个配置了 base64 的模型,在接收和发送 JSON 数据时,同时处理输入(使用 `val_json_bytes` 进行验证)和输出(使用 `ser_json_bytes` 进行序列化)。
+当然,你也可以使用同一个配置了 base64 的模型,在接收和发送 JSON 数据时,同时处理输入(使用 `val_json_bytes` 进行*验证*)和输出(使用 `ser_json_bytes` 进行*序列化*)。
{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *}
diff --git a/docs/zh/docs/advanced/openapi-callbacks.md b/docs/zh/docs/advanced/openapi-callbacks.md
index 49cef3648..3ca99b980 100644
--- a/docs/zh/docs/advanced/openapi-callbacks.md
+++ b/docs/zh/docs/advanced/openapi-callbacks.md
@@ -1,35 +1,35 @@
# OpenAPI 回调 { #openapi-callbacks }
-您可以创建一个包含*路径操作*的 API,它会触发对别人创建的*外部 API*的请求(很可能就是那个会“使用”您 API 的同一个开发者)。
+你可以创建一个包含*路径操作*的 API,该*路径操作*可以触发对其他人创建的*外部 API*的请求(很可能就是那个会*使用*你的 API 的同一个开发者)。
-当您的 API 应用调用*外部 API*时,这个过程被称为“回调”。因为外部开发者编写的软件会先向您的 API 发送请求,然后您的 API 再进行*回调*,向*外部 API*发送请求(很可能也是该开发者创建的)。
+当你的 API 应用调用*外部 API*时,这个过程被称为“回调”。因为外部开发者编写的软件会先向你的 API 发送请求,然后你的 API 再*回调*,向*外部 API*发送请求(很可能也是该开发者创建的)。
-此时,我们需要存档外部 API 的*信息*,比如应该有哪些*路径操作*,请求体应该是什么,应该返回什么响应等。
+在这种情况下,你可能希望记录该外部 API *应该*是什么样子。它应该有哪些*路径操作*,应该接收什么请求体,应该返回什么响应等。
## 使用回调的应用 { #an-app-with-callbacks }
-示例如下。
+让我们通过一个例子来看这一切。
-假设要开发一个创建发票的应用。
+假设你开发一个可以创建发票的应用。
-发票包括 `id`、`title`(可选)、`customer`、`total` 等属性。
+这些发票会有 `id`、`title`(可选)、`customer` 和 `total`。
-API 的用户(外部开发者)要在您的 API 内使用 POST 请求创建一条发票记录。
+你的 API 用户(外部开发者)会通过 POST 请求在你的 API 中创建一张发票。
-(假设)您的 API 将:
+然后你的 API 会(假设):
-* 把发票发送至外部开发者的消费者
-* 归集现金
-* 把通知发送至 API 的用户(外部开发者)
- * 通过(从您的 API)发送 POST 请求至外部 API(即**回调**)来完成
+* 将发票发送给外部开发者的某个客户。
+* 收款。
+* 向 API 用户(外部开发者)发回通知。
+ * 这会通过(从*你的 API*)向该外部开发者提供的某个*外部 API*发送 POST 请求来完成(这就是“回调”)。
## 常规 **FastAPI** 应用 { #the-normal-fastapi-app }
-添加回调前,首先看下常规 API 应用是什么样子。
+我们先看看在添加回调之前,常规 API 应用会是什么样子。
-常规 API 应用包含接收 `Invoice` 请求体的*路径操作*,还有包含回调 URL 的查询参数 `callback_url`。
+它会有一个接收 `Invoice` 请求体的*路径操作*,以及一个包含回调 URL 的查询参数 `callback_url`。
-这部分代码很常规,您对绝大多数代码应该都比较熟悉了:
+这部分很常规,大部分代码你应该已经很熟悉了:
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[7:11,34:51] *}
@@ -39,92 +39,92 @@ API 的用户(外部开发者)要在您的 API 内使用 POST 请求创建
///
-此处唯一比较新的内容是*路径操作装饰器*中的 `callbacks=invoices_callback_router.routes` 参数,下文介绍。
+唯一的新内容是*路径操作装饰器*中的参数 `callbacks=invoices_callback_router.routes`。接下来我们会看看它是什么。
-## 存档回调 { #documenting-the-callback }
+## 为回调编写文档 { #documenting-the-callback }
-实际的回调代码高度依赖于您自己的 API 应用。
+实际的回调代码会高度依赖你自己的 API 应用。
-并且可能每个应用都各不相同。
+而且很可能在不同应用之间差异很大。
-回调代码可能只有一两行,比如:
+它可能只有一两行代码,例如:
```Python
callback_url = "https://example.com/api/v1/invoices/events/"
httpx.post(callback_url, json={"description": "Invoice paid", "paid": True})
```
-但回调最重要的部分可能是,根据 API 要发送给回调请求体的数据等内容,确保您的 API 用户(外部开发者)正确地实现*外部 API*。
+但回调最重要的部分可能是确保你的 API 用户(外部开发者)正确实现*外部 API*,与*你的 API*将在回调请求体中发送的数据等相匹配。
-因此,我们下一步要做的就是添加代码,为从 API 接收回调的*外部 API*存档。
+因此,接下来我们要做的是添加代码,用来记录该*外部 API*应该是什么样子,才能接收来自*你的 API*的回调。
-这部分文档在 `/docs` 下的 Swagger UI 中显示,并且会告诉外部开发者如何构建*外部 API*。
+这份文档会显示在你的 API 的 `/docs` 下的 Swagger UI 中,并且会让外部开发者知道如何构建*外部 API*。
-本例没有实现回调本身(只是一行代码),只有文档部分。
+本例不实现回调本身(那可能只是一行代码),只实现文档部分。
/// tip | 提示
-实际的回调只是 HTTP 请求。
+实际的回调只是一个 HTTP 请求。
-实现回调时,要使用 [HTTPX](https://www.python-httpx.org) 或 [Requests](https://requests.readthedocs.io/)。
+自己实现回调时,你可以使用类似 [HTTPX](https://www.python-httpx.org) 或 [Requests](https://requests.readthedocs.io/) 的工具。
///
## 编写回调文档代码 { #write-the-callback-documentation-code }
-应用不执行这部分代码,只是用它来*记录 外部 API* 。
+这段代码不会在你的应用中执行,我们只需要用它来*记录*该*外部 API*应该是什么样子。
-但,您已经知道用 **FastAPI** 创建自动 API 文档有多简单了。
+不过,你已经知道如何使用 **FastAPI** 轻松为 API 创建自动文档了。
-我们要使用与存档*外部 API* 相同的知识...通过创建外部 API 要实现的*路径操作*(您的 API 要调用的)。
+因此,我们会使用相同的知识来记录该*外部 API*应该是什么样子...通过创建外部 API 应该实现的*路径操作*(也就是你的 API 将调用的那些)。
/// tip | 提示
-编写存档回调的代码时,假设您是*外部开发者*可能会用的上。并且您当前正在实现的是*外部 API*,不是*您自己的 API*。
+在编写用于记录回调的代码时,可以想象你就是那个*外部开发者*。而且你现在正在实现的是*外部 API*,不是*你的 API*。
-临时改变(为外部开发者的)视角能让您更清楚该如何放置*外部 API* 响应和请求体的参数与 Pydantic 模型等。
+临时采用这个(*外部开发者*的)视角,可以帮助你更清楚地判断该把参数、请求体的 Pydantic 模型、响应等放在该*外部 API*的什么位置。
///
-### 创建回调的 `APIRouter` { #create-a-callback-apirouter }
+### 创建回调 `APIRouter` { #create-a-callback-apirouter }
-首先,新建包含一些用于回调的 `APIRouter`。
+首先创建一个新的 `APIRouter`,它将包含一个或多个回调。
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[1,23] *}
### 创建回调*路径操作* { #create-the-callback-path-operation }
-创建回调*路径操作*也使用之前创建的 `APIRouter`。
+要创建回调*路径操作*,请使用你在上面创建的同一个 `APIRouter`。
-它看起来和常规 FastAPI *路径操作*差不多:
+它看起来应该就像普通的 FastAPI *路径操作*:
-* 声明要接收的请求体,例如,`body: InvoiceEvent`
-* 还要声明要返回的响应,例如,`response_model=InvoiceEventReceived`
+* 它可能应该声明要接收的请求体,例如 `body: InvoiceEvent`。
+* 它也可以声明要返回的响应,例如 `response_model=InvoiceEventReceived`。
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[14:16,19:20,26:30] *}
-回调*路径操作*与常规*路径操作*有两点主要区别:
+它与普通*路径操作*有 2 个主要区别:
-* 它不需要任何实际的代码,因为应用不会调用这段代码。它只是用于存档*外部 API*。因此,函数的内容只需要 `pass` 就可以了
-* *路径*可以包含 [OpenAPI 3 表达式](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression)(详见下文),可以使用带参数的变量,以及发送至您的 API 的原始请求的部分
+* 它不需要任何实际代码,因为你的应用永远不会调用这段代码。它只用于记录*外部 API*。因此,函数可以只有 `pass`。
+* *路径*可以包含 [OpenAPI 3 表达式](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression)(见下文),其中可以使用带参数的变量,以及发送到*你的 API*的原始请求的部分内容。
### 回调路径表达式 { #the-callback-path-expression }
-回调*路径*支持包含发送给您的 API 的原始请求的部分的 [OpenAPI 3 表达式](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression)。
+回调*路径*可以有一个 [OpenAPI 3 表达式](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression),其中可以包含发送到*你的 API*的原始请求的部分内容。
-本例中是 `str`:
+在这个例子中,它是这个 `str`:
```Python
"{$callback_url}/invoices/{$request.body.id}"
```
-因此,如果您的 API 用户(外部开发者)发送请求到您的 API:
+所以,如果你的 API 用户(外部开发者)向*你的 API*发送请求到:
```
https://yourapi.com/invoices/?callback_url=https://www.external.org/events
```
-使用如下 JSON 请求体:
+并带有如下 JSON 请求体:
```JSON
{
@@ -134,13 +134,13 @@ https://yourapi.com/invoices/?callback_url=https://www.external.org/events
}
```
-然后,您的 API 就会处理发票,并在某个点之后,发送回调请求至 `callback_url`(外部 API):
+那么*你的 API*会处理该发票,并在稍后的某个时间点,向 `callback_url`(*外部 API*)发送回调请求:
```
https://www.external.org/events/invoices/2expen51ve
```
-JSON 请求体包含如下内容:
+并带有类似如下内容的 JSON 请求体:
```JSON
{
@@ -149,7 +149,7 @@ JSON 请求体包含如下内容:
}
```
-它会预期*外部 API* 的响应包含如下 JSON 请求体:
+它会预期该*外部 API*返回类似如下 JSON 请求体的响应:
```JSON
{
@@ -159,28 +159,28 @@ JSON 请求体包含如下内容:
/// tip | 提示
-注意,回调 URL 包含 `callback_url`(`https://www.external.org/events`)中的查询参数,还有 JSON 请求体内部的发票 ID(`2expen51ve`)。
+请注意,使用的回调 URL 包含在 `callback_url` 中作为查询参数接收到的 URL(`https://www.external.org/events`),也包含 JSON 请求体内部的发票 `id`(`2expen51ve`)。
///
### 添加回调路由 { #add-the-callback-router }
-至此,在上文创建的回调路由里就包含了*回调路径操作*(外部开发者要在外部 API 中实现)。
+此时,你已经在上面创建的回调路由中拥有了所需的*回调路径操作*(即*外部开发者*应该在*外部 API*中实现的那些)。
-现在使用 API *路径操作装饰器*的参数 `callbacks`,从回调路由传递属性 `.routes`(实际上只是路由/路径操作的**列表**):
+现在,在*你的 API 的路径操作装饰器*中使用参数 `callbacks`,传入该回调路由的 `.routes` 属性:
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
/// tip | 提示
-注意,不能把路由本身(`invoices_callback_router`)传递给 `callbacks=`,要传递 `invoices_callback_router.routes` 中的 `.routes` 属性。
+请注意,你不是把路由本身(`invoices_callback_router`)传给 `callbacks=`,而是传它的 `.routes`,也就是 `invoices_callback_router.routes`。FastAPI 会使用这些路由来生成回调的 OpenAPI 文档。
///
### 查看文档 { #check-the-docs }
-现在,启动应用并打开 [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)。
+现在你可以启动应用并访问 [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)。
-就能看到文档的*路径操作*已经包含了**回调**的内容以及*外部 API*:
+你会看到文档中为你的*路径操作*包含了一个 "Callbacks" 部分,展示了*外部 API*应该是什么样子:
diff --git a/docs/zh/docs/advanced/openapi-webhooks.md b/docs/zh/docs/advanced/openapi-webhooks.md
index 3d6bcc9bc..8bec3b618 100644
--- a/docs/zh/docs/advanced/openapi-webhooks.md
+++ b/docs/zh/docs/advanced/openapi-webhooks.md
@@ -22,7 +22,7 @@
这能让您的用户更轻松地**实现他们的 API** 来接收您的**网络钩子**请求,他们甚至可能能够自动生成一些自己的 API 代码。
-/// info | 信息
+/// note | 注意
网络钩子在 OpenAPI 3.1.0 及以上版本中可用,FastAPI `0.99.0` 及以上版本支持。
@@ -36,7 +36,7 @@
您定义的网络钩子将被包含在 `OpenAPI` 的架构中,并出现在自动生成的**文档 UI** 中。
-/// info | 信息
+/// note | 注意
`app.webhooks` 对象实际上只是一个 `APIRouter` ,与您在使用多个文件来构建应用程序时所使用的类型相同。
diff --git a/docs/zh/docs/advanced/path-operation-advanced-configuration.md b/docs/zh/docs/advanced/path-operation-advanced-configuration.md
index 67f3bd7e9..a9f2c1e86 100644
--- a/docs/zh/docs/advanced/path-operation-advanced-configuration.md
+++ b/docs/zh/docs/advanced/path-operation-advanced-configuration.md
@@ -16,17 +16,11 @@
### 使用 *路径操作函数* 的函数名作为 operationId { #using-the-path-operation-function-name-as-the-operationid }
-如果你想用 API 的函数名作为 `operationId`,你可以遍历所有路径操作,并使用它们的 `APIRoute.name` 重写每个 *路径操作* 的 `operation_id`。
+如果你想用 API 的函数名作为 `operationId`,你可以向 `FastAPI` 传入自定义的 `generate_unique_id_function`。
-你应该在添加了所有 *路径操作* 之后执行此操作。
+该函数会接收每个 `APIRoute`,并返回用于该路径操作的 `operationId`。
-{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *}
-
-/// tip
-
-如果你手动调用 `app.openapi()`,你应该在此之前更新 `operationId`。
-
-///
+{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *}
/// warning
diff --git a/docs/zh/docs/advanced/response-change-status-code.md b/docs/zh/docs/advanced/response-change-status-code.md
index 379afd4eb..4339875e4 100644
--- a/docs/zh/docs/advanced/response-change-status-code.md
+++ b/docs/zh/docs/advanced/response-change-status-code.md
@@ -22,7 +22,7 @@
{* ../../docs_src/response_change_status_code/tutorial001_py310.py hl[1,9,12] *}
-然后你可以像平常一样返回任何你需要的对象(例如一个`dict`或者一个数据库模型)。
+然后你可以像平常一样返回任何你需要的对象(一个`dict`、一个数据库模型等)。
如果你声明了一个`response_model`,它仍然会被用来过滤和转换你返回的对象。
diff --git a/docs/zh/docs/advanced/response-cookies.md b/docs/zh/docs/advanced/response-cookies.md
index 7fad89e5c..9a41b95e4 100644
--- a/docs/zh/docs/advanced/response-cookies.md
+++ b/docs/zh/docs/advanced/response-cookies.md
@@ -1,36 +1,38 @@
-# 响应Cookies { #response-cookies }
+# 响应 Cookies { #response-cookies }
## 使用 `Response` 参数 { #use-a-response-parameter }
-你可以在 *路径操作函数* 中定义一个类型为 `Response` 的参数,这样你就可以在这个临时响应对象中设置cookie了。
+你可以在*路径操作函数*中声明一个类型为 `Response` 的参数。
+
+然后你可以在这个*临时*响应对象中设置 Cookie。
{* ../../docs_src/response_cookies/tutorial002_py310.py hl[1, 8:9] *}
-而且你还可以根据你的需要响应不同的对象,比如常用的 `dict`,数据库model等。
+然后你可以像平常一样返回所需的任何对象(`dict`、数据库模型等)。
-如果你定义了 `response_model`,程序会自动根据`response_model`来过滤和转换你响应的对象。
+如果你声明了 `response_model`,它仍会用于过滤和转换你返回的对象。
-**FastAPI** 会使用这个 *临时* 响应对象去装在这些cookies信息 (同样还有headers和状态码等信息), 最终会将这些信息和通过`response_model`转化过的数据合并到最终的响应里。
+**FastAPI** 会使用这个*临时*响应来提取 Cookie(还有 header 和状态码),并将它们放入最终响应中;最终响应包含你返回的值,并经过任何 `response_model` 过滤。
-你也可以在依赖中定义`Response`参数,并设置cookie和header。
+你也可以在依赖项中声明 `Response` 参数,并在其中设置 Cookie(和 header)。
-## 直接响应 `Response` { #return-a-response-directly }
+## 直接返回 `Response` { #return-a-response-directly }
-你还可以在直接响应`Response`时直接创建cookies。
+在代码中直接返回 `Response` 时,你也可以创建 Cookie。
为此,你可以按照[直接返回 Response](response-directly.md)中的说明创建一个响应。
-然后设置Cookies,并返回:
+然后在其中设置 Cookie,并返回它:
{* ../../docs_src/response_cookies/tutorial001_py310.py hl[10:12] *}
/// tip | 提示
-需要注意,如果你直接反馈一个response对象,而不是使用`Response`入参,FastAPI则会直接反馈你封装的response对象。
+请记住,如果你直接返回响应,而不是使用 `Response` 参数,FastAPI 会直接返回它。
-所以你需要确保你响应数据类型的正确性,如:你可以使用`JSONResponse`来兼容JSON的场景。
+因此,你必须确保你的数据类型正确。例如,如果你返回的是 `JSONResponse`,数据就需要兼容 JSON。
-同时,你也应当仅反馈通过`response_model`过滤过的数据。
+并且还要确保你没有发送本应由 `response_model` 过滤的数据。
///
@@ -38,12 +40,12 @@
/// note | 技术细节
-你也可以使用`from starlette.responses import Response` 或者 `from starlette.responses import JSONResponse`。
+你也可以使用 `from starlette.responses import Response` 或者 `from starlette.responses import JSONResponse`。
-为了方便开发者,**FastAPI** 封装了相同数据类型,如`starlette.responses` 和 `fastapi.responses`。不过大部分response对象都是直接引用自Starlette。
+**FastAPI** 为了方便开发者,提供了与 `starlette.responses` 相同的 `fastapi.responses`。但大多数可用的响应都直接来自 Starlette。
-因为`Response`对象可以非常便捷的设置headers和cookies,所以 **FastAPI** 同时也封装了`fastapi.Response`。
+由于 `Response` 经常用于设置 header 和 Cookie,**FastAPI** 也在 `fastapi.Response` 中提供了它。
///
-如果你想查看所有可用的参数和选项,可以参考 [Starlette 文档](https://www.starlette.dev/responses/#set-cookie)。
+要查看所有可用参数和选项,请查看 [Starlette 文档](https://www.starlette.dev/responses/#set-cookie)。
diff --git a/docs/zh/docs/advanced/response-directly.md b/docs/zh/docs/advanced/response-directly.md
index 196622146..f9a865137 100644
--- a/docs/zh/docs/advanced/response-directly.md
+++ b/docs/zh/docs/advanced/response-directly.md
@@ -5,9 +5,9 @@
如果你声明了 [响应模型](../tutorial/response-model.md),FastAPI 会使用它通过 Pydantic 将数据序列化为 JSON。
如果你没有声明响应模型,**FastAPI** 会使用在 [JSON 兼容编码器](../tutorial/encoder.md) 中阐述的 `jsonable_encoder`。
-然后,**FastAPI** 会在后台将这些兼容 JSON 的数据(比如字典)放到一个 `JSONResponse` 中,该 `JSONResponse` 会用来发送响应给客户端。
+然后,**FastAPI** 会将其放入一个 `JSONResponse` 中。
-但是你可以在你的 *路径操作* 中直接返回一个 `JSONResponse`。
+你也可以直接创建一个 `JSONResponse` 并返回它。
/// tip | 提示
@@ -17,9 +17,9 @@
## 返回 `Response` { #return-a-response }
-事实上,你可以返回任意 `Response` 或者任意 `Response` 的子类。
+你可以返回一个 `Response` 或其任意子类。
-/// info | 信息
+/// note | 注意
`JSONResponse` 本身是一个 `Response` 的子类。
diff --git a/docs/zh/docs/advanced/response-headers.md b/docs/zh/docs/advanced/response-headers.md
index ab99a4ece..89357058d 100644
--- a/docs/zh/docs/advanced/response-headers.md
+++ b/docs/zh/docs/advanced/response-headers.md
@@ -1,5 +1,6 @@
# 响应头 { #response-headers }
+
## 使用 `Response` 参数 { #use-a-response-parameter }
你可以在你的*路径操作函数*中声明一个 `Response` 类型的参数(就像你可以为 cookies 做的那样)。
diff --git a/docs/zh/docs/advanced/security/oauth2-scopes.md b/docs/zh/docs/advanced/security/oauth2-scopes.md
index a1ecc641c..fa0dd8eff 100644
--- a/docs/zh/docs/advanced/security/oauth2-scopes.md
+++ b/docs/zh/docs/advanced/security/oauth2-scopes.md
@@ -46,7 +46,7 @@ OAuth2 规范将“作用域”定义为由空格分隔的字符串列表。
* Facebook / Instagram 使用 `instagram_basic`
* Google 使用 `https://www.googleapis.com/auth/drive`
-/// info | 信息
+/// note | 注意
在 OAuth2 中,“作用域”只是一个声明所需特定权限的字符串。
@@ -86,7 +86,7 @@ OAuth2 规范将“作用域”定义为由空格分隔的字符串列表。
现在,修改令牌的*路径操作*以返回请求的作用域。
-我们仍然使用 `OAuth2PasswordRequestForm`。它包含 `scopes` 属性,其值是 `list[str]`,包含请求中接收到的每个作用域。
+我们仍然使用 `OAuth2PasswordRequestForm`。它包含 `scopes` 属性,其值是 `list` of `str`,包含请求中接收到的每个作用域。
我们把这些作用域作为 JWT 令牌的一部分返回。
@@ -126,7 +126,7 @@ OAuth2 规范将“作用域”定义为由空格分隔的字符串列表。
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
-/// info | 技术细节
+/// note | 技术细节
`Security` 实际上是 `Depends` 的子类,它只多了一个我们稍后会看到的参数。
@@ -174,7 +174,7 @@ OAuth2 规范将“作用域”定义为由空格分隔的字符串列表。
为此,我们给 Pydantic 模型 `TokenData` 添加了一个新属性 `scopes`。
-通过用 Pydantic 验证数据,我们可以确保确实得到了例如一个由作用域组成的 `list[str]`,以及一个 `str` 类型的 `username`。
+通过用 Pydantic 验证数据,我们可以确保确实得到了例如一个由作用域组成的 `list` of `str`,以及一个 `str` 类型的 `username`。
而不是,例如得到一个 `dict` 或其它什么,这可能会在后续某个时刻破坏应用,形成安全风险。
diff --git a/docs/zh/docs/advanced/settings.md b/docs/zh/docs/advanced/settings.md
index 31a7cc82d..2159ccb25 100644
--- a/docs/zh/docs/advanced/settings.md
+++ b/docs/zh/docs/advanced/settings.md
@@ -297,6 +297,6 @@ participant execute as Execute function
你可以使用 Pydantic Settings 来处理应用的设置或配置,享受 Pydantic 模型的全部能力。
-- 通过使用依赖项,你可以简化测试。
-- 你可以与它一起使用 `.env` 文件。
-- 使用 `@lru_cache` 可以避免为每个请求反复读取 dotenv 文件,同时允许你在测试时进行覆盖。
+* 通过使用依赖项,你可以简化测试。
+* 你可以与它一起使用 `.env` 文件。
+* 使用 `@lru_cache` 可以避免为每个请求反复读取 dotenv 文件,同时允许你在测试时进行覆盖。
diff --git a/docs/zh/docs/advanced/stream-data.md b/docs/zh/docs/advanced/stream-data.md
index 322561ac1..44e005ace 100644
--- a/docs/zh/docs/advanced/stream-data.md
+++ b/docs/zh/docs/advanced/stream-data.md
@@ -2,9 +2,9 @@
如果你要流式传输可以结构化为 JSON 的数据,你应该[流式传输 JSON Lines](../tutorial/stream-json-lines.md)。
-但如果你想流式传输纯二进制数据或字符串,可以按下面的方法操作。
+但如果你想**流式传输纯二进制数据**或字符串,可以按下面的方法操作。
-/// info | 信息
+/// note | 注意
自 FastAPI 0.134.0 起新增。
@@ -12,11 +12,11 @@
## 使用场景 { #use-cases }
-如果你想流式传输纯字符串,例如直接来自某个 AI LLM 服务的输出,可以使用它。
+如果你想流式传输纯字符串,例如直接来自某个 **AI LLM** 服务的输出,可以使用它。
-你也可以用它来流式传输大型二进制文件,在读取的同时按块发送,无需一次性把所有内容读入内存。
+你也可以用它来流式传输**大型二进制文件**,在读取的同时按块发送,无需一次性把所有内容读入内存。
-你还可以用这种方式流式传输视频或音频,甚至可以在处理的同时生成并发送。
+你还可以用这种方式流式传输**视频**或**音频**,甚至可以在处理的同时生成并发送。
## 使用 `yield` 的 `StreamingResponse` { #a-streamingresponse-with-yield }
@@ -40,7 +40,7 @@ FastAPI 会将每个数据块原样交给 `StreamingResponse`,不会尝试将
{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *}
-这也意味着,使用 `StreamingResponse` 时,你拥有按需精确生成与编码字节数据的自由,同时也承担相应的责任,它与类型注解无关。🤓
+这也意味着,使用 `StreamingResponse` 时,你拥有按需精确生成与编码字节数据的**自由**,同时也承担相应的**责任**,它与类型注解无关。🤓
### 流式传输字节 { #stream-bytes }
@@ -90,7 +90,7 @@ FastAPI 会将每个数据块原样交给 `StreamingResponse`,不会尝试将
而且很多情况下,读取它们是一个阻塞操作(可能会阻塞事件循环),因为数据来自磁盘或网络。
-/// info | 信息
+/// note | 注意
上面的示例其实是个例外,因为 `io.BytesIO` 对象已经在内存中,所以读取它不会阻塞。
diff --git a/docs/zh/docs/advanced/strict-content-type.md b/docs/zh/docs/advanced/strict-content-type.md
index 973d1840c..0cf9242af 100644
--- a/docs/zh/docs/advanced/strict-content-type.md
+++ b/docs/zh/docs/advanced/strict-content-type.md
@@ -81,7 +81,7 @@ http://localhost:8000/v1/agents/multivac
启用该设置后,缺少 `Content-Type` 头的请求其请求体也会按 JSON 解析,这与旧版本 FastAPI 的行为一致。
-/// info | 信息
+/// note | 注意
此行为和配置在 FastAPI 0.132.0 中新增。
diff --git a/docs/zh/docs/advanced/websockets.md b/docs/zh/docs/advanced/websockets.md
index d90ef8733..7950f90ea 100644
--- a/docs/zh/docs/advanced/websockets.md
+++ b/docs/zh/docs/advanced/websockets.md
@@ -111,11 +111,11 @@ $ fastapi dev
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
-/// info
+/// note | 注意
由于这是一个 WebSocket,抛出 `HTTPException` 并不是很合理,而是抛出 `WebSocketException`。
-您可以使用[规范中定义的有效代码](https://tools.ietf.org/html/rfc6455#section-7.4.1)。
+您可以使用[规范中定义的有效关闭代码](https://tools.ietf.org/html/rfc6455#section-7.4.1)。
///
@@ -140,7 +140,7 @@ $ fastapi dev
* "Item ID",用于路径。
* "Token",作为查询参数。
-/// tip
+/// tip | 提示
注意,查询参数 `token` 将由依赖项处理。
@@ -168,13 +168,13 @@ $ fastapi dev
Client #1596980209979 left the chat
```
-/// tip
+/// tip | 提示
上面的应用程序是一个最小和简单的示例,用于演示如何处理和向多个 WebSocket 连接广播消息。
但请记住,由于所有内容都在内存中以单个列表的形式处理,因此它只能在进程运行时工作,并且只能使用单个进程。
-如果您需要与 FastAPI 集成更简单但更强大的功能,支持 Redis、PostgreSQL 或其他功能,请查看 [encode/broadcaster](https://github.com/encode/broadcaster)。
+如果您需要与 FastAPI 集成更简单但更健壮的方案,支持 Redis、PostgreSQL 或其他,请查看 [encode/broadcaster](https://github.com/encode/broadcaster)。
///
diff --git a/docs/zh/docs/advanced/wsgi.md b/docs/zh/docs/advanced/wsgi.md
index 038b672f8..eb83a09b2 100644
--- a/docs/zh/docs/advanced/wsgi.md
+++ b/docs/zh/docs/advanced/wsgi.md
@@ -1,12 +1,13 @@
# 包含 WSGI - Flask,Django,其它 { #including-wsgi-flask-django-others }
+
您可以挂载 WSGI 应用,正如您在 [子应用 - 挂载](sub-applications.md)、[在代理之后](behind-a-proxy.md) 中所看到的那样。
为此, 您可以使用 `WSGIMiddleware` 来包装你的 WSGI 应用,如:Flask,Django,等等。
## 使用 `WSGIMiddleware` { #using-wsgimiddleware }
-/// info | 信息
+/// note | 注意
需要安装 `a2wsgi`,例如使用 `pip install a2wsgi`。
diff --git a/docs/zh/docs/alternatives.md b/docs/zh/docs/alternatives.md
index 08893fca7..20de25cbd 100644
--- a/docs/zh/docs/alternatives.md
+++ b/docs/zh/docs/alternatives.md
@@ -28,7 +28,7 @@ Django REST framework 作为一个灵活工具箱而创建,用于在底层使
它被包括 Mozilla、Red Hat、Eventbrite 在内的许多公司使用。
-它是最早的“自动 API 文档”的范例之一,这正是启发“寻找” **FastAPI** 的最初想法之一。
+它是最早的**自动 API 文档**的范例之一,这正是启发“寻找” **FastAPI** 的最初想法之一。
/// note | 注意
@@ -58,8 +58,9 @@ Flask 是一个“微框架”,它不包含数据库集成,也没有像 Djan
/// tip | 启发 **FastAPI**:
-- 成为微框架,便于按需组合所需的工具与组件。
-- 提供简单易用的路由系统。
+成为微框架。让按需组合所需的工具与组件变得容易。
+
+提供简单易用的路由系统。
///
@@ -87,7 +88,7 @@ Requests 设计非常简单直观,易于使用,且有合理的默认值。
response = requests.get("http://example.com/some/url")
```
-对应地,FastAPI 的 API 路径操作可能看起来是这样的:
+对应地,FastAPI 的 API *路径操作*可能看起来是这样的:
```Python hl_lines="1"
@app.get("/some/url")
@@ -282,7 +283,7 @@ Flask-apispec 由与 Marshmallow 相同的开发者创建。
Falcon 是另一个高性能 Python 框架,它被设计为精简且可作为 Hug 等其他框架的基础。
-它设计为接收两个参数的函数:一个“request”和一个“response”。然后从 request 中“读取”,向 response 中“写入”。由于这种设计,无法用标准的 Python 类型提示将请求参数和请求体声明为函数形参。
+它设计为接收两个参数的函数:一个“请求”和一个“响应”。然后从请求中“读取”,向响应中“写入”。由于这种设计,无法用标准的 Python 类型提示将请求参数和请求体声明为函数形参。
因此,数据校验、序列化与文档要么需要手写完成,无法自动化;要么需要在 Falcon 之上实现一个框架,例如 Hug。其他受 Falcon 设计启发、采用“一个 request 对象 + 一个 response 对象作为参数”的框架也有同样的区别。
diff --git a/docs/zh/docs/async.md b/docs/zh/docs/async.md
index bee98fc8b..8645fd634 100644
--- a/docs/zh/docs/async.md
+++ b/docs/zh/docs/async.md
@@ -95,11 +95,11 @@ Python 的现代版本支持通过一种叫**“协程”**——使用 `async`
### 并发与汉堡 { #concurrency-and-burgers }
-上述异步代码的思想有时也被称为“并发”,它不同于“并行”。
+上述**异步**代码的思想有时也被称为**“并发”**,它不同于**“并行”**。
-并发和并行都与“不同的事情或多或少同时发生”有关。
+**并发**和**并行**都与“不同的事情或多或少同时发生”有关。
-但是并发和并行之间的细节是完全不同的。
+但是*并发*和*并行*之间的细节是完全不同的。
要了解差异,请想象以下关于汉堡的故事:
@@ -367,7 +367,7 @@ Starlette(和 **FastAPI**)是基于 [AnyIO](https://anyio.readthedocs.io/en/
特别是,你可以直接使用 [AnyIO](https://anyio.readthedocs.io/en/stable/) 来处理高级的并发用例,这些用例需要在自己的代码中使用更高级的模式。
-即使你没有使用 **FastAPI**,你也可以使用 [AnyIO](https://anyio.readthedocs.io/en/stable/) 编写自己的异步程序,使其拥有较高的兼容性并获得一些好处(例如,结构化并发)。
+即使你没有使用 FastAPI,你也可以使用 [AnyIO](https://anyio.readthedocs.io/en/stable/) 编写自己的异步程序,使其拥有较高的兼容性并获得一些好处(例如,结构化并发)。
我基于 AnyIO 新建了一个库,作为一个轻量级的封装层,用来优化类型注解,同时提供了更好的**自动补全**、**内联错误提示**等功能。这个库还附带了一个友好的入门指南和教程,能帮助你**理解**并编写**自己的异步代码**:[Asyncer](https://asyncer.tiangolo.com/)。如果你有**结合使用异步代码和常规**(阻塞/同步)代码的需求,这个库会特别有用。
@@ -429,13 +429,13 @@ Starlette(和 **FastAPI**)是基于 [AnyIO](https://anyio.readthedocs.io/en/
你可以拥有多个相互依赖的依赖以及[子依赖](tutorial/dependencies/sub-dependencies.md)(作为函数的参数),它们中的一些可能是通过 `async def` 声明,也可能是通过 `def` 声明。它们仍然可以正常工作,这些通过 `def` 声明的函数将会在外部线程中调用(来自线程池),而不是“被等待”。
-### 其他函数 { #other-utility-functions }
+### 其他工具函数 { #other-utility-functions }
-你可直接调用通过 `def` 或 `async def` 创建的任何其他函数,FastAPI 不会影响你调用它们的方式。
+你可直接调用通过 `def` 或 `async def` 创建的任何其他工具函数,FastAPI 不会影响你调用它们的方式。
这与 FastAPI 为你调用*路径操作函数*和依赖项的逻辑相反。
-如果你的函数是通过 `def` 声明的,它将被直接调用(在代码中编写的地方),而不会在线程池中;如果这个函数通过 `async def` 声明,当在代码中调用时,你就应该使用 `await` 等待函数的结果。
+如果你的工具函数是通过 `def` 声明的,它将被直接调用(在代码中编写的地方),而不会在线程池中;如果这个函数通过 `async def` 声明,当在代码中调用时,你就应该使用 `await` 等待函数的结果。
---
diff --git a/docs/zh/docs/deployment/cloud.md b/docs/zh/docs/deployment/cloud.md
index 025715f52..d20cc3ce1 100644
--- a/docs/zh/docs/deployment/cloud.md
+++ b/docs/zh/docs/deployment/cloud.md
@@ -16,7 +16,7 @@ FastAPI Cloud 是 *FastAPI and friends* 开源项目的主要赞助方和资金
## 云服务商 - 赞助商 { #cloud-providers-sponsors }
-还有一些云服务商也会 ✨ [**赞助 FastAPI**](../help-fastapi.md#sponsor-the-author) ✨。🙇
+还有一些云服务商也会 ✨ [**赞助 FastAPI**](https://github.com/sponsors/tiangolo) ✨。🙇
你也可以考虑按照他们的指南尝试他们的服务:
diff --git a/docs/zh/docs/deployment/concepts.md b/docs/zh/docs/deployment/concepts.md
index dd5ba2ba8..4e7d69b41 100644
--- a/docs/zh/docs/deployment/concepts.md
+++ b/docs/zh/docs/deployment/concepts.md
@@ -1,6 +1,6 @@
# 部署概念 { #deployments-concepts }
-在部署 **FastAPI** 应用程序或任何类型的 Web API 时,有几个概念值得了解,通过掌握这些概念您可以找到**最合适的**方法来**部署您的应用程序**。
+在部署 **FastAPI** 应用程序,或者实际上,任何类型的 Web API 时,有几个你可能会关心的概念,通过掌握这些概念你可以找到**最合适的**方法来**部署你的应用程序**。
一些重要的概念是:
@@ -9,23 +9,23 @@
* 重新启动
* 复制(运行的进程数)
* 内存
-* 开始前的先前步骤
+* 启动前的先前步骤
我们接下来了解它们将如何影响**部署**。
-我们的最终目标是能够以**安全**的方式**为您的 API 客户端**提供服务,同时要**避免中断**,并且尽可能高效地利用**计算资源**(例如远程服务器/虚拟机)。 🚀
+最终目标是能够以**安全**的方式**为你的 API 客户端**提供服务,同时**避免中断**,并且尽可能高效地利用**计算资源**(例如远程服务器/虚拟机)。 🚀
-我将在这里告诉您更多关于这些**概念**的信息,希望能给您提供**直觉**来决定如何在非常不同的环境中部署 API,甚至在是尚不存在的**未来**的环境里。
+我将在这里告诉你更多关于这些**概念**的信息,希望能给你提供**直觉**来决定如何在非常不同的环境中部署你的 API,甚至是在尚不存在的**未来**环境里。
-通过考虑这些概念,您将能够**评估和设计**部署**您自己的 API**的最佳方式。
+通过考虑这些概念,你将能够**评估和设计**部署**你自己的 API** 的最佳方式。
-在接下来的章节中,我将为您提供更多部署 FastAPI 应用程序的**具体方法**。
+在接下来的章节中,我将为你提供更多部署 FastAPI 应用程序的**具体方案**。
-但现在,让我们仔细看一下这些重要的**概念**。 这些概念也适用于任何其他类型的 Web API。 💡
+但现在,让我们仔细看一下这些重要的**概念性想法**。这些概念也适用于任何其他类型的 Web API。 💡
## 安全性 - HTTPS { #security-https }
-在[上一章有关 HTTPS](https.md) 中,我们了解了 HTTPS 如何为您的 API 提供加密。
+在[上一章有关 HTTPS](https.md) 中,我们了解了 HTTPS 如何为你的 API 提供加密。
我们还看到,HTTPS 通常由应用程序服务器的**外部**组件(**TLS 终止代理**)提供。
@@ -33,7 +33,7 @@
### HTTPS 示例工具 { #example-tools-for-https }
-您可以用作 TLS 终止代理的一些工具包括:
+你可以用作 TLS 终止代理的一些工具包括:
* Traefik
* 自动处理证书更新 ✨
@@ -43,13 +43,13 @@
* 使用 Certbot 等外部组件进行证书更新
* HAProxy
* 使用 Certbot 等外部组件进行证书更新
-* 带有 Ingress Controller(如 Nginx) 的 Kubernetes
+* 带有 Ingress Controller(如 Nginx)的 Kubernetes
* 使用诸如 cert-manager 之类的外部组件来进行证书更新
* 由云服务商内部处理,作为其服务的一部分(请阅读下文👇)
-另一种选择是您可以使用**云服务**来完成更多工作,包括设置 HTTPS。 它可能有一些限制或向您收取更多费用等。但在这种情况下,您不必自己设置 TLS 终止代理。
+另一种选择是你可以使用**云服务**来完成更多工作,包括设置 HTTPS。它可能有一些限制或向你收取更多费用等。但在这种情况下,你不必自己设置 TLS 终止代理。
-我将在接下来的章节中向您展示一些具体示例。
+我将在接下来的章节中向你展示一些具体示例。
---
@@ -63,52 +63,52 @@
**程序**这个词通常用来描述很多东西:
-* 您编写的 **代码**,**Python 文件**。
-* 操作系统可以**执行**的**文件**,例如:`python`、`python.exe`或`uvicorn`。
-* 在操作系统上**运行**、使用CPU 并将内容存储在内存上的特定程序。 这也被称为**进程**。
+* 你编写的 **代码**,**Python 文件**。
+* 操作系统可以**执行**的**文件**,例如:`python`、`python.exe` 或 `uvicorn`。
+* 在操作系统上**运行**、使用 CPU 并将内容存储在内存上的特定程序。这也被称为**进程**。
### 什么是进程 { #what-is-a-process }
-**进程** 这个词通常以更具体的方式使用,仅指在操作系统中运行的东西(如上面的最后一点):
+**进程**这个词通常以更具体的方式使用,仅指在操作系统中运行的东西(如上面的最后一点):
* 在操作系统上**运行**的特定程序。
* 这不是指文件,也不是指代码,它**具体**指的是操作系统正在**执行**和管理的东西。
-* 任何程序,任何代码,**只有在执行时才能做事**。 因此,是当有**进程正在运行**时。
-* 该进程可以由您或操作系统**终止**(或“杀死”)。 那时,它停止运行/被执行,并且它可以**不再做事情**。
-* 您计算机上运行的每个应用程序背后都有一些进程,每个正在运行的程序,每个窗口等。并且通常在计算机打开时**同时**运行许多进程。
+* 任何程序,任何代码,**只有在执行时才能做事**。因此,是当有**进程正在运行**时。
+* 该进程可以由你或操作系统**终止**(或“杀死”)。那时,它停止运行/被执行,并且它**不再能做事情**。
+* 你计算机上运行的每个应用程序背后都有一些进程,每个正在运行的程序,每个窗口等。并且通常在计算机打开时**同时**运行许多进程。
* **同一程序**可以有**多个进程**同时运行。
-如果您检查操作系统中的“任务管理器”或“系统监视器”(或类似工具),您将能够看到许多正在运行的进程。
+如果你检查操作系统中的“任务管理器”或“系统监视器”(或类似工具),你将能够看到许多正在运行的进程。
-例如,您可能会看到有多个进程运行同一个浏览器程序(Firefox、Chrome、Edge 等)。 他们通常每个tab运行一个进程,再加上一些其他额外的进程。
+例如,你可能会看到有多个进程运行同一个浏览器程序(Firefox、Chrome、Edge 等)。它们通常每个 tab 运行一个进程,再加上一些其他额外的进程。
---
-现在我们知道了术语“进程”和“程序”之间的区别,让我们继续讨论部署。
+现在我们知道了术语 **进程** 和 **程序** 之间的区别,让我们继续讨论部署。
## 启动时运行 { #running-on-startup }
-在大多数情况下,当您创建 Web API 时,您希望它**始终运行**、不间断,以便您的客户端始终可以访问它。 这是当然的,除非您有特定原因希望它仅在某些情况下运行,但大多数时候您希望它不断运行并且**可用**。
+在大多数情况下,当你创建 Web API 时,你希望它**始终运行**、不间断,以便你的客户端始终可以访问它。当然,除非你有特定原因希望它仅在某些情况下运行,但大多数时候你希望它不断运行并且**可用**。
### 在远程服务器中 { #in-a-remote-server }
-当您设置远程服务器(云服务器、虚拟机等)时,您可以做的最简单的事情就是使用 `fastapi run`(它使用 Uvicorn)或类似方式,手动运行,就像本地开发时一样。
+当你设置远程服务器(云服务器、虚拟机等)时,你可以做的最简单的事情就是使用 `fastapi run`(它使用 Uvicorn)或类似方式,手动运行,就像本地开发时一样。
-它将会在**开发过程中**发挥作用并发挥作用。
+它将会**在开发过程中**发挥作用并且很有用。
-但是,如果您与服务器的连接丢失,**正在运行的进程**可能会终止。
+但是,如果你与服务器的连接丢失,**正在运行的进程**可能会终止。
-如果服务器重新启动(例如更新后或从云提供商迁移后),您可能**不会注意到它**。 因此,您甚至不知道必须手动重新启动该进程。 所以,你的 API 将一直处于挂掉的状态。 😱
+如果服务器重新启动(例如更新后或从云提供商迁移后),你可能**不会注意到它**。因此,你甚至不知道必须手动重新启动该进程。所以,你的 API 将一直处于挂掉的状态。 😱
### 启动时自动运行 { #run-automatically-on-startup }
-一般来说,您可能希望服务器程序(例如 Uvicorn)在服务器启动时自动启动,并且不需要任何**人为干预**,让进程始终与您的 API 一起运行(例如 Uvicorn 运行您的 FastAPI 应用程序) 。
+一般来说,你可能希望服务器程序(例如 Uvicorn)在服务器启动时自动启动,并且不需要任何**人为干预**,让进程始终与你的 API 一起运行(例如 Uvicorn 运行你的 FastAPI 应用程序)。
### 单独的程序 { #separate-program }
-为了实现这一点,您通常会有一个**单独的程序**来确保您的应用程序在启动时运行。 在许多情况下,它还可以确保其他组件或应用程序也运行,例如数据库。
+为了实现这一点,你通常会有一个**单独的程序**来确保你的应用程序在启动时运行。在许多情况下,它还可以确保其他组件或应用程序也运行,例如数据库。
### 启动时运行的示例工具 { #example-tools-to-run-at-startup }
@@ -123,43 +123,43 @@
* 作为其服务的一部分由云提供商内部处理
* 其他的...
-我将在接下来的章节中为您提供更具体的示例。
+我将在接下来的章节中为你提供更具体的示例。
## 重新启动 { #restarts }
-与确保应用程序在启动时运行类似,您可能还想确保它在挂掉后**重新启动**。
+与确保应用程序在启动时运行类似,你可能还想确保它在失败后**重新启动**。
### 我们会犯错误 { #we-make-mistakes }
-作为人类,我们总是会犯**错误**。 软件几乎*总是*在不同的地方隐藏着**bug**。 🐛
+作为人类,我们总是会犯**错误**。软件几乎*总是*在不同的地方隐藏着 **bug**。 🐛
-作为开发人员,当我们发现这些bug并实现新功能(也可能添加新bug😅)时,我们会不断改进代码。
+作为开发人员,当我们发现这些 bug 并实现新功能(也可能添加新 bug 😅)时,我们会不断改进代码。
### 自动处理小错误 { #small-errors-automatically-handled }
-使用 FastAPI 构建 Web API 时,如果我们的代码中存在错误,FastAPI 通常会将其包含到触发错误的单个请求中。 🛡
+使用 FastAPI 构建 Web API 时,如果我们的代码中存在错误,FastAPI 通常会将其限制在触发错误的单个请求中。 🛡
对于该请求,客户端将收到 **500 内部服务器错误**,但应用程序将继续处理下一个请求,而不是完全崩溃。
### 更大的错误 - 崩溃 { #bigger-errors-crashes }
-尽管如此,在某些情况下,我们编写的一些代码可能会导致整个应用程序崩溃,从而导致 Uvicorn 和 Python 崩溃。 💥
+尽管如此,在某些情况下,我们编写的一些代码可能会**导致整个应用程序崩溃**,从而导致 Uvicorn 和 Python 崩溃。 💥
-尽管如此,您可能不希望应用程序因为某个地方出现错误而保持死机状态,您可能希望它**继续运行**,至少对于未破坏的*路径操作*。
+尽管如此,你可能不希望应用程序因为某个地方出现错误而保持死机状态,你可能希望它**继续运行**,至少对于未损坏的*路径操作*。
### 崩溃后重新启动 { #restart-after-crash }
-但在那些严重错误导致正在运行的**进程**崩溃的情况下,您需要一个外部组件来负责**重新启动**进程,至少尝试几次...
+但在那些严重错误导致正在运行的**进程**崩溃的情况下,你需要一个外部组件来负责**重新启动**进程,至少尝试几次...
/// tip | 提示
-...尽管如果整个应用程序只是**立即崩溃**,那么永远重新启动它可能没有意义。 但在这些情况下,您可能会在开发过程中注意到它,或者至少在部署后立即注意到它。
+...尽管如果整个应用程序只是**立即崩溃**,那么永远重新启动它可能没有意义。但在这些情况下,你可能会在开发过程中注意到它,或者至少在部署后立即注意到它。
因此,让我们关注主要情况,在**未来**的某些特定情况下,它可能会完全崩溃,但重新启动它仍然有意义。
///
-您可能希望让这个东西作为 **外部组件** 负责重新启动您的应用程序,因为到那时,使用 Uvicorn 和 Python 的同一应用程序已经崩溃了,因此同一应用程序的相同代码中没有东西可以对此做出什么。
+你可能希望让这个负责重新启动你的应用程序的东西作为一个**外部组件**,因为到那时,使用 Uvicorn 和 Python 的同一应用程序已经崩溃了,因此同一应用程序的相同代码中没有任何东西可以对此做什么。
### 自动重新启动的示例工具 { #example-tools-to-restart-automatically }
@@ -178,19 +178,19 @@
## 复制 - 进程和内存 { #replication-processes-and-memory }
-对于 FastAPI 应用程序,使用像 `fastapi` 命令(运行 Uvicorn)这样的服务器程序,在**一个进程**中运行一次就可以同时为多个客户端提供服务。
+对于 FastAPI 应用程序,使用像运行 Uvicorn 的 `fastapi` 命令这样的服务器程序,在**一个进程**中运行一次就可以同时为多个客户端提供服务。
-但在许多情况下,您会希望同时运行多个工作进程。
+但在许多情况下,你会希望同时运行多个工作进程。
### 多进程 - Workers { #multiple-processes-workers }
-如果您的客户端数量多于单个进程可以处理的数量(例如,如果虚拟机不是太大),并且服务器的 CPU 中有 **多个核心**,那么您可以让 **多个进程** 同时运行同一个应用程序,并在它们之间分发所有请求。
+如果你的客户端数量多于单个进程可以处理的数量(例如,如果虚拟机不是太大),并且服务器的 CPU 中有**多个核心**,那么你可以让**多个进程**同时运行同一个应用程序,并在它们之间分发所有请求。
-当您运行同一 API 程序的**多个进程**时,它们通常称为 **workers**。
+当你运行同一 API 程序的**多个进程**时,它们通常称为 **workers**。
### 工作进程和端口 { #worker-processes-and-ports }
-还记得文档 [关于 HTTPS](https.md) 中只有一个进程可以侦听服务器中的端口和 IP 地址的一种组合吗?
+还记得文档[关于 HTTPS](https.md) 中说的,在服务器中只有一个进程可以侦听端口和 IP 地址的一种组合吗?
现在仍然是对的。
@@ -198,124 +198,124 @@
### 每个进程的内存 { #memory-per-process }
-现在,当程序将内容加载到内存中时,例如,将机器学习模型加载到变量中,或者将大文件的内容加载到变量中,所有这些都会消耗服务器的一点内存 (RAM) 。
+现在,当程序将内容加载到内存中时,例如,将机器学习模型加载到变量中,或者将大文件的内容加载到变量中,所有这些都会**消耗服务器的一些内存 (RAM)**。
-多个进程通常**不共享任何内存**。 这意味着每个正在运行的进程都有自己的东西、变量和内存。 如果您的代码消耗了大量内存,**每个进程**将消耗等量的内存。
+多个进程通常**不共享任何内存**。这意味着每个正在运行的进程都有自己的东西、变量和内存。如果你的代码消耗了大量内存,**每个进程**将消耗等量的内存。
### 服务器内存 { #server-memory }
-例如,如果您的代码加载 **1 GB 大小**的机器学习模型,则当您使用 API 运行一个进程时,它将至少消耗 1 GB RAM。 如果您启动 **4 个进程**(4 个工作进程),每个进程将消耗 1 GB RAM。 因此,您的 API 总共将消耗 **4 GB RAM**。
+例如,如果你的代码加载**大小为 1 GB** 的机器学习模型,则当你使用 API 运行一个进程时,它将至少消耗 1 GB RAM。如果你启动 **4 个进程**(4 个工作进程),每个进程将消耗 1 GB RAM。因此,你的 API 总共将消耗 **4 GB RAM**。
-如果您的远程服务器或虚拟机只有 3 GB RAM,尝试加载超过 4 GB RAM 将导致问题。 🚨
+如果你的远程服务器或虚拟机只有 3 GB RAM,尝试加载超过 4 GB RAM 将导致问题。 🚨
### 多进程 - 一个例子 { #multiple-processes-an-example }
在此示例中,有一个 **Manager Process** 启动并控制两个 **Worker Processes**。
-该管理器进程可能是监听 IP 中的 **端口** 的进程。 它将所有通信传输到工作进程。
+该管理器进程可能是监听 IP 中的**端口**的进程。它将所有通信传输到工作进程。
-这些工作进程将是运行您的应用程序的进程,它们将执行主要计算以接收 **请求** 并返回 **响应**,并且它们将加载您放入 RAM 中的变量中的任何内容。
+这些工作进程将是运行你的应用程序的进程,它们将执行主要计算以接收**请求**并返回**响应**,并且它们将加载你放入 RAM 中的变量中的任何内容。
-但是你可以通过设置 `syntaxHighlight` 为 `False` 来禁用 Swagger UI 中的语法高亮:
+但是你可以通过设置 `syntaxHighlight` 为 `False` 来禁用它:
{* ../../docs_src/configure_swagger_ui/tutorial001_py310.py hl[3] *}
-...在此之后,Swagger UI 将不会高亮代码:
+...在此之后,Swagger UI 将不再显示语法高亮:
@@ -30,7 +30,7 @@ FastAPI会将这些配置转换为 **JSON**,使其与 JavaScript 兼容,因
{* ../../docs_src/configure_swagger_ui/tutorial002_py310.py hl[3] *}
-这个配置会改变语法高亮主题:
+这个配置会改变语法高亮颜色主题:
diff --git a/docs/zh/docs/how-to/custom-request-and-route.md b/docs/zh/docs/how-to/custom-request-and-route.md
index 79860a562..4065818ea 100644
--- a/docs/zh/docs/how-to/custom-request-and-route.md
+++ b/docs/zh/docs/how-to/custom-request-and-route.md
@@ -72,7 +72,7 @@
由 `GzipRequest.get_route_handler` 返回的函数唯一不同之处是把 `Request` 转换为 `GzipRequest`。
-这样,在传给我们的路径操作之前,`GzipRequest` 会(在需要时)负责解压数据。
+这样,在传给我们的*路径操作*之前,`GzipRequest` 会(在需要时)负责解压数据。
之后,其余处理逻辑完全相同。
@@ -104,6 +104,6 @@
{* ../../docs_src/custom_request_and_route/tutorial003_py310.py hl[26] *}
-在此示例中,`router` 下的路径操作将使用自定义的 `TimedRoute` 类,响应中会多一个 `X-Response-Time` 头,包含生成响应所用的时间:
+在此示例中,`router` 下的*路径操作*将使用自定义的 `TimedRoute` 类,响应中会多一个 `X-Response-Time` 头,包含生成响应所用的时间:
{* ../../docs_src/custom_request_and_route/tutorial003_py310.py hl[13:20] *}
diff --git a/docs/zh/docs/how-to/extending-openapi.md b/docs/zh/docs/how-to/extending-openapi.md
index fd39e439f..9b8d1c07e 100644
--- a/docs/zh/docs/how-to/extending-openapi.md
+++ b/docs/zh/docs/how-to/extending-openapi.md
@@ -25,9 +25,17 @@
- `openapi_version`:使用的 OpenAPI 规范版本。默认是最新的 `3.1.0`。
- `summary`:API 的简短摘要。
- `description`:API 的描述,可包含 Markdown,并会展示在文档中。
-- `routes`:路由列表,即已注册的每个路径操作。来自 `app.routes`。
+- `routes`:应用的路由,来自 `app.routes`。FastAPI 使用它们来收集已注册的路径操作,包括来自已包含路由器的那些。
-/// info | 信息
+/// tip | 技术细节
+
+`app.routes` 是一个更底层的路由树。它可能包含 FastAPI 在内部用于包含的路由器的候选路由,而不仅仅是最终的 `APIRoute` 对象。
+
+你仍然可以把 `app.routes` 传给 `get_openapi()`。FastAPI 会遍历这棵路由树来收集实际生效的路径操作。
+
+///
+
+/// note | 注意
参数 `summary` 仅在 OpenAPI 3.1.0 及更高版本中可用,FastAPI 0.99.0 及以上版本支持。
@@ -61,7 +69,7 @@
你可以把 `.openapi_schema` 属性当作“缓存”,用来存储已生成的架构。
-这样一来,用户每次打开 API 文档时,应用就不必重新生成架构。
+这样一来,应用每次打开 API 文档时就不必重新生成架构。
它只会生成一次,后续请求都会使用同一份缓存的架构。
diff --git a/docs/zh/docs/how-to/graphql.md b/docs/zh/docs/how-to/graphql.md
index b33d6759f..31d15d3b4 100644
--- a/docs/zh/docs/how-to/graphql.md
+++ b/docs/zh/docs/how-to/graphql.md
@@ -2,7 +2,7 @@
由于 **FastAPI** 基于 **ASGI** 标准,因此很容易集成任何也兼容 ASGI 的 **GraphQL** 库。
-你可以在同一个应用中将常规的 FastAPI 路径操作与 GraphQL 结合使用。
+你可以在同一个应用中将常规的 FastAPI *路径操作* 与 GraphQL 结合使用。
/// tip | 提示
diff --git a/docs/zh/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/zh/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
index 3723eb032..ecfdd0278 100644
--- a/docs/zh/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
+++ b/docs/zh/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
@@ -8,9 +8,11 @@ FastAPI 0.119.0 引入了在 Pydantic v2 内部以 `pydantic.v1` 形式对 Pydan
FastAPI 0.126.0 移除了对 Pydantic v1 的支持,但在一段时间内仍支持 `pydantic.v1`。
+FastAPI 0.128.0 也移除了对 `pydantic.v1` 的支持,因此最新版本的 FastAPI 需要 Pydantic v2。
+
/// warning | 警告
-从 Python 3.14 开始,Pydantic 团队不再为最新的 Python 版本提供 Pydantic v1 的支持。
+从 **Python 3.14** 开始,Pydantic 团队不再为最新的 Python 版本提供 Pydantic v1 的支持。
这也包括 `pydantic.v1`,在 Python 3.14 及更高版本中不再受支持。
@@ -18,7 +20,7 @@ FastAPI 0.126.0 移除了对 Pydantic v1 的支持,但在一段时间内仍支
///
-如果你的旧 FastAPI 应用在用 Pydantic v1,这里将向你展示如何迁移到 Pydantic v2,以及 FastAPI 0.119.0 中可帮助你渐进式迁移的功能。
+如果你的旧 FastAPI 应用在用 Pydantic v1,这里将向你展示如何迁移到 Pydantic v2,以及 **FastAPI 0.119.0 中的功能** 可帮助你渐进式迁移。
## 官方指南 { #official-guide }
@@ -54,6 +56,16 @@ Pydantic v2 以子模块 `pydantic.v1` 的形式包含了 Pydantic v1 的全部
### FastAPI 对 v2 中 Pydantic v1 的支持 { #fastapi-support-for-pydantic-v1-in-v2 }
+/// warning | 警告
+
+此 FastAPI 对 `pydantic.v1` 模型的支持是在 **FastAPI 0.119.0** 中添加的,并在 **FastAPI 0.128.0** 中移除。它原本是为了迁移到 Pydantic v2 而提供的临时辅助。
+
+在当前版本的 FastAPI 中,在你的应用里使用 `pydantic.v1` 模型会引发错误。
+
+本节其余部分描述的临时支持仅在那些较旧版本中可用。
+
+///
+
自 FastAPI 0.119.0 起,FastAPI 也对 Pydantic v2 内的 Pydantic v1 提供了部分支持,以便迁移到 v2。
因此,你可以将 Pydantic 升级到最新的 v2,并将导入改为使用 `pydantic.v1` 子模块,在很多情况下就能直接工作。
@@ -122,6 +134,12 @@ graph TB
### 分步迁移 { #migrate-in-steps }
+/// warning | 警告
+
+下面描述的在同一应用中同时使用 Pydantic v1 和 v2 模型进行渐进式迁移,只适用于 **FastAPI 0.119.0 到 0.127.x**。它已在 **FastAPI 0.128.0** 中移除,最新版本需要 **Pydantic v2** 模型。
+
+///
+
/// tip | 提示
优先尝试 `bump-pydantic`,如果测试通过且可行,那么你就用一个命令完成了。✨
diff --git a/docs/zh/docs/how-to/separate-openapi-schemas.md b/docs/zh/docs/how-to/separate-openapi-schemas.md
index c3efe5f1a..a7335143a 100644
--- a/docs/zh/docs/how-to/separate-openapi-schemas.md
+++ b/docs/zh/docs/how-to/separate-openapi-schemas.md
@@ -1,5 +1,6 @@
# 是否为输入和输出分别生成 OpenAPI JSON Schema { #separate-openapi-schemas-for-input-and-output-or-not }
+
自从发布了 **Pydantic v2**,生成的 OpenAPI 比之前更精确、更**正确**了。😎
事实上,在某些情况下,对于同一个 Pydantic 模型,OpenAPI 中会根据是否带有**默认值**,为输入和输出分别生成**两个 JSON Schema**。
@@ -85,7 +86,7 @@
这种情况下,你可以在 **FastAPI** 中通过参数 `separate_input_output_schemas=False` 禁用该特性。
-/// info | 信息
+/// note | 注意
对 `separate_input_output_schemas` 的支持是在 FastAPI `0.102.0` 中添加的。🤓
diff --git a/docs/zh/docs/index.md b/docs/zh/docs/index.md
index f89d0a653..6b75291fe 100644
--- a/docs/zh/docs/index.md
+++ b/docs/zh/docs/index.md
@@ -106,19 +106,19 @@ FastAPI 是一个用于构建 API 的现代、快速(高性能)的 Web 框
“我最近大量使用 FastAPI。我实际上计划把它用于我团队在 微软的机器学习(ML)服务。其中一些正在集成进核心 Windows 产品以及一些 Office 产品。”-
“我们采用了 FastAPI 库来启动一个可查询获取预测结果的 REST 服务器。” [用于 Ludwig]-
-注意,这表示“`one_person` 是类 `Person` 的一个实例(instance)”。
+注意,这表示“`one_person` 是类 `Person` 的一个**实例**(instance)”。
-它并不表示“`one_person` 是名为 `Person` 的类本身(class)”。
+它并不表示“`one_person` 是名为 `Person` 的**类**(class)”。
## Pydantic 模型 { #pydantic-models }
@@ -285,7 +285,7 @@ def some_function(data: Any):
/// note | 注意
-想了解更多关于 [Pydantic](https://docs.pydantic.dev/) 的信息,请查看其文档。
+要了解更多关于 [Pydantic 的信息,请查看其文档](https://docs.pydantic.dev/)。
///
@@ -295,7 +295,7 @@ def some_function(data: Any):
## 带元数据注解的类型提示 { #type-hints-with-metadata-annotations }
-Python 还提供了一个特性,可以使用 `Annotated` 在这些类型提示中放入额外的元数据。
+Python 还提供了一个特性,可以使用 `Annotated` 在这些类型提示中放入**额外的元数据**。
你可以从 `typing` 导入 `Annotated`。
@@ -305,15 +305,15 @@ Python 本身不会对这个 `Annotated` 做任何处理。对于编辑器和其
但你可以在 `Annotated` 中为 **FastAPI** 提供额外的元数据,来描述你希望应用如何行为。
-重要的是要记住:传给 `Annotated` 的第一个类型参数才是实际类型。其余的只是给其他工具用的元数据。
+重要的是要记住:传给 `Annotated` 的**第一个*类型参数***才是**实际类型**。其余的只是给其他工具用的元数据。
现在你只需要知道 `Annotated` 的存在,并且它是标准 Python。😎
-稍后你会看到它有多么强大。
+稍后你会看到它有多么**强大**。
/// tip | 提示
-这是标准 Python,这意味着你仍然可以在编辑器里获得尽可能好的开发体验,并能和你用来分析、重构代码的工具良好协作等。✨
+这是**标准 Python**,这意味着你仍然可以在编辑器里获得**尽可能好的开发体验**,并能和你用来分析、重构代码的工具良好协作等。✨
同时你的代码也能与许多其他 Python 工具和库高度兼容。🚀
@@ -325,16 +325,16 @@ Python 本身不会对这个 `Annotated` 做任何处理。对于编辑器和其
在 **FastAPI** 中,用类型提示来声明参数,你将获得:
-* 编辑器支持。
-* 类型检查。
+* **编辑器支持**。
+* **类型检查**。
-……并且 **FastAPI** 会使用相同的声明来:
+...并且 **FastAPI** 会使用相同的声明来:
-* 定义要求:从请求路径参数、查询参数、请求头、请求体、依赖等。
-* 转换数据:把请求中的数据转换为所需类型。
-* 校验数据:对于每个请求:
- * 当数据无效时,自动生成错误信息返回给客户端。
-* 使用 OpenAPI 记录 API:
+* **定义要求**:从请求路径参数、查询参数、请求头、请求体、依赖等。
+* **转换数据**:把请求中的数据转换为所需类型。
+* **校验数据**:对于每个请求:
+ * 当数据无效时,自动生成返回给客户端的**错误**。
+* 使用 OpenAPI **记录** API:
* 然后用于自动生成交互式文档界面。
这些听起来可能有点抽象。别担心。你会在[教程 - 用户指南](tutorial/index.md)中看到所有这些的实际效果。
@@ -343,6 +343,6 @@ Python 本身不会对这个 `Annotated` 做任何处理。对于编辑器和其
/// note | 注意
-如果你已经读完所有教程,又回来想进一步了解类型,一个不错的资源是 [`mypy` 的“速查表”](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html)。
+如果你已经读完整个教程,又回来想进一步了解类型,一个不错的资源是 [`mypy` 的“速查表”](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html)。
///
diff --git a/docs/zh/docs/tutorial/bigger-applications.md b/docs/zh/docs/tutorial/bigger-applications.md
index cbee84f35..9bb4bea99 100644
--- a/docs/zh/docs/tutorial/bigger-applications.md
+++ b/docs/zh/docs/tutorial/bigger-applications.md
@@ -17,16 +17,16 @@
```
.
├── app
-│ ├── __init__.py
-│ ├── main.py
-│ ├── dependencies.py
-│ └── routers
-│ │ ├── __init__.py
-│ │ ├── items.py
-│ │ └── users.py
-│ └── internal
-│ ├── __init__.py
-│ └── admin.py
+│ ├── __init__.py
+│ ├── main.py
+│ ├── dependencies.py
+│ └── routers
+│ │ ├── __init__.py
+│ │ ├── items.py
+│ │ └── users.py
+│ └── internal
+│ ├── __init__.py
+│ └── admin.py
```
/// tip | 提示
@@ -396,9 +396,9 @@ from .routers.users import router
/// note | 技术细节
-实际上,它将在内部为声明在 `APIRouter` 中的每个*路径操作*创建一个*路径操作*。
+当在主应用中包含路由器时,FastAPI 会保留原始的 `APIRouter` 及其 `APIRoute` 处于活动状态。
-所以,在幕后,它实际上会像所有的东西都是同一个应用程序一样工作。
+这意味着自定义的 `APIRouter` 和 `APIRoute` 子类在被包含之后仍然能够参与工作。
///
@@ -406,7 +406,7 @@ from .routers.users import router
包含路由器时,你不必担心性能问题。
-这将花费几微秒时间,并且只会在启动时发生。
+这被设计为轻量级的,并且避免给每个请求增加开销。
因此,它不会影响性能。⚡
@@ -457,11 +457,11 @@ from .routers.users import router
---
-`APIRouter` 没有被「挂载」,它们与应用程序的其余部分没有隔离。
+`APIRouter` 并不是「挂载」的,它们并没有和应用程序的其余部分隔离。
-这是因为我们想要在 OpenAPI 模式和用户界面中包含它们的*路径操作*。
+这是因为我们希望在 OpenAPI 模式和用户界面中包含它们的*路径操作*。
-由于我们不能仅仅隔离它们并独立于其余部分来「挂载」它们,因此*路径操作*是被「克隆的」(重新创建),而不是直接包含。
+FastAPI 会保留原始的路由器和路径操作处于活动状态,并在处理请求和生成 OpenAPI 时组合路由器的前缀、依赖项、标签、响应以及其他元数据。
///
@@ -532,4 +532,16 @@ $ fastapi dev
router.include_router(other_router)
```
-请确保在你将 `router` 包含到 `FastAPI` 应用程序之前进行此操作,以便 `other_router` 中的*路径操作*也能被包含进来。
+你可以在将 `router` 包含到 `FastAPI` 应用之前或之后执行此操作。FastAPI 仍然会在路由和 OpenAPI 中包含 `other_router` 中的*路径操作*。
+
+同样适用于之后添加到这些路由器的*路径操作*。它们也会通过先前的包含可见。
+
+/// warning | 技术细节
+
+在包含路由器之后,避免直接修改 `router.routes`。FastAPI 将路由器的包含视为「实时」的,因此原始路由器及其路由会继续参与路由和 OpenAPI 生成。
+
+使用文档化的 API(例如路径操作装饰器和 `.include_router()`)来添加路由和路由器。
+
+将 `router.routes` 视为较低层级的路由树,它可以包含路由定义和被包含的路由器;避免把它当作最终路径操作的扁平列表来依赖。
+
+///
diff --git a/docs/zh/docs/tutorial/body-multiple-params.md b/docs/zh/docs/tutorial/body-multiple-params.md
index 39b84904f..8cb465764 100644
--- a/docs/zh/docs/tutorial/body-multiple-params.md
+++ b/docs/zh/docs/tutorial/body-multiple-params.md
@@ -108,7 +108,7 @@ q: str | None = None
{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}
-/// info | 信息
+/// note | 注意
`Body` 同样具有与 `Query`、`Path` 以及其他后面将看到的类完全相同的额外校验和元数据参数。
@@ -123,7 +123,7 @@ q: str | None = None
但是,如果你希望它期望一个拥有 `item` 键并在值中包含模型内容的 JSON,就像在声明额外的请求体参数时所做的那样,则可以使用一个特殊的 `Body` 参数 `embed`:
```Python
-item: Item = Body(embed=True)
+item: Annotated[Item, Body(embed=True)]
```
比如:
diff --git a/docs/zh/docs/tutorial/body-nested-models.md b/docs/zh/docs/tutorial/body-nested-models.md
index 93a34da55..ce10b74a9 100644
--- a/docs/zh/docs/tutorial/body-nested-models.md
+++ b/docs/zh/docs/tutorial/body-nested-models.md
@@ -135,9 +135,9 @@ Pydantic 模型的每个属性都具有类型。
}
```
-/// info | 信息
+/// note | 注意
-请注意 `images` 键现在具有一组 image 对象是如何发生的。
+请注意 `images` 键现在具有一个 image 对象列表是如何发生的。
///
@@ -147,9 +147,9 @@ Pydantic 模型的每个属性都具有类型。
{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *}
-/// info | 信息
+/// note | 注意
-请注意 `Offer` 拥有一组 `Item` 而反过来 `Item` 又是一个可选的 `Image` 列表是如何发生的。
+请注意 `Offer` 拥有一个 `Item` 列表,而反过来 `Item` 又有一个可选的 `Image` 列表是如何发生的。
///
diff --git a/docs/zh/docs/tutorial/body.md b/docs/zh/docs/tutorial/body.md
index 0a4c9c5e5..b32a5ac60 100644
--- a/docs/zh/docs/tutorial/body.md
+++ b/docs/zh/docs/tutorial/body.md
@@ -8,7 +8,7 @@
使用 [Pydantic](https://docs.pydantic.dev/) 模型来声明**请求体**,能充分利用它的功能和优点。
-/// info | 信息
+/// note | 注意
发送数据应使用以下之一:`POST`(最常见)、`PUT`、`DELETE` 或 `PATCH`。
@@ -20,21 +20,22 @@
## 导入 Pydantic 的 `BaseModel` { #import-pydantics-basemodel }
-从 `pydantic` 中导入 `BaseModel`:
+首先,你需要从 `pydantic` 中导入 `BaseModel`:
{* ../../docs_src/body/tutorial001_py310.py hl[2] *}
## 创建数据模型 { #create-your-data-model }
-把数据模型声明为继承 `BaseModel` 的类。
+然后,把数据模型声明为继承 `BaseModel` 的类。
使用 Python 标准类型声明所有属性:
{* ../../docs_src/body/tutorial001_py310.py hl[5:9] *}
+
与声明查询参数一样,包含默认值的模型属性是可选的,否则就是必选的。把默认值设为 `None` 可使其变为可选。
-例如,上述模型声明如下 JSON "object"(即 Python `dict`):
+例如,上述模型声明如下 JSON "`object`"(即 Python `dict`):
```JSON
{
@@ -45,7 +46,7 @@
}
```
-...由于 `description` 和 `tax` 是可选的(默认值为 `None`),下面的 JSON "object" 也有效:
+...由于 `description` 和 `tax` 是可选的(默认值为 `None`),下面的 JSON "`object`" 也有效:
```JSON
{
@@ -123,7 +124,7 @@
## 使用模型 { #use-the-model }
-在*路径操作*函数内部直接访问模型对象的所有属性:
+在函数内部直接访问模型对象的所有属性:
{* ../../docs_src/body/tutorial002_py310.py *}
@@ -135,6 +136,7 @@
{* ../../docs_src/body/tutorial003_py310.py hl[15:16] *}
+
## 请求体 + 路径 + 查询参数 { #request-body-path-query-parameters }
也可以同时声明**请求体**、**路径**和**查询**参数。
diff --git a/docs/zh/docs/tutorial/cookie-param-models.md b/docs/zh/docs/tutorial/cookie-param-models.md
index 8e094c7d3..368fe4762 100644
--- a/docs/zh/docs/tutorial/cookie-param-models.md
+++ b/docs/zh/docs/tutorial/cookie-param-models.md
@@ -1,8 +1,8 @@
# Cookie 参数模型 { #cookie-parameter-models }
-如果您有一组相关的 **cookie**,您可以创建一个 **Pydantic 模型**来声明它们。🍪
+如果你有一组相关的 **cookie**,你可以创建一个 **Pydantic 模型**来声明它们。🍪
-这将允许您在**多个地方**能够**重用模型**,并且可以一次性声明所有参数的验证方式和元数据。😎
+这将允许你在**多个地方**能够**重用模型**,并且可以一次性声明所有参数的验证方式和元数据。😎
/// note | 注意
@@ -22,39 +22,39 @@
{* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *}
-**FastAPI** 将从请求中接收到的 **cookie** 中**提取**出**每个字段**的数据,并提供您定义的 Pydantic 模型。
+**FastAPI** 将从请求中接收到的 **cookie** 中**提取**出**每个字段**的数据,并提供你定义的 Pydantic 模型。
## 查看文档 { #check-the-docs }
-您可以在文档 UI 的 `/docs` 中查看定义的 cookie:
+你可以在文档 UI 的 `/docs` 中查看定义的 cookie:
-## 简单用法 { #simple-usage }
+## 簡单用法 { #simple-usage }
观察一下就会发现,只要*路径*和*操作*匹配,就会使用声明的*路径操作函数*。随后,**FastAPI** 会用正确的参数调用该函数,并从请求中提取数据。
diff --git a/docs/zh/docs/tutorial/dependencies/sub-dependencies.md b/docs/zh/docs/tutorial/dependencies/sub-dependencies.md
index 1c30b4380..a57271c8e 100644
--- a/docs/zh/docs/tutorial/dependencies/sub-dependencies.md
+++ b/docs/zh/docs/tutorial/dependencies/sub-dependencies.md
@@ -35,7 +35,7 @@ FastAPI 支持创建含**子依赖项**的依赖项。
{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *}
-/// info | 信息
+/// note | 注意
注意,这里在*路径操作函数*中只声明了一个依赖项,即 `query_or_cookie_extractor` 。
diff --git a/docs/zh/docs/tutorial/extra-data-types.md b/docs/zh/docs/tutorial/extra-data-types.md
index 76748a7a3..441558285 100644
--- a/docs/zh/docs/tutorial/extra-data-types.md
+++ b/docs/zh/docs/tutorial/extra-data-types.md
@@ -1,15 +1,15 @@
# 额外数据类型 { #extra-data-types }
-到目前为止,您一直在使用常见的数据类型,如:
+到目前为止,你一直在使用常见的数据类型,如:
* `int`
* `float`
* `str`
* `bool`
-但是您也可以使用更复杂的数据类型。
+但是你也可以使用更复杂的数据类型。
-您仍然会拥有现在已经看到的相同的特性:
+你仍然会拥有现在已经看到的相同的特性:
* 很棒的编辑器支持。
* 传入请求的数据转换。
@@ -49,7 +49,7 @@
* `Decimal`:
* 标准的 Python `Decimal`。
* 在请求和响应中被当做 `float` 一样处理。
-* 您可以在这里检查所有有效的 Pydantic 数据类型: [Pydantic data types](https://docs.pydantic.dev/latest/usage/types/types/)。
+* 你可以在这里检查所有有效的 Pydantic 数据类型: [Pydantic data types](https://docs.pydantic.dev/latest/usage/types/types/)。
## 例子 { #example }
diff --git a/docs/zh/docs/tutorial/extra-models.md b/docs/zh/docs/tutorial/extra-models.md
index 0ad35cc4f..60f66c5f1 100644
--- a/docs/zh/docs/tutorial/extra-models.md
+++ b/docs/zh/docs/tutorial/extra-models.md
@@ -1,5 +1,6 @@
# 更多模型 { #extra-models }
+
书接上文,多个关联模型这种情况很常见。
特别是用户模型,因为:
diff --git a/docs/zh/docs/tutorial/first-steps.md b/docs/zh/docs/tutorial/first-steps.md
index 78db1fefc..cadcac3e2 100644
--- a/docs/zh/docs/tutorial/first-steps.md
+++ b/docs/zh/docs/tutorial/first-steps.md
@@ -1,5 +1,6 @@
# 第一步 { #first-steps }
+
最简单的 FastAPI 文件可能像下面这样:
{* ../../docs_src/first_steps/tutorial001_py310.py *}
@@ -180,7 +181,7 @@ entrypoint = "backend.main:app"
from backend.main import app
```
-### `fastapi dev` 带路径 { #fastapi-dev-with-path }
+### 带路径或使用 `--entrypoint` CLI 选项的 `fastapi dev` { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
你也可以把文件路径传给 `fastapi dev` 命令,它会尝试推断要使用的 FastAPI 应用对象:
@@ -188,29 +189,19 @@ from backend.main import app
$ fastapi dev main.py
```
-但这样每次调用 `fastapi` 命令时都需要记得传入正确的路径。
-
-另外,其他工具可能无法找到它,例如 [VS Code 扩展](../editor-support.md) 或 [FastAPI Cloud](https://fastapicloud.com),因此推荐在 `pyproject.toml` 中使用 `entrypoint`。
-
-### 部署你的应用(可选) { #deploy-your-app-optional }
-
-你可以选择将 FastAPI 应用部署到 [FastAPI Cloud](https://fastapicloud.com),如果还没有,先去加入候补名单。🚀
-
-如果你已经拥有 **FastAPI Cloud** 账户(我们从候补名单邀请了你 😉),你可以用一条命令部署应用。
-
-部署前,先确保已登录:
-
-get 操作
-/// info | `@decorator` 信息
+/// note | `@decorator` 信息
`@something` 语法在 Python 中被称为「装饰器」。
@@ -349,7 +342,7 @@ https://example.com/items/foo
* `@app.patch()`
* `@app.trace()`
-/// tip
+/// tip | 提示
你可以随意使用任何一个操作(HTTP方法)。
@@ -383,7 +376,7 @@ https://example.com/items/foo
{* ../../docs_src/first_steps/tutorial003_py310.py hl[7] *}
-/// note
+/// note | 注意
如果你不知道两者的区别,请查阅 [并发: *赶时间吗?*](../async.md#in-a-hurry)。
diff --git a/docs/zh/docs/tutorial/frontend.md b/docs/zh/docs/tutorial/frontend.md
new file mode 100644
index 000000000..8b57bbe60
--- /dev/null
+++ b/docs/zh/docs/tutorial/frontend.md
@@ -0,0 +1,133 @@
+# 前端 { #frontend }
+
+你可以使用 `app.frontend()`(或 `router.frontend()`)来提供静态前端应用。
+
+这对会生成静态文件的前端工具很有用,例如使用 Vite 的 React、TanStack Router、Astro、Vue、Svelte、Angular、Solid 等。
+
+使用这些工具时,通常会有一个构建前端的步骤,命令类似:
+
+```bash
+npm run build
+```
+
+它会生成一个类似 `./dist/` 的目录,里面包含你的前端文件。
+
+你可以使用 `app.frontend()` 按照这些前端框架所需的约定来提供该目录。
+
+**FastAPI** 会先检查*路径操作*。只有在没有普通路由匹配时,才会检查前端文件,因此你的 API 不会受到影响。
+
+## 提供前端服务 { #serve-a-frontend }
+
+构建前端之后,例如使用 `npm run build`,将生成的文件放入一个目录,例如 `dist`。
+
+你的项目结构可能如下所示:
+
+```text
+.
+├── pyproject.toml
+├── app
+│ ├── __init__.py
+│ └── main.py
+└── dist
+ ├── index.html
+ └── assets
+ └── app.js
+```
+
+然后使用 `app.frontend()` 提供服务:
+
+{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
+
+这样,对 `/assets/app.js` 的请求可以提供 `dist/assets/app.js`。
+
+如果你还有一个 **FastAPI** *路径操作*,则*路径操作*优先。
+
+## 客户端路由 { #client-side-routing }
+
+许多前端应用,包括**单页应用**(SPA),都会使用客户端路由。像 `/dashboard/settings` 这样的路径可能并不是一个真实文件,而是由框架负责处理。
+
+因此,如果直接访问该 URL(而不是通过应用内导航访问),后端应该从 `index.html` 提供前端应用,这样前端框架就可以处理客户端路由。
+
+为此,使用 `fallback="index.html"`:
+
+{* ../../docs_src/frontend/tutorial002_py310.py hl[5] *}
+
+**FastAPI** 只会对看起来像浏览器导航的 `GET` 和 `HEAD` 请求使用此 fallback。缺失的 JavaScript、CSS 和图片等文件仍会返回 `404`。
+
+对于其他方法的请求,例如 `POST` 或 `PUT`,如果路径只匹配前端 fallback,也会返回 `404`。常规 **FastAPI** *路径操作*仍然比前端路由具有更高优先级。
+
+/// tip | 提示
+
+默认情况下,`fallback` 的值为 `fallback="auto"`。在大多数情况下,你不需要指定 `fallback`。详情见下文。
+
+///
+
+这正是许多使用客户端路由的前端应用所需的行为,例如使用 TanStack Router 的 React、Vue、Angular、SvelteKit 或 Solid。
+
+## 自定义 404 页面 { #custom-404-page }
+
+你也可以为缺失的前端路径提供一个静态 `404.html` 页面:
+
+{* ../../docs_src/frontend/tutorial003_py310.py hl[5] *}
+
+该响应会保持 `404` 状态码。
+
+在这种情况下,**FastAPI** 不会为缺失的前端路径提供 `index.html`,而是返回 `404.html` 文件。
+
+/// tip | 提示
+
+默认情况下,`fallback` 的值为 `fallback="auto"`。这样,如果找到 `404.html` 文件,它会自动用作 fallback。
+
+因此,通常你可以省略 `fallback` 参数。
+
+///
+
+这对会为每个页面生成静态 HTML 文件的前端工具很有用,例如 Astro。
+
+## 自动 Fallback { #fallback-auto }
+
+默认情况下,`app.frontend()` 使用 `fallback="auto"`。
+
+如果前端目录中存在 `404.html` 文件,缺失的前端路径会以状态码 `404` 提供该文件。
+
+否则,如果存在 `index.html` 文件,缺失的浏览器导航路径会提供 `index.html`,这正是许多使用客户端路由的前端应用所期望的行为。
+
+因此,在大多数情况下,你可以使用 `app.frontend("/", directory="dist")`,而无需指定 `fallback` 参数。
+
+{* ../../docs_src/frontend/tutorial001_py310.py hl[5] *}
+
+## 禁用 Fallback { #disable-fallback }
+
+如果你不想为缺失的前端路径提供 fallback 文件,请使用 `fallback=None`:
+
+{* ../../docs_src/frontend/tutorial005_py310.py hl[5] *}
+
+这样,缺失的前端路径会返回普通的 `404`。
+
+## 检查目录 { #check-directory }
+
+默认情况下,`app.frontend()` 会在应用创建时检查目录是否存在。
+
+这有助于尽早发现配置错误。例如,如果前端构建输出目录缺失,**FastAPI** 会在启动时抛出错误。
+
+如果你的前端文件会稍后创建,例如在应用对象创建之后由单独的构建步骤创建,请设置 `check_dir=False`:
+
+{* ../../docs_src/frontend/tutorial006_py310.py hl[5] *}
+
+使用 `check_dir=False` 时,**FastAPI** 不会在应用创建时检查目录。如果在处理请求时配置的目录仍然缺失,**FastAPI** 会在那时抛出错误。
+
+## 与 `APIRouter` 一起使用 { #use-it-with-apirouter }
+
+你也可以将前端文件添加到一个 `APIRouter`,并使用前缀包含它:
+
+{* ../../docs_src/frontend/tutorial004_py310.py hl[6,7] *}
+
+在这个示例中,前端路径会在 `/app` 下提供服务。
+
+应用中的任何常规*路径操作*仍会优先,包括其他 router 中的路径操作。
+
+## 仅限静态构建输出 { #static-build-output-only }
+
+`app.frontend()` 提供的是你的前端构建已经生成的文件。
+
+它不会运行服务端渲染。它适用于生成静态文件的前端框架,而不适用于需要在服务器上为每个请求进行动态渲染的框架。
diff --git a/docs/zh/docs/tutorial/handling-errors.md b/docs/zh/docs/tutorial/handling-errors.md
index f3a23fab0..b77ca7a6c 100644
--- a/docs/zh/docs/tutorial/handling-errors.md
+++ b/docs/zh/docs/tutorial/handling-errors.md
@@ -6,16 +6,16 @@
你可能需要告诉客户端:
-- 客户端没有执行该操作的权限
-- 客户端没有访问该资源的权限
-- 客户端要访问的项目不存在
-- 等等
+* 客户端没有执行该操作的权限
+* 客户端没有访问该资源的权限
+* 客户端要访问的项目不存在
+* 等等
-遇到这些情况时,通常要返回 **4XX**(400 至 499)**HTTP 状态码**。
+遇到这些情况时,通常要返回 **400** 范围内(400 至 499)的 **HTTP 状态码**。
-这与表示请求成功的 **2XX**(200 至 299)HTTP 状态码类似。那些“200”状态码表示某种程度上的“成功”。
+这与 200 HTTP 状态码(200 至 299)类似。那些“200”状态码表示请求在某种程度上“成功”。
-而 **4XX** 状态码表示客户端发生了错误。
+而 400 范围内的状态码表示客户端发生了错误。
大家都知道**「404 Not Found」**错误,还有调侃这个错误的笑话吧?
@@ -237,8 +237,8 @@ from starlette.exceptions import HTTPException as StarletteHTTPException
### 复用 **FastAPI** 的异常处理器 { #reuse-fastapis-exception-handlers }
-如果你想在自定义处理后仍复用 **FastAPI** 的默认异常处理器,可以从 `fastapi.exception_handlers` 导入并复用这些默认处理器:
+如果你想在使用该异常的同时使用 **FastAPI** 的相同默认异常处理器,可以从 `fastapi.exception_handlers` 导入并复用这些默认处理器:
{* ../../docs_src/handling_errors/tutorial006_py310.py hl[2:5,15,21] *}
-虽然本例只是用非常夸张的信息打印了错误,但足以说明:你可以先处理异常,然后再复用默认的异常处理器。
+虽然本例只是用非常夸张的信息打印了错误,但足以说明:你可以使用该异常,然后直接复用默认的异常处理器。
diff --git a/docs/zh/docs/tutorial/index.md b/docs/zh/docs/tutorial/index.md
index 8d6cbc7a6..fde264d2c 100644
--- a/docs/zh/docs/tutorial/index.md
+++ b/docs/zh/docs/tutorial/index.md
@@ -1,10 +1,10 @@
# 教程 - 用户指南 { #tutorial-user-guide }
-本教程将一步步向您展示如何使用 **FastAPI** 的绝大部分特性。
+本教程将一步步向你展示如何使用 **FastAPI** 的绝大部分特性。
-各个章节的内容循序渐进,但是又围绕着单独的主题,所以您可以直接跳转到某个章节以解决您的特定 API 需求。
+各个章节的内容循序渐进,但是又围绕着单独的主题,所以你可以直接跳转到某个章节以解决你的特定 API 需求。
-本教程同样可以作为将来的参考手册,所以您可以随时回到本教程并查阅您需要的内容。
+本教程同样可以作为将来的参考手册,所以你可以随时回到本教程并查阅你需要的内容。
## 运行代码 { #run-the-code }
@@ -52,7 +52,7 @@ $ fastapi dev
-**强烈建议**您在本地编写或复制代码,对其进行编辑并运行。
+**强烈建议**你在本地编写或复制代码,对其进行编辑并运行。
在编辑器中使用 FastAPI 会真正地展现出它的优势:只需要编写很少的代码,所有的类型检查,代码补全等等。
@@ -60,9 +60,9 @@ $ fastapi dev
## 安装 FastAPI { #install-fastapi }
-第一个步骤是安装 FastAPI.
+第一个步骤是安装 FastAPI。
-请确保您创建并激活一个[虚拟环境](../virtual-environments.md),然后**安装 FastAPI**:
+请确保你创建并激活一个[虚拟环境](../virtual-environments.md),然后**安装 FastAPI**:
contact 字段| 参数 | 类型 | 描述 |
|---|---|---|
name | str | 联系人/组织的识别名称。 |
url | str | 指向联系信息的 URL。必须采用 URL 格式。 |
email | str | 联系人/组织的电子邮件地址。必须采用电子邮件地址的格式。 |
license_info 字段| 参数 | 类型 | 描述 |
|---|---|---|
name | str | 必须(如果设置了 license_info)。用于 API 的许可证名称。 |
identifier | str | API 的 [SPDX](https://spdx.org/licenses/) 许可证表达式。字段 identifier 与字段 url 互斥。自 OpenAPI 3.1.0、FastAPI 0.99.0 起可用。 |
url | str | 用于 API 的许可证的 URL。必须采用 URL 格式。 |
-/// check | 检查
+/// tip | 提示
还是使用 Python 类型声明,**FastAPI** 提供了(集成 Swagger UI 的)自动交互式文档。
@@ -102,7 +102,7 @@
## Pydantic { #pydantic }
-FastAPI 充分地利用了 [Pydantic](https://docs.pydantic.dev/) 的优势,用它在后台校验数据。众所周知,Pydantic 擅长的就是数据校验。
+所有数据校验都由 [Pydantic](https://docs.pydantic.dev/) 在幕后完成,因此你能从中获得所有好处。而且你可以放心。
同样,`str`、`float`、`bool` 以及很多复合数据类型都可以使用类型声明。
diff --git a/docs/zh/docs/tutorial/query-params-str-validations.md b/docs/zh/docs/tutorial/query-params-str-validations.md
index 67a5b4000..0164c27e6 100644
--- a/docs/zh/docs/tutorial/query-params-str-validations.md
+++ b/docs/zh/docs/tutorial/query-params-str-validations.md
@@ -1,5 +1,6 @@
# 查询参数和字符串校验 { #query-parameters-and-string-validations }
+
**FastAPI** 允许你为参数声明额外的信息和校验。
让我们以下面的应用为例:
@@ -29,7 +30,7 @@ FastAPI 会因为默认值 `= None` 而知道 `q` 的值不是必填的。
{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *}
-/// info | 信息
+/// note | 注意
FastAPI 在 0.95.0 版本中添加了对 `Annotated` 的支持(并开始推荐使用)。
@@ -381,7 +382,7 @@ Pydantic 还有 [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/va
{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *}
-/// info | 信息
+/// note | 注意
这在 Pydantic 2 或更高版本中可用。😎
diff --git a/docs/zh/docs/tutorial/query-params.md b/docs/zh/docs/tutorial/query-params.md
index 9d6c05fbb..971dbb0ed 100644
--- a/docs/zh/docs/tutorial/query-params.md
+++ b/docs/zh/docs/tutorial/query-params.md
@@ -1,5 +1,6 @@
# 查询参数 { #query-parameters }
+
声明的参数不是路径参数时,路径操作函数会把该参数自动解释为“查询”参数。
{* ../../docs_src/query_params/tutorial001_py310.py hl[9] *}
@@ -65,7 +66,7 @@ http://127.0.0.1:8000/items/?skip=20
本例中,查询参数 `q` 是可选的,默认值为 `None`。
-/// check | 检查
+/// tip | 提示
注意,**FastAPI** 可以识别出 `item_id` 是路径参数,`q` 不是路径参数,而是查询参数。
diff --git a/docs/zh/docs/tutorial/request-files.md b/docs/zh/docs/tutorial/request-files.md
index 6569e1715..38c089ff3 100644
--- a/docs/zh/docs/tutorial/request-files.md
+++ b/docs/zh/docs/tutorial/request-files.md
@@ -2,7 +2,7 @@
你可以使用 `File` 定义由客户端上传的文件。
-/// info | 信息
+/// note | 注意
要接收上传的文件,请先安装 [`python-multipart`](https://github.com/Kludex/python-multipart)。
@@ -28,7 +28,7 @@ $ pip install python-multipart
{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *}
-/// info | 信息
+/// note | 注意
`File` 是直接继承自 `Form` 的类。
@@ -147,7 +147,7 @@ HTML 表单(``)向服务器发送数据的方式通常会对数
## 多文件上传 { #multiple-file-uploads }
-FastAPI 支持同时上传多个文件。
+可以同时上传多个文件。
它们会被关联到同一个通过「表单数据」发送的「表单字段」。
diff --git a/docs/zh/docs/tutorial/request-form-models.md b/docs/zh/docs/tutorial/request-form-models.md
index ec52710a8..bbe805ef8 100644
--- a/docs/zh/docs/tutorial/request-form-models.md
+++ b/docs/zh/docs/tutorial/request-form-models.md
@@ -2,7 +2,7 @@
你可以在 FastAPI 中使用 **Pydantic 模型**声明**表单字段**。
-/// info | 信息
+/// note | 注意
要使用表单,首先安装 [`python-multipart`](https://github.com/Kludex/python-multipart)。
diff --git a/docs/zh/docs/tutorial/request-forms-and-files.md b/docs/zh/docs/tutorial/request-forms-and-files.md
index 8e092af0a..d97239136 100644
--- a/docs/zh/docs/tutorial/request-forms-and-files.md
+++ b/docs/zh/docs/tutorial/request-forms-and-files.md
@@ -2,7 +2,7 @@
FastAPI 支持同时使用 `File` 和 `Form` 定义文件和表单字段。
-/// info | 信息
+/// note | 注意
接收上传的文件和/或表单数据,首先安装 [`python-multipart`](https://github.com/Kludex/python-multipart)。
diff --git a/docs/zh/docs/tutorial/request-forms.md b/docs/zh/docs/tutorial/request-forms.md
index ab82a181a..0e7f19c70 100644
--- a/docs/zh/docs/tutorial/request-forms.md
+++ b/docs/zh/docs/tutorial/request-forms.md
@@ -2,7 +2,7 @@
当你需要接收表单字段而不是 JSON 时,可以使用 `Form`。
-/// info
+/// note | 注意
要使用表单,首先安装 [`python-multipart`](https://github.com/Kludex/python-multipart)。
@@ -32,13 +32,13 @@ $ pip install python-multipart
使用 `Form` 可以像使用 `Body`(以及 `Query`、`Path`、`Cookie`)一样声明相同的配置,包括校验、示例、别名(例如将 `username` 写成 `user-name`)等。
-/// info
+/// note | 注意
`Form` 是直接继承自 `Body` 的类。
///
-/// tip
+/// tip | 提示
要声明表单请求体,必须显式使用 `Form`,否则这些参数会被当作查询参数或请求体(JSON)参数。
@@ -60,9 +60,9 @@ HTML 表单(``)向服务器发送数据时通常会对数据使
///
-/// warning
+/// warning | 警告
-你可以在一个路径操作中声明多个 `Form` 参数,但不能同时再声明要接收为 JSON 的 `Body` 字段,因为此时请求体会使用 `application/x-www-form-urlencoded` 而不是 `application/json` 进行编码。
+你可以在一个*路径操作*中声明多个 `Form` 参数,但不能同时再声明要接收为 JSON 的 `Body` 字段,因为此时请求体会使用 `application/x-www-form-urlencoded` 而不是 `application/json` 进行编码。
这不是 **FastAPI** 的限制,而是 HTTP 协议的一部分。
diff --git a/docs/zh/docs/tutorial/response-model.md b/docs/zh/docs/tutorial/response-model.md
index 9b4e0382e..5d8d0c185 100644
--- a/docs/zh/docs/tutorial/response-model.md
+++ b/docs/zh/docs/tutorial/response-model.md
@@ -72,7 +72,7 @@ FastAPI 会使用这个 `response_model` 来完成数据文档、校验等,并
{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *}
-/// info | 信息
+/// note | 注意
要使用 `EmailStr`,首先安装 [`email-validator`](https://github.com/JoshData/python-email-validator)。
@@ -116,7 +116,7 @@ $ pip install "pydantic[email]"
{* ../../docs_src/response_model/tutorial003_py310.py hl[24] *}
-……我们仍将 `response_model` 声明为不包含密码的 `UserOut` 模型:
+...我们仍将 `response_model` 声明为不包含密码的 `UserOut` 模型:
{* ../../docs_src/response_model/tutorial003_py310.py hl[22] *}
@@ -128,7 +128,7 @@ $ pip install "pydantic[email]"
这就是为什么在这个例子里我们必须在 `response_model` 参数中声明它。
-……但继续往下读,看看如何更好地处理这种情况。
+...但继续往下读,看看如何更好地处理这种情况。
## 返回类型与数据过滤 { #return-type-and-data-filtering }
@@ -206,7 +206,7 @@ FastAPI 在内部配合 Pydantic 做了多项处理,确保不会把类继承
{* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *}
-……它失败是因为该类型注解不是 Pydantic 类型,也不只是单个 `Response` 类或其子类,而是 `Response` 与 `dict` 的联合类型(任意其一)。
+...它失败是因为该类型注解不是 Pydantic 类型,也不只是单个 `Response` 类或其子类,而是 `Response` 与 `dict` 的联合类型(任意其一)。
### 禁用响应模型 { #disable-response-model }
@@ -251,7 +251,7 @@ FastAPI 在内部配合 Pydantic 做了多项处理,确保不会把类继承
}
```
-/// info | 信息
+/// note | 注意
你还可以使用:
diff --git a/docs/zh/docs/tutorial/response-status-code.md b/docs/zh/docs/tutorial/response-status-code.md
index e57c0e593..c06e67e6f 100644
--- a/docs/zh/docs/tutorial/response-status-code.md
+++ b/docs/zh/docs/tutorial/response-status-code.md
@@ -6,7 +6,7 @@
* `@app.post()`
* `@app.put()`
* `@app.delete()`
-* 等...
+* 等。
{* ../../docs_src/response_status_code/tutorial001_py310.py hl[6] *}
@@ -18,7 +18,7 @@
`status_code` 参数接收表示 HTTP 状态码的数字。
-/// info | 信息
+/// note | 注意
`status_code` 还能接收 `IntEnum` 类型,比如 Python 的 [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus)。
@@ -27,13 +27,13 @@
它可以:
* 在响应中返回状态码
-* 在 OpenAPI 概图(及用户界面)中存档:
+* 在 OpenAPI schema(以及用户界面)中将其记录为该状态码:
/// note | 注意
-某些响应状态码表示响应没有响应体(参阅下一章)。
+某些响应状态码表示响应没有响应体(参阅下一节)。
FastAPI 可以进行识别,并生成表明无响应体的 OpenAPI 文档。
@@ -43,7 +43,7 @@ FastAPI 可以进行识别,并生成表明无响应体的 OpenAPI 文档。
/// note | 注意
-如果已经了解 HTTP 状态码,请跳到下一章。
+如果已经了解 HTTP 状态码,请跳到下一节。
///
diff --git a/docs/zh/docs/tutorial/schema-extra-example.md b/docs/zh/docs/tutorial/schema-extra-example.md
index 482abd21d..b18e69641 100644
--- a/docs/zh/docs/tutorial/schema-extra-example.md
+++ b/docs/zh/docs/tutorial/schema-extra-example.md
@@ -10,7 +10,7 @@
{* ../../docs_src/schema_extra_example/tutorial001_py310.py hl[13:24] *}
-这些额外信息会原样添加到该模型输出的 JSON Schema 中,并会在 API 文档中使用。
+这些额外信息会原样添加到该模型输出的 **JSON Schema** 中,并会在 API 文档中使用。
你可以使用属性 `model_config`,它接收一个 `dict`,详见 [Pydantic 文档:配置](https://docs.pydantic.dev/latest/api/config/)。
@@ -24,9 +24,9 @@
///
-/// info | 信息
+/// note | 注意
-OpenAPI 3.1.0(自 FastAPI 0.99.0 起使用)增加了对 `examples` 的支持,它是 JSON Schema 标准的一部分。
+OpenAPI 3.1.0(自 FastAPI 0.99.0 起使用)增加了对 `examples` 的支持,它是 **JSON Schema** 标准的一部分。
在此之前,只支持使用单个示例的关键字 `example`。OpenAPI 3.1.0 仍然支持它,但它已被弃用,并不属于 JSON Schema 标准。因此,建议你把 `example` 迁移到 `examples`。🤓
@@ -52,7 +52,7 @@ OpenAPI 3.1.0(自 FastAPI 0.99.0 起使用)增加了对 `examples` 的支持
- `Form()`
- `File()`
-你也可以声明一组 `examples`,这些带有附加信息的示例将被添加到它们在 OpenAPI 中的 JSON Schema 里。
+你也可以声明一组 `examples`,这些带有附加信息的示例将被添加到它们在 **OpenAPI** 中的 **JSON Schema** 里。
### 带有 `examples` 的 `Body` { #body-with-examples }
@@ -72,21 +72,21 @@ OpenAPI 3.1.0(自 FastAPI 0.99.0 起使用)增加了对 `examples` 的支持
{* ../../docs_src/schema_extra_example/tutorial004_an_py310.py hl[23:38] *}
-这样做时,这些示例会成为该请求体数据内部 JSON Schema 的一部分。
+这样做时,这些示例会成为该请求体数据内部 **JSON Schema** 的一部分。
-不过,在撰写本文时,用于展示文档 UI 的 Swagger UI 并不支持显示 JSON Schema 中数据的多个示例。但请继续阅读,下面有一种变通方法。
+不过,在撰写本文时,用于展示文档 UI 的 Swagger UI 并不支持显示 **JSON Schema** 中数据的多个示例。但请继续阅读,下面有一种变通方法。
### OpenAPI 特定的 `examples` { #openapi-specific-examples }
-在 JSON Schema 支持 `examples` 之前,OpenAPI 就已支持一个同名但不同的字段 `examples`。
+在 **JSON Schema** 支持 `examples` 之前,OpenAPI 就已支持一个同名但不同的字段 `examples`。
-这个面向 OpenAPI 的 `examples` 位于 OpenAPI 规范的另一处。它放在每个路径操作的详细信息中,而不是每个 JSON Schema 里。
+这个 **OpenAPI 特定的** `examples` 位于 OpenAPI 规范的另一处。它放在**每个*路径操作*的详细信息**中,而不是每个 JSON Schema 里。
-而 Swagger UI 早就支持这个特定的 `examples` 字段。因此,你可以用它在文档 UI 中展示不同的示例。
+而 Swagger UI 早就支持这个特定的 `examples` 字段。因此,你可以用它在文档 UI 中**展示**不同的**示例**。
-这个 OpenAPI 特定字段 `examples` 的结构是一个包含多个示例的 `dict`(而不是一个 `list`),每个示例都包含会被添加到 OpenAPI 的额外信息。
+这个 OpenAPI 特定字段 `examples` 的结构是一个包含**多个示例**的 `dict`(而不是一个 `list`),每个示例都包含会被添加到 **OpenAPI** 的额外信息。
-这不放在 OpenAPI 内部包含的各个 JSON Schema 里,而是直接放在路径操作上。
+这不放在 OpenAPI 内部包含的各个 JSON Schema 里,而是直接放在*路径操作*上。
### 使用 `openapi_examples` 参数 { #using-the-openapi-examples-parameter }
@@ -123,23 +123,23 @@ OpenAPI 3.1.0(自 FastAPI 0.99.0 起使用)增加了对 `examples` 的支持
/// tip | 提示
-如果你已经在使用 FastAPI 版本 0.99.0 或更高版本,你大概率可以跳过这些细节。
+如果你已经在使用 **FastAPI** 版本 **0.99.0 或更高版本**,你大概率可以**跳过**这些细节。
它们对更早版本(OpenAPI 3.1.0 尚不可用之前)更相关。
-你可以把这当作一堂简短的 OpenAPI 和 JSON Schema 历史课。🤓
+你可以把这当作一堂简短的 OpenAPI 和 JSON Schema **历史课**。🤓
///
/// warning | 警告
-以下是关于 JSON Schema 和 OpenAPI 标准的非常技术性的细节。
+以下是关于 **JSON Schema** 和 **OpenAPI** 标准的非常技术性的细节。
如果上面的思路对你已经足够可用,你可能不需要这些细节,可以直接跳过。
///
-在 OpenAPI 3.1.0 之前,OpenAPI 使用的是一个更旧且经过修改的 JSON Schema 版本。
+在 OpenAPI 3.1.0 之前,OpenAPI 使用的是一个更旧且经过修改的 **JSON Schema** 版本。
当时 JSON Schema 没有 `examples`,所以 OpenAPI 在它修改过的版本中添加了自己的 `example` 字段。
@@ -155,7 +155,7 @@ OpenAPI 还在规范的其他部分添加了 `example` 和 `examples` 字段:
- `File()`
- `Form()`
-/// info | 信息
+/// note | 注意
这个旧的、OpenAPI 特定的 `examples` 参数,自 FastAPI `0.103.0` 起改名为 `openapi_examples`。
@@ -169,9 +169,9 @@ OpenAPI 还在规范的其他部分添加了 `example` 和 `examples` 字段:
现在,这个新的 `examples` 字段优先于旧的单个(且自定义的)`example` 字段,后者已被弃用。
-JSON Schema 中这个新的 `examples` 字段只是一个由示例组成的 `list`,而不是像上面提到的 OpenAPI 其他位置那样带有额外元数据的 `dict`。
+在 JSON Schema 中,这个新的 `examples` 字段**只是一个由示例组成的 `list`**,而不是像上面提到的 OpenAPI 其他位置那样带有额外元数据的 `dict`。
-/// info | 信息
+/// note | 注意
即使在 OpenAPI 3.1.0 发布、并与 JSON Schema 有了这种更简单的集成之后,有一段时间里,提供自动文档的 Swagger UI 并不支持 OpenAPI 3.1.0(它自 5.0.0 版本起已支持 🎉)。
@@ -181,22 +181,22 @@ JSON Schema 中这个新的 `examples` 字段只是一个由示例组成的 `lis
### Pydantic 与 FastAPI 的 `examples` { #pydantic-and-fastapi-examples }
-当你在 Pydantic 模型中添加 `examples`,通过 `schema_extra` 或 `Field(examples=["something"])`,这些示例会被添加到该 Pydantic 模型的 JSON Schema 中。
+当你在 Pydantic 模型中添加 `examples`,通过 `schema_extra` 或 `Field(examples=["something"])`,这些示例会被添加到该 Pydantic 模型的 **JSON Schema** 中。
-这个 Pydantic 模型的 JSON Schema 会被包含到你的 API 的 OpenAPI 中,然后在文档 UI 中使用。
+这个 Pydantic 模型的 **JSON Schema** 会被包含到你的 API 的 **OpenAPI** 中,然后在文档 UI 中使用。
-在 FastAPI 0.99.0 之前的版本(0.99.0 及以上使用更新的 OpenAPI 3.1.0),当你在其他工具(`Query()`、`Body()` 等)中使用 `example` 或 `examples` 时,这些示例不会被添加到描述该数据的 JSON Schema 中(甚至不会添加到 OpenAPI 自己的 JSON Schema 版本中),而是会直接添加到 OpenAPI 的路径操作声明中(在 OpenAPI 使用 JSON Schema 的部分之外)。
+在 FastAPI 0.99.0 之前的版本(0.99.0 及以上使用更新的 OpenAPI 3.1.0),当你在其他工具(`Query()`、`Body()` 等)中使用 `example` 或 `examples` 时,这些示例不会被添加到描述该数据的 JSON Schema 中(甚至不会添加到 OpenAPI 自己的 JSON Schema 版本中),而是会直接添加到 OpenAPI 的*路径操作*声明中(在 OpenAPI 使用 JSON Schema 的部分之外)。
但现在 FastAPI 0.99.0 及以上使用 OpenAPI 3.1.0(其使用 JSON Schema 2020-12)以及 Swagger UI 5.0.0 及以上后,一切更加一致,示例会包含在 JSON Schema 中。
### Swagger UI 与 OpenAPI 特定的 `examples` { #swagger-ui-and-openapi-specific-examples }
-此前,由于 Swagger UI 不支持多个 JSON Schema 示例(截至 2023-08-26),用户无法在文档中展示多个示例。
+由于截至 2023-08-26,Swagger UI 不支持多个 JSON Schema 示例,用户无法在文档中展示多个示例。
-为了解决这个问题,FastAPI `0.103.0` 通过新增参数 `openapi_examples`,为声明同样的旧式 OpenAPI 特定 `examples` 字段提供了支持。🤓
+为了解决这个问题,FastAPI `0.103.0` **增加了支持**,可以通过新参数 `openapi_examples` 声明同样的旧式 **OpenAPI 特定的** `examples` 字段。🤓
### 总结 { #summary }
-我曾经说我不太喜欢历史……结果现在在这儿上“技术史”课。😅
+我曾经说我不太喜欢历史... 结果现在在这儿上“技术史”课。😅
-简而言之,升级到 FastAPI 0.99.0 或更高版本,一切会更简单、一致、直观,你也不必了解这些历史细节。😎
+简而言之,**升级到 FastAPI 0.99.0 或更高版本**,一切会更**简单、一致、直观**,你也不必了解这些历史细节。😎
diff --git a/docs/zh/docs/tutorial/security/first-steps.md b/docs/zh/docs/tutorial/security/first-steps.md
index 6cc91211a..ca3ef8352 100644
--- a/docs/zh/docs/tutorial/security/first-steps.md
+++ b/docs/zh/docs/tutorial/security/first-steps.md
@@ -1,5 +1,6 @@
# 安全 - 第一步 { #security-first-steps }
+
假设你的**后端** API 位于某个域名下。
而**前端**在另一个域名,或同一域名的不同路径(或在移动应用中)。
@@ -24,13 +25,13 @@
## 运行 { #run-it }
-/// info | 信息
+/// note | 注意
当你使用命令 `pip install "fastapi[standard]"` 安装 **FastAPI** 时,[`python-multipart`](https://github.com/Kludex/python-multipart) 包会自动安装。
但是,如果你使用 `pip install fastapi`,默认不会包含 `python-multipart` 包。
-如需手动安装,请先创建并激活[虚拟环境](../../virtual-environments.md),然后执行:
+如需手动安装,请先创建[虚拟环境](../../virtual-environments.md)、激活它,然后执行:
```console
$ pip install python-multipart
@@ -60,7 +61,7 @@ $ fastapi dev
-/// check | Authorize 按钮!
+/// tip | Authorize 按钮!
页面右上角已经有一个崭新的“Authorize”按钮。
@@ -118,7 +119,7 @@ OAuth2 的设计目标是让后端或 API 与负责用户认证的服务器解
本示例将使用 **OAuth2** 的 **Password** 流程并配合 **Bearer** 令牌,通过 `OAuth2PasswordBearer` 类来实现。
-/// info | 信息
+/// note | 注意
“Bearer” 令牌并非唯一选项。
@@ -148,7 +149,7 @@ OAuth2 的设计目标是让后端或 API 与负责用户认证的服务器解
我们很快也会创建对应的实际路径操作。
-/// info | 信息
+/// note | 注意
如果你是非常严格的 “Pythonista”,可能不喜欢使用参数名 `tokenUrl` 而不是 `token_url`。
@@ -176,7 +177,7 @@ oauth2_scheme(some, parameters)
**FastAPI** 会据此在 OpenAPI 架构(以及自动生成的 API 文档)中定义一个“安全方案”。
-/// info | 技术细节
+/// note | 技术细节
**FastAPI** 之所以知道可以使用(在依赖中声明的)`OAuth2PasswordBearer` 在 OpenAPI 中定义安全方案,是因为它继承自 `fastapi.security.oauth2.OAuth2`,而后者又继承自 `fastapi.security.base.SecurityBase`。
diff --git a/docs/zh/docs/tutorial/security/get-current-user.md b/docs/zh/docs/tutorial/security/get-current-user.md
index 814ff2c82..dc8c70014 100644
--- a/docs/zh/docs/tutorial/security/get-current-user.md
+++ b/docs/zh/docs/tutorial/security/get-current-user.md
@@ -8,14 +8,13 @@
接下来,我们学习如何返回当前用户。
-
## 创建用户模型 { #create-a-user-model }
首先,创建 Pydantic 用户模型。
与使用 Pydantic 声明请求体相同,并且可在任何位置使用:
-{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *}
+{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## 创建 `get_current_user` 依赖项 { #create-a-get-current-user-dependency }
@@ -53,9 +52,9 @@
///
-/// check | 检查
+/// tip | 提示
-依赖系统的这种设计方式可以支持不同的依赖项返回同一个 `User` 模型。
+依赖系统的这种设计方式可以支持不同的依赖项(不同的“可依赖项”)返回同一个 `User` 模型。
而不是局限于只能有一个返回该类型数据的依赖项。
@@ -77,7 +76,6 @@
尽管使用应用所需的任何模型、类、数据库。**FastAPI** 通过依赖注入系统都能帮您搞定。
-
## 代码大小 { #code-size }
这个示例看起来有些冗长。毕竟这个文件同时包含了安全、数据模型的工具函数,以及路径操作等代码。
diff --git a/docs/zh/docs/tutorial/security/oauth2-jwt.md b/docs/zh/docs/tutorial/security/oauth2-jwt.md
index 8a56137d3..418b3b97d 100644
--- a/docs/zh/docs/tutorial/security/oauth2-jwt.md
+++ b/docs/zh/docs/tutorial/security/oauth2-jwt.md
@@ -42,7 +42,7 @@ $ pip install pyjwt