diff --git a/docs/de/docs/_llm-test.md b/docs/de/docs/_llm-test.md index 498a2e5b6a..de1aa1e9fe 100644 --- a/docs/de/docs/_llm-test.md +++ b/docs/de/docs/_llm-test.md @@ -1,17 +1,17 @@ # LLM-Testdatei { #llm-test-file } -Dieses Dokument testet, ob das LLM, das die Dokumentation übersetzt, den `general_prompt` in `scripts/translate.py` und den sprachspezifischen Prompt in `docs/{language code}/llm-prompt.md` versteht. Der sprachspezifische Prompt wird an `general_prompt` angehängt. +Dieses Dokument testet, ob das LLM, das die Dokumentation übersetzt, den `general_prompt` in `scripts/translate.py` und den sprachspezifischen Prompt in `docs/{language code}/llm-prompt.md` versteht. Der sprachsspezifische Prompt wird an `general_prompt` angehängt. -Hier hinzugefügte Tests werden von allen Erstellern sprachspezifischer Prompts gesehen. +Hier hinzugefügte Tests werden von allen Erstellern sprachsspezifischer Prompts gesehen. So verwenden: -* Einen sprachspezifischen Prompt haben – `docs/{language code}/llm-prompt.md`. +* Einen sprachsspezifischen Prompt haben – `docs/{language code}/llm-prompt.md`. * Eine frische Übersetzung dieses Dokuments in die gewünschte Zielsprache durchführen (siehe z. B. das Kommando `translate-page` der `translate.py`). Dadurch wird die Übersetzung unter `docs/{language code}/docs/_llm-test.md` erstellt. * Prüfen Sie, ob in der Übersetzung alles in Ordnung ist. * Verbessern Sie bei Bedarf Ihren sprachsspezifischen Prompt, den allgemeinen Prompt oder das englische Dokument. * Beheben Sie anschließend manuell die verbleibenden Probleme in der Übersetzung, sodass es eine gute Übersetzung ist. -* Übersetzen Sie erneut, nachdem die gute Übersetzung vorliegt. Das ideale Ergebnis wäre, dass das LLM an der Übersetzung keine Änderungen mehr vornimmt. Das bedeutet, dass der allgemeine Prompt und Ihr sprachsspezifischer Prompt so gut sind, wie sie sein können (Es wird manchmal ein paar scheinbar zufällige Änderungen machen, der Grund ist, dass LLMs keine deterministischen Algorithmen sind). +* Übersetzen Sie erneut, nachdem die gute Übersetzung vorliegt. Das ideale Ergebnis wäre, dass das LLM an der Übersetzung keine Änderungen mehr vornimmt. Das bedeutet, dass der allgemeine Prompt und Ihr sprachsspezifischer Prompt so gut sind, wie sie sein können (Es wird manchmal ein paar scheinbar zufällige Änderungen machen, der Grund ist, dass [LLMs keine deterministischen Algorithmen sind](https://doublespeak.chat/#/handbook#deterministic-output)). Die Tests: @@ -95,7 +95,7 @@ $ fastapi run Externer Link -* Link zu einem Stil -* Link zu einem Skript -* Link zu einem Bild +* [Interner Link](index.md#installation) +* [Externer Link](https://sqlmodel.tiangolo.com/) +* [Link zu einem Stil](https://fastapi.tiangolo.com/css/styles.css) +* [Link zu einem Skript](https://fastapi.tiangolo.com/js/logic.js) +* [Link zu einem Bild](https://fastapi.tiangolo.com/img/foo.jpg) Der Linktext sollte übersetzt werden, die Linkadresse sollte auf die Übersetzung zeigen: -* FastAPI-Link +* [FastAPI-Link](https://fastapi.tiangolo.com/de/) //// diff --git a/docs/de/docs/advanced/additional-responses.md b/docs/de/docs/advanced/additional-responses.md index 531702bf18..bc7c477c86 100644 --- a/docs/de/docs/advanced/additional-responses.md +++ b/docs/de/docs/advanced/additional-responses.md @@ -243,5 +243,5 @@ Zum Beispiel: Um zu sehen, was genau Sie in die Responses aufnehmen können, können Sie die folgenden Abschnitte in der OpenAPI-Spezifikation überprüfen: -* OpenAPI Responses Object, enthält das `Response Object`. -* OpenAPI Response Object, Sie können alles davon direkt in jede Response innerhalb Ihres `responses`-Parameter einfügen. Einschließlich `description`, `headers`, `content` (darin deklarieren Sie verschiedene Medientypen und JSON-Schemas) und `links`. +* [OpenAPI Responses Object](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#responses-object), enthält das `Response Object`. +* [OpenAPI Response Object](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#response-object), Sie können alles davon direkt in jede Response innerhalb Ihres `responses`-Parameter einfügen. Einschließlich `description`, `headers`, `content` (darin deklarieren Sie verschiedene Medientypen und JSON-Schemas) und `links`. diff --git a/docs/de/docs/advanced/additional-status-codes.md b/docs/de/docs/advanced/additional-status-codes.md index f948e18629..f1a74a32c4 100644 --- a/docs/de/docs/advanced/additional-status-codes.md +++ b/docs/de/docs/advanced/additional-status-codes.md @@ -38,4 +38,4 @@ Sie können auch `from starlette.responses import JSONResponse` verwenden. Wenn Sie zusätzliche Statuscodes und Responses direkt zurückgeben, werden diese nicht in das OpenAPI-Schema (die API-Dokumentation) aufgenommen, da FastAPI keine Möglichkeit hat, im Voraus zu wissen, was Sie zurückgeben werden. -Sie können das jedoch in Ihrem Code dokumentieren, indem Sie Folgendes verwenden: [Zusätzliche Responses](additional-responses.md){.internal-link target=_blank}. +Sie können das jedoch in Ihrem Code dokumentieren, indem Sie Folgendes verwenden: [Zusätzliche Responses](additional-responses.md). diff --git a/docs/de/docs/advanced/advanced-dependencies.md b/docs/de/docs/advanced/advanced-dependencies.md index 50b4e20ac0..ab2cab0713 100644 --- a/docs/de/docs/advanced/advanced-dependencies.md +++ b/docs/de/docs/advanced/advanced-dependencies.md @@ -132,7 +132,7 @@ Wenn Sie diesen spezifischen Anwendungsfall mit SQLModel (oder SQLAlchemy) haben Auf diese Weise würde die Session die Datenbankverbindung freigeben, sodass andere Requests sie verwenden könnten. -Wenn Sie einen anderen Anwendungsfall haben, der ein frühes Beenden aus einer Abhängigkeit mit `yield` benötigt, erstellen Sie bitte eine GitHub-Diskussion-Frage mit Ihrem spezifischen Anwendungsfall und warum Sie von einem frühen Schließen für Abhängigkeiten mit `yield` profitieren würden. +Wenn Sie einen anderen Anwendungsfall haben, der ein frühes Beenden aus einer Abhängigkeit mit `yield` benötigt, erstellen Sie bitte eine [GitHub-Diskussion-Frage](https://github.com/fastapi/fastapi/discussions/new?category=questions) mit Ihrem spezifischen Anwendungsfall und warum Sie von einem frühen Schließen für Abhängigkeiten mit `yield` profitieren würden. Wenn es überzeugende Anwendungsfälle für ein frühes Schließen bei Abhängigkeiten mit `yield` gibt, würde ich erwägen, eine neue Möglichkeit hinzuzufügen, um ein frühes Schließen optional zu aktivieren. @@ -144,7 +144,7 @@ Dies wurde in Version 0.110.0 geändert, um unbehandelten Speicherverbrauch durc ### Hintergrundtasks und Abhängigkeiten mit `yield`, Technische Details { #background-tasks-and-dependencies-with-yield-technical-details } -Vor FastAPI 0.106.0 war das Werfen von Exceptions nach `yield` nicht möglich, der Exit-Code in Abhängigkeiten mit `yield` wurde ausgeführt, nachdem die Response gesendet wurde, sodass [Exceptionhandler](../tutorial/handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank} bereits ausgeführt worden wären. +Vor FastAPI 0.106.0 war das Werfen von Exceptions nach `yield` nicht möglich, der Exit-Code in Abhängigkeiten mit `yield` wurde ausgeführt, nachdem die Response gesendet wurde, sodass [Exceptionhandler](../tutorial/handling-errors.md#install-custom-exception-handlers) bereits ausgeführt worden wären. Dies war so designt, hauptsächlich um die Verwendung derselben von Abhängigkeiten „geyieldeten“ Objekte in Hintergrundtasks zu ermöglichen, da der Exit-Code erst ausgeführt wurde, nachdem die Hintergrundtasks abgeschlossen waren. diff --git a/docs/de/docs/advanced/async-tests.md b/docs/de/docs/advanced/async-tests.md index 7702cc1c57..58c925ae6e 100644 --- a/docs/de/docs/advanced/async-tests.md +++ b/docs/de/docs/advanced/async-tests.md @@ -16,11 +16,11 @@ Auch wenn Ihre **FastAPI**-Anwendung normale `def`-Funktionen anstelle von `asyn Der `TestClient` betreibt unter der Haube etwas Magie, um die asynchrone FastAPI-Anwendung in Ihren normalen `def`-Testfunktionen, mithilfe von Standard-Pytest aufzurufen. Aber diese Magie funktioniert nicht mehr, wenn wir sie in asynchronen Funktionen verwenden. Durch die asynchrone Ausführung unserer Tests können wir den `TestClient` nicht mehr in unseren Testfunktionen verwenden. -Der `TestClient` basiert auf HTTPX und glücklicherweise können wir es direkt verwenden, um die API zu testen. +Der `TestClient` basiert auf [HTTPX](https://www.python-httpx.org) und glücklicherweise können wir es direkt verwenden, um die API zu testen. ## Beispiel { #example } -Betrachten wir als einfaches Beispiel eine Dateistruktur ähnlich der in [Größere Anwendungen](../tutorial/bigger-applications.md){.internal-link target=_blank} und [Testen](../tutorial/testing.md){.internal-link target=_blank}: +Betrachten wir als einfaches Beispiel eine Dateistruktur ähnlich der in [Größere Anwendungen](../tutorial/bigger-applications.md) und [Testen](../tutorial/testing.md): ``` . @@ -84,7 +84,7 @@ Beachten Sie, dass wir async/await mit dem neuen `AsyncClient` verwenden – der /// warning | Achtung -Falls Ihre Anwendung auf Lifespan-Events angewiesen ist, der `AsyncClient` löst diese Events nicht aus. Um sicherzustellen, dass sie ausgelöst werden, verwenden Sie `LifespanManager` von florimondmanca/asgi-lifespan. +Falls Ihre Anwendung auf Lifespan-Events angewiesen ist, der `AsyncClient` löst diese Events nicht aus. Um sicherzustellen, dass sie ausgelöst werden, verwenden Sie `LifespanManager` von [florimondmanca/asgi-lifespan](https://github.com/florimondmanca/asgi-lifespan#usage). /// @@ -94,6 +94,6 @@ Da die Testfunktion jetzt asynchron ist, können Sie in Ihren Tests neben dem Se /// tip | Tipp -Wenn Sie einen `RuntimeError: Task attached to a different loop` erhalten, wenn Sie asynchrone Funktionsaufrufe in Ihre Tests integrieren (z. B. bei Verwendung von MongoDBs MotorClient), dann denken Sie daran, Objekte zu instanziieren, die einen Event Loop nur innerhalb asynchroner Funktionen benötigen, z. B. einen `@app.on_event("startup")`-Callback. +Wenn Sie einen `RuntimeError: Task attached to a different loop` erhalten, wenn Sie asynchrone Funktionsaufrufe in Ihre Tests integrieren (z. B. bei Verwendung von [MongoDBs MotorClient](https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop)), dann denken Sie daran, Objekte zu instanziieren, die einen Event Loop nur innerhalb asynchroner Funktionen benötigen, z. B. einen `@app.on_event("startup")`-Callback. /// diff --git a/docs/de/docs/advanced/behind-a-proxy.md b/docs/de/docs/advanced/behind-a-proxy.md index cbcdc59d4c..7260202198 100644 --- a/docs/de/docs/advanced/behind-a-proxy.md +++ b/docs/de/docs/advanced/behind-a-proxy.md @@ -16,9 +16,9 @@ Aber aus Sicherheitsgründen, da der Server nicht weiß, dass er hinter einem ve Die Proxy-Header sind: -* X-Forwarded-For -* X-Forwarded-Proto -* X-Forwarded-Host +* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For) +* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto) +* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host) /// @@ -60,7 +60,7 @@ https://mysuperapp.com/items/ /// tip | Tipp -Wenn Sie mehr über HTTPS erfahren möchten, lesen Sie den Leitfaden [Über HTTPS](../deployment/https.md){.internal-link target=_blank}. +Wenn Sie mehr über HTTPS erfahren möchten, lesen Sie den Leitfaden [Über HTTPS](../deployment/https.md). /// @@ -228,7 +228,7 @@ Die Übergabe des `root_path` an `FastAPI` wäre das Äquivalent zur Übergabe d Beachten Sie, dass der Server (Uvicorn) diesen `root_path` für nichts anderes verwendet als für die Weitergabe an die Anwendung. -Aber wenn Sie mit Ihrem Browser auf http://127.0.0.1:8000/app gehen, sehen Sie die normale Response: +Aber wenn Sie mit Ihrem Browser auf [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app) gehen, sehen Sie die normale Response: ```JSON { @@ -251,9 +251,9 @@ In einem solchen Fall (ohne ein abgetrenntes Pfadpräfix) würde der Proxy auf e ## Lokal testen mit Traefik { #testing-locally-with-traefik } -Sie können das Experiment mit einem abgetrennten Pfadpräfix einfach lokal ausführen, indem Sie Traefik verwenden. +Sie können das Experiment mit einem abgetrennten Pfadpräfix einfach lokal ausführen, indem Sie [Traefik](https://docs.traefik.io/) verwenden. -Laden Sie Traefik herunter, es ist eine einzelne Binärdatei, Sie können die komprimierte Datei extrahieren und sie direkt vom Terminal aus ausführen. +[Laden Sie Traefik herunter](https://github.com/containous/traefik/releases), es ist eine einzelne Binärdatei, Sie können die komprimierte Datei extrahieren und sie direkt vom Terminal aus ausführen. Dann erstellen Sie eine Datei `traefik.toml` mit: @@ -330,7 +330,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 ### Die Responses testen { #check-the-responses } -Wenn Sie nun zur URL mit dem Port für Uvicorn gehen: http://127.0.0.1:8000/app, sehen Sie die normale Response: +Wenn Sie nun zur URL mit dem Port für Uvicorn gehen: [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app), sehen Sie die normale Response: ```JSON { @@ -345,7 +345,7 @@ Beachten Sie, dass, obwohl Sie unter `http://127.0.0.1:8000/app` darauf zugreife /// -Öffnen Sie nun die URL mit dem Port für Traefik, einschließlich des Pfadpräfixes: http://127.0.0.1:9999/api/v1/app. +Öffnen Sie nun die URL mit dem Port für Traefik, einschließlich des Pfadpräfixes: [http://127.0.0.1:9999/api/v1/app](http://127.0.0.1:9999/api/v1/app). Wir bekommen die gleiche Response: @@ -370,13 +370,13 @@ Jetzt folgt der spaßige Teil. ✨ Der „offizielle“ Weg, auf die Anwendung zuzugreifen, wäre über den Proxy mit dem von uns definierten Pfadpräfix. Wenn Sie also die von Uvicorn direkt bereitgestellte Dokumentationsoberfläche ohne das Pfadpräfix in der URL ausprobieren, wird es erwartungsgemäß nicht funktionieren, da erwartet wird, dass der Zugriff über den Proxy erfolgt. -Sie können das unter http://127.0.0.1:8000/docs sehen: +Sie können das unter [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) sehen: Wenn wir jedoch unter der „offiziellen“ URL, über den Proxy mit Port `9999`, unter `/api/v1/docs`, auf die Dokumentationsoberfläche zugreifen, funktioniert es ordnungsgemäß! 🎉 -Sie können das unter http://127.0.0.1:9999/api/v1/docs testen: +Sie können das unter [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs) testen: @@ -433,7 +433,7 @@ Beachten Sie den automatisch generierten Server mit dem `URL`-Wert `/api/v1`, we /// -In der Dokumentationsoberfläche unter http://127.0.0.1:9999/api/v1/docs würde es so aussehen: +In der Dokumentationsoberfläche unter [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs) würde es so aussehen: @@ -461,6 +461,6 @@ Dann wird er nicht in das OpenAPI-Schema aufgenommen. ## Mounten einer Unteranwendung { #mounting-a-sub-application } -Wenn Sie gleichzeitig eine Unteranwendung mounten (wie beschrieben in [Unteranwendungen – Mounts](sub-applications.md){.internal-link target=_blank}) und einen Proxy mit `root_path` verwenden wollen, können Sie das normal tun, wie Sie es erwarten würden. +Wenn Sie gleichzeitig eine Unteranwendung mounten (wie beschrieben in [Unteranwendungen – Mounts](sub-applications.md)) und einen Proxy mit `root_path` verwenden wollen, können Sie das normal tun, wie Sie es erwarten würden. FastAPI verwendet intern den `root_path` auf intelligente Weise, sodass es einfach funktioniert. ✨ diff --git a/docs/de/docs/advanced/custom-response.md b/docs/de/docs/advanced/custom-response.md index e430509f5a..9a11089ad6 100644 --- a/docs/de/docs/advanced/custom-response.md +++ b/docs/de/docs/advanced/custom-response.md @@ -1,52 +1,36 @@ # Benutzerdefinierte Response – HTML, Stream, Datei, andere { #custom-response-html-stream-file-others } -Standardmäßig gibt **FastAPI** die Responses mittels `JSONResponse` zurück. +Standardmäßig gibt **FastAPI** JSON-Responses zurück. -Sie können dies überschreiben, indem Sie direkt eine `Response` zurückgeben, wie in [Eine Response direkt zurückgeben](response-directly.md){.internal-link target=_blank} gezeigt. +Sie können dies überschreiben, indem Sie direkt eine `Response` zurückgeben, wie in [Eine Response direkt zurückgeben](response-directly.md) gezeigt. -Wenn Sie jedoch direkt eine `Response` (oder eine Unterklasse wie `JSONResponse`) zurückgeben, werden die Daten nicht automatisch konvertiert (selbst wenn Sie ein `response_model` deklariert haben), und die Dokumentation wird nicht automatisch generiert (zum Beispiel wird der spezifische „Medientyp“, der im HTTP-Header `Content-Type` angegeben ist, nicht Teil der generierten OpenAPI). +Wenn Sie jedoch direkt eine `Response` (oder eine Unterklasse wie `JSONResponse`) zurückgeben, werden die Daten nicht automatisch konvertiert (selbst wenn Sie ein `response_model` deklarieren), und die Dokumentation wird nicht automatisch generiert (zum Beispiel einschließlich des spezifischen „Medientyps“ im HTTP-Header `Content-Type` als Teil der generierten OpenAPI). Sie können jedoch auch die `Response`, die Sie verwenden möchten (z. B. jede `Response`-Unterklasse), im *Pfadoperation-Dekorator* mit dem `response_class`-Parameter deklarieren. Der Inhalt, den Sie von Ihrer *Pfadoperation-Funktion* zurückgeben, wird in diese `Response` eingefügt. -Und wenn diese `Response` einen JSON-Medientyp (`application/json`) hat, wie es bei `JSONResponse` und `UJSONResponse` der Fall ist, werden die von Ihnen zurückgegebenen Daten automatisch mit jedem Pydantic `response_model` konvertiert (und gefiltert), das Sie im *Pfadoperation-Dekorator* deklariert haben. - /// note | Hinweis Wenn Sie eine Response-Klasse ohne Medientyp verwenden, erwartet FastAPI, dass Ihre Response keinen Inhalt hat, und dokumentiert daher das Format der Response nicht in deren generierter OpenAPI-Dokumentation. /// -## `ORJSONResponse` verwenden { #use-orjsonresponse } - -Um beispielsweise noch etwas Leistung herauszuholen, können Sie `orjson` installieren und die Response als `ORJSONResponse` setzen. - -Importieren Sie die `Response`-Klasse (Unterklasse), die Sie verwenden möchten, und deklarieren Sie sie im *Pfadoperation-Dekorator*. - -Bei umfangreichen Responses ist die direkte Rückgabe einer `Response` wesentlich schneller als ein Dictionary zurückzugeben. - -Das liegt daran, dass FastAPI standardmäßig jedes enthaltene Element überprüft und sicherstellt, dass es als JSON serialisierbar ist, und zwar unter Verwendung desselben [JSON-kompatiblen Encoders](../tutorial/encoder.md){.internal-link target=_blank}, der im Tutorial erläutert wurde. Dadurch können Sie **beliebige Objekte** zurückgeben, zum Beispiel Datenbankmodelle. - -Wenn Sie jedoch sicher sind, dass der von Ihnen zurückgegebene Inhalt **mit JSON serialisierbar** ist, können Sie ihn direkt an die Response-Klasse übergeben und die zusätzliche Arbeit vermeiden, die FastAPI hätte, indem es Ihren zurückgegebenen Inhalt durch den `jsonable_encoder` leitet, bevor es ihn an die Response-Klasse übergibt. +## JSON-Responses { #json-responses } -{* ../../docs_src/custom_response/tutorial001b_py310.py hl[2,7] *} +Standardmäßig gibt FastAPI JSON-Responses zurück. -/// info | Info - -Der Parameter `response_class` wird auch verwendet, um den „Medientyp“ der Response zu definieren. +Wenn Sie ein [Responsemodell](../tutorial/response-model.md) deklarieren, verwendet FastAPI Pydantic, um die Daten zu JSON zu serialisieren. -In diesem Fall wird der HTTP-Header `Content-Type` auf `application/json` gesetzt. +Wenn Sie kein Responsemodell deklarieren, verwendet FastAPI den `jsonable_encoder`, wie in [JSON-kompatibler Encoder](../tutorial/encoder.md) erklärt, und packt das Ergebnis in eine `JSONResponse`. -Und er wird als solcher in OpenAPI dokumentiert. +Wenn Sie eine `response_class` mit einem JSON-Medientyp (`application/json`) deklarieren, wie es bei `JSONResponse` der Fall ist, werden die von Ihnen zurückgegebenen Daten automatisch mit jedem Pydantic-`response_model` (das Sie im *Pfadoperation-Dekorator* deklariert haben) konvertiert (und gefiltert). Aber die Daten werden nicht mit Pydantic zu JSON-Bytes serialisiert, stattdessen werden sie mit dem `jsonable_encoder` konvertiert und anschließend an die `JSONResponse`-Klasse übergeben, die sie dann mit der Standard-JSON-Bibliothek in Python in Bytes serialisiert. -/// +### JSON-Leistung { #json-performance } -/// tip | Tipp +Kurz gesagt: Wenn Sie die maximale Leistung möchten, verwenden Sie ein [Responsemodell](../tutorial/response-model.md) und deklarieren Sie keine `response_class` im *Pfadoperation-Dekorator*. -Die `ORJSONResponse` ist nur in FastAPI verfügbar, nicht in Starlette. - -/// +{* ../../docs_src/response_model/tutorial001_01_py310.py ln[15:17] hl[16] *} ## HTML-Response { #html-response } @@ -69,7 +53,7 @@ Und er wird als solcher in OpenAPI dokumentiert. ### Eine `Response` zurückgeben { #return-a-response } -Wie in [Eine Response direkt zurückgeben](response-directly.md){.internal-link target=_blank} gezeigt, können Sie die Response auch direkt in Ihrer *Pfadoperation* überschreiben, indem Sie diese zurückgeben. +Wie in [Eine Response direkt zurückgeben](response-directly.md) gezeigt, können Sie die Response auch direkt in Ihrer *Pfadoperation* überschreiben, indem Sie diese zurückgeben. Das gleiche Beispiel von oben, das eine `HTMLResponse` zurückgibt, könnte so aussehen: @@ -134,7 +118,7 @@ Sie akzeptiert die folgenden Parameter: * `headers` – Ein `dict` von Strings. * `media_type` – Ein `str`, der den Medientyp angibt. Z. B. `"text/html"`. -FastAPI (eigentlich Starlette) fügt automatisch einen Content-Length-Header ein. Außerdem wird es einen Content-Type-Header einfügen, der auf dem media_type basiert, und für Texttypen einen Zeichensatz (charset) anfügen. +FastAPI (eigentlich Starlette) fügt automatisch einen Content-Length-Header ein. Außerdem wird es einen Content-Type-Header einfügen, der auf dem `media_type` basiert, und für Texttypen einen Zeichensatz (charset) anfügen. {* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *} @@ -154,37 +138,11 @@ Nimmt einige Daten entgegen und gibt eine `application/json`-codierte Response z Dies ist die Standard-Response, die in **FastAPI** verwendet wird, wie Sie oben gelesen haben. -### `ORJSONResponse` { #orjsonresponse } - -Eine schnelle alternative JSON-Response mit `orjson`, wie Sie oben gelesen haben. - -/// info | Info - -Dazu muss `orjson` installiert werden, z. B. mit `pip install orjson`. - -/// - -### `UJSONResponse` { #ujsonresponse } - -Eine alternative JSON-Response mit `ujson`. - -/// info | Info - -Dazu muss `ujson` installiert werden, z. B. mit `pip install ujson`. - -/// - -/// warning | Achtung - -`ujson` ist bei der Behandlung einiger Sonderfälle weniger sorgfältig als Pythons eingebaute Implementierung. - -/// - -{* ../../docs_src/custom_response/tutorial001_py310.py hl[2,7] *} +/// note | Technische Details -/// tip | Tipp +Wenn Sie jedoch ein Responsemodell oder einen Rückgabetyp deklarieren, wird dieser direkt verwendet, um die Daten zu JSON zu serialisieren, und eine Response mit dem richtigen Medientyp für JSON wird direkt zurückgegeben, ohne die `JSONResponse`-Klasse zu verwenden. -Möglicherweise ist `ORJSONResponse` eine schnellere Alternative. +Dies ist der ideale Weg, um die beste Leistung zu erzielen. /// @@ -214,31 +172,25 @@ Sie können den Parameter `status_code` auch in Kombination mit dem Parameter `r ### `StreamingResponse` { #streamingresponse } -Nimmt einen asynchronen Generator oder einen normalen Generator/Iterator und streamt den Responsebody. - -{* ../../docs_src/custom_response/tutorial007_py310.py hl[2,14] *} - -#### Verwendung von `StreamingResponse` mit dateiartigen Objekten { #using-streamingresponse-with-file-like-objects } +Nimmt einen asynchronen Generator oder einen normalen Generator/Iterator (eine Funktion mit `yield`) und streamt den Responsebody. -Wenn Sie ein dateiartiges (file-like) Objekt haben (z. B. das von `open()` zurückgegebene Objekt), können Sie eine Generatorfunktion erstellen, um über dieses dateiartige Objekt zu iterieren. +{* ../../docs_src/custom_response/tutorial007_py310.py hl[3,16] *} -Auf diese Weise müssen Sie nicht alles zuerst in den Arbeitsspeicher lesen und können diese Generatorfunktion an `StreamingResponse` übergeben und zurückgeben. - -Das umfasst viele Bibliotheken zur Interaktion mit Cloud-Speicher, Videoverarbeitung und anderen. +/// note | Technische Details -{* ../../docs_src/custom_response/tutorial008_py310.py hl[2,10:12,14] *} +Ein `async`-Task kann nur abgebrochen werden, wenn er ein `await` erreicht. Wenn es kein `await` gibt, kann der Generator (Funktion mit `yield`) nicht ordnungsgemäß abgebrochen werden und könnte weiterlaufen, selbst nachdem der Abbruch angefordert wurde. -1. Das ist die Generatorfunktion. Es handelt sich um eine „Generatorfunktion“, da sie `yield`-Anweisungen enthält. -2. Durch die Verwendung eines `with`-Blocks stellen wir sicher, dass das dateiartige Objekt geschlossen wird, nachdem die Generatorfunktion fertig ist. Also, nachdem sie mit dem Senden der Response fertig ist. -3. Dieses `yield from` weist die Funktion an, über das Ding namens `file_like` zu iterieren. Und dann für jeden iterierten Teil, diesen Teil so zurückzugeben, als wenn er aus dieser Generatorfunktion (`iterfile`) stammen würde. +Da dieses kleine Beispiel keine `await`-Anweisungen benötigt, fügen wir ein `await anyio.sleep(0)` hinzu, um dem Event Loop die Chance zu geben, den Abbruch zu verarbeiten. - Es handelt sich also hier um eine Generatorfunktion, die die „generierende“ Arbeit intern auf etwas anderes überträgt. +Dies wäre bei großen oder unendlichen Streams noch wichtiger. - Auf diese Weise können wir das Ganze in einen `with`-Block einfügen und so sicherstellen, dass das dateiartige Objekt nach Abschluss geschlossen wird. +/// /// tip | Tipp -Beachten Sie, dass wir, da wir Standard-`open()` verwenden, welches `async` und `await` nicht unterstützt, hier die Pfadoperation mit normalen `def` deklarieren. +Anstatt eine `StreamingResponse` direkt zurückzugeben, sollten Sie wahrscheinlich dem Stil in [Daten streamen](./stream-data.md) folgen. Das ist wesentlich bequemer und behandelt den Abbruch im Hintergrund für Sie. + +Wenn Sie JSON Lines streamen, folgen Sie dem Tutorial [JSON Lines streamen](../tutorial/stream-json-lines.md). /// @@ -267,7 +219,7 @@ In diesem Fall können Sie den Dateipfad direkt von Ihrer *Pfadoperation*-Funkti Sie können Ihre eigene benutzerdefinierte Response-Klasse erstellen, die von `Response` erbt und diese verwendet. -Nehmen wir zum Beispiel an, dass Sie `orjson` verwenden möchten, aber mit einigen benutzerdefinierten Einstellungen, die in der enthaltenen `ORJSONResponse`-Klasse nicht verwendet werden. +Nehmen wir zum Beispiel an, dass Sie [`orjson`](https://github.com/ijl/orjson) mit einigen Einstellungen verwenden möchten. Sie möchten etwa, dass Ihre Response eingerücktes und formatiertes JSON zurückgibt. Dafür möchten Sie die orjson-Option `orjson.OPT_INDENT_2` verwenden. @@ -275,13 +227,13 @@ Sie könnten eine `CustomORJSONResponse` erstellen. Das Wichtigste, was Sie tun {* ../../docs_src/custom_response/tutorial009c_py310.py hl[9:14,17] *} -Statt: +Anstatt Folgendes zurückzugeben: ```json {"message": "Hello World"} ``` -... wird die Response jetzt Folgendes zurückgeben: +... wird diese Response Folgendes zurückgeben: ```json { @@ -291,13 +243,21 @@ Statt: Natürlich werden Sie wahrscheinlich viel bessere Möglichkeiten finden, Vorteil daraus zu ziehen, als JSON zu formatieren. 😉 +### `orjson` oder Responsemodell { #orjson-or-response-model } + +Wenn es Ihnen um Leistung geht, sind Sie wahrscheinlich mit einem [Responsemodell](../tutorial/response-model.md) besser beraten als mit einer `orjson`-Response. + +Mit einem Responsemodell verwendet FastAPI Pydantic, um die Daten ohne Zwischenschritte zu JSON zu serialisieren, also ohne sie z. B. erst mit `jsonable_encoder` zu konvertieren, was sonst der Fall wäre. + +Und unter der Haube verwendet Pydantic dieselben Rust-Mechanismen wie `orjson`, um nach JSON zu serialisieren. Sie erhalten mit einem Responsemodell also ohnehin die beste Leistung. + ## Standard-Response-Klasse { #default-response-class } Beim Erstellen einer **FastAPI**-Klasseninstanz oder eines `APIRouter`s können Sie angeben, welche Response-Klasse standardmäßig verwendet werden soll. Der Parameter, der das definiert, ist `default_response_class`. -Im folgenden Beispiel verwendet **FastAPI** standardmäßig `ORJSONResponse` in allen *Pfadoperationen*, anstelle von `JSONResponse`. +Im folgenden Beispiel verwendet **FastAPI** standardmäßig `HTMLResponse` in allen *Pfadoperationen*, anstelle von JSON. {* ../../docs_src/custom_response/tutorial010_py310.py hl[2,4] *} @@ -309,4 +269,4 @@ Sie können dennoch weiterhin `response_class` in *Pfadoperationen* überschreib ## Zusätzliche Dokumentation { #additional-documentation } -Sie können auch den Medientyp und viele andere Details in OpenAPI mit `responses` deklarieren: [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}. +Sie können auch den Medientyp und viele andere Details in OpenAPI mit `responses` deklarieren: [Zusätzliche Responses in OpenAPI](additional-responses.md). diff --git a/docs/de/docs/advanced/dataclasses.md b/docs/de/docs/advanced/dataclasses.md index 4223128ce9..743aea6999 100644 --- a/docs/de/docs/advanced/dataclasses.md +++ b/docs/de/docs/advanced/dataclasses.md @@ -2,11 +2,11 @@ FastAPI basiert auf **Pydantic**, und ich habe Ihnen gezeigt, wie Sie Pydantic-Modelle verwenden können, um Requests und Responses zu deklarieren. -Aber FastAPI unterstützt auf die gleiche Weise auch die Verwendung von `dataclasses`: +Aber FastAPI unterstützt auf die gleiche Weise auch die Verwendung von [`dataclasses`](https://docs.python.org/3/library/dataclasses.html): {* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *} -Das ist dank **Pydantic** ebenfalls möglich, da es `dataclasses` intern unterstützt. +Das ist dank **Pydantic** ebenfalls möglich, da es [„`dataclasses` intern unterstützt“](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel). Auch wenn im obigen Code Pydantic nicht explizit vorkommt, verwendet FastAPI Pydantic, um diese Standard-Datenklassen in Pydantics eigene Variante von Datenklassen zu konvertieren. @@ -74,7 +74,7 @@ In diesem Fall können Sie einfach die Standard-`dataclasses` durch `pydantic.da Wie immer können Sie in FastAPI `def` und `async def` beliebig kombinieren. - Wenn Sie eine Auffrischung darüber benötigen, wann welche Anwendung sinnvoll ist, lesen Sie den Abschnitt „In Eile?“ in der Dokumentation zu [`async` und `await`](../async.md#in-a-hurry){.internal-link target=_blank}. + Wenn Sie eine Auffrischung darüber benötigen, wann welche Anwendung sinnvoll ist, lesen Sie den Abschnitt „In Eile?“ in der Dokumentation zu [`async` und `await`](../async.md#in-a-hurry). 9. Diese *Pfadoperation-Funktion* gibt keine Datenklassen zurück (obwohl dies möglich wäre), sondern eine Liste von Dictionarys mit internen Daten. @@ -88,7 +88,7 @@ Weitere Einzelheiten finden Sie in den Bemerkungen im Quellcode oben. Sie können `dataclasses` auch mit anderen Pydantic-Modellen kombinieren, von ihnen erben, sie in Ihre eigenen Modelle einbinden, usw. -Weitere Informationen finden Sie in der Pydantic-Dokumentation zu Datenklassen. +Weitere Informationen finden Sie in der [Pydantic-Dokumentation zu Datenklassen](https://docs.pydantic.dev/latest/concepts/dataclasses/). ## Version { #version } diff --git a/docs/de/docs/advanced/events.md b/docs/de/docs/advanced/events.md index 17d14d71c5..ea04e3ebde 100644 --- a/docs/de/docs/advanced/events.md +++ b/docs/de/docs/advanced/events.md @@ -150,11 +150,11 @@ Aus diesem Grund wird jetzt empfohlen, stattdessen `lifespan` wie oben erläuter Nur ein technisches Detail für die neugierigen Nerds. 🤓 -In der technischen ASGI-Spezifikation ist dies Teil des Lifespan Protokolls und definiert Events namens `startup` und `shutdown`. +In der technischen ASGI-Spezifikation ist dies Teil des [Lifespan Protokolls](https://asgi.readthedocs.io/en/latest/specs/lifespan.html) und definiert Events namens `startup` und `shutdown`. /// info | Info -Weitere Informationen zu Starlettes `lifespan`-Handlern finden Sie in Starlettes Lifespan-Dokumentation. +Weitere Informationen zu Starlettes `lifespan`-Handlern finden Sie in [Starlettes Lifespan-Dokumentation](https://www.starlette.dev/lifespan/). Einschließlich, wie man Lifespan-Zustand handhabt, der in anderen Bereichen Ihres Codes verwendet werden kann. @@ -162,4 +162,4 @@ Einschließlich, wie man Lifespan-Zustand handhabt, der in anderen Bereichen Ihr ## Unteranwendungen { #sub-applications } -🚨 Beachten Sie, dass diese Lifespan-Events (Startup und Shutdown) nur für die Hauptanwendung ausgeführt werden, nicht für [Unteranwendungen – Mounts](sub-applications.md){.internal-link target=_blank}. +🚨 Beachten Sie, dass diese Lifespan-Events (Startup und Shutdown) nur für die Hauptanwendung ausgeführt werden, nicht für [Unteranwendungen – Mounts](sub-applications.md). diff --git a/docs/de/docs/advanced/generate-clients.md b/docs/de/docs/advanced/generate-clients.md index fcb5510029..12ba4072c4 100644 --- a/docs/de/docs/advanced/generate-clients.md +++ b/docs/de/docs/advanced/generate-clients.md @@ -8,11 +8,11 @@ In diesem Leitfaden erfahren Sie, wie Sie ein **TypeScript-SDK** für Ihr FastAP ## Open Source SDK-Generatoren { #open-source-sdk-generators } -Eine vielseitige Möglichkeit ist der OpenAPI Generator, der **viele Programmiersprachen** unterstützt und SDKs aus Ihrer OpenAPI-Spezifikation generieren kann. +Eine vielseitige Möglichkeit ist der [OpenAPI Generator](https://openapi-generator.tech/), der **viele Programmiersprachen** unterstützt und SDKs aus Ihrer OpenAPI-Spezifikation generieren kann. -Für **TypeScript-Clients** ist Hey API eine speziell entwickelte Lösung, die ein optimiertes Erlebnis für das TypeScript-Ökosystem bietet. +Für **TypeScript-Clients** ist [Hey API](https://heyapi.dev/) eine speziell entwickelte Lösung, die ein optimiertes Erlebnis für das TypeScript-Ökosystem bietet. -Weitere SDK-Generatoren finden Sie auf OpenAPI.Tools. +Weitere SDK-Generatoren finden Sie auf [OpenAPI.Tools](https://openapi.tools/#sdk). /// tip | Tipp @@ -24,15 +24,15 @@ FastAPI generiert automatisch **OpenAPI 3.1**-Spezifikationen, daher muss jedes Dieser Abschnitt hebt **venture-unterstützte** und **firmengestützte** Lösungen hervor, die von Unternehmen entwickelt werden, welche FastAPI sponsern. Diese Produkte bieten **zusätzliche Funktionen** und **Integrationen** zusätzlich zu hochwertig generierten SDKs. -Durch das ✨ [**Sponsoring von FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨ helfen diese Unternehmen sicherzustellen, dass das Framework und sein **Ökosystem** gesund und **nachhaltig** bleiben. +Durch das ✨ [**Sponsoring von FastAPI**](../help-fastapi.md#sponsor-the-author) ✨ helfen diese Unternehmen sicherzustellen, dass das Framework und sein **Ökosystem** gesund und **nachhaltig** bleiben. Ihr Sponsoring zeigt auch ein starkes Engagement für die FastAPI-**Community** (Sie), was bedeutet, dass sie nicht nur einen **großartigen Service** bieten möchten, sondern auch ein **robustes und florierendes Framework**, FastAPI, unterstützen möchten. 🙇 Zum Beispiel könnten Sie ausprobieren: -* Speakeasy -* Stainless -* liblab +* [Speakeasy](https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship) +* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) +* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi) Einige dieser Lösungen sind möglicherweise auch Open Source oder bieten kostenlose Tarife an, sodass Sie diese ohne finanzielle Verpflichtung ausprobieren können. Andere kommerzielle SDK-Generatoren sind online verfügbar und können dort gefunden werden. 🤓 @@ -66,7 +66,7 @@ npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client Dies generiert ein TypeScript-SDK in `./src/client`. -Sie können lernen, wie man `@hey-api/openapi-ts` installiert und über die erzeugte Ausgabe auf deren Website lesen. +Sie können lernen, wie man [`@hey-api/openapi-ts` installiert](https://heyapi.dev/openapi-ts/get-started) und über die [erzeugte Ausgabe](https://heyapi.dev/openapi-ts/output) auf deren Website lesen. ### Das SDK verwenden { #using-the-sdk } @@ -96,7 +96,7 @@ Das Response-Objekt hat auch automatische Vervollständigung: In vielen Fällen wird Ihre FastAPI-App größer sein und Sie werden wahrscheinlich Tags verwenden, um verschiedene Gruppen von *Pfadoperationen* zu separieren. -Zum Beispiel könnten Sie einen Abschnitt für **Items (Artikel)** und einen weiteren Abschnitt für **Users (Benutzer)** haben, und diese könnten durch Tags getrennt sein: +Zum Beispiel könnten Sie einen Abschnitt für **Items** und einen weiteren Abschnitt für **Users** haben, und diese könnten durch Tags getrennt sein: {* ../../docs_src/generate_clients/tutorial002_py310.py hl[21,26,34] *} diff --git a/docs/de/docs/advanced/index.md b/docs/de/docs/advanced/index.md index 98fc7bc2fa..3886e963a6 100644 --- a/docs/de/docs/advanced/index.md +++ b/docs/de/docs/advanced/index.md @@ -2,7 +2,7 @@ ## Zusatzfunktionen { #additional-features } -Das Haupt-[Tutorial – Benutzerhandbuch](../tutorial/index.md){.internal-link target=_blank} sollte ausreichen, um Ihnen einen Überblick über alle Hauptfunktionen von **FastAPI** zu geben. +Das Haupt-[Tutorial – Benutzerhandbuch](../tutorial/index.md) sollte ausreichen, um Ihnen einen Überblick über alle Hauptfunktionen von **FastAPI** zu geben. In den nächsten Abschnitten sehen Sie weitere Optionen, Konfigurationen und zusätzliche Funktionen. @@ -16,6 +16,6 @@ Und es ist möglich, dass für Ihren Anwendungsfall die Lösung in einem davon l ## Das Tutorial zuerst lesen { #read-the-tutorial-first } -Sie können immer noch die meisten Funktionen in **FastAPI** mit den Kenntnissen aus dem Haupt-[Tutorial – Benutzerhandbuch](../tutorial/index.md){.internal-link target=_blank} nutzen. +Sie können immer noch die meisten Funktionen in **FastAPI** mit den Kenntnissen aus dem Haupt-[Tutorial – Benutzerhandbuch](../tutorial/index.md) nutzen. Und die nächsten Abschnitte setzen voraus, dass Sie es bereits gelesen haben und dass Sie diese Hauptideen kennen. diff --git a/docs/de/docs/advanced/json-base64-bytes.md b/docs/de/docs/advanced/json-base64-bytes.md new file mode 100644 index 0000000000..26c7e70892 --- /dev/null +++ b/docs/de/docs/advanced/json-base64-bytes.md @@ -0,0 +1,63 @@ +# JSON mit Bytes als base64 { #json-with-bytes-as-base64 } + +Wenn Ihre App JSON-Daten empfangen und senden muss, Sie darin aber Binärdaten einschließen müssen, können Sie diese als base64 kodieren. + +## Base64 vs Dateien { #base64-vs-files } + +Prüfen Sie zunächst, ob Sie [Request Files](../tutorial/request-files.md) zum Hochladen von Binärdaten und [Benutzerdefinierte Response – FileResponse](./custom-response.md#fileresponse--fileresponse-) zum Senden von Binärdaten verwenden können, anstatt sie in JSON zu kodieren. + +JSON kann nur UTF-8-kodierte Strings enthalten, es kann daher keine rohen Bytes enthalten. + +Base64 kann Binärdaten in Strings kodieren, dafür werden jedoch mehr Zeichen benötigt als in den ursprünglichen Binärdaten; es ist daher in der Regel weniger effizient als der Umgang mit normalen Dateien. + +Verwenden Sie base64 nur, wenn Sie Binärdaten unbedingt in JSON einbetten müssen und dafür keine Dateien verwenden können. + +## Pydantic `bytes` { #pydantic-bytes } + +Sie können ein Pydantic-Modell mit `bytes`-Feldern deklarieren und dann in der Modellkonfiguration `val_json_bytes` verwenden, um anzugeben, dass zur *Validierung* von eingehenden JSON-Daten base64 genutzt werden soll; im Rahmen dieser Validierung wird der base64-String in Bytes dekodiert. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *} + +Wenn Sie die `/docs` aufrufen, zeigt die Dokumentation, dass das Feld `data` base64-kodierte Bytes erwartet: + +
+ +
+ +Sie könnten einen Request wie folgt senden: + +```json +{ + "description": "Some data", + "data": "aGVsbG8=" +} +``` + +/// tip | Tipp + +`aGVsbG8=` ist die base64-Kodierung von `hello`. + +/// + +Anschließend dekodiert Pydantic den base64-String und stellt Ihnen die ursprünglichen Bytes im Feld `data` des Modells bereit. + +Sie erhalten eine Response wie: + +```json +{ + "description": "Some data", + "content": "hello" +} +``` + +## Pydantic `bytes` für Ausgabedaten { #pydantic-bytes-for-output-data } + +Sie können in der Modellkonfiguration für Ausgabedaten auch `bytes`-Felder mit `ser_json_bytes` verwenden; Pydantic wird die Bytes bei der Erzeugung der JSON-Response als base64 *serialisieren*. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *} + +## Pydantic `bytes` für Eingabe- und Ausgabedaten { #pydantic-bytes-for-input-and-output-data } + +Und selbstverständlich können Sie dasselbe Modell so konfigurieren, dass base64 sowohl für Eingaben (*validieren*) mit `val_json_bytes` als auch für Ausgaben (*serialisieren*) mit `ser_json_bytes` verwendet wird, wenn JSON-Daten empfangen und gesendet werden. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *} diff --git a/docs/de/docs/advanced/middleware.md b/docs/de/docs/advanced/middleware.md index 4af583b5b1..90a4e4ff28 100644 --- a/docs/de/docs/advanced/middleware.md +++ b/docs/de/docs/advanced/middleware.md @@ -1,8 +1,8 @@ # Fortgeschrittene Middleware { #advanced-middleware } -Im Haupttutorial haben Sie gelesen, wie Sie Ihrer Anwendung [benutzerdefinierte Middleware](../tutorial/middleware.md){.internal-link target=_blank} hinzufügen können. +Im Haupttutorial haben Sie gelesen, wie Sie Ihrer Anwendung [benutzerdefinierte Middleware](../tutorial/middleware.md) hinzufügen können. -Und dann auch, wie man [CORS mittels der `CORSMiddleware`](../tutorial/cors.md){.internal-link target=_blank} handhabt. +Und dann auch, wie man [CORS mittels der `CORSMiddleware`](../tutorial/cors.md) handhabt. In diesem Abschnitt werden wir sehen, wie man andere Middlewares verwendet. @@ -91,7 +91,7 @@ Es gibt viele andere ASGI-Middlewares. Zum Beispiel: -* Uvicorns `ProxyHeadersMiddleware` -* MessagePack +* [Uvicorns `ProxyHeadersMiddleware`](https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py) +* [MessagePack](https://github.com/florimondmanca/msgpack-asgi) -Um mehr über weitere verfügbare Middlewares herauszufinden, besuchen Sie Starlettes Middleware-Dokumentation und die ASGI Awesome List. +Um mehr über weitere verfügbare Middlewares herauszufinden, besuchen Sie [Starlettes Middleware-Dokumentation](https://www.starlette.dev/middleware/) und die [ASGI Awesome List](https://github.com/florimondmanca/awesome-asgi). diff --git a/docs/de/docs/advanced/openapi-callbacks.md b/docs/de/docs/advanced/openapi-callbacks.md index fd68ab8dca..0d2471489a 100644 --- a/docs/de/docs/advanced/openapi-callbacks.md +++ b/docs/de/docs/advanced/openapi-callbacks.md @@ -35,7 +35,7 @@ Dieser Teil ist ziemlich normal, der größte Teil des Codes ist Ihnen wahrschei /// tip | Tipp -Der Query-Parameter `callback_url` verwendet einen Pydantic-Url-Typ. +Der Query-Parameter `callback_url` verwendet einen Pydantic-[Url](https://docs.pydantic.dev/latest/api/networks/)-Typ. /// @@ -54,7 +54,7 @@ callback_url = "https://example.com/api/v1/invoices/events/" httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) ``` -Der möglicherweise wichtigste Teil des Callbacks besteht jedoch darin, sicherzustellen, dass Ihr API-Benutzer (der externe Entwickler) die *externe API* gemäß den Daten, die *Ihre API* im Requestbody des Callbacks senden wird, korrekt implementiert, usw. +Der möglicherweise wichtigste Teil des Callbacks besteht jedoch darin, sicherzustellen, dass Ihr API-Benutzer (der externe Entwickler) die *externe API* korrekt implementiert, gemäß den Daten, die *Ihre API* im Requestbody des Callbacks senden wird, usw. Als Nächstes fügen wir den Code hinzu, um zu dokumentieren, wie diese *externe API* aussehen sollte, um den Callback von *Ihrer API* zu empfangen. @@ -66,7 +66,7 @@ In diesem Beispiel wird nicht der Callback selbst implementiert (das könnte nur Der eigentliche Callback ist nur ein HTTP-Request. -Wenn Sie den Callback selbst implementieren, können Sie beispielsweise HTTPX oder Requests verwenden. +Wenn Sie den Callback selbst implementieren, können Sie beispielsweise [HTTPX](https://www.python-httpx.org) oder [Requests](https://requests.readthedocs.io/) verwenden. /// @@ -106,11 +106,11 @@ Sie sollte wie eine normale FastAPI-*Pfadoperation* aussehen: Es gibt zwei Hauptunterschiede zu einer normalen *Pfadoperation*: * Es muss kein tatsächlicher Code vorhanden sein, da Ihre Anwendung diesen Code niemals aufruft. Sie wird nur zur Dokumentation der *externen API* verwendet. Die Funktion könnte also einfach `pass` enthalten. -* Der *Pfad* kann einen OpenAPI-3-Ausdruck enthalten (mehr dazu weiter unten), wo er Variablen mit Parametern und Teilen des ursprünglichen Requests verwenden kann, der an *Ihre API* gesendet wurde. +* Der *Pfad* kann einen [OpenAPI-3-Ausdruck](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) enthalten (mehr dazu weiter unten), wo er Variablen mit Parametern und Teilen des ursprünglichen Requests verwenden kann, der an *Ihre API* gesendet wurde. ### Der Callback-Pfadausdruck { #the-callback-path-expression } -Der Callback-*Pfad* kann einen OpenAPI-3-Ausdruck enthalten, welcher Teile des ursprünglichen Requests enthalten kann, der an *Ihre API* gesendet wurde. +Der Callback-*Pfad* kann einen [OpenAPI-3-Ausdruck](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) enthalten, welcher Teile des ursprünglichen Requests enthalten kann, der an *Ihre API* gesendet wurde. In diesem Fall ist es der `str`: @@ -179,7 +179,7 @@ Beachten Sie, dass Sie nicht den Router selbst (`invoices_callback_router`) an ` ### Es in der Dokumentation testen { #check-the-docs } -Jetzt können Sie Ihre Anwendung starten und auf http://127.0.0.1:8000/docs gehen. +Jetzt können Sie Ihre Anwendung starten und auf [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) gehen. Sie sehen Ihre Dokumentation, einschließlich eines Abschnitts „Callbacks“ für Ihre *Pfadoperation*, der zeigt, wie die *externe API* aussehen sollte: diff --git a/docs/de/docs/advanced/openapi-webhooks.md b/docs/de/docs/advanced/openapi-webhooks.md index 915b216000..e6984de74f 100644 --- a/docs/de/docs/advanced/openapi-webhooks.md +++ b/docs/de/docs/advanced/openapi-webhooks.md @@ -48,7 +48,7 @@ Das liegt daran, dass erwartet wird, dass **Ihre Benutzer** den tatsächlichen * ### Die Dokumentation testen { #check-the-docs } -Jetzt können Sie Ihre App starten und auf http://127.0.0.1:8000/docs gehen. +Jetzt können Sie Ihre App starten und auf [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) gehen. Sie werden sehen, dass Ihre Dokumentation die normalen *Pfadoperationen* und jetzt auch einige **Webhooks** enthält: diff --git a/docs/de/docs/advanced/path-operation-advanced-configuration.md b/docs/de/docs/advanced/path-operation-advanced-configuration.md index a2dd212a1a..e6ff498eb9 100644 --- a/docs/de/docs/advanced/path-operation-advanced-configuration.md +++ b/docs/de/docs/advanced/path-operation-advanced-configuration.md @@ -60,7 +60,7 @@ Das definiert die Metadaten der Haupt-Operationsobjekt genannt. +In der OpenAPI-Spezifikation wird es das [Operationsobjekt](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operation-object) genannt. /// @@ -82,7 +82,7 @@ Dieses *Pfadoperation*-spezifische OpenAPI-Schema wird normalerweise automatisch Dies ist ein Low-Level-Erweiterungspunkt. -Wenn Sie nur zusätzliche Responses deklarieren müssen, können Sie dies bequemer mit [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank} tun. +Wenn Sie nur zusätzliche Responses deklarieren müssen, können Sie dies bequemer mit [Zusätzliche Responses in OpenAPI](additional-responses.md) tun. /// diff --git a/docs/de/docs/advanced/response-change-status-code.md b/docs/de/docs/advanced/response-change-status-code.md index 26308b8239..a0d90fe80d 100644 --- a/docs/de/docs/advanced/response-change-status-code.md +++ b/docs/de/docs/advanced/response-change-status-code.md @@ -1,6 +1,6 @@ # Response – Statuscode ändern { #response-change-status-code } -Sie haben wahrscheinlich schon vorher gelesen, dass Sie einen Default-[Response-Statuscode](../tutorial/response-status-code.md){.internal-link target=_blank} festlegen können. +Sie haben wahrscheinlich schon vorher gelesen, dass Sie einen Default-[Response-Statuscode](../tutorial/response-status-code.md) festlegen können. In manchen Fällen müssen Sie jedoch einen anderen als den Default-Statuscode zurückgeben. diff --git a/docs/de/docs/advanced/response-cookies.md b/docs/de/docs/advanced/response-cookies.md index bf6c40e61b..672bbbe78e 100644 --- a/docs/de/docs/advanced/response-cookies.md +++ b/docs/de/docs/advanced/response-cookies.md @@ -20,7 +20,7 @@ Sie können den `Response`-Parameter auch in Abhängigkeiten deklarieren und dar Sie können Cookies auch erstellen, wenn Sie eine `Response` direkt in Ihrem Code zurückgeben. -Dazu können Sie eine Response erstellen, wie unter [Eine Response direkt zurückgeben](response-directly.md){.internal-link target=_blank} beschrieben. +Dazu können Sie eine Response erstellen, wie unter [Eine Response direkt zurückgeben](response-directly.md) beschrieben. Setzen Sie dann Cookies darin und geben Sie sie dann zurück: @@ -48,4 +48,4 @@ Und da die `Response` häufig zum Setzen von Headern und Cookies verwendet wird, /// -Um alle verfügbaren Parameter und Optionen anzuzeigen, sehen Sie sich deren Dokumentation in Starlette an. +Um alle verfügbaren Parameter und Optionen anzuzeigen, sehen Sie sich deren [Dokumentation in Starlette](https://www.starlette.dev/responses/#set-cookie) an. diff --git a/docs/de/docs/advanced/response-directly.md b/docs/de/docs/advanced/response-directly.md index 06bea4794d..4235e8db0b 100644 --- a/docs/de/docs/advanced/response-directly.md +++ b/docs/de/docs/advanced/response-directly.md @@ -2,19 +2,23 @@ Wenn Sie eine **FastAPI** *Pfadoperation* erstellen, können Sie normalerweise beliebige Daten davon zurückgeben: ein `dict`, eine `list`, ein Pydantic-Modell, ein Datenbankmodell, usw. -Standardmäßig konvertiert **FastAPI** diesen Rückgabewert automatisch nach JSON, mithilfe des `jsonable_encoder`, der in [JSON-kompatibler Encoder](../tutorial/encoder.md){.internal-link target=_blank} erläutert wird. +Wenn Sie ein [Responsemodell](../tutorial/response-model.md) deklarieren, wird FastAPI es verwenden, um die Daten mithilfe von Pydantic nach JSON zu serialisieren. -Dann würde es hinter den Kulissen diese JSON-kompatiblen Daten (z. B. ein `dict`) in eine `JSONResponse` einfügen, die zum Senden der Response an den Client verwendet wird. +Wenn Sie kein Responsemodell deklarieren, verwendet FastAPI den `jsonable_encoder`, wie in [JSON-kompatibler Encoder](../tutorial/encoder.md) erläutert, und packt die Daten in eine `JSONResponse`. -Sie können jedoch direkt eine `JSONResponse` von Ihren *Pfadoperationen* zurückgeben. +Sie könnten auch direkt eine `JSONResponse` erstellen und zurückgeben. -Das kann beispielsweise nützlich sein, um benutzerdefinierte Header oder Cookies zurückzugeben. +/// tip | Tipp + +Normalerweise erzielen Sie eine deutlich bessere Leistung, wenn Sie ein [Responsemodell](../tutorial/response-model.md) verwenden, als wenn Sie direkt eine `JSONResponse` zurückgeben, da die Serialisierung der Daten dabei mit Pydantic in Rust erfolgt. + +/// ## Eine `Response` zurückgeben { #return-a-response } Tatsächlich können Sie jede `Response` oder jede Unterklasse davon zurückgeben. -/// tip | Tipp +/// info | Info `JSONResponse` selbst ist eine Unterklasse von `Response`. @@ -26,6 +30,8 @@ Es wird keine Datenkonvertierung mit Pydantic-Modellen durchführen, es wird den Dadurch haben Sie viel Flexibilität. Sie können jeden Datentyp zurückgeben, jede Datendeklaration oder -validierung überschreiben, usw. +Das bringt Ihnen aber auch viel Verantwortung. Sie müssen sicherstellen, dass die von Ihnen zurückgegebenen Daten korrekt sind, das richtige Format haben, serialisierbar sind, usw. + ## Verwendung des `jsonable_encoder` in einer `Response` { #using-the-jsonable-encoder-in-a-response } Da **FastAPI** keine Änderungen an einer von Ihnen zurückgegebenen `Response` vornimmt, müssen Sie sicherstellen, dass deren Inhalt dafür bereit ist. @@ -50,16 +56,28 @@ Das obige Beispiel zeigt alle Teile, die Sie benötigen, ist aber noch nicht seh Sehen wir uns nun an, wie Sie damit eine benutzerdefinierte Response zurückgeben können. -Nehmen wir an, Sie möchten eine XML-Response zurückgeben. +Nehmen wir an, Sie möchten eine [XML](https://en.wikipedia.org/wiki/XML)-Response zurückgeben. Sie könnten Ihren XML-Inhalt als String in eine `Response` einfügen und sie zurückgeben: {* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *} +## Funktionsweise eines Responsemodells { #how-a-response-model-works } + +Wenn Sie in einer Pfadoperation ein [Responsemodell - Rückgabetyp](../tutorial/response-model.md) deklarieren, wird **FastAPI** es verwenden, um die Daten mithilfe von Pydantic nach JSON zu serialisieren. + +{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *} + +Da dies auf der Rust-Seite geschieht, ist die Leistung deutlich besser, als wenn es mit normalem Python und der Klasse `JSONResponse` erfolgen würde. + +Wenn Sie ein `response_model` oder einen Rückgabetyp verwenden, nutzt FastAPI weder den `jsonable_encoder` (was langsamer wäre) zur Konvertierung der Daten noch die Klasse `JSONResponse`. + +Stattdessen nimmt es die von Pydantic mithilfe des Responsemodells (oder Rückgabetyps) generierten JSON-Bytes und gibt direkt eine `Response` mit dem richtigen Mediatyp für JSON (`application/json`) zurück. + ## Anmerkungen { #notes } Wenn Sie eine `Response` direkt zurücksenden, werden deren Daten weder validiert, konvertiert (serialisiert), noch automatisch dokumentiert. -Sie können sie aber trotzdem wie unter [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank} beschrieben dokumentieren. +Sie können sie aber trotzdem wie unter [Zusätzliche Responses in OpenAPI](additional-responses.md) beschrieben dokumentieren. In späteren Abschnitten erfahren Sie, wie Sie diese benutzerdefinierten `Response`s verwenden/deklarieren und gleichzeitig über automatische Datenkonvertierung, Dokumentation, usw. verfügen. diff --git a/docs/de/docs/advanced/response-headers.md b/docs/de/docs/advanced/response-headers.md index dc30a7c347..bcec04be8b 100644 --- a/docs/de/docs/advanced/response-headers.md +++ b/docs/de/docs/advanced/response-headers.md @@ -20,7 +20,7 @@ Sie können den Parameter `Response` auch in Abhängigkeiten deklarieren und dar Sie können auch Header hinzufügen, wenn Sie eine `Response` direkt zurückgeben. -Erstellen Sie eine Response wie in [Eine Response direkt zurückgeben](response-directly.md){.internal-link target=_blank} beschrieben und übergeben Sie die Header als zusätzlichen Parameter: +Erstellen Sie eine Response wie in [Eine Response direkt zurückgeben](response-directly.md) beschrieben und übergeben Sie die Header als zusätzlichen Parameter: {* ../../docs_src/response_headers/tutorial001_py310.py hl[10:12] *} @@ -36,6 +36,6 @@ Und da die `Response` häufig zum Setzen von Headern und Cookies verwendet wird, ## Benutzerdefinierte Header { #custom-headers } -Beachten Sie, dass benutzerdefinierte proprietäre Header mittels des Präfix `X-` hinzugefügt werden können. +Beachten Sie, dass benutzerdefinierte proprietäre Header [mit dem Präfix `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers) hinzugefügt werden können. -Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen können soll, müssen Sie diese zu Ihrer CORS-Konfiguration hinzufügen (weitere Informationen finden Sie unter [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank}), unter Verwendung des Parameters `expose_headers`, dokumentiert in Starlettes CORS-Dokumentation. +Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen können soll, müssen Sie diese zu Ihrer CORS-Konfiguration hinzufügen (weitere Informationen finden Sie unter [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md)), unter Verwendung des Parameters `expose_headers`, dokumentiert in [Starlettes CORS-Dokumentation](https://www.starlette.dev/middleware/#corsmiddleware). diff --git a/docs/de/docs/advanced/security/http-basic-auth.md b/docs/de/docs/advanced/security/http-basic-auth.md index 2f66587b19..2b4baba309 100644 --- a/docs/de/docs/advanced/security/http-basic-auth.md +++ b/docs/de/docs/advanced/security/http-basic-auth.md @@ -32,7 +32,7 @@ Hier ist ein vollständigeres Beispiel. Verwenden Sie eine Abhängigkeit, um zu überprüfen, ob Benutzername und Passwort korrekt sind. -Verwenden Sie dazu das Python-Standardmodul `secrets`, um den Benutzernamen und das Passwort zu überprüfen. +Verwenden Sie dazu das Python-Standardmodul [`secrets`](https://docs.python.org/3/library/secrets.html), um den Benutzernamen und das Passwort zu überprüfen. `secrets.compare_digest()` benötigt `bytes` oder einen `str`, welcher nur ASCII-Zeichen (solche der englischen Sprache) enthalten darf, das bedeutet, dass es nicht mit Zeichen wie `á`, wie in `Sebastián`, funktionieren würde. diff --git a/docs/de/docs/advanced/security/index.md b/docs/de/docs/advanced/security/index.md index d7e6332314..9884f2c1b7 100644 --- a/docs/de/docs/advanced/security/index.md +++ b/docs/de/docs/advanced/security/index.md @@ -2,7 +2,7 @@ ## Zusatzfunktionen { #additional-features } -Neben den in [Tutorial – Benutzerhandbuch: Sicherheit](../../tutorial/security/index.md){.internal-link target=_blank} behandelten Funktionen gibt es noch einige zusätzliche Funktionen zur Handhabung der Sicherheit. +Neben den in [Tutorial – Benutzerhandbuch: Sicherheit](../../tutorial/security/index.md) behandelten Funktionen gibt es noch einige zusätzliche Funktionen zur Handhabung der Sicherheit. /// tip | Tipp @@ -14,6 +14,6 @@ Und es ist möglich, dass für Ihren Anwendungsfall die Lösung in einem davon l ## Das Tutorial zuerst lesen { #read-the-tutorial-first } -Die nächsten Abschnitte setzen voraus, dass Sie das Haupt-[Tutorial – Benutzerhandbuch: Sicherheit](../../tutorial/security/index.md){.internal-link target=_blank} bereits gelesen haben. +Die nächsten Abschnitte setzen voraus, dass Sie das Haupt-[Tutorial – Benutzerhandbuch: Sicherheit](../../tutorial/security/index.md) bereits gelesen haben. Sie basieren alle auf den gleichen Konzepten, ermöglichen jedoch einige zusätzliche Funktionalitäten. diff --git a/docs/de/docs/advanced/security/oauth2-scopes.md b/docs/de/docs/advanced/security/oauth2-scopes.md index b96715d5a4..a903fbeb96 100644 --- a/docs/de/docs/advanced/security/oauth2-scopes.md +++ b/docs/de/docs/advanced/security/oauth2-scopes.md @@ -60,7 +60,7 @@ Für OAuth2 sind es einfach nur Strings. ## Gesamtübersicht { #global-view } -Sehen wir uns zunächst kurz die Teile an, die sich gegenüber den Beispielen im Haupt-**Tutorial – Benutzerhandbuch** für [OAuth2 mit Password (und Hashing), Bearer mit JWT-Tokens](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank} ändern. Diesmal verwenden wir OAuth2-Scopes: +Sehen wir uns zunächst kurz die Teile an, die sich gegenüber den Beispielen im Haupt-**Tutorial – Benutzerhandbuch** für [OAuth2 mit Password (und Hashing), Bearer mit JWT-Tokens](../../tutorial/security/oauth2-jwt.md) ändern. Diesmal verwenden wir OAuth2-Scopes: {* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *} @@ -271,4 +271,4 @@ Aber am Ende implementieren sie denselben OAuth2-Standard. ## `Security` in Dekorator-`dependencies` { #security-in-decorator-dependencies } -Auf die gleiche Weise können Sie eine `list`e von `Depends` im Parameter `dependencies` des Dekorators definieren (wie in [Abhängigkeiten in Pfadoperation-Dekoratoren](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank} erläutert), Sie könnten auch dort `Security` mit `scopes` verwenden. +Auf die gleiche Weise können Sie eine `list`e von `Depends` im Parameter `dependencies` des Dekorators definieren (wie in [Abhängigkeiten in Pfadoperation-Dekoratoren](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md) erläutert), Sie könnten auch dort `Security` mit `scopes` verwenden. diff --git a/docs/de/docs/advanced/settings.md b/docs/de/docs/advanced/settings.md index f83e635a78..1df74802b3 100644 --- a/docs/de/docs/advanced/settings.md +++ b/docs/de/docs/advanced/settings.md @@ -8,7 +8,7 @@ Aus diesem Grund werden diese üblicherweise in Umgebungsvariablen bereitgestell /// tip | Tipp -Um Umgebungsvariablen zu verstehen, können Sie [Umgebungsvariablen](../environment-variables.md){.internal-link target=_blank} lesen. +Um Umgebungsvariablen zu verstehen, können Sie [Umgebungsvariablen](../environment-variables.md) lesen. /// @@ -20,11 +20,11 @@ Das bedeutet, dass jeder in Python aus einer Umgebungsvariablen gelesene Wert ei ## Pydantic `Settings` { #pydantic-settings } -Glücklicherweise bietet Pydantic ein großartiges Werkzeug zur Verarbeitung dieser Einstellungen, die von Umgebungsvariablen stammen, mit Pydantic: Settings Management. +Glücklicherweise bietet Pydantic ein großartiges Werkzeug zur Verarbeitung dieser Einstellungen, die von Umgebungsvariablen stammen, mit [Pydantic: Settings Management](https://docs.pydantic.dev/latest/concepts/pydantic_settings/). ### `pydantic-settings` installieren { #install-pydantic-settings } -Stellen Sie zunächst sicher, dass Sie Ihre [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellt und aktiviert haben, und installieren Sie dann das Package `pydantic-settings`: +Stellen Sie zunächst sicher, dass Sie Ihre [virtuelle Umgebung](../virtual-environments.md) erstellt und aktiviert haben, und installieren Sie dann das Package `pydantic-settings`:
@@ -92,15 +92,15 @@ Um mehrere Umgebungsvariablen für einen einzelnen Befehl festzulegen, trennen S /// -Und dann würde die Einstellung `admin_email` auf `"deadpool@example.com"` gesetzt. +Und dann würde die Einstellung `admin_email` auf „deadpool@example.com“ gesetzt. -Der `app_name` wäre `"ChimichangApp"`. +Der `app_name` wäre „ChimichangApp“. Und `items_per_user` würde seinen Defaultwert von `50` behalten. ## Einstellungen in einem anderen Modul { #settings-in-another-module } -Sie könnten diese Einstellungen in eine andere Moduldatei einfügen, wie Sie in [Größere Anwendungen – mehrere Dateien](../tutorial/bigger-applications.md){.internal-link target=_blank} gesehen haben. +Sie könnten diese Einstellungen in eine andere Moduldatei einfügen, wie Sie in [Größere Anwendungen – mehrere Dateien](../tutorial/bigger-applications.md) gesehen haben. Sie könnten beispielsweise eine Datei `config.py` haben mit: @@ -112,7 +112,7 @@ Und dann verwenden Sie diese in einer Datei `main.py`: /// tip | Tipp -Sie benötigen außerdem eine Datei `__init__.py`, wie in [Größere Anwendungen – mehrere Dateien](../tutorial/bigger-applications.md){.internal-link target=_blank} gesehen. +Sie benötigen außerdem eine Datei `__init__.py`, wie in [Größere Anwendungen – mehrere Dateien](../tutorial/bigger-applications.md) gesehen. /// @@ -172,7 +172,7 @@ Aber eine dotenv-Datei muss nicht unbedingt genau diesen Dateinamen haben. /// -Pydantic unterstützt das Lesen dieser Dateitypen mithilfe einer externen Bibliothek. Weitere Informationen finden Sie unter Pydantic Settings: Dotenv (.env) support. +Pydantic unterstützt das Lesen dieser Dateitypen mithilfe einer externen Bibliothek. Weitere Informationen finden Sie unter [Pydantic Settings: Dotenv (.env) support](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support). /// tip | Tipp @@ -197,7 +197,7 @@ Und dann aktualisieren Sie Ihre `config.py` mit: /// tip | Tipp -Das Attribut `model_config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter Pydantic: Concepts: Configuration. +Das Attribut `model_config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter [Pydantic: Concepts: Configuration](https://docs.pydantic.dev/latest/concepts/config/). /// @@ -291,7 +291,7 @@ Im Fall unserer Abhängigkeit `get_settings()` akzeptiert die Funktion nicht ein Auf diese Weise verhält es sich fast so, als wäre es nur eine globale Variable. Da es jedoch eine Abhängigkeitsfunktion verwendet, können wir diese zu Testzwecken problemlos überschreiben. -`@lru_cache` ist Teil von `functools`, welches Teil von Pythons Standardbibliothek ist. Weitere Informationen dazu finden Sie in der Python Dokumentation für `@lru_cache`. +`@lru_cache` ist Teil von `functools`, welches Teil von Pythons Standardbibliothek ist. Weitere Informationen dazu finden Sie in der [Python Dokumentation für `@lru_cache`](https://docs.python.org/3/library/functools.html#functools.lru_cache). ## Zusammenfassung { #recap } diff --git a/docs/de/docs/advanced/stream-data.md b/docs/de/docs/advanced/stream-data.md new file mode 100644 index 0000000000..7cff1d47e6 --- /dev/null +++ b/docs/de/docs/advanced/stream-data.md @@ -0,0 +1,117 @@ +# Daten streamen { #stream-data } + +Wenn Sie Daten streamen möchten, die als JSON strukturiert werden können, sollten Sie [JSON Lines streamen](../tutorial/stream-json-lines.md). + +Wenn Sie jedoch **reine Binärdaten** oder Strings streamen möchten, so können Sie es machen. + +/// info | Info + +Hinzugefügt in FastAPI 0.134.0. + +/// + +## Anwendungsfälle { #use-cases } + +Sie könnten dies verwenden, wenn Sie reine Strings streamen möchten, z. B. direkt aus der Ausgabe eines **AI-LLM**-Dienstes. + +Sie könnten es auch nutzen, um **große Binärdateien** zu streamen, wobei Sie jeden Datenchunk beim Lesen streamen, ohne alles auf einmal in den Speicher laden zu müssen. + +Sie könnten auf diese Weise auch **Video** oder **Audio** streamen, es könnte sogar beim Verarbeiten erzeugt und gesendet werden. + +## Eine `StreamingResponse` mit `yield` { #a-streamingresponse-with-yield } + +Wenn Sie in Ihrer Pfadoperation-Funktion ein `response_class=StreamingResponse` deklarieren, können Sie `yield` verwenden, um nacheinander jeden Datenchunk zu senden. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *} + +FastAPI übergibt jeden Datenchunk unverändert an die `StreamingResponse`, es wird nicht versucht, ihn in JSON oder etwas Ähnliches zu konvertieren. + +### Nicht-async-Pfadoperation-Funktionen { #non-async-path-operation-functions } + +Sie können auch reguläre `def`-Funktionen (ohne `async`) verwenden und `yield` auf die gleiche Weise einsetzen. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[26:29] hl[27] *} + +### Keine Annotation { #no-annotation } + +Sie müssen den Rückgabetyp für das Streamen von Binärdaten nicht wirklich annotieren. + +Da FastAPI die Daten nicht mit Pydantic in JSON umzuwandeln oder sie anderweitig zu serialisieren versucht, ist die Typannotation hier nur für Ihren Editor und Tools relevant, sie wird von FastAPI nicht verwendet. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} + +Das bedeutet auch, dass Sie mit `StreamingResponse` die **Freiheit** und **Verantwortung** haben, die Datenbytes genau so zu erzeugen und zu encodieren, wie sie gesendet werden sollen, unabhängig von den Typannotationen. 🤓 + +### Bytes streamen { #stream-bytes } + +Einer der Hauptanwendungsfälle wäre, `bytes` statt Strings zu streamen, das können Sie selbstverständlich tun. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[44:47] hl[47] *} + +## Eine benutzerdefinierte `PNGStreamingResponse` { #a-custom-pngstreamingresponse } + +In den obigen Beispielen wurden die Datenbytes gestreamt, aber die Response hatte keinen `Content-Type`-Header, sodass der Client nicht wusste, welchen Datentyp er erhielt. + +Sie können eine benutzerdefinierte Unterklasse von `StreamingResponse` erstellen, die den `Content-Type`-Header auf den Typ der gestreamten Daten setzt. + +Zum Beispiel können Sie eine `PNGStreamingResponse` erstellen, die den `Content-Type`-Header mit dem Attribut `media_type` auf `image/png` setzt: + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *} + +Dann können Sie diese neue Klasse mit `response_class=PNGStreamingResponse` in Ihrer Pfadoperation-Funktion verwenden: + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *} + +### Eine Datei simulieren { #simulate-a-file } + +In diesem Beispiel simulieren wir eine Datei mit `io.BytesIO`, einem dateiähnlichen Objekt, das nur im Speicher lebt, uns aber dieselbe Schnittstelle nutzen lässt. + +Wir können z. B. darüber iterieren, um seinen Inhalt zu konsumieren, so wie bei einer Datei. + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[1:27] hl[3,12:13,25] *} + +/// note | Technische Details + +Die anderen beiden Variablen, `image_base64` und `binary_image`, sind ein in Base64 encodiertes Bild, dann in Bytes konvertiert, um es anschließend an `io.BytesIO` zu übergeben. + +Nur damit es in derselben Datei leben kann, für dieses Beispiel, und Sie es unverändert kopieren und ausführen können. 🥚 + +/// + +Mit einem `with`-Block stellen wir sicher, dass das dateiähnliche Objekt geschlossen wird, nachdem die Generatorfunktion (die Funktion mit `yield`) fertig ist. Also nachdem die Response gesendet wurde. + +In diesem speziellen Beispiel wäre das nicht so wichtig, weil es sich um eine unechte In-Memory-Datei (mit `io.BytesIO`) handelt, aber bei einer echten Datei wäre es wichtig sicherzustellen, dass die Datei nach der Arbeit damit geschlossen wird. + +### Dateien und Async { #files-and-async } + +In den meisten Fällen sind dateiähnliche Objekte standardmäßig nicht mit async und await kompatibel. + +Beispielsweise haben sie kein `await file.read()` oder `async for chunk in file`. + +Und in vielen Fällen wäre das Lesen eine blockierende Operation (die die Event-Loop blockieren könnte), weil von der Festplatte oder aus dem Netzwerk gelesen wird. + +/// info | Info + +Das obige Beispiel ist tatsächlich eine Ausnahme, weil sich das `io.BytesIO`-Objekt bereits im Speicher befindet, daher blockiert sein Lesen nichts. + +Aber in vielen Fällen würde das Lesen einer Datei oder eines dateiähnlichen Objekts blockieren. + +/// + +Um die Event-Loop nicht zu blockieren, können Sie die Pfadoperation-Funktion einfach mit normalem `def` statt `async def` deklarieren, dadurch führt FastAPI sie in einem Threadpool-Worker aus, um die Haupt-Event-Loop nicht zu blockieren. + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *} + +/// tip | Tipp + +Wenn Sie blockierenden Code aus einer async-Funktion heraus aufrufen müssen, oder eine async-Funktion aus einer blockierenden Funktion, könnten Sie [Asyncer](https://asyncer.tiangolo.com), eine Schwesterbibliothek zu FastAPI, verwenden. + +/// + +### `yield from` { #yield-from } + +Wenn Sie über etwas iterieren, z. B. ein dateiähnliches Objekt, und dann für jedes Element `yield` verwenden, könnten Sie auch `yield from` verwenden, um jedes Element direkt weiterzugeben und die `for`-Schleife zu sparen. + +Das ist nichts Spezifisches an FastAPI, das ist einfach Python, aber ein netter Trick. 😎 + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[37:40] hl[40] *} diff --git a/docs/de/docs/advanced/strict-content-type.md b/docs/de/docs/advanced/strict-content-type.md new file mode 100644 index 0000000000..2fcfa3e09f --- /dev/null +++ b/docs/de/docs/advanced/strict-content-type.md @@ -0,0 +1,88 @@ +# Strikte Content-Type-Prüfung { #strict-content-type-checking } + +Standardmäßig verwendet **FastAPI** eine strikte Prüfung des `Content-Type`-Headers für JSON-Requestbodys. Das bedeutet, dass JSON-Requests einen gültigen `Content-Type`-Header (z. B. `application/json`) enthalten MÜSSEN, damit der Body als JSON geparst wird. + +## CSRF-Risiko { #csrf-risk } + +Dieses Standardverhalten schützt vor einer Klasse von **Cross-Site Request Forgery (CSRF)**-Angriffen in einem sehr spezifischen Szenario. + +Diese Angriffe nutzen aus, dass Browser Skripte Requests senden lassen, ohne einen CORS-Preflight-Check durchzuführen, wenn sie: + +* keinen `Content-Type`-Header haben (z. B. mit `fetch()` und einem `Blob`-Body) +* und keine Authentifizierungsdaten senden. + +Diese Art von Angriff ist vor allem relevant, wenn: + +* die Anwendung lokal läuft (z. B. auf `localhost`) oder in einem internen Netzwerk +* und die Anwendung keine Authentifizierung hat, sondern erwartet, dass jeder Request aus demselben Netzwerk vertrauenswürdig ist. + +## Beispielangriff { #example-attack } + +Stellen Sie sich vor, Sie bauen eine Möglichkeit, lokal einen KI-Agenten auszuführen. + +Er stellt eine API bereit unter + +``` +http://localhost:8000/v1/agents/multivac +``` + +Es gibt auch ein Frontend unter + +``` +http://localhost:8000 +``` + +/// tip | Tipp + +Beachten Sie, dass beide denselben Host haben. + +/// + +Dann können Sie über das Frontend den KI-Agenten Dinge in Ihrem Namen erledigen lassen. + +Da er **lokal** läuft und nicht im offenen Internet, entscheiden Sie sich, **keine Authentifizierung** einzurichten und vertrauen stattdessen einfach auf den Zugriff im lokalen Netzwerk. + +Dann könnte einer Ihrer Benutzer es installieren und lokal ausführen. + +Anschließend könnte er eine bösartige Website öffnen, z. B. so etwas wie + +``` +https://evilhackers.example.com +``` + +Und diese bösartige Website sendet Requests mit `fetch()` und einem `Blob`-Body an die lokale API unter + +``` +http://localhost:8000/v1/agents/multivac +``` + +Obwohl der Host der bösartigen Website und der lokalen App unterschiedlich ist, löst der Browser keinen CORS-Preflight-Request aus, weil: + +* sie ohne Authentifizierung läuft, es müssen keine Credentials gesendet werden. +* der Browser annimmt, dass kein JSON gesendet wird (wegen des fehlenden `Content-Type`-Headers). + +Dann könnte die bösartige Website den lokalen KI-Agenten dazu bringen, wütende Nachrichten an den Ex-Chef des Benutzers zu schicken ... oder Schlimmeres. 😅 + +## Offenes Internet { #open-internet } + +Wenn Ihre App im offenen Internet läuft, würden Sie nicht „dem Netzwerk vertrauen“ und jedem erlauben, privilegierte Requests ohne Authentifizierung zu senden. + +Angreifer könnten einfach ein Skript ausführen, um Requests an Ihre API zu senden, es ist keine Browserinteraktion nötig. Daher sichern Sie wahrscheinlich schon alle privilegierten Endpunkte. + +In diesem Fall gilt **dieser Angriff / dieses Risiko nicht für Sie**. + +Dieses Risiko und dieser Angriff sind vor allem relevant, wenn die App im **lokalen Netzwerk** läuft und das die **einzige angenommene Schutzmaßnahme** ist. + +## Requests ohne Content-Type erlauben { #allowing-requests-without-content-type } + +Wenn Sie Clients unterstützen müssen, die keinen `Content-Type`-Header senden, können Sie die strikte Prüfung deaktivieren, indem Sie `strict_content_type=False` setzen: + +{* ../../docs_src/strict_content_type/tutorial001_py310.py hl[4] *} + +Mit dieser Einstellung werden Requests ohne `Content-Type`-Header im Body als JSON geparst. Das entspricht dem Verhalten älterer FastAPI-Versionen. + +/// info | Info + +Dieses Verhalten und diese Konfiguration wurden in FastAPI 0.132.0 hinzugefügt. + +/// diff --git a/docs/de/docs/advanced/sub-applications.md b/docs/de/docs/advanced/sub-applications.md index 6b862b44e0..206ee7b499 100644 --- a/docs/de/docs/advanced/sub-applications.md +++ b/docs/de/docs/advanced/sub-applications.md @@ -30,25 +30,25 @@ In diesem Fall wird sie im Pfad `/subapi` gemountet: ### Die automatische API-Dokumentation testen { #check-the-automatic-api-docs } -Führen Sie nun den `fastapi`-Befehl mit Ihrer Datei aus: +Führen Sie nun den Befehl `fastapi` aus:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Und öffnen Sie die Dokumentation unter http://127.0.0.1:8000/docs. +Und öffnen Sie die Dokumentation unter [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Sie sehen die automatische API-Dokumentation für die Hauptanwendung, welche nur deren eigene _Pfadoperationen_ anzeigt: -Öffnen Sie dann die Dokumentation für die Unteranwendung unter http://127.0.0.1:8000/subapi/docs. +Öffnen Sie dann die Dokumentation für die Unteranwendung unter [http://127.0.0.1:8000/subapi/docs](http://127.0.0.1:8000/subapi/docs). Sie sehen die automatische API-Dokumentation für die Unteranwendung, welche nur deren eigene _Pfadoperationen_ anzeigt, alle unter dem korrekten Unterpfad-Präfix `/subapi`: @@ -64,4 +64,4 @@ Auf diese Weise weiß die Unteranwendung, dass sie dieses Pfadpräfix für die B Und die Unteranwendung könnte auch ihre eigenen gemounteten Unteranwendungen haben und alles würde korrekt funktionieren, da FastAPI sich um alle diese `root_path`s automatisch kümmert. -Mehr über den `root_path` und dessen explizite Verwendung erfahren Sie im Abschnitt [Hinter einem Proxy](behind-a-proxy.md){.internal-link target=_blank}. +Mehr über den `root_path` und dessen explizite Verwendung erfahren Sie im Abschnitt [Hinter einem Proxy](behind-a-proxy.md). diff --git a/docs/de/docs/advanced/templates.md b/docs/de/docs/advanced/templates.md index 87baba3594..218b0437e4 100644 --- a/docs/de/docs/advanced/templates.md +++ b/docs/de/docs/advanced/templates.md @@ -8,7 +8,7 @@ Es gibt Werkzeuge zur einfachen Konfiguration, die Sie direkt in Ihrer **FastAPI ## Abhängigkeiten installieren { #install-dependencies } -Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und `jinja2` installieren: +Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md) erstellen, sie aktivieren und `jinja2` installieren:
@@ -123,4 +123,4 @@ Und da Sie `StaticFiles` verwenden, wird diese CSS-Datei automatisch von Ihrer * ## Mehr Details { #more-details } -Weitere Informationen, einschließlich, wie man Templates testet, finden Sie in Starlettes Dokumentation zu Templates. +Weitere Informationen, einschließlich, wie man Templates testet, finden Sie in [Starlettes Dokumentation zu Templates](https://www.starlette.dev/templates/). diff --git a/docs/de/docs/advanced/testing-websockets.md b/docs/de/docs/advanced/testing-websockets.md index 4bc46da3ea..3c06f19388 100644 --- a/docs/de/docs/advanced/testing-websockets.md +++ b/docs/de/docs/advanced/testing-websockets.md @@ -1,6 +1,6 @@ # WebSockets testen { #testing-websockets } -Sie können den schon bekannten `TestClient` zum Testen von WebSockets verwenden. +Sie können denselben `TestClient` zum Testen von WebSockets verwenden. Dazu verwenden Sie den `TestClient` in einer `with`-Anweisung, eine Verbindung zum WebSocket herstellend: @@ -8,6 +8,6 @@ Dazu verwenden Sie den `TestClient` in einer `with`-Anweisung, eine Verbindung z /// note | Hinweis -Weitere Informationen finden Sie in Starlettes Dokumentation zum Testen von WebSockets. +Weitere Informationen finden Sie in Starlettes Dokumentation zum [Testen von WebSockets](https://www.starlette.dev/testclient/#testing-websocket-sessions). /// diff --git a/docs/de/docs/advanced/using-request-directly.md b/docs/de/docs/advanced/using-request-directly.md index bed1cdbea3..623ddbb4bb 100644 --- a/docs/de/docs/advanced/using-request-directly.md +++ b/docs/de/docs/advanced/using-request-directly.md @@ -15,7 +15,7 @@ Es gibt jedoch Situationen, in denen Sie möglicherweise direkt auf das `Request ## Details zum `Request`-Objekt { #details-about-the-request-object } -Da **FastAPI** unter der Haube eigentlich **Starlette** ist, mit einer Ebene von mehreren Tools darüber, können Sie Starlettes `Request`-Objekt direkt verwenden, wenn Sie es benötigen. +Da **FastAPI** unter der Haube eigentlich **Starlette** ist, mit einer Ebene von mehreren Tools darüber, können Sie Starlettes [`Request`](https://www.starlette.dev/requests/)-Objekt direkt verwenden, wenn Sie es benötigen. Das bedeutet allerdings auch, dass, wenn Sie Daten direkt vom `Request`-Objekt nehmen (z. B. dessen Body lesen), diese von FastAPI nicht validiert, konvertiert oder dokumentiert werden (mit OpenAPI, für die automatische API-Benutzeroberfläche). @@ -45,7 +45,7 @@ Auf die gleiche Weise können Sie wie gewohnt jeden anderen Parameter deklariere ## `Request`-Dokumentation { #request-documentation } -Weitere Details zum `Request`-Objekt finden Sie in der offiziellen Starlette-Dokumentation. +Weitere Details zum [`Request`-Objekt auf der offiziellen Starlette-Dokumentationsseite](https://www.starlette.dev/requests/). /// note | Technische Details diff --git a/docs/de/docs/advanced/websockets.md b/docs/de/docs/advanced/websockets.md index 22c131838e..c96cfb28b4 100644 --- a/docs/de/docs/advanced/websockets.md +++ b/docs/de/docs/advanced/websockets.md @@ -1,10 +1,10 @@ # WebSockets { #websockets } -Sie können WebSockets mit **FastAPI** verwenden. +Sie können [WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) mit **FastAPI** verwenden. ## `websockets` installieren { #install-websockets } -Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und `websockets` installieren (eine Python-Bibliothek, die die Verwendung des „WebSocket“-Protokolls erleichtert): +Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md) erstellen, sie aktivieren und `websockets` installieren (eine Python-Bibliothek, die die Verwendung des „WebSocket“-Protokolls erleichtert):
@@ -64,19 +64,19 @@ Sie können Binär-, Text- und JSON-Daten empfangen und senden. ## Es ausprobieren { #try-it } -Wenn Ihre Datei `main.py` heißt, führen Sie Ihre Anwendung so aus: +Legen Sie Ihren Code in einer Datei `main.py` ab und führen Sie dann Ihre Anwendung aus:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Öffnen Sie Ihren Browser unter http://127.0.0.1:8000. +Öffnen Sie Ihren Browser unter [http://127.0.0.1:8000](http://127.0.0.1:8000). Sie sehen eine einfache Seite wie: @@ -115,25 +115,25 @@ Diese funktionieren auf die gleiche Weise wie für andere FastAPI-Endpunkte/*Pfa Da es sich um einen WebSocket handelt, macht es keinen Sinn, eine `HTTPException` auszulösen, stattdessen lösen wir eine `WebSocketException` aus. -Sie können einen „Closing“-Code verwenden, aus den gültigen Codes, die in der Spezifikation definiert sind. +Sie können einen „Closing“-Code verwenden, aus den [gültigen Codes, die in der Spezifikation definiert sind](https://tools.ietf.org/html/rfc6455#section-7.4.1). /// ### WebSockets mit Abhängigkeiten ausprobieren { #try-the-websockets-with-dependencies } -Wenn Ihre Datei `main.py` heißt, führen Sie Ihre Anwendung mit Folgendem aus: +Führen Sie Ihre Anwendung aus:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Öffnen Sie Ihren Browser unter http://127.0.0.1:8000. +Öffnen Sie Ihren Browser unter [http://127.0.0.1:8000](http://127.0.0.1:8000). Dort können Sie einstellen: @@ -174,7 +174,7 @@ Die obige Anwendung ist ein minimales und einfaches Beispiel, das zeigt, wie Nac Beachten Sie jedoch, dass, da alles nur im Speicher in einer einzigen Liste verwaltet wird, es nur funktioniert, während der Prozess ausgeführt wird, und nur mit einem einzelnen Prozess. -Wenn Sie etwas benötigen, das sich leicht in FastAPI integrieren lässt, aber robuster ist und von Redis, PostgreSQL und anderen unterstützt wird, sehen Sie sich encode/broadcaster an. +Wenn Sie etwas benötigen, das sich leicht in FastAPI integrieren lässt, aber robuster ist und von Redis, PostgreSQL und anderen unterstützt wird, sehen Sie sich [encode/broadcaster](https://github.com/encode/broadcaster) an. /// @@ -182,5 +182,5 @@ Wenn Sie etwas benötigen, das sich leicht in FastAPI integrieren lässt, aber r Weitere Informationen zu Optionen finden Sie in der Dokumentation von Starlette: -* Die `WebSocket`-Klasse. -* Klassen-basierte Handhabung von WebSockets. +* [Die `WebSocket`-Klasse](https://www.starlette.dev/websockets/). +* [Klassen-basierte Handhabung von WebSockets](https://www.starlette.dev/endpoints/#websocketendpoint). diff --git a/docs/de/docs/advanced/wsgi.md b/docs/de/docs/advanced/wsgi.md index b2f170e80b..89e513dc08 100644 --- a/docs/de/docs/advanced/wsgi.md +++ b/docs/de/docs/advanced/wsgi.md @@ -1,6 +1,6 @@ # WSGI inkludieren – Flask, Django und andere { #including-wsgi-flask-django-others } -Sie können WSGI-Anwendungen mounten, wie Sie es in [Unteranwendungen – Mounts](sub-applications.md){.internal-link target=_blank}, [Hinter einem Proxy](behind-a-proxy.md){.internal-link target=_blank} gesehen haben. +Sie können WSGI-Anwendungen mounten, wie Sie es in [Unteranwendungen – Mounts](sub-applications.md), [Hinter einem Proxy](behind-a-proxy.md) gesehen haben. Dazu können Sie die `WSGIMiddleware` verwenden und damit Ihre WSGI-Anwendung wrappen, zum Beispiel Flask, Django usw. @@ -36,13 +36,13 @@ Jetzt wird jeder http://localhost:8000/v1/ gehen, sehen Sie die Response von Flask: +Wenn Sie das ausführen und auf [http://localhost:8000/v1/](http://localhost:8000/v1/) gehen, sehen Sie die Response von Flask: ```txt Hello, World from Flask! ``` -Und wenn Sie auf http://localhost:8000/v2 gehen, sehen Sie die Response von FastAPI: +Und wenn Sie auf [http://localhost:8000/v2](http://localhost:8000/v2) gehen, sehen Sie die Response von FastAPI: ```JSON { diff --git a/docs/de/docs/alternatives.md b/docs/de/docs/alternatives.md index b6509ec09d..910f3b972b 100644 --- a/docs/de/docs/alternatives.md +++ b/docs/de/docs/alternatives.md @@ -14,7 +14,7 @@ Aber irgendwann gab es keine andere Möglichkeit, als etwas zu schaffen, das all ## Vorherige Tools { #previous-tools } -### Django { #django } +### [Django](https://www.djangoproject.com/) { #django } Es ist das beliebteste Python-Framework und genießt großes Vertrauen. Es wird zum Aufbau von Systemen wie Instagram verwendet. @@ -22,7 +22,7 @@ Es ist relativ eng mit relationalen Datenbanken (wie MySQL oder PostgreSQL) geko Es wurde erstellt, um den HTML-Code im Backend zu generieren, nicht um APIs zu erstellen, die von einem modernen Frontend (wie React, Vue.js und Angular) oder von anderen Systemen (wie IoT-Geräten) verwendet werden, um mit ihm zu kommunizieren. -### Django REST Framework { #django-rest-framework } +### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework } Das Django REST Framework wurde als flexibles Toolkit zum Erstellen von Web-APIs unter Verwendung von Django entwickelt, um dessen API-Möglichkeiten zu verbessern. @@ -42,7 +42,7 @@ Eine automatische API-Dokumentationsoberfläche zu haben. /// -### Flask { #flask } +### [Flask](https://flask.palletsprojects.com) { #flask } Flask ist ein „Mikroframework“, es enthält weder Datenbankintegration noch viele der Dinge, die standardmäßig in Django enthalten sind. @@ -64,7 +64,7 @@ Ein Mikroframework zu sein. Es einfach zu machen, die benötigten Tools und Teil /// -### Requests { #requests } +### [Requests](https://requests.readthedocs.io) { #requests } **FastAPI** ist eigentlich keine Alternative zu **Requests**. Der Umfang der beiden ist sehr unterschiedlich. @@ -106,7 +106,7 @@ Sehen Sie sich die Ähnlichkeiten in `requests.get(...)` und `@app.get(...)` an. /// -### Swagger / OpenAPI { #swagger-openapi } +### [Swagger](https://swagger.io/) / [OpenAPI](https://github.com/OAI/OpenAPI-Specification/) { #swagger-openapi } Die Hauptfunktion, die ich vom Django REST Framework haben wollte, war die automatische API-Dokumentation. @@ -124,8 +124,8 @@ Einen offenen Standard für API-Spezifikationen zu übernehmen und zu verwenden, Und Standard-basierte Tools für die Oberfläche zu integrieren: -* Swagger UI -* ReDoc +* [Swagger UI](https://github.com/swagger-api/swagger-ui) +* [ReDoc](https://github.com/Rebilly/ReDoc) Diese beiden wurden ausgewählt, weil sie ziemlich beliebt und stabil sind, aber bei einer schnellen Suche könnten Sie Dutzende alternativer Benutzeroberflächen für OpenAPI finden (welche Sie mit **FastAPI** verwenden können). @@ -135,7 +135,7 @@ Diese beiden wurden ausgewählt, weil sie ziemlich beliebt und stabil sind, aber Es gibt mehrere Flask REST Frameworks, aber nachdem ich die Zeit und Arbeit investiert habe, sie zu untersuchen, habe ich festgestellt, dass viele nicht mehr unterstützt werden oder abgebrochen wurden und dass mehrere fortbestehende Probleme sie unpassend machten. -### Marshmallow { #marshmallow } +### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow } Eine der von API-Systemen benötigten Hauptfunktionen ist die Daten-„Serialisierung“, welche Daten aus dem Code (Python) entnimmt und in etwas umwandelt, was durch das Netzwerk gesendet werden kann. Beispielsweise das Konvertieren eines Objekts, welches Daten aus einer Datenbank enthält, in ein JSON-Objekt. Konvertieren von `datetime`-Objekten in Strings, usw. @@ -153,7 +153,7 @@ Code zu verwenden, um „Schemas“ zu definieren, welche Datentypen und Validie /// -### Webargs { #webargs } +### [Webargs](https://webargs.readthedocs.io/en/latest/) { #webargs } Eine weitere wichtige Funktion, die von APIs benötigt wird, ist das Parsen von Daten aus eingehenden Requests. @@ -175,7 +175,7 @@ Eingehende Requestdaten automatisch zu validieren. /// -### APISpec { #apispec } +### [APISpec](https://apispec.readthedocs.io/en/stable/) { #apispec } Marshmallow und Webargs bieten Validierung, Parsen und Serialisierung als Plugins. @@ -205,7 +205,7 @@ Den offenen Standard für APIs, OpenAPI, zu unterstützen. /// -### Flask-apispec { #flask-apispec } +### [Flask-apispec](https://flask-apispec.readthedocs.io/en/latest/) { #flask-apispec } Hierbei handelt es sich um ein Flask-Plugin, welches Webargs, Marshmallow und APISpec miteinander verbindet. @@ -219,11 +219,11 @@ Diese Kombination aus Flask, Flask-apispec mit Marshmallow und Webargs war bis z Die Verwendung führte zur Entwicklung mehrerer Flask-Full-Stack-Generatoren. Dies sind die Hauptstacks, die ich (und mehrere externe Teams) bisher verwendet haben: -* https://github.com/tiangolo/full-stack -* https://github.com/tiangolo/full-stack-flask-couchbase -* https://github.com/tiangolo/full-stack-flask-couchdb +* [https://github.com/tiangolo/full-stack](https://github.com/tiangolo/full-stack) +* [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) -Und dieselben Full-Stack-Generatoren bildeten die Basis der [**FastAPI**-Projektgeneratoren](project-generation.md){.internal-link target=_blank}. +Und dieselben Full-Stack-Generatoren bildeten die Basis der [**FastAPI**-Projektgeneratoren](project-generation.md). /// info | Info @@ -237,7 +237,7 @@ Das OpenAPI-Schema automatisch zu generieren, aus demselben Code, welcher die Se /// -### NestJS (und Angular) { #nestjs-and-angular } +### [NestJS](https://nestjs.com/) (und [Angular](https://angular.io/)) { #nestjs-and-angular } Dies ist nicht einmal Python, NestJS ist ein von Angular inspiriertes JavaScript (TypeScript) NodeJS Framework. @@ -259,13 +259,13 @@ Python-Typen zu verwenden, um eine hervorragende Editorunterstützung zu erhalte /// -### Sanic { #sanic } +### [Sanic](https://sanic.readthedocs.io/en/latest/) { #sanic } Es war eines der ersten extrem schnellen Python-Frameworks, welches auf `asyncio` basierte. Es wurde so gestaltet, dass es Flask sehr ähnlich ist. /// note | Technische Details -Es verwendete `uvloop` anstelle der standardmäßigen Python-`asyncio`-Schleife. Das hat es so schnell gemacht. +Es verwendete [`uvloop`](https://github.com/MagicStack/uvloop) anstelle der standardmäßigen Python-`asyncio`-Schleife. Das hat es so schnell gemacht. Hat eindeutig Uvicorn und Starlette inspiriert, welche derzeit in offenen Benchmarks schneller als Sanic sind. @@ -279,7 +279,7 @@ Aus diesem Grund basiert **FastAPI** auf Starlette, da dieses das schnellste ver /// -### Falcon { #falcon } +### [Falcon](https://falconframework.org/) { #falcon } Falcon ist ein weiteres leistungsstarkes Python-Framework. Es ist minimalistisch konzipiert und dient als Grundlage für andere Frameworks wie Hug. @@ -297,7 +297,7 @@ Obwohl er in FastAPI optional ist und hauptsächlich zum Festlegen von Headern, /// -### Molten { #molten } +### [Molten](https://moltenframework.com/) { #molten } Ich habe Molten in den ersten Phasen der Entwicklung von **FastAPI** entdeckt. Und es hat ganz ähnliche Ideen: @@ -321,7 +321,7 @@ Das hat tatsächlich dazu geführt, dass Teile von Pydantic aktualisiert wurden, /// -### Hug { #hug } +### [Hug](https://github.com/hugapi/hug) { #hug } Hug war eines der ersten Frameworks, welches die Deklaration von API-Parametertypen mithilfe von Python-Typhinweisen implementierte. Das war eine großartige Idee, die andere Tools dazu inspirierte, dasselbe zu tun. @@ -337,7 +337,7 @@ Da es auf dem bisherigen Standard für synchrone Python-Webframeworks (WSGI) bas /// info | Info -Hug wurde von Timothy Crosley erstellt, demselben Schöpfer von `isort`, einem großartigen Tool zum automatischen Sortieren von Importen in Python-Dateien. +Hug wurde von Timothy Crosley erstellt, demselben Schöpfer von [`isort`](https://github.com/timothycrosley/isort), einem großartigen Tool zum automatischen Sortieren von Importen in Python-Dateien. /// @@ -351,7 +351,7 @@ Hug inspirierte **FastAPI** dazu, einen `response`-Parameter in Funktionen zu de /// -### APIStar (≦ 0.5) { #apistar-0-5 } +### [APIStar](https://github.com/encode/apistar) (≦ 0.5) { #apistar-0-5 } Kurz bevor ich mich entschied, **FastAPI** zu erstellen, fand ich den **APIStar**-Server. Er hatte fast alles, was ich suchte, und ein tolles Design. @@ -401,7 +401,7 @@ Ich betrachte **FastAPI** als einen „spirituellen Nachfolger“ von APIStar, w ## Verwendet von **FastAPI** { #used-by-fastapi } -### Pydantic { #pydantic } +### [Pydantic](https://docs.pydantic.dev/) { #pydantic } Pydantic ist eine Bibliothek zum Definieren von Datenvalidierung, Serialisierung und Dokumentation (unter Verwendung von JSON Schema) basierend auf Python-Typhinweisen. @@ -417,7 +417,7 @@ Die gesamte Datenvalidierung, Datenserialisierung und automatische Modelldokumen /// -### Starlette { #starlette } +### [Starlette](https://www.starlette.dev/) { #starlette } Starlette ist ein leichtgewichtiges ASGI-Framework/Toolkit, welches sich ideal für die Erstellung hochperformanter asynchroner Dienste eignet. @@ -462,7 +462,7 @@ Alles, was Sie also mit Starlette machen können, können Sie direkt mit **FastA /// -### Uvicorn { #uvicorn } +### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn } Uvicorn ist ein blitzschneller ASGI-Server, der auf uvloop und httptools basiert. @@ -476,10 +476,10 @@ Hauptwebserver zum Ausführen von **FastAPI**-Anwendungen. Sie können auch die Kommandozeilenoption `--workers` verwenden, um einen asynchronen Multiprozess-Server zu erhalten. -Weitere Details finden Sie im Abschnitt [Deployment](deployment/index.md){.internal-link target=_blank}. +Weitere Details finden Sie im Abschnitt [Deployment](deployment/index.md). /// ## Benchmarks und Geschwindigkeit { #benchmarks-and-speed } -Um den Unterschied zwischen Uvicorn, Starlette und FastAPI zu verstehen, zu vergleichen und zu sehen, lesen Sie den Abschnitt über [Benchmarks](benchmarks.md){.internal-link target=_blank}. +Um den Unterschied zwischen Uvicorn, Starlette und FastAPI zu verstehen, zu vergleichen, und zu sehen, lesen Sie den Abschnitt über [Benchmarks](benchmarks.md). diff --git a/docs/de/docs/async.md b/docs/de/docs/async.md index 3dbd442e5f..066a9d9f6b 100644 --- a/docs/de/docs/async.md +++ b/docs/de/docs/async.md @@ -4,7 +4,7 @@ Details zur `async def`-Syntax für *Pfadoperation-Funktionen* und Hintergrundin ## In Eile? { #in-a-hurry } -TL;DR: +TL;DR: Wenn Sie Bibliotheken von Dritten verwenden, die mit `await` aufgerufen werden müssen, wie zum Beispiel: @@ -74,7 +74,7 @@ Dann kommt der Computer / das Programm 🤖 bei jeder Gelegenheit zurück, weil Dann nimmt es 🤖 die erste erledigte Aufgabe (sagen wir, unsere „Langsam-Datei“ 📝) und bearbeitet sie weiter. -Das „Warten auf etwas anderes“ bezieht sich normalerweise auf I/O-Operationen, die relativ „langsam“ sind (im Vergleich zur Geschwindigkeit des Prozessors und des Arbeitsspeichers), wie etwa das Warten darauf, dass: +Das „Warten auf etwas anderes“ bezieht sich normalerweise auf I/O-Operationen, die relativ „langsam“ sind (im Vergleich zur Geschwindigkeit des Prozessors und des Arbeitsspeichers), wie etwa das Warten darauf, dass: * die Daten des Clients über das Netzwerk empfangen wurden * die von Ihrem Programm gesendeten Daten vom Client über das Netzwerk empfangen wurden @@ -85,7 +85,7 @@ Das „Warten auf etwas anderes“ bezieht sich normalerweise auf I/O-Operationen verbraucht wird, nennt man dies auch „I/O-lastige“ („I/O bound“) Operationen. +Da die Ausführungszeit hier hauptsächlich durch das Warten auf I/O-Operationen verbraucht wird, nennt man dies auch „I/O-lastige“ („I/O bound“) Operationen. „Asynchron“, sagt man, weil der Computer / das Programm nicht mit einer langsamen Aufgabe „synchronisiert“ werden muss und nicht auf den genauen Moment warten muss, in dem die Aufgabe beendet ist, ohne dabei etwas zu tun, um schließlich das Ergebnis der Aufgabe zu übernehmen und die Arbeit fortsetzen zu können. @@ -141,7 +141,7 @@ Sie und Ihr Schwarm essen die Burger und haben eine schöne Zeit. ✨ /// info | Info -Die wunderschönen Illustrationen stammen von Ketrina Thompson. 🎨 +Die wunderschönen Illustrationen stammen von [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨 /// @@ -207,7 +207,7 @@ Es wurde nicht viel geredet oder geflirtet, da die meiste Zeit mit Warten 🕙 v /// info | Info -Die wunderschönen Illustrationen stammen von Ketrina Thompson. 🎨 +Die wunderschönen Illustrationen stammen von [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨 /// @@ -251,7 +251,7 @@ Diese Art der Asynchronität hat NodeJS populär gemacht (auch wenn NodeJS nicht Und das ist das gleiche Leistungsniveau, das Sie mit **FastAPI** erhalten. -Und da Sie Parallelität und Asynchronität gleichzeitig haben können, erzielen Sie eine höhere Performanz als die meisten getesteten NodeJS-Frameworks und sind mit Go auf Augenhöhe, einer kompilierten Sprache, die näher an C liegt (alles dank Starlette). +Und da Sie Parallelität und Asynchronität gleichzeitig haben können, erzielen Sie eine höhere Performanz als die meisten getesteten NodeJS-Frameworks und sind mit Go auf Augenhöhe, einer kompilierten Sprache, die näher an C liegt [(alles dank Starlette)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1). ### Ist Nebenläufigkeit besser als Parallelität? { #is-concurrency-better-than-parallelism } @@ -277,7 +277,7 @@ Aber wenn Sie in diesem Fall die acht Ex-Kassierer/Köche/jetzt Reinigungskräft In diesem Szenario wäre jede einzelne Reinigungskraft (einschließlich Ihnen) ein Prozessor, der seinen Teil der Arbeit erledigt. -Und da die meiste Ausführungszeit durch tatsächliche Arbeit (anstatt durch Warten) in Anspruch genommen wird und die Arbeit in einem Computer von einer CPU erledigt wird, werden diese Probleme als „CPU-lastig“ („CPU bound“) bezeichnet. +Und da die meiste Ausführungszeit durch tatsächliche Arbeit (anstatt durch Warten) in Anspruch genommen wird und die Arbeit in einem Computer von einer CPU erledigt wird, werden diese Probleme als „CPU-lastig“ („CPU bound“) bezeichnet. --- @@ -298,7 +298,7 @@ Sie können aber auch die Vorteile von Parallelität und Multiprocessing (mehrer Dies und die einfache Tatsache, dass Python die Hauptsprache für **Data Science**, maschinelles Lernen und insbesondere Deep Learning ist, machen FastAPI zu einem sehr passenden Werkzeug für Web-APIs und Anwendungen für Data Science / maschinelles Lernen (neben vielen anderen). -Wie Sie diese Parallelität in der Produktion erreichen, erfahren Sie im Abschnitt über [Deployment](deployment/index.md){.internal-link target=_blank}. +Wie Sie diese Parallelität in der Produktion erreichen, erfahren Sie im Abschnitt über [Deployment](deployment/index.md). ## `async` und `await` { #async-and-await } @@ -363,13 +363,13 @@ Wenn Sie jedoch `async` / `await` ohne FastAPI verwenden möchten, können Sie d ### Schreiben Sie Ihren eigenen asynchronen Code { #write-your-own-async-code } -Starlette (und **FastAPI**) basieren auf AnyIO, was bedeutet, dass es sowohl kompatibel mit der Python-Standardbibliothek asyncio als auch mit Trio ist. +Starlette (und **FastAPI**) basieren auf [AnyIO](https://anyio.readthedocs.io/en/stable/), was bedeutet, dass es sowohl kompatibel mit der Python-Standardbibliothek [asyncio](https://docs.python.org/3/library/asyncio-task.html) als auch mit [Trio](https://trio.readthedocs.io/en/stable/) ist. -Insbesondere können Sie AnyIO direkt verwenden für Ihre fortgeschrittenen nebenläufigen Anwendungsfälle, die fortgeschrittenere Muster in Ihrem eigenen Code erfordern. +Insbesondere können Sie [AnyIO](https://anyio.readthedocs.io/en/stable/) direkt verwenden für Ihre fortgeschrittenen nebenläufigen Anwendungsfälle, die fortgeschrittenere Muster in Ihrem eigenen Code erfordern. -Und auch wenn Sie FastAPI nicht verwenden würden, könnten Sie Ihre eigenen asynchronen Anwendungen mit AnyIO schreiben, um hochkompatibel zu sein und dessen Vorteile zu nutzen (z. B. *strukturierte Nebenläufigkeit*). +Und auch wenn Sie FastAPI nicht verwenden würden, könnten Sie Ihre eigenen asynchronen Anwendungen mit [AnyIO](https://anyio.readthedocs.io/en/stable/) schreiben, um hochkompatibel zu sein und dessen Vorteile zu nutzen (z. B. *strukturierte Nebenläufigkeit*). -Ich habe eine weitere Bibliothek auf Basis von AnyIO erstellt, als dünne Schicht obendrauf, um die Typannotationen etwas zu verbessern und bessere **Autovervollständigung**, **Inline-Fehler** usw. zu erhalten. Sie hat auch eine freundliche Einführung und ein Tutorial, um Ihnen zu helfen, **Ihren eigenen asynchronen Code zu verstehen** und zu schreiben: Asyncer. Sie ist insbesondere nützlich, wenn Sie **asynchronen Code mit regulärem** (blockierendem/synchronem) Code kombinieren müssen. +Ich habe eine weitere Bibliothek auf Basis von AnyIO erstellt, als dünne Schicht obendrauf, um die Typannotationen etwas zu verbessern und bessere **Autovervollständigung**, **Inline-Fehler** usw. zu erhalten. Sie hat auch eine freundliche Einführung und ein Tutorial, um Ihnen zu helfen, **Ihren eigenen asynchronen Code zu verstehen** und zu schreiben: [Asyncer](https://asyncer.tiangolo.com/). Sie ist insbesondere nützlich, wenn Sie **asynchronen Code mit regulärem** (blockierendem/synchronem) Code kombinieren müssen. ### Andere Formen von asynchronem Code { #other-forms-of-asynchronous-code } @@ -381,7 +381,7 @@ Die gleiche Syntax (oder fast identisch) wurde kürzlich auch in moderne Version Davor war der Umgang mit asynchronem Code jedoch deutlich komplexer und schwieriger. -In früheren Versionen von Python hätten Sie Threads oder Gevent verwenden können. Der Code ist jedoch viel komplexer zu verstehen, zu debuggen und nachzuvollziehen. +In früheren Versionen von Python hätten Sie Threads oder [Gevent](https://www.gevent.org/) verwenden können. Der Code ist jedoch viel komplexer zu verstehen, zu debuggen und nachzuvollziehen. In früheren Versionen von NodeJS / Browser JavaScript hätten Sie „Callbacks“ verwendet. Was zur „Callback-Hölle“ führt. @@ -417,17 +417,17 @@ Wenn Sie über gute technische Kenntnisse verfügen (Coroutinen, Threads, Blocki Wenn Sie eine *Pfadoperation-Funktion* mit normalem `def` anstelle von `async def` deklarieren, wird sie in einem externen Threadpool ausgeführt, der dann `await`et wird, anstatt direkt aufgerufen zu werden (da dies den Server blockieren würde). -Wenn Sie von einem anderen asynchronen Framework kommen, das nicht auf die oben beschriebene Weise funktioniert, und Sie es gewohnt sind, triviale, nur-berechnende *Pfadoperation-Funktionen* mit einfachem `def` zu definieren, um einen geringfügigen Geschwindigkeitsgewinn (etwa 100 Nanosekunden) zu erzielen, beachten Sie bitte, dass der Effekt in **FastAPI** genau gegenteilig wäre. In solchen Fällen ist es besser, `async def` zu verwenden, es sei denn, Ihre *Pfadoperation-Funktionen* verwenden Code, der blockierende I/O-Operationen durchführt. +Wenn Sie von einem anderen asynchronen Framework kommen, das nicht auf die oben beschriebene Weise funktioniert, und Sie es gewohnt sind, triviale, nur-berechnende *Pfadoperation-Funktionen* mit einfachem `def` zu definieren, um einen geringfügigen Geschwindigkeitsgewinn (etwa 100 Nanosekunden) zu erzielen, beachten Sie bitte, dass der Effekt in **FastAPI** genau gegenteilig wäre. In solchen Fällen ist es besser, `async def` zu verwenden, es sei denn, Ihre *Pfadoperation-Funktionen* verwenden Code, der blockierende I/O-Operationen durchführt. -Dennoch besteht in beiden Fällen eine gute Chance, dass **FastAPI** [immer noch schneller](index.md#performance){.internal-link target=_blank} als Ihr bisheriges Framework (oder zumindest damit vergleichbar) ist. +Dennoch besteht in beiden Fällen eine gute Chance, dass **FastAPI** [immer noch schneller](index.md#performance) als Ihr bisheriges Framework (oder zumindest damit vergleichbar) ist. ### Abhängigkeiten { #dependencies } -Das Gleiche gilt für [Abhängigkeiten](tutorial/dependencies/index.md){.internal-link target=_blank}. Wenn eine Abhängigkeit eine normale `def`-Funktion anstelle einer `async def` ist, wird sie im externen Threadpool ausgeführt. +Das Gleiche gilt für [Abhängigkeiten](tutorial/dependencies/index.md). Wenn eine Abhängigkeit eine normale `def`-Funktion anstelle einer `async def` ist, wird sie im externen Threadpool ausgeführt. ### Unterabhängigkeiten { #sub-dependencies } -Sie können mehrere Abhängigkeiten und [Unterabhängigkeiten](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} haben, die einander bedingen (als Parameter der Funktionsdefinitionen), einige davon könnten erstellt werden mit `async def` und einige mit normalem `def`. Es würde immer noch funktionieren, und diejenigen, die mit normalem `def` erstellt wurden, würden in einem externen Thread (vom Threadpool stammend) aufgerufen werden, anstatt `await`et zu werden. +Sie können mehrere Abhängigkeiten und [Unterabhängigkeiten](tutorial/dependencies/sub-dependencies.md) haben, die einander bedingen (als Parameter der Funktionsdefinitionen), einige davon könnten erstellt werden mit `async def` und einige mit normalem `def`. Es würde immer noch funktionieren, und diejenigen, die mit normalem `def` erstellt wurden, würden in einem externen Thread (vom Threadpool stammend) aufgerufen werden, anstatt `await`et zu werden. ### Andere Hilfsfunktionen { #other-utility-functions } diff --git a/docs/de/docs/benchmarks.md b/docs/de/docs/benchmarks.md index 285d35bf93..9421f80105 100644 --- a/docs/de/docs/benchmarks.md +++ b/docs/de/docs/benchmarks.md @@ -1,6 +1,6 @@ # Benchmarks { #benchmarks } -Unabhängige TechEmpower-Benchmarks zeigen **FastAPI**-Anwendungen, die unter Uvicorn ausgeführt werden, als eines der schnellsten verfügbaren Python-Frameworks, nur unterhalb von Starlette und Uvicorn selbst (die intern von FastAPI verwendet werden). +Unabhängige TechEmpower-Benchmarks zeigen **FastAPI**-Anwendungen, die unter Uvicorn ausgeführt werden, als [eines der schnellsten verfügbaren Python-Frameworks](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), nur unterhalb von Starlette und Uvicorn selbst (die intern von FastAPI verwendet werden). Aber bei der Betrachtung von Benchmarks und Vergleichen sollten Sie Folgendes beachten. diff --git a/docs/de/docs/deployment/cloud.md b/docs/de/docs/deployment/cloud.md index 08a554b8d6..2c8fe85c48 100644 --- a/docs/de/docs/deployment/cloud.md +++ b/docs/de/docs/deployment/cloud.md @@ -6,7 +6,7 @@ In den meisten Fällen bieten die großen Cloudanbieter Anleitungen zum Deployme ## FastAPI Cloud { #fastapi-cloud } -**FastAPI Cloud** wurde vom selben Autor und Team hinter **FastAPI** entwickelt. +**[FastAPI Cloud](https://fastapicloud.com)** wurde vom selben Autor und Team hinter **FastAPI** entwickelt. Es vereinfacht den Prozess des **Erstellens**, **Deployens** und **Zugreifens** auf eine API mit minimalem Aufwand. @@ -16,9 +16,9 @@ FastAPI Cloud ist der Hauptsponsor und Finanzierungsgeber für die *FastAPI and ## Cloudanbieter – Sponsoren { #cloud-providers-sponsors } -Einige andere Cloudanbieter ✨ [**sponsern FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨ ebenfalls. 🙇 +Einige andere Cloudanbieter ✨ [**sponsern FastAPI**](../help-fastapi.md#sponsor-the-author) ✨ ebenfalls. 🙇 Sie könnten diese ebenfalls in Betracht ziehen, deren Anleitungen folgen und ihre Dienste ausprobieren: -* Render -* Railway +* [Render](https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi) +* [Railway](https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi) diff --git a/docs/de/docs/deployment/concepts.md b/docs/de/docs/deployment/concepts.md index dde922805f..be00b2260b 100644 --- a/docs/de/docs/deployment/concepts.md +++ b/docs/de/docs/deployment/concepts.md @@ -25,7 +25,7 @@ Aber schauen wir uns zunächst einmal diese grundlegenden **konzeptionellen Idee ## Sicherheit – HTTPS { #security-https } -Im [vorherigen Kapitel über HTTPS](https.md){.internal-link target=_blank} haben wir erfahren, wie HTTPS Verschlüsselung für Ihre API bereitstellt. +Im [vorherigen Kapitel über HTTPS](https.md) haben wir erfahren, wie HTTPS Verschlüsselung für Ihre API bereitstellt. Wir haben auch gesehen, dass HTTPS normalerweise von einer Komponente **außerhalb** Ihres Anwendungsservers bereitgestellt wird, einem **TLS-Terminierungsproxy**. @@ -45,7 +45,7 @@ Einige der Tools, die Sie als TLS-Terminierungsproxy verwenden können, sind: * Mit einer externen Komponente wie Certbot für Zertifikat-Erneuerungen * Kubernetes mit einem Ingress Controller wie Nginx * Mit einer externen Komponente wie cert-manager für Zertifikat-Erneuerungen -* Es wird intern von einem Cloud-Anbieter als Teil seiner Dienste verwaltet (siehe unten 👇) +* Es wird intern von einem Cloudanbieter als Teil seiner Dienste verwaltet (siehe unten 👇) Eine andere Möglichkeit besteht darin, dass Sie einen **Cloud-Dienst** verwenden, der den größten Teil der Arbeit übernimmt, einschließlich der Einrichtung von HTTPS. Er könnte einige Einschränkungen haben oder Ihnen mehr in Rechnung stellen, usw. In diesem Fall müssten Sie jedoch nicht selbst einen TLS-Terminierungsproxy einrichten. @@ -100,7 +100,7 @@ Und es wird funktionieren und **während der Entwicklung** nützlich sein. Wenn Ihre Verbindung zum Server jedoch unterbrochen wird, wird der **laufende Prozess** wahrscheinlich abstürzen. -Und wenn der Server neu gestartet wird (z. B. nach Updates oder Migrationen vom Cloud-Anbieter), werden Sie das wahrscheinlich **nicht bemerken**. Und deshalb wissen Sie nicht einmal, dass Sie den Prozess manuell neu starten müssen. Ihre API bleibt also einfach tot. 😱 +Und wenn der Server neu gestartet wird (z. B. nach Updates oder Migrationen vom Cloudanbieter), werden Sie das wahrscheinlich **nicht bemerken**. Und deshalb wissen Sie nicht einmal, dass Sie den Prozess manuell neu starten müssen. Ihre API bleibt also einfach tot. 😱 ### Beim Hochfahren automatisch ausführen { #run-automatically-on-startup } @@ -120,7 +120,7 @@ Einige Beispiele für Tools, die diese Aufgabe übernehmen können, sind: * Docker im Schwarm-Modus * Systemd * Supervisor -* Es wird intern von einem Cloud-Anbieter im Rahmen seiner Dienste verwaltet +* Es wird intern von einem Cloudanbieter im Rahmen seiner Dienste verwaltet * Andere ... In den nächsten Kapiteln werde ich Ihnen konkretere Beispiele geben. @@ -173,7 +173,7 @@ Dies könnte zum Beispiel erledigt werden durch: * Docker im Schwarm-Modus * Systemd * Supervisor -* Intern von einem Cloud-Anbieter im Rahmen seiner Dienste +* Intern von einem Cloudanbieter im Rahmen seiner Dienste * Andere ... ## Replikation – Prozesse und Arbeitsspeicher { #replication-processes-and-memory } @@ -190,7 +190,7 @@ Wenn Sie mit **mehreren Prozessen** dasselbe API-Programm ausführen, werden die ### Workerprozesse und Ports { #worker-processes-and-ports } -Erinnern Sie sich aus der Dokumentation [Über HTTPS](https.md){.internal-link target=_blank}, dass nur ein Prozess auf einer Kombination aus Port und IP-Adresse auf einem Server lauschen kann? +Erinnern Sie sich aus der Dokumentation [Über HTTPS](https.md), dass nur ein Prozess auf einer Kombination aus Port und IP-Adresse auf einem Server lauschen kann? Das ist immer noch wahr. @@ -243,7 +243,7 @@ Hier sind einige mögliche Kombinationen und Strategien: Machen Sie sich keine Sorgen, wenn einige dieser Punkte zu **Containern**, Docker oder Kubernetes noch nicht viel Sinn ergeben. -Ich werde Ihnen in einem zukünftigen Kapitel mehr über Container-Images, Docker, Kubernetes, usw. erzählen: [FastAPI in Containern – Docker](docker.md){.internal-link target=_blank}. +Ich werde Ihnen in einem zukünftigen Kapitel mehr über Container-Images, Docker, Kubernetes, usw. erzählen: [FastAPI in Containern – Docker](docker.md). /// @@ -281,7 +281,7 @@ Hier sind einige mögliche Ideen: /// tip | Tipp -Konkretere Beispiele hierfür mit Containern gebe ich Ihnen in einem späteren Kapitel: [FastAPI in Containern – Docker](docker.md){.internal-link target=_blank}. +Konkretere Beispiele hierfür mit Containern gebe ich Ihnen in einem späteren Kapitel: [FastAPI in Containern – Docker](docker.md). /// diff --git a/docs/de/docs/deployment/docker.md b/docs/de/docs/deployment/docker.md index 704311b264..ee230d5d13 100644 --- a/docs/de/docs/deployment/docker.md +++ b/docs/de/docs/deployment/docker.md @@ -1,6 +1,6 @@ # FastAPI in Containern – Docker { #fastapi-in-containers-docker } -Beim Deployment von FastAPI-Anwendungen besteht ein gängiger Ansatz darin, ein **Linux-Containerimage** zu erstellen. Normalerweise erfolgt dies mit **Docker**. Sie können dieses Containerimage dann auf eine von mehreren möglichen Arten deployen. +Beim Deployment von FastAPI-Anwendungen besteht ein gängiger Ansatz darin, ein **Linux-Containerimage** zu erstellen. Normalerweise erfolgt dies mit [**Docker**](https://www.docker.com/). Sie können dieses Containerimage dann auf eine von mehreren möglichen Arten deployen. Die Verwendung von Linux-Containern bietet mehrere Vorteile, darunter **Sicherheit**, **Replizierbarkeit**, **Einfachheit** und andere. @@ -60,16 +60,16 @@ Und der **Container** selbst (im Gegensatz zum **Containerimage**) ist die tats Docker ist eines der wichtigsten Tools zum Erstellen und Verwalten von **Containerimages** und **Containern**. -Und es gibt einen öffentlichen Docker Hub mit vorgefertigten **offiziellen Containerimages** für viele Tools, Umgebungen, Datenbanken und Anwendungen. +Und es gibt einen öffentlichen [Docker Hub](https://hub.docker.com/) mit vorgefertigten **offiziellen Containerimages** für viele Tools, Umgebungen, Datenbanken und Anwendungen. -Beispielsweise gibt es ein offizielles Python-Image. +Beispielsweise gibt es ein offizielles [Python-Image](https://hub.docker.com/_/python). Und es gibt viele andere Images für verschiedene Dinge wie Datenbanken, zum Beispiel für: -* PostgreSQL -* MySQL -* MongoDB -* Redis, usw. +* [PostgreSQL](https://hub.docker.com/_/postgres) +* [MySQL](https://hub.docker.com/_/mysql) +* [MongoDB](https://hub.docker.com/_/mongo) +* [Redis](https://hub.docker.com/_/redis), usw. Durch die Verwendung eines vorgefertigten Containerimages ist es sehr einfach, verschiedene Tools zu **kombinieren** und zu verwenden. Zum Beispiel, um eine neue Datenbank auszuprobieren. In den meisten Fällen können Sie die **offiziellen Images** verwenden und diese einfach mit Umgebungsvariablen konfigurieren. @@ -111,7 +111,7 @@ Dies hängt hauptsächlich von dem Tool ab, mit dem Sie diese Anforderungen **in Die gebräuchlichste Methode besteht darin, eine Datei `requirements.txt` mit den Namen der Packages und deren Versionen zu erstellen, eine pro Zeile. -Sie würden natürlich die gleichen Ideen verwenden, die Sie in [Über FastAPI-Versionen](versions.md){.internal-link target=_blank} gelesen haben, um die Versionsbereiche festzulegen. +Sie würden natürlich die gleichen Ideen verwenden, die Sie in [Über FastAPI-Versionen](versions.md) gelesen haben, um die Versionsbereiche festzulegen. Ihre `requirements.txt` könnte beispielsweise so aussehen: @@ -238,7 +238,7 @@ Stellen Sie sicher, dass Sie **immer** die **exec form** der Anweisung `CMD` ver #### `CMD` – Exec Form verwenden { #use-cmd-exec-form } -Die `CMD` Docker-Anweisung kann in zwei Formen geschrieben werden: +Die [`CMD`](https://docs.docker.com/reference/dockerfile/#cmd) Docker-Anweisung kann in zwei Formen geschrieben werden: ✅ **Exec** form: @@ -254,11 +254,11 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] CMD fastapi run app/main.py --port 80 ``` -Achten Sie darauf, stets die **exec** form zu verwenden, um sicherzustellen, dass FastAPI ordnungsgemäß heruntergefahren wird und [Lifespan-Events](../advanced/events.md){.internal-link target=_blank} ausgelöst werden. +Achten Sie darauf, stets die **exec** form zu verwenden, um sicherzustellen, dass FastAPI ordnungsgemäß heruntergefahren wird und [Lifespan-Events](../advanced/events.md) ausgelöst werden. -Sie können mehr darüber in der Docker-Dokumentation für Shell und Exec Form lesen. +Sie können mehr darüber in der [Docker-Dokumentation für Shell und Exec Form lesen](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form). -Dies kann insbesondere bei der Verwendung von `docker compose` deutlich spürbar sein. Sehen Sie sich diesen Abschnitt in der Docker Compose-FAQ für technische Details an: Warum benötigen meine Dienste 10 Sekunden, um neu erstellt oder gestoppt zu werden?. +Dies kann insbesondere bei der Verwendung von `docker compose` deutlich spürbar sein. Sehen Sie sich diesen Abschnitt in der Docker Compose-FAQ für technische Details an: [Warum benötigen meine Dienste 10 Sekunden, um neu erstellt oder gestoppt zu werden?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop). #### Verzeichnisstruktur { #directory-structure } @@ -352,7 +352,7 @@ $ docker run -d --name mycontainer -p 80:80 myimage ## Es testen { #check-it } -Sie sollten es in der URL Ihres Docker-Containers überprüfen können, zum Beispiel: http://192.168.99.100/items/5?q=somequery oder http://127.0.0.1/items/5?q=somequery (oder gleichwertig, unter Verwendung Ihres Docker-Hosts). +Sie sollten es in der URL Ihres Docker-Containers überprüfen können, zum Beispiel: [http://192.168.99.100/items/5?q=somequery](http://192.168.99.100/items/5?q=somequery) oder [http://127.0.0.1/items/5?q=somequery](http://127.0.0.1/items/5?q=somequery) (oder gleichwertig, unter Verwendung Ihres Docker-Hosts). Sie werden etwas sehen wie: @@ -362,17 +362,17 @@ Sie werden etwas sehen wie: ## Interaktive API-Dokumentation { #interactive-api-docs } -Jetzt können Sie auf http://192.168.99.100/docs oder http://127.0.0.1/docs gehen (oder ähnlich, unter Verwendung Ihres Docker-Hosts). +Jetzt können Sie auf [http://192.168.99.100/docs](http://192.168.99.100/docs) oder [http://127.0.0.1/docs](http://127.0.0.1/docs) gehen (oder ähnlich, unter Verwendung Ihres Docker-Hosts). -Sie sehen die automatische interaktive API-Dokumentation (bereitgestellt von Swagger UI): +Sie sehen die automatische interaktive API-Dokumentation (bereitgestellt von [Swagger UI](https://github.com/swagger-api/swagger-ui)): ![Swagger-Oberfläche](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ## Alternative API-Dokumentation { #alternative-api-docs } -Sie können auch auf http://192.168.99.100/redoc oder http://127.0.0.1/redoc gehen (oder ähnlich, unter Verwendung Ihres Docker-Hosts). +Sie können auch auf [http://192.168.99.100/redoc](http://192.168.99.100/redoc) oder [http://127.0.0.1/redoc](http://127.0.0.1/redoc) gehen (oder ähnlich, unter Verwendung Ihres Docker-Hosts). -Sie sehen die alternative automatische Dokumentation (bereitgestellt von ReDoc): +Sie sehen die alternative automatische Dokumentation (bereitgestellt von [ReDoc](https://github.com/Rebilly/ReDoc)): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -413,7 +413,7 @@ Indem Sie die Datei an `fastapi run` übergeben, wird automatisch erkannt, dass ## Deployment-Konzepte { #deployment-concepts } -Lassen Sie uns noch einmal über einige der gleichen [Deployment-Konzepte](concepts.md){.internal-link target=_blank} in Bezug auf Container sprechen. +Lassen Sie uns noch einmal über einige der gleichen [Deployment-Konzepte](concepts.md) in Bezug auf Container sprechen. Container sind hauptsächlich ein Werkzeug, um den Prozess des **Erstellens und Deployments** einer Anwendung zu vereinfachen, sie erzwingen jedoch keinen bestimmten Ansatz für die Handhabung dieser **Deployment-Konzepte**, und es gibt mehrere mögliche Strategien. @@ -432,7 +432,7 @@ Sehen wir uns diese **Deployment-Konzepte** im Hinblick auf Container noch einma Wenn wir uns nur auf das **Containerimage** für eine FastAPI-Anwendung (und später auf den laufenden **Container**) konzentrieren, würde HTTPS normalerweise **extern** von einem anderen Tool verarbeitet. -Es könnte sich um einen anderen Container handeln, zum Beispiel mit Traefik, welcher **HTTPS** und **automatischen** Erwerb von **Zertifikaten** handhabt. +Es könnte sich um einen anderen Container handeln, zum Beispiel mit [Traefik](https://traefik.io/), welcher **HTTPS** und **automatischen** Erwerb von **Zertifikaten** handhabt. /// tip | Tipp @@ -558,7 +558,7 @@ Wenn Sie **mehrere Container** haben, von denen wahrscheinlich jeder einen **ein /// info | Info -Wenn Sie Kubernetes verwenden, wäre dies wahrscheinlich ein Init-Container. +Wenn Sie Kubernetes verwenden, wäre dies wahrscheinlich ein [Init-Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/). /// @@ -570,7 +570,7 @@ Wenn Sie ein einfaches Setup mit einem **einzelnen Container** haben, welcher da ### Docker-Basisimage { #base-docker-image } -Es gab ein offizielles FastAPI-Docker-Image: tiangolo/uvicorn-gunicorn-fastapi. Dieses ist jedoch jetzt deprecatet. ⛔️ +Es gab ein offizielles FastAPI-Docker-Image: [tiangolo/uvicorn-gunicorn-fastapi](https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker). Dieses ist jedoch jetzt deprecatet. ⛔️ Sie sollten wahrscheinlich **nicht** dieses Basis-Docker-Image (oder ein anderes ähnliches) verwenden. @@ -600,7 +600,7 @@ Zum Beispiel: ## Docker-Image mit `uv` { #docker-image-with-uv } -Wenn Sie uv verwenden, um Ihr Projekt zu installieren und zu verwalten, können Sie deren uv-Docker-Leitfaden befolgen. +Wenn Sie [uv](https://github.com/astral-sh/uv) verwenden, um Ihr Projekt zu installieren und zu verwalten, können Sie deren [uv-Docker-Leitfaden](https://docs.astral.sh/uv/guides/integration/docker/) befolgen. ## Zusammenfassung { #recap } diff --git a/docs/de/docs/deployment/fastapicloud.md b/docs/de/docs/deployment/fastapicloud.md index 18c3bb8a44..c77826aafc 100644 --- a/docs/de/docs/deployment/fastapicloud.md +++ b/docs/de/docs/deployment/fastapicloud.md @@ -1,6 +1,6 @@ # FastAPI Cloud { #fastapi-cloud } -Sie können Ihre FastAPI-App in der FastAPI Cloud mit **einem einzigen Befehl** deployen – tragen Sie sich in die Warteliste ein, falls noch nicht geschehen. 🚀 +Sie können Ihre FastAPI-App in der [FastAPI Cloud](https://fastapicloud.com) mit **einem einzigen Befehl** deployen – tragen Sie sich in die Warteliste ein, falls noch nicht geschehen. 🚀 ## Anmelden { #login } @@ -40,7 +40,7 @@ Das war’s! Jetzt können Sie Ihre App unter dieser URL aufrufen. ✨ ## Über FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** wird vom gleichen Autor und Team hinter **FastAPI** entwickelt. +**[FastAPI Cloud](https://fastapicloud.com)** wird vom gleichen Autor und Team hinter **FastAPI** entwickelt. Es vereinfacht den Prozess des **Erstellens**, **Deployens** und **Nutzens** einer API mit minimalem Aufwand. diff --git a/docs/de/docs/deployment/https.md b/docs/de/docs/deployment/https.md index 08963306fb..0f97909c22 100644 --- a/docs/de/docs/deployment/https.md +++ b/docs/de/docs/deployment/https.md @@ -10,7 +10,7 @@ Wenn Sie es eilig haben oder es Ihnen egal ist, fahren Sie mit den nächsten Abs /// -Um **die Grundlagen von HTTPS** aus Sicht des Benutzers zu erlernen, schauen Sie sich https://howhttps.works/ an. +Um **die Grundlagen von HTTPS** aus Sicht des Benutzers zu erlernen, schauen Sie sich [https://howhttps.works/](https://howhttps.works/) an. Aus **Sicht des Entwicklers** sollten Sie beim Nachdenken über HTTPS Folgendes beachten: @@ -28,13 +28,13 @@ Aus **Sicht des Entwicklers** sollten Sie beim Nachdenken über HTTPS Folgendes * **Standardmäßig** bedeutet das, dass Sie nur **ein HTTPS-Zertifikat pro IP-Adresse** haben können. * Ganz gleich, wie groß Ihr Server ist oder wie klein die einzelnen Anwendungen darauf sind. * Hierfür gibt es jedoch eine **Lösung**. -* Es gibt eine **Erweiterung** zum **TLS**-Protokoll (dasjenige, das die Verschlüsselung auf TCP-Ebene, vor HTTP, verwaltet) namens **SNI**. +* Es gibt eine **Erweiterung** zum **TLS**-Protokoll (dasjenige, das die Verschlüsselung auf TCP-Ebene, vor HTTP, verwaltet) namens **[SNI](https://en.wikipedia.org/wiki/Server_Name_Indication)**. * Mit dieser SNI-Erweiterung kann ein einzelner Server (mit einer **einzelnen IP-Adresse**) über **mehrere HTTPS-Zertifikate** verfügen und **mehrere HTTPS-Domains/Anwendungen bereitstellen**. * Damit das funktioniert, muss eine **einzelne** Komponente (Programm), die auf dem Server ausgeführt wird und welche die **öffentliche IP-Adresse** überwacht, **alle HTTPS-Zertifikate** des Servers haben. * **Nachdem** eine sichere Verbindung hergestellt wurde, ist das Kommunikationsprotokoll **immer noch HTTP**. * Die Inhalte sind **verschlüsselt**, auch wenn sie mit dem **HTTP-Protokoll** gesendet werden. -Es ist eine gängige Praxis, **ein Programm/HTTP-Server** auf dem Server (der Maschine, dem Host usw.) laufen zu lassen, welches **alle HTTPS-Aspekte verwaltet**: Empfangen der **verschlüsselten HTTPS-Requests**, Senden der **entschlüsselten HTTP-Requests** an die eigentliche HTTP-Anwendung die auf demselben Server läuft (in diesem Fall die **FastAPI**-Anwendung), entgegennehmen der **HTTP-Response** von der Anwendung, **verschlüsseln derselben** mithilfe des entsprechenden **HTTPS-Zertifikats** und Zurücksenden zum Client über **HTTPS**. Dieser Server wird oft als **TLS-Terminierungsproxy** bezeichnet. +Es ist eine gängige Praxis, **ein Programm/HTTP-Server** auf dem Server (der Maschine, dem Host usw.) laufen zu lassen, welches **alle HTTPS-Aspekte verwaltet**: Empfangen der **verschlüsselten HTTPS-Requests**, Senden der **entschlüsselten HTTP-Requests** an die eigentliche HTTP-Anwendung die auf demselben Server läuft (in diesem Fall die **FastAPI**-Anwendung), entgegennehmen der **HTTP-Response** von der Anwendung, **verschlüsseln derselben** mithilfe des entsprechenden **HTTPS-Zertifikats** und Zurücksenden zum Client über **HTTPS**. Dieser Server wird oft als **[TLS-Terminierungsproxy](https://en.wikipedia.org/wiki/TLS_termination_proxy)** bezeichnet. Einige der Optionen, die Sie als TLS-Terminierungsproxy verwenden können, sind: @@ -49,7 +49,7 @@ Vor Let's Encrypt wurden diese **HTTPS-Zertifikate** von vertrauenswürdigen Dri Der Prozess zum Erwerb eines dieser Zertifikate war früher umständlich, erforderte viel Papierarbeit und die Zertifikate waren ziemlich teuer. -Aber dann wurde **Let's Encrypt** geschaffen. +Aber dann wurde **[Let's Encrypt](https://letsencrypt.org/)** geschaffen. Es ist ein Projekt der Linux Foundation. Es stellt **kostenlose HTTPS-Zertifikate** automatisiert zur Verfügung. Diese Zertifikate nutzen standardmäßig die gesamte kryptografische Sicherheit und sind kurzlebig (circa 3 Monate), sodass die **Sicherheit tatsächlich besser ist**, aufgrund der kürzeren Lebensdauer. @@ -200,9 +200,9 @@ Dieser **Proxy** würde normalerweise unmittelbar vor dem Übermitteln der Anfra Die Proxy-Header sind: -* X-Forwarded-For -* X-Forwarded-Proto -* X-Forwarded-Host +* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For) +* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto) +* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host) /// @@ -218,7 +218,7 @@ Das ist z. B. nützlich, um Redirects**FastAPI Cloud** entwickelt, um das Deployment von FastAPI-Apps in der Cloud so reibungslos wie möglich zu gestalten, mit derselben Developer-Experience wie beim Arbeiten mit FastAPI. +Zum Beispiel haben wir, das Team hinter FastAPI, [**FastAPI Cloud**](https://fastapicloud.com) entwickelt, um das Deployment von FastAPI-Apps in der Cloud so reibungslos wie möglich zu gestalten, mit derselben Developer-Experience wie beim Arbeiten mit FastAPI. Ich zeige Ihnen einige der wichtigsten Konzepte, die Sie beim Deployment einer **FastAPI**-Anwendung wahrscheinlich berücksichtigen sollten (obwohl das meiste davon auch für jede andere Art von Webanwendung gilt). diff --git a/docs/de/docs/deployment/manually.md b/docs/de/docs/deployment/manually.md index 2de2913a50..53fe230e56 100644 --- a/docs/de/docs/deployment/manually.md +++ b/docs/de/docs/deployment/manually.md @@ -1,6 +1,6 @@ # Einen Server manuell ausführen { #run-a-server-manually } -## Den `fastapi run` Befehl verwenden { #use-the-fastapi-run-command } +## Den `fastapi run`-Befehl verwenden { #use-the-fastapi-run-command } Kurz gesagt, nutzen Sie `fastapi run`, um Ihre FastAPI-Anwendung bereitzustellen: @@ -52,11 +52,11 @@ Das Wichtigste, was Sie benötigen, um eine **FastAPI**-Anwendung (oder eine and Es gibt mehrere Alternativen, einschließlich: -* Uvicorn: ein hochperformanter ASGI-Server. -* Hypercorn: ein ASGI-Server, der unter anderem kompatibel mit HTTP/2 und Trio ist. -* Daphne: der für Django Channels entwickelte ASGI-Server. -* Granian: Ein Rust HTTP-Server für Python-Anwendungen. -* NGINX Unit: NGINX Unit ist eine leichte und vielseitige Laufzeitumgebung für Webanwendungen. +* [Uvicorn](https://www.uvicorn.dev/): ein hochperformanter ASGI-Server. +* [Hypercorn](https://hypercorn.readthedocs.io/): ein ASGI-Server, der unter anderem kompatibel mit HTTP/2 und Trio ist. +* [Daphne](https://github.com/django/daphne): der für Django Channels entwickelte ASGI-Server. +* [Granian](https://github.com/emmett-framework/granian): Ein Rust HTTP-Server für Python-Anwendungen. +* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit ist eine leichte und vielseitige Laufzeitumgebung für Webanwendungen. ## Servermaschine und Serverprogramm { #server-machine-and-server-program } @@ -74,7 +74,7 @@ Wenn Sie FastAPI installieren, wird es mit einem Produktionsserver, Uvicorn, gel Aber Sie können auch ein ASGI-Serverprogramm manuell installieren. -Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und dann die Serveranwendung installieren. +Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md) erstellen, sie aktivieren und dann die Serveranwendung installieren. Zum Beispiel, um Uvicorn zu installieren: @@ -94,7 +94,7 @@ Ein ähnlicher Prozess würde für jedes andere ASGI-Serverprogramm gelten. Durch das Hinzufügen von `standard` installiert und verwendet Uvicorn einige empfohlene zusätzliche Abhängigkeiten. -Dazu gehört `uvloop`, der hochperformante Drop-in-Ersatz für `asyncio`, der den großen Nebenläufigkeits-Performanz-Schub bietet. +Dazu gehört `uvloop`, der hochperformante Drop-in-Ersatz für `asyncio`, der den großen Nebenläufigkeits-Leistungsschub bietet. Wenn Sie FastAPI mit etwas wie `pip install "fastapi[standard]"` installieren, erhalten Sie auch `uvicorn[standard]`. diff --git a/docs/de/docs/deployment/server-workers.md b/docs/de/docs/deployment/server-workers.md index fbc9f69067..27ae53f7da 100644 --- a/docs/de/docs/deployment/server-workers.md +++ b/docs/de/docs/deployment/server-workers.md @@ -13,13 +13,13 @@ Bis zu diesem Punkt, in allen Tutorials in der Dokumentation, haben Sie wahrsche Wenn Sie Anwendungen deployen, möchten Sie wahrscheinlich eine gewisse **Replikation von Prozessen**, um **mehrere Kerne** zu nutzen und mehr Requests bearbeiten zu können. -Wie Sie im vorherigen Kapitel über [Deployment-Konzepte](concepts.md){.internal-link target=_blank} gesehen haben, gibt es mehrere Strategien, die Sie anwenden können. +Wie Sie im vorherigen Kapitel über [Deployment-Konzepte](concepts.md) gesehen haben, gibt es mehrere Strategien, die Sie anwenden können. Hier zeige ich Ihnen, wie Sie **Uvicorn** mit **Workerprozessen** verwenden, indem Sie den `fastapi`-Befehl oder den `uvicorn`-Befehl direkt verwenden. /// info | Info -Wenn Sie Container verwenden, beispielsweise mit Docker oder Kubernetes, erzähle ich Ihnen mehr darüber im nächsten Kapitel: [FastAPI in Containern – Docker](docker.md){.internal-link target=_blank}. +Wenn Sie Container verwenden, beispielsweise mit Docker oder Kubernetes, erzähle ich Ihnen mehr darüber im nächsten Kapitel: [FastAPI in Containern – Docker](docker.md). Insbesondere wenn die Anwendung auf **Kubernetes** läuft, werden Sie wahrscheinlich **keine** Worker verwenden wollen, und stattdessen **einen einzelnen Uvicorn-Prozess pro Container** ausführen wollen, aber ich werde Ihnen später in diesem Kapitel mehr darüber erzählen. @@ -126,7 +126,7 @@ In der Liste der Deployment-Konzepte von oben würde die Verwendung von Workern ## Container und Docker { #containers-and-docker } -Im nächsten Kapitel über [FastAPI in Containern – Docker](docker.md){.internal-link target=_blank} werde ich einige Strategien erläutern, die Sie für den Umgang mit den anderen **Deployment-Konzepten** verwenden können. +Im nächsten Kapitel über [FastAPI in Containern – Docker](docker.md) werde ich einige Strategien erläutern, die Sie für den Umgang mit den anderen **Deployment-Konzepten** verwenden können. Ich zeige Ihnen, wie Sie **Ihr eigenes Image von Grund auf erstellen**, um einen einzelnen Uvicorn-Prozess auszuführen. Es ist ein einfacher Vorgang und wahrscheinlich das, was Sie tun möchten, wenn Sie ein verteiltes Containerverwaltungssystem wie **Kubernetes** verwenden. diff --git a/docs/de/docs/deployment/versions.md b/docs/de/docs/deployment/versions.md index d7ecb762e9..e4af5ad964 100644 --- a/docs/de/docs/deployment/versions.md +++ b/docs/de/docs/deployment/versions.md @@ -4,7 +4,7 @@ Es werden regelmäßig neue Funktionen hinzugefügt, Fehler werden regelmäßig behoben und der Code wird weiterhin kontinuierlich verbessert. -Aus diesem Grund sind die aktuellen Versionen immer noch `0.x.x`, was darauf hindeutet, dass jede Version möglicherweise nicht abwärtskompatible Änderungen haben könnte. Dies folgt den Konventionen der semantischen Versionierung. +Aus diesem Grund sind die aktuellen Versionen immer noch `0.x.x`, was darauf hindeutet, dass jede Version möglicherweise nicht abwärtskompatible Änderungen haben könnte. Dies folgt den Konventionen der [Semantische Versionierung](https://semver.org/). Sie können jetzt Produktionsanwendungen mit **FastAPI** erstellen (und das tun Sie wahrscheinlich schon seit einiger Zeit), Sie müssen nur sicherstellen, dass Sie eine Version verwenden, die korrekt mit dem Rest Ihres Codes funktioniert. @@ -34,7 +34,7 @@ Wenn Sie zum Verwalten Ihrer Installationen andere Tools wie `uv`, Poetry, Pipen ## Verfügbare Versionen { #available-versions } -Die verfügbaren Versionen können Sie in den [Versionshinweisen](../release-notes.md){.internal-link target=_blank} einsehen (z. B. um zu überprüfen, welches die neueste Version ist). +Die verfügbaren Versionen können Sie in den [Versionshinweisen](../release-notes.md) einsehen (z. B. um zu überprüfen, welches die neueste Version ist). ## Über Versionen { #about-versions } @@ -66,7 +66,7 @@ Nicht abwärtskompatible Änderungen und neue Funktionen werden in „MINOR“-V Sie sollten Tests für Ihre App hinzufügen. -Mit **FastAPI** ist das sehr einfach (dank Starlette), schauen Sie sich die Dokumentation an: [Testen](../tutorial/testing.md){.internal-link target=_blank} +Mit **FastAPI** ist das sehr einfach (dank Starlette), schauen Sie sich die Dokumentation an: [Testen](../tutorial/testing.md) Nachdem Sie Tests erstellt haben, können Sie die **FastAPI**-Version auf eine neuere Version aktualisieren und sicherstellen, dass Ihr gesamter Code ordnungsgemäß funktioniert, indem Sie Ihre Tests ausführen. diff --git a/docs/de/docs/editor-support.md b/docs/de/docs/editor-support.md new file mode 100644 index 0000000000..97782f54f4 --- /dev/null +++ b/docs/de/docs/editor-support.md @@ -0,0 +1,23 @@ +# Editor-Unterstützung { #editor-support } + +Die offizielle [FastAPI-Erweiterung](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) verbessert Ihren FastAPI-Entwicklungsworkflow mit Pfadoperation-Erkennung und -Navigation sowie FastAPI-Cloud-Deployment und Live-Logstreaming. + +Weitere Details zur Erweiterung finden Sie im README im [GitHub-Repository](https://github.com/fastapi/fastapi-vscode). + +## Einrichtung und Installation { #setup-and-installation } + +Die **FastAPI-Erweiterung** ist sowohl für [VS Code](https://code.visualstudio.com/) als auch für [Cursor](https://www.cursor.com/) verfügbar. Sie kann direkt über das Erweiterungen-Panel in jedem Editor installiert werden, indem Sie nach „FastAPI“ suchen und die von **FastAPI Labs** veröffentlichte Erweiterung auswählen. Die Erweiterung funktioniert auch in browserbasierten Editoren wie [vscode.dev](https://vscode.dev) und [github.dev](https://github.dev). + +### Anwendungserkennung { #application-discovery } + +Standardmäßig erkennt die Erweiterung FastAPI-Anwendungen in Ihrem Workspace automatisch, indem sie nach Dateien sucht, die `FastAPI()` instanziieren. Falls die automatische Erkennung mit Ihrer Projektstruktur nicht funktioniert, können Sie einen Entry-Point über `[tool.fastapi]` in `pyproject.toml` oder die VS-Code-Einstellung `fastapi.entryPoint` in Modulnotation angeben (z. B. `myapp.main:app`). + +## Funktionen { #features } + +- Pfadoperation-Explorer – Eine Baumansicht in der Seitenleiste aller *Pfadoperationen* in Ihrer Anwendung. Klicken Sie, um zu einer beliebigen Route- oder Router-Definition zu springen. +- Routensuche – Suchen Sie nach Pfad, Methode oder Namen mit Ctrl + Shift + E (unter macOS: Cmd + Shift + E). +- CodeLens-Navigation – Anklickbare Links oberhalb von Testclient-Aufrufen (z. B. `client.get('/items')`), die zur passenden Pfadoperation springen und so eine schnelle Navigation zwischen Tests und Implementierung ermöglichen. +- Zu FastAPI Cloud deployen – Deployment Ihrer App mit einem Klick auf [FastAPI Cloud](https://fastapicloud.com/). +- Anwendungslogs streamen – Echtzeit-Logstreaming Ihrer auf FastAPI Cloud deployten Anwendung mit Loglevel-Filterung und Textsuche. + +Wenn Sie sich mit den Funktionen der Erweiterung vertraut machen möchten, können Sie den Erweiterungs‑Walkthrough aufrufen, indem Sie die Befehlspalette öffnen (Ctrl + Shift + P oder unter macOS: Cmd + Shift + P) und „Welcome: Open walkthrough …“ auswählen und anschließend den Walkthrough „Get started with FastAPI“ wählen. diff --git a/docs/de/docs/environment-variables.md b/docs/de/docs/environment-variables.md index 9d8c9f75c5..7bff442cda 100644 --- a/docs/de/docs/environment-variables.md +++ b/docs/de/docs/environment-variables.md @@ -65,9 +65,9 @@ print(f"Hello {name} from Python") /// tip | Tipp -Das zweite Argument von `os.getenv()` ist der Defaultwert, der zurückgegeben wird. +Das zweite Argument von [`os.getenv()`](https://docs.python.org/3.8/library/os.html#os.getenv) ist der Defaultwert, der zurückgegeben wird. -Wenn er nicht angegeben wird, ist er standardmäßig `None`. Hier geben wir `"World"` als den zu verwendenden Defaultwert an. +Wenn er nicht angegeben wird, ist er standardmäßig `None`. Hier geben wir „World“ als den zu verwendenden Defaultwert an. /// @@ -153,7 +153,7 @@ Hello World from Python /// tip | Tipp -Sie können mehr darüber lesen auf The Twelve-Factor App: Config. +Sie können mehr darüber lesen auf [The Twelve-Factor App: Config](https://12factor.net/config). /// @@ -161,9 +161,9 @@ Sie können mehr darüber lesen auf Wikipedia zu Umgebungsvariablen lesen. +Sie können auch mehr darüber in der [Wikipedia zu Umgebungsvariablen](https://en.wikipedia.org/wiki/Environment_variable) lesen. In vielen Fällen ist es nicht sehr offensichtlich, wie Umgebungsvariablen nützlich und sofort anwendbar sein könnten. Aber sie tauchen immer wieder in vielen verschiedenen Szenarien auf, wenn Sie entwickeln, deshalb ist es gut, darüber Bescheid zu wissen. diff --git a/docs/de/docs/fastapi-cli.md b/docs/de/docs/fastapi-cli.md index 86a797a9e6..b34fc4b730 100644 --- a/docs/de/docs/fastapi-cli.md +++ b/docs/de/docs/fastapi-cli.md @@ -1,15 +1,15 @@ # FastAPI CLI { #fastapi-cli } -**FastAPI CLI** ist ein Kommandozeilenprogramm, mit dem Sie Ihre FastAPI-App bereitstellen, Ihr FastAPI-Projekt verwalten und mehr. +**FastAPI CLI** ist ein Kommandozeilenprogramm, mit dem Sie Ihre FastAPI-App bereitstellen, Ihr FastAPI-Projekt verwalten und mehr. -Wenn Sie FastAPI installieren (z. B. mit `pip install "fastapi[standard]"`), wird ein Package namens `fastapi-cli` mitgeliefert, das den Befehl `fastapi` im Terminal bereitstellt. +Wenn Sie FastAPI installieren (z. B. mit `pip install "fastapi[standard]"`), erhalten Sie ein Kommandozeilenprogramm, das Sie im Terminal ausführen können. Um Ihre FastAPI-App für die Entwicklung auszuführen, können Sie den Befehl `fastapi dev` verwenden:
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -46,13 +46,66 @@ $ fastapi dev Uvicorn, einen leistungsstarken, produktionsreifen, ASGI-Server. 😎 +Zusätzlich könnten andere Tools sie nicht finden, z. B. die [VS Code Extension](editor-support.md) oder [FastAPI Cloud](https://fastapicloud.com), daher wird empfohlen, den `entrypoint` in `pyproject.toml` zu verwenden. ## `fastapi dev` { #fastapi-dev } @@ -62,7 +115,7 @@ Standardmäßig ist **Autoreload** aktiviert, das den Server automatisch neu lä ## `fastapi run` { #fastapi-run } -Das Ausführen von `fastapi run` startet FastAPI standardmäßig im Produktionsmodus. +Das Ausführen von `fastapi run` startet FastAPI im Produktionsmodus. Standardmäßig ist **Autoreload** deaktiviert. Es horcht auch auf der IP-Adresse `0.0.0.0`, was alle verfügbaren IP-Adressen bedeutet, so wird es öffentlich zugänglich für jeden, der mit der Maschine kommunizieren kann. So würden Sie es normalerweise in der Produktion ausführen, beispielsweise in einem Container. @@ -70,6 +123,6 @@ In den meisten Fällen würden (und sollten) Sie einen „Terminierungsproxy“ /// tip | Tipp -Sie können mehr darüber in der [Deployment-Dokumentation](deployment/index.md){.internal-link target=_blank} erfahren. +Sie können mehr darüber in der [Deployment-Dokumentation](deployment/index.md) erfahren. /// diff --git a/docs/de/docs/features.md b/docs/de/docs/features.md index 6b7b4c296e..f9a34c40f4 100644 --- a/docs/de/docs/features.md +++ b/docs/de/docs/features.md @@ -6,8 +6,8 @@ ### Basiert auf offenen Standards { #based-on-open-standards } -* OpenAPI für die Erstellung von APIs, inklusive Deklarationen von Pfad-Operationen, Parametern, Requestbodys, Sicherheit, usw. -* Automatische Dokumentation der Datenmodelle mit JSON Schema (da OpenAPI selbst auf JSON Schema basiert). +* [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) für die Erstellung von APIs, inklusive Deklarationen von Pfad-Operationen, Parametern, Requestbodys, Sicherheit, usw. +* Automatische Dokumentation der Datenmodelle mit [**JSON Schema**](https://json-schema.org/) (da OpenAPI selbst auf JSON Schema basiert). * Um diese Standards herum entworfen, nach sorgfältigem Studium. Statt einer nachträglichen Schicht darüber. * Dies ermöglicht auch automatische **Client-Code-Generierung** in vielen Sprachen. @@ -15,11 +15,11 @@ Interaktive API-Dokumentation und erkundbare Web-Benutzeroberflächen. Da das Framework auf OpenAPI basiert, gibt es mehrere Optionen, zwei sind standardmäßig vorhanden. -* Swagger UI, bietet interaktive Erkundung, testen und rufen Sie Ihre API direkt im Webbrowser auf. +* [**Swagger UI**](https://github.com/swagger-api/swagger-ui), bietet interaktive Erkundung, testen und rufen Sie Ihre API direkt im Webbrowser auf. ![Swagger UI Interaktion](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) -* Alternative API-Dokumentation mit ReDoc. +* Alternative API-Dokumentation mit [**ReDoc**](https://github.com/Rebilly/ReDoc). ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) @@ -27,7 +27,7 @@ Interaktive API-Dokumentation und erkundbare Web-Benutzeroberflächen. Da das Fr Alles basiert auf Standard-**Python-Typ**deklarationen (dank Pydantic). Es muss keine neue Syntax gelernt werden, nur standardisiertes modernes Python. -Wenn Sie eine zweiminütige Auffrischung benötigen, wie man Python-Typen verwendet (auch wenn Sie FastAPI nicht benutzen), schauen Sie sich das kurze Tutorial an: [Einführung in Python-Typen](python-types.md){.internal-link target=_blank}. +Wenn Sie eine zweiminütige Auffrischung benötigen, wie man Python-Typen verwendet (auch wenn Sie FastAPI nicht benutzen), schauen Sie sich das kurze Tutorial an: [Einführung in Python-Typen](python-types.md). Sie schreiben Standard-Python mit Typen: @@ -75,7 +75,7 @@ Nimm die Schlüssel-Wert-Paare des `second_user_data` dass die meist genutzte Funktion die „Autovervollständigung“ ist. +In den Python-Entwickler-Umfragen wird klar, [dass die meist genutzte Funktion die „Autovervollständigung“ ist](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features). Das gesamte **FastAPI**-Framework ist darauf ausgelegt, das zu erfüllen. Autovervollständigung funktioniert überall. @@ -83,11 +83,11 @@ Sie werden selten noch mal in der Dokumentation nachschauen müssen. So kann Ihr Editor Sie unterstützen: -* in Visual Studio Code: +* in [Visual Studio Code](https://code.visualstudio.com/): ![Editor Unterstützung](https://fastapi.tiangolo.com/img/vscode-completion.png) -* in PyCharm: +* in [PyCharm](https://www.jetbrains.com/pycharm/): ![Editor Unterstützung](https://fastapi.tiangolo.com/img/pycharm-completion.png) @@ -124,7 +124,7 @@ Sicherheit und Authentifizierung sind integriert. Ohne Kompromisse bei Datenbank Alle in OpenAPI definierten Sicherheitsschemas, inklusive: * HTTP Basic. -* **OAuth2** (auch mit **JWT Tokens**). Siehe dazu das Tutorial zu [OAuth2 mit JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. +* **OAuth2** (auch mit **JWT Tokens**). Siehe dazu das Tutorial zu [OAuth2 mit JWT](tutorial/security/oauth2-jwt.md). * API Schlüssel in: * Headern. * Query-Parametern. @@ -136,7 +136,7 @@ Alles als wiederverwendbare Tools und Komponenten gebaut, die einfach in Ihre Sy ### Dependency Injection { #dependency-injection } -FastAPI enthält ein extrem einfach zu verwendendes, aber extrem mächtiges Dependency Injection System. +FastAPI enthält ein extrem einfach zu verwendendes, aber extrem mächtiges Dependency Injection System. * Selbst Abhängigkeiten können Abhängigkeiten haben, woraus eine Hierarchie oder ein **„Graph“ von Abhängigkeiten** entsteht. * Alles **automatisch gehandhabt** durch das Framework. @@ -159,13 +159,13 @@ Jede Integration wurde so entworfen, dass sie so einfach zu nutzen ist (mit Abh ## Starlette Merkmale { #starlette-features } -**FastAPI** ist vollkommen kompatibel (und basiert auf) Starlette. Das bedeutet, wenn Sie eigenen Starlette Quellcode haben, funktioniert der. +**FastAPI** ist vollkommen kompatibel (und basiert auf) [**Starlette**](https://www.starlette.dev/). Das bedeutet, wenn Sie eigenen Starlette Quellcode haben, funktioniert der. `FastAPI` ist tatsächlich eine Unterklasse von `Starlette`. Wenn Sie also bereits Starlette kennen oder benutzen, das meiste funktioniert genau so. Mit **FastAPI** bekommen Sie alles von **Starlette** (da FastAPI nur Starlette auf Steroiden ist): -* Schwer beeindruckende Performanz. Es ist eines der schnellsten Python-Frameworks, auf Augenhöhe mit **NodeJS** und **Go**. +* Schwer beeindruckende Performanz. Es ist [eines der schnellsten Python-Frameworks, auf Augenhöhe mit **NodeJS** und **Go**](https://github.com/encode/starlette#performance). * **WebSocket**-Unterstützung. * Hintergrundtasks im selben Prozess. * Startup- und Shutdown-Events. @@ -177,7 +177,7 @@ Mit **FastAPI** bekommen Sie alles von **Starlette** (da FastAPI nur Starlette a ## Pydantic Merkmale { #pydantic-features } -**FastAPI** ist vollkommen kompatibel (und basiert auf) Pydantic. Das bedeutet, wenn Sie eigenen Pydantic Quellcode haben, funktioniert der. +**FastAPI** ist vollkommen kompatibel (und basiert auf) [**Pydantic**](https://docs.pydantic.dev/). Das bedeutet, wenn Sie eigenen Pydantic Quellcode haben, funktioniert der. Inklusive externer Bibliotheken, die auf Pydantic basieren, wie ORMs, ODMs für Datenbanken. diff --git a/docs/de/docs/help-fastapi.md b/docs/de/docs/help-fastapi.md index 6cbafca0b4..59dd220745 100644 --- a/docs/de/docs/help-fastapi.md +++ b/docs/de/docs/help-fastapi.md @@ -12,7 +12,7 @@ Und es gibt auch mehrere Möglichkeiten, Hilfe zu bekommen. ## Newsletter abonnieren { #subscribe-to-the-newsletter } -Sie können den (unregelmäßigen) [**FastAPI and friends**-Newsletter](newsletter.md){.internal-link target=_blank} abonnieren, um über folgende Themen informiert zu bleiben: +Sie können den (unregelmäßigen) [**FastAPI and friends**-Newsletter](newsletter.md) abonnieren, um über folgende Themen informiert zu bleiben: * Neuigkeiten über FastAPI und Freunde 🚀 * Anleitungen 📝 @@ -22,17 +22,17 @@ Sie können den (unregelmäßigen) [**FastAPI and friends**-Newsletter](newslett ## FastAPI auf X (Twitter) folgen { #follow-fastapi-on-x-twitter } -Folgen Sie @fastapi auf **X (Twitter)**, um die neuesten Nachrichten über **FastAPI** zu erhalten. 🐦 +[Folgen Sie @fastapi auf **X (Twitter)**](https://x.com/fastapi), um die neuesten Nachrichten über **FastAPI** zu erhalten. 🐦 ## **FastAPI** auf GitHub einen Stern geben { #star-fastapi-in-github } -Sie können FastAPI auf GitHub „starren“ (klicken Sie auf den Stern-Button oben rechts): https://github.com/fastapi/fastapi. ⭐️ +Sie können FastAPI auf GitHub „starren“ (klicken Sie auf den Stern-Button oben rechts): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). ⭐️ Durch das Hinzufügen eines Sterns können andere Benutzer es leichter finden und sehen, dass es für andere bereits nützlich war. ## Das GitHub-Repository auf Releases überwachen { #watch-the-github-repository-for-releases } -Sie können FastAPI auf GitHub „beobachten“ (klicken Sie auf den „watch“-Button oben rechts): https://github.com/fastapi/fastapi. 👀 +Sie können FastAPI auf GitHub „beobachten“ (klicken Sie auf den „watch“-Button oben rechts): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀 Dort können Sie „Releases only“ auswählen. @@ -40,45 +40,45 @@ Auf diese Weise erhalten Sie Benachrichtigungen (per E-Mail), wenn es ein neues ## Mit dem Autor vernetzen { #connect-with-the-author } -Sie können sich mit mir (Sebastián Ramírez / `tiangolo`), dem Autor, vernetzen. +Sie können sich mit [mir (Sebastián Ramírez / `tiangolo`)](https://tiangolo.com), dem Autor, vernetzen. Sie können: -* Mir auf **GitHub** folgen. +* [Mir auf **GitHub** folgen](https://github.com/tiangolo). * Andere Open-Source-Projekte sehen, die ich erstellt habe und die Ihnen helfen könnten. * Mir folgen, um zu sehen, wenn ich ein neues Open-Source-Projekt erstelle. -* Mir auf **X (Twitter)** folgen oder Mastodon. +* [Mir auf **X (Twitter)** folgen](https://x.com/tiangolo) oder [Mastodon](https://fosstodon.org/@tiangolo). * Mir mitteilen, wie Sie FastAPI verwenden (ich höre das gerne). * Mitbekommen, wenn ich Ankündigungen mache oder neue Tools veröffentliche. - * Sie können auch @fastapi auf X (Twitter) folgen (ein separates Konto). -* Mir auf **LinkedIn** folgen. + * Sie können auch [@fastapi auf X (Twitter) folgen](https://x.com/fastapi) (ein separates Konto). +* [Mir auf **LinkedIn** folgen](https://www.linkedin.com/in/tiangolo/). * Mitbekommen, wenn ich Ankündigungen mache oder neue Tools veröffentliche (obwohl ich X (Twitter) häufiger verwende 🤷‍♂). -* Lesen, was ich schreibe (oder mir folgen) auf **Dev.to** oder **Medium**. +* Lesen, was ich schreibe (oder mir folgen) auf [**Dev.to**](https://dev.to/tiangolo) oder [**Medium**](https://medium.com/@tiangolo). * Andere Ideen, Artikel lesen und mehr über die von mir erstellten Tools erfahren. * Mir folgen, um zu lesen, wenn ich etwas Neues veröffentliche. ## Über **FastAPI** tweeten { #tweet-about-fastapi } -Tweeten Sie über **FastAPI** und teilen Sie mir und anderen mit, warum es Ihnen gefällt. 🎉 +[Tweeten Sie über **FastAPI**](https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi) und teilen Sie mir und anderen mit, warum es Ihnen gefällt. 🎉 Ich höre gerne, wie **FastAPI** verwendet wird, was Ihnen daran gefallen hat, in welchem Projekt/Unternehmen Sie es verwenden, usw. ## Für FastAPI abstimmen { #vote-for-fastapi } -* Stimmen Sie für **FastAPI** auf Slant. -* Stimmen Sie für **FastAPI** auf AlternativeTo. -* Sagen Sie auf StackShare, dass Sie **FastAPI** verwenden. +* [Stimmen Sie für **FastAPI** auf Slant](https://www.slant.co/options/34241/~fastapi-review). +* [Stimmen Sie für **FastAPI** auf AlternativeTo](https://alternativeto.net/software/fastapi/about/). +* [Sagen Sie auf StackShare, dass Sie **FastAPI** verwenden](https://stackshare.io/pypi-fastapi). ## Anderen bei Fragen auf GitHub helfen { #help-others-with-questions-in-github } Sie können versuchen, anderen bei ihren Fragen zu helfen: -* GitHub-Diskussionen -* GitHub-Issues +* [GitHub-Diskussionen](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered) +* [GitHub-Issues](https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+) In vielen Fällen kennen Sie möglicherweise bereits die Antwort auf diese Fragen. 🤓 -Wenn Sie vielen Menschen bei ihren Fragen helfen, werden Sie offizieller [FastAPI-Experte](fastapi-people.md#fastapi-experts){.internal-link target=_blank}. 🎉 +Wenn Sie vielen Menschen bei ihren Fragen helfen, werden Sie offizieller [FastAPI-Experte](fastapi-people.md#fastapi-experts). 🎉 Denken Sie daran, der wichtigste Punkt ist: Versuchen Sie, freundlich zu sein. Die Leute bringen ihre Frustrationen mit und fragen in vielen Fällen nicht auf die beste Art und Weise, aber versuchen Sie dennoch so gut wie möglich, freundlich zu sein. 🤗 @@ -104,7 +104,7 @@ In den meisten Fällen und bei den meisten Fragen gibt es etwas in Bezug auf den In vielen Fällen wird nur ein Fragment des Codes gepostet, aber das reicht nicht aus, um **das Problem zu reproduzieren**. -* Sie können die Person bitten, ein minimales, reproduzierbares Beispiel bereitzustellen, welches Sie **kopieren, einfügen** und lokal ausführen können, um den gleichen Fehler oder das gleiche Verhalten zu sehen, das die Person sieht, oder um ihren Anwendungsfall besser zu verstehen. +* Sie können die Person bitten, ein [minimales, reproduzierbares Beispiel](https://stackoverflow.com/help/minimal-reproducible-example) bereitzustellen, welches Sie **kopieren, einfügen** und lokal ausführen können, um den gleichen Fehler oder das gleiche Verhalten zu sehen, das die Person sieht, oder um ihren Anwendungsfall besser zu verstehen. * Wenn Sie in Geberlaune sind, können Sie ein solches Beispiel selbst erstellen, nur basierend auf der Beschreibung des Problems. Denken Sie jedoch daran, dass dies viel Zeit in Anspruch nehmen kann und dass es besser sein kann, zunächst um eine Klärung des Problems zu bitten. @@ -125,7 +125,7 @@ Wenn die Person antwortet, besteht eine hohe Chance, dass Sie ihr Problem gelös ## Das GitHub-Repository beobachten { #watch-the-github-repository } -Sie können FastAPI auf GitHub „beobachten“ (klicken Sie auf den „watch“-Button oben rechts): https://github.com/fastapi/fastapi. 👀 +Sie können FastAPI auf GitHub „beobachten“ (klicken Sie auf den „watch“-Button oben rechts): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀 Wenn Sie dann „Watching“ statt „Releases only“ auswählen, erhalten Sie Benachrichtigungen, wenn jemand ein neues Issue eröffnet oder eine neue Frage stellt. Sie können auch spezifizieren, dass Sie nur über neue Issues, Diskussionen, PRs usw. benachrichtigt werden möchten. @@ -133,7 +133,7 @@ Dann können Sie versuchen, bei der Lösung solcher Fragen zu helfen. ## Fragen stellen { #ask-questions } -Sie können im GitHub-Repository eine neue Frage erstellen, zum Beispiel: +Sie können im GitHub-Repository [eine neue Frage erstellen](https://github.com/fastapi/fastapi/discussions/new?category=questions), zum Beispiel: * Stellen Sie eine **Frage** oder bitten Sie um Hilfe mit einem **Problem**. * Schlagen Sie eine neue **Funktionalität** vor. @@ -196,13 +196,13 @@ Daher ist es wirklich wichtig, dass Sie den Code wirklich lesen und ausführen u ## Einen Pull Request erstellen { #create-a-pull-request } -Sie können [zum Quellcode mit Pull Requests beitragen](contributing.md){.internal-link target=_blank}, zum Beispiel: +Sie können [zum Quellcode mit Pull Requests beitragen](contributing.md), zum Beispiel: * Um einen Tippfehler zu beheben, den Sie in der Dokumentation gefunden haben. -* Um einen Artikel, ein Video oder einen Podcast über FastAPI zu teilen, den Sie erstellt oder gefunden haben, indem Sie diese Datei bearbeiten. +* Um einen Artikel, ein Video oder einen Podcast über FastAPI zu teilen, den Sie erstellt oder gefunden haben, indem Sie [diese Datei bearbeiten](https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml). * Stellen Sie sicher, dass Sie Ihren Link am Anfang des entsprechenden Abschnitts einfügen. -* Um zu helfen, [die Dokumentation in Ihre Sprache zu übersetzen](contributing.md#translations){.internal-link target=_blank}. - * Sie können auch dabei helfen, die von anderen erstellten Übersetzungen zu überprüfen (Review). +* Um zu helfen, [die Dokumentation in Ihre Sprache zu übersetzen](contributing.md#translations). + * Sie können auch dabei helfen, die von anderen erstellten Übersetzungen zu überprüfen. * Um neue Dokumentationsabschnitte vorzuschlagen. * Um ein bestehendes Problem/Bug zu beheben. * Stellen Sie sicher, dass Sie Tests hinzufügen. @@ -218,8 +218,8 @@ Es gibt viel zu tun, und das meiste davon können **SIE** tun. Die Hauptaufgaben, die Sie jetzt erledigen können, sind: -* [Anderen bei Fragen auf GitHub helfen](#help-others-with-questions-in-github){.internal-link target=_blank} (siehe Abschnitt oben). -* [Pull Requests prüfen](#review-pull-requests){.internal-link target=_blank} (siehe Abschnitt oben). +* [Anderen bei Fragen auf GitHub helfen](#help-others-with-questions-in-github) (siehe Abschnitt oben). +* [Pull Requests prüfen](#review-pull-requests) (siehe Abschnitt oben). Diese beiden Aufgaben sind die Dinge, die **am meisten Zeit verbrauchen**. Das ist die Hauptarbeit bei der Wartung von FastAPI. @@ -227,11 +227,11 @@ Wenn Sie mir dabei helfen können, **helfen Sie mir, FastAPI zu pflegen** und Si ## Am Chat teilnehmen { #join-the-chat } -Treten Sie dem 👥 Discord-Chatserver 👥 bei und treffen Sie sich mit anderen Mitgliedern der FastAPI-Community. +Treten Sie dem 👥 [Discord-Chatserver](https://discord.gg/VQjSZaeJmf) 👥 bei und treffen Sie sich mit anderen Mitgliedern der FastAPI-Community. /// tip | Tipp -Bei Fragen stellen Sie sie in GitHub-Diskussionen, dort besteht eine viel größere Chance, dass Sie Hilfe von den [FastAPI-Experten](fastapi-people.md#fastapi-experts){.internal-link target=_blank} erhalten. +Bei Fragen stellen Sie sie in [GitHub-Diskussionen](https://github.com/fastapi/fastapi/discussions/new?category=questions), dort besteht eine viel größere Chance, dass Sie Hilfe von den [FastAPI-Experten](fastapi-people.md#fastapi-experts) erhalten. Nutzen Sie den Chat nur für andere allgemeine Gespräche. @@ -243,13 +243,13 @@ Bedenken Sie, dass Sie in Chats, die „freie Konversation“ erlauben, leicht F Auf GitHub hilft Ihnen die Vorlage dabei, die richtige Frage zu stellen, sodass Sie leichter eine gute Antwort erhalten können, oder sogar das Problem selbst lösen, bevor Sie überhaupt fragen. Und auf GitHub kann ich sicherstellen, dass ich immer alles beantworte, auch wenn es einige Zeit dauert. Persönlich kann ich das mit den Chat-Systemen nicht machen. 😅 -Unterhaltungen in den Chat-Systemen sind auch nicht so leicht durchsuchbar wie auf GitHub, sodass Fragen und Antworten möglicherweise im Gespräch verloren gehen. Und nur die auf GitHub machen einen [FastAPI-Experten](fastapi-people.md#fastapi-experts){.internal-link target=_blank}, Sie werden also höchstwahrscheinlich mehr Aufmerksamkeit auf GitHub erhalten. +Unterhaltungen in den Chat-Systemen sind auch nicht so leicht durchsuchbar wie auf GitHub, sodass Fragen und Antworten möglicherweise im Gespräch verloren gehen. Und nur die auf GitHub machen einen [FastAPI-Experten](fastapi-people.md#fastapi-experts), Sie werden also höchstwahrscheinlich mehr Aufmerksamkeit auf GitHub erhalten. Auf der anderen Seite gibt es Tausende von Benutzern in den Chat-Systemen, sodass die Wahrscheinlichkeit hoch ist, dass Sie dort fast immer jemanden zum Reden finden. 😄 ## Den Autor sponsern { #sponsor-the-author } -Wenn Ihr **Produkt/Firma** auf **FastAPI** angewiesen ist oder in Zusammenhang steht und Sie seine Benutzer erreichen möchten, können Sie den Autor (mich) über GitHub-Sponsoren unterstützen. Je nach Stufe können Sie einige zusätzliche Vorteile erhalten, wie z. B. ein Abzeichen in der Dokumentation. 🎁 +Wenn Ihr **Produkt/Firma** auf **FastAPI** angewiesen ist oder in Zusammenhang steht und Sie seine Benutzer erreichen möchten, können Sie den Autor (mich) über [GitHub-Sponsoren](https://github.com/sponsors/tiangolo) unterstützen. Je nach Stufe können Sie einige zusätzliche Vorteile erhalten, wie z. B. ein Abzeichen in der Dokumentation. 🎁 --- diff --git a/docs/de/docs/history-design-future.md b/docs/de/docs/history-design-future.md index 0217f42768..5984274dba 100644 --- a/docs/de/docs/history-design-future.md +++ b/docs/de/docs/history-design-future.md @@ -1,6 +1,6 @@ # Geschichte, Design und Zukunft { #history-design-and-future } -Vor einiger Zeit fragte ein **FastAPI**-Benutzer: +Vor einiger Zeit fragte [ein **FastAPI**-Benutzer](https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920): > Was ist die Geschichte dieses Projekts? Es scheint aus dem Nichts in ein paar Wochen zu etwas Großartigem geworden zu sein [...] @@ -14,7 +14,7 @@ Dabei musste ich viele Alternativen untersuchen, testen und nutzen. Die Geschichte von **FastAPI** ist zu einem großen Teil die Geschichte seiner Vorgänger. -Wie im Abschnitt [Alternativen](alternatives.md){.internal-link target=_blank} gesagt: +Wie im Abschnitt [Alternativen](alternatives.md) gesagt:
@@ -44,7 +44,7 @@ Dann habe ich einige Zeit damit verbracht, die Entwickler-„API“ zu entwerfen Ich habe mehrere Ideen in den beliebtesten Python-Editoren getestet: PyCharm, VS Code, Jedi-basierte Editoren. -Laut der letzten Python-Entwickler-Umfrage deckt das etwa 80 % der Benutzer ab. +Laut der letzten [Python-Entwickler-Umfrage](https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools) deckt das etwa 80 % der Benutzer ab. Das bedeutet, dass **FastAPI** speziell mit den Editoren getestet wurde, die von 80 % der Python-Entwickler verwendet werden. Und da die meisten anderen Editoren in der Regel ähnlich funktionieren, sollten alle diese Vorteile für praktisch alle Editoren funktionieren. @@ -54,11 +54,11 @@ Alles auf eine Weise, die allen Entwicklern das beste Entwicklungserlebnis bot. ## Anforderungen { #requirements } -Nachdem ich mehrere Alternativen getestet hatte, entschied ich, dass ich **Pydantic** wegen seiner Vorteile verwenden würde. +Nachdem ich mehrere Alternativen getestet hatte, entschied ich, dass ich [**Pydantic**](https://docs.pydantic.dev/) wegen seiner Vorteile verwenden würde. Dann habe ich zu dessen Code beigetragen, um es vollständig mit JSON Schema kompatibel zu machen, und so verschiedene Möglichkeiten zum Definieren von einschränkenden Deklarationen (Constraints) zu unterstützen, und die Editorunterstützung (Typprüfungen, Codevervollständigung) zu verbessern, basierend auf den Tests in mehreren Editoren. -Während der Entwicklung habe ich auch zu **Starlette** beigetragen, die andere Schlüsselanforderung. +Während der Entwicklung habe ich auch zu [**Starlette**](https://www.starlette.dev/) beigetragen, die andere Schlüsselanforderung. ## Entwicklung { #development } @@ -76,4 +76,4 @@ Dennoch stehen uns noch viele Verbesserungen und Funktionen bevor. **FastAPI** hat eine große Zukunft vor sich. -Und [Ihre Hilfe](help-fastapi.md){.internal-link target=_blank} wird sehr geschätzt. +Und [Ihre Hilfe](help-fastapi.md) wird sehr geschätzt. diff --git a/docs/de/docs/how-to/authentication-error-status-code.md b/docs/de/docs/how-to/authentication-error-status-code.md index 2d54926ff8..02acef9f1d 100644 --- a/docs/de/docs/how-to/authentication-error-status-code.md +++ b/docs/de/docs/how-to/authentication-error-status-code.md @@ -2,7 +2,7 @@ Vor FastAPI-Version `0.122.0` verwendeten die integrierten Sicherheits-Utilities den HTTP-Statuscode `403 Forbidden`, wenn sie dem Client nach einer fehlgeschlagenen Authentifizierung einen Fehler zurückgaben. -Ab FastAPI-Version `0.122.0` verwenden sie den passenderen HTTP-Statuscode `401 Unauthorized` und geben in der Response einen sinnvollen `WWW-Authenticate`-Header zurück, gemäß den HTTP-Spezifikationen, RFC 7235, RFC 9110. +Ab FastAPI-Version `0.122.0` verwenden sie den passenderen HTTP-Statuscode `401 Unauthorized` und geben in der Response einen sinnvollen `WWW-Authenticate`-Header zurück, gemäß den HTTP-Spezifikationen, [RFC 7235](https://datatracker.ietf.org/doc/html/rfc7235#section-3.1), [RFC 9110](https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized). Aber falls Ihre Clients aus irgendeinem Grund vom alten Verhalten abhängen, können Sie darauf zurückgreifen, indem Sie in Ihren Sicherheitsklassen die Methode `make_not_authenticated_error` überschreiben. diff --git a/docs/de/docs/how-to/conditional-openapi.md b/docs/de/docs/how-to/conditional-openapi.md index 07573f01f9..dc873c9c93 100644 --- a/docs/de/docs/how-to/conditional-openapi.md +++ b/docs/de/docs/how-to/conditional-openapi.md @@ -10,7 +10,7 @@ Dadurch wird Ihrer API keine zusätzliche Sicherheit hinzugefügt, die *Pfadoper Wenn Ihr Code eine Sicherheitslücke aufweist, ist diese weiterhin vorhanden. -Das Verstecken der Dokumentation macht es nur schwieriger zu verstehen, wie mit Ihrer API interagiert werden kann, und könnte es auch schwieriger machen, diese in der Produktion zu debuggen. Man könnte es einfach als eine Form von Sicherheit durch Verschleierung betrachten. +Das Verstecken der Dokumentation macht es nur schwieriger zu verstehen, wie mit Ihrer API interagiert werden kann, und könnte es auch schwieriger machen, diese in der Produktion zu debuggen. Man könnte es einfach als eine Form von [Sicherheit durch Verschleierung](https://en.wikipedia.org/wiki/Security_through_obscurity) betrachten. Wenn Sie Ihre API sichern möchten, gibt es mehrere bessere Dinge, die Sie tun können, zum Beispiel: diff --git a/docs/de/docs/how-to/configure-swagger-ui.md b/docs/de/docs/how-to/configure-swagger-ui.md index efb57339c5..2f8904be7f 100644 --- a/docs/de/docs/how-to/configure-swagger-ui.md +++ b/docs/de/docs/how-to/configure-swagger-ui.md @@ -1,6 +1,6 @@ # Swagger-Oberfläche konfigurieren { #configure-swagger-ui } -Sie können einige zusätzliche Parameter der Swagger-Oberfläche konfigurieren. +Sie können einige zusätzliche [Parameter der Swagger-Oberfläche](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/) konfigurieren. Um diese zu konfigurieren, übergeben Sie das Argument `swagger_ui_parameters` beim Erstellen des `FastAPI()`-App-Objekts oder an die Funktion `get_swagger_ui_html()`. @@ -50,7 +50,7 @@ Um beispielsweise `deepLinking` zu deaktivieren, könnten Sie folgende Einstellu ## Andere Parameter der Swagger-Oberfläche { #other-swagger-ui-parameters } -Um alle anderen möglichen Konfigurationen zu sehen, die Sie verwenden können, lesen Sie die offizielle Dokumentation für die Parameter der Swagger-Oberfläche. +Um alle anderen möglichen Konfigurationen zu sehen, die Sie verwenden können, lesen Sie die offizielle [Dokumentation für die Parameter der Swagger-Oberfläche](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/). ## Nur-JavaScript-Einstellungen { #javascript-only-settings } diff --git a/docs/de/docs/how-to/custom-docs-ui-assets.md b/docs/de/docs/how-to/custom-docs-ui-assets.md index a34a21a31d..c88b09d06d 100644 --- a/docs/de/docs/how-to/custom-docs-ui-assets.md +++ b/docs/de/docs/how-to/custom-docs-ui-assets.md @@ -2,27 +2,27 @@ Die API-Dokumentation verwendet **Swagger UI** und **ReDoc**, und jede dieser Dokumentationen benötigt einige JavaScript- und CSS-Dateien. -Standardmäßig werden diese Dateien von einem CDN bereitgestellt. +Standardmäßig werden diese Dateien von einem CDN bereitgestellt. Es ist jedoch möglich, das anzupassen, ein bestimmtes CDN festzulegen oder die Dateien selbst bereitzustellen. ## Benutzerdefiniertes CDN für JavaScript und CSS { #custom-cdn-for-javascript-and-css } -Nehmen wir an, Sie möchten ein anderes CDN verwenden, zum Beispiel möchten Sie `https://unpkg.com/` verwenden. +Nehmen wir an, Sie möchten ein anderes CDN verwenden, zum Beispiel möchten Sie `https://unpkg.com/` verwenden. Das kann nützlich sein, wenn Sie beispielsweise in einem Land leben, in dem bestimmte URLs eingeschränkt sind. -### Die automatischen Dokumentationen deaktivieren { #disable-the-automatic-docs } +### Die automatische Dokumentation deaktivieren { #disable-the-automatic-docs } -Der erste Schritt besteht darin, die automatischen Dokumentationen zu deaktivieren, da diese standardmäßig das Standard-CDN verwenden. +Der erste Schritt besteht darin, die automatische Dokumentation zu deaktivieren, da sie standardmäßig das Standard-CDN verwendet. -Um diese zu deaktivieren, setzen Sie deren URLs beim Erstellen Ihrer `FastAPI`-App auf `None`: +Um sie zu deaktivieren, setzen Sie deren URLs beim Erstellen Ihrer `FastAPI`-App auf `None`: {* ../../docs_src/custom_docs_ui/tutorial001_py310.py hl[8] *} -### Die benutzerdefinierten Dokumentationen hinzufügen { #include-the-custom-docs } +### Die benutzerdefinierte Dokumentation hinzufügen { #include-the-custom-docs } -Jetzt können Sie die *Pfadoperationen* für die benutzerdefinierten Dokumentationen erstellen. +Jetzt können Sie die *Pfadoperationen* für die benutzerdefinierte Dokumentation erstellen. Sie können die internen Funktionen von FastAPI wiederverwenden, um die HTML-Seiten für die Dokumentation zu erstellen und ihnen die erforderlichen Argumente zu übergeben: @@ -54,7 +54,7 @@ Um nun testen zu können, ob alles funktioniert, erstellen Sie eine *Pfadoperati ### Es testen { #test-it } -Jetzt sollten Sie in der Lage sein, zu Ihrer Dokumentation auf http://127.0.0.1:8000/docs zu gehen und die Seite neu zu laden, die Assets werden nun vom neuen CDN geladen. +Jetzt sollten Sie in der Lage sein, zu Ihrer Dokumentation auf [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) zu gehen und die Seite neu zu laden, die Assets werden nun vom neuen CDN geladen. ## JavaScript und CSS für die Dokumentation selbst hosten { #self-hosting-javascript-and-css-for-docs } @@ -93,12 +93,12 @@ Sie können wahrscheinlich mit der rechten Maustaste auf jeden Link klicken und **Swagger UI** verwendet folgende Dateien: -* `swagger-ui-bundle.js` -* `swagger-ui.css` +* [`swagger-ui-bundle.js`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js) +* [`swagger-ui.css`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css) Und **ReDoc** verwendet diese Datei: -* `redoc.standalone.js` +* [`redoc.standalone.js`](https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js) Danach könnte Ihre Dateistruktur wie folgt aussehen: @@ -122,7 +122,7 @@ Danach könnte Ihre Dateistruktur wie folgt aussehen: ### Die statischen Dateien testen { #test-the-static-files } -Starten Sie Ihre Anwendung und gehen Sie auf http://127.0.0.1:8000/static/redoc.standalone.js. +Starten Sie Ihre Anwendung und gehen Sie auf [http://127.0.0.1:8000/static/redoc.standalone.js](http://127.0.0.1:8000/static/redoc.standalone.js). Sie sollten eine sehr lange JavaScript-Datei für **ReDoc** sehen. @@ -138,19 +138,19 @@ Das zeigt, dass Sie statische Dateien aus Ihrer Anwendung bereitstellen können Jetzt können wir die Anwendung so konfigurieren, dass sie diese statischen Dateien für die Dokumentation verwendet. -### Die automatischen Dokumentationen für statische Dateien deaktivieren { #disable-the-automatic-docs-for-static-files } +### Die automatische Dokumentation für statische Dateien deaktivieren { #disable-the-automatic-docs-for-static-files } -Wie bei der Verwendung eines benutzerdefinierten CDN besteht der erste Schritt darin, die automatischen Dokumentationen zu deaktivieren, da diese standardmäßig das CDN verwenden. +Wie bei der Verwendung eines benutzerdefinierten CDN besteht der erste Schritt darin, die automatische Dokumentation zu deaktivieren, da sie standardmäßig das CDN verwendet. Um sie zu deaktivieren, setzen Sie deren URLs beim Erstellen Ihrer `FastAPI`-App auf `None`: {* ../../docs_src/custom_docs_ui/tutorial002_py310.py hl[9] *} -### Die benutzerdefinierten Dokumentationen für statische Dateien hinzufügen { #include-the-custom-docs-for-static-files } +### Die benutzerdefinierte Dokumentation für statische Dateien hinzufügen { #include-the-custom-docs-for-static-files } -Und genau wie bei einem benutzerdefinierten CDN können Sie jetzt die *Pfadoperationen* für die benutzerdefinierten Dokumentationen erstellen. +Und genau wie bei einem benutzerdefinierten CDN können Sie jetzt die *Pfadoperationen* für die benutzerdefinierte Dokumentation erstellen. -Auch hier können Sie die internen Funktionen von FastAPI wiederverwenden, um die HTML-Seiten für die Dokumentationen zu erstellen und ihnen die erforderlichen Argumente zu übergeben: +Auch hier können Sie die internen Funktionen von FastAPI wiederverwenden, um die HTML-Seiten für die Dokumentation zu erstellen und ihnen die erforderlichen Argumente zu übergeben: * `openapi_url`: die URL, unter der die HTML-Seite für die Dokumentation das OpenAPI-Schema für Ihre API abrufen kann. Sie können hier das Attribut `app.openapi_url` verwenden. * `title`: der Titel Ihrer API. @@ -180,6 +180,6 @@ Um nun testen zu können, ob alles funktioniert, erstellen Sie eine *Pfadoperati ### Benutzeroberfläche mit statischen Dateien testen { #test-static-files-ui } -Jetzt sollten Sie in der Lage sein, Ihr WLAN zu trennen, gehen Sie zu Ihrer Dokumentation unter http://127.0.0.1:8000/docs und laden Sie die Seite neu. +Jetzt sollten Sie in der Lage sein, Ihr WLAN zu trennen, gehen Sie zu Ihrer Dokumentation unter [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) und laden Sie die Seite neu. Und selbst ohne Internet können Sie die Dokumentation für Ihre API sehen und mit ihr interagieren. diff --git a/docs/de/docs/how-to/custom-request-and-route.md b/docs/de/docs/how-to/custom-request-and-route.md index 017de20967..5e2dee95d3 100644 --- a/docs/de/docs/how-to/custom-request-and-route.md +++ b/docs/de/docs/how-to/custom-request-and-route.md @@ -18,7 +18,7 @@ Wenn Sie gerade erst mit **FastAPI** beginnen, möchten Sie diesen Abschnitt vie Einige Anwendungsfälle sind: -* Konvertieren von Nicht-JSON-Requestbodys nach JSON (z. B. `msgpack`). +* Konvertieren von Nicht-JSON-Requestbodys nach JSON (z. B. [`msgpack`](https://msgpack.org/index.html)). * Dekomprimierung gzip-komprimierter Requestbodys. * Automatisches Loggen aller Requestbodys. @@ -32,7 +32,7 @@ Und eine `APIRoute`-Unterklasse zur Verwendung dieser benutzerdefinierten Reques /// tip | Tipp -Dies ist nur ein einfaches Beispiel, um zu demonstrieren, wie es funktioniert. Wenn Sie Gzip-Unterstützung benötigen, können Sie die bereitgestellte [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware){.internal-link target=_blank} verwenden. +Dies ist nur ein einfaches Beispiel, um zu demonstrieren, wie es funktioniert. Wenn Sie Gzip-Unterstützung benötigen, können Sie die bereitgestellte [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware) verwenden. /// @@ -66,7 +66,7 @@ Das `scope`-`dict` und die `receive`-Funktion sind beide Teil der ASGI-Spezifika Und diese beiden Dinge, `scope` und `receive`, werden benötigt, um eine neue `Request`-Instanz zu erstellen. -Um mehr über den `Request` zu erfahren, schauen Sie sich Starlettes Dokumentation zu Requests an. +Um mehr über den `Request` zu erfahren, schauen Sie sich [Starlettes Dokumentation zu Requests](https://www.starlette.dev/requests/) an. /// @@ -82,7 +82,7 @@ Aufgrund unserer Änderungen in `GzipRequest.body` wird der Requestbody jedoch b /// tip | Tipp -Um dasselbe Problem zu lösen, ist es wahrscheinlich viel einfacher, den `body` in einem benutzerdefinierten Handler für `RequestValidationError` zu verwenden ([Fehlerbehandlung](../tutorial/handling-errors.md#use-the-requestvalidationerror-body){.internal-link target=_blank}). +Um dasselbe Problem zu lösen, ist es wahrscheinlich viel einfacher, den `body` in einem benutzerdefinierten Handler für `RequestValidationError` zu verwenden ([Fehlerbehandlung](../tutorial/handling-errors.md#use-the-requestvalidationerror-body)). Dieses Beispiel ist jedoch immer noch gültig und zeigt, wie mit den internen Komponenten interagiert wird. diff --git a/docs/de/docs/how-to/extending-openapi.md b/docs/de/docs/how-to/extending-openapi.md index d23dc4df0d..8005344c8d 100644 --- a/docs/de/docs/how-to/extending-openapi.md +++ b/docs/de/docs/how-to/extending-openapi.md @@ -37,7 +37,7 @@ Der Parameter `summary` ist in OpenAPI 3.1.0 und höher verfügbar und wird von Mithilfe der oben genannten Informationen können Sie dieselbe Hilfsfunktion verwenden, um das OpenAPI-Schema zu generieren und jeden benötigten Teil zu überschreiben. -Fügen wir beispielsweise ReDocs OpenAPI-Erweiterung zum Einbinden eines benutzerdefinierten Logos hinzu. +Fügen wir beispielsweise [ReDocs OpenAPI-Erweiterung zum Einbinden eines benutzerdefinierten Logos](https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo) hinzu. ### Normales **FastAPI** { #normal-fastapi } @@ -75,6 +75,6 @@ Jetzt können Sie die Methode `.openapi()` durch Ihre neue Funktion ersetzen. ### Es testen { #check-it } -Sobald Sie auf http://127.0.0.1:8000/redoc gehen, werden Sie sehen, dass Ihr benutzerdefiniertes Logo verwendet wird (in diesem Beispiel das Logo von **FastAPI**): +Sobald Sie auf [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) gehen, werden Sie sehen, dass Ihr benutzerdefiniertes Logo verwendet wird (in diesem Beispiel das Logo von **FastAPI**): diff --git a/docs/de/docs/how-to/general.md b/docs/de/docs/how-to/general.md index 0045eab749..593b79d3b4 100644 --- a/docs/de/docs/how-to/general.md +++ b/docs/de/docs/how-to/general.md @@ -4,36 +4,40 @@ Hier finden Sie mehrere Verweise auf andere Stellen in der Dokumentation, für a ## Daten filtern – Sicherheit { #filter-data-security } -Um sicherzustellen, dass Sie nicht mehr Daten zurückgeben, als Sie sollten, lesen Sie die Dokumentation unter [Tutorial – Responsemodell – Rückgabetyp](../tutorial/response-model.md){.internal-link target=_blank}. +Um sicherzustellen, dass Sie nicht mehr Daten zurückgeben, als Sie sollten, lesen Sie die Dokumentation unter [Tutorial – Responsemodell – Rückgabetyp](../tutorial/response-model.md). + +## Response-Leistung optimieren – Responsemodell – Rückgabetyp { #optimize-response-performance-response-model-return-type } + +Um die Leistung beim Zurückgeben von JSON-Daten zu optimieren, verwenden Sie einen Rückgabetyp oder ein Responsemodell. So übernimmt Pydantic die Serialisierung zu JSON auf der Rust-Seite, ohne den Umweg über Python. Mehr dazu in der Dokumentation unter [Tutorial – Responsemodell – Rückgabetyp](../tutorial/response-model.md). ## Dokumentations-Tags – OpenAPI { #documentation-tags-openapi } -Um Tags zu Ihren *Pfadoperationen* hinzuzufügen und diese in der Oberfläche der Dokumentation zu gruppieren, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Tags](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank}. +Um Tags zu Ihren *Pfadoperationen* hinzuzufügen und diese in der Oberfläche der Dokumentation zu gruppieren, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Tags](../tutorial/path-operation-configuration.md#tags). ## Zusammenfassung und Beschreibung in der Dokumentation – OpenAPI { #documentation-summary-and-description-openapi } -Um Ihren *Pfadoperationen* eine Zusammenfassung und Beschreibung hinzuzufügen und diese in der Oberfläche der Dokumentation anzuzeigen, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Zusammenfassung und Beschreibung](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank}. +Um Ihren *Pfadoperationen* eine Zusammenfassung und Beschreibung hinzuzufügen und diese in der Oberfläche der Dokumentation anzuzeigen, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Zusammenfassung und Beschreibung](../tutorial/path-operation-configuration.md#summary-and-description). ## Beschreibung der Response in der Dokumentation – OpenAPI { #documentation-response-description-openapi } -Um die Beschreibung der Response zu definieren, welche in der Oberfläche der Dokumentation angezeigt wird, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Beschreibung der Response](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank}. +Um die Beschreibung der Response zu definieren, welche in der Oberfläche der Dokumentation angezeigt wird, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Beschreibung der Response](../tutorial/path-operation-configuration.md#response-description). ## *Pfadoperation* in der Dokumentation deprecaten – OpenAPI { #documentation-deprecate-a-path-operation-openapi } -Um eine *Pfadoperation* zu deprecaten und das in der Oberfläche der Dokumentation anzuzeigen, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Deprecaten](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank}. +Um eine *Pfadoperation* zu deprecaten und das in der Oberfläche der Dokumentation anzuzeigen, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Deprecaten](../tutorial/path-operation-configuration.md#deprecate-a-path-operation). ## Daten in etwas JSON-kompatibles konvertieren { #convert-any-data-to-json-compatible } -Um Daten in etwas JSON-kompatibles zu konvertieren, lesen Sie die Dokumentation unter [Tutorial – JSON-kompatibler Encoder](../tutorial/encoder.md){.internal-link target=_blank}. +Um Daten in etwas JSON-kompatibles zu konvertieren, lesen Sie die Dokumentation unter [Tutorial – JSON-kompatibler Encoder](../tutorial/encoder.md). ## OpenAPI-Metadaten – Dokumentation { #openapi-metadata-docs } -Um Metadaten zu Ihrem OpenAPI-Schema hinzuzufügen, einschließlich einer Lizenz, Version, Kontakt, usw., lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentation](../tutorial/metadata.md){.internal-link target=_blank}. +Um Metadaten zu Ihrem OpenAPI-Schema hinzuzufügen, einschließlich einer Lizenz, Version, Kontakt, usw., lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentation](../tutorial/metadata.md). ## Benutzerdefinierte OpenAPI-URL { #openapi-custom-url } -Um die OpenAPI-URL anzupassen (oder zu entfernen), lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentation](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}. +Um die OpenAPI-URL anzupassen (oder zu entfernen), lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentation](../tutorial/metadata.md#openapi-url). ## URLs der OpenAPI-Dokumentationen { #openapi-docs-urls } -Um die URLs zu aktualisieren, die für die automatisch generierten Dokumentations-Oberflächen verwendet werden, lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentation](../tutorial/metadata.md#docs-urls){.internal-link target=_blank}. +Um die URLs zu aktualisieren, die für die automatisch generierten Dokumentations-Oberflächen verwendet werden, lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentation](../tutorial/metadata.md#docs-urls). diff --git a/docs/de/docs/how-to/graphql.md b/docs/de/docs/how-to/graphql.md index 1f0c96eef2..bf1490f707 100644 --- a/docs/de/docs/how-to/graphql.md +++ b/docs/de/docs/how-to/graphql.md @@ -18,18 +18,18 @@ Stellen Sie sicher, dass Sie prüfen, ob die **Vorteile** für Ihren Anwendungsf Hier sind einige der **GraphQL**-Bibliotheken, die **ASGI**-Unterstützung haben. Sie könnten sie mit **FastAPI** verwenden: -* Strawberry 🍓 - * Mit Dokumentation für FastAPI -* Ariadne - * Mit Dokumentation für FastAPI -* Tartiflette - * Mit Tartiflette ASGI für ASGI-Integration -* Graphene - * Mit starlette-graphene3 +* [Strawberry](https://strawberry.rocks/) 🍓 + * Mit [Dokumentation für FastAPI](https://strawberry.rocks/docs/integrations/fastapi) +* [Ariadne](https://ariadnegraphql.org/) + * Mit [Dokumentation für FastAPI](https://ariadnegraphql.org/docs/fastapi-integration) +* [Tartiflette](https://tartiflette.io/) + * Mit [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) für ASGI-Integration +* [Graphene](https://graphene-python.org/) + * Mit [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3) ## GraphQL mit Strawberry { #graphql-with-strawberry } -Wenn Sie mit **GraphQL** arbeiten möchten oder müssen, ist **Strawberry** die **empfohlene** Bibliothek, da deren Design **FastAPIs** Design am nächsten kommt und alles auf **Typannotationen** basiert. +Wenn Sie mit **GraphQL** arbeiten möchten oder müssen, ist [**Strawberry**](https://strawberry.rocks/) die **empfohlene** Bibliothek, da deren Design **FastAPIs** Design am nächsten kommt und alles auf **Typannotationen** basiert. Abhängig von Ihrem Anwendungsfall könnten Sie eine andere Bibliothek vorziehen, aber wenn Sie mich fragen würden, würde ich Ihnen wahrscheinlich empfehlen, **Strawberry** auszuprobieren. @@ -37,24 +37,24 @@ Hier ist eine kleine Vorschau, wie Sie Strawberry mit FastAPI integrieren könne {* ../../docs_src/graphql_/tutorial001_py310.py hl[3,22,25] *} -Weitere Informationen zu Strawberry finden Sie in der Strawberry-Dokumentation. +Weitere Informationen zu Strawberry finden Sie in der [Strawberry-Dokumentation](https://strawberry.rocks/). -Und auch in der Dokumentation zu Strawberry mit FastAPI. +Und auch in der Dokumentation zu [Strawberry mit FastAPI](https://strawberry.rocks/docs/integrations/fastapi). ## Ältere `GraphQLApp` von Starlette { #older-graphqlapp-from-starlette } -Frühere Versionen von Starlette enthielten eine `GraphQLApp`-Klasse zur Integration mit Graphene. +Frühere Versionen von Starlette enthielten eine `GraphQLApp`-Klasse zur Integration mit [Graphene](https://graphene-python.org/). -Das wurde von Starlette deprecatet, aber wenn Sie Code haben, der das verwendet, können Sie einfach zu starlette-graphene3 **migrieren**, das denselben Anwendungsfall abdeckt und eine **fast identische Schnittstelle** hat. +Das wurde von Starlette deprecatet, aber wenn Sie Code haben, der das verwendet, können Sie einfach zu [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3) **migrieren**, das denselben Anwendungsfall abdeckt und eine **fast identische Schnittstelle** hat. /// tip | Tipp -Wenn Sie GraphQL benötigen, würde ich Ihnen trotzdem empfehlen, sich Strawberry anzuschauen, da es auf Typannotationen basiert, statt auf benutzerdefinierten Klassen und Typen. +Wenn Sie GraphQL benötigen, würde ich Ihnen trotzdem empfehlen, sich [Strawberry](https://strawberry.rocks/) anzuschauen, da es auf Typannotationen basiert, statt auf benutzerdefinierten Klassen und Typen. /// ## Mehr darüber lernen { #learn-more } -Weitere Informationen zu **GraphQL** finden Sie in der offiziellen GraphQL-Dokumentation. +Weitere Informationen zu **GraphQL** finden Sie in der [offiziellen GraphQL-Dokumentation](https://graphql.org/). Sie können auch mehr über jede der oben beschriebenen Bibliotheken in den jeweiligen Links lesen. diff --git a/docs/de/docs/how-to/index.md b/docs/de/docs/how-to/index.md index 36229dcd79..c46bbfbdce 100644 --- a/docs/de/docs/how-to/index.md +++ b/docs/de/docs/how-to/index.md @@ -8,6 +8,6 @@ Wenn etwas für Ihr Projekt interessant und nützlich erscheint, lesen Sie es, a /// tip | Tipp -Wenn Sie strukturiert **FastAPI lernen** möchten (empfohlen), lesen Sie stattdessen Kapitel für Kapitel das [Tutorial – Benutzerhandbuch](../tutorial/index.md){.internal-link target=_blank}. +Wenn Sie strukturiert **FastAPI lernen** möchten (empfohlen), lesen Sie stattdessen Kapitel für Kapitel das [Tutorial – Benutzerhandbuch](../tutorial/index.md). /// diff --git a/docs/de/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/de/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md index a8eff3b2b0..c252b3e0f2 100644 --- a/docs/de/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md +++ b/docs/de/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md @@ -22,7 +22,7 @@ Wenn Sie eine ältere FastAPI-App mit Pydantic v1 haben, zeige ich Ihnen hier, w ## Offizieller Leitfaden { #official-guide } -Pydantic hat einen offiziellen Migrationsleitfaden von v1 zu v2. +Pydantic hat einen offiziellen [Migrationsleitfaden](https://docs.pydantic.dev/latest/migration/) von v1 zu v2. Er enthält auch, was sich geändert hat, wie Validierungen nun korrekter und strikter sind, mögliche Stolpersteine, usw. @@ -30,7 +30,7 @@ Sie können ihn lesen, um besser zu verstehen, was sich geändert hat. ## Tests { #tests } -Stellen Sie sicher, dass Sie [Tests](../tutorial/testing.md){.internal-link target=_blank} für Ihre App haben und diese in Continuous Integration (CI) ausführen. +Stellen Sie sicher, dass Sie [Tests](../tutorial/testing.md) für Ihre App haben und diese in Continuous Integration (CI) ausführen. Auf diese Weise können Sie das Update durchführen und sicherstellen, dass weiterhin alles wie erwartet funktioniert. @@ -38,7 +38,7 @@ Auf diese Weise können Sie das Update durchführen und sicherstellen, dass weit In vielen Fällen, wenn Sie reguläre Pydantic-Modelle ohne Anpassungen verwenden, können Sie den Großteil des Prozesses der Migration von Pydantic v1 auf Pydantic v2 automatisieren. -Sie können `bump-pydantic` vom selben Pydantic-Team verwenden. +Sie können [`bump-pydantic`](https://github.com/pydantic/bump-pydantic) vom selben Pydantic-Team verwenden. Dieses Tool hilft Ihnen, den Großteil des zu ändernden Codes automatisch anzupassen. diff --git a/docs/de/docs/how-to/testing-database.md b/docs/de/docs/how-to/testing-database.md index 1a6095e53b..e011f54779 100644 --- a/docs/de/docs/how-to/testing-database.md +++ b/docs/de/docs/how-to/testing-database.md @@ -1,7 +1,7 @@ # Eine Datenbank testen { #testing-a-database } -Sie können sich über Datenbanken, SQL und SQLModel in der SQLModel-Dokumentation informieren. 🤓 +Sie können sich über Datenbanken, SQL und SQLModel in der [SQLModel-Dokumentation](https://sqlmodel.tiangolo.com/) informieren. 🤓 -Es gibt ein kurzes Tutorial zur Verwendung von SQLModel mit FastAPI. ✨ +Es gibt ein kurzes [Tutorial zur Verwendung von SQLModel mit FastAPI](https://sqlmodel.tiangolo.com/tutorial/fastapi/). ✨ -Dieses Tutorial enthält einen Abschnitt über das Testen von SQL-Datenbanken. 😎 +Dieses Tutorial enthält einen Abschnitt über das [Testen von SQL-Datenbanken](https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/). 😎 diff --git a/docs/de/docs/index.md b/docs/de/docs/index.md index bb28c68f70..d2c2829591 100644 --- a/docs/de/docs/index.md +++ b/docs/de/docs/index.md @@ -11,25 +11,25 @@ FastAPI-Framework, hohe Performanz, leicht zu lernen, schnell zu entwickeln, produktionsreif

- + Test - + Testabdeckung - + Package-Version - + Unterstützte Python-Versionen

--- -**Dokumentation**: https://fastapi.tiangolo.com/de +**Dokumentation**: [https://fastapi.tiangolo.com/de](https://fastapi.tiangolo.com/de) -**Quellcode**: https://github.com/fastapi/fastapi +**Quellcode**: [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi) --- @@ -44,7 +44,7 @@ Seine Schlüssel-Merkmale sind: * **Einfach**: So konzipiert, dass es einfach zu benutzen und zu erlernen ist. Weniger Zeit mit dem Lesen von Dokumentation verbringen. * **Kurz**: Minimieren Sie die Verdoppelung von Code. Mehrere Features aus jeder Parameterdeklaration. Weniger Bugs. * **Robust**: Erhalten Sie produktionsreifen Code. Mit automatischer, interaktiver Dokumentation. -* **Standards-basiert**: Basierend auf (und vollständig kompatibel mit) den offenen Standards für APIs: OpenAPI (früher bekannt als Swagger) und JSON Schema. +* **Standards-basiert**: Basierend auf (und vollständig kompatibel mit) den offenen Standards für APIs: [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (früher bekannt als Swagger) und [JSON Schema](https://json-schema.org/). * Schätzung basierend auf Tests, die von einem internen Entwicklungsteam durchgeführt wurden, das Produktionsanwendungen erstellt. @@ -55,51 +55,51 @@ Seine Schlüssel-Merkmale sind: ### Keystone-Sponsor { #keystone-sponsor } {% for sponsor in sponsors.keystone -%} - + {% endfor -%} ### Gold- und Silber-Sponsoren { #gold-and-silver-sponsors } {% for sponsor in sponsors.gold -%} - + {% endfor -%} {%- for sponsor in sponsors.silver -%} - + {% endfor %} -Andere Sponsoren +[Andere Sponsoren](https://fastapi.tiangolo.com/de/fastapi-people/#sponsors) ## Meinungen { #opinions } „_[...] Ich verwende **FastAPI** heutzutage sehr oft. [...] Ich habe tatsächlich vor, es für alle **ML-Services meines Teams bei Microsoft** zu verwenden. Einige davon werden in das Kernprodukt **Windows** und einige **Office**-Produkte integriert._“ -
Kabir Khan – Microsoft (Ref.)
+
Kabir Khan – Microsoft (Ref.)
--- „_Wir haben die **FastAPI**-Bibliothek übernommen, um einen **REST**-Server zu erstellen, der für **Vorhersagen** abgefragt werden kann. [für Ludwig]_“ -
Piero Molino, Yaroslav Dudin, und Sai Sumanth Miryala – Uber (Ref.)
+
Piero Molino, Yaroslav Dudin, und Sai Sumanth Miryala – Uber (Ref.)
--- „_**Netflix** freut sich, die Open-Source-Veröffentlichung unseres **Krisenmanagement**-Orchestrierung-Frameworks bekannt zu geben: **Dispatch**! [erstellt mit **FastAPI**]_“ -
Kevin Glisson, Marc Vilanova, Forest Monsen – Netflix (Ref.)
+
Kevin Glisson, Marc Vilanova, Forest Monsen – Netflix (Ref.)
--- „_Ich bin hellauf begeistert von **FastAPI**. Es macht so viel Spaß!_“ -
Brian Okken – Python Bytes Podcast-Host (Ref.)
+
Brian Okken – [Python Bytes](https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855) Podcast-Host (Ref.)
--- „_Ehrlich, was Du gebaut hast, sieht super solide und poliert aus. In vielerlei Hinsicht ist es so, wie ich **Hug** haben wollte – es ist wirklich inspirierend, jemanden so etwas bauen zu sehen._“ -
Timothy Crosley – Hug-Autor (Ref.)
+
Timothy Crosley – [Hug](https://github.com/hugapi/hug)-Autor (Ref.)
--- @@ -107,27 +107,27 @@ Seine Schlüssel-Merkmale sind: „_Wir haben zu **FastAPI** für unsere **APIs** gewechselt [...] Ich denke, es wird Ihnen gefallen [...]_“ -
Ines Montani – Matthew Honnibal – Explosion AI-Gründer – spaCy-Autoren (Ref.)(Ref.)
+
Ines Montani – Matthew Honnibal – [Explosion AI](https://explosion.ai)-Gründer – [spaCy](https://spacy.io)-Autoren (Ref.)(Ref.)
--- „_Falls irgendjemand eine Produktions-Python-API erstellen möchte, kann ich **FastAPI** wärmstens empfehlen. Es ist **wunderschön konzipiert**, **einfach zu verwenden** und **hoch skalierbar**; es ist zu einer **Schlüsselkomponente** unserer API-First-Entwicklungsstrategie geworden und treibt viele Automatisierungen und Services an, wie etwa unseren Virtual TAC Engineer._“ -
Deon Pillsbury – Cisco (Ref.)
+
Deon Pillsbury – Cisco (Ref.)
--- ## FastAPI Mini-Dokumentarfilm { #fastapi-mini-documentary } -Es gibt einen FastAPI-Mini-Dokumentarfilm, veröffentlicht Ende 2025, Sie können ihn online ansehen: +Es gibt einen [FastAPI-Mini-Dokumentarfilm](https://www.youtube.com/watch?v=mpR8ngthqiE), veröffentlicht Ende 2025, Sie können ihn online ansehen: -FastAPI Mini-Dokumentarfilm +FastAPI Mini-Dokumentarfilm ## **Typer**, das FastAPI der CLIs { #typer-the-fastapi-of-clis } - + -Wenn Sie eine CLI-Anwendung für das Terminal erstellen, anstelle einer Web-API, schauen Sie sich **Typer** an. +Wenn Sie eine CLI-Anwendung für das Terminal erstellen, anstelle einer Web-API, schauen Sie sich [**Typer**](https://typer.tiangolo.com/) an. **Typer** ist die kleine Schwester von FastAPI. Und es soll das **FastAPI der CLIs** sein. ⌨️ 🚀 @@ -135,12 +135,12 @@ Wenn Sie eine Starlette für die Webanteile. -* Pydantic für die Datenanteile. +* [Starlette](https://www.starlette.dev/) für die Webanteile. +* [Pydantic](https://docs.pydantic.dev/) für die Datenanteile. ## Installation { #installation } -Erstellen und aktivieren Sie eine virtuelle Umgebung und installieren Sie dann FastAPI: +Erstellen und aktivieren Sie eine [virtuelle Umgebung](https://fastapi.tiangolo.com/de/virtual-environments/) und installieren Sie dann FastAPI:
@@ -199,7 +199,7 @@ async def read_item(item_id: int, q: str | None = None): **Hinweis**: -Wenn Sie das nicht kennen, schauen Sie sich den Abschnitt _„In Eile?“_ über `async` und `await` in der Dokumentation an. +Wenn Sie das nicht kennen, schauen Sie sich den Abschnitt _„In Eile?“_ über [`async` und `await` in der Dokumentation](https://fastapi.tiangolo.com/de/async/#in-a-hurry) an. @@ -210,7 +210,7 @@ Starten Sie den Server mit:
```console -$ fastapi dev main.py +$ fastapi dev ╭────────── FastAPI CLI - Development mode ───────────╮ │ │ @@ -235,21 +235,21 @@ INFO: Application startup complete.
-Über den Befehl fastapi dev main.py ... +Über den Befehl fastapi dev ... -Der Befehl `fastapi dev` liest Ihre `main.py`-Datei, erkennt die **FastAPI**-App darin und startet einen Server mit Uvicorn. +Der Befehl `fastapi dev` liest Ihre `main.py`-Datei, erkennt die **FastAPI**-App darin und startet einen Server mit [Uvicorn](https://www.uvicorn.dev). Standardmäßig wird `fastapi dev` mit aktiviertem Auto-Reload für die lokale Entwicklung gestartet. -Sie können mehr darüber in der FastAPI CLI Dokumentation lesen. +Sie können mehr darüber in der [FastAPI CLI Dokumentation](https://fastapi.tiangolo.com/de/fastapi-cli/) lesen.
### Es testen { #check-it } -Öffnen Sie Ihren Browser unter http://127.0.0.1:8000/items/5?q=somequery. +Öffnen Sie Ihren Browser unter [http://127.0.0.1:8000/items/5?q=somequery](http://127.0.0.1:8000/items/5?q=somequery). -Sie sehen die JSON-Response als: +Sie sehen die JSON-Response als: ```JSON {"item_id": 5, "q": "somequery"} @@ -257,30 +257,30 @@ Sie sehen die JSON-Requests auf den _Pfaden_ `/` und `/items/{item_id}` entgegennimmt. +* HTTP-Requests auf den _Pfaden_ `/` und `/items/{item_id}` entgegennimmt. * Beide _Pfade_ nehmen `GET` Operationen (auch bekannt als HTTP-_Methoden_) entgegen. * Der _Pfad_ `/items/{item_id}` hat einen _Pfad-Parameter_ `item_id`, der ein `int` sein sollte. * Der _Pfad_ `/items/{item_id}` hat einen optionalen `str`-_Query-Parameter_ `q`. ### Interaktive API-Dokumentation { #interactive-api-docs } -Gehen Sie nun auf http://127.0.0.1:8000/docs. +Gehen Sie nun auf [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). -Sie sehen die automatische interaktive API-Dokumentation (bereitgestellt von Swagger UI): +Sie sehen die automatische interaktive API-Dokumentation (bereitgestellt von [Swagger UI](https://github.com/swagger-api/swagger-ui)): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Alternative API-Dokumentation { #alternative-api-docs } -Und jetzt gehen Sie auf http://127.0.0.1:8000/redoc. +Und jetzt gehen Sie auf [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). -Sie sehen die alternative automatische Dokumentation (bereitgestellt von ReDoc): +Sie sehen die alternative automatische Dokumentation (bereitgestellt von [ReDoc](https://github.com/Rebilly/ReDoc)): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) ## Beispielaktualisierung { #example-upgrade } -Ändern Sie jetzt die Datei `main.py`, um den Body eines `PUT`-Requests zu empfangen. +Ändern Sie jetzt die Datei `main.py`, um den Body eines `PUT`-Requests zu empfangen. Deklarieren Sie den Body mit Standard-Python-Typen, dank Pydantic. @@ -316,7 +316,7 @@ Der `fastapi dev`-Server sollte automatisch neu laden. ### Interaktive API-Dokumentation aktualisieren { #interactive-api-docs-upgrade } -Gehen Sie jetzt auf http://127.0.0.1:8000/docs. +Gehen Sie jetzt auf [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). * Die interaktive API-Dokumentation wird automatisch aktualisiert, einschließlich des neuen Bodys: @@ -332,7 +332,7 @@ Gehen Sie jetzt auf http://127.0.0.1:8000/redoc. +Und jetzt gehen Sie auf [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). * Die alternative Dokumentation wird ebenfalls den neuen Query-Parameter und Body widerspiegeln: @@ -442,7 +442,7 @@ Für ein vollständigeres Beispiel, mit weiteren Funktionen, siehe das Dependency Injection**. * Sicherheit und Authentifizierung, einschließlich Unterstützung für **OAuth2** mit **JWT-Tokens** und **HTTP Basic** Authentifizierung. * Fortgeschrittenere (aber ebenso einfache) Techniken zur Deklaration **tief verschachtelter JSON-Modelle** (dank Pydantic). -* **GraphQL**-Integration mit Strawberry und anderen Bibliotheken. +* **GraphQL**-Integration mit [Strawberry](https://strawberry.rocks) und anderen Bibliotheken. * Viele zusätzliche Features (dank Starlette) wie: * **WebSockets** * extrem einfache Tests auf Basis von HTTPX und `pytest` @@ -452,24 +452,10 @@ Für ein vollständigeres Beispiel, mit weiteren Funktionen, siehe das FastAPI Cloud deployen, gehen Sie und treten Sie der Warteliste bei, falls noch nicht geschehen. 🚀 +Optional können Sie Ihre FastAPI-App in die [FastAPI Cloud](https://fastapicloud.com) deployen, gehen Sie und treten Sie der Warteliste bei, falls noch nicht geschehen. 🚀 Wenn Sie bereits ein **FastAPI Cloud**-Konto haben (wir haben Sie von der Warteliste eingeladen 😉), können Sie Ihre Anwendung mit einem einzigen Befehl deployen. -Stellen Sie vor dem Deployen sicher, dass Sie eingeloggt sind: - -
- -```console -$ fastapi login - -You are logged in to FastAPI Cloud 🚀 -``` - -
- -Stellen Sie dann Ihre App bereit: -
```console @@ -488,7 +474,7 @@ Das war’s! Jetzt können Sie unter dieser URL auf Ihre App zugreifen. ✨ #### Über FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** wird vom selben Autor und Team hinter **FastAPI** entwickelt. +**[FastAPI Cloud](https://fastapicloud.com)** wird vom selben Autor und Team hinter **FastAPI** entwickelt. Es vereinfacht den Prozess des **Erstellens**, **Deployens** und **Zugreifens** auf eine API mit minimalem Aufwand. @@ -504,9 +490,9 @@ Folgen Sie den Anleitungen Ihres Cloudanbieters, um FastAPI-Apps dort bereitzust ## Performanz { #performance } -Unabhängige TechEmpower-Benchmarks zeigen **FastAPI**-Anwendungen, die unter Uvicorn laufen, als eines der schnellsten verfügbaren Python-Frameworks, nur hinter Starlette und Uvicorn selbst (intern von FastAPI verwendet). (*) +Unabhängige TechEmpower-Benchmarks zeigen **FastAPI**-Anwendungen, die unter Uvicorn laufen, als [eines der schnellsten verfügbaren Python-Frameworks](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), nur hinter Starlette und Uvicorn selbst (intern von FastAPI verwendet). (*) -Um mehr darüber zu erfahren, siehe den Abschnitt Benchmarks. +Um mehr darüber zu erfahren, siehe den Abschnitt [Benchmarks](https://fastapi.tiangolo.com/de/benchmarks/). ## Abhängigkeiten { #dependencies } @@ -518,19 +504,19 @@ Wenn Sie FastAPI mit `pip install "fastapi[standard]"` installieren, kommt es mi Verwendet von Pydantic: -* email-validator – für E-Mail-Validierung. +* [`email-validator`](https://github.com/JoshData/python-email-validator) – für E-Mail-Validierung. Verwendet von Starlette: -* httpx – erforderlich, wenn Sie den `TestClient` verwenden möchten. -* jinja2 – erforderlich, wenn Sie die Default-Template-Konfiguration verwenden möchten. -* python-multipart – erforderlich, wenn Sie Formulare mittels `request.form()` „parsen“ möchten. +* [`httpx`](https://www.python-httpx.org) – erforderlich, wenn Sie den `TestClient` verwenden möchten. +* [`jinja2`](https://jinja.palletsprojects.com) – erforderlich, wenn Sie die Default-Template-Konfiguration verwenden möchten. +* [`python-multipart`](https://github.com/Kludex/python-multipart) – erforderlich, wenn Sie Formulare mittels `request.form()` „parsen“ möchten. Verwendet von FastAPI: -* uvicorn – für den Server, der Ihre Anwendung lädt und bereitstellt. Dies umfasst `uvicorn[standard]`, das einige Abhängigkeiten (z. B. `uvloop`) beinhaltet, die für eine Bereitstellung mit hoher Performanz benötigt werden. +* [`uvicorn`](https://www.uvicorn.dev) – für den Server, der Ihre Anwendung lädt und bereitstellt. Dies umfasst `uvicorn[standard]`, das einige Abhängigkeiten (z. B. `uvloop`) beinhaltet, die für eine Bereitstellung mit hoher Performanz benötigt werden. * `fastapi-cli[standard]` – um den `fastapi`-Befehl bereitzustellen. - * Dies beinhaltet `fastapi-cloud-cli`, das es Ihnen ermöglicht, Ihre FastAPI-Anwendung auf FastAPI Cloud bereitzustellen. + * Dies beinhaltet `fastapi-cloud-cli`, das es Ihnen ermöglicht, Ihre FastAPI-Anwendung auf [FastAPI Cloud](https://fastapicloud.com) bereitzustellen. ### Ohne `standard`-Abhängigkeiten { #without-standard-dependencies } @@ -546,13 +532,13 @@ Es gibt einige zusätzliche Abhängigkeiten, die Sie installieren möchten. Zusätzliche optionale Pydantic-Abhängigkeiten: -* pydantic-settings – für die Verwaltung von Einstellungen. -* pydantic-extra-types – für zusätzliche Typen zur Verwendung mit Pydantic. +* [`pydantic-settings`](https://docs.pydantic.dev/latest/usage/pydantic_settings/) – für die Verwaltung von Einstellungen. +* [`pydantic-extra-types`](https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/) – für zusätzliche Typen zur Verwendung mit Pydantic. Zusätzliche optionale FastAPI-Abhängigkeiten: -* orjson – erforderlich, wenn Sie `ORJSONResponse` verwenden möchten. -* ujson – erforderlich, wenn Sie `UJSONResponse` verwenden möchten. +* [`orjson`](https://github.com/ijl/orjson) – erforderlich, wenn Sie `ORJSONResponse` verwenden möchten. +* [`ujson`](https://github.com/esnme/ultrajson) – erforderlich, wenn Sie `UJSONResponse` verwenden möchten. ## Lizenz { #license } diff --git a/docs/de/docs/project-generation.md b/docs/de/docs/project-generation.md index 2c252933d9..fd754906a6 100644 --- a/docs/de/docs/project-generation.md +++ b/docs/de/docs/project-generation.md @@ -4,7 +4,7 @@ Vorlagen, die normalerweise mit einem bestimmten Setup geliefert werden, sind so Sie können diese Vorlage verwenden, um loszulegen, da sie bereits vieles der anfänglichen Einrichtung, Sicherheit, Datenbank und einige API-Endpunkte für Sie eingerichtet hat. -GitHub-Repository: Full Stack FastAPI Template +GitHub-Repository: [Full Stack FastAPI Template](https://github.com/tiangolo/full-stack-fastapi-template) ## Full Stack FastAPI Template – Technologiestack und Funktionen { #full-stack-fastapi-template-technology-stack-and-features } diff --git a/docs/de/docs/python-types.md b/docs/de/docs/python-types.md index dda9da2272..79e6109977 100644 --- a/docs/de/docs/python-types.md +++ b/docs/de/docs/python-types.md @@ -269,7 +269,7 @@ Es bedeutet nicht: „`one_person` ist die **Klasse** genannt `Person`“. ## Pydantic-Modelle { #pydantic-models } -Pydantic ist eine Python-Bibliothek für die Validierung von Daten. +[Pydantic](https://docs.pydantic.dev/) ist eine Python-Bibliothek für die Validierung von Daten. Sie deklarieren die „Form“ der Daten als Klassen mit Attributen. @@ -285,13 +285,13 @@ Ein Beispiel aus der offiziellen Pydantic Dokumentation: /// info | Info -Um mehr über Pydantic zu erfahren, schauen Sie sich dessen Dokumentation an. +Um mehr über [Pydantic zu erfahren, schauen Sie sich dessen Dokumentation an](https://docs.pydantic.dev/). /// **FastAPI** basiert vollständig auf Pydantic. -Viel mehr von all dem werden Sie in praktischer Anwendung im [Tutorial – Benutzerhandbuch](tutorial/index.md){.internal-link target=_blank} sehen. +Viel mehr von all dem werden Sie in praktischer Anwendung im [Tutorial – Benutzerhandbuch](tutorial/index.md) sehen. ## Typhinweise mit Metadaten-Annotationen { #type-hints-with-metadata-annotations } @@ -330,19 +330,19 @@ Mit **FastAPI** deklarieren Sie Parameter mit Typhinweisen, und Sie erhalten: ... und **FastAPI** verwendet dieselben Deklarationen, um: -* **Anforderungen** zu definieren: aus Request-Pfadparametern, Query-Parametern, Header-Feldern, Bodys, Abhängigkeiten, usw. +* **Anforderungen** zu definieren: aus Request-Pfadparametern, Query-Parametern, Headern, Bodys, Abhängigkeiten, usw. * **Daten umzuwandeln**: aus dem Request in den erforderlichen Typ. * **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. -Das mag alles abstrakt klingen. Machen Sie sich keine Sorgen. Sie werden all das in Aktion sehen im [Tutorial – Benutzerhandbuch](tutorial/index.md){.internal-link target=_blank}. +Das mag alles abstrakt klingen. Machen Sie sich keine Sorgen. Sie werden all das in Aktion sehen im [Tutorial – Benutzerhandbuch](tutorial/index.md). Das Wichtigste ist, dass **FastAPI** durch die Verwendung von Standard-Python-Typen an einer einzigen Stelle (anstatt weitere Klassen, Dekoratoren usw. hinzuzufügen) einen Großteil der Arbeit für Sie erledigt. /// info | Info -Wenn Sie bereits das ganze Tutorial durchgearbeitet haben und mehr über Typen erfahren wollen, dann ist eine gute Ressource der „Cheat Sheet“ von `mypy`. +Wenn Sie bereits das ganze Tutorial durchgearbeitet haben und mehr über Typen erfahren wollen, dann ist eine gute Ressource [der „Cheat Sheet“ von `mypy`](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html). /// diff --git a/docs/de/docs/tutorial/background-tasks.md b/docs/de/docs/tutorial/background-tasks.md index 950174d9cb..7d6c35a1c0 100644 --- a/docs/de/docs/tutorial/background-tasks.md +++ b/docs/de/docs/tutorial/background-tasks.md @@ -63,7 +63,7 @@ Und dann schreibt ein weiterer Hintergrundtask, der in der *Pfadoperation-Funkti ## Technische Details { #technical-details } -Die Klasse `BackgroundTasks` stammt direkt von `starlette.background`. +Die Klasse `BackgroundTasks` stammt direkt von [`starlette.background`](https://www.starlette.dev/background/). Sie wird direkt in FastAPI importiert/inkludiert, sodass Sie sie von `fastapi` importieren können und vermeiden, versehentlich das alternative `BackgroundTask` (ohne das `s` am Ende) von `starlette.background` zu importieren. @@ -71,11 +71,11 @@ Indem Sie nur `BackgroundTasks` (und nicht `BackgroundTask`) verwenden, ist es d Es ist immer noch möglich, `BackgroundTask` allein in FastAPI zu verwenden, aber Sie müssen das Objekt in Ihrem Code erstellen und eine Starlette-`Response` zurückgeben, die es enthält. -Weitere Details finden Sie in Starlettes offizieller Dokumentation für Hintergrundtasks. +Weitere Details finden Sie in [Starlettes offizieller Dokumentation für Hintergrundtasks](https://www.starlette.dev/background/). ## Vorbehalt { #caveat } -Wenn Sie umfangreiche Hintergrundberechnungen durchführen müssen und diese nicht unbedingt vom selben Prozess ausgeführt werden müssen (z. B. müssen Sie Speicher, Variablen, usw. nicht gemeinsam nutzen), könnte die Verwendung anderer größerer Tools wie z. B. Celery von Vorteil sein. +Wenn Sie umfangreiche Hintergrundberechnungen durchführen müssen und diese nicht unbedingt vom selben Prozess ausgeführt werden müssen (z. B. müssen Sie Speicher, Variablen, usw. nicht gemeinsam nutzen), könnte die Verwendung anderer größerer Tools wie z. B. [Celery](https://docs.celeryq.dev) von Vorteil sein. Sie erfordern in der Regel komplexere Konfigurationen und einen Nachrichten-/Job-Queue-Manager wie RabbitMQ oder Redis, ermöglichen Ihnen jedoch die Ausführung von Hintergrundtasks in mehreren Prozessen und insbesondere auf mehreren Servern. diff --git a/docs/de/docs/tutorial/bigger-applications.md b/docs/de/docs/tutorial/bigger-applications.md index 97fa9b81ac..b74c5ee5a7 100644 --- a/docs/de/docs/tutorial/bigger-applications.md +++ b/docs/de/docs/tutorial/bigger-applications.md @@ -123,7 +123,7 @@ Wir werden nun eine einfache Abhängigkeit verwenden, um einen benutzerdefiniert Um dieses Beispiel zu vereinfachen, verwenden wir einen erfundenen Header. -Aber in der Praxis werden Sie mit den integrierten [Sicherheits-Werkzeugen](security/index.md){.internal-link target=_blank} bessere Ergebnisse erzielen. +Aber in der Praxis werden Sie mit den integrierten [Sicherheits-Werkzeugen](security/index.md) bessere Ergebnisse erzielen. /// @@ -169,7 +169,7 @@ Und wir können eine Liste von `dependencies` hinzufügen, die allen *Pfadoperat /// tip | Tipp -Beachten Sie, dass ähnlich wie bei [Abhängigkeiten in *Pfadoperation-Dekoratoren*](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank} kein Wert an Ihre *Pfadoperation-Funktion* übergeben wird. +Beachten Sie, dass ähnlich wie bei [Abhängigkeiten in *Pfadoperation-Dekoratoren*](dependencies/dependencies-in-path-operation-decorators.md) kein Wert an Ihre *Pfadoperation-Funktion* übergeben wird. /// @@ -180,13 +180,13 @@ Das Endergebnis ist, dass die Pfade für diese Artikel jetzt wie folgt lauten: ... wie wir es beabsichtigt hatten. -* Sie werden mit einer Liste von Tags gekennzeichnet, die einen einzelnen String `"items"` enthält. +* Sie werden mit einer Liste von Tags gekennzeichnet, die einen einzelnen String „items“ enthält. * Diese „Tags“ sind besonders nützlich für die automatischen interaktiven Dokumentationssysteme (unter Verwendung von OpenAPI). * Alle enthalten die vordefinierten `responses`. * Für alle diese *Pfadoperationen* wird die Liste der `dependencies` ausgewertet/ausgeführt, bevor sie selbst ausgeführt werden. * Wenn Sie außerdem Abhängigkeiten in einer bestimmten *Pfadoperation* deklarieren, **werden diese ebenfalls ausgeführt**. - * Zuerst werden die Router-Abhängigkeiten ausgeführt, dann die [`dependencies` im Dekorator](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank} und dann die normalen Parameterabhängigkeiten. - * Sie können auch [`Security`-Abhängigkeiten mit `scopes`](../advanced/security/oauth2-scopes.md){.internal-link target=_blank} hinzufügen. + * Zuerst werden die Router-Abhängigkeiten ausgeführt, dann die [`dependencies` im Dekorator](dependencies/dependencies-in-path-operation-decorators.md) und dann die normalen Parameterabhängigkeiten. + * Sie können auch [`Security`-Abhängigkeiten mit `scopes`](../advanced/security/oauth2-scopes.md) hinzufügen. /// tip | Tipp @@ -295,7 +295,7 @@ Sehen wir uns nun das Modul unter `app/main.py` an. Hier importieren und verwenden Sie die Klasse `FastAPI`. -Dies ist die Hauptdatei Ihrer Anwendung, die alles zusammenfügt. +Dies wird die Hauptdatei Ihrer Anwendung sein, die alles zusammenfügt. Und da sich der Großteil Ihrer Logik jetzt in seinem eigenen spezifischen Modul befindet, wird die Hauptdatei recht einfach sein. @@ -303,7 +303,7 @@ Und da sich der Großteil Ihrer Logik jetzt in seinem eigenen spezifischen Modul Sie importieren und erstellen wie gewohnt eine `FastAPI`-Klasse. -Und wir können sogar [globale Abhängigkeiten](dependencies/global-dependencies.md){.internal-link target=_blank} deklarieren, die mit den Abhängigkeiten für jeden `APIRouter` kombiniert werden: +Und wir können sogar [globale Abhängigkeiten](dependencies/global-dependencies.md) deklarieren, die mit den Abhängigkeiten für jeden `APIRouter` kombiniert werden: {* ../../docs_src/bigger_applications/app_an_py310/main.py hl[1,3,7] title["app/main.py"] *} @@ -353,7 +353,7 @@ Die zweite Version ist ein „absoluter Import“: from app.routers import items, users ``` -Um mehr über Python-Packages und -Module zu erfahren, lesen Sie die offizielle Python-Dokumentation über Module. +Um mehr über Python-Packages und -Module zu erfahren, lesen Sie [die offizielle Python-Dokumentation über Module](https://docs.python.org/3/tutorial/modules.html). /// @@ -404,7 +404,7 @@ Hinter den Kulissen wird es also tatsächlich so funktionieren, als ob alles die /// check | Testen -Bei der Einbindung von Routern müssen Sie sich keine Gedanken über die Performanz machen. +Bei der Einbindung von Routern müssen Sie sich keine Gedanken über die Leistung machen. Dies dauert Mikrosekunden und geschieht nur beim Start. @@ -465,21 +465,52 @@ Da wir sie nicht einfach isolieren und unabhängig vom Rest „mounten“ könne /// -## Es in der automatischen API-Dokumentation testen { #check-the-automatic-api-docs } +## Den `entrypoint` in `pyproject.toml` konfigurieren { #configure-the-entrypoint-in-pyproject-toml } + +Da Ihr FastAPI-`app`-Objekt in `app/main.py` liegt, können Sie den `entrypoint` in Ihrer `pyproject.toml`-Datei so konfigurieren: + +```toml +[tool.fastapi] +entrypoint = "app.main:app" +``` + +das entspricht einem Import wie: + +```python +from app.main import app +``` + +Auf diese Weise weiß der `fastapi`-Befehl, wo er Ihre App findet. + +/// Note | Hinweis + +Sie könnten auch den Pfad an den Befehl übergeben, etwa: + +```console +$ fastapi dev app/main.py +``` + +Aber dann müssten Sie sich jedes Mal, wenn Sie den `fastapi`-Befehl aufrufen, an den korrekten Pfad erinnern. + +Außerdem finden andere Tools Ihre App womöglich nicht, zum Beispiel die [VS Code-Erweiterung](../editor-support.md) oder [FastAPI Cloud](https://fastapicloud.com). Daher wird empfohlen, den `entrypoint` in `pyproject.toml` zu verwenden. + +/// + +## Die automatische API-Dokumentation prüfen { #check-the-automatic-api-docs } Führen Sie nun Ihre App aus:
```console -$ fastapi dev app/main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Und öffnen Sie die Dokumentation unter http://127.0.0.1:8000/docs. +Und öffnen Sie die Dokumentation unter [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Sie sehen die automatische API-Dokumentation, einschließlich der Pfade aller Submodule, mit den richtigen Pfaden (und Präfixen) und den richtigen Tags: diff --git a/docs/de/docs/tutorial/body-nested-models.md b/docs/de/docs/tutorial/body-nested-models.md index 52b00e0369..62f04a37da 100644 --- a/docs/de/docs/tutorial/body-nested-models.md +++ b/docs/de/docs/tutorial/body-nested-models.md @@ -95,7 +95,7 @@ Wiederum, nur mit dieser Deklaration erhalten Sie von **FastAPI**: Abgesehen von normalen einfachen Typen wie `str`, `int`, `float`, usw. können Sie komplexere einfache Typen verwenden, die von `str` erben. -Um alle Optionen kennenzulernen, die Sie haben, schauen Sie sich Pydantics Typübersicht an. Sie werden einige Beispiele im nächsten Kapitel kennenlernen. +Um alle Optionen kennenzulernen, die Sie haben, schauen Sie sich [Pydantics Typübersicht](https://docs.pydantic.dev/latest/concepts/types/) an. Sie werden einige Beispiele im nächsten Kapitel kennenlernen. Zum Beispiel, da wir im `Image`-Modell ein Feld `url` haben, können wir deklarieren, dass das eine Instanz von Pydantics `HttpUrl` sein soll, anstelle eines `str`: diff --git a/docs/de/docs/tutorial/body-updates.md b/docs/de/docs/tutorial/body-updates.md index d260998e91..ef46f19f68 100644 --- a/docs/de/docs/tutorial/body-updates.md +++ b/docs/de/docs/tutorial/body-updates.md @@ -2,7 +2,7 @@ ## Ersetzendes Aktualisieren mit `PUT` { #update-replacing-with-put } -Um einen Artikel zu aktualisieren, können Sie die HTTP `PUT` Operation verwenden. +Um einen Artikel zu aktualisieren, können Sie die [HTTP `PUT`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT) Operation verwenden. Sie können den `jsonable_encoder` verwenden, um die empfangenen Daten in etwas zu konvertieren, das als JSON gespeichert werden kann (z. B. in einer NoSQL-Datenbank). Zum Beispiel, um ein `datetime` in einen `str` zu konvertieren. @@ -28,7 +28,7 @@ Und die Daten würden mit diesem „neuen“ `tax` von `10.5` gespeichert werden ## Teil-Aktualisierungen mit `PATCH` { #partial-updates-with-patch } -Sie können auch die HTTP `PATCH` Operation verwenden, um Daten *teilweise* zu ersetzen. +Sie können auch die [HTTP `PATCH`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) Operation verwenden, um Daten *teilweise* zu ersetzen. Das bedeutet, Sie senden nur die Daten, die Sie aktualisieren wollen, der Rest bleibt unverändert. @@ -95,6 +95,6 @@ Beachten Sie, dass das hereinkommende Modell immer noch validiert wird. Wenn Sie also Teil-Aktualisierungen empfangen wollen, die alle Attribute auslassen können, müssen Sie ein Modell haben, dessen Attribute alle als optional gekennzeichnet sind (mit Defaultwerten oder `None`). -Um zu unterscheiden zwischen Modellen für **Aktualisierungen**, mit lauter optionalen Werten, und solchen für die **Erzeugung**, mit benötigten Werten, können Sie die Techniken verwenden, die in [Extramodelle](extra-models.md){.internal-link target=_blank} beschrieben wurden. +Um zu unterscheiden zwischen Modellen für **Aktualisierungen**, mit lauter optionalen Werten, und solchen für die **Erzeugung**, mit benötigten Werten, können Sie die Techniken verwenden, die in [Extramodelle](extra-models.md) beschrieben wurden. /// diff --git a/docs/de/docs/tutorial/body.md b/docs/de/docs/tutorial/body.md index e1214bc538..9e87dfccf0 100644 --- a/docs/de/docs/tutorial/body.md +++ b/docs/de/docs/tutorial/body.md @@ -6,7 +6,7 @@ Ein **Request**body sind Daten, die vom Clie Ihre API muss fast immer einen **Response**body senden. Aber Clients müssen nicht unbedingt immer **Requestbodys** senden, manchmal fordern sie nur einen Pfad an, vielleicht mit einigen Query-Parametern, aber senden keinen Body. -Um einen **Request**body zu deklarieren, verwenden Sie Pydantic-Modelle mit all deren Fähigkeiten und Vorzügen. +Um einen **Request**body zu deklarieren, verwenden Sie [Pydantic](https://docs.pydantic.dev/)-Modelle mit all deren Fähigkeiten und Vorzügen. /// info | Info @@ -72,8 +72,8 @@ Mit nur dieser Python-Typdeklaration wird **FastAPI**: * Wenn die Daten ungültig sind, wird ein klar lesbarer Fehler zurückgegeben, der genau anzeigt, wo und was die inkorrekten Daten sind. * Ihnen die erhaltenen Daten im Parameter `item` übergeben. * Da Sie ihn in der Funktion als vom Typ `Item` deklariert haben, erhalten Sie auch die volle Unterstützung des Editors (Autovervollständigung, usw.) für alle Attribute und deren Typen. -* JSON Schema-Definitionen für Ihr Modell generieren, die Sie auch überall sonst verwenden können, wenn es für Ihr Projekt Sinn macht. -* Diese Schemas werden Teil des generierten OpenAPI-Schemas und werden von den UIs der automatischen Dokumentation genutzt. +* [JSON Schema](https://json-schema.org)-Definitionen für Ihr Modell generieren, die Sie auch überall sonst verwenden können, wenn es für Ihr Projekt Sinn macht. +* Diese Schemas werden Teil des generierten OpenAPI-Schemas und werden von den UIs der automatischen Dokumentation genutzt. ## Automatische Dokumentation { #automatic-docs } @@ -101,15 +101,15 @@ Und es wurde in der Designphase gründlich getestet, bevor irgendeine Implementi Es gab sogar einige Änderungen an Pydantic selbst, um dies zu unterstützen. -Die vorherigen Screenshots wurden mit Visual Studio Code aufgenommen. +Die vorherigen Screenshots wurden mit [Visual Studio Code](https://code.visualstudio.com) aufgenommen. -Aber Sie würden die gleiche Editor-Unterstützung in PyCharm und den meisten anderen Python-Editoren erhalten: +Aber Sie würden die gleiche Editor-Unterstützung in [PyCharm](https://www.jetbrains.com/pycharm/) und den meisten anderen Python-Editoren erhalten: /// tip | Tipp -Wenn Sie PyCharm als Ihren Editor verwenden, können Sie das Pydantic PyCharm Plugin ausprobieren. +Wenn Sie [PyCharm](https://www.jetbrains.com/pycharm/) als Ihren Editor verwenden, können Sie das [Pydantic PyCharm Plugin](https://github.com/koxudaxi/pydantic-pycharm-plugin/) ausprobieren. Es verbessert die Editor-Unterstützung für Pydantic-Modelle, mit: @@ -162,4 +162,4 @@ Das Hinzufügen der Typannotationen ermöglicht jedoch Ihrem Editor, Ihnen eine ## Ohne Pydantic { #without-pydantic } -Wenn Sie keine Pydantic-Modelle verwenden möchten, können Sie auch **Body**-Parameter verwenden. Siehe die Dokumentation unter [Body – Mehrere Parameter: Einfache Werte im Body](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank}. +Wenn Sie keine Pydantic-Modelle verwenden möchten, können Sie auch **Body**-Parameter verwenden. Siehe die Dokumentation unter [Body – Mehrere Parameter: Einfache Werte im Body](body-multiple-params.md#singular-values-in-body). diff --git a/docs/de/docs/tutorial/cors.md b/docs/de/docs/tutorial/cors.md index 4e714f215e..760aba49e6 100644 --- a/docs/de/docs/tutorial/cors.md +++ b/docs/de/docs/tutorial/cors.md @@ -1,6 +1,6 @@ # CORS (Cross-Origin Resource Sharing) { #cors-cross-origin-resource-sharing } -CORS oder „Cross-Origin Resource Sharing“ bezieht sich auf Situationen, in denen ein Frontend, das in einem Browser läuft, JavaScript-Code enthält, der mit einem Backend kommuniziert, und das Backend sich in einem anderen „Origin“ als das Frontend befindet. +[CORS oder „Cross-Origin Resource Sharing“](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) bezieht sich auf Situationen, in denen ein Frontend, das in einem Browser läuft, JavaScript-Code enthält, der mit einem Backend kommuniziert, und das Backend sich in einem anderen „Origin“ als das Frontend befindet. ## Origin { #origin } @@ -55,10 +55,10 @@ Die folgenden Argumente werden unterstützt: * `allow_origins` – Eine Liste von Origins, die Cross-Origin-Requests machen dürfen. z. B. `['https://example.org', 'https://www.example.org']`. Sie können `['*']` verwenden, um jedes Origin zuzulassen. * `allow_origin_regex` – Ein Regex-String zum Abgleichen gegen Origins, die Cross-Origin-Requests machen dürfen. z. B. `'https://.*\.example\.org'`. * `allow_methods` – Eine Liste von HTTP-Methoden, die für Cross-Origin-Requests erlaubt sein sollen. Standardmäßig `['GET']`. Sie können `['*']` verwenden, um alle Standardmethoden zu erlauben. -* `allow_headers` – Eine Liste von HTTP-Requestheadern, die für Cross-Origin-Requests unterstützt werden sollten. Standardmäßig `[]`. Sie können `['*']` verwenden, um alle Header zu erlauben. Die Header `Accept`, `Accept-Language`, `Content-Language` und `Content-Type` sind immer für einfache CORS-Requests erlaubt. +* `allow_headers` – Eine Liste von HTTP-Requestheadern, die für Cross-Origin-Requests unterstützt werden sollten. Standardmäßig `[]`. Sie können `['*']` verwenden, um alle Header zu erlauben. Die Header `Accept`, `Accept-Language`, `Content-Language` und `Content-Type` sind immer für [einfache CORS-Requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests) erlaubt. * `allow_credentials` – Anzeigen, dass Cookies für Cross-Origin-Requests unterstützt werden sollten. Standardmäßig `False`. - Keines der `allow_origins`, `allow_methods` und `allow_headers` kann auf `['*']` gesetzt werden, wenn `allow_credentials` auf `True` gesetzt ist. Alle müssen explizit angegeben werden. + Keines der `allow_origins`, `allow_methods` und `allow_headers` kann auf `['*']` gesetzt werden, wenn `allow_credentials` auf `True` gesetzt ist. Alle müssen [explizit angegeben](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards) werden. * `expose_headers` – Angabe der Responseheader, auf die der Browser zugreifen können soll. Standardmäßig `[]`. * `max_age` – Legt eine maximale Zeit in Sekunden fest, die Browser CORS-Responses zwischenspeichern dürfen. Standardmäßig `600`. @@ -77,7 +77,7 @@ Jeder Request mit einem `Origin`-Header. In diesem Fall wird die Middleware den ## Weitere Informationen { #more-info } -Weitere Informationen zu CORS finden Sie in der Mozilla CORS-Dokumentation. +Weitere Informationen zu CORS finden Sie in der [Mozilla CORS-Dokumentation](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS). /// note | Technische Details diff --git a/docs/de/docs/tutorial/debugging.md b/docs/de/docs/tutorial/debugging.md index cabaf5a3a4..fc58de24c3 100644 --- a/docs/de/docs/tutorial/debugging.md +++ b/docs/de/docs/tutorial/debugging.md @@ -74,7 +74,7 @@ nicht ausgeführt. /// info | Info -Für weitere Informationen besuchen Sie bitte die offizielle Python-Dokumentation. +Für weitere Informationen besuchen Sie bitte [die offizielle Python-Dokumentation](https://docs.python.org/3/library/__main__.html). /// 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 f63273f160..028d280dc7 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 @@ -32,7 +32,7 @@ Damit wird auch vermieden, neue Entwickler möglicherweise zu verwirren, die ein In diesem Beispiel verwenden wir zwei erfundene benutzerdefinierte Header `X-Key` und `X-Token`. -Aber in realen Fällen würden Sie bei der Implementierung von Sicherheit mehr Vorteile durch die Verwendung der integrierten [Sicherheits-Werkzeuge (siehe nächstes Kapitel)](../security/index.md){.internal-link target=_blank} erzielen. +Aber in realen Fällen würden Sie bei der Implementierung von Sicherheit mehr Vorteile durch die Verwendung der integrierten [Sicherheits-Werkzeuge (siehe nächstes Kapitel)](../security/index.md) erzielen. /// @@ -62,7 +62,7 @@ Sie können also eine normale Abhängigkeit (die einen Wert zurückgibt), die Si ## Abhängigkeiten für eine Gruppe von *Pfadoperationen* { #dependencies-for-a-group-of-path-operations } -Wenn Sie später lesen, wie Sie größere Anwendungen strukturieren ([Größere Anwendungen – Mehrere Dateien](../../tutorial/bigger-applications.md){.internal-link target=_blank}), möglicherweise mit mehreren Dateien, lernen Sie, wie Sie einen einzelnen `dependencies`-Parameter für eine Gruppe von *Pfadoperationen* deklarieren. +Wenn Sie später lesen, wie Sie größere Anwendungen strukturieren ([Größere Anwendungen – Mehrere Dateien](../../tutorial/bigger-applications.md)), möglicherweise mit mehreren Dateien, lernen Sie, wie Sie einen einzelnen `dependencies`-Parameter für eine Gruppe von *Pfadoperationen* deklarieren. ## Globale Abhängigkeiten { #global-dependencies } diff --git a/docs/de/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/de/docs/tutorial/dependencies/dependencies-with-yield.md index c5f2acbae5..e1eec2350e 100644 --- a/docs/de/docs/tutorial/dependencies/dependencies-with-yield.md +++ b/docs/de/docs/tutorial/dependencies/dependencies-with-yield.md @@ -14,8 +14,8 @@ Stellen Sie sicher, dass Sie `yield` nur einmal pro Abhängigkeit verwenden. Jede Funktion, die dekoriert werden kann mit: -* `@contextlib.contextmanager` oder -* `@contextlib.asynccontextmanager` +* [`@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) kann auch als gültige **FastAPI**-Abhängigkeit verwendet werden. @@ -87,7 +87,7 @@ Sie können beliebige Kombinationen von Abhängigkeiten haben. /// note | Technische Details -Dieses funktioniert dank Pythons Kontextmanager. +Dieses funktioniert dank Pythons [Kontextmanager](https://docs.python.org/3/library/contextlib.html). **FastAPI** verwendet sie intern, um das zu erreichen. @@ -111,7 +111,7 @@ Aber es ist für Sie da, wenn Sie es brauchen. 🤓 {* ../../docs_src/dependencies/tutorial008b_an_py310.py hl[18:22,31] *} -Wenn Sie Exceptions abfangen und darauf basierend eine benutzerdefinierte Response erstellen möchten, erstellen Sie einen [benutzerdefinierten Exceptionhandler](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}. +Wenn Sie Exceptions abfangen und darauf basierend eine benutzerdefinierte Response erstellen möchten, erstellen Sie einen [benutzerdefinierten Exceptionhandler](../handling-errors.md#install-custom-exception-handlers). ## Abhängigkeiten mit `yield` und `except` { #dependencies-with-yield-and-except } @@ -233,14 +233,14 @@ 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){.internal-link target=_blank}. +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 } „Kontextmanager“ (Englisch „Context Manager“) sind bestimmte Python-Objekte, die Sie in einer `with`-Anweisung verwenden können. -Beispielsweise können Sie `with` verwenden, um eine Datei auszulesen: +Beispielsweise können Sie [„with“ verwenden, um eine Datei auszulesen](https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files): ```Python with open("./somefile.txt") as f: @@ -264,7 +264,7 @@ 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__()`. +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: @@ -274,8 +274,8 @@ Sie können solche auch innerhalb von **FastAPI**-Abhängigkeiten mit `yield` ve Andere Möglichkeiten, einen Kontextmanager zu erstellen, sind: -* `@contextlib.contextmanager` oder -* `@contextlib.asynccontextmanager` +* [`@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. diff --git a/docs/de/docs/tutorial/dependencies/global-dependencies.md b/docs/de/docs/tutorial/dependencies/global-dependencies.md index a9516147c3..ac52cf0bd2 100644 --- a/docs/de/docs/tutorial/dependencies/global-dependencies.md +++ b/docs/de/docs/tutorial/dependencies/global-dependencies.md @@ -2,15 +2,15 @@ Bei einigen Anwendungstypen möchten Sie möglicherweise Abhängigkeiten zur gesamten Anwendung hinzufügen. -Ähnlich wie Sie [`dependencies` zu den *Pfadoperation-Dekoratoren* hinzufügen](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} können, können Sie sie auch zur `FastAPI`-Anwendung hinzufügen. +Ähnlich wie Sie [`dependencies` zu den *Pfadoperation-Dekoratoren* hinzufügen](dependencies-in-path-operation-decorators.md) können, können Sie sie auch zur `FastAPI`-Anwendung hinzufügen. In diesem Fall werden sie auf alle *Pfadoperationen* in der Anwendung angewendet: {* ../../docs_src/dependencies/tutorial012_an_py310.py hl[17] *} -Und alle Ideen aus dem Abschnitt über das [Hinzufügen von `dependencies` zu den *Pfadoperation-Dekoratoren*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} gelten weiterhin, aber in diesem Fall für alle *Pfadoperationen* in der App. +Und alle Ideen aus dem Abschnitt über das [Hinzufügen von `dependencies` zu den *Pfadoperation-Dekoratoren*](dependencies-in-path-operation-decorators.md) gelten weiterhin, aber in diesem Fall für alle *Pfadoperationen* in der App. ## Abhängigkeiten für Gruppen von *Pfadoperationen* { #dependencies-for-groups-of-path-operations } -Wenn Sie später lesen, wie Sie größere Anwendungen strukturieren ([Größere Anwendungen – mehrere Dateien](../../tutorial/bigger-applications.md){.internal-link target=_blank}), möglicherweise mit mehreren Dateien, lernen Sie, wie Sie einen einzelnen `dependencies`-Parameter für eine Gruppe von *Pfadoperationen* deklarieren. +Wenn Sie später lesen, wie Sie größere Anwendungen strukturieren ([Größere Anwendungen – mehrere Dateien](../../tutorial/bigger-applications.md)), möglicherweise mit mehreren Dateien, lernen Sie, wie Sie einen einzelnen `dependencies`-Parameter für eine Gruppe von *Pfadoperationen* deklarieren. diff --git a/docs/de/docs/tutorial/dependencies/index.md b/docs/de/docs/tutorial/dependencies/index.md index 879fd22319..49c65eb37a 100644 --- a/docs/de/docs/tutorial/dependencies/index.md +++ b/docs/de/docs/tutorial/dependencies/index.md @@ -56,7 +56,7 @@ FastAPI unterstützt (und empfiehlt die Verwendung von) `Annotated` seit Version Wenn Sie eine ältere Version haben, werden Sie Fehler angezeigt bekommen, wenn Sie versuchen, `Annotated` zu verwenden. -Bitte [aktualisieren Sie FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} daher mindestens zu Version 0.95.1, bevor Sie `Annotated` verwenden. +Bitte [aktualisieren Sie FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions) daher mindestens zu Version 0.95.1, bevor Sie `Annotated` verwenden. /// @@ -151,7 +151,7 @@ Es spielt keine Rolle. **FastAPI** weiß, was zu tun ist. /// note | Hinweis -Wenn Ihnen das nichts sagt, lesen Sie den [Async: *„In Eile?“*](../../async.md#in-a-hurry){.internal-link target=_blank}-Abschnitt über `async` und `await` in der Dokumentation. +Wenn Ihnen das nichts sagt, lesen Sie den [Async: *„In Eile?“*](../../async.md#in-a-hurry)-Abschnitt über `async` und `await` in der Dokumentation. /// diff --git a/docs/de/docs/tutorial/encoder.md b/docs/de/docs/tutorial/encoder.md index 25dc6fa184..77a87f811c 100644 --- a/docs/de/docs/tutorial/encoder.md +++ b/docs/de/docs/tutorial/encoder.md @@ -12,7 +12,7 @@ Stellen wir uns vor, Sie haben eine Datenbank `fake_db`, die nur JSON-kompatible Sie akzeptiert zum Beispiel keine `datetime`-Objekte, da die nicht kompatibel mit JSON sind. -Ein `datetime`-Objekt müsste also in einen `str` umgewandelt werden, der die Daten im ISO-Format enthält. +Ein `datetime`-Objekt müsste also in einen `str` umgewandelt werden, der die Daten im [ISO-Format](https://en.wikipedia.org/wiki/ISO_8601) enthält. Genauso würde die Datenbank kein Pydantic-Modell (ein Objekt mit Attributen) akzeptieren, sondern nur ein `dict`. @@ -24,7 +24,7 @@ Es nimmt ein Objekt entgegen, wie etwa ein Pydantic-Modell, und gibt eine JSON-k In diesem Beispiel wird das Pydantic-Modell in ein `dict`, und das `datetime`-Objekt in ein `str` konvertiert. -Das Resultat dieses Aufrufs ist etwas, das mit Pythons Standard-`json.dumps()` kodiert werden kann. +Das Resultat dieses Aufrufs ist etwas, das mit Pythons Standard-[`json.dumps()`](https://docs.python.org/3/library/json.html#json.dumps) kodiert werden kann. Es wird also kein großer `str` zurückgegeben, der die Daten im JSON-Format (als String) enthält. Es wird eine Python-Standarddatenstruktur (z. B. ein `dict`) zurückgegeben, mit Werten und Unterwerten, die alle mit JSON kompatibel sind. diff --git a/docs/de/docs/tutorial/extra-data-types.md b/docs/de/docs/tutorial/extra-data-types.md index 5002f0534c..92401172b4 100644 --- a/docs/de/docs/tutorial/extra-data-types.md +++ b/docs/de/docs/tutorial/extra-data-types.md @@ -36,7 +36,7 @@ Hier sind einige der zusätzlichen Datentypen, die Sie verwenden können: * `datetime.timedelta`: * Ein Python-`datetime.timedelta`. * Wird in Requests und Responses als `float` der Gesamtsekunden dargestellt. - * Pydantic ermöglicht auch die Darstellung als „ISO 8601 Zeitdifferenz-Kodierung“, siehe die Dokumentation für weitere Informationen. + * Pydantic ermöglicht auch die Darstellung als „ISO 8601 Zeitdifferenz-Kodierung“, [siehe die Dokumentation für weitere Informationen](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers). * `frozenset`: * Wird in Requests und Responses wie ein `set` behandelt: * Bei Requests wird eine Liste gelesen, Duplikate entfernt und in ein `set` umgewandelt. @@ -49,7 +49,7 @@ Hier sind einige der zusätzlichen Datentypen, die Sie verwenden können: * `Decimal`: * Standard-Python-`Decimal`. * In Requests und Responses wird es wie ein `float` behandelt. -* Sie können alle gültigen Pydantic-Datentypen hier überprüfen: Pydantic-Datentypen. +* Sie können alle gültigen Pydantic-Datentypen hier überprüfen: [Pydantic-Datentypen](https://docs.pydantic.dev/latest/usage/types/types/). ## Beispiel { #example } diff --git a/docs/de/docs/tutorial/extra-models.md b/docs/de/docs/tutorial/extra-models.md index 4f55f2428c..59580d73af 100644 --- a/docs/de/docs/tutorial/extra-models.md +++ b/docs/de/docs/tutorial/extra-models.md @@ -12,7 +12,7 @@ Dies gilt insbesondere für Benutzermodelle, denn: Speichern Sie niemals das Klartextpasswort eines Benutzers. Speichern Sie immer einen „sicheren Hash“, den Sie dann verifizieren können. -Wenn Sie nicht wissen, was das ist, werden Sie in den [Sicherheitskapiteln](security/simple-oauth2.md#password-hashing){.internal-link target=_blank} lernen, was ein „Passworthash“ ist. +Wenn Sie nicht wissen, was das ist, werden Sie in den [Sicherheitskapiteln](security/simple-oauth2.md#password-hashing) lernen, was ein „Passworthash“ ist. /// @@ -162,11 +162,11 @@ Sie können deklarieren, dass eine `typing.Union`: +Um das zu tun, verwenden Sie den Standard-Python-Typhinweis [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union): /// note | Hinweis -Wenn Sie eine `Union` definieren, listen Sie den spezifischeren Typ zuerst auf, gefolgt vom weniger spezifischen Typ. Im Beispiel unten steht `PlaneItem` vor `CarItem` in `Union[PlaneItem, CarItem]`. +Wenn Sie eine [`Union`](https://docs.pydantic.dev/latest/concepts/types/#unions) definieren, listen Sie den spezifischeren Typ zuerst auf, gefolgt vom weniger spezifischen Typ. Im Beispiel unten steht `PlaneItem` vor `CarItem` in `Union[PlaneItem, CarItem]`. /// diff --git a/docs/de/docs/tutorial/first-steps.md b/docs/de/docs/tutorial/first-steps.md index f02fb3d433..0cf3d03a9f 100644 --- a/docs/de/docs/tutorial/first-steps.md +++ b/docs/de/docs/tutorial/first-steps.md @@ -11,7 +11,7 @@ Starten Sie den Live-Server:
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -58,7 +58,7 @@ Diese Zeile zeigt die URL, unter der Ihre App auf Ihrem lokalen Computer bereitg ### Es testen { #check-it } -Öffnen Sie Ihren Browser unter http://127.0.0.1:8000. +Öffnen Sie Ihren Browser unter [http://127.0.0.1:8000](http://127.0.0.1:8000). Sie werden die JSON-Response sehen: @@ -68,17 +68,17 @@ Sie werden die JSON-http://127.0.0.1:8000/docs. +Gehen Sie als Nächstes auf [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). -Sie werden die automatisch erzeugte, interaktive API-Dokumentation sehen (bereitgestellt durch Swagger UI): +Sie werden die automatisch erzeugte, interaktive API-Dokumentation sehen (bereitgestellt durch [Swagger UI](https://github.com/swagger-api/swagger-ui)): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Alternative API-Dokumentation { #alternative-api-docs } -Gehen Sie nun auf http://127.0.0.1:8000/redoc. +Gehen Sie nun auf [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). -Dort sehen Sie die alternative, automatische Dokumentation (bereitgestellt durch ReDoc): +Dort sehen Sie die alternative, automatische Dokumentation (bereitgestellt durch [ReDoc](https://github.com/Rebilly/ReDoc)): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -92,7 +92,7 @@ Ein „Schema“ ist eine Definition oder Beschreibung von etwas. Nicht der eige #### API-„Schema“ { #api-schema } -In diesem Fall ist OpenAPI eine Spezifikation, die vorschreibt, wie ein Schema für Ihre API zu definieren ist. +In diesem Fall ist [OpenAPI](https://github.com/OAI/OpenAPI-Specification) eine Spezifikation, die vorschreibt, wie ein Schema für Ihre API zu definieren ist. Diese Schemadefinition enthält Ihre API-Pfade, die möglichen Parameter, welche diese entgegennehmen, usw. @@ -110,7 +110,7 @@ OpenAPI definiert ein API-Schema für Ihre API. Dieses Schema enthält Definitio Falls Sie wissen möchten, wie das rohe OpenAPI-Schema aussieht: FastAPI generiert automatisch ein JSON (Schema) mit den Beschreibungen Ihrer gesamten API. -Sie können es direkt einsehen unter: http://127.0.0.1:8000/openapi.json. +Sie können es direkt einsehen unter: [http://127.0.0.1:8000/openapi.json](http://127.0.0.1:8000/openapi.json). Es wird ein JSON angezeigt, welches ungefähr so aussieht: @@ -143,9 +143,58 @@ Es gibt dutzende Alternativen, die alle auf OpenAPI basieren. Sie können jede d Ebenfalls können Sie es verwenden, um automatisch Code für Clients zu generieren, die mit Ihrer API kommunizieren. Zum Beispiel für Frontend-, Mobile- oder IoT-Anwendungen. +### Den App-`entrypoint` in `pyproject.toml` konfigurieren { #configure-the-app-entrypoint-in-pyproject-toml } + +Sie können in einer `pyproject.toml`-Datei konfigurieren, wo sich Ihre App befindet, z. B.: + +```toml +[tool.fastapi] +entrypoint = "main:app" +``` + +Dieser `entrypoint` teilt dem `fastapi`-Befehl mit, dass er die App folgendermaßen importieren soll: + +```python +from main import app +``` + +Wenn Ihr Code so strukturiert wäre: + +``` +. +├── backend +│   ├── main.py +│   ├── __init__.py +``` + +Dann würden Sie den `entrypoint` so setzen: + +```toml +[tool.fastapi] +entrypoint = "backend.main:app" +``` + +was äquivalent wäre zu: + +```python +from backend.main import app +``` + +### `fastapi dev` mit Pfad { #fastapi-dev-with-path } + +Sie können auch den Dateipfad an den Befehl `fastapi dev` übergeben, und er wird das zu verwendende FastAPI-App-Objekt erraten: + +```console +$ 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 deployen, treten Sie der Warteliste bei, falls Sie es noch nicht getan haben. 🚀 +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. @@ -191,7 +240,7 @@ Das war's! Jetzt können Sie Ihre App unter dieser URL aufrufen. ✨ `FastAPI` ist eine Klasse, die direkt von `Starlette` erbt. -Sie können alle Starlette-Funktionalitäten auch mit `FastAPI` nutzen. +Sie können alle [Starlette](https://www.starlette.dev/)-Funktionalitäten auch mit `FastAPI` nutzen. /// @@ -336,7 +385,7 @@ Sie könnten sie auch als normale Funktion anstelle von `async def` definieren: /// note | Hinweis -Wenn Sie den Unterschied nicht kennen, lesen Sie [Async: *„In Eile?“*](../async.md#in-a-hurry){.internal-link target=_blank}. +Wenn Sie den Unterschied nicht kennen, lesen Sie [Async: *„In Eile?“*](../async.md#in-a-hurry). /// @@ -352,11 +401,11 @@ Es gibt viele andere Objekte und Modelle, die automatisch zu JSON konvertiert we ### Schritt 6: Deployen { #step-6-deploy-it } -Stellen Sie Ihre App in der **FastAPI Cloud** mit einem Befehl bereit: `fastapi deploy`. 🎉 +Stellen Sie Ihre App in der **[FastAPI Cloud](https://fastapicloud.com)** mit einem Befehl bereit: `fastapi deploy`. 🎉 #### Über FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** wird vom selben Autor und Team hinter **FastAPI** entwickelt. +**[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. diff --git a/docs/de/docs/tutorial/handling-errors.md b/docs/de/docs/tutorial/handling-errors.md index 0cb0de2ca4..261831a8eb 100644 --- a/docs/de/docs/tutorial/handling-errors.md +++ b/docs/de/docs/tutorial/handling-errors.md @@ -81,7 +81,7 @@ Aber falls Sie es für ein fortgeschrittenes Szenario benötigen, können Sie be ## Benutzerdefinierte Exceptionhandler installieren { #install-custom-exception-handlers } -Sie können benutzerdefinierte Exceptionhandler mit den gleichen Exception-Werkzeugen von Starlette hinzufügen. +Sie können benutzerdefinierte Exceptionhandler mit [denselben Exception-Werkzeugen von Starlette](https://www.starlette.dev/exceptions/) hinzufügen. Angenommen, Sie haben eine benutzerdefinierte Exception `UnicornException`, die Sie (oder eine Bibliothek, die Sie verwenden) `raise`n könnten. diff --git a/docs/de/docs/tutorial/index.md b/docs/de/docs/tutorial/index.md index 70a6b6a082..4b5272ebd2 100644 --- a/docs/de/docs/tutorial/index.md +++ b/docs/de/docs/tutorial/index.md @@ -10,12 +10,12 @@ Es ist auch so gestaltet, dass es als zukünftige Referenz dient, sodass Sie jed Alle Codeblöcke können kopiert und direkt verwendet werden (es sind tatsächlich getestete Python-Dateien). -Um eines der Beispiele auszuführen, kopieren Sie den Code in eine Datei `main.py` und starten Sie `fastapi dev` mit: +Um eines der Beispiele auszuführen, kopieren Sie den Code in eine Datei `main.py`, und starten Sie `fastapi dev`:
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -62,7 +62,7 @@ Die Verwendung in Ihrem eigenen Editor zeigt Ihnen die Vorteile von FastAPI am b Der erste Schritt besteht darin, FastAPI zu installieren. -Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und dann **FastAPI installieren**: +Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md) erstellen, sie aktivieren und dann **FastAPI installieren**:
@@ -76,7 +76,7 @@ $ pip install "fastapi[standard]" /// note | Hinweis -Wenn Sie mit `pip install "fastapi[standard]"` installieren, werden einige optionale Standard-Abhängigkeiten mit installiert, einschließlich `fastapi-cloud-cli`, welches Ihnen das Deployment in der FastAPI Cloud ermöglicht. +Wenn Sie mit `pip install "fastapi[standard]"` installieren, werden einige optionale Standard-Abhängigkeiten mit installiert, einschließlich `fastapi-cloud-cli`, welches Ihnen das Deployment in der [FastAPI Cloud](https://fastapicloud.com) ermöglicht. Wenn Sie diese optionalen Abhängigkeiten nicht haben möchten, können Sie stattdessen `pip install fastapi` installieren. @@ -84,6 +84,12 @@ Wenn Sie die Standard-Abhängigkeiten, aber ohne das `fastapi-cloud-cli` install /// +/// tip | Tipp + +FastAPI hat eine [offizielle Erweiterung für VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (und Cursor), die viele Funktionen bereitstellt, darunter einen Pfadoperation-Explorer, eine Pfadoperation-Suche, CodeLens-Navigation in Tests (zur Definition aus Tests springen) sowie FastAPI-Cloud-Deployment und Logs – alles direkt aus Ihrem Editor. + +/// + ## Handbuch für fortgeschrittene Benutzer { #advanced-user-guide } Es gibt auch ein **Handbuch für fortgeschrittene Benutzer**, das Sie nach diesem **Tutorial – Benutzerhandbuch** lesen können. diff --git a/docs/de/docs/tutorial/metadata.md b/docs/de/docs/tutorial/metadata.md index f5999a667f..498ad83a8a 100644 --- a/docs/de/docs/tutorial/metadata.md +++ b/docs/de/docs/tutorial/metadata.md @@ -14,7 +14,7 @@ Sie können die folgenden Felder festlegen, die in der OpenAPI-Spezifikation und | `version` | `string` | 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
ParameterTypBeschreibung
namestrDer identifizierende Name der Kontaktperson/Organisation.
urlstrDie URL, die auf die Kontaktinformationen verweist. MUSS im Format einer URL vorliegen.
emailstrDie E-Mail-Adresse der Kontaktperson/Organisation. MUSS im Format einer E-Mail-Adresse vorliegen.
| -| `license_info` | `dict` | Die Lizenzinformationen für die freigegebene API. Kann mehrere Felder enthalten.
license_info-Felder
ParameterTypBeschreibung
namestrERFORDERLICH (wenn eine license_info festgelegt ist). Der für die API verwendete Lizenzname.
identifierstrEin SPDX-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.
urlstrEine URL zur Lizenz, die für die API verwendet wird. MUSS im Format einer URL vorliegen.
| +| `license_info` | `dict` | Die Lizenzinformationen für die freigegebene API. Kann mehrere Felder enthalten.
license_info-Felder
ParameterTypBeschreibung
namestrERFORDERLICH (wenn eine license_info festgelegt ist). Der für die API verwendete Lizenzname.
identifierstrEin [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.
urlstrEine URL zur Lizenz, die für die API verwendet wird. MUSS im Format einer URL vorliegen.
| Sie können diese wie folgt setzen: @@ -76,7 +76,7 @@ Verwenden Sie den Parameter `tags` mit Ihren *Pfadoperationen* (und `APIRouter`n /// info | Info -Lesen Sie mehr zu Tags unter [Pfadoperation-Konfiguration](path-operation-configuration.md#tags){.internal-link target=_blank}. +Lesen Sie mehr zu Tags unter [Pfadoperation-Konfiguration](path-operation-configuration.md#tags). /// diff --git a/docs/de/docs/tutorial/middleware.md b/docs/de/docs/tutorial/middleware.md index 116f87d23c..0e8da4dcef 100644 --- a/docs/de/docs/tutorial/middleware.md +++ b/docs/de/docs/tutorial/middleware.md @@ -15,7 +15,7 @@ Eine „Middleware“ ist eine Funktion, die mit jedem **unter Verwendung des `X-`-Präfixes. +Beachten Sie, dass benutzerdefinierte proprietäre Header hinzugefügt werden können [unter Verwendung des `X-`-Präfixes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). -Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen soll, müssen Sie sie zu Ihrer CORS-Konfiguration ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) hinzufügen, indem Sie den Parameter `expose_headers` verwenden, der in der Starlettes CORS-Dokumentation dokumentiert ist. +Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen soll, müssen Sie sie zu Ihrer CORS-Konfiguration ([CORS (Cross-Origin Resource Sharing)](cors.md)) hinzufügen, indem Sie den Parameter `expose_headers` verwenden, der in [Starlettes CORS-Dokumentation](https://www.starlette.dev/middleware/#corsmiddleware) dokumentiert ist. /// @@ -61,7 +61,7 @@ Sie könnten beispielsweise einen benutzerdefinierten Header `X-Process-Time` hi /// tip | Tipp -Hier verwenden wir `time.perf_counter()` anstelle von `time.time()`, da es für diese Anwendungsfälle präziser sein kann. 🤓 +Hier verwenden wir [`time.perf_counter()`](https://docs.python.org/3/library/time.html#time.perf_counter) anstelle von `time.time()`, da es für diese Anwendungsfälle präziser sein kann. 🤓 /// @@ -90,6 +90,6 @@ Dieses Stapelverhalten stellt sicher, dass Middlewares in einer vorhersehbaren u ## Andere Middlewares { #other-middlewares } -Sie können später mehr über andere Middlewares im [Handbuch für fortgeschrittene Benutzer: Fortgeschrittene Middleware](../advanced/middleware.md){.internal-link target=_blank} lesen. +Sie können später mehr über andere Middlewares im [Handbuch für fortgeschrittene Benutzer: Fortgeschrittene Middleware](../advanced/middleware.md) lesen. In der nächsten Sektion erfahren Sie, wie Sie CORS mit einer Middleware behandeln können. diff --git a/docs/de/docs/tutorial/path-operation-configuration.md b/docs/de/docs/tutorial/path-operation-configuration.md index 48d6d66035..111c714946 100644 --- a/docs/de/docs/tutorial/path-operation-configuration.md +++ b/docs/de/docs/tutorial/path-operation-configuration.md @@ -58,7 +58,7 @@ Sie können eine `summary` und eine Docstring der Funktion deklarieren, und **FastAPI** wird sie daraus auslesen. -Sie können Markdown im Docstring schreiben, es wird korrekt interpretiert und angezeigt (unter Berücksichtigung der Einrückung des Docstring). +Sie können [Markdown](https://en.wikipedia.org/wiki/Markdown) im Docstring schreiben, es wird korrekt interpretiert und angezeigt (unter Berücksichtigung der Einrückung des Docstring). {* ../../docs_src/path_operation_configuration/tutorial004_py310.py hl[17:25] *} diff --git a/docs/de/docs/tutorial/path-params-numeric-validations.md b/docs/de/docs/tutorial/path-params-numeric-validations.md index 5147a7fbc7..76c782c52c 100644 --- a/docs/de/docs/tutorial/path-params-numeric-validations.md +++ b/docs/de/docs/tutorial/path-params-numeric-validations.md @@ -14,7 +14,7 @@ FastAPI hat in Version 0.95.0 Unterstützung für `Annotated` hinzugefügt und e Wenn Sie eine ältere Version haben, würden Fehler angezeigt werden, wenn Sie versuchen, `Annotated` zu verwenden. -Stellen Sie sicher, dass Sie [FastAPI aktualisieren](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank}, auf mindestens Version 0.95.1, bevor Sie `Annotated` verwenden. +Stellen Sie sicher, dass Sie [FastAPI aktualisieren](../deployment/versions.md#upgrading-the-fastapi-versions), auf mindestens Version 0.95.1, bevor Sie `Annotated` verwenden. /// @@ -122,7 +122,7 @@ Und das Gleiche gilt für lthttp://127.0.0.1:8000/items/foo gehen, sehen Sie als Response: +Wenn Sie dieses Beispiel ausführen und auf [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo) gehen, sehen Sie als Response: ```JSON {"item_id":"foo"} @@ -28,7 +28,7 @@ Dadurch erhalten Sie Editor-Unterstützung innerhalb Ihrer Funktion, mit Fehlerp ## Daten-Konversion { #data-conversion } -Wenn Sie dieses Beispiel ausführen und Ihren Browser unter http://127.0.0.1:8000/items/3 öffnen, sehen Sie als Response: +Wenn Sie dieses Beispiel ausführen und Ihren Browser unter [http://127.0.0.1:8000/items/3](http://127.0.0.1:8000/items/3) öffnen, sehen Sie als Response: ```JSON {"item_id":3} @@ -36,7 +36,7 @@ Wenn Sie dieses Beispiel ausführen und Ihren Browser unter „parsen“. @@ -44,7 +44,7 @@ Sprich, mit dieser Typdeklaration wird **FastAPI** den http://127.0.0.1:8000/items/foo besuchen, erhalten Sie eine hübsche HTTP-Fehlermeldung: +Wenn Sie aber im Browser [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo) besuchen, erhalten Sie eine hübsche HTTP-Fehlermeldung: ```JSON { @@ -62,9 +62,9 @@ Wenn Sie aber im Browser http://127.0.0.1:8000/items/4.2 +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 @@ -78,7 +78,7 @@ Das ist unglaublich hilfreich, wenn Sie Code entwickeln und debuggen, welcher mi ## Dokumentation { #documentation } -Wenn Sie die Seite http://127.0.0.1:8000/docs in Ihrem Browser öffnen, sehen Sie eine automatische, interaktive API-Dokumentation: +Wenn Sie die Seite [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) in Ihrem Browser öffnen, sehen Sie eine automatische, interaktive API-Dokumentation: @@ -92,9 +92,9 @@ Beachten Sie, dass der Pfad-Parameter dort als Ganzzahl deklariert ist. ## Nützliche Standards, alternative Dokumentation { #standards-based-benefits-alternative-documentation } -Und weil das generierte Schema vom OpenAPI-Standard kommt, gibt es viele kompatible Tools. +Und weil das generierte Schema vom [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md)-Standard kommt, gibt es viele kompatible Tools. -Zum Beispiel bietet **FastAPI** selbst eine alternative API-Dokumentation (verwendet ReDoc), welche Sie unter http://127.0.0.1:8000/redoc einsehen können: +Zum Beispiel bietet **FastAPI** selbst eine alternative API-Dokumentation (verwendet ReDoc), welche Sie unter [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) einsehen können: @@ -102,7 +102,7 @@ Und viele weitere kompatible Tools. Inklusive Codegenerierung für viele Sprache ## Pydantic { #pydantic } -Die ganze Datenvalidierung wird hinter den Kulissen von Pydantic durchgeführt, Sie profitieren also von dessen Vorteilen. Und Sie wissen, dass Sie in guten Händen sind. +Die ganze Datenvalidierung wird hinter den Kulissen von [Pydantic](https://docs.pydantic.dev/) durchgeführt, Sie profitieren also von dessen Vorteilen. Und Sie wissen, dass Sie in guten Händen sind. Sie können für Typdeklarationen auch `str`, `float`, `bool` und viele andere komplexe Datentypen verwenden. @@ -120,7 +120,7 @@ Weil *Pfadoperationen* in ihrer Reihenfolge ausgewertet werden, müssen Sie sich {* ../../docs_src/path_params/tutorial003_py310.py hl[6,11] *} -Ansonsten würde der Pfad für `/users/{user_id}` auch `/users/me` auswerten, und annehmen, dass ein Parameter `user_id` mit dem Wert `"me"` übergeben wurde. +Ansonsten würde der Pfad für `/users/{user_id}` auch `/users/me` auswerten, und annehmen, dass ein Parameter `user_id` mit dem Wert „me“ übergeben wurde. Sie können eine Pfadoperation auch nicht erneut definieren: diff --git a/docs/de/docs/tutorial/query-params-str-validations.md b/docs/de/docs/tutorial/query-params-str-validations.md index 865d10d13c..ed277456e1 100644 --- a/docs/de/docs/tutorial/query-params-str-validations.md +++ b/docs/de/docs/tutorial/query-params-str-validations.md @@ -35,13 +35,13 @@ FastAPI hat Unterstützung für `Annotated` hinzugefügt (und begonnen, es zu em Wenn Sie eine ältere Version haben, würden Sie Fehler erhalten, beim Versuch, `Annotated` zu verwenden. -Stellen Sie sicher, dass Sie [die FastAPI-Version aktualisieren](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank}, auf mindestens Version 0.95.1, bevor Sie `Annotated` verwenden. +Stellen Sie sicher, dass Sie [die FastAPI-Version aktualisieren](../deployment/versions.md#upgrading-the-fastapi-versions), auf mindestens Version 0.95.1, bevor Sie `Annotated` verwenden. /// ## `Annotated` im Typ für den `q`-Parameter verwenden { #use-annotated-in-the-type-for-the-q-parameter } -Erinnern Sie sich, dass ich Ihnen zuvor in [Python-Typen-Intro](../python-types.md#type-hints-with-metadata-annotations){.internal-link target=_blank} gesagt habe, dass `Annotated` verwendet werden kann, um Metadaten zu Ihren Parametern hinzuzufügen? +Erinnern Sie sich, dass ich Ihnen zuvor in [Python-Typen-Intro](../python-types.md#type-hints-with-metadata-annotations) gesagt habe, dass `Annotated` verwendet werden kann, um Metadaten zu Ihren Parametern hinzuzufügen? Jetzt ist es soweit, dies mit FastAPI zu verwenden. 🚀 @@ -133,7 +133,7 @@ Zum Beispiel ist das nicht erlaubt: q: Annotated[str, Query(default="rick")] = "morty" ``` -... denn es ist nicht klar, ob der Defaultwert `"rick"` oder `"morty"` sein soll. +... denn es ist nicht klar, ob der Defaultwert „rick“ oder „morty“ sein soll. Sie würden also (bevorzugt) schreiben: @@ -157,7 +157,7 @@ Sie könnten **diese gleiche Funktion** in **anderen Stellen** ohne FastAPI **au Wenn Sie `Annotated` nicht verwenden und stattdessen die **(alte) Defaultwert-Stilform** verwenden, müssen Sie sich daran **erinnern**, die Argumente der Funktion zu übergeben, wenn Sie diese Funktion ohne FastAPI in **anderen Stellen** aufrufen. Ansonsten sind die Werte anders als erwartet (z. B. `QueryInfo` oder etwas Ähnliches statt `str`). Ihr Editor kann Ihnen nicht helfen, und Python wird die Funktion ohne Klagen ausführen und sich nur beschweren wenn die Operationen innerhalb auf einen Fehler stoßen. -Da `Annotated` mehr als eine Metadaten-Annotation haben kann, könnten Sie dieselbe Funktion sogar mit anderen Tools verwenden, wie z. B. Typer. 🚀 +Da `Annotated` mehr als eine Metadaten-Annotation haben kann, könnten Sie dieselbe Funktion sogar mit anderen Tools verwenden, wie z. B. [Typer](https://typer.tiangolo.com/). 🚀 ## Mehr Validierungen hinzufügen { #add-more-validations } @@ -185,7 +185,7 @@ Aber nun wissen Sie, dass Sie sie in **FastAPI** immer dann verwenden können, w Natürlich können Sie Defaultwerte verwenden, die nicht `None` sind. -Nehmen wir an, Sie möchten, dass der `q` Query-Parameter eine `min_length` von `3` hat und einen Defaultwert von `"fixedquery"`: +Nehmen wir an, Sie möchten, dass der `q` Query-Parameter eine `min_length` von `3` hat und einen Defaultwert von „fixedquery“: {* ../../docs_src/query_params_str_validations/tutorial005_an_py310.py hl[9] *} @@ -369,11 +369,11 @@ Es kann Fälle geben, in denen Sie eine **benutzerdefinierte Validierung** durch In diesen Fällen können Sie eine **benutzerdefinierte Validierungsfunktion** verwenden, die nach der normalen Validierung angewendet wird (z. B. nach der Validierung, dass der Wert ein `str` ist). -Sie können dies mit Pydantics `AfterValidator` innerhalb von `Annotated` erreichen. +Sie können dies mit [Pydantics `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) innerhalb von `Annotated` erreichen. /// tip | Tipp -Pydantic unterstützt auch `BeforeValidator` und andere. 🤓 +Pydantic unterstützt auch [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator) und andere. 🤓 /// diff --git a/docs/de/docs/tutorial/query-params.md b/docs/de/docs/tutorial/query-params.md index 5a2a2a012e..56aca4c2e1 100644 --- a/docs/de/docs/tutorial/query-params.md +++ b/docs/de/docs/tutorial/query-params.md @@ -182,6 +182,6 @@ In diesem Fall gibt es drei Query-Parameter: /// tip | Tipp -Sie können auch `Enum`s verwenden, auf die gleiche Weise wie mit [Pfad-Parametern](path-params.md#predefined-values){.internal-link target=_blank}. +Sie können auch `Enum`s verwenden, auf die gleiche Weise wie mit [Pfad-Parametern](path-params.md#predefined-values). /// diff --git a/docs/de/docs/tutorial/request-files.md b/docs/de/docs/tutorial/request-files.md index 5b5f72d6db..a4c1318ef2 100644 --- a/docs/de/docs/tutorial/request-files.md +++ b/docs/de/docs/tutorial/request-files.md @@ -4,9 +4,9 @@ Sie können Dateien, die vom Client hochgeladen werden, mithilfe von `File` defi /// info | Info -Um hochgeladene Dateien zu empfangen, installieren Sie zuerst `python-multipart`. +Um hochgeladene Dateien zu empfangen, installieren Sie zuerst [`python-multipart`](https://github.com/Kludex/python-multipart). -Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und dann das Paket installieren, zum Beispiel: +Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md) erstellen, sie aktivieren und dann das Paket installieren, zum Beispiel: ```console $ pip install python-multipart @@ -63,8 +63,8 @@ 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 `async`hrone Schnittstelle. -* Es stellt ein tatsächliches Python-`SpooledTemporaryFile`-Objekt bereit, welches Sie direkt anderen Bibliotheken übergeben können, die ein dateiartiges Objekt erwarten. +* Es hat eine [dateiartige](https://docs.python.org/3/glossary.html#term-file-like-object) `async`hrone 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 } @@ -72,14 +72,14 @@ Definieren Sie einen Datei-Parameter mit dem Typ `UploadFile`: * `filename`: Ein `str` mit dem ursprünglichen Namen der hochgeladenen Datei (z. B. `meinbild.jpg`). * `content_type`: Ein `str` mit dem Inhaltstyp (MIME-Typ / Medientyp) (z. B. `image/jpeg`). -* `file`: Ein `SpooledTemporaryFile` (ein dateiartiges 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-Objekt, 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). * `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. - * Z. B. würde `await myfile.seek(0)` zum Anfang der Datei gehen. + * 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. @@ -105,7 +105,7 @@ Wenn Sie die `async`-Methoden verwenden, führt **FastAPI** die Datei-Methoden i /// note | Technische Details zu Starlette -**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. +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. /// @@ -121,7 +121,7 @@ Daten aus Formularen werden, wenn es keine Dateien sind, normalerweise mit dem < 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. +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). /// diff --git a/docs/de/docs/tutorial/request-form-models.md b/docs/de/docs/tutorial/request-form-models.md index 262a14d6db..f3ddaee813 100644 --- a/docs/de/docs/tutorial/request-form-models.md +++ b/docs/de/docs/tutorial/request-form-models.md @@ -4,9 +4,9 @@ Sie können **Pydantic-Modelle** verwenden, um **Formularfelder** in FastAPI zu /// info | Info -Um Formulare zu verwenden, installieren Sie zuerst `python-multipart`. +Um Formulare zu verwenden, installieren Sie zuerst [`python-multipart`](https://github.com/Kludex/python-multipart). -Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und es dann installieren, zum Beispiel: +Stellen Sie sicher, dass Sie eine [Virtuelle Umgebung](../virtual-environments.md) erstellen, sie aktivieren und es dann installieren, zum Beispiel: ```console $ pip install 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 f779ff509f..8b4e85c0d3 100644 --- a/docs/de/docs/tutorial/request-forms-and-files.md +++ b/docs/de/docs/tutorial/request-forms-and-files.md @@ -4,9 +4,9 @@ Sie können gleichzeitig Dateien und Formulardaten mit `File` und `Form` definie /// info | Info -Um hochgeladene Dateien und/oder Formulardaten zu empfangen, installieren Sie zuerst `python-multipart`. +Um hochgeladene Dateien und/oder Formulardaten zu empfangen, installieren Sie zuerst [`python-multipart`](https://github.com/Kludex/python-multipart). -Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, diese aktivieren und es dann installieren, z. B.: +Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md) erstellen, diese aktivieren und es dann installieren, z. B.: ```console $ pip install python-multipart diff --git a/docs/de/docs/tutorial/request-forms.md b/docs/de/docs/tutorial/request-forms.md index 4a36dba725..bc2578c01c 100644 --- a/docs/de/docs/tutorial/request-forms.md +++ b/docs/de/docs/tutorial/request-forms.md @@ -4,9 +4,9 @@ Wenn Sie Felder aus Formularen statt JSON empfangen müssen, können Sie `Form` /// info | Info -Um Formulare zu verwenden, installieren Sie zuerst `python-multipart`. +Um Formulare zu verwenden, installieren Sie zuerst [`python-multipart`](https://github.com/Kludex/python-multipart). -Erstellen Sie unbedingt eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank}, aktivieren Sie diese und installieren Sie dann das Paket, zum Beispiel: +Erstellen Sie unbedingt eine [virtuelle Umgebung](../virtual-environments.md), aktivieren Sie diese und installieren Sie dann das Paket, zum Beispiel: ```console $ pip install python-multipart @@ -56,7 +56,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. +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 99d194fe1c..0aafda954c 100644 --- a/docs/de/docs/tutorial/response-model.md +++ b/docs/de/docs/tutorial/response-model.md @@ -13,6 +13,7 @@ FastAPI wird diesen Rückgabetyp verwenden, um: * In der OpenAPI *Pfadoperation* ein **JSON-Schema** für die Response hinzuzufügen. * Dieses wird von der **automatischen Dokumentation** verwendet. * Es wird auch von automatisch Client-Code-generierenden Tools verwendet. +* Die zurückgegebenen Daten mit Pydantic zu **serialisieren** (zu JSON). Pydantic ist in **Rust** geschrieben und daher **viel schneller**. Aber am wichtigsten: @@ -73,9 +74,9 @@ Im Folgenden deklarieren wir ein `UserIn`-Modell; es enthält ein Klartext-Passw /// info | Info -Um `EmailStr` zu verwenden, installieren Sie zuerst `email-validator`. +Um `EmailStr` zu verwenden, installieren Sie zuerst [`email-validator`](https://github.com/JoshData/python-email-validator). -Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und es dann installieren, zum Beispiel: +Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../virtual-environments.md) erstellen, sie aktivieren und es dann installieren, zum Beispiel: ```console $ pip install email-validator @@ -181,7 +182,7 @@ Es kann Fälle geben, bei denen Sie etwas zurückgeben, das kein gültiges Pydan ### Eine Response direkt zurückgeben { #return-a-response-directly } -Der häufigste Anwendungsfall ist, wenn Sie [eine Response direkt zurückgeben, wie es später im Handbuch für fortgeschrittene Benutzer erläutert wird](../advanced/response-directly.md){.internal-link target=_blank}. +Der häufigste Anwendungsfall ist, wenn Sie [eine Response direkt zurückgeben, wie es später im Handbuch für fortgeschrittene Benutzer erläutert wird](../advanced/response-directly.md). {* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *} @@ -257,7 +258,7 @@ Sie können auch: * `response_model_exclude_defaults=True` * `response_model_exclude_none=True` -verwenden, wie in der Pydantic Dokumentation für `exclude_defaults` und `exclude_none` beschrieben. +verwenden, wie in der [Pydantic-Dokumentation](https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict) für `exclude_defaults` und `exclude_none` beschrieben. /// diff --git a/docs/de/docs/tutorial/response-status-code.md b/docs/de/docs/tutorial/response-status-code.md index 2ed74f5901..a0018a13dc 100644 --- a/docs/de/docs/tutorial/response-status-code.md +++ b/docs/de/docs/tutorial/response-status-code.md @@ -20,7 +20,7 @@ Dem `status_code`-Parameter wird eine Zahl mit dem HTTP-Statuscode übergeben. /// info | Info -Alternativ kann `status_code` auch ein `IntEnum` erhalten, wie etwa Pythons `http.HTTPStatus`. +Alternativ kann `status_code` auch ein `IntEnum` erhalten, wie etwa Pythons [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus). /// @@ -66,7 +66,7 @@ Kurz gefasst: /// tip | Tipp -Um mehr über die einzelnen Statuscodes zu erfahren und welcher wofür verwendet wird, sehen Sie sich die MDN Dokumentation über HTTP-Statuscodes an. +Um mehr über die einzelnen Statuscodes zu erfahren und welcher wofür verwendet wird, sehen Sie sich die [MDN Dokumentation über HTTP-Statuscodes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status) an. /// @@ -98,4 +98,4 @@ Sie könnten auch `from starlette import status` verwenden. ## Den Defaultwert ändern { #changing-the-default } -Später im [Handbuch für fortgeschrittene Benutzer](../advanced/response-change-status-code.md){.internal-link target=_blank} werden Sie sehen, wie Sie einen anderen Statuscode zurückgeben können, als den Default, den Sie hier deklarieren. +Später im [Handbuch für fortgeschrittene Benutzer](../advanced/response-change-status-code.md) werden Sie sehen, wie Sie einen anderen Statuscode zurückgeben können, als den Default, den Sie hier deklarieren. diff --git a/docs/de/docs/tutorial/schema-extra-example.md b/docs/de/docs/tutorial/schema-extra-example.md index c7b1c2b9ea..bdb67bd68f 100644 --- a/docs/de/docs/tutorial/schema-extra-example.md +++ b/docs/de/docs/tutorial/schema-extra-example.md @@ -12,7 +12,7 @@ Sie können `examples` („Beispiele“) für ein Pydantic-Modell deklarieren, w Diese zusätzlichen Informationen werden unverändert zum für dieses Modell ausgegebenen **JSON-Schema** hinzugefügt und in der API-Dokumentation verwendet. -Sie können das Attribut `model_config` verwenden, das ein `dict` akzeptiert, wie beschrieben in Pydantic-Dokumentation: Configuration. +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`. @@ -145,12 +145,12 @@ JSON Schema hatte keine `examples`, daher fügte OpenAPI seiner eigenen modifizi OpenAPI fügte auch die Felder `example` und `examples` zu anderen Teilen der Spezifikation hinzu: -* `Parameter Object` (in der Spezifikation), das verwendet wurde von FastAPIs: +* [`Parameter Object` (in der Spezifikation)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object), das verwendet wurde von FastAPIs: * `Path()` * `Query()` * `Header()` * `Cookie()` -* `Request Body Object` im Feld `content` des `Media Type Object`s (in der Spezifikation), das verwendet wurde von FastAPIs: +* [`Request Body Object` im Feld `content` des `Media Type Object`s (in der Spezifikation)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object), das verwendet wurde von FastAPIs: * `Body()` * `File()` * `Form()` @@ -163,7 +163,7 @@ Dieser alte, OpenAPI-spezifische `examples`-Parameter heißt seit FastAPI `0.103 ### JSON Schemas Feld `examples` { #json-schemas-examples-field } -Aber dann fügte JSON Schema ein `examples`-Feld zu einer neuen Version der Spezifikation hinzu. +Aber dann fügte JSON Schema ein [`examples`](https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5)-Feld zu einer neuen Version der Spezifikation hinzu. Und dann basierte das neue OpenAPI 3.1.0 auf der neuesten Version (JSON Schema 2020-12), die dieses neue Feld `examples` enthielt. diff --git a/docs/de/docs/tutorial/security/first-steps.md b/docs/de/docs/tutorial/security/first-steps.md index 5806a8ea0f..8a1d2fbf18 100644 --- a/docs/de/docs/tutorial/security/first-steps.md +++ b/docs/de/docs/tutorial/security/first-steps.md @@ -26,11 +26,11 @@ Kopieren Sie das Beispiel in eine Datei `main.py`: /// info | Info -Das Paket `python-multipart` wird automatisch mit **FastAPI** installiert, wenn Sie den Befehl `pip install "fastapi[standard]"` ausführen. +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. Wenn Sie jedoch den Befehl `pip install fastapi` verwenden, ist das Paket `python-multipart` nicht standardmäßig enthalten. -Um es manuell zu installieren, stellen Sie sicher, dass Sie eine [Virtuelle Umgebung](../../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und es dann mit: +Um es manuell zu installieren, stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../../virtual-environments.md) erstellen, sie aktivieren und es dann mit: ```console $ pip install python-multipart @@ -47,7 +47,7 @@ Führen Sie das Beispiel aus mit:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -56,7 +56,7 @@ $ fastapi dev main.py ## Es testen { #check-it } -Gehen Sie zu der interaktiven Dokumentation unter: http://127.0.0.1:8000/docs. +Gehen Sie zu der interaktiven Dokumentation unter: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Sie werden etwa Folgendes sehen: @@ -142,7 +142,7 @@ Hier bezieht sich `tokenUrl="token"` auf eine relative URL `token`, die wir noch Da wir eine relative URL verwenden, würde sich das, wenn sich Ihre API unter `https://example.com/` befindet, auf `https://example.com/token` beziehen. Wenn sich Ihre API jedoch unter `https://example.com/api/v1/` befände, würde es sich auf `https://example.com/api/v1/token` beziehen. -Die Verwendung einer relativen URL ist wichtig, um sicherzustellen, dass Ihre Anwendung auch in einem fortgeschrittenen Anwendungsfall, wie [hinter einem Proxy](../../advanced/behind-a-proxy.md){.internal-link target=_blank}, weiterhin funktioniert. +Die Verwendung einer relativen URL ist wichtig, um sicherzustellen, dass Ihre Anwendung auch in einem fortgeschrittenen Anwendungsfall, wie [Hinter einem Proxy](../../advanced/behind-a-proxy.md), weiterhin funktioniert. /// diff --git a/docs/de/docs/tutorial/security/oauth2-jwt.md b/docs/de/docs/tutorial/security/oauth2-jwt.md index 6d35a1436d..2f727b167a 100644 --- a/docs/de/docs/tutorial/security/oauth2-jwt.md +++ b/docs/de/docs/tutorial/security/oauth2-jwt.md @@ -24,13 +24,13 @@ Auf diese Weise können Sie einen Token mit einer Gültigkeitsdauer von beispiel Nach einer Woche läuft der Token ab und der Benutzer wird nicht autorisiert und muss sich erneut anmelden, um einen neuen Token zu erhalten. Und wenn der Benutzer (oder ein Dritter) versuchen würde, den Token zu ändern, um das Ablaufdatum zu ändern, würden Sie das entdecken, weil die Signaturen nicht übereinstimmen würden. -Wenn Sie mit JWT-Tokens spielen und sehen möchten, wie sie funktionieren, schauen Sie sich https://jwt.io an. +Wenn Sie mit JWT-Tokens spielen und sehen möchten, wie sie funktionieren, schauen Sie sich [https://jwt.io](https://jwt.io/) an. ## `PyJWT` installieren { #install-pyjwt } Wir müssen `PyJWT` installieren, um die JWT-Tokens in Python zu generieren und zu verifizieren. -Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und dann `pyjwt` installieren: +Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../../virtual-environments.md) erstellen, sie aktivieren und dann `pyjwt` installieren:
@@ -46,7 +46,7 @@ $ pip install pyjwt Wenn Sie planen, digitale Signaturalgorithmen wie RSA oder ECDSA zu verwenden, sollten Sie die Kryptografie-Abhängigkeit `pyjwt[crypto]` installieren. -Weitere Informationen finden Sie in der PyJWT-Installationsdokumentation. +Weitere Informationen finden Sie in der [PyJWT-Installationsdokumentation](https://pyjwt.readthedocs.io/en/latest/installation.html). /// @@ -72,7 +72,7 @@ Es unterstützt viele sichere Hashing-Algorithmen und Werkzeuge, um mit diesen z Der empfohlene Algorithmus ist „Argon2“. -Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren, und installieren Sie dann pwdlib mit Argon2: +Stellen Sie sicher, dass Sie eine [virtuelle Umgebung](../../virtual-environments.md) erstellen, sie aktivieren, und installieren Sie dann pwdlib mit Argon2:
@@ -200,7 +200,7 @@ Der wesentliche Punkt ist, dass der `sub`-Schlüssel in der gesamten Anwendung e ## Es testen { #check-it } -Führen Sie den Server aus und gehen Sie zur Dokumentation: http://127.0.0.1:8000/docs. +Führen Sie den Server aus und gehen Sie zur Dokumentation: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Die Benutzeroberfläche sieht wie folgt aus: diff --git a/docs/de/docs/tutorial/security/simple-oauth2.md b/docs/de/docs/tutorial/security/simple-oauth2.md index ae631f8b72..32720706ed 100644 --- a/docs/de/docs/tutorial/security/simple-oauth2.md +++ b/docs/de/docs/tutorial/security/simple-oauth2.md @@ -146,7 +146,7 @@ UserInDB( /// info | Info -Eine ausführlichere Erklärung von `**user_dict` finden Sie in [der Dokumentation für **Extra Modelle**](../extra-models.md#about-user-in-dict){.internal-link target=_blank}. +Eine ausführlichere Erklärung von `**user_dict` finden Sie in [der Dokumentation für **Extra Modelle**](../extra-models.md#about-user-in-dict). /// @@ -154,7 +154,7 @@ Eine ausführlichere Erklärung von `**user_dict` finden Sie in [der Dokumentati Die Response des `token`-Endpunkts muss ein JSON-Objekt sein. -Es sollte einen `token_type` haben. Da wir in unserem Fall „Bearer“-Token verwenden, sollte der Token-Typ "`bearer`" sein. +Es sollte einen `token_type` haben. Da wir in unserem Fall „Bearer“-Token verwenden, sollte der Token-Typ „`bearer`“ sein. Und es sollte einen `access_token` haben, mit einem String, der unseren Zugriffstoken enthält. @@ -216,7 +216,7 @@ Das ist der Vorteil von Standards ... ## Es in Aktion sehen { #see-it-in-action } -Öffnen Sie die interaktive Dokumentation: http://127.0.0.1:8000/docs. +Öffnen Sie die interaktive Dokumentation: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). ### Authentifizieren { #authenticate } diff --git a/docs/de/docs/tutorial/server-sent-events.md b/docs/de/docs/tutorial/server-sent-events.md new file mode 100644 index 0000000000..f465c11318 --- /dev/null +++ b/docs/de/docs/tutorial/server-sent-events.md @@ -0,0 +1,120 @@ +# Server-Sent Events (SSE) { #server-sent-events-sse } + +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. + +/// info | Info + +Hinzugefügt in FastAPI 0.135.0. + +/// + +## Was sind Server-Sent Events? { #what-are-server-sent-events } + +SSE ist ein Standard zum Streamen von Daten vom Server zum Client über HTTP. + +Jedes Event ist ein kleiner Textblock mit „Feldern“ wie `data`, `event`, `id` und `retry`, getrennt durch Leerzeilen. + +Das sieht so aus: + +``` +data: {"name": "Portal Gun", "price": 999.99} + +data: {"name": "Plumbus", "price": 32.99} + +``` + +SSE wird häufig für KI-Chat-Streaming, Live-Benachrichtigungen, Logs und Observability sowie andere Fälle verwendet, in denen der Server Updates an den Client pusht. + +/// 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). + +/// + +## SSE mit FastAPI streamen { #stream-sse-with-fastapi } + +Um SSE mit FastAPI zu streamen, verwenden Sie `yield` in Ihrer *Pfadoperation-Funktion* und setzen Sie `response_class=EventSourceResponse`. + +Importieren Sie `EventSourceResponse` aus `fastapi.sse`: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[4,22] *} + +Jedes mit `yield` zurückgegebene Element wird als JSON kodiert und im Feld `data:` eines SSE-Events gesendet. + +Wenn Sie den Rückgabetyp als `AsyncIterable[Item]` deklarieren, verwendet FastAPI ihn, um die Daten mit Pydantic zu **validieren**, zu **dokumentieren** und zu **serialisieren**. + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[10:12,23] *} + +/// tip | Tipp + +Da Pydantic es auf der **Rust**-Seite serialisiert, erhalten Sie eine deutlich höhere **Leistung**, als wenn Sie keinen Rückgabetyp deklarieren. + +/// + +### Nicht-async-*Pfadoperation-Funktionen* { #non-async-path-operation-functions } + +Sie können auch normale `def`-Funktionen (ohne `async`) verwenden und `yield` genauso einsetzen. + +FastAPI stellt sicher, dass sie korrekt ausgeführt wird, sodass sie die Event Loop nicht blockiert. + +Da die Funktion in diesem Fall nicht async ist, wäre der passende Rückgabetyp `Iterable[Item]`: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[28:31] hl[29] *} + +### Kein Rückgabetyp { #no-return-type } + +Sie können den Rückgabetyp auch weglassen. FastAPI verwendet dann den [`jsonable_encoder`](./encoder.md), um die Daten zu konvertieren und zu senden. + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[34:37] hl[35] *} + +## `ServerSentEvent` { #serversentevent } + +Wenn Sie SSE-Felder wie `event`, `id`, `retry` oder `comment` setzen müssen, können Sie statt reiner Daten `ServerSentEvent`-Objekte yielden. + +Importieren Sie `ServerSentEvent` aus `fastapi.sse`: + +{* ../../docs_src/server_sent_events/tutorial002_py310.py hl[4,26] *} + +Das Feld `data` wird immer als JSON kodiert. Sie können jeden Wert übergeben, der als JSON serialisierbar ist, einschließlich Pydantic-Modellen. + +## Rohdaten { #raw-data } + +Wenn Sie Daten **ohne** JSON-Kodierung senden müssen, verwenden Sie `raw_data` statt `data`. + +Das ist nützlich zum Senden vorformatierter Texte, Logzeilen oder spezieller „Sentinel“-Werte wie `[DONE]`. + +{* ../../docs_src/server_sent_events/tutorial003_py310.py hl[17] *} + +/// note | Hinweis + +`data` und `raw_data` schließen sich gegenseitig aus. Sie können pro `ServerSentEvent` nur eines von beiden setzen. + +/// + +## Mit `Last-Event-ID` fortsetzen { #resuming-with-last-event-id } + +Wenn ein Browser nach einem Verbindungsabbruch erneut verbindet, sendet er die zuletzt empfangene `id` im Header `Last-Event-ID`. + +Sie können ihn als Header-Parameter einlesen und verwenden, um den Stream dort fortzusetzen, wo der Client aufgehört hat: + +{* ../../docs_src/server_sent_events/tutorial004_py310.py hl[25,27,31] *} + +## SSE mit POST { #sse-with-post } + +SSE funktioniert mit **jedem HTTP-Method**, nicht nur mit `GET`. + +Das ist nützlich für Protokolle wie [MCP](https://modelcontextprotocol.io), die SSE über `POST` streamen: + +{* ../../docs_src/server_sent_events/tutorial005_py310.py hl[14] *} + +## Technische Details { #technical-details } + +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. +- 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. + +Sie müssen dafür nichts tun, das funktioniert out of the box. 🤓 diff --git a/docs/de/docs/tutorial/sql-databases.md b/docs/de/docs/tutorial/sql-databases.md index 3af4ecdfc6..d7988f9a2d 100644 --- a/docs/de/docs/tutorial/sql-databases.md +++ b/docs/de/docs/tutorial/sql-databases.md @@ -2,9 +2,9 @@ **FastAPI** erfordert nicht, dass Sie eine SQL (relationale) Datenbank verwenden. Sondern Sie können **jede beliebige Datenbank** verwenden, die Sie möchten. -Hier werden wir ein Beispiel mit SQLModel sehen. +Hier werden wir ein Beispiel mit [SQLModel](https://sqlmodel.tiangolo.com/) sehen. -**SQLModel** basiert auf SQLAlchemy und Pydantic. Es wurde vom selben Autor wie **FastAPI** entwickelt, um die perfekte Ergänzung für FastAPI-Anwendungen zu sein, die **SQL-Datenbanken** verwenden müssen. +**SQLModel** basiert auf [SQLAlchemy](https://www.sqlalchemy.org/) und Pydantic. Es wurde vom selben Autor wie **FastAPI** entwickelt, um die perfekte Ergänzung für FastAPI-Anwendungen zu sein, die **SQL-Datenbanken** verwenden müssen. /// tip | Tipp @@ -26,15 +26,15 @@ Später, für Ihre Produktionsanwendung, möchten Sie möglicherweise einen Date /// tip | Tipp -Es gibt einen offiziellen Projektgenerator mit **FastAPI** und **PostgreSQL**, einschließlich eines Frontends und weiterer Tools: https://github.com/fastapi/full-stack-fastapi-template +Es gibt einen offiziellen Projektgenerator mit **FastAPI** und **PostgreSQL**, einschließlich eines Frontends und weiterer Tools: [https://github.com/fastapi/full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template) /// -Dies ist ein sehr einfaches und kurzes Tutorial. Wenn Sie mehr über Datenbanken im Allgemeinen, über SQL oder fortgeschrittenere Funktionen erfahren möchten, besuchen Sie die SQLModel-Dokumentation. +Dies ist ein sehr einfaches und kurzes Tutorial. Wenn Sie mehr über Datenbanken im Allgemeinen, über SQL oder fortgeschrittenere Funktionen erfahren möchten, besuchen Sie die [SQLModel-Dokumentation](https://sqlmodel.tiangolo.com/). ## `SQLModel` installieren { #install-sqlmodel } -Stellen Sie zunächst sicher, dass Sie Ihre [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank} erstellen, sie aktivieren und dann `sqlmodel` installieren: +Stellen Sie zunächst sicher, dass Sie Ihre [virtuelle Umgebung](../virtual-environments.md) erstellen, sie aktivieren und dann `sqlmodel` installieren:
@@ -65,7 +65,7 @@ Es gibt ein paar Unterschiede: * `Field(primary_key=True)` sagt SQLModel, dass die `id` der **Primärschlüssel** in der SQL-Datenbank ist (Sie können mehr über SQL-Primärschlüssel in der SQLModel-Dokumentation erfahren). - **Hinweis:** Wir verwenden für das Primärschlüsselfeld `int | None`, damit wir im Python-Code *ein Objekt ohne `id` erstellen* können (`id=None`), in der Annahme, dass die Datenbank sie *beim Speichern generiert*. SQLModel versteht, dass die Datenbank die `id` bereitstellt, und *definiert die Spalte im Datenbankschema als ein Nicht-Null-`INTEGER`*. Siehe die SQLModel-Dokumentation zu Primärschlüsseln für Details. + **Hinweis:** Wir verwenden für das Primärschlüsselfeld `int | None`, damit wir im Python-Code *ein Objekt ohne `id` erstellen* können (`id=None`), in der Annahme, dass die Datenbank sie *beim Speichern generiert*. SQLModel versteht, dass die Datenbank die `id` bereitstellt, und *definiert die Spalte im Datenbankschema als ein Nicht-Null-`INTEGER`*. Siehe die [SQLModel-Dokumentation zu Primärschlüsseln](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id) für Details. * `Field(index=True)` sagt SQLModel, dass es einen **SQL-Index** für diese Spalte erstellen soll, was schnelleres Suchen in der Datenbank ermöglicht, wenn Daten mittels dieser Spalte gefiltert werden. @@ -111,7 +111,7 @@ Für die Produktion würden Sie wahrscheinlich ein Migrationsskript verwenden, d /// tip | Tipp -SQLModel wird Migrationstools haben, die Alembic wrappen, aber im Moment können Sie Alembic direkt verwenden. +SQLModel wird Migrationstools haben, die Alembic wrappen, aber im Moment können Sie [Alembic](https://alembic.sqlalchemy.org/en/latest/) direkt verwenden. /// @@ -152,7 +152,7 @@ Sie können die App ausführen:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -337,7 +337,7 @@ Sie können die App erneut ausführen:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -352,6 +352,6 @@ Wenn Sie zur `/docs`-API-UI gehen, werden Sie sehen, dass sie jetzt aktualisiert ## Zusammenfassung { #recap } -Sie können **SQLModel** verwenden, um mit einer SQL-Datenbank zu interagieren und den Code mit *Datenmodellen* und *Tabellenmodellen* zu vereinfachen. +Sie können [**SQLModel**](https://sqlmodel.tiangolo.com/) verwenden, um mit einer SQL-Datenbank zu interagieren und den Code mit *Datenmodellen* und *Tabellenmodellen* zu vereinfachen. -Sie können viel mehr in der **SQLModel**-Dokumentation lernen, es gibt ein längeres Mini-Tutorial zur Verwendung von SQLModel mit **FastAPI**. 🚀 +Sie können viel mehr in der **SQLModel**-Dokumentation lernen, es gibt ein längeres Mini-[Tutorial zur Verwendung von SQLModel mit **FastAPI**](https://sqlmodel.tiangolo.com/tutorial/fastapi/). 🚀 diff --git a/docs/de/docs/tutorial/static-files.md b/docs/de/docs/tutorial/static-files.md index 26e3853163..8fb4c19084 100644 --- a/docs/de/docs/tutorial/static-files.md +++ b/docs/de/docs/tutorial/static-files.md @@ -23,7 +23,7 @@ Sie könnten auch `from starlette.staticfiles import StaticFiles` verwenden. Dies unterscheidet sich von der Verwendung eines `APIRouter`, da eine gemountete Anwendung völlig unabhängig ist. Die OpenAPI und Dokumentation Ihrer Hauptanwendung enthalten nichts von der gemounteten Anwendung, usw. -Weitere Informationen hierzu finden Sie im [Handbuch für fortgeschrittene Benutzer](../advanced/index.md){.internal-link target=_blank}. +Weitere Informationen hierzu finden Sie im [Handbuch für fortgeschrittene Benutzer](../advanced/index.md). ## Einzelheiten { #details } @@ -37,4 +37,4 @@ Alle diese Parameter können anders als „`static`“ lauten, passen Sie sie an ## Weitere Informationen { #more-info } -Weitere Details und Optionen finden Sie in der Dokumentation von Starlette zu statischen Dateien. +Weitere Details und Optionen finden Sie in [Starlettes Dokumentation zu statischen Dateien](https://www.starlette.dev/staticfiles/). diff --git a/docs/de/docs/tutorial/stream-json-lines.md b/docs/de/docs/tutorial/stream-json-lines.md new file mode 100644 index 0000000000..3625853b52 --- /dev/null +++ b/docs/de/docs/tutorial/stream-json-lines.md @@ -0,0 +1,111 @@ +# JSON Lines streamen { #stream-json-lines } + +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 + +Hinzugefügt in FastAPI 0.134.0. + +/// + +## Was ist ein Stream? { #what-is-a-stream } + +„Streaming“ von Daten bedeutet, dass Ihre App damit beginnt, Datenelemente an den Client zu senden, ohne darauf zu warten, dass die gesamte Folge von Elementen fertig ist. + +Sie sendet also das erste Element, der Client empfängt es und beginnt mit der Verarbeitung, und Sie erzeugen währenddessen möglicherweise bereits das nächste Element. + +```mermaid +sequenceDiagram + participant App + participant Client + + App->>App: Produce Item 1 + App->>Client: Send Item 1 + App->>App: Produce Item 2 + Client->>Client: Process Item 1 + App->>Client: Send Item 2 + App->>App: Produce Item 3 + Client->>Client: Process Item 2 + App->>Client: Send Item 3 + Client->>Client: Process Item 3 + Note over App: Keeps producing... + Note over Client: Keeps consuming... +``` + +Es könnte sogar ein unendlicher Stream sein, bei dem Sie kontinuierlich Daten senden. + +## JSON Lines { #json-lines } + +In diesen Fällen ist es üblich, „JSON Lines“ zu senden, das ist ein Format, bei dem Sie pro Zeile genau ein JSON-Objekt senden. + +Eine Response hätte einen Content-Type von `application/jsonl` (anstelle von `application/json`) und der Body sähe etwa so aus: + +```json +{"name": "Plumbus", "description": "A multi-purpose household device."} +{"name": "Portal Gun", "description": "A portal opening device."} +{"name": "Meeseeks Box", "description": "A box that summons a Meeseeks."} +``` + +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 + +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. + +/// + +/// note | Technische Details + +Da jedes JSON-Objekt durch einen Zeilenumbruch getrennt wird, können sie keine wörtlichen Zeilenumbrüche in ihrem Inhalt enthalten, aber sie können escapte Zeilenumbrüche (`\n`) enthalten, das ist Teil des JSON-Standards. + +Normalerweise müssen Sie sich darum aber nicht kümmern, das geschieht automatisch, lesen Sie weiter. 🤓 + +/// + +## Anwendungsfälle { #use-cases } + +Sie könnten dies verwenden, um Daten von einem **AI LLM**-Service, aus **Logs** oder **Telemetrie**, oder aus anderen Typen von Daten zu streamen, die sich in **JSON**-Items strukturieren lassen. + +/// tip | Tipp + +Wenn Sie Binärdaten streamen möchten, zum Beispiel Video oder Audio, sehen Sie sich den erweiterten Leitfaden an: [Daten streamen](../advanced/stream-data.md). + +/// + +## JSON Lines mit FastAPI streamen { #stream-json-lines-with-fastapi } + +Um JSON Lines mit FastAPI zu streamen, können Sie anstelle von `return` in Ihrer *Pfadoperation-Funktion* `yield` verwenden, um jedes Element der Reihe nach zu erzeugen. + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[24] *} + +Wenn jedes JSON-Item, das Sie zurücksenden möchten, vom Typ `Item` ist (ein Pydantic-Modell) und es sich um eine async-Funktion handelt, können Sie den Rückgabetyp als `AsyncIterable[Item]` deklarieren: + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[9:11,22] *} + +Wenn Sie den Rückgabetyp deklarieren, wird FastAPI ihn verwenden, um die Daten zu **validieren**, sie in OpenAPI zu **dokumentieren**, sie zu **filtern** und sie mit Pydantic zu **serialisieren**. + +/// tip | Tipp + +Da Pydantic es auf der **Rust**-Seite serialisiert, erhalten Sie eine deutlich höhere **Leistung** als wenn Sie keinen Rückgabetyp deklarieren. + +/// + +### Nicht-async *Pfadoperation-Funktionen* { #non-async-path-operation-functions } + +Sie können auch normale `def`-Funktionen (ohne `async`) verwenden und `yield` auf die gleiche Weise einsetzen. + +FastAPI stellt sicher, dass sie korrekt ausgeführt werden, sodass der Event Loop nicht blockiert wird. + +Da die Funktion in diesem Fall nicht async ist, wäre der richtige Rückgabetyp `Iterable[Item]`: + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[27:30] hl[28] *} + +### Kein Rückgabetyp { #no-return-type } + +Sie können den Rückgabetyp auch weglassen. FastAPI verwendet dann den [`jsonable_encoder`](./encoder.md), um die Daten in etwas zu konvertieren, das zu JSON serialisiert werden kann, und sendet sie anschließend als JSON Lines. + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[33:36] hl[34] *} + +## Server-Sent Events (SSE) { #server-sent-events-sse } + +FastAPI hat außerdem erstklassige Unterstützung für Server-Sent Events (SSE), die dem sehr ähnlich sind, aber ein paar zusätzliche Details mitbringen. Sie können im nächsten Kapitel mehr darüber lernen: [Server-Sent Events (SSE)](server-sent-events.md). 🤓 diff --git a/docs/de/docs/tutorial/testing.md b/docs/de/docs/tutorial/testing.md index 4fbe37279d..f7b0b87ebc 100644 --- a/docs/de/docs/tutorial/testing.md +++ b/docs/de/docs/tutorial/testing.md @@ -1,18 +1,18 @@ # Testen { #testing } -Dank Starlette ist das Testen von **FastAPI**-Anwendungen einfach und macht Spaß. +Dank [Starlette](https://www.starlette.dev/testclient/) ist das Testen von **FastAPI**-Anwendungen einfach und macht Spaß. -Es basiert auf HTTPX, welches wiederum auf der Grundlage von Requests konzipiert wurde, es ist also sehr vertraut und intuitiv. +Es basiert auf [HTTPX](https://www.python-httpx.org), welches wiederum auf der Grundlage von Requests konzipiert wurde, es ist also sehr vertraut und intuitiv. -Damit können Sie pytest direkt mit **FastAPI** verwenden. +Damit können Sie [pytest](https://docs.pytest.org/) direkt mit **FastAPI** verwenden. ## `TestClient` verwenden { #using-testclient } /// info | Info -Um `TestClient` zu verwenden, installieren Sie zunächst `httpx`. +Um `TestClient` zu verwenden, installieren Sie zunächst [`httpx`](https://www.python-httpx.org). -Erstellen Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank}, aktivieren Sie sie und installieren Sie es dann, z. B.: +Erstellen Sie eine [virtuelle Umgebung](../virtual-environments.md), aktivieren Sie sie und installieren Sie es dann, z. B.: ```console $ pip install httpx @@ -52,7 +52,7 @@ Sie könnten auch `from starlette.testclient import TestClient` verwenden. /// tip | Tipp -Wenn Sie in Ihren Tests neben dem Senden von Requests an Ihre FastAPI-Anwendung auch `async`-Funktionen aufrufen möchten (z. B. asynchrone Datenbankfunktionen), werfen Sie einen Blick auf die [Async-Tests](../advanced/async-tests.md){.internal-link target=_blank} im Handbuch für fortgeschrittene Benutzer. +Wenn Sie in Ihren Tests neben dem Senden von Requests an Ihre FastAPI-Anwendung auch `async`-Funktionen aufrufen möchten (z. B. asynchrone Datenbankfunktionen), werfen Sie einen Blick auf die [Async-Tests](../advanced/async-tests.md) im Handbuch für fortgeschrittene Benutzer. /// @@ -64,7 +64,7 @@ Und Ihre **FastAPI**-Anwendung könnte auch aus mehreren Dateien/Modulen, usw. b ### **FastAPI** Anwendungsdatei { #fastapi-app-file } -Nehmen wir an, Sie haben eine Dateistruktur wie in [Größere Anwendungen](bigger-applications.md){.internal-link target=_blank} beschrieben: +Nehmen wir an, Sie haben eine Dateistruktur wie in [Größere Anwendungen](bigger-applications.md) beschrieben: ``` . @@ -143,13 +143,13 @@ Z. B.: * Um *Header* zu übergeben, verwenden Sie ein `dict` im `headers`-Parameter. * Für *Cookies* ein `dict` im `cookies`-Parameter. -Weitere Informationen zum Übergeben von Daten an das Backend (mithilfe von `httpx` oder dem `TestClient`) finden Sie in der HTTPX-Dokumentation. +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 Beachten Sie, dass der `TestClient` Daten empfängt, die nach JSON konvertiert werden können, keine Pydantic-Modelle. -Wenn Sie ein Pydantic-Modell in Ihrem Test haben und dessen Daten während des Testens an die Anwendung senden möchten, können Sie den `jsonable_encoder` verwenden, der in [JSON-kompatibler Encoder](encoder.md){.internal-link target=_blank} beschrieben wird. +Wenn Sie ein Pydantic-Modell in Ihrem Test haben und dessen Daten während des Testens an die Anwendung senden möchten, können Sie den `jsonable_encoder` verwenden, der in [JSON-kompatibler Encoder](encoder.md) beschrieben wird. /// @@ -157,7 +157,7 @@ Wenn Sie ein Pydantic-Modell in Ihrem Test haben und dessen Daten während des T Danach müssen Sie nur noch `pytest` installieren. -Erstellen Sie eine [virtuelle Umgebung](../virtual-environments.md){.internal-link target=_blank}, aktivieren Sie sie und installieren Sie es dann, z. B.: +Erstellen Sie eine [virtuelle Umgebung](../virtual-environments.md), aktivieren Sie sie und installieren Sie es dann, z. B.:
diff --git a/docs/de/docs/virtual-environments.md b/docs/de/docs/virtual-environments.md index 621b4b1110..c008ec14c6 100644 --- a/docs/de/docs/virtual-environments.md +++ b/docs/de/docs/virtual-environments.md @@ -22,7 +22,7 @@ Eine **virtuelle Umgebung** ist ein Verzeichnis mit einigen Dateien darin. Diese Seite wird Ihnen beibringen, wie Sie **virtuelle Umgebungen** verwenden und wie sie funktionieren. -Wenn Sie bereit sind, ein **Tool zu verwenden, das alles für Sie verwaltet** (einschließlich der Installation von Python), probieren Sie uv. +Wenn Sie bereit sind, ein **Tool zu verwenden, das alles für Sie verwaltet** (einschließlich der Installation von Python), probieren Sie [uv](https://github.com/astral-sh/uv). /// @@ -86,7 +86,7 @@ $ python -m venv .venv //// tab | `uv` -Wenn Sie `uv` installiert haben, können Sie es verwenden, um eine virtuelle Umgebung zu erstellen. +Wenn Sie [`uv`](https://github.com/astral-sh/uv) installiert haben, können Sie es verwenden, um eine virtuelle Umgebung zu erstellen.
@@ -150,7 +150,7 @@ $ .venv\Scripts\Activate.ps1 //// tab | Windows Bash -Oder wenn Sie Bash für Windows verwenden (z. B. Git Bash): +Oder wenn Sie Bash für Windows verwenden (z. B. [Git Bash](https://gitforwindows.org/)):
@@ -216,7 +216,7 @@ Wenn es das `python`-Binary in `.venv\Scripts\python` anzeigt, innerhalb Ihres P /// tip | Tipp -Wenn Sie `uv` verwenden, würden Sie das verwenden, um Dinge zu installieren anstelle von `pip`, sodass Sie `pip` nicht aktualisieren müssen. 😎 +Wenn Sie [`uv`](https://github.com/astral-sh/uv) verwenden, würden Sie das verwenden, um Dinge zu installieren anstelle von `pip`, sodass Sie `pip` nicht aktualisieren müssen. 😎 /// @@ -268,7 +268,7 @@ Wenn Sie **Git** verwenden (was Sie sollten), fügen Sie eine `.gitignore`-Datei /// tip | Tipp -Wenn Sie `uv` verwendet haben, um die virtuelle Umgebung zu erstellen, hat es dies bereits für Sie getan, Sie können diesen Schritt überspringen. 😎 +Wenn Sie [`uv`](https://github.com/astral-sh/uv) verwendet haben, um die virtuelle Umgebung zu erstellen, hat es dies bereits für Sie getan, Sie können diesen Schritt überspringen. 😎 /// @@ -340,7 +340,7 @@ $ pip install "fastapi[standard]" //// tab | `uv` -Wenn Sie `uv` haben: +Wenn Sie [`uv`](https://github.com/astral-sh/uv) haben:
@@ -372,7 +372,7 @@ $ pip install -r requirements.txt //// tab | `uv` -Wenn Sie `uv` haben: +Wenn Sie [`uv`](https://github.com/astral-sh/uv) haben:
@@ -416,8 +416,8 @@ Sie würden wahrscheinlich einen Editor verwenden, stellen Sie sicher, dass Sie Zum Beispiel: -* VS Code -* PyCharm +* [VS Code](https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment) +* [PyCharm](https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html) /// tip | Tipp @@ -453,7 +453,7 @@ Lesen Sie weiter. 👇🤓 ## Warum virtuelle Umgebungen { #why-virtual-environments } -Um mit FastAPI zu arbeiten, müssen Sie Python installieren. +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**. @@ -562,7 +562,7 @@ $ pip install "fastapi[standard]"
-Das lädt eine komprimierte Datei mit dem FastAPI-Code herunter, normalerweise von PyPI. +Das lädt eine komprimierte Datei mit dem FastAPI-Code herunter, normalerweise von [PyPI](https://pypi.org/project/fastapi/). Es wird auch Dateien für andere Pakete **herunterladen**, von denen FastAPI abhängt. @@ -625,7 +625,7 @@ $ .venv\Scripts\Activate.ps1 //// tab | Windows Bash -Oder wenn Sie Bash für Windows verwenden (z. B. Git Bash): +Oder wenn Sie Bash für Windows verwenden (z. B. [Git Bash](https://gitforwindows.org/)):
@@ -637,13 +637,13 @@ $ source .venv/Scripts/activate //// -Dieser Befehl erstellt oder ändert einige [Umgebungsvariablen](environment-variables.md){.internal-link target=_blank}, die für die nächsten Befehle verfügbar sein werden. +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. /// tip | Tipp -Sie können mehr über die `PATH`-Umgebungsvariable im Abschnitt [Umgebungsvariablen](environment-variables.md#path-environment-variable){.internal-link target=_blank} erfahren. +Sie können mehr über die `PATH`-Umgebungsvariable im Abschnitt [Umgebungsvariablen](environment-variables.md#path-environment-variable) erfahren. /// @@ -844,7 +844,7 @@ Dies ist ein einfacher Leitfaden, um Ihnen den Einstieg zu erleichtern und Ihnen Es gibt viele **Alternativen** zur Verwaltung von virtuellen Umgebungen, Paketabhängigkeiten (Anforderungen), Projekten. -Sobald Sie bereit sind und ein Tool verwenden möchten, das **das gesamte Projekt verwaltet**, Paketabhängigkeiten, virtuelle Umgebungen usw., würde ich Ihnen vorschlagen, uv auszuprobieren. +Sobald Sie bereit sind und ein Tool verwenden möchten, das **das gesamte Projekt verwaltet**, Paketabhängigkeiten, virtuelle Umgebungen usw., würde ich Ihnen vorschlagen, [uv](https://github.com/astral-sh/uv) auszuprobieren. `uv` kann viele Dinge tun, es kann: diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index a89a72ae5b..d5e5b13526 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -18,8 +18,26 @@ hide: * 📝 Fix doctrings for `max_digits` and `decimal_places`. PR [#14944](https://github.com/fastapi/fastapi/pull/14944) by [@YuriiMotov](https://github.com/YuriiMotov). * 📝 Add dates to release notes. PR [#15001](https://github.com/fastapi/fastapi/pull/15001) by [@YuriiMotov](https://github.com/YuriiMotov). +### Translations + +* 🌐 Update translations for ko (add-missing). PR [#15168](https://github.com/fastapi/fastapi/pull/15168) by [@tiangolo](https://github.com/tiangolo). +* 🌐 Update translations for ja (add-missing). PR [#15167](https://github.com/fastapi/fastapi/pull/15167) by [@tiangolo](https://github.com/tiangolo). +* 🌐 Update translations for tr (add-missing). PR [#15169](https://github.com/fastapi/fastapi/pull/15169) by [@tiangolo](https://github.com/tiangolo). +* 🌐 Update translations for fr (update-outdated). PR [#15165](https://github.com/fastapi/fastapi/pull/15165) by [@tiangolo](https://github.com/tiangolo). +* 🌐 Update translations for fr (add-missing). PR [#15163](https://github.com/fastapi/fastapi/pull/15163) by [@tiangolo](https://github.com/tiangolo). +* 🌐 Update translations for uk (update-outdated). PR [#15160](https://github.com/fastapi/fastapi/pull/15160) by [@tiangolo](https://github.com/tiangolo). +* 🌐 Update translations for uk (add-missing). PR [#15158](https://github.com/fastapi/fastapi/pull/15158) by [@tiangolo](https://github.com/tiangolo). +* 🌐 Update translations for pt (add-missing). PR [#15157](https://github.com/fastapi/fastapi/pull/15157) by [@tiangolo](https://github.com/tiangolo). +* 🌐 Update translations for pt (update-outdated). PR [#15159](https://github.com/fastapi/fastapi/pull/15159) by [@tiangolo](https://github.com/tiangolo). +* 🌐 Update translations for es (update-outdated). PR [#15155](https://github.com/fastapi/fastapi/pull/15155) by [@tiangolo](https://github.com/tiangolo). +* 🌐 Update translations for es (add-missing). PR [#15154](https://github.com/fastapi/fastapi/pull/15154) by [@tiangolo](https://github.com/tiangolo). +* 🌐 Update translations for de (update-outdated). PR [#15156](https://github.com/fastapi/fastapi/pull/15156) by [@tiangolo](https://github.com/tiangolo). +* 🌐 Update translations for ru (update-and-add). PR [#15152](https://github.com/fastapi/fastapi/pull/15152) by [@tiangolo](https://github.com/tiangolo). +* 🌐 Update translations for de (add-missing). PR [#15153](https://github.com/fastapi/fastapi/pull/15153) by [@tiangolo](https://github.com/tiangolo). + ### Internal +* 🔨 Tweak translation workflow and translation fixer tool. PR [#15166](https://github.com/fastapi/fastapi/pull/15166) by [@YuriiMotov](https://github.com/YuriiMotov). * 🔨 Fix `commit_in_place` passed via env variable in `translate.yml` workflow. PR [#15151](https://github.com/fastapi/fastapi/pull/15151) by [@YuriiMotov](https://github.com/YuriiMotov). * 🔨 Update translation general prompt to enforce link style in translation matches the original link style. PR [#15148](https://github.com/fastapi/fastapi/pull/15148) by [@YuriiMotov](https://github.com/YuriiMotov). * 👷 Re-enable translation workflow run by cron in CI (twice a month). PR [#15145](https://github.com/fastapi/fastapi/pull/15145) by [@YuriiMotov](https://github.com/YuriiMotov). diff --git a/docs/es/docs/_llm-test.md b/docs/es/docs/_llm-test.md index dda425acbc..703d8009c8 100644 --- a/docs/es/docs/_llm-test.md +++ b/docs/es/docs/_llm-test.md @@ -11,7 +11,7 @@ Las pruebas añadidas aquí serán vistas por todas las personas que diseñan pr * Revisa si las cosas están bien en la traducción. * Si es necesario, mejora tu prompt específico del idioma, el prompt general, o el documento en inglés. * Luego corrige manualmente los problemas restantes en la traducción para que sea una buena traducción. -* Vuelve a traducir, teniendo la buena traducción en su lugar. El resultado ideal sería que el LLM ya no hiciera cambios a la traducción. Eso significa que el prompt general y tu prompt específico del idioma están tan bien como pueden estar (A veces hará algunos cambios aparentemente aleatorios; la razón es que los LLMs no son algoritmos deterministas). +* Vuelve a traducir, teniendo la buena traducción en su lugar. El resultado ideal sería que el LLM ya no hiciera cambios a la traducción. Eso significa que el prompt general y tu prompt específico del idioma están tan bien como pueden estar (A veces hará algunos cambios aparentemente aleatorios; la razón es que [los LLMs no son algoritmos deterministas](https://doublespeak.chat/#/handbook#deterministic-output)). Las pruebas: @@ -169,15 +169,15 @@ Consulta las secciones `### Special blocks` y `### Tab blocks` en el prompt gene El texto del enlace debe traducirse, la dirección del enlace debe permanecer sin cambios: * [Enlace al encabezado de arriba](#code-snippets) -* [Enlace interno](index.md#installation){.internal-link target=_blank} -* Enlace externo -* Enlace a un estilo -* Enlace a un script -* Enlace a una imagen +* [Enlace interno](index.md#installation) +* [Enlace externo](https://sqlmodel.tiangolo.com/) +* [Enlace a un estilo](https://fastapi.tiangolo.com/css/styles.css) +* [Enlace a un script](https://fastapi.tiangolo.com/js/logic.js) +* [Enlace a una imagen](https://fastapi.tiangolo.com/img/foo.jpg) El texto del enlace debe traducirse, la dirección del enlace debe apuntar a la traducción: -* Enlace a FastAPI +* [Enlace a FastAPI](https://fastapi.tiangolo.com/es/) //// diff --git a/docs/es/docs/advanced/additional-responses.md b/docs/es/docs/advanced/additional-responses.md index 030f8dcc5a..83053d3a9e 100644 --- a/docs/es/docs/advanced/additional-responses.md +++ b/docs/es/docs/advanced/additional-responses.md @@ -243,5 +243,5 @@ Por ejemplo: Para ver exactamente qué puedes incluir en los responses, puedes revisar estas secciones en la especificación OpenAPI: -* Objeto de Responses de OpenAPI, incluye el `Response Object`. -* Objeto de Response de OpenAPI, puedes incluir cualquier cosa de esto directamente en cada response dentro de tu parámetro `responses`. Incluyendo `description`, `headers`, `content` (dentro de este es que declaras diferentes media types y JSON Schemas), y `links`. +* [Objeto de Responses de OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#responses-object), incluye el `Response Object`. +* [Objeto de Response de OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#response-object), puedes incluir cualquier cosa de esto directamente en cada response dentro de tu parámetro `responses`. Incluyendo `description`, `headers`, `content` (dentro de este es que declaras diferentes media types y JSON Schemas), y `links`. diff --git a/docs/es/docs/advanced/additional-status-codes.md b/docs/es/docs/advanced/additional-status-codes.md index 9adfa65cf3..5c0ab6980f 100644 --- a/docs/es/docs/advanced/additional-status-codes.md +++ b/docs/es/docs/advanced/additional-status-codes.md @@ -38,4 +38,4 @@ También podrías usar `from starlette.responses import JSONResponse`. Si devuelves códigos de estado adicionales y responses directamente, no se incluirán en el esquema de OpenAPI (la documentación de la API), porque FastAPI no tiene una forma de saber de antemano qué vas a devolver. -Pero puedes documentarlo en tu código, usando: [Responses Adicionales](additional-responses.md){.internal-link target=_blank}. +Pero puedes documentarlo en tu código, usando: [Responses Adicionales](additional-responses.md). diff --git a/docs/es/docs/advanced/advanced-dependencies.md b/docs/es/docs/advanced/advanced-dependencies.md index 81d8d19bbe..cee93692d7 100644 --- a/docs/es/docs/advanced/advanced-dependencies.md +++ b/docs/es/docs/advanced/advanced-dependencies.md @@ -132,7 +132,7 @@ Si tienes este caso de uso específico usando SQLModel (o SQLAlchemy), podrías De esa manera la sesión liberaría la conexión a la base de datos, para que otras requests puedan usarla. -Si tienes un caso de uso diferente que necesite salir temprano desde una dependencia con `yield`, por favor crea una Pregunta de Discusión en GitHub con tu caso de uso específico y por qué te beneficiaría tener cierre temprano para dependencias con `yield`. +Si tienes un caso de uso diferente que necesite salir temprano desde una dependencia con `yield`, por favor crea una [Pregunta de Discusión en GitHub](https://github.com/fastapi/fastapi/discussions/new?category=questions) con tu caso de uso específico y por qué te beneficiaría tener cierre temprano para dependencias con `yield`. Si hay casos de uso convincentes para el cierre temprano en dependencias con `yield`, consideraría agregar una nueva forma de optar por el cierre temprano. @@ -144,7 +144,7 @@ Esto cambió en la versión 0.110.0 para arreglar consumo de memoria no manejado ### Tareas en segundo plano y dependencias con `yield`, detalles técnicos { #background-tasks-and-dependencies-with-yield-technical-details } -Antes de FastAPI 0.106.0, elevar excepciones después de `yield` no era posible, el código de salida en dependencias con `yield` se ejecutaba después de que la response era enviada, por lo que [Manejadores de Excepciones](../tutorial/handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank} ya habrían corrido. +Antes de FastAPI 0.106.0, elevar excepciones después de `yield` no era posible, el código de salida en dependencias con `yield` se ejecutaba después de que la response era enviada, por lo que [Manejadores de Excepciones](../tutorial/handling-errors.md#install-custom-exception-handlers) ya habrían corrido. Esto se diseñó así principalmente para permitir usar los mismos objetos devueltos con `yield` por las dependencias dentro de tareas en segundo plano, porque el código de salida se ejecutaría después de que las tareas en segundo plano terminaran. diff --git a/docs/es/docs/advanced/async-tests.md b/docs/es/docs/advanced/async-tests.md index 3485536cef..4ccd664e63 100644 --- a/docs/es/docs/advanced/async-tests.md +++ b/docs/es/docs/advanced/async-tests.md @@ -16,11 +16,11 @@ Incluso si tu aplicación de **FastAPI** usa funciones `def` normales en lugar d El `TestClient` hace algo de magia interna para llamar a la aplicación FastAPI asíncrona en tus funciones de test `def` normales, usando pytest estándar. Pero esa magia ya no funciona cuando lo usamos dentro de funciones asíncronas. Al ejecutar nuestros tests de manera asíncrona, ya no podemos usar el `TestClient` dentro de nuestras funciones de test. -El `TestClient` está basado en HTTPX, y afortunadamente, podemos usarlo directamente para probar la API. +El `TestClient` está basado en [HTTPX](https://www.python-httpx.org), y afortunadamente, podemos usarlo directamente para probar la API. ## Ejemplo { #example } -Para un ejemplo simple, consideremos una estructura de archivos similar a la descrita en [Aplicaciones Más Grandes](../tutorial/bigger-applications.md){.internal-link target=_blank} y [Testing](../tutorial/testing.md){.internal-link target=_blank}: +Para un ejemplo simple, consideremos una estructura de archivos similar a la descrita en [Aplicaciones Más Grandes](../tutorial/bigger-applications.md) y [Testing](../tutorial/testing.md): ``` . @@ -84,7 +84,7 @@ Nota que estamos usando async/await con el nuevo `AsyncClient`: el request es as /// warning | Advertencia -Si tu aplicación depende de eventos de lifespan, el `AsyncClient` no activará estos eventos. Para asegurarte de que se activen, usa `LifespanManager` de florimondmanca/asgi-lifespan. +Si tu aplicación depende de eventos de lifespan, el `AsyncClient` no activará estos eventos. Para asegurarte de que se activen, usa `LifespanManager` de [florimondmanca/asgi-lifespan](https://github.com/florimondmanca/asgi-lifespan#usage). /// @@ -94,6 +94,6 @@ Al ser la función de test asíncrona, ahora también puedes llamar (y `await`) /// tip | Consejo -Si encuentras un `RuntimeError: Task attached to a different loop` al integrar llamadas a funciones asíncronas en tus tests (por ejemplo, cuando usas MotorClient de MongoDB), recuerda crear instances de objetos que necesiten un loop de eventos solo dentro de funciones async, por ejemplo, en un callback `@app.on_event("startup")`. +Si encuentras un `RuntimeError: Task attached to a different loop` al integrar llamadas a funciones asíncronas en tus tests (por ejemplo, cuando usas [MotorClient de MongoDB](https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop)), recuerda crear instances de objetos que necesiten un loop de eventos solo dentro de funciones async, por ejemplo, en un callback `@app.on_event("startup")`. /// diff --git a/docs/es/docs/advanced/behind-a-proxy.md b/docs/es/docs/advanced/behind-a-proxy.md index 40729ee03d..31d38c1bb6 100644 --- a/docs/es/docs/advanced/behind-a-proxy.md +++ b/docs/es/docs/advanced/behind-a-proxy.md @@ -16,9 +16,9 @@ Pero por seguridad, como el server no sabe que está detrás de un proxy confiab Los headers del proxy son: -* X-Forwarded-For -* X-Forwarded-Proto -* X-Forwarded-Host +* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For) +* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto) +* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host) /// @@ -60,7 +60,7 @@ https://mysuperapp.com/items/ /// tip | Consejo -Si quieres aprender más sobre HTTPS, revisa la guía [Acerca de HTTPS](../deployment/https.md){.internal-link target=_blank}. +Si quieres aprender más sobre HTTPS, revisa la guía [Acerca de HTTPS](../deployment/https.md). /// @@ -228,7 +228,7 @@ Pasar el `root_path` a `FastAPI` sería el equivalente a pasar la opción de lí Ten en cuenta que el servidor (Uvicorn) no usará ese `root_path` para nada, a excepción de pasárselo a la app. -Pero si vas con tu navegador a http://127.0.0.1:8000/app verás el response normal: +Pero si vas con tu navegador a [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app) verás el response normal: ```JSON { @@ -251,9 +251,9 @@ En un caso así (sin un prefijo de path eliminado), el proxy escucharía algo co ## Probando localmente con Traefik { #testing-locally-with-traefik } -Puedes ejecutar fácilmente el experimento localmente con un prefijo de path eliminado usando Traefik. +Puedes ejecutar fácilmente el experimento localmente con un prefijo de path eliminado usando [Traefik](https://docs.traefik.io/). -Descarga Traefik, es un archivo binario único, puedes extraer el archivo comprimido y ejecutarlo directamente desde la terminal. +[Descarga Traefik](https://github.com/containous/traefik/releases), es un archivo binario único, puedes extraer el archivo comprimido y ejecutarlo directamente desde la terminal. Luego crea un archivo `traefik.toml` con: @@ -330,7 +330,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 ### Revisa los responses { #check-the-responses } -Ahora, si vas a la URL con el puerto para Uvicorn: http://127.0.0.1:8000/app, verás el response normal: +Ahora, si vas a la URL con el puerto para Uvicorn: [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app), verás el response normal: ```JSON { @@ -345,7 +345,7 @@ Nota que incluso aunque estés accediendo en `http://127.0.0.1:8000/app`, muestr /// -Y ahora abre la URL con el puerto para Traefik, incluyendo el prefijo de path: http://127.0.0.1:9999/api/v1/app. +Y ahora abre la URL con el puerto para Traefik, incluyendo el prefijo de path: [http://127.0.0.1:9999/api/v1/app](http://127.0.0.1:9999/api/v1/app). Obtenemos el mismo response: @@ -370,13 +370,13 @@ Pero aquí está la parte divertida. ✨ La forma "oficial" de acceder a la app sería a través del proxy con el prefijo de path que definimos. Así que, como esperaríamos, si intentas usar la UI de los docs servida por Uvicorn directamente, sin el prefijo de path en la URL, no funcionará, porque espera ser accedida a través del proxy. -Puedes verificarlo en http://127.0.0.1:8000/docs: +Puedes verificarlo en [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs): Pero si accedemos a la UI de los docs en la URL "oficial" usando el proxy con puerto `9999`, en `/api/v1/docs`, ¡funciona correctamente! 🎉 -Puedes verificarlo en http://127.0.0.1:9999/api/v1/docs: +Puedes verificarlo en [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs): @@ -433,7 +433,7 @@ Observa el server auto-generado con un valor `url` de `/api/v1`, tomado del `roo /// -En la UI de los docs en http://127.0.0.1:9999/api/v1/docs se vería como: +En la UI de los docs en [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs) se vería como: @@ -461,6 +461,6 @@ y entonces no lo incluirá en el esquema de OpenAPI. ## Montando una sub-aplicación { #mounting-a-sub-application } -Si necesitas montar una sub-aplicación (como se describe en [Aplicaciones secundarias - Monturas](sub-applications.md){.internal-link target=_blank}) mientras usas un proxy con `root_path`, puedes hacerlo normalmente, como esperarías. +Si necesitas montar una sub-aplicación (como se describe en [Aplicaciones secundarias - Monturas](sub-applications.md)) mientras usas un proxy con `root_path`, puedes hacerlo normalmente, como esperarías. FastAPI usará internamente el `root_path` de manera inteligente, así que simplemente funcionará. ✨ diff --git a/docs/es/docs/advanced/custom-response.md b/docs/es/docs/advanced/custom-response.md index a58f290d6e..e1db101479 100644 --- a/docs/es/docs/advanced/custom-response.md +++ b/docs/es/docs/advanced/custom-response.md @@ -1,8 +1,8 @@ # Response Personalizado - HTML, Stream, Archivo, otros { #custom-response-html-stream-file-others } -Por defecto, **FastAPI** devolverá los responses usando `JSONResponse`. +Por defecto, **FastAPI** devolverá responses JSON. -Puedes sobrescribirlo devolviendo un `Response` directamente como se ve en [Devolver una Response directamente](response-directly.md){.internal-link target=_blank}. +Puedes sobrescribirlo devolviendo un `Response` directamente como se ve en [Devolver una Response directamente](response-directly.md). Pero si devuelves un `Response` directamente (o cualquier subclase, como `JSONResponse`), los datos no se convertirán automáticamente (incluso si declaras un `response_model`), y la documentación no se generará automáticamente (por ejemplo, incluyendo el "media type" específico, en el HTTP header `Content-Type` como parte del OpenAPI generado). @@ -10,43 +10,27 @@ Pero también puedes declarar el `Response` que quieres usar (por ejemplo, cualq Los contenidos que devuelvas desde tu *path operation function* se colocarán dentro de esa `Response`. -Y si ese `Response` tiene un media type JSON (`application/json`), como es el caso con `JSONResponse` y `UJSONResponse`, los datos que devuelvas se convertirán automáticamente (y serán filtrados) con cualquier `response_model` de Pydantic que hayas declarado en el *path operation decorator*. - /// note | Nota Si usas una clase de response sin media type, FastAPI esperará que tu response no tenga contenido, por lo que no documentará el formato del response en su OpenAPI generado. /// -## Usa `ORJSONResponse` { #use-orjsonresponse } - -Por ejemplo, si estás exprimendo el rendimiento, puedes instalar y usar `orjson` y establecer el response como `ORJSONResponse`. - -Importa la clase `Response` (sub-clase) que quieras usar y declárala en el *path operation decorator*. - -Para responses grandes, devolver una `Response` directamente es mucho más rápido que devolver un diccionario. - -Esto se debe a que, por defecto, FastAPI inspeccionará cada elemento dentro y se asegurará de que sea serializable como JSON, usando el mismo [Codificador Compatible con JSON](../tutorial/encoder.md){.internal-link target=_blank} explicado en el tutorial. Esto es lo que te permite devolver **objetos arbitrarios**, por ejemplo, modelos de bases de datos. - -Pero si estás seguro de que el contenido que estás devolviendo es **serializable con JSON**, puedes pasarlo directamente a la clase de response y evitar la sobrecarga extra que FastAPI tendría al pasar tu contenido de retorno a través de `jsonable_encoder` antes de pasarlo a la clase de response. +## Responses JSON { #json-responses } -{* ../../docs_src/custom_response/tutorial001b_py310.py hl[2,7] *} +Por defecto FastAPI devuelve responses JSON. -/// info | Información - -El parámetro `response_class` también se utilizará para definir el "media type" del response. +Si declaras un [Response Model](../tutorial/response-model.md) FastAPI lo usará para serializar los datos a JSON, usando Pydantic. -En este caso, el HTTP header `Content-Type` se establecerá en `application/json`. +Si no declaras un response model, FastAPI usará el `jsonable_encoder` explicado en [Codificador Compatible con JSON](../tutorial/encoder.md) y lo pondrá en un `JSONResponse`. -Y se documentará así en OpenAPI. +Si declaras un `response_class` con un media type JSON (`application/json`), como es el caso con `JSONResponse`, los datos que devuelvas se convertirán automáticamente (y serán filtrados) con cualquier `response_model` de Pydantic que hayas declarado en el *path operation decorator*. Pero los datos no se serializarán a bytes JSON con Pydantic, en su lugar se convertirán con el `jsonable_encoder` y luego se pasarán a la clase `JSONResponse`, que los serializará a bytes usando la librería JSON estándar de Python. -/// +### Rendimiento JSON { #json-performance } -/// tip | Consejo +En resumen, si quieres el máximo rendimiento, usa un [Response Model](../tutorial/response-model.md) y no declares un `response_class` en el *path operation decorator*. -El `ORJSONResponse` solo está disponible en FastAPI, no en Starlette. - -/// +{* ../../docs_src/response_model/tutorial001_01_py310.py ln[15:17] hl[16] *} ## Response HTML { #html-response } @@ -69,7 +53,7 @@ Y se documentará así en OpenAPI. ### Devuelve una `Response` { #return-a-response } -Como se ve en [Devolver una Response directamente](response-directly.md){.internal-link target=_blank}, también puedes sobrescribir el response directamente en tu *path operation*, devolviéndolo. +Como se ve en [Devolver una Response directamente](response-directly.md), también puedes sobrescribir el response directamente en tu *path operation*, devolviéndolo. El mismo ejemplo de arriba, devolviendo una `HTMLResponse`, podría verse así: @@ -154,37 +138,11 @@ Toma algunos datos y devuelve un response codificado como `application/json`. Este es el response usado por defecto en **FastAPI**, como leíste arriba. -### `ORJSONResponse` { #orjsonresponse } - -Un response JSON rápido alternativo usando `orjson`, como leíste arriba. - -/// info | Información - -Esto requiere instalar `orjson`, por ejemplo, con `pip install orjson`. - -/// - -### `UJSONResponse` { #ujsonresponse } - -Un response JSON alternativo usando `ujson`. - -/// info | Información - -Esto requiere instalar `ujson`, por ejemplo, con `pip install ujson`. - -/// - -/// warning | Advertencia - -`ujson` es menos cuidadoso que la implementación integrada de Python en cómo maneja algunos casos extremos. - -/// - -{* ../../docs_src/custom_response/tutorial001_py310.py hl[2,7] *} +/// note | Nota Técnica -/// tip | Consejo +Pero si declaras un response model o un tipo de retorno, eso se usará directamente para serializar los datos a JSON, y se devolverá directamente un response con el media type correcto para JSON, sin usar la clase `JSONResponse`. -Es posible que `ORJSONResponse` sea una alternativa más rápida. +Esta es la forma ideal de obtener el mejor rendimiento. /// @@ -200,6 +158,7 @@ Puedes devolver un `RedirectResponse` directamente: O puedes usarlo en el parámetro `response_class`: + {* ../../docs_src/custom_response/tutorial006b_py310.py hl[2,7,9] *} Si haces eso, entonces puedes devolver la URL directamente desde tu *path operation* function. @@ -214,31 +173,25 @@ También puedes usar el parámetro `status_code` combinado con el parámetro `re ### `StreamingResponse` { #streamingresponse } -Toma un generador `async` o un generador/iterador normal y transmite el cuerpo del response. - -{* ../../docs_src/custom_response/tutorial007_py310.py hl[2,14] *} - -#### Usando `StreamingResponse` con objetos similares a archivos { #using-streamingresponse-with-file-like-objects } +Toma un generador `async` o un generador/iterador normal (una función con `yield`) y transmite el cuerpo del response. -Si tienes un objeto similar a un archivo (por ejemplo, el objeto devuelto por `open()`), puedes crear una función generadora para iterar sobre ese objeto similar a un archivo. +{* ../../docs_src/custom_response/tutorial007_py310.py hl[3,16] *} -De esa manera, no tienes que leerlo todo primero en memoria, y puedes pasar esa función generadora al `StreamingResponse`, y devolverlo. - -Esto incluye muchos paquetes para interactuar con almacenamiento en la nube, procesamiento de video y otros. +/// note | Nota Técnica -{* ../../docs_src/custom_response/tutorial008_py310.py hl[2,10:12,14] *} +Una tarea `async` solo puede cancelarse cuando llega a un `await`. Si no hay `await`, el generador (función con `yield`) no se puede cancelar correctamente y puede seguir ejecutándose incluso después de solicitar la cancelación. -1. Esta es la función generadora. Es una "función generadora" porque contiene declaraciones `yield` dentro. -2. Al usar un bloque `with`, nos aseguramos de que el objeto similar a un archivo se cierre después de que la función generadora termine. Así, después de que termina de enviar el response. -3. Este `yield from` le dice a la función que itere sobre esa cosa llamada `file_like`. Y luego, para cada parte iterada, yield esa parte como proveniente de esta función generadora (`iterfile`). +Como este pequeño ejemplo no necesita ninguna sentencia `await`, añadimos un `await anyio.sleep(0)` para darle al loop de eventos la oportunidad de manejar la cancelación. - Entonces, es una función generadora que transfiere el trabajo de "generar" a algo más internamente. +Esto sería aún más importante con streams grandes o infinitos. - Al hacerlo de esta manera, podemos ponerlo en un bloque `with`, y de esa manera, asegurarnos de que el objeto similar a un archivo se cierre después de finalizar. +/// /// tip | Consejo -Nota que aquí como estamos usando `open()` estándar que no admite `async` y `await`, declaramos el path operation con `def` normal. +En lugar de devolver un `StreamingResponse` directamente, probablemente deberías seguir el estilo en [Stream Data](./stream-data.md), es mucho más conveniente y maneja la cancelación por detrás de escena por ti. + +Si estás transmitiendo JSON Lines, sigue el tutorial [Stream JSON Lines](../tutorial/stream-json-lines.md). /// @@ -267,7 +220,7 @@ En este caso, puedes devolver la path del archivo directamente desde tu *path op Puedes crear tu propia clase de response personalizada, heredando de `Response` y usándola. -Por ejemplo, digamos que quieres usar `orjson`, pero con algunas configuraciones personalizadas no utilizadas en la clase `ORJSONResponse` incluida. +Por ejemplo, digamos que quieres usar [`orjson`](https://github.com/ijl/orjson) con algunas configuraciones. Digamos que quieres que devuelva JSON con sangría y formato, por lo que quieres usar la opción de orjson `orjson.OPT_INDENT_2`. @@ -291,13 +244,21 @@ Ahora en lugar de devolver: Por supuesto, probablemente encontrarás formas mucho mejores de aprovechar esto que formatear JSON. 😉 +### `orjson` o Response Model { #orjson-or-response-model } + +Si lo que buscas es rendimiento, probablemente te convenga más usar un [Response Model](../tutorial/response-model.md) que un response con `orjson`. + +Con un response model, FastAPI usará Pydantic para serializar los datos a JSON, sin pasos intermedios, como convertirlos con `jsonable_encoder`, que ocurriría en cualquier otro caso. + +Y por debajo, Pydantic usa los mismos mecanismos en Rust que `orjson` para serializar a JSON, así que ya obtendrás el mejor rendimiento con un response model. + ## Clase de response por defecto { #default-response-class } Al crear una instance de la clase **FastAPI** o un `APIRouter`, puedes especificar qué clase de response usar por defecto. El parámetro que define esto es `default_response_class`. -En el ejemplo a continuación, **FastAPI** usará `ORJSONResponse` por defecto, en todas las *path operations*, en lugar de `JSONResponse`. +En el ejemplo a continuación, **FastAPI** usará `HTMLResponse` por defecto, en todas las *path operations*, en lugar de JSON. {* ../../docs_src/custom_response/tutorial010_py310.py hl[2,4] *} @@ -309,4 +270,4 @@ Todavía puedes sobrescribir `response_class` en *path operations* como antes. ## Documentación adicional { #additional-documentation } -También puedes declarar el media type y muchos otros detalles en OpenAPI usando `responses`: [Responses Adicionales en OpenAPI](additional-responses.md){.internal-link target=_blank}. +También puedes declarar el media type y muchos otros detalles en OpenAPI usando `responses`: [Responses Adicionales en OpenAPI](additional-responses.md). diff --git a/docs/es/docs/advanced/dataclasses.md b/docs/es/docs/advanced/dataclasses.md index d586d3a270..3ce5c754f5 100644 --- a/docs/es/docs/advanced/dataclasses.md +++ b/docs/es/docs/advanced/dataclasses.md @@ -2,11 +2,11 @@ FastAPI está construido sobre **Pydantic**, y te he estado mostrando cómo usar modelos de Pydantic para declarar requests y responses. -Pero FastAPI también soporta el uso de `dataclasses` de la misma manera: +Pero FastAPI también soporta el uso de [`dataclasses`](https://docs.python.org/3/library/dataclasses.html) de la misma manera: {* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *} -Esto sigue siendo soportado gracias a **Pydantic**, ya que tiene soporte interno para `dataclasses`. +Esto sigue siendo soportado gracias a **Pydantic**, ya que tiene [soporte interno para `dataclasses`](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel). Así que, incluso con el código anterior que no usa Pydantic explícitamente, FastAPI está usando Pydantic para convertir esos dataclasses estándar en su propia versión de dataclasses de Pydantic. @@ -74,7 +74,7 @@ En ese caso, simplemente puedes intercambiar los `dataclasses` estándar con `py Como siempre, en FastAPI puedes combinar `def` y `async def` según sea necesario. - Si necesitas un repaso sobre cuándo usar cuál, revisa la sección _"¿Con prisa?"_ en la documentación sobre [`async` y `await`](../async.md#in-a-hurry){.internal-link target=_blank}. + Si necesitas un repaso sobre cuándo usar cuál, revisa la sección _"¿Con prisa?"_ en la documentación sobre [`async` y `await`](../async.md#in-a-hurry). 9. Esta *path operation function* no está devolviendo dataclasses (aunque podría), sino una lista de diccionarios con datos internos. @@ -88,7 +88,7 @@ Revisa las anotaciones en el código arriba para ver más detalles específicos. También puedes combinar `dataclasses` con otros modelos de Pydantic, heredar de ellos, incluirlos en tus propios modelos, etc. -Para saber más, revisa la documentación de Pydantic sobre dataclasses. +Para saber más, revisa la [documentación de Pydantic sobre dataclasses](https://docs.pydantic.dev/latest/concepts/dataclasses/). ## Versión { #version } diff --git a/docs/es/docs/advanced/events.md b/docs/es/docs/advanced/events.md index 4adb464d3b..264ee27ede 100644 --- a/docs/es/docs/advanced/events.md +++ b/docs/es/docs/advanced/events.md @@ -150,11 +150,11 @@ Debido a eso, ahora se recomienda en su lugar usar el `lifespan` como se explic Solo un detalle técnico para los nerds curiosos. 🤓 -Por debajo, en la especificación técnica ASGI, esto es parte del Protocolo de Lifespan, y define eventos llamados `startup` y `shutdown`. +Por debajo, en la especificación técnica ASGI, esto es parte del [Protocolo de Lifespan](https://asgi.readthedocs.io/en/latest/specs/lifespan.html), y define eventos llamados `startup` y `shutdown`. /// info | Información -Puedes leer más sobre los manejadores `lifespan` de Starlette en la documentación de `Lifespan` de Starlette. +Puedes leer más sobre los manejadores `lifespan` de Starlette en [la documentación de `Lifespan` de Starlette](https://www.starlette.dev/lifespan/). Incluyendo cómo manejar el estado de lifespan que puede ser usado en otras áreas de tu código. @@ -162,4 +162,4 @@ Incluyendo cómo manejar el estado de lifespan que puede ser usado en otras áre ## Sub Aplicaciones { #sub-applications } -🚨 Ten en cuenta que estos eventos de lifespan (startup y shutdown) solo serán ejecutados para la aplicación principal, no para [Sub Aplicaciones - Mounts](sub-applications.md){.internal-link target=_blank}. +🚨 Ten en cuenta que estos eventos de lifespan (startup y shutdown) solo serán ejecutados para la aplicación principal, no para [Sub Aplicaciones - Mounts](sub-applications.md). diff --git a/docs/es/docs/advanced/generate-clients.md b/docs/es/docs/advanced/generate-clients.md index a079c41aa5..e43cb7f052 100644 --- a/docs/es/docs/advanced/generate-clients.md +++ b/docs/es/docs/advanced/generate-clients.md @@ -8,11 +8,11 @@ En esta guía, aprenderás a generar un **SDK de TypeScript** para tu backend co ## Generadores de SDKs de código abierto { #open-source-sdk-generators } -Una opción versátil es el OpenAPI Generator, que soporta **muchos lenguajes de programación** y puede generar SDKs a partir de tu especificación OpenAPI. +Una opción versátil es el [OpenAPI Generator](https://openapi-generator.tech/), que soporta **muchos lenguajes de programación** y puede generar SDKs a partir de tu especificación OpenAPI. -Para **clientes de TypeScript**, Hey API es una solución diseñada específicamente, que ofrece una experiencia optimizada para el ecosistema de TypeScript. +Para **clientes de TypeScript**, [Hey API](https://heyapi.dev/) es una solución diseñada específicamente, que ofrece una experiencia optimizada para el ecosistema de TypeScript. -Puedes descubrir más generadores de SDK en OpenAPI.Tools. +Puedes descubrir más generadores de SDK en [OpenAPI.Tools](https://openapi.tools/#sdk). /// tip | Consejo @@ -24,15 +24,15 @@ FastAPI genera automáticamente especificaciones **OpenAPI 3.1**, así que cualq Esta sección destaca soluciones **respaldadas por empresas** y **venture-backed** de compañías que sponsorean FastAPI. Estos productos ofrecen **funcionalidades adicionales** e **integraciones** además de SDKs generados de alta calidad. -Al ✨ [**sponsorear FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨, estas compañías ayudan a asegurar que el framework y su **ecosistema** se mantengan saludables y **sustentables**. +Al ✨ [**sponsorear FastAPI**](../help-fastapi.md#sponsor-the-author) ✨, estas compañías ayudan a asegurar que el framework y su **ecosistema** se mantengan saludables y **sustentables**. Su sponsorship también demuestra un fuerte compromiso con la **comunidad** de FastAPI (tú), mostrando que no solo les importa ofrecer un **gran servicio**, sino también apoyar un **framework robusto y próspero**, FastAPI. 🙇 Por ejemplo, podrías querer probar: -* Speakeasy -* Stainless -* liblab +* [Speakeasy](https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship) +* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) +* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi) Algunas de estas soluciones también pueden ser open source u ofrecer niveles gratuitos, así que puedes probarlas sin un compromiso financiero. Hay otros generadores de SDK comerciales disponibles y se pueden encontrar en línea. 🤓 @@ -66,7 +66,7 @@ npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client Esto generará un SDK de TypeScript en `./src/client`. -Puedes aprender cómo instalar `@hey-api/openapi-ts` y leer sobre el output generado en su sitio web. +Puedes aprender cómo [instalar `@hey-api/openapi-ts`](https://heyapi.dev/openapi-ts/get-started) y leer sobre el [output generado](https://heyapi.dev/openapi-ts/output) en su sitio web. ### Usar el SDK { #using-the-sdk } diff --git a/docs/es/docs/advanced/index.md b/docs/es/docs/advanced/index.md index f3f4bb85ce..a18a7fd64d 100644 --- a/docs/es/docs/advanced/index.md +++ b/docs/es/docs/advanced/index.md @@ -2,7 +2,7 @@ ## Funcionalidades adicionales { #additional-features } -El [Tutorial - Guía del usuario](../tutorial/index.md){.internal-link target=_blank} principal debería ser suficiente para darte un recorrido por todas las funcionalidades principales de **FastAPI**. +El [Tutorial - Guía del usuario](../tutorial/index.md) principal debería ser suficiente para darte un recorrido por todas las funcionalidades principales de **FastAPI**. En las siguientes secciones verás otras opciones, configuraciones y funcionalidades adicionales. @@ -16,6 +16,6 @@ Y es posible que para tu caso de uso, la solución esté en una de ellas. ## Lee primero el Tutorial { #read-the-tutorial-first } -Aún podrías usar la mayoría de las funcionalidades en **FastAPI** con el conocimiento del [Tutorial - Guía del usuario](../tutorial/index.md){.internal-link target=_blank} principal. +Aún podrías usar la mayoría de las funcionalidades en **FastAPI** con el conocimiento del [Tutorial - Guía del usuario](../tutorial/index.md) principal. Y las siguientes secciones asumen que ya lo leíste y que conoces esas ideas principales. diff --git a/docs/es/docs/advanced/json-base64-bytes.md b/docs/es/docs/advanced/json-base64-bytes.md new file mode 100644 index 0000000000..12936722c7 --- /dev/null +++ b/docs/es/docs/advanced/json-base64-bytes.md @@ -0,0 +1,63 @@ +# JSON con Bytes como Base64 { #json-with-bytes-as-base64 } + +Si tu app necesita recibir y enviar datos JSON, pero necesitas incluir datos binarios en él, puedes codificarlos como base64. + +## Base64 vs Archivos { #base64-vs-files } + +Considera primero si puedes usar [Archivos en request](../tutorial/request-files.md) para subir datos binarios y [Response personalizada - FileResponse](./custom-response.md#fileresponse--fileresponse-) para enviar datos binarios, en lugar de codificarlos en JSON. + +JSON solo puede contener strings codificados en UTF-8, así que no puede contener bytes crudos. + +Base64 puede codificar datos binarios en strings, pero para hacerlo necesita usar más caracteres que los datos binarios originales, así que normalmente sería menos eficiente que los archivos normales. + +Usa base64 solo si definitivamente necesitas incluir datos binarios en JSON y no puedes usar archivos para eso. + +## Pydantic `bytes` { #pydantic-bytes } + +Puedes declarar un modelo de Pydantic con campos `bytes`, y luego usar `val_json_bytes` en la configuración del modelo para indicarle que use base64 para validar datos JSON de entrada; como parte de esa validación decodificará el string base64 en bytes. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *} + +Si revisas `/docs`, verás que el campo `data` espera bytes codificados en base64: + +
+ +
+ +Podrías enviar un request como: + +```json +{ + "description": "Some data", + "data": "aGVsbG8=" +} +``` + +/// tip | Consejo + +`aGVsbG8=` es la codificación base64 de `hello`. + +/// + +Y luego Pydantic decodificará el string base64 y te dará los bytes originales en el campo `data` del modelo. + +Recibirás una response como: + +```json +{ + "description": "Some data", + "content": "hello" +} +``` + +## Pydantic `bytes` para datos de salida { #pydantic-bytes-for-output-data } + +También puedes usar campos `bytes` con `ser_json_bytes` en la configuración del modelo para datos de salida, y Pydantic serializará los bytes como base64 al generar la response JSON. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *} + +## Pydantic `bytes` para datos de entrada y salida { #pydantic-bytes-for-input-and-output-data } + +Y por supuesto, puedes usar el mismo modelo configurado para usar base64 para manejar tanto la entrada (*validate*) con `val_json_bytes` como la salida (*serialize*) con `ser_json_bytes` al recibir y enviar datos JSON. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *} diff --git a/docs/es/docs/advanced/middleware.md b/docs/es/docs/advanced/middleware.md index ed582c4655..bfe70267a5 100644 --- a/docs/es/docs/advanced/middleware.md +++ b/docs/es/docs/advanced/middleware.md @@ -1,8 +1,8 @@ # Middleware Avanzado { #advanced-middleware } -En el tutorial principal leíste cómo agregar [Middleware Personalizado](../tutorial/middleware.md){.internal-link target=_blank} a tu aplicación. +En el tutorial principal leíste cómo agregar [Middleware Personalizado](../tutorial/middleware.md) a tu aplicación. -Y luego también leíste cómo manejar [CORS con el `CORSMiddleware`](../tutorial/cors.md){.internal-link target=_blank}. +Y luego también leíste cómo manejar [CORS con el `CORSMiddleware`](../tutorial/cors.md). En esta sección veremos cómo usar otros middlewares. @@ -91,7 +91,7 @@ Hay muchos otros middlewares ASGI. Por ejemplo: -* `ProxyHeadersMiddleware` de Uvicorn -* MessagePack +* [`ProxyHeadersMiddleware` de Uvicorn](https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py) +* [MessagePack](https://github.com/florimondmanca/msgpack-asgi) -Para ver otros middlewares disponibles, revisa la documentación de Middleware de Starlette y la Lista ASGI Awesome. +Para ver otros middlewares disponibles, revisa [la documentación de Middleware de Starlette](https://www.starlette.dev/middleware/) y la [Lista ASGI Awesome](https://github.com/florimondmanca/awesome-asgi). diff --git a/docs/es/docs/advanced/openapi-callbacks.md b/docs/es/docs/advanced/openapi-callbacks.md index caaa70fa89..5e3a1572c6 100644 --- a/docs/es/docs/advanced/openapi-callbacks.md +++ b/docs/es/docs/advanced/openapi-callbacks.md @@ -35,7 +35,7 @@ Esta parte es bastante normal, probablemente ya estés familiarizado con la mayo /// tip | Consejo -El parámetro de query `callback_url` utiliza un tipo Url de Pydantic. +El parámetro de query `callback_url` utiliza un tipo [Url](https://docs.pydantic.dev/latest/api/networks/) de Pydantic. /// @@ -66,7 +66,7 @@ Este ejemplo no implementa el callback en sí (eso podría ser solo una línea d El callback real es solo un request HTTP. -Cuando implementes el callback tú mismo, podrías usar algo como HTTPX o Requests. +Cuando implementes el callback tú mismo, podrías usar algo como [HTTPX](https://www.python-httpx.org) o [Requests](https://requests.readthedocs.io/). /// @@ -106,11 +106,11 @@ Debería verse como una *path operation* normal de FastAPI: Hay 2 diferencias principales respecto a una *path operation* normal: * No necesita tener ningún código real, porque tu aplicación nunca llamará a este código. Solo se usa para documentar la *API externa*. Así que, la función podría simplemente tener `pass`. -* El *path* puede contener una expresión OpenAPI 3 (ver más abajo) donde puede usar variables con parámetros y partes del request original enviado a *tu API*. +* El *path* puede contener una [expresión OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) (ver más abajo) donde puede usar variables con parámetros y partes del request original enviado a *tu API*. ### La expresión del path del callback { #the-callback-path-expression } -El *path* del callback puede tener una expresión OpenAPI 3 que puede contener partes del request original enviado a *tu API*. +El *path* del callback puede tener una [expresión OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) que puede contener partes del request original enviado a *tu API*. En este caso, es el `str`: @@ -179,7 +179,7 @@ Observa que no estás pasando el router en sí (`invoices_callback_router`) a `c ### Revisa la documentación { #check-the-docs } -Ahora puedes iniciar tu aplicación e ir a http://127.0.0.1:8000/docs. +Ahora puedes iniciar tu aplicación e ir a [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Verás tu documentación incluyendo una sección de "Callbacks" para tu *path operation* que muestra cómo debería verse la *API externa*: diff --git a/docs/es/docs/advanced/openapi-webhooks.md b/docs/es/docs/advanced/openapi-webhooks.md index 4f657ad53e..163293f834 100644 --- a/docs/es/docs/advanced/openapi-webhooks.md +++ b/docs/es/docs/advanced/openapi-webhooks.md @@ -48,7 +48,7 @@ Esto es porque se espera que **tus usuarios** definan el actual **URL path** don ### Revisa la documentación { #check-the-docs } -Ahora puedes iniciar tu app e ir a http://127.0.0.1:8000/docs. +Ahora puedes iniciar tu app e ir a [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Verás que tu documentación tiene las *path operations* normales y ahora también algunos **webhooks**: diff --git a/docs/es/docs/advanced/path-operation-advanced-configuration.md b/docs/es/docs/advanced/path-operation-advanced-configuration.md index 0ba586c1c1..a21975bc7c 100644 --- a/docs/es/docs/advanced/path-operation-advanced-configuration.md +++ b/docs/es/docs/advanced/path-operation-advanced-configuration.md @@ -60,7 +60,7 @@ Eso define los metadatos sobre el response principal de una *path operation*. También puedes declarar responses adicionales con sus modelos, códigos de estado, etc. -Hay un capítulo entero en la documentación sobre ello, puedes leerlo en [Responses Adicionales en OpenAPI](additional-responses.md){.internal-link target=_blank}. +Hay un capítulo entero en la documentación sobre ello, puedes leerlo en [Responses Adicionales en OpenAPI](additional-responses.md). ## OpenAPI Extra { #openapi-extra } @@ -68,7 +68,7 @@ Cuando declaras una *path operation* en tu aplicación, **FastAPI** genera autom /// note | Detalles técnicos -En la especificación de OpenAPI se llama el Objeto de Operación. +En la especificación de OpenAPI se llama el [Objeto de Operación](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operation-object). /// @@ -82,7 +82,7 @@ Este esquema de OpenAPI específico de *path operation* normalmente se genera au Este es un punto de extensión de bajo nivel. -Si solo necesitas declarar responses adicionales, una forma más conveniente de hacerlo es con [Responses Adicionales en OpenAPI](additional-responses.md){.internal-link target=_blank}. +Si solo necesitas declarar responses adicionales, una forma más conveniente de hacerlo es con [Responses Adicionales en OpenAPI](additional-responses.md). /// @@ -141,7 +141,7 @@ Podrías hacer eso con `openapi_extra`: {* ../../docs_src/path_operation_advanced_configuration/tutorial006_py310.py hl[19:36, 39:40] *} -En este ejemplo, no declaramos ningún modelo Pydantic. De hecho, el request body ni siquiera es parseado como JSON, se lee directamente como `bytes`, y la función `magic_data_reader()` sería la encargada de parsearlo de alguna manera. +En este ejemplo, no declaramos ningún modelo Pydantic. De hecho, el request body ni siquiera es parseado como JSON, se lee directamente como `bytes`, y la función `magic_data_reader()` sería la encargada de hacer parse de él de alguna manera. Sin embargo, podemos declarar el esquema esperado para el request body. @@ -157,9 +157,9 @@ Por ejemplo, en esta aplicación no usamos la funcionalidad integrada de FastAPI Sin embargo, aunque no estamos usando la funcionalidad integrada por defecto, aún estamos usando un modelo Pydantic para generar manualmente el JSON Schema para los datos que queremos recibir en YAML. -Luego usamos el request directamente, y extraemos el cuerpo como `bytes`. Esto significa que FastAPI ni siquiera intentará parsear la carga útil del request como JSON. +Luego usamos el request directamente, y extraemos el cuerpo como `bytes`. Esto significa que FastAPI ni siquiera intentará hacer parse de la carga útil del request como JSON. -Y luego en nuestro código, parseamos ese contenido YAML directamente, y nuevamente estamos usando el mismo modelo Pydantic para validar el contenido YAML: +Y luego en nuestro código, hacemos parse de ese contenido YAML directamente, y nuevamente estamos usando el mismo modelo Pydantic para validar el contenido YAML: {* ../../docs_src/path_operation_advanced_configuration/tutorial007_py310.py hl[24:31] *} diff --git a/docs/es/docs/advanced/response-change-status-code.md b/docs/es/docs/advanced/response-change-status-code.md index 622001291f..859f484de6 100644 --- a/docs/es/docs/advanced/response-change-status-code.md +++ b/docs/es/docs/advanced/response-change-status-code.md @@ -1,6 +1,6 @@ # Response - Cambiar Código de Estado { #response-change-status-code } -Probablemente leíste antes que puedes establecer un [Código de Estado de Response](../tutorial/response-status-code.md){.internal-link target=_blank} por defecto. +Probablemente leíste antes que puedes establecer un [Código de Estado de Response](../tutorial/response-status-code.md) por defecto. Pero en algunos casos necesitas devolver un código de estado diferente al predeterminado. diff --git a/docs/es/docs/advanced/response-cookies.md b/docs/es/docs/advanced/response-cookies.md index e451d89390..e40a191298 100644 --- a/docs/es/docs/advanced/response-cookies.md +++ b/docs/es/docs/advanced/response-cookies.md @@ -20,7 +20,7 @@ También puedes declarar el parámetro `Response` en las dependencias, y estable También puedes crear cookies al devolver una `Response` directamente en tu código. -Para hacer eso, puedes crear un response como se describe en [Devolver un Response Directamente](response-directly.md){.internal-link target=_blank}. +Para hacer eso, puedes crear un response como se describe en [Devolver un Response Directamente](response-directly.md). Luego establece Cookies en ella, y luego devuélvela: @@ -48,4 +48,4 @@ Y como el `Response` se puede usar frecuentemente para establecer headers y cook /// -Para ver todos los parámetros y opciones disponibles, revisa la documentación en Starlette. +Para ver todos los parámetros y opciones disponibles, revisa la [documentación en Starlette](https://www.starlette.dev/responses/#set-cookie). diff --git a/docs/es/docs/advanced/response-directly.md b/docs/es/docs/advanced/response-directly.md index b9b1df447a..b2d5d18b88 100644 --- a/docs/es/docs/advanced/response-directly.md +++ b/docs/es/docs/advanced/response-directly.md @@ -2,19 +2,23 @@ Cuando creas una *path operation* en **FastAPI**, normalmente puedes devolver cualquier dato desde ella: un `dict`, una `list`, un modelo de Pydantic, un modelo de base de datos, etc. -Por defecto, **FastAPI** convertiría automáticamente ese valor de retorno a JSON usando el `jsonable_encoder` explicado en [JSON Compatible Encoder](../tutorial/encoder.md){.internal-link target=_blank}. +Si declaras un [Response Model](../tutorial/response-model.md) FastAPI lo usará para serializar los datos a JSON, usando Pydantic. -Luego, detrás de escena, pondría esos datos compatibles con JSON (por ejemplo, un `dict`) dentro de un `JSONResponse` que se usaría para enviar el response al cliente. +Si no declaras un response model, FastAPI usará el `jsonable_encoder` explicado en [JSON Compatible Encoder](../tutorial/encoder.md) y lo pondrá en un `JSONResponse`. -Pero puedes devolver un `JSONResponse` directamente desde tus *path operations*. +También podrías crear un `JSONResponse` directamente y devolverlo. -Esto podría ser útil, por ejemplo, para devolver headers o cookies personalizados. +/// tip | Consejo + +Normalmente tendrás mucho mejor rendimiento usando un [Response Model](../tutorial/response-model.md) que devolviendo un `JSONResponse` directamente, ya que de esa forma serializa los datos usando Pydantic, en Rust. + +/// ## Devolver una `Response` { #return-a-response } De hecho, puedes devolver cualquier `Response` o cualquier subclase de ella. -/// tip | Consejo +/// info | Información `JSONResponse` en sí misma es una subclase de `Response`. @@ -26,6 +30,8 @@ No hará ninguna conversión de datos con los modelos de Pydantic, no convertir Esto te da mucha flexibilidad. Puedes devolver cualquier tipo de datos, sobrescribir cualquier declaración o validación de datos, etc. +También te da mucha responsabilidad. Tienes que asegurarte de que los datos que devuelves sean correctos, en el formato correcto, que se puedan serializar, etc. + ## Usar el `jsonable_encoder` en una `Response` { #using-the-jsonable-encoder-in-a-response } Como **FastAPI** no realiza cambios en una `Response` que devuelves, tienes que asegurarte de que sus contenidos estén listos para ello. @@ -50,16 +56,28 @@ El ejemplo anterior muestra todas las partes que necesitas, pero aún no es muy Ahora, veamos cómo podrías usar eso para devolver un response personalizado. -Digamos que quieres devolver un response en XML. +Digamos que quieres devolver un response en [XML](https://en.wikipedia.org/wiki/XML). Podrías poner tu contenido XML en un string, poner eso en un `Response`, y devolverlo: {* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *} +## Cómo funciona un Response Model { #how-a-response-model-works } + +Cuando declaras un [Response Model - Return Type](../tutorial/response-model.md) en una *path operation*, **FastAPI** lo usará para serializar los datos a JSON, usando Pydantic. + +{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *} + +Como eso sucederá del lado de Rust, el rendimiento será mucho mejor que si se hiciera con Python normal y la clase `JSONResponse`. + +Al usar un `response_model` o tipo de retorno, FastAPI no usará el `jsonable_encoder` para convertir los datos (lo cual sería más lento) ni la clase `JSONResponse`. + +En su lugar, toma los bytes JSON generados con Pydantic usando el response model (o tipo de retorno) y devuelve una `Response` con el media type correcto para JSON directamente (`application/json`). + ## Notas { #notes } Cuando devuelves una `Response` directamente, sus datos no son validados, convertidos (serializados), ni documentados automáticamente. -Pero aún puedes documentarlo como se describe en [Additional Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}. +Pero aún puedes documentarlo como se describe en [Additional Responses in OpenAPI](additional-responses.md). Puedes ver en secciones posteriores cómo usar/declarar estas `Response`s personalizadas mientras todavía tienes conversión automática de datos, documentación, etc. diff --git a/docs/es/docs/advanced/response-headers.md b/docs/es/docs/advanced/response-headers.md index 1d16d86a52..06107eb2d1 100644 --- a/docs/es/docs/advanced/response-headers.md +++ b/docs/es/docs/advanced/response-headers.md @@ -20,7 +20,7 @@ También puedes declarar el parámetro `Response` en dependencias y establecer h También puedes agregar headers cuando devuelves un `Response` directamente. -Crea un response como se describe en [Retorna un Response Directamente](response-directly.md){.internal-link target=_blank} y pasa los headers como un parámetro adicional: +Crea un response como se describe en [Retorna un Response Directamente](response-directly.md) y pasa los headers como un parámetro adicional: {* ../../docs_src/response_headers/tutorial001_py310.py hl[10:12] *} @@ -36,6 +36,6 @@ Y como el `Response` se puede usar frecuentemente para establecer headers y cook ## Headers Personalizados { #custom-headers } -Ten en cuenta que los headers propietarios personalizados se pueden agregar usando el prefijo `X-`. +Ten en cuenta que los headers propietarios personalizados se pueden agregar [usando el prefijo `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). -Pero si tienes headers personalizados que quieres que un cliente en un navegador pueda ver, necesitas agregarlos a tus configuraciones de CORS (leer más en [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank}), usando el parámetro `expose_headers` documentado en la documentación CORS de Starlette. +Pero si tienes headers personalizados que quieres que un cliente en un navegador pueda ver, necesitas agregarlos a tus configuraciones de CORS (leer más en [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md)), usando el parámetro `expose_headers` documentado en [la documentación CORS de Starlette](https://www.starlette.dev/middleware/#corsmiddleware). diff --git a/docs/es/docs/advanced/security/http-basic-auth.md b/docs/es/docs/advanced/security/http-basic-auth.md index d7f181ef80..c9c1562b5a 100644 --- a/docs/es/docs/advanced/security/http-basic-auth.md +++ b/docs/es/docs/advanced/security/http-basic-auth.md @@ -32,7 +32,7 @@ Aquí hay un ejemplo más completo. Usa una dependencia para comprobar si el nombre de usuario y la contraseña son correctos. -Para esto, usa el módulo estándar de Python `secrets` para verificar el nombre de usuario y la contraseña. +Para esto, usa el módulo estándar de Python [`secrets`](https://docs.python.org/3/library/secrets.html) para verificar el nombre de usuario y la contraseña. `secrets.compare_digest()` necesita tomar `bytes` o un `str` que solo contenga caracteres ASCII (los carácteres en inglés), esto significa que no funcionaría con caracteres como `á`, como en `Sebastián`. diff --git a/docs/es/docs/advanced/security/index.md b/docs/es/docs/advanced/security/index.md index 8b3e67fac4..3aa4d2dcf8 100644 --- a/docs/es/docs/advanced/security/index.md +++ b/docs/es/docs/advanced/security/index.md @@ -2,11 +2,11 @@ ## Funcionalidades Adicionales { #additional-features } -Hay algunas funcionalidades extra para manejar la seguridad aparte de las cubiertas en el [Tutorial - Guía del Usuario: Seguridad](../../tutorial/security/index.md){.internal-link target=_blank}. +Hay algunas funcionalidades extra para manejar la seguridad aparte de las cubiertas en el [Tutorial - Guía del Usuario: Seguridad](../../tutorial/security/index.md). /// tip | Consejo -Las siguientes secciones **no son necesariamente "avanzadas"**. +Las siguientes secciones no son necesariamente "avanzadas". Y es posible que para tu caso de uso, la solución esté en una de ellas. @@ -14,6 +14,6 @@ Y es posible que para tu caso de uso, la solución esté en una de ellas. ## Lee primero el Tutorial { #read-the-tutorial-first } -Las siguientes secciones asumen que ya leíste el [Tutorial - Guía del Usuario: Seguridad](../../tutorial/security/index.md){.internal-link target=_blank} principal. +Las siguientes secciones asumen que ya leíste el [Tutorial - Guía del Usuario: Seguridad](../../tutorial/security/index.md) principal. Todas están basadas en los mismos conceptos, pero permiten algunas funcionalidades adicionales. diff --git a/docs/es/docs/advanced/security/oauth2-scopes.md b/docs/es/docs/advanced/security/oauth2-scopes.md index 4e4580fde3..6ee3dd5ac9 100644 --- a/docs/es/docs/advanced/security/oauth2-scopes.md +++ b/docs/es/docs/advanced/security/oauth2-scopes.md @@ -60,7 +60,7 @@ Para OAuth2 son solo strings. ## Vista global { #global-view } -Primero, echemos un vistazo rápido a las partes que cambian desde los ejemplos en el **Tutorial - User Guide** principal para [OAuth2 con Password (y hashing), Bearer con tokens JWT](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. Ahora usando scopes de OAuth2: +Primero, echemos un vistazo rápido a las partes que cambian desde los ejemplos en el **Tutorial - User Guide** principal para [OAuth2 con Password (y hashing), Bearer con tokens JWT](../../tutorial/security/oauth2-jwt.md). Ahora usando scopes de OAuth2: {* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *} @@ -271,4 +271,4 @@ Pero al final, están implementando el mismo estándar OAuth2. ## `Security` en `dependencies` del decorador { #security-in-decorator-dependencies } -De la misma manera que puedes definir una `list` de `Depends` en el parámetro `dependencies` del decorador (como se explica en [Dependencias en decoradores de path operation](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}), también podrías usar `Security` con `scopes` allí. +De la misma manera que puedes definir una `list` de `Depends` en el parámetro `dependencies` del decorador (como se explica en [Dependencias en decoradores de path operation](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md)), también podrías usar `Security` con `scopes` allí. diff --git a/docs/es/docs/advanced/settings.md b/docs/es/docs/advanced/settings.md index f176dc1f38..2411ddc452 100644 --- a/docs/es/docs/advanced/settings.md +++ b/docs/es/docs/advanced/settings.md @@ -8,7 +8,7 @@ Por esta razón, es común proporcionarlas en variables de entorno que son leíd /// tip | Consejo -Para entender las variables de entorno, puedes leer [Variables de Entorno](../environment-variables.md){.internal-link target=_blank}. +Para entender las variables de entorno, puedes leer [Variables de Entorno](../environment-variables.md). /// @@ -20,11 +20,11 @@ Eso significa que cualquier valor leído en Python desde una variable de entorno ## Pydantic `Settings` { #pydantic-settings } -Afortunadamente, Pydantic proporciona una gran utilidad para manejar estas configuraciones provenientes de variables de entorno con Pydantic: Settings management. +Afortunadamente, Pydantic proporciona una gran utilidad para manejar estas configuraciones provenientes de variables de entorno con [Pydantic: Settings management](https://docs.pydantic.dev/latest/concepts/pydantic_settings/). ### Instalar `pydantic-settings` { #install-pydantic-settings } -Primero, asegúrate de crear tu [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, actívalo y luego instala el paquete `pydantic-settings`: +Primero, asegúrate de crear tu [entorno virtual](../virtual-environments.md), actívalo y luego instala el paquete `pydantic-settings`:
@@ -100,7 +100,7 @@ Y el `items_per_user` mantendría su valor por defecto de `50`. ## Configuraciones en otro módulo { #settings-in-another-module } -Podrías poner esas configuraciones en otro archivo de módulo como viste en [Aplicaciones Más Grandes - Múltiples Archivos](../tutorial/bigger-applications.md){.internal-link target=_blank}. +Podrías poner esas configuraciones en otro archivo de módulo como viste en [Aplicaciones Más Grandes - Múltiples Archivos](../tutorial/bigger-applications.md). Por ejemplo, podrías tener un archivo `config.py` con: @@ -112,7 +112,7 @@ Y luego usarlo en un archivo `main.py`: /// tip | Consejo -También necesitarías un archivo `__init__.py` como viste en [Aplicaciones Más Grandes - Múltiples Archivos](../tutorial/bigger-applications.md){.internal-link target=_blank}. +También necesitarías un archivo `__init__.py` como viste en [Aplicaciones Más Grandes - Múltiples Archivos](../tutorial/bigger-applications.md). /// @@ -172,7 +172,7 @@ Pero un archivo dotenv realmente no tiene que tener ese nombre exacto. /// -Pydantic tiene soporte para leer desde estos tipos de archivos usando un paquete externo. Puedes leer más en Pydantic Settings: Dotenv (.env) support. +Pydantic tiene soporte para leer desde estos tipos de archivos usando un paquete externo. Puedes leer más en [Pydantic Settings: Dotenv (.env) support](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support). /// tip | Consejo @@ -197,7 +197,7 @@ Y luego actualizar tu `config.py` con: /// tip | Consejo -El atributo `model_config` se usa solo para configuración de Pydantic. Puedes leer más en Pydantic: Concepts: Configuration. +El atributo `model_config` se usa solo para configuración de Pydantic. Puedes leer más en [Pydantic: Concepts: Configuration](https://docs.pydantic.dev/latest/concepts/config/). /// @@ -291,7 +291,7 @@ En el caso de nuestra dependencia `get_settings()`, la función ni siquiera toma De esa manera, se comporta casi como si fuera solo una variable global. Pero como usa una función de dependencia, entonces podemos sobrescribirla fácilmente para las pruebas. -`@lru_cache` es parte de `functools`, que es parte del paquete estándar de Python, puedes leer más sobre él en las docs de Python para `@lru_cache`. +`@lru_cache` es parte de `functools`, que es parte del paquete estándar de Python, puedes leer más sobre él en las [docs de Python para `@lru_cache`](https://docs.python.org/3/library/functools.html#functools.lru_cache). ## Resumen { #recap } diff --git a/docs/es/docs/advanced/stream-data.md b/docs/es/docs/advanced/stream-data.md new file mode 100644 index 0000000000..964a9ed586 --- /dev/null +++ b/docs/es/docs/advanced/stream-data.md @@ -0,0 +1,117 @@ +# Transmitir datos { #stream-data } + +Si quieres transmitir datos que se puedan estructurar como JSON, deberías [Transmitir JSON Lines](../tutorial/stream-json-lines.md). + +Pero si quieres transmitir datos binarios puros o strings, aquí tienes cómo hacerlo. + +/// info | Información + +Añadido en FastAPI 0.134.0. + +/// + +## Casos de uso { #use-cases } + +Podrías usar esto si quieres transmitir strings puros, por ejemplo directamente de la salida de un servicio de AI LLM. + +También podrías usarlo para transmitir archivos binarios grandes, donde transmites cada bloque de datos a medida que lo lees, sin tener que leerlo todo en memoria de una sola vez. + +También podrías transmitir video o audio de esta manera; incluso podría generarse mientras lo procesas y lo envías. + +## Un `StreamingResponse` con `yield` { #a-streamingresponse-with-yield } + +Si declaras un `response_class=StreamingResponse` en tu *path operation function*, puedes usar `yield` para enviar cada bloque de datos a su vez. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *} + +FastAPI entregará cada bloque de datos a `StreamingResponse` tal cual, no intentará convertirlo a JSON ni nada parecido. + +### *path operation functions* no async { #non-async-path-operation-functions } + +También puedes usar funciones `def` normales (sin `async`) y usar `yield` de la misma manera. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[26:29] hl[27] *} + +### Sin anotación { #no-annotation } + +Realmente no necesitas declarar la anotación de tipo de retorno para transmitir datos binarios. + +Como FastAPI no intentará convertir los datos a JSON con Pydantic ni serializarlos de ninguna manera, en este caso la anotación de tipos es solo para que la use tu editor y tus herramientas; FastAPI no la usará. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} + +Esto también significa que con `StreamingResponse` tienes la libertad y la responsabilidad de producir y codificar los bytes de datos exactamente como necesites enviarlos, independientemente de las anotaciones de tipos. 🤓 + +### Transmitir bytes { #stream-bytes } + +Uno de los casos de uso principales sería transmitir `bytes` en lugar de strings; por supuesto puedes hacerlo. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[44:47] hl[47] *} + +## Un `PNGStreamingResponse` personalizado { #a-custom-pngstreamingresponse } + +En los ejemplos anteriores, se transmitieron los bytes de datos, pero la response no tenía un header `Content-Type`, así que el cliente no sabía qué tipo de datos estaba recibiendo. + +Puedes crear una subclase personalizada de `StreamingResponse` que establezca el header `Content-Type` al tipo de datos que estás transmitiendo. + +Por ejemplo, puedes crear un `PNGStreamingResponse` que establezca el header `Content-Type` a `image/png` usando el atributo `media_type`: + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *} + +Luego puedes usar esta nueva clase en `response_class=PNGStreamingResponse` en tu *path operation function*: + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *} + +### Simular un archivo { #simulate-a-file } + +En este ejemplo estamos simulando un archivo con `io.BytesIO`, que es un objeto tipo archivo que vive solo en memoria, pero nos permite usar la misma interfaz. + +Por ejemplo, podemos iterarlo para consumir su contenido, como podríamos con un archivo. + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[1:27] hl[3,12:13,25] *} + +/// note | Detalles técnicos + +Las otras dos variables, `image_base64` y `binary_image`, son una imagen codificada en Base64 y luego convertida a bytes, para después pasarla a `io.BytesIO`. + +Solo para que pueda vivir en el mismo archivo para este ejemplo y puedas copiarlo y ejecutarlo tal cual. 🥚 + +/// + +Al usar un bloque `with`, nos aseguramos de que el objeto tipo archivo se cierre cuando termine la función generadora (la función con `yield`). Es decir, después de que termine de enviar la response. + +No sería tan importante en este ejemplo específico porque es un archivo falso en memoria (con `io.BytesIO`), pero con un archivo real sí sería importante asegurarse de que el archivo se cierre al terminar de trabajar con él. + +### Archivos y async { #files-and-async } + +En la mayoría de los casos, los objetos tipo archivo no son compatibles con `async` y `await` por defecto. + +Por ejemplo, no tienen un `await file.read()`, ni un `async for chunk in file`. + +Y en muchos casos leerlos sería una operación bloqueante (que podría bloquear el event loop), porque se leen desde disco o desde la red. + +/// info | Información + +El ejemplo anterior es en realidad una excepción, porque el objeto `io.BytesIO` ya está en memoria, así que leerlo no bloqueará nada. + +Pero en muchos casos leer un archivo u objeto tipo archivo sí bloquearía. + +/// + +Para evitar bloquear el event loop, puedes simplemente declarar la *path operation function* con un `def` normal en lugar de `async def`; de esa forma FastAPI la ejecutará en un worker de threadpool para evitar bloquear el loop principal. + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *} + +/// tip | Consejo + +Si necesitas llamar código bloqueante desde dentro de una función async, o una función async desde dentro de una función bloqueante, podrías usar [Asyncer](https://asyncer.tiangolo.com), un paquete hermano de FastAPI. + +/// + +### `yield from` { #yield-from } + +Cuando estés iterando sobre algo, como un objeto tipo archivo, y estés haciendo `yield` para cada elemento, también podrías usar `yield from` para hacer `yield` de cada elemento directamente y saltarte el `for`. + +Esto no es particular de FastAPI, es simplemente Python, pero es un truco útil que conviene conocer. 😎 + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[37:40] hl[40] *} diff --git a/docs/es/docs/advanced/strict-content-type.md b/docs/es/docs/advanced/strict-content-type.md new file mode 100644 index 0000000000..41615edf3b --- /dev/null +++ b/docs/es/docs/advanced/strict-content-type.md @@ -0,0 +1,88 @@ +# Chequeo estricto de Content-Type { #strict-content-type-checking } + +Por defecto, **FastAPI** usa un chequeo estricto del header `Content-Type` para request bodies JSON, esto significa que las requests JSON deben incluir un header `Content-Type` válido (p. ej. `application/json`) para que el request body se parse como JSON. + +## Riesgo de CSRF { #csrf-risk } + +Este comportamiento por defecto provee protección contra una clase de ataques de **Cross-Site Request Forgery (CSRF)** en un escenario muy específico. + +Estos ataques aprovechan que los navegadores permiten que los scripts envíen requests sin hacer un preflight de CORS cuando: + +* no tienen un header `Content-Type` (p. ej. usando `fetch()` con un body `Blob`) +* y no envían credenciales de autenticación. + +Este tipo de ataque es relevante principalmente cuando: + +* la aplicación corre localmente (p. ej. en `localhost`) o en una red interna +* y la aplicación no tiene ninguna autenticación, espera que cualquier request de la misma red sea confiable. + +## Ejemplo de ataque { #example-attack } + +Imagina que construyes una forma de ejecutar un agente de IA local. + +Provee un API en + +``` +http://localhost:8000/v1/agents/multivac +``` + +También hay un frontend en + +``` +http://localhost:8000 +``` + +/// tip | Consejo + +Ten en cuenta que ambos tienen el mismo host. + +/// + +Luego, usando el frontend, puedes hacer que el agente de IA haga cosas en tu nombre. + +Como está corriendo localmente y no en Internet abierta, decides no tener ninguna autenticación configurada, confiando simplemente en el acceso a la red local. + +Entonces, uno de tus usuarios podría instalarlo y ejecutarlo localmente. + +Después podría abrir un sitio web malicioso, por ejemplo algo como + +``` +https://evilhackers.example.com +``` + +Y ese sitio malicioso envía requests usando `fetch()` con un body `Blob` al API local en + +``` +http://localhost:8000/v1/agents/multivac +``` + +Aunque el host del sitio malicioso y el de la app local sea diferente, el navegador no disparará un preflight de CORS porque: + +* Está corriendo sin ninguna autenticación, no tiene que enviar credenciales. +* El navegador cree que no está enviando JSON (por la falta del header `Content-Type`). + +Entonces el sitio malicioso podría hacer que el agente de IA local envíe mensajes agresivos al exjefe del usuario... o peor. 😅 + +## Internet abierta { #open-internet } + +Si tu app está en Internet abierta, no “confiarías en la red” ni permitirías que cualquiera envíe requests privilegiadas sin autenticación. + +Los atacantes podrían simplemente ejecutar un script para enviar requests a tu API, sin necesidad de interacción del navegador, así que probablemente ya estás asegurando cualquier endpoint privilegiado. + +En ese caso, este ataque/riesgo no aplica a ti. + +Este riesgo y ataque es relevante principalmente cuando la app corre en la red local y esa es la única protección asumida. + +## Permitir requests sin Content-Type { #allowing-requests-without-content-type } + +Si necesitas soportar clientes que no envían un header `Content-Type`, puedes desactivar el chequeo estricto configurando `strict_content_type=False`: + +{* ../../docs_src/strict_content_type/tutorial001_py310.py hl[4] *} + +Con esta configuración, las requests sin un header `Content-Type` tendrán su body parseado como JSON, que es el mismo comportamiento de versiones anteriores de FastAPI. + +/// info | Información + +Este comportamiento y configuración se añadieron en FastAPI 0.132.0. + +/// diff --git a/docs/es/docs/advanced/sub-applications.md b/docs/es/docs/advanced/sub-applications.md index 32d4c7de2a..934bb1608d 100644 --- a/docs/es/docs/advanced/sub-applications.md +++ b/docs/es/docs/advanced/sub-applications.md @@ -30,25 +30,25 @@ En este caso, se montará en el path `/subapi`: ### Revisa la documentación automática de la API { #check-the-automatic-api-docs } -Ahora, ejecuta el comando `fastapi` con tu archivo: +Ahora, ejecuta el comando `fastapi`:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Y abre la documentación en http://127.0.0.1:8000/docs. +Y abre la documentación en [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Verás la documentación automática de la API para la aplicación principal, incluyendo solo sus propias _path operations_: -Y luego, abre la documentación para la sub-aplicación, en http://127.0.0.1:8000/subapi/docs. +Y luego, abre la documentación para la sub-aplicación, en [http://127.0.0.1:8000/subapi/docs](http://127.0.0.1:8000/subapi/docs). Verás la documentación automática de la API para la sub-aplicación, incluyendo solo sus propias _path operations_, todas bajo el prefijo correcto del sub-path `/subapi`: @@ -64,4 +64,4 @@ De esa manera, la sub-aplicación sabrá usar ese prefijo de path para la interf Y la sub-aplicación también podría tener sus propias sub-aplicaciones montadas y todo funcionaría correctamente, porque FastAPI maneja todos estos `root_path`s automáticamente. -Aprenderás más sobre el `root_path` y cómo usarlo explícitamente en la sección sobre [Detrás de un Proxy](behind-a-proxy.md){.internal-link target=_blank}. +Aprenderás más sobre el `root_path` y cómo usarlo explícitamente en la sección sobre [Detrás de un Proxy](behind-a-proxy.md). diff --git a/docs/es/docs/advanced/templates.md b/docs/es/docs/advanced/templates.md index 1162d4ce4b..ce28c3062c 100644 --- a/docs/es/docs/advanced/templates.md +++ b/docs/es/docs/advanced/templates.md @@ -8,7 +8,7 @@ Hay utilidades para configurarlo fácilmente que puedes usar directamente en tu ## Instala dependencias { #install-dependencies } -Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, activarlo e instalar `jinja2`: +Asegúrate de crear un [entorno virtual](../virtual-environments.md), activarlo e instalar `jinja2`:
@@ -123,4 +123,4 @@ Y porque estás usando `StaticFiles`, ese archivo CSS sería servido automática ## Más detalles { #more-details } -Para más detalles, incluyendo cómo testear plantillas, revisa la documentación de Starlette sobre plantillas. +Para más detalles, incluyendo cómo testear plantillas, revisa [la documentación de Starlette sobre plantillas](https://www.starlette.dev/templates/). diff --git a/docs/es/docs/advanced/testing-websockets.md b/docs/es/docs/advanced/testing-websockets.md index 89ef2d5a4b..4736031633 100644 --- a/docs/es/docs/advanced/testing-websockets.md +++ b/docs/es/docs/advanced/testing-websockets.md @@ -8,6 +8,6 @@ Para esto, usas el `TestClient` en un statement `with`, conectándote al WebSock /// note | Nota -Para más detalles, revisa la documentación de Starlette sobre probar WebSockets. +Para más detalles, revisa la documentación de Starlette sobre [probar WebSockets](https://www.starlette.dev/testclient/#testing-websocket-sessions). /// diff --git a/docs/es/docs/advanced/using-request-directly.md b/docs/es/docs/advanced/using-request-directly.md index 4a063d2970..3aed8e5a36 100644 --- a/docs/es/docs/advanced/using-request-directly.md +++ b/docs/es/docs/advanced/using-request-directly.md @@ -15,7 +15,7 @@ Pero hay situaciones donde podrías necesitar acceder al objeto `Request` direct ## Detalles sobre el objeto `Request` { #details-about-the-request-object } -Como **FastAPI** es en realidad **Starlette** por debajo, con una capa de varias herramientas encima, puedes usar el objeto `Request` de Starlette directamente cuando lo necesites. +Como **FastAPI** es en realidad **Starlette** por debajo, con una capa de varias herramientas encima, puedes usar el objeto de Starlette [`Request`](https://www.starlette.dev/requests/) directamente cuando lo necesites. También significa que si obtienes datos del objeto `Request` directamente (por ejemplo, leyendo el cuerpo) no serán validados, convertidos o documentados (con OpenAPI, para la interfaz automática de usuario de la API) por FastAPI. @@ -45,7 +45,7 @@ De la misma manera, puedes declarar cualquier otro parámetro como normalmente, ## Documentación de `Request` { #request-documentation } -Puedes leer más detalles sobre el objeto `Request` en el sitio de documentación oficial de Starlette. +Puedes leer más detalles sobre el [objeto `Request` en el sitio de documentación oficial de Starlette](https://www.starlette.dev/requests/). /// note | Detalles Técnicos diff --git a/docs/es/docs/advanced/websockets.md b/docs/es/docs/advanced/websockets.md index e9391c36ca..fe75e644b8 100644 --- a/docs/es/docs/advanced/websockets.md +++ b/docs/es/docs/advanced/websockets.md @@ -1,10 +1,10 @@ # WebSockets { #websockets } -Puedes usar WebSockets con **FastAPI**. +Puedes usar [WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) con **FastAPI**. ## Instalar `websockets` { #install-websockets } -Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, activarlo e instalar `websockets` (un paquete de Python que facilita usar el protocolo "WebSocket"): +Asegúrate de crear un [entorno virtual](../virtual-environments.md), activarlo e instalar `websockets` (un paquete de Python que facilita usar el protocolo "WebSocket"):
@@ -64,19 +64,19 @@ Puedes recibir y enviar datos binarios, de texto y JSON. ## Pruébalo { #try-it } -Si tu archivo se llama `main.py`, ejecuta tu aplicación con: +Pon tu código en un archivo `main.py` y luego ejecuta tu aplicación:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Abre tu navegador en http://127.0.0.1:8000. +Abre tu navegador en [http://127.0.0.1:8000](http://127.0.0.1:8000). Verás una página simple como: @@ -115,25 +115,25 @@ Funcionan de la misma manera que para otros endpoints de FastAPI/*path operation Como esto es un WebSocket no tiene mucho sentido lanzar un `HTTPException`, en su lugar lanzamos un `WebSocketException`. -Puedes usar un código de cierre de los códigos válidos definidos en la especificación. +Puedes usar un código de cierre de los [códigos válidos definidos en la especificación](https://tools.ietf.org/html/rfc6455#section-7.4.1). /// ### Prueba los WebSockets con dependencias { #try-the-websockets-with-dependencies } -Si tu archivo se llama `main.py`, ejecuta tu aplicación con: +Ejecuta tu aplicación:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Abre tu navegador en http://127.0.0.1:8000. +Abre tu navegador en [http://127.0.0.1:8000](http://127.0.0.1:8000). Ahí puedes establecer: @@ -174,7 +174,7 @@ La aplicación anterior es un ejemplo mínimo y simple para demostrar cómo mane Pero ten en cuenta que, como todo se maneja en memoria, en una sola lista, solo funcionará mientras el proceso esté en ejecución, y solo funcionará con un solo proceso. -Si necesitas algo fácil de integrar con FastAPI pero que sea más robusto, soportado por Redis, PostgreSQL u otros, revisa encode/broadcaster. +Si necesitas algo fácil de integrar con FastAPI pero que sea más robusto, soportado por Redis, PostgreSQL u otros, revisa [encode/broadcaster](https://github.com/encode/broadcaster). /// @@ -182,5 +182,5 @@ Si necesitas algo fácil de integrar con FastAPI pero que sea más robusto, sopo Para aprender más sobre las opciones, revisa la documentación de Starlette para: -* La clase `WebSocket`. -* Manejo de WebSocket basado en clases. +* [La clase `WebSocket`](https://www.starlette.dev/websockets/). +* [Manejo de WebSocket basado en clases](https://www.starlette.dev/endpoints/#websocketendpoint). diff --git a/docs/es/docs/advanced/wsgi.md b/docs/es/docs/advanced/wsgi.md index 05322a4d1e..0d0c42fd54 100644 --- a/docs/es/docs/advanced/wsgi.md +++ b/docs/es/docs/advanced/wsgi.md @@ -1,6 +1,6 @@ # Incluyendo WSGI - Flask, Django, otros { #including-wsgi-flask-django-others } -Puedes montar aplicaciones WSGI como viste con [Sub Aplicaciones - Mounts](sub-applications.md){.internal-link target=_blank}, [Detrás de un Proxy](behind-a-proxy.md){.internal-link target=_blank}. +Puedes montar aplicaciones WSGI como viste con [Sub Aplicaciones - Mounts](sub-applications.md), [Detrás de un Proxy](behind-a-proxy.md). Para eso, puedes usar el `WSGIMiddleware` y usarlo para envolver tu aplicación WSGI, por ejemplo, Flask, Django, etc. @@ -36,13 +36,13 @@ Ahora, cada request bajo el path `/v1/` será manejado por la aplicación Flask. Y el resto será manejado por **FastAPI**. -Si lo ejecutas y vas a http://localhost:8000/v1/ verás el response de Flask: +Si lo ejecutas y vas a [http://localhost:8000/v1/](http://localhost:8000/v1/) verás el response de Flask: ```txt Hello, World from Flask! ``` -Y si vas a http://localhost:8000/v2 verás el response de FastAPI: +Y si vas a [http://localhost:8000/v2](http://localhost:8000/v2) verás el response de FastAPI: ```JSON { diff --git a/docs/es/docs/alternatives.md b/docs/es/docs/alternatives.md index cc9309dd2f..4250f0a02b 100644 --- a/docs/es/docs/alternatives.md +++ b/docs/es/docs/alternatives.md @@ -14,7 +14,7 @@ Pero en algún punto, no hubo otra opción que crear algo que proporcionara toda ## Herramientas previas { #previous-tools } -### Django { #django } +### [Django](https://www.djangoproject.com/) { #django } Es el framework más popular de Python y es ampliamente confiable. Se utiliza para construir sistemas como Instagram. @@ -22,7 +22,7 @@ Está relativamente acoplado con bases de datos relacionales (como MySQL o Postg Fue creado para generar el HTML en el backend, no para crear APIs utilizadas por un frontend moderno (como React, Vue.js y Angular) o por otros sistemas (como dispositivos del IoT) comunicándose con él. -### Django REST Framework { #django-rest-framework } +### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework } El framework Django REST fue creado para ser un kit de herramientas flexible para construir APIs Web utilizando Django, mejorando sus capacidades API. @@ -42,7 +42,7 @@ Tener una interfaz de usuario web de documentación automática de APIs. /// -### Flask { #flask } +### [Flask](https://flask.palletsprojects.com) { #flask } Flask es un "microframework", no incluye integraciones de bases de datos ni muchas de las cosas que vienen por defecto en Django. @@ -64,7 +64,7 @@ Tener un sistema de routing simple y fácil de usar. /// -### Requests { #requests } +### [Requests](https://requests.readthedocs.io) { #requests } **FastAPI** no es en realidad una alternativa a **Requests**. Su ámbito es muy diferente. @@ -106,7 +106,7 @@ Mira las similitudes entre `requests.get(...)` y `@app.get(...)`. /// -### Swagger / OpenAPI { #swagger-openapi } +### [Swagger](https://swagger.io/) / [OpenAPI](https://github.com/OAI/OpenAPI-Specification/) { #swagger-openapi } La principal funcionalidad que quería de Django REST Framework era la documentación automática de la API. @@ -124,8 +124,8 @@ Adoptar y usar un estándar abierto para especificaciones de API, en lugar de us Y a integrar herramientas de interfaz de usuario basadas en estándares: -* Swagger UI -* ReDoc +* [Swagger UI](https://github.com/swagger-api/swagger-ui) +* [ReDoc](https://github.com/Rebilly/ReDoc) Estas dos fueron elegidas por ser bastante populares y estables, pero haciendo una búsqueda rápida, podrías encontrar docenas de interfaces de usuario alternativas para OpenAPI (que puedes usar con **FastAPI**). @@ -135,7 +135,7 @@ Estas dos fueron elegidas por ser bastante populares y estables, pero haciendo u Existen varios frameworks REST para Flask, pero después de invertir tiempo y trabajo investigándolos, encontré que muchos son descontinuados o abandonados, con varios problemas existentes que los hacían inadecuados. -### Marshmallow { #marshmallow } +### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow } Una de las principales funcionalidades necesitadas por los sistemas API es la "serialización" de datos, que consiste en tomar datos del código (Python) y convertirlos en algo que pueda ser enviado a través de la red. Por ejemplo, convertir un objeto que contiene datos de una base de datos en un objeto JSON. Convertir objetos `datetime` en strings, etc. @@ -153,7 +153,7 @@ Usar código para definir "esquemas" que proporcionen tipos de datos y validaci /// -### Webargs { #webargs } +### [Webargs](https://webargs.readthedocs.io/en/latest/) { #webargs } Otra gran funcionalidad requerida por las APIs es el parsing de datos de las requests entrantes. @@ -175,7 +175,7 @@ Tener validación automática de datos entrantes en una request. /// -### APISpec { #apispec } +### [APISpec](https://apispec.readthedocs.io/en/stable/) { #apispec } Marshmallow y Webargs proporcionan validación, parsing y serialización como plug-ins. @@ -205,7 +205,7 @@ Soportar el estándar abierto para APIs, OpenAPI. /// -### Flask-apispec { #flask-apispec } +### [Flask-apispec](https://flask-apispec.readthedocs.io/en/latest/) { #flask-apispec } Es un plug-in de Flask, que conecta juntos Webargs, Marshmallow y APISpec. @@ -219,11 +219,11 @@ Esta combinación de Flask, Flask-apispec con Marshmallow y Webargs fue mi stack Usarlo llevó a la creación de varios generadores de full-stack para Flask. Estos son los principales stacks que yo (y varios equipos externos) hemos estado usando hasta ahora: -* https://github.com/tiangolo/full-stack -* https://github.com/tiangolo/full-stack-flask-couchbase -* https://github.com/tiangolo/full-stack-flask-couchdb +* [https://github.com/tiangolo/full-stack](https://github.com/tiangolo/full-stack) +* [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) -Y estos mismos generadores de full-stack fueron la base de los [Generadores de Proyectos **FastAPI**](project-generation.md){.internal-link target=_blank}. +Y estos mismos generadores de full-stack fueron la base de los [Generadores de Proyectos **FastAPI**](project-generation.md). /// info | Información @@ -237,7 +237,7 @@ Generar el esquema OpenAPI automáticamente, desde el mismo código que define l /// -### NestJS (y Angular) { #nestjs-and-angular } +### [NestJS](https://nestjs.com/) (y [Angular](https://angular.io/)) { #nestjs-and-angular } Esto ni siquiera es Python, NestJS es un framework de JavaScript (TypeScript) NodeJS inspirado por Angular. @@ -259,13 +259,13 @@ Tener un poderoso sistema de inyección de dependencias. Encontrar una forma de /// -### Sanic { #sanic } +### [Sanic](https://sanic.readthedocs.io/en/latest/) { #sanic } Fue uno de los primeros frameworks de Python extremadamente rápidos basados en `asyncio`. Fue hecho para ser muy similar a Flask. /// note | Detalles Técnicos -Usó `uvloop` en lugar del loop `asyncio` por defecto de Python. Eso fue lo que lo hizo tan rápido. +Usó [`uvloop`](https://github.com/MagicStack/uvloop) en lugar del loop `asyncio` por defecto de Python. Eso fue lo que lo hizo tan rápido. Claramente inspiró a Uvicorn y Starlette, que actualmente son más rápidos que Sanic en benchmarks abiertos. @@ -279,7 +279,7 @@ Por eso **FastAPI** se basa en Starlette, ya que es el framework más rápido di /// -### Falcon { #falcon } +### [Falcon](https://falconframework.org/) { #falcon } Falcon es otro framework de Python de alto rendimiento, está diseñado para ser minimalista y funcionar como la base de otros frameworks como Hug. @@ -297,7 +297,7 @@ Aunque en FastAPI es opcional, y se utiliza principalmente para configurar heade /// -### Molten { #molten } +### [Molten](https://moltenframework.com/) { #molten } Descubrí Molten en las primeras etapas de construcción de **FastAPI**. Y tiene ideas bastante similares: @@ -321,7 +321,7 @@ Esto en realidad inspiró la actualización de partes de Pydantic, para soportar /// -### Hug { #hug } +### [Hug](https://github.com/hugapi/hug) { #hug } Hug fue uno de los primeros frameworks en implementar la declaración de tipos de parámetros API usando las anotaciones de tipos de Python. Esta fue una gran idea que inspiró a otras herramientas a hacer lo mismo. @@ -337,7 +337,7 @@ Dado que se basa en el estándar previo para frameworks web Python sincrónicos /// info | Información -Hug fue creado por Timothy Crosley, el mismo creador de `isort`, una gran herramienta para ordenar automáticamente imports en archivos Python. +Hug fue creado por Timothy Crosley, el mismo creador de [`isort`](https://github.com/timothycrosley/isort), una gran herramienta para ordenar automáticamente imports en archivos Python. /// @@ -351,7 +351,7 @@ Hug inspiró a **FastAPI** a declarar un parámetro `response` en funciones para /// -### APIStar (<= 0.5) { #apistar-0-5 } +### [APIStar](https://github.com/encode/apistar) (<= 0.5) { #apistar-0-5 } Justo antes de decidir construir **FastAPI** encontré **APIStar** server. Tenía casi todo lo que estaba buscando y tenía un gran diseño. @@ -401,7 +401,7 @@ Considero a **FastAPI** un "sucesor espiritual" de APIStar, mientras mejora y au ## Usado por **FastAPI** { #used-by-fastapi } -### Pydantic { #pydantic } +### [Pydantic](https://docs.pydantic.dev/) { #pydantic } Pydantic es un paquete para definir validación de datos, serialización y documentación (usando JSON Schema) basándose en las anotaciones de tipos de Python. @@ -417,7 +417,7 @@ Manejar toda la validación de datos, serialización de datos y documentación a /// -### Starlette { #starlette } +### [Starlette](https://www.starlette.dev/) { #starlette } Starlette es un framework/toolkit ASGI liviano, ideal para construir servicios asyncio de alto rendimiento. @@ -433,7 +433,7 @@ Tiene: * CORS, GZip, Archivos estáticos, Responses en streaming. * Soporte para sesiones y cookies. * Cobertura de tests del 100%. -* Base de código 100% tipada. +* code base 100% tipada. * Pocas dependencias obligatorias. Starlette es actualmente el framework de Python más rápido probado. Solo superado por Uvicorn, que no es un framework, sino un servidor. @@ -462,7 +462,7 @@ Por lo tanto, cualquier cosa que puedas hacer con Starlette, puedes hacerlo dire /// -### Uvicorn { #uvicorn } +### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn } Uvicorn es un servidor ASGI extremadamente rápido, construido sobre uvloop y httptools. @@ -476,10 +476,10 @@ El servidor web principal para ejecutar aplicaciones **FastAPI**. También puedes usar la opción de línea de comandos `--workers` para tener un servidor multiproceso asíncrono. -Revisa más detalles en la sección [Despliegue](deployment/index.md){.internal-link target=_blank}. +Revisa más detalles en la sección [Despliegue](deployment/index.md). /// ## Benchmarks y velocidad { #benchmarks-and-speed } -Para entender, comparar, y ver la diferencia entre Uvicorn, Starlette y FastAPI, revisa la sección sobre [Benchmarks](benchmarks.md){.internal-link target=_blank}. +Para entender, comparar, y ver la diferencia entre Uvicorn, Starlette y FastAPI, revisa la sección sobre [Benchmarks](benchmarks.md). diff --git a/docs/es/docs/async.md b/docs/es/docs/async.md index a06d3e979d..a8ed00df12 100644 --- a/docs/es/docs/async.md +++ b/docs/es/docs/async.md @@ -141,7 +141,7 @@ Tú y tu crush comen las hamburguesas y pasan un buen rato. ✨ /// info | Información -Hermosas ilustraciones de Ketrina Thompson. 🎨 +Hermosas ilustraciones de [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨 /// @@ -207,7 +207,7 @@ No hubo mucho hablar o coquetear ya que la mayor parte del tiempo se dedicó a e /// info | Información -Hermosas ilustraciones de Ketrina Thompson. 🎨 +Hermosas ilustraciones de [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨 /// @@ -251,7 +251,7 @@ Este tipo de asincronía es lo que hizo popular a NodeJS (aunque NodeJS no es pa Y ese es el mismo nivel de rendimiento que obtienes con **FastAPI**. -Y como puedes tener paralelismo y asincronía al mismo tiempo, obtienes un mayor rendimiento que la mayoría de los frameworks de NodeJS probados y a la par con Go, que es un lenguaje compilado más cercano a C (todo gracias a Starlette). +Y como puedes tener paralelismo y asincronía al mismo tiempo, obtienes un mayor rendimiento que la mayoría de los frameworks de NodeJS probados y a la par con Go, que es un lenguaje compilado más cercano a C [(todo gracias a Starlette)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1). ### ¿Es la concurrencia mejor que el paralelismo? { #is-concurrency-better-than-parallelism } @@ -298,7 +298,7 @@ Pero también puedes explotar los beneficios del paralelismo y la multiprocesami Eso, más el simple hecho de que Python es el lenguaje principal para **Data Science**, Machine Learning y especialmente Deep Learning, hacen de FastAPI una muy buena opción para APIs web de Data Science / Machine Learning y aplicaciones (entre muchas otras). -Para ver cómo lograr este paralelismo en producción, consulta la sección sobre [Deployment](deployment/index.md){.internal-link target=_blank}. +Para ver cómo lograr este paralelismo en producción, consulta la sección sobre [Despliegue](deployment/index.md). ## `async` y `await` { #async-and-await } @@ -363,13 +363,13 @@ Pero si deseas usar `async` / `await` sin FastAPI, también puedes hacerlo. ### Escribe tu propio código async { #write-your-own-async-code } -Starlette (y **FastAPI**) están basados en AnyIO, lo que lo hace compatible tanto con el asyncio del paquete estándar de Python como con Trio. +Starlette (y **FastAPI**) están basados en [AnyIO](https://anyio.readthedocs.io/en/stable/), lo que lo hace compatible tanto con el [asyncio](https://docs.python.org/3/library/asyncio-task.html) del paquete estándar de Python como con [Trio](https://trio.readthedocs.io/en/stable/). -En particular, puedes usar directamente AnyIO para tus casos de uso avanzados de concurrencia que requieran patrones más avanzados en tu propio código. +En particular, puedes usar directamente [AnyIO](https://anyio.readthedocs.io/en/stable/) para tus casos de uso avanzados de concurrencia que requieran patrones más avanzados en tu propio código. -E incluso si no estuvieras usando FastAPI, también podrías escribir tus propias aplicaciones asíncronas con AnyIO para ser altamente compatibles y obtener sus beneficios (p.ej. *concurrencia estructurada*). +E incluso si no estuvieras usando FastAPI, también podrías escribir tus propias aplicaciones asíncronas con [AnyIO](https://anyio.readthedocs.io/en/stable/) para ser altamente compatibles y obtener sus beneficios (p.ej. *concurrencia estructurada*). -Creé otro paquete sobre AnyIO, como una capa delgada, para mejorar un poco las anotaciones de tipos y obtener mejor **autocompletado**, **errores en línea**, etc. También tiene una introducción amigable y tutorial para ayudarte a **entender** y escribir **tu propio código async**: Asyncer. Sería particularmente útil si necesitas **combinar código async con regular** (bloqueante/sincrónico). +Creé otro paquete sobre AnyIO, como una capa delgada, para mejorar un poco las anotaciones de tipos y obtener mejor **autocompletado**, **errores en línea**, etc. También tiene una introducción amigable y tutorial para ayudarte a **entender** y escribir **tu propio código async**: [Asyncer](https://asyncer.tiangolo.com/). Sería particularmente útil si necesitas **combinar código async con regular** (bloqueante/sincrónico). ### Otras formas de código asíncrono { #other-forms-of-asynchronous-code } @@ -381,7 +381,7 @@ Esta misma sintaxis (o casi idéntica) también se incluyó recientemente en las Pero antes de eso, manejar el código asíncrono era mucho más complejo y difícil. -En versiones previas de Python, podrías haber usado hilos o Gevent. Pero el código es mucho más complejo de entender, depurar y razonar. +En versiones previas de Python, podrías haber usado hilos o [Gevent](https://www.gevent.org/). Pero el código es mucho más complejo de entender, depurar y razonar. En versiones previas de NodeJS / JavaScript en el Navegador, habrías usado "callbacks". Lo que lleva al "callback hell". @@ -407,7 +407,7 @@ Todo eso es lo que impulsa FastAPI (a través de Starlette) y lo que hace que te Probablemente puedas saltarte esto. -Estos son detalles muy técnicos de cómo funciona **FastAPI** en su interior. +Estos son detalles muy técnicos de cómo **FastAPI** funciona en su interior. Si tienes bastante conocimiento técnico (coroutines, hilos, bloqueo, etc.) y tienes curiosidad sobre cómo FastAPI maneja `async def` vs `def` normal, adelante. @@ -419,15 +419,15 @@ Cuando declaras una *path operation function* con `def` normal en lugar de `asyn Si vienes de otro framework async que no funciona de la manera descrita anteriormente y estás acostumbrado a definir funciones de *path operation* solo de cómputo trivial con `def` normal para una pequeña ganancia de rendimiento (alrededor de 100 nanosegundos), ten en cuenta que en **FastAPI** el efecto sería bastante opuesto. En estos casos, es mejor usar `async def` a menos que tus *path operation functions* usen código que realice I/O de bloqueo. -Aun así, en ambas situaciones, es probable que **FastAPI** [siga siendo más rápida](index.md#performance){.internal-link target=_blank} que (o al menos comparable a) tu framework anterior. +Aun así, en ambas situaciones, es probable que **FastAPI** [siga siendo más rápida](index.md#performance) que (o al menos comparable a) tu framework anterior. ### Dependencias { #dependencies } -Lo mismo aplica para las [dependencias](tutorial/dependencies/index.md){.internal-link target=_blank}. Si una dependencia es una función estándar `def` en lugar de `async def`, se ejecuta en el threadpool externo. +Lo mismo aplica para las [dependencias](tutorial/dependencies/index.md). Si una dependencia es una función estándar `def` en lugar de `async def`, se ejecuta en el threadpool externo. ### Sub-dependencias { #sub-dependencies } -Puedes tener múltiples dependencias y [sub-dependencias](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} requiriéndose mutuamente (como parámetros de las definiciones de funciones), algunas de ellas podrían ser creadas con `async def` y algunas con `def` normal. Aun funcionará, y las que fueron creadas con `def` normal serían llamadas en un hilo externo (del threadpool) en lugar de ser "awaited". +Puedes tener múltiples dependencias y [sub-dependencias](tutorial/dependencies/sub-dependencies.md) requiriéndose mutuamente (como parámetros de las definiciones de funciones), algunas de ellas podrían ser creadas con `async def` y algunas con `def` normal. Aun funcionará, y las que fueron creadas con `def` normal serían llamadas en un hilo externo (del threadpool) en lugar de ser "awaited". ### Otras funciones de utilidad { #other-utility-functions } diff --git a/docs/es/docs/benchmarks.md b/docs/es/docs/benchmarks.md index e6f8f99647..040dc58129 100644 --- a/docs/es/docs/benchmarks.md +++ b/docs/es/docs/benchmarks.md @@ -1,6 +1,6 @@ # Benchmarks { #benchmarks } -Los benchmarks independientes de TechEmpower muestran aplicaciones de **FastAPI** ejecutándose bajo Uvicorn como uno de los frameworks de Python más rápidos disponibles, solo por debajo de Starlette y Uvicorn en sí mismos (utilizados internamente por FastAPI). +Los benchmarks independientes de TechEmpower muestran aplicaciones de **FastAPI** ejecutándose bajo Uvicorn como [uno de los frameworks de Python más rápidos disponibles](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), solo por debajo de Starlette y Uvicorn en sí mismos (utilizados internamente por FastAPI). Pero al revisar benchmarks y comparaciones, debes tener en cuenta lo siguiente. diff --git a/docs/es/docs/deployment/cloud.md b/docs/es/docs/deployment/cloud.md index a3531b97a7..266d3cfd23 100644 --- a/docs/es/docs/deployment/cloud.md +++ b/docs/es/docs/deployment/cloud.md @@ -6,7 +6,7 @@ En la mayoría de los casos, los principales proveedores de nube tienen guías p ## FastAPI Cloud { #fastapi-cloud } -**FastAPI Cloud** está construido por el mismo autor y equipo detrás de **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** está construido por el mismo autor y equipo detrás de **FastAPI**. Simplifica el proceso de **construir**, **desplegar** y **acceder** a una API con un esfuerzo mínimo. @@ -16,9 +16,9 @@ FastAPI Cloud es el sponsor principal y proveedor de financiamiento de los proye ## Proveedores de Nube - Sponsors { #cloud-providers-sponsors } -Otros proveedores de nube ✨ [**son sponsors de FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨ también. 🙇 +Otros proveedores de nube ✨ [**son sponsors de FastAPI**](../help-fastapi.md#sponsor-the-author) ✨ también. 🙇 También podrías considerarlos para seguir sus guías y probar sus servicios: -* Render -* Railway +* [Render](https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi) +* [Railway](https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi) diff --git a/docs/es/docs/deployment/concepts.md b/docs/es/docs/deployment/concepts.md index 2ec7af19ba..9b3ac0a340 100644 --- a/docs/es/docs/deployment/concepts.md +++ b/docs/es/docs/deployment/concepts.md @@ -25,7 +25,7 @@ Pero por ahora, revisemos estas importantes **ideas conceptuales**. Estos concep ## Seguridad - HTTPS { #security-https } -En el [capítulo anterior sobre HTTPS](https.md){.internal-link target=_blank} aprendimos sobre cómo HTTPS proporciona cifrado para tu API. +En el [capítulo anterior sobre HTTPS](https.md) aprendimos sobre cómo HTTPS proporciona cifrado para tu API. También vimos que HTTPS es normalmente proporcionado por un componente **externo** a tu servidor de aplicaciones, un **Proxy de Terminación TLS**. @@ -190,7 +190,7 @@ Cuando ejecutas **múltiples procesos** del mismo programa de API, comúnmente s ### Worker Processes y Puertos { #worker-processes-and-ports } -Recuerda de la documentación [Sobre HTTPS](https.md){.internal-link target=_blank} que solo un proceso puede estar escuchando en una combinación de puerto y dirección IP en un servidor. +Recuerda de la documentación [Sobre HTTPS](https.md) que solo un proceso puede estar escuchando en una combinación de puerto y dirección IP en un servidor. Esto sigue siendo cierto. @@ -243,7 +243,7 @@ Aquí hay algunas combinaciones y estrategias posibles: No te preocupes si algunos de estos elementos sobre **contenedores**, Docker, o Kubernetes no tienen mucho sentido todavía. -Te contaré más sobre imágenes de contenedores, Docker, Kubernetes, etc. en un capítulo futuro: [FastAPI en Contenedores - Docker](docker.md){.internal-link target=_blank}. +Te contaré más sobre imágenes de contenedores, Docker, Kubernetes, etc. en un capítulo futuro: [FastAPI en Contenedores - Docker](docker.md). /// @@ -281,7 +281,7 @@ Aquí hay algunas ideas posibles: /// tip | Consejo -Te daré más ejemplos concretos para hacer esto con contenedores en un capítulo futuro: [FastAPI en Contenedores - Docker](docker.md){.internal-link target=_blank}. +Te daré más ejemplos concretos para hacer esto con contenedores en un capítulo futuro: [FastAPI en Contenedores - Docker](docker.md). /// diff --git a/docs/es/docs/deployment/docker.md b/docs/es/docs/deployment/docker.md index 105a5902b7..6ce0e192ac 100644 --- a/docs/es/docs/deployment/docker.md +++ b/docs/es/docs/deployment/docker.md @@ -1,6 +1,6 @@ # FastAPI en Contenedores - Docker { #fastapi-in-containers-docker } -Al desplegar aplicaciones de FastAPI, un enfoque común es construir una **imagen de contenedor de Linux**. Normalmente se realiza usando **Docker**. Luego puedes desplegar esa imagen de contenedor de varias formas. +Al desplegar aplicaciones de FastAPI, un enfoque común es construir una **imagen de contenedor de Linux**. Normalmente se realiza usando [**Docker**](https://www.docker.com/). Luego puedes desplegar esa imagen de contenedor de varias formas. Usar contenedores de Linux tiene varias ventajas, incluyendo **seguridad**, **replicabilidad**, **simplicidad**, y otras. @@ -60,16 +60,16 @@ Y el **contenedor** en sí (en contraste con la **imagen de contenedor**) es la Docker ha sido una de las herramientas principales para crear y gestionar **imágenes de contenedor** y **contenedores**. -Y hay un Docker Hub público con **imágenes de contenedores oficiales** pre-hechas para muchas herramientas, entornos, bases de datos y aplicaciones. +Y hay un [Docker Hub](https://hub.docker.com/) público con **imágenes de contenedores oficiales** pre-hechas para muchas herramientas, entornos, bases de datos y aplicaciones. -Por ejemplo, hay una Imagen de Python oficial. +Por ejemplo, hay una [Imagen de Python](https://hub.docker.com/_/python) oficial. Y hay muchas otras imágenes para diferentes cosas como bases de datos, por ejemplo para: -* PostgreSQL -* MySQL -* MongoDB -* Redis, etc. +* [PostgreSQL](https://hub.docker.com/_/postgres) +* [MySQL](https://hub.docker.com/_/mysql) +* [MongoDB](https://hub.docker.com/_/mongo) +* [Redis](https://hub.docker.com/_/redis), etc. Usando una imagen de contenedor pre-hecha es muy fácil **combinar** y utilizar diferentes herramientas. Por ejemplo, para probar una nueva base de datos. En la mayoría de los casos, puedes usar las **imágenes oficiales**, y simplemente configurarlas con variables de entorno. @@ -111,7 +111,7 @@ Dependería principalmente de la herramienta que uses para **instalar** esos req La forma más común de hacerlo es tener un archivo `requirements.txt` con los nombres de los paquetes y sus versiones, uno por línea. -Por supuesto, usarías las mismas ideas que leíste en [Acerca de las versiones de FastAPI](versions.md){.internal-link target=_blank} para establecer los rangos de versiones. +Por supuesto, usarías las mismas ideas que leíste en [Acerca de las versiones de FastAPI](versions.md) para establecer los rangos de versiones. Por ejemplo, tu `requirements.txt` podría verse así: @@ -238,7 +238,7 @@ Asegúrate de **siempre** usar la **forma exec** de la instrucción `CMD`, como #### Usar `CMD` - Forma Exec { #use-cmd-exec-form } -La instrucción Docker `CMD` se puede escribir usando dos formas: +La instrucción Docker [`CMD`](https://docs.docker.com/reference/dockerfile/#cmd) se puede escribir usando dos formas: ✅ **Forma Exec**: @@ -254,11 +254,11 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] CMD fastapi run app/main.py --port 80 ``` -Asegúrate de siempre usar la **forma exec** para garantizar que FastAPI pueda cerrarse de manera adecuada y que [los eventos de lifespan](../advanced/events.md){.internal-link target=_blank} sean disparados. +Asegúrate de siempre usar la **forma exec** para garantizar que FastAPI pueda cerrarse de manera adecuada y que [los eventos de lifespan](../advanced/events.md) sean disparados. -Puedes leer más sobre esto en las documentación de Docker para formas de shell y exec. +Puedes leer más sobre esto en la [documentación de Docker para formas de shell y exec](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form). -Esto puede ser bastante notorio al usar `docker compose`. Consulta esta sección de preguntas frecuentes de Docker Compose para más detalles técnicos: ¿Por qué mis servicios tardan 10 segundos en recrearse o detenerse?. +Esto puede ser bastante notorio al usar `docker compose`. Consulta esta sección de preguntas frecuentes de Docker Compose para más detalles técnicos: [¿Por qué mis servicios tardan 10 segundos en recrearse o detenerse?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop). #### Estructura de Directorios { #directory-structure } @@ -352,7 +352,7 @@ $ docker run -d --name mycontainer -p 80:80 myimage ## Revísalo { #check-it } -Deberías poder revisarlo en la URL de tu contenedor de Docker, por ejemplo: http://192.168.99.100/items/5?q=somequery o http://127.0.0.1/items/5?q=somequery (o equivalente, usando tu host de Docker). +Deberías poder revisarlo en la URL de tu contenedor de Docker, por ejemplo: [http://192.168.99.100/items/5?q=somequery](http://192.168.99.100/items/5?q=somequery) o [http://127.0.0.1/items/5?q=somequery](http://127.0.0.1/items/5?q=somequery) (o equivalente, usando tu host de Docker). Verás algo como: @@ -362,17 +362,17 @@ Verás algo como: ## Documentación Interactiva de la API { #interactive-api-docs } -Ahora puedes ir a http://192.168.99.100/docs o http://127.0.0.1/docs (o equivalente, usando tu host de Docker). +Ahora puedes ir a [http://192.168.99.100/docs](http://192.168.99.100/docs) o [http://127.0.0.1/docs](http://127.0.0.1/docs) (o equivalente, usando tu host de Docker). -Verás la documentación interactiva automática de la API (proporcionada por Swagger UI): +Verás la documentación interactiva automática de la API (proporcionada por [Swagger UI](https://github.com/swagger-api/swagger-ui)): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ## Documentación Alternativa de la API { #alternative-api-docs } -Y también puedes ir a http://192.168.99.100/redoc o http://127.0.0.1/redoc (o equivalente, usando tu host de Docker). +Y también puedes ir a [http://192.168.99.100/redoc](http://192.168.99.100/redoc) o [http://127.0.0.1/redoc](http://127.0.0.1/redoc) (o equivalente, usando tu host de Docker). -Verás la documentación alternativa automática (proporcionada por ReDoc): +Verás la documentación alternativa automática (proporcionada por [ReDoc](https://github.com/Rebilly/ReDoc)): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -413,7 +413,7 @@ Cuando pasas el archivo a `fastapi run`, detectará automáticamente que es un a ## Conceptos de Despliegue { #deployment-concepts } -Hablemos nuevamente de algunos de los mismos [Conceptos de Despliegue](concepts.md){.internal-link target=_blank} en términos de contenedores. +Hablemos nuevamente de algunos de los mismos [Conceptos de Despliegue](concepts.md) en términos de contenedores. Los contenedores son principalmente una herramienta para simplificar el proceso de **construcción y despliegue** de una aplicación, pero no imponen un enfoque particular para manejar estos **conceptos de despliegue**, y hay varias estrategias posibles. @@ -432,7 +432,7 @@ Revisemos estos **conceptos de despliegue** en términos de contenedores: Si nos enfocamos solo en la **imagen de contenedor** para una aplicación FastAPI (y luego el **contenedor** en ejecución), HTTPS normalmente sería manejado **externamente** por otra herramienta. -Podría ser otro contenedor, por ejemplo, con Traefik, manejando **HTTPS** y la adquisición **automática** de **certificados**. +Podría ser otro contenedor, por ejemplo, con [Traefik](https://traefik.io/), manejando **HTTPS** y la adquisición **automática** de **certificados**. /// tip | Consejo @@ -558,7 +558,7 @@ Si tienes **múltiples contenedores**, probablemente cada uno ejecutando un **pr /// info | Información -Si estás usando Kubernetes, probablemente sería un Contenedor de Inicialización. +Si estás usando Kubernetes, probablemente sería un [Contenedor de Inicialización](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/). /// @@ -570,7 +570,7 @@ Si tienes una configuración simple, con un **contenedor único** que luego inic ### Imagen Base de Docker { #base-docker-image } -Solía haber una imagen official de Docker de FastAPI: tiangolo/uvicorn-gunicorn-fastapi. Pero ahora está obsoleta. ⛔️ +Solía haber una imagen oficial de Docker de FastAPI: [tiangolo/uvicorn-gunicorn-fastapi](https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker). Pero ahora está obsoleta. ⛔️ Probablemente **no** deberías usar esta imagen base de Docker (o cualquier otra similar). @@ -600,7 +600,7 @@ Por ejemplo: ## Imagen de Docker con `uv` { #docker-image-with-uv } -Si estás usando uv para instalar y gestionar tu proyecto, puedes seguir su guía de Docker de uv. +Si estás usando [uv](https://github.com/astral-sh/uv) para instalar y gestionar tu proyecto, puedes seguir su [guía de Docker de uv](https://docs.astral.sh/uv/guides/integration/docker/). ## Resumen { #recap } diff --git a/docs/es/docs/deployment/fastapicloud.md b/docs/es/docs/deployment/fastapicloud.md index 9763af48c5..fc770d1eed 100644 --- a/docs/es/docs/deployment/fastapicloud.md +++ b/docs/es/docs/deployment/fastapicloud.md @@ -1,6 +1,6 @@ # FastAPI Cloud { #fastapi-cloud } -Puedes desplegar tu app de FastAPI en FastAPI Cloud con **un solo comando**; ve y únete a la lista de espera si aún no lo has hecho. 🚀 +Puedes desplegar tu app de FastAPI en [FastAPI Cloud](https://fastapicloud.com) con **un solo comando**; ve y únete a la lista de espera si aún no lo has hecho. 🚀 ## Iniciar sesión { #login } @@ -40,7 +40,7 @@ Deploying to FastAPI Cloud... ## Acerca de FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** está creado por el mismo autor y equipo detrás de **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** está creado por el mismo autor y equipo detrás de **FastAPI**. Agiliza el proceso de **crear**, **desplegar** y **acceder** a una API con el mínimo esfuerzo. diff --git a/docs/es/docs/deployment/https.md b/docs/es/docs/deployment/https.md index d7a244107c..227aab0d6a 100644 --- a/docs/es/docs/deployment/https.md +++ b/docs/es/docs/deployment/https.md @@ -10,7 +10,7 @@ Si tienes prisa o no te importa, continúa con las siguientes secciones para ver /// -Para **aprender los conceptos básicos de HTTPS**, desde una perspectiva de consumidor, revisa https://howhttps.works/. +Para **aprender los conceptos básicos de HTTPS**, desde una perspectiva de consumidor, revisa [https://howhttps.works/](https://howhttps.works/). Ahora, desde una **perspectiva de desarrollador**, aquí hay varias cosas a tener en cuenta al pensar en HTTPS: @@ -28,13 +28,13 @@ Ahora, desde una **perspectiva de desarrollador**, aquí hay varias cosas a tene * **Por defecto**, eso significaría que solo puedes tener **un certificado HTTPS por dirección IP**. * No importa cuán grande sea tu servidor o qué tan pequeña pueda ser cada aplicación que tengas en él. * Sin embargo, hay una **solución** para esto. -* Hay una **extensión** para el protocolo **TLS** (el que maneja la encriptación a nivel de TCP, antes de HTTP) llamada **SNI**. +* Hay una **extensión** para el protocolo **TLS** (el que maneja la encriptación a nivel de TCP, antes de HTTP) llamada **[SNI](https://en.wikipedia.org/wiki/Server_Name_Indication)**. * Esta extensión SNI permite que un solo servidor (con una **sola dirección IP**) tenga **varios certificados HTTPS** y sirva **múltiples dominios/aplicaciones HTTPS**. * Para que esto funcione, un componente (programa) **único** que se ejecute en el servidor, escuchando en la **dirección IP pública**, debe tener **todos los certificados HTTPS** en el servidor. * **Después** de obtener una conexión segura, el protocolo de comunicación sigue siendo **HTTP**. * Los contenidos están **encriptados**, aunque se envién con el **protocolo HTTP**. -Es una práctica común tener **un programa/servidor HTTP** ejecutándose en el servidor (la máquina, host, etc.) y **gestionando todas las partes de HTTPS**: recibiendo los **requests HTTPS encriptados**, enviando los **requests HTTP desencriptados** a la aplicación HTTP real que se ejecuta en el mismo servidor (la aplicación **FastAPI**, en este caso), tomando el **response HTTP** de la aplicación, **encriptándolo** usando el **certificado HTTPS** adecuado y enviándolo de vuelta al cliente usando **HTTPS**. Este servidor a menudo se llama un **TLS Termination Proxy**. +Es una práctica común tener **un programa/servidor HTTP** ejecutándose en el servidor (la máquina, host, etc.) y **gestionando todas las partes de HTTPS**: recibiendo los **requests HTTPS encriptados**, enviando los **requests HTTP desencriptados** a la aplicación HTTP real que se ejecuta en el mismo servidor (la aplicación **FastAPI**, en este caso), tomando el **response HTTP** de la aplicación, **encriptándolo** usando el **certificado HTTPS** adecuado y enviándolo de vuelta al cliente usando **HTTPS**. Este servidor a menudo se llama un **[TLS Termination Proxy](https://en.wikipedia.org/wiki/TLS_termination_proxy)**. Algunas de las opciones que podrías usar como un TLS Termination Proxy son: @@ -49,7 +49,7 @@ Antes de Let's Encrypt, estos **certificados HTTPS** eran vendidos por terceros. El proceso para adquirir uno de estos certificados solía ser complicado, requerir bastante papeleo y los certificados eran bastante costosos. -Pero luego se creó **Let's Encrypt**. +Pero luego se creó **[Let's Encrypt](https://letsencrypt.org/)**. Es un proyecto de la Linux Foundation. Proporciona **certificados HTTPS de forma gratuita**, de manera automatizada. Estos certificados usan toda la seguridad criptográfica estándar, y tienen una corta duración (aproximadamente 3 meses), por lo que la **seguridad es en realidad mejor** debido a su lifespan reducida. @@ -200,9 +200,9 @@ Este **proxy** normalmente configuraría algunos headers HTTP sobre la marcha an Los headers del proxy son: -* X-Forwarded-For -* X-Forwarded-Proto -* X-Forwarded-Host +* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For) +* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto) +* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host) /// @@ -218,7 +218,7 @@ Esto sería útil, por ejemplo, para manejar correctamente redirecciones. /// tip | Consejo -Puedes aprender más sobre esto en la documentación de [Detrás de un proxy - Habilitar headers reenviados por el proxy](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers){.internal-link target=_blank} +Puedes aprender más sobre esto en la documentación de [Detrás de un proxy - Habilitar headers reenviados por el proxy](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers) /// diff --git a/docs/es/docs/deployment/index.md b/docs/es/docs/deployment/index.md index 1260c68b98..c4025deaa6 100644 --- a/docs/es/docs/deployment/index.md +++ b/docs/es/docs/deployment/index.md @@ -16,7 +16,7 @@ Hay varias maneras de hacerlo dependiendo de tu caso de uso específico y las he Podrías **desplegar un servidor** tú mismo utilizando una combinación de herramientas, podrías usar un **servicio en la nube** que hace parte del trabajo por ti, u otras opciones posibles. -Por ejemplo, nosotros, el equipo detrás de FastAPI, construimos **FastAPI Cloud**, para hacer que desplegar aplicaciones de FastAPI en la nube sea lo más ágil posible, con la misma experiencia de desarrollador de trabajar con FastAPI. +Por ejemplo, nosotros, el equipo detrás de FastAPI, construimos [**FastAPI Cloud**](https://fastapicloud.com), para hacer que desplegar aplicaciones de FastAPI en la nube sea lo más ágil posible, con la misma experiencia de desarrollador de trabajar con FastAPI. Te mostraré algunos de los conceptos principales que probablemente deberías tener en cuenta al desplegar una aplicación **FastAPI** (aunque la mayoría se aplica a cualquier otro tipo de aplicación web). diff --git a/docs/es/docs/deployment/manually.md b/docs/es/docs/deployment/manually.md index 3c597ff69e..f3c771a515 100644 --- a/docs/es/docs/deployment/manually.md +++ b/docs/es/docs/deployment/manually.md @@ -52,11 +52,11 @@ Lo principal que necesitas para ejecutar una aplicación **FastAPI** (o cualquie Hay varias alternativas, incluyendo: -* Uvicorn: un servidor ASGI de alto rendimiento. -* Hypercorn: un servidor ASGI compatible con HTTP/2 y Trio entre otras funcionalidades. -* Daphne: el servidor ASGI construido para Django Channels. -* Granian: Un servidor HTTP Rust para aplicaciones en Python. -* NGINX Unit: NGINX Unit es un runtime para aplicaciones web ligero y versátil. +* [Uvicorn](https://www.uvicorn.dev/): un servidor ASGI de alto rendimiento. +* [Hypercorn](https://hypercorn.readthedocs.io/): un servidor ASGI compatible con HTTP/2 y Trio entre otras funcionalidades. +* [Daphne](https://github.com/django/daphne): el servidor ASGI construido para Django Channels. +* [Granian](https://github.com/emmett-framework/granian): Un servidor HTTP Rust para aplicaciones en Python. +* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit es un runtime para aplicaciones web ligero y versátil. ## Máquina Servidor y Programa Servidor { #server-machine-and-server-program } @@ -74,7 +74,7 @@ Cuando instalas FastAPI, viene con un servidor de producción, Uvicorn, y puedes Pero también puedes instalar un servidor ASGI manualmente. -Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, actívalo, y luego puedes instalar la aplicación del servidor. +Asegúrate de crear un [entorno virtual](../virtual-environments.md), actívalo, y luego puedes instalar la aplicación del servidor. Por ejemplo, para instalar Uvicorn: diff --git a/docs/es/docs/deployment/server-workers.md b/docs/es/docs/deployment/server-workers.md index 9cdd79bc0f..3e3a1898be 100644 --- a/docs/es/docs/deployment/server-workers.md +++ b/docs/es/docs/deployment/server-workers.md @@ -13,13 +13,13 @@ Hasta este punto, con todos los tutoriales en la documentación, probablemente h Al desplegar aplicaciones probablemente querrás tener algo de **replicación de procesos** para aprovechar **múltiples núcleos** y poder manejar más requests. -Como viste en el capítulo anterior sobre [Conceptos de Despliegue](concepts.md){.internal-link target=_blank}, hay múltiples estrategias que puedes usar. +Como viste en el capítulo anterior sobre [Conceptos de Despliegue](concepts.md), hay múltiples estrategias que puedes usar. Aquí te mostraré cómo usar **Uvicorn** con **worker processes** usando el comando `fastapi` o el comando `uvicorn` directamente. /// info | Información -Si estás usando contenedores, por ejemplo con Docker o Kubernetes, te contaré más sobre eso en el próximo capítulo: [FastAPI en Contenedores - Docker](docker.md){.internal-link target=_blank}. +Si estás usando contenedores, por ejemplo con Docker o Kubernetes, te contaré más sobre eso en el próximo capítulo: [FastAPI en Contenedores - Docker](docker.md). En particular, cuando corras en **Kubernetes** probablemente **no** querrás usar workers y en cambio correr **un solo proceso de Uvicorn por contenedor**, pero te contaré sobre eso más adelante en ese capítulo. @@ -126,7 +126,7 @@ De la lista de conceptos de despliegue de antes, usar workers ayudaría principa ## Contenedores y Docker { #containers-and-docker } -En el próximo capítulo sobre [FastAPI en Contenedores - Docker](docker.md){.internal-link target=_blank} te explicaré algunas estrategias que podrías usar para manejar los otros **conceptos de despliegue**. +En el próximo capítulo sobre [FastAPI en Contenedores - Docker](docker.md) te explicaré algunas estrategias que podrías usar para manejar los otros **conceptos de despliegue**. Te mostraré cómo **construir tu propia imagen desde cero** para ejecutar un solo proceso de Uvicorn. Es un proceso sencillo y probablemente es lo que querrías hacer al usar un sistema de gestión de contenedores distribuido como **Kubernetes**. diff --git a/docs/es/docs/deployment/versions.md b/docs/es/docs/deployment/versions.md index 193654b2d2..02792f1f8b 100644 --- a/docs/es/docs/deployment/versions.md +++ b/docs/es/docs/deployment/versions.md @@ -4,7 +4,7 @@ Se añaden nuevas funcionalidades con frecuencia, se corrigen bugs regularmente, y el código sigue mejorando continuamente. -Por eso las versiones actuales siguen siendo `0.x.x`, esto refleja que cada versión podría tener potencialmente cambios incompatibles. Esto sigue las convenciones de Semantic Versioning. +Por eso las versiones actuales siguen siendo `0.x.x`, esto refleja que cada versión podría tener potencialmente cambios incompatibles. Esto sigue las convenciones de [Semantic Versioning](https://semver.org/). Puedes crear aplicaciones de producción con **FastAPI** ahora mismo (y probablemente ya lo has estado haciendo desde hace algún tiempo), solo debes asegurarte de que utilizas una versión que funciona correctamente con el resto de tu código. @@ -34,7 +34,7 @@ Si utilizas cualquier otra herramienta para gestionar tus instalaciones, como `u ## Versiones disponibles { #available-versions } -Puedes ver las versiones disponibles (por ejemplo, para revisar cuál es la más reciente) en las [Release Notes](../release-notes.md){.internal-link target=_blank}. +Puedes ver las versiones disponibles (por ejemplo, para revisar cuál es la más reciente) en las [Release Notes](../release-notes.md). ## Sobre las versiones { #about-versions } @@ -66,7 +66,7 @@ El "MINOR" es el número en el medio, por ejemplo, en `0.2.3`, la versión MINOR Deberías añadir tests para tu aplicación. -Con **FastAPI** es muy fácil (gracias a Starlette), revisa la documentación: [Testing](../tutorial/testing.md){.internal-link target=_blank} +Con **FastAPI** es muy fácil (gracias a Starlette), revisa la documentación: [Escribir pruebas](../tutorial/testing.md) Después de tener tests, puedes actualizar la versión de **FastAPI** a una más reciente, y asegurarte de que todo tu código está funcionando correctamente ejecutando tus tests. diff --git a/docs/es/docs/editor-support.md b/docs/es/docs/editor-support.md new file mode 100644 index 0000000000..fa552db23d --- /dev/null +++ b/docs/es/docs/editor-support.md @@ -0,0 +1,23 @@ +# Soporte del editor { #editor-support } + +La [Extensión de FastAPI](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) oficial mejora tu flujo de trabajo de desarrollo con FastAPI con descubrimiento de *path operation*, navegación, además de deployment a FastAPI Cloud y streaming en vivo de logs. + +Para más detalles sobre la extensión, consulta el README en el [repositorio de GitHub](https://github.com/fastapi/fastapi-vscode). + +## Configuración e instalación { #setup-and-installation } + +La **Extensión de FastAPI** está disponible tanto para [VS Code](https://code.visualstudio.com/) como para [Cursor](https://www.cursor.com/). Se puede instalar directamente desde el panel de Extensiones en cada editor buscando "FastAPI" y seleccionando la extensión publicada por **FastAPI Labs**. La extensión también funciona en editores basados en navegador como [vscode.dev](https://vscode.dev) y [github.dev](https://github.dev). + +### Descubrimiento de la aplicación { #application-discovery } + +Por defecto, la extensión descubrirá automáticamente aplicaciones FastAPI en tu espacio de trabajo escaneando archivos que creen un instance de `FastAPI()`. Si la detección automática no funciona con la estructura de tu proyecto, puedes especificar un punto de entrada mediante `[tool.fastapi]` en `pyproject.toml` o la configuración de VS Code `fastapi.entryPoint` usando notación de módulo (p. ej. `myapp.main:app`). + +## Funcionalidades { #features } + +- **Explorador de Path Operations** - Una vista en árbol en la barra lateral de todas las *path operations* de tu aplicación. Haz clic para saltar a cualquier definición de ruta o de router. +- **Búsqueda de rutas** - Busca por path, método o nombre con Ctrl + Shift + E (en macOS: Cmd + Shift + E). +- **Navegación con CodeLens** - Enlaces clicables encima de llamadas del cliente de tests (p. ej. `client.get('/items')`) que saltan a la *path operation* correspondiente para navegar rápidamente entre tests e implementación. +- **Desplegar en FastAPI Cloud** - Deployment con un clic de tu app a [FastAPI Cloud](https://fastapicloud.com/). +- **Streaming de logs de la aplicación** - Streaming en tiempo real de logs desde tu aplicación desplegada en FastAPI Cloud, con filtrado por nivel y búsqueda de texto. + +Si quieres familiarizarte con las funcionalidades de la extensión, puedes revisar el recorrido guiado de la extensión abriendo la Paleta de Comandos (Ctrl + Shift + P o en macOS: Cmd + Shift + P) y seleccionando "Welcome: Open walkthrough..." y luego eligiendo el recorrido "Get started with FastAPI". diff --git a/docs/es/docs/environment-variables.md b/docs/es/docs/environment-variables.md index 1b0941a7f5..5c58771d98 100644 --- a/docs/es/docs/environment-variables.md +++ b/docs/es/docs/environment-variables.md @@ -65,7 +65,7 @@ print(f"Hello {name} from Python") /// tip | Consejo -El segundo argumento de `os.getenv()` es el valor por defecto a retornar. +El segundo argumento de [`os.getenv()`](https://docs.python.org/3.8/library/os.html#os.getenv) es el valor por defecto a retornar. Si no se proporciona, es `None` por defecto; aquí proporcionamos `"World"` como el valor por defecto para usar. @@ -153,7 +153,7 @@ Hello World from Python /// tip | Consejo -Puedes leer más al respecto en The Twelve-Factor App: Config. +Puedes leer más al respecto en [The Twelve-Factor App: Config](https://12factor.net/config). /// @@ -163,7 +163,7 @@ Estas variables de entorno solo pueden manejar **strings de texto**, ya que son Esto significa que **cualquier valor** leído en Python desde una variable de entorno **será un `str`**, y cualquier conversión a un tipo diferente o cualquier validación tiene que hacerse en el código. -Aprenderás más sobre cómo usar variables de entorno para manejar **configuraciones de aplicación** en la [Guía del Usuario Avanzado - Ajustes y Variables de Entorno](./advanced/settings.md){.internal-link target=_blank}. +Aprenderás más sobre cómo usar variables de entorno para manejar **configuraciones de aplicación** en la [Guía del Usuario Avanzado - Ajustes y Variables de Entorno](./advanced/settings.md). ## Variable de Entorno `PATH` { #path-environment-variable } @@ -285,13 +285,13 @@ $ C:\opt\custompython\bin\python //// -Esta información será útil al aprender sobre [Entornos Virtuales](virtual-environments.md){.internal-link target=_blank}. +Esta información será útil al aprender sobre [Entornos Virtuales](virtual-environments.md). ## Conclusión { #conclusion } Con esto deberías tener una comprensión básica de qué son las **variables de entorno** y cómo usarlas en Python. -También puedes leer más sobre ellas en la Wikipedia para Variable de Entorno. +También puedes leer más sobre ellas en la [Wikipedia para Variable de Entorno](https://en.wikipedia.org/wiki/Environment_variable). En muchos casos no es muy obvio cómo las variables de entorno serían útiles y aplicables de inmediato. Pero siguen apareciendo en muchos escenarios diferentes cuando estás desarrollando, así que es bueno conocerlas. diff --git a/docs/es/docs/fastapi-cli.md b/docs/es/docs/fastapi-cli.md index 7866254223..e8d6ad6c80 100644 --- a/docs/es/docs/fastapi-cli.md +++ b/docs/es/docs/fastapi-cli.md @@ -1,15 +1,15 @@ # FastAPI CLI { #fastapi-cli } -**FastAPI CLI** es un programa de línea de comandos que puedes usar para servir tu aplicación FastAPI, gestionar tu proyecto FastAPI, y más. +**FastAPI CLI** es un programa de línea de comandos que puedes usar para servir tu aplicación FastAPI, gestionar tu proyecto FastAPI, y más. -Cuando instalas FastAPI (por ejemplo, con `pip install "fastapi[standard]"`), incluye un paquete llamado `fastapi-cli`, este paquete proporciona el comando `fastapi` en la terminal. +Cuando instalas FastAPI (por ejemplo, con `pip install "fastapi[standard]"`), viene con un programa de línea de comandos que puedes ejecutar en la terminal. Para ejecutar tu aplicación FastAPI en modo de desarrollo, puedes usar el comando `fastapi dev`:
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -46,13 +46,66 @@ $ fastapi dev Uvicorn, un servidor ASGI de alto rendimiento y listo para producción. 😎 +Adicionalmente, otras herramientas podrían no ser capaces de encontrarla, 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`. ## `fastapi dev` { #fastapi-dev } @@ -70,6 +123,6 @@ En la mayoría de los casos tendrías (y deberías) tener un "proxy de terminaci /// tip | Consejo -Puedes aprender más al respecto en la [documentación de despliegue](deployment/index.md){.internal-link target=_blank}. +Puedes aprender más al respecto en la [documentación de despliegue](deployment/index.md). /// diff --git a/docs/es/docs/features.md b/docs/es/docs/features.md index 947ef312db..754099c8d6 100644 --- a/docs/es/docs/features.md +++ b/docs/es/docs/features.md @@ -6,8 +6,8 @@ ### Basado en estándares abiertos { #based-on-open-standards } -* OpenAPI para la creación de APIs, incluyendo declaraciones de path operations, parámetros, request bodies, seguridad, etc. -* Documentación automática de modelos de datos con JSON Schema (ya que OpenAPI en sí mismo está basado en JSON Schema). +* [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) para la creación de APIs, incluyendo declaraciones de path operations, parámetros, request bodies, seguridad, etc. +* Documentación automática de modelos de datos con [**JSON Schema**](https://json-schema.org/) (ya que OpenAPI en sí mismo está basado en JSON Schema). * Diseñado alrededor de estos estándares, tras un estudio meticuloso. En lugar de ser una capa adicional. * Esto también permite el uso de **generación de código cliente automática** en muchos idiomas. @@ -15,11 +15,11 @@ Interfaces web de documentación y exploración de APIs interactivas. Como el framework está basado en OpenAPI, hay múltiples opciones, 2 incluidas por defecto. -* Swagger UI, con exploración interactiva, llama y prueba tu API directamente desde el navegador. +* [**Swagger UI**](https://github.com/swagger-api/swagger-ui), con exploración interactiva, llama y prueba tu API directamente desde el navegador. ![Interacción Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) -* Documentación alternativa de API con ReDoc. +* Documentación alternativa de API con [**ReDoc**](https://github.com/Rebilly/ReDoc). ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) @@ -27,7 +27,7 @@ Interfaces web de documentación y exploración de APIs interactivas. Como el fr Todo está basado en declaraciones estándar de **tipos en Python** (gracias a Pydantic). Sin nueva sintaxis que aprender. Solo Python moderno estándar. -Si necesitas un repaso de 2 minutos sobre cómo usar tipos en Python (aunque no uses FastAPI), revisa el tutorial corto: [Tipos en Python](python-types.md){.internal-link target=_blank}. +Si necesitas un repaso de 2 minutos sobre cómo usar tipos en Python (aunque no uses FastAPI), revisa el tutorial corto: [Tipos en Python](python-types.md). Escribes Python estándar con tipos: @@ -75,7 +75,7 @@ Pasa las claves y valores del dict `second_user_data` directamente como argument Todo el framework fue diseñado para ser fácil e intuitivo de usar, todas las decisiones fueron probadas en múltiples editores incluso antes de comenzar el desarrollo, para asegurar la mejor experiencia de desarrollo. -En las encuestas a desarrolladores de Python, es claro que una de las funcionalidades más usadas es el "autocompletado". +En las encuestas a desarrolladores de Python, es claro [que una de las funcionalidades más usadas es el "autocompletado"](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features). Todo el framework **FastAPI** está basado para satisfacer eso. El autocompletado funciona en todas partes. @@ -83,11 +83,11 @@ Rara vez necesitarás regresar a la documentación. Aquí está cómo tu editor podría ayudarte: -* en Visual Studio Code: +* en [Visual Studio Code](https://code.visualstudio.com/): ![soporte del editor](https://fastapi.tiangolo.com/img/vscode-completion.png) -* en PyCharm: +* en [PyCharm](https://www.jetbrains.com/pycharm/): ![soporte del editor](https://fastapi.tiangolo.com/img/pycharm-completion.png) @@ -124,7 +124,7 @@ Seguridad y autenticación integradas. Sin ningún compromiso con bases de datos Todos los esquemas de seguridad definidos en OpenAPI, incluyendo: * HTTP Básico. -* **OAuth2** (también con **tokens JWT**). Revisa el tutorial sobre [OAuth2 con JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. +* **OAuth2** (también con **tokens JWT**). Revisa el tutorial sobre [OAuth2 con JWT](tutorial/security/oauth2-jwt.md). * API keys en: * Headers. * Parámetros de query. @@ -159,13 +159,13 @@ Cualquier integración está diseñada para ser tan simple de usar (con dependen ## Funcionalidades de Starlette { #starlette-features } -**FastAPI** es totalmente compatible con (y está basado en) Starlette. Así que, cualquier código adicional de Starlette que tengas, también funcionará. +**FastAPI** es totalmente compatible con (y está basado en) [**Starlette**](https://www.starlette.dev/). Así que, cualquier código adicional de Starlette que tengas, también funcionará. `FastAPI` es en realidad una subclase de `Starlette`. Así que, si ya conoces o usas Starlette, la mayoría de las funcionalidades funcionarán de la misma manera. Con **FastAPI** obtienes todas las funcionalidades de **Starlette** (ya que FastAPI es simplemente Starlette potenciado): -* Rendimiento seriamente impresionante. Es uno de los frameworks de Python más rápidos disponibles, a la par de **NodeJS** y **Go**. +* Rendimiento seriamente impresionante. Es [uno de los frameworks de Python más rápidos disponibles, a la par de **NodeJS** y **Go**](https://github.com/encode/starlette#performance). * Soporte para **WebSocket**. * Tareas en segundo plano en el mismo proceso. * Eventos de inicio y apagado. @@ -177,7 +177,7 @@ Con **FastAPI** obtienes todas las funcionalidades de **Starlette** (ya que Fast ## Funcionalidades de Pydantic { #pydantic-features } -**FastAPI** es totalmente compatible con (y está basado en) Pydantic. Por lo tanto, cualquier código adicional de Pydantic que tengas, también funcionará. +**FastAPI** es totalmente compatible con (y está basado en) [**Pydantic**](https://docs.pydantic.dev/). Por lo tanto, cualquier código adicional de Pydantic que tengas, también funcionará. Incluyendo paquetes externos también basados en Pydantic, como ORMs, ODMs para bases de datos. diff --git a/docs/es/docs/help-fastapi.md b/docs/es/docs/help-fastapi.md index 9b727dab08..66b00fc8b6 100644 --- a/docs/es/docs/help-fastapi.md +++ b/docs/es/docs/help-fastapi.md @@ -12,7 +12,7 @@ Y también hay varias formas de conseguir ayuda. ## Suscríbete al boletín { #subscribe-to-the-newsletter } -Puedes suscribirte al (esporádico) boletín [**FastAPI and friends**](newsletter.md){.internal-link target=_blank} para mantenerte al día sobre: +Puedes suscribirte al (esporádico) [boletín **FastAPI and friends**](newsletter.md) para mantenerte al día sobre: * Noticias sobre FastAPI y amigos 🚀 * Guías 📝 @@ -22,17 +22,17 @@ Puedes suscribirte al (esporádico) boletín [**FastAPI and friends**](newslette ## Sigue a FastAPI en X (Twitter) { #follow-fastapi-on-x-twitter } -Sigue a @fastapi en **X (Twitter)** para obtener las últimas noticias sobre **FastAPI**. 🐦 +[Sigue a @fastapi en **X (Twitter)**](https://x.com/fastapi) para obtener las últimas noticias sobre **FastAPI**. 🐦 ## Dale una estrella a **FastAPI** en GitHub { #star-fastapi-in-github } -Puedes "darle una estrella" a FastAPI en GitHub (haciendo clic en el botón de estrella en la parte superior derecha): https://github.com/fastapi/fastapi. ⭐️ +Puedes "darle una estrella" a FastAPI en GitHub (haciendo clic en el botón de estrella en la parte superior derecha): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). ⭐️ Al agregar una estrella, otros usuarios podrán encontrarlo más fácilmente y ver que ya ha sido útil para otros. ## Observa el repositorio de GitHub para lanzamientos { #watch-the-github-repository-for-releases } -Puedes "observar" FastAPI en GitHub (haciendo clic en el botón "watch" en la parte superior derecha): https://github.com/fastapi/fastapi. 👀 +Puedes "observar" FastAPI en GitHub (haciendo clic en el botón "watch" en la parte superior derecha): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀 Allí puedes seleccionar "Releases only". @@ -40,45 +40,45 @@ Al hacerlo, recibirás notificaciones (en tu email) cada vez que haya un nuevo l ## Conéctate con el autor { #connect-with-the-author } -Puedes conectar conmigo (Sebastián Ramírez / `tiangolo`), el autor. +Puedes conectar [conmigo (Sebastián Ramírez / `tiangolo`)](https://tiangolo.com), el autor. Puedes: -* Seguirme en **GitHub**. +* [Seguirme en **GitHub**](https://github.com/tiangolo). * Ver otros proyectos de Código Abierto que he creado y que podrían ayudarte. * Seguirme para ver cuándo creo un nuevo proyecto de Código Abierto. -* Seguirme en **X (Twitter)** o Mastodon. +* [Seguirme en **X (Twitter)**](https://x.com/tiangolo) o [Mastodon](https://fosstodon.org/@tiangolo). * Contarme cómo usas FastAPI (me encanta oír eso). * Enterarte cuando hago anuncios o lanzo nuevas herramientas. - * También puedes seguir @fastapi en X (Twitter) (una cuenta aparte). -* Seguirme en **LinkedIn**. + * También puedes [seguir @fastapi en X (Twitter)](https://x.com/fastapi) (una cuenta aparte). +* [Seguirme en **LinkedIn**](https://www.linkedin.com/in/tiangolo/). * Enterarte cuando hago anuncios o lanzo nuevas herramientas (aunque uso X (Twitter) más a menudo 🤷‍♂). -* Leer lo que escribo (o seguirme) en **Dev.to** o **Medium**. +* Leer lo que escribo (o seguirme) en [**Dev.to**](https://dev.to/tiangolo) o [**Medium**](https://medium.com/@tiangolo). * Leer otras ideas, artículos, y leer sobre las herramientas que he creado. * Seguirme para leer lo que publico nuevo. ## Twittea sobre **FastAPI** { #tweet-about-fastapi } -Twittea sobre **FastAPI** y dime a mí y a otros por qué te gusta. 🎉 +[Twittea sobre **FastAPI**](https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi) y dime a mí y a otros por qué te gusta. 🎉 Me encanta escuchar cómo se está utilizando **FastAPI**, qué te ha gustado, en qué proyecto/empresa lo estás usando, etc. ## Vota por FastAPI { #vote-for-fastapi } -* Vota por **FastAPI** en Slant. -* Vota por **FastAPI** en AlternativeTo. -* Di que usas **FastAPI** en StackShare. +* [Vota por **FastAPI** en Slant](https://www.slant.co/options/34241/~fastapi-review). +* [Vota por **FastAPI** en AlternativeTo](https://alternativeto.net/software/fastapi/about/). +* [Di que usas **FastAPI** en StackShare](https://stackshare.io/pypi-fastapi). ## Ayuda a otros con preguntas en GitHub { #help-others-with-questions-in-github } Puedes intentar ayudar a otros con sus preguntas en: -* GitHub Discussions -* GitHub Issues +* [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered) +* [GitHub Issues](https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+) En muchos casos, probablemente ya conozcas la respuesta a esas preguntas. 🤓 -Si estás ayudando mucho a la gente con sus preguntas, te convertirás en un [FastAPI Expert](fastapi-people.md#fastapi-experts){.internal-link target=_blank} oficial. 🎉 +Si estás ayudando mucho a la gente con sus preguntas, te convertirás en un [FastAPI Expert](fastapi-people.md#fastapi-experts) oficial. 🎉 Solo recuerda, el punto más importante es: trata de ser amable. La gente llega con sus frustraciones y, en muchos casos, no pregunta de la mejor manera, pero haz todo lo posible por ser amable. 🤗 @@ -104,7 +104,7 @@ En la mayoría de los casos y preguntas hay algo relacionado con el **código or En muchos casos solo copiarán un fragmento del código, pero eso no es suficiente para **reproducir el problema**. -* Puedes pedirles que proporcionen un ejemplo mínimo, reproducible, que puedas **copiar-pegar** y ejecutar localmente para ver el mismo error o comportamiento que están viendo, o para entender mejor su caso de uso. +* Puedes pedirles que proporcionen un [ejemplo mínimo, reproducible](https://stackoverflow.com/help/minimal-reproducible-example), que puedas **copiar-pegar** y ejecutar localmente para ver el mismo error o comportamiento que están viendo, o para entender mejor su caso de uso. * Si te sientes muy generoso, puedes intentar **crear un ejemplo** así tú mismo, solo basado en la descripción del problema. Solo ten en cuenta que esto podría llevar mucho tiempo y podría ser mejor pedirles que aclaren el problema primero. @@ -125,7 +125,7 @@ Si responden, hay una alta probabilidad de que hayas resuelto su problema, felic ## Observa el repositorio de GitHub { #watch-the-github-repository } -Puedes "observar" FastAPI en GitHub (haciendo clic en el botón "watch" en la parte superior derecha): https://github.com/fastapi/fastapi. 👀 +Puedes "observar" FastAPI en GitHub (haciendo clic en el botón "watch" en la parte superior derecha): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀 Si seleccionas "Watching" en lugar de "Releases only", recibirás notificaciones cuando alguien cree un nuevo issue o pregunta. También puedes especificar que solo deseas que te notifiquen sobre nuevos issues, discusiones, PRs, etc. @@ -133,7 +133,7 @@ Luego puedes intentar ayudarlos a resolver esas preguntas. ## Haz preguntas { #ask-questions } -Puedes crear una nueva pregunta en el repositorio de GitHub, por ejemplo, para: +Puedes [crear una nueva pregunta](https://github.com/fastapi/fastapi/discussions/new?category=questions) en el repositorio de GitHub, por ejemplo, para: * Hacer una **pregunta** o preguntar sobre un **problema**. * Sugerir una nueva **funcionalidad**. @@ -196,12 +196,12 @@ Así que, es realmente importante que realmente leas y ejecutes el código, y me ## Crea un Pull Request { #create-a-pull-request } -Puedes [contribuir](contributing.md){.internal-link target=_blank} al código fuente con Pull Requests, por ejemplo: +Puedes [contribuir](contributing.md) al código fuente con Pull Requests, por ejemplo: * Para corregir un error tipográfico que encontraste en la documentación. -* Para compartir un artículo, video o podcast que creaste o encontraste sobre FastAPI editando este archivo. +* Para compartir un artículo, video o podcast que creaste o encontraste sobre FastAPI [editando este archivo](https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml). * Asegúrate de agregar tu enlace al inicio de la sección correspondiente. -* Para ayudar a [traducir la documentación](contributing.md#translations){.internal-link target=_blank} a tu idioma. +* Para ayudar a [traducir la documentación](contributing.md#translations) a tu idioma. * También puedes ayudar a revisar las traducciones creadas por otros. * Para proponer nuevas secciones de documentación. * Para corregir un issue/bug existente. @@ -218,8 +218,8 @@ Hay mucho trabajo por hacer, y para la mayoría de ello, **TÚ** puedes hacerlo. Las tareas principales que puedes hacer ahora son: -* [Ayudar a otros con preguntas en GitHub](#help-others-with-questions-in-github){.internal-link target=_blank} (ver la sección arriba). -* [Revisar Pull Requests](#review-pull-requests){.internal-link target=_blank} (ver la sección arriba). +* [Ayudar a otros con preguntas en GitHub](#help-others-with-questions-in-github) (ver la sección arriba). +* [Revisar Pull Requests](#review-pull-requests) (ver la sección arriba). Esas dos tareas son las que **consumen más tiempo**. Ese es el trabajo principal de mantener FastAPI. @@ -227,11 +227,11 @@ Si puedes ayudarme con eso, **me estás ayudando a mantener FastAPI** y aseguran ## Únete al chat { #join-the-chat } -Únete al servidor de chat 👥 Discord 👥 y charla con otros en la comunidad de FastAPI. +Únete al servidor de chat 👥 [Discord](https://discord.gg/VQjSZaeJmf) 👥 y charla con otros en la comunidad de FastAPI. /// tip | Consejo -Para preguntas, házlas en GitHub Discussions, hay muchas más probabilidades de que recibas ayuda de parte de los [FastAPI Experts](fastapi-people.md#fastapi-experts){.internal-link target=_blank}. +Para preguntas, házlas en [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/new?category=questions), hay muchas más probabilidades de que recibas ayuda de parte de los [FastAPI Experts](fastapi-people.md#fastapi-experts). Usa el chat solo para otras conversaciones generales. @@ -243,13 +243,13 @@ Ten en cuenta que dado que los chats permiten una "conversación más libre", es En GitHub, la plantilla te guiará para escribir la pregunta correcta para que puedas obtener más fácilmente una buena respuesta, o incluso resolver el problema por ti mismo antes de preguntar. Y en GitHub puedo asegurarme de responder siempre todo, incluso si lleva tiempo. No puedo hacer eso personalmente con los sistemas de chat. 😅 -Las conversaciones en los sistemas de chat tampoco son tan fácilmente buscables como en GitHub, por lo que las preguntas y respuestas podrían perderse en la conversación. Y solo las que están en GitHub cuentan para convertirse en un [FastAPI Expert](fastapi-people.md#fastapi-experts){.internal-link target=_blank}, por lo que probablemente recibirás más atención en GitHub. +Las conversaciones en los sistemas de chat tampoco son tan fácilmente buscables como en GitHub, por lo que las preguntas y respuestas podrían perderse en la conversación. Y solo las que están en GitHub cuentan para convertirse en un [FastAPI Expert](fastapi-people.md#fastapi-experts), por lo que probablemente recibirás más atención en GitHub. Por otro lado, hay miles de usuarios en los sistemas de chat, por lo que hay muchas posibilidades de que encuentres a alguien con quien hablar allí, casi todo el tiempo. 😄 ## Hazte sponsor del autor { #sponsor-the-author } -Si tu **producto/empresa** depende de o está relacionado con **FastAPI** y quieres llegar a sus usuarios, puedes hacerte sponsor del autor (de mí) a través de GitHub sponsors. Según el nivel, podrías obtener algunos beneficios extra, como una insignia en la documentación. 🎁 +Si tu **producto/empresa** depende de o está relacionado con **FastAPI** y quieres llegar a sus usuarios, puedes hacerte sponsor del autor (de mí) a través de [GitHub sponsors](https://github.com/sponsors/tiangolo). Según el nivel, podrías obtener algunos beneficios extra, como una insignia en la documentación. 🎁 --- diff --git a/docs/es/docs/history-design-future.md b/docs/es/docs/history-design-future.md index 79835440bb..fc1782f988 100644 --- a/docs/es/docs/history-design-future.md +++ b/docs/es/docs/history-design-future.md @@ -1,6 +1,6 @@ # Historia, Diseño y Futuro { #history-design-and-future } -Hace algún tiempo, un usuario de **FastAPI** preguntó: +Hace algún tiempo, [un usuario de **FastAPI** preguntó](https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920): > ¿Cuál es la historia de este proyecto? Parece haber surgido de la nada y ser increíble en pocas semanas [...] @@ -14,7 +14,7 @@ Como parte de eso, necesitaba investigar, probar y usar muchas alternativas. La historia de **FastAPI** es en gran parte la historia de sus predecesores. -Como se dice en la sección [Alternativas](alternatives.md){.internal-link target=_blank}: +Como se dice en la sección [Alternativas](alternatives.md):
@@ -44,7 +44,7 @@ Luego pasé algún tiempo diseñando la "API" de desarrollador que quería tener Probé varias ideas en los editores de Python más populares: PyCharm, VS Code, editores basados en Jedi. -Según la última Encuesta de Desarrolladores de Python, estos editores cubren alrededor del 80% de los usuarios. +Según la última [Encuesta de Desarrolladores de Python](https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools), estos editores cubren alrededor del 80% de los usuarios. Esto significa que **FastAPI** fue específicamente probado con los editores usados por el 80% de los desarrolladores de Python. Y como la mayoría de los otros editores tienden a funcionar de manera similar, todos sus beneficios deberían funcionar prácticamente para todos los editores. @@ -54,11 +54,11 @@ Todo de una manera que proporcionara la mejor experiencia de desarrollo para tod ## Requisitos { #requirements } -Después de probar varias alternativas, decidí que iba a usar **Pydantic** por sus ventajas. +Después de probar varias alternativas, decidí que iba a usar [**Pydantic**](https://docs.pydantic.dev/) por sus ventajas. Luego contribuí a este, para hacerlo totalmente compatible con JSON Schema, para soportar diferentes maneras de definir declaraciones de restricciones, y para mejorar el soporte de los editores (chequeo de tipos, autocompletado) basado en las pruebas en varios editores. -Durante el desarrollo, también contribuí a **Starlette**, el otro requisito clave. +Durante el desarrollo, también contribuí a [**Starlette**](https://www.starlette.dev/), el otro requisito clave. ## Desarrollo { #development } @@ -76,4 +76,4 @@ Pero aún así, hay muchas mejoras y funcionalidades por venir. **FastAPI** tiene un gran futuro por delante. -Y [tu ayuda](help-fastapi.md){.internal-link target=_blank} es muy apreciada. +Y [tu ayuda](help-fastapi.md) es muy apreciada. diff --git a/docs/es/docs/how-to/authentication-error-status-code.md b/docs/es/docs/how-to/authentication-error-status-code.md index 54afcec8cb..600c30d263 100644 --- a/docs/es/docs/how-to/authentication-error-status-code.md +++ b/docs/es/docs/how-to/authentication-error-status-code.md @@ -2,7 +2,7 @@ Antes de FastAPI versión `0.122.0`, cuando las utilidades de seguridad integradas devolvían un error al cliente después de una autenticación fallida, usaban el código de estado HTTP `403 Forbidden`. -A partir de FastAPI versión `0.122.0`, usan el código de estado HTTP `401 Unauthorized`, más apropiado, y devuelven un `WWW-Authenticate` header adecuado en la response, siguiendo las especificaciones HTTP, RFC 7235, RFC 9110. +A partir de FastAPI versión `0.122.0`, usan el código de estado HTTP `401 Unauthorized`, más apropiado, y devuelven un `WWW-Authenticate` header adecuado en la response, siguiendo las especificaciones HTTP, [RFC 7235](https://datatracker.ietf.org/doc/html/rfc7235#section-3.1), [RFC 9110](https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized). Pero si por alguna razón tus clientes dependen del comportamiento anterior, puedes volver a él sobrescribiendo el método `make_not_authenticated_error` en tus clases de seguridad. diff --git a/docs/es/docs/how-to/conditional-openapi.md b/docs/es/docs/how-to/conditional-openapi.md index 671100cf8b..cdf5698050 100644 --- a/docs/es/docs/how-to/conditional-openapi.md +++ b/docs/es/docs/how-to/conditional-openapi.md @@ -10,7 +10,7 @@ Eso no añade ninguna seguridad extra a tu API, las *path operations* seguirán Si hay una falla de seguridad en tu código, seguirá existiendo. -Ocultar la documentación solo hace que sea más difícil entender cómo interactuar con tu API y podría dificultar más depurarla en producción. Podría considerarse simplemente una forma de Seguridad mediante oscuridad. +Ocultar la documentación solo hace que sea más difícil entender cómo interactuar con tu API y podría dificultar más depurarla en producción. Podría considerarse simplemente una forma de [Seguridad mediante oscuridad](https://en.wikipedia.org/wiki/Security_through_obscurity). Si quieres asegurar tu API, hay varias cosas mejores que puedes hacer, por ejemplo: diff --git a/docs/es/docs/how-to/configure-swagger-ui.md b/docs/es/docs/how-to/configure-swagger-ui.md index 092c310011..8230f4a146 100644 --- a/docs/es/docs/how-to/configure-swagger-ui.md +++ b/docs/es/docs/how-to/configure-swagger-ui.md @@ -1,6 +1,6 @@ # Configurar Swagger UI { #configure-swagger-ui } -Puedes configurar algunos parámetros adicionales de Swagger UI. +Puedes configurar algunos [parámetros adicionales de Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/). Para configurarlos, pasa el argumento `swagger_ui_parameters` al crear el objeto de la app `FastAPI()` o a la función `get_swagger_ui_html()`. @@ -50,7 +50,7 @@ Por ejemplo, para desactivar `deepLinking` podrías pasar estas configuraciones ## Otros parámetros de Swagger UI { #other-swagger-ui-parameters } -Para ver todas las demás configuraciones posibles que puedes usar, lee la documentación oficial de los parámetros de Swagger UI. +Para ver todas las demás configuraciones posibles que puedes usar, lee la [documentación oficial de los parámetros de Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/). ## Configuraciones solo de JavaScript { #javascript-only-settings } diff --git a/docs/es/docs/how-to/custom-docs-ui-assets.md b/docs/es/docs/how-to/custom-docs-ui-assets.md index faddab0d83..e9a34c5e4d 100644 --- a/docs/es/docs/how-to/custom-docs-ui-assets.md +++ b/docs/es/docs/how-to/custom-docs-ui-assets.md @@ -2,13 +2,13 @@ La documentación de la API utiliza **Swagger UI** y **ReDoc**, y cada uno de estos necesita algunos archivos JavaScript y CSS. -Por defecto, esos archivos se sirven desde un CDN. +Por defecto, esos archivos se sirven desde un CDN. Pero es posible personalizarlo, puedes establecer un CDN específico, o servir los archivos tú mismo. ## CDN Personalizado para JavaScript y CSS { #custom-cdn-for-javascript-and-css } -Digamos que quieres usar un CDN diferente, por ejemplo, quieres usar `https://unpkg.com/`. +Digamos que quieres usar un CDN diferente, por ejemplo, quieres usar `https://unpkg.com/`. Esto podría ser útil si, por ejemplo, vives en un país que restringe algunas URLs. @@ -54,7 +54,7 @@ Ahora, para poder probar que todo funciona, crea una *path operation*: ### Pruébalo { #test-it } -Ahora, deberías poder ir a tu documentación en http://127.0.0.1:8000/docs, y recargar la página, cargará esos recursos desde el nuevo CDN. +Ahora, deberías poder ir a tu documentación en [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs), y recargar la página, cargará esos recursos desde el nuevo CDN. ## self hosting de JavaScript y CSS para la documentación { #self-hosting-javascript-and-css-for-docs } @@ -93,12 +93,12 @@ Probablemente puedas hacer clic derecho en cada enlace y seleccionar una opción **Swagger UI** utiliza los archivos: -* `swagger-ui-bundle.js` -* `swagger-ui.css` +* [`swagger-ui-bundle.js`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js) +* [`swagger-ui.css`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css) Y **ReDoc** utiliza el archivo: -* `redoc.standalone.js` +* [`redoc.standalone.js`](https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js) Después de eso, tu estructura de archivos podría verse así: @@ -122,7 +122,7 @@ Después de eso, tu estructura de archivos podría verse así: ### Prueba los archivos estáticos { #test-the-static-files } -Inicia tu aplicación y ve a http://127.0.0.1:8000/static/redoc.standalone.js. +Inicia tu aplicación y ve a [http://127.0.0.1:8000/static/redoc.standalone.js](http://127.0.0.1:8000/static/redoc.standalone.js). Deberías ver un archivo JavaScript muy largo de **ReDoc**. @@ -180,6 +180,6 @@ Ahora, para poder probar que todo funciona, crea una *path operation*: ### Prueba la UI de Archivos Estáticos { #test-static-files-ui } -Ahora, deberías poder desconectar tu WiFi, ir a tu documentación en http://127.0.0.1:8000/docs, y recargar la página. +Ahora, deberías poder desconectar tu WiFi, ir a tu documentación en [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs), y recargar la página. E incluso sin Internet, podrás ver la documentación de tu API e interactuar con ella. 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 ff13196f8a..56013a5c7b 100644 --- a/docs/es/docs/how-to/custom-request-and-route.md +++ b/docs/es/docs/how-to/custom-request-and-route.md @@ -18,7 +18,7 @@ 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`). +* Convertir cuerpos de requests no-JSON a JSON (por ejemplo, [`msgpack`](https://msgpack.org/index.html)). * Descomprimir cuerpos de requests comprimidos con gzip. * Registrar automáticamente todos los request bodies. @@ -32,13 +32,13 @@ 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){.internal-link target=_blank} proporcionado. +Este es un ejemplo sencillo para demostrar cómo funciona. Si necesitas soporte para Gzip, puedes usar el [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware) proporcionado. /// -Primero, creamos una clase `GzipRequest`, que sobrescribirá el método `Request.body()` para descomprimir el cuerpo si hay un header apropiado. +Primero, creamos una clase `GzipRequest`, que sobrescribirá el método `Request.body()` para descomprimir el request body si hay un header apropiado. -Si no hay `gzip` en el header, no intentará descomprimir el cuerpo. +Si no hay `gzip` en el header, no intentará descomprimir el request body. De esa manera, la misma clase de ruta puede manejar requests comprimidos con gzip o no comprimidos. @@ -60,13 +60,13 @@ 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 cuerpo del request. +Un `Request` también tiene un `request.receive`, que es una función para "recibir" el request body. 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*. -Para aprender más sobre el `Request`, revisa la documentación de Starlette sobre Requests. +Para aprender más sobre el `Request`, revisa [la documentación de Starlette sobre Requests](https://www.starlette.dev/requests/). /// @@ -82,7 +82,7 @@ Pero debido a nuestros cambios en `GzipRequest.body`, el request body se descomp /// tip | Consejo -Para resolver este mismo problema, probablemente sea mucho más fácil usar el `body` en un manejador personalizado para `RequestValidationError` ([Manejo de Errores](../tutorial/handling-errors.md#use-the-requestvalidationerror-body){.internal-link target=_blank}). +Para resolver este mismo problema, probablemente sea mucho más fácil usar el `body` en un manejador personalizado para `RequestValidationError` ([Manejo de Errores](../tutorial/handling-errors.md#use-the-requestvalidationerror-body)). Pero este ejemplo sigue siendo válido y muestra cómo interactuar con los componentes internos. diff --git a/docs/es/docs/how-to/extending-openapi.md b/docs/es/docs/how-to/extending-openapi.md index d08fae073a..d00455afd7 100644 --- a/docs/es/docs/how-to/extending-openapi.md +++ b/docs/es/docs/how-to/extending-openapi.md @@ -37,7 +37,7 @@ El parámetro `summary` está disponible en OpenAPI 3.1.0 y versiones superiores Usando la información anterior, puedes usar la misma función de utilidad para generar el esquema de OpenAPI y sobrescribir cada parte que necesites. -Por ejemplo, vamos a añadir la extensión OpenAPI de ReDoc para incluir un logo personalizado. +Por ejemplo, vamos a añadir [la extensión OpenAPI de ReDoc para incluir un logo personalizado](https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo). ### **FastAPI** normal { #normal-fastapi } @@ -75,6 +75,6 @@ Ahora puedes reemplazar el método `.openapi()` por tu nueva función. ### Revisa { #check-it } -Una vez que vayas a http://127.0.0.1:8000/redoc verás que estás usando tu logo personalizado (en este ejemplo, el logo de **FastAPI**): +Una vez que vayas a [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) verás que estás usando tu logo personalizado (en este ejemplo, el logo de **FastAPI**): diff --git a/docs/es/docs/how-to/general.md b/docs/es/docs/how-to/general.md index 3a3dc82943..03fe8441e4 100644 --- a/docs/es/docs/how-to/general.md +++ b/docs/es/docs/how-to/general.md @@ -4,36 +4,40 @@ Aquí tienes varias indicaciones hacia otros lugares en la documentación, para ## Filtrar Datos - Seguridad { #filter-data-security } -Para asegurarte de que no devuelves más datos de los que deberías, lee la documentación para [Tutorial - Modelo de Response - Tipo de Retorno](../tutorial/response-model.md){.internal-link target=_blank}. +Para asegurarte de que no devuelves más datos de los que deberías, lee la documentación para [Tutorial - Modelo de Response - Tipo de Retorno](../tutorial/response-model.md). + +## Optimizar el Rendimiento del Response - Modelo de Response - Tipo de Retorno { #optimize-response-performance-response-model-return-type } + +Para optimizar el rendimiento al devolver datos JSON, usa un tipo de retorno o un modelo de Response; de esa manera Pydantic se encargará de la serialización a JSON del lado de Rust, sin pasar por Python. Lee más en la documentación para [Tutorial - Modelo de Response - Tipo de Retorno](../tutorial/response-model.md). ## Etiquetas de Documentación - OpenAPI { #documentation-tags-openapi } -Para agregar etiquetas a tus *path operations*, y agruparlas en la interfaz de usuario de la documentación, lee la documentación para [Tutorial - Configuraciones de Path Operation - Etiquetas](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank}. +Para agregar etiquetas a tus *path operations*, y agruparlas en la interfaz de usuario de la documentación, lee la documentación para [Tutorial - Configuraciones de Path Operation - Etiquetas](../tutorial/path-operation-configuration.md#tags). ## Resumen y Descripción de Documentación - OpenAPI { #documentation-summary-and-description-openapi } -Para agregar un resumen y descripción a tus *path operations*, y mostrarlos en la interfaz de usuario de la documentación, lee la documentación para [Tutorial - Configuraciones de Path Operation - Resumen y Descripción](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank}. +Para agregar un resumen y descripción a tus *path operations*, y mostrarlos en la interfaz de usuario de la documentación, lee la documentación para [Tutorial - Configuraciones de Path Operation - Resumen y Descripción](../tutorial/path-operation-configuration.md#summary-and-description). ## Documentación de Descripción de Response - OpenAPI { #documentation-response-description-openapi } -Para definir la descripción del response, mostrada en la interfaz de usuario de la documentación, lee la documentación para [Tutorial - Configuraciones de Path Operation - Descripción del Response](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank}. +Para definir la descripción del response, mostrada en la interfaz de usuario de la documentación, lee la documentación para [Tutorial - Configuraciones de Path Operation - Descripción del Response](../tutorial/path-operation-configuration.md#response-description). ## Documentar la Deprecación de una *Path Operation* - OpenAPI { #documentation-deprecate-a-path-operation-openapi } -Para deprecar una *path operation*, y mostrarla en la interfaz de usuario de la documentación, lee la documentación para [Tutorial - Configuraciones de Path Operation - Deprecación](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank}. +Para deprecar una *path operation*, y mostrarla en la interfaz de usuario de la documentación, lee la documentación para [Tutorial - Configuraciones de Path Operation - Deprecación](../tutorial/path-operation-configuration.md#deprecate-a-path-operation). ## Convertir cualquier Dato a Compatible con JSON { #convert-any-data-to-json-compatible } -Para convertir cualquier dato a compatible con JSON, lee la documentación para [Tutorial - Codificador Compatible con JSON](../tutorial/encoder.md){.internal-link target=_blank}. +Para convertir cualquier dato a compatible con JSON, lee la documentación para [Tutorial - Codificador Compatible con JSON](../tutorial/encoder.md). ## Metadatos OpenAPI - Documentación { #openapi-metadata-docs } -Para agregar metadatos a tu esquema de OpenAPI, incluyendo una licencia, versión, contacto, etc, lee la documentación para [Tutorial - Metadatos y URLs de Documentación](../tutorial/metadata.md){.internal-link target=_blank}. +Para agregar metadatos a tu esquema de OpenAPI, incluyendo una licencia, versión, contacto, etc, lee la documentación para [Tutorial - Metadatos y URLs de Documentación](../tutorial/metadata.md). ## URL Personalizada de OpenAPI { #openapi-custom-url } -Para personalizar la URL de OpenAPI (o eliminarla), lee la documentación para [Tutorial - Metadatos y URLs de Documentación](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}. +Para personalizar la URL de OpenAPI (o eliminarla), lee la documentación para [Tutorial - Metadatos y URLs de Documentación](../tutorial/metadata.md#openapi-url). ## URLs de Documentación de OpenAPI { #openapi-docs-urls } -Para actualizar las URLs usadas para las interfaces de usuario de documentación generadas automáticamente, lee la documentación para [Tutorial - Metadatos y URLs de Documentación](../tutorial/metadata.md#docs-urls){.internal-link target=_blank}. +Para actualizar las URLs usadas para las interfaces de usuario de documentación generadas automáticamente, lee la documentación para [Tutorial - Metadatos y URLs de Documentación](../tutorial/metadata.md#docs-urls). diff --git a/docs/es/docs/how-to/graphql.md b/docs/es/docs/how-to/graphql.md index ee77570b3f..11c0cc23c5 100644 --- a/docs/es/docs/how-to/graphql.md +++ b/docs/es/docs/how-to/graphql.md @@ -18,18 +18,18 @@ Asegúrate de evaluar si los **beneficios** para tu caso de uso compensan los ** Aquí algunos de los paquetes de **GraphQL** que tienen soporte **ASGI**. Podrías usarlos con **FastAPI**: -* Strawberry 🍓 - * Con documentación para FastAPI -* Ariadne - * Con documentación para FastAPI -* Tartiflette - * Con Tartiflette ASGI para proporcionar integración con ASGI -* Graphene - * Con starlette-graphene3 +* [Strawberry](https://strawberry.rocks/) 🍓 + * Con [documentación para FastAPI](https://strawberry.rocks/docs/integrations/fastapi) +* [Ariadne](https://ariadnegraphql.org/) + * Con [documentación para FastAPI](https://ariadnegraphql.org/docs/fastapi-integration) +* [Tartiflette](https://tartiflette.io/) + * Con [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) para proporcionar integración con ASGI +* [Graphene](https://graphene-python.org/) + * Con [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3) ## GraphQL con Strawberry { #graphql-with-strawberry } -Si necesitas o quieres trabajar con **GraphQL**, **Strawberry** 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 un diseño muy similar 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**. @@ -37,24 +37,24 @@ Aquí tienes una pequeña vista previa de cómo podrías integrar Strawberry con {* ../../docs_src/graphql_/tutorial001_py310.py hl[3,22,25] *} -Puedes aprender más sobre Strawberry en la documentación de Strawberry. +Puedes aprender más sobre Strawberry en la [documentación de Strawberry](https://strawberry.rocks/). -Y también la documentación sobre Strawberry con FastAPI. +Y también la documentación sobre [Strawberry con FastAPI](https://strawberry.rocks/docs/integrations/fastapi). ## `GraphQLApp` viejo de Starlette { #older-graphqlapp-from-starlette } -Las versiones anteriores de Starlette incluían una clase `GraphQLApp` para integrar con Graphene. +Las versiones anteriores de Starlette incluían una clase `GraphQLApp` para integrar con [Graphene](https://graphene-python.org/). -Fue deprecada de Starlette, pero si tienes código que lo usaba, puedes fácilmente **migrar** a starlette-graphene3, que cubre el mismo caso de uso y tiene una **interfaz casi idéntica**. +Fue deprecada de Starlette, pero si tienes código que lo usaba, puedes fácilmente **migrar** a [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3), que cubre el mismo caso de uso y tiene una **interfaz casi idéntica**. /// tip | Consejo -Si necesitas GraphQL, aún te recomendaría revisar Strawberry, ya que se basa en anotaciones de tipos en lugar de clases y tipos personalizados. +Si necesitas GraphQL, aún te recomendaría revisar [Strawberry](https://strawberry.rocks/), ya que se basa en anotaciones de tipos en lugar de clases y tipos personalizados. /// ## Aprende Más { #learn-more } -Puedes aprender más sobre **GraphQL** en la documentación oficial de GraphQL. +Puedes aprender más sobre **GraphQL** en la [documentación oficial de GraphQL](https://graphql.org/). También puedes leer más sobre cada uno de esos paquetes descritos arriba en sus enlaces. diff --git a/docs/es/docs/how-to/index.md b/docs/es/docs/how-to/index.md index 6f5988049a..464028ff24 100644 --- a/docs/es/docs/how-to/index.md +++ b/docs/es/docs/how-to/index.md @@ -8,6 +8,6 @@ Si algo parece interesante y útil para tu proyecto, adelante y revísalo, pero /// tip | Consejo -Si quieres **aprender FastAPI** de una manera estructurada (recomendado), ve y lee el [Tutorial - Guía de Usuario](../tutorial/index.md){.internal-link target=_blank} capítulo por capítulo en su lugar. +Si quieres **aprender FastAPI** de una manera estructurada (recomendado), ve y lee el [Tutorial - Guía de Usuario](../tutorial/index.md) capítulo por capítulo en su lugar. /// 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 c862ace902..22d51674d0 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 @@ -22,7 +22,7 @@ Si tienes una app de FastAPI antigua con Pydantic v1, aquí te muestro cómo mig ## Guía oficial { #official-guide } -Pydantic tiene una Guía de migración oficial de v1 a v2. +Pydantic tiene una [Guía de migración](https://docs.pydantic.dev/latest/migration/) oficial de v1 a v2. También incluye qué cambió, cómo las validaciones ahora son más correctas y estrictas, posibles consideraciones, etc. @@ -30,7 +30,7 @@ Puedes leerla para entender mejor qué cambió. ## Tests { #tests } -Asegúrate de tener [tests](../tutorial/testing.md){.internal-link target=_blank} para tu app y de ejecutarlos en integración continua (CI). +Asegúrate de tener [tests](../tutorial/testing.md) para tu app y de ejecutarlos en integración continua (CI). Así podrás hacer la actualización y asegurarte de que todo sigue funcionando como esperas. @@ -38,7 +38,7 @@ Así podrás hacer la actualización y asegurarte de que todo sigue funcionando En muchos casos, cuando usas modelos de Pydantic normales sin personalizaciones, podrás automatizar gran parte del proceso de migración de Pydantic v1 a Pydantic v2. -Puedes usar `bump-pydantic` del mismo equipo de Pydantic. +Puedes usar [`bump-pydantic`](https://github.com/pydantic/bump-pydantic) del mismo equipo de Pydantic. Esta herramienta te ayudará a cambiar automáticamente la mayor parte del código que necesita cambiarse. diff --git a/docs/es/docs/how-to/testing-database.md b/docs/es/docs/how-to/testing-database.md index 0717ea5ff7..8dab2ffd93 100644 --- a/docs/es/docs/how-to/testing-database.md +++ b/docs/es/docs/how-to/testing-database.md @@ -1,7 +1,7 @@ -# Escribiendo pruebas para una base de datos { #testing-a-database } +# Escribir pruebas para una base de datos { #testing-a-database } -Puedes estudiar sobre bases de datos, SQL y SQLModel en la documentación de SQLModel. 🤓 +Puedes estudiar sobre bases de datos, SQL y SQLModel en la [documentación de SQLModel](https://sqlmodel.tiangolo.com/). 🤓 -Hay un mini tutorial sobre el uso de SQLModel con FastAPI. ✨ +Hay un mini [tutorial sobre el uso de SQLModel con FastAPI](https://sqlmodel.tiangolo.com/tutorial/fastapi/). ✨ -Ese tutorial incluye una sección sobre escribir pruebas para bases de datos SQL. 😎 +Ese tutorial incluye una sección sobre [escribir pruebas para bases de datos SQL](https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/). 😎 diff --git a/docs/es/docs/index.md b/docs/es/docs/index.md index 0544eb9ba4..6aea221427 100644 --- a/docs/es/docs/index.md +++ b/docs/es/docs/index.md @@ -11,25 +11,25 @@ FastAPI framework, alto rendimiento, fácil de aprender, rápido de programar, listo para producción

- + Test - + Coverage - + Package version - + Supported Python versions

--- -**Documentación**: https://fastapi.tiangolo.com +**Documentación**: [https://fastapi.tiangolo.com](https://fastapi.tiangolo.com/es) -**Código Fuente**: https://github.com/fastapi/fastapi +**Código Fuente**: [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi) --- @@ -40,11 +40,11 @@ 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. -* **Basado en estándares**: Basado (y completamente compatible) con los estándares abiertos para APIs: OpenAPI (anteriormente conocido como Swagger) y JSON Schema. +* **Basado en estándares**: Basado (y completamente compatible) con los estándares abiertos para APIs: [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (anteriormente conocido como Swagger) y [JSON Schema](https://json-schema.org/). * estimación basada en pruebas con un equipo de desarrollo interno, construyendo aplicaciones de producción. @@ -55,51 +55,51 @@ Las funcionalidades clave son: ### Sponsor Keystone { #keystone-sponsor } {% for sponsor in sponsors.keystone -%} - + {% endfor -%} ### Sponsors Oro y Plata { #gold-and-silver-sponsors } {% for sponsor in sponsors.gold -%} - + {% endfor -%} {%- for sponsor in sponsors.silver -%} - + {% endfor %} -Otros sponsors +[Otros sponsors](https://fastapi.tiangolo.com/es/fastapi-people/#sponsors) ## Opiniones { #opinions } "_[...] Estoy usando **FastAPI** un montón estos días. [...] De hecho, estoy planeando usarlo para todos los servicios de **ML de mi equipo en Microsoft**. Algunos de ellos se están integrando en el núcleo del producto **Windows** y algunos productos de **Office**._" -
Kabir Khan - Microsoft (ref)
+
Kabir Khan - Microsoft (ref)
--- "_Adoptamos el paquete **FastAPI** para crear un servidor **REST** que pueda ser consultado para obtener **predicciones**. [para Ludwig]_" -
Piero Molino, Yaroslav Dudin, y Sai Sumanth Miryala - Uber (ref)
+
Piero Molino, Yaroslav Dudin, y Sai Sumanth Miryala - Uber (ref)
--- "_**Netflix** se complace en anunciar el lanzamiento de código abierto de nuestro framework de orquestación de **gestión de crisis**: **Dispatch**! [construido con **FastAPI**]_" -
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
+
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
--- "_Estoy súper emocionado con **FastAPI**. ¡Es tan divertido!_" -
Brian Okken - Python Bytes host del podcast (ref)
+
Brian Okken - [Python Bytes](https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855) host del podcast (ref)
--- "_Honestamente, lo que has construido parece súper sólido y pulido. En muchos aspectos, es lo que quería que **Hug** fuera; es realmente inspirador ver a alguien construir eso._" -
Timothy Crosley - Hug creador (ref)
+
Timothy Crosley - [Hug](https://github.com/hugapi/hug) creador (ref)
--- @@ -107,27 +107,27 @@ Las funcionalidades clave son: "_Nos hemos cambiado a **FastAPI** para nuestras **APIs** [...] Creo que te gustará [...]_" -
Ines Montani - Matthew Honnibal - fundadores de Explosion AI - creadores de spaCy (ref) - (ref)
+
Ines Montani - Matthew Honnibal - [fundadores de Explosion AI](https://explosion.ai) - [creadores de spaCy](https://spacy.io) (ref) - (ref)
--- "_Si alguien está buscando construir una API de Python para producción, altamente recomendaría **FastAPI**. Está **hermosamente diseñado**, es **simple de usar** y **altamente escalable**, se ha convertido en un **componente clave** en nuestra estrategia de desarrollo API primero y está impulsando muchas automatizaciones y servicios como nuestro Ingeniero Virtual TAC._" -
Deon Pillsbury - Cisco (ref)
+
Deon Pillsbury - Cisco (ref)
--- ## Mini documental de FastAPI { #fastapi-mini-documentary } -Hay un mini documental de FastAPI lanzado a finales de 2025, puedes verlo online: +Hay un [mini documental de FastAPI](https://www.youtube.com/watch?v=mpR8ngthqiE) lanzado a finales de 2025, puedes verlo online: -FastAPI Mini Documentary +FastAPI Mini Documentary ## **Typer**, el FastAPI de las CLIs { #typer-the-fastapi-of-clis } - + -Si estás construyendo una aplicación de CLI para ser usada en la terminal en lugar de una API web, revisa **Typer**. +Si estás construyendo una aplicación de CLI para ser usada en la terminal en lugar de una API web, revisa [**Typer**](https://typer.tiangolo.com/). **Typer** es el hermano pequeño de FastAPI. Y está destinado a ser el **FastAPI de las CLIs**. ⌨️ 🚀 @@ -135,12 +135,12 @@ Si estás construyendo una aplicación de Starlette para las partes web. -* Pydantic para las partes de datos. +* [Starlette](https://www.starlette.dev/) para las partes web. +* [Pydantic](https://docs.pydantic.dev/) para las partes de datos. ## Instalación { #installation } -Crea y activa un entorno virtual y luego instala FastAPI: +Crea y activa un [entorno virtual](https://fastapi.tiangolo.com/es/virtual-environments/) y luego instala FastAPI:
@@ -199,7 +199,7 @@ async def read_item(item_id: int, q: str | None = None): **Nota**: -Si no lo sabes, revisa la sección _"¿Con prisa?"_ sobre `async` y `await` en la documentación. +Si no lo sabes, revisa la sección _"¿Con prisa?"_ sobre [`async` y `await` en la documentación](https://fastapi.tiangolo.com/es/async/#in-a-hurry). @@ -210,7 +210,7 @@ Corre el servidor con:
```console -$ fastapi dev main.py +$ fastapi dev ╭────────── FastAPI CLI - Development mode ───────────╮ │ │ @@ -235,19 +235,19 @@ INFO: Application startup complete.
-Acerca del comando fastapi dev main.py... +Acerca del comando fastapi dev... -El comando `fastapi dev` lee tu archivo `main.py`, detecta la app **FastAPI** en él y arranca un servidor usando Uvicorn. +El comando `fastapi dev` lee tu archivo `main.py` automáticamente, detecta la app **FastAPI** en él y arranca un servidor usando [Uvicorn](https://www.uvicorn.dev). Por defecto, `fastapi dev` comenzará con auto-recarga habilitada para el desarrollo local. -Puedes leer más sobre esto en la documentación del CLI de FastAPI. +Puedes leer más sobre esto en la [documentación del CLI de FastAPI](https://fastapi.tiangolo.com/es/fastapi-cli/).
### Revísalo { #check-it } -Abre tu navegador en http://127.0.0.1:8000/items/5?q=somequery. +Abre tu navegador en [http://127.0.0.1:8000/items/5?q=somequery](http://127.0.0.1:8000/items/5?q=somequery). Verás el response JSON como: @@ -264,17 +264,17 @@ Ya creaste una API que: ### Documentación interactiva de la API { #interactive-api-docs } -Ahora ve a http://127.0.0.1:8000/docs. +Ahora ve a [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). -Verás la documentación interactiva automática de la API (proporcionada por Swagger UI): +Verás la documentación interactiva automática de la API (proporcionada por [Swagger UI](https://github.com/swagger-api/swagger-ui)): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Documentación alternativa de la API { #alternative-api-docs } -Y ahora, ve a http://127.0.0.1:8000/redoc. +Y ahora, ve a [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). -Verás la documentación alternativa automática (proporcionada por ReDoc): +Verás la documentación alternativa automática (proporcionada por [ReDoc](https://github.com/Rebilly/ReDoc)): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -316,7 +316,7 @@ El servidor `fastapi dev` debería recargarse automáticamente. ### Actualización de la documentación interactiva de la API { #interactive-api-docs-upgrade } -Ahora ve a http://127.0.0.1:8000/docs. +Ahora ve a [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). * La documentación interactiva de la API se actualizará automáticamente, incluyendo el nuevo body: @@ -332,7 +332,7 @@ Ahora ve a http://127.0.0.1:8000/redoc. +Y ahora, ve a [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). * La documentación alternativa también reflejará el nuevo parámetro de query y body: @@ -374,7 +374,7 @@ item: Item * Parámetros de query. * Cookies. * Headers. - * Forms. + * Formularios. * Archivos. * Conversión de datos de salida: convirtiendo de datos y tipos de Python a datos de red (como JSON): * Convertir tipos de Python (`str`, `int`, `float`, `bool`, `list`, etc). @@ -442,7 +442,7 @@ Para un ejemplo más completo incluyendo más funcionalidades, ve al 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 y otros paquetes. +* Integración con **GraphQL** usando [Strawberry](https://strawberry.rocks) y otros paquetes. * Muchas funcionalidades extra (gracias a Starlette) como: * **WebSockets** * pruebas extremadamente fáciles basadas en HTTPX y `pytest` @@ -452,24 +452,10 @@ Para un ejemplo más completo incluyendo más funcionalidades, ve al FastAPI Cloud, ve y únete a la lista de espera si no lo has hecho. 🚀 +Opcionalmente puedes desplegar tu app de FastAPI en [FastAPI Cloud](https://fastapicloud.com), ve y únete a la lista de espera si 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: - -
- -```console -$ fastapi login - -You are logged in to FastAPI Cloud 🚀 -``` - -
- -Luego despliega tu app: -
```console @@ -488,7 +474,7 @@ Deploying to FastAPI Cloud... #### Acerca de FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** está construido por el mismo autor y equipo detrás de **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** está construido por el mismo autor y equipo detrás de **FastAPI**. Optimiza el proceso de **construir**, **desplegar** y **acceder** a una API con un esfuerzo mínimo. @@ -504,9 +490,9 @@ Sigue las guías de tu proveedor de cloud para desplegar apps de FastAPI con ell ## Rendimiento { #performance } -Benchmarks independientes de TechEmpower muestran aplicaciones **FastAPI** ejecutándose bajo Uvicorn como uno de los frameworks Python más rápidos disponibles, solo por debajo de Starlette y Uvicorn (usados internamente por FastAPI). (*) +Benchmarks independientes de TechEmpower muestran aplicaciones **FastAPI** ejecutándose bajo Uvicorn como [uno de los frameworks Python más rápidos disponibles](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), solo por debajo de Starlette y Uvicorn (usados internamente por FastAPI). (*) -Para entender más sobre esto, ve la sección Benchmarks. +Para entender más sobre esto, ve la sección [Benchmarks](https://fastapi.tiangolo.com/es/benchmarks/). ## Dependencias { #dependencies } @@ -518,19 +504,19 @@ Cuando instalas FastAPI con `pip install "fastapi[standard]"` viene con el grupo Usadas por Pydantic: -* email-validator - para validación de correos electrónicos. +* [`email-validator`](https://github.com/JoshData/python-email-validator) - para validación de correos electrónicos. Usadas por Starlette: -* httpx - Requerido si deseas usar el `TestClient`. -* jinja2 - Requerido si deseas usar la configuración de plantilla por defecto. -* python-multipart - Requerido si deseas soportar form "parsing", con `request.form()`. +* [`httpx`](https://www.python-httpx.org) - Requerido si deseas usar el `TestClient`. +* [`jinja2`](https://jinja.palletsprojects.com) - Requerido si deseas usar la configuración de plantilla por defecto. +* [`python-multipart`](https://github.com/Kludex/python-multipart) - Requerido si deseas soportar form "parsing", con `request.form()`. Usadas por FastAPI: -* uvicorn - para el servidor que carga y sirve tu aplicación. Esto incluye `uvicorn[standard]`, que incluye algunas dependencias (por ejemplo, `uvloop`) necesarias para servir con alto rendimiento. +* [`uvicorn`](https://www.uvicorn.dev) - para el servidor que carga y sirve tu aplicación. Esto incluye `uvicorn[standard]`, que incluye algunas dependencias (por ejemplo, `uvloop`) necesarias para servir con alto rendimiento. * `fastapi-cli[standard]` - para proporcionar el comando `fastapi`. - * Esto incluye `fastapi-cloud-cli`, que te permite desplegar tu aplicación de FastAPI en FastAPI Cloud. + * Esto incluye `fastapi-cloud-cli`, que te permite desplegar tu aplicación de FastAPI en [FastAPI Cloud](https://fastapicloud.com). ### Sin Dependencias `standard` { #without-standard-dependencies } @@ -546,13 +532,13 @@ Existen algunas dependencias adicionales que podrías querer instalar. Dependencias opcionales adicionales de Pydantic: -* pydantic-settings - para la gestión de configuraciones. -* pydantic-extra-types - para tipos extra para ser usados con Pydantic. +* [`pydantic-settings`](https://docs.pydantic.dev/latest/usage/pydantic_settings/) - para la gestión de configuraciones. +* [`pydantic-extra-types`](https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/) - para tipos extra para ser usados con Pydantic. Dependencias opcionales adicionales de FastAPI: -* orjson - Requerido si deseas usar `ORJSONResponse`. -* ujson - Requerido si deseas usar `UJSONResponse`. +* [`orjson`](https://github.com/ijl/orjson) - Requerido si deseas usar `ORJSONResponse`. +* [`ujson`](https://github.com/esnme/ultrajson) - Requerido si deseas usar `UJSONResponse`. ## Licencia { #license } diff --git a/docs/es/docs/project-generation.md b/docs/es/docs/project-generation.md index 6d48d0be54..11a560eba6 100644 --- a/docs/es/docs/project-generation.md +++ b/docs/es/docs/project-generation.md @@ -4,7 +4,7 @@ Las plantillas, aunque normalmente vienen con una configuración específica, es Puedes usar esta plantilla para comenzar, ya que incluye gran parte de la configuración inicial, seguridad, base de datos y algunos endpoints de API ya hechos para ti. -Repositorio de GitHub: Plantilla Full Stack FastAPI +Repositorio de GitHub: [Plantilla Full Stack FastAPI](https://github.com/tiangolo/full-stack-fastapi-template) ## Plantilla Full Stack FastAPI - Stack de tecnología y funcionalidades { #full-stack-fastapi-template-technology-stack-and-features } diff --git a/docs/es/docs/python-types.md b/docs/es/docs/python-types.md index 28e2953d35..5d60ea22c4 100644 --- a/docs/es/docs/python-types.md +++ b/docs/es/docs/python-types.md @@ -80,7 +80,7 @@ Esas son las "anotaciones de tipos": {* ../../docs_src/python_types/tutorial002_py310.py hl[1] *} -Eso no es lo mismo que declarar valores predeterminados como sería con: +Eso no es lo mismo que declarar valores por defecto como sería con: ```Python first_name="john", last_name="doe" @@ -269,7 +269,7 @@ No significa "`one_person` es la **clase** llamada `Person`". ## Modelos Pydantic { #pydantic-models } -Pydantic es un paquete de Python para realizar la validación de datos. +[Pydantic](https://docs.pydantic.dev/) es un paquete de Python para realizar la validación de datos. Declaras la "forma" de los datos como clases con atributos. @@ -285,13 +285,13 @@ Un ejemplo de la documentación oficial de Pydantic: /// info | Información -Para saber más sobre Pydantic, revisa su documentación. +Para saber más sobre [Pydantic, revisa su documentación](https://docs.pydantic.dev/). /// **FastAPI** está completamente basado en Pydantic. -Verás mucho más de todo esto en práctica en el [Tutorial - Guía del Usuario](tutorial/index.md){.internal-link target=_blank}. +Verás mucho más de todo esto en práctica en el [Tutorial - Guía del Usuario](tutorial/index.md). ## Anotaciones de tipos con metadata { #type-hints-with-metadata-annotations } @@ -337,12 +337,12 @@ Con **FastAPI** declaras parámetros con anotaciones de tipos y obtienes: * **Documentar** la API usando OpenAPI: * Que luego es usada por las interfaces de documentación interactiva automática. -Todo esto puede sonar abstracto. No te preocupes. Verás todo esto en acción en el [Tutorial - Guía del Usuario](tutorial/index.md){.internal-link target=_blank}. +Todo esto puede sonar abstracto. No te preocupes. Verás todo esto en acción en el [Tutorial - Guía del Usuario](tutorial/index.md). Lo importante es que al usar tipos estándar de Python, en un solo lugar (en lugar de agregar más clases, decoradores, etc.), **FastAPI** hará gran parte del trabajo por ti. /// info | Información -Si ya revisaste todo el tutorial y volviste para ver más sobre tipos, un buen recurso es la "cheat sheet" de `mypy`. +Si ya revisaste todo el tutorial y volviste para ver más sobre tipos, un buen recurso es [la "cheat sheet" de `mypy`](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html). /// diff --git a/docs/es/docs/tutorial/background-tasks.md b/docs/es/docs/tutorial/background-tasks.md index 10ad4b5ebb..6ae265b919 100644 --- a/docs/es/docs/tutorial/background-tasks.md +++ b/docs/es/docs/tutorial/background-tasks.md @@ -61,7 +61,7 @@ Y luego otra tarea en segundo plano generada en la *path operation function* esc ## Detalles Técnicos { #technical-details } -La clase `BackgroundTasks` proviene directamente de `starlette.background`. +La clase `BackgroundTasks` proviene directamente de [`starlette.background`](https://www.starlette.dev/background/). Se importa/incluye directamente en FastAPI para que puedas importarla desde `fastapi` y evitar importar accidentalmente la alternativa `BackgroundTask` (sin la `s` al final) de `starlette.background`. @@ -69,11 +69,11 @@ Al usar solo `BackgroundTasks` (y no `BackgroundTask`), es posible usarla como u Todavía es posible usar `BackgroundTask` solo en FastAPI, pero debes crear el objeto en tu código y devolver una `Response` de Starlette incluyéndolo. -Puedes ver más detalles en la documentación oficial de Starlette sobre Background Tasks. +Puedes ver más detalles en [la documentación oficial de Starlette sobre Background Tasks](https://www.starlette.dev/background/). ## Advertencia { #caveat } -Si necesitas realizar una computación intensa en segundo plano y no necesariamente necesitas que se ejecute por el mismo proceso (por ejemplo, no necesitas compartir memoria, variables, etc.), podrías beneficiarte del uso de otras herramientas más grandes como Celery. +Si necesitas realizar una computación intensa en segundo plano y no necesariamente necesitas que se ejecute por el mismo proceso (por ejemplo, no necesitas compartir memoria, variables, etc.), podrías beneficiarte del uso de otras herramientas más grandes como [Celery](https://docs.celeryq.dev). Tienden a requerir configuraciones más complejas, un gestor de cola de mensajes/trabajos, como RabbitMQ o Redis, pero te permiten ejecutar tareas en segundo plano en múltiples procesos, y especialmente, en múltiples servidores. diff --git a/docs/es/docs/tutorial/bigger-applications.md b/docs/es/docs/tutorial/bigger-applications.md index 96b58a7207..27a034f47d 100644 --- a/docs/es/docs/tutorial/bigger-applications.md +++ b/docs/es/docs/tutorial/bigger-applications.md @@ -123,7 +123,7 @@ Ahora utilizaremos una dependencia simple para leer un header `X-Token` personal Estamos usando un header inventado para simplificar este ejemplo. -Pero en casos reales obtendrás mejores resultados usando las [utilidades de Seguridad](security/index.md){.internal-link target=_blank} integradas. +Pero en casos reales obtendrás mejores resultados usando las [utilidades de Seguridad](security/index.md) integradas. /// @@ -169,7 +169,7 @@ Y podemos agregar una lista de `dependencies` que se añadirá a todas las *path /// tip | Consejo -Nota que, al igual que [dependencias en decoradores de *path operations*](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, ningún valor será pasado a tu *path operation function*. +Nota que, al igual que [dependencias en decoradores de *path operations*](dependencies/dependencies-in-path-operation-decorators.md), ningún valor será pasado a tu *path operation function*. /// @@ -185,8 +185,8 @@ El resultado final es que los paths de item son ahora: * 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){.internal-link target=_blank}, y luego las dependencias de parámetros normales. - * También puedes agregar [dependencias de `Security` con `scopes`](../advanced/security/oauth2-scopes.md){.internal-link target=_blank}. + * 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 @@ -303,7 +303,7 @@ Y como la mayor parte de tu lógica ahora vivirá en su propio módulo específi Importas y creas una clase `FastAPI` como normalmente. -Y podemos incluso declarar [dependencias globales](dependencies/global-dependencies.md){.internal-link target=_blank} que se combinarán con las dependencias para cada `APIRouter`: +Y podemos incluso declarar [dependencias globales](dependencies/global-dependencies.md) que se combinarán con las dependencias para cada `APIRouter`: {* ../../docs_src/bigger_applications/app_an_py310/main.py hl[1,3,7] title["app/main.py"] *} @@ -353,7 +353,7 @@ La segunda versión es un "import absoluto": from app.routers import items, users ``` -Para aprender más sobre Paquetes y Módulos de Python, lee la documentación oficial de Python sobre Módulos. +Para aprender más sobre Paquetes y Módulos de Python, lee [la documentación oficial de Python sobre Módulos](https://docs.python.org/3/tutorial/modules.html). /// @@ -465,6 +465,37 @@ Como no podemos simplemente aislarlos y "montarlos" independientemente del resto /// +## Configurar el `entrypoint` en `pyproject.toml` { #configure-the-entrypoint-in-pyproject-toml } + +Como tu objeto `app` de FastAPI vive en `app/main.py`, puedes configurar el `entrypoint` en tu archivo `pyproject.toml` así: + +```toml +[tool.fastapi] +entrypoint = "app.main:app" +``` + +que es equivalente a importar como: + +```python +from app.main import app +``` + +De esa manera el comando `fastapi` sabrá dónde encontrar tu app. + +/// Note | Nota + +También podrías pasar la ruta al comando, como: + +```console +$ fastapi dev app/main.py +``` + +Pero tendrías que recordar pasar la ruta correcta cada vez que llames al comando `fastapi`. + +Además, otras herramientas podrían no ser capaces de encontrarla, 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`. + +/// + ## Revisa la documentación automática de la API { #check-the-automatic-api-docs } Ahora, ejecuta tu app: @@ -472,14 +503,14 @@ Ahora, ejecuta tu app:
```console -$ fastapi dev app/main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Y abre la documentación en http://127.0.0.1:8000/docs. +Y abre la documentación en [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Verás la documentación automática de la API, incluyendo los paths de todos los submódulos, usando los paths correctos (y prefijos) y los tags correctos: diff --git a/docs/es/docs/tutorial/body-nested-models.md b/docs/es/docs/tutorial/body-nested-models.md index 5f723e4c9f..742f78d420 100644 --- a/docs/es/docs/tutorial/body-nested-models.md +++ b/docs/es/docs/tutorial/body-nested-models.md @@ -1,6 +1,6 @@ # Cuerpo - Modelos Anidados { #body-nested-models } -Con **FastAPI**, puedes definir, validar, documentar y usar modelos anidados de manera arbitraria (gracias a Pydantic). +Con **FastAPI**, puedes definir, validar, documentar y usar modelos profundamente anidados de manera arbitraria (gracias a Pydantic). ## Campos de lista { #list-fields } @@ -96,7 +96,7 @@ Nuevamente, haciendo solo esa declaración, con **FastAPI** obtienes: Además de tipos singulares normales como `str`, `int`, `float`, etc., puedes usar tipos singulares más complejos que heredan de `str`. -Para ver todas las opciones que tienes, revisa el Overview de Tipos de Pydantic. Verás algunos ejemplos en el siguiente capítulo. +Para ver todas las opciones que tienes, Revisa [Resumen de tipos de Pydantic](https://docs.pydantic.dev/latest/concepts/types/). Verás algunos ejemplos en el siguiente capítulo. Por ejemplo, como en el modelo `Image` tenemos un campo `url`, podemos declararlo como una instance de `HttpUrl` de Pydantic en lugar de un `str`: diff --git a/docs/es/docs/tutorial/body-updates.md b/docs/es/docs/tutorial/body-updates.md index e75e29b54b..1b309ebbf4 100644 --- a/docs/es/docs/tutorial/body-updates.md +++ b/docs/es/docs/tutorial/body-updates.md @@ -2,7 +2,7 @@ ## Actualización reemplazando con `PUT` { #update-replacing-with-put } -Para actualizar un ítem puedes utilizar la operación de HTTP `PUT`. +Para actualizar un ítem puedes utilizar la operación de [HTTP `PUT`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT). Puedes usar el `jsonable_encoder` para convertir los datos de entrada en datos que se puedan almacenar como JSON (por ejemplo, con una base de datos NoSQL). Por ejemplo, convirtiendo `datetime` a `str`. @@ -28,7 +28,7 @@ Y los datos se guardarían con ese "nuevo" `tax` de `10.5`. ## Actualizaciones parciales con `PATCH` { #partial-updates-with-patch } -También puedes usar la operación de HTTP `PATCH` para actualizar *parcialmente* datos. +También puedes usar la operación de [HTTP `PATCH`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) para actualizar *parcialmente* datos. Esto significa que puedes enviar solo los datos que deseas actualizar, dejando el resto intacto. @@ -95,6 +95,6 @@ Observa que el modelo de entrada sigue siendo validado. Entonces, si deseas recibir actualizaciones parciales que puedan omitir todos los atributos, necesitas tener un modelo con todos los atributos marcados como opcionales (con valores por defecto o `None`). -Para distinguir entre los modelos con todos los valores opcionales para **actualizaciones** y modelos con valores requeridos para **creación**, puedes utilizar las ideas descritas en [Modelos Extra](extra-models.md){.internal-link target=_blank}. +Para distinguir entre los modelos con todos los valores opcionales para **actualizaciones** y modelos con valores requeridos para **creación**, puedes utilizar las ideas descritas en [Modelos Extra](extra-models.md). /// diff --git a/docs/es/docs/tutorial/body.md b/docs/es/docs/tutorial/body.md index 3adf2e65c5..7c3b8e9d91 100644 --- a/docs/es/docs/tutorial/body.md +++ b/docs/es/docs/tutorial/body.md @@ -6,7 +6,7 @@ Un **request** body es un dato enviado por el cliente a tu API. Un **response** Tu API casi siempre tiene que enviar un **response** body. Pero los clientes no necesariamente necesitan enviar **request bodies** todo el tiempo, a veces solo solicitan un path, quizás con algunos parámetros de query, pero no envían un body. -Para declarar un **request** body, usas modelos de Pydantic con todo su poder y beneficios. +Para declarar un **request** body, usas modelos de [Pydantic](https://docs.pydantic.dev/) con todo su poder y beneficios. /// info | Información @@ -73,7 +73,7 @@ Con solo esa declaración de tipo en Python, **FastAPI** hará lo siguiente: * Si los datos son inválidos, devolverá un error claro e indicado, señalando exactamente dónde y qué fue lo incorrecto. * Proporcionar los datos recibidos en el parámetro `item`. * Como lo declaraste en la función como de tipo `Item`, también tendrás todo el soporte del editor (autocompletado, etc.) para todos los atributos y sus tipos. -* Generar definiciones de JSON Schema para tu modelo, que también puedes usar en cualquier otro lugar si tiene sentido para tu proyecto. +* Generar definiciones de [JSON Schema](https://json-schema.org) para tu modelo, que también puedes usar en cualquier otro lugar si tiene sentido para tu proyecto. * Esos esquemas serán parte del esquema de OpenAPI generado y usados por las UIs de documentación automática. ## Documentación automática { #automatic-docs } @@ -102,15 +102,15 @@ Y fue rigurosamente probado en la fase de diseño, antes de cualquier implementa Incluso se hicieron algunos cambios en Pydantic para admitir esto. -Las capturas de pantalla anteriores se tomaron con Visual Studio Code. +Las capturas de pantalla anteriores se tomaron con [Visual Studio Code](https://code.visualstudio.com). -Pero obtendrías el mismo soporte en el editor con PyCharm y la mayoría de los otros editores de Python: +Pero obtendrías el mismo soporte en el editor con [PyCharm](https://www.jetbrains.com/pycharm/) y la mayoría de los otros editores de Python: /// tip | Consejo -Si usas PyCharm como tu editor, puedes usar el Pydantic PyCharm Plugin. +Si usas [PyCharm](https://www.jetbrains.com/pycharm/) como tu editor, puedes usar el [Pydantic PyCharm Plugin](https://github.com/koxudaxi/pydantic-pycharm-plugin/). Mejora el soporte del editor para modelos de Pydantic, con: @@ -163,4 +163,4 @@ Pero agregar las anotaciones de tipos permitirá que tu editor te brinde un mejo ## Sin Pydantic { #without-pydantic } -Si no quieres usar modelos de Pydantic, también puedes usar parámetros **Body**. Consulta la documentación para [Body - Múltiples parámetros: Valores singulares en el body](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank}. +Si no quieres usar modelos de Pydantic, también puedes usar parámetros **Body**. Consulta la documentación para [Body - Múltiples parámetros: Valores singulares en el body](body-multiple-params.md#singular-values-in-body). diff --git a/docs/es/docs/tutorial/cors.md b/docs/es/docs/tutorial/cors.md index a118d814b0..ec547178be 100644 --- a/docs/es/docs/tutorial/cors.md +++ b/docs/es/docs/tutorial/cors.md @@ -1,6 +1,6 @@ # CORS (Cross-Origin Resource Sharing) { #cors-cross-origin-resource-sharing } -CORS o "Cross-Origin Resource Sharing" se refiere a situaciones en las que un frontend que se ejecuta en un navegador tiene código JavaScript que se comunica con un backend, y el backend está en un "origen" diferente al frontend. +[CORS o "Cross-Origin Resource Sharing"](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) se refiere a situaciones en las que un frontend que se ejecuta en un navegador tiene código JavaScript que se comunica con un backend, y el backend está en un "origen" diferente al frontend. ## Origen { #origin } @@ -56,10 +56,10 @@ Se admiten los siguientes argumentos: * `allow_origins` - Una lista de orígenes que deberían estar permitidos para hacer requests cross-origin. Por ejemplo, `['https://example.org', 'https://www.example.org']`. Puedes usar `['*']` para permitir cualquier origen. * `allow_origin_regex` - Una cadena regex para coincidir con orígenes que deberían estar permitidos para hacer requests cross-origin. por ejemplo, `'https://.*\.example\.org'`. * `allow_methods` - Una lista de métodos HTTP que deberían estar permitidos para requests cross-origin. Por defecto es `['GET']`. Puedes usar `['*']` para permitir todos los métodos estándar. -* `allow_headers` - Una lista de headers de request HTTP que deberían estar soportados para requests cross-origin. Por defecto es `[]`. Puedes usar `['*']` para permitir todos los headers. Los headers `Accept`, `Accept-Language`, `Content-Language` y `Content-Type` siempre están permitidos para requests CORS simples. +* `allow_headers` - Una lista de headers de request HTTP que deberían estar soportados para requests cross-origin. Por defecto es `[]`. Puedes usar `['*']` para permitir todos los headers. Los headers `Accept`, `Accept-Language`, `Content-Language` y `Content-Type` siempre están permitidos para [requests CORS simples](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests). * `allow_credentials` - Indica que las cookies deberían estar soportadas para requests cross-origin. Por defecto es `False`. - Ninguno de `allow_origins`, `allow_methods` y `allow_headers` puede establecerse a `['*']` si `allow_credentials` está configurado a `True`. Todos deben ser especificados explícitamente. + Ninguno de `allow_origins`, `allow_methods` y `allow_headers` puede establecerse a `['*']` si `allow_credentials` está configurado a `True`. Todos deben ser [especificados explícitamente](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards). * `expose_headers` - Indica cualquier header de response que debería ser accesible para el navegador. Por defecto es `[]`. * `max_age` - Establece un tiempo máximo en segundos para que los navegadores almacenen en caché los responses CORS. Por defecto es `600`. @@ -78,7 +78,7 @@ Cualquier request con un header `Origin`. En este caso, el middleware pasará el ## Más info { #more-info } -Para más información sobre CORS, revisa la documentación de CORS de Mozilla. +Para más información sobre CORS, revisa la [documentación de CORS de Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS). /// note | Detalles Técnicos diff --git a/docs/es/docs/tutorial/debugging.md b/docs/es/docs/tutorial/debugging.md index a2d47f2da7..b5d0704e06 100644 --- a/docs/es/docs/tutorial/debugging.md +++ b/docs/es/docs/tutorial/debugging.md @@ -74,7 +74,7 @@ no se ejecutará. /// info | Información -Para más información, revisa la documentación oficial de Python. +Para más información, revisa [la documentación oficial de Python](https://docs.python.org/3/library/__main__.html). /// 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 5eadbe7e1f..72e4e973e9 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 @@ -32,7 +32,7 @@ También puede ayudar a evitar confusiones para nuevos desarrolladores que vean En este ejemplo usamos headers personalizados inventados `X-Key` y `X-Token`. -Pero en casos reales, al implementar seguridad, obtendrías más beneficios usando las [Utilidades de Seguridad integradas (el próximo capítulo)](../security/index.md){.internal-link target=_blank}. +Pero en casos reales, al implementar seguridad, obtendrías más beneficios usando las [Utilidades de Seguridad integradas (el próximo capítulo)](../security/index.md). /// @@ -62,7 +62,7 @@ Así que, puedes reutilizar una dependencia normal (que devuelve un valor) que y ## Dependencias para un grupo de *path operations* { #dependencies-for-a-group-of-path-operations } -Más adelante, cuando leas sobre cómo estructurar aplicaciones más grandes ([Aplicaciones Más Grandes - Múltiples Archivos](../../tutorial/bigger-applications.md){.internal-link target=_blank}), posiblemente con múltiples archivos, aprenderás cómo declarar un único parámetro `dependencies` para un grupo de *path operations*. +Más adelante, cuando leas sobre cómo estructurar aplicaciones más grandes ([Aplicaciones Más Grandes - Múltiples Archivos](../../tutorial/bigger-applications.md)), posiblemente con múltiples archivos, aprenderás cómo declarar un único parámetro `dependencies` para un grupo de *path operations*. ## Dependencias Globales { #global-dependencies } diff --git a/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md index 2cd68eddd2..084d72aa40 100644 --- a/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md +++ b/docs/es/docs/tutorial/dependencies/dependencies-with-yield.md @@ -14,8 +14,8 @@ Asegúrate de usar `yield` una sola vez por dependencia. Cualquier función que sea válida para usar con: -* `@contextlib.contextmanager` o -* `@contextlib.asynccontextmanager` +* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) o +* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager) sería válida para usar como una dependencia en **FastAPI**. @@ -27,7 +27,7 @@ De hecho, FastAPI usa esos dos decoradores internamente. Por ejemplo, podrías usar esto para crear una sesión de base de datos y cerrarla después de finalizar. -Solo el código anterior e incluyendo la declaración `yield` se ejecuta antes de crear un response: +Solo el código anterior e incluyendo el `yield` statement se ejecuta antes de crear un response: {* ../../docs_src/dependencies/tutorial007_py310.py hl[2:4] *} @@ -35,7 +35,7 @@ El valor generado es lo que se inyecta en *path operations* y otras dependencias {* ../../docs_src/dependencies/tutorial007_py310.py hl[4] *} -El código posterior a la declaración `yield` se ejecuta después del response: +El código posterior al `yield` statement se ejecuta después del response: {* ../../docs_src/dependencies/tutorial007_py310.py hl[5:6] *} @@ -87,7 +87,7 @@ Puedes tener cualquier combinación de dependencias que quieras. /// note | Detalles técnicos -Esto funciona gracias a los Context Managers de Python. +Esto funciona gracias a los [Context Managers](https://docs.python.org/3/library/contextlib.html) de Python. **FastAPI** los utiliza internamente para lograr esto. @@ -111,7 +111,7 @@ Pero está ahí para ti si la necesitas. 🤓 {* ../../docs_src/dependencies/tutorial008b_an_py310.py hl[18:22,31] *} -Si quieres capturar excepciones y crear un response personalizado en base a eso, crea un [Manejador de Excepciones Personalizado](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}. +Si quieres capturar excepciones y crear un response personalizado en base a eso, crea un [Manejador de Excepciones Personalizado](../handling-errors.md#install-custom-exception-handlers). ## Dependencias con `yield` y `except` { #dependencies-with-yield-and-except } @@ -233,14 +233,14 @@ 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){.internal-link target=_blank}. +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 } -Los "Context Managers" son aquellos objetos de Python que puedes usar en una declaración `with`. +Los "Context Managers" son aquellos objetos de Python que puedes usar en un `with` statement. -Por ejemplo, puedes usar `with` para leer un archivo: +Por ejemplo, [puedes usar `with` para leer un archivo](https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files): ```Python with open("./somefile.txt") as f: @@ -264,7 +264,7 @@ Si apenas estás comenzando con **FastAPI**, podrías querer omitirlo por ahora. /// -En Python, puedes crear Context Managers creando una clase con dos métodos: `__enter__()` y `__exit__()`. +En Python, puedes crear Context Managers [creando una clase con dos métodos: `__enter__()` y `__exit__()`](https://docs.python.org/3/reference/datamodel.html#context-managers). También puedes usarlos dentro de las dependencias de **FastAPI** con `yield` usando `with` o `async with` en la función de dependencia: @@ -275,8 +275,8 @@ También puedes usarlos dentro de las dependencias de **FastAPI** con `yield` us Otra manera de crear un context manager es con: -* `@contextlib.contextmanager` o -* `@contextlib.asynccontextmanager` +* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) o +* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager) usándolos para decorar una función con un solo `yield`. diff --git a/docs/es/docs/tutorial/dependencies/global-dependencies.md b/docs/es/docs/tutorial/dependencies/global-dependencies.md index 567e69cf0c..661474f716 100644 --- a/docs/es/docs/tutorial/dependencies/global-dependencies.md +++ b/docs/es/docs/tutorial/dependencies/global-dependencies.md @@ -2,14 +2,14 @@ Para algunos tipos de aplicaciones, podrías querer agregar dependencias a toda la aplicación. -Similar a como puedes [agregar `dependencies` a los *path operation decorators*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, puedes agregarlos a la aplicación de `FastAPI`. +Similar a como puedes [agregar `dependencies` a los *path operation decorators*](dependencies-in-path-operation-decorators.md), puedes agregarlos a la aplicación de `FastAPI`. En ese caso, se aplicarán a todas las *path operations* en la aplicación: {* ../../docs_src/dependencies/tutorial012_an_py310.py hl[17] *} -Y todas las ideas en la sección sobre [agregar `dependencies` a los *path operation decorators*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} siguen aplicándose, pero en este caso, a todas las *path operations* en la app. +Y todas las ideas en la sección sobre [agregar `dependencies` a los *path operation decorators*](dependencies-in-path-operation-decorators.md) siguen aplicándose, pero en este caso, a todas las *path operations* en la app. ## Dependencias para grupos de *path operations* { #dependencies-for-groups-of-path-operations } -Más adelante, al leer sobre cómo estructurar aplicaciones más grandes ([Aplicaciones Más Grandes - Múltiples Archivos](../../tutorial/bigger-applications.md){.internal-link target=_blank}), posiblemente con múltiples archivos, aprenderás cómo declarar un solo parámetro de `dependencies` para un grupo de *path operations*. +Más adelante, al leer sobre cómo estructurar aplicaciones más grandes ([Aplicaciones Más Grandes - Múltiples Archivos](../../tutorial/bigger-applications.md)), posiblemente con múltiples archivos, aprenderás cómo declarar un solo parámetro de `dependencies` para un grupo de *path operations*. diff --git a/docs/es/docs/tutorial/dependencies/index.md b/docs/es/docs/tutorial/dependencies/index.md index 4eb31196f7..ed5783f39d 100644 --- a/docs/es/docs/tutorial/dependencies/index.md +++ b/docs/es/docs/tutorial/dependencies/index.md @@ -57,7 +57,7 @@ FastAPI agregó soporte para `Annotated` (y comenzó a recomendarlo) en la versi Si tienes una versión anterior, obtendrás errores al intentar usar `Annotated`. -Asegúrate de [Actualizar la versión de FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} al menos a la 0.95.1 antes de usar `Annotated`. +Asegúrate de [Actualizar la versión de FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions) al menos a la 0.95.1 antes de usar `Annotated`. /// @@ -152,7 +152,7 @@ No importa. **FastAPI** sabrá qué hacer. /// note | Nota -Si no lo sabes, revisa la sección [Async: *"¿Con prisa?"*](../../async.md#in-a-hurry){.internal-link target=_blank} sobre `async` y `await` en la documentación. +Si no lo sabes, revisa la sección [Async: *"¿Con prisa?"*](../../async.md#in-a-hurry) sobre `async` y `await` en la documentación. /// diff --git a/docs/es/docs/tutorial/encoder.md b/docs/es/docs/tutorial/encoder.md index df6099a8b9..2a83153a6c 100644 --- a/docs/es/docs/tutorial/encoder.md +++ b/docs/es/docs/tutorial/encoder.md @@ -12,7 +12,7 @@ Imaginemos que tienes una base de datos `fake_db` que solo recibe datos compatib Por ejemplo, no recibe objetos `datetime`, ya que no son compatibles con JSON. -Entonces, un objeto `datetime` tendría que ser convertido a un `str` que contenga los datos en formato ISO. +Entonces, un objeto `datetime` tendría que ser convertido a un `str` que contenga los datos en [formato ISO](https://en.wikipedia.org/wiki/ISO_8601). De la misma manera, esta base de datos no recibiría un modelo de Pydantic (un objeto con atributos), solo un `dict`. @@ -24,7 +24,7 @@ Recibe un objeto, como un modelo de Pydantic, y devuelve una versión compatible En este ejemplo, convertiría el modelo de Pydantic a un `dict`, y el `datetime` a un `str`. -El resultado de llamarlo es algo que puede ser codificado con la función estándar de Python `json.dumps()`. +El resultado de llamarlo es algo que puede ser codificado con la función estándar de Python [`json.dumps()`](https://docs.python.org/3/library/json.html#json.dumps). No devuelve un gran `str` que contenga los datos en formato JSON (como un string). Devuelve una estructura de datos estándar de Python (por ejemplo, un `dict`) con valores y sub-valores que son todos compatibles con JSON. diff --git a/docs/es/docs/tutorial/extra-data-types.md b/docs/es/docs/tutorial/extra-data-types.md index e876921ba4..b92d0fcd48 100644 --- a/docs/es/docs/tutorial/extra-data-types.md +++ b/docs/es/docs/tutorial/extra-data-types.md @@ -36,7 +36,7 @@ Aquí hay algunos de los tipos de datos adicionales que puedes usar: * `datetime.timedelta`: * Un `datetime.timedelta` de Python. * En requests y responses se representará como un `float` de segundos totales. - * Pydantic también permite representarlo como una "codificación de diferencia horaria ISO 8601", consulta la documentación para más información. + * Pydantic también permite representarlo como una "codificación de diferencia horaria ISO 8601", [consulta la documentación para más información](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers). * `frozenset`: * En requests y responses, tratado igual que un `set`: * En requests, se leerá una list, eliminando duplicados y convirtiéndola en un `set`. @@ -45,11 +45,11 @@ Aquí hay algunos de los tipos de datos adicionales que puedes usar: * `bytes`: * `bytes` estándar de Python. * En requests y responses se tratará como `str`. - * El esquema generado especificará que es un `str` con "binary" como "format". + * El esquema generado especificará que es un `str` con `binary` como "format". * `Decimal`: * `Decimal` estándar de Python. * En requests y responses, manejado igual que un `float`. -* Puedes revisar todos los tipos de datos válidos de Pydantic aquí: Tipos de datos de Pydantic. +* Puedes revisar todos los tipos de datos válidos de Pydantic aquí: [Tipos de datos de Pydantic](https://docs.pydantic.dev/latest/usage/types/types/). ## Ejemplo { #example } diff --git a/docs/es/docs/tutorial/extra-models.md b/docs/es/docs/tutorial/extra-models.md index 4621b2db2e..4a3b75b5bc 100644 --- a/docs/es/docs/tutorial/extra-models.md +++ b/docs/es/docs/tutorial/extra-models.md @@ -12,7 +12,7 @@ Esto es especialmente el caso para los modelos de usuario, porque: Nunca almacenes contraseñas de usuarios en texto plano. Siempre almacena un "hash seguro" que puedas verificar luego. -Si no lo sabes, aprenderás qué es un "hash de contraseña" en los [capítulos de seguridad](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}. +Si no lo sabes, aprenderás qué es un "hash de contraseña" en los [capítulos de seguridad](security/simple-oauth2.md#password-hashing). /// @@ -162,11 +162,11 @@ Puedes declarar un response que sea la `Union` de dos o más tipos, eso signific Se definirá en OpenAPI con `anyOf`. -Para hacerlo, usa la anotación de tipos estándar de Python `typing.Union`: +Para hacerlo, usa la anotación de tipos estándar de Python [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union): /// note | Nota -Al definir una `Union`, incluye el tipo más específico primero, seguido por el tipo menos específico. En el ejemplo a continuación, el más específico `PlaneItem` viene antes de `CarItem` en `Union[PlaneItem, CarItem]`. +Al definir una [`Union`](https://docs.pydantic.dev/latest/concepts/types/#unions), incluye el tipo más específico primero, seguido por el tipo menos específico. En el ejemplo a continuación, el más específico `PlaneItem` viene antes de `CarItem` en `Union[PlaneItem, CarItem]`. /// diff --git a/docs/es/docs/tutorial/first-steps.md b/docs/es/docs/tutorial/first-steps.md index b7ffd2c2ab..1fcfdc1402 100644 --- a/docs/es/docs/tutorial/first-steps.md +++ b/docs/es/docs/tutorial/first-steps.md @@ -11,7 +11,7 @@ Ejecuta el servidor en vivo:
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -58,7 +58,7 @@ Esa línea muestra la URL donde tu aplicación está siendo servida, en tu máqu ### Revisa { #check-it } -Abre tu navegador en http://127.0.0.1:8000. +Abre tu navegador en [http://127.0.0.1:8000](http://127.0.0.1:8000). Verás el response JSON como: @@ -68,17 +68,17 @@ Verás el response JSON como: ### Documentación interactiva de la API { #interactive-api-docs } -Ahora ve a http://127.0.0.1:8000/docs. +Ahora ve a [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). -Verás la documentación interactiva automática de la API (proporcionada por Swagger UI): +Verás la documentación interactiva automática de la API (proporcionada por [Swagger UI](https://github.com/swagger-api/swagger-ui)): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Documentación alternativa de la API { #alternative-api-docs } -Y ahora, ve a http://127.0.0.1:8000/redoc. +Y ahora, ve a [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). -Verás la documentación alternativa automática (proporcionada por ReDoc): +Verás la documentación alternativa automática (proporcionada por [ReDoc](https://github.com/Rebilly/ReDoc)): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -92,7 +92,7 @@ Un "esquema" es una definición o descripción de algo. No el código que lo imp #### Esquema de la API { #api-schema } -En este caso, OpenAPI es una especificación que dicta cómo definir un esquema de tu API. +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. @@ -110,7 +110,7 @@ OpenAPI define un esquema de API para tu API. Y ese esquema incluye definiciones Si tienes curiosidad por cómo se ve el esquema OpenAPI en bruto, FastAPI automáticamente genera un JSON (esquema) con las descripciones de toda tu API. -Puedes verlo directamente en: http://127.0.0.1:8000/openapi.json. +Puedes verlo directamente en: [http://127.0.0.1:8000/openapi.json](http://127.0.0.1:8000/openapi.json). Mostrará un JSON que empieza con algo como: @@ -143,9 +143,58 @@ Y hay docenas de alternativas, todas basadas en OpenAPI. Podrías añadir fácil También podrías usarlo para generar código automáticamente, para clientes que se comuniquen con tu API. Por ejemplo, aplicaciones frontend, móviles o IoT. +### Configura el `entrypoint` de la app en `pyproject.toml` { #configure-the-app-entrypoint-in-pyproject-toml } + +Puedes configurar dónde está tu app en un archivo `pyproject.toml` así: + +```toml +[tool.fastapi] +entrypoint = "main:app" +``` + +Ese `entrypoint` le dirá al comando `fastapi` que debe hacer el import de la app así: + +```python +from main import app +``` + +Si tu código estuviera estructurado así: + +``` +. +├── backend +│   ├── main.py +│   ├── __init__.py +``` + +Entonces pondrías el `entrypoint` como: + +```toml +[tool.fastapi] +entrypoint = "backend.main:app" +``` + +lo cual sería equivalente a: + +```python +from backend.main import app +``` + +### `fastapi dev` con path { #fastapi-dev-with-path } + +También puedes pasar el path del archivo al comando `fastapi dev`, y adivinará el objeto app de FastAPI que debe usar: + +```console +$ 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, ve y únete a la lista de espera si aún no lo has hecho. 🚀 +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. @@ -191,7 +240,7 @@ Deploying to FastAPI Cloud... `FastAPI` es una clase que hereda directamente de `Starlette`. -Puedes usar toda la funcionalidad de Starlette con `FastAPI` también. +Puedes usar toda la funcionalidad de [Starlette](https://www.starlette.dev/) con `FastAPI` también. /// @@ -336,7 +385,7 @@ También podrías definirla como una función normal en lugar de `async def`: /// note | Nota -Si no sabes la diferencia, Revisa la sección [Async: *"¿Tienes prisa?"*](../async.md#in-a-hurry){.internal-link target=_blank}. +Si no sabes la diferencia, Revisa la sección [Async: *"¿Tienes prisa?"*](../async.md#in-a-hurry). /// @@ -352,11 +401,11 @@ Hay muchos otros objetos y modelos que serán automáticamente convertidos a JSO ### Paso 6: Despliégalo { #step-6-deploy-it } -Despliega tu app en **FastAPI Cloud** con un solo comando: `fastapi deploy`. 🎉 +Despliega tu app en **[FastAPI Cloud](https://fastapicloud.com)** con un solo comando: `fastapi deploy`. 🎉 #### Sobre FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** está construido por el mismo autor y equipo detrás de **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** está construido por el mismo autor y equipo detrás de **FastAPI**. Agiliza el proceso de **construir**, **desplegar** y **acceder** a una API con el mínimo esfuerzo. diff --git a/docs/es/docs/tutorial/handling-errors.md b/docs/es/docs/tutorial/handling-errors.md index 265269e874..737c43e41b 100644 --- a/docs/es/docs/tutorial/handling-errors.md +++ b/docs/es/docs/tutorial/handling-errors.md @@ -81,7 +81,7 @@ Pero en caso de que los necesites para un escenario avanzado, puedes agregar hea ## Instalar manejadores de excepciones personalizados { #install-custom-exception-handlers } -Puedes agregar manejadores de excepciones personalizados con las mismas utilidades de excepciones de Starlette. +Puedes agregar manejadores de excepciones personalizados con [las mismas utilidades de excepciones de Starlette](https://www.starlette.dev/exceptions/). Supongamos que tienes una excepción personalizada `UnicornException` que tú (o un paquete que usas) podrías lanzar. diff --git a/docs/es/docs/tutorial/index.md b/docs/es/docs/tutorial/index.md index 7804b6854d..414e865b27 100644 --- a/docs/es/docs/tutorial/index.md +++ b/docs/es/docs/tutorial/index.md @@ -10,12 +10,12 @@ También está diseñado para funcionar como una referencia futura para que pued Todos los bloques de código pueden ser copiados y usados directamente (de hecho, son archivos Python probados). -Para ejecutar cualquiera de los ejemplos, copia el código a un archivo `main.py`, y comienza `fastapi dev` con: +Para ejecutar cualquiera de los ejemplos, copia el código a un archivo `main.py`, y comienza `fastapi dev`:
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -62,7 +62,7 @@ Usarlo en tu editor es lo que realmente te muestra los beneficios de FastAPI, al El primer paso es instalar FastAPI. -Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, actívalo, y luego **instala FastAPI**: +Asegúrate de crear un [entorno virtual](../virtual-environments.md), actívalo, y luego **instala FastAPI**:
@@ -76,7 +76,7 @@ $ pip install "fastapi[standard]" /// note | Nota -Cuando instalas con `pip install "fastapi[standard]"` viene con algunas dependencias opcionales estándar por defecto, incluyendo `fastapi-cloud-cli`, que te permite hacer deploy a FastAPI Cloud. +Cuando instalas con `pip install "fastapi[standard]"` viene con algunas dependencias opcionales estándar por defecto, incluyendo `fastapi-cloud-cli`, que te permite hacer deploy a [FastAPI Cloud](https://fastapicloud.com). Si no quieres tener esas dependencias opcionales, en su lugar puedes instalar `pip install fastapi`. @@ -84,6 +84,12 @@ Si quieres instalar las dependencias estándar pero sin `fastapi-cloud-cli`, pue /// +/// tip | Consejo + +FastAPI tiene una [extensión oficial para VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (y Cursor), que ofrece muchas funcionalidades, incluyendo un explorador de path operation, búsqueda de path operation, navegación de CodeLens en tests (saltar a la definición desde tests), y deploy y logs de FastAPI Cloud, todo desde tu editor. + +/// + ## Guía Avanzada del Usuario { #advanced-user-guide } También hay una **Guía Avanzada del Usuario** que puedes leer después de esta **Tutorial - Guía del Usuario**. diff --git a/docs/es/docs/tutorial/metadata.md b/docs/es/docs/tutorial/metadata.md index 2163a1cb22..35bc98a26d 100644 --- a/docs/es/docs/tutorial/metadata.md +++ b/docs/es/docs/tutorial/metadata.md @@ -14,7 +14,7 @@ Puedes establecer los siguientes campos que se usan en la especificación OpenAP | `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`. | | `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ámetroTipoDescripción
namestrEl nombre identificativo de la persona/organización de contacto.
urlstrLa URL que apunta a la información de contacto. DEBE tener el formato de una URL.
emailstrLa 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` | `dict` | La información de la licencia para la API expuesta. Puede contener varios campos.
license_info fields
ParámetroTipoDescripción
namestrREQUERIDO (si se establece un license_info). El nombre de la licencia utilizada para la API.
identifierstrUna expresión de licencia SPDX para la API. El campo identifier es mutuamente excluyente del campo url. Disponible desde OpenAPI 3.1.0, FastAPI 0.99.0.
urlstrUna URL a la licencia utilizada para la API. DEBE tener el formato de una URL.
| +| `license_info` | `dict` | La información de la licencia para la API expuesta. Puede contener varios campos.
license_info fields
ParámetroTipoDescripción
namestrREQUERIDO (si se establece un license_info). El nombre de la licencia utilizada para la API.
identifierstrUna 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.
urlstrUna URL a la licencia utilizada para la API. DEBE tener el formato de una URL.
| Puedes configurarlos de la siguiente manera: @@ -76,7 +76,7 @@ Usa el parámetro `tags` con tus *path operations* (y `APIRouter`s) para asignar /// info | Información -Lee más sobre etiquetas en [Configuración de Path Operation](path-operation-configuration.md#tags){.internal-link target=_blank}. +Lee más sobre etiquetas en [Configuración de Path Operation](path-operation-configuration.md#tags). /// diff --git a/docs/es/docs/tutorial/middleware.md b/docs/es/docs/tutorial/middleware.md index 766e30cad6..4729cadc00 100644 --- a/docs/es/docs/tutorial/middleware.md +++ b/docs/es/docs/tutorial/middleware.md @@ -15,7 +15,7 @@ Un "middleware" es una función que trabaja con cada **request** antes de que se Si tienes dependencias con `yield`, el código de salida se ejecutará *después* del middleware. -Si hubiera tareas en segundo plano (cubiertas en la sección [Tareas en segundo plano](background-tasks.md){.internal-link target=_blank}, lo verás más adelante), se ejecutarán *después* de todo el middleware. +Si hubiera tareas en segundo plano (cubiertas en la sección [Tareas en segundo plano](background-tasks.md), lo verás más adelante), se ejecutarán *después* de todo el middleware. /// @@ -35,9 +35,9 @@ La función middleware recibe: /// tip | Consejo -Ten en cuenta que los custom proprietary headers se pueden añadir usando el prefijo `X-`. +Ten en cuenta que los custom proprietary headers se pueden añadir [usando el prefijo `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). -Pero si tienes custom headers que deseas que un cliente en un navegador pueda ver, necesitas añadirlos a tus configuraciones de CORS ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) usando el parámetro `expose_headers` documentado en la documentación de CORS de Starlette. +Pero si tienes custom headers que deseas que un cliente en un navegador pueda ver, necesitas añadirlos a tus configuraciones de CORS ([CORS (Cross-Origin Resource Sharing)](cors.md)) usando el parámetro `expose_headers` documentado en [la documentación de CORS de Starlette](https://www.starlette.dev/middleware/#corsmiddleware). /// @@ -61,7 +61,7 @@ Por ejemplo, podrías añadir un custom header `X-Process-Time` que contenga el /// tip | Consejo -Aquí usamos `time.perf_counter()` en lugar de `time.time()` porque puede ser más preciso para estos casos de uso. 🤓 +Aquí usamos [`time.perf_counter()`](https://docs.python.org/3/library/time.html#time.perf_counter) en lugar de `time.time()` porque puede ser más preciso para estos casos de uso. 🤓 /// @@ -90,6 +90,6 @@ Este comportamiento de apilamiento asegura que los middlewares se ejecuten en un ## Otros middlewares { #other-middlewares } -Más adelante puedes leer sobre otros middlewares en la [Guía del Usuario Avanzado: Middleware Avanzado](../advanced/middleware.md){.internal-link target=_blank}. +Más adelante puedes leer sobre otros middlewares en la [Guía del Usuario Avanzado: Middleware Avanzado](../advanced/middleware.md). Leerás sobre cómo manejar CORS con un middleware en la siguiente sección. diff --git a/docs/es/docs/tutorial/path-operation-configuration.md b/docs/es/docs/tutorial/path-operation-configuration.md index 90e4335b3b..21fd503bb7 100644 --- a/docs/es/docs/tutorial/path-operation-configuration.md +++ b/docs/es/docs/tutorial/path-operation-configuration.md @@ -58,7 +58,7 @@ Puedes añadir un `summary` y `description`: Como las descripciones tienden a ser largas y cubrir múltiples líneas, puedes declarar la descripción de la *path operation* en la docstring de la función y **FastAPI** la leerá desde allí. -Puedes escribir Markdown en el docstring, se interpretará y mostrará correctamente (teniendo en cuenta la indentación del docstring). +Puedes escribir [Markdown](https://en.wikipedia.org/wiki/Markdown) en el docstring, se interpretará y mostrará correctamente (teniendo en cuenta la indentación del docstring). {* ../../docs_src/path_operation_configuration/tutorial004_py310.py hl[17:25] *} diff --git a/docs/es/docs/tutorial/path-params-numeric-validations.md b/docs/es/docs/tutorial/path-params-numeric-validations.md index 3a38d1d63c..5e7b9a9782 100644 --- a/docs/es/docs/tutorial/path-params-numeric-validations.md +++ b/docs/es/docs/tutorial/path-params-numeric-validations.md @@ -14,7 +14,7 @@ FastAPI agregó soporte para `Annotated` (y comenzó a recomendar su uso) en la Si tienes una versión anterior, obtendrás errores al intentar usar `Annotated`. -Asegúrate de [Actualizar la versión de FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} a al menos la 0.95.1 antes de usar `Annotated`. +Asegúrate de [Actualizar la versión de FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions) a al menos la 0.95.1 antes de usar `Annotated`. /// @@ -122,7 +122,7 @@ Y lo mismo para lt. ## Resumen { #recap } -Con `Query`, `Path` (y otros que aún no has visto) puedes declarar metadatos y validaciones de string de las mismas maneras que con [Parámetros de Query y Validaciones de String](query-params-str-validations.md){.internal-link target=_blank}. +Con `Query`, `Path` (y otros que aún no has visto) puedes declarar metadatos y validaciones de string de las mismas maneras que con [Parámetros de Query y Validaciones de String](query-params-str-validations.md). Y también puedes declarar validaciones numéricas: diff --git a/docs/es/docs/tutorial/path-params.md b/docs/es/docs/tutorial/path-params.md index 8dc3db351d..f1aa4ef8b4 100644 --- a/docs/es/docs/tutorial/path-params.md +++ b/docs/es/docs/tutorial/path-params.md @@ -6,7 +6,7 @@ Puedes declarar "parámetros" o "variables" de path con la misma sintaxis que se El valor del parámetro de path `item_id` se pasará a tu función como el argumento `item_id`. -Así que, si ejecutas este ejemplo y vas a http://127.0.0.1:8000/items/foo, verás un response de: +Así que, si ejecutas este ejemplo y vas a [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo), verás un response de: ```JSON {"item_id":"foo"} @@ -28,7 +28,7 @@ Esto te dará soporte del editor dentro de tu función, con chequeo de errores, ## Conversión de datos { #data-conversion } -Si ejecutas este ejemplo y abres tu navegador en http://127.0.0.1:8000/items/3, verás un response de: +Si ejecutas este ejemplo y abres tu navegador en [http://127.0.0.1:8000/items/3](http://127.0.0.1:8000/items/3), verás un response de: ```JSON {"item_id":3} @@ -44,7 +44,7 @@ Entonces, con esa declaración de tipo, **FastAPI** te ofrece http://127.0.0.1:8000/items/foo, verás un bonito error HTTP de: +Pero si vas al navegador en [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo), verás un bonito error HTTP de: ```JSON { @@ -64,7 +64,7 @@ Pero si vas al navegador en http://127.0.0.1:8000/items/4.2 +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 @@ -78,7 +78,7 @@ Esto es increíblemente útil mientras desarrollas y depuras código que interac ## Documentación { #documentation } -Y cuando abras tu navegador en http://127.0.0.1:8000/docs, verás una documentación de API automática e interactiva como: +Y cuando abras tu navegador en [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs), verás una documentación de API automática e interactiva como: @@ -92,9 +92,9 @@ Nota que el parámetro de path está declarado como un entero. ## Beneficios basados en estándares, documentación alternativa { #standards-based-benefits-alternative-documentation } -Y porque el esquema generado es del estándar OpenAPI, hay muchas herramientas compatibles. +Y porque el esquema generado es del estándar [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md), hay muchas herramientas compatibles. -Debido a esto, el propio **FastAPI** proporciona una documentación de API alternativa (usando ReDoc), a la cual puedes acceder en http://127.0.0.1:8000/redoc: +Debido a esto, el propio **FastAPI** proporciona una documentación de API alternativa (usando ReDoc), a la cual puedes acceder en [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc): @@ -102,7 +102,7 @@ De la misma manera, hay muchas herramientas compatibles. Incluyendo herramientas ## Pydantic { #pydantic } -Toda la validación de datos se realiza internamente con Pydantic, así que obtienes todos los beneficios de esta. Y sabes que estás en buenas manos. +Toda la validación de datos se realiza internamente con [Pydantic](https://docs.pydantic.dev/), así que obtienes todos los beneficios de esta. Y sabes que estás en buenas manos. Puedes usar las mismas declaraciones de tipo con `str`, `float`, `bool` y muchos otros tipos de datos complejos. diff --git a/docs/es/docs/tutorial/query-params-str-validations.md b/docs/es/docs/tutorial/query-params-str-validations.md index b4339e1931..44beba2d3e 100644 --- a/docs/es/docs/tutorial/query-params-str-validations.md +++ b/docs/es/docs/tutorial/query-params-str-validations.md @@ -35,13 +35,13 @@ FastAPI añadió soporte para `Annotated` (y empezó a recomendarlo) en la versi Si tienes una versión más antigua, obtendrás errores al intentar usar `Annotated`. -Asegúrate de [Actualizar la versión de FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} a al menos 0.95.1 antes de usar `Annotated`. +Asegúrate de [Actualizar la versión de FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions) a al menos 0.95.1 antes de usar `Annotated`. /// ## Usar `Annotated` en el tipo del parámetro `q` { #use-annotated-in-the-type-for-the-q-parameter } -¿Recuerdas que te dije antes que `Annotated` puede usarse para agregar metadatos a tus parámetros en la [Introducción a Tipos de Python](../python-types.md#type-hints-with-metadata-annotations){.internal-link target=_blank}? +¿Recuerdas que te dije antes que `Annotated` puede usarse para agregar metadatos a tus parámetros en la [Introducción a Tipos de Python](../python-types.md#type-hints-with-metadata-annotations)? Ahora es el momento de usarlo con FastAPI. 🚀 @@ -158,7 +158,7 @@ Podrías llamar a esa misma función en otros lugares sin FastAPI, y funcionarí 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. -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. 🚀 +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/). 🚀 ## Agregar más validaciones { #add-more-validations } @@ -296,9 +296,9 @@ También puedes usar `list` directamente en lugar de `list[str]`: /// note | Nota -Ten en cuenta que en este caso, FastAPI no comprobará el contenido de la lista. +Ten en cuenta que en este caso, FastAPI no comprobará el contenido de la list. -Por ejemplo, `list[int]` comprobaría (y documentaría) que el contenido de la lista son enteros. Pero `list` sola no lo haría. +Por ejemplo, `list[int]` comprobaría (y documentaría) que el contenido de la list son enteros. Pero `list` sola no lo haría. /// @@ -370,11 +370,11 @@ Podría haber casos donde necesites hacer alguna validación personalizada que n En esos casos, puedes usar una función validadora personalizada que se aplique después de la validación normal (por ejemplo, después de validar que el valor es un `str`). -Puedes lograr eso usando `AfterValidator` de Pydantic dentro de `Annotated`. +Puedes lograr eso usando [`AfterValidator` de Pydantic](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) dentro de `Annotated`. /// tip | Consejo -Pydantic también tiene `BeforeValidator` y otros. 🤓 +Pydantic también tiene [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator) y otros. 🤓 /// diff --git a/docs/es/docs/tutorial/query-params.md b/docs/es/docs/tutorial/query-params.md index edbe51a0ea..2dbb04ef45 100644 --- a/docs/es/docs/tutorial/query-params.md +++ b/docs/es/docs/tutorial/query-params.md @@ -182,6 +182,6 @@ En este caso, hay 3 parámetros de query: /// tip | Consejo -También podrías usar `Enum`s de la misma manera que con [Parámetros de Path](path-params.md#predefined-values){.internal-link target=_blank}. +También podrías usar `Enum`s de la misma manera que con [Parámetros de Path](path-params.md#predefined-values). /// diff --git a/docs/es/docs/tutorial/request-files.md b/docs/es/docs/tutorial/request-files.md index 717968d741..8bfc7a772e 100644 --- a/docs/es/docs/tutorial/request-files.md +++ b/docs/es/docs/tutorial/request-files.md @@ -4,9 +4,9 @@ Puedes definir archivos que serán subidos por el cliente utilizando `File`. /// info | Información -Para recibir archivos subidos, primero instala `python-multipart`. +Para recibir archivos subidos, primero instala [`python-multipart`](https://github.com/Kludex/python-multipart). -Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, activarlo y luego instalarlo, por ejemplo: +Asegúrate de crear un [entorno virtual](../virtual-environments.md), activarlo y luego instalarlo, por ejemplo: ```console $ pip install python-multipart @@ -63,8 +63,8 @@ Usar `UploadFile` tiene varias ventajas sobre `bytes`: * Un archivo almacenado en memoria hasta un límite de tamaño máximo, y después de superar este límite, se almacenará en el disco. * Esto significa que funcionará bien para archivos grandes como imágenes, videos, binarios grandes, etc. sin consumir toda la memoria. * Puedes obtener metadatos del archivo subido. -* Tiene una interfaz `async` parecida a un archivo. -* Expone un objeto Python real `SpooledTemporaryFile` que puedes pasar directamente a otros paquetes que esperan un objeto parecido a un archivo. +* Tiene una interfaz `async` [parecida a un archivo](https://docs.python.org/3/glossary.html#term-file-like-object). +* Expone un objeto Python real [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) que puedes pasar directamente a otros paquetes que esperan un objeto parecido a un archivo. ### `UploadFile` { #uploadfile } @@ -72,7 +72,7 @@ Usar `UploadFile` tiene varias ventajas sobre `bytes`: * `filename`: Un `str` con el nombre original del archivo que fue subido (por ejemplo, `myimage.jpg`). * `content_type`: Un `str` con el tipo de contenido (MIME type / media type) (por ejemplo, `image/jpeg`). -* `file`: Un `SpooledTemporaryFile` (un objeto parecido a un archivo). Este es el objeto de archivo Python real que puedes pasar directamente a otras funciones o paquetes que esperan un objeto "parecido a un archivo". +* `file`: Un [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) (un objeto [parecido a un archivo](https://docs.python.org/3/glossary.html#term-file-like-object)). Este es el objeto de archivo Python real que puedes pasar directamente a otras funciones o paquetes que esperan un objeto "parecido a un archivo". `UploadFile` tiene los siguientes métodos `async`. Todos ellos llaman a los métodos correspondientes del archivo por debajo (usando el `SpooledTemporaryFile` interno). @@ -111,7 +111,7 @@ El `UploadFile` de **FastAPI** hereda directamente del `UploadFile` de **Starlet ## Qué es "Form Data" { #what-is-form-data } -La manera en que los forms de HTML (`
`) envían los datos al servidor normalmente utiliza una codificación "especial" para esos datos, es diferente de JSON. +La manera en que los formularios de HTML (`
`) envían los datos al servidor normalmente utiliza una codificación "especial" para esos datos, es diferente de JSON. **FastAPI** se asegurará de leer esos datos del lugar correcto en lugar de JSON. @@ -121,7 +121,7 @@ Los datos de los forms normalmente se codifican usando el "media type" `applicat 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. -Si deseas leer más sobre estas codificaciones y campos de formularios, dirígete a la MDN web docs para POST. +Si deseas leer más sobre estas codificaciones y campos de formularios, dirígete a la [MDN web docs para `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). /// diff --git a/docs/es/docs/tutorial/request-form-models.md b/docs/es/docs/tutorial/request-form-models.md index 9afadf0b2e..b20421bd01 100644 --- a/docs/es/docs/tutorial/request-form-models.md +++ b/docs/es/docs/tutorial/request-form-models.md @@ -4,9 +4,9 @@ Puedes usar **modelos de Pydantic** para declarar **campos de formulario** en Fa /// info | Información -Para usar formularios, primero instala `python-multipart`. +Para usar formularios, primero instala [`python-multipart`](https://github.com/Kludex/python-multipart). -Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, activarlo, y luego instalarlo, por ejemplo: +Asegúrate de crear un [entorno virtual](../virtual-environments.md), activarlo, y luego instalarlo, por ejemplo: ```console $ pip install 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 738a2bc4b4..f7b5000b7c 100644 --- a/docs/es/docs/tutorial/request-forms-and-files.md +++ b/docs/es/docs/tutorial/request-forms-and-files.md @@ -4,9 +4,9 @@ Puedes definir archivos y campos de formulario al mismo tiempo usando `File` y ` /// info | Información -Para recibir archivos subidos y/o form data, primero instala `python-multipart`. +Para recibir archivos subidos y/o form data, primero instala [`python-multipart`](https://github.com/Kludex/python-multipart). -Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, actívalo y luego instálalo, por ejemplo: +Asegúrate de crear un [entorno virtual](../virtual-environments.md), actívalo y luego instálalo, por ejemplo: ```console $ pip install python-multipart diff --git a/docs/es/docs/tutorial/request-forms.md b/docs/es/docs/tutorial/request-forms.md index cc29296eed..7b78aee69a 100644 --- a/docs/es/docs/tutorial/request-forms.md +++ b/docs/es/docs/tutorial/request-forms.md @@ -4,9 +4,9 @@ Cuando necesitas recibir campos de formulario en lugar de JSON, puedes usar `For /// info | Información -Para usar formularios, primero instala `python-multipart`. +Para usar formularios, primero instala [`python-multipart`](https://github.com/Kludex/python-multipart). -Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, activarlo, y luego instalarlo, por ejemplo: +Asegúrate de crear un [entorno virtual](../virtual-environments.md), activarlo, y luego instalarlo, por ejemplo: ```console $ pip install python-multipart @@ -56,7 +56,7 @@ Los datos de formularios normalmente se codifican usando el "media type" `applic Pero cuando el formulario incluye archivos, se codifica como `multipart/form-data`. Leerás sobre la gestión de archivos en el próximo capítulo. -Si quieres leer más sobre estas codificaciones y campos de formulario, dirígete a la MDN web docs para POST. +Si quieres leer más sobre estas codificaciones y campos de formulario, dirígete a las [MDN web docs para `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). /// diff --git a/docs/es/docs/tutorial/response-model.md b/docs/es/docs/tutorial/response-model.md index c9e931d477..fc9028bee8 100644 --- a/docs/es/docs/tutorial/response-model.md +++ b/docs/es/docs/tutorial/response-model.md @@ -13,6 +13,7 @@ FastAPI usará este tipo de retorno para: * Agregar un **JSON Schema** para el response, en la *path operation* de OpenAPI. * Esto será utilizado por la **documentación automática**. * También será utilizado por herramientas de generación automática de código de cliente. +* **Serializar** los datos devueltos a JSON usando Pydantic, que está escrito en **Rust**, por lo que será **mucho más rápido**. Pero lo más importante: @@ -73,9 +74,9 @@ Aquí estamos declarando un modelo `UserIn`, contendrá una contraseña en texto /// info | Información -Para usar `EmailStr`, primero instala `email-validator`. +Para usar `EmailStr`, primero instala [`email-validator`](https://github.com/JoshData/python-email-validator). -Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, activarlo, y luego instalarlo, por ejemplo: +Asegúrate de crear un [entorno virtual](../virtual-environments.md), activarlo, y luego instalarlo, por ejemplo: ```console $ pip install email-validator @@ -181,7 +182,7 @@ Podría haber casos en los que devuelvas algo que no es un campo válido de Pyda ### Devolver un Response Directamente { #return-a-response-directly } -El caso más común sería [devolver un Response directamente como se explica más adelante en la documentación avanzada](../advanced/response-directly.md){.internal-link target=_blank}. +El caso más común sería [devolver un Response directamente como se explica más adelante en la documentación avanzada](../advanced/response-directly.md). {* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *} @@ -257,7 +258,7 @@ También puedes usar: * `response_model_exclude_defaults=True` * `response_model_exclude_none=True` -como se describe en la documentación de Pydantic para `exclude_defaults` y `exclude_none`. +como se describe en [la documentación de Pydantic](https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict) para `exclude_defaults` y `exclude_none`. /// diff --git a/docs/es/docs/tutorial/response-status-code.md b/docs/es/docs/tutorial/response-status-code.md index 35235eb883..a070819bb1 100644 --- a/docs/es/docs/tutorial/response-status-code.md +++ b/docs/es/docs/tutorial/response-status-code.md @@ -20,7 +20,7 @@ El parámetro `status_code` recibe un número con el código de estado HTTP. /// info | Información -`status_code` también puede recibir un `IntEnum`, como por ejemplo el `http.HTTPStatus` de Python. +`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. /// @@ -66,7 +66,7 @@ En breve: /// tip | Consejo -Para saber más sobre cada código de estado y qué código es para qué, revisa la documentación de MDN sobre códigos de estado HTTP. +Para saber más sobre cada código de estado y qué código es para qué, revisa la [documentación de MDN sobre códigos de estado HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status). /// @@ -98,4 +98,4 @@ También podrías usar `from starlette import status`. ## Cambiando el valor por defecto { #changing-the-default } -Más adelante, en la [Guía de Usuario Avanzada](../advanced/response-change-status-code.md){.internal-link target=_blank}, verás cómo devolver un código de estado diferente al valor por defecto que estás declarando aquí. +Más adelante, en la [Guía de Usuario Avanzada](../advanced/response-change-status-code.md), verás cómo devolver un código de estado diferente al valor por defecto que estás declarando aquí. diff --git a/docs/es/docs/tutorial/schema-extra-example.md b/docs/es/docs/tutorial/schema-extra-example.md index 9af8261380..73d0cdbe46 100644 --- a/docs/es/docs/tutorial/schema-extra-example.md +++ b/docs/es/docs/tutorial/schema-extra-example.md @@ -1,4 +1,4 @@ -# Declarar Ejemplos de Request { #declare-request-example-data } +# Declarar Datos de Ejemplo de Request { #declare-request-example-data } Puedes declarar ejemplos de los datos que tu aplicación puede recibir. @@ -12,7 +12,7 @@ Puedes declarar `examples` para un modelo de Pydantic que se añadirá al JSON S Esa información extra se añadirá tal cual al **JSON Schema** resultante para ese modelo, y se usará en la documentación de la API. -Puedes usar el atributo `model_config` que toma un `dict` como se describe en la documentación de Pydantic: Configuración. +Puedes usar el atributo `model_config` que toma un `dict` como se describe en [Documentación de Pydantic: Configuración](https://docs.pydantic.dev/latest/api/config/). Puedes establecer `"json_schema_extra"` con un `dict` que contenga cualquier dato adicional que te gustaría que aparezca en el JSON Schema generado, incluyendo `examples`. @@ -145,12 +145,12 @@ JSON Schema no tenía `examples`, así que OpenAPI añadió su propio campo `exa OpenAPI también añadió los campos `example` y `examples` a otras partes de la especificación: -* `Parameter Object` (en la especificación) que era usado por FastAPI: +* [`Parameter Object` (en la especificación)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object) que era usado por FastAPI: * `Path()` * `Query()` * `Header()` * `Cookie()` -* `Request Body Object`, en el campo `content`, sobre el `Media Type Object` (en la especificación) que era usado por FastAPI: +* [`Request Body Object`, en el campo `content`, sobre el `Media Type Object` (en la especificación)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object) que era usado por FastAPI: * `Body()` * `File()` * `Form()` @@ -163,7 +163,7 @@ Este viejo parámetro `examples` específico de OpenAPI ahora es `openapi_exampl ### Campo `examples` de JSON Schema { #json-schemas-examples-field } -Pero luego JSON Schema añadió un campo `examples` a una nueva versión de la especificación. +Pero luego JSON Schema añadió un [campo `examples`](https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5) a una nueva versión de la especificación. Y entonces el nuevo OpenAPI 3.1.0 se basó en la última versión (JSON Schema 2020-12) que incluía este nuevo campo `examples`. diff --git a/docs/es/docs/tutorial/security/first-steps.md b/docs/es/docs/tutorial/security/first-steps.md index 909f14765c..8118906e5d 100644 --- a/docs/es/docs/tutorial/security/first-steps.md +++ b/docs/es/docs/tutorial/security/first-steps.md @@ -26,11 +26,11 @@ Copia el ejemplo en un archivo `main.py`: /// info | Información -El paquete `python-multipart` se instala automáticamente con **FastAPI** cuando ejecutas el comando `pip install "fastapi[standard]"`. +El paquete [`python-multipart`](https://github.com/Kludex/python-multipart) se instala automáticamente con **FastAPI** cuando ejecutas el comando `pip install "fastapi[standard]"`. Sin embargo, si usas el comando `pip install fastapi`, el paquete `python-multipart` no se incluye por defecto. -Para instalarlo manualmente, asegúrate de crear un [entorno virtual](../../virtual-environments.md){.internal-link target=_blank}, activarlo, y luego instalarlo con: +Para instalarlo manualmente, asegúrate de crear un [entorno virtual](../../virtual-environments.md), activarlo, y luego instalarlo con: ```console $ pip install python-multipart @@ -45,7 +45,7 @@ Ejecuta el ejemplo con:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -54,7 +54,7 @@ $ fastapi dev main.py ## Revisa { #check-it } -Ve a la documentación interactiva en: http://127.0.0.1:8000/docs. +Ve a la documentación interactiva en: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Verás algo así: @@ -140,7 +140,7 @@ Aquí `tokenUrl="token"` se refiere a una URL relativa `token` que aún no hemos Porque estamos usando una URL relativa, si tu API estuviera ubicada en `https://example.com/`, entonces se referiría a `https://example.com/token`. Pero si tu API estuviera ubicada en `https://example.com/api/v1/`, entonces se referiría a `https://example.com/api/v1/token`. -Usar una URL relativa es importante para asegurarse de que tu aplicación siga funcionando incluso en un caso de uso avanzado como [Detrás de un Proxy](../../advanced/behind-a-proxy.md){.internal-link target=_blank}. +Usar una URL relativa es importante para asegurarse de que tu aplicación siga funcionando incluso en un caso de uso avanzado como [Detrás de un Proxy](../../advanced/behind-a-proxy.md). /// diff --git a/docs/es/docs/tutorial/security/oauth2-jwt.md b/docs/es/docs/tutorial/security/oauth2-jwt.md index e481fb6462..af1140d1ba 100644 --- a/docs/es/docs/tutorial/security/oauth2-jwt.md +++ b/docs/es/docs/tutorial/security/oauth2-jwt.md @@ -24,13 +24,13 @@ De esta manera, puedes crear un token con una expiración de, digamos, 1 semana. Después de una semana, el token estará expirado y el usuario no estará autorizado y tendrá que iniciar sesión nuevamente para obtener un nuevo token. Y si el usuario (o un tercero) intenta modificar el token para cambiar la expiración, podrás descubrirlo, porque las firmas no coincidirían. -Si quieres jugar con tokens JWT y ver cómo funcionan, revisa https://jwt.io. +Si quieres jugar con tokens JWT y ver cómo funcionan, revisa [https://jwt.io](https://jwt.io/). ## Instalar `PyJWT` { #install-pyjwt } Necesitamos instalar `PyJWT` para generar y verificar los tokens JWT en Python. -Asegúrate de crear un [entorno virtual](../../virtual-environments.md){.internal-link target=_blank}, activarlo y luego instalar `pyjwt`: +Asegúrate de crear un [entorno virtual](../../virtual-environments.md), activarlo y luego instalar `pyjwt`:
@@ -46,7 +46,7 @@ $ pip install pyjwt Si planeas usar algoritmos de firma digital como RSA o ECDSA, deberías instalar la dependencia del paquete de criptografía `pyjwt[crypto]`. -Puedes leer más al respecto en la documentación de instalación de PyJWT. +Puedes leer más al respecto en la [documentación de instalación de PyJWT](https://pyjwt.readthedocs.io/en/latest/installation.html). /// @@ -72,7 +72,7 @@ Soporta muchos algoritmos de hashing seguros y utilidades para trabajar con ello El algoritmo recomendado es "Argon2". -Asegúrate de crear un [entorno virtual](../../virtual-environments.md){.internal-link target=_blank}, activarlo y luego instalar pwdlib con Argon2: +Asegúrate de crear un [entorno virtual](../../virtual-environments.md), activarlo y luego instalar pwdlib con Argon2:
@@ -200,7 +200,7 @@ Lo importante a tener en cuenta es que la clave `sub` debería tener un identifi ## Revisa { #check-it } -Ejecuta el servidor y ve a la documentación: http://127.0.0.1:8000/docs. +Ejecuta el servidor y ve a la documentación: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Verás la interfaz de usuario como: diff --git a/docs/es/docs/tutorial/security/simple-oauth2.md b/docs/es/docs/tutorial/security/simple-oauth2.md index ac3d9e2975..15c7146bd7 100644 --- a/docs/es/docs/tutorial/security/simple-oauth2.md +++ b/docs/es/docs/tutorial/security/simple-oauth2.md @@ -146,7 +146,7 @@ UserInDB( /// info | Información -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){.internal-link target=_blank}. +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). /// @@ -216,7 +216,7 @@ Ese es el beneficio de los estándares... ## Verlo en acción { #see-it-in-action } -Abre la documentación interactiva: http://127.0.0.1:8000/docs. +Abre la documentación interactiva: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). ### Autenticar { #authenticate } diff --git a/docs/es/docs/tutorial/server-sent-events.md b/docs/es/docs/tutorial/server-sent-events.md new file mode 100644 index 0000000000..0a008c0de6 --- /dev/null +++ b/docs/es/docs/tutorial/server-sent-events.md @@ -0,0 +1,120 @@ +# Server-Sent Events (SSE) { #server-sent-events-sse } + +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 + +Añadido en FastAPI 0.135.0. + +/// + +## ¿Qué son los Server-Sent Events? { #what-are-server-sent-events } + +SSE es un estándar para hacer streaming de datos desde el servidor al cliente sobre HTTP. + +Cada evento es un pequeño bloque de texto con “campos” como `data`, `event`, `id` y `retry`, separados por líneas en blanco. + +Se ve así: + +``` +data: {"name": "Portal Gun", "price": 999.99} + +data: {"name": "Plumbus", "price": 32.99} + +``` + +SSE se usa comúnmente para streaming de chat de IA, notificaciones en vivo, logs y observabilidad, y otros casos donde el servidor envía actualizaciones al cliente. + +/// tip | Consejo + +Si quieres hacer streaming de datos binarios, por ejemplo video o audio, Revisa la guía avanzada: [Stream Data](../advanced/stream-data.md). + +/// + +## Streaming de SSE con FastAPI { #stream-sse-with-fastapi } + +Para hacer streaming de SSE con FastAPI, usa `yield` en tu path operation function y establece `response_class=EventSourceResponse`. + +import `EventSourceResponse` de `fastapi.sse`: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[4,22] *} + +Cada ítem producido con `yield` se codifica como JSON y se envía en el campo `data:` de un evento SSE. + +Si declaras el tipo de retorno como `AsyncIterable[Item]`, FastAPI lo usará para **validar**, **documentar** y **serializar** los datos usando Pydantic. + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[10:12,23] *} + +/// tip | Consejo + +Como Pydantic lo serializará en el lado de **Rust**, obtendrás un **rendimiento** mucho mayor que si no declaras un tipo de retorno. + +/// + +### No async *path operation functions* { #non-async-path-operation-functions } + +También puedes usar funciones `def` normales (sin `async`), y usar `yield` de la misma manera. + +FastAPI se asegurará de ejecutarlo correctamente para que no bloquee el event loop. + +Como en este caso la función no es async, el tipo de retorno correcto sería `Iterable[Item]`: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[28:31] hl[29] *} + +### Sin tipo de retorno { #no-return-type } + +También puedes omitir el tipo de retorno. FastAPI usará el [`jsonable_encoder`](./encoder.md) para convertir los datos y enviarlos. + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[34:37] hl[35] *} + +## `ServerSentEvent` { #serversentevent } + +Si necesitas configurar campos SSE como `event`, `id`, `retry` o `comment`, puedes hacer `yield` de objetos `ServerSentEvent` en lugar de datos simples. + +import `ServerSentEvent` de `fastapi.sse`: + +{* ../../docs_src/server_sent_events/tutorial002_py310.py hl[4,26] *} + +El campo `data` siempre se codifica como JSON. Puedes pasar cualquier valor que pueda serializarse como JSON, incluidos modelos de Pydantic. + +## Datos sin procesar { #raw-data } + +Si necesitas enviar datos **sin** codificarlos a JSON, usa `raw_data` en lugar de `data`. + +Esto es útil para enviar texto preformateado, líneas de log, o valores especiales de "centinela" como `[DONE]`. + +{* ../../docs_src/server_sent_events/tutorial003_py310.py hl[17] *} + +/// note | Nota + +`data` y `raw_data` son mutuamente excluyentes. Solo puedes establecer uno de ellos en cada `ServerSentEvent`. + +/// + +## Reanudar con `Last-Event-ID` { #resuming-with-last-event-id } + +Cuando un navegador se reconecta después de una caída de la conexión, envía el último `id` recibido en el header `Last-Event-ID`. + +Puedes leerlo como un parámetro de header y usarlo para reanudar el stream desde donde el cliente se quedó: + +{* ../../docs_src/server_sent_events/tutorial004_py310.py hl[25,27,31] *} + +## SSE con `POST` { #sse-with-post } + +SSE funciona con **cualquier método HTTP**, no solo con `GET`. + +Esto es útil para protocolos como [MCP](https://modelcontextprotocol.io) que hacen streaming de SSE sobre `POST`: + +{* ../../docs_src/server_sent_events/tutorial005_py310.py hl[14] *} + +## Detalles técnicos { #technical-details } + +FastAPI implementa algunas mejores prácticas de SSE desde el primer momento. + +- Enviar un comentario de **"keep alive" `ping`** cada 15 segundos cuando no ha habido ningún mensaje, para evitar que algunos proxies cierren la conexión, como se sugiere en la [Especificación HTML: Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes). +- Configurar el header `Cache-Control: no-cache` para **evitar el almacenamiento en caché** del stream. +- Configurar un header especial `X-Accel-Buffering: no` para **evitar el buffering** en algunos proxies como Nginx. + +No tienes que hacer nada, funciona tal cual viene. 🤓 diff --git a/docs/es/docs/tutorial/sql-databases.md b/docs/es/docs/tutorial/sql-databases.md index b57ebdbbe5..7131716ee8 100644 --- a/docs/es/docs/tutorial/sql-databases.md +++ b/docs/es/docs/tutorial/sql-databases.md @@ -2,9 +2,9 @@ **FastAPI** no requiere que uses una base de datos SQL (relacional). Pero puedes utilizar **cualquier base de datos** que desees. -Aquí veremos un ejemplo usando SQLModel. +Aquí veremos un ejemplo usando [SQLModel](https://sqlmodel.tiangolo.com/). -**SQLModel** está construido sobre SQLAlchemy y Pydantic. Fue creado por el mismo autor de **FastAPI** para ser la combinación perfecta para aplicaciones de FastAPI que necesiten usar **bases de datos SQL**. +**SQLModel** está construido sobre [SQLAlchemy](https://www.sqlalchemy.org/) y Pydantic. Fue creado por el mismo autor de **FastAPI** para ser la combinación perfecta para aplicaciones de FastAPI que necesiten usar **bases de datos SQL**. /// tip | Consejo @@ -26,15 +26,15 @@ Más adelante, para tu aplicación en producción, es posible que desees usar un /// tip | Consejo -Hay un generador de proyectos oficial con **FastAPI** y **PostgreSQL** que incluye un frontend y más herramientas: https://github.com/fastapi/full-stack-fastapi-template +Hay un generador de proyectos oficial con **FastAPI** y **PostgreSQL** que incluye un frontend y más herramientas: [https://github.com/fastapi/full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template) /// -Este es un tutorial muy simple y corto, si deseas aprender sobre bases de datos en general, sobre SQL o más funcionalidades avanzadas, ve a la documentación de SQLModel. +Este es un tutorial muy simple y corto, si deseas aprender sobre bases de datos en general, sobre SQL o más funcionalidades avanzadas, ve a la [documentación de SQLModel](https://sqlmodel.tiangolo.com/). ## Instalar `SQLModel` { #install-sqlmodel } -Primero, asegúrate de crear tu [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, actívalo, y luego instala `sqlmodel`: +Primero, asegúrate de crear tu [entorno virtual](../virtual-environments.md), actívalo, y luego instala `sqlmodel`:
@@ -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 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. @@ -111,7 +111,7 @@ Para producción probablemente usarías un script de migración que se ejecuta a /// tip | Consejo -SQLModel tendrá utilidades de migración envolviendo Alembic, pero por ahora, puedes usar Alembic directamente. +SQLModel tendrá utilidades de migración envolviendo Alembic, pero por ahora, puedes usar [Alembic](https://alembic.sqlalchemy.org/en/latest/) directamente. /// @@ -152,7 +152,7 @@ Puedes ejecutar la aplicación:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -337,7 +337,7 @@ Puedes ejecutar la aplicación de nuevo:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -352,6 +352,6 @@ Si vas a la interfaz de `/docs` de la API, verás que ahora está actualizada, y ## Resumen { #recap } -Puedes usar **SQLModel** para interactuar con una base de datos SQL y simplificar el código con *modelos de datos* y *modelos de tablas*. +Puedes usar [**SQLModel**](https://sqlmodel.tiangolo.com/) para interactuar con una base de datos SQL y simplificar el código con *modelos de datos* y *modelos de tablas*. -Puedes aprender mucho más en la documentación de **SQLModel**, hay un mini tutorial más largo sobre el uso de SQLModel con **FastAPI**. 🚀 +Puedes aprender mucho más en la documentación de **SQLModel**, hay un mini [tutorial más largo sobre el uso de SQLModel con **FastAPI**](https://sqlmodel.tiangolo.com/tutorial/fastapi/). 🚀 diff --git a/docs/es/docs/tutorial/static-files.md b/docs/es/docs/tutorial/static-files.md index 84d2e94a97..b99ed5f9c4 100644 --- a/docs/es/docs/tutorial/static-files.md +++ b/docs/es/docs/tutorial/static-files.md @@ -23,7 +23,7 @@ También podrías usar `from starlette.staticfiles import StaticFiles`. Esto es diferente a usar un `APIRouter`, ya que una aplicación montada es completamente independiente. El OpenAPI y la documentación de tu aplicación principal no incluirán nada de la aplicación montada, etc. -Puedes leer más sobre esto en la [Guía de Usuario Avanzada](../advanced/index.md){.internal-link target=_blank}. +Puedes leer más sobre esto en la [Guía de Usuario Avanzada](../advanced/index.md). ## Detalles { #details } @@ -37,4 +37,4 @@ Todos estos parámetros pueden ser diferentes a "`static`", ajústalos según la ## Más info { #more-info } -Para más detalles y opciones revisa la documentación de Starlette sobre Archivos Estáticos. +Para más detalles y opciones revisa [la documentación de Starlette sobre Archivos Estáticos](https://www.starlette.dev/staticfiles/). diff --git a/docs/es/docs/tutorial/stream-json-lines.md b/docs/es/docs/tutorial/stream-json-lines.md new file mode 100644 index 0000000000..e7fe18f5ea --- /dev/null +++ b/docs/es/docs/tutorial/stream-json-lines.md @@ -0,0 +1,111 @@ +# Transmitir JSON Lines { #stream-json-lines } + +Podrías tener una secuencia de datos que quieras enviar en un "**stream**", podrías hacerlo con **JSON Lines**. + +/// info | Información + +Añadido en FastAPI 0.134.0. + +/// + +## ¿Qué es un Stream? { #what-is-a-stream } + +Hacer "**Streaming**" de datos significa que tu app empezará a enviar ítems de datos al cliente sin esperar a que toda la secuencia de ítems esté lista. + +Entonces, enviará el primer ítem, el cliente lo recibirá y empezará a procesarlo, y tú podrías seguir produciendo el siguiente ítem. + +```mermaid +sequenceDiagram + participant App + participant Client + + App->>App: Produce Item 1 + App->>Client: Send Item 1 + App->>App: Produce Item 2 + Client->>Client: Process Item 1 + App->>Client: Send Item 2 + App->>App: Produce Item 3 + Client->>Client: Process Item 2 + App->>Client: Send Item 3 + Client->>Client: Process Item 3 + Note over App: Keeps producing... + Note over Client: Keeps consuming... +``` + +Incluso podría ser un stream infinito, donde sigues enviando datos. + +## JSON Lines { #json-lines } + +En estos casos, es común enviar "**JSON Lines**", que es un formato donde envías un objeto JSON por línea. + +Una response tendría un tipo de contenido `application/jsonl` (en lugar de `application/json`) y el response body sería algo como: + +```json +{"name": "Plumbus", "description": "A multi-purpose household device."} +{"name": "Portal Gun", "description": "A portal opening device."} +{"name": "Meeseeks Box", "description": "A box that summons a Meeseeks."} +``` + +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 + +El punto importante es que tu app podrá producir cada línea a su turno, mientras el cliente consume las líneas anteriores. + +/// + +/// note | Detalles técnicos + +Como cada objeto JSON estará separado por una nueva línea, no pueden contener caracteres de nueva línea literales en su contenido, pero sí pueden contener nuevas líneas escapadas (`\n`), lo cual es parte del estándar JSON. + +Pero normalmente no tendrás que preocuparte por eso, se hace automáticamente, sigue leyendo. 🤓 + +/// + +## Casos de uso { #use-cases } + +Podrías usar esto para hacer stream de datos desde un servicio de **AI LLM**, desde **logs** o **telemetry**, o desde otros tipos de datos que puedan estructurarse en ítems **JSON**. + +/// tip | Consejo + +Si quieres hacer stream de datos binarios, por ejemplo video o audio, Revisa la guía avanzada: [Transmitir datos](../advanced/stream-data.md). + +/// + +## Transmitir JSON Lines con FastAPI { #stream-json-lines-with-fastapi } + +Para transmitir JSON Lines con FastAPI puedes, en lugar de usar `return` en tu *path operation function*, usar `yield` para producir cada ítem a su turno. + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[24] *} + +Si cada ítem JSON que quieres enviar de vuelta es de tipo `Item` (un modelo de Pydantic) y es una función async, puedes declarar el tipo de retorno como `AsyncIterable[Item]`: + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[9:11,22] *} + +Si declaras el tipo de retorno, FastAPI lo usará para **validar** los datos, **documentarlos** en OpenAPI, **filtrarlos** y **serializarlos** usando Pydantic. + +/// tip | Consejo + +Como Pydantic lo serializará en el lado de **Rust**, obtendrás un **rendimiento** mucho mayor que si no declaras un tipo de retorno. + +/// + +### *path operation functions* no-async { #non-async-path-operation-functions } + +También puedes usar funciones `def` regulares (sin `async`), y usar `yield` de la misma forma. + +FastAPI se asegurará de que se ejecute correctamente para que no bloquee el event loop. + +Como en este caso la función no es async, el tipo de retorno correcto sería `Iterable[Item]`: + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[27:30] hl[28] *} + +### Sin tipo de retorno { #no-return-type } + +También puedes omitir el tipo de retorno. Entonces FastAPI usará [`jsonable_encoder`](./encoder.md) para convertir los datos a algo que se pueda serializar a JSON y luego enviarlo como JSON Lines. + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[33:36] hl[34] *} + +## Server-Sent Events (SSE) { #server-sent-events-sse } + +FastAPI también tiene soporte de primera clase para Server-Sent Events (SSE), que son bastante similares pero con un par de detalles extra. Puedes aprender sobre ellos en el siguiente capítulo: [Eventos enviados por el servidor (SSE)](server-sent-events.md). 🤓 diff --git a/docs/es/docs/tutorial/testing.md b/docs/es/docs/tutorial/testing.md index c477129035..a40d90c5ee 100644 --- a/docs/es/docs/tutorial/testing.md +++ b/docs/es/docs/tutorial/testing.md @@ -1,18 +1,18 @@ # Testing { #testing } -Gracias a Starlette, escribir pruebas para aplicaciones de **FastAPI** es fácil y agradable. +Gracias a [Starlette](https://www.starlette.dev/testclient/), escribir pruebas para aplicaciones de **FastAPI** es fácil y agradable. -Está basado en HTTPX, que a su vez está diseñado basado en Requests, por lo que es muy familiar e intuitivo. +Está basado en [HTTPX](https://www.python-httpx.org), que a su vez está diseñado basado en Requests, por lo que es muy familiar e intuitivo. -Con él, puedes usar pytest directamente con **FastAPI**. +Con él, puedes usar [pytest](https://docs.pytest.org/) directamente con **FastAPI**. ## Usando `TestClient` { #using-testclient } /// info | Información -Para usar `TestClient`, primero instala `httpx`. +Para usar `TestClient`, primero instala [`httpx`](https://www.python-httpx.org). -Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, activarlo y luego instalarlo, por ejemplo: +Asegúrate de crear un [entorno virtual](../virtual-environments.md), activarlo y luego instalarlo, por ejemplo: ```console $ pip install httpx @@ -42,7 +42,7 @@ Esto te permite usar `pytest` directamente sin complicaciones. /// -/// note | Nota Técnica +/// note | Detalles técnicos También podrías usar `from starlette.testclient import TestClient`. @@ -52,7 +52,7 @@ También podrías usar `from starlette.testclient import TestClient`. /// tip | Consejo -Si quieres llamar a funciones `async` en tus pruebas además de enviar requests a tu aplicación FastAPI (por ejemplo, funciones asincrónicas de bases de datos), echa un vistazo a las [Pruebas Asincrónicas](../advanced/async-tests.md){.internal-link target=_blank} en el tutorial avanzado. +Si quieres llamar a funciones `async` en tus pruebas además de enviar requests a tu aplicación FastAPI (por ejemplo, funciones asincrónicas de bases de datos), echa un vistazo a las [Pruebas Asincrónicas](../advanced/async-tests.md) en el tutorial avanzado. /// @@ -64,7 +64,7 @@ Y tu aplicación de **FastAPI** también podría estar compuesta de varios archi ### Archivo de aplicación **FastAPI** { #fastapi-app-file } -Digamos que tienes una estructura de archivos como se describe en [Aplicaciones Más Grandes](bigger-applications.md){.internal-link target=_blank}: +Digamos que tienes una estructura de archivos como se describe en [Aplicaciones Más Grandes](bigger-applications.md): ``` . @@ -75,6 +75,7 @@ Digamos que tienes una estructura de archivos como se describe en [Aplicaciones En el archivo `main.py` tienes tu aplicación de **FastAPI**: + {* ../../docs_src/app_testing/app_a_py310/main.py *} ### Archivo de prueba { #testing-file } @@ -139,13 +140,13 @@ Por ejemplo: * Para pasar *headers*, usa un `dict` en el parámetro `headers`. * Para *cookies*, un `dict` en el parámetro `cookies`. -Para más información sobre cómo pasar datos al backend (usando `httpx` o el `TestClient`) revisa la documentación de HTTPX. +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 Ten en cuenta que el `TestClient` recibe datos que pueden ser convertidos a JSON, no modelos de Pydantic. -Si tienes un modelo de Pydantic en tu prueba y quieres enviar sus datos a la aplicación durante las pruebas, puedes usar el `jsonable_encoder` descrito en [Codificador Compatible con JSON](encoder.md){.internal-link target=_blank}. +Si tienes un modelo de Pydantic en tu prueba y quieres enviar sus datos a la aplicación durante las pruebas, puedes usar el `jsonable_encoder` descrito en [Codificador Compatible con JSON](encoder.md). /// @@ -153,7 +154,7 @@ Si tienes un modelo de Pydantic en tu prueba y quieres enviar sus datos a la apl Después de eso, solo necesitas instalar `pytest`. -Asegúrate de crear un [entorno virtual](../virtual-environments.md){.internal-link target=_blank}, activarlo y luego instalarlo, por ejemplo: +Asegúrate de crear un [entorno virtual](../virtual-environments.md), activarlo y luego instalarlo, por ejemplo:
diff --git a/docs/es/docs/virtual-environments.md b/docs/es/docs/virtual-environments.md index f8839ac6c3..682f9e947c 100644 --- a/docs/es/docs/virtual-environments.md +++ b/docs/es/docs/virtual-environments.md @@ -22,7 +22,7 @@ Un **entorno virtual** es un directorio con algunos archivos en él. Esta página te enseñará cómo usar **entornos virtuales** y cómo funcionan. -Si estás listo para adoptar una **herramienta que gestiona todo** por ti (incluyendo la instalación de Python), prueba uv. +Si estás listo para adoptar una **herramienta que gestiona todo** por ti (incluyendo la instalación de Python), prueba [uv](https://github.com/astral-sh/uv). /// @@ -86,7 +86,7 @@ $ python -m venv .venv //// tab | `uv` -Si tienes instalado `uv`, puedes usarlo para crear un entorno virtual. +Si tienes instalado [`uv`](https://github.com/astral-sh/uv), puedes usarlo para crear un entorno virtual.
@@ -150,7 +150,7 @@ $ .venv\Scripts\Activate.ps1 //// tab | Windows Bash -O si usas Bash para Windows (por ejemplo, Git Bash): +O si usas Bash para Windows (por ejemplo, [Git Bash](https://gitforwindows.org/)):
@@ -216,7 +216,7 @@ Si muestra el binario de `python` en `.venv\Scripts\python`, dentro de tu proyec /// tip | Consejo -Si usas `uv` usarías eso para instalar cosas en lugar de `pip`, por lo que no necesitas actualizar `pip`. 😎 +Si usas [`uv`](https://github.com/astral-sh/uv) usarías eso para instalar cosas en lugar de `pip`, por lo que no necesitas actualizar `pip`. 😎 /// @@ -268,7 +268,7 @@ Si estás usando **Git** (deberías), añade un archivo `.gitignore` para exclui /// tip | Consejo -Si usaste `uv` para crear el entorno virtual, ya lo hizo por ti, puedes saltarte este paso. 😎 +Si usaste [`uv`](https://github.com/astral-sh/uv) para crear el entorno virtual, ya lo hizo por ti, puedes saltarte este paso. 😎 /// @@ -340,7 +340,7 @@ $ pip install "fastapi[standard]" //// tab | `uv` -Si tienes `uv`: +Si tienes [`uv`](https://github.com/astral-sh/uv):
@@ -372,7 +372,7 @@ $ pip install -r requirements.txt //// tab | `uv` -Si tienes `uv`: +Si tienes [`uv`](https://github.com/astral-sh/uv):
@@ -416,8 +416,8 @@ Probablemente usarías un editor, asegúrate de configurarlo para que use el mis Por ejemplo: -* VS Code -* PyCharm +* [VS Code](https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment) +* [PyCharm](https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html) /// tip | Consejo @@ -453,7 +453,7 @@ Continúa leyendo. 👇🤓 ## Por qué Entornos Virtuales { #why-virtual-environments } -Para trabajar con FastAPI necesitas instalar Python. +Para trabajar con FastAPI necesitas instalar [Python](https://www.python.org/). Después de eso, necesitarías **instalar** FastAPI y cualquier otro **paquete** que desees usar. @@ -562,7 +562,7 @@ $ pip install "fastapi[standard]"
-Eso descargará un archivo comprimido con el código de FastAPI, normalmente desde PyPI. +Eso descargará un archivo comprimido con el código de FastAPI, normalmente desde [PyPI](https://pypi.org/project/fastapi/). También **descargará** archivos para otros paquetes de los que depende FastAPI. @@ -625,7 +625,7 @@ $ .venv\Scripts\Activate.ps1 //// tab | Windows Bash -O si usas Bash para Windows (por ejemplo, Git Bash): +O si usas Bash para Windows (por ejemplo, [Git Bash](https://gitforwindows.org/)):
@@ -637,13 +637,13 @@ $ source .venv/Scripts/activate //// -Ese comando creará o modificará algunas [variables de entorno](environment-variables.md){.internal-link target=_blank} que estarán disponibles para los siguientes comandos. +Ese comando creará o modificará algunas [variables de entorno](environment-variables.md) que estarán disponibles para los siguientes comandos. Una de esas variables es la variable `PATH`. /// tip | Consejo -Puedes aprender más sobre la variable de entorno `PATH` en la sección [Variables de Entorno](environment-variables.md#path-environment-variable){.internal-link target=_blank}. +Puedes aprender más sobre la variable de entorno `PATH` en la sección [Variables de Entorno](environment-variables.md#path-environment-variable). /// @@ -844,7 +844,7 @@ Esta es una guía simple para comenzar y enseñarte cómo funciona todo **por de Hay muchas **alternativas** para gestionar entornos virtuales, dependencias de paquetes (requisitos), proyectos. -Una vez que estés listo y quieras usar una herramienta para **gestionar todo el proyecto**, dependencias de paquetes, entornos virtuales, etc. Te sugeriría probar uv. +Una vez que estés listo y quieras usar una herramienta para **gestionar todo el proyecto**, dependencias de paquetes, entornos virtuales, etc. Te sugeriría probar [uv](https://github.com/astral-sh/uv). `uv` puede hacer muchas cosas, puede: diff --git a/docs/fr/docs/_llm-test.md b/docs/fr/docs/_llm-test.md index 4fdc677385..74f9c9903c 100644 --- a/docs/fr/docs/_llm-test.md +++ b/docs/fr/docs/_llm-test.md @@ -11,7 +11,7 @@ Utiliser comme suit : * Vérifier si tout est correct dans la traduction. * Si nécessaire, améliorer votre invite spécifique à la langue, l’invite générale, ou le document anglais. * Corriger ensuite manuellement les problèmes restants dans la traduction, afin que ce soit une bonne traduction. -* Retraduire, en ayant la bonne traduction en place. Le résultat idéal serait que le LLM ne fasse plus aucun changement à la traduction. Cela signifie que l’invite générale et votre invite spécifique à la langue sont aussi bonnes que possible (il fera parfois quelques changements apparemment aléatoires, la raison étant que les LLM ne sont pas des algorithmes déterministes). +* Retraduire, en ayant la bonne traduction en place. Le résultat idéal serait que le LLM ne fasse plus aucun changement à la traduction. Cela signifie que l’invite générale et votre invite spécifique à la langue sont aussi bonnes que possible (il fera parfois quelques changements apparemment aléatoires, la raison étant que [les LLM ne sont pas des algorithmes déterministes](https://doublespeak.chat/#/handbook#deterministic-output)). Les tests : @@ -169,15 +169,15 @@ Voir les sections `### Special blocks` et `### Tab blocks` dans l’invite gén Le texte du lien doit être traduit, l’adresse du lien doit rester inchangée : * [Lien vers le titre ci-dessus](#code-snippets) -* [Lien interne](index.md#installation){.internal-link target=_blank} -* Lien externe -* Lien vers une feuille de style -* Lien vers un script -* Lien vers une image +* [Lien interne](index.md#installation) +* [Lien externe](https://sqlmodel.tiangolo.com/) +* [Lien vers une feuille de style](https://fastapi.tiangolo.com/css/styles.css) +* [Lien vers un script](https://fastapi.tiangolo.com/js/logic.js) +* [Lien vers une image](https://fastapi.tiangolo.com/img/foo.jpg) Le texte du lien doit être traduit, l’adresse du lien doit pointer vers la traduction : -* Lien FastAPI +* [Lien FastAPI](https://fastapi.tiangolo.com/fr/) //// @@ -232,7 +232,7 @@ Voir la section `### HTML abbr elements` dans l’invite générale dans `script Bonjour. -### Annotations de type et indications de type { #type-hints-and-annotations } +### Annotations de type et annotations de type { #type-hints-and-annotations } Rebonjour. diff --git a/docs/fr/docs/advanced/additional-responses.md b/docs/fr/docs/advanced/additional-responses.md index a073dec692..e7b684e36c 100644 --- a/docs/fr/docs/advanced/additional-responses.md +++ b/docs/fr/docs/advanced/additional-responses.md @@ -243,5 +243,5 @@ Par exemple: Pour voir exactement ce que vous pouvez inclure dans les réponses, vous pouvez consulter ces sections dans la spécification OpenAPI : -* Objet Responses de OpenAPI, il inclut le `Response Object`. -* Objet Response de OpenAPI, vous pouvez inclure n'importe quoi directement dans chaque réponse à l'intérieur de votre paramètre `responses`. Y compris `description`, `headers`, `content` (à l'intérieur de cela, vous déclarez différents types de médias et schémas JSON) et `links`. +* [Objet Responses de OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#responses-object), il inclut le `Response Object`. +* [Objet Response de OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#response-object), vous pouvez inclure n'importe quoi directement dans chaque réponse à l'intérieur de votre paramètre `responses`. Y compris `description`, `headers`, `content` (à l'intérieur de cela, vous déclarez différents types de médias et schémas JSON) et `links`. diff --git a/docs/fr/docs/advanced/additional-status-codes.md b/docs/fr/docs/advanced/additional-status-codes.md index b9c8ab1136..59e8c3eae9 100644 --- a/docs/fr/docs/advanced/additional-status-codes.md +++ b/docs/fr/docs/advanced/additional-status-codes.md @@ -20,9 +20,9 @@ Pour y parvenir, importez `JSONResponse` et renvoyez-y directement votre contenu Lorsque vous renvoyez une `Response` directement, comme dans l'exemple ci-dessus, elle sera renvoyée directement. -Elle ne sera pas sérialisée avec un modèle. +Elle ne sera pas sérialisée avec un modèle, etc. -Assurez-vous qu'il contient les données souhaitées et que les valeurs sont dans un format JSON valide (si vous utilisez une `JSONResponse`). +Vous devez vous assurer qu'elle contient les données souhaitées et que les valeurs sont dans un format JSON valide (si vous utilisez une `JSONResponse`). /// @@ -30,7 +30,7 @@ Assurez-vous qu'il contient les données souhaitées et que les valeurs sont dan Vous pouvez également utiliser `from starlette.responses import JSONResponse`. -Pour plus de commodités, **FastAPI** fournit les objets `starlette.responses` sous forme d'un alias accessible par `fastapi.responses`. Mais la plupart des réponses disponibles proviennent directement de Starlette. Il en est de même avec `status`. +Par commodité pour vous, le développeur, **FastAPI** fournit les mêmes `starlette.responses` sous la forme de `fastapi.responses`. Mais la plupart des réponses disponibles proviennent directement de Starlette. Il en est de même avec `status`. /// @@ -38,4 +38,4 @@ Pour plus de commodités, **FastAPI** fournit les objets `starlette.responses` s Si vous renvoyez directement des codes HTTP et des réponses supplémentaires, ils ne seront pas inclus dans le schéma OpenAPI (les documents de l'API), car FastAPI n'a aucun moyen de savoir à l'avance ce que vous allez renvoyer. -Mais vous pouvez documenter cela dans votre code, en utilisant : [Réponses supplémentaires](additional-responses.md){.internal-link target=_blank}. +Mais vous pouvez documenter cela dans votre code, en utilisant : [Réponses supplémentaires](additional-responses.md). diff --git a/docs/fr/docs/advanced/advanced-dependencies.md b/docs/fr/docs/advanced/advanced-dependencies.md index 8afd58b48e..d5066ca25a 100644 --- a/docs/fr/docs/advanced/advanced-dependencies.md +++ b/docs/fr/docs/advanced/advanced-dependencies.md @@ -132,7 +132,7 @@ Si vous avez ce cas d’utilisation spécifique avec SQLModel (ou SQLAlchemy), v De cette manière, la session libérera la connexion à la base de données, afin que d’autres requêtes puissent l’utiliser. -Si vous avez un autre cas d’utilisation qui nécessite une sortie anticipée depuis une dépendance avec `yield`, veuillez créer une Question de discussion GitHub avec votre cas spécifique et pourquoi vous bénéficieriez d’une fermeture anticipée pour les dépendances avec `yield`. +Si vous avez un autre cas d’utilisation qui nécessite une sortie anticipée depuis une dépendance avec `yield`, veuillez créer une [Question de discussion GitHub](https://github.com/fastapi/fastapi/discussions/new?category=questions) avec votre cas spécifique et pourquoi vous bénéficieriez d’une fermeture anticipée pour les dépendances avec `yield`. S’il existe des cas d’utilisation convaincants pour une fermeture anticipée dans les dépendances avec `yield`, j’envisagerai d’ajouter une nouvelle façon d’y opter. @@ -144,7 +144,7 @@ Cela a été modifié dans la version 0.110.0 pour corriger une consommation de ### Tâches d'arrière‑plan et dépendances avec `yield`, Détails techniques { #background-tasks-and-dependencies-with-yield-technical-details } -Avant FastAPI 0.106.0, lever des exceptions après `yield` n’était pas possible, le code d’arrêt dans les dépendances avec `yield` s’exécutait après l’envoi de la réponse, donc les [Gestionnaires d'exceptions](../tutorial/handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank} avaient déjà été exécutés. +Avant FastAPI 0.106.0, lever des exceptions après `yield` n’était pas possible, le code d’arrêt dans les dépendances avec `yield` s’exécutait après l’envoi de la réponse, donc les [Gestionnaires d'exceptions](../tutorial/handling-errors.md#install-custom-exception-handlers) avaient déjà été exécutés. Cela avait été conçu ainsi principalement pour permettre d’utiliser les mêmes objets « générés par yield » par les dépendances à l’intérieur de tâches d’arrière‑plan, car le code d’arrêt s’exécutait après la fin des tâches d’arrière‑plan. diff --git a/docs/fr/docs/advanced/async-tests.md b/docs/fr/docs/advanced/async-tests.md index f9cea0ad17..a59d651bad 100644 --- a/docs/fr/docs/advanced/async-tests.md +++ b/docs/fr/docs/advanced/async-tests.md @@ -16,11 +16,11 @@ Même si votre application **FastAPI** utilise des fonctions `def` normales au l Le `TestClient` fait un peu de magie pour appeler l'application FastAPI asynchrone depuis vos fonctions de test `def` normales, en utilisant pytest standard. Mais cette magie ne fonctionne plus lorsque nous l'utilisons dans des fonctions asynchrones. En exécutant nos tests de manière asynchrone, nous ne pouvons plus utiliser le `TestClient` dans nos fonctions de test. -Le `TestClient` est basé sur HTTPX et, heureusement, nous pouvons l'utiliser directement pour tester l'API. +Le `TestClient` est basé sur [HTTPX](https://www.python-httpx.org) et, heureusement, nous pouvons l'utiliser directement pour tester l'API. ## Exemple { #example } -Pour un exemple simple, considérons une structure de fichiers similaire à celle décrite dans [Applications plus grandes](../tutorial/bigger-applications.md){.internal-link target=_blank} et [Tests](../tutorial/testing.md){.internal-link target=_blank} : +Pour un exemple simple, considérons une structure de fichiers similaire à celle décrite dans [Applications plus grandes](../tutorial/bigger-applications.md) et [Tests](../tutorial/testing.md) : ``` . @@ -84,7 +84,7 @@ Notez que nous utilisons async/await avec le nouveau `AsyncClient` — la requê /// warning | Alertes -Si votre application s'appuie sur des événements de cycle de vie (lifespan), le `AsyncClient` ne déclenchera pas ces événements. Pour vous assurer qu'ils sont déclenchés, utilisez `LifespanManager` depuis florimondmanca/asgi-lifespan. +Si votre application s'appuie sur des événements de cycle de vie, l'`AsyncClient` ne déclenchera pas ces événements. Pour vous assurer qu'ils sont déclenchés, utilisez `LifespanManager` depuis [florimondmanca/asgi-lifespan](https://github.com/florimondmanca/asgi-lifespan#usage). /// @@ -94,6 +94,6 @@ Comme la fonction de test est désormais asynchrone, vous pouvez également appe /// tip | Astuce -Si vous rencontrez une erreur `RuntimeError: Task attached to a different loop` lors de l'intégration d'appels de fonctions asynchrones dans vos tests (par exemple en utilisant MotorClient de MongoDB), n'oubliez pas d'instancier les objets qui ont besoin d'une boucle d'événements uniquement dans des fonctions async, par exemple dans un callback `@app.on_event("startup")`. +Si vous rencontrez une erreur `RuntimeError: Task attached to a different loop` lors de l'intégration d'appels de fonctions asynchrones dans vos tests (par exemple en utilisant [MotorClient de MongoDB](https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop)), n'oubliez pas d'instancier les objets qui ont besoin d'une boucle d'événements uniquement dans des fonctions async, par exemple dans un callback `@app.on_event("startup")`. /// diff --git a/docs/fr/docs/advanced/behind-a-proxy.md b/docs/fr/docs/advanced/behind-a-proxy.md index 4b540e1a1d..c53ba40104 100644 --- a/docs/fr/docs/advanced/behind-a-proxy.md +++ b/docs/fr/docs/advanced/behind-a-proxy.md @@ -16,9 +16,9 @@ Mais, par sécurité, comme le serveur ne sait pas qu'il se trouve derrière un Les en-têtes du proxy sont : -* X-Forwarded-For -* X-Forwarded-Proto -* X-Forwarded-Host +* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For) +* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto) +* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host) /// @@ -60,7 +60,7 @@ https://mysuperapp.com/items/ /// tip | Astuce -Si vous voulez en savoir plus sur HTTPS, consultez le guide [À propos de HTTPS](../deployment/https.md){.internal-link target=_blank}. +Si vous voulez en savoir plus sur HTTPS, consultez le guide [À propos de HTTPS](../deployment/https.md). /// @@ -228,7 +228,7 @@ Passer le `root_path` à `FastAPI` équivaut à passer l'option de ligne de comm Gardez à l'esprit que le serveur (Uvicorn) n'utilisera ce `root_path` que pour le transmettre à l'application. -Mais si vous allez avec votre navigateur sur http://127.0.0.1:8000/app, vous verrez la réponse normale : +Mais si vous allez avec votre navigateur sur [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app), vous verrez la réponse normale : ```JSON { @@ -251,9 +251,9 @@ Dans un cas comme celui‑ci (sans préfixe de chemin supprimé), le proxy écou ## Tester localement avec Traefik { #testing-locally-with-traefik } -Vous pouvez facilement faire l'expérience en local avec un préfixe de chemin supprimé en utilisant Traefik. +Vous pouvez facilement faire l'expérience en local avec un préfixe de chemin supprimé en utilisant [Traefik](https://docs.traefik.io/). -Téléchargez Traefik ; c'est un binaire unique, vous pouvez extraire le fichier compressé et l'exécuter directement depuis le terminal. +[Téléchargez Traefik](https://github.com/containous/traefik/releases) ; c'est un binaire unique, vous pouvez extraire le fichier compressé et l'exécuter directement depuis le terminal. Créez ensuite un fichier `traefik.toml` avec : @@ -330,7 +330,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 ### Vérifier les réponses { #check-the-responses } -Maintenant, si vous allez à l'URL avec le port pour Uvicorn : http://127.0.0.1:8000/app, vous verrez la réponse normale : +Maintenant, si vous allez à l'URL avec le port pour Uvicorn : [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app), vous verrez la réponse normale : ```JSON { @@ -345,7 +345,7 @@ Remarquez que même si vous y accédez via `http://127.0.0.1:8000/app`, il affic /// -Et maintenant ouvrez l'URL avec le port pour Traefik, en incluant le préfixe de chemin : http://127.0.0.1:9999/api/v1/app. +Et maintenant ouvrez l'URL avec le port pour Traefik, en incluant le préfixe de chemin : [http://127.0.0.1:9999/api/v1/app](http://127.0.0.1:9999/api/v1/app). Nous obtenons la même réponse : @@ -370,13 +370,13 @@ Mais voici la partie intéressante. ✨ La manière « officielle » d'accéder à l'application serait via le proxy avec le préfixe de chemin que nous avons défini. Donc, comme on s'y attend, si vous essayez l'interface de documentation servie directement par Uvicorn, sans le préfixe de chemin dans l'URL, cela ne fonctionne pas, car elle s'attend à être accédée via le proxy. -Vous pouvez le vérifier sur http://127.0.0.1:8000/docs : +Vous pouvez le vérifier sur [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) : Mais si nous accédons à l'interface de documents à l'URL « officielle » en utilisant le proxy avec le port `9999`, à `/api/v1/docs`, cela fonctionne correctement ! 🎉 -Vous pouvez le vérifier sur http://127.0.0.1:9999/api/v1/docs : +Vous pouvez le vérifier sur [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs) : @@ -429,11 +429,11 @@ Générera un schéma OpenAPI comme : /// tip | Astuce -Remarquez le serveur généré automatiquement avec une valeur `url` de `/api/v1`, reprise depuis le `root_path`. +Remarquez le serveur généré automatiquement avec une valeur `url` de `/api/v1`, repris depuis le `root_path`. /// -Dans l'interface de documents sur http://127.0.0.1:9999/api/v1/docs, cela ressemblera à ceci : +Dans l'interface de documents sur [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs), cela ressemblera à ceci : @@ -461,6 +461,6 @@ et il ne l'inclura alors pas dans le schéma OpenAPI. ## Monter une sous-application { #mounting-a-sub-application } -Si vous avez besoin de monter une sous‑application (comme décrit dans [Sous‑applications - montages](sub-applications.md){.internal-link target=_blank}) tout en utilisant un proxy avec `root_path`, vous pouvez le faire normalement, comme vous vous y attendez. +Si vous avez besoin de monter une sous‑application (comme décrit dans [Sous‑applications - montages](sub-applications.md)) tout en utilisant un proxy avec `root_path`, vous pouvez le faire normalement, comme vous vous y attendez. FastAPI utilisera intelligemment le `root_path` en interne, donc cela fonctionnera simplement. ✨ diff --git a/docs/fr/docs/advanced/custom-response.md b/docs/fr/docs/advanced/custom-response.md index 7eab5b53fc..a1a60ebf64 100644 --- a/docs/fr/docs/advanced/custom-response.md +++ b/docs/fr/docs/advanced/custom-response.md @@ -1,59 +1,43 @@ # Réponse personnalisée - HTML, flux, fichier, autres { #custom-response-html-stream-file-others } -Par défaut, **FastAPI** renverra les réponses en utilisant `JSONResponse`. +Par défaut, **FastAPI** renvoie des réponses JSON. -Vous pouvez le remplacer en renvoyant directement une `Response` comme expliqué dans [Renvoyer directement une Response](response-directly.md){.internal-link target=_blank}. +Vous pouvez le remplacer en renvoyant une `Response` directement comme vu dans [Renvoyer une Response directement](response-directly.md). -Mais si vous renvoyez directement une `Response` (ou n'importe quelle sous-classe, comme `JSONResponse`), les données ne seront pas automatiquement converties (même si vous déclarez un `response_model`), et la documentation ne sera pas générée automatiquement (par exemple, l'inclusion du « media type » dans l'en-tête HTTP `Content-Type` comme partie de l'OpenAPI généré). +Mais si vous renvoyez directement une `Response` (ou n'importe quelle sous-classe, comme `JSONResponse`), les données ne seront pas automatiquement converties (même si vous déclarez un `response_model`), et la documentation ne sera pas générée automatiquement (par exemple, l'inclusion du « media type », dans l'en-tête HTTP `Content-Type` comme partie de l'OpenAPI généré). -Vous pouvez aussi déclarer la `Response` que vous voulez utiliser (par ex. toute sous-classe de `Response`), dans le décorateur de chemin d'accès en utilisant le paramètre `response_class`. +Vous pouvez aussi déclarer la `Response` que vous voulez utiliser (par ex. toute sous-classe de `Response`), dans le décorateur de *chemin d'accès* en utilisant le paramètre `response_class`. -Le contenu que vous renvoyez depuis votre fonction de chemin d'accès sera placé à l'intérieur de cette `Response`. - -Et si cette `Response` a un « media type » JSON (`application/json`), comme c'est le cas avec `JSONResponse` et `UJSONResponse`, les données que vous renvoyez seront automatiquement converties (et filtrées) avec tout `response_model` Pydantic que vous avez déclaré dans le décorateur de chemin d'accès. +Le contenu que vous renvoyez depuis votre *fonction de chemin d'accès* sera placé à l'intérieur de cette `Response`. /// note | Remarque -Si vous utilisez une classe de réponse sans « media type », FastAPI s'attendra à ce que votre réponse n'ait pas de contenu ; il ne documentera donc pas le format de la réponse dans les documents OpenAPI générés. +Si vous utilisez une classe de réponse sans media type, FastAPI s'attendra à ce que votre réponse n'ait pas de contenu ; il ne documentera donc pas le format de la réponse dans la documentation OpenAPI générée. /// -## Utiliser `ORJSONResponse` { #use-orjsonresponse } - -Par exemple, si vous cherchez à maximiser la performance, vous pouvez installer et utiliser `orjson` et définir la réponse sur `ORJSONResponse`. - -Importez la classe (sous-classe) `Response` que vous voulez utiliser et déclarez-la dans le décorateur de chemin d'accès. - -Pour de grandes réponses, renvoyer directement une `Response` est bien plus rapide que de renvoyer un dictionnaire. - -Cela vient du fait que, par défaut, FastAPI inspectera chaque élément et s'assurera qu'il est sérialisable en JSON, en utilisant le même [Encodeur compatible JSON](../tutorial/encoder.md){.internal-link target=_blank} expliqué dans le didacticiel. C'est ce qui vous permet de renvoyer des objets arbitraires, par exemple des modèles de base de données. - -Mais si vous êtes certain que le contenu que vous renvoyez est sérialisable en JSON, vous pouvez le passer directement à la classe de réponse et éviter le surcoût supplémentaire qu'aurait FastAPI en faisant passer votre contenu de retour par le `jsonable_encoder` avant de le transmettre à la classe de réponse. +## Réponses JSON { #json-responses } -{* ../../docs_src/custom_response/tutorial001b_py310.py hl[2,7] *} +Par défaut, FastAPI renvoie des réponses JSON. -/// info - -Le paramètre `response_class` sera aussi utilisé pour définir le « media type » de la réponse. +Si vous déclarez un [Modèle de réponse](../tutorial/response-model.md), FastAPI l'utilisera pour sérialiser les données en JSON, en utilisant Pydantic. -Dans ce cas, l'en-tête HTTP `Content-Type` sera défini à `application/json`. +Si vous ne déclarez pas de modèle de réponse, FastAPI utilisera le `jsonable_encoder` expliqué dans [Encodeur compatible JSON](../tutorial/encoder.md) et le placera dans une `JSONResponse`. -Et il sera documenté comme tel dans OpenAPI. +Si vous déclarez une `response_class` avec un media type JSON (`application/json`), comme c'est le cas avec `JSONResponse`, les données que vous renvoyez seront automatiquement converties (et filtrées) avec tout `response_model` Pydantic que vous avez déclaré dans le décorateur de *chemin d'accès*. Mais les données ne seront pas sérialisées en octets JSON avec Pydantic, elles seront converties avec le `jsonable_encoder` puis passées à la classe `JSONResponse`, qui les sérialisera en octets en utilisant la bibliothèque JSON standard de Python. -/// +### Performance JSON { #json-performance } -/// tip | Astuce +En bref, si vous voulez la performance maximale, utilisez un [Modèle de réponse](../tutorial/response-model.md) et ne déclarez pas de `response_class` dans le décorateur de *chemin d'accès*. -`ORJSONResponse` est disponible uniquement dans FastAPI, pas dans Starlette. - -/// +{* ../../docs_src/response_model/tutorial001_01_py310.py ln[15:17] hl[16] *} ## Réponse HTML { #html-response } Pour renvoyer une réponse avec du HTML directement depuis **FastAPI**, utilisez `HTMLResponse`. - Importez `HTMLResponse`. -- Passez `HTMLResponse` comme paramètre `response_class` de votre décorateur de chemin d'accès. +- Passez `HTMLResponse` comme paramètre `response_class` de votre *décorateur de chemin d'accès*. {* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *} @@ -69,7 +53,7 @@ Et il sera documenté comme tel dans OpenAPI. ### Renvoyer une `Response` { #return-a-response } -Comme vu dans [Renvoyer directement une Response](response-directly.md){.internal-link target=_blank}, vous pouvez aussi remplacer la réponse directement dans votre chemin d'accès, en la renvoyant. +Comme vu dans [Renvoyer une Response directement](response-directly.md), vous pouvez aussi remplacer la réponse directement dans votre *chemin d'accès*, en la renvoyant. Le même exemple ci-dessus, renvoyant une `HTMLResponse`, pourrait ressembler à : @@ -77,7 +61,7 @@ Le même exemple ci-dessus, renvoyant une `HTMLResponse`, pourrait ressembler à /// warning | Alertes -Une `Response` renvoyée directement par votre fonction de chemin d'accès ne sera pas documentée dans OpenAPI (par exemple, le `Content-Type` ne sera pas documenté) et ne sera pas visible dans les documents interactifs automatiques. +Une `Response` renvoyée directement par votre *fonction de chemin d'accès* ne sera pas documentée dans OpenAPI (par exemple, le `Content-Type` ne sera pas documenté) et ne sera pas visible dans les documents interactifs automatiques. /// @@ -91,7 +75,7 @@ Bien sûr, l'en-tête `Content-Type` réel, le code d'état, etc., proviendront Si vous voulez remplacer la réponse depuis l'intérieur de la fonction mais en même temps documenter le « media type » dans OpenAPI, vous pouvez utiliser le paramètre `response_class` ET renvoyer un objet `Response`. -`response_class` sera alors utilisé uniquement pour documenter l'opération de chemin d'accès OpenAPI, mais votre `Response` sera utilisée telle quelle. +`response_class` sera alors utilisé uniquement pour documenter l’*opération de chemin d'accès* OpenAPI, mais votre `Response` sera utilisée telle quelle. #### Renvoyer directement une `HTMLResponse` { #return-an-htmlresponse-directly } @@ -140,7 +124,7 @@ FastAPI (en fait Starlette) inclura automatiquement un en-tête Content-Length. ### `HTMLResponse` { #htmlresponse } -Prend du texte ou des octets et renvoie une réponse HTML, comme vous l'avez lu ci-dessus. +Prend du texte ou des octets et renvoie une réponse HTML, comme vous l'avez vu ci-dessus. ### `PlainTextResponse` { #plaintextresponse } @@ -154,37 +138,11 @@ Prend des données et renvoie une réponse encodée en `application/json`. C'est la réponse par défaut utilisée dans **FastAPI**, comme vous l'avez lu ci-dessus. -### `ORJSONResponse` { #orjsonresponse } - -Une réponse JSON alternative rapide utilisant `orjson`, comme vous l'avez lu ci-dessus. - -/// info - -Cela nécessite l'installation de `orjson`, par exemple avec `pip install orjson`. - -/// - -### `UJSONResponse` { #ujsonresponse } - -Une réponse JSON alternative utilisant `ujson`. - -/// info - -Cela nécessite l'installation de `ujson`, par exemple avec `pip install ujson`. - -/// - -/// warning | Alertes - -`ujson` est moins rigoureux que l'implémentation intégrée de Python dans sa gestion de certains cas limites. - -/// - -{* ../../docs_src/custom_response/tutorial001_py310.py hl[2,7] *} +/// note | Détails techniques -/// tip | Astuce +Mais si vous déclarez un modèle de réponse ou un type de retour, il sera utilisé directement pour sérialiser les données en JSON, et une réponse avec le bon media type pour JSON sera renvoyée directement, sans utiliser la classe `JSONResponse`. -Il est possible que `ORJSONResponse` soit une alternative plus rapide. +C'est la manière idéale d'obtenir la meilleure performance. /// @@ -202,7 +160,7 @@ Ou vous pouvez l'utiliser dans le paramètre `response_class` : {* ../../docs_src/custom_response/tutorial006b_py310.py hl[2,7,9] *} -Si vous faites cela, vous pouvez alors renvoyer directement l'URL depuis votre fonction de chemin d'accès. +Si vous faites cela, vous pouvez alors renvoyer directement l'URL depuis votre *fonction de chemin d'accès*. Dans ce cas, le `status_code` utilisé sera celui par défaut pour `RedirectResponse`, c'est-à-dire `307`. @@ -214,31 +172,25 @@ Vous pouvez aussi utiliser le paramètre `status_code` combiné avec le paramèt ### `StreamingResponse` { #streamingresponse } -Prend un générateur async ou un générateur/itérateur normal et diffuse le corps de la réponse. - -{* ../../docs_src/custom_response/tutorial007_py310.py hl[2,14] *} - -#### Utiliser `StreamingResponse` avec des objets de type fichier { #using-streamingresponse-with-file-like-objects } +Prend un générateur async ou un générateur/itérateur normal (une fonction avec `yield`) et diffuse le corps de la réponse. -Si vous avez un objet de type fichier (par ex. l'objet renvoyé par `open()`), vous pouvez créer une fonction génératrice pour itérer sur cet objet de type fichier. +{* ../../docs_src/custom_response/tutorial007_py310.py hl[3,16] *} -De cette façon, vous n'avez pas à tout lire en mémoire au préalable, et vous pouvez passer cette fonction génératrice à `StreamingResponse`, puis la renvoyer. - -Cela inclut de nombreuses bibliothèques pour interagir avec du stockage cloud, du traitement vidéo, et autres. +/// note | Détails techniques -{* ../../docs_src/custom_response/tutorial008_py310.py hl[2,10:12,14] *} +Une tâche `async` ne peut être annulée que lorsqu'elle atteint un `await`. S'il n'y a pas de `await`, le générateur (fonction avec `yield`) ne peut pas être annulé correctement et peut continuer à s'exécuter même après la demande d'annulation. -1. C'est la fonction génératrice. C'est une « fonction génératrice » parce qu'elle contient des instructions `yield` à l'intérieur. -2. En utilisant un bloc `with`, nous nous assurons que l'objet de type fichier est fermé après l'exécution de la fonction génératrice. Donc, après qu'elle a fini d'envoyer la réponse. -3. Ce `yield from` indique à la fonction d'itérer sur l'objet nommé `file_like`. Puis, pour chaque partie itérée, de produire cette partie comme provenant de cette fonction génératrice (`iterfile`). +Comme ce petit exemple n'a besoin d'aucune instruction `await`, nous ajoutons un `await anyio.sleep(0)` pour donner une chance à la boucle d'événements de gérer l'annulation. - Ainsi, c'est une fonction génératrice qui transfère le travail de « génération » à autre chose en interne. +Cela serait encore plus important avec des flux volumineux ou infinis. - En procédant ainsi, nous pouvons la placer dans un bloc `with` et, de cette façon, garantir que l'objet de type fichier est fermé après la fin. +/// /// tip | Astuce -Remarquez qu'ici, comme nous utilisons le `open()` standard qui ne prend pas en charge `async` et `await`, nous déclarons le chemin d'accès avec un `def` normal. +Au lieu de renvoyer une `StreamingResponse` directement, vous devriez probablement suivre le style de [Diffuser des données](./stream-data.md), c'est beaucoup plus pratique et gère l'annulation en arrière-plan pour vous. + +Si vous diffusez des JSON Lines, suivez le didacticiel [Diffuser des JSON Lines](../tutorial/stream-json-lines.md). /// @@ -261,13 +213,13 @@ Vous pouvez aussi utiliser le paramètre `response_class` : {* ../../docs_src/custom_response/tutorial009b_py310.py hl[2,8,10] *} -Dans ce cas, vous pouvez renvoyer directement le chemin du fichier depuis votre fonction de chemin d'accès. +Dans ce cas, vous pouvez renvoyer directement le chemin du fichier depuis votre *fonction de chemin d'accès*. ## Classe de réponse personnalisée { #custom-response-class } Vous pouvez créer votre propre classe de réponse personnalisée, héritant de `Response`, et l'utiliser. -Par exemple, disons que vous voulez utiliser `orjson`, mais avec certains réglages personnalisés non utilisés dans la classe `ORJSONResponse` incluse. +Par exemple, disons que vous voulez utiliser [`orjson`](https://github.com/ijl/orjson) avec certains réglages. Disons que vous voulez renvoyer du JSON indenté et formaté, donc vous voulez utiliser l'option orjson `orjson.OPT_INDENT_2`. @@ -291,22 +243,30 @@ Maintenant, au lieu de renvoyer : Bien sûr, vous trouverez probablement des moyens bien meilleurs de tirer parti de cela que de formater du JSON. 😉 +### `orjson` ou Modèle de réponse { #orjson-or-response-model } + +Si ce que vous recherchez est la performance, vous aurez probablement de meilleurs résultats en utilisant un [Modèle de réponse](../tutorial/response-model.md) qu'une réponse `orjson`. + +Avec un modèle de réponse, FastAPI utilisera Pydantic pour sérialiser les données en JSON, sans étapes intermédiaires, comme la conversion avec `jsonable_encoder`, qui se produirait dans tout autre cas. + +Et en interne, Pydantic utilise les mêmes mécanismes Rust sous-jacents que `orjson` pour sérialiser en JSON, vous obtiendrez donc déjà la meilleure performance avec un modèle de réponse. + ## Classe de réponse par défaut { #default-response-class } Lors de la création d'une instance de classe **FastAPI** ou d'un `APIRouter`, vous pouvez spécifier quelle classe de réponse utiliser par défaut. Le paramètre qui le définit est `default_response_class`. -Dans l'exemple ci-dessous, **FastAPI** utilisera `ORJSONResponse` par défaut, dans tous les chemins d'accès, au lieu de `JSONResponse`. +Dans l'exemple ci-dessous, **FastAPI** utilisera `HTMLResponse` par défaut, dans tous les *chemins d'accès*, au lieu de JSON. {* ../../docs_src/custom_response/tutorial010_py310.py hl[2,4] *} /// tip | Astuce -Vous pouvez toujours remplacer `response_class` dans les chemins d'accès comme auparavant. +Vous pouvez toujours remplacer `response_class` dans les *chemins d'accès* comme auparavant. /// ## Documentation supplémentaire { #additional-documentation } -Vous pouvez aussi déclarer le media type et de nombreux autres détails dans OpenAPI en utilisant `responses` : [Réponses supplémentaires dans OpenAPI](additional-responses.md){.internal-link target=_blank}. +Vous pouvez aussi déclarer le media type et de nombreux autres détails dans OpenAPI en utilisant `responses` : [Réponses supplémentaires dans OpenAPI](additional-responses.md). diff --git a/docs/fr/docs/advanced/dataclasses.md b/docs/fr/docs/advanced/dataclasses.md index 2bd77157e8..b63a995d9f 100644 --- a/docs/fr/docs/advanced/dataclasses.md +++ b/docs/fr/docs/advanced/dataclasses.md @@ -2,11 +2,11 @@ FastAPI est construit au‑dessus de **Pydantic**, et je vous ai montré comment utiliser des modèles Pydantic pour déclarer les requêtes et les réponses. -Mais FastAPI prend aussi en charge l'utilisation de `dataclasses` de la même manière : +Mais FastAPI prend aussi en charge l'utilisation de [`dataclasses`](https://docs.python.org/3/library/dataclasses.html) de la même manière : {* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *} -Cela fonctionne grâce à **Pydantic**, qui offre une prise en charge interne des `dataclasses`. +Cela fonctionne grâce à **Pydantic**, qui offre une [prise en charge interne des `dataclasses`](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel). Ainsi, même avec le code ci‑dessus qui n'emploie pas explicitement Pydantic, FastAPI utilise Pydantic pour convertir ces dataclasses standard en la variante de dataclasses de Pydantic. @@ -18,7 +18,7 @@ Et bien sûr, cela prend en charge la même chose : Cela fonctionne de la même manière qu'avec les modèles Pydantic. Et, en réalité, c'est mis en œuvre de la même façon en interne, en utilisant Pydantic. -/// info | Info +/// info Gardez à l'esprit que les dataclasses ne peuvent pas tout ce que peuvent faire les modèles Pydantic. @@ -74,7 +74,7 @@ Dans ce cas, vous pouvez simplement remplacer les `dataclasses` standard par `py Comme toujours, avec FastAPI vous pouvez combiner `def` et `async def` selon vos besoins. - Si vous avez besoin d'un rappel sur quand utiliser l'un ou l'autre, consultez la section _« In a hurry? »_ dans la documentation à propos de [`async` et `await`](../async.md#in-a-hurry){.internal-link target=_blank}. + Si vous avez besoin d'un rappel sur quand utiliser l'un ou l'autre, consultez la section _« In a hurry? »_ dans la documentation à propos de [`async` et `await`](../async.md#in-a-hurry). 9. Cette *fonction de chemin d'accès* ne renvoie pas des dataclasses (même si elle le pourrait), mais une liste de dictionnaires contenant des données internes. @@ -88,7 +88,7 @@ Reportez‑vous aux annotations dans le code ci‑dessus pour voir plus de déta Vous pouvez aussi combiner `dataclasses` avec d'autres modèles Pydantic, en hériter, les inclure dans vos propres modèles, etc. -Pour en savoir plus, consultez la documentation Pydantic sur les dataclasses. +Pour en savoir plus, consultez la [documentation Pydantic sur les dataclasses](https://docs.pydantic.dev/latest/concepts/dataclasses/). ## Version { #version } diff --git a/docs/fr/docs/advanced/events.md b/docs/fr/docs/advanced/events.md index 6d0907a8bc..c585dd563c 100644 --- a/docs/fr/docs/advanced/events.md +++ b/docs/fr/docs/advanced/events.md @@ -38,7 +38,7 @@ Puis, juste après le `yield`, nous déchargeons le modèle. Ce code sera exécu /// tip | Astuce -L’« arrêt » se produit lorsque vous **arrêtez** l'application. +Le `shutdown` se produit lorsque vous **arrêtez** l'application. Peut-être devez-vous démarrer une nouvelle version, ou vous en avez simplement assez de l'exécuter. 🤷 @@ -150,11 +150,11 @@ Pour cette raison, il est désormais recommandé d'utiliser plutôt le `lifespan Juste un détail technique pour les nerds curieux. 🤓 -Sous le capot, dans la spécification technique ASGI, cela fait partie du protocole Lifespan, et il y définit des événements appelés `startup` et `shutdown`. +Sous le capot, dans la spécification technique ASGI, cela fait partie du [protocole Lifespan](https://asgi.readthedocs.io/en/latest/specs/lifespan.html), et il y définit des événements appelés `startup` et `shutdown`. /// info -Vous pouvez en lire plus sur les gestionnaires `lifespan` de Starlette dans la documentation « Lifespan » de Starlette. +Vous pouvez en lire plus sur les gestionnaires `lifespan` de Starlette dans la [documentation « Lifespan » de Starlette](https://www.starlette.dev/lifespan/). Y compris comment gérer l'état de cycle de vie qui peut être utilisé dans d'autres parties de votre code. @@ -162,4 +162,4 @@ Y compris comment gérer l'état de cycle de vie qui peut être utilisé dans d' ## Sous-applications { #sub-applications } -🚨 Gardez à l'esprit que ces événements de cycle de vie (démarrage et arrêt) ne seront exécutés que pour l'application principale, pas pour [Sous-applications - Montages](sub-applications.md){.internal-link target=_blank}. +🚨 Gardez à l'esprit que ces événements de cycle de vie (démarrage et arrêt) ne seront exécutés que pour l'application principale, pas pour [Sous-applications - Montages](sub-applications.md). diff --git a/docs/fr/docs/advanced/generate-clients.md b/docs/fr/docs/advanced/generate-clients.md index 6f51ac7be9..58bd48181e 100644 --- a/docs/fr/docs/advanced/generate-clients.md +++ b/docs/fr/docs/advanced/generate-clients.md @@ -8,11 +8,11 @@ Dans ce guide, vous apprendrez à générer un **SDK TypeScript** pour votre bac ## Générateurs de SDK open source { #open-source-sdk-generators } -Une option polyvalente est OpenAPI Generator, qui prend en charge **de nombreux langages de programmation** et peut générer des SDK à partir de votre spécification OpenAPI. +Une option polyvalente est le [OpenAPI Generator](https://openapi-generator.tech/), qui prend en charge **de nombreux langages de programmation** et peut générer des SDK à partir de votre spécification OpenAPI. -Pour les **clients TypeScript**, Hey API est une solution dédiée, offrant une expérience optimisée pour l’écosystème TypeScript. +Pour les **clients TypeScript**, [Hey API](https://heyapi.dev/) est une solution dédiée, offrant une expérience optimisée pour l’écosystème TypeScript. -Vous pouvez découvrir davantage de générateurs de SDK sur OpenAPI.Tools. +Vous pouvez découvrir davantage de générateurs de SDK sur [OpenAPI.Tools](https://openapi.tools/#sdk). /// tip | Astuce @@ -24,15 +24,15 @@ FastAPI génère automatiquement des spécifications **OpenAPI 3.1**, donc tout Cette section met en avant des solutions **soutenues par des fonds** et **par des entreprises** qui sponsorisent FastAPI. Ces produits offrent **des fonctionnalités supplémentaires** et **des intégrations** en plus de SDK de haute qualité générés. -En ✨ [**sponsorisant FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨, ces entreprises contribuent à garantir que le framework et son **écosystème** restent sains et **durables**. +En ✨ [**sponsorisant FastAPI**](../help-fastapi.md#sponsor-the-author) ✨, ces entreprises contribuent à garantir que le framework et son **écosystème** restent sains et **durables**. Leur sponsoring démontre également un fort engagement envers la **communauté** FastAPI (vous), montrant qu’elles se soucient non seulement d’offrir un **excellent service**, mais aussi de soutenir un **framework robuste et florissant**, FastAPI. 🙇 Par exemple, vous pourriez essayer : -* Speakeasy -* Stainless -* liblab +* [Speakeasy](https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship) +* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) +* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi) Certaines de ces solutions peuvent aussi être open source ou proposer des niveaux gratuits, afin que vous puissiez les essayer sans engagement financier. D’autres générateurs de SDK commerciaux existent et peuvent être trouvés en ligne. 🤓 @@ -66,7 +66,7 @@ npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client Cela générera un SDK TypeScript dans `./src/client`. -Vous pouvez apprendre à installer `@hey-api/openapi-ts` et lire à propos du résultat généré sur leur site. +Vous pouvez apprendre à [installer `@hey-api/openapi-ts`](https://heyapi.dev/openapi-ts/get-started) et lire à propos du [résultat généré](https://heyapi.dev/openapi-ts/output) sur leur site. ### Utiliser le SDK { #using-the-sdk } diff --git a/docs/fr/docs/advanced/index.md b/docs/fr/docs/advanced/index.md index a2f9d3b1bb..03fdc21020 100644 --- a/docs/fr/docs/advanced/index.md +++ b/docs/fr/docs/advanced/index.md @@ -2,7 +2,7 @@ ## Caractéristiques supplémentaires { #additional-features } -Le [Tutoriel - Guide de l'utilisateur](../tutorial/index.md){.internal-link target=_blank} devrait suffire à vous faire découvrir toutes les fonctionnalités principales de **FastAPI**. +Le [Tutoriel - Guide de l'utilisateur](../tutorial/index.md) devrait suffire à vous faire découvrir toutes les fonctionnalités principales de **FastAPI**. Dans les sections suivantes, vous verrez des options, configurations et fonctionnalités supplémentaires. @@ -16,6 +16,6 @@ Et il est possible que, pour votre cas d'utilisation, la solution se trouve dans ## Lire d'abord le tutoriel { #read-the-tutorial-first } -Vous pouvez utiliser la plupart des fonctionnalités de **FastAPI** grâce aux connaissances du [Tutoriel - Guide de l'utilisateur](../tutorial/index.md){.internal-link target=_blank}. +Vous pouvez utiliser la plupart des fonctionnalités de **FastAPI** grâce aux connaissances du [Tutoriel - Guide de l'utilisateur](../tutorial/index.md). Et les sections suivantes supposent que vous l'avez lu et que vous en connaissez les idées principales. diff --git a/docs/fr/docs/advanced/json-base64-bytes.md b/docs/fr/docs/advanced/json-base64-bytes.md new file mode 100644 index 0000000000..1b5acb0811 --- /dev/null +++ b/docs/fr/docs/advanced/json-base64-bytes.md @@ -0,0 +1,63 @@ +# JSON avec des octets en Base64 { #json-with-bytes-as-base64 } + +Si votre application doit recevoir et envoyer des données JSON, mais que vous devez y inclure des données binaires, vous pouvez les encoder en base64. + +## Base64 vs fichiers { #base64-vs-files } + +Envisagez d'abord d'utiliser [Fichiers de requête](../tutorial/request-files.md) pour téléverser des données binaires et [Réponse personnalisée - FileResponse](./custom-response.md#fileresponse--fileresponse-) pour envoyer des données binaires, plutôt que de les encoder dans du JSON. + +JSON ne peut contenir que des chaînes encodées en UTF-8, il ne peut donc pas contenir d'octets bruts. + +Base64 peut encoder des données binaires en chaînes, mais pour cela il doit utiliser plus de caractères que les données binaires originales ; c'est donc en général moins efficace que des fichiers classiques. + +N'utilisez base64 que si vous devez absolument inclure des données binaires dans du JSON et que vous ne pouvez pas utiliser des fichiers pour cela. + +## Pydantic `bytes` { #pydantic-bytes } + +Vous pouvez déclarer un modèle Pydantic avec des champs `bytes`, puis utiliser `val_json_bytes` dans la configuration du modèle pour lui indiquer d'utiliser base64 pour valider les données JSON en entrée ; dans le cadre de cette validation, il décodera la chaîne base64 en octets. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *} + +Si vous allez sur les `/docs`, vous verrez que le champ `data` attend des octets encodés en base64 : + +
+ +
+ +Vous pourriez envoyer une requête comme : + +```json +{ + "description": "Some data", + "data": "aGVsbG8=" +} +``` + +/// tip | Astuce + +`aGVsbG8=` est l'encodage base64 de `hello`. + +/// + +Pydantic décodera ensuite la chaîne base64 et vous fournira les octets originaux dans le champ `data` du modèle. + +Vous recevrez une réponse comme : + +```json +{ + "description": "Some data", + "content": "hello" +} +``` + +## Pydantic `bytes` pour les données de sortie { #pydantic-bytes-for-output-data } + +Vous pouvez également utiliser des champs `bytes` avec `ser_json_bytes` dans la configuration du modèle pour les données de sortie ; Pydantic sérialisera alors les octets en base64 lors de la génération de la réponse JSON. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *} + +## Pydantic `bytes` pour les données d'entrée et de sortie { #pydantic-bytes-for-input-and-output-data } + +Et bien sûr, vous pouvez utiliser le même modèle configuré pour utiliser base64 afin de gérer à la fois l'entrée (valider) avec `val_json_bytes` et la sortie (sérialiser) avec `ser_json_bytes` lors de la réception et de l'envoi de données JSON. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *} diff --git a/docs/fr/docs/advanced/middleware.md b/docs/fr/docs/advanced/middleware.md index 934c910411..15de9872f6 100644 --- a/docs/fr/docs/advanced/middleware.md +++ b/docs/fr/docs/advanced/middleware.md @@ -1,8 +1,8 @@ # Utiliser des middlewares avancés { #advanced-middleware } -Dans le tutoriel principal, vous avez vu comment ajouter des [middlewares personnalisés](../tutorial/middleware.md){.internal-link target=_blank} à votre application. +Dans le tutoriel principal, vous avez vu comment ajouter des [middlewares personnalisés](../tutorial/middleware.md) à votre application. -Vous avez également vu comment gérer [CORS avec le `CORSMiddleware`](../tutorial/cors.md){.internal-link target=_blank}. +Vous avez également vu comment gérer [CORS avec le `CORSMiddleware`](../tutorial/cors.md). Dans cette section, nous allons voir comment utiliser d'autres middlewares. @@ -91,7 +91,7 @@ Il existe de nombreux autres middlewares ASGI. Par exemple : -- Le `ProxyHeadersMiddleware` d'Uvicorn -- MessagePack +- [Le `ProxyHeadersMiddleware` d'Uvicorn](https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py) +- [MessagePack](https://github.com/florimondmanca/msgpack-asgi) -Pour voir d'autres middlewares disponibles, consultez la documentation des middlewares de Starlette et la liste ASGI Awesome. +Pour voir d'autres middlewares disponibles, consultez la [documentation des middlewares de Starlette](https://www.starlette.dev/middleware/) et la [liste ASGI Awesome](https://github.com/florimondmanca/awesome-asgi). diff --git a/docs/fr/docs/advanced/openapi-callbacks.md b/docs/fr/docs/advanced/openapi-callbacks.md index 669d9447a2..369a638c8f 100644 --- a/docs/fr/docs/advanced/openapi-callbacks.md +++ b/docs/fr/docs/advanced/openapi-callbacks.md @@ -35,7 +35,7 @@ Cette partie est assez normale, la plupart du code vous est probablement déjà /// tip | Astuce -Le paramètre de requête `callback_url` utilise un type Pydantic Url. +Le paramètre de requête `callback_url` utilise un type Pydantic [Url](https://docs.pydantic.dev/latest/api/networks/). /// @@ -66,7 +66,7 @@ Cet exemple n’implémente pas le callback lui-même (qui pourrait être une si Le callback réel n’est qu’une requête HTTP. -En implémentant vous-même le callback, vous pourriez utiliser quelque chose comme HTTPX ou Requests. +En implémentant vous-même le callback, vous pourriez utiliser quelque chose comme [HTTPX](https://www.python-httpx.org) ou [Requests](https://requests.readthedocs.io/). /// @@ -106,11 +106,11 @@ Il devrait ressembler exactement à un *chemin d'accès* FastAPI normal : Il y a 2 principales différences par rapport à un *chemin d'accès* normal : * Il n’a pas besoin d’avoir de code réel, car votre application n’appellera jamais ce code. Il sert uniquement à documenter l’*API externe*. La fonction peut donc simplement contenir `pass`. -* Le *chemin* peut contenir une expression OpenAPI 3 (voir plus bas) où il peut utiliser des variables avec des paramètres et des parties de la requête originale envoyée à *votre API*. +* Le *chemin* peut contenir une [expression OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) (voir plus bas) où il peut utiliser des variables avec des paramètres et des parties de la requête originale envoyée à *votre API*. ### L’expression du chemin de callback { #the-callback-path-expression } -Le *chemin* du callback peut contenir une expression OpenAPI 3 qui peut inclure des parties de la requête originale envoyée à *votre API*. +Le *chemin* du callback peut contenir une [expression OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) qui peut inclure des parties de la requête originale envoyée à *votre API*. Dans ce cas, c’est la `str` : @@ -179,7 +179,7 @@ Remarquez que vous ne passez pas le routeur lui-même (`invoices_callback_router ### Vérifier la documentation { #check-the-docs } -Vous pouvez maintenant démarrer votre application et aller sur http://127.0.0.1:8000/docs. +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 votre documentation incluant une section « Callbacks » pour votre *chemin d'accès* qui montre à quoi l’*API externe* devrait ressembler : diff --git a/docs/fr/docs/advanced/openapi-webhooks.md b/docs/fr/docs/advanced/openapi-webhooks.md index 21b6f5f00c..c36c2f82ba 100644 --- a/docs/fr/docs/advanced/openapi-webhooks.md +++ b/docs/fr/docs/advanced/openapi-webhooks.md @@ -34,7 +34,7 @@ Lorsque vous créez une application FastAPI, il existe un attribut `webhooks` qu {* ../../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 @@ -48,7 +48,7 @@ C'est parce qu'on s'attend à ce que vos utilisateurs définissent, par un autre ### Consulter la documentation { #check-the-docs } -Vous pouvez maintenant démarrer votre application et aller sur http://127.0.0.1:8000/docs. +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 : diff --git a/docs/fr/docs/advanced/path-operation-advanced-configuration.md b/docs/fr/docs/advanced/path-operation-advanced-configuration.md index b482f97ccc..67a5d46d41 100644 --- a/docs/fr/docs/advanced/path-operation-advanced-configuration.md +++ b/docs/fr/docs/advanced/path-operation-advanced-configuration.md @@ -46,7 +46,7 @@ Pour exclure un chemin d’accès du schéma OpenAPI généré (et donc des syst Vous pouvez limiter les lignes utilisées de la docstring d’une fonction de chemin d’accès pour OpenAPI. -L’ajout d’un `\f` (un caractère « saut de page » échappé) amène **FastAPI** à tronquer la sortie utilisée pour OpenAPI à cet endroit. +L’ajout d’un `\f` (un caractère « form feed » échappé) amène **FastAPI** à tronquer la sortie utilisée pour OpenAPI à cet endroit. Cela n’apparaîtra pas dans la documentation, mais d’autres outils (comme Sphinx) pourront utiliser le reste. @@ -60,7 +60,7 @@ Cela définit les métadonnées sur la réponse principale d’un chemin d’acc Vous pouvez également déclarer des réponses supplémentaires avec leurs modèles, codes de statut, etc. -Il y a un chapitre entier dans la documentation à ce sujet, vous pouvez le lire dans [Réponses supplémentaires dans OpenAPI](additional-responses.md){.internal-link target=_blank}. +Il y a un chapitre entier dans la documentation à ce sujet, vous pouvez le lire dans [Réponses supplémentaires dans OpenAPI](additional-responses.md). ## OpenAPI supplémentaire { #openapi-extra } @@ -68,7 +68,7 @@ Lorsque vous déclarez un chemin d’accès dans votre application, **FastAPI** /// note | Détails techniques -Dans la spécification OpenAPI, cela s’appelle l’objet Operation. +Dans la spécification OpenAPI, cela s’appelle l’[objet Operation](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operation-object). /// @@ -82,7 +82,7 @@ Ce schéma OpenAPI spécifique à un chemin d’accès est normalement généré Ceci est un point d’extension de bas niveau. -Si vous avez seulement besoin de déclarer des réponses supplémentaires, un moyen plus pratique de le faire est d’utiliser [Réponses supplémentaires dans OpenAPI](additional-responses.md){.internal-link target=_blank}. +Si vous avez seulement besoin de déclarer des réponses supplémentaires, un moyen plus pratique de le faire est d’utiliser [Réponses supplémentaires dans OpenAPI](additional-responses.md). /// diff --git a/docs/fr/docs/advanced/response-change-status-code.md b/docs/fr/docs/advanced/response-change-status-code.md index d08e870995..2228257029 100644 --- a/docs/fr/docs/advanced/response-change-status-code.md +++ b/docs/fr/docs/advanced/response-change-status-code.md @@ -1,6 +1,6 @@ # Réponse - Modifier le code d'état { #response-change-status-code } -Vous avez probablement déjà lu que vous pouvez définir un [Code d'état de la réponse](../tutorial/response-status-code.md){.internal-link target=_blank} par défaut. +Vous avez probablement déjà lu que vous pouvez définir un [Code d'état de la réponse](../tutorial/response-status-code.md) par défaut. Mais dans certains cas, vous devez renvoyer un code d'état différent de celui par défaut. diff --git a/docs/fr/docs/advanced/response-cookies.md b/docs/fr/docs/advanced/response-cookies.md index d3e51f3317..174c9a72dc 100644 --- a/docs/fr/docs/advanced/response-cookies.md +++ b/docs/fr/docs/advanced/response-cookies.md @@ -2,7 +2,7 @@ ## 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. +Vous pouvez déclarer un paramètre de type `Response` dans votre *fonction de chemin d'accès*. Vous pouvez ensuite définir des cookies dans cet objet de réponse *temporaire*. @@ -20,7 +20,7 @@ Vous pouvez également déclarer le paramètre `Response` dans des dépendances, Vous pouvez également créer des cookies en renvoyant une `Response` directement dans votre code. -Pour ce faire, vous pouvez créer une réponse comme décrit dans [Renvoyer une Response directement](response-directly.md){.internal-link target=_blank}. +Pour ce faire, vous pouvez créer une réponse comme décrit dans [Renvoyer une Response directement](response-directly.md). Définissez ensuite des cookies dessus, puis renvoyez-la : @@ -48,4 +48,4 @@ Et comme `Response` peut être utilisé fréquemment pour définir des en-têtes /// -Pour voir tous les paramètres et options disponibles, consultez la documentation de Starlette. +Pour voir tous les paramètres et options disponibles, consultez la [documentation de Starlette](https://www.starlette.dev/responses/#set-cookie). diff --git a/docs/fr/docs/advanced/response-directly.md b/docs/fr/docs/advanced/response-directly.md index 4a49518640..5ef479584e 100644 --- a/docs/fr/docs/advanced/response-directly.md +++ b/docs/fr/docs/advanced/response-directly.md @@ -1,36 +1,42 @@ # Renvoyer directement une réponse { #return-a-response-directly } -Lorsque vous créez un *chemin d'accès* **FastAPI**, vous pouvez normalement retourner n'importe quelle donnée : un `dict`, une `list`, un modèle Pydantic, un modèle de base de données, etc. +Lorsque vous créez un *chemin d'accès* **FastAPI**, vous pouvez normalement renvoyer n'importe quelle donnée : un `dict`, une `list`, un modèle Pydantic, un modèle de base de données, etc. -Par défaut, **FastAPI** convertirait automatiquement cette valeur de retour en JSON en utilisant le `jsonable_encoder` expliqué dans [Encodeur compatible JSON](../tutorial/encoder.md){.internal-link target=_blank}. +Si vous déclarez un [Modèle de réponse](../tutorial/response-model.md), FastAPI l'utilise pour sérialiser les données en JSON, en utilisant Pydantic. -Ensuite, en arrière-plan, il mettra ces données JSON-compatible (par exemple un `dict`) à l'intérieur d'un `JSONResponse` qui sera utilisé pour envoyer la réponse au client. +Si vous ne déclarez pas de modèle de réponse, FastAPI utilise le `jsonable_encoder` expliqué dans [Encodeur compatible JSON](../tutorial/encoder.md) et le place dans une `JSONResponse`. -Mais vous pouvez retourner une `JSONResponse` directement à partir de vos *chemins d'accès*. +Vous pouvez également créer directement une `JSONResponse` et la renvoyer. -Cela peut être utile, par exemple, pour retourner des en-têtes personnalisés ou des cookies. +/// tip | Astuce + +Vous aurez normalement une bien meilleure performance en utilisant un [Modèle de réponse](../tutorial/response-model.md) qu'en renvoyant directement une `JSONResponse`, car de cette façon la sérialisation des données est effectuée par Pydantic, en Rust. + +/// ## Renvoyer une `Response` { #return-a-response } -En fait, vous pouvez retourner n'importe quelle `Response` ou n'importe quelle sous-classe de celle-ci. +Vous pouvez renvoyer une `Response` ou n'importe laquelle de ses sous-classes. -/// tip | Astuce +/// info `JSONResponse` est elle-même une sous-classe de `Response`. /// -Et quand vous retournez une `Response`, **FastAPI** la transmet directement. +Et lorsque vous renvoyez une `Response`, **FastAPI** la transmet directement. + +Il n'effectue aucune conversion de données avec les modèles Pydantic, il ne convertit pas le contenu en un autre type, etc. -Elle ne fera aucune conversion de données avec les modèles Pydantic, elle ne convertira pas le contenu en un type quelconque, etc. +Cela vous donne beaucoup de flexibilité. Vous pouvez renvoyer n'importe quel type de données, surcharger toute déclaration ou validation de données, etc. -Cela vous donne beaucoup de flexibilité. Vous pouvez retourner n'importe quel type de données, surcharger n'importe quelle déclaration ou validation de données, etc. +Cela vous donne aussi beaucoup de responsabilité. Vous devez vous assurer que les données que vous renvoyez sont correctes, dans le bon format, qu'elles peuvent être sérialisées, etc. ## Utiliser le `jsonable_encoder` dans une `Response` { #using-the-jsonable-encoder-in-a-response } -Parce que **FastAPI** n'apporte aucune modification à une `Response` que vous retournez, vous devez vous assurer que son contenu est prêt pour cela. +Comme **FastAPI** n'apporte aucune modification à une `Response` que vous renvoyez, vous devez vous assurer que son contenu est prêt pour cela. -Par exemple, vous ne pouvez pas mettre un modèle Pydantic dans une `JSONResponse` sans d'abord le convertir en un `dict` avec tous les types de données (comme `datetime`, `UUID`, etc.) convertis en types compatibles avec JSON. +Par exemple, vous ne pouvez pas mettre un modèle Pydantic dans une `JSONResponse` sans d'abord le convertir en un `dict` avec tous les types de données (comme `datetime`, `UUID`, etc.) convertis en types compatibles JSON. Pour ces cas, vous pouvez utiliser le `jsonable_encoder` pour convertir vos données avant de les passer à une réponse : @@ -40,26 +46,38 @@ Pour ces cas, vous pouvez utiliser le `jsonable_encoder` pour convertir vos donn Vous pouvez aussi utiliser `from starlette.responses import JSONResponse`. -**FastAPI** fournit le même `starlette.responses` que `fastapi.responses` juste par commodité pour vous, le développeur. Mais la plupart des réponses disponibles proviennent directement de Starlette. +**FastAPI** fournit le même `starlette.responses` que `fastapi.responses` uniquement par commodité pour vous, développeur. Mais la plupart des réponses disponibles proviennent directement de Starlette. /// ## Renvoyer une `Response` personnalisée { #returning-a-custom-response } -L'exemple ci-dessus montre toutes les parties dont vous avez besoin, mais il n'est pas encore très utile, car vous auriez pu retourner l'`item` directement, et **FastAPI** l'aurait mis dans une `JSONResponse` pour vous, en le convertissant en `dict`, etc. Tout cela par défaut. +L'exemple ci-dessus montre toutes les parties dont vous avez besoin, mais il n'est pas encore très utile, car vous auriez pu renvoyer l'`item` directement, et **FastAPI** l'aurait placé dans une `JSONResponse` pour vous, en le convertissant en `dict`, etc. Tout cela par défaut. -Maintenant, voyons comment vous pourriez utiliser cela pour retourner une réponse personnalisée. +Voyons maintenant comment vous pourriez utiliser cela pour renvoyer une réponse personnalisée. -Disons que vous voulez retourner une réponse XML. +Disons que vous voulez renvoyer une [réponse XML](https://en.wikipedia.org/wiki/XML). -Vous pouvez mettre votre contenu XML dans une chaîne de caractères, la placer dans une `Response`, et la retourner : +Vous pouvez placer votre contenu XML dans une chaîne de caractères, le mettre dans une `Response` et le renvoyer : {* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *} +## Comprendre le fonctionnement d'un Modèle de réponse { #how-a-response-model-works } + +Lorsque vous déclarez un [Modèle de réponse - Type de retour](../tutorial/response-model.md) dans un chemin d'accès, **FastAPI** l'utilise pour sérialiser les données en JSON, en utilisant Pydantic. + +{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *} + +Comme cela se passe côté Rust, la performance sera bien meilleure que si cela était fait avec le Python classique et la classe `JSONResponse`. + +Lorsque vous utilisez un `response_model` ou un type de retour, FastAPI n'utilise ni le `jsonable_encoder` pour convertir les données (ce qui serait plus lent) ni la classe `JSONResponse`. + +À la place, il prend les octets JSON générés avec Pydantic en utilisant le modèle de réponse (ou le type de retour) et renvoie directement une `Response` avec le type de média approprié pour JSON (`application/json`). + ## Notes { #notes } Lorsque vous renvoyez une `Response` directement, ses données ne sont pas validées, converties (sérialisées), ni documentées automatiquement. -Mais vous pouvez toujours les documenter comme décrit dans [Additional Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}. +Mais vous pouvez toujours les documenter comme décrit dans [Réponses supplémentaires dans OpenAPI](additional-responses.md). -Vous pouvez voir dans les sections suivantes comment utiliser/déclarer ces `Response`s personnalisées tout en conservant la conversion automatique des données, la documentation, etc. +Vous pouvez voir dans les sections suivantes comment utiliser/déclarer ces `Response` personnalisées tout en conservant la conversion automatique des données, la documentation, etc. diff --git a/docs/fr/docs/advanced/response-headers.md b/docs/fr/docs/advanced/response-headers.md index 1c6a29f8c5..b7568b51fc 100644 --- a/docs/fr/docs/advanced/response-headers.md +++ b/docs/fr/docs/advanced/response-headers.md @@ -20,7 +20,7 @@ Vous pouvez également déclarer le paramètre `Response` dans des dépendances, Vous pouvez également ajouter des en-têtes lorsque vous renvoyez une `Response` directement. -Créez une réponse comme décrit dans [Renvoyer une Response directement](response-directly.md){.internal-link target=_blank} et passez les en-têtes comme paramètre supplémentaire : +Créez une réponse comme décrit dans [Renvoyer une Response directement](response-directly.md) et passez les en-têtes comme paramètre supplémentaire : {* ../../docs_src/response_headers/tutorial001_py310.py hl[10:12] *} @@ -36,6 +36,6 @@ Et comme `Response` peut être utilisée fréquemment pour définir des en-tête ## En-têtes personnalisés { #custom-headers } -Gardez à l'esprit que des en-têtes propriétaires personnalisés peuvent être ajoutés en utilisant le préfixe `X-`. +Gardez à l'esprit que des en-têtes propriétaires personnalisés peuvent être ajoutés [en utilisant le préfixe `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). -Mais si vous avez des en-têtes personnalisés que vous voulez qu'un client dans un navigateur puisse voir, vous devez les ajouter à vos configurations CORS (en savoir plus dans [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank}), en utilisant le paramètre `expose_headers` documenté dans la documentation CORS de Starlette. +Mais si vous avez des en-têtes personnalisés que vous voulez qu'un client dans un navigateur puisse voir, vous devez les ajouter à vos configurations CORS (en savoir plus dans [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md)), en utilisant le paramètre `expose_headers` documenté dans [la documentation CORS de Starlette](https://www.starlette.dev/middleware/#corsmiddleware). diff --git a/docs/fr/docs/advanced/security/http-basic-auth.md b/docs/fr/docs/advanced/security/http-basic-auth.md index a8742ce7c2..97e9df6ce5 100644 --- a/docs/fr/docs/advanced/security/http-basic-auth.md +++ b/docs/fr/docs/advanced/security/http-basic-auth.md @@ -32,7 +32,7 @@ Voici un exemple plus complet. Utilisez une dépendance pour vérifier si le nom d'utilisateur et le mot de passe sont corrects. -Pour cela, utilisez le module standard Python `secrets` pour vérifier le nom d'utilisateur et le mot de passe. +Pour cela, utilisez le module standard Python [`secrets`](https://docs.python.org/3/library/secrets.html) pour vérifier le nom d'utilisateur et le mot de passe. `secrets.compare_digest()` doit recevoir des `bytes` ou une `str` ne contenant que des caractères ASCII (ceux de l'anglais), ce qui signifie qu'elle ne fonctionnerait pas avec des caractères comme `á`, comme dans `Sebastián`. diff --git a/docs/fr/docs/advanced/security/index.md b/docs/fr/docs/advanced/security/index.md index e84fcef626..f4cde60987 100644 --- a/docs/fr/docs/advanced/security/index.md +++ b/docs/fr/docs/advanced/security/index.md @@ -2,11 +2,11 @@ ## Fonctionnalités supplémentaires { #additional-features } -Il existe des fonctionnalités supplémentaires pour gérer la sécurité en plus de celles couvertes dans le [Tutoriel - Guide utilisateur : Sécurité](../../tutorial/security/index.md){.internal-link target=_blank}. +Il existe des fonctionnalités supplémentaires pour gérer la sécurité en plus de celles couvertes dans le [Tutoriel - Guide utilisateur : Sécurité](../../tutorial/security/index.md). /// tip | Astuce -Les sections suivantes ne sont pas nécessairement « advanced ». +Les sections suivantes **ne sont pas nécessairement « advanced »**. Et il est possible que, pour votre cas d’utilisation, la solution se trouve dans l’une d’entre elles. @@ -14,6 +14,6 @@ Et il est possible que, pour votre cas d’utilisation, la solution se trouve da ## Lire d’abord le tutoriel { #read-the-tutorial-first } -Les sections suivantes partent du principe que vous avez déjà lu le [Tutoriel - Guide utilisateur : Sécurité](../../tutorial/security/index.md){.internal-link target=_blank} principal. +Les sections suivantes partent du principe que vous avez déjà lu le [Tutoriel - Guide utilisateur : Sécurité](../../tutorial/security/index.md) principal. Elles s’appuient toutes sur les mêmes concepts, mais permettent des fonctionnalités supplémentaires. diff --git a/docs/fr/docs/advanced/security/oauth2-scopes.md b/docs/fr/docs/advanced/security/oauth2-scopes.md index c890a5129d..f27b95b4b7 100644 --- a/docs/fr/docs/advanced/security/oauth2-scopes.md +++ b/docs/fr/docs/advanced/security/oauth2-scopes.md @@ -60,7 +60,7 @@ Pour OAuth2, ce ne sont que des chaînes. ## Vue d’ensemble { #global-view } -Voyons d’abord rapidement les parties qui changent par rapport aux exemples du **Tutoriel - Guide utilisateur** pour [OAuth2 avec mot de passe (et hachage), Bearer avec jetons JWT](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. Cette fois, en utilisant des scopes OAuth2 : +Voyons d’abord rapidement les parties qui changent par rapport aux exemples du **Tutoriel - Guide utilisateur** pour [OAuth2 avec mot de passe (et hachage), Bearer avec jetons JWT](../../tutorial/security/oauth2-jwt.md). Cette fois, en utilisant des scopes OAuth2 : {* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *} @@ -271,4 +271,4 @@ Mais au final, ils implémentent le même standard OAuth2. ## `Security` dans les dépendances du décorateur `dependencies` { #security-in-decorator-dependencies } -De la même manière que vous pouvez définir une `list` de `Depends` dans le paramètre `dependencies` du décorateur (comme expliqué dans [Dépendances dans les décorateurs de chemins d’accès](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}), vous pouvez aussi utiliser `Security` avec des `scopes` à cet endroit. +De la même manière que vous pouvez définir une `list` de `Depends` dans le paramètre `dependencies` du décorateur (comme expliqué dans [Dépendances dans les décorateurs de chemins d’accès](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md)), vous pouvez aussi utiliser `Security` avec des `scopes` à cet endroit. diff --git a/docs/fr/docs/advanced/settings.md b/docs/fr/docs/advanced/settings.md index ed724bf4f6..e6eb52a4ee 100644 --- a/docs/fr/docs/advanced/settings.md +++ b/docs/fr/docs/advanced/settings.md @@ -8,7 +8,7 @@ C'est pourquoi il est courant de les fournir via des variables d'environnement l /// tip | Astuce -Pour comprendre les variables d'environnement, vous pouvez lire [Variables d'environnement](../environment-variables.md){.internal-link target=_blank}. +Pour comprendre les variables d'environnement, vous pouvez lire [Variables d'environnement](../environment-variables.md). /// @@ -20,11 +20,11 @@ Cela signifie que toute valeur lue en Python depuis une variable d'environnement ## Pydantic `Settings` { #pydantic-settings } -Heureusement, Pydantic fournit un excellent utilitaire pour gérer ces paramètres provenant des variables d'environnement avec Pydantic : gestion des paramètres. +Heureusement, Pydantic fournit un excellent utilitaire pour gérer ces paramètres provenant des variables d'environnement avec [Pydantic : gestion des paramètres](https://docs.pydantic.dev/latest/concepts/pydantic_settings/). ### Installer `pydantic-settings` { #install-pydantic-settings } -D'abord, vous devez créer votre [environnement virtuel](../virtual-environments.md){.internal-link target=_blank}, l'activer, puis installer le paquet `pydantic-settings` : +D'abord, vous devez créer votre [environnement virtuel](../virtual-environments.md), l'activer, puis installer le paquet `pydantic-settings` :
@@ -100,7 +100,7 @@ Et `items_per_user` conservera sa valeur par défaut de `50`. ## Paramètres dans un autre module { #settings-in-another-module } -Vous pouvez placer ces paramètres dans un autre module comme vous l'avez vu dans [Applications plus grandes - Plusieurs fichiers](../tutorial/bigger-applications.md){.internal-link target=_blank}. +Vous pouvez placer ces paramètres dans un autre module comme vous l'avez vu dans [Applications plus grandes - Plusieurs fichiers](../tutorial/bigger-applications.md). Par exemple, vous pourriez avoir un fichier `config.py` avec : @@ -112,7 +112,7 @@ Puis l'utiliser dans un fichier `main.py` : /// tip | Astuce -Vous aurez également besoin d'un fichier `__init__.py` comme vous l'avez vu dans [Applications plus grandes - Plusieurs fichiers](../tutorial/bigger-applications.md){.internal-link target=_blank}. +Vous aurez également besoin d'un fichier `__init__.py` comme vous l'avez vu dans [Applications plus grandes - Plusieurs fichiers](../tutorial/bigger-applications.md). /// @@ -172,7 +172,7 @@ Mais un fichier dotenv n'a pas forcément exactement ce nom de fichier. /// -Pydantic prend en charge la lecture depuis ce type de fichiers en utilisant une bibliothèque externe. Vous pouvez en lire davantage ici : Pydantic Settings : prise en charge de Dotenv (.env). +Pydantic prend en charge la lecture depuis ce type de fichiers en utilisant une bibliothèque externe. Vous pouvez en lire davantage ici : [Pydantic Settings : prise en charge de Dotenv (.env)](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support). /// tip | Astuce @@ -197,7 +197,7 @@ Puis mettre à jour votre `config.py` avec : /// tip | Astuce -L'attribut `model_config` est utilisé uniquement pour la configuration Pydantic. Vous pouvez en lire davantage ici : Pydantic : Concepts : Configuration. +L'attribut `model_config` est utilisé uniquement pour la configuration Pydantic. Vous pouvez en lire davantage ici : [Pydantic : Concepts : Configuration](https://docs.pydantic.dev/latest/concepts/config/). /// @@ -291,7 +291,7 @@ Dans le cas de notre dépendance `get_settings()`, la fonction ne prend même au De cette façon, elle se comporte presque comme s'il s'agissait simplement d'une variable globale. Mais comme elle utilise une fonction de dépendance, nous pouvons alors la surcharger facilement pour les tests. -`@lru_cache` fait partie de `functools` qui fait partie de la bibliothèque standard de Python, vous pouvez en lire davantage dans la documentation Python pour `@lru_cache`. +`@lru_cache` fait partie de `functools` qui fait partie de la bibliothèque standard de Python, vous pouvez en lire davantage dans la [documentation Python pour `@lru_cache`](https://docs.python.org/3/library/functools.html#functools.lru_cache). ## Récapitulatif { #recap } diff --git a/docs/fr/docs/advanced/stream-data.md b/docs/fr/docs/advanced/stream-data.md new file mode 100644 index 0000000000..3b22910a1b --- /dev/null +++ b/docs/fr/docs/advanced/stream-data.md @@ -0,0 +1,117 @@ +# Diffuser des données { #stream-data } + +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. + +/// info + +Ajouté dans FastAPI 0.134.0. + +/// + +## Cas d'utilisation { #use-cases } + +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 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. + +## Utiliser une `StreamingResponse` avec `yield` { #a-streamingresponse-with-yield } + +Si vous déclarez un `response_class=StreamingResponse` dans votre *fonction de chemin d'accès*, vous pouvez utiliser `yield` pour envoyer chaque bloc de données à son tour. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *} + +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 } + +Vous pouvez également utiliser des fonctions `def` classiques (sans `async`), et utiliser `yield` de la même manière. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[26:29] hl[27] *} + +### Sans annotation { #no-annotation } + +Vous n'avez pas vraiment besoin de déclarer l'annotation de type de retour pour diffuser des données binaires. + +Comme FastAPI n'essaiera pas de convertir les données en JSON avec Pydantic ni de les sérialiser, dans ce cas l'annotation de type ne sert qu'à votre éditeur et à vos outils ; elle ne sera pas utilisée par FastAPI. + +{* ../../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. 🤓 + +### Diffuser des bytes { #stream-bytes } + +L'un des principaux cas d'usage consiste à diffuser des `bytes` au lieu de chaînes ; vous pouvez bien sûr le faire. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[44:47] hl[47] *} + +## Créer une `PNGStreamingResponse` personnalisée { #a-custom-pngstreamingresponse } + +Dans les exemples ci-dessus, les octets de données étaient diffusés, mais la réponse n'avait pas d'en-tête `Content-Type`, le client ne savait donc pas quel type de données il recevait. + +Vous pouvez créer une sous-classe personnalisée de `StreamingResponse` qui définit l'en-tête `Content-Type` sur le type de données que vous diffusez. + +Par exemple, vous pouvez créer une `PNGStreamingResponse` qui définit l'en-tête `Content-Type` à `image/png` en utilisant l'attribut `media_type` : + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *} + +Vous pouvez ensuite utiliser cette nouvelle classe dans `response_class=PNGStreamingResponse` dans votre *fonction de chemin d'accès* : + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *} + +### Simuler un fichier { #simulate-a-file } + +Dans cet exemple, nous simulons un fichier avec `io.BytesIO`, qui est un objet de type fichier résidant uniquement en mémoire, mais qui permet d'utiliser la même interface. + +Par exemple, nous pouvons itérer dessus pour en consommer le contenu, comme nous le ferions avec un fichier. + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[1:27] hl[3,12:13,25] *} + +/// note | Détails techniques + +Les deux autres variables, `image_base64` et `binary_image`, correspondent à une image encodée en Base64, puis convertie en bytes, afin de la passer à `io.BytesIO`. + +C'est uniquement pour que tout tienne dans le même fichier pour cet exemple, et que vous puissiez le copier et l'exécuter tel quel. 🥚 + +/// + +En utilisant un bloc `with`, nous nous assurons que l'objet de type fichier est fermé après l'exécution de la fonction génératrice (la fonction avec `yield`). Donc, après la fin de l'envoi de la réponse. + +Ce ne serait pas si important dans cet exemple précis, car il s'agit d'un faux fichier en mémoire (avec `io.BytesIO`), mais avec un vrai fichier, il est important de s'assurer qu'il est fermé une fois le travail terminé. + +### Gérer les fichiers et async { #files-and-async } + +Dans la plupart des cas, les objets de type fichier ne sont pas compatibles avec `async` et `await` par défaut. + +Par exemple, ils n'ont pas de `await file.read()`, ni de `async for chunk in file`. + +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 + +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. + +Mais dans de nombreux cas, la lecture d'un fichier ou d'un objet de type fichier bloquera. + +/// + +Pour éviter de bloquer la boucle d'événements, vous pouvez simplement déclarer la *fonction de chemin d'accès* avec un `def` classique au lieu de `async def`. Ainsi, FastAPI l'exécutera dans un worker de pool de threads, afin d'éviter de bloquer la boucle principale. + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *} + +/// tip | Astuce + +Si vous devez appeler du code bloquant depuis une fonction async, ou une fonction async depuis une fonction bloquante, vous pouvez utiliser [Asyncer](https://asyncer.tiangolo.com), une bibliothèque sœur de FastAPI. + +/// + +### `yield from` { #yield-from } + +Lorsque vous itérez sur quelque chose, comme un objet de type fichier, et que vous faites un `yield` pour chaque élément, vous pouvez aussi utiliser `yield from` pour émettre chaque élément directement et éviter la boucle `for`. + +Ce n'est pas spécifique à FastAPI, c'est simplement Python, mais c'est une astuce utile à connaître. 😎 + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[37:40] hl[40] *} diff --git a/docs/fr/docs/advanced/strict-content-type.md b/docs/fr/docs/advanced/strict-content-type.md new file mode 100644 index 0000000000..d5c749e9df --- /dev/null +++ b/docs/fr/docs/advanced/strict-content-type.md @@ -0,0 +1,88 @@ +# Vérifier strictement le Content-Type { #strict-content-type-checking } + +Par défaut, FastAPI applique une vérification stricte de l’en-tête `Content-Type` pour les corps de requêtes JSON ; cela signifie que les requêtes JSON doivent inclure un en-tête `Content-Type` valide (par ex. `application/json`) pour que le corps soit analysé comme JSON. + +## Risque CSRF { #csrf-risk } + +Ce comportement par défaut offre une protection contre une catégorie d’attaques de Cross-Site Request Forgery (CSRF) dans un scénario très spécifique. + +Ces attaques exploitent le fait que les navigateurs permettent à des scripts d’envoyer des requêtes sans effectuer de pré-vérification CORS (preflight) lorsqu’ils : + +* n’ont pas d’en-tête `Content-Type` (par ex. en utilisant `fetch()` avec un corps `Blob`) +* et n’envoient aucune information d’authentification. + +Ce type d’attaque est surtout pertinent lorsque : + +* l’application s’exécute localement (par ex. sur `localhost`) ou sur un réseau interne +* et l’application n’a aucun mécanisme d’authentification, elle part du principe que toute requête provenant du même réseau est fiable. + +## Exemple d’attaque { #example-attack } + +Imaginez que vous mettiez au point un moyen d’exécuter un agent IA local. + +Il expose une API à l’adresse + +``` +http://localhost:8000/v1/agents/multivac +``` + +Il y a aussi un frontend à l’adresse + +``` +http://localhost:8000 +``` + +/// tip | Astuce + +Notez qu’ils ont le même hôte. + +/// + +Vous pouvez alors, via le frontend, amener l’agent IA à effectuer des actions en votre nom. + +Comme il s’exécute localement, et non sur l’Internet ouvert, vous décidez de ne mettre en place aucun mécanisme d’authentification, en vous fiant simplement à l’accès au réseau local. + +Un de vos utilisateurs pourrait alors l’installer et l’exécuter localement. + +Il pourrait ensuite ouvrir un site malveillant, par exemple quelque chose comme + +``` +https://evilhackers.example.com +``` + +Et ce site malveillant enverrait des requêtes en utilisant `fetch()` avec un corps `Blob` vers l’API locale à l’adresse + +``` +http://localhost:8000/v1/agents/multivac +``` + +Même si l’hôte du site malveillant et celui de l’application locale sont différents, le navigateur ne déclenchera pas de pré-vérification CORS (preflight) parce que : + +* Elle s’exécute sans aucune authentification, il n’y a pas à envoyer d’informations d’authentification. +* Le navigateur pense qu’il n’envoie pas de JSON (faute d’en-tête `Content-Type`). + +Le site malveillant pourrait alors amener l’agent IA local à envoyer des messages en colère à l’ancien patron de l’utilisateur ... ou pire. 😅 + +## Internet ouvert { #open-internet } + +Si votre application est exposée sur l’Internet ouvert, vous ne « ferez pas confiance au réseau » et ne laisserez pas n’importe qui envoyer des requêtes privilégiées sans authentification. + +Des attaquants pourraient simplement exécuter un script pour envoyer des requêtes à votre API, sans interaction avec le navigateur ; vous sécurisez donc probablement déjà tout endpoint privilégié. + +Dans ce cas, cette attaque / ce risque ne vous concerne pas. + +Ce risque et cette attaque sont surtout pertinents lorsque l’application s’exécute sur le réseau local et que c’est la seule protection supposée. + +## Autoriser les requêtes sans Content-Type { #allowing-requests-without-content-type } + +Si vous devez prendre en charge des clients qui n’envoient pas d’en-tête `Content-Type`, vous pouvez désactiver la vérification stricte en définissant `strict_content_type=False` : + +{* ../../docs_src/strict_content_type/tutorial001_py310.py hl[4] *} + +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 + +Ce comportement et cette configuration ont été ajoutés dans FastAPI 0.132.0. + +/// diff --git a/docs/fr/docs/advanced/sub-applications.md b/docs/fr/docs/advanced/sub-applications.md index 777056040e..07bd74b132 100644 --- a/docs/fr/docs/advanced/sub-applications.md +++ b/docs/fr/docs/advanced/sub-applications.md @@ -30,25 +30,25 @@ Dans ce cas, elle sera montée au chemin `/subapi` : ### Vérifier la documentation API automatique { #check-the-automatic-api-docs } -Exécutez maintenant la commande `fastapi` avec votre fichier : +Exécutez maintenant la commande `fastapi` :
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Puis ouvrez la documentation à http://127.0.0.1:8000/docs. +Et ouvrez la documentation à [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Vous verrez la documentation API automatique pour l'application principale, n'incluant que ses propres _chemins d'accès_ : -Ensuite, ouvrez la documentation de la sous‑application à http://127.0.0.1:8000/subapi/docs. +Ensuite, ouvrez la documentation de la sous‑application à [http://127.0.0.1:8000/subapi/docs](http://127.0.0.1:8000/subapi/docs). Vous verrez la documentation API automatique pour la sous‑application, n'incluant que ses propres _chemins d'accès_, tous sous le préfixe de sous‑chemin correct `/subapi` : @@ -64,4 +64,4 @@ De cette manière, la sous‑application saura utiliser ce préfixe de chemin po La sous‑application peut également avoir ses propres sous‑applications montées et tout fonctionnera correctement, car FastAPI gère automatiquement tous ces `root_path`. -Vous en apprendrez davantage sur `root_path` et sur la façon de l'utiliser explicitement dans la section [Derrière un proxy](behind-a-proxy.md){.internal-link target=_blank}. +Vous en apprendrez davantage sur `root_path` et sur la façon de l'utiliser explicitement dans la section [Derrière un proxy](behind-a-proxy.md). diff --git a/docs/fr/docs/advanced/templates.md b/docs/fr/docs/advanced/templates.md index 7c886ab695..582cf925ba 100644 --- a/docs/fr/docs/advanced/templates.md +++ b/docs/fr/docs/advanced/templates.md @@ -8,7 +8,7 @@ Il existe des utilitaires pour le configurer facilement que vous pouvez utiliser ## Installer les dépendances { #install-dependencies } -Vous devez créer un [environnement virtuel](../virtual-environments.md){.internal-link target=_blank}, l'activer, puis installer `jinja2` : +Vous devez créer un [environnement virtuel](../virtual-environments.md), l'activer, puis installer `jinja2` :
@@ -123,4 +123,4 @@ Et comme vous utilisez `StaticFiles`, ce fichier CSS est servi automatiquement p ## En savoir plus { #more-details } -Pour plus de détails, y compris sur la façon de tester des templates, consultez la documentation de Starlette sur les templates. +Pour plus de détails, y compris sur la façon de tester des templates, consultez [la documentation de Starlette sur les templates](https://www.starlette.dev/templates/). diff --git a/docs/fr/docs/advanced/testing-websockets.md b/docs/fr/docs/advanced/testing-websockets.md index e9f97ab5f2..3f35e13cc3 100644 --- a/docs/fr/docs/advanced/testing-websockets.md +++ b/docs/fr/docs/advanced/testing-websockets.md @@ -8,6 +8,6 @@ Pour cela, vous utilisez `TestClient` dans une instruction `with`, en vous conne /// note | Remarque -Pour plus de détails, consultez la documentation de Starlette sur le test des WebSockets. +Pour plus de détails, consultez la documentation de Starlette sur le [test des WebSockets](https://www.starlette.dev/testclient/#testing-websocket-sessions). /// diff --git a/docs/fr/docs/advanced/using-request-directly.md b/docs/fr/docs/advanced/using-request-directly.md index 4df3f90e8b..f7779f1a07 100644 --- a/docs/fr/docs/advanced/using-request-directly.md +++ b/docs/fr/docs/advanced/using-request-directly.md @@ -15,7 +15,7 @@ Mais il existe des situations où vous pouvez avoir besoin d'accéder directemen ## Détails sur l'objet `Request` { #details-about-the-request-object } -Comme **FastAPI** est en fait **Starlette** en dessous, avec une couche de plusieurs outils au-dessus, vous pouvez utiliser directement l'objet `Request` de Starlette lorsque vous en avez besoin. +Comme **FastAPI** est en fait **Starlette** en dessous, avec une couche de plusieurs outils au-dessus, vous pouvez utiliser directement l'objet [`Request`](https://www.starlette.dev/requests/) de Starlette lorsque vous en avez besoin. Cela signifie aussi que si vous récupérez des données directement à partir de l'objet `Request` (par exemple, lire le corps), elles ne seront pas validées, converties ni documentées (avec OpenAPI, pour l'interface utilisateur automatique de l'API) par FastAPI. @@ -45,7 +45,7 @@ De la même façon, vous pouvez déclarer tout autre paramètre normalement, et ## Documentation de `Request` { #request-documentation } -Vous pouvez lire plus de détails sur l'objet `Request` sur le site de documentation officiel de Starlette. +Vous pouvez lire plus de détails sur [l'objet `Request` sur le site de documentation officiel de Starlette](https://www.starlette.dev/requests/). /// note | Détails techniques diff --git a/docs/fr/docs/advanced/websockets.md b/docs/fr/docs/advanced/websockets.md index d78f89c374..737bbc72e3 100644 --- a/docs/fr/docs/advanced/websockets.md +++ b/docs/fr/docs/advanced/websockets.md @@ -1,10 +1,10 @@ # WebSockets { #websockets } -Vous pouvez utiliser API WebSockets avec **FastAPI**. +Vous pouvez utiliser [WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) avec **FastAPI**. ## Installer `websockets` { #install-websockets } -Vous devez créer un [environnement virtuel](../virtual-environments.md){.internal-link target=_blank}, l'activer, et installer `websockets` (une bibliothèque Python qui facilite l'utilisation du protocole « WebSocket ») : +Vous devez créer un [environnement virtuel](../virtual-environments.md), l'activer, et installer `websockets` (une bibliothèque Python qui facilite l'utilisation du protocole « WebSocket ») :
@@ -64,19 +64,19 @@ Vous pouvez recevoir et envoyer des données binaires, texte et JSON. ## Essayer { #try-it } -Si votre fichier s'appelle `main.py`, exécutez votre application avec : +Mettez votre code dans un fichier `main.py` puis exécutez votre application :
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Ouvrez votre navigateur à l'adresse http://127.0.0.1:8000. +Ouvrez votre navigateur à l'adresse [http://127.0.0.1:8000](http://127.0.0.1:8000). Vous verrez une page simple comme : @@ -115,25 +115,25 @@ Ils fonctionnent de la même manière que pour les autres endpoints/*chemins d'a Comme il s'agit d'un WebSocket, il n'est pas vraiment logique de lever une `HTTPException`, nous levons plutôt une `WebSocketException`. -Vous pouvez utiliser un code de fermeture parmi les codes valides définis dans la spécification. +Vous pouvez utiliser un code de fermeture parmi les [codes valides définis dans la spécification](https://tools.ietf.org/html/rfc6455#section-7.4.1). /// ### Essayez les WebSockets avec des dépendances { #try-the-websockets-with-dependencies } -Si votre fichier s'appelle `main.py`, exécutez votre application avec : +Exécutez votre application :
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Ouvrez votre navigateur à l'adresse http://127.0.0.1:8000. +Ouvrez votre navigateur à l'adresse [http://127.0.0.1:8000](http://127.0.0.1:8000). Là, vous pouvez définir : @@ -174,7 +174,7 @@ L'application ci-dessus est un exemple minimal et simple pour montrer comment g Mais gardez à l'esprit que, comme tout est géré en mémoire, dans une seule liste, cela ne fonctionnera que tant que le processus s'exécute et uniquement avec un seul processus. -Si vous avez besoin de quelque chose de facile à intégrer avec FastAPI mais plus robuste, pris en charge par Redis, PostgreSQL ou autres, consultez encode/broadcaster. +Si vous avez besoin de quelque chose de facile à intégrer avec FastAPI mais plus robuste, pris en charge par Redis, PostgreSQL ou autres, consultez [encode/broadcaster](https://github.com/encode/broadcaster). /// @@ -182,5 +182,5 @@ Si vous avez besoin de quelque chose de facile à intégrer avec FastAPI mais pl Pour en savoir plus sur les options, consultez la documentation de Starlette concernant : -* La classe `WebSocket`. -* Gestion des WebSocket basée sur des classes. +* [La classe `WebSocket`](https://www.starlette.dev/websockets/). +* [Gestion des WebSocket basée sur des classes](https://www.starlette.dev/endpoints/#websocketendpoint). diff --git a/docs/fr/docs/advanced/wsgi.md b/docs/fr/docs/advanced/wsgi.md index fc89819d27..fe39729f7f 100644 --- a/docs/fr/docs/advanced/wsgi.md +++ b/docs/fr/docs/advanced/wsgi.md @@ -1,6 +1,6 @@ # 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){.internal-link target=_blank}, [Derrière un proxy](behind-a-proxy.md){.internal-link target=_blank}. +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. @@ -36,13 +36,13 @@ Désormais, chaque requête sous le chemin `/v1/` sera gérée par l'application Et le reste sera géré par **FastAPI**. -Si vous l'exécutez et allez à http://localhost:8000/v1/, vous verrez la réponse de Flask : +Si vous l'exécutez et allez à [http://localhost:8000/v1/](http://localhost:8000/v1/) vous verrez la réponse de Flask : ```txt Hello, World from Flask! ``` -Et si vous allez à http://localhost:8000/v2, vous verrez la réponse de FastAPI : +Et si vous allez à [http://localhost:8000/v2](http://localhost:8000/v2) vous verrez la réponse de FastAPI : ```JSON { diff --git a/docs/fr/docs/alternatives.md b/docs/fr/docs/alternatives.md index c344bd1f88..54ad83ae84 100644 --- a/docs/fr/docs/alternatives.md +++ b/docs/fr/docs/alternatives.md @@ -17,7 +17,7 @@ précédents, en utilisant des fonctionnalités du langage qui n'étaient même ## Outils précédents { #previous-tools } -### Django { #django } +### [Django](https://www.djangoproject.com/) { #django } C'est le framework Python le plus populaire et il bénéficie d'une grande confiance. Il est utilisé pour construire des systèmes tel qu'Instagram. @@ -28,9 +28,9 @@ stockage. Il a été créé pour générer le HTML en backend, pas pour créer des API consommées par un frontend moderne (comme React, Vue.js et Angular) ou par d'autres systèmes (comme les appareils IoT) communiquant avec lui. -### Django REST Framework { #django-rest-framework } +### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework } -Django REST framework a été conçu comme une boîte à outils flexible permettant de construire des API Web à partir de Django, afin d'améliorer ses capacités en matière d'API. +Django REST Framework a été conçu comme une boîte à outils flexible permettant de construire des API Web à partir de Django, afin d'améliorer ses capacités en matière d'API. Il est utilisé par de nombreuses entreprises, dont Mozilla, Red Hat et Eventbrite. @@ -39,7 +39,7 @@ 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 créateur de Starlette et Uvicorn, sur lesquels **FastAPI** est basé. /// @@ -49,7 +49,7 @@ Avoir une interface de documentation automatique de l'API. /// -### Flask { #flask } +### [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. @@ -73,7 +73,7 @@ Proposer un système de routage simple et facile à utiliser. /// -### Requests { #requests } +### [Requests](https://requests.readthedocs.io) { #requests } **FastAPI** n'est pas réellement une alternative à **Requests**. Leur cadre est très différent. @@ -115,7 +115,7 @@ Notez les similitudes entre `requests.get(...)` et `@app.get(...)`. /// -### Swagger / OpenAPI { #swagger-openapi } +### [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. @@ -134,8 +134,8 @@ Adopter et utiliser une norme ouverte pour les spécifications des API, au lieu Intégrer des outils d'interface utilisateur basés sur des normes : -* Swagger UI -* ReDoc +* [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**). @@ -147,7 +147,7 @@ Il y a plusieurs frameworks REST pour Flask, mais après avoir investi du temps découvert que le développement de beaucoup d'entre eux sont suspendus ou abandonnés, avec plusieurs problèmes permanents qui les rendent inadaptés. -### Marshmallow { #marshmallow } +### [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 à les convertir en quelque chose qui peut être envoyé sur le réseau. Par exemple, convertir un objet contenant des @@ -166,11 +166,11 @@ Mais elle a été créée avant que les annotations de type n'existent en Python /// check | A inspiré **FastAPI** à -Utilisez du code pour définir des « schémas » qui fournissent automatiquement les types de données et la validation. +Utiliser du code pour définir des « schémas » qui fournissent automatiquement les types de données et la validation. /// -### Webargs { #webargs } +### [Webargs](https://webargs.readthedocs.io/en/latest/) { #webargs } Une autre grande fonctionnalité requise par les API est l’analyse des données provenant des requêtes entrantes. @@ -192,7 +192,7 @@ Disposer d'une validation automatique des données des requêtes entrantes. /// -### APISpec { #apispec } +### [APISpec](https://apispec.readthedocs.io/en/stable/) { #apispec } Marshmallow et Webargs fournissent la validation, l'analyse et la sérialisation en tant que plug-ins. @@ -222,7 +222,7 @@ Supporter la norme ouverte pour les API, OpenAPI. /// -### Flask-apispec { #flask-apispec } +### [Flask-apispec](https://flask-apispec.readthedocs.io/en/latest/) { #flask-apispec } C'est un plug-in pour Flask, qui relie Webargs, Marshmallow et APISpec. @@ -237,11 +237,11 @@ Cette combinaison de Flask, Flask-apispec avec Marshmallow et Webargs était ma Son utilisation a conduit à la création de plusieurs générateurs Flask full-stack. Ce sont les principales stacks que j'ai (ainsi que plusieurs équipes externes) utilisées jusqu'à présent : -* https://github.com/tiangolo/full-stack -* https://github.com/tiangolo/full-stack-flask-couchbase -* https://github.com/tiangolo/full-stack-flask-couchdb +* [https://github.com/tiangolo/full-stack](https://github.com/tiangolo/full-stack) +* [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){.internal-link target=_blank}. +Ces mêmes générateurs full-stack ont servi de base aux [Générateurs de projets pour **FastAPI**](project-generation.md). /// info @@ -255,7 +255,7 @@ Générer le schéma OpenAPI automatiquement, à partir du même code qui défin /// -### NestJS (et Angular) { #nestjs-and-angular } +### [NestJS](https://nestjs.com/) (et [Angular](https://angular.io/)) { #nestjs-and-angular } Ce n'est même pas du Python, NestJS est un framework JavaScript (TypeScript) NodeJS inspiré d'Angular. @@ -278,13 +278,13 @@ Disposer d'un puissant système d'injection de dépendances. Trouver un moyen de /// -### Sanic { #sanic } +### [Sanic](https://sanic.readthedocs.io/en/latest/) { #sanic } C'était l'un des premiers frameworks Python extrêmement rapides basés sur `asyncio`. Il a été conçu pour être très similaire à Flask. /// note | Détails techniques -Il utilisait `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 du système 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. @@ -292,13 +292,13 @@ Il a clairement inspiré Uvicorn et Starlette, qui sont actuellement plus rapide /// check | A inspiré **FastAPI** à -Trouvez un moyen d'avoir une performance folle. +Trouver un moyen d'avoir une performance folle. C'est pourquoi **FastAPI** est basé sur Starlette, car il s'agit du framework le plus rapide disponible (testé par des benchmarks tiers). /// -### Falcon { #falcon } +### [Falcon](https://falconframework.org/) { #falcon } Falcon est un autre framework Python haute performance, il est conçu pour être minimal, et est utilisé comme fondation pour d'autres frameworks comme Hug. @@ -312,13 +312,13 @@ Ainsi, la validation, la sérialisation et la documentation des données doivent Trouver des moyens d'obtenir de bonnes performances. -Avec Hug (puisque Hug est basé sur Falcon), **FastAPI** a inspiré la déclaration d'un paramètre `response` dans les fonctions. +Avec Hug (puisque Hug est basé sur Falcon), cela a inspiré **FastAPI** à déclarer un paramètre `response` dans les fonctions. Bien que dans FastAPI, il est facultatif, et est utilisé principalement pour définir les en-têtes, les cookies, et les codes de statut alternatifs. /// -### Molten { #molten } +### [Molten](https://moltenframework.com/) { #molten } J'ai découvert Molten lors des premières étapes de développement de **FastAPI**. Et il a des idées assez similaires : @@ -346,7 +346,7 @@ Cela a en fait inspiré la mise à jour de certaines parties de Pydantic, afin d /// -### Hug { #hug } +### [Hug](https://github.com/hugapi/hug) { #hug } Hug a été l'un des premiers frameworks à implémenter la déclaration des types de paramètres d'API en utilisant les annotations de type Python. C'était une excellente idée qui a inspiré d'autres outils à faire de même. @@ -363,7 +363,7 @@ Comme il est basé sur l'ancienne norme pour les frameworks web Python synchrone /// info -Hug a été créé par Timothy Crosley, le créateur de `isort`, un excellent outil pour trier automatiquement les imports dans les fichiers Python. +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. /// @@ -378,7 +378,7 @@ Hug a inspiré **FastAPI** pour déclarer un paramètre `response` dans les fonc /// -### APIStar (<= 0.5) { #apistar-0-5 } +### [APIStar](https://github.com/encode/apistar) (<= 0.5) { #apistar-0-5 } Juste avant de décider de développer **FastAPI**, j'ai trouvé le serveur **APIStar**. Il contenait presque tout ce que je recherchais et avait un beau design. @@ -430,7 +430,7 @@ Je considère **FastAPI** comme un « successeur spirituel » d'APIStar, tout en ## Utilisés par **FastAPI** { #used-by-fastapi } -### Pydantic { #pydantic } +### [Pydantic](https://docs.pydantic.dev/) { #pydantic } Pydantic est une bibliothèque permettant de définir la validation, la sérialisation et la documentation des données (à l'aide de JSON Schema) en se basant sur les annotations de type Python. @@ -447,7 +447,7 @@ Gérer toute la validation des données, leur sérialisation et la documentation /// -### Starlette { #starlette } +### [Starlette](https://www.starlette.dev/) { #starlette } Starlette est un framework/toolkit léger ASGI, qui est idéal pour construire des services asyncio performants. @@ -492,7 +492,7 @@ Ainsi, tout ce que vous pouvez faire avec Starlette, vous pouvez le faire direct /// -### Uvicorn { #uvicorn } +### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn } Uvicorn est un serveur ASGI rapide comme l'éclair, basé sur uvloop et httptools. @@ -507,10 +507,10 @@ Le serveur web principal pour exécuter les applications **FastAPI**. Vous pouvez également utiliser l'option de ligne de commande `--workers` pour avoir un serveur multi‑processus asynchrone. -Pour plus de détails, consultez la section [Déploiement](deployment/index.md){.internal-link target=_blank}. +Pour plus de détails, consultez la section [Déploiement](deployment/index.md). /// ## Benchmarks et vitesse { #benchmarks-and-speed } -Pour comprendre, comparer et voir la différence entre Uvicorn, Starlette et FastAPI, consultez la section sur les [Benchmarks](benchmarks.md){.internal-link target=_blank}. +Pour comprendre, comparer et voir la différence entre Uvicorn, Starlette et FastAPI, consultez la section sur les [Benchmarks](benchmarks.md). diff --git a/docs/fr/docs/async.md b/docs/fr/docs/async.md index 72923e03b0..f2afba9c6d 100644 --- a/docs/fr/docs/async.md +++ b/docs/fr/docs/async.md @@ -40,11 +40,11 @@ def results(): --- -Si votre application n'a pas à communiquer avec une autre chose et à attendre sa réponse, utilisez `async def`, même si vous n'avez pas besoin d'utiliser `await` à l'intérieur. +Si votre application (d'une certaine manière) n'a pas à communiquer avec une autre chose et à attendre sa réponse, utilisez `async def`, même si vous n'avez pas besoin d'utiliser `await` à l'intérieur. --- -Si vous ne savez pas, utilisez seulement `def` comme vous le feriez habituellement. +Si vous ne savez pas, utilisez seulement `def`. --- @@ -141,7 +141,7 @@ Vous et votre crush 😍 mangez les burgers 🍔 et passez un bon moment ✨. /// info -Illustrations proposées par Ketrina Thompson. 🎨 +Illustrations proposées par [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨 /// @@ -207,7 +207,7 @@ Durant tout ce processus, il n'y a presque pas eu de discussions ou de flirts ca /// info -Illustrations proposées par Ketrina Thompson. 🎨 +Illustrations proposées par [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨 /// @@ -251,7 +251,7 @@ Ce type d'asynchronicité est ce qui a rendu NodeJS populaire (bien que NodeJS n Et c'est le même niveau de performance que celui obtenu avec **FastAPI**. -Et comme on peut avoir du parallélisme et de l'asynchronicité en même temps, on obtient des performances plus hautes que la plupart des frameworks NodeJS testés et égales à celles du Go, qui est un langage compilé plus proche du C (tout ça grâce à Starlette). +Et comme on peut avoir du parallélisme et de l'asynchronicité en même temps, on obtient des performances plus hautes que la plupart des frameworks NodeJS testés et égales à celles du Go, qui est un langage compilé plus proche du C [(tout ça grâce à Starlette)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1). ### Est-ce que la concurrence est mieux que le parallélisme ? { #is-concurrency-better-than-parallelism } @@ -298,7 +298,7 @@ Mais vous pouvez aussi profiter du parallélisme et du multiprocessing (plusieur Ç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**. -Pour comprendre comment mettre en place ce parallélisme en production, allez lire la section [Déploiement](deployment/index.md){.internal-link target=_blank}. +Pour comprendre comment mettre en place ce parallélisme en production, allez lire la section [Déploiement](deployment/index.md). ## `async` et `await` { #async-and-await } @@ -363,13 +363,13 @@ Mais si vous souhaitez utiliser `async` / `await` sans FastAPI, vous pouvez éga ### Écrire votre propre code async { #write-your-own-async-code } -Starlette (et **FastAPI**) s’appuie sur AnyIO, ce qui le rend compatible à la fois avec la bibliothèque standard asyncio de Python et avec Trio. +Starlette (et **FastAPI**) s’appuie sur [AnyIO](https://anyio.readthedocs.io/en/stable/), ce qui le rend compatible à la fois avec la bibliothèque standard [asyncio](https://docs.python.org/3/library/asyncio-task.html) de Python et avec [Trio](https://trio.readthedocs.io/en/stable/). -En particulier, vous pouvez utiliser directement AnyIO pour vos cas d’usage de concurrence avancés qui nécessitent des schémas plus élaborés dans votre propre code. +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 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. Elle sera particulièrement utile si vous devez **combiner du code async avec du code classique** (bloquant/synchrone). +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). ### Autres formes de code asynchrone { #other-forms-of-asynchronous-code } @@ -381,7 +381,7 @@ Cette même syntaxe (ou presque) a aussi été incluse récemment dans les versi 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. Mais le code aurait été bien plus difficile à comprendre, débugger, et concevoir. +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 JavaScript côté navigateur / NodeJS, vous auriez utilisé des « callbacks ». Menant potentiellement à ce que l'on appelle le « callback hell ». @@ -419,15 +419,15 @@ Quand vous déclarez une *fonction de chemin d'accès* avec un `def` normal et n 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. -Au final, dans les deux situations, il est fort probable que **FastAPI** soit tout de même [plus rapide](index.md#performance){.internal-link target=_blank} 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 de vitesse égale à) votre framework précédent. ### Dépendances { #dependencies } -La même chose s'applique aux [dépendances](tutorial/dependencies/index.md){.internal-link target=_blank}. 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 définie avec `def` plutôt que `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){.internal-link target=_blank} 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 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 ». ### Autres fonctions utilitaires { #other-utility-functions } diff --git a/docs/fr/docs/benchmarks.md b/docs/fr/docs/benchmarks.md index 4bb35dff7a..b895118c8b 100644 --- a/docs/fr/docs/benchmarks.md +++ b/docs/fr/docs/benchmarks.md @@ -1,6 +1,6 @@ # Tests de performance { #benchmarks } -Les benchmarks indépendants de TechEmpower montrent que les applications **FastAPI** s’exécutant avec Uvicorn sont parmi les frameworks Python les plus rapides disponibles, seulement en dessous de Starlette et Uvicorn eux‑mêmes (tous deux utilisés en interne par FastAPI). +Les benchmarks indépendants de TechEmpower montrent que les applications **FastAPI** s’exécutant avec Uvicorn sont [parmi les frameworks Python les plus rapides disponibles](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), seulement en dessous de Starlette et Uvicorn eux‑mêmes (tous deux utilisés en interne par FastAPI). Mais en prêtant attention aux tests de performance et aux comparaisons, vous devez tenir compte de ce qui suit. diff --git a/docs/fr/docs/deployment/cloud.md b/docs/fr/docs/deployment/cloud.md index 798a72a746..1ed030f0ac 100644 --- a/docs/fr/docs/deployment/cloud.md +++ b/docs/fr/docs/deployment/cloud.md @@ -6,7 +6,7 @@ Dans la plupart des cas, les principaux fournisseurs cloud proposent des guides ## FastAPI Cloud { #fastapi-cloud } -**FastAPI Cloud** est créée par le même auteur et l'équipe à l'origine de **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** est créée par le même auteur et l'équipe à l'origine de **FastAPI**. Elle simplifie le processus de **création**, de **déploiement** et **d'accès** à une API avec un effort minimal. @@ -16,9 +16,9 @@ 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){.internal-link target=_blank} ✨ également. 🙇 +D'autres fournisseurs cloud ✨ [**parrainent FastAPI**](../help-fastapi.md#sponsor-the-author) ✨ également. 🙇 Vous pouvez également envisager ces fournisseurs pour suivre leurs guides et essayer leurs services : -* Render -* Railway +* [Render](https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi) +* [Railway](https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi) diff --git a/docs/fr/docs/deployment/concepts.md b/docs/fr/docs/deployment/concepts.md index 59b8ddd1b9..1d5497d93c 100644 --- a/docs/fr/docs/deployment/concepts.md +++ b/docs/fr/docs/deployment/concepts.md @@ -25,7 +25,7 @@ Mais pour l'instant, voyons ces **idées conceptuelles** importantes. Ces concep ## Sécurité - HTTPS { #security-https } -Dans le [chapitre précédent à propos de HTTPS](https.md){.internal-link target=_blank}, nous avons vu comment HTTPS fournit le chiffrement pour votre API. +Dans le [chapitre précédent à propos de HTTPS](https.md), nous avons vu comment HTTPS fournit le chiffrement pour votre API. Nous avons également vu que HTTPS est normalement fourni par un composant **externe** à votre serveur d'application, un **TLS Termination Proxy**. @@ -190,7 +190,7 @@ Quand vous exécutez **plusieurs processus** du même programme d'API, on les ap ### Processus workers et ports { #worker-processes-and-ports } -Rappelez‑vous, d'après les documents [À propos de HTTPS](https.md){.internal-link target=_blank}, qu'un seul processus peut écouter une combinaison de port et d'adresse IP sur un serveur ? +Rappelez‑vous, d'après les documents [À propos de HTTPS](https.md), qu'un seul processus peut écouter une combinaison de port et d'adresse IP sur un serveur ? C'est toujours vrai. @@ -243,7 +243,7 @@ Voici quelques combinaisons et stratégies possibles : Ne vous inquiétez pas si certains de ces éléments concernant les **conteneurs**, Docker ou Kubernetes ne sont pas encore très clairs. -Je vous en dirai plus sur les images de conteneurs, Docker, Kubernetes, etc. dans un chapitre à venir : [FastAPI dans des conteneurs - Docker](docker.md){.internal-link target=_blank}. +Je vous en dirai plus sur les images de conteneurs, Docker, Kubernetes, etc. dans un chapitre à venir : [FastAPI dans des conteneurs - Docker](docker.md). /// @@ -281,7 +281,7 @@ Voici quelques idées possibles : /// tip | Astuce -Je vous donnerai des exemples plus concrets pour faire cela avec des conteneurs dans un chapitre à venir : [FastAPI dans des conteneurs - Docker](docker.md){.internal-link target=_blank}. +Je vous donnerai des exemples plus concrets pour faire cela avec des conteneurs dans un chapitre à venir : [FastAPI dans des conteneurs - Docker](docker.md). /// diff --git a/docs/fr/docs/deployment/docker.md b/docs/fr/docs/deployment/docker.md index 2d86d4a402..1567e1d582 100644 --- a/docs/fr/docs/deployment/docker.md +++ b/docs/fr/docs/deployment/docker.md @@ -1,6 +1,6 @@ # FastAPI dans des conteneurs - Docker { #fastapi-in-containers-docker } -Lors du déploiement d'applications FastAPI, une approche courante consiste à construire une **image de conteneur Linux**. C'est généralement fait avec **Docker**. Vous pouvez ensuite déployer cette image de conteneur de plusieurs façons possibles. +Lors du déploiement d'applications FastAPI, une approche courante consiste à construire une **image de conteneur Linux**. C'est généralement fait avec [**Docker**](https://www.docker.com/). Vous pouvez ensuite déployer cette image de conteneur de plusieurs façons possibles. L'utilisation de conteneurs Linux présente plusieurs avantages, notamment la **sécurité**, la **réplicabilité**, la **simplicité**, entre autres. @@ -60,16 +60,16 @@ Et le **conteneur** lui-même (par opposition à l'**image de conteneur**) est l Docker a été l'un des principaux outils pour créer et gérer des **images de conteneur** et des **conteneurs**. -Et il existe un Docker Hub public avec des **images de conteneur officielles** pré-construites pour de nombreux outils, environnements, bases de données et applications. +Et il existe un [Docker Hub](https://hub.docker.com/) public avec des **images de conteneur officielles** pré-construites pour de nombreux outils, environnements, bases de données et applications. -Par exemple, il existe une image Python officielle. +Par exemple, il existe une [image Python officielle](https://hub.docker.com/_/python). Et il existe beaucoup d'autres images pour différentes choses comme des bases de données, par exemple : -* PostgreSQL -* MySQL -* MongoDB -* Redis, etc. +* [PostgreSQL](https://hub.docker.com/_/postgres) +* [MySQL](https://hub.docker.com/_/mysql) +* [MongoDB](https://hub.docker.com/_/mongo) +* [Redis](https://hub.docker.com/_/redis), etc. En utilisant une image de conteneur pré-construite, il est très facile de **combiner** et d'utiliser différents outils. Par exemple, pour essayer une nouvelle base de données. Dans la plupart des cas, vous pouvez utiliser les **images officielles** et simplement les configurer avec des variables d'environnement. @@ -111,7 +111,7 @@ Cela dépendra principalement de l'outil que vous utilisez pour **installer** ce La manière la plus courante consiste à avoir un fichier `requirements.txt` avec les noms des paquets et leurs versions, un par ligne. -Vous utiliserez bien sûr les mêmes idées que vous avez lues dans [À propos des versions de FastAPI](versions.md){.internal-link target=_blank} pour définir les plages de versions. +Vous utiliserez bien sûr les mêmes idées que vous avez lues dans [À propos des versions de FastAPI](versions.md) pour définir les plages de versions. Par exemple, votre `requirements.txt` pourrait ressembler à : @@ -238,7 +238,7 @@ Vous devez vous assurer d'utiliser **toujours** la **forme exec** de l'instructi #### Utiliser `CMD` - Forme Exec { #use-cmd-exec-form } -L'instruction Docker `CMD` peut être écrite sous deux formes : +L'instruction Docker [`CMD`](https://docs.docker.com/reference/dockerfile/#cmd) peut être écrite sous deux formes : ✅ Forme **Exec** : @@ -254,11 +254,11 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] CMD fastapi run app/main.py --port 80 ``` -Assurez-vous d'utiliser toujours la forme **exec** pour garantir que FastAPI peut s'arrêter proprement et que les [événements de cycle de vie](../advanced/events.md){.internal-link target=_blank} sont déclenchés. +Assurez-vous d'utiliser toujours la forme **exec** pour garantir que FastAPI peut s'arrêter proprement et que les [événements de cycle de vie](../advanced/events.md) sont déclenchés. -Vous pouvez en lire davantage dans la documentation Docker sur les formes shell et exec. +Vous pouvez en lire davantage dans la [documentation Docker sur les formes shell et exec](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form). -Cela peut être très visible lors de l'utilisation de `docker compose`. Voir cette section de la FAQ Docker Compose pour plus de détails techniques : Pourquoi mes services mettent-ils 10 secondes à se recréer ou à s'arrêter ?. +Cela peut être très visible lors de l'utilisation de `docker compose`. Voir cette section de la FAQ Docker Compose pour plus de détails techniques : [Pourquoi mes services mettent-ils 10 secondes à se recréer ou à s'arrêter ?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop). #### Structure du répertoire { #directory-structure } @@ -352,7 +352,7 @@ $ docker run -d --name mycontainer -p 80:80 myimage ## Vérifier { #check-it } -Vous devriez pouvoir le vérifier via l'URL de votre conteneur Docker, par exemple : http://192.168.99.100/items/5?q=somequery ou http://127.0.0.1/items/5?q=somequery (ou équivalent, en utilisant votre hôte Docker). +Vous devriez pouvoir le vérifier via l'URL de votre conteneur Docker, par exemple : [http://192.168.99.100/items/5?q=somequery](http://192.168.99.100/items/5?q=somequery) ou [http://127.0.0.1/items/5?q=somequery](http://127.0.0.1/items/5?q=somequery) (ou équivalent, en utilisant votre hôte Docker). Vous verrez quelque chose comme : @@ -362,17 +362,17 @@ Vous verrez quelque chose comme : ## Documentation interactive de l'API { #interactive-api-docs } -Vous pouvez maintenant aller sur http://192.168.99.100/docs ou http://127.0.0.1/docs (ou équivalent, en utilisant votre hôte Docker). +Vous pouvez maintenant aller sur [http://192.168.99.100/docs](http://192.168.99.100/docs) ou [http://127.0.0.1/docs](http://127.0.0.1/docs) (ou équivalent, en utilisant votre hôte Docker). -Vous verrez la documentation interactive automatique de l'API (fournie par Swagger UI) : +Vous verrez la documentation interactive automatique de l'API (fournie par [Swagger UI](https://github.com/swagger-api/swagger-ui)) : ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ## Documentation alternative de l'API { #alternative-api-docs } -Et vous pouvez aussi aller sur http://192.168.99.100/redoc ou http://127.0.0.1/redoc (ou équivalent, en utilisant votre hôte Docker). +Et vous pouvez aussi aller sur [http://192.168.99.100/redoc](http://192.168.99.100/redoc) ou [http://127.0.0.1/redoc](http://127.0.0.1/redoc) (ou équivalent, en utilisant votre hôte Docker). -Vous verrez la documentation automatique alternative (fournie par ReDoc) : +Vous verrez la documentation automatique alternative (fournie par [ReDoc](https://github.com/Rebilly/ReDoc)) : ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -413,7 +413,7 @@ Lorsque vous passez le fichier à `fastapi run`, il détectera automatiquement q ## Concepts de déploiement { #deployment-concepts } -Parlons à nouveau de certains des mêmes [Concepts de déploiement](concepts.md){.internal-link target=_blank} en termes de conteneurs. +Parlons à nouveau de certains des mêmes [Concepts de déploiement](concepts.md) en termes de conteneurs. Les conteneurs sont principalement un outil pour simplifier le processus de **construction et de déploiement** d'une application, mais ils n'imposent pas une approche particulière pour gérer ces **concepts de déploiement**, et il existe plusieurs stratégies possibles. @@ -432,7 +432,7 @@ Passons en revue ces **concepts de déploiement** en termes de conteneurs : Si l'on se concentre uniquement sur l'**image de conteneur** pour une application FastAPI (et plus tard sur le **conteneur** en cours d'exécution), HTTPS serait normalement géré **à l'extérieur** par un autre outil. -Cela pourrait être un autre conteneur, par exemple avec Traefik, gérant **HTTPS** et l'acquisition **automatique** des **certificats**. +Cela pourrait être un autre conteneur, par exemple avec [Traefik](https://traefik.io/), gérant **HTTPS** et l'acquisition **automatique** des **certificats**. /// tip | Astuce @@ -558,7 +558,7 @@ Si vous avez **plusieurs conteneurs**, probablement chacun exécutant un **seul /// info -Si vous utilisez Kubernetes, ce sera probablement un Init Container. +Si vous utilisez Kubernetes, ce sera probablement un [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/). /// @@ -570,7 +570,7 @@ Si vous avez une configuration simple, avec **un seul conteneur** qui démarre e ### Image Docker de base { #base-docker-image } -Il existait une image Docker officielle FastAPI : tiangolo/uvicorn-gunicorn-fastapi. Mais elle est désormais dépréciée. ⛔️ +Il existait une image Docker officielle FastAPI : [tiangolo/uvicorn-gunicorn-fastapi](https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker). Mais elle est désormais dépréciée. ⛔️ Vous ne devriez probablement **pas** utiliser cette image Docker de base (ni aucune autre similaire). @@ -600,7 +600,7 @@ Par exemple : ## Image Docker avec `uv` { #docker-image-with-uv } -Si vous utilisez uv pour installer et gérer votre projet, vous pouvez suivre leur guide Docker pour uv. +Si vous utilisez [uv](https://github.com/astral-sh/uv) pour installer et gérer votre projet, vous pouvez suivre leur [guide Docker pour uv](https://docs.astral.sh/uv/guides/integration/docker/). ## Récapitulatif { #recap } diff --git a/docs/fr/docs/deployment/fastapicloud.md b/docs/fr/docs/deployment/fastapicloud.md index 72f275cf6f..836e914893 100644 --- a/docs/fr/docs/deployment/fastapicloud.md +++ b/docs/fr/docs/deployment/fastapicloud.md @@ -1,6 +1,6 @@ # FastAPI Cloud { #fastapi-cloud } -Vous pouvez déployer votre application FastAPI sur FastAPI Cloud avec une **seule commande**, allez vous inscrire sur la liste d’attente si ce n’est pas déjà fait. 🚀 +Vous pouvez déployer votre application FastAPI sur [FastAPI Cloud](https://fastapicloud.com) avec une **seule commande**, allez vous inscrire sur la liste d’attente si ce n’est pas déjà fait. 🚀 ## Se connecter { #login } @@ -40,7 +40,7 @@ C’est tout ! Vous pouvez maintenant accéder à votre application à cette URL ## À propos de FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** est développé par le même auteur et la même équipe à l’origine de **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** est développé par le même auteur et la même équipe à l’origine de **FastAPI**. Cela simplifie le processus de **création**, de **déploiement** et **d’accès** à une API avec un effort minimal. diff --git a/docs/fr/docs/deployment/https.md b/docs/fr/docs/deployment/https.md index 1b3c7be56c..34922f1686 100644 --- a/docs/fr/docs/deployment/https.md +++ b/docs/fr/docs/deployment/https.md @@ -10,7 +10,7 @@ Si vous êtes pressé ou si cela ne vous intéresse pas, continuez avec les sect /// -Pour apprendre les bases du HTTPS, du point de vue d'un utilisateur, consultez https://howhttps.works/. +Pour apprendre les bases du HTTPS, du point de vue d'un utilisateur, consultez [https://howhttps.works/](https://howhttps.works/). Maintenant, du point de vue d'un développeur, voici plusieurs choses à avoir en tête en pensant au HTTPS : @@ -28,13 +28,13 @@ Maintenant, du point de vue d'un développeur, voici plusieurs choses à avoir e * **Par défaut**, cela signifie que vous ne pouvez avoir qu'**un seul certificat HTTPS par adresse IP**. * Quelle que soit la taille de votre serveur ou la petitesse de chacune des applications qu'il contient. * Il existe cependant une **solution** à ce problème. -* Il existe une **extension** du protocole **TLS** (celui qui gère le cryptage au niveau TCP, avant HTTP) appelée **SNI**. +* Il existe une **extension** du protocole **TLS** (celui qui gère le cryptage au niveau TCP, avant HTTP) appelée **[SNI](https://en.wikipedia.org/wiki/Server_Name_Indication)**. * Cette extension SNI permet à un seul serveur (avec une **seule adresse IP**) d'avoir **plusieurs certificats HTTPS** et de servir **plusieurs domaines/applications HTTPS**. * Pour que cela fonctionne, un **seul** composant (programme) fonctionnant sur le serveur, écoutant sur l'**adresse IP publique**, doit avoir **tous les certificats HTTPS** du serveur. * **Après** l'établissement d'une connexion sécurisée, le protocole de communication est **toujours HTTP**. * Le contenu est **crypté**, même s'il est envoyé avec le **protocole HTTP**. -Il est courant d'avoir **un seul programme/serveur HTTP** fonctionnant sur le serveur (la machine, l'hôte, etc.) et **gérant toutes les parties HTTPS** : recevoir les **requêtes HTTPS chiffrées**, envoyer les **requêtes HTTP déchiffrées** à l'application HTTP réelle fonctionnant sur le même serveur (l'application **FastAPI**, dans ce cas), prendre la **réponse HTTP** de l'application, la **chiffrer** en utilisant le **certificat HTTPS** approprié et la renvoyer au client en utilisant **HTTPS**. Ce serveur est souvent appelé un **Proxy de terminaison TLS**. +Il est courant d'avoir **un seul programme/serveur HTTP** fonctionnant sur le serveur (la machine, l'hôte, etc.) et **gérant toutes les parties HTTPS** : recevoir les **requêtes HTTPS chiffrées**, envoyer les **requêtes HTTP déchiffrées** à l'application HTTP réelle fonctionnant sur le même serveur (l'application **FastAPI**, dans ce cas), prendre la **réponse HTTP** de l'application, la **chiffrer** en utilisant le **certificat HTTPS** approprié et la renvoyer au client en utilisant **HTTPS**. Ce serveur est souvent appelé un **[Proxy de terminaison TLS](https://en.wikipedia.org/wiki/TLS_termination_proxy)**. Parmi les options que vous pourriez utiliser comme Proxy de terminaison TLS : @@ -49,7 +49,7 @@ Avant Let's Encrypt, ces **certificats HTTPS** étaient vendus par des tiers de Le processus d'acquisition de l'un de ces certificats était auparavant lourd, nécessitait pas mal de paperasses et les certificats étaient assez chers. -Mais ensuite, **Let's Encrypt** a été créé. +Mais ensuite, **[Let's Encrypt](https://letsencrypt.org/)** a été créé. Il s'agit d'un projet de la Fondation Linux. Il fournit **des certificats HTTPS gratuitement**, de manière automatisée. Ces certificats utilisent toutes les sécurités cryptographiques standard et ont une durée de vie courte (environ 3 mois), de sorte que la **sécurité est en fait meilleure** en raison de leur durée de vie réduite. @@ -200,9 +200,9 @@ Ce **proxy** définirait normalement certains en-têtes HTTP à la volée avant Les en-têtes du proxy sont : -* X-Forwarded-For -* X-Forwarded-Proto -* X-Forwarded-Host +* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For) +* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto) +* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host) /// @@ -218,7 +218,7 @@ Cela serait utile, par exemple, pour gérer correctement les redirections. /// tip | Astuce -Vous pouvez en savoir plus dans la documentation [Derrière un proxy - Activer les en-têtes transmis par le proxy](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers){.internal-link target=_blank} +Vous pouvez en savoir plus dans la documentation [Derrière un proxy - Activer les en-têtes transmis par le proxy](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers) /// diff --git a/docs/fr/docs/deployment/index.md b/docs/fr/docs/deployment/index.md index 3b08e9af76..811d681600 100644 --- a/docs/fr/docs/deployment/index.md +++ b/docs/fr/docs/deployment/index.md @@ -22,7 +22,7 @@ utilisez. Vous pouvez **déployer un serveur** vous-même en utilisant une combinaison d'outils, vous pouvez utiliser un **service cloud** qui fait une partie du travail pour vous, ou encore d'autres options possibles. -Par exemple, nous, l'équipe derrière FastAPI, avons créé **FastAPI Cloud**, pour rendre le déploiement d'applications FastAPI dans le cloud aussi fluide que possible, avec la même expérience développeur que lorsque vous travaillez avec FastAPI. +Par exemple, nous, l'équipe derrière FastAPI, avons créé [**FastAPI Cloud**](https://fastapicloud.com), pour rendre le déploiement d'applications FastAPI dans le cloud aussi fluide que possible, avec la même expérience développeur que lorsque vous travaillez avec FastAPI. Je vais vous montrer certains des principaux concepts que vous devriez probablement avoir à l'esprit lors du déploiement d'une application **FastAPI** (bien que la plupart de ces concepts s'appliquent à tout autre type d'application web). diff --git a/docs/fr/docs/deployment/manually.md b/docs/fr/docs/deployment/manually.md index c0c388b02c..4b87df9935 100644 --- a/docs/fr/docs/deployment/manually.md +++ b/docs/fr/docs/deployment/manually.md @@ -52,11 +52,11 @@ La principale chose dont vous avez besoin pour exécuter une application **FastA Il existe plusieurs alternatives, notamment : -* Uvicorn : un serveur ASGI haute performance. -* Hypercorn : un serveur ASGI compatible avec HTTP/2 et Trio entre autres fonctionnalités. -* Daphne : le serveur ASGI conçu pour Django Channels. -* Granian : un serveur HTTP Rust pour les applications Python. -* NGINX Unit : NGINX Unit est un environnement d'exécution d'applications web léger et polyvalent. +* [Uvicorn](https://www.uvicorn.dev/) : un serveur ASGI haute performance. +* [Hypercorn](https://hypercorn.readthedocs.io/) : un serveur ASGI compatible avec HTTP/2 et Trio entre autres fonctionnalités. +* [Daphne](https://github.com/django/daphne) : le serveur ASGI conçu pour Django Channels. +* [Granian](https://github.com/emmett-framework/granian) : un serveur HTTP Rust pour les applications Python. +* [NGINX Unit](https://unit.nginx.org/howto/fastapi/) : NGINX Unit est un environnement d'exécution d'applications web léger et polyvalent. ## Machine serveur et programme serveur { #server-machine-and-server-program } @@ -74,7 +74,7 @@ Lorsque vous installez FastAPI, il est fourni avec un serveur de production, Uvi Mais vous pouvez également installer un serveur ASGI manuellement. -Vous devez créer un [environnement virtuel](../virtual-environments.md){.internal-link target=_blank}, l'activer, puis vous pouvez installer l'application serveur. +Vous devez créer un [environnement virtuel](../virtual-environments.md), l'activer, puis vous pouvez installer l'application serveur. Par exemple, pour installer Uvicorn : diff --git a/docs/fr/docs/deployment/server-workers.md b/docs/fr/docs/deployment/server-workers.md index 338a5003d5..c0eca2dccb 100644 --- a/docs/fr/docs/deployment/server-workers.md +++ b/docs/fr/docs/deployment/server-workers.md @@ -5,7 +5,7 @@ Reprenons ces concepts de déploiement vus précédemment : * Sécurité - HTTPS * Exécution au démarrage * Redémarrages -* Réplication (le nombre de processus en cours d'exécution) +* **Réplication (le nombre de processus en cours d'exécution)** * Mémoire * Étapes préalables avant le démarrage @@ -13,15 +13,15 @@ Jusqu'à présent, avec tous les tutoriels dans les documents, vous avez probabl Lors du déploiement d'applications, vous voudrez probablement avoir une réplication de processus pour tirer parti de plusieurs cœurs et pouvoir gérer davantage de requêtes. -Comme vous l'avez vu dans le chapitre précédent sur les [Concepts de déploiement](concepts.md){.internal-link target=_blank}, il existe plusieurs stratégies possibles. +Comme vous l'avez vu dans le chapitre précédent sur les [Concepts de déploiement](concepts.md), il existe plusieurs stratégies possibles. Ici, je vais vous montrer comment utiliser Uvicorn avec des processus workers en utilisant la commande `fastapi` ou directement la commande `uvicorn`. /// info | Info -Si vous utilisez des conteneurs, par exemple avec Docker ou Kubernetes, je vous en dirai plus à ce sujet dans le prochain chapitre : [FastAPI dans des conteneurs - Docker](docker.md){.internal-link target=_blank}. +Si vous utilisez des conteneurs, par exemple avec Docker ou Kubernetes, je vous en dirai plus à ce sujet dans le prochain chapitre : [FastAPI dans des conteneurs - Docker](docker.md). -En particulier, lorsque vous exécutez sur Kubernetes, vous ne voudrez probablement pas utiliser de workers et plutôt exécuter un seul processus Uvicorn par conteneur, mais je vous en parlerai plus en détail dans ce chapitre. +En particulier, lorsque vous exécutez sur **Kubernetes**, vous ne voudrez probablement **pas** utiliser de workers et plutôt exécuter **un seul processus Uvicorn par conteneur**, mais je vous en parlerai plus en détail dans ce chapitre. /// @@ -109,7 +109,7 @@ $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4 La seule option nouvelle ici est `--workers` qui indique à Uvicorn de démarrer 4 processus workers. -Vous pouvez aussi voir qu'il affiche le PID de chaque processus, `27365` pour le processus parent (c'est le gestionnaire de processus) et un pour chaque processus worker : `27368`, `27369`, `27370` et `27367`. +Vous pouvez aussi voir qu'il affiche le **PID** de chaque processus, `27365` pour le processus parent (c'est le **gestionnaire de processus**) et un pour chaque processus worker : `27368`, `27369`, `27370` et `27367`. ## Concepts de déploiement { #deployment-concepts } @@ -117,23 +117,23 @@ Ici, vous avez vu comment utiliser plusieurs workers pour paralléliser l'exécu Dans la liste des concepts de déploiement ci-dessus, l'utilisation de workers aide principalement à la partie réplication, et un peu aux redémarrages, mais vous devez toujours vous occuper des autres : -* Sécurité - HTTPS -* Exécution au démarrage +* **Sécurité - HTTPS** +* **Exécution au démarrage** * ***Redémarrages*** * Réplication (le nombre de processus en cours d'exécution) -* Mémoire -* Étapes préalables avant le démarrage +* **Mémoire** +* **Étapes préalables avant le démarrage** ## Conteneurs et Docker { #containers-and-docker } -Dans le prochain chapitre sur [FastAPI dans des conteneurs - Docker](docker.md){.internal-link target=_blank}, j'expliquerai quelques stratégies que vous pourriez utiliser pour gérer les autres concepts de déploiement. +Dans le prochain chapitre sur [FastAPI dans des conteneurs - Docker](docker.md), j'expliquerai quelques stratégies que vous pourriez utiliser pour gérer les autres **concepts de déploiement**. -Je vous montrerai comment créer votre propre image à partir de zéro pour exécuter un seul processus Uvicorn. C'est un processus simple et c'est probablement ce que vous voudrez faire lorsque vous utilisez un système distribué de gestion de conteneurs comme Kubernetes. +Je vous montrerai comment créer votre propre image à partir de zéro pour exécuter un seul processus Uvicorn. C'est un processus simple et c'est probablement ce que vous voudrez faire lorsque vous utilisez un système distribué de gestion de conteneurs comme **Kubernetes**. ## Récapitulatif { #recap } -Vous pouvez utiliser plusieurs processus workers avec l'option CLI `--workers` des commandes `fastapi` ou `uvicorn` pour tirer parti des CPU multicœurs, et exécuter plusieurs processus en parallèle. +Vous pouvez utiliser plusieurs processus workers avec l'option CLI `--workers` des commandes `fastapi` ou `uvicorn` pour tirer parti des **CPU multicœurs**, et exécuter **plusieurs processus en parallèle**. Vous pourriez utiliser ces outils et idées si vous mettez en place votre propre système de déploiement tout en prenant vous-même en charge les autres concepts de déploiement. -Consultez le prochain chapitre pour en savoir plus sur FastAPI avec des conteneurs (par exemple Docker et Kubernetes). Vous verrez que ces outils offrent aussi des moyens simples de résoudre les autres concepts de déploiement. ✨ +Consultez le prochain chapitre pour en savoir plus sur **FastAPI** avec des conteneurs (par exemple Docker et Kubernetes). Vous verrez que ces outils offrent aussi des moyens simples de résoudre les autres **concepts de déploiement**. ✨ diff --git a/docs/fr/docs/deployment/versions.md b/docs/fr/docs/deployment/versions.md index 81794428fb..8787bc3dea 100644 --- a/docs/fr/docs/deployment/versions.md +++ b/docs/fr/docs/deployment/versions.md @@ -4,7 +4,7 @@ De nouvelles fonctionnalités sont ajoutées fréquemment, des bogues sont corrigés régulièrement et le code s'améliore continuellement. -C'est pourquoi les versions actuelles sont toujours `0.x.x`, cela reflète que chaque version pourrait potentiellement comporter des changements non rétrocompatibles. Cela suit les conventions de versionnage sémantique. +C'est pourquoi les versions actuelles sont toujours `0.x.x`, cela reflète que chaque version pourrait potentiellement comporter des changements non rétrocompatibles. Cela suit les conventions de [versionnage sémantique](https://semver.org/). Vous pouvez créer des applications de production avec **FastAPI** dès maintenant (et vous le faites probablement depuis un certain temps), vous devez juste vous assurer que vous utilisez une version qui fonctionne correctement avec le reste de votre code. @@ -34,7 +34,7 @@ Si vous utilisez un autre outil pour gérer vos installations, comme `uv`, Poetr ## Versions disponibles { #available-versions } -Vous pouvez consulter les versions disponibles (par exemple, pour vérifier quelle est la dernière version en date) dans les [Notes de version](../release-notes.md){.internal-link target=_blank}. +Vous pouvez consulter les versions disponibles (par exemple, pour vérifier quelle est la dernière version en date) dans les [Notes de version](../release-notes.md). ## À propos des versions { #about-versions } @@ -66,7 +66,7 @@ Le « MINOR » est le numéro au milieu, par exemple, dans `0.2.3`, la version M Vous devez ajouter des tests pour votre application. -Avec **FastAPI** c'est très facile (merci à Starlette), consultez les documents : [Tests](../tutorial/testing.md){.internal-link target=_blank} +Avec **FastAPI** c'est très facile (merci à Starlette), consultez les documents : [Tests](../tutorial/testing.md) Après avoir des tests, vous pouvez mettre à niveau la version de **FastAPI** vers une version plus récente et vous assurer que tout votre code fonctionne correctement en exécutant vos tests. diff --git a/docs/fr/docs/editor-support.md b/docs/fr/docs/editor-support.md new file mode 100644 index 0000000000..59e0b3f151 --- /dev/null +++ b/docs/fr/docs/editor-support.md @@ -0,0 +1,23 @@ +# Prise en charge des éditeurs { #editor-support } + +L’extension officielle [Extension FastAPI](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) améliore votre flux de développement FastAPI grâce à la découverte des chemins d'accès, à la navigation, ainsi qu’au déploiement sur FastAPI Cloud et à la diffusion en direct des journaux. + +Pour plus de détails sur l’extension, reportez-vous au README sur le [référentiel GitHub](https://github.com/fastapi/fastapi-vscode). + +## Configurer et installer { #setup-and-installation } + +L’**Extension FastAPI** est disponible pour [VS Code](https://code.visualstudio.com/) et [Cursor](https://www.cursor.com/). Vous pouvez l’installer directement depuis le panneau Extensions de chaque éditeur en recherchant « FastAPI » et en sélectionnant l’extension publiée par **FastAPI Labs**. L’extension fonctionne également dans les éditeurs basés sur le navigateur tels que [vscode.dev](https://vscode.dev) et [github.dev](https://github.dev). + +### Découvrir l’application { #application-discovery } + +Par défaut, l’extension détecte automatiquement les applications FastAPI dans votre espace de travail en recherchant les fichiers qui instancient `FastAPI()`. Si la détection automatique ne convient pas à la structure de votre projet, vous pouvez spécifier un point d’entrée via `[tool.fastapi]` dans `pyproject.toml` ou le paramètre VS Code `fastapi.entryPoint`, en utilisant la notation de module (par ex. `myapp.main:app`). + +## Fonctionnalités { #features } + +- **Explorateur des chemins d'accès** — Une vue arborescente latérale de tous les *chemins d'accès* de votre application. Cliquez pour accéder à n’importe quelle définition de route ou de routeur. +- **Recherche de routes** — Recherchez par chemin, méthode ou nom avec Ctrl + Shift + E (sur macOS : Cmd + Shift + E). +- **Navigation CodeLens** — Liens cliquables au-dessus des appels du client de test (par ex. `client.get('/items')`) menant au *chemin d'accès* correspondant, pour naviguer rapidement entre les tests et l’implémentation. +- **Déployer sur FastAPI Cloud** — Déploiement en un clic de votre application sur [FastAPI Cloud](https://fastapicloud.com/). +- **Diffuser les journaux de l’application** — Diffusion en temps réel des journaux de votre application déployée sur FastAPI Cloud, avec filtrage par niveau et recherche textuelle. + +Si vous souhaitez vous familiariser avec les fonctionnalités de l’extension, vous pouvez consulter le guide pas à pas de l’extension en ouvrant la palette de commandes (Ctrl + Shift + P ou sur macOS : Cmd + Shift + P) et en sélectionnant « Welcome: Open walkthrough ... » puis en choisissant le guide « Get started with FastAPI ». diff --git a/docs/fr/docs/environment-variables.md b/docs/fr/docs/environment-variables.md index 57479852ae..7f052f27f6 100644 --- a/docs/fr/docs/environment-variables.md +++ b/docs/fr/docs/environment-variables.md @@ -65,7 +65,7 @@ print(f"Hello {name} from Python") /// tip | Astuce -Le deuxième argument de `os.getenv()` est la valeur par défaut à retourner. +Le deuxième argument de [`os.getenv()`](https://docs.python.org/3.8/library/os.html#os.getenv) est la valeur par défaut à retourner. S'il n'est pas fourni, c'est `None` par défaut ; ici, nous fournissons `"World"` comme valeur par défaut à utiliser. @@ -153,7 +153,7 @@ Hello World from Python /// tip | Astuce -Vous pouvez en lire davantage sur The Twelve-Factor App : Config. +Vous pouvez en lire davantage sur [The Twelve-Factor App : Config](https://12factor.net/config). /// @@ -163,7 +163,7 @@ Ces variables d'environnement ne peuvent gérer que des **chaînes de texte**, c Cela signifie que **toute valeur** lue en Python à partir d'une variable d'environnement **sera une `str`**, et que toute conversion vers un autre type ou toute validation doit être effectuée dans le code. -Vous en apprendrez davantage sur l'utilisation des variables d'environnement pour gérer les **paramètres d'application** dans le [Guide utilisateur avancé - Paramètres et variables d'environnement](./advanced/settings.md){.internal-link target=_blank}. +Vous en apprendrez davantage sur l'utilisation des variables d'environnement pour gérer les **paramètres d'application** dans le [Guide utilisateur avancé - Paramètres et variables d'environnement](./advanced/settings.md). ## Variable d'environnement `PATH` { #path-environment-variable } @@ -285,13 +285,13 @@ $ C:\opt\custompython\bin\python //// -Ces informations vous seront utiles lors de l'apprentissage des [Environnements virtuels](virtual-environments.md){.internal-link target=_blank}. +Ces informations vous seront utiles lors de l'apprentissage des [Environnements virtuels](virtual-environments.md). ## Conclusion { #conclusion } Avec cela, vous devriez avoir une compréhension de base de ce que sont les **variables d'environnement** et de la façon de les utiliser en Python. -Vous pouvez également en lire davantage sur la page Wikipédia dédiée aux variables d'environnement. +Vous pouvez également en lire davantage sur la [page Wikipédia dédiée aux variables d'environnement](https://en.wikipedia.org/wiki/Environment_variable). Dans de nombreux cas, il n'est pas évident de voir immédiatement en quoi les variables d'environnement seraient utiles et applicables. Mais elles réapparaissent dans de nombreux scénarios lorsque vous développez, il est donc bon de les connaître. diff --git a/docs/fr/docs/fastapi-cli.md b/docs/fr/docs/fastapi-cli.md index 9f31e8a2f6..03ef75adc7 100644 --- a/docs/fr/docs/fastapi-cli.md +++ b/docs/fr/docs/fastapi-cli.md @@ -1,15 +1,15 @@ # FastAPI CLI { #fastapi-cli } -**FastAPI CLI** est un programme en ligne de commande que vous pouvez utiliser pour servir votre application FastAPI, gérer votre projet FastAPI, et plus encore. +**FastAPI CLI** est un programme en ligne de commande que vous pouvez utiliser pour servir votre application FastAPI, gérer votre projet FastAPI, et plus encore. -Lorsque vous installez FastAPI (par exemple avec `pip install "fastapi[standard]"`), cela inclut un package appelé `fastapi-cli` ; ce package fournit la commande `fastapi` dans le terminal. +Lorsque vous installez FastAPI (par exemple avec `pip install "fastapi[standard]"`), il est fourni avec un programme en ligne de commande que vous pouvez exécuter dans le terminal. Pour exécuter votre application FastAPI en développement, vous pouvez utiliser la commande `fastapi dev` :
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -46,13 +46,66 @@ $ fastapi dev Uvicorn, un serveur ASGI haute performance, prêt pour la production. 😎 +De plus, d’autres outils pourraient ne pas pouvoir le trouver, par exemple l’[extension VS Code](editor-support.md) ou [FastAPI Cloud](https://fastapicloud.com), il est donc recommandé d’utiliser le `entrypoint` dans `pyproject.toml`. ## `fastapi dev` { #fastapi-dev } @@ -70,6 +123,6 @@ Dans la plupart des cas, vous avez (et devez avoir) un « termination proxy » a /// tip | Astuce -Vous pouvez en savoir plus à ce sujet dans la [documentation de déploiement](deployment/index.md){.internal-link target=_blank}. +Vous pouvez en savoir plus à ce sujet dans la [documentation de déploiement](deployment/index.md). /// diff --git a/docs/fr/docs/features.md b/docs/fr/docs/features.md index e5e809940a..7fae1d8817 100644 --- a/docs/fr/docs/features.md +++ b/docs/fr/docs/features.md @@ -6,8 +6,8 @@ ### Basé sur des standards ouverts { #based-on-open-standards } -* OpenAPI pour la création d'API, incluant la déclaration de chemin opérations, paramètres, corps de requêtes, sécurité, etc. -* Documentation automatique des modèles de données avec JSON Schema (puisque OpenAPI est lui-même basé sur JSON Schema). +* [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) pour la création d'API, incluant la déclaration de chemin opérations, paramètres, corps de requêtes, sécurité, etc. +* Documentation automatique des modèles de données avec [**JSON Schema**](https://json-schema.org/) (puisque OpenAPI est lui-même basé sur JSON Schema). * Conçu autour de ces standards, après une étude méticuleuse. Plutôt qu'une couche ajoutée après coup. * Cela permet également d'utiliser la **génération automatique de code client** dans de nombreux langages. @@ -15,11 +15,11 @@ Documentation d'API interactive et interfaces web d'exploration. Comme le framework est basé sur OpenAPI, plusieurs options existent, 2 incluses par défaut. -* Swagger UI, avec exploration interactive, appelez et testez votre API directement depuis le navigateur. +* [**Swagger UI**](https://github.com/swagger-api/swagger-ui), avec exploration interactive, appelez et testez votre API directement depuis le navigateur. ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) -* Documentation d'API alternative avec ReDoc. +* Documentation d'API alternative avec [**ReDoc**](https://github.com/Rebilly/ReDoc). ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) @@ -27,7 +27,7 @@ Documentation d'API interactive et interfaces web d'exploration. Comme le framew Tout est basé sur les déclarations de **types Python** standard (grâce à Pydantic). Aucune nouvelle syntaxe à apprendre. Juste du Python moderne standard. -Si vous avez besoin d'un rappel de 2 minutes sur l'utilisation des types en Python (même si vous n'utilisez pas FastAPI), consultez le court tutoriel : [Types Python](python-types.md){.internal-link target=_blank}. +Si vous avez besoin d'un rappel de 2 minutes sur l'utilisation des types en Python (même si vous n'utilisez pas FastAPI), consultez le court tutoriel : [Types Python](python-types.md). Vous écrivez du Python standard avec des types : @@ -75,7 +75,7 @@ Passez les clés et valeurs du dictionnaire `second_user_data` directement comme Tout le framework a été conçu pour être facile et intuitif à utiliser, toutes les décisions ont été testées sur plusieurs éditeurs avant même de commencer le développement, pour assurer la meilleure expérience de développement. -Dans les enquêtes auprès des développeurs Python, il est clair que l’une des fonctionnalités les plus utilisées est « autocomplétion ». +Dans les enquêtes auprès des développeurs Python, il est clair [que l’une des fonctionnalités les plus utilisées est « autocomplétion »](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features). L'ensemble du framework **FastAPI** est conçu pour satisfaire cela. L'autocomplétion fonctionne partout. @@ -83,11 +83,11 @@ Vous aurez rarement besoin de revenir aux documents. Voici comment votre éditeur peut vous aider : -* dans Visual Studio Code : +* dans [Visual Studio Code](https://code.visualstudio.com/) : ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) -* dans PyCharm : +* dans [PyCharm](https://www.jetbrains.com/pycharm/) : ![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png) @@ -124,7 +124,7 @@ Sécurité et authentification intégrées. Sans aucun compromis avec les bases Tous les schémas de sécurité définis dans OpenAPI, y compris : * HTTP Basic. -* **OAuth2** (également avec des **tokens JWT**). Consultez le tutoriel [OAuth2 avec JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. +* **OAuth2** (également avec des **tokens JWT**). Consultez le tutoriel [OAuth2 avec JWT](tutorial/security/oauth2-jwt.md). * Clés d'API dans : * les en-têtes. * les paramètres de requête. @@ -159,13 +159,13 @@ Toute intégration est conçue pour être si simple à utiliser (avec des dépen ## Fonctionnalités de Starlette { #starlette-features } -**FastAPI** est entièrement compatible avec (et basé sur) Starlette. Donc, tout code Starlette additionnel que vous avez fonctionnera aussi. +**FastAPI** est entièrement compatible avec (et basé sur) [**Starlette**](https://www.starlette.dev/). Donc, tout code Starlette additionnel que vous avez fonctionnera aussi. `FastAPI` est en fait une sous-classe de `Starlette`. Ainsi, si vous connaissez ou utilisez déjà Starlette, la plupart des fonctionnalités fonctionneront de la même manière. Avec **FastAPI** vous obtenez toutes les fonctionnalités de **Starlette** (puisque FastAPI est juste Starlette sous stéroïdes) : -* Des performances vraiment impressionnantes. C'est l’un des frameworks Python les plus rapides disponibles, à l’égal de **NodeJS** et **Go**. +* Des performances vraiment impressionnantes. C'est [l’un des frameworks Python les plus rapides disponibles, à l’égal de **NodeJS** et **Go**](https://github.com/encode/starlette#performance). * Prise en charge des **WebSocket**. * Tâches d'arrière-plan dans le processus. * Évènements de démarrage et d'arrêt. @@ -177,7 +177,7 @@ Avec **FastAPI** vous obtenez toutes les fonctionnalités de **Starlette** (puis ## Fonctionnalités de Pydantic { #pydantic-features } -**FastAPI** est entièrement compatible avec (et basé sur) Pydantic. Donc, tout code Pydantic additionnel que vous avez fonctionnera aussi. +**FastAPI** est entièrement compatible avec (et basé sur) [**Pydantic**](https://docs.pydantic.dev/). Donc, tout code Pydantic additionnel que vous avez fonctionnera aussi. Y compris des bibliothèques externes également basées sur Pydantic, servant d’ORM, d’ODM pour les bases de données. diff --git a/docs/fr/docs/help-fastapi.md b/docs/fr/docs/help-fastapi.md index 08d9a7a723..e24809d6a8 100644 --- a/docs/fr/docs/help-fastapi.md +++ b/docs/fr/docs/help-fastapi.md @@ -12,7 +12,7 @@ Et il existe aussi plusieurs façons d'obtenir de l'aide. ## S'abonner à la newsletter { #subscribe-to-the-newsletter } -Vous pouvez vous abonner à la (peu fréquente) [newsletter **FastAPI and friends**](newsletter.md){.internal-link target=_blank} pour rester informé à propos : +Vous pouvez vous abonner à la (peu fréquente) [newsletter **FastAPI and friends**](newsletter.md) pour rester informé à propos : * Nouvelles sur FastAPI et ses amis 🚀 * Guides 📝 @@ -22,17 +22,17 @@ Vous pouvez vous abonner à la (peu fréquente) [newsletter **FastAPI and friend ## Suivre FastAPI sur X (Twitter) { #follow-fastapi-on-x-twitter } -Suivez @fastapi sur **X (Twitter)** pour obtenir les dernières nouvelles sur **FastAPI**. 🐦 +[Suivez @fastapi sur **X (Twitter)**](https://x.com/fastapi) pour obtenir les dernières nouvelles sur **FastAPI**. 🐦 ## Mettre une étoile à **FastAPI** sur GitHub { #star-fastapi-in-github } -Vous pouvez « star » FastAPI sur GitHub (en cliquant sur le bouton étoile en haut à droite) : https://github.com/fastapi/fastapi. ⭐️ +Vous pouvez « star » FastAPI sur GitHub (en cliquant sur le bouton étoile en haut à droite) : [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). ⭐️ En ajoutant une étoile, les autres utilisateurs pourront le trouver plus facilement et voir qu'il a déjà été utile à d'autres. ## Suivre le dépôt GitHub pour les releases { #watch-the-github-repository-for-releases } -Vous pouvez « watch » FastAPI sur GitHub (en cliquant sur le bouton « watch » en haut à droite) : https://github.com/fastapi/fastapi. 👀 +Vous pouvez « watch » FastAPI sur GitHub (en cliquant sur le bouton « watch » en haut à droite) : [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀 Vous pouvez y sélectionner « Releases only ». @@ -40,45 +40,45 @@ Ainsi, vous recevrez des notifications (par e‑mail) chaque fois qu'il y aura u ## Entrer en contact avec l'auteur { #connect-with-the-author } -Vous pouvez entrer en contact avec moi (Sebastián Ramírez / `tiangolo`), l'auteur. +Vous pouvez entrer en contact avec [moi (Sebastián Ramírez / `tiangolo`)](https://tiangolo.com), l'auteur. Vous pouvez : -* Me suivre sur **GitHub**. +* [Me suivre sur **GitHub**](https://github.com/tiangolo). * Voir d'autres projets Open Source que j'ai créés et qui pourraient vous aider. * Me suivre pour voir quand je crée un nouveau projet Open Source. -* Me suivre sur **X (Twitter)** ou sur Mastodon. +* [Me suivre sur **X (Twitter)**](https://x.com/tiangolo) ou sur [Mastodon](https://fosstodon.org/@tiangolo). * Me dire comment vous utilisez FastAPI (j'adore l'entendre). * Être informé quand je fais des annonces ou publie de nouveaux outils. - * Vous pouvez aussi suivre @fastapi sur X (Twitter) (un compte séparé). -* Me suivre sur **LinkedIn**. + * Vous pouvez aussi [suivre @fastapi sur X (Twitter)](https://x.com/fastapi) (un compte séparé). +* [Me suivre sur **LinkedIn**](https://www.linkedin.com/in/tiangolo/). * Être informé quand je fais des annonces ou publie de nouveaux outils (même si j'utilise plus souvent X (Twitter) 🤷‍♂). -* Lire ce que j'écris (ou me suivre) sur **Dev.to** ou **Medium**. +* Lire ce que j'écris (ou me suivre) sur [**Dev.to**](https://dev.to/tiangolo) ou [**Medium**](https://medium.com/@tiangolo). * Lire d'autres idées, des articles, et découvrir des outils que j'ai créés. * Me suivre pour lire quand je publie quelque chose de nouveau. ## Tweeter à propos de **FastAPI** { #tweet-about-fastapi } -Tweetez à propos de **FastAPI** et faites savoir à moi et aux autres pourquoi vous l'appréciez. 🎉 +[Tweetez à propos de **FastAPI**](https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi) et faites savoir à moi et aux autres pourquoi vous l'appréciez. 🎉 J'adore entendre comment **FastAPI** est utilisé, ce que vous avez aimé, dans quel projet/quelle entreprise vous l'utilisez, etc. ## Voter pour FastAPI { #vote-for-fastapi } -* Votez pour **FastAPI** sur Slant. -* Votez pour **FastAPI** sur AlternativeTo. -* Indiquez que vous utilisez **FastAPI** sur StackShare. +* [Votez pour **FastAPI** sur Slant](https://www.slant.co/options/34241/~fastapi-review). +* [Votez pour **FastAPI** sur AlternativeTo](https://alternativeto.net/software/fastapi/about/). +* [Indiquez que vous utilisez **FastAPI** sur StackShare](https://stackshare.io/pypi-fastapi). ## Aider les autres avec des questions sur GitHub { #help-others-with-questions-in-github } Vous pouvez essayer d'aider les autres avec leurs questions dans : -* GitHub Discussions -* GitHub Issues +* [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered) +* [GitHub Issues](https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+) Dans de nombreux cas, vous connaissez peut-être déjà la réponse à ces questions. 🤓 -Si vous aidez beaucoup de personnes avec leurs questions, vous deviendrez un [Expert FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank} officiel. 🎉 +Si vous aidez beaucoup de personnes avec leurs questions, vous deviendrez un [Expert FastAPI](fastapi-people.md#fastapi-experts) officiel. 🎉 N'oubliez pas, le point le plus important est : essayez d'être aimable. Les gens viennent avec leurs frustrations et, dans bien des cas, ne posent pas la question de la meilleure façon, mais faites de votre mieux pour rester aimable. 🤗 @@ -104,7 +104,7 @@ Dans la plupart des cas et pour la plupart des questions, il y a quelque chose l Dans de nombreux cas, elle ne copiera qu'un fragment de code, mais ce n'est pas suffisant pour **reproduire le problème**. -* Vous pouvez leur demander de fournir un exemple minimal, complet et vérifiable, que vous pouvez **copier‑coller** et exécuter localement pour voir la même erreur ou le même comportement qu'ils observent, ou pour mieux comprendre leur cas d'utilisation. +* Vous pouvez leur demander de fournir un [exemple minimal, complet et vérifiable](https://stackoverflow.com/help/minimal-reproducible-example), que vous pouvez **copier‑coller** et exécuter localement pour voir la même erreur ou le même comportement qu'ils observent, ou pour mieux comprendre leur cas d'utilisation. * Si vous vous sentez très généreux, vous pouvez essayer de **créer un tel exemple** vous‑même, simplement à partir de la description du problème. Gardez simplement à l'esprit que cela peut prendre beaucoup de temps et qu'il peut être préférable de leur demander d'abord de clarifier le problème. @@ -125,7 +125,7 @@ S'ils répondent, il y a de fortes chances que vous ayez résolu leur problème, ## Suivre le dépôt GitHub { #watch-the-github-repository } -Vous pouvez « watch » FastAPI sur GitHub (en cliquant sur le bouton « watch » en haut à droite) : https://github.com/fastapi/fastapi. 👀 +Vous pouvez « watch » FastAPI sur GitHub (en cliquant sur le bouton « watch » en haut à droite) : [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀 Si vous sélectionnez « Watching » au lieu de « Releases only », vous recevrez des notifications lorsque quelqu'un crée une nouvelle issue ou question. Vous pouvez aussi préciser que vous ne souhaitez être notifié que pour les nouvelles issues, ou les discussions, ou les PR, etc. @@ -133,7 +133,7 @@ Vous pouvez alors essayer de les aider à résoudre ces questions. ## Poser des questions { #ask-questions } -Vous pouvez créer une nouvelle question dans le dépôt GitHub, par exemple pour : +Vous pouvez [créer une nouvelle question](https://github.com/fastapi/fastapi/discussions/new?category=questions) dans le dépôt GitHub, par exemple pour : * Poser une **question** ou demander à propos d'un **problème**. * Suggérer une nouvelle **fonctionnalité**. @@ -196,12 +196,12 @@ Donc, il est vraiment important que vous lisiez et exécutiez le code, et que vo ## Créer une Pull Request { #create-a-pull-request } -Vous pouvez [contribuer](contributing.md){.internal-link target=_blank} au code source avec des Pull Requests, par exemple : +Vous pouvez [contribuer](contributing.md) au code source avec des Pull Requests, par exemple : * Corriger une coquille que vous avez trouvée dans la documentation. -* Partager un article, une vidéo ou un podcast que vous avez créé ou trouvé à propos de FastAPI en modifiant ce fichier. +* Partager un article, une vidéo ou un podcast que vous avez créé ou trouvé à propos de FastAPI en [modifiant ce fichier](https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml). * Vous devez vous assurer d'ajouter votre lien au début de la section correspondante. -* Aider à [traduire la documentation](contributing.md#translations){.internal-link target=_blank} dans votre langue. +* Aider à [traduire la documentation](contributing.md#translations) dans votre langue. * Vous pouvez aussi aider à relire les traductions créées par d'autres. * Proposer de nouvelles sections de documentation. * Corriger une issue/un bug existant. @@ -218,8 +218,8 @@ Il y a beaucoup de travail à faire, et pour la plupart, **VOUS** pouvez le fair Les principales tâches que vous pouvez faire dès maintenant sont : -* [Aider les autres avec des questions sur GitHub](#help-others-with-questions-in-github){.internal-link target=_blank} (voir la section ci‑dessus). -* [Relire des Pull Requests](#review-pull-requests){.internal-link target=_blank} (voir la section ci‑dessus). +* [Aider les autres avec des questions sur GitHub](#help-others-with-questions-in-github) (voir la section ci‑dessus). +* [Relire des Pull Requests](#review-pull-requests) (voir la section ci‑dessus). Ces deux tâches sont celles qui **consomment le plus de temps**. C'est le travail principal de la maintenance de FastAPI. @@ -227,11 +227,11 @@ Si vous pouvez m'aider avec cela, **vous m'aidez à maintenir FastAPI** et à vo ## Rejoindre le chat { #join-the-chat } -Rejoignez le 👥 serveur Discord 👥 et échangez avec d'autres membres de la communauté FastAPI. +Rejoignez le 👥 [serveur Discord](https://discord.gg/VQjSZaeJmf) 👥 et échangez avec d'autres membres de la communauté FastAPI. /// tip | Astuce -Pour les questions, posez‑les dans GitHub Discussions, vous avez bien plus de chances de recevoir de l'aide par les [Experts FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}. +Pour les questions, posez‑les dans [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/new?category=questions), vous avez bien plus de chances de recevoir de l'aide par les [Experts FastAPI](fastapi-people.md#fastapi-experts). Utilisez le chat uniquement pour d'autres conversations générales. @@ -243,13 +243,13 @@ Gardez à l'esprit que, comme les chats permettent une « conversation libre », Sur GitHub, le modèle vous guidera pour rédiger la bonne question afin que vous puissiez plus facilement obtenir une bonne réponse, ou même résoudre le problème vous‑même avant de demander. Et sur GitHub, je peux m'assurer de toujours tout répondre, même si cela prend du temps. Je ne peux pas personnellement faire cela avec les systèmes de chat. 😅 -Les conversations dans les systèmes de chat ne sont pas non plus aussi facilement recherchables que sur GitHub, donc les questions et réponses peuvent se perdre dans la conversation. Et seules celles sur GitHub comptent pour devenir un [Expert FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}, vous aurez donc très probablement plus d'attention sur GitHub. +Les conversations dans les systèmes de chat ne sont pas non plus aussi facilement recherchables que sur GitHub, donc les questions et réponses peuvent se perdre dans la conversation. Et seules celles sur GitHub comptent pour devenir un [Expert FastAPI](fastapi-people.md#fastapi-experts), vous aurez donc très probablement plus d'attention sur GitHub. D'un autre côté, il y a des milliers d'utilisateurs dans les systèmes de chat, il y a donc de fortes chances que vous trouviez presque toujours quelqu'un avec qui parler. 😄 ## Sponsoriser l'auteur { #sponsor-the-author } -Si votre **produit/entreprise** dépend de **FastAPI** ou y est lié et que vous souhaitez atteindre ses utilisateurs, vous pouvez sponsoriser l'auteur (moi) via GitHub sponsors. Selon le niveau, vous pourriez obtenir des avantages supplémentaires, comme un badge dans la documentation. 🎁 +Si votre **produit/entreprise** dépend de **FastAPI** ou y est lié et que vous souhaitez atteindre ses utilisateurs, vous pouvez sponsoriser l'auteur (moi) via [GitHub sponsors](https://github.com/sponsors/tiangolo). Selon le niveau, vous pourriez obtenir des avantages supplémentaires, comme un badge dans les documents. 🎁 --- diff --git a/docs/fr/docs/history-design-future.md b/docs/fr/docs/history-design-future.md index 300f2e0f5c..6cd530c3f5 100644 --- a/docs/fr/docs/history-design-future.md +++ b/docs/fr/docs/history-design-future.md @@ -1,6 +1,6 @@ # Histoire, conception et avenir { #history-design-and-future } -Il y a quelque temps, un utilisateur de **FastAPI** a demandé : +Il y a quelque temps, [un utilisateur de **FastAPI** a demandé](https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920) : > Quelle est l'histoire de ce projet ? Il semble être sorti de nulle part et est devenu génial en quelques semaines [...]. @@ -14,7 +14,7 @@ Dans ce cadre, j'ai dû étudier, tester et utiliser de nombreuses alternatives. L'histoire de **FastAPI** est en grande partie l'histoire de ses prédécesseurs. -Comme dit dans la section [Alternatives](alternatives.md){.internal-link target=_blank} : +Comme dit dans la section [Alternatives](alternatives.md) :
@@ -44,7 +44,7 @@ Ensuite, j'ai passé du temps à concevoir l'« API » de développeur que je vo J'ai testé plusieurs idées dans les éditeurs Python les plus populaires : PyCharm, VS Code, les éditeurs basés sur Jedi. -D'après la dernière Enquête Développeurs Python, cela couvre environ 80% des utilisateurs. +D'après la dernière [Enquête Développeurs Python](https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools), cela couvre environ 80% des utilisateurs. Cela signifie que **FastAPI** a été spécifiquement testé avec les éditeurs utilisés par 80% des développeurs Python. Et comme la plupart des autres éditeurs ont tendance à fonctionner de façon similaire, tous ses avantages devraient fonctionner pour pratiquement tous les éditeurs. @@ -54,11 +54,11 @@ Le tout de manière à offrir la meilleure expérience de développement à tous ## Exigences { #requirements } -Après avoir testé plusieurs alternatives, j'ai décidé que j'allais utiliser **Pydantic** pour ses avantages. +Après avoir testé plusieurs alternatives, j'ai décidé que j'allais utiliser [**Pydantic**](https://docs.pydantic.dev/) pour ses avantages. J'y ai ensuite contribué, pour le rendre entièrement compatible avec JSON Schema, pour supporter différentes manières de définir les déclarations de contraintes, et pour améliorer le support des éditeurs (vérifications de type, autocomplétion) sur la base des tests effectués dans plusieurs éditeurs. -Pendant le développement, j'ai également contribué à **Starlette**, l'autre exigence clé. +Pendant le développement, j'ai également contribué à [**Starlette**](https://www.starlette.dev/), l'autre exigence clé. ## Développement { #development } @@ -76,4 +76,4 @@ Mais il y a encore de nombreuses améliorations et fonctionnalités à venir. **FastAPI** a un grand avenir devant lui. -Et [votre aide](help-fastapi.md){.internal-link target=_blank} est grandement appréciée. +Et [votre aide](help-fastapi.md) est grandement appréciée. diff --git a/docs/fr/docs/how-to/authentication-error-status-code.md b/docs/fr/docs/how-to/authentication-error-status-code.md index b8e87ee71e..8cbfe3d7be 100644 --- a/docs/fr/docs/how-to/authentication-error-status-code.md +++ b/docs/fr/docs/how-to/authentication-error-status-code.md @@ -2,7 +2,7 @@ Avant FastAPI version `0.122.0`, lorsque les utilitaires de sécurité intégrés renvoyaient une erreur au client après un échec d'authentification, ils utilisaient le code d'état HTTP `403 Forbidden`. -À partir de FastAPI version `0.122.0`, ils utilisent le code d'état HTTP plus approprié `401 Unauthorized`, et renvoient un en-tête `WWW-Authenticate` pertinent dans la réponse, conformément aux spécifications HTTP, RFC 7235, RFC 9110. +À partir de FastAPI version `0.122.0`, ils utilisent le code d'état HTTP plus approprié `401 Unauthorized`, et renvoient un en-tête `WWW-Authenticate` pertinent dans la réponse, conformément aux spécifications HTTP, [RFC 7235](https://datatracker.ietf.org/doc/html/rfc7235#section-3.1), [RFC 9110](https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized). Mais si, pour une raison quelconque, vos clients dépendent de l'ancien comportement, vous pouvez y revenir en surchargeant la méthode `make_not_authenticated_error` dans vos classes de sécurité. diff --git a/docs/fr/docs/how-to/conditional-openapi.md b/docs/fr/docs/how-to/conditional-openapi.md index 61aa187cc5..dd72b39295 100644 --- a/docs/fr/docs/how-to/conditional-openapi.md +++ b/docs/fr/docs/how-to/conditional-openapi.md @@ -2,15 +2,15 @@ Si nécessaire, vous pouvez utiliser des paramètres et des variables d'environnement pour configurer OpenAPI de manière conditionnelle selon l'environnement, et même le désactiver complètement. -## À propos de la sécurité, des API et de la documentation { #about-security-apis-and-docs } +## À propos de la sécurité, des API et des documents { #about-security-apis-and-docs } -Masquer vos interfaces utilisateur de la documentation en production ne devrait pas être la manière de protéger votre API. +Masquer vos interfaces utilisateur des documents en production ne devrait pas être la manière de protéger votre API. Cela n'ajoute aucune sécurité supplémentaire à votre API, les *chemins d'accès* resteront disponibles là où ils se trouvent. S'il y a une faille de sécurité dans votre code, elle existera toujours. -Masquer la documentation rend simplement plus difficile la compréhension de la manière d'interagir avec votre API et pourrait aussi rendre son débogage en production plus difficile. Cela pourrait être considéré simplement comme une forme de Sécurité par l'obscurité. +Masquer les documents rend simplement plus difficile la compréhension de la manière d'interagir avec votre API et pourrait aussi rendre son débogage en production plus difficile. Cela pourrait être considéré simplement comme une forme de [Sécurité par l'obscurité](https://en.wikipedia.org/wiki/Security_through_obscurity). Si vous voulez sécuriser votre API, il y a plusieurs meilleures approches possibles, par exemple : @@ -21,11 +21,11 @@ Si vous voulez sécuriser votre API, il y a plusieurs meilleures approches possi * Ajoutez des contrôles d'autorisation plus granulaires avec des scopes OAuth2 lorsque nécessaire. * ... etc. -Néanmoins, vous pourriez avoir un cas d'utilisation très spécifique où vous devez vraiment désactiver la documentation de l'API pour un certain environnement (par exemple pour la production) ou selon des configurations provenant de variables d'environnement. +Néanmoins, vous pourriez avoir un cas d'utilisation très spécifique où vous devez vraiment désactiver les documents de l'API pour un certain environnement (par exemple pour la production) ou selon des configurations provenant de variables d'environnement. ## Configurer OpenAPI de manière conditionnelle avec des paramètres et des variables d'environnement { #conditional-openapi-from-settings-and-env-vars } -Vous pouvez facilement utiliser les mêmes paramètres Pydantic pour configurer votre OpenAPI généré et les interfaces utilisateur de la documentation. +Vous pouvez facilement utiliser les mêmes paramètres Pydantic pour configurer votre OpenAPI généré et les interfaces utilisateur des documents. Par exemple : @@ -35,7 +35,7 @@ Ici nous déclarons le paramètre `openapi_url` avec la même valeur par défaut Nous l'utilisons ensuite lors de la création de l'application `FastAPI`. -Vous pouvez alors désactiver OpenAPI (y compris les interfaces utilisateur de la documentation) en définissant la variable d'environnement `OPENAPI_URL` sur la chaîne vide, comme ceci : +Vous pouvez alors désactiver OpenAPI (y compris les interfaces utilisateur des documents) en définissant la variable d'environnement `OPENAPI_URL` sur la chaîne vide, comme ceci :
diff --git a/docs/fr/docs/how-to/configure-swagger-ui.md b/docs/fr/docs/how-to/configure-swagger-ui.md index 73d0f00e81..34db055587 100644 --- a/docs/fr/docs/how-to/configure-swagger-ui.md +++ b/docs/fr/docs/how-to/configure-swagger-ui.md @@ -1,6 +1,6 @@ # Configurer Swagger UI { #configure-swagger-ui } -Vous pouvez configurer des paramètres supplémentaires de Swagger UI. +Vous pouvez configurer des [paramètres supplémentaires de Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/). Pour les configurer, passez l'argument `swagger_ui_parameters` lors de la création de l'objet d'application `FastAPI()` ou à la fonction `get_swagger_ui_html()`. @@ -50,7 +50,7 @@ Par exemple, pour désactiver `deepLinking`, vous pourriez passer ces paramètre ## Autres paramètres de Swagger UI { #other-swagger-ui-parameters } -Pour voir toutes les autres configurations possibles que vous pouvez utiliser, lisez la documentation officielle des paramètres de Swagger UI. +Pour voir toutes les autres configurations possibles que vous pouvez utiliser, lisez les [documents officiels pour les paramètres de Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/). ## Paramètres JavaScript uniquement { #javascript-only-settings } diff --git a/docs/fr/docs/how-to/custom-docs-ui-assets.md b/docs/fr/docs/how-to/custom-docs-ui-assets.md index d239a9696a..339b806c30 100644 --- a/docs/fr/docs/how-to/custom-docs-ui-assets.md +++ b/docs/fr/docs/how-to/custom-docs-ui-assets.md @@ -54,7 +54,7 @@ Maintenant, pour pouvoir vérifier que tout fonctionne, créez un chemin d'accè ### Tester { #test-it } -Vous devriez maintenant pouvoir aller à vos docs sur http://127.0.0.1:8000/docs, puis recharger la page : elle chargera ces ressources depuis le nouveau CDN. +Vous devriez maintenant pouvoir aller à vos docs sur [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs), puis recharger la page : elle chargera ces ressources depuis le nouveau CDN. ## Héberger en propre JavaScript et CSS pour les docs { #self-hosting-javascript-and-css-for-docs } @@ -93,12 +93,12 @@ Vous pouvez probablement cliquer avec le bouton droit sur chaque lien et choisir **Swagger UI** utilise les fichiers : -- `swagger-ui-bundle.js` -- `swagger-ui.css` +- [`swagger-ui-bundle.js`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js) +- [`swagger-ui.css`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css) Et **ReDoc** utilise le fichier : -- `redoc.standalone.js` +- [`redoc.standalone.js`](https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js) Après cela, votre structure de fichiers pourrait ressembler à : @@ -122,7 +122,7 @@ Après cela, votre structure de fichiers pourrait ressembler à : ### Tester les fichiers statiques { #test-the-static-files } -Démarrez votre application et rendez‑vous sur http://127.0.0.1:8000/static/redoc.standalone.js. +Démarrez votre application et rendez‑vous sur [http://127.0.0.1:8000/static/redoc.standalone.js](http://127.0.0.1:8000/static/redoc.standalone.js). Vous devriez voir un très long fichier JavaScript pour **ReDoc**. @@ -180,6 +180,6 @@ Maintenant, pour pouvoir vérifier que tout fonctionne, créez un chemin d'accè ### Tester l’UI avec des fichiers statiques { #test-static-files-ui } -Vous devriez maintenant pouvoir couper votre Wi‑Fi, aller à vos docs sur http://127.0.0.1:8000/docs et recharger la page. +Vous devriez maintenant pouvoir couper votre Wi‑Fi, aller à vos docs sur [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) et recharger la page. Et même sans Internet, vous pourrez voir la documentation de votre API et interagir avec elle. diff --git a/docs/fr/docs/how-to/custom-request-and-route.md b/docs/fr/docs/how-to/custom-request-and-route.md index 506187d9f6..4acb6464f8 100644 --- a/docs/fr/docs/how-to/custom-request-and-route.md +++ b/docs/fr/docs/how-to/custom-request-and-route.md @@ -18,7 +18,7 @@ Si vous débutez avec **FastAPI**, vous pouvez ignorer cette section. Voici quelques cas d'utilisation : -* Convertir des corps de requête non JSON en JSON (par exemple `msgpack`). +* Convertir des corps de requête non JSON en JSON (par exemple [`msgpack`](https://msgpack.org/index.html)). * Décompresser des corps de requête compressés en gzip. * Journaliser automatiquement tous les corps de requête. @@ -32,7 +32,7 @@ Et une sous-classe d'`APIRoute` pour utiliser cette classe de requête personnal /// tip | Astuce -Il s'agit d'un exemple simplifié pour montrer le fonctionnement ; si vous avez besoin de la prise en charge de Gzip, vous pouvez utiliser le [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware){.internal-link target=_blank} fourni. +Il s'agit d'un exemple simplifié pour montrer le fonctionnement ; si vous avez besoin de la prise en charge de Gzip, vous pouvez utiliser le [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware) fourni. /// @@ -66,7 +66,7 @@ Le `dict` `scope` et la fonction `receive` font tous deux partie de la spécific Et ces deux éléments, `scope` et `receive`, sont ce dont on a besoin pour créer une nouvelle instance de `Request`. -Pour en savoir plus sur `Request`, consultez la documentation de Starlette sur les requêtes. +Pour en savoir plus sur `Request`, consultez [la documentation de Starlette sur les requêtes](https://www.starlette.dev/requests/). /// @@ -82,7 +82,7 @@ Mais grâce à nos modifications dans `GzipRequest.body`, le corps de la requêt /// tip | Astuce -Pour résoudre ce même problème, il est probablement beaucoup plus simple d'utiliser `body` dans un gestionnaire personnalisé pour `RequestValidationError` ([Gérer les erreurs](../tutorial/handling-errors.md#use-the-requestvalidationerror-body){.internal-link target=_blank}). +Pour résoudre ce même problème, il est probablement beaucoup plus simple d'utiliser `body` dans un gestionnaire personnalisé pour `RequestValidationError` ([Gérer les erreurs](../tutorial/handling-errors.md#use-the-requestvalidationerror-body)). Mais cet exemple reste valable et montre comment interagir avec les composants internes. diff --git a/docs/fr/docs/how-to/extending-openapi.md b/docs/fr/docs/how-to/extending-openapi.md index 1c540ea6c7..bdf4eeba93 100644 --- a/docs/fr/docs/how-to/extending-openapi.md +++ b/docs/fr/docs/how-to/extending-openapi.md @@ -37,7 +37,7 @@ Le paramètre `summary` est disponible à partir d'OpenAPI 3.1.0, pris en charge En vous appuyant sur les informations ci-dessus, vous pouvez utiliser la même fonction utilitaire pour générer le schéma OpenAPI et remplacer chaque partie dont vous avez besoin. -Par exemple, ajoutons l’extension OpenAPI de ReDoc pour inclure un logo personnalisé. +Par exemple, ajoutons [l’extension OpenAPI de ReDoc pour inclure un logo personnalisé](https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo). ### **FastAPI** normal { #normal-fastapi } @@ -75,6 +75,6 @@ Vous pouvez maintenant remplacer la méthode `.openapi()` par votre nouvelle fon ### Vérifier { #check-it } -Une fois que vous allez sur http://127.0.0.1:8000/redoc, vous verrez que vous utilisez votre logo personnalisé (dans cet exemple, le logo de **FastAPI**) : +Une fois que vous allez sur [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc), vous verrez que vous utilisez votre logo personnalisé (dans cet exemple, le logo de **FastAPI**) : diff --git a/docs/fr/docs/how-to/general.md b/docs/fr/docs/how-to/general.md index 09d4498aca..93ebf8953a 100644 --- a/docs/fr/docs/how-to/general.md +++ b/docs/fr/docs/how-to/general.md @@ -1,39 +1,43 @@ # Général - Guides pratiques - Recettes { #general-how-to-recipes } -Voici plusieurs renvois vers d'autres endroits de la documentation, pour des questions générales ou fréquentes. +Voici plusieurs renvois vers d'autres endroits dans les documents, pour des questions générales ou fréquentes. ## Filtrer des données - Sécurité { #filter-data-security } -Pour vous assurer que vous ne renvoyez pas plus de données que nécessaire, lisez la documentation [Tutoriel - Modèle de réponse - Type de retour](../tutorial/response-model.md){.internal-link target=_blank}. +Pour vous assurer que vous ne renvoyez pas plus de données que nécessaire, lisez les documents [Tutoriel - Modèle de réponse - Type de retour](../tutorial/response-model.md). + +## Optimiser la performance des réponses - Modèle de réponse - Type de retour { #optimize-response-performance-response-model-return-type } + +Pour optimiser la performance lors du renvoi de données JSON, utilisez un type de retour ou un modèle de réponse ; de cette façon, Pydantic prendra en charge la sérialisation en JSON côté Rust, sans passer par Python. Pour en savoir plus, lisez les documents [Tutoriel - Modèle de réponse - Type de retour](../tutorial/response-model.md). ## Étiquettes de documentation - OpenAPI { #documentation-tags-openapi } -Pour ajouter des étiquettes à vos *chemins d'accès* et les regrouper dans l'interface utilisateur de la documentation, lisez la documentation [Tutoriel - Configurations de chemin d'accès - Tags](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank}. +Pour ajouter des étiquettes à vos *chemins d'accès* et les regrouper dans l'interface utilisateur de la documentation, lisez les documents [Tutoriel - Configurations de chemin d'accès - Tags](../tutorial/path-operation-configuration.md#tags). ## Résumé et description de la documentation - OpenAPI { #documentation-summary-and-description-openapi } -Pour ajouter un résumé et une description à vos *chemins d'accès* et les afficher dans l'interface utilisateur de la documentation, lisez la documentation [Tutoriel - Configurations de chemin d'accès - Résumé et description](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank}. +Pour ajouter un résumé et une description à vos *chemins d'accès* et les afficher dans l'interface utilisateur de la documentation, lisez les documents [Tutoriel - Configurations de chemin d'accès - Résumé et description](../tutorial/path-operation-configuration.md#summary-and-description). ## Description de la réponse dans la documentation - OpenAPI { #documentation-response-description-openapi } -Pour définir la description de la réponse, affichée dans l'interface utilisateur de la documentation, lisez la documentation [Tutoriel - Configurations de chemin d'accès - Description de la réponse](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank}. +Pour définir la description de la réponse, affichée dans l'interface utilisateur de la documentation, lisez les documents [Tutoriel - Configurations de chemin d'accès - Description de la réponse](../tutorial/path-operation-configuration.md#response-description). ## Déprécier un *chemin d'accès* dans la documentation - OpenAPI { #documentation-deprecate-a-path-operation-openapi } -Pour déprécier un *chemin d'accès* et l'indiquer dans l'interface utilisateur de la documentation, lisez la documentation [Tutoriel - Configurations de chemin d'accès - Déprécier un chemin d'accès](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank}. +Pour déprécier un *chemin d'accès* et l'indiquer dans l'interface utilisateur de la documentation, lisez les documents [Tutoriel - Configurations de chemin d'accès - Dépréciation](../tutorial/path-operation-configuration.md#deprecate-a-path-operation). ## Convertir n'importe quelles données au format compatible JSON { #convert-any-data-to-json-compatible } -Pour convertir des données vers un format compatible JSON, lisez la documentation [Tutoriel - Encodeur compatible JSON](../tutorial/encoder.md){.internal-link target=_blank}. +Pour convertir des données vers un format compatible JSON, lisez les documents [Tutoriel - Encodeur compatible JSON](../tutorial/encoder.md). ## Métadonnées OpenAPI - Documentation { #openapi-metadata-docs } -Pour ajouter des métadonnées à votre schéma OpenAPI, y compris une licence, une version, un contact, etc., lisez la documentation [Tutoriel - Métadonnées et URLs de la documentation](../tutorial/metadata.md){.internal-link target=_blank}. +Pour ajouter des métadonnées à votre schéma OpenAPI, y compris une licence, une version, un contact, etc., lisez les documents [Tutoriel - Métadonnées et URLs de la documentation](../tutorial/metadata.md). ## URL OpenAPI personnalisée { #openapi-custom-url } -Pour personnaliser l'URL OpenAPI (ou la supprimer), lisez la documentation [Tutoriel - Métadonnées et URLs de la documentation](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}. +Pour personnaliser l'URL OpenAPI (ou la supprimer), lisez les documents [Tutoriel - Métadonnées et URLs de la documentation](../tutorial/metadata.md#openapi-url). ## URL de la documentation OpenAPI { #openapi-docs-urls } -Pour mettre à jour les URL utilisées pour les interfaces utilisateur de documentation générées automatiquement, lisez la documentation [Tutoriel - Métadonnées et URLs de la documentation](../tutorial/metadata.md#docs-urls){.internal-link target=_blank}. +Pour mettre à jour les URL utilisées pour les interfaces utilisateur de documentation générées automatiquement, lisez les documents [Tutoriel - Métadonnées et URLs de la documentation](../tutorial/metadata.md#docs-urls). diff --git a/docs/fr/docs/how-to/graphql.md b/docs/fr/docs/how-to/graphql.md index 59cd1590f3..912608a981 100644 --- a/docs/fr/docs/how-to/graphql.md +++ b/docs/fr/docs/how-to/graphql.md @@ -18,18 +18,18 @@ Assurez-vous d'évaluer si les **bénéfices** pour votre cas d'utilisation comp Voici quelques bibliothèques **GraphQL** qui prennent en charge **ASGI**. Vous pouvez les utiliser avec **FastAPI** : -* Strawberry 🍓 - * Avec la documentation pour FastAPI -* Ariadne - * Avec la documentation pour FastAPI -* Tartiflette - * Avec Tartiflette ASGI pour fournir l'intégration ASGI -* Graphene - * Avec starlette-graphene3 +* [Strawberry](https://strawberry.rocks/) 🍓 + * Avec [la documentation pour FastAPI](https://strawberry.rocks/docs/integrations/fastapi) +* [Ariadne](https://ariadnegraphql.org/) + * Avec [la documentation pour FastAPI](https://ariadnegraphql.org/docs/fastapi-integration) +* [Tartiflette](https://tartiflette.io/) + * Avec [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) pour fournir l'intégration ASGI +* [Graphene](https://graphene-python.org/) + * Avec [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3) ## GraphQL avec Strawberry { #graphql-with-strawberry } -Si vous avez besoin ou souhaitez travailler avec **GraphQL**, **Strawberry** est la bibliothèque **recommandée** car sa conception est la plus proche de celle de **FastAPI**, tout est basé sur des **annotations de type**. +Si vous avez besoin ou souhaitez travailler avec **GraphQL**, [**Strawberry**](https://strawberry.rocks/) est la bibliothèque **recommandée** car sa conception est la plus proche de celle de **FastAPI**, tout est basé sur des **annotations de type**. Selon votre cas d'utilisation, vous pourriez préférer une autre bibliothèque, mais si vous me le demandiez, je vous suggérerais probablement d'essayer **Strawberry**. @@ -37,24 +37,24 @@ Voici un petit aperçu de la manière dont vous pouvez intégrer Strawberry avec {* ../../docs_src/graphql_/tutorial001_py310.py hl[3,22,25] *} -Vous pouvez en apprendre davantage sur Strawberry dans la documentation de Strawberry. +Vous pouvez en apprendre davantage sur Strawberry dans la [documentation de Strawberry](https://strawberry.rocks/). -Et également la documentation sur Strawberry avec FastAPI. +Et également la documentation sur [Strawberry avec FastAPI](https://strawberry.rocks/docs/integrations/fastapi). ## Ancien `GraphQLApp` de Starlette { #older-graphqlapp-from-starlette } -Les versions précédentes de Starlette incluaient une classe `GraphQLApp` pour s'intégrer à Graphene. +Les versions précédentes de Starlette incluaient une classe `GraphQLApp` pour s'intégrer à [Graphene](https://graphene-python.org/). -Elle a été dépréciée dans Starlette, mais si vous avez du code qui l'utilisait, vous pouvez facilement **migrer** vers starlette-graphene3, qui couvre le même cas d'utilisation et propose une **interface presque identique**. +Elle a été dépréciée dans Starlette, mais si vous avez du code qui l'utilisait, vous pouvez facilement **migrer** vers [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3), qui couvre le même cas d'utilisation et propose une **interface presque identique**. /// tip | Astuce -Si vous avez besoin de GraphQL, je vous recommande tout de même de regarder Strawberry, car il est basé sur des annotations de type plutôt que sur des classes et types personnalisés. +Si vous avez besoin de GraphQL, je vous recommande tout de même de regarder [Strawberry](https://strawberry.rocks/), car il est basé sur des annotations de type plutôt que sur des classes et types personnalisés. /// ## En savoir plus { #learn-more } -Vous pouvez en apprendre davantage sur **GraphQL** dans la documentation officielle de GraphQL. +Vous pouvez en apprendre davantage sur **GraphQL** dans la [documentation officielle de GraphQL](https://graphql.org/). Vous pouvez également en lire davantage sur chacune des bibliothèques décrites ci-dessus via leurs liens. diff --git a/docs/fr/docs/how-to/index.md b/docs/fr/docs/how-to/index.md index 03736fa43f..62e7d04572 100644 --- a/docs/fr/docs/how-to/index.md +++ b/docs/fr/docs/how-to/index.md @@ -8,6 +8,6 @@ Si quelque chose vous paraît intéressant et utile pour votre projet, allez-y e /// tip | Astuce -Si vous voulez **apprendre FastAPI** de façon structurée (recommandé), allez lire le [Tutoriel - Guide utilisateur](../tutorial/index.md){.internal-link target=_blank} chapitre par chapitre à la place. +Si vous voulez **apprendre FastAPI** de façon structurée (recommandé), allez lire le [Tutoriel - Guide utilisateur](../tutorial/index.md) chapitre par chapitre à la place. /// diff --git a/docs/fr/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/fr/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md index 681cf697bb..99d68ba817 100644 --- a/docs/fr/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md +++ b/docs/fr/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md @@ -10,19 +10,19 @@ FastAPI 0.126.0 a supprimé la prise en charge de Pydantic v1, tout en continuan /// warning | Alertes -L'équipe Pydantic a arrêté la prise en charge de Pydantic v1 pour les dernières versions de Python, à partir de Python 3.14. +L'équipe Pydantic a arrêté la prise en charge de Pydantic v1 pour les dernières versions de Python, à partir de **Python 3.14**. -Cela inclut `pydantic.v1`, qui n'est plus pris en charge à partir de Python 3.14. +Cela inclut `pydantic.v1`, qui n'est plus pris en charge en Python 3.14 et versions ultérieures. Si vous souhaitez utiliser les dernières fonctionnalités de Python, vous devez vous assurer que vous utilisez Pydantic v2. /// -Si vous avez une ancienne application FastAPI avec Pydantic v1, je vais vous montrer comment la migrer vers Pydantic v2, et les fonctionnalités de FastAPI 0.119.0 pour vous aider à une migration progressive. +Si vous avez une ancienne application FastAPI avec Pydantic v1, je vais vous montrer comment la migrer vers Pydantic v2, et les **fonctionnalités de FastAPI 0.119.0** pour vous aider à une migration progressive. ## Guide officiel { #official-guide } -Pydantic propose un Guide de migration officiel de la v1 à la v2. +Pydantic propose un [Guide de migration](https://docs.pydantic.dev/latest/migration/) officiel de la v1 à la v2. Il inclut aussi ce qui a changé, comment les validations sont désormais plus correctes et strictes, les pièges possibles, etc. @@ -30,7 +30,7 @@ Vous pouvez le lire pour mieux comprendre ce qui a changé. ## Tests { #tests } -Vous devez vous assurer d'avoir des [tests](../tutorial/testing.md){.internal-link target=_blank} pour votre application et de les exécuter en intégration continue (CI). +Vous devez vous assurer d'avoir des [tests](../tutorial/testing.md) pour votre application et de les exécuter en intégration continue (CI). De cette façon, vous pouvez effectuer la mise à niveau et vous assurer que tout fonctionne toujours comme prévu. @@ -38,7 +38,7 @@ De cette façon, vous pouvez effectuer la mise à niveau et vous assurer que tou Dans de nombreux cas, lorsque vous utilisez des modèles Pydantic classiques sans personnalisations, vous pourrez automatiser la majeure partie du processus de migration de Pydantic v1 à Pydantic v2. -Vous pouvez utiliser `bump-pydantic` de la même équipe Pydantic. +Vous pouvez utiliser [`bump-pydantic`](https://github.com/pydantic/bump-pydantic) de la même équipe Pydantic. Cet outil vous aidera à modifier automatiquement la majeure partie du code à adapter. @@ -62,7 +62,7 @@ Vous pouvez donc mettre à niveau Pydantic vers la dernière version 2 et modifi /// warning | Alertes -Gardez à l'esprit que, puisque l'équipe Pydantic ne prend plus en charge Pydantic v1 dans les versions récentes de Python à partir de Python 3.14, l'utilisation de `pydantic.v1` n'est pas non plus prise en charge à partir de Python 3.14. +Gardez à l'esprit que, puisque l'équipe Pydantic ne prend plus en charge Pydantic v1 dans les versions récentes de Python à partir de Python 3.14, l'utilisation de `pydantic.v1` n'est pas non plus prise en charge en Python 3.14 et versions ultérieures. /// @@ -108,7 +108,7 @@ graph TB style V2Field fill:#f9fff3 ``` -Dans certains cas, il est même possible d'avoir des modèles Pydantic v1 et v2 dans le même chemin d'accès de votre application FastAPI : +Dans certains cas, il est même possible d'avoir des modèles Pydantic v1 et v2 dans le même **chemin d'accès** de votre application FastAPI : {* ../../docs_src/pydantic_v1_in_v2/tutorial003_an_py310.py hl[2:3,6,12,21:22] *} diff --git a/docs/fr/docs/how-to/testing-database.md b/docs/fr/docs/how-to/testing-database.md index 3179bc4c6b..be96bd2a22 100644 --- a/docs/fr/docs/how-to/testing-database.md +++ b/docs/fr/docs/how-to/testing-database.md @@ -1,7 +1,7 @@ # Tester une base de données { #testing-a-database } -Vous pouvez étudier les bases de données, SQL et SQLModel dans les documents SQLModel. 🤓 +Vous pouvez étudier les bases de données, SQL et SQLModel dans les [documents SQLModel](https://sqlmodel.tiangolo.com/). 🤓 -Il existe un mini tutoriel sur l'utilisation de SQLModel avec FastAPI. ✨ +Il existe un mini [tutoriel sur l'utilisation de SQLModel avec FastAPI](https://sqlmodel.tiangolo.com/tutorial/fastapi/). ✨ -Ce tutoriel comprend une section sur les tests des bases de données SQL. 😎 +Ce tutoriel comprend une section sur les [tests des bases de données SQL](https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/). 😎 diff --git a/docs/fr/docs/index.md b/docs/fr/docs/index.md index bf4446b940..3b297ffd3c 100644 --- a/docs/fr/docs/index.md +++ b/docs/fr/docs/index.md @@ -11,25 +11,25 @@ Framework FastAPI, haute performance, facile à apprendre, rapide à coder, prêt pour la production

- + Test - + Coverage - + Package version - + Supported Python versions

--- -**Documentation** : https://fastapi.tiangolo.com/fr +**Documentation** : [https://fastapi.tiangolo.com/fr](https://fastapi.tiangolo.com/fr) -**Code Source** : https://github.com/fastapi/fastapi +**Code Source** : [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi) --- @@ -44,7 +44,7 @@ Les principales fonctionnalités sont : * **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. -* **Basé sur des normes** : basé sur (et entièrement compatible avec) les standards ouverts pour les APIs : OpenAPI (précédemment connu sous le nom de Swagger) et JSON Schema. +* **Basé sur des normes** : basé sur (et entièrement compatible avec) les standards ouverts pour les APIs : [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (précédemment connu sous le nom de Swagger) et [JSON Schema](https://json-schema.org/). * estimation basée sur des tests d'une équipe de développement interne, construisant des applications de production. @@ -55,51 +55,51 @@ Les principales fonctionnalités sont : ### Sponsor clé de voûte { #keystone-sponsor } {% for sponsor in sponsors.keystone -%} - + {% endfor -%} ### Sponsors Or et Argent { #gold-and-silver-sponsors } {% for sponsor in sponsors.gold -%} - + {% endfor -%} {%- for sponsor in sponsors.silver -%} - + {% endfor %} -Autres sponsors +[Autres sponsors](https://fastapi.tiangolo.com/fr/fastapi-people/#sponsors) ## Opinions { #opinions } « _[...] J'utilise beaucoup **FastAPI** ces derniers temps. [...] Je prévois de l'utiliser dans mon équipe pour tous les **services de ML chez Microsoft**. Certains d'entre eux sont intégrés au cœur de **Windows** et à certains produits **Office**._ » -
Kabir Khan - Microsoft (ref)
+
Kabir Khan - Microsoft (ref)
--- « _Nous avons adopté la bibliothèque **FastAPI** pour créer un serveur **REST** qui peut être interrogé pour obtenir des **prédictions**. [pour Ludwig]_ » -
Piero Molino, Yaroslav Dudin, et Sai Sumanth Miryala - Uber (ref)
+
Piero Molino, Yaroslav Dudin, et Sai Sumanth Miryala - Uber (ref)
--- « _**Netflix** est heureux d'annoncer la publication en open source de notre framework d'orchestration de **gestion de crise** : **Dispatch** ! [construit avec **FastAPI**]_ » -
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
+
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
--- « _Je suis plus qu'enthousiaste à propos de **FastAPI**. C'est tellement fun !_ » -
Brian Okken - Animateur du podcast Python Bytes (ref)
+
Brian Okken - Animateur du podcast [Python Bytes](https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855) (ref)
--- « _Honnêtement, ce que vous avez construit a l'air super solide et soigné. À bien des égards, c'est ce que je voulais que **Hug** soit — c'est vraiment inspirant de voir quelqu'un construire ça._ » -
Timothy Crosley - Créateur de Hug (ref)
+
Timothy Crosley - Créateur de [Hug](https://github.com/hugapi/hug) (ref)
--- @@ -107,27 +107,27 @@ Les principales fonctionnalités sont : « _Nous sommes passés à **FastAPI** pour nos **APIs** [...] Je pense que vous l'aimerez [...]_ » -
Ines Montani - Matthew Honnibal - Fondateurs de Explosion AI - Créateurs de spaCy (ref) - (ref)
+
Ines Montani - Matthew Honnibal - Fondateurs de [Explosion AI](https://explosion.ai) - Créateurs de [spaCy](https://spacy.io) (ref) - (ref)
--- « _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 ingénieur TAC virtuel._ » -
Deon Pillsbury - Cisco (ref)
+
Deon Pillsbury - Cisco (ref)
--- ## Mini documentaire FastAPI { #fastapi-mini-documentary } -Un mini documentaire FastAPI est sorti fin 2025, vous pouvez le regarder en ligne : +Un [mini documentaire FastAPI](https://www.youtube.com/watch?v=mpR8ngthqiE) est sorti fin 2025, vous pouvez le regarder en ligne : -FastAPI Mini Documentary +FastAPI Mini Documentary ## **Typer**, le FastAPI des CLIs { #typer-the-fastapi-of-clis } - + -Si vous construisez une application CLI à utiliser dans un terminal au lieu d'une API web, regardez **Typer**. +Si vous construisez une application CLI à utiliser dans un terminal au lieu d'une API web, regardez [**Typer**](https://typer.tiangolo.com/). **Typer** est le petit frère de FastAPI. Et il est destiné à être le **FastAPI des CLIs**. ⌨️ 🚀 @@ -135,12 +135,12 @@ Si vous construisez une application Starlette pour les parties web. -* Pydantic pour les parties données. +* [Starlette](https://www.starlette.dev/) pour les parties web. +* [Pydantic](https://docs.pydantic.dev/) pour les parties données. ## Installation { #installation } -Créez et activez un environnement virtuel puis installez FastAPI : +Créez et activez un [environnement virtuel](https://fastapi.tiangolo.com/fr/virtual-environments/) puis installez FastAPI :
@@ -199,7 +199,7 @@ async def read_item(item_id: int, q: str | None = None): **Remarque** : -Si vous ne savez pas, consultez la section « Vous êtes pressés ? » à propos de `async` et `await` dans la documentation. +Si vous ne savez pas, consultez la section « Vous êtes pressés ? » à propos de [`async` et `await` dans la documentation](https://fastapi.tiangolo.com/fr/async/#in-a-hurry). @@ -210,7 +210,7 @@ Lancez le serveur avec :
```console -$ fastapi dev main.py +$ fastapi dev ╭────────── FastAPI CLI - Development mode ───────────╮ │ │ @@ -235,19 +235,19 @@ INFO: Application startup complete.
-À propos de la commande fastapi dev main.py... +À propos de la commande fastapi dev... -La commande `fastapi dev` lit votre fichier `main.py`, détecte l'application **FastAPI** qu'il contient et lance un serveur avec Uvicorn. +La commande `fastapi dev` lit automatiquement votre fichier `main.py`, détecte l'application **FastAPI** qu'il contient et lance un serveur avec [Uvicorn](https://www.uvicorn.dev). Par défaut, `fastapi dev` démarre avec le rechargement automatique activé pour le développement local. -Vous pouvez en savoir plus dans la documentation de la CLI FastAPI. +Vous pouvez en savoir plus dans la [documentation de la CLI FastAPI](https://fastapi.tiangolo.com/fr/fastapi-cli/).
### Vérifier { #check-it } -Ouvrez votre navigateur à l'adresse http://127.0.0.1:8000/items/5?q=somequery. +Ouvrez votre navigateur à l'adresse [http://127.0.0.1:8000/items/5?q=somequery](http://127.0.0.1:8000/items/5?q=somequery). Vous verrez la réponse JSON : @@ -264,17 +264,17 @@ Vous avez déjà créé une API qui : ### Documentation API interactive { #interactive-api-docs } -Maintenant, rendez-vous sur http://127.0.0.1:8000/docs. +Maintenant, rendez-vous sur [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). -Vous verrez la documentation interactive automatique de l'API (fournie par Swagger UI) : +Vous verrez la documentation interactive automatique de l'API (fournie par [Swagger UI](https://github.com/swagger-api/swagger-ui)) : ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Documentation API alternative { #alternative-api-docs } -Et maintenant, rendez-vous sur http://127.0.0.1:8000/redoc. +Et maintenant, rendez-vous sur [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). -Vous verrez la documentation alternative automatique (fournie par ReDoc) : +Vous verrez la documentation alternative automatique (fournie par [ReDoc](https://github.com/Rebilly/ReDoc)) : ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -316,7 +316,7 @@ Le serveur `fastapi dev` devrait se recharger automatiquement. ### Mettre à niveau la documentation API interactive { #interactive-api-docs-upgrade } -Maintenant, rendez-vous sur http://127.0.0.1:8000/docs. +Maintenant, rendez-vous sur [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). * La documentation interactive de l'API sera automatiquement mise à jour, y compris le nouveau corps : @@ -332,7 +332,7 @@ Maintenant, rendez-vous sur http://127.0.0.1:8000/redoc. +Et maintenant, rendez-vous sur [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). * La documentation alternative reflètera également le nouveau paramètre de requête et le nouveau corps : @@ -442,7 +442,7 @@ Pour un exemple plus complet comprenant plus de fonctionnalités, voir le d'injection de dépendances** très puissant et facile à utiliser. * Sécurité et authentification, y compris la prise en charge de **OAuth2** avec des **JWT tokens** et l'authentification **HTTP Basic**. * Des techniques plus avancées (mais tout aussi faciles) pour déclarer des **modèles JSON profondément imbriqués** (grâce à Pydantic). -* Intégration **GraphQL** avec Strawberry et d'autres bibliothèques. +* Intégration **GraphQL** avec [Strawberry](https://strawberry.rocks) et d'autres bibliothèques. * De nombreuses fonctionnalités supplémentaires (grâce à Starlette) comme : * **WebSockets** * des tests extrêmement faciles basés sur HTTPX et `pytest` @@ -452,24 +452,10 @@ Pour un exemple plus complet comprenant plus de fonctionnalités, voir le FastAPI Cloud, allez vous inscrire sur la liste d'attente si ce n'est pas déjà fait. 🚀 +Vous pouvez, si vous le souhaitez, déployer votre application FastAPI sur [FastAPI Cloud](https://fastapicloud.com), allez vous inscrire sur la liste d'attente si ce n'est pas déjà fait. 🚀 Si vous avez déjà un compte **FastAPI Cloud** (nous vous avons invité depuis la liste d'attente 😉), vous pouvez déployer votre application avec une seule commande. -Avant de déployer, assurez-vous d'être connecté : - -
- -```console -$ fastapi login - -You are logged in to FastAPI Cloud 🚀 -``` - -
- -Puis déployez votre application : -
```console @@ -488,7 +474,7 @@ C'est tout ! Vous pouvez maintenant accéder à votre application à cette URL. #### À propos de FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** est construit par le même auteur et la même équipe derrière **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** est construit par le même auteur et la même équipe derrière **FastAPI**. Il simplifie le processus de **construction**, de **déploiement** et **d'accès** à une API avec un effort minimal. @@ -504,9 +490,9 @@ Suivez les guides de votre fournisseur cloud pour y déployer des applications F ## Performance { #performance } -Les benchmarks TechEmpower indépendants montrent que les applications **FastAPI** s'exécutant sous Uvicorn sont parmi les frameworks Python les plus rapides, juste derrière Starlette et Uvicorn eux-mêmes (utilisés en interne par FastAPI). (*) +Les benchmarks TechEmpower indépendants montrent que les applications **FastAPI** s'exécutant sous Uvicorn sont [parmi les frameworks Python les plus rapides](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), juste derrière Starlette et Uvicorn eux-mêmes (utilisés en interne par FastAPI). (*) -Pour en savoir plus, consultez la section Benchmarks. +Pour en savoir plus, consultez la section [Benchmarks](https://fastapi.tiangolo.com/fr/benchmarks/). ## Dépendances { #dependencies } @@ -518,19 +504,19 @@ Lorsque vous installez FastAPI avec `pip install "fastapi[standard]"`, il inclut Utilisées par Pydantic : -* email-validator - pour la validation des adresses e-mail. +* [`email-validator`](https://github.com/JoshData/python-email-validator) - pour la validation des adresses e-mail. Utilisées par Starlette : -* httpx - Obligatoire si vous souhaitez utiliser le `TestClient`. -* jinja2 - Obligatoire si vous souhaitez utiliser la configuration de template par défaut. -* python-multipart - Obligatoire si vous souhaitez prendre en charge l’« parsing » de formulaires avec `request.form()`. +* [`httpx`](https://www.python-httpx.org) - Obligatoire si vous souhaitez utiliser le `TestClient`. +* [`jinja2`](https://jinja.palletsprojects.com) - Obligatoire si vous souhaitez utiliser la configuration de template par défaut. +* [`python-multipart`](https://github.com/Kludex/python-multipart) - Obligatoire si vous souhaitez prendre en charge l’« parsing » de formulaires avec `request.form()`. Utilisées par FastAPI : -* uvicorn - pour le serveur qui charge et sert votre application. Cela inclut `uvicorn[standard]`, qui comprend certaines dépendances (par ex. `uvloop`) nécessaires pour une haute performance. +* [`uvicorn`](https://www.uvicorn.dev) - pour le serveur qui charge et sert votre application. Cela inclut `uvicorn[standard]`, qui comprend certaines dépendances (par ex. `uvloop`) nécessaires pour une haute performance. * `fastapi-cli[standard]` - pour fournir la commande `fastapi`. - * Cela inclut `fastapi-cloud-cli`, qui vous permet de déployer votre application FastAPI sur FastAPI Cloud. + * Cela inclut `fastapi-cloud-cli`, qui vous permet de déployer votre application FastAPI sur [FastAPI Cloud](https://fastapicloud.com). ### Sans les dépendances `standard` { #without-standard-dependencies } @@ -546,13 +532,13 @@ Il existe des dépendances supplémentaires que vous pourriez vouloir installer. Dépendances optionnelles supplémentaires pour Pydantic : -* pydantic-settings - pour la gestion des paramètres. -* pydantic-extra-types - pour des types supplémentaires à utiliser avec Pydantic. +* [`pydantic-settings`](https://docs.pydantic.dev/latest/usage/pydantic_settings/) - pour la gestion des paramètres. +* [`pydantic-extra-types`](https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/) - pour des types supplémentaires à utiliser avec Pydantic. Dépendances optionnelles supplémentaires pour FastAPI : -* orjson - Obligatoire si vous souhaitez utiliser `ORJSONResponse`. -* ujson - Obligatoire si vous souhaitez utiliser `UJSONResponse`. +* [`orjson`](https://github.com/ijl/orjson) - Obligatoire si vous souhaitez utiliser `ORJSONResponse`. +* [`ujson`](https://github.com/esnme/ultrajson) - Obligatoire si vous souhaitez utiliser `UJSONResponse`. ## Licence { #license } diff --git a/docs/fr/docs/project-generation.md b/docs/fr/docs/project-generation.md index f062ffecf5..e0636bfe55 100644 --- a/docs/fr/docs/project-generation.md +++ b/docs/fr/docs/project-generation.md @@ -4,7 +4,7 @@ Les modèles, bien qu'ils soient généralement livrés avec une configuration s Vous pouvez utiliser ce modèle pour démarrer, car il inclut une grande partie de la configuration initiale, la sécurité, la base de données et quelques endpoints d'API déjà prêts pour vous. -Dépôt GitHub : Modèle Full Stack FastAPI +Dépôt GitHub : [Modèle Full Stack FastAPI](https://github.com/tiangolo/full-stack-fastapi-template) ## Modèle Full Stack FastAPI - Pile technologique et fonctionnalités { #full-stack-fastapi-template-technology-stack-and-features } diff --git a/docs/fr/docs/python-types.md b/docs/fr/docs/python-types.md index 770f1514ac..97230b7b92 100644 --- a/docs/fr/docs/python-types.md +++ b/docs/fr/docs/python-types.md @@ -172,7 +172,7 @@ Comme la liste est un type qui contient des types internes, mettez-les entre cro {* ../../docs_src/python_types/tutorial006_py310.py hl[1] *} -/// info | Info +/// info Ces types internes entre crochets sont appelés « paramètres de type ». @@ -269,7 +269,7 @@ Cela ne signifie pas « `one_person` est la **classe** appelée `Person` ». ## Modèles Pydantic { #pydantic-models } -Pydantic est une bibliothèque Python pour effectuer de la validation de données. +[Pydantic](https://docs.pydantic.dev/) est une bibliothèque Python pour effectuer de la validation de données. Vous déclarez la « forme » de la donnée sous forme de classes avec des attributs. @@ -283,15 +283,15 @@ Un exemple tiré de la documentation officielle de Pydantic : {* ../../docs_src/python_types/tutorial011_py310.py *} -/// info | Info +/// info -Pour en savoir plus à propos de Pydantic, consultez sa documentation. +Pour en savoir plus à propos de [Pydantic, consultez sa documentation](https://docs.pydantic.dev/). /// **FastAPI** est entièrement basé sur Pydantic. -Vous verrez beaucoup plus de tout cela en pratique dans le [Tutoriel - Guide utilisateur](tutorial/index.md){.internal-link target=_blank}. +Vous verrez beaucoup plus de tout cela en pratique dans le [Tutoriel - Guide utilisateur](tutorial/index.md). ## Annotations de type avec métadonnées { #type-hints-with-metadata-annotations } @@ -337,12 +337,12 @@ Avec **FastAPI**, vous déclarez des paramètres avec des annotations de type et * **Documenter** l'API avec OpenAPI : * ce qui est ensuite utilisé par les interfaces utilisateur de documentation interactive automatiques. -Tout cela peut sembler abstrait. Ne vous inquiétez pas. Vous verrez tout cela en action dans le [Tutoriel - Guide utilisateur](tutorial/index.md){.internal-link target=_blank}. +Tout cela peut sembler abstrait. Ne vous inquiétez pas. Vous verrez tout cela en action dans le [Tutoriel - Guide utilisateur](tutorial/index.md). L'important est qu'en utilisant les types standards de Python, en un seul endroit (au lieu d'ajouter plus de classes, de décorateurs, etc.), **FastAPI** fera une grande partie du travail pour vous. -/// info | Info +/// info -Si vous avez déjà parcouru tout le tutoriel et êtes revenu pour en voir plus sur les types, une bonne ressource est l'« aide-mémoire » de `mypy`. +Si vous avez déjà parcouru tout le tutoriel et êtes revenu pour en voir plus sur les types, une bonne ressource est [l'« aide-mémoire » de `mypy`](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html). /// diff --git a/docs/fr/docs/tutorial/background-tasks.md b/docs/fr/docs/tutorial/background-tasks.md index a8444ba27a..c8f66e5258 100644 --- a/docs/fr/docs/tutorial/background-tasks.md +++ b/docs/fr/docs/tutorial/background-tasks.md @@ -61,7 +61,7 @@ Et ensuite une autre tâche d'arrière-plan (générée dans la *fonction de che ## Détails techniques { #technical-details } -La classe `BackgroundTasks` provient directement de `starlette.background`. +La classe `BackgroundTasks` provient directement de [`starlette.background`](https://www.starlette.dev/background/). Elle est importée/incluse directement dans **FastAPI** pour que vous puissiez l'importer depuis `fastapi` et éviter d'importer accidentellement `BackgroundTask` (sans `s` à la fin) depuis `starlette.background`. @@ -69,11 +69,11 @@ En utilisant seulement `BackgroundTasks` (et non `BackgroundTask`), il est possi Il est tout de même possible d'utiliser `BackgroundTask` seul dans **FastAPI**, mais dans ce cas il faut créer l'objet dans le code et renvoyer une `Response` Starlette l'incluant. -Plus de détails sont disponibles dans la documentation officielle de Starlette sur les tâches d'arrière-plan. +Plus de détails sont disponibles dans [la documentation officielle de Starlette sur les tâches d'arrière-plan](https://www.starlette.dev/background/). ## Avertissement { #caveat } -Si vous avez besoin de réaliser des traitements lourds en tâche d'arrière-plan et que vous n'avez pas besoin que ces traitements aient lieu dans le même process (par exemple, pas besoin de partager la mémoire, les variables, etc.), il peut s'avérer profitable d'utiliser des outils plus importants tels que Celery. +Si vous avez besoin de réaliser des traitements lourds en tâche d'arrière-plan et que vous n'avez pas besoin que ces traitements aient lieu dans le même process (par exemple, pas besoin de partager la mémoire, les variables, etc.), il peut s'avérer profitable d'utiliser des outils plus importants tels que [Celery](https://docs.celeryq.dev). Ces outils nécessitent généralement des configurations plus complexes ainsi qu'un gestionnaire de queue de message, comme RabbitMQ ou Redis, mais ils permettent d'exécuter des tâches d'arrière-plan dans différents process, et surtout, sur plusieurs serveurs. diff --git a/docs/fr/docs/tutorial/bigger-applications.md b/docs/fr/docs/tutorial/bigger-applications.md index 0659622366..82e204224c 100644 --- a/docs/fr/docs/tutorial/bigger-applications.md +++ b/docs/fr/docs/tutorial/bigger-applications.md @@ -123,7 +123,7 @@ Nous allons maintenant utiliser une dépendance simple pour lire un en-tête per Nous utilisons un en-tête inventé pour simplifier cet exemple. -Mais dans les cas réels, vous obtiendrez de meilleurs résultats en utilisant les [utilitaires de sécurité](security/index.md){.internal-link target=_blank} intégrés. +Mais dans les cas réels, vous obtiendrez de meilleurs résultats en utilisant les [utilitaires de sécurité](security/index.md) intégrés. /// @@ -169,7 +169,7 @@ Et nous pouvons ajouter une liste de `dependencies` qui seront ajoutées à tous /// tip | Astuce -Notez que, tout comme pour les [dépendances dans les décorateurs de *chemin d'accès*](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, aucune valeur ne sera transmise à votre *fonction de chemin d'accès*. +Notez que, tout comme pour les [dépendances dans les décorateurs de *chemin d'accès*](dependencies/dependencies-in-path-operation-decorators.md), aucune valeur ne sera transmise à votre *fonction de chemin d'accès*. /// @@ -185,8 +185,8 @@ Le résultat final est que les chemins d'item sont désormais : * Ils incluront tous les `responses` prédéfinies. * Tous ces *chemins d'accès* auront la liste des `dependencies` évaluées/exécutées avant eux. * Si vous déclarez également des dépendances dans un *chemin d'accès* spécifique, **elles seront aussi exécutées**. - * Les dépendances du routeur sont exécutées en premier, puis les [`dependencies` dans le décorateur](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, puis les dépendances des paramètres normaux. - * Vous pouvez également ajouter des [`Security` dependencies avec des `scopes`](../advanced/security/oauth2-scopes.md){.internal-link target=_blank}. + * Les dépendances du routeur sont exécutées en premier, puis les [`dependencies` dans le décorateur](dependencies/dependencies-in-path-operation-decorators.md), puis les dépendances des paramètres normaux. + * Vous pouvez également ajouter des [`Security` dependencies avec des `scopes`](../advanced/security/oauth2-scopes.md). /// tip | Astuce @@ -303,7 +303,7 @@ Et comme la plupart de votre logique vivra désormais dans son propre module, le Vous importez et créez une classe `FastAPI` comme d'habitude. -Et nous pouvons même déclarer des [dépendances globales](dependencies/global-dependencies.md){.internal-link target=_blank} qui seront combinées avec les dépendances de chaque `APIRouter` : +Et nous pouvons même déclarer des [dépendances globales](dependencies/global-dependencies.md) qui seront combinées avec les dépendances de chaque `APIRouter` : {* ../../docs_src/bigger_applications/app_an_py310/main.py hl[1,3,7] title["app/main.py"] *} @@ -353,7 +353,7 @@ La deuxième version est un « import absolu » : from app.routers import items, users ``` -Pour en savoir plus sur les Packages et Modules Python, lisez la documentation officielle de Python sur les modules. +Pour en savoir plus sur les Packages et Modules Python, lisez [la documentation officielle de Python sur les modules](https://docs.python.org/3/tutorial/modules.html). /// @@ -445,7 +445,7 @@ Ainsi, par exemple, d'autres projets pourraient utiliser le même `APIRouter` av Nous pouvons également ajouter des *chemins d'accès* directement à l'application `FastAPI`. -Ici, nous le faisons... juste pour montrer que nous le pouvons 🤷 : +Ici, nous le faisons ... juste pour montrer que nous le pouvons 🤷 : {* ../../docs_src/bigger_applications/app_an_py310/main.py hl[21:23] title["app/main.py"] *} @@ -465,6 +465,37 @@ Comme nous ne pouvons pas simplement les isoler et les « monter » indépendamm /// +## Configurer l'`entrypoint` dans `pyproject.toml` { #configure-the-entrypoint-in-pyproject-toml } + +Comme votre objet FastAPI `app` vit dans `app/main.py`, vous pouvez configurer l'`entrypoint` dans votre fichier `pyproject.toml` comme ceci : + +```toml +[tool.fastapi] +entrypoint = "app.main:app" +``` + +ce qui équivaut à importer ainsi : + +```python +from app.main import app +``` + +De cette façon, la commande `fastapi` saura où trouver votre app. + +/// Note | Remarque + +Vous pourriez aussi passer le chemin à la commande, comme : + +```console +$ fastapi dev app/main.py +``` + +Mais vous devriez vous rappeler de passer le bon chemin à chaque fois que vous appelez la commande `fastapi`. + +En outre, d'autres outils pourraient ne pas être en mesure de la trouver, par exemple l'[Extension VS Code](../editor-support.md) ou [FastAPI Cloud](https://fastapicloud.com), il est donc recommandé d'utiliser l'`entrypoint` dans `pyproject.toml`. + +/// + ## Consulter la documentation API automatique { #check-the-automatic-api-docs } Maintenant, exécutez votre application : @@ -472,14 +503,14 @@ Maintenant, exécutez votre application :
```console -$ fastapi dev app/main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Et ouvrez les documents à http://127.0.0.1:8000/docs. +Et ouvrez les documents à [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Vous verrez la documentation API automatique, incluant les chemins de tous les sous-modules, utilisant les bons chemins (et préfixes) et les bons tags : diff --git a/docs/fr/docs/tutorial/body-nested-models.md b/docs/fr/docs/tutorial/body-nested-models.md index dccfdb6c5d..2d4064310d 100644 --- a/docs/fr/docs/tutorial/body-nested-models.md +++ b/docs/fr/docs/tutorial/body-nested-models.md @@ -96,7 +96,7 @@ Là encore, avec cette simple déclaration, avec FastAPI vous obtenez : Outre les types singuliers normaux comme `str`, `int`, `float`, etc. vous pouvez utiliser des types singuliers plus complexes qui héritent de `str`. -Pour voir toutes les options dont vous disposez, consultez l’aperçu des types de Pydantic. Vous verrez quelques exemples au chapitre suivant. +Pour voir toutes les options dont vous disposez, consultez [l’aperçu des types de Pydantic](https://docs.pydantic.dev/latest/concepts/types/). Vous verrez quelques exemples au chapitre suivant. Par exemple, comme dans le modèle `Image` nous avons un champ `url`, nous pouvons le déclarer comme instance de `HttpUrl` de Pydantic au lieu de `str` : diff --git a/docs/fr/docs/tutorial/body-updates.md b/docs/fr/docs/tutorial/body-updates.md index 36ad12681c..f036dd3c08 100644 --- a/docs/fr/docs/tutorial/body-updates.md +++ b/docs/fr/docs/tutorial/body-updates.md @@ -2,7 +2,7 @@ ## Mettre à jour en remplaçant avec `PUT` { #update-replacing-with-put } -Pour mettre à jour un élément, vous pouvez utiliser l’opération HTTP `PUT`. +Pour mettre à jour un élément, vous pouvez utiliser l’opération [HTTP `PUT`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT). Vous pouvez utiliser le `jsonable_encoder` pour convertir les données d’entrée en données pouvant être stockées au format JSON (par exemple, avec une base de données NoSQL). Par exemple, convertir `datetime` en `str`. @@ -24,11 +24,11 @@ Cela signifie que si vous souhaitez mettre à jour l’élément `bar` avec `PUT comme il n’inclut pas l’attribut déjà enregistré « tax »: 20.2, le modèle d’entrée prendrait la valeur par défaut « tax »: 10.5. -Et les données seraient enregistrées avec cette « nouvelle » `tax` de `10.5`. +Et les données seraient enregistrées avec cette « nouvelle » « tax » de 10.5. ## Effectuer des mises à jour partielles avec `PATCH` { #partial-updates-with-patch } -Vous pouvez également utiliser l’opération HTTP `PATCH` pour mettre à jour des données de manière partielle. +Vous pouvez également utiliser l’opération [HTTP `PATCH`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) pour mettre à jour des données de manière partielle. Cela signifie que vous pouvez n’envoyer que les données que vous souhaitez mettre à jour, en laissant le reste intact. @@ -95,6 +95,6 @@ Remarquez que le modèle d’entrée est toujours validé. Ainsi, si vous souhaitez recevoir des mises à jour partielles pouvant omettre tous les attributs, vous devez disposer d’un modèle avec tous les attributs marqués comme optionnels (avec des valeurs par défaut ou `None`). -Pour distinguer les modèles avec toutes les valeurs optionnelles pour les mises à jour et les modèles avec des valeurs requises pour la création, vous pouvez utiliser les idées décrites dans [Modèles supplémentaires](extra-models.md){.internal-link target=_blank}. +Pour distinguer les modèles avec toutes les valeurs optionnelles pour les mises à jour et les modèles avec des valeurs requises pour la création, vous pouvez utiliser les idées décrites dans [Modèles supplémentaires](extra-models.md). /// diff --git a/docs/fr/docs/tutorial/body.md b/docs/fr/docs/tutorial/body.md index a8703e030d..6a94667982 100644 --- a/docs/fr/docs/tutorial/body.md +++ b/docs/fr/docs/tutorial/body.md @@ -4,9 +4,9 @@ Quand vous avez besoin d'envoyer de la donnée depuis un client (comme un naviga 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 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 en profitant de tous leurs avantages et fonctionnalités. +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 @@ -32,9 +32,9 @@ 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, cet attribut doit être renseigné dans le corps de la requête. Utilisez `None` pour le rendre simplement optionnel. +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 : +Par exemple, le modèle ci-dessus déclare un JSON « `object` » (ou `dict` Python) tel que : ```JSON { @@ -45,7 +45,7 @@ Par exemple, le modèle ci-dessus déclare un JSON « `object` » (ou `dict` P } ``` -... `description` et `tax` étant des attributs optionnels (avec `None` comme valeur par défaut), ce JSON « `object` » serait aussi valide : +... `description` et `tax` étant des attributs optionnels (avec `None` comme valeur par défaut), ce JSON « `object` » serait aussi valide : ```JSON { @@ -60,7 +60,7 @@ Pour l'ajouter à votre *chemin d'accès*, déclarez-le comme vous déclareriez {* ../../docs_src/body/tutorial001_py310.py hl[16] *} -... et déclarez que son type est le modèle que vous avez créé : `Item`. +... et déclarez que son type est le modèle que vous avez créé : `Item`. ## Résultats { #results } @@ -72,7 +72,7 @@ En utilisant uniquement les déclarations de type Python, **FastAPI** réussit * Si la donnée est invalide, une erreur propre et claire sera renvoyée, indiquant exactement où et quelle était la donnée incorrecte. * 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 pour votre modèle ; vous pouvez également les utiliser partout ailleurs si cela a du sens pour votre projet. +* 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. ## Documentation automatique { #automatic-docs } @@ -101,21 +101,21 @@ Et cela a été rigoureusement testé durant la phase de design, avant toute imp 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. +Les captures d'écran précédentes ont été prises sur [Visual Studio Code](https://code.visualstudio.com). -Mais vous auriez le même support de l'éditeur avec PyCharm et la majorité des autres éditeurs de code Python : +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 : /// tip | Astuce -Si vous utilisez PyCharm comme éditeur, vous pouvez utiliser le plug-in Pydantic PyCharm Plugin. +Si vous utilisez [PyCharm](https://www.jetbrains.com/pycharm/) comme éditeur, vous pouvez utiliser le plug-in [Pydantic PyCharm Plugin](https://github.com/koxudaxi/pydantic-pycharm-plugin/). Ce qui améliore le support pour les modèles Pydantic avec : * de l'autocomplétion * des vérifications de type -* du « refactoring » +* du « refactoring » * de la recherche * des inspections @@ -161,4 +161,4 @@ Mais ajouter ces annotations de type permettra à votre éditeur de vous offrir ## Sans Pydantic { #without-pydantic } -Si vous ne voulez pas utiliser des modèles Pydantic, vous pouvez aussi utiliser des paramètres de **Body**. Pour cela, allez voir la documentation sur [Corps de la requête - Paramètres multiples : Valeurs singulières dans le corps](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank}. +Si vous ne voulez pas utiliser des modèles Pydantic, vous pouvez aussi utiliser des paramètres de **Body**. Pour cela, allez voir la documentation sur [Corps de la requête - Paramètres multiples : Valeurs singulières dans le corps](body-multiple-params.md#singular-values-in-body). diff --git a/docs/fr/docs/tutorial/cors.md b/docs/fr/docs/tutorial/cors.md index 3ae7de07ca..e534f2cd1a 100644 --- a/docs/fr/docs/tutorial/cors.md +++ b/docs/fr/docs/tutorial/cors.md @@ -1,6 +1,6 @@ # CORS (Partage des ressources entre origines) { #cors-cross-origin-resource-sharing } -CORS ou « Cross-Origin Resource Sharing » fait référence aux situations où un frontend exécuté dans un navigateur contient du code JavaScript qui communique avec un backend, et où le backend se trouve dans une « origine » différente de celle du frontend. +[CORS ou « Cross-Origin Resource Sharing »](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) fait référence aux situations où un frontend exécuté dans un navigateur contient du code JavaScript qui communique avec un backend, et où le backend se trouve dans une « origine » différente de celle du frontend. ## Origine { #origin } @@ -55,10 +55,10 @@ Les arguments suivants sont pris en charge : * `allow_origins` - Une liste d’origines autorisées à effectuer des requêtes cross-origin. Par ex. `['https://example.org', 'https://www.example.org']`. Vous pouvez utiliser `['*']` pour autoriser n’importe quelle origine. * `allow_origin_regex` - Une chaîne regex pour faire correspondre les origines autorisées à effectuer des requêtes cross-origin. Par ex. `'https://.*\.example\.org'`. * `allow_methods` - Une liste de méthodes HTTP qui doivent être autorisées pour les requêtes cross-origin. Par défaut `['GET']`. Vous pouvez utiliser `['*']` pour autoriser toutes les méthodes standard. -* `allow_headers` - Une liste d’en-têtes HTTP de requête qui doivent être pris en charge pour les requêtes cross-origin. Par défaut `[]`. Vous pouvez utiliser `['*']` pour autoriser tous les en-têtes. Les en-têtes `Accept`, `Accept-Language`, `Content-Language` et `Content-Type` sont toujours autorisés pour les requêtes CORS simples. +* `allow_headers` - Une liste d’en-têtes HTTP de requête qui doivent être pris en charge pour les requêtes cross-origin. Par défaut `[]`. Vous pouvez utiliser `['*']` pour autoriser tous les en-têtes. Les en-têtes `Accept`, `Accept-Language`, `Content-Language` et `Content-Type` sont toujours autorisés pour les [requêtes CORS simples](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests). * `allow_credentials` - Indique que les cookies doivent être pris en charge pour les requêtes cross-origin. Par défaut `False`. - Aucun de `allow_origins`, `allow_methods` et `allow_headers` ne peut être défini à `['*']` si `allow_credentials` est défini à `True`. Ils doivent tous être spécifiés explicitement. + Aucun de `allow_origins`, `allow_methods` et `allow_headers` ne peut être défini à `['*']` si `allow_credentials` est défini à `True`. Ils doivent tous être [spécifiés explicitement](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards). * `expose_headers` - Indique les en-têtes de réponse qui doivent être accessibles au navigateur. Par défaut `[]`. * `max_age` - Définit un temps maximum (en secondes) pendant lequel les navigateurs peuvent mettre en cache les réponses CORS. Par défaut `600`. @@ -77,7 +77,7 @@ Toute requête avec un en-tête `Origin`. Dans ce cas, le middleware laissera pa ## En savoir plus { #more-info } -Pour plus d’informations sur CORS, consultez la documentation CORS de Mozilla. +Pour plus d’informations sur CORS, consultez la [documentation CORS de Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS). /// note | Détails techniques diff --git a/docs/fr/docs/tutorial/debugging.md b/docs/fr/docs/tutorial/debugging.md index d69e6a3bae..6452b43fae 100644 --- a/docs/fr/docs/tutorial/debugging.md +++ b/docs/fr/docs/tutorial/debugging.md @@ -74,7 +74,7 @@ ne sera pas exécutée. /// info -Pour plus d'informations, consultez la documentation officielle de Python. +Pour plus d'informations, consultez [la documentation officielle de Python](https://docs.python.org/3/library/__main__.html). /// diff --git a/docs/fr/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/fr/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md index bf697fe8de..b32728a304 100644 --- a/docs/fr/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md +++ b/docs/fr/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md @@ -32,7 +32,7 @@ Cela peut également éviter toute confusion pour les nouveaux développeurs qui Dans cet exemple, nous utilisons des en-têtes personnalisés fictifs `X-Key` et `X-Token`. -Mais dans des cas réels, lors de l'implémentation de la sécurité, vous tirerez davantage d'avantages en utilisant les [utilitaires de sécurité (chapitre suivant)](../security/index.md){.internal-link target=_blank} intégrés. +Mais dans des cas réels, lors de l'implémentation de la sécurité, vous tirerez davantage d'avantages en utilisant les [utilitaires de sécurité (chapitre suivant)](../security/index.md) intégrés. /// @@ -62,7 +62,7 @@ Vous pouvez donc réutiliser une dépendance normale (qui retourne une valeur) q ## Définir des dépendances pour un groupe de chemins d'accès { #dependencies-for-a-group-of-path-operations } -Plus tard, en lisant comment structurer des applications plus grandes ([Applications plus grandes - Plusieurs fichiers](../../tutorial/bigger-applications.md){.internal-link target=_blank}), éventuellement avec plusieurs fichiers, vous apprendrez à déclarer un unique paramètre `dependencies` pour un groupe de *chemins d'accès*. +Plus tard, en lisant comment structurer des applications plus grandes ([Applications plus grandes - Plusieurs fichiers](../../tutorial/bigger-applications.md)), éventuellement avec plusieurs fichiers, vous apprendrez à déclarer un unique paramètre `dependencies` pour un groupe de *chemins d'accès*. ## Définir des dépendances globales { #global-dependencies } diff --git a/docs/fr/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/fr/docs/tutorial/dependencies/dependencies-with-yield.md index 3f06df7674..53d4ae4cf3 100644 --- a/docs/fr/docs/tutorial/dependencies/dependencies-with-yield.md +++ b/docs/fr/docs/tutorial/dependencies/dependencies-with-yield.md @@ -14,8 +14,8 @@ Vous devez vous assurer d'utiliser `yield` une seule fois par dépendance. Toute fonction valide à utiliser avec : -* `@contextlib.contextmanager` ou -* `@contextlib.asynccontextmanager` +* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) ou +* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager) sera valide comme dépendance **FastAPI**. @@ -87,7 +87,7 @@ Vous pouvez combiner les dépendances comme vous le souhaitez. /// note | Détails techniques -Cela fonctionne grâce aux gestionnaires de contexte de Python. +Cela fonctionne grâce aux [gestionnaires de contexte](https://docs.python.org/3/library/contextlib.html) de Python. **FastAPI** les utilise en interne pour y parvenir. @@ -111,7 +111,7 @@ Mais elle est à votre disposition si vous en avez besoin. 🤓 {* ../../docs_src/dependencies/tutorial008b_an_py310.py hl[18:22,31] *} -Si vous souhaitez intercepter des exceptions et créer une réponse personnalisée en fonction de cela, créez un [Gestionnaire d'exceptions personnalisé](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}. +Si vous souhaitez intercepter des exceptions et créer une réponse personnalisée en fonction de cela, créez un [Gestionnaire d'exceptions personnalisé](../handling-errors.md#install-custom-exception-handlers). ## Utiliser des dépendances avec `yield` et `except` { #dependencies-with-yield-and-except } @@ -233,14 +233,14 @@ participant operation as Path Operation Les dépendances avec `yield` ont évolué au fil du temps pour couvrir différents cas d'utilisation et corriger certains problèmes. -Si vous souhaitez voir ce qui a changé dans différentes versions de FastAPI, vous pouvez en savoir plus dans le guide avancé, dans [Dépendances avancées - Dépendances avec `yield`, `HTTPException`, `except` et Background Tasks](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks){.internal-link target=_blank}. +Si vous souhaitez voir ce qui a changé dans différentes versions de FastAPI, vous pouvez en savoir plus dans le guide avancé, dans [Dépendances avancées - Dépendances avec `yield`, `HTTPException`, `except` et Background Tasks](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks). ## Gestionnaires de contexte { #context-managers } ### Que sont les « Context Managers » { #what-are-context-managers } Les « Context Managers » sont des objets Python que vous pouvez utiliser dans une instruction `with`. -Par exemple, vous pouvez utiliser `with` pour lire un fichier : +Par exemple, [vous pouvez utiliser `with` pour lire un fichier](https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files) : ```Python with open("./somefile.txt") as f: @@ -264,7 +264,7 @@ Si vous débutez avec **FastAPI**, vous voudrez peut-être l'ignorer pour le mom /// -En Python, vous pouvez créer des gestionnaires de contexte en créant une classe avec deux méthodes : `__enter__()` et `__exit__()`. +En Python, vous pouvez créer des gestionnaires de contexte en [créant une classe avec deux méthodes : `__enter__()` et `__exit__()`](https://docs.python.org/3/reference/datamodel.html#context-managers). Vous pouvez également les utiliser dans des dépendances **FastAPI** avec `yield` en utilisant des instructions `with` ou `async with` à l'intérieur de la fonction de dépendance : @@ -275,8 +275,8 @@ des instructions `with` ou `async with` à l'intérieur de la fonction de dépen Une autre façon de créer un gestionnaire de contexte consiste à utiliser : -* `@contextlib.contextmanager` ou -* `@contextlib.asynccontextmanager` +* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) ou +* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager) pour décorer une fonction avec un unique `yield`. diff --git a/docs/fr/docs/tutorial/dependencies/global-dependencies.md b/docs/fr/docs/tutorial/dependencies/global-dependencies.md index 2c418ee4a1..f334c5d500 100644 --- a/docs/fr/docs/tutorial/dependencies/global-dependencies.md +++ b/docs/fr/docs/tutorial/dependencies/global-dependencies.md @@ -2,14 +2,14 @@ Pour certains types d'applications, vous pourriez vouloir ajouter des dépendances à l'application entière. -Comme vous pouvez [ajouter des `dependencies` aux *décorateurs de chemin d'accès*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, vous pouvez les ajouter à l'application `FastAPI`. +Comme vous pouvez [ajouter des `dependencies` aux *décorateurs de chemin d'accès*](dependencies-in-path-operation-decorators.md), vous pouvez les ajouter à l'application `FastAPI`. Dans ce cas, elles seront appliquées à tous les *chemins d'accès* de l'application : {* ../../docs_src/dependencies/tutorial012_an_py310.py hl[17] *} -Et toutes les idées de la section sur [l'ajout de `dependencies` aux *décorateurs de chemin d'accès*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} s'appliquent toujours, mais dans ce cas à tous les *chemins d'accès* de l'application. +Et toutes les idées de la section sur [l'ajout de `dependencies` aux *décorateurs de chemin d'accès*](dependencies-in-path-operation-decorators.md) s'appliquent toujours, mais dans ce cas à tous les *chemins d'accès* de l'application. ## Dépendances pour des groupes de *chemins d'accès* { #dependencies-for-groups-of-path-operations } -Plus tard, en lisant comment structurer des applications plus grandes ([Applications plus grandes - Plusieurs fichiers](../../tutorial/bigger-applications.md){.internal-link target=_blank}), éventuellement avec plusieurs fichiers, vous apprendrez comment déclarer un unique paramètre `dependencies` pour un groupe de *chemins d'accès*. +Plus tard, en lisant comment structurer des applications plus grandes ([Applications plus grandes - Plusieurs fichiers](../../tutorial/bigger-applications.md)), éventuellement avec plusieurs fichiers, vous apprendrez comment déclarer un unique paramètre `dependencies` pour un groupe de *chemins d'accès*. diff --git a/docs/fr/docs/tutorial/dependencies/index.md b/docs/fr/docs/tutorial/dependencies/index.md index 8fad77f62a..03eea57e32 100644 --- a/docs/fr/docs/tutorial/dependencies/index.md +++ b/docs/fr/docs/tutorial/dependencies/index.md @@ -51,13 +51,13 @@ Dans ce cas, cette dépendance attend : Puis elle retourne simplement un `dict` contenant ces valeurs. -/// info | Info +/// info FastAPI a ajouté la prise en charge de `Annotated` (et a commencé à le recommander) dans la version 0.95.0. Si vous avez une version plus ancienne, vous obtiendrez des erreurs en essayant d’utiliser `Annotated`. -Vous devez vous assurer de [mettre à niveau la version de FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} vers au moins la 0.95.1 avant d’utiliser `Annotated`. +Vous devez vous assurer de [mettre à niveau la version de FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions) vers au moins la 0.95.1 avant d’utiliser `Annotated`. /// @@ -152,7 +152,7 @@ Peu importe. **FastAPI** saura quoi faire. /// note | Remarque -Si vous ne savez pas, consultez la section [Async : *« Pressé ? »*](../../async.md#in-a-hurry){.internal-link target=_blank} à propos de `async` et `await` dans la documentation. +Si vous ne savez pas, consultez la section [Async : *« Pressé ? »*](../../async.md#in-a-hurry) à propos de `async` et `await` dans la documentation. /// diff --git a/docs/fr/docs/tutorial/encoder.md b/docs/fr/docs/tutorial/encoder.md index f94be429ca..15a6479ff3 100644 --- a/docs/fr/docs/tutorial/encoder.md +++ b/docs/fr/docs/tutorial/encoder.md @@ -12,7 +12,7 @@ Imaginons que vous ayez une base de données `fake_db` qui ne reçoit que des do Par exemple, elle ne reçoit pas d'objets `datetime`, car ceux-ci ne sont pas compatibles avec JSON. -Ainsi, un objet `datetime` doit être converti en une `str` contenant les données au format ISO. +Ainsi, un objet `datetime` doit être converti en une `str` contenant les données au [format ISO](https://en.wikipedia.org/wiki/ISO_8601). De la même manière, cette base de données n'accepterait pas un modèle Pydantic (un objet avec des attributs), seulement un `dict`. @@ -24,7 +24,7 @@ Elle reçoit un objet, comme un modèle Pydantic, et renvoie une version compati Dans cet exemple, elle convertirait le modèle Pydantic en `dict`, et le `datetime` en `str`. -Le résultat de son appel est quelque chose qui peut être encodé avec la fonction standard de Python `json.dumps()`. +Le résultat de son appel est quelque chose qui peut être encodé avec la fonction standard de Python [`json.dumps()`](https://docs.python.org/3/library/json.html#json.dumps). Elle ne renvoie pas une grande `str` contenant les données au format JSON (sous forme de chaîne). Elle renvoie une structure de données standard de Python (par ex. un `dict`) avec des valeurs et sous-valeurs toutes compatibles avec JSON. diff --git a/docs/fr/docs/tutorial/extra-data-types.md b/docs/fr/docs/tutorial/extra-data-types.md index edaa7bd4c3..7ee6816c82 100644 --- a/docs/fr/docs/tutorial/extra-data-types.md +++ b/docs/fr/docs/tutorial/extra-data-types.md @@ -36,7 +36,7 @@ Voici quelques types de données supplémentaires que vous pouvez utiliser : * `datetime.timedelta` : * Un `datetime.timedelta` Python. * Dans les requêtes et les réponses, il sera représenté sous forme de `float` de secondes totales. - * Pydantic permet aussi de le représenter sous la forme d'un « encodage de différence de temps ISO 8601 », voir la documentation pour plus d'informations. + * Pydantic permet aussi de le représenter sous la forme d'un « encodage de différence de temps ISO 8601 », [voir la documentation pour plus d'informations](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers). * `frozenset` : * Dans les requêtes et les réponses, traité de la même manière qu'un `set` : * Dans les requêtes, une liste sera lue, les doublons éliminés, puis convertie en `set`. @@ -49,7 +49,7 @@ Voici quelques types de données supplémentaires que vous pouvez utiliser : * `Decimal` : * `Decimal` Python standard. * Dans les requêtes et les réponses, géré de la même manière qu'un `float`. -* Vous pouvez consulter tous les types de données Pydantic valides ici : Types de données Pydantic. +* Vous pouvez consulter tous les types de données Pydantic valides ici : [Types de données Pydantic](https://docs.pydantic.dev/latest/usage/types/types/). ## Exemple { #example } diff --git a/docs/fr/docs/tutorial/extra-models.md b/docs/fr/docs/tutorial/extra-models.md index 1f9eb15616..24a3fa31b7 100644 --- a/docs/fr/docs/tutorial/extra-models.md +++ b/docs/fr/docs/tutorial/extra-models.md @@ -12,7 +12,7 @@ C'est particulièrement vrai pour les modèles d'utilisateur, car : Ne stockez jamais les mots de passe des utilisateurs en clair. Stockez toujours un « hachage sécurisé » que vous pourrez ensuite vérifier. -Si vous ne savez pas ce que c'est, vous apprendrez ce qu'est un « hachage de mot de passe » dans les [chapitres sur la sécurité](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}. +Si vous ne savez pas ce que c'est, vous apprendrez ce qu'est un « hachage de mot de passe » dans les [chapitres sur la sécurité](security/simple-oauth2.md#password-hashing). /// @@ -162,11 +162,11 @@ Vous pouvez déclarer qu'une réponse est l'`Union` de deux types ou plus, ce qu Cela sera défini dans OpenAPI avec `anyOf`. -Pour ce faire, utilisez l'annotation de type Python standard `typing.Union` : +Pour ce faire, utilisez l'annotation de type Python standard [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union) : /// note | Remarque -Lors de la définition d'une `Union`, incluez d'abord le type le plus spécifique, suivi du type le moins spécifique. Dans l'exemple ci-dessous, le type le plus spécifique `PlaneItem` précède `CarItem` dans `Union[PlaneItem, CarItem]`. +Lors de la définition d'une [`Union`](https://docs.pydantic.dev/latest/concepts/types/#unions), incluez d'abord le type le plus spécifique, suivi du type le moins spécifique. Dans l'exemple ci-dessous, le type le plus spécifique `PlaneItem` précède `CarItem` dans `Union[PlaneItem, CarItem]`. /// diff --git a/docs/fr/docs/tutorial/first-steps.md b/docs/fr/docs/tutorial/first-steps.md index ae23584688..0a82004d2c 100644 --- a/docs/fr/docs/tutorial/first-steps.md +++ b/docs/fr/docs/tutorial/first-steps.md @@ -11,7 +11,7 @@ Démarrez le serveur en direct :
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -58,7 +58,7 @@ Cette ligne montre l’URL où votre application est servie, sur votre machine l ### Vérifier { #check-it } -Ouvrez votre navigateur à l’adresse http://127.0.0.1:8000. +Ouvrez votre navigateur à l’adresse [http://127.0.0.1:8000](http://127.0.0.1:8000). Vous verrez la réponse JSON suivante : @@ -68,17 +68,17 @@ Vous verrez la réponse JSON suivante : ### Documentation interactive de l’API { #interactive-api-docs } -Allez maintenant sur http://127.0.0.1:8000/docs. +Allez maintenant sur [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). -Vous verrez la documentation interactive de l’API générée automatiquement (fournie par Swagger UI) : +Vous verrez la documentation interactive de l’API générée automatiquement (fournie par [Swagger UI](https://github.com/swagger-api/swagger-ui)) : ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Documentation alternative de l’API { #alternative-api-docs } -Et maintenant, allez sur http://127.0.0.1:8000/redoc. +Et maintenant, allez sur [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). -Vous verrez la documentation automatique alternative (fournie par ReDoc) : +Vous verrez la documentation automatique alternative (fournie par [ReDoc](https://github.com/Rebilly/ReDoc)) : ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -92,7 +92,7 @@ Un « schéma » est une définition ou une description de quelque chose. Pas le #### « Schéma » d’API { #api-schema } -Ici, OpenAPI est une spécification qui dicte comment définir le schéma de votre API. +Ici, [OpenAPI](https://github.com/OAI/OpenAPI-Specification) est une spécification qui dicte comment définir le schéma de votre API. Cette définition de schéma inclut les chemins de votre API, les paramètres possibles qu’ils prennent, etc. @@ -110,7 +110,7 @@ OpenAPI définit un schéma d’API pour votre API. Et ce schéma inclut des dé Si vous êtes curieux de voir à quoi ressemble le schéma OpenAPI brut, FastAPI génère automatiquement un JSON (schéma) avec les descriptions de toute votre API. -Vous pouvez le voir directement à l’adresse : http://127.0.0.1:8000/openapi.json. +Vous pouvez le voir directement à l’adresse : [http://127.0.0.1:8000/openapi.json](http://127.0.0.1:8000/openapi.json). Il affichera un JSON commençant par quelque chose comme : @@ -143,9 +143,58 @@ Et il existe des dizaines d’alternatives, toutes basées sur OpenAPI. Vous pou Vous pourriez également l’utiliser pour générer du code automatiquement, pour les clients qui communiquent avec votre API. Par exemple, des applications frontend, mobiles ou IoT. +### Configurer le `entrypoint` de l’application dans `pyproject.toml` { #configure-the-app-entrypoint-in-pyproject-toml } + +Vous pouvez configurer l’emplacement de votre application dans un fichier `pyproject.toml` comme : + +```toml +[tool.fastapi] +entrypoint = "main:app" +``` + +Ce `entrypoint` indiquera à la commande `fastapi` qu’elle doit importer l’application comme : + +```python +from main import app +``` + +Si votre code est structuré comme : + +``` +. +├── backend +│   ├── main.py +│   ├── __init__.py +``` + +Alors vous définiriez le `entrypoint` comme : + +```toml +[tool.fastapi] +entrypoint = "backend.main:app" +``` + +ce qui équivaudrait à : + +```python +from backend.main import app +``` + +### `fastapi dev` avec un chemin { #fastapi-dev-with-path } + +Vous pouvez également passer le chemin du fichier à la commande `fastapi dev`, et elle devinera l’objet d’application FastAPI à utiliser : + +```console +$ fastapi dev main.py +``` + +Mais vous devrez vous souvenir de passer le chemin correct à chaque exécution de la commande `fastapi`. + +De plus, d’autres outils pourraient ne pas être capables de le trouver, par exemple l’[Extension VS Code](../editor-support.md) ou [FastAPI Cloud](https://fastapicloud.com), il est donc recommandé d’utiliser le `entrypoint` dans `pyproject.toml`. + ### Déployer votre application (optionnel) { #deploy-your-app-optional } -Vous pouvez, si vous le souhaitez, déployer votre application FastAPI sur FastAPI Cloud, allez rejoindre la liste d’attente si ce n’est pas déjà fait. 🚀 +Vous pouvez, si vous le souhaitez, déployer votre application FastAPI sur [FastAPI Cloud](https://fastapicloud.com), allez rejoindre la liste d’attente si ce n’est pas déjà fait. 🚀 Si vous avez déjà un compte **FastAPI Cloud** (nous vous avons invité depuis la liste d’attente 😉), vous pouvez déployer votre application avec une seule commande. @@ -191,7 +240,7 @@ C’est tout ! Vous pouvez maintenant accéder à votre application à cette URL `FastAPI` est une classe qui hérite directement de `Starlette`. -Vous pouvez donc aussi utiliser toutes les fonctionnalités de Starlette avec `FastAPI`. +Vous pouvez donc aussi utiliser toutes les fonctionnalités de [Starlette](https://www.starlette.dev/) avec `FastAPI`. /// @@ -336,7 +385,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){.internal-link target=_blank}. +Si vous ne connaissez pas la différence, consultez [Asynchrone : « Pressé ? »](../async.md#in-a-hurry). /// @@ -352,11 +401,11 @@ Il existe de nombreux autres objets et modèles qui seront automatiquement conve ### Étape 6 : le déployer { #step-6-deploy-it } -Déployez votre application sur **FastAPI Cloud** avec une seule commande : `fastapi deploy`. 🎉 +Déployez votre application sur **[FastAPI Cloud](https://fastapicloud.com)** avec une seule commande : `fastapi deploy`. 🎉 #### À propos de FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** est construit par le même auteur et l’équipe derrière **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** est construit par le même auteur et l’équipe derrière **FastAPI**. Il simplifie le processus de **construction**, de **déploiement** et d’**accès** à une API avec un minimum d’effort. diff --git a/docs/fr/docs/tutorial/handling-errors.md b/docs/fr/docs/tutorial/handling-errors.md index 38935c21cc..a697571f33 100644 --- a/docs/fr/docs/tutorial/handling-errors.md +++ b/docs/fr/docs/tutorial/handling-errors.md @@ -81,7 +81,7 @@ Mais si vous en aviez besoin pour un scénario avancé, vous pouvez ajouter des ## Installer des gestionnaires d'exception personnalisés { #install-custom-exception-handlers } -Vous pouvez ajouter des gestionnaires d'exception personnalisés avec les mêmes utilitaires d'exception de Starlette. +Vous pouvez ajouter des gestionnaires d'exception personnalisés avec [les mêmes utilitaires d'exception de Starlette](https://www.starlette.dev/exceptions/). Supposons que vous ayez une exception personnalisée `UnicornException` que vous (ou une bibliothèque que vous utilisez) pourriez `raise`. diff --git a/docs/fr/docs/tutorial/index.md b/docs/fr/docs/tutorial/index.md index 0251b9b4b2..2fc177ed95 100644 --- a/docs/fr/docs/tutorial/index.md +++ b/docs/fr/docs/tutorial/index.md @@ -10,12 +10,12 @@ Il est également conçu pour servir de référence ultérieure, afin que vous p Tous les blocs de code peuvent être copiés et utilisés directement (il s'agit en fait de fichiers Python testés). -Pour exécuter l'un de ces exemples, copiez le code dans un fichier `main.py`, et démarrez `fastapi dev` avec : +Pour exécuter l'un de ces exemples, copiez le code dans un fichier `main.py`, et démarrez `fastapi dev` :
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -62,7 +62,7 @@ L'utiliser dans votre éditeur est ce qui vous montre vraiment les avantages de La première étape consiste à installer FastAPI. -Assurez-vous de créer un [environnement virtuel](../virtual-environments.md){.internal-link target=_blank}, de l'activer, puis **d'installer FastAPI** : +Assurez-vous de créer un [environnement virtuel](../virtual-environments.md), de l'activer, puis **d'installer FastAPI** :
@@ -76,7 +76,7 @@ $ pip install "fastapi[standard]" /// note | Remarque -Lorsque vous installez avec `pip install "fastapi[standard]"` cela inclut des dépendances standard optionnelles par défaut, y compris `fastapi-cloud-cli`, qui vous permet de déployer sur FastAPI Cloud. +Lorsque vous installez avec `pip install "fastapi[standard]"`, cela inclut des dépendances standards optionnelles par défaut, y compris `fastapi-cloud-cli`, qui vous permet de déployer sur [FastAPI Cloud](https://fastapicloud.com). Si vous ne souhaitez pas avoir ces dépendances optionnelles, vous pouvez à la place installer `pip install fastapi`. @@ -84,6 +84,12 @@ Si vous souhaitez installer les dépendances standard mais sans `fastapi-cloud-c /// +/// tip | Astuce + +FastAPI dispose d'une [extension officielle pour VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (et Cursor), qui fournit de nombreuses fonctionnalités, notamment un explorateur de chemins d'accès, une recherche de chemins d'accès, la navigation CodeLens dans les tests (aller à la définition depuis les tests), ainsi que le déploiement et les journaux FastAPI Cloud, le tout depuis votre éditeur. + +/// + ## Guide d'utilisation avancé { #advanced-user-guide } Il existe également un **Guide d'utilisation avancé** que vous pouvez lire plus tard après ce **Tutoriel - Guide d'utilisation**. diff --git a/docs/fr/docs/tutorial/metadata.md b/docs/fr/docs/tutorial/metadata.md index 3ea3865bab..87f72fefa0 100644 --- a/docs/fr/docs/tutorial/metadata.md +++ b/docs/fr/docs/tutorial/metadata.md @@ -14,7 +14,7 @@ Vous pouvez définir les champs suivants qui sont utilisés dans la spécificati | `version` | `string` | 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.
champs de contact
ParamètreTypeDescription
namestrLe nom identifiant de la personne/organisation de contact.
urlstrL’URL pointant vers les informations de contact. DOIT être au format d’une URL.
emailstrL’adresse e-mail de la personne/organisation de contact. DOIT être au format d’une adresse e-mail.
| -| `license_info` | `dict` | Les informations de licence pour l’API exposée. Cela peut contenir plusieurs champs.
champs de license_info
ParamètreTypeDescription
namestrOBLIGATOIRE (si un license_info est défini). Le nom de la licence utilisée pour l’API.
identifierstrUne expression de licence SPDX pour l’API. Le champ identifier est mutuellement exclusif du champ url. Disponible depuis OpenAPI 3.1.0, FastAPI 0.99.0.
urlstrUne URL vers la licence utilisée pour l’API. DOIT être au format d’une URL.
| +| `license_info` | `dict` | Les informations de licence pour l’API exposée. Cela peut contenir plusieurs champs.
champs de license_info
ParamètreTypeDescription
namestrOBLIGATOIRE (si un license_info est défini). Le nom de la licence utilisée pour l’API.
identifierstrUne 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.
urlstrUne URL vers la licence utilisée pour l’API. DOIT être au format d’une URL.
| Vous pouvez les définir comme suit : @@ -76,7 +76,7 @@ Utilisez le paramètre `tags` avec vos *chemins d'accès* (et `APIRouter`s) pour /// info -En savoir plus sur les tags dans [Configuration de chemins d'accès](path-operation-configuration.md#tags){.internal-link target=_blank}. +En savoir plus sur les tags dans [Configuration de chemins d'accès](path-operation-configuration.md#tags). /// diff --git a/docs/fr/docs/tutorial/middleware.md b/docs/fr/docs/tutorial/middleware.md index 6cbbc3e456..860b8041ce 100644 --- a/docs/fr/docs/tutorial/middleware.md +++ b/docs/fr/docs/tutorial/middleware.md @@ -15,7 +15,7 @@ Un « middleware » est une fonction qui agit sur chaque **requête** avant qu Si vous avez des dépendances avec `yield`, le code de sortie s’exécutera après le middleware. -S’il y avait des tâches d’arrière-plan (présentées dans la section [Tâches d’arrière-plan](background-tasks.md){.internal-link target=_blank}, que vous verrez plus tard), elles s’exécuteront après tous les middlewares. +S’il y avait des tâches d’arrière-plan (présentées dans la section [Tâches d’arrière-plan](background-tasks.md), que vous verrez plus tard), elles s’exécuteront après tous les middlewares. /// @@ -35,9 +35,9 @@ La fonction de middleware reçoit : /// tip | Astuce -Gardez à l’esprit que des en-têtes propriétaires personnalisés peuvent être ajoutés en utilisant le préfixe `X-`. +Gardez à l’esprit que des en-têtes propriétaires personnalisés peuvent être ajoutés [en utilisant le préfixe `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). -Mais si vous avez des en-têtes personnalisés que vous voulez rendre visibles pour un client dans un navigateur, vous devez les ajouter à votre configuration CORS ([CORS (Partage des ressources entre origines)](cors.md){.internal-link target=_blank}) en utilisant le paramètre `expose_headers` documenté dans la documentation CORS de Starlette. +Mais si vous avez des en-têtes personnalisés que vous voulez rendre visibles pour un client dans un navigateur, vous devez les ajouter à votre configuration CORS ([CORS (Partage des ressources entre origines)](cors.md)) en utilisant le paramètre `expose_headers` documenté dans [la documentation CORS de Starlette](https://www.starlette.dev/middleware/#corsmiddleware). /// @@ -61,7 +61,7 @@ Par exemple, vous pourriez ajouter un en-tête personnalisé `X-Process-Time` co /// tip | Astuce -Ici, nous utilisons `time.perf_counter()` au lieu de `time.time()` car cela peut être plus précis pour ces cas d’usage. 🤓 +Ici, nous utilisons [`time.perf_counter()`](https://docs.python.org/3/library/time.html#time.perf_counter) au lieu de `time.time()` car cela peut être plus précis pour ces cas d’usage. 🤓 /// @@ -90,6 +90,6 @@ Ce comportement d’empilement garantit que les middlewares s’exécutent dans ## Autres middlewares { #other-middlewares } -Vous pouvez en lire davantage sur d’autres middlewares dans le [Guide de l’utilisateur avancé : Middleware avancé](../advanced/middleware.md){.internal-link target=_blank}. +Vous pouvez en lire davantage sur d’autres middlewares dans le [Guide de l’utilisateur avancé : Middleware avancé](../advanced/middleware.md). Vous verrez comment gérer CORS avec un middleware dans la section suivante. diff --git a/docs/fr/docs/tutorial/path-operation-configuration.md b/docs/fr/docs/tutorial/path-operation-configuration.md index f8041fa691..185adb6dd9 100644 --- a/docs/fr/docs/tutorial/path-operation-configuration.md +++ b/docs/fr/docs/tutorial/path-operation-configuration.md @@ -58,7 +58,7 @@ Vous pouvez ajouter un `summary` et une `description` : Comme les descriptions ont tendance à être longues et à couvrir plusieurs lignes, vous pouvez déclarer la description du *chemin d'accès* dans la docstring de la fonction et **FastAPI** la lira à partir de là. -Vous pouvez écrire Markdown dans la docstring, il sera interprété et affiché correctement (en tenant compte de l'indentation de la docstring). +Vous pouvez écrire [Markdown](https://en.wikipedia.org/wiki/Markdown) dans la docstring, il sera interprété et affiché correctement (en tenant compte de l'indentation de la docstring). {* ../../docs_src/path_operation_configuration/tutorial004_py310.py hl[17:25] *} diff --git a/docs/fr/docs/tutorial/path-params-numeric-validations.md b/docs/fr/docs/tutorial/path-params-numeric-validations.md index 2dbaaa8cae..b61b42ef78 100644 --- a/docs/fr/docs/tutorial/path-params-numeric-validations.md +++ b/docs/fr/docs/tutorial/path-params-numeric-validations.md @@ -14,7 +14,7 @@ FastAPI a ajouté le support pour `Annotated` (et a commencé à le recommander) Si vous avez une version plus ancienne, vous obtiendrez des erreurs en essayant d'utiliser `Annotated`. -Assurez-vous de [Mettre à niveau la version de FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} à la version 0.95.1 à minima avant d'utiliser `Annotated`. +Assurez-vous de [Mettre à niveau la version de FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions) à la version 0.95.1 à minima avant d'utiliser `Annotated`. /// @@ -112,17 +112,17 @@ La même chose s'applique pour : Les validations numériques fonctionnent également pour les valeurs `float`. -C'est ici qu'il devient important de pouvoir déclarer gt et pas seulement ge. Avec cela, vous pouvez exiger, par exemple, qu'une valeur doit être supérieure à `0`, même si elle est inférieure à `1`. +C'est ici qu'il devient important de pouvoir déclarer gt et pas seulement ge. Avec cela, vous pouvez exiger, par exemple, qu'une valeur doit être supérieure à `0`, même si elle est inférieure à `1`. Ainsi, `0.5` serait une valeur valide. Mais `0.0` ou `0` ne le serait pas. -Et la même chose pour lt. +Et la même chose pour lt. {* ../../docs_src/path_params_numeric_validations/tutorial006_an_py310.py hl[13] *} ## Pour résumer { #recap } -Avec `Query`, `Path` (et d'autres que vous verrez plus tard) vous pouvez déclarer des métadonnées et des validations de chaînes de la même manière qu'avec les [Paramètres de requête et validations de chaînes](query-params-str-validations.md){.internal-link target=_blank}. +Avec `Query`, `Path` (et d'autres que vous verrez plus tard) vous pouvez déclarer des métadonnées et des validations de chaînes de la même manière qu'avec les [Paramètres de requête et validations de chaînes](query-params-str-validations.md). Et vous pouvez également déclarer des validations numériques : diff --git a/docs/fr/docs/tutorial/path-params.md b/docs/fr/docs/tutorial/path-params.md index 985eff6354..f84c4c0357 100644 --- a/docs/fr/docs/tutorial/path-params.md +++ b/docs/fr/docs/tutorial/path-params.md @@ -6,7 +6,7 @@ Vous pouvez déclarer des « paramètres » ou « variables » de chemin avec la La valeur du paramètre de chemin `item_id` sera transmise à votre fonction dans l'argument `item_id`. -Donc, si vous exécutez cet exemple et allez sur http://127.0.0.1:8000/items/foo, vous verrez comme réponse : +Donc, si vous exécutez cet exemple et allez sur [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo), vous verrez comme réponse : ```JSON {"item_id":"foo"} @@ -28,7 +28,7 @@ Cela vous apporte la prise en charge par l'éditeur dans votre fonction, avec v ## Conversion de données { #data-conversion } -Si vous exécutez cet exemple et ouvrez votre navigateur sur http://127.0.0.1:8000/items/3, vous verrez comme réponse : +Si vous exécutez cet exemple et ouvrez votre navigateur sur [http://127.0.0.1:8000/items/3](http://127.0.0.1:8000/items/3), vous verrez comme réponse : ```JSON {"item_id":3} @@ -44,7 +44,7 @@ Ainsi, avec cette déclaration de type, **FastAPI** vous fournit automatiquement ## Validation de données { #data-validation } -Mais si vous allez dans le navigateur sur http://127.0.0.1:8000/items/foo, vous verrez une belle erreur HTTP : +Mais si vous allez dans le navigateur sur [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo), vous verrez une belle erreur HTTP : ```JSON { @@ -64,7 +64,7 @@ Mais si vous allez dans le navigateur sur http://127.0.0.1:8000/items/4.2 +La même erreur apparaîtrait si vous fournissiez un `float` au lieu d'un `int`, comme ici : [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2) /// check | Vérifications @@ -78,7 +78,7 @@ C'est incroyablement utile lors du développement et du débogage du code qui in ## Documentation { #documentation } -Et lorsque vous ouvrez votre navigateur sur http://127.0.0.1:8000/docs, vous verrez une documentation d'API automatique et interactive comme : +Et lorsque vous ouvrez votre navigateur sur [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs), vous verrez une documentation d'API automatique et interactive comme : @@ -92,9 +92,9 @@ Remarquez que le paramètre de chemin est déclaré comme entier. ## Les avantages d'une norme, documentation alternative { #standards-based-benefits-alternative-documentation } -Et comme le schéma généré suit la norme OpenAPI, il existe de nombreux outils compatibles. +Et comme le schéma généré suit la norme [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md), il existe de nombreux outils compatibles. -Grâce à cela, **FastAPI** fournit lui-même une documentation d'API alternative (utilisant ReDoc), accessible sur http://127.0.0.1:8000/redoc : +Grâce à cela, **FastAPI** fournit lui-même une documentation d'API alternative (utilisant ReDoc), accessible sur [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) : @@ -102,7 +102,7 @@ De la même façon, il existe de nombreux outils compatibles, y compris des outi ## Pydantic { #pydantic } -Toute la validation de données est effectuée sous le capot par Pydantic, vous en bénéficiez donc pleinement. Vous savez ainsi que vous êtes entre de bonnes mains. +Toute la validation de données est effectuée sous le capot par [Pydantic](https://docs.pydantic.dev/), vous en bénéficiez donc pleinement. Vous savez ainsi que vous êtes entre de bonnes mains. Vous pouvez utiliser les mêmes déclarations de type avec `str`, `float`, `bool` et de nombreux autres types de données complexes. @@ -130,7 +130,7 @@ Le premier sera toujours utilisé puisque le chemin correspond en premier. ## Valeurs prédéfinies { #predefined-values } -Si vous avez un *chemin d'accès* qui reçoit un *paramètre de chemin*, mais que vous voulez que les valeurs possibles de ce *paramètre de chemin* soient prédéfinies, vous pouvez utiliser une `Enum` Python standard. +Si vous avez un *chemin d'accès* qui reçoit un *paramètre de chemin*, mais que vous voulez que les valeurs possibles de ce *paramètre de chemin* soient prédéfinies, vous pouvez utiliser une `Enum` Python standard. ### Créer une classe `Enum` { #create-an-enum-class } diff --git a/docs/fr/docs/tutorial/query-params-str-validations.md b/docs/fr/docs/tutorial/query-params-str-validations.md index 17b751f239..57d3587581 100644 --- a/docs/fr/docs/tutorial/query-params-str-validations.md +++ b/docs/fr/docs/tutorial/query-params-str-validations.md @@ -35,13 +35,13 @@ FastAPI a ajouté la prise en charge de `Annotated` (et a commencé à le recomm Si vous avez une version plus ancienne, vous obtiendrez des erreurs en essayant d’utiliser `Annotated`. -Assurez-vous de [mettre à niveau la version de FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} vers au moins 0.95.1 avant d’utiliser `Annotated`. +Assurez-vous de [mettre à niveau la version de FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions) vers au moins 0.95.1 avant d’utiliser `Annotated`. /// ## Utiliser `Annotated` dans le type pour le paramètre `q` { #use-annotated-in-the-type-for-the-q-parameter } -Vous vous souvenez que je vous ai dit plus tôt que `Annotated` peut être utilisé pour ajouter des métadonnées à vos paramètres dans l’[Introduction aux types Python](../python-types.md#type-hints-with-metadata-annotations){.internal-link target=_blank} ? +Vous vous souvenez que je vous ai dit plus tôt que `Annotated` peut être utilisé pour ajouter des métadonnées à vos paramètres dans l’[Introduction aux types Python](../python-types.md#type-hints-with-metadata-annotations) ? C’est le moment de l’utiliser avec FastAPI. 🚀 @@ -157,7 +157,7 @@ Vous pouvez **appeler** cette même fonction dans **d’autres endroits** sans F Quand vous n’utilisez pas `Annotated` et utilisez à la place l’**ancienne** méthode avec la **valeur par défaut**, si vous appelez cette fonction sans FastAPI dans **d’autres endroits**, vous devez **penser** à passer les arguments à la fonction pour qu’elle fonctionne correctement, sinon les valeurs seront différentes de ce que vous attendez (par ex. `QueryInfo` ou quelque chose de similaire au lieu d’une `str`). Et votre éditeur ne se plaindra pas, et Python ne se plaindra pas en exécutant cette fonction, seulement quand les opérations internes échoueront. -Comme `Annotated` peut avoir plus d’une annotation de métadonnées, vous pouvez maintenant même utiliser la même fonction avec d’autres outils, comme Typer. 🚀 +Comme `Annotated` peut avoir plus d’une annotation de métadonnées, vous pouvez maintenant même utiliser la même fonction avec d’autres outils, comme [Typer](https://typer.tiangolo.com/). 🚀 ## Ajouter plus de validations { #add-more-validations } @@ -369,11 +369,11 @@ Il peut y avoir des cas où vous devez faire une **validation personnalisée** q Dans ces cas, vous pouvez utiliser une **fonction de validation personnalisée** qui est appliquée après la validation normale (par ex. après avoir validé que la valeur est une `str`). -Vous pouvez y parvenir en utilisant `AfterValidator` de Pydantic à l’intérieur de `Annotated`. +Vous pouvez y parvenir en utilisant [`AfterValidator` de Pydantic](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) à l’intérieur de `Annotated`. /// tip | Astuce -Pydantic a aussi `BeforeValidator` et d’autres. 🤓 +Pydantic a aussi [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator) et d’autres. 🤓 /// diff --git a/docs/fr/docs/tutorial/query-params.md b/docs/fr/docs/tutorial/query-params.md index 01540ad17c..8ecbc28536 100644 --- a/docs/fr/docs/tutorial/query-params.md +++ b/docs/fr/docs/tutorial/query-params.md @@ -111,7 +111,7 @@ ou n'importe quelle autre variation de casse (tout en majuscules, uniquement la ## 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. +Vous pouvez déclarer plusieurs paramètres de chemin et paramètres de requête en même temps, **FastAPI** sait lequel est lequel. Et vous n'avez pas besoin de les déclarer dans un ordre spécifique. @@ -182,6 +182,6 @@ Dans ce cas, il y a 3 paramètres de requête : /// tip | Astuce -Vous pourriez aussi utiliser des `Enum`s de la même façon qu'avec les [Paramètres de chemin](path-params.md#predefined-values){.internal-link target=_blank}. +Vous pourriez aussi utiliser des `Enum`s de la même façon qu'avec les [Paramètres de chemin](path-params.md#predefined-values). /// diff --git a/docs/fr/docs/tutorial/request-files.md b/docs/fr/docs/tutorial/request-files.md index 01a0b72eb9..e55f8e57fe 100644 --- a/docs/fr/docs/tutorial/request-files.md +++ b/docs/fr/docs/tutorial/request-files.md @@ -4,9 +4,9 @@ Vous pouvez définir des fichiers à téléverser par le client en utilisant `Fi /// info -Pour recevoir des fichiers téléversés, installez d'abord `python-multipart`. +Pour recevoir des fichiers téléversés, installez d'abord [`python-multipart`](https://github.com/Kludex/python-multipart). -Assurez-vous de créer un [environnement virtuel](../virtual-environments.md){.internal-link target=_blank}, de l'activer, puis d'installer le paquet, par exemple : +Assurez-vous de créer un [environnement virtuel](../virtual-environments.md), de l'activer, puis d'installer le paquet, par exemple : ```console $ pip install python-multipart @@ -63,8 +63,8 @@ Utiliser `UploadFile` présente plusieurs avantages par rapport à `bytes` : - Un fichier stocké en mémoire jusqu'à une taille maximale, puis, au-delà de cette limite, stocké sur le disque. - Cela fonctionne donc bien pour des fichiers volumineux comme des images, des vidéos, de gros binaires, etc., sans consommer toute la mémoire. - Vous pouvez obtenir des métadonnées à partir du fichier téléversé. -- Il offre une interface `async` de type file-like. -- Il expose un véritable objet Python `SpooledTemporaryFile` que vous pouvez passer directement à d'autres bibliothèques qui attendent un objet « file-like ». +- Il offre une interface `async` de type [file-like](https://docs.python.org/3/glossary.html#term-file-like-object). +- Il expose un véritable objet Python [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) que vous pouvez passer directement à d'autres bibliothèques qui attendent un objet « file-like ». ### `UploadFile` { #uploadfile } @@ -72,7 +72,7 @@ Utiliser `UploadFile` présente plusieurs avantages par rapport à `bytes` : - `filename` : une `str` contenant le nom de fichier original téléversé (par ex. `myimage.jpg`). - `content_type` : une `str` avec le type de contenu (type MIME / type média) (par ex. `image/jpeg`). -- `file` : un `SpooledTemporaryFile` (un objet de type fichier). C'est l'objet fichier Python réel que vous pouvez passer directement à d'autres fonctions ou bibliothèques qui attendent un objet « file-like ». +- `file` : un [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) (un objet [file-like](https://docs.python.org/3/glossary.html#term-file-like-object)). C'est l'objet fichier Python réel que vous pouvez passer directement à d'autres fonctions ou bibliothèques qui attendent un objet « file-like ». `UploadFile` a les méthodes `async` suivantes. Elles appellent toutes les méthodes correspondantes du fichier sous-jacent (en utilisant le `SpooledTemporaryFile` interne). @@ -121,7 +121,7 @@ Les données des formulaires sont normalement encodées avec le « type de médi Mais lorsque le formulaire inclut des fichiers, il est encodé en `multipart/form-data`. Si vous utilisez `File`, **FastAPI** saura qu'il doit récupérer les fichiers depuis la partie appropriée du corps. -Si vous souhaitez en savoir plus sur ces encodages et les champs de formulaire, consultez la MDN Web Docs pour POST. +Si vous souhaitez 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). /// diff --git a/docs/fr/docs/tutorial/request-form-models.md b/docs/fr/docs/tutorial/request-form-models.md index 3fbac9c74a..0f1e6dcfd1 100644 --- a/docs/fr/docs/tutorial/request-form-models.md +++ b/docs/fr/docs/tutorial/request-form-models.md @@ -4,9 +4,9 @@ Vous pouvez utiliser des **modèles Pydantic** pour déclarer des **champs de fo /// info -Pour utiliser les formulaires, installez d'abord `python-multipart`. +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){.internal-link target=_blank}, de l'activer, puis d'installer le paquet, par exemple : +Assurez-vous de créer un [environnement virtuel](../virtual-environments.md), de l'activer, puis d'installer le paquet, par exemple : ```console $ pip install 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 6774eec8e4..2e3f5b58bc 100644 --- a/docs/fr/docs/tutorial/request-forms-and-files.md +++ b/docs/fr/docs/tutorial/request-forms-and-files.md @@ -4,9 +4,9 @@ Vous pouvez définir des fichiers et des champs de formulaire en même temps à /// info -Pour recevoir des fichiers téléversés et/ou des données de formulaire, installez d'abord `python-multipart`. +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). -Vous devez créer un [environnement virtuel](../virtual-environments.md){.internal-link target=_blank}, l'activer, puis installer ce paquet, par exemple : +Vous devez créer un [environnement virtuel](../virtual-environments.md), l'activer, puis installer ce paquet, par exemple : ```console $ pip install python-multipart diff --git a/docs/fr/docs/tutorial/request-forms.md b/docs/fr/docs/tutorial/request-forms.md index cea47c93e6..9596f68ce2 100644 --- a/docs/fr/docs/tutorial/request-forms.md +++ b/docs/fr/docs/tutorial/request-forms.md @@ -4,9 +4,9 @@ Lorsque vous devez recevoir des champs de formulaire au lieu de JSON, vous pouve /// info -Pour utiliser les formulaires, installez d'abord `python-multipart`. +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){.internal-link target=_blank}, de l'activer, puis d'installer ce paquet, par exemple : +Assurez-vous de créer un [environnement virtuel](../virtual-environments.md), de l'activer, puis installez-le, par exemple : ```console $ pip install python-multipart @@ -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. +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). /// diff --git a/docs/fr/docs/tutorial/response-model.md b/docs/fr/docs/tutorial/response-model.md index 337b1aa485..e3926a0c12 100644 --- a/docs/fr/docs/tutorial/response-model.md +++ b/docs/fr/docs/tutorial/response-model.md @@ -13,6 +13,7 @@ FastAPI utilisera ce type de retour pour : * Ajouter un **JSON Schema** pour la réponse, dans l’OpenAPI du *chemin d'accès*. * Ceci sera utilisé par la **documentation automatique**. * Ceci sera également utilisé par les outils de génération automatique de code client. +* **Sérialiser** les données renvoyées en JSON en utilisant Pydantic, qui est écrit en **Rust**, ce qui sera **beaucoup plus rapide**. Mais surtout : @@ -73,9 +74,9 @@ Ici, nous déclarons un modèle `UserIn`, il contiendra un mot de passe en clair /// info | Info -Pour utiliser `EmailStr`, installez d'abord `email-validator`. +Pour utiliser `EmailStr`, installez d'abord [`email-validator`](https://github.com/JoshData/python-email-validator). -Assurez-vous de créer un [environnement virtuel](../virtual-environments.md){.internal-link target=_blank}, de l'activer, puis de l'installer, par exemple : +Assurez-vous de créer un [environnement virtuel](../virtual-environments.md), de l'activer, puis de l'installer, par exemple : ```console $ pip install email-validator @@ -181,7 +182,7 @@ Il peut y avoir des cas où vous renvoyez quelque chose qui n'est pas un champ P ### Renvoyer directement une Response { #return-a-response-directly } -Le cas le plus courant serait [de renvoyer directement une Response comme expliqué plus loin dans la documentation avancée](../advanced/response-directly.md){.internal-link target=_blank}. +Le cas le plus courant serait [de renvoyer directement une Response comme expliqué plus loin dans la documentation avancée](../advanced/response-directly.md). {* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *} @@ -257,7 +258,7 @@ Vous pouvez également utiliser : * `response_model_exclude_defaults=True` * `response_model_exclude_none=True` -comme décrit dans la documentation Pydantic pour `exclude_defaults` et `exclude_none`. +comme décrit dans [la documentation Pydantic](https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict) pour `exclude_defaults` et `exclude_none`. /// diff --git a/docs/fr/docs/tutorial/response-status-code.md b/docs/fr/docs/tutorial/response-status-code.md index 388a53b3df..c8e45cd40e 100644 --- a/docs/fr/docs/tutorial/response-status-code.md +++ b/docs/fr/docs/tutorial/response-status-code.md @@ -20,7 +20,7 @@ Le paramètre `status_code` reçoit un nombre correspondant au code d'état HTTP /// info -`status_code` peut aussi recevoir un `IntEnum`, comme le `http.HTTPStatus` de Python. +`status_code` peut aussi recevoir un `IntEnum`, comme le [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus) de Python. /// @@ -66,7 +66,7 @@ En bref : /// tip | Astuce -Pour en savoir plus sur chaque code d'état et à quoi il correspond, consultez la MDN documentation about HTTP status codes. +Pour en savoir plus sur chaque code d'état et à quoi il correspond, consultez la [MDN documentation sur les codes d'état HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status). /// @@ -92,10 +92,10 @@ Elles ne sont qu'une commodité, elles contiennent le même nombre, mais de cett Vous pourriez aussi utiliser `from starlette import status`. -FastAPI fournit le même `starlette.status` que `fastapi.status`, uniquement pour votre commodité de développeur. Mais cela vient directement de Starlette. +**FastAPI** fournit le même `starlette.status` que `fastapi.status`, uniquement pour votre commodité de développeur. Mais cela vient directement de Starlette. /// ## Modifier la valeur par défaut { #changing-the-default } -Plus tard, dans le [Guide utilisateur avancé](../advanced/response-change-status-code.md){.internal-link target=_blank}, vous verrez comment renvoyer un code d'état différent de celui par défaut que vous déclarez ici. +Plus tard, dans le [Guide utilisateur avancé](../advanced/response-change-status-code.md), vous verrez comment renvoyer un code d'état différent de celui par défaut que vous déclarez ici. diff --git a/docs/fr/docs/tutorial/schema-extra-example.md b/docs/fr/docs/tutorial/schema-extra-example.md index d4403c779b..404edff46d 100644 --- a/docs/fr/docs/tutorial/schema-extra-example.md +++ b/docs/fr/docs/tutorial/schema-extra-example.md @@ -12,7 +12,7 @@ Vous pouvez déclarer `examples` pour un modèle Pydantic qui seront ajoutés au 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. -Vous pouvez utiliser l'attribut `model_config` qui accepte un `dict` comme décrit dans Documentation de Pydantic : Configuration. +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 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`. @@ -145,12 +145,12 @@ JSON Schema n'avait pas `examples`, donc OpenAPI a ajouté son propre champ `exa OpenAPI a également ajouté les champs `example` et `examples` à d'autres parties de la spécification : -* `Parameter Object` (dans la spécification) qui était utilisé par les éléments FastAPI : +* [`Parameter Object` (dans la spécification)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object) qui était utilisé par les éléments FastAPI : * `Path()` * `Query()` * `Header()` * `Cookie()` -* `Request Body Object`, dans le champ `content`, sur le `Media Type Object` (dans la spécification) qui était utilisé par les éléments FastAPI : +* [`Request Body Object`, dans le champ `content`, sur le `Media Type Object` (dans la spécification)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object) qui était utilisé par les éléments FastAPI : * `Body()` * `File()` * `Form()` @@ -163,7 +163,7 @@ Ce paramètre `examples` ancien et spécifique à OpenAPI est désormais `openap ### Le champ `examples` de JSON Schema { #json-schemas-examples-field } -Ensuite, JSON Schema a ajouté un champ `examples` dans une nouvelle version de la spécification. +Ensuite, JSON Schema a ajouté un champ [`examples`](https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5) dans une nouvelle version de la spécification. Puis le nouveau OpenAPI 3.1.0 s'est basé sur la dernière version (JSON Schema 2020-12) qui incluait ce nouveau champ `examples`. diff --git a/docs/fr/docs/tutorial/security/first-steps.md b/docs/fr/docs/tutorial/security/first-steps.md index 8c4eb50d76..c1d36d501c 100644 --- a/docs/fr/docs/tutorial/security/first-steps.md +++ b/docs/fr/docs/tutorial/security/first-steps.md @@ -26,11 +26,11 @@ Copiez l'exemple dans un fichier `main.py` : /// info -Le package `python-multipart` est installé automatiquement avec **FastAPI** lorsque vous exécutez la commande `pip install "fastapi[standard]"`. +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]"`. Cependant, si vous utilisez la commande `pip install fastapi`, le package `python-multipart` n'est pas inclus par défaut. -Pour l'installer manuellement, vous devez vous assurer de créer un [environnement virtuel](../../virtual-environments.md){.internal-link target=_blank}, de l'activer, puis de l'installer avec : +Pour l'installer manuellement, vous devez vous assurer de créer un [environnement virtuel](../../virtual-environments.md), de l'activer, puis de l'installer avec : ```console $ pip install python-multipart @@ -45,7 +45,7 @@ Exécutez l'exemple avec :
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -54,7 +54,7 @@ $ fastapi dev main.py ## Vérifier { #check-it } -Allez à la documentation interactive à l'adresse : http://127.0.0.1:8000/docs. +Allez à la documentation interactive à l'adresse : [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Vous verrez quelque chose comme ceci : @@ -140,7 +140,7 @@ Ici `tokenUrl="token"` fait référence à une URL relative `token` que nous n'a Parce que nous utilisons une URL relative, si votre API se trouvait à `https://example.com/`, alors elle ferait référence à `https://example.com/token`. Mais si votre API se trouvait à `https://example.com/api/v1/`, alors elle ferait référence à `https://example.com/api/v1/token`. -Utiliser une URL relative est important pour vous assurer que votre application continue de fonctionner même dans un cas d'usage avancé comme [Derrière un proxy](../../advanced/behind-a-proxy.md){.internal-link target=_blank}. +Utiliser une URL relative est important pour vous assurer que votre application continue de fonctionner même dans un cas d'usage avancé comme [Derrière un proxy](../../advanced/behind-a-proxy.md). /// diff --git a/docs/fr/docs/tutorial/security/oauth2-jwt.md b/docs/fr/docs/tutorial/security/oauth2-jwt.md index d35530fc9c..eec5ab13c0 100644 --- a/docs/fr/docs/tutorial/security/oauth2-jwt.md +++ b/docs/fr/docs/tutorial/security/oauth2-jwt.md @@ -24,13 +24,13 @@ De cette façon, vous pouvez créer un jeton avec une expiration d'une semaine, Après une semaine, le jeton aura expiré et l'utilisateur ne sera pas autorisé et devra se reconnecter pour obtenir un nouveau jeton. Et si l'utilisateur (ou un tiers) essayait de modifier le jeton pour changer l'expiration, vous pourriez le détecter, car les signatures ne correspondraient pas. -Si vous voulez expérimenter avec des jetons JWT et voir comment ils fonctionnent, consultez https://jwt.io. +Si vous voulez expérimenter avec des jetons JWT et voir comment ils fonctionnent, consultez [https://jwt.io](https://jwt.io/). ## Installer `PyJWT` { #install-pyjwt } Nous devons installer `PyJWT` pour générer et vérifier les jetons JWT en Python. -Assurez-vous de créer un [environnement virtuel](../../virtual-environments.md){.internal-link target=_blank}, de l'activer, puis d'installer `pyjwt` : +Assurez-vous de créer un [environnement virtuel](../../virtual-environments.md), de l'activer, puis d'installer `pyjwt` :
@@ -46,7 +46,7 @@ $ pip install pyjwt Si vous prévoyez d'utiliser des algorithmes de signature numérique comme RSA ou ECDSA, vous devez installer la dépendance de bibliothèque de cryptographie `pyjwt[crypto]`. -Vous pouvez en lire davantage dans la documentation d'installation de PyJWT. +Vous pouvez en lire davantage dans la [documentation d'installation de PyJWT](https://pyjwt.readthedocs.io/en/latest/installation.html). /// @@ -58,7 +58,7 @@ Chaque fois que vous fournissez exactement le même contenu (exactement le même Mais vous ne pouvez pas convertir le charabia en sens inverse vers le mot de passe. -### Pourquoi utiliser le hachage de mot de passe { #why-use-password-hashing } +### Pourquoi utiliser le hachage de mot passe { #why-use-password-hashing } Si votre base de données est volée, le voleur n'aura pas les mots de passe en clair de vos utilisateurs, seulement les hachages. @@ -72,7 +72,7 @@ Il prend en charge de nombreux algorithmes de hachage sécurisés et des utilita L'algorithme recommandé est « Argon2 ». -Assurez-vous de créer un [environnement virtuel](../../virtual-environments.md){.internal-link target=_blank}, de l'activer, puis d'installer pwdlib avec Argon2 : +Assurez-vous de créer un [environnement virtuel](../../virtual-environments.md), de l'activer, puis d'installer pwdlib avec Argon2 :
@@ -200,7 +200,7 @@ L'important à garder à l'esprit est que la clé `sub` doit contenir un identif ## Vérifier { #check-it } -Lancez le serveur et allez à la documentation : http://127.0.0.1:8000/docs. +Lancez le serveur et allez à la documentation : [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Vous verrez l'interface utilisateur suivante : diff --git a/docs/fr/docs/tutorial/security/simple-oauth2.md b/docs/fr/docs/tutorial/security/simple-oauth2.md index 662444753b..f47d94aa20 100644 --- a/docs/fr/docs/tutorial/security/simple-oauth2.md +++ b/docs/fr/docs/tutorial/security/simple-oauth2.md @@ -4,7 +4,7 @@ Construisons maintenant à partir du chapitre précédent et ajoutons les élém ## Obtenir `username` et `password` { #get-the-username-and-password } -Nous allons utiliser les utilitaires de sécurité de **FastAPI** pour obtenir `username` et `password`. +Nous allons utiliser les utilités de sécurité de **FastAPI** pour obtenir `username` et `password`. OAuth2 spécifie que lorsqu'on utilise le « password flow » (ce que nous utilisons), le client/utilisateur doit envoyer des champs `username` et `password` en tant que données de formulaire. @@ -46,7 +46,7 @@ Pour OAuth2, ce ne sont que des chaînes. ## Écrire le code pour obtenir `username` et `password` { #code-to-get-the-username-and-password } -Utilisons maintenant les utilitaires fournis par **FastAPI** pour gérer cela. +Utilisons maintenant les utilités fournies par **FastAPI** pour gérer cela. ### `OAuth2PasswordRequestForm` { #oauth2passwordrequestform } @@ -146,7 +146,7 @@ UserInDB( /// info -Pour une explication plus complète de `**user_dict`, consultez [la documentation pour **Modèles supplémentaires**](../extra-models.md#about-user-in-dict){.internal-link target=_blank}. +Pour une explication plus complète de `**user_dict`, consultez [la documentation pour **Modèles supplémentaires**](../extra-models.md#about-user-in-dict). /// @@ -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. +Ouvrez la documentation interactive : [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 new file mode 100644 index 0000000000..f4ed506f6b --- /dev/null +++ b/docs/fr/docs/tutorial/server-sent-events.md @@ -0,0 +1,120 @@ +# Événements envoyés par le serveur (SSE) { #server-sent-events-sse } + +Vous pouvez diffuser des données vers le client en utilisant les **Server-Sent Events** (SSE). + +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 + +Ajouté dans FastAPI 0.135.0. + +/// + +## Que sont les Server-Sent Events ? { #what-are-server-sent-events } + +SSE est un standard pour diffuser des données du serveur au client via HTTP. + +Chaque événement est un petit bloc de texte avec des « champs » comme `data`, `event`, `id` et `retry`, séparés par des lignes vides. + +Cela ressemble à ceci : + +``` +data: {"name": "Portal Gun", "price": 999.99} + +data: {"name": "Plumbus", "price": 32.99} + +``` + +Les SSE sont couramment utilisés pour le streaming de chat IA, les notifications en direct, les journaux et l’observabilité, et d’autres cas où le serveur envoie des mises à jour au client. + +/// tip | Astuce + +Si vous souhaitez diffuser des données binaires, par exemple de la vidéo ou de l’audio, consultez le guide avancé : [Diffuser des données](../advanced/stream-data.md). + +/// + +## Diffuser des SSE avec FastAPI { #stream-sse-with-fastapi } + +Pour diffuser des SSE avec FastAPI, utilisez `yield` dans votre *fonction de chemin d'accès* et définissez `response_class=EventSourceResponse`. + +Importez `EventSourceResponse` depuis `fastapi.sse` : + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[4,22] *} + +Chaque élément produit avec `yield` est encodé en JSON et envoyé dans le champ `data:` d’un événement SSE. + +Si vous déclarez le type de retour comme `AsyncIterable[Item]`, FastAPI l’utilisera pour **valider**, **documenter** et **sérialiser** les données avec Pydantic. + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[10:12,23] *} + +/// tip | Astuce + +Comme Pydantic le sérialisera du côté **Rust**, vous obtiendrez une **performance** bien supérieure que si vous ne déclarez pas de type de retour. + +/// + +### Fonctions de chemin d'accès non async { #non-async-path-operation-functions } + +Vous pouvez aussi utiliser des fonctions `def` normales (sans `async`), et utiliser `yield` de la même façon. + +FastAPI s’assure qu’elles s’exécutent correctement pour ne pas bloquer la boucle d’événements. + +Dans ce cas la fonction n’est pas async, le type de retour approprié serait `Iterable[Item]` : + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[28:31] hl[29] *} + +### Sans type de retour { #no-return-type } + +Vous pouvez aussi omettre le type de retour. FastAPI utilisera le [`jsonable_encoder`](./encoder.md) pour convertir les données et les envoyer. + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[34:37] hl[35] *} + +## `ServerSentEvent` { #serversentevent } + +Si vous devez définir des champs SSE comme `event`, `id`, `retry` ou `comment`, vous pouvez produire des objets `ServerSentEvent` au lieu de données brutes. + +Importez `ServerSentEvent` depuis `fastapi.sse` : + +{* ../../docs_src/server_sent_events/tutorial002_py310.py hl[4,26] *} + +Le champ `data` est toujours encodé en JSON. Vous pouvez passer toute valeur sérialisable en JSON, y compris des modèles Pydantic. + +## Données brutes { #raw-data } + +Si vous devez envoyer des données **sans** encodage JSON, utilisez `raw_data` au lieu de `data`. + +C’est utile pour envoyer du texte préformaté, des lignes de log, ou des valeurs « sentinelle » spéciales comme `[DONE]`. + +{* ../../docs_src/server_sent_events/tutorial003_py310.py hl[17] *} + +/// note | Remarque + +`data` et `raw_data` s’excluent mutuellement. Vous ne pouvez en définir qu’un seul par `ServerSentEvent`. + +/// + +## Reprendre avec `Last-Event-ID` { #resuming-with-last-event-id } + +Quand un navigateur se reconnecte après une coupure, il envoie le dernier `id` reçu dans l’en-tête `Last-Event-ID`. + +Vous pouvez le lire comme paramètre d’en-tête et l’utiliser pour reprendre le flux là où le client s’était arrêté : + +{* ../../docs_src/server_sent_events/tutorial004_py310.py hl[25,27,31] *} + +## SSE avec POST { #sse-with-post } + +SSE fonctionne avec **n’importe quelle méthode HTTP**, pas seulement `GET`. + +C’est utile pour des protocoles comme [MCP](https://modelcontextprotocol.io) qui diffusent des SSE via `POST` : + +{* ../../docs_src/server_sent_events/tutorial005_py310.py hl[14] *} + +## Détails techniques { #technical-details } + +FastAPI met en œuvre certaines bonnes pratiques SSE prêtes à l’emploi. + +- Envoyer un commentaire **« keep alive » `ping`** toutes les 15 secondes quand aucun message n’a été émis, pour éviter que certains proxys ne ferment la connexion, comme suggéré dans la [Spécification HTML : Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes). +- Définir l’en-tête `Cache-Control: no-cache` pour **empêcher la mise en cache** du flux. +- Définir un en-tête spécial `X-Accel-Buffering: no` pour **empêcher le buffering** dans certains proxys comme Nginx. + +Vous n’avez rien à faire, cela fonctionne prêt à l’emploi. 🤓 diff --git a/docs/fr/docs/tutorial/sql-databases.md b/docs/fr/docs/tutorial/sql-databases.md index 75f9ae14fc..70e5b1dbab 100644 --- a/docs/fr/docs/tutorial/sql-databases.md +++ b/docs/fr/docs/tutorial/sql-databases.md @@ -2,9 +2,9 @@ **FastAPI** ne vous oblige pas à utiliser une base de données SQL (relationnelle). Mais vous pouvez utiliser **n'importe quelle base de données** que vous voulez. -Ici, nous allons voir un exemple utilisant SQLModel. +Ici, nous allons voir un exemple utilisant [SQLModel](https://sqlmodel.tiangolo.com/). -**SQLModel** est construit au-dessus de SQLAlchemy et de Pydantic. Il a été créé par le même auteur que **FastAPI** pour être l'accord parfait pour les applications FastAPI qui ont besoin d'utiliser des **bases de données SQL**. +**SQLModel** est construit au-dessus de [SQLAlchemy](https://www.sqlalchemy.org/) et de Pydantic. Il a été créé par le même auteur que **FastAPI** pour être l'accord parfait pour les applications FastAPI qui ont besoin d'utiliser des **bases de données SQL**. /// tip | Astuce @@ -26,15 +26,15 @@ Plus tard, pour votre application de production, vous voudrez peut-être utilise /// tip | Astuce -Il existe un générateur de projet officiel avec **FastAPI** et **PostgreSQL**, incluant un frontend et plus d'outils : https://github.com/fastapi/full-stack-fastapi-template +Il existe un générateur de projet officiel avec **FastAPI** et **PostgreSQL**, incluant un frontend et plus d'outils : [https://github.com/fastapi/full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template) /// -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. +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/). ## Installer `SQLModel` { #install-sqlmodel } -D'abord, assurez-vous de créer votre [environnement virtuel](../virtual-environments.md){.internal-link target=_blank}, de l'activer, puis d'installer `sqlmodel` : +D'abord, assurez-vous de créer votre [environnement virtuel](../virtual-environments.md), de l'activer, puis d'installer `sqlmodel` :
@@ -65,7 +65,7 @@ Il y a quelques différences : * `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). - 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 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 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. * `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. @@ -111,7 +111,7 @@ En production, vous utiliseriez probablement un script de migration qui s'exécu /// tip | Astuce -SQLModel aura des utilitaires de migration enveloppant Alembic, mais pour l'instant, vous pouvez utiliser Alembic directement. +SQLModel aura des utilitaires de migration enveloppant Alembic, mais pour l'instant, vous pouvez utiliser [Alembic](https://alembic.sqlalchemy.org/en/latest/) directement. /// @@ -152,7 +152,7 @@ Vous pouvez exécuter l'application :
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -337,7 +337,7 @@ Vous pouvez exécuter l'application à nouveau :
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -352,6 +352,6 @@ Si vous allez sur l'UI `/docs` de l'API, vous verrez qu'elle est maintenant à j ## Récapitulatif { #recap } -Vous pouvez utiliser **SQLModel** 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 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**. 🚀 +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/). 🚀 diff --git a/docs/fr/docs/tutorial/static-files.md b/docs/fr/docs/tutorial/static-files.md index 3928fed9bc..6a54840afb 100644 --- a/docs/fr/docs/tutorial/static-files.md +++ b/docs/fr/docs/tutorial/static-files.md @@ -23,7 +23,7 @@ Vous pouvez également utiliser `from starlette.staticfiles import StaticFiles`. Cela diffère de l'utilisation d'un `APIRouter`, car une application montée est complètement indépendante. L'OpenAPI et les documents de votre application principale n'incluront rien provenant de l'application montée, etc. -Vous pouvez en lire davantage à ce sujet dans le [Guide utilisateur avancé](../advanced/index.md){.internal-link target=_blank}. +Vous pouvez en lire davantage à ce sujet dans le [Guide utilisateur avancé](../advanced/index.md). ## Détails { #details } @@ -37,4 +37,4 @@ Tous ces paramètres peuvent être différents de « `static` », adaptez-les au ## Plus d'informations { #more-info } -Pour plus de détails et d'options, consultez la documentation de Starlette sur les fichiers statiques. +Pour plus de détails et d'options, consultez la [documentation de Starlette sur les fichiers statiques](https://www.starlette.dev/staticfiles/). diff --git a/docs/fr/docs/tutorial/stream-json-lines.md b/docs/fr/docs/tutorial/stream-json-lines.md new file mode 100644 index 0000000000..aed0205cb8 --- /dev/null +++ b/docs/fr/docs/tutorial/stream-json-lines.md @@ -0,0 +1,111 @@ +# 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 ». + +/// info + +Ajouté dans FastAPI 0.134.0. + +/// + +## Qu'est-ce qu'un flux ? { #what-is-a-stream } + +La « diffusion en continu » de données signifie que votre application commence à envoyer des éléments de données au client sans attendre que l'ensemble de la séquence soit prêt. + +Ainsi, elle enverra le premier élément, le client le recevra et commencera à le traiter, et vous pourriez être encore en train de produire l'élément suivant. + +```mermaid +sequenceDiagram + participant App + participant Client + + App->>App: Produce Item 1 + App->>Client: Send Item 1 + App->>App: Produce Item 2 + Client->>Client: Process Item 1 + App->>Client: Send Item 2 + App->>App: Produce Item 3 + Client->>Client: Process Item 2 + App->>Client: Send Item 3 + Client->>Client: Process Item 3 + Note over App: Keeps producing... + Note over Client: Keeps consuming... +``` + +Cela peut même être un flux infini, où vous continuez à envoyer des données. + +## JSON Lines { #json-lines } + +Dans ces cas, il est courant d'envoyer des « JSON Lines », qui est un format où vous envoyez un objet JSON par ligne. + +Une réponse aurait un type de contenu `application/jsonl` (au lieu de `application/json`) et le corps ressemblerait à ceci : + +```json +{"name": "Plumbus", "description": "A multi-purpose household device."} +{"name": "Portal Gun", "description": "A portal opening device."} +{"name": "Meeseeks Box", "description": "A box that summons a Meeseeks."} +``` + +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 + +Le point important est que votre application pourra produire chaque ligne à son tour, tandis que le client consomme les lignes précédentes. + +/// + +/// note | Détails techniques + +Comme chaque objet JSON sera séparé par un saut de ligne, ils ne peuvent pas contenir de caractères de saut de ligne littéraux dans leur contenu, mais ils peuvent contenir des sauts de ligne échappés (`\n`), ce qui fait partie du standard JSON. + +Mais normalement, vous n'avez pas à vous en soucier, c'est fait automatiquement, continuez la lecture. 🤓 + +/// + +## Cas d'utilisation { #use-cases } + +Vous pouvez utiliser cela pour diffuser des données depuis un service **AI LLM**, depuis des **journaux** ou de la **télémétrie**, ou depuis d'autres types de données pouvant être structurées en éléments **JSON**. + +/// tip | Astuce + +Si vous voulez diffuser des données binaires, par exemple de la vidéo ou de l'audio, consultez le guide avancé : [Diffuser des données](../advanced/stream-data.md). + +/// + +## Diffuser des JSON Lines avec FastAPI { #stream-json-lines-with-fastapi } + +Pour diffuser des JSON Lines avec FastAPI, au lieu d'utiliser `return` dans votre fonction de chemin d'accès, utilisez `yield` pour produire chaque élément à tour de rôle. + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[24] *} + +Si chaque élément JSON que vous voulez renvoyer est de type `Item` (un modèle Pydantic) et que c'est une fonction async, vous pouvez déclarer le type de retour comme `AsyncIterable[Item]` : + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[9:11,22] *} + +Si vous déclarez le type de retour, FastAPI l'utilisera pour **valider** les données, les **documenter** dans OpenAPI, les **filtrer**, et les **sérialiser** avec Pydantic. + +/// tip | Astuce + +Comme Pydantic les sérialisera côté **Rust**, vous obtiendrez une **performance** bien supérieure que si vous ne déclarez pas de type de retour. + +/// + +### Fonctions de chemin d'accès non asynchrones { #non-async-path-operation-functions } + +Vous pouvez aussi utiliser des fonctions `def` classiques (sans `async`), et utiliser `yield` de la même manière. + +FastAPI s'assure qu'elle s'exécute correctement afin de ne pas bloquer la boucle d'événements. + +Comme dans ce cas la fonction n'est pas async, le bon type de retour serait `Iterable[Item]` : + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[27:30] hl[28] *} + +### Sans type de retour { #no-return-type } + +Vous pouvez également omettre le type de retour. FastAPI utilisera alors [`jsonable_encoder`](./encoder.md) pour convertir les données en quelque chose qui peut être sérialisé en JSON, puis les enverra en JSON Lines. + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[33:36] hl[34] *} + +## Événements envoyés par le serveur (SSE) { #server-sent-events-sse } + +FastAPI propose également une prise en charge native des Server-Sent Events (SSE), qui sont assez proches mais avec quelques détails supplémentaires. Vous pouvez en apprendre davantage dans le chapitre suivant : [Événements envoyés par le serveur (SSE)](server-sent-events.md). 🤓 diff --git a/docs/fr/docs/tutorial/testing.md b/docs/fr/docs/tutorial/testing.md index 8a609b644d..5cb2ee6290 100644 --- a/docs/fr/docs/tutorial/testing.md +++ b/docs/fr/docs/tutorial/testing.md @@ -1,18 +1,18 @@ # Tester { #testing } -Grâce à Starlette, tester des applications **FastAPI** est simple et agréable. +Grâce à [Starlette](https://www.starlette.dev/testclient/), tester des applications **FastAPI** est simple et agréable. -C’est basé sur HTTPX, dont la conception s’inspire de Requests, ce qui le rend très familier et intuitif. +C’est basé sur [HTTPX](https://www.python-httpx.org), dont la conception s’inspire de Requests, ce qui le rend très familier et intuitif. -Avec cela, vous pouvez utiliser pytest directement avec **FastAPI**. +Avec cela, vous pouvez utiliser [pytest](https://docs.pytest.org/) directement avec **FastAPI**. ## Utiliser `TestClient` { #using-testclient } /// info -Pour utiliser `TestClient`, installez d’abord `httpx`. +Pour utiliser `TestClient`, installez d’abord [`httpx`](https://www.python-httpx.org). -Vous devez créer un [environnement virtuel](../virtual-environments.md){.internal-link target=_blank}, l’activer, puis y installer le paquet, par exemple : +Vous devez créer un [environnement virtuel](../virtual-environments.md), l’activer, puis y installer le paquet, par exemple : ```console $ pip install httpx @@ -52,7 +52,7 @@ Vous pouvez aussi utiliser `from starlette.testclient import TestClient`. /// tip | Astuce -Si vous souhaitez appeler des fonctions `async` dans vos tests en dehors de l’envoi de requêtes à votre application FastAPI (par exemple des fonctions de base de données asynchrones), consultez les [Tests asynchrones](../advanced/async-tests.md){.internal-link target=_blank} dans le tutoriel avancé. +Si vous souhaitez appeler des fonctions `async` dans vos tests en dehors de l’envoi de requêtes à votre application FastAPI (par exemple des fonctions de base de données asynchrones), consultez les [Tests asynchrones](../advanced/async-tests.md) dans le tutoriel avancé. /// @@ -64,7 +64,7 @@ Et votre application **FastAPI** pourrait aussi être composée de plusieurs fic ### Fichier d’application **FastAPI** { #fastapi-app-file } -Supposons que vous ayez une structure de fichiers comme décrit dans [Applications plus grandes](bigger-applications.md){.internal-link target=_blank} : +Supposons que vous ayez une structure de fichiers comme décrit dans [Applications plus grandes](bigger-applications.md) : ``` . @@ -142,13 +142,13 @@ Par exemple : * Pour passer des en-têtes, utilisez un `dict` dans le paramètre `headers`. * Pour les cookies, un `dict` dans le paramètre `cookies`. -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. +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 Notez que le `TestClient` reçoit des données qui peuvent être converties en JSON, pas des modèles Pydantic. -Si vous avez un modèle Pydantic dans votre test et que vous souhaitez envoyer ses données à l’application pendant les tests, vous pouvez utiliser le `jsonable_encoder` décrit dans [Encodeur compatible JSON](encoder.md){.internal-link target=_blank}. +Si vous avez un modèle Pydantic dans votre test et que vous souhaitez envoyer ses données à l’application pendant les tests, vous pouvez utiliser le `jsonable_encoder` décrit dans [Encodeur compatible JSON](encoder.md). /// @@ -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){.internal-link target=_blank}, l’activer, puis y installer le paquet, par exemple : +Vous devez créer un [environnement virtuel](../virtual-environments.md), l’activer, puis y installer le paquet, par exemple :
diff --git a/docs/fr/docs/virtual-environments.md b/docs/fr/docs/virtual-environments.md index 86b5faadce..4793e5dac2 100644 --- a/docs/fr/docs/virtual-environments.md +++ b/docs/fr/docs/virtual-environments.md @@ -22,7 +22,7 @@ Un environnement virtuel est un répertoire contenant certains fichiers. Cette page vous apprendra à utiliser les environnements virtuels et à comprendre leur fonctionnement. -Si vous êtes prêt à adopter un outil qui gère tout pour vous (y compris l’installation de Python), essayez uv. +Si vous êtes prêt à adopter un outil qui gère tout pour vous (y compris l’installation de Python), essayez [uv](https://github.com/astral-sh/uv). /// @@ -86,7 +86,7 @@ $ python -m venv .venv //// tab | `uv` -Si vous avez installé `uv`, vous pouvez l’utiliser pour créer un environnement virtuel. +Si vous avez installé [`uv`](https://github.com/astral-sh/uv), vous pouvez l’utiliser pour créer un environnement virtuel.
@@ -150,7 +150,7 @@ $ .venv\Scripts\Activate.ps1 //// tab | Windows Bash -Ou si vous utilisez Bash pour Windows (par exemple Git Bash) : +Ou si vous utilisez Bash pour Windows (par exemple [Git Bash](https://gitforwindows.org/)) :
@@ -216,7 +216,7 @@ S’il affiche le binaire `python` à `.venv\Scripts\python`, dans votre projet /// tip | Astuce -Si vous utilisez `uv`, vous l’utiliserez pour installer des éléments à la place de `pip`, vous n’avez donc pas besoin de mettre `pip` à niveau. 😎 +Si vous utilisez [`uv`](https://github.com/astral-sh/uv), vous l’utiliserez pour installer des éléments à la place de `pip`, vous n’avez donc pas besoin de mettre `pip` à niveau. 😎 /// @@ -268,7 +268,7 @@ Si vous utilisez Git (vous devriez), ajoutez un fichier `.gitignore` pour exclur /// tip | Astuce -Si vous avez utilisé `uv` pour créer l’environnement virtuel, il l’a déjà fait pour vous, vous pouvez passer cette étape. 😎 +Si vous avez utilisé [`uv`](https://github.com/astral-sh/uv) pour créer l’environnement virtuel, il l’a déjà fait pour vous, vous pouvez passer cette étape. 😎 /// @@ -340,7 +340,7 @@ $ pip install "fastapi[standard]" //// tab | `uv` -Si vous avez `uv` : +Si vous avez [`uv`](https://github.com/astral-sh/uv) :
@@ -372,7 +372,7 @@ $ pip install -r requirements.txt //// tab | `uv` -Si vous avez `uv` : +Si vous avez [`uv`](https://github.com/astral-sh/uv) :
@@ -416,8 +416,8 @@ Vous utiliserez probablement un éditeur, assurez-vous de le configurer pour uti Par exemple : -* VS Code -* PyCharm +* [VS Code](https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment) +* [PyCharm](https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html) /// tip | Astuce @@ -455,7 +455,7 @@ Continuez la lecture. 👇🤓 ## Pourquoi des environnements virtuels { #why-virtual-environments } -Pour travailler avec FastAPI, vous devez installer Python. +Pour travailler avec FastAPI, vous devez installer [Python](https://www.python.org/). Ensuite, vous devrez installer FastAPI et tout autre package que vous souhaitez utiliser. @@ -564,7 +564,7 @@ $ pip install "fastapi[standard]"
-Cela téléchargera un fichier compressé avec le code de FastAPI, normalement depuis PyPI. +Cela téléchargera un fichier compressé avec le code de FastAPI, normalement depuis [PyPI](https://pypi.org/project/fastapi/). Il téléchargera également des fichiers pour d’autres packages dont FastAPI dépend. @@ -627,7 +627,7 @@ $ .venv\Scripts\Activate.ps1 //// tab | Windows Bash -Ou si vous utilisez Bash pour Windows (par exemple Git Bash) : +Ou si vous utilisez Bash pour Windows (par exemple [Git Bash](https://gitforwindows.org/)) :
@@ -639,13 +639,13 @@ $ source .venv/Scripts/activate //// -Cette commande créera ou modifiera certaines [variables d’environnement](environment-variables.md){.internal-link target=_blank} qui seront disponibles pour les prochaines commandes. +Cette commande créera ou modifiera certaines [variables d’environnement](environment-variables.md) qui seront disponibles pour les prochaines commandes. L’une de ces variables est la variable `PATH`. /// tip | Astuce -Vous pouvez en savoir plus sur la variable d’environnement `PATH` dans la section [Variables d’environnement](environment-variables.md#path-environment-variable){.internal-link target=_blank}. +Vous pouvez en savoir plus sur la variable d’environnement `PATH` dans la section [Variables d’environnement](environment-variables.md#path-environment-variable). /// @@ -846,7 +846,7 @@ Ceci est un guide simple pour vous lancer et vous montrer comment tout fonctionn Il existe de nombreuses alternatives pour gérer les environnements virtuels, les dépendances de packages (requirements), les projets. -Lorsque vous êtes prêt et souhaitez utiliser un outil pour gérer l’ensemble du projet, les dépendances, les environnements virtuels, etc., je vous suggère d’essayer uv. +Lorsque vous êtes prêt et souhaitez utiliser un outil pour gérer l’ensemble du projet, les dépendances, les environnements virtuels, etc., je vous suggère d’essayer [uv](https://github.com/astral-sh/uv). `uv` peut faire beaucoup de choses, il peut : diff --git a/docs/ja/docs/advanced/json-base64-bytes.md b/docs/ja/docs/advanced/json-base64-bytes.md new file mode 100644 index 0000000000..c3c361a96b --- /dev/null +++ b/docs/ja/docs/advanced/json-base64-bytes.md @@ -0,0 +1,63 @@ +# Base64 にしたバイトを含む JSON { #json-with-bytes-as-base64 } + +アプリで JSON データの受信・送信が必要だが、その中にバイナリデータを含める必要がある場合は、base64 にエンコードできます。 + +## Base64 とファイル { #base64-vs-files } + +バイナリデータのアップロードにはまず、JSON にエンコードする代わりに [Request Files](../tutorial/request-files.md) を、バイナリデータの送信には [カスタムレスポンス - FileResponse](./custom-response.md#fileresponse--fileresponse-) を使えるか検討してください。 + +JSON は UTF-8 でエンコードされた文字列のみを含められるため、生のバイト列は含められません。 + +Base64 はバイナリデータを文字列にエンコードできますが、そのために元のバイナリより多くの文字を使用する必要があり、通常は通常のファイルより非効率です。 + +JSON にバイナリデータをどうしても含める必要があり、ファイルを使えない場合にのみ base64 を使用してください。 + +## Pydantic `bytes` { #pydantic-bytes } + +Pydantic モデルで `bytes` 型のフィールドを宣言し、モデル設定で `val_json_bytes` を使うと、入力 JSON データの検証時に base64 を用いるよう指示できます。この検証の一環として、base64 文字列はバイト列へデコードされます。 + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *} + +「/docs」を確認すると、`data` フィールドが base64 でエンコードされたバイト列を期待していることが表示されます。 + +
+ +
+ +次のようなリクエストを送れます: + +```json +{ + "description": "Some data", + "data": "aGVsbG8=" +} +``` + +/// tip | 豆知識 + +`aGVsbG8=` は `hello` の base64 エンコードです。 + +/// + +その後、Pydantic は base64 文字列をデコードし、モデルの `data` フィールドに元のバイト列を渡します。 + +次のようなレスポンスを受け取ります: + +```json +{ + "description": "Some data", + "content": "hello" +} +``` + +## 出力データ向けの Pydantic `bytes` { #pydantic-bytes-for-output-data } + +出力データ用にモデル設定で `ser_json_bytes` とともに `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` で出力を「シリアライズ」する、といった具合に、入力と出力の両方を扱えます。 + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *} diff --git a/docs/ja/docs/advanced/stream-data.md b/docs/ja/docs/advanced/stream-data.md new file mode 100644 index 0000000000..52bbfd3fd3 --- /dev/null +++ b/docs/ja/docs/advanced/stream-data.md @@ -0,0 +1,117 @@ +# データのストリーミング { #stream-data } + +JSON として構造化できるデータをストリームしたい場合は、[JSON Lines をストリームする](../tutorial/stream-json-lines.md) を参照してください。 + +しかし、純粋なバイナリデータや文字列をストリームしたい場合は、次のようにできます。 + +/// info | 情報 + +FastAPI 0.134.0 で追加されました。 + +/// + +## ユースケース { #use-cases } + +例えば、AI LLM サービスの出力をそのまま、純粋な文字列としてストリームしたい場合に使えます。 + +メモリに一度に全て読み込むことなく、読み込みながらチャンクごとに送ることで、巨大なバイナリファイルをストリームすることにも使えます。 + +同様に、動画や音声をストリームすることもできます。処理しながら生成し、そのまま送信することも可能です。 + +## `yield` を使った `StreamingResponse` { #a-streamingresponse-with-yield } + +path operation 関数で `response_class=StreamingResponse` を宣言すると、`yield` を使ってデータをチャンクごとに順次送信できます。 + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *} + +FastAPI は各データチャンクをそのまま `StreamingResponse` に渡し、JSON などに変換しようとはしません。 + +### 非 async な path operation 関数 { #non-async-path-operation-functions } + +`async` なしの通常の `def` 関数でも同様に `yield` を使えます。 + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[26:29] hl[27] *} + +### アノテーションなし { #no-annotation } + +バイナリデータをストリームする場合、戻り値の型アノテーションを宣言する必要は実際にはありません。 + +この場合、FastAPI はデータを Pydantic で JSON 化したり、何らかの方法でシリアライズしようとしないため、型アノテーションはエディタやツール向けの補助にすぎず、FastAPI 自体では使用されません。 + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} + +つまり、`StreamingResponse` では型アノテーションに依存せず、送信したい形式に合わせてバイト列を生成・エンコードする「自由」と「責任」があなたにあります。 🤓 + +### バイト列をストリームする { #stream-bytes } + +主なユースケースの一つは、文字列ではなく `bytes` をストリームすることです。もちろん可能です。 + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[44:47] hl[47] *} + +## カスタム `PNGStreamingResponse` { #a-custom-pngstreamingresponse } + +上記の例ではバイト列をストリームしましたが、レスポンスに `Content-Type` ヘッダがないため、クライアントは受け取るデータの種類を認識できませんでした。 + +`StreamingResponse` を継承したカスタムクラスを作成し、ストリームするデータに応じて `Content-Type` ヘッダを設定できます。 + +例えば、`media_type` 属性で `Content-Type` を `image/png` に設定する `PNGStreamingResponse` を作成できます: + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *} + +その後、path operation 関数で `response_class=PNGStreamingResponse` としてこの新しいクラスを使用できます: + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *} + +### ファイルを模擬する { #simulate-a-file } + +この例では `io.BytesIO` でファイルを模擬しています。これはメモリ上だけに存在するファイルライクオブジェクトですが、通常のファイルと同じインターフェースを提供します。 + +例えば、ファイルと同様にイテレートして内容を読み出せます。 + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[1:27] hl[3,12:13,25] *} + +/// note | 技術詳細 + +他の2つの変数 `image_base64` と `binary_image` は、画像を Base64 でエンコードし、それを `bytes` に変換してから `io.BytesIO` に渡したものです。 + +この例では1つのファイル内に完結させ、コピーしてそのまま実行できるようにするためだけのものです。 🥚 + +/// + +`with` ブロックを使うことで、ジェネレータ関数(`yield` を持つ関数)が終了した後、つまりレスポンス送信が完了した後に、そのファイルライクオブジェクトが確実にクローズされます。 + +この例では `io.BytesIO` によるメモリ内の疑似ファイルなので重要度は高くありませんが、実ファイルの場合は処理後に確実にクローズすることが重要です。 + +### ファイルと非同期 { #files-and-async } + +多くの場合、ファイルライクオブジェクトはデフォルトでは async/await と互換性がありません。 + +例えば、`await file.read()` や `async for chunk in file` のような操作は提供されていません。 + +また、多くの場合、ディスクやネットワークから読み出すため、読み取りはブロッキング(イベントループをブロックし得る)処理になります。 + +/// info | 情報 + +上記の例は例外で、`io.BytesIO` は既にメモリ上にあるため、読み取りが何かをブロックすることはありません。 + +しかし多くの場合、ファイルやファイルライクオブジェクトの読み取りはブロッキングになります。 + +/// + +イベントループのブロッキングを避けるには、path operation 関数を `async def` ではなく通常の `def` で宣言してください。そうすると FastAPI はその関数をスレッドプールワーカー上で実行し、メインループのブロッキングを避けます。 + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *} + +/// tip | 豆知識 + +async 関数内からブロッキングなコードを呼び出す必要がある場合、あるいはブロッキングな関数内から async 関数を呼び出す必要がある場合は、FastAPI の兄弟ライブラリである [Asyncer](https://asyncer.tiangolo.com) を利用できます。 + +/// + +### `yield from` { #yield-from } + +ファイルライクオブジェクトのようなものをイテレートして各要素に対して `yield` している場合、`for` ループを省略して、`yield from` で各要素をそのまま送ることもできます。 + +これは FastAPI 固有ではなく単なる Python の機能ですが、知っておくと便利な小ワザです。 😎 + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[37:40] hl[40] *} diff --git a/docs/ja/docs/advanced/strict-content-type.md b/docs/ja/docs/advanced/strict-content-type.md new file mode 100644 index 0000000000..994cb86722 --- /dev/null +++ b/docs/ja/docs/advanced/strict-content-type.md @@ -0,0 +1,88 @@ +# Content-Type の厳格チェック { #strict-content-type-checking } + +既定では、FastAPI は JSON リクエストボディに対して厳格な `Content-Type` ヘッダーのチェックを行います。つまり、JSON のリクエストを JSON として解析するには、有効な `Content-Type` ヘッダー(例: `application/json`)を必ず含める必要があります。 + +## CSRF のリスク { #csrf-risk } + +この既定の挙動は、ある特定の状況における Cross-Site Request Forgery(CSRF)攻撃の一種に対する保護を提供します。 + +これらの攻撃は、次の条件を満たすときにブラウザが CORS のプリフライトチェックを行わずにスクリプトからリクエストを送信できる事実を悪用します。 + +- `Content-Type` ヘッダーがない(例: `Blob` をボディにして `fetch()` を使う) +- かつ、いかなる認証情報も送信しない + +この種の攻撃は主に次のような場合に関係します。 + +- アプリケーションがローカル(例: `localhost`)または社内ネットワークで動作している +- かつ、アプリに認証がなく、同一ネットワークからのリクエストは信頼できると想定している + +## 攻撃例 { #example-attack } + +ローカルで AI エージェントを実行できる仕組みを構築したとします。 + +それは次の API を提供します。 + +``` +http://localhost:8000/v1/agents/multivac +``` + +フロントエンドもあります。 + +``` +http://localhost:8000 +``` + +/// tip | 豆知識 + +両方とも同じホストであることに注意してください。 + +/// + +そのフロントエンドを使って、AI エージェントに自分の代わりに作業をさせられます。 + +それが「公開インターネット」ではなくローカルで動作しているため、ローカルネットワークへのアクセスを信頼し、認証を一切設定しないことにしたとします。 + +すると、ユーザーの一人がそれをインストールしてローカルで実行できます。 + +その後、例えば次のような悪意のあるサイトを開く可能性があります。 + +``` +https://evilhackers.example.com +``` + +そしてその悪意のあるサイトが、`Blob` をボディにした `fetch()` を使ってローカルの API にリクエストを送信します。 + +``` +http://localhost:8000/v1/agents/multivac +``` + +悪意のあるサイトとローカルアプリのホストは異なるにもかかわらず、ブラウザは次の理由で CORS のプリフライトリクエストを発行しません。 + +- 認証なしで動作しており、認証情報を送る必要がないため +- ブラウザは(`Content-Type` ヘッダーがないため)JSON を送っていないと判断するため + +その結果、悪意のあるサイトがローカルの AI エージェントに、ユーザーの元上司に怒りのメッセージを送らせることができてしまいます... あるいは、もっと悪いことも。 😅 + +## 公開インターネット { #open-internet } + +アプリが公開インターネット上にある場合、「ネットワークを信頼」して認証なしで誰にでも特権的なリクエストを送らせることはしないはずです。 + +攻撃者は単にスクリプトを実行して API にリクエストを送れます。ブラウザを介する必要がないため、すでに特権エンドポイントは保護しているでしょう。 + +その場合、これはあなたには当てはまらない攻撃/リスクです。 + +このリスクと攻撃が主に問題になるのは、アプリがローカルネットワークで動作し、それだけが前提の保護となっている場合です。 + +## Content-Type なしのリクエストを許可する { #allowing-requests-without-content-type } + +`Content-Type` ヘッダーを送らないクライアントをサポートする必要がある場合は、`strict_content_type=False` を設定して厳格チェックを無効化できます。 + +{* ../../docs_src/strict_content_type/tutorial001_py310.py hl[4] *} + +この設定では、`Content-Type` ヘッダーがないリクエストでもボディが JSON として解析されます。これは古いバージョンの FastAPI と同じ挙動です。 + +/// info | 情報 + +この挙動と設定は FastAPI 0.132.0 で追加されました。 + +/// diff --git a/docs/ja/docs/editor-support.md b/docs/ja/docs/editor-support.md new file mode 100644 index 0000000000..d82e970f95 --- /dev/null +++ b/docs/ja/docs/editor-support.md @@ -0,0 +1,23 @@ +# エディタ対応 { #editor-support } + +公式の[FastAPI Extension](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode)は、*path operation* の検出・ナビゲーションに加え、FastAPI Cloud へのデプロイやライブログストリーミングなど、FastAPI の開発ワークフローを強化します。 + +拡張機能の詳細は、[GitHub リポジトリ](https://github.com/fastapi/fastapi-vscode)の README を参照してください。 + +## セットアップとインストール { #setup-and-installation } + +**FastAPI Extension** は [VS Code](https://code.visualstudio.com/) と [Cursor](https://www.cursor.com/) の両方で利用できます。各エディタの拡張機能パネルから「FastAPI」を検索し、**FastAPI Labs** が公開している拡張機能を選択して直接インストールできます。 [vscode.dev](https://vscode.dev) や [github.dev](https://github.dev) などのブラウザベースのエディタでも動作します。 + +### アプリケーション検出 { #application-discovery } + +既定では、ワークスペース内で `FastAPI()` を生成しているファイルを走査し、FastAPI アプリケーションを自動検出します。プロジェクト構成の都合で自動検出が機能しない場合は、`pyproject.toml` の `[tool.fastapi]`、または VS Code 設定の `fastapi.entryPoint` にモジュール記法(例: `myapp.main:app`)でエントリポイントを指定できます。 + +## 機能 { #features } + +- **Path Operation エクスプローラー** - アプリケーション内のすべての *path operations* をサイドバーのツリービューで表示します。クリックして任意のルートまたはルーター定義へジャンプできます。 +- **ルート検索** - Ctrl + Shift + E(macOS: Cmd + Shift + E)で、パス・メソッド・名前で検索できます。 +- **CodeLens ナビゲーション** - テストクライアント呼び出し(例: `client.get('/items')`)の上に表示されるクリック可能なリンクから、対応する *path operation* にジャンプし、テストと実装の行き来をすばやく行えます。 +- **FastAPI Cloud へデプロイ** - [FastAPI Cloud](https://fastapicloud.com/) にワンクリックでアプリをデプロイできます。 +- **アプリケーションログのストリーミング** - FastAPI Cloud にデプロイしたアプリから、レベルフィルタやテキスト検索付きでリアルタイムにログをストリーミングできます。 + +拡張機能の機能に慣れるには、コマンドパレット(Ctrl + Shift + P、macOS: Cmd + Shift + P)を開き、"Welcome: Open walkthrough..." を選択してから、"Get started with FastAPI" のウォークスルーを選んでください。 diff --git a/docs/ja/docs/tutorial/server-sent-events.md b/docs/ja/docs/tutorial/server-sent-events.md new file mode 100644 index 0000000000..d8168cef30 --- /dev/null +++ b/docs/ja/docs/tutorial/server-sent-events.md @@ -0,0 +1,120 @@ +# Server-Sent Events (SSE) { #server-sent-events-sse } + +**Server-Sent Events** (SSE) を使うと、クライアントへデータをストリーミングできます。 + +これは[JSON Lines のストリーミング](stream-json-lines.md)に似ていますが、`text/event-stream` フォーマットを使用します。これはブラウザがネイティブに [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) でサポートしています。 + +/// info | 情報 + +FastAPI 0.135.0 で追加されました。 + +/// + +## Server-Sent Events とは { #what-are-server-sent-events } + +SSE は、HTTP 経由でサーバーからクライアントへデータをストリーミングするための標準です。 + +各イベントは、`data`、`event`、`id`、`retry` などの「フィールド」を含む小さなテキストブロックで、空行で区切られます。 + +次のようになります: + +``` +data: {"name": "Portal Gun", "price": 999.99} + +data: {"name": "Plumbus", "price": 32.99} + +``` + +SSE は、AI チャットのストリーミング、ライブ通知、ログやオブザビリティなど、サーバーがクライアントへ更新をプッシュする用途で一般的に使われます。 + +/// tip | 豆知識 + +バイナリデータ(例: 動画や音声)をストリーミングしたい場合は、上級ガイド [データのストリーミング](../advanced/stream-data.md) を参照してください。 + +/// + +## FastAPI で SSE をストリーミング { #stream-sse-with-fastapi } + +FastAPI で SSE をストリーミングするには、*path operation 関数*で `yield` を使い、`response_class=EventSourceResponse` を設定します。 + +`EventSourceResponse` は `fastapi.sse` からインポートします: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[4,22] *} + +yield された各アイテムは JSON にエンコードされ、SSE イベントの `data:` フィールドで送信されます。 + +戻り値の型を `AsyncIterable[Item]` と宣言すると、FastAPI は Pydantic を用いてデータを**検証**、**ドキュメント化**、**シリアライズ**します。 + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[10:12,23] *} + +/// tip | 豆知識 + +Pydantic が**Rust** 側でシリアライズを行うため、戻り値の型を宣言しない場合に比べて大幅に**高性能**になります。 + +/// + +### 非 async の *path operation 関数* { #non-async-path-operation-functions } + +通常の `def` 関数(`async` なし)も使用でき、同様に `yield` を使えます。 + +イベントループをブロックしないよう、FastAPI が正しく実行されるように調整します。 + +この場合は関数が async ではないため、適切な戻り値の型は `Iterable[Item]` です: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[28:31] hl[29] *} + +### 戻り値の型なし { #no-return-type } + +戻り値の型を省略することもできます。FastAPI は [`jsonable_encoder`](./encoder.md) を使ってデータを変換し、送信します。 + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[34:37] hl[35] *} + +## `ServerSentEvent` { #serversentevent } + +`event`、`id`、`retry`、`comment` などの SSE フィールドを設定する必要がある場合は、生データの代わりに `ServerSentEvent` オブジェクトを `yield` できます。 + +`ServerSentEvent` は `fastapi.sse` からインポートします: + +{* ../../docs_src/server_sent_events/tutorial002_py310.py hl[4,26] *} + +`data` フィールドは常に JSON にエンコードされます。Pydantic モデルを含む、JSON にシリアライズ可能な任意の値を渡せます。 + +## 生データ { #raw-data } + +JSON エンコードせずにデータを送る必要がある場合は、`data` の代わりに `raw_data` を使用します。 + +これは、整形済みテキスト、ログ行、または `[DONE]` のような特別な "センチネル" 値を送るのに有用です。 + +{* ../../docs_src/server_sent_events/tutorial003_py310.py hl[17] *} + +/// note | 備考 + +`data` と `raw_data` は相互排他的です。各 `ServerSentEvent` ではどちらか一方しか設定できません。 + +/// + +## `Last-Event-ID` での再開 { #resuming-with-last-event-id } + +接続が途切れた後にブラウザが再接続すると、最後に受信した `id` を `Last-Event-ID` ヘッダーで送信します。 + +これをヘッダーパラメータとして受け取り、クライアントが離脱した位置からストリームを再開できます: + +{* ../../docs_src/server_sent_events/tutorial004_py310.py hl[25,27,31] *} + +## POST での SSE { #sse-with-post } + +SSE は `GET` だけでなく、**任意の HTTP メソッド**で動作します。 + +これは、`POST` 上で SSE をストリーミングする [MCP](https://modelcontextprotocol.io) のようなプロトコルで有用です: + +{* ../../docs_src/server_sent_events/tutorial005_py310.py hl[14] *} + +## 技術詳細 { #technical-details } + +FastAPI は SSE のいくつかのベストプラクティスを標準で実装しています。 + +- メッセージがない場合は 15 秒ごとに「キープアライブ」用の `ping` コメントを送信し、一部のプロキシが接続を閉じるのを防ぎます([HTML 仕様: Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes) の推奨に従います)。 +- ストリームの**キャッシュを防止**するため、`Cache-Control: no-cache` ヘッダーを設定します。 +- Nginx など一部のプロキシでの**バッファリングを防ぐ**ため、特別なヘッダー `X-Accel-Buffering: no` を設定します。 + +追加の設定は不要で、そのまま動作します。🤓 diff --git a/docs/ja/docs/tutorial/stream-json-lines.md b/docs/ja/docs/tutorial/stream-json-lines.md new file mode 100644 index 0000000000..a247234e24 --- /dev/null +++ b/docs/ja/docs/tutorial/stream-json-lines.md @@ -0,0 +1,111 @@ +# JSON Lines をストリームする { #stream-json-lines } + +データのシーケンスを**「ストリーム」**で送りたい場合、**JSON Lines** を使って実現できます。 + +/// info | 情報 + +FastAPI 0.134.0 で追加されました。 + +/// + +## ストリームとは { #what-is-a-stream } + +データを**ストリーミング**するとは、アイテムの全シーケンスが用意できるのを待たずに、アプリがデータアイテムの送信をクライアントに対して開始することを意味します。 + +つまり、最初のアイテムを送信し、クライアントはそれを受け取って処理を始めます。その間に、次のアイテムをまだ生成しているかもしれません。 + +```mermaid +sequenceDiagram + participant App + participant Client + + App->>App: Produce Item 1 + App->>Client: Send Item 1 + App->>App: Produce Item 2 + Client->>Client: Process Item 1 + App->>Client: Send Item 2 + App->>App: Produce Item 3 + Client->>Client: Process Item 2 + App->>Client: Send Item 3 + Client->>Client: Process Item 3 + Note over App: Keeps producing... + Note over Client: Keeps consuming... +``` + +データを送り続ける無限ストリームにすることもできます。 + +## JSON Lines { #json-lines } + +このような場合、1 行に 1 つの JSON オブジェクトを送る「**JSON Lines**」形式を使うのが一般的です。 + +レスポンスの content type は `application/jsonl`(`application/json` の代わり)となり、ボディは次のようになります: + +```json +{"name": "Plumbus", "description": "A multi-purpose household device."} +{"name": "Portal Gun", "description": "A portal opening device."} +{"name": "Meeseeks Box", "description": "A box that summons a Meeseeks."} +``` + +これは JSON 配列(Python の list に相当)にとてもよく似ていますが、`[]` で囲まず、アイテム間の `,` もありません。その代わりに、**1 行に 1 つの JSON オブジェクト**で、改行文字で区切られます。 + +/// info | 情報 + +重要な点は、クライアントが前の行を消費している間に、アプリ側は次の行を順次生成して送れることです。 + +/// + +/// note | 技術詳細 + +各 JSON オブジェクトは改行で区切られるため、内容にリテラルな改行文字は含められません。ですが、エスケープした改行(`\n`)は含められます。これは JSON 標準の一部です。 + +とはいえ、通常は気にする必要はありません。自動で処理されますので、読み進めてください。🤓 + +/// + +## ユースケース { #use-cases } + +これは **AI LLM** サービス、**ログ**や**テレメトリ**、あるいは **JSON** アイテムとして構造化できる他の種類のデータをストリームするのに使えます。 + +/// tip | 豆知識 + +動画や音声などのバイナリデータをストリームしたい場合は、上級ガイドを参照してください: [データのストリーム](../advanced/stream-data.md)。 + +/// + +## FastAPI で JSON Lines をストリームする { #stream-json-lines-with-fastapi } + +FastAPI で JSON Lines をストリームするには、*path operation 関数*で `return` を使う代わりに、`yield` を使って各アイテムを順に生成します。 + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[24] *} + +送り返す各 JSON アイテムが `Item`(Pydantic モデル)型で、関数が async の場合、戻り値の型を `AsyncIterable[Item]` と宣言できます: + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[9:11,22] *} + +戻り値の型を宣言すると、FastAPI はそれを使ってデータを**検証**し、OpenAPI に**ドキュメント化**し、**フィルター**し、Pydantic で**シリアライズ**します。 + +/// tip | 豆知識 + +Pydantic は **Rust** 側でシリアライズを行うため、戻り値の型を宣言しない場合に比べて大幅に高い**パフォーマンス**が得られます。 + +/// + +### 非 async の *path operation 関数* { #non-async-path-operation-functions } + +`async` を使わない通常の `def` 関数でも同様に `yield` を使えます。 + +FastAPI が適切に実行されるように処理するため、イベントループをブロックしません。 + +この場合は関数が async ではないので、適切な戻り値の型は `Iterable[Item]` です: + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[27:30] hl[28] *} + +### 戻り値の型なし { #no-return-type } + +戻り値の型を省略することもできます。FastAPI はその場合、データを JSON にシリアライズ可能な形に変換するために [`jsonable_encoder`](./encoder.md) を使い、JSON Lines として送信します。 + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[33:36] hl[34] *} + +## Server-Sent Events (SSE) { #server-sent-events-sse } + +FastAPI は Server-Sent Events (SSE) にもファーストクラスで対応しています。とても似ていますが、いくつか追加の詳細があります。次の章で学べます: [Server-Sent Events (SSE)](server-sent-events.md)。🤓 diff --git a/docs/ko/docs/advanced/json-base64-bytes.md b/docs/ko/docs/advanced/json-base64-bytes.md new file mode 100644 index 0000000000..b5e55a41af --- /dev/null +++ b/docs/ko/docs/advanced/json-base64-bytes.md @@ -0,0 +1,63 @@ +# 바이트를 Base64로 포함하는 JSON { #json-with-bytes-as-base64 } + +애플리케이션에서 JSON 데이터를 주고받아야 하지만 그 안에 바이너리 데이터를 포함해야 한다면, base64로 인코딩해서 포함할 수 있습니다. + +## Base64와 파일 { #base64-vs-files } + +바이너리 데이터 업로드에는 [요청 파일](../tutorial/request-files.md)을, 바이너리 데이터 전송에는 [커스텀 응답 - FileResponse](./custom-response.md#fileresponse--fileresponse-)를 사용할 수 있는지 먼저 고려하세요. JSON으로 인코딩하는 대신 말입니다. + +JSON은 UTF-8로 인코딩된 문자열만 포함할 수 있으므로, 원시 바이트를 그대로 담을 수 없습니다. + +Base64는 바이너리 데이터를 문자열로 인코딩할 수 있지만, 이를 위해 원래의 바이너리 데이터보다 더 많은 문자 수를 사용해야 하므로 일반적인 파일 전송보다 비효율적일 수 있습니다. + +반드시 JSON 안에 바이너리 데이터를 포함해야 하고, 파일을 사용할 수 없을 때만 base64를 사용하세요. + +## Pydantic `bytes` { #pydantic-bytes } + +`bytes` 필드를 가진 Pydantic 모델을 선언하고, 모델 설정에서 `val_json_bytes`를 사용하도록 지정하면 입력 JSON 데이터를 base64로 “검증”하도록 할 수 있습니다. 이 검증 과정의 일부로 base64 문자열을 바이트로 디코딩합니다. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *} + +`/docs`를 확인하면 `data` 필드가 base64로 인코딩된 bytes를 기대한다고 표시됩니다: + +
+ +
+ +아래와 같은 요청을 보낼 수 있습니다: + +```json +{ + "description": "Some data", + "data": "aGVsbG8=" +} +``` + +/// tip | 팁 + +`aGVsbG8=`는 `hello`의 base64 인코딩입니다. + +/// + +그러면 Pydantic이 base64 문자열을 디코딩하여 모델의 `data` 필드에 원래 바이트를 제공합니다. + +다음과 같은 응답을 받게 됩니다: + +```json +{ + "description": "Some data", + "content": "hello" +} +``` + +## 출력 데이터용 Pydantic `bytes` { #pydantic-bytes-for-output-data } + +출력 데이터에도 모델 설정에서 `ser_json_bytes`와 함께 `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 } + +물론, 동일한 모델을 사용해 JSON 데이터를 받을 때는 `val_json_bytes`로 입력을 “검증”하고, JSON 데이터를 보낼 때는 `ser_json_bytes`로 출력을 “직렬화”하도록 base64를 모두 처리하게 구성할 수 있습니다. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *} diff --git a/docs/ko/docs/advanced/stream-data.md b/docs/ko/docs/advanced/stream-data.md new file mode 100644 index 0000000000..5eda170cb5 --- /dev/null +++ b/docs/ko/docs/advanced/stream-data.md @@ -0,0 +1,117 @@ +# 데이터 스트리밍 { #stream-data } + +JSON으로 구조화할 수 있는 데이터를 스트리밍하려면 [JSON Lines 스트리밍](../tutorial/stream-json-lines.md)을 사용하세요. + +하지만 순수 바이너리 데이터나 문자열을 스트리밍하려면 다음과 같이 하면 됩니다. + +/// info | 정보 + +FastAPI 0.134.0에 추가되었습니다. + +/// + +## 사용 예시 { #use-cases } + +예를 들어 AI LLM 서비스의 출력에서 바로 순수 문자열을 스트리밍하고 싶다면 이를 사용할 수 있습니다. + +또한 큰 바이너리 파일을 스트리밍하는 데 사용할 수 있습니다. 한 번에 모두 메모리로 읽지 않고, 읽는 즉시 데이터 청크를 순차적으로 스트리밍합니다. + +이 방식으로 비디오나 오디오를 스트리밍할 수도 있으며, 처리하면서 생성된 데이터를 곧바로 전송할 수도 있습니다. + +## `yield`와 함께 `StreamingResponse` 사용하기 { #a-streamingresponse-with-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`가 없는 일반 `def` 함수에서도 동일하게 `yield`를 사용할 수 있습니다. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[26:29] hl[27] *} + +### 타입 애너테이션 생략하기 { #no-annotation } + +바이너리 데이터를 스트리밍할 때는 반환 타입 애너테이션을 굳이 선언할 필요가 없습니다. + +FastAPI는 데이터를 Pydantic으로 JSON으로 변환하거나 어떤 방식으로든 직렬화하지 않으므로, 이 경우 타입 애너테이션은 편집기나 도구를 위한 용도일 뿐이며 FastAPI에서는 사용되지 않습니다. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} + +이는 곧 `StreamingResponse`를 사용할 때 타입 애너테이션과 무관하게, 전송 기준에 맞춰 바이트 데이터를 생성하고 인코딩할 자유와 책임이 여러분에게 있음을 의미합니다. 🤓 + +### 바이트 스트리밍 { #stream-bytes } + +주요 사용 사례 중 하나는 문자열 대신 `bytes`를 스트리밍하는 것입니다. 물론 그렇게 할 수 있습니다. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[44:47] hl[47] *} + +## 사용자 정의 `PNGStreamingResponse` { #a-custom-pngstreamingresponse } + +위 예시에서는 바이트 데이터를 스트리밍했지만, 응답에 `Content-Type` 헤더가 없어 클라이언트는 어떤 유형의 데이터를 받는지 알 수 없습니다. + +스트리밍하는 데이터 유형에 맞춰 `Content-Type` 헤더를 설정하는 `StreamingResponse`의 하위 클래스를 직접 만들 수 있습니다. + +예를 들어 `media_type` 속성을 사용해 `Content-Type` 헤더를 `image/png`로 설정하는 `PNGStreamingResponse`를 만들 수 있습니다: + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *} + +그런 다음 경로 처리 함수에서 `response_class=PNGStreamingResponse`로 이 새 클래스를 사용할 수 있습니다: + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *} + +### 파일 시뮬레이션 { #simulate-a-file } + +이 예시에서는 `io.BytesIO`로 파일을 시뮬레이션합니다. 이는 메모리에서만 존재하지만 파일과 동일한 인터페이스를 제공하는 파일 유사 객체입니다. + +예를 들어 실제 파일처럼 내용을 소비하기 위해 순회(iterate)할 수 있습니다. + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[1:27] hl[3,12:13,25] *} + +/// note | 기술 세부사항 + +다른 두 변수 `image_base64`와 `binary_image`는 이미지를 Base64로 인코딩한 뒤 바이트로 변환한 것이며, 이를 `io.BytesIO`에 전달합니다. + +이 예시에서 하나의 파일 안에 모두 담아, 그대로 복사해 실행할 수 있도록 하기 위한 목적입니다. 🥚 + +/// + +`with` 블록을 사용하면 제너레이터 함수(`yield`가 있는 함수)가 끝난 뒤, 즉 응답 전송이 완료된 후 파일 유사 객체가 닫히도록 보장합니다. + +이 예시처럼 메모리 상의 가짜 파일(`io.BytesIO`)이라면 크게 중요하지 않지만, 실제 파일의 경우 작업이 끝난 뒤 파일을 닫는 것이 매우 중요합니다. + +### 파일과 비동기 { #files-and-async } + +대부분의 경우 파일 유사 객체는 기본적으로 async/await와 호환되지 않습니다. + +예를 들어 `await file.read()`나 `async for chunk in file`과 같은 패턴을 지원하지 않습니다. + +또한 디스크나 네트워크에서 읽기 때문에, 많은 경우 읽기 작업은 이벤트 루프를 막을 수 있는 블로킹 연산입니다. + +/// info | 정보 + +위의 예시는 예외적인 경우입니다. `io.BytesIO` 객체는 이미 메모리에 있으므로 읽기가 아무 것도 차단하지 않습니다. + +하지만 실제 파일이나 파일 유사 객체를 읽을 때는 블로킹되는 경우가 많습니다. + +/// + +이벤트 루프가 블로킹되는 것을 피하려면 경로 처리 함수를 `async def` 대신 일반 `def`로 선언하세요. 그러면 FastAPI가 스레드풀 워커에서 실행하여 메인 루프가 막히지 않도록 합니다. + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *} + +/// tip | 팁 + +비동기 함수 안에서 블로킹 코드를 호출해야 하거나, 반대로 블로킹 함수 안에서 비동기 함수를 호출해야 한다면 FastAPI의 형제 라이브러리인 [Asyncer](https://asyncer.tiangolo.com)를 사용할 수 있습니다. + +/// + +### `yield from` { #yield-from } + +파일 유사 객체처럼 어떤 것을 순회하면서 각 항목마다 `yield`를 하는 대신, `yield from`을 사용해 각 항목을 직접 전달하고 `for` 루프를 생략할 수 있습니다. + +이는 FastAPI에 특화된 기능이 아니라 순수한 파이썬 기능이지만, 알아두면 유용한 트릭입니다. 😎 + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[37:40] hl[40] *} diff --git a/docs/ko/docs/advanced/strict-content-type.md b/docs/ko/docs/advanced/strict-content-type.md new file mode 100644 index 0000000000..82683e15c3 --- /dev/null +++ b/docs/ko/docs/advanced/strict-content-type.md @@ -0,0 +1,88 @@ +# 엄격한 Content-Type 확인 { #strict-content-type-checking } + +기본적으로 **FastAPI**는 JSON 요청 본문에 대해 엄격한 `Content-Type` 헤더 검사를 사용합니다. 이는 JSON 요청의 본문을 JSON으로 파싱하려면 유효한 `Content-Type` 헤더(예: `application/json`)를 반드시 포함해야 함을 의미합니다. + +## CSRF 위험 { #csrf-risk } + +이 기본 동작은 매우 특정한 시나리오에서 **Cross-Site Request Forgery (CSRF)** 공격의 한 유형에 대한 보호를 제공합니다. + +이러한 공격은 브라우저가 다음과 같은 경우 CORS 사전 요청(preflight) 검사를 수행하지 않고 스크립트가 요청을 보내도록 허용한다는 점을 악용합니다: + +- `Content-Type` 헤더가 없음(예: `Blob` 본문과 함께 `fetch()` 사용) +- 그리고 어떠한 인증 자격 증명도 보내지 않음 + +이 유형의 공격은 주로 다음과 같은 경우에 관련이 있습니다: + +- 애플리케이션이 로컬(예: `localhost`) 또는 내부 네트워크에서 실행 중이고 +- 애플리케이션에 인증이 없어 같은 네트워크에서 오는 모든 요청을 신뢰한다고 가정하는 경우 + +## 공격 예시 { #example-attack } + +로컬 AI 에이전트를 실행하는 방법을 만들었다고 가정해 봅시다. + +이 에이전트는 다음 위치에 API를 제공합니다: + +``` +http://localhost:8000/v1/agents/multivac +``` + +또한 다음 위치에 프론트엔드가 있습니다: + +``` +http://localhost:8000 +``` + +/// tip | 팁 + +두 주소 모두 같은 호스트를 사용합니다. + +/// + +그런 다음 프론트엔드를 통해 AI 에이전트가 여러분을 대신해 작업을 수행하도록 할 수 있습니다. + +이는 공개 인터넷이 아니라 로컬에서 실행되므로, 여러분은 로컬 네트워크 접근만을 신뢰하고 별도의 인증을 설정하지 않기로 합니다. + +그 후 사용자는 이를 설치해 로컬에서 실행할 수 있습니다. + +그리고 다음과 같은 악성 웹사이트를 열 수 있습니다: + +``` +https://evilhackers.example.com +``` + +그 악성 웹사이트가 `Blob` 본문으로 `fetch()`를 사용해 로컬 API로 요청을 보냅니다: + +``` +http://localhost:8000/v1/agents/multivac +``` + +악성 웹사이트의 호스트와 로컬 앱의 호스트가 다르더라도, 브라우저는 다음과 같은 이유로 CORS 사전 요청(preflight)을 트리거하지 않습니다: + +- 인증 없이 동작하므로 자격 증명을 보낼 필요가 없습니다. +- 브라우저는 JSON을 보내지 않는다고 판단합니다(`Content-Type` 헤더가 없기 때문). + +그러면 악성 웹사이트가 로컬 AI 에이전트로 하여금 사용자의 전 직장 상사에게 화난 메시지를 보내게 하거나... 더 나쁜 일을 시킬 수도 있습니다. 😅 + +## 공개 인터넷 { #open-internet } + +여러분의 앱이 공개 인터넷에 있다면, '네트워크를 신뢰'하여 누구나 인증 없이 권한 있는 요청을 보내도록 두지는 않을 것입니다. + +공격자는 브라우저 상호작용 없이도 스크립트를 실행해 여러분의 API로 요청을 보낼 수 있으므로, 아마 이미 권한이 필요한 엔드포인트는 보호하고 있을 것입니다. + +그런 경우에는 이 공격/위험은 해당하지 않습니다. + +이 위험과 공격은 주로 앱이 **로컬 네트워크**에서 실행되고 그것이 **유일한 보호수단**이라고 가정할 때 관련이 있습니다. + +## Content-Type 없이 요청 허용하기 { #allowing-requests-without-content-type } + +만약 `Content-Type` 헤더를 보내지 않는 클라이언트를 지원해야 한다면, `strict_content_type=False`로 설정해 엄격한 검사를 비활성화할 수 있습니다: + +{* ../../docs_src/strict_content_type/tutorial001_py310.py hl[4] *} + +이 설정을 사용하면 `Content-Type` 헤더가 없는 요청도 본문이 JSON으로 파싱됩니다. 이는 이전 버전의 FastAPI와 동일한 동작입니다. + +/// info | 정보 + +이 동작과 설정은 FastAPI 0.132.0에 추가되었습니다. + +/// diff --git a/docs/ko/docs/editor-support.md b/docs/ko/docs/editor-support.md new file mode 100644 index 0000000000..6a6069df27 --- /dev/null +++ b/docs/ko/docs/editor-support.md @@ -0,0 +1,23 @@ +# 에디터 지원 { #editor-support } + +공식 [FastAPI 확장](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode)은 FastAPI 개발 워크플로우를 강화해 줍니다. *경로 처리* 탐색 및 이동, FastAPI Cloud 배포, 실시간 로그 스트리밍을 제공합니다. + +확장에 대한 자세한 내용은 [GitHub 저장소](https://github.com/fastapi/fastapi-vscode)의 README를 참고하세요. + +## 설치 및 설정 { #setup-and-installation } + +**FastAPI 확장**은 [VS Code](https://code.visualstudio.com/)와 [Cursor](https://www.cursor.com/)에서 사용할 수 있습니다. 각 에디터의 확장(Extensions) 패널에서 "FastAPI"로 검색한 뒤 **FastAPI Labs**가 배포한 확장을 선택해 바로 설치할 수 있습니다. 또한 [vscode.dev](https://vscode.dev), [github.dev](https://github.dev) 같은 브라우저 기반 에디터에서도 동작합니다. + +### 애플리케이션 자동 감지 { #application-discovery } + +기본적으로 이 확장은 작업 공간에서 `FastAPI()`를 생성하는 파일을 스캔하여 FastAPI 애플리케이션을 자동으로 감지합니다. 프로젝트 구조상 자동 감지가 어려운 경우, `pyproject.toml`의 `[tool.fastapi]` 항목이나 VS Code 설정 `fastapi.entryPoint`에 모듈 표기(예: `myapp.main:app`)로 엔트리포인트를 지정할 수 있습니다. + +## 기능 { #features } + +- **경로 처리 탐색기** - 애플리케이션의 모든 *경로 처리*를 사이드바 트리 뷰로 확인합니다. 클릭하면 해당 경로 또는 라우터 정의로 바로 이동합니다. +- **경로 검색** - Ctrl + Shift + E (macOS: Cmd + Shift + E)로 경로, 메서드, 이름으로 검색합니다. +- **CodeLens 탐색** - 테스트 클라이언트 호출(예: `client.get('/items')`) 위의 클릭 가능한 링크를 통해 해당 *경로 처리*로 즉시 이동하여 테스트와 구현 간을 빠르게 오갈 수 있습니다. +- **FastAPI Cloud에 배포** - [FastAPI Cloud](https://fastapicloud.com/)로 원클릭 배포를 지원합니다. +- **애플리케이션 로그 스트리밍** - FastAPI Cloud에 배포된 애플리케이션의 로그를 실시간으로 스트리밍하며, 레벨 필터링과 텍스트 검색을 제공합니다. + +확장의 기능을 먼저 익혀보고 싶다면, 명령 팔레트(Ctrl + Shift + P, macOS: Cmd + Shift + P)를 열고 "Welcome: Open walkthrough..."를 선택한 뒤 "Get started with FastAPI" walkthrough를 선택해 보세요. diff --git a/docs/ko/docs/tutorial/server-sent-events.md b/docs/ko/docs/tutorial/server-sent-events.md new file mode 100644 index 0000000000..a8ae1180fa --- /dev/null +++ b/docs/ko/docs/tutorial/server-sent-events.md @@ -0,0 +1,120 @@ +# 서버 전송 이벤트(SSE) { #server-sent-events-sse } + +브라우저 클라이언트로 데이터를 스트리밍하려면 **Server-Sent Events**(SSE)를 사용할 수 있습니다. + +이는 [JSON Lines 스트리밍](stream-json-lines.md)과 비슷하지만, 브라우저가 기본적으로 [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource)를 통해 지원하는 `text/event-stream` 형식을 사용합니다. + +/// info | 정보 + +FastAPI 0.135.0에 추가되었습니다. + +/// + +## Server-Sent Events란 { #what-are-server-sent-events } + +SSE는 서버에서 클라이언트로 HTTP를 통해 데이터를 스트리밍하기 위한 표준입니다. + +각 이벤트는 `data`, `event`, `id`, `retry`와 같은 "필드"를 가진 작은 텍스트 블록이며, 빈 줄로 구분됩니다. + +다음과 같습니다: + +``` +data: {"name": "Portal Gun", "price": 999.99} + +data: {"name": "Plumbus", "price": 32.99} + +``` + +SSE는 AI 채팅 스트리밍, 실시간 알림, 로그와 관측성, 그리고 서버가 클라이언트로 업데이트를 푸시하는 여러 경우에 흔히 사용됩니다. + +/// tip | 팁 + +비디오나 오디오처럼 바이너리 데이터를 스트리밍하려면 고급 가이드: [데이터 스트리밍](../advanced/stream-data.md)을 확인하세요. + +/// + +## FastAPI로 SSE 스트리밍 { #stream-sse-with-fastapi } + +FastAPI에서 SSE를 스트리밍하려면, 경로 처리 함수에서 `yield`를 사용하고 `response_class=EventSourceResponse`를 설정하세요. + +`EventSourceResponse`는 `fastapi.sse`에서 임포트합니다: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[4,22] *} + +각 `yield`된 항목은 JSON으로 인코딩되어 SSE 이벤트의 `data:` 필드로 전송됩니다. + +반환 타입을 `AsyncIterable[Item]`으로 선언하면 FastAPI가 이를 사용해 데이터를 Pydantic으로 **검증**, **문서화**, **직렬화**합니다. + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[10:12,23] *} + +/// tip | 팁 + +Pydantic이 **Rust** 쪽에서 직렬화하므로, 반환 타입을 선언하지 않았을 때보다 훨씬 더 높은 **성능**을 얻을 수 있습니다. + +/// + +### 비 async *경로 처리 함수* { #non-async-path-operation-functions } + +`async`가 없는 일반 `def` 함수도 사용할 수 있으며, 동일하게 `yield`를 사용할 수 있습니다. + +FastAPI가 이벤트 루프를 막지 않도록 올바르게 실행을 보장합니다. + +이 경우 함수가 async가 아니므로 적절한 반환 타입은 `Iterable[Item]`입니다: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[28:31] hl[29] *} + +### 반환 타입 없음 { #no-return-type } + +반환 타입을 생략할 수도 있습니다. FastAPI는 [`jsonable_encoder`](./encoder.md)를 사용해 데이터를 변환하고 전송합니다. + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[34:37] hl[35] *} + +## `ServerSentEvent` { #serversentevent } + +`event`, `id`, `retry`, `comment` 같은 SSE 필드를 설정해야 한다면, 일반 데이터 대신 `ServerSentEvent` 객체를 `yield`할 수 있습니다. + +`ServerSentEvent`는 `fastapi.sse`에서 임포트합니다: + +{* ../../docs_src/server_sent_events/tutorial002_py310.py hl[4,26] *} + +`data` 필드는 항상 JSON으로 인코딩됩니다. Pydantic 모델을 포함해 JSON으로 직렬화할 수 있는 값을 모두 전달할 수 있습니다. + +## 원시 데이터 { #raw-data } + +JSON 인코딩 없이 데이터를 보내야 한다면, `data` 대신 `raw_data`를 사용하세요. + +미리 포맷된 텍스트, 로그 라인, 또는 `[DONE]`과 같은 특수한 "센티널" 값을 보낼 때 유용합니다. + +{* ../../docs_src/server_sent_events/tutorial003_py310.py hl[17] *} + +/// note | 참고 + +`data`와 `raw_data`는 상호 배타적입니다. 각 `ServerSentEvent`에는 이 둘 중 하나만 설정할 수 있습니다. + +/// + +## `Last-Event-ID`로 재개하기 { #resuming-with-last-event-id } + +브라우저가 연결이 끊긴 후 재연결할 때, 마지막으로 받은 `id`를 `Last-Event-ID` 헤더에 담아 보냅니다. + +헤더 파라미터로 이를 읽어와 클라이언트가 중단한 지점부터 스트림을 재개할 수 있습니다: + +{* ../../docs_src/server_sent_events/tutorial004_py310.py hl[25,27,31] *} + +## POST로 SSE 사용하기 { #sse-with-post } + +SSE는 `GET`뿐만 아니라 **모든 HTTP 메서드**와 함께 동작합니다. + +이는 `POST`로 SSE를 스트리밍하는 [MCP](https://modelcontextprotocol.io) 같은 프로토콜에 유용합니다: + +{* ../../docs_src/server_sent_events/tutorial005_py310.py hl[14] *} + +## 기술 세부사항 { #technical-details } + +FastAPI는 일부 SSE 모범 사례를 기본으로 구현합니다. + +- 메시지가 없을 때는 15초마다 **"keep alive" `ping` 주석**을 보내 일부 프록시가 연결을 종료하지 않도록 합니다. [HTML 사양: Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes)에서 권장합니다. +- 스트림이 **캐시되지 않도록** `Cache-Control: no-cache` 헤더를 설정합니다. +- Nginx 같은 일부 프록시에서 **버퍼링을 방지**하기 위해 특수 헤더 `X-Accel-Buffering: no`를 설정합니다. + +여러분이 따로 할 일은 없습니다. 기본값으로 동작합니다. 🤓 diff --git a/docs/ko/docs/tutorial/stream-json-lines.md b/docs/ko/docs/tutorial/stream-json-lines.md new file mode 100644 index 0000000000..816338d7e3 --- /dev/null +++ b/docs/ko/docs/tutorial/stream-json-lines.md @@ -0,0 +1,111 @@ +# JSON Lines 스트리밍 { #stream-json-lines } + +연속된 데이터를 "**스트림**"으로 보내고 싶다면 **JSON Lines**를 사용할 수 있습니다. + +/// info + +FastAPI 0.134.0에 추가되었습니다. + +/// + +## 스트림이란 { #what-is-a-stream } + +데이터를 "**스트리밍**"한다는 것은 애플리케이션이 전체 항목 시퀀스가 모두 준비될 때까지 기다리지 않고 클라이언트로 데이터 항목을 보내기 시작한다는 뜻입니다. + +즉, 첫 번째 항목을 보내면 클라이언트는 그것을 받아 처리하기 시작하고, 그동안 애플리케이션은 다음 항목을 계속 생성할 수 있습니다. + +```mermaid +sequenceDiagram + participant App + participant Client + + App->>App: Produce Item 1 + App->>Client: Send Item 1 + App->>App: Produce Item 2 + Client->>Client: Process Item 1 + App->>Client: Send Item 2 + App->>App: Produce Item 3 + Client->>Client: Process Item 2 + App->>Client: Send Item 3 + Client->>Client: Process Item 3 + Note over App: Keeps producing... + Note over Client: Keeps consuming... +``` + +데이터를 계속 보내는 무한 스트림일 수도 있습니다. + +## JSON Lines { #json-lines } + +이런 경우에는 한 줄에 하나의 JSON 객체를 보내는 형식인 "**JSON Lines**"를 사용하는 것이 일반적입니다. + +응답의 콘텐츠 타입은 `application/json` 대신 `application/jsonl`이고, 본문은 다음과 같습니다: + +```json +{"name": "Plumbus", "description": "A multi-purpose household device."} +{"name": "Portal Gun", "description": "A portal opening device."} +{"name": "Meeseeks Box", "description": "A box that summons a Meeseeks."} +``` + +JSON 배열(Python의 list에 해당)과 매우 비슷하지만, 항목들을 `[]`로 감싸고 항목 사이에 `,`를 넣는 대신, 줄마다 하나의 JSON 객체가 있고, 새 줄 문자로 구분됩니다. + +/// info + +핵심은 애플리케이션이 각 줄을 차례로 생성하는 동안, 클라이언트는 이전 줄을 소비할 수 있다는 점입니다. + +/// + +/// note | 기술 세부사항 + +각 JSON 객체는 새 줄로 구분되므로, 내용에 실제 줄바꿈 문자를 포함할 수는 없습니다. 하지만 JSON 표준의 일부인 이스케이프된 줄바꿈(`\n`)은 포함할 수 있습니다. + +보통은 신경 쓸 필요가 없습니다. 자동으로 처리되니 계속 읽어 주세요. 🤓 + +/// + +## 사용 예 { #use-cases } + +이 방법을 사용해 **AI LLM** 서비스, **로그** 또는 **telemetry**에서 오는 데이터, 혹은 **JSON** 항목으로 구조화할 수 있는 다른 유형의 데이터를 스트리밍할 수 있습니다. + +/// tip + +비디오나 오디오처럼 바이너리 데이터를 스트리밍하려면 고급 가이드를 확인하세요: [스트림 데이터](../advanced/stream-data.md). + +/// + +## FastAPI로 JSON Lines 스트리밍 { #stream-json-lines-with-fastapi } + +FastAPI에서 JSON Lines를 스트리밍하려면, *경로 처리 함수*에서 `return`을 사용하는 대신 `yield`로 각 항목을 차례로 생성하면 됩니다. + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[24] *} + +보내려는 각 JSON 항목의 타입이 `Item`(Pydantic 모델)이고 함수가 async라면, 반환 타입을 `AsyncIterable[Item]`로 선언할 수 있습니다: + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[9:11,22] *} + +반환 타입을 선언하면 FastAPI가 이를 사용해 데이터를 **검증**하고, OpenAPI에 **문서화**하고, **필터링**하고, Pydantic으로 **직렬화**합니다. + +/// tip + +Pydantic이 **Rust** 측에서 직렬화하므로, 반환 타입을 선언하지 않았을 때보다 훨씬 높은 **성능**을 얻게 됩니다. + +/// + +### 비동기 아님 *경로 처리 함수* { #non-async-path-operation-functions } + +일반 `def` 함수(`async` 없이)도 사용할 수 있으며, 동일하게 `yield`를 사용할 수 있습니다. + +FastAPI가 이벤트 루프를 막지 않도록 올바르게 실행되게 보장합니다. + +이 경우 함수가 async가 아니므로, 올바른 반환 타입은 `Iterable[Item]`입니다: + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[27:30] hl[28] *} + +### 반환 타입 생략 { #no-return-type } + +반환 타입을 생략할 수도 있습니다. 그러면 FastAPI가 [`jsonable_encoder`](./encoder.md)를 사용해 데이터를 JSON으로 직렬화 가능한 형태로 변환한 뒤 JSON Lines로 전송합니다. + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[33:36] hl[34] *} + +## 서버 전송 이벤트(SSE) { #server-sent-events-sse } + +FastAPI는 Server-Sent Events(SSE)도 일급으로 지원합니다. 매우 비슷하지만 몇 가지 추가 세부사항이 있습니다. 다음 장에서 자세히 알아보세요: [Server-Sent Events (SSE)](server-sent-events.md). 🤓 diff --git a/docs/pt/docs/_llm-test.md b/docs/pt/docs/_llm-test.md index 9f03c4b886..d5df9dd8bf 100644 --- a/docs/pt/docs/_llm-test.md +++ b/docs/pt/docs/_llm-test.md @@ -11,7 +11,7 @@ Use da seguinte forma: * Verifique se está tudo certo na tradução. * Se necessário, melhore seu prompt específico do idioma, o prompt geral ou o documento em inglês. * Em seguida, corrija manualmente os problemas restantes na tradução, para que fique uma boa tradução. -* Retraduzir, tendo a boa tradução no lugar. O resultado ideal seria que o LLM não fizesse mais mudanças na tradução. Isso significa que o prompt geral e o seu prompt específico do idioma estão tão bons quanto possível (às vezes fará algumas mudanças aparentemente aleatórias, a razão é que LLMs não são algoritmos determinísticos). +* Retraduzir, tendo a boa tradução no lugar. O resultado ideal seria que o LLM não fizesse mais mudanças na tradução. Isso significa que o prompt geral e o seu prompt específico do idioma estão tão bons quanto possível (às vezes fará algumas mudanças aparentemente aleatórias, a razão é que [LLMs não são algoritmos determinísticos](https://doublespeak.chat/#/handbook#deterministic-output)). Os testes: @@ -169,15 +169,15 @@ Veja as seções `### Special blocks` e `### Tab blocks` no prompt geral em `scr O texto do link deve ser traduzido, o endereço do link deve permanecer inalterado: * [Link para o título acima](#code-snippets) -* [Link interno](index.md#installation){.internal-link target=_blank} -* Link externo -* Link para um estilo -* Link para um script -* Link para uma imagem +* [Link interno](index.md#installation) +* [Link externo](https://sqlmodel.tiangolo.com/) +* [Link para um estilo](https://fastapi.tiangolo.com/css/styles.css) +* [Link para um script](https://fastapi.tiangolo.com/js/logic.js) +* [Link para uma imagem](https://fastapi.tiangolo.com/img/foo.jpg) O texto do link deve ser traduzido, o endereço do link deve apontar para a tradução: -* Link do FastAPI +* [Link do FastAPI](https://fastapi.tiangolo.com/pt/) //// diff --git a/docs/pt/docs/advanced/additional-responses.md b/docs/pt/docs/advanced/additional-responses.md index 2e277ac104..1df4b98519 100644 --- a/docs/pt/docs/advanced/additional-responses.md +++ b/docs/pt/docs/advanced/additional-responses.md @@ -199,7 +199,7 @@ Você pode declarar um `response_model`, utilizando o código de status padrão O **FastAPI** manterá as informações adicionais do `responses`, e combinará com o esquema JSON do seu modelo. -Por exemplo, você pode declarar um retorno com o código de status `404` que utiliza um modelo do Pydantic que possui um `description` customizado. +Por exemplo, você pode declarar um retorno com o código de status `404` que utiliza um modelo do Pydantic e tem uma `description` customizada. E um retorno com o código de status `200` que utiliza o seu `response_model`, porém inclui um `example` customizado: @@ -243,5 +243,5 @@ Por exemplo: Para verificar exatamente o que você pode incluir nos retornos, você pode conferir estas seções na especificação do OpenAPI: -* Objeto de Retornos do OpenAPI, inclui o `Response Object`. -* Objeto de Retorno do OpenAPI, você pode incluir qualquer coisa dele diretamente em cada retorno dentro do seu parâmetro `responses`. Incluindo `description`, `headers`, `content` (dentro dele que você declara diferentes media types e esquemas JSON), e `links`. +* [Objeto de Retornos do OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#responses-object), inclui o `Response Object`. +* [Objeto de Retorno do OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#response-object), você pode incluir qualquer coisa dele diretamente em cada retorno dentro do seu parâmetro `responses`. Incluindo `description`, `headers`, `content` (dentro dele que você declara diferentes media types e esquemas JSON), e `links`. diff --git a/docs/pt/docs/advanced/additional-status-codes.md b/docs/pt/docs/advanced/additional-status-codes.md index fd90b1795d..af1cefaf2b 100644 --- a/docs/pt/docs/advanced/additional-status-codes.md +++ b/docs/pt/docs/advanced/additional-status-codes.md @@ -38,4 +38,4 @@ O **FastAPI** disponibiliza o `starlette.responses` como `fastapi.responses` ape 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. -Mas você pode documentar isso no seu código, utilizando: [Retornos Adicionais](additional-responses.md){.internal-link target=_blank}. +Mas você pode documentar isso no seu código, utilizando: [Retornos Adicionais](additional-responses.md). diff --git a/docs/pt/docs/advanced/advanced-dependencies.md b/docs/pt/docs/advanced/advanced-dependencies.md index 419a092c80..dbcf993904 100644 --- a/docs/pt/docs/advanced/advanced-dependencies.md +++ b/docs/pt/docs/advanced/advanced-dependencies.md @@ -132,7 +132,7 @@ Se você tiver esse caso específico usando SQLModel (ou SQLAlchemy), você pode Dessa forma a sessão liberaria a conexão com o banco de dados, para que outras requisições pudessem usá-la. -Se você tiver um caso diferente que precise sair antecipadamente de uma dependência com `yield`, por favor crie uma Pergunta no GitHub Discussions com o seu caso específico e por que você se beneficiaria de ter o fechamento antecipado para dependências com `yield`. +Se você tiver um caso diferente que precise sair antecipadamente de uma dependência com `yield`, por favor crie uma [Pergunta no GitHub Discussions](https://github.com/fastapi/fastapi/discussions/new?category=questions) com o seu caso específico e por que você se beneficiaria de ter o fechamento antecipado para dependências com `yield`. Se houver casos de uso convincentes para fechamento antecipado em dependências com `yield`, considerarei adicionar uma nova forma de optar por esse fechamento antecipado. @@ -144,7 +144,7 @@ Isso foi alterado na versão 0.110.0 para corrigir consumo de memória não trat ### Tarefas em Segundo Plano e Dependências com `yield`, Detalhes Técnicos { #background-tasks-and-dependencies-with-yield-technical-details } -Antes do FastAPI 0.106.0, lançar exceções após o `yield` não era possível, o código de saída em dependências com `yield` era executado depois que a resposta era enviada, então [Tratadores de Exceções](../tutorial/handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank} já teriam sido executados. +Antes do FastAPI 0.106.0, lançar exceções após o `yield` não era possível, o código de saída em dependências com `yield` era executado depois que a resposta era enviada, então [Tratadores de Exceções](../tutorial/handling-errors.md#install-custom-exception-handlers) já teriam sido executados. Isso foi projetado assim principalmente para permitir o uso dos mesmos objetos "yielded" por dependências dentro de tarefas em segundo plano, porque o código de saída seria executado depois que as tarefas em segundo plano fossem concluídas. diff --git a/docs/pt/docs/advanced/async-tests.md b/docs/pt/docs/advanced/async-tests.md index 2fe678adb9..9dfadc32a1 100644 --- a/docs/pt/docs/advanced/async-tests.md +++ b/docs/pt/docs/advanced/async-tests.md @@ -16,11 +16,11 @@ Mesmo que a sua aplicação **FastAPI** utilize funções normais com `def` no l O `TestClient` faz algumas mágicas para invocar a aplicação FastAPI assíncrona em suas funções `def` normais, utilizando o pytest padrão. Porém a mágica não acontece mais quando nós estamos utilizando dentro de funções assíncronas. Ao executar os nossos testes de forma assíncrona, nós não podemos mais utilizar o `TestClient` dentro das nossas funções de teste. -O `TestClient` é baseado no HTTPX, e felizmente nós podemos utilizá-lo diretamente para testar a API. +O `TestClient` é baseado no [HTTPX](https://www.python-httpx.org), e felizmente nós podemos utilizá-lo diretamente para testar a API. ## Exemplo { #example } -Para um exemplos simples, vamos considerar uma estrutura de arquivos semelhante ao descrito em [Bigger Applications](../tutorial/bigger-applications.md){.internal-link target=_blank} e [Testing](../tutorial/testing.md){.internal-link target=_blank}: +Para um exemplos simples, vamos considerar uma estrutura de arquivos semelhante ao descrito em [Aplicações Maiores](../tutorial/bigger-applications.md) e [Testes](../tutorial/testing.md): ``` . @@ -84,7 +84,7 @@ Note que nós estamos utilizando async/await com o novo `AsyncClient` - a requis /// warning | Atenção -Se a sua aplicação depende de eventos de lifespan, o `AsyncClient` não acionará estes eventos. Para garantir que eles são acionados, utilize o `LifespanManager` do florimondmanca/asgi-lifespan. +Se a sua aplicação depende de eventos de lifespan, o `AsyncClient` não acionará estes eventos. Para garantir que eles são acionados, utilize o `LifespanManager` do [florimondmanca/asgi-lifespan](https://github.com/florimondmanca/asgi-lifespan#usage). /// @@ -94,6 +94,6 @@ Como a função de teste agora é assíncrona, você pode chamar (e `await`) out /// tip | Dica -Se você se deparar com um `RuntimeError: Task attached to a different loop` ao integrar funções assíncronas em seus testes (e.g. ao utilizar o MotorClient do MongoDB) Lembre-se de instanciar objetos que precisam de um loop de eventos (*event loop*) apenas em funções assíncronas, e.g. um callback `@app.on_event("startup")`. +Se você se deparar com um `RuntimeError: Task attached to a different loop` ao integrar funções assíncronas em seus testes (e.g. ao utilizar o [MotorClient do MongoDB](https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop)) Lembre-se de instanciar objetos que precisam de um loop de eventos (*event loop*) apenas em funções assíncronas, e.g. um callback `@app.on_event("startup")`. /// diff --git a/docs/pt/docs/advanced/behind-a-proxy.md b/docs/pt/docs/advanced/behind-a-proxy.md index 1581415156..4dcdcc9d05 100644 --- a/docs/pt/docs/advanced/behind-a-proxy.md +++ b/docs/pt/docs/advanced/behind-a-proxy.md @@ -16,9 +16,9 @@ Mas, por segurança, como o servidor não sabe que está atrás de um proxy conf Os headers do proxy são: -* X-Forwarded-For -* X-Forwarded-Proto -* X-Forwarded-Host +* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For) +* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto) +* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host) /// @@ -60,7 +60,7 @@ https://mysuperapp.com/items/ /// tip | Dica -Se você quiser saber mais sobre HTTPS, confira o tutorial [Sobre HTTPS](../deployment/https.md){.internal-link target=_blank}. +Se você quiser saber mais sobre HTTPS, confira o tutorial [Sobre HTTPS](../deployment/https.md). /// @@ -228,7 +228,7 @@ Passar o `root_path` para `FastAPI` seria o equivalente a passar a opção de li Tenha em mente que o servidor (Uvicorn) não usará esse `root_path` para nada além de passá-lo para a aplicação. -Mas se você acessar com seu navegador http://127.0.0.1:8000/app você verá a resposta normal: +Mas se você acessar com seu navegador [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app) você verá a resposta normal: ```JSON { @@ -251,9 +251,9 @@ Em um caso como esse (sem um prefixo de path removido), o proxy escutaria em alg ## Testando localmente com Traefik { #testing-locally-with-traefik } -Você pode facilmente executar o experimento localmente com um prefixo de path removido usando Traefik. +Você pode facilmente executar o experimento localmente com um prefixo de path removido usando [Traefik](https://docs.traefik.io/). -Faça o download do Traefik, ele é um único binário, você pode extrair o arquivo compactado e executá-lo diretamente do terminal. +[Faça o download do Traefik](https://github.com/containous/traefik/releases), ele é um único binário, você pode extrair o arquivo compactado e executá-lo diretamente do terminal. Então, crie um arquivo `traefik.toml` com: @@ -330,7 +330,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 ### Verifique as respostas { #check-the-responses } -Agora, se você for ao URL com a porta para o Uvicorn: http://127.0.0.1:8000/app, você verá a resposta normal: +Agora, se você for ao URL com a porta para o Uvicorn: [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app), você verá a resposta normal: ```JSON { @@ -345,7 +345,7 @@ Perceba que, mesmo acessando em `http://127.0.0.1:8000/app`, ele mostra o `root_ /// -E agora abra o URL com a porta para o Traefik, incluindo o prefixo de path: http://127.0.0.1:9999/api/v1/app. +E agora abra o URL com a porta para o Traefik, incluindo o prefixo de path: [http://127.0.0.1:9999/api/v1/app](http://127.0.0.1:9999/api/v1/app). Obtemos a mesma resposta: @@ -370,13 +370,13 @@ Mas aqui está a parte divertida. ✨ A maneira "oficial" de acessar a aplicação seria através do proxy com o prefixo de path que definimos. Então, como esperaríamos, se você tentar a interface de documentação servida diretamente pelo Uvicorn, sem o prefixo de path no URL, ela não funcionará, porque espera ser acessada através do proxy. -Você pode verificar em http://127.0.0.1:8000/docs: +Você pode verificar em [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs): Mas se acessarmos a interface de documentação no URL "oficial" usando o proxy com a porta `9999`, em `/api/v1/docs`, ela funciona corretamente! 🎉 -Você pode verificar em http://127.0.0.1:9999/api/v1/docs: +Você pode verificar em [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs): @@ -433,7 +433,7 @@ Perceba o servidor gerado automaticamente com um valor `url` de `/api/v1`, retir /// -Na interface de documentação em http://127.0.0.1:9999/api/v1/docs parecerá: +Na interface de documentação em [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs) parecerá: @@ -461,6 +461,6 @@ e então ele não será incluído no OpenAPI schema. ## Montando uma sub-aplicação { #mounting-a-sub-application } -Se você precisar montar uma sub-aplicação (como descrito em [Sub-aplicações - Montagens](sub-applications.md){.internal-link target=_blank}) enquanto também usa um proxy com `root_path`, você pode fazer isso normalmente, como esperaria. +Se você precisar montar uma sub-aplicação (como descrito em [Sub-aplicações - Montagens](sub-applications.md)) enquanto também usa um proxy com `root_path`, você pode fazer isso normalmente, como esperaria. O FastAPI usará internamente o `root_path` de forma inteligente, então tudo funcionará. ✨ diff --git a/docs/pt/docs/advanced/custom-response.md b/docs/pt/docs/advanced/custom-response.md index a409f1dc85..a360bd3c9b 100644 --- a/docs/pt/docs/advanced/custom-response.md +++ b/docs/pt/docs/advanced/custom-response.md @@ -1,58 +1,42 @@ # Resposta Personalizada - HTML, Stream, File e outras { #custom-response-html-stream-file-others } -Por padrão, o **FastAPI** irá retornar respostas utilizando `JSONResponse`. +Por padrão, o **FastAPI** retornará respostas JSON. -Mas você pode sobrescrever esse comportamento utilizando `Response` diretamente, como visto em [Retornando uma Resposta Diretamente](response-directly.md){.internal-link target=_blank}. +Você pode sobrescrever isso retornando uma `Response` diretamente, como visto em [Retornando uma Resposta Diretamente](response-directly.md). -Mas se você retornar uma `Response` diretamente (ou qualquer subclasse, como `JSONResponse`), os dados não serão convertidos automaticamente (mesmo que você declare um `response_model`), e a documentação não será gerada automaticamente (por exemplo, incluindo o "media type", no cabeçalho HTTP `Content-Type` como parte do esquema OpenAPI gerado). +Mas se você retornar uma `Response` diretamente (ou qualquer subclasse, como `JSONResponse`), os dados não serão convertidos automaticamente (mesmo que você declare um `response_model`), e a documentação não será gerada automaticamente (por exemplo, incluindo o "media type" específico, no cabeçalho HTTP `Content-Type` como parte do OpenAPI gerado). -Mas você também pode declarar a `Response` que você deseja utilizar (e.g. qualquer subclasse de `Response`), em um *decorador de operação de rota* utilizando o parâmetro `response_class`. +Mas você também pode declarar a `Response` que deseja utilizar (e.g. qualquer subclasse de `Response`), no *decorador de operação de rota* usando o parâmetro `response_class`. -Os conteúdos que você retorna em sua *função de operação de rota* serão colocados dentro dessa `Response`. - -E se a `Response` tiver um media type JSON (`application/json`), como é o caso com `JSONResponse` e `UJSONResponse`, os dados que você retornar serão automaticamente convertidos (e filtrados) com qualquer `response_model` do Pydantic que for declarado no decorador de operação de rota. +O conteúdo que você retorna da sua *função de operação de rota* será colocado dentro dessa `Response`. /// note | Nota -Se você utilizar uma classe de Resposta sem media type, o FastAPI esperará que sua resposta não tenha conteúdo, então ele não irá documentar o formato da resposta na documentação OpenAPI gerada. +Se você utilizar uma classe de resposta sem media type, o FastAPI esperará que sua resposta não tenha conteúdo, então ele não irá documentar o formato da resposta na documentação OpenAPI gerada. /// -## Utilizando `ORJSONResponse` { #use-orjsonresponse } - -Por exemplo, se você precisa bastante de performance, você pode instalar e utilizar o `orjson` e definir a resposta para ser uma `ORJSONResponse`. - -Importe a classe, ou subclasse, de `Response` que você deseja utilizar e declare ela no *decorador de operação de rota*. - -Para respostas grandes, retornar uma `Response` diretamente é muito mais rápido que retornar um dicionário. - -Isso ocorre por que, por padrão, o FastAPI irá verificar cada item dentro do dicionário e garantir que ele seja serializável para JSON, utilizando o mesmo[Codificador Compatível com JSON](../tutorial/encoder.md){.internal-link target=_blank} explicado no tutorial. Isso permite que você retorne **objetos abstratos**, como modelos do banco de dados, por exemplo. - -Mas se você tem certeza que o conteúdo que você está retornando é **serializável com JSON**, você pode passá-lo diretamente para a classe de resposta e evitar o trabalho extra que o FastAPI teria ao passar o conteúdo pelo `jsonable_encoder` antes de passar para a classe de resposta. +## Respostas JSON { #json-responses } -{* ../../docs_src/custom_response/tutorial001b_py310.py hl[2,7] *} +Por padrão, o FastAPI retorna respostas JSON. -/// info | Informação - -O parâmetro `response_class` também será usado para definir o "media type" da resposta. +Se você declarar um [Modelo de Resposta](../tutorial/response-model.md), o FastAPI irá usá-lo para serializar os dados para JSON, usando Pydantic. -Neste caso, o cabeçalho HTTP `Content-Type` irá ser definido como `application/json`. +Se você não declarar um modelo de resposta, o FastAPI usará o `jsonable_encoder` explicado em [Codificador Compatível com JSON](../tutorial/encoder.md) e o colocará em uma `JSONResponse`. -E será documentado como tal no OpenAPI. +Se você declarar uma `response_class` com um media type JSON (`application/json`), como no caso de `JSONResponse`, os dados que você retorna serão automaticamente convertidos (e filtrados) com qualquer `response_model` do Pydantic que você declarou no *decorador de operação de rota*. Mas os dados não serão serializados para bytes JSON com Pydantic; em vez disso, serão convertidos com o `jsonable_encoder` e então passados para a classe `JSONResponse`, que fará a serialização para bytes usando a biblioteca padrão de JSON do Python. -/// +### Performance com JSON { #json-performance } -/// tip | Dica +Resumindo, se você quer o máximo de performance, use um [Modelo de Resposta](../tutorial/response-model.md) e não declare uma `response_class` no *decorador de operação de rota*. -A `ORJSONResponse` está disponível apenas no FastAPI, e não no Starlette. - -/// +{* ../../docs_src/response_model/tutorial001_01_py310.py ln[15:17] hl[16] *} ## Resposta HTML { #html-response } Para retornar uma resposta com HTML diretamente do **FastAPI**, utilize `HTMLResponse`. -* Importe `HTMLResponse` +* Importe `HTMLResponse`. * Passe `HTMLResponse` como o parâmetro de `response_class` do seu *decorador de operação de rota*. {* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *} @@ -69,7 +53,7 @@ E será documentado como tal no OpenAPI. ### Retornando uma `Response` { #return-a-response } -Como visto em [Retornando uma Resposta Diretamente](response-directly.md){.internal-link target=_blank}, você também pode sobrescrever a resposta diretamente na sua *operação de rota*, ao retornar ela. +Como visto em [Retornando uma Resposta Diretamente](response-directly.md), você também pode sobrescrever a resposta diretamente na sua *operação de rota*, ao retornar ela. O mesmo exemplo de antes, retornando uma `HTMLResponse`, poderia parecer com: @@ -103,13 +87,13 @@ Neste exemplo, a função `generate_html_response()` já cria e retorna uma `Res Ao retornar o resultado chamando `generate_html_response()`, você já está retornando uma `Response` que irá sobrescrever o comportamento padrão do **FastAPI**. -Mas se você passasse uma `HTMLResponse` em `response_class` também, o **FastAPI** saberia como documentar isso no OpenAPI e na documentação interativa como um HTML com `text/html`: +Mas como você passou `HTMLResponse` em `response_class` também, o **FastAPI** saberá como documentar isso no OpenAPI e na documentação interativa como um HTML com `text/html`: ## Respostas disponíveis { #available-responses } -Aqui estão algumas dos tipos de resposta disponíveis. +Aqui estão algumas das respostas disponíveis. Lembre-se que você pode utilizar `Response` para retornar qualquer outra coisa, ou até mesmo criar uma subclasse personalizada. @@ -129,9 +113,9 @@ Você pode retorná-la diretamente. Ela aceita os seguintes parâmetros: -* `content` - Uma sequência de caracteres (`str`) ou `bytes`. +* `content` - Uma `str` ou `bytes`. * `status_code` - Um código de status HTTP do tipo `int`. -* `headers` - Um dicionário `dict` de strings. +* `headers` - Um `dict` de strings. * `media_type` - Uma `str` informando o media type. E.g. `"text/html"`. O FastAPI (Starlette, na verdade) irá incluir o cabeçalho Content-Length automaticamente. Ele também irá incluir o cabeçalho Content-Type, baseado no `media_type` e acrescentando uma codificação para tipos textuais. @@ -154,37 +138,11 @@ Pega alguns dados e retorna uma resposta com codificação `application/json`. É a resposta padrão utilizada no **FastAPI**, como você leu acima. -### `ORJSONResponse` { #orjsonresponse } - -Uma alternativa mais rápida de resposta JSON utilizando o `orjson`, como você leu acima. - -/// info | Informação - -Essa resposta requer a instalação do pacote `orjson`, com o comando `pip install orjson`, por exemplo. - -/// - -### `UJSONResponse` { #ujsonresponse } - -Uma alternativa de resposta JSON utilizando a biblioteca `ujson`. - -/// info | Informação - -Essa resposta requer a instalação do pacote `ujson`, com o comando `pip install ujson`, por exemplo. - -/// - -/// warning | Atenção - -`ujson` é menos cauteloso que a implementação nativa do Python na forma que os casos especiais são tratados - -/// - -{* ../../docs_src/custom_response/tutorial001_py310.py hl[2,7] *} +/// note | Detalhes Técnicos -/// tip | Dica +Mas se você declarar um modelo de resposta ou tipo de retorno, isso será usado diretamente para serializar os dados para JSON, e uma resposta com o media type correto para JSON será retornada diretamente, sem usar a classe `JSONResponse`. -É possível que `ORJSONResponse` seja uma alternativa mais rápida. +Esta é a forma ideal para obter a melhor performance. /// @@ -202,9 +160,9 @@ Ou você pode utilizá-la no parâmetro `response_class`: {* ../../docs_src/custom_response/tutorial006b_py310.py hl[2,7,9] *} -Se você fizer isso, então você pode retornar a URL diretamente da sua *função de operação de rota* +Se você fizer isso, então você pode retornar a URL diretamente da sua *função de operação de rota*. -Neste caso, o `status_code` utilizada será o padrão de `RedirectResponse`, que é `307`. +Neste caso, o `status_code` utilizado será o padrão de `RedirectResponse`, que é `307`. --- @@ -214,46 +172,40 @@ Você também pode utilizar o parâmetro `status_code` combinado com o parâmetr ### `StreamingResponse` { #streamingresponse } -Recebe um gerador assíncrono ou um gerador/iterador comum e retorna o corpo da resposta de forma contínua (stream). - -{* ../../docs_src/custom_response/tutorial007_py310.py hl[2,14] *} - -#### Utilizando `StreamingResponse` com objetos semelhantes a arquivos { #using-streamingresponse-with-file-like-objects } +Recebe um gerador assíncrono ou um gerador/iterador comum (uma função com `yield`) e transmite (stream) o corpo da resposta. -Se você tiver um objeto semelhante a um arquivo (e.g. o objeto retornado por `open()`), você pode criar uma função geradora para iterar sobre esse objeto. +{* ../../docs_src/custom_response/tutorial007_py310.py hl[3,16] *} -Dessa forma, você não precisa ler todo o arquivo na memória primeiro, e você pode passar essa função geradora para `StreamingResponse` e retorná-la. - -Isso inclui muitas bibliotecas que interagem com armazenamento em nuvem, processamento de vídeos, entre outras. +/// note | Detalhes Técnicos -{* ../../docs_src/custom_response/tutorial008_py310.py hl[2,10:12,14] *} +Uma tarefa `async` só pode ser cancelada quando alcança um `await`. Se não houver `await`, o gerador (função com `yield`) não pode ser cancelado adequadamente e pode continuar executando mesmo após o cancelamento ser solicitado. -1. Essa é a função geradora. É definida como "função geradora" porque contém declarações `yield` nela. -2. Ao utilizar o bloco `with`, nós garantimos que o objeto semelhante a um arquivo é fechado após a função geradora ser finalizada. Isto é, após a resposta terminar de ser enviada. -3. Essa declaração `yield from` informa a função para iterar sobre essa coisa nomeada de `file_like`. E então, para cada parte iterada, fornece essa parte como se viesse dessa função geradora (`iterfile`). +Como este pequeno exemplo não precisa de nenhuma instrução `await`, adicionamos um `await anyio.sleep(0)` para dar ao event loop a chance de lidar com o cancelamento. - Então, é uma função geradora que transfere o trabalho de "geração" para alguma outra coisa interna. +Isso seria ainda mais importante com streams grandes ou infinitos. - Fazendo dessa forma, podemos colocá-la em um bloco `with`, e assim garantir que o objeto semelhante a um arquivo é fechado quando a função termina. +/// /// tip | Dica -Perceba que aqui estamos utilizando o `open()` da biblioteca padrão que não suporta `async` e `await`, e declaramos a operação de rota com o `def` básico. +Em vez de retornar uma `StreamingResponse` diretamente, você deveria provavelmente seguir o estilo em [Transmitir Dados](./stream-data.md), é muito mais conveniente e lida com cancelamento nos bastidores para você. + +Se você estiver transmitindo JSON Lines, siga o tutorial [Transmitir JSON Lines](../tutorial/stream-json-lines.md). /// ### `FileResponse` { #fileresponse } -Envia um arquivo de forma assíncrona e contínua (stream). +Envia um arquivo de forma assíncrona e contínua (stream). Recebe um conjunto de argumentos do construtor diferente dos outros tipos de resposta: -* `path` - O caminho do arquivo que será transmitido -* `headers` - quaisquer cabeçalhos que serão incluídos, como um dicionário. -* `media_type` - Uma string com o media type. Se não for definida, o media type é inferido a partir do nome ou caminho do arquivo. -* `filename` - Se for definido, é incluído no cabeçalho `Content-Disposition`. +* `path` - O caminho do arquivo que será transmitido. +* `headers` - Quaisquer cabeçalhos personalizados a serem incluídos, como um dicionário. +* `media_type` - Uma string com o media type. Se não for definida, o nome do arquivo ou path será usado para inferir um media type. +* `filename` - Se definido, será incluído no cabeçalho `Content-Disposition`. -Respostas de Arquivos incluem o tamanho do arquivo, data da última modificação e ETags apropriados, nos cabeçalhos `Content-Length`, `Last-Modified` e `ETag`, respectivamente. +Respostas de arquivos incluirão os cabeçalhos apropriados `Content-Length`, `Last-Modified` e `ETag`. {* ../../docs_src/custom_response/tutorial009_py310.py hl[2,10] *} @@ -261,17 +213,17 @@ Você também pode usar o parâmetro `response_class`: {* ../../docs_src/custom_response/tutorial009b_py310.py hl[2,8,10] *} -Nesse caso, você pode retornar o caminho do arquivo diretamente da sua *função de operação de rota*. +Nesse caso, você pode retornar o path do arquivo diretamente da sua *função de operação de rota*. ## Classe de resposta personalizada { #custom-response-class } -Você pode criar sua própria classe de resposta, herdando de `Response` e usando essa nova classe. +Você pode criar sua própria classe de resposta personalizada, herdando de `Response` e usando-a. -Por exemplo, vamos supor que você queira utilizar o `orjson`, mas com algumas configurações personalizadas que não estão incluídas na classe `ORJSONResponse`. +Por exemplo, vamos supor que você queira usar [`orjson`](https://github.com/ijl/orjson) com algumas configurações. -Vamos supor também que você queira retornar um JSON indentado e formatado, então você quer utilizar a opção `orjson.OPT_INDENT_2` do orjson. +Vamos supor que você queira retornar um JSON indentado e formatado, então você quer utilizar a opção `orjson.OPT_INDENT_2` do orjson. -Você poderia criar uma classe `CustomORJSONResponse`. A principal coisa a ser feita é sobrecarregar o método render da classe Response, `Response.render(content)`, que retorna o conteúdo em bytes: +Você poderia criar uma `CustomORJSONResponse`. A principal coisa que você tem que fazer é criar um método `Response.render(content)` que retorne o conteúdo como `bytes`: {* ../../docs_src/custom_response/tutorial009c_py310.py hl[9:14,17] *} @@ -291,13 +243,21 @@ Agora em vez de retornar: Obviamente, você provavelmente vai encontrar maneiras muito melhores de se aproveitar disso do que a formatação de JSON. 😉 +### `orjson` ou Modelo de Resposta { #orjson-or-response-model } + +Se o que você procura é performance, provavelmente é melhor usar um [Modelo de Resposta](../tutorial/response-model.md) do que uma resposta com `orjson`. + +Com um modelo de resposta, o FastAPI usará o Pydantic para serializar os dados para JSON, sem passos intermediários, como convertê-los com `jsonable_encoder`, o que aconteceria em qualquer outro caso. + +E, por baixo dos panos, o Pydantic usa os mesmos mecanismos em Rust que o `orjson` para serializar para JSON, então você já terá a melhor performance com um modelo de resposta. + ## Classe de resposta padrão { #default-response-class } Quando você criar uma instância da classe **FastAPI** ou um `APIRouter` você pode especificar qual classe de resposta utilizar por padrão. -O padrão que define isso é o `default_response_class`. +O parâmetro que define isso é o `default_response_class`. -No exemplo abaixo, o **FastAPI** irá utilizar `ORJSONResponse` por padrão, em todas as *operações de rota*, em vez de `JSONResponse`. +No exemplo abaixo, o **FastAPI** utilizará `HTMLResponse` por padrão, em todas as *operações de rota*, em vez de JSON. {* ../../docs_src/custom_response/tutorial010_py310.py hl[2,4] *} @@ -309,4 +269,4 @@ Você ainda pode substituir `response_class` em *operações de rota* como antes ## Documentação adicional { #additional-documentation } -Você também pode declarar o media type e muitos outros detalhes no OpenAPI utilizando `responses`: [Retornos Adicionais no OpenAPI](additional-responses.md){.internal-link target=_blank}. +Você também pode declarar o media type e muitos outros detalhes no OpenAPI utilizando `responses`: [Respostas Adicionais no OpenAPI](additional-responses.md). diff --git a/docs/pt/docs/advanced/dataclasses.md b/docs/pt/docs/advanced/dataclasses.md index c2af6fac6d..9a1f212d64 100644 --- a/docs/pt/docs/advanced/dataclasses.md +++ b/docs/pt/docs/advanced/dataclasses.md @@ -2,11 +2,11 @@ FastAPI é construído em cima do **Pydantic**, e eu tenho mostrado como usar modelos Pydantic para declarar requisições e respostas. -Mas o FastAPI também suporta o uso de `dataclasses` da mesma forma: +Mas o FastAPI também suporta o uso de [`dataclasses`](https://docs.python.org/3/library/dataclasses.html) da mesma forma: {* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *} -Isso ainda é suportado graças ao **Pydantic**, pois ele tem suporte interno para `dataclasses`. +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. @@ -74,7 +74,7 @@ Nesse caso, você pode simplesmente trocar as `dataclasses` padrão por `pydanti Como sempre, no FastAPI você pode combinar `def` e `async def` conforme necessário. - Se você precisar de uma atualização sobre quando usar qual, confira a seção _"Com pressa?"_ na documentação sobre [`async` e `await`](../async.md#in-a-hurry){.internal-link target=_blank}. + Se você precisar de uma atualização sobre quando usar qual, confira a seção _"Com pressa?"_ na documentação sobre [`async` e `await`](../async.md#in-a-hurry). 9. Esta *função de operação de rota* não está retornando dataclasses (embora pudesse), mas uma lista de dicionários com dados internos. @@ -88,7 +88,7 @@ Confira as dicas de anotação no código acima para ver mais detalhes específi Você também pode combinar `dataclasses` com outros modelos Pydantic, herdar deles, incluí-los em seus próprios modelos, etc. -Para saber mais, confira a documentação do Pydantic sobre dataclasses. +Para saber mais, confira a [documentação do Pydantic sobre dataclasses](https://docs.pydantic.dev/latest/concepts/dataclasses/). ## Versão { #version } diff --git a/docs/pt/docs/advanced/events.md b/docs/pt/docs/advanced/events.md index 551053508d..7f15d833e6 100644 --- a/docs/pt/docs/advanced/events.md +++ b/docs/pt/docs/advanced/events.md @@ -150,11 +150,11 @@ Por causa disso, agora é recomendado usar o `lifespan`, como explicado acima. Apenas um detalhe técnico para nerds curiosos. 🤓 -Por baixo, na especificação técnica do ASGI, isso é parte do Protocolo Lifespan, e define eventos chamados `startup` e `shutdown`. +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 -Você pode ler mais sobre os manipuladores de `lifespan` do Starlette na Documentação do Lifespan do Starlette. +Você pode ler mais sobre os manipuladores de `lifespan` do Starlette na [Documentação do Lifespan do Starlette](https://www.starlette.dev/lifespan/). Incluindo como lidar com estado do lifespan que pode ser usado em outras áreas do seu código. @@ -162,4 +162,4 @@ Incluindo como lidar com estado do lifespan que pode ser usado em outras áreas ## Sub Aplicações { #sub-applications } -🚨 Tenha em mente que esses eventos de lifespan (inicialização e encerramento) serão executados apenas para a aplicação principal, não para [Sub Aplicações - Montagem](sub-applications.md){.internal-link target=_blank}. +🚨 Tenha em mente que esses eventos de lifespan (inicialização e encerramento) serão executados apenas para a aplicação principal, não para [Sub Aplicações - Montagem](sub-applications.md). diff --git a/docs/pt/docs/advanced/generate-clients.md b/docs/pt/docs/advanced/generate-clients.md index c6c7785a01..0d31a69af8 100644 --- a/docs/pt/docs/advanced/generate-clients.md +++ b/docs/pt/docs/advanced/generate-clients.md @@ -2,17 +2,17 @@ Como o **FastAPI** é baseado na especificação **OpenAPI**, suas APIs podem ser descritas em um formato padrão que muitas ferramentas entendem. -Isso facilita gerar **documentação** atualizada, bibliotecas clientes (**SDKs**) em várias linguagens e **testes** ou **fluxos de trabalho de automação** que permanecem em sincronia com o seu código. +Isso facilita gerar **documentação** atualizada, bibliotecas clientes (**SDKs**) em várias linguagens e **testes** ou **fluxos de trabalho de automação** que permanecem em sincronia com o seu código. Neste guia, você aprenderá como gerar um **SDK em TypeScript** para o seu backend FastAPI. ## Geradores de SDK de código aberto { #open-source-sdk-generators } -Uma opção versátil é o OpenAPI Generator, que suporta **muitas linguagens de programação** e pode gerar SDKs a partir da sua especificação OpenAPI. +Uma opção versátil é o [OpenAPI Generator](https://openapi-generator.tech/), que suporta **muitas linguagens de programação** e pode gerar SDKs a partir da sua especificação OpenAPI. -Para **clientes TypeScript**, o Hey API é uma solução feita sob medida, oferecendo uma experiência otimizada para o ecossistema TypeScript. +Para **clientes TypeScript**, o [Hey API](https://heyapi.dev/) é uma solução feita sob medida, oferecendo uma experiência otimizada para o ecossistema TypeScript. -Você pode descobrir mais geradores de SDK em OpenAPI.Tools. +Você pode descobrir mais geradores de SDK em [OpenAPI.Tools](https://openapi.tools/#sdk). /// tip | Dica @@ -24,15 +24,15 @@ O FastAPI gera automaticamente especificações **OpenAPI 3.1**, então qualquer 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){.internal-link target=_blank} ✨, essas empresas ajudam a garantir que o framework e seu **ecossistema** continuem saudáveis e **sustentáveis**. +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: -* Speakeasy -* Stainless -* liblab +* [Speakeasy](https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship) +* [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. 🤓 @@ -66,7 +66,7 @@ npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client Isso gerará um SDK TypeScript em `./src/client`. -Você pode aprender como instalar `@hey-api/openapi-ts` e ler sobre o resultado gerado no site deles. +Você pode aprender como [instalar `@hey-api/openapi-ts`](https://heyapi.dev/openapi-ts/get-started) e ler sobre o [resultado gerado](https://heyapi.dev/openapi-ts/output) no site deles. ### Usando o SDK { #using-the-sdk } diff --git a/docs/pt/docs/advanced/index.md b/docs/pt/docs/advanced/index.md index d2727be43f..bbb8b0b50b 100644 --- a/docs/pt/docs/advanced/index.md +++ b/docs/pt/docs/advanced/index.md @@ -2,7 +2,7 @@ ## Recursos Adicionais { #additional-features } -O [Tutorial - Guia de Usuário](../tutorial/index.md){.internal-link target=_blank} deve ser o suficiente para dar a você um tour por todos os principais recursos do **FastAPI**. +O [Tutorial - Guia de Usuário](../tutorial/index.md) principal deve ser o suficiente para dar a você um tour por todos os principais recursos do **FastAPI**. Nas próximas seções você verá outras opções, configurações, e recursos adicionais. @@ -16,6 +16,6 @@ E é possível que para seu caso de uso, a solução esteja em uma delas. ## Leia o Tutorial primeiro { #read-the-tutorial-first } -Você ainda pode usar a maior parte dos recursos no **FastAPI** com o conhecimento do [Tutorial - Guia de Usuário](../tutorial/index.md){.internal-link target=_blank}. +Você ainda pode usar a maior parte dos recursos no **FastAPI** com o conhecimento do [Tutorial - Guia de Usuário](../tutorial/index.md) principal. E as próximas seções assumem que você já leu ele, e que você conhece suas ideias principais. diff --git a/docs/pt/docs/advanced/json-base64-bytes.md b/docs/pt/docs/advanced/json-base64-bytes.md new file mode 100644 index 0000000000..cc956da4f0 --- /dev/null +++ b/docs/pt/docs/advanced/json-base64-bytes.md @@ -0,0 +1,63 @@ +# JSON com bytes em Base64 { #json-with-bytes-as-base64 } + +Se sua aplicação precisa receber e enviar dados JSON, mas você precisa incluir dados binários nele, você pode codificá-los em base64. + +## 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. + +JSON só pode conter strings codificadas em UTF-8, portanto não pode conter bytes puros. + +Base64 pode codificar dados binários em strings, mas, para isso, precisa usar mais caracteres do que os dados binários originais; assim, normalmente é menos eficiente do que arquivos comuns. + +Use base64 apenas se realmente precisar incluir dados binários em JSON e não puder usar arquivos para isso. + +## Pydantic `bytes` { #pydantic-bytes } + +Você pode declarar um modelo Pydantic com campos `bytes` e então usar `val_json_bytes` na configuração do modelo para indicar que deve usar base64 para *validar* os dados JSON de entrada; como parte dessa validação, ele decodificará a string base64 em bytes. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *} + +Se você verificar a `/docs`, verá que o campo `data` espera bytes codificados em base64: + +
+ +
+ +Você poderia enviar uma request assim: + +```json +{ + "description": "Some data", + "data": "aGVsbG8=" +} +``` + +/// tip | Dica + +`aGVsbG8=` é a codificação base64 de `hello`. + +/// + +Em seguida, o Pydantic decodificará a string base64 e fornecerá os bytes originais no campo `data` do modelo. + +Você receberá uma response assim: + +```json +{ + "description": "Some data", + "content": "hello" +} +``` + +## Pydantic `bytes` para dados de saída { #pydantic-bytes-for-output-data } + +Você também pode usar campos `bytes` com `ser_json_bytes` na configuração do modelo para dados de saída, e o Pydantic irá *serializar* os bytes como base64 ao gerar a response JSON. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *} + +## Pydantic `bytes` para dados de entrada e saída { #pydantic-bytes-for-input-and-output-data } + +E, claro, você pode usar o mesmo modelo configurado para usar base64 para lidar tanto com a entrada (*validar*) com `val_json_bytes` quanto com a saída (*serializar*) com `ser_json_bytes` ao receber e enviar dados JSON. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *} diff --git a/docs/pt/docs/advanced/middleware.md b/docs/pt/docs/advanced/middleware.md index 6bc4bfd2f0..1f269da5e3 100644 --- a/docs/pt/docs/advanced/middleware.md +++ b/docs/pt/docs/advanced/middleware.md @@ -1,8 +1,8 @@ # Middleware Avançado { #advanced-middleware } -No tutorial principal você leu como adicionar [Middleware Personalizado](../tutorial/middleware.md){.internal-link target=_blank} à sua aplicação. +No tutorial principal você leu como adicionar [Middleware Personalizado](../tutorial/middleware.md) à sua aplicação. -E então você também leu como lidar com [CORS com o `CORSMiddleware`](../tutorial/cors.md){.internal-link target=_blank}. +E então você também leu como lidar com [CORS com o `CORSMiddleware`](../tutorial/cors.md). Nesta seção, veremos como usar outros middlewares. @@ -67,7 +67,7 @@ Garante que todas as requisições recebidas tenham um cabeçalho `Host` correta Os seguintes argumentos são suportados: -* `allowed_hosts` - Uma lista de nomes de domínio que são permitidos como nomes de host. Domínios com coringa, como `*.example.com`, são suportados para corresponder a subdomínios. Para permitir qualquer nome de host, use `allowed_hosts=["*"]` ou omita o middleware. +* `allowed_hosts` - Uma lista de nomes de domínio que são permitidos como nomes de host. Domínios com curingas, como `*.example.com`, são suportados para corresponder a subdomínios. Para permitir qualquer nome de host, use `allowed_hosts=["*"]` ou omita o middleware. * `www_redirect` - Se definido como True, as requisições para versões sem www dos hosts permitidos serão redirecionadas para suas versões com www. O padrão é `True`. Se uma requisição recebida não for validada corretamente, uma resposta `400` será enviada. @@ -91,7 +91,7 @@ Há muitos outros middlewares ASGI. Por exemplo: -* `ProxyHeadersMiddleware` do Uvicorn -* MessagePack +* [`ProxyHeadersMiddleware` do Uvicorn](https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py) +* [MessagePack](https://github.com/florimondmanca/msgpack-asgi) -Para checar outros middlewares disponíveis, confira Documentação de Middlewares do Starlette e a Lista Incrível do ASGI. +Para checar outros middlewares disponíveis, confira [Documentação de Middlewares do Starlette](https://www.starlette.dev/middleware/) e a [Lista Incrível do ASGI](https://github.com/florimondmanca/awesome-asgi). diff --git a/docs/pt/docs/advanced/openapi-callbacks.md b/docs/pt/docs/advanced/openapi-callbacks.md index 653c26d99c..df9e7e0bf6 100644 --- a/docs/pt/docs/advanced/openapi-callbacks.md +++ b/docs/pt/docs/advanced/openapi-callbacks.md @@ -35,7 +35,7 @@ Essa parte é bastante normal, a maior parte do código provavelmente já é fam /// tip | Dica -O parâmetro de consulta `callback_url` usa um tipo Pydantic Url. +O parâmetro de consulta `callback_url` usa um tipo Pydantic [Url](https://docs.pydantic.dev/latest/api/networks/). /// @@ -66,7 +66,7 @@ Esse exemplo não implementa o callback em si (que poderia ser apenas uma linha O callback real é apenas um request HTTP. -Ao implementar o callback por conta própria, você pode usar algo como HTTPX ou Requests. +Ao implementar o callback por conta própria, você pode usar algo como [HTTPX](https://www.python-httpx.org) ou [Requests](https://requests.readthedocs.io/). /// @@ -106,11 +106,11 @@ 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`. -* O *path* pode conter uma expressão OpenAPI 3 (veja mais abaixo) em que pode usar variáveis com parâmetros e partes do request original enviado para *sua API*. +* 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 } -O *path* do callback pode ter uma expressão OpenAPI 3 que pode conter partes do request original enviado para *sua API*. +O *path* do callback pode ter uma [expressão OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) que pode conter partes do request original enviado para *sua API*. Nesse caso, é a `str`: @@ -179,7 +179,7 @@ Perceba que você não está passando o roteador em si (`invoices_callback_route ### Verifique a documentação { #check-the-docs } -Agora você pode iniciar seu aplicativo e ir para http://127.0.0.1:8000/docs. +Agora você pode iniciar seu aplicativo 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 ed0d702b2b..0c675089ca 100644 --- a/docs/pt/docs/advanced/openapi-webhooks.md +++ b/docs/pt/docs/advanced/openapi-webhooks.md @@ -16,7 +16,7 @@ E os **seus usuários** definem de alguma forma (em algum painel por exemplo) a Toda a **lógica** sobre como cadastrar as URLs para os webhooks e o código para enviar de fato as requisições cabe a você definir. Você escreve da maneira que você desejar no **seu próprio código**. -## Documentando webhooks com o FastAPI e OpenAPI { #documenting-webhooks-with-fastapi-and-openapi } +## Documentando webhooks com o **FastAPI** e OpenAPI { #documenting-webhooks-with-fastapi-and-openapi } Com o **FastAPI**, utilizando o OpenAPI, você pode definir os nomes destes webhooks, os tipos das operações HTTP que a sua aplicação pode enviar (e.g. `POST`, `PUT`, etc.) e os **corpos** da requisição que a sua aplicação enviaria. @@ -48,7 +48,7 @@ Isto porque espera-se que os **seus usuários** definam o verdadeiro **URL path* ### Confira a documentação { #check-the-docs } -Agora você pode iniciar a sua aplicação e ir até http://127.0.0.1:8000/docs. +Agora você pode iniciar a sua aplicação e ir até [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Você verá que a sua documentação possui as *operações de rota* normais e agora também possui alguns **webhooks**: diff --git a/docs/pt/docs/advanced/path-operation-advanced-configuration.md b/docs/pt/docs/advanced/path-operation-advanced-configuration.md index c4dd3cbe78..b9862876ca 100644 --- a/docs/pt/docs/advanced/path-operation-advanced-configuration.md +++ b/docs/pt/docs/advanced/path-operation-advanced-configuration.md @@ -60,7 +60,7 @@ Isso define os metadados sobre a resposta principal da *operação de rota*. Você também pode declarar respostas adicionais, com seus modelos, códigos de status, etc. -Existe um capítulo inteiro da nossa documentação sobre isso, você pode ler em [Retornos Adicionais no OpenAPI](additional-responses.md){.internal-link target=_blank}. +Existe um capítulo inteiro da nossa documentação sobre isso, você pode ler em [Respostas Adicionais no OpenAPI](additional-responses.md). ## Extras do OpenAPI { #openapi-extra } @@ -68,7 +68,7 @@ Quando você declara uma *operação de rota* na sua aplicação, o **FastAPI** /// note | Detalhes Técnicos -Na especificação do OpenAPI, isso é chamado de um Objeto de Operação. +Na especificação do OpenAPI, isso é chamado de um [Objeto de Operação](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operation-object). /// @@ -82,7 +82,7 @@ Esse esquema específico para uma *operação de rota* normalmente é gerado aut Esse é um ponto de extensão de baixo nível. -Caso você só precise declarar respostas adicionais, uma forma conveniente de fazer isso é com [Retornos Adicionais no OpenAPI](additional-responses.md){.internal-link target=_blank}. +Caso você só precise declarar respostas adicionais, uma forma conveniente de fazer isso é com [Respostas Adicionais no OpenAPI](additional-responses.md). /// diff --git a/docs/pt/docs/advanced/response-change-status-code.md b/docs/pt/docs/advanced/response-change-status-code.md index 76d9462a87..44ca6062a5 100644 --- a/docs/pt/docs/advanced/response-change-status-code.md +++ b/docs/pt/docs/advanced/response-change-status-code.md @@ -1,6 +1,6 @@ # Retorno - Altere o Código de Status { #response-change-status-code } -Você provavelmente leu anteriormente que você pode definir um [Código de Status do Retorno](../tutorial/response-status-code.md){.internal-link target=_blank} padrão. +Você provavelmente leu anteriormente que você pode definir um [Código de Status do Retorno](../tutorial/response-status-code.md) padrão. Porém em alguns casos você precisa retornar um código de status diferente do padrão. diff --git a/docs/pt/docs/advanced/response-cookies.md b/docs/pt/docs/advanced/response-cookies.md index ae9660743a..691bd1b9c5 100644 --- a/docs/pt/docs/advanced/response-cookies.md +++ b/docs/pt/docs/advanced/response-cookies.md @@ -20,7 +20,7 @@ Você também pode declarar o parâmetro `Response` em dependências e definir c Você também pode criar cookies ao retornar uma `Response` diretamente no seu código. -Para fazer isso, você pode criar uma resposta como descrito em [Retorne uma Resposta Diretamente](response-directly.md){.internal-link target=_blank}. +Para fazer isso, você pode criar uma resposta como descrito em [Retorne uma Resposta Diretamente](response-directly.md). Então, defina os cookies nela e a retorne: @@ -48,4 +48,4 @@ E como o `Response` pode ser usado frequentemente para definir cabeçalhos e coo /// -Para ver todos os parâmetros e opções disponíveis, verifique a documentação no Starlette. +Para ver todos os parâmetros e opções disponíveis, verifique a [documentação no Starlette](https://www.starlette.dev/responses/#set-cookie). diff --git a/docs/pt/docs/advanced/response-directly.md b/docs/pt/docs/advanced/response-directly.md index 311aba56ce..9024897c1a 100644 --- a/docs/pt/docs/advanced/response-directly.md +++ b/docs/pt/docs/advanced/response-directly.md @@ -1,20 +1,24 @@ # Retornando uma Resposta Diretamente { #return-a-response-directly } -Quando você cria uma *operação de rota* no **FastAPI** você pode retornar qualquer dado nela: um dicionário (`dict`), uma lista (`list`), um modelo do Pydantic ou do seu banco de dados, etc. +Quando você cria uma *operação de rota* no **FastAPI**, normalmente você pode retornar qualquer dado: um `dict`, uma `list`, um modelo do Pydantic, um modelo do banco de dados, etc. -Por padrão, o **FastAPI** irá converter automaticamente o valor do retorno para JSON utilizando o `jsonable_encoder` explicado em [Codificador Compatível com JSON](../tutorial/encoder.md){.internal-link target=_blank}. +Se você declarar um [Modelo de resposta](../tutorial/response-model.md), o FastAPI irá usá-lo para serializar os dados para JSON, usando o Pydantic. -Então, por baixo dos panos, ele incluiria esses dados compatíveis com JSON (e.g. um `dict`) dentro de uma `JSONResponse` que é utilizada para enviar uma resposta para o cliente. +Se você não declarar um modelo de resposta, o FastAPI usará o `jsonable_encoder` explicado em [Codificador Compatível com JSON](../tutorial/encoder.md) e o colocará em uma `JSONResponse`. -Mas você pode retornar a `JSONResponse` diretamente nas suas *operações de rota*. +Você também pode criar uma `JSONResponse` diretamente e retorná-la. -Pode ser útil para retornar cabeçalhos e cookies personalizados, por exemplo. +/// tip | Dica + +Normalmente você terá um desempenho muito melhor usando um [Modelo de resposta](../tutorial/response-model.md) do que retornando uma `JSONResponse` diretamente, pois assim ele serializa os dados usando o Pydantic, em Rust. + +/// ## Retornando uma `Response` { #return-a-response } -Na verdade, você pode retornar qualquer `Response` ou subclasse dela. +Você pode retornar uma `Response` ou qualquer subclasse dela. -/// tip | Dica +/// info | Informação A própria `JSONResponse` é uma subclasse de `Response`. @@ -22,10 +26,12 @@ A própria `JSONResponse` é uma subclasse de `Response`. E quando você retorna uma `Response`, o **FastAPI** vai repassá-la diretamente. -Ele não vai fazer conversões de dados com modelos do Pydantic, não irá converter a tipagem de nenhum conteúdo, etc. +Ele não fará conversões de dados com modelos do Pydantic, não converterá o conteúdo para nenhum tipo, etc. Isso te dá bastante flexibilidade. Você pode retornar qualquer tipo de dado, sobrescrever qualquer declaração e validação nos dados, etc. +Isso também te dá muita responsabilidade. Você precisa garantir que os dados retornados estão corretos, no formato correto, que podem ser serializados, etc. + ## Utilizando o `jsonable_encoder` em uma `Response` { #using-the-jsonable-encoder-in-a-response } Como o **FastAPI** não realiza nenhuma mudança na `Response` que você retorna, você precisa garantir que o conteúdo dela está pronto para uso. @@ -50,16 +56,28 @@ O exemplo acima mostra todas as partes que você precisa, mas ainda não é muit Agora, vamos ver como você pode usar isso para retornar uma resposta personalizada. -Vamos dizer que você quer retornar uma resposta XML. +Vamos dizer que você quer retornar uma resposta [XML](https://en.wikipedia.org/wiki/XML). Você pode colocar o seu conteúdo XML em uma string, colocar em uma `Response`, e retorná-lo: {* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *} +## Como funciona um Modelo de resposta { #how-a-response-model-works } + +Quando você declara um [Modelo de resposta - Tipo de retorno](../tutorial/response-model.md) em uma operação de rota, o **FastAPI** irá usá-lo para serializar os dados para JSON, usando o Pydantic. + +{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *} + +Como isso acontece no lado do Rust, o desempenho será muito melhor do que se fosse feito com Python comum e a classe `JSONResponse`. + +Ao usar um `response_model` ou tipo de retorno, o FastAPI não usará o `jsonable_encoder` para converter os dados (o que seria mais lento) nem a classe `JSONResponse`. + +Em vez disso, ele pega os bytes JSON gerados com o Pydantic usando o modelo de resposta (ou tipo de retorno) e retorna uma `Response` com o media type correto para JSON diretamente (`application/json`). + ## Notas { #notes } Quando você retorna uma `Response` diretamente os dados não são validados, convertidos (serializados) ou documentados automaticamente. -Mas você ainda pode documentar como descrito em [Retornos Adicionais no OpenAPI](additional-responses.md){.internal-link target=_blank}. +Mas você ainda pode documentar como descrito em [Respostas adicionais no OpenAPI](additional-responses.md). Você pode ver nas próximas seções como usar/declarar essas `Responses` customizadas enquanto mantém a conversão e documentação automática dos dados. diff --git a/docs/pt/docs/advanced/response-headers.md b/docs/pt/docs/advanced/response-headers.md index a7305bdb17..7235b5eb8c 100644 --- a/docs/pt/docs/advanced/response-headers.md +++ b/docs/pt/docs/advanced/response-headers.md @@ -20,7 +20,7 @@ Você também pode declarar o parâmetro `Response` em dependências e definir c Você também pode adicionar cabeçalhos quando retornar uma `Response` diretamente. -Crie uma resposta conforme descrito em [Retornar uma resposta diretamente](response-directly.md){.internal-link target=_blank} e passe os cabeçalhos como um parâmetro adicional: +Crie uma resposta conforme descrito em [Retornar uma resposta diretamente](response-directly.md) e passe os cabeçalhos como um parâmetro adicional: {* ../../docs_src/response_headers/tutorial001_py310.py hl[10:12] *} @@ -36,6 +36,6 @@ E como a `Response` pode ser usada frequentemente para definir cabeçalhos e coo ## Cabeçalhos personalizados { #custom-headers } -Tenha em mente que cabeçalhos personalizados proprietários podem ser adicionados usando o prefixo `X-`. +Tenha em mente que cabeçalhos personalizados proprietários podem ser adicionados [usando o prefixo `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). -Porém, se você tiver cabeçalhos personalizados que deseja que um cliente no navegador possa ver, você precisa adicioná-los às suas configurações de CORS (saiba mais em [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank}), usando o parâmetro `expose_headers` descrito na documentação de CORS do Starlette. +Porém, se você tiver cabeçalhos personalizados que deseja que um cliente no navegador possa ver, você precisa adicioná-los às suas configurações de CORS (saiba mais em [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md)), usando o parâmetro `expose_headers` descrito na [documentação de CORS do Starlette](https://www.starlette.dev/middleware/#corsmiddleware). diff --git a/docs/pt/docs/advanced/security/http-basic-auth.md b/docs/pt/docs/advanced/security/http-basic-auth.md index 0ebdb1eb93..303d8480e1 100644 --- a/docs/pt/docs/advanced/security/http-basic-auth.md +++ b/docs/pt/docs/advanced/security/http-basic-auth.md @@ -32,7 +32,7 @@ Aqui está um exemplo mais completo. Utilize uma dependência para verificar se o usuário e a senha estão corretos. -Para isso, utilize o módulo padrão do Python `secrets` para verificar o usuário e senha. +Para isso, utilize o módulo padrão do Python [`secrets`](https://docs.python.org/3/library/secrets.html) para verificar o usuário e senha. O `secrets.compare_digest()` necessita receber `bytes` ou `str` que possuem apenas caracteres ASCII (os em inglês). Isso significa que não funcionaria com caracteres como o `á`, como em `Sebastián`. @@ -50,11 +50,11 @@ if not (credentials.username == "stanleyjobson") or not (credentials.password == ... ``` -Porém, ao utilizar o `secrets.compare_digest()`, isso estará seguro contra um tipo de ataque chamado "timing attacks" (ataques de temporização). +Porém, ao utilizar o `secrets.compare_digest()`, isso estará seguro contra um tipo de ataque chamado "timing attacks". ### Ataques de Temporização { #timing-attacks } -Mas o que é um "timing attack" (ataque de temporização)? +Mas o que é um "timing attack"? Vamos imaginar que alguns invasores estão tentando adivinhar o usuário e a senha. diff --git a/docs/pt/docs/advanced/security/index.md b/docs/pt/docs/advanced/security/index.md index 70fb999d0e..b5ced914a7 100644 --- a/docs/pt/docs/advanced/security/index.md +++ b/docs/pt/docs/advanced/security/index.md @@ -2,7 +2,7 @@ ## Funcionalidades Adicionais { #additional-features } -Existem algumas funcionalidades adicionais para lidar com segurança além das cobertas em [Tutorial - Guia de Usuário: Segurança](../../tutorial/security/index.md){.internal-link target=_blank}. +Existem algumas funcionalidades adicionais para lidar com segurança além das cobertas em [Tutorial - Guia de Usuário: Segurança](../../tutorial/security/index.md). /// tip | Dica @@ -14,6 +14,6 @@ E é possível que para o seu caso de uso, a solução está em uma delas. ## Leia o Tutorial primeiro { #read-the-tutorial-first } -As próximas seções pressupõem que você já leu o principal [Tutorial - Guia de Usuário: Segurança](../../tutorial/security/index.md){.internal-link target=_blank}. +As próximas seções pressupõem que você já leu o principal [Tutorial - Guia de Usuário: Segurança](../../tutorial/security/index.md). Todas elas são baseadas nos mesmos conceitos, mas permitem algumas funcionalidades extras. diff --git a/docs/pt/docs/advanced/security/oauth2-scopes.md b/docs/pt/docs/advanced/security/oauth2-scopes.md index 0a0c785a01..7ea61ad60e 100644 --- a/docs/pt/docs/advanced/security/oauth2-scopes.md +++ b/docs/pt/docs/advanced/security/oauth2-scopes.md @@ -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){.internal-link target=_blank}. Agora utilizando escopos OAuth2: +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: {* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *} @@ -126,7 +126,7 @@ Nós estamos fazendo isso aqui para demonstrar como o **FastAPI** lida com escop {* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *} -/// info | Detalhes Técnicos +/// note | Detalhes Técnicos `Security` é na verdade uma subclasse de `Depends`, e ele possui apenas um parâmetro extra que veremos depois. @@ -271,4 +271,4 @@ O **FastAPI** inclui utilitários para todos esses fluxos de autenticação OAut ## `Security` em decoradores de `dependencies` { #security-in-decorator-dependencies } -Da mesma forma que você pode definir uma `list` de `Depends` no parâmetro `dependencies` do decorador (como explicado em [Dependências em decoradores de operações de rota](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}), você também pode utilizar `Security` com escopos lá. +Da mesma forma que você pode definir uma `list` de `Depends` no parâmetro `dependencies` do decorador (como explicado em [Dependências em decoradores de operações de rota](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md)), você também pode utilizar `Security` com escopos lá. diff --git a/docs/pt/docs/advanced/settings.md b/docs/pt/docs/advanced/settings.md index 88e7f591c3..371d5711bd 100644 --- a/docs/pt/docs/advanced/settings.md +++ b/docs/pt/docs/advanced/settings.md @@ -8,7 +8,7 @@ Por esse motivo, é comum fornecê-las em variáveis de ambiente lidas pela apli /// tip | Dica -Para entender variáveis de ambiente, você pode ler [Variáveis de Ambiente](../environment-variables.md){.internal-link target=_blank}. +Para entender variáveis de ambiente, você pode ler [Variáveis de Ambiente](../environment-variables.md). /// @@ -20,11 +20,11 @@ Isso significa que qualquer valor lido em Python a partir de uma variável de am ## Pydantic `Settings` { #pydantic-settings } -Felizmente, o Pydantic fornece uma ótima utilidade para lidar com essas configurações vindas de variáveis de ambiente com Pydantic: Settings management. +Felizmente, o Pydantic fornece uma ótima utilidade para lidar com essas configurações vindas de variáveis de ambiente com [Pydantic: Settings management](https://docs.pydantic.dev/latest/concepts/pydantic_settings/). ### Instalar `pydantic-settings` { #install-pydantic-settings } -Primeiro, certifique-se de criar seu [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo e então instalar o pacote `pydantic-settings`: +Primeiro, certifique-se de criar seu [ambiente virtual](../virtual-environments.md), ativá-lo e então instalar o pacote `pydantic-settings`:
@@ -100,7 +100,7 @@ E `items_per_user` manteria seu valor padrão de `50`. ## Configurações em outro módulo { #settings-in-another-module } -Você pode colocar essas configurações em outro arquivo de módulo como visto em [Aplicações Maiores - Múltiplos Arquivos](../tutorial/bigger-applications.md){.internal-link target=_blank}. +Você pode colocar essas configurações em outro arquivo de módulo como visto em [Aplicações Maiores - Múltiplos Arquivos](../tutorial/bigger-applications.md). Por exemplo, você poderia ter um arquivo `config.py` com: @@ -112,7 +112,7 @@ E então usá-lo em um arquivo `main.py`: /// tip | Dica -Você também precisaria de um arquivo `__init__.py` como visto em [Aplicações Maiores - Múltiplos Arquivos](../tutorial/bigger-applications.md){.internal-link target=_blank}. +Você também precisaria de um arquivo `__init__.py` como visto em [Aplicações Maiores - Múltiplos Arquivos](../tutorial/bigger-applications.md). /// @@ -172,7 +172,7 @@ Mas um arquivo dotenv não precisa ter exatamente esse nome de arquivo. /// -O Pydantic tem suporte para leitura desses tipos de arquivos usando uma biblioteca externa. Você pode ler mais em Pydantic Settings: Dotenv (.env) support. +O Pydantic tem suporte para leitura desses tipos de arquivos usando uma biblioteca externa. Você pode ler mais em [Pydantic Settings: Dotenv (.env) support](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support). /// tip | Dica @@ -197,7 +197,7 @@ E então atualizar seu `config.py` com: /// tip | Dica -O atributo `model_config` é usado apenas para configuração do Pydantic. Você pode ler mais em Pydantic: Concepts: Configuration. +O atributo `model_config` é usado apenas para configuração do Pydantic. Você pode ler mais em [Pydantic: Concepts: Configuration](https://docs.pydantic.dev/latest/concepts/config/). /// @@ -291,7 +291,7 @@ No caso da nossa dependência `get_settings()`, a função nem recebe argumentos Dessa forma, ela se comporta quase como se fosse apenas uma variável global. Mas como usa uma função de dependência, podemos sobrescrevê-la facilmente para testes. -`@lru_cache` faz parte de `functools`, que faz parte da biblioteca padrão do Python; você pode ler mais sobre isso na documentação do Python para `@lru_cache`. +`@lru_cache` faz parte de `functools`, que faz parte da biblioteca padrão do Python; você pode ler mais sobre isso na [documentação do Python para `@lru_cache`](https://docs.python.org/3/library/functools.html#functools.lru_cache). ## Recapitulando { #recap } diff --git a/docs/pt/docs/advanced/stream-data.md b/docs/pt/docs/advanced/stream-data.md new file mode 100644 index 0000000000..8e0bf08b68 --- /dev/null +++ b/docs/pt/docs/advanced/stream-data.md @@ -0,0 +1,117 @@ +# Transmitir dados { #stream-data } + +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. + +/// info | Informação + +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ê 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. + +## 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. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *} + +O FastAPI entregará cada bloco de dados para `StreamingResponse` como está, não tentará convertê-lo para JSON nem nada semelhante. + +### Funções de operação de rota não assíncronas { #non-async-path-operation-functions } + +Você também pode usar funções `def` normais (sem `async`) e usar `yield` da mesma forma. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[26:29] hl[27] *} + +### Sem anotação { #no-annotation } + +Você não precisa declarar a anotação de tipo de retorno para transmitir dados binários. + +Como o FastAPI não tentará converter os dados para JSON com Pydantic nem serializá-los de nenhuma forma, neste caso a anotação de tipo serve apenas para seu editor e ferramentas; ela não será usada pelo FastAPI. + +{* ../../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. 🤓 + +### Transmitir bytes { #stream-bytes } + +Um dos principais casos de uso é transmitir `bytes` em vez de strings; você pode fazer isso sem problemas. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[44:47] hl[47] *} + +## 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. + +Você pode criar uma subclasse personalizada de `StreamingResponse` que define o cabeçalho `Content-Type` para o tipo de dado que você está transmitindo. + +Por exemplo, você pode criar um `PNGStreamingResponse` que define o cabeçalho `Content-Type` como `image/png` usando o atributo `media_type`: + +{* ../../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: + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *} + +### Simular um arquivo { #simulate-a-file } + +Neste exemplo, estamos simulando um arquivo com `io.BytesIO`, que é um objeto semelhante a arquivo que vive somente na memória, mas nos permite usar a mesma interface. + +Por exemplo, podemos iterar sobre ele para consumir seu conteúdo, como faríamos com um arquivo. + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[1:27] hl[3,12:13,25] *} + +/// note | Detalhes Técnicos + +As outras duas variáveis, `image_base64` e `binary_image`, são uma imagem codificada em Base64 e depois convertida para bytes, para então passá-la para `io.BytesIO`. + +Apenas para que possa viver no mesmo arquivo deste exemplo e você possa copiar e executar como está. 🥚 + +/// + +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. + +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. + +### Arquivos e async { #files-and-async } + +Na maioria dos casos, objetos semelhantes a arquivo não são compatíveis com async e await por padrão. + +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 + +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. + +Mas, em muitos casos, ler um arquivo ou um objeto semelhante a arquivo bloquearia. + +/// + +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] *} + +/// tip | Dica + +Se você precisar chamar código bloqueante de dentro de uma função assíncrona ou uma função assíncrona de dentro de uma função bloqueante, você poderia usar o [Asyncer](https://asyncer.tiangolo.com), uma biblioteca irmã do FastAPI. + +/// + +### `yield from` { #yield-from } + +Quando você está iterando sobre algo, como um objeto semelhante a arquivo, e faz `yield` para cada item, você também pode usar `yield from` para produzir cada item diretamente e pular o loop `for`. + +Isso não é particular do FastAPI, é apenas Python, mas é um truque útil para conhecer. 😎 + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[37:40] hl[40] *} diff --git a/docs/pt/docs/advanced/strict-content-type.md b/docs/pt/docs/advanced/strict-content-type.md new file mode 100644 index 0000000000..9530501d4e --- /dev/null +++ b/docs/pt/docs/advanced/strict-content-type.md @@ -0,0 +1,88 @@ +# 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. + +## Risco de CSRF { #csrf-risk } + +Esse comportamento padrão oferece proteção contra uma classe de ataques de **Cross-Site Request Forgery (CSRF)** em um cenário muito específico. + +Esses ataques exploram o fato de que navegadores permitem que scripts enviem requisições sem fazer qualquer verificação de preflight de CORS quando: + +- não têm um cabeçalho `Content-Type` (por exemplo, usando `fetch()` com um corpo `Blob`) +- e não enviam nenhuma credencial de autenticação. + +Esse tipo de ataque é relevante principalmente quando: + +- a aplicação está em execução localmente (por exemplo, em `localhost`) ou em uma rede interna +- e a aplicação não tem autenticação, pressupondo que qualquer requisição da mesma rede é confiável. + +## Exemplo de Ataque { #example-attack } + +Imagine que você desenvolve uma forma de executar um agente de IA local. + +Ele fornece uma API em + +``` +http://localhost:8000/v1/agents/multivac +``` + +Há também um frontend em + +``` +http://localhost:8000 +``` + +/// tip | Dica + +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. + +Então um de seus usuários poderia instalá-lo e executá-lo localmente. + +Em seguida, poderia abrir um site malicioso, por exemplo: + +``` +https://evilhackers.example.com +``` + +E esse site malicioso envia requisições usando `fetch()` com um corpo `Blob` para a API local em + +``` +http://localhost:8000/v1/agents/multivac +``` + +Mesmo que o host do site malicioso e o da aplicação local sejam diferentes, o navegador não acionará uma requisição preflight de CORS porque: + +- Está em execução sem autenticação, não precisa enviar credenciais. +- O navegador acha que não está enviando JSON (devido à falta do cabeçalho `Content-Type`). + +Então o site malicioso poderia fazer o agente de IA local enviar mensagens raivosas ao ex-chefe do usuário... ou pior. 😅 + +## Internet Aberta { #open-internet } + +Se sua aplicação está na Internet aberta, você não “confiaria na rede” nem deixaria qualquer pessoa enviar requisições privilegiadas sem autenticação. + +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ê. + +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 } + +Se você precisa dar suporte a clientes que não enviam um cabeçalho `Content-Type`, você pode desativar a verificação estrita definindo `strict_content_type=False`: + +{* ../../docs_src/strict_content_type/tutorial001_py310.py hl[4] *} + +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 + +Esse comportamento e configuração foram adicionados no FastAPI 0.132.0. + +/// diff --git a/docs/pt/docs/advanced/sub-applications.md b/docs/pt/docs/advanced/sub-applications.md index 7f176e98d9..1a82b02636 100644 --- a/docs/pt/docs/advanced/sub-applications.md +++ b/docs/pt/docs/advanced/sub-applications.md @@ -30,25 +30,25 @@ Neste caso, ela será montada no path `/subapi`: ### Verifique a documentação automática da API { #check-the-automatic-api-docs } -Agora, execute o comando `fastapi` com o seu arquivo: +Agora, execute o comando `fastapi`:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-E abra a documentação em http://127.0.0.1:8000/docs. +E abra a documentação em [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Você verá a documentação automática da API para a aplicação principal, incluindo apenas suas próprias _operações de rota_: -E então, abra a documentação para a sub-aplicação, em http://127.0.0.1:8000/subapi/docs. +E então, abra a documentação para a sub-aplicação, em [http://127.0.0.1:8000/subapi/docs](http://127.0.0.1:8000/subapi/docs). Você verá a documentação automática da API para a sub-aplicação, incluindo apenas suas próprias _operações de rota_, todas sob o prefixo de sub-path correto `/subapi`: @@ -64,4 +64,4 @@ Dessa forma, a sub-aplicação saberá usar esse prefixo de path para a interfac E a sub-aplicação também poderia ter suas próprias sub-aplicações montadas e tudo funcionaria corretamente, porque o FastAPI lida com todos esses `root_path`s automaticamente. -Você aprenderá mais sobre o `root_path` e como usá-lo explicitamente na seção sobre [Atrás de um Proxy](behind-a-proxy.md){.internal-link target=_blank}. +Você aprenderá mais sobre o `root_path` e como usá-lo explicitamente na seção sobre [Atrás de um Proxy](behind-a-proxy.md). diff --git a/docs/pt/docs/advanced/templates.md b/docs/pt/docs/advanced/templates.md index 843727f4f8..d3a8ad9b50 100644 --- a/docs/pt/docs/advanced/templates.md +++ b/docs/pt/docs/advanced/templates.md @@ -8,7 +8,7 @@ Existem utilitários para configurá-lo facilmente que você pode usar diretamen ## Instalar dependências { #install-dependencies } -Certifique-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo e instalar `jinja2`: +Certifique-se de criar um [ambiente virtual](../virtual-environments.md), ativá-lo e instalar `jinja2`:
@@ -123,4 +123,4 @@ E como você está usando `StaticFiles`, este arquivo CSS será automaticamente ## Mais detalhes { #more-details } -Para obter mais detalhes, incluindo como testar templates, consulte a documentação da Starlette sobre templates. +Para obter mais detalhes, incluindo como testar templates, consulte a [documentação da Starlette sobre templates](https://www.starlette.dev/templates/). diff --git a/docs/pt/docs/advanced/testing-websockets.md b/docs/pt/docs/advanced/testing-websockets.md index ffb0ba3383..f562372729 100644 --- a/docs/pt/docs/advanced/testing-websockets.md +++ b/docs/pt/docs/advanced/testing-websockets.md @@ -8,6 +8,6 @@ Para isso, você utiliza o `TestClient` dentro de uma instrução `with`, conect /// note | Nota -Para mais detalhes, confira a documentação do Starlette para testar WebSockets. +Para mais detalhes, confira a documentação do Starlette para [testar WebSockets](https://www.starlette.dev/testclient/#testing-websocket-sessions). /// diff --git a/docs/pt/docs/advanced/using-request-directly.md b/docs/pt/docs/advanced/using-request-directly.md index 283a831d9a..14eac2bf7b 100644 --- a/docs/pt/docs/advanced/using-request-directly.md +++ b/docs/pt/docs/advanced/using-request-directly.md @@ -15,7 +15,7 @@ Porém há situações em que você possa precisar acessar o objeto `Request` di ## Detalhes sobre o objeto `Request` { #details-about-the-request-object } -Como o **FastAPI** é na verdade o **Starlette** por baixo, com camadas de diversas funcionalidades por cima, você pode utilizar o objeto `Request` do Starlette diretamente quando precisar. +Como o **FastAPI** é na verdade o **Starlette** por baixo, com camadas de diversas funcionalidades por cima, você pode utilizar o objeto [`Request`](https://www.starlette.dev/requests/) do Starlette diretamente quando precisar. Isso significaria também que se você obtiver informações do objeto `Request` diretamente (ler o corpo da requisição por exemplo), as informações não serão validadas, convertidas ou documentadas (com o OpenAPI, para a interface de usuário automática da API) pelo FastAPI. @@ -45,7 +45,7 @@ Do mesmo jeito, você pode declarar qualquer outro parâmetro normalmente, e al ## Documentação do `Request` { #request-documentation } -Você pode ler mais sobre os detalhes do objeto `Request` no site da documentação oficial do Starlette.. +Você pode ler mais sobre os detalhes do [objeto `Request` no site da documentação oficial do Starlette](https://www.starlette.dev/requests/). /// note | Detalhes Técnicos diff --git a/docs/pt/docs/advanced/websockets.md b/docs/pt/docs/advanced/websockets.md index f148defd4c..70b2ee853d 100644 --- a/docs/pt/docs/advanced/websockets.md +++ b/docs/pt/docs/advanced/websockets.md @@ -1,10 +1,10 @@ # WebSockets { #websockets } -Você pode usar WebSockets com **FastAPI**. +Você pode usar [WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) com **FastAPI**. ## Instale `websockets` { #install-websockets } -Garanta que você criou um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, o ativou e instalou o `websockets` (uma biblioteca Python que facilita o uso do protocolo "WebSocket"): +Garanta que você criou um [ambiente virtual](../virtual-environments.md), o ativou e instalou o `websockets` (uma biblioteca Python que facilita o uso do protocolo "WebSocket"):
@@ -64,19 +64,19 @@ Você pode receber e enviar dados binários, de texto e JSON. ## Tente { #try-it } -Se seu arquivo for nomeado `main.py`, execute sua aplicação com: +Coloque seu código em um arquivo `main.py` e então execute sua aplicação:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Abra seu navegador em: http://127.0.0.1:8000. +Abra seu navegador em: [http://127.0.0.1:8000](http://127.0.0.1:8000). Você verá uma página simples como: @@ -115,25 +115,25 @@ Eles funcionam da mesma forma que para outros endpoints FastAPI/*operações de Como isso é um WebSocket, não faz muito sentido levantar uma `HTTPException`, em vez disso levantamos uma `WebSocketException`. -Você pode usar um código de fechamento dos códigos válidos definidos na especificação. +Você pode usar um código de fechamento dos [códigos válidos definidos na especificação](https://tools.ietf.org/html/rfc6455#section-7.4.1). /// ### Tente os WebSockets com dependências { #try-the-websockets-with-dependencies } -Se seu arquivo for nomeado `main.py`, execute sua aplicação com: +Execute sua aplicação:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Abra seu navegador em: http://127.0.0.1:8000. +Abra seu navegador em: [http://127.0.0.1:8000](http://127.0.0.1:8000). Lá você pode definir: @@ -174,7 +174,7 @@ O app acima é um exemplo mínimo e simples para demonstrar como lidar e transmi Mas tenha em mente que, como tudo é manipulado na memória, em uma única list, ele só funcionará enquanto o processo estiver em execução e só funcionará com um único processo. -Se você precisa de algo fácil de integrar com o FastAPI, mas que seja mais robusto, suportado por Redis, PostgreSQL ou outros, verifique o encode/broadcaster. +Se você precisa de algo fácil de integrar com o FastAPI, mas que seja mais robusto, suportado por Redis, PostgreSQL ou outros, verifique [encode/broadcaster](https://github.com/encode/broadcaster). /// @@ -182,5 +182,5 @@ Se você precisa de algo fácil de integrar com o FastAPI, mas que seja mais rob Para aprender mais sobre as opções, verifique a documentação do Starlette para: -* A classe `WebSocket`. -* Manipulação de WebSockets baseada em classes. +* [A classe `WebSocket`](https://www.starlette.dev/websockets/). +* [Manipulação de WebSockets baseada em classes](https://www.starlette.dev/endpoints/#websocketendpoint). diff --git a/docs/pt/docs/advanced/wsgi.md b/docs/pt/docs/advanced/wsgi.md index 3178b85eb0..110bba0538 100644 --- a/docs/pt/docs/advanced/wsgi.md +++ b/docs/pt/docs/advanced/wsgi.md @@ -1,6 +1,6 @@ # Adicionando WSGI - Flask, Django, entre outros { #including-wsgi-flask-django-others } -Como você viu em [Subaplicações - Montagens](sub-applications.md){.internal-link target=_blank} e [Atrás de um Proxy](behind-a-proxy.md){.internal-link target=_blank}, você pode montar aplicações WSGI. +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. @@ -36,13 +36,13 @@ Agora, todas as requisições sob o path `/v1/` serão manipuladas pela aplicaç E o resto será manipulado pelo **FastAPI**. -Se você rodar a aplicação e ir até http://localhost:8000/v1/, você verá o retorno do Flask: +Se você rodar a aplicação e ir até [http://localhost:8000/v1/](http://localhost:8000/v1/), você verá o retorno do Flask: ```txt Hello, World from Flask! ``` -E se você for até http://localhost:8000/v2, você verá o retorno do FastAPI: +E se você for até [http://localhost:8000/v2](http://localhost:8000/v2), você verá o retorno do FastAPI: ```JSON { diff --git a/docs/pt/docs/alternatives.md b/docs/pt/docs/alternatives.md index 17ef260dd4..828561542d 100644 --- a/docs/pt/docs/alternatives.md +++ b/docs/pt/docs/alternatives.md @@ -14,7 +14,7 @@ Mas em algum momento, não havia outra opção senão criar algo que fornecesse ## Ferramentas anteriores { #previous-tools } -### Django { #django } +### [Django](https://www.djangoproject.com/) { #django } É o framework Python mais popular e amplamente confiável. É utilizado para construir sistemas como o Instagram. @@ -22,7 +22,7 @@ Mas em algum momento, não havia outra opção senão criar algo que fornecesse 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 { #django-rest-framework } +### [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. @@ -36,13 +36,13 @@ Django REST Framework foi criado por Tom Christie. O mesmo criador de Starlette /// -/// check | **FastAPI** inspirado para +/// check | Inspirou o **FastAPI** a Ter uma interface web de documentação automática da API. /// -### Flask { #flask } +### [Flask](https://flask.palletsprojects.com) { #flask } Flask é um "microframework", não inclui integrações com banco de dados nem muitas das coisas que vêm por padrão no Django. @@ -56,7 +56,7 @@ Esse desacoplamento de partes, e ser um "microframework" que pode ser estendido Dada a simplicidade do Flask, ele parecia uma boa opção para construção de APIs. A próxima coisa a encontrar era um "Django REST Framework" para Flask. -/// check | **FastAPI** inspirado para +/// check | Inspirou o **FastAPI** a Ser um microframework. Tornar fácil misturar e combinar as ferramentas e partes necessárias. @@ -64,7 +64,7 @@ Ter um sistema de roteamento simples e fácil de usar. /// -### Requests { #requests } +### [Requests](https://requests.readthedocs.io) { #requests } **FastAPI** na verdade não é uma alternativa ao **Requests**. O escopo deles é muito diferente. @@ -98,7 +98,7 @@ def read_url(): Veja as similaridades em `requests.get(...)` e `@app.get(...)`. -/// check | **FastAPI** inspirado para +/// check | Inspirou o **FastAPI** a * Ter uma API simples e intuitiva. * Utilizar nomes de métodos HTTP (operações) diretamente, de um jeito direto e intuitivo. @@ -106,7 +106,7 @@ Veja as similaridades em `requests.get(...)` e `@app.get(...)`. /// -### Swagger / OpenAPI { #swagger-openapi } +### [Swagger](https://swagger.io/) / [OpenAPI](https://github.com/OAI/OpenAPI-Specification/) { #swagger-openapi } A principal funcionalidade que eu queria do Django REST Framework era a documentação automática da API. @@ -118,14 +118,14 @@ Em algum ponto, Swagger foi doado para a Fundação Linux, para ser renomeado Op É por isso que ao falar sobre a versão 2.0 é comum dizer "Swagger", e para a versão 3+ "OpenAPI". -/// check | **FastAPI** inspirado para +/// check | Inspirou o **FastAPI** a Adotar e usar um padrão aberto para especificações de API, em vez de um schema personalizado. E integrar ferramentas de interface para usuários baseadas nos padrões: -* Swagger UI -* ReDoc +* [Swagger UI](https://github.com/swagger-api/swagger-ui) +* [ReDoc](https://github.com/Rebilly/ReDoc) Essas duas foram escolhidas por serem bem populares e estáveis, mas fazendo uma pesquisa rápida, você pode encontrar dúzias de interfaces alternativas adicionais para OpenAPI (que você pode utilizar com **FastAPI**). @@ -135,7 +135,7 @@ Essas duas foram escolhidas por serem bem populares e estáveis, mas fazendo uma Existem vários Flask REST frameworks, mas depois de investir tempo e trabalho investigando-os, descobri que muitos estão descontinuados ou abandonados, com diversas questões em aberto que os tornaram inadequados. -### Marshmallow { #marshmallow } +### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow } Uma das principais funcionalidades necessárias em sistemas de API é a "serialização" de dados, que é pegar dados do código (Python) e convertê-los em algo que possa ser enviado pela rede. Por exemplo, converter um objeto contendo dados de um banco de dados em um objeto JSON. Converter objetos `datetime` em strings, etc. @@ -147,13 +147,13 @@ Essas funcionalidades são o que o Marshmallow foi construído para fornecer. É Mas ele foi criado antes de existirem as anotações de tipo do Python. Então, para definir cada schema você precisa utilizar utilitários e classes específicos fornecidos pelo Marshmallow. -/// check | **FastAPI** inspirado para +/// check | Inspirou o **FastAPI** a Usar código para definir "schemas" que forneçam, automaticamente, tipos de dados e validação. /// -### Webargs { #webargs } +### [Webargs](https://webargs.readthedocs.io/en/latest/) { #webargs } Outra grande funcionalidade requerida pelas APIs é o parsing de dados vindos de requisições de entrada. @@ -169,13 +169,13 @@ Webargs foi criado pelos mesmos desenvolvedores do Marshmallow. /// -/// check | **FastAPI** inspirado para +/// check | Inspirou o **FastAPI** a Ter validação automática dos dados de requisições de entrada. /// -### APISpec { #apispec } +### [APISpec](https://apispec.readthedocs.io/en/stable/) { #apispec } Marshmallow e Webargs fornecem validação, parsing e serialização como plug-ins. @@ -199,13 +199,13 @@ APISpec foi criado pelos mesmos desenvolvedores do Marshmallow. /// -/// check | **FastAPI** inspirado para +/// check | Inspirou o **FastAPI** a Dar suporte ao padrão aberto para APIs, OpenAPI. /// -### Flask-apispec { #flask-apispec } +### [Flask-apispec](https://flask-apispec.readthedocs.io/en/latest/) { #flask-apispec } É um plug-in Flask, que amarra juntos Webargs, Marshmallow e APISpec. @@ -219,11 +219,11 @@ Essa combinação de Flask, Flask-apispec com Marshmallow e Webargs foi a minha Usá-la levou à criação de vários geradores Flask full-stack. Estas são as principais stacks que eu (e várias equipes externas) tenho utilizado até agora: -* https://github.com/tiangolo/full-stack -* https://github.com/tiangolo/full-stack-flask-couchbase -* https://github.com/tiangolo/full-stack-flask-couchdb +* [https://github.com/tiangolo/full-stack](https://github.com/tiangolo/full-stack) +* [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) -E esses mesmos geradores full-stack foram a base dos [Geradores de Projetos **FastAPI**](project-generation.md){.internal-link target=_blank}. +E esses mesmos geradores full-stack foram a base dos [Geradores de Projetos **FastAPI**](project-generation.md). /// info | Informação @@ -231,13 +231,13 @@ Flask-apispec foi criado pelos mesmos desenvolvedores do Marshmallow. /// -/// check | **FastAPI** inspirado para +/// check | Inspirou o **FastAPI** a Gerar o schema OpenAPI automaticamente, a partir do mesmo código que define serialização e validação. /// -### NestJS (e Angular) { #nestjs-and-angular } +### [NestJS](https://nestjs.com/) (e [Angular](https://angular.io/)) { #nestjs-and-angular } Isso nem é Python, NestJS é um framework NodeJS em JavaScript (TypeScript) inspirado pelo Angular. @@ -251,7 +251,7 @@ Mas como os dados do TypeScript não são preservados após a compilação para Ele não consegue lidar muito bem com modelos aninhados. Então, se o corpo JSON na requisição for um objeto JSON que contém campos internos que por sua vez são objetos JSON aninhados, ele não consegue ser documentado e validado apropriadamente. -/// check | **FastAPI** inspirado para +/// check | Inspirou o **FastAPI** a Usar tipos do Python para ter um ótimo suporte do editor. @@ -259,19 +259,19 @@ Ter um sistema de injeção de dependência poderoso. Encontrar um jeito de mini /// -### Sanic { #sanic } +### [Sanic](https://sanic.readthedocs.io/en/latest/) { #sanic } Ele foi um dos primeiros frameworks Python extremamente rápidos baseados em `asyncio`. Ele foi feito para ser muito similar ao Flask. /// note | Detalhes Técnicos -Ele utilizava `uvloop` em vez do loop `asyncio` padrão do Python. É isso que o deixava tão rápido. +Ele utilizava [`uvloop`](https://github.com/MagicStack/uvloop) em vez do loop `asyncio` padrão do Python. É isso que o deixava tão rápido. Ele claramente inspirou Uvicorn e Starlette, que atualmente são mais rápidos que o Sanic em benchmarks abertos. /// -/// check | **FastAPI** inspirado para +/// check | Inspirou o **FastAPI** a Encontrar um jeito de ter uma performance insana. @@ -279,7 +279,7 @@ Encontrar um jeito de ter uma performance insana. /// -### Falcon { #falcon } +### [Falcon](https://falconframework.org/) { #falcon } Falcon é outro framework Python de alta performance, projetado para ser minimalista, e servir como base para outros frameworks como Hug. @@ -287,7 +287,7 @@ Ele é projetado para ter funções que recebem dois parâmetros, uma "request" Então, validação de dados, serialização e documentação têm que ser feitos no código, não automaticamente. Ou eles têm que ser implementados como um framework acima do Falcon, como o Hug. Essa mesma distinção acontece em outros frameworks inspirados pelo design do Falcon, de ter um objeto de request e um objeto de response como parâmetros. -/// check | **FastAPI** inspirado para +/// check | Inspirou o **FastAPI** a Encontrar maneiras de obter uma ótima performance. @@ -297,7 +297,7 @@ Embora no FastAPI seja opcional, é utilizado principalmente para configurar cab /// -### Molten { #molten } +### [Molten](https://moltenframework.com/) { #molten } Eu descobri Molten nos primeiros estágios da construção do **FastAPI**. E ele tem ideias bastante similares: @@ -313,7 +313,7 @@ O sistema de injeção de dependência exige pré-registro das dependências e e As rotas são declaradas em um único lugar, usando funções declaradas em outros lugares (em vez de usar decorators que possam ser colocados diretamente acima da função que lida com o endpoint). Isso é mais próximo de como o Django faz do que de como o Flask (e o Starlette) fazem. Separa no código coisas que são relativamente bem acopladas. -/// check | **FastAPI** inspirado para +/// check | Inspirou o **FastAPI** a Definir validações extras para tipos de dados usando o valor "padrão" de atributos dos modelos. Isso melhora o suporte do editor, e não estava disponível no Pydantic antes. @@ -321,7 +321,7 @@ Isso na verdade inspirou a atualização de partes do Pydantic, para dar suporte /// -### Hug { #hug } +### [Hug](https://github.com/hugapi/hug) { #hug } Hug foi um dos primeiros frameworks a implementar a declaração de tipos de parâmetros de API usando anotações de tipo do Python. Isso foi uma ótima ideia que inspirou outras ferramentas a fazer o mesmo. @@ -337,7 +337,7 @@ Como é baseado no padrão anterior para frameworks web Python síncronos (WSGI) /// info | Informação -Hug foi criado por Timothy Crosley, o mesmo criador do `isort`, uma ótima ferramenta para ordenar automaticamente imports em arquivos Python. +Hug foi criado por Timothy Crosley, o mesmo criador do [`isort`](https://github.com/timothycrosley/isort), uma ótima ferramenta para ordenar automaticamente imports em arquivos Python. /// @@ -351,7 +351,7 @@ Hug inspirou **FastAPI** a declarar um parâmetro de `response` em funções par /// -### APIStar (<= 0.5) { #apistar-0-5 } +### [APIStar](https://github.com/encode/apistar) (<= 0.5) { #apistar-0-5 } Pouco antes de decidir construir o **FastAPI** eu encontrei o servidor **APIStar**. Ele tinha quase tudo o que eu estava procurando e tinha um ótimo design. @@ -385,7 +385,7 @@ APIStar foi criado por Tom Christie. O mesmo cara que criou: /// -/// check | **FastAPI** inspirado para +/// check | Inspirou o **FastAPI** a Existir. @@ -401,7 +401,7 @@ Eu considero o **FastAPI** um "sucessor espiritual" do APIStar, enquanto aprimor ## Usados por **FastAPI** { #used-by-fastapi } -### Pydantic { #pydantic } +### [Pydantic](https://docs.pydantic.dev/) { #pydantic } Pydantic é uma biblioteca para definir validação de dados, serialização e documentação (usando JSON Schema) com base nas anotações de tipo do Python. @@ -417,7 +417,7 @@ Controlar toda a validação de dados, serialização de dados e documentação /// -### Starlette { #starlette } +### [Starlette](https://www.starlette.dev/) { #starlette } Starlette é um framework/caixa de ferramentas ASGI leve, o que é ideal para construir serviços asyncio de alta performance. @@ -462,7 +462,7 @@ Então, qualquer coisa que você pode fazer com Starlette, você pode fazer dire /// -### Uvicorn { #uvicorn } +### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn } Uvicorn é um servidor ASGI extremamente rápido, construído com uvloop e httptools. @@ -476,10 +476,10 @@ O principal servidor web para rodar aplicações **FastAPI**. Você também pode usar a opção de linha de comando `--workers` para ter um servidor assíncrono multi-processos. -Verifique mais detalhes na seção [Deployment](deployment/index.md){.internal-link target=_blank}. +Verifique mais detalhes na seção [Implantação](deployment/index.md). /// ## Benchmarks e velocidade { #benchmarks-and-speed } -Para entender, comparar e ver a diferença entre Uvicorn, Starlette e FastAPI, verifique a seção sobre [Benchmarks](benchmarks.md){.internal-link target=_blank}. +Para entender, comparar e ver a diferença entre Uvicorn, Starlette e FastAPI, verifique a seção sobre [Benchmarks](benchmarks.md). diff --git a/docs/pt/docs/async.md b/docs/pt/docs/async.md index f01ff23159..fa1e430036 100644 --- a/docs/pt/docs/async.md +++ b/docs/pt/docs/async.md @@ -4,7 +4,7 @@ Detalhes sobre a sintaxe `async def` para *funções de operação de rota* e al ## Com pressa? { #in-a-hurry } -TL;DR: +TL;DR: Se você estiver utilizando bibliotecas de terceiros que dizem para você chamar as funções com `await`, como: @@ -74,7 +74,7 @@ Então o computador / programa 🤖 irá voltar sempre que tiver uma chance, sej Depois, ele 🤖 pega a primeira tarefa para finalizar (vamos dizer, nosso "arquivo lento" 📝) e continua o que tem que fazer com ela. -Esse "esperar por algo" normalmente se refere a operações I/O que são relativamente "lentas" (comparadas à velocidade do processador e da memória RAM), como esperar por: +Esse "esperar por algo" normalmente se refere a operações I/O que são relativamente "lentas" (comparadas à velocidade do processador e da memória RAM), como esperar por: * dados do cliente para serem enviados através da rede * dados enviados pelo seu programa serem recebidos pelo cliente através da rede @@ -85,7 +85,7 @@ Esse "esperar por algo" normalmente se refere a operações I/O, essas operações são chamadas operações "limitadas por I/O". +Quanto 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. @@ -141,7 +141,7 @@ Você e seu _crush_ comem os hambúrgueres e aproveitam o tempo. ✨ /// info | Informação -Belas ilustrações de Ketrina Thompson. 🎨 +Belas ilustrações de [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨 /// @@ -207,7 +207,7 @@ Não houve muita conversa ou flerte já que a maior parte do tempo foi gasto esp /// info | Informação -Belas ilustrações de Ketrina Thompson. 🎨 +Belas ilustrações de [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨 /// @@ -251,7 +251,7 @@ Esse tipo de assincronicidade é o que fez NodeJS popular (embora NodeJS não se E esse é o mesmo nível de performance que você tem com o **FastAPI**. -E como você pode ter paralelismo e assincronicidade ao mesmo tempo, você tem uma maior performance do que a maioria dos frameworks NodeJS testados e lado a lado com Go, que é uma linguagem compilada, mais próxima ao C (tudo graças ao Starlette). +E como você pode ter paralelismo e assincronicidade ao mesmo tempo, você tem uma maior performance do que a maioria dos frameworks NodeJS testados e lado a lado com Go, que é uma linguagem compilada, mais próxima ao C [(tudo graças ao Starlette)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1). ### Concorrência é melhor que paralelismo? { #is-concurrency-better-than-parallelism } @@ -277,7 +277,7 @@ Mas nesse caso, se você trouxesse os 8 ex-caixas / cozinheiros / agora-faxineir Nesse cenário, cada um dos faxineiros (incluindo você) poderia ser um processador, fazendo a sua parte do trabalho. -E a maior parte do tempo de execução é tomada por trabalho real (ao invés de ficar esperando), e o trabalho em um computador é feito pela CPU. Eles chamam esses problemas de "limitados por CPU". +E a maior parte do tempo de execução é tomada por trabalho real (ao invés de ficar esperando), e o trabalho em um computador é feito pela CPU. Eles chamam esses problemas de "limitados por CPU". --- @@ -298,7 +298,7 @@ Mas você também pode explorar os benefícios do paralelismo e multiprocessamen 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). -Para ver como alcançar esse paralelismo em produção veja a seção sobre [Implantação](deployment/index.md){.internal-link target=_blank}. +Para ver como alcançar esse paralelismo em produção veja a seção sobre [Implantação](deployment/index.md). ## `async` e `await` { #async-and-await } @@ -363,13 +363,13 @@ Mas se você quiser usar `async` / `await` sem FastAPI, você também pode fazê ### Escreva seu próprio código assíncrono { #write-your-own-async-code } -Starlette (e **FastAPI**) são baseados no AnyIO, o que o torna compatível com ambos o asyncio da biblioteca padrão do Python, e o Trio. +Starlette (e **FastAPI**) são baseados no [AnyIO](https://anyio.readthedocs.io/en/stable/), o que o torna compatível com ambos o [asyncio](https://docs.python.org/3/library/asyncio-task.html) da biblioteca padrão do Python, e o [Trio](https://trio.readthedocs.io/en/stable/). -Em particular, você pode usar diretamente o AnyIO para seus casos de uso avançados de concorrência que requerem padrões mais avançados no seu próprio código. +Em particular, você pode usar diretamente o [AnyIO](https://anyio.readthedocs.io/en/stable/) para seus casos de uso avançados de concorrência que requerem padrões mais avançados no seu próprio código. -E até se você não estiver utilizando FastAPI, você também pode escrever suas próprias aplicações assíncronas com o AnyIO por ser altamente compatível e ganhar seus benefícios (e.g. *concorrência estruturada*). +E até se você não estiver utilizando FastAPI, você também pode escrever suas próprias aplicações assíncronas com o [AnyIO](https://anyio.readthedocs.io/en/stable/) por ser altamente compatível e ganhar seus benefícios (e.g. *concorrência estruturada*). -Eu criei outra biblioteca em cima do AnyIO, como uma fina camada acima, para melhorar um pouco as anotações de tipo e obter melhor **preenchimento automático**, **erros inline**, etc. Ela também possui uma introdução amigável e um tutorial para ajudar você a **entender** e escrever **seu próprio código async**: Asyncer. Seria particularmente útil se você precisar **combinar código async com código regular** (bloqueador/síncrono). +Eu criei outra biblioteca em cima do AnyIO, como uma fina camada acima, para melhorar um pouco as anotações de tipo e obter melhor **preenchimento automático**, **erros inline**, etc. Ela também possui uma introdução amigável e um tutorial para ajudar você a **entender** e escrever **seu próprio código async**: [Asyncer](https://asyncer.tiangolo.com/). Seria particularmente útil se você precisar **combinar código async com código regular** (bloqueador/síncrono). ### Outras formas de código assíncrono { #other-forms-of-asynchronous-code } @@ -381,7 +381,7 @@ Essa mesma sintaxe (ou quase a mesma) foi também incluída recentemente em vers Mas antes disso, controlar código assíncrono era bem mais complexo e difícil. -Nas versões anteriores do Python, você poderia utilizar threads ou Gevent. Mas o código é bem mais complexo de entender, debugar, e pensar sobre. +Nas versões anteriores do Python, você poderia utilizar threads ou [Gevent](https://www.gevent.org/). Mas o código é bem mais complexo de entender, debugar, e pensar sobre. Nas versões anteriores do NodeJS / Navegador JavaScript, você utilizaria "callbacks". O que leva ao "inferno do callback". @@ -417,17 +417,17 @@ Se você tem certo conhecimento técnico (corrotinas, threads, blocking etc) e e Quando você declara uma *função de operação de rota* com `def` normal ao invés de `async def`, ela é rodada em uma threadpool externa que é então aguardada, ao invés de ser chamada diretamente (já que ela bloquearia o servidor). -Se você está chegando de outro framework assíncrono que não funciona como descrito acima e você está acostumado a definir *funções de operação de rota* triviais somente de computação com simples `def` para ter um mínimo ganho de performance (cerca de 100 nanosegundos), por favor observe que no **FastAPI** o efeito pode ser bem o oposto. Nesses casos, é melhor usar `async def` a menos que suas *funções de operação de rota* utilizem código que performe bloqueamento I/O. +Se você está chegando de outro framework assíncrono que não funciona como descrito acima e você está acostumado a definir *funções de operação de rota* triviais somente de computação com simples `def` para ter um mínimo ganho de performance (cerca de 100 nanosegundos), por favor observe que no **FastAPI** o efeito pode ser bem o oposto. Nesses casos, é melhor usar `async def` a menos que suas *funções de operação de rota* utilizem código que performe bloqueamento I/O. -Ainda, em ambas as situações, as chances são que o **FastAPI** [ainda será mais rápido](index.md#performance){.internal-link target=_blank} do que (ou ao menos comparável a) seu framework anterior. +Ainda, em ambas as situações, as chances são que o **FastAPI** [ainda será mais rápido](index.md#performance) do que (ou ao menos comparável a) seu framework anterior. ### Dependências { #dependencies } -O mesmo se aplica para as [dependências](tutorial/dependencies/index.md){.internal-link target=_blank}. 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 tem as funções com padrão `def` ao invés de `async def`, ela é rodada no threadpool externo. ### Sub-dependências { #sub-dependencies } -Você pode ter múltiplas dependências e [sub-dependências](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} requisitando uma à outra (como parâmetros de definições de funções), algumas delas podem ser criadas com `async def` e algumas com `def` normal. Isso ainda funcionaria, e aquelas criadas com `def` normal seriam chamadas em uma thread externa (do threadpool) ao invés de serem "aguardadas". +Você pode ter múltiplas dependências e [sub-dependências](tutorial/dependencies/sub-dependencies.md) requisitando uma à outra (como parâmetros de definições de funções), algumas delas podem ser criadas com `async def` e algumas com `def` normal. Isso ainda funcionaria, e aquelas criadas com `def` normal seriam chamadas em uma thread externa (do threadpool) ao invés de serem "aguardadas". ### Outras funções de utilidade { #other-utility-functions } diff --git a/docs/pt/docs/benchmarks.md b/docs/pt/docs/benchmarks.md index a54df3d9d5..ac34a4e5e0 100644 --- a/docs/pt/docs/benchmarks.md +++ b/docs/pt/docs/benchmarks.md @@ -1,6 +1,6 @@ # Benchmarks { #benchmarks } -Benchmarks independentes da TechEmpower mostram as aplicações **FastAPI** rodando com Uvicorn como um dos frameworks Python mais rápidos disponíveis, somente atrás dos próprios Starlette e Uvicorn (utilizados internamente pelo FastAPI). +Benchmarks independentes da TechEmpower mostram as aplicações **FastAPI** rodando com Uvicorn como [um dos frameworks Python mais rápidos disponíveis](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), somente atrás dos próprios Starlette e Uvicorn (utilizados internamente pelo FastAPI). Mas quando se checa _benchmarks_ e comparações você deveria ter o seguinte em mente. diff --git a/docs/pt/docs/deployment/cloud.md b/docs/pt/docs/deployment/cloud.md index 2e181146ba..4b0eb9553f 100644 --- a/docs/pt/docs/deployment/cloud.md +++ b/docs/pt/docs/deployment/cloud.md @@ -6,7 +6,7 @@ Na maioria dos casos, os principais provedores de nuvem têm tutoriais para impl ## FastAPI Cloud { #fastapi-cloud } -**FastAPI Cloud** é desenvolvido pelo mesmo autor e equipe por trás do **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** é desenvolvido pelo mesmo autor e equipe por trás do **FastAPI**. Ele simplifica o processo de **criar**, **implantar** e **acessar** uma API com o mínimo de esforço. @@ -16,9 +16,9 @@ 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){.internal-link target=_blank} ✨ também. 🙇 +Alguns outros provedores de nuvem ✨ [**patrocinam o FastAPI**](../help-fastapi.md#sponsor-the-author) ✨ também. 🙇 Você também pode considerá-los para seguir seus tutoriais e experimentar seus serviços: -* Render -* Railway +* [Render](https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi) +* [Railway](https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi) diff --git a/docs/pt/docs/deployment/concepts.md b/docs/pt/docs/deployment/concepts.md index 6af4b177a3..e6338d5eaf 100644 --- a/docs/pt/docs/deployment/concepts.md +++ b/docs/pt/docs/deployment/concepts.md @@ -25,7 +25,7 @@ Mas por enquanto, vamos verificar essas importantes **ideias conceituais**. Esse ## Segurança - HTTPS { #security-https } -No [capítulo anterior sobre HTTPS](https.md){.internal-link target=_blank} aprendemos como o HTTPS fornece criptografia para sua API. +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**. @@ -145,7 +145,7 @@ O cliente receberá um **Erro Interno do Servidor 500** para essa solicitação, 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. 💥 -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 caminho* que não estão quebradas. +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. ### Reiniciar após falha { #restart-after-crash } @@ -190,7 +190,7 @@ Quando você executa **vários processos** do mesmo programa de API, eles são c ### Processos do Trabalhador e Portas { #worker-processes-and-ports } -Lembra da documentação [Sobre HTTPS](https.md){.internal-link target=_blank} que diz que apenas um processo pode escutar em uma combinação de porta e endereço IP em um servidor? +Lembra da documentação [Sobre HTTPS](https.md) que diz que apenas um processo pode escutar em uma combinação de porta e endereço IP em um servidor? Isso ainda é verdade. @@ -204,7 +204,7 @@ E vários processos normalmente **não compartilham nenhuma memória**. Isso sig ### Memória do servidor { #server-memory } -Por exemplo, se seu código carrega um modelo de Machine Learning com **1 GB de tamanho**, quando você executa um processo com sua API, ele consumirá pelo menos 1 GB de RAM. E se você iniciar **4 processos** (4 trabalhadores), cada um consumirá 1 GB de RAM. Então, no total, sua API consumirá **4 GB de RAM**. +Por exemplo, se seu código carrega um modelo de Aprendizado de Máquina com **1 GB de tamanho**, quando você executa um processo com sua API, ele consumirá pelo menos 1 GB de RAM. E se você iniciar **4 processos** (4 trabalhadores), cada um consumirá 1 GB de RAM. Então, no total, sua API consumirá **4 GB de RAM**. E se o seu servidor remoto ou máquina virtual tiver apenas 3 GB de RAM, tentar carregar mais de 4 GB de RAM causará problemas. 🚨 @@ -243,7 +243,7 @@ Aqui estão algumas combinações e estratégias possíveis: Não se preocupe se alguns desses itens sobre **contêineres**, Docker ou Kubernetes ainda não fizerem muito sentido. -Falarei mais sobre imagens de contêiner, Docker, Kubernetes, etc. em um capítulo futuro: [FastAPI em contêineres - Docker](docker.md){.internal-link target=_blank}. +Falarei mais sobre imagens de contêiner, Docker, Kubernetes, etc. em um capítulo futuro: [FastAPI em contêineres - Docker](docker.md). /// @@ -281,7 +281,7 @@ Aqui estão algumas ideias possíveis: /// tip | Dica -Darei exemplos mais concretos de como fazer isso com contêineres em um capítulo futuro: [FastAPI em contêineres - Docker](docker.md){.internal-link target=_blank}. +Darei exemplos mais concretos de como fazer isso com contêineres em um capítulo futuro: [FastAPI em contêineres - Docker](docker.md). /// diff --git a/docs/pt/docs/deployment/docker.md b/docs/pt/docs/deployment/docker.md index 4663e96a11..33e23351f3 100644 --- a/docs/pt/docs/deployment/docker.md +++ b/docs/pt/docs/deployment/docker.md @@ -1,6 +1,6 @@ # FastAPI em contêineres - Docker { #fastapi-in-containers-docker } -Ao fazer o deploy de aplicações FastAPI uma abordagem comum é construir uma **imagem de contêiner Linux**. Isso normalmente é feito usando o **Docker**. Você pode a partir disso fazer o deploy dessa imagem de algumas maneiras. +Ao fazer o deploy de aplicações FastAPI uma abordagem comum é construir uma **imagem de contêiner Linux**. Isso normalmente é feito usando o [**Docker**](https://www.docker.com/). Você pode a partir disso fazer o deploy dessa imagem de algumas maneiras. Usando contêineres Linux você tem diversas vantagens incluindo **segurança**, **replicabilidade**, **simplicidade**, entre outras. @@ -60,16 +60,16 @@ E o **contêiner** em si (em contraste à **imagem de contêiner**) é a própri Docker tem sido uma das principais ferramentas para criar e gerenciar **imagens de contêiner** e **contêineres**. -E existe um Docker Hub público com **imagens de contêiner oficiais** pré-prontas para diversas ferramentas, ambientes, bancos de dados e aplicações. +E existe um [Docker Hub](https://hub.docker.com/) público com **imagens de contêiner oficiais** pré-prontas para diversas ferramentas, ambientes, bancos de dados e aplicações. -Por exemplo, há uma Imagem Python oficial. +Por exemplo, há uma [Imagem Python](https://hub.docker.com/_/python) oficial. E existe muitas outras imagens para diferentes coisas, como bancos de dados, por exemplo: -* PostgreSQL -* MySQL -* MongoDB -* Redis, etc. +* [PostgreSQL](https://hub.docker.com/_/postgres) +* [MySQL](https://hub.docker.com/_/mysql) +* [MongoDB](https://hub.docker.com/_/mongo) +* [Redis](https://hub.docker.com/_/redis), etc. Usando imagens de contêiner pré-prontas é muito fácil **combinar** e usar diferentes ferramentas. Por exemplo, para testar um novo banco de dados. Em muitos casos, você pode usar as **imagens oficiais**, precisando somente de variáveis de ambiente para configurá-las. @@ -111,7 +111,7 @@ Isso pode depender principalmente da ferramenta que você usa para **instalar** A forma mais comum de fazer isso é ter um arquivo `requirements.txt` com os nomes dos pacotes e suas versões, um por linha. -Você, naturalmente, usaria as mesmas ideias que você leu em [Sobre versões do FastAPI](versions.md){.internal-link target=_blank} para definir os intervalos de versões. +Você, naturalmente, usaria as mesmas ideias que você leu em [Sobre versões do FastAPI](versions.md) para definir os intervalos de versões. Por exemplo, seu `requirements.txt` poderia parecer com: @@ -238,7 +238,7 @@ Certifique-se de **sempre** usar a **forma exec** da instrução `CMD`, como exp #### Use `CMD` - Forma Exec { #use-cmd-exec-form } -A instrução `CMD` no Docker pode ser escrita de duas formas: +A instrução [`CMD`](https://docs.docker.com/reference/dockerfile/#cmd) no Docker pode ser escrita de duas formas: ✅ Forma **Exec**: @@ -254,11 +254,11 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] CMD fastapi run app/main.py --port 80 ``` -Garanta que você sempre use a forma **exec** para assegurar que o FastAPI consiga encerrar graciosamente e que os [eventos de lifespan](../advanced/events.md){.internal-link target=_blank} sejam disparados. +Garanta que você sempre use a forma **exec** para assegurar que o FastAPI consiga encerrar graciosamente e que os [eventos de lifespan](../advanced/events.md) sejam disparados. -Você pode ler mais na documentação do Docker sobre as formas shell e exec. +Você pode ler mais na [documentação do Docker sobre as formas shell e exec](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form). -Isso pode ser bem perceptível ao usar `docker compose`. Veja esta seção de FAQ do Docker Compose para mais detalhes técnicos: Por que meus serviços demoram 10 segundos para recriar ou parar?. +Isso pode ser bem perceptível ao usar `docker compose`. Veja esta seção de FAQ do Docker Compose para mais detalhes técnicos: [Por que meus serviços demoram 10 segundos para recriar ou parar?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop). #### Estrutura de diretórios { #directory-structure } @@ -352,7 +352,7 @@ $ docker run -d --name mycontainer -p 80:80 myimage ## Verifique { #check-it } -Você deve ser capaz de verificar isso no URL do seu contêiner Docker, por exemplo: http://192.168.99.100/items/5?q=somequery ou http://127.0.0.1/items/5?q=somequery (ou equivalente, usando seu host Docker). +Você deve ser capaz de verificar isso no URL do seu contêiner Docker, por exemplo: [http://192.168.99.100/items/5?q=somequery](http://192.168.99.100/items/5?q=somequery) ou [http://127.0.0.1/items/5?q=somequery](http://127.0.0.1/items/5?q=somequery) (ou equivalente, usando seu host Docker). Você verá algo como: @@ -362,17 +362,17 @@ Você verá algo como: ## Documentação interativa da API { #interactive-api-docs } -Agora você pode ir para http://192.168.99.100/docs ou http://127.0.0.1/docs (ou equivalente, usando seu host Docker). +Agora você pode ir para [http://192.168.99.100/docs](http://192.168.99.100/docs) ou [http://127.0.0.1/docs](http://127.0.0.1/docs) (ou equivalente, usando seu host Docker). -Você verá a documentação interativa automática da API (fornecida pelo Swagger UI): +Você verá a documentação interativa automática da API (fornecida pelo [Swagger UI](https://github.com/swagger-api/swagger-ui)): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ## Documentação alternativa da API { #alternative-api-docs } -E você também pode ir para http://192.168.99.100/redoc ou http://127.0.0.1/redoc (ou equivalente, usando seu host Docker). +E você também pode ir para [http://192.168.99.100/redoc](http://192.168.99.100/redoc) ou [http://127.0.0.1/redoc](http://127.0.0.1/redoc) (ou equivalente, usando seu host Docker). -Você verá a documentação alternativa automática (fornecida pela ReDoc): +Você verá a documentação alternativa automática (fornecida pelo [ReDoc](https://github.com/Rebilly/ReDoc)): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -413,7 +413,7 @@ Quando você passa o arquivo para `fastapi run` ele detecta automaticamente que ## Conceitos de Implantação { #deployment-concepts } -Vamos falar novamente sobre alguns dos mesmos [Conceitos de Implantação](concepts.md){.internal-link target=_blank} em termos de contêineres. +Vamos falar novamente sobre alguns dos mesmos [Conceitos de Implantação](concepts.md) em termos de contêineres. Contêineres são principalmente uma ferramenta para simplificar o processo de **construção e implantação** de um aplicativo, mas eles não impõem uma abordagem particular para lidar com esses **conceitos de implantação** e existem várias estratégias possíveis. @@ -432,7 +432,7 @@ Vamos revisar esses **conceitos de implantação** em termos de contêineres: Se nos concentrarmos apenas na **imagem do contêiner** para um aplicativo FastAPI (e posteriormente no **contêiner** em execução), o HTTPS normalmente seria tratado **externamente** por outra ferramenta. -Isso poderia ser outro contêiner, por exemplo, com Traefik, lidando com **HTTPS** e aquisição **automática** de **certificados**. +Isso poderia ser outro contêiner, por exemplo, com [Traefik](https://traefik.io/), lidando com **HTTPS** e aquisição **automática** de **certificados**. /// tip | Dica @@ -558,7 +558,7 @@ Se você tiver **múltiplos contêineres**, provavelmente cada um executando um /// info | Informação -Se você estiver usando o Kubernetes, provavelmente será um Init Container. +Se você estiver usando o Kubernetes, provavelmente será um [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/). /// @@ -570,7 +570,7 @@ Se você tiver uma configuração simples, com um **único contêiner** que ent ### Imagem Docker base { #base-docker-image } -Antes havia uma imagem oficial do FastAPI para Docker: tiangolo/uvicorn-gunicorn-fastapi. Mas agora ela está descontinuada. ⛔️ +Antes havia uma imagem oficial do FastAPI para Docker: [tiangolo/uvicorn-gunicorn-fastapi](https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker). Mas agora ela está descontinuada. ⛔️ Você provavelmente **não** deve usar essa imagem base do Docker (ou qualquer outra semelhante). @@ -600,7 +600,7 @@ Por exemplo: ## Imagem Docker com `uv` { #docker-image-with-uv } -Se você está usando o uv para instalar e gerenciar seu projeto, você pode seguir o guia de Docker do uv. +Se você está usando o [uv](https://github.com/astral-sh/uv) para instalar e gerenciar seu projeto, você pode seguir o [guia de Docker do uv](https://docs.astral.sh/uv/guides/integration/docker/). ## Recapitulando { #recap } diff --git a/docs/pt/docs/deployment/fastapicloud.md b/docs/pt/docs/deployment/fastapicloud.md index 03d3bd03be..26ec85ac07 100644 --- a/docs/pt/docs/deployment/fastapicloud.md +++ b/docs/pt/docs/deployment/fastapicloud.md @@ -1,6 +1,6 @@ # FastAPI Cloud { #fastapi-cloud } -Você pode implantar sua aplicação FastAPI no FastAPI Cloud com um **único comando**; entre na lista de espera, caso ainda não tenha feito isso. 🚀 +Você pode implantar sua aplicação FastAPI no [FastAPI Cloud](https://fastapicloud.com) com um **único comando**; entre na lista de espera, caso ainda não tenha feito isso. 🚀 ## Login { #login } @@ -40,7 +40,7 @@ Deploying to FastAPI Cloud... ## Sobre o FastAPI Cloud { #about-fastapi-cloud } -O **FastAPI Cloud** é desenvolvido pelo mesmo autor e equipe por trás do **FastAPI**. +O **[FastAPI Cloud](https://fastapicloud.com)** é desenvolvido pelo mesmo autor e equipe por trás do **FastAPI**. Ele simplifica o processo de **criar**, **implantar** e **acessar** uma API com esforço mínimo. diff --git a/docs/pt/docs/deployment/https.md b/docs/pt/docs/deployment/https.md index ccd842adbc..0e8ae2ba64 100644 --- a/docs/pt/docs/deployment/https.md +++ b/docs/pt/docs/deployment/https.md @@ -10,7 +10,7 @@ Se você está com pressa ou não se importa, continue com as seções seguintes /// -Para aprender o básico de HTTPS do ponto de vista do consumidor, verifique https://howhttps.works/. +Para aprender o básico de HTTPS do ponto de vista do consumidor, verifique [https://howhttps.works/](https://howhttps.works/). Agora, a partir de uma perspectiva do desenvolvedor, aqui estão algumas coisas para ter em mente ao pensar em HTTPS: @@ -28,13 +28,13 @@ Agora, a partir de uma perspectiva do desenvolvedor, aqui estão algumas coisas * Por padrão, isso significa que você só pode ter um certificado HTTPS por endereço IP. * Não importa o tamanho do seu servidor ou quão pequeno cada aplicativo que você tem nele possa ser. * No entanto, existe uma solução para isso. -* Há uma extensão para o protocolo TLS (aquele que lida com a criptografia no nível TCP, antes do HTTP) chamada SNI. +* Há uma extensão para o protocolo TLS (aquele que lida com a criptografia no nível TCP, antes do HTTP) chamada [SNI](https://en.wikipedia.org/wiki/Server_Name_Indication). * Esta extensão SNI permite que um único servidor (com um único endereço IP) tenha vários certificados HTTPS e atenda a vários domínios / aplicativos HTTPS. * Para que isso funcione, um único componente (programa) em execução no servidor, ouvindo no endereço IP público, deve ter todos os certificados HTTPS no servidor. * Depois de obter uma conexão segura, o protocolo de comunicação ainda é HTTP. * Os conteúdos são criptografados, embora sejam enviados com o protocolo HTTP. -É uma prática comum ter um programa/servidor HTTP em execução no servidor (máquina, host, etc.) e gerenciar todas as partes HTTPS: recebendo as requisições HTTPS encriptadas, enviando as solicitações HTTP descriptografadas para o aplicativo HTTP real em execução no mesmo servidor (a aplicação FastAPI, neste caso), pegar a resposta HTTP do aplicativo, criptografá-la usando o certificado HTTPS apropriado e enviá-la de volta ao cliente usando HTTPS. Este servidor é frequentemente chamado de Proxy de Terminação TLS. +É uma prática comum ter um programa/servidor HTTP em execução no servidor (máquina, host, etc.) e gerenciar todas as partes HTTPS: recebendo as requisições HTTPS encriptadas, enviando as solicitações HTTP descriptografadas para o aplicativo HTTP real em execução no mesmo servidor (a aplicação FastAPI, neste caso), pegar a resposta HTTP do aplicativo, criptografá-la usando o certificado HTTPS apropriado e enviá-la de volta ao cliente usando HTTPS. Este servidor é frequentemente chamado de [Proxy de Terminação TLS](https://en.wikipedia.org/wiki/TLS_termination_proxy). Algumas das opções que você pode usar como Proxy de Terminação TLS são: @@ -49,7 +49,7 @@ Antes de Let's Encrypt, esses certificados HTTPS eram vendidos por terceiros con O processo de aquisição de um desses certificados costumava ser complicado, exigia bastante papelada e os certificados eram bastante caros. -Mas então o Let's Encrypt foi criado. +Mas então o [Let's Encrypt](https://letsencrypt.org/) foi criado. Ele é um projeto da Linux Foundation que fornece certificados HTTPS gratuitamente. De forma automatizada. Esses certificados usam toda a segurança criptográfica padrão e têm vida curta (cerca de 3 meses), então a segurança é, na verdade, melhor por causa do seu lifespan reduzido. @@ -200,9 +200,9 @@ Esse proxy normalmente define alguns cabeçalhos HTTP dinamicamente antes de tra Os cabeçalhos do proxy são: -* X-Forwarded-For -* X-Forwarded-Proto -* X-Forwarded-Host +* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For) +* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto) +* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host) /// @@ -218,7 +218,7 @@ Isso seria útil, por exemplo, para lidar corretamente com redirecionamentos. /// tip | Dica -Você pode saber mais sobre isso na documentação em [Atrás de um Proxy - Habilitar cabeçalhos encaminhados pelo proxy](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers){.internal-link target=_blank} +Você pode saber mais sobre isso na documentação em [Atrás de um Proxy - Habilitar cabeçalhos encaminhados pelo proxy](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers) /// diff --git a/docs/pt/docs/deployment/index.md b/docs/pt/docs/deployment/index.md index d9755d0a2b..da4194f014 100644 --- a/docs/pt/docs/deployment/index.md +++ b/docs/pt/docs/deployment/index.md @@ -16,7 +16,7 @@ Há várias maneiras de fazer isso, dependendo do seu caso de uso específico e Você pode **implantar um servidor** por conta própria usando uma combinação de ferramentas, pode usar um **serviço em nuvem** que faça parte do trabalho por você, entre outras opções. -Por exemplo, nós, a equipe por trás do FastAPI, criamos **FastAPI Cloud**, para tornar a implantação de aplicações FastAPI na nuvem o mais simples possível, com a mesma experiência de desenvolvimento de trabalhar com o FastAPI. +Por exemplo, nós, a equipe por trás do FastAPI, criamos [**FastAPI Cloud**](https://fastapicloud.com), para tornar a implantação de aplicações FastAPI na nuvem o mais simples possível, com a mesma experiência de desenvolvimento de trabalhar com o FastAPI. Vou mostrar alguns dos principais conceitos que você provavelmente deve ter em mente ao implantar uma aplicação **FastAPI** (embora a maior parte se aplique a qualquer outro tipo de aplicação web). diff --git a/docs/pt/docs/deployment/manually.md b/docs/pt/docs/deployment/manually.md index da3a52cf3a..19ed1a4abb 100644 --- a/docs/pt/docs/deployment/manually.md +++ b/docs/pt/docs/deployment/manually.md @@ -52,11 +52,11 @@ A principal coisa que você precisa para executar uma aplicação **FastAPI** (o Existem diversas alternativas, incluindo: -* Uvicorn: um servidor ASGI de alta performance. -* Hypercorn: um servidor ASGI compatível com HTTP/2, Trio e outros recursos. -* Daphne: servidor ASGI construído para Django Channels. -* Granian: um servidor HTTP Rust para aplicações Python. -* NGINX Unit: NGINX Unit é um runtime de aplicação web leve e versátil. +* [Uvicorn](https://www.uvicorn.dev/): um servidor ASGI de alta performance. +* [Hypercorn](https://hypercorn.readthedocs.io/): um servidor ASGI compatível com HTTP/2, Trio e outros recursos. +* [Daphne](https://github.com/django/daphne): servidor ASGI construído para Django Channels. +* [Granian](https://github.com/emmett-framework/granian): um servidor HTTP Rust para aplicações Python. +* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit é um runtime de aplicação web leve e versátil. ## Máquina Servidora e Programa Servidor { #server-machine-and-server-program } @@ -74,7 +74,7 @@ Quando você instala o FastAPI, ele vem com um servidor de produção, o Uvicorn Mas você também pode instalar um servidor ASGI manualmente. -Certifique-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo e, em seguida, você pode instalar a aplicação do servidor. +Certifique-se de criar um [ambiente virtual](../virtual-environments.md), ativá-lo e, em seguida, você pode instalar a aplicação do servidor. Por exemplo, para instalar o Uvicorn: diff --git a/docs/pt/docs/deployment/server-workers.md b/docs/pt/docs/deployment/server-workers.md index bfb1e66873..98c1877c22 100644 --- a/docs/pt/docs/deployment/server-workers.md +++ b/docs/pt/docs/deployment/server-workers.md @@ -13,13 +13,13 @@ Até este ponto, com todos os tutoriais nos documentos, você provavelmente esta Ao implantar aplicativos, você provavelmente desejará ter alguma **replicação de processos** para aproveitar **vários núcleos** e poder lidar com mais solicitações. -Como você viu no capítulo anterior sobre [Conceitos de implantação](concepts.md){.internal-link target=_blank}, há várias estratégias que você pode usar. +Como você viu no capítulo anterior sobre [Conceitos de implantação](concepts.md), há várias estratégias que você pode usar. Aqui mostrarei como usar o **Uvicorn** com **processos de trabalho** usando o comando `fastapi` ou o comando `uvicorn` diretamente. /// info | Informação -Se você estiver usando contêineres, por exemplo com Docker ou Kubernetes, falarei mais sobre isso no próximo capítulo: [FastAPI em contêineres - Docker](docker.md){.internal-link target=_blank}. +Se você estiver usando contêineres, por exemplo com Docker ou Kubernetes, falarei mais sobre isso no próximo capítulo: [FastAPI em contêineres - Docker](docker.md). Em particular, ao executar no **Kubernetes** você provavelmente **não** vai querer usar vários trabalhadores e, em vez disso, executar **um único processo Uvicorn por contêiner**, mas falarei sobre isso mais adiante neste capítulo. @@ -126,7 +126,7 @@ Da lista de conceitos de implantação acima, o uso de trabalhadores ajudaria pr ## Contêineres e Docker { #containers-and-docker } -No próximo capítulo sobre [FastAPI em contêineres - Docker](docker.md){.internal-link target=_blank}, explicarei algumas estratégias que você pode usar para lidar com os outros **conceitos de implantação**. +No próximo capítulo sobre [FastAPI em contêineres - Docker](docker.md), explicarei algumas estratégias que você pode usar para lidar com os outros **conceitos de implantação**. Vou mostrar como **construir sua própria imagem do zero** para executar um único processo Uvicorn. É um processo simples e provavelmente é o que você gostaria de fazer ao usar um sistema de gerenciamento de contêineres distribuídos como o **Kubernetes**. diff --git a/docs/pt/docs/deployment/versions.md b/docs/pt/docs/deployment/versions.md index 32676da236..e20019c79b 100644 --- a/docs/pt/docs/deployment/versions.md +++ b/docs/pt/docs/deployment/versions.md @@ -4,7 +4,7 @@ Novas funcionalidades são adicionadas com frequência, bugs são corrigidos regularmente e o código continua melhorando continuamente. -É por isso que as versões atuais ainda são `0.x.x`, isso reflete que cada versão pode potencialmente ter mudanças significativas. Isso segue as convenções de Versionamento Semântico. +É por isso que as versões atuais ainda são `0.x.x`, isso reflete que cada versão pode potencialmente ter mudanças significativas. Isso segue as convenções de [Versionamento Semântico](https://semver.org/). Você pode criar aplicações de produção com **FastAPI** agora mesmo (e provavelmente já vem fazendo isso há algum tempo), apenas certifique-se de usar uma versão que funcione corretamente com o resto do seu código. @@ -34,7 +34,7 @@ Se você usa qualquer outra ferramenta para gerenciar suas instalações, como ` ## Versões disponíveis { #available-versions } -Você pode ver as versões disponíveis (por exemplo, para verificar qual é a mais recente) nas [Release Notes](../release-notes.md){.internal-link target=_blank}. +Você pode ver as versões disponíveis (por exemplo, para verificar qual é a mais recente) nas [Release Notes](../release-notes.md). ## Sobre versões { #about-versions } @@ -66,7 +66,7 @@ O "MINOR" é o número do meio, por exemplo, em `0.2.3`, a versão MINOR é `2`. Você deveria adicionar testes para a sua aplicação. -Com **FastAPI** isso é muito fácil (graças ao Starlette), veja a documentação: [Testes](../tutorial/testing.md){.internal-link target=_blank} +Com **FastAPI** isso é muito fácil (graças ao Starlette), veja a documentação: [Testes](../tutorial/testing.md) Depois que você tiver testes, você pode atualizar a sua versão do **FastAPI** para uma mais recente e se certificar de que todo o seu código está funcionando corretamente executando seus testes. diff --git a/docs/pt/docs/editor-support.md b/docs/pt/docs/editor-support.md new file mode 100644 index 0000000000..7eedd3908e --- /dev/null +++ b/docs/pt/docs/editor-support.md @@ -0,0 +1,23 @@ +# Suporte a Editores { #editor-support } + +A [FastAPI Extension](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) oficial melhora seu fluxo de trabalho de desenvolvimento com descoberta e navegação de *operação de rota*, além de implantação no FastAPI Cloud e transmissão ao vivo de logs. + +Para mais detalhes sobre a extensão, consulte o README no [repositório do GitHub](https://github.com/fastapi/fastapi-vscode). + +## Configuração e Instalação { #setup-and-installation } + +A **FastAPI Extension** está disponível para [VS Code](https://code.visualstudio.com/) e [Cursor](https://www.cursor.com/). Pode ser instalada diretamente pelo painel de Extensões de cada editor, pesquisando por "FastAPI" e selecionando a extensão publicada por **FastAPI Labs**. A extensão também funciona em editores no navegador, como [vscode.dev](https://vscode.dev) e [github.dev](https://github.dev). + +### Descoberta da Aplicação { #application-discovery } + +Por padrão, a extensão descobre automaticamente aplicações FastAPI no seu workspace procurando por arquivos que instanciam `FastAPI()`. Se a detecção automática não funcionar para a estrutura do seu projeto, você pode especificar um ponto de entrada via `[tool.fastapi]` em `pyproject.toml` ou pela configuração `fastapi.entryPoint` do VS Code usando notação de módulo (por exemplo, `myapp.main:app`). + +## Funcionalidades { #features } + +- **Explorador de Operações de Rota** - Uma visualização em árvore na barra lateral de todas as *operações de rota* da sua aplicação. Clique para ir diretamente a qualquer definição de rota ou de router. +- **Pesquisa de Rotas** - Pesquise por path, método ou nome com Ctrl + Shift + E (no macOS: Cmd + Shift + E). +- **Navegação com CodeLens** - Links clicáveis acima das chamadas do cliente de testes (por exemplo, `client.get('/items')`) que levam à *operação de rota* correspondente, facilitando a navegação entre testes e implementação. +- **Implantar no FastAPI Cloud** - Implantação com um clique da sua aplicação no [FastAPI Cloud](https://fastapicloud.com/). +- **Transmitir logs da aplicação** - Transmissão em tempo real dos logs da aplicação implantada no FastAPI Cloud, com filtragem por nível e busca de texto. + +Se quiser se familiarizar com as funcionalidades da extensão, você pode abrir o walkthrough da extensão acessando a Paleta de Comandos (Ctrl + Shift + P ou no macOS: Cmd + Shift + P), selecionando "Welcome: Open walkthrough..." e, em seguida, escolhendo o walkthrough "Get started with FastAPI". diff --git a/docs/pt/docs/environment-variables.md b/docs/pt/docs/environment-variables.md index 342361b913..a464beceeb 100644 --- a/docs/pt/docs/environment-variables.md +++ b/docs/pt/docs/environment-variables.md @@ -65,7 +65,7 @@ print(f"Hello {name} from Python") /// tip | Dica -O segundo argumento para `os.getenv()` é o valor padrão a ser retornado. +O segundo argumento para [`os.getenv()`](https://docs.python.org/3.8/library/os.html#os.getenv) é o valor padrão a ser retornado. Se não for fornecido, é `None` por padrão, Aqui fornecemos `"World"` como o valor padrão a ser usado. @@ -153,7 +153,7 @@ Hello World from Python /// tip | Dica -Você pode ler mais sobre isso em The Twelve-Factor App: Config. +Você pode ler mais sobre isso em [The Twelve-Factor App: Config](https://12factor.net/config). /// @@ -163,7 +163,7 @@ Essas variáveis de ambiente só podem lidar com **strings de texto**, pois são Isso significa que **qualquer valor** lido em Python de uma variável de ambiente **será uma `str`**, e qualquer conversão para um tipo diferente ou qualquer validação precisa ser feita no código. -Você aprenderá mais sobre como usar variáveis de ambiente para lidar com **configurações do aplicativo** no [Guia do Usuário Avançado - Configurações e Variáveis de Ambiente](./advanced/settings.md){.internal-link target=_blank}. +Você aprenderá mais sobre como usar variáveis de ambiente para lidar com **configurações do aplicativo** no [Guia do Usuário Avançado - Configurações e Variáveis de Ambiente](./advanced/settings.md). ## Variável de Ambiente `PATH` { #path-environment-variable } @@ -285,13 +285,13 @@ $ C:\opt\custompython\bin\python //// -Essas informações serão úteis ao aprender sobre [Ambientes Virtuais](virtual-environments.md){.internal-link target=_blank}. +Essas informações serão úteis ao aprender sobre [Ambientes Virtuais](virtual-environments.md). ## Conclusão { #conclusion } Com isso, você deve ter uma compreensão básica do que são **variáveis ​​de ambiente** e como usá-las em Python. -Você também pode ler mais sobre elas na Wikipedia para Variáveis ​​de Ambiente. +Você também pode ler mais sobre elas na [Wikipedia para Variáveis ​​de Ambiente](https://en.wikipedia.org/wiki/Environment_variable). Em muitos casos, não é muito óbvio como as variáveis ​​de ambiente seriam úteis e aplicáveis ​​imediatamente. Mas elas continuam aparecendo em muitos cenários diferentes quando você está desenvolvendo, então é bom saber sobre elas. diff --git a/docs/pt/docs/fastapi-cli.md b/docs/pt/docs/fastapi-cli.md index f1e633a236..2a1a7da9fa 100644 --- a/docs/pt/docs/fastapi-cli.md +++ b/docs/pt/docs/fastapi-cli.md @@ -1,15 +1,15 @@ # FastAPI CLI { #fastapi-cli } -**FastAPI CLI** é um programa de linha de comando que você pode usar para servir sua aplicação FastAPI, gerenciar seu projeto FastAPI e muito mais. +**FastAPI CLI** é um programa de linha de comando que você pode usar para servir sua aplicação FastAPI, gerenciar seu projeto FastAPI e muito mais. -Quando você instala o FastAPI (por exemplo, com `pip install "fastapi[standard]"`), isso inclui um pacote chamado `fastapi-cli`; esse pacote disponibiliza o comando `fastapi` no terminal. +Quando você instala o FastAPI (por exemplo, com `pip install "fastapi[standard]"`), ele vem com um programa de linha de comando que você pode executar no terminal. Para executar sua aplicação FastAPI durante o desenvolvimento, você pode usar o comando `fastapi dev`:
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -46,30 +46,83 @@ $ fastapi dev Uvicorn, um servidor ASGI de alta performance e pronto para produção. 😎 +Além disso, outras ferramentas podem não conseguir encontrá-la, por exemplo a [Extensão do VS Code](editor-support.md) ou a [FastAPI Cloud](https://fastapicloud.com), então é recomendado usar o `entrypoint` em `pyproject.toml`. ## `fastapi dev` { #fastapi-dev } Executar `fastapi dev` inicia o modo de desenvolvimento. -Por padrão, o recarregamento automático está ativado, recarregando o servidor automaticamente quando você faz mudanças no seu código. Isso consome muitos recursos e pode ser menos estável do que quando está desativado. Você deveria usá-lo apenas no desenvolvimento. Ele também escuta no endereço IP `127.0.0.1`, que é o IP para a sua máquina se comunicar apenas consigo mesma (`localhost`). +Por padrão, o **recarregamento automático** está ativado, recarregando o servidor automaticamente quando você faz mudanças no seu código. Isso consome muitos recursos e pode ser menos estável do que quando está desativado. Você deveria usá-lo apenas no desenvolvimento. Ele também escuta no endereço IP `127.0.0.1`, que é o IP para a sua máquina se comunicar apenas consigo mesma (`localhost`). ## `fastapi run` { #fastapi-run } -Executar `fastapi run` inicia o FastAPI em modo de produção por padrão. +Executar `fastapi run` inicia o FastAPI em modo de produção. -Por padrão, o recarregamento automático está desativado. Ele também escuta no endereço IP `0.0.0.0`, o que significa todos os endereços IP disponíveis; dessa forma, ficará acessível publicamente para qualquer pessoa que consiga se comunicar com a máquina. É assim que você normalmente o executaria em produção, por exemplo, em um contêiner. +Por padrão, o **recarregamento automático** está desativado. Ele também escuta no endereço IP `0.0.0.0`, o que significa todos os endereços IP disponíveis; dessa forma, ficará acessível publicamente para qualquer pessoa que consiga se comunicar com a máquina. É assim que você normalmente o executaria em produção, por exemplo, em um contêiner. -Na maioria dos casos, você teria (e deveria ter) um "proxy de terminação" tratando o HTTPS por cima; isso dependerá de como você faz o deploy da sua aplicação, seu provedor pode fazer isso por você ou talvez seja necessário que você configure isso por conta própria. +Na maioria dos casos, você teria (e você deveria ter) um "proxy de terminação" tratando o HTTPS por cima; isso dependerá de como você faz o deploy da sua aplicação, seu provedor pode fazer isso por você ou talvez seja necessário que você configure isso por conta própria. /// tip | Dica -Você pode aprender mais sobre isso na [documentação de deployment](deployment/index.md){.internal-link target=_blank}. +Você pode aprender mais sobre isso na [documentação de deployment](deployment/index.md). /// diff --git a/docs/pt/docs/features.md b/docs/pt/docs/features.md index a417d5fff3..bd7fb093ea 100644 --- a/docs/pt/docs/features.md +++ b/docs/pt/docs/features.md @@ -6,20 +6,20 @@ ### Baseado em padrões abertos { #based-on-open-standards } -* OpenAPI para criação de APIs, incluindo declarações de caminho operações, parâmetros, requisições de corpo, segurança etc. -* Modelo de documentação automática com JSON Schema (já que o OpenAPI em si é baseado no JSON Schema). -* Projetado em cima desses padrões após um estudo meticuloso, em vez de uma reflexão breve. +* [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) para criação de APIs, incluindo declarações de caminho operações, parâmetros, requisições de corpo, segurança etc. +* Documentação automática de modelos de dados com [**JSON Schema**](https://json-schema.org/) (já que o OpenAPI em si é baseado no JSON Schema). +* Projetado em torno desses padrões, após um estudo meticuloso. Em vez de uma camada improvisada por cima. * Isso também permite o uso de **geração de código do cliente** automaticamente em muitas linguagens. ### Documentação automática { #automatic-docs } Documentação interativa da API e navegação web da interface de usuário. Como o framework é baseado no OpenAPI, há várias opções, 2 incluídas por padrão. -* Swagger UI, com navegação interativa, chame e teste sua API diretamente do navegador. +* [**Swagger UI**](https://github.com/swagger-api/swagger-ui), com navegação interativa, chame e teste sua API diretamente do navegador. ![Interação Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) -* Documentação alternativa da API com ReDoc. +* Documentação alternativa da API com [**ReDoc**](https://github.com/Rebilly/ReDoc). ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) @@ -27,7 +27,7 @@ Documentação interativa da API e navegação web da interface de usuário. Com Tudo é baseado no padrão das declarações de **tipos do Python** (graças ao Pydantic). Nenhuma sintaxe nova para aprender. Apenas o padrão moderno do Python. -Se você precisa refrescar a memória rapidamente sobre como usar tipos do Python (mesmo que você não use o FastAPI), confira esse rápido tutorial: [Tipos do Python](python-types.md){.internal-link target=_blank}. +Se você precisa refrescar a memória rapidamente sobre como usar tipos do Python (mesmo que você não use o FastAPI), confira esse rápido tutorial: [Tipos do Python](python-types.md). Você escreve Python padrão com tipos: @@ -75,7 +75,7 @@ Passe as chaves e valores do dicionário `second_user_data` diretamente como arg Todo o framework foi projetado para ser fácil e intuitivo de usar, todas as decisões foram testadas em vários editores antes do início do desenvolvimento, para garantir a melhor experiência de desenvolvimento. -Na pesquisa de desenvolvedores Python, ficou claro que um dos recursos mais utilizados é o "preenchimento automático". +Na pesquisa de desenvolvedores Python, ficou claro [que um dos recursos mais utilizados é o "preenchimento automático"](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features). Todo o framework **FastAPI** é feito para satisfazer isso. O preenchimento automático funciona em todos os lugares. @@ -83,11 +83,11 @@ Você raramente precisará voltar à documentação. Aqui está como o editor poderá te ajudar: -* no Visual Studio Code: +* no [Visual Studio Code](https://code.visualstudio.com/): ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) -* no PyCharm: +* no [PyCharm](https://www.jetbrains.com/pycharm/): ![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png) @@ -124,7 +124,7 @@ Segurança e autenticação integradas. Sem nenhum compromisso com bancos de dad Todos os esquemas de seguranças definidos no OpenAPI, incluindo: * HTTP Basic. -* **OAuth2** (também com **tokens JWT**). Confira o tutorial em [OAuth2 com JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. +* **OAuth2** (também com **tokens JWT**). Confira o tutorial em [OAuth2 com JWT](tutorial/security/oauth2-jwt.md). * Chaves de API em: * Headers. * parâmetros da Query. @@ -140,8 +140,8 @@ FastAPI inclui um sistema de Starlette. Então, qualquer código adicional Starlette que você tiver, também funcionará. +**FastAPI** é totalmente compatível com (e baseado no) [**Starlette**](https://www.starlette.dev/). Então, qualquer código adicional Starlette que você tiver, também funcionará. `FastAPI` é na verdade uma sub-classe do `Starlette`. Então, se você já conhece ou usa Starlette, a maioria das funcionalidades se comportará da mesma forma. Com **FastAPI**, você terá todos os recursos do **Starlette** (já que FastAPI é apenas um Starlette com esteróides): -* Desempenho realmente impressionante. É um dos frameworks Python disponíveis mais rápidos, a par com o **NodeJS** e **Go**. +* Desempenho realmente impressionante. É [um dos frameworks Python disponíveis mais rápidos, a par com o **NodeJS** e **Go**](https://github.com/encode/starlette#performance). * Suporte a **WebSocket**. * Tarefas em processo background. * Eventos na inicialização e encerramento. @@ -177,7 +177,7 @@ Com **FastAPI**, você terá todos os recursos do **Starlette** (já que FastAPI ## Recursos do Pydantic { #pydantic-features } -**FastAPI** é totalmente compatível com (e baseado no) Pydantic. Então, qualquer código Pydantic adicional que você tiver, também funcionará. +**FastAPI** é totalmente compatível com (e baseado no) [**Pydantic**](https://docs.pydantic.dev/). Então, qualquer código Pydantic adicional que você tiver, também funcionará. Incluindo bibliotecas externas também baseadas no Pydantic, como ORMs e ODMs para bancos de dados. diff --git a/docs/pt/docs/help-fastapi.md b/docs/pt/docs/help-fastapi.md index 4f58c091f7..3e8ea4b448 100644 --- a/docs/pt/docs/help-fastapi.md +++ b/docs/pt/docs/help-fastapi.md @@ -12,7 +12,7 @@ E também há várias formas de obter ajuda. ## Assine a newsletter { #subscribe-to-the-newsletter } -Você pode assinar a (infrequente) [newsletter do **FastAPI and friends**](newsletter.md){.internal-link target=_blank} para ficar por dentro de: +Você pode assinar a (infrequente) [newsletter do **FastAPI and friends**](newsletter.md) para ficar por dentro de: * Notícias sobre FastAPI e amigos 🚀 * Tutoriais 📝 @@ -22,63 +22,63 @@ Você pode assinar a (infrequente) [newsletter do **FastAPI and friends**](newsl ## Siga o FastAPI no X (Twitter) { #follow-fastapi-on-x-twitter } -Siga @fastapi no **X (Twitter)** para receber as últimas notícias sobre o **FastAPI**. 🐦 +[Siga @fastapi no **X (Twitter)**](https://x.com/fastapi) para receber as últimas notícias sobre o **FastAPI**. 🐦 ## Dê uma estrela ao **FastAPI** no GitHub { #star-fastapi-in-github } -Você pode “marcar com estrela” o FastAPI no GitHub (clicando no botão de estrela no canto superior direito): https://github.com/fastapi/fastapi. ⭐️ +Você pode “marcar com estrela” o FastAPI no GitHub (clicando no botão de estrela no canto superior direito): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). ⭐️ Ao adicionar uma estrela, outras pessoas conseguirão encontrá-lo com mais facilidade e verão que já foi útil para muita gente. ## Acompanhe o repositório no GitHub para lançamentos { #watch-the-github-repository-for-releases } -Você pode “acompanhar” (watch) o FastAPI no GitHub (clicando no botão “watch” no canto superior direito): https://github.com/fastapi/fastapi. 👀 +Você pode “acompanhar” (watch) o FastAPI no GitHub (clicando no botão “watch” no canto superior direito): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀 -Lá você pode selecionar “Apenas lançamentos” (Releases only). +Lá você pode selecionar “Apenas lançamentos”. Fazendo isso, você receberá notificações (no seu email) sempre que houver um novo lançamento (uma nova versão) do **FastAPI** com correções de bugs e novas funcionalidades. ## Conecte-se com o autor { #connect-with-the-author } -Você pode se conectar comigo (Sebastián Ramírez / `tiangolo`), o autor. +Você pode se conectar [comigo (Sebastián Ramírez / `tiangolo`)](https://tiangolo.com), o autor. Você pode: -* Me seguir no **GitHub**. +* [Me seguir no **GitHub**](https://github.com/tiangolo). * Ver outros projetos Open Source que criei e que podem ajudar você. * Me seguir para saber quando eu criar um novo projeto Open Source. -* Me seguir no **X (Twitter)** ou no Mastodon. +* [Me seguir no **X (Twitter)**](https://x.com/tiangolo) ou no [Mastodon](https://fosstodon.org/@tiangolo). * Me contar como você usa o FastAPI (adoro saber disso). * Ficar sabendo quando eu fizer anúncios ou lançar novas ferramentas. - * Você também pode seguir @fastapi no X (Twitter) (uma conta separada). -* Me seguir no **LinkedIn**. + * Você também pode [seguir @fastapi no X (Twitter)](https://x.com/fastapi) (uma conta separada). +* [Me seguir no **LinkedIn**](https://www.linkedin.com/in/tiangolo/). * Ver quando eu fizer anúncios ou lançar novas ferramentas (embora eu use mais o X (Twitter) 🤷‍♂). -* Ler o que escrevo (ou me seguir) no **Dev.to** ou no **Medium**. +* Ler o que escrevo (ou me seguir) no [**Dev.to**](https://dev.to/tiangolo) ou no [**Medium**](https://medium.com/@tiangolo). * Ler outras ideias, artigos e conhecer ferramentas que criei. * Me seguir para ver quando eu publicar algo novo. ## Tweet sobre o **FastAPI** { #tweet-about-fastapi } -Tweet sobre o **FastAPI** e conte para mim e para outras pessoas por que você gosta dele. 🎉 +[Tweet sobre o **FastAPI**](https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi) e conte para mim e para outras pessoas por que você gosta dele. 🎉 Eu adoro saber como o **FastAPI** está sendo usado, o que você tem curtido nele, em qual projeto/empresa você o utiliza, etc. ## Vote no FastAPI { #vote-for-fastapi } -* Vote no **FastAPI** no Slant. -* Vote no **FastAPI** no AlternativeTo. -* Diga que você usa o **FastAPI** no StackShare. +* [Vote no **FastAPI** no Slant](https://www.slant.co/options/34241/~fastapi-review). +* [Vote no **FastAPI** no AlternativeTo](https://alternativeto.net/software/fastapi/about/). +* [Diga que você usa o **FastAPI** no StackShare](https://stackshare.io/pypi-fastapi). ## Ajude outras pessoas com perguntas no GitHub { #help-others-with-questions-in-github } Você pode tentar ajudar outras pessoas com suas perguntas em: -* GitHub Discussions -* GitHub Issues +* [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered) +* [GitHub Issues](https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+) Em muitos casos você já pode saber a resposta para aquelas perguntas. 🤓 -Se você estiver ajudando muitas pessoas com suas perguntas, você se tornará um(a) [Especialista em FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank} oficial. 🎉 +Se você estiver ajudando muitas pessoas com suas perguntas, você se tornará um(a) [Especialista em FastAPI](fastapi-people.md#fastapi-experts) oficial. 🎉 Apenas lembre-se, o ponto mais importante é: tente ser gentil. As pessoas chegam com frustrações e, em muitos casos, não perguntam da melhor forma, mas tente ao máximo ser gentil. 🤗 @@ -104,9 +104,9 @@ Na maioria dos casos e na maioria das perguntas há algo relacionado ao **códig Em muitos casos ela só copia um fragmento do código, mas isso não é suficiente para **reproduzir o problema**. -* Você pode pedir que forneçam um exemplo mínimo, reproduzível, que você possa **copiar e colar** e executar localmente para ver o mesmo erro ou comportamento que elas estão vendo, ou para entender melhor o caso de uso. +* Você pode pedir que forneçam um [exemplo mínimo, reproduzível](https://stackoverflow.com/help/minimal-reproducible-example), que você possa **copiar e colar** e executar localmente para ver o mesmo erro ou comportamento que elas estão vendo, ou para entender melhor o caso de uso. -* Se você estiver muito generoso(a), pode tentar **criar um exemplo** assim você mesmo(a), apenas com base na descrição do problema. Só tenha em mente que isso pode levar bastante tempo e pode ser melhor pedir primeiro que esclareçam o problema. +* Se você estiver muito generoso, pode tentar **criar um exemplo** assim você mesmo, apenas com base na descrição do problema. Só tenha em mente que isso pode levar bastante tempo e pode ser melhor pedir primeiro que esclareçam o problema. ### Sugira soluções { #suggest-solutions } @@ -116,7 +116,7 @@ Em muitos casos ela só copia um fragmento do código, mas isso não é suficien ### Peça para encerrar { #ask-to-close } -Se a pessoa responder, há uma grande chance de você ter resolvido o problema, parabéns, **você é um(a) herói(na)**! 🦸 +Se a pessoa responder, há uma grande chance de você ter resolvido o problema, parabéns, **você é um herói**! 🦸 * Agora, se isso resolveu o problema, você pode pedir para: @@ -125,15 +125,15 @@ Se a pessoa responder, há uma grande chance de você ter resolvido o problema, ## Acompanhe o repositório do GitHub { #watch-the-github-repository } -Você pode “acompanhar” (watch) o FastAPI no GitHub (clicando no botão “watch” no canto superior direito): https://github.com/fastapi/fastapi. 👀 +Você pode “acompanhar” (watch) o FastAPI no GitHub (clicando no botão “watch” no canto superior direito): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀 -Se você selecionar “Acompanhando” (Watching) em vez de “Apenas lançamentos” (Releases only), receberá notificações quando alguém criar uma nova issue ou pergunta. Você também pode especificar que quer ser notificado(a) apenas sobre novas issues, ou discussions, ou PRs, etc. +Se você selecionar “Acompanhando” em vez de “Apenas lançamentos”, receberá notificações quando alguém criar uma nova issue ou pergunta. Você também pode especificar que quer ser notificado apenas sobre novas issues, ou discussions, ou PRs, etc. Assim você pode tentar ajudar a resolver essas questões. ## Faça perguntas { #ask-questions } -Você pode criar uma nova pergunta no repositório do GitHub, por exemplo para: +Você pode [criar uma nova pergunta](https://github.com/fastapi/fastapi/discussions/new?category=questions) no repositório do GitHub, por exemplo para: * Fazer uma **pergunta** ou perguntar sobre um **problema**. * Sugerir uma nova **funcionalidade**. @@ -190,18 +190,18 @@ Por isso, é realmente importante que você leia e execute o código, e me avise * Depois verifique se os testes **passam** após o PR. ✅ -* Muitos PRs não têm testes, você pode **lembrar** a pessoa de adicionar testes, ou até **sugerir** alguns testes você mesmo(a). Essa é uma das coisas que consomem mais tempo e você pode ajudar muito com isso. +* Muitos PRs não têm testes, você pode **lembrar** a pessoa de adicionar testes, ou até **sugerir** alguns testes você mesmo. Essa é uma das coisas que consomem mais tempo e você pode ajudar muito com isso. * Depois também comente o que você testou, assim vou saber que você verificou. 🤓 ## Crie um Pull Request { #create-a-pull-request } -Você pode [contribuir](contributing.md){.internal-link target=_blank} com o código-fonte fazendo Pull Requests, por exemplo: +Você pode [contribuir](contributing.md) com o código-fonte fazendo Pull Requests, por exemplo: * Para corrigir um erro de digitação que você encontrou na documentação. -* Para compartilhar um artigo, vídeo ou podcast que você criou ou encontrou sobre o FastAPI, editando este arquivo. +* Para compartilhar um artigo, vídeo ou podcast que você criou ou encontrou sobre o FastAPI, [editando este arquivo](https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml). * Garanta que você adicione seu link no início da seção correspondente. -* Para ajudar a [traduzir a documentação](contributing.md#translations){.internal-link target=_blank} para seu idioma. +* Para ajudar a [traduzir a documentação](contributing.md#translations) para seu idioma. * Você também pode ajudar a revisar as traduções criadas por outras pessoas. * Para propor novas seções de documentação. * Para corrigir uma issue/bug existente. @@ -218,8 +218,8 @@ Há muito trabalho a fazer e, para a maior parte dele, **VOCÊ** pode ajudar. As principais tarefas que você pode fazer agora são: -* [Ajudar outras pessoas com perguntas no GitHub](#help-others-with-questions-in-github){.internal-link target=_blank} (veja a seção acima). -* [Revisar Pull Requests](#review-pull-requests){.internal-link target=_blank} (veja a seção acima). +* [Ajudar outras pessoas com perguntas no GitHub](#help-others-with-questions-in-github) (veja a seção acima). +* [Revisar Pull Requests](#review-pull-requests) (veja a seção acima). Essas duas tarefas são as que **mais consomem tempo**. Esse é o principal trabalho de manter o FastAPI. @@ -227,11 +227,11 @@ Se você puder me ajudar com isso, **você está me ajudando a manter o FastAPI* ## Entre no chat { #join-the-chat } -Entre no 👥 servidor de chat do Discord 👥 e converse com outras pessoas da comunidade FastAPI. +Entre no 👥 [servidor de chat do Discord](https://discord.gg/VQjSZaeJmf) 👥 e converse com outras pessoas da comunidade FastAPI. /// tip | Dica -Para perguntas, faça-as no GitHub Discussions, há uma chance muito maior de você receber ajuda pelos [Especialistas em FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}. +Para perguntas, faça-as no [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/new?category=questions), há uma chance muito maior de você receber ajuda pelos [Especialistas em FastAPI](fastapi-people.md#fastapi-experts). Use o chat apenas para outras conversas gerais. @@ -241,15 +241,15 @@ Use o chat apenas para outras conversas gerais. Tenha em mente que, como os chats permitem uma “conversa mais livre”, é fácil fazer perguntas muito gerais e mais difíceis de responder, então você pode acabar não recebendo respostas. -No GitHub, o template vai orientar você a escrever a pergunta certa para que você consiga obter uma boa resposta com mais facilidade, ou até resolver o problema sozinho(a) antes de perguntar. E no GitHub eu consigo garantir que sempre vou responder tudo, mesmo que leve algum tempo. Eu pessoalmente não consigo fazer isso com os sistemas de chat. 😅 +No GitHub, o template vai orientar você a escrever a pergunta certa para que você consiga obter uma boa resposta com mais facilidade, ou até resolver o problema sozinho antes de perguntar. E no GitHub eu consigo garantir que sempre vou responder tudo, mesmo que leve algum tempo. Eu pessoalmente não consigo fazer isso com os sistemas de chat. 😅 -As conversas nos sistemas de chat também não são tão fáceis de pesquisar quanto no GitHub, então perguntas e respostas podem se perder na conversa. E somente as que estão no GitHub contam para você se tornar um(a) [Especialista em FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}, então é bem provável que você receba mais atenção no GitHub. +As conversas nos sistemas de chat também não são tão fáceis de pesquisar quanto no GitHub, então perguntas e respostas podem se perder na conversa. E somente as que estão no GitHub contam para você se tornar um(a) [Especialista em FastAPI](fastapi-people.md#fastapi-experts), então é bem provável que você receba mais atenção no GitHub. Por outro lado, há milhares de usuários nos sistemas de chat, então há uma grande chance de você encontrar alguém para conversar por lá quase o tempo todo. 😄 ## Patrocine o autor { #sponsor-the-author } -Se o seu **produto/empresa** depende de ou está relacionado ao **FastAPI** e você quer alcançar suas pessoas usuárias, você pode patrocinar o autor (eu) através do GitHub sponsors. Dependendo do nível, você pode obter benefícios extras, como um selo na documentação. 🎁 +Se o seu **produto/empresa** depende de ou está relacionado ao **FastAPI** e você quer alcançar suas pessoas usuárias, você pode patrocinar o autor (eu) através do [GitHub sponsors](https://github.com/sponsors/tiangolo). Dependendo do nível, você pode obter benefícios extras, como um selo na documentação. 🎁 --- diff --git a/docs/pt/docs/history-design-future.md b/docs/pt/docs/history-design-future.md index fb90d1e1c3..7d59495835 100644 --- a/docs/pt/docs/history-design-future.md +++ b/docs/pt/docs/history-design-future.md @@ -1,6 +1,6 @@ # História, Design e Futuro { #history-design-and-future } -Há algum tempo, um usuário **FastAPI** perguntou: +Há algum tempo, [um usuário **FastAPI** perguntou](https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920): > Qual é a história desse projeto? Parece que surgiu do nada e se tornou incrível em poucas semanas [...] @@ -14,7 +14,7 @@ Como parte disso, eu precisava investigar, testar e usar muitas alternativas. A história do **FastAPI** é, em grande parte, a história de seus predecessores. -Como dito na seção [Alternativas](alternatives.md){.internal-link target=_blank}: +Como dito na seção [Alternativas](alternatives.md):
@@ -44,7 +44,7 @@ Eu então dediquei algum tempo projetando a "API" de desenvolvimento que eu quer Eu testei várias ideias nos editores Python mais populares: PyCharm, VS Code, e editores baseados no Jedi. -Pela última Pesquisa do Desenvolvedor Python, isso cobre cerca de 80% dos usuários. +Pela última [Pesquisa do Desenvolvedor Python](https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools), isso cobre cerca de 80% dos usuários. Isso significa que o **FastAPI** foi testado especificamente com os editores usados por 80% dos desenvolvedores Python. Como a maioria dos outros editores tendem a funcionar de forma similar, todos os seus benefícios devem funcionar para virtualmente todos os editores. @@ -54,11 +54,11 @@ Tudo de uma forma que oferecesse a melhor experiência de desenvolvimento para t ## Requisitos { #requirements } -Após testar várias alternativas, eu decidi que usaria o **Pydantic** por suas vantagens. +Após testar várias alternativas, eu decidi que usaria o [**Pydantic**](https://docs.pydantic.dev/) por suas vantagens. Então eu contribuí com ele, para deixá-lo completamente de acordo com o JSON Schema, para dar suporte a diferentes maneiras de definir declarações de restrições, e melhorar o suporte a editores (conferências de tipos, preenchimento automático) baseado nos testes em vários editores. -Durante o desenvolvimento, eu também contribuí com o **Starlette**, outro requisito chave. +Durante o desenvolvimento, eu também contribuí com o [**Starlette**](https://www.starlette.dev/), outro requisito chave. ## Desenvolvimento { #development } @@ -68,7 +68,7 @@ Quando comecei a criar o **FastAPI** de fato, a maior parte das peças já estav Nesse ponto, já está claro que o **FastAPI** com suas ideias está sendo útil para muitas pessoas. -Ele foi escolhido sobre outras alternativas anteriores por se adequar melhor em muitos casos. +Ele está sendo escolhido em relação a alternativas anteriores por se adequar melhor em muitos casos. Muitos desenvolvedores e times já dependem do **FastAPI** para seus projetos (incluindo eu e meu time). @@ -76,4 +76,4 @@ Mas ainda há muitas melhorias e funcionalidades a vir. **FastAPI** tem um grande futuro à frente. -E [sua ajuda](help-fastapi.md){.internal-link target=_blank} é muito bem-vinda. +E [sua ajuda](help-fastapi.md) é muito bem-vinda. diff --git a/docs/pt/docs/how-to/authentication-error-status-code.md b/docs/pt/docs/how-to/authentication-error-status-code.md index 40790f180d..62b660e732 100644 --- a/docs/pt/docs/how-to/authentication-error-status-code.md +++ b/docs/pt/docs/how-to/authentication-error-status-code.md @@ -2,7 +2,7 @@ Antes da versão `0.122.0` do FastAPI, quando os utilitários de segurança integrados retornavam um erro ao cliente após uma falha na autenticação, eles usavam o código de status HTTP `403 Forbidden`. -A partir da versão `0.122.0` do FastAPI, eles usam o código de status HTTP `401 Unauthorized`, mais apropriado, e retornam um cabeçalho `WWW-Authenticate` adequado na response, seguindo as especificações HTTP, RFC 7235, RFC 9110. +A partir da versão `0.122.0` do FastAPI, eles usam o código de status HTTP `401 Unauthorized`, mais apropriado, e retornam um cabeçalho `WWW-Authenticate` adequado na response, seguindo as especificações HTTP, [RFC 7235](https://datatracker.ietf.org/doc/html/rfc7235#section-3.1), [RFC 9110](https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized). Mas, se por algum motivo seus clientes dependem do comportamento antigo, você pode voltar a ele sobrescrevendo o método `make_not_authenticated_error` nas suas classes de segurança. diff --git a/docs/pt/docs/how-to/conditional-openapi.md b/docs/pt/docs/how-to/conditional-openapi.md index b77600a7bc..f6838eb6d8 100644 --- a/docs/pt/docs/how-to/conditional-openapi.md +++ b/docs/pt/docs/how-to/conditional-openapi.md @@ -10,11 +10,11 @@ Isso não adiciona nenhuma segurança extra à sua API; as *operações de rota* Se houver uma falha de segurança no seu código, ela ainda existirá. -Ocultar a documentação apenas torna mais difícil entender como interagir com sua API e pode dificultar sua depuração na produção. Pode ser considerado simplesmente uma forma de Segurança através da obscuridade. +Ocultar a documentação apenas torna mais difícil entender como interagir com sua API e pode dificultar sua depuração na produção. Pode ser considerado simplesmente uma forma de [Segurança através da obscuridade](https://en.wikipedia.org/wiki/Security_through_obscurity). Se você quiser proteger sua API, há várias coisas melhores que você pode fazer, por exemplo: -* Certifique-se de ter modelos Pydantic bem definidos para seus corpos de solicitação e respostas. +* Certifique-se de ter modelos Pydantic bem definidos para seus corpos de request e respostas. * Configure quaisquer permissões e funções necessárias usando dependências. * Nunca armazene senhas em texto simples, apenas hashes de senha. * Implemente e use ferramentas criptográficas bem conhecidas, como pwdlib e tokens JWT, etc. diff --git a/docs/pt/docs/how-to/configure-swagger-ui.md b/docs/pt/docs/how-to/configure-swagger-ui.md index a8f9bed476..d47d579634 100644 --- a/docs/pt/docs/how-to/configure-swagger-ui.md +++ b/docs/pt/docs/how-to/configure-swagger-ui.md @@ -1,6 +1,6 @@ # Configure a UI do Swagger { #configure-swagger-ui } -Você pode configurar alguns parâmetros extras da UI do Swagger. +Você pode configurar alguns [parâmetros extras da UI do Swagger](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/). Para configurá-los, passe o argumento `swagger_ui_parameters` ao criar o objeto da aplicação `FastAPI()` ou para a função `get_swagger_ui_html()`. @@ -50,7 +50,7 @@ Por exemplo, para desabilitar `deepLinking` você pode passar essas configuraç ## Outros parâmetros da UI do Swagger { #other-swagger-ui-parameters } -Para ver todas as outras configurações possíveis que você pode usar, leia a documentação oficial dos parâmetros da UI do Swagger. +Para ver todas as outras configurações possíveis que você pode usar, leia a [documentação oficial dos parâmetros da UI do Swagger](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/). ## Configurações somente JavaScript { #javascript-only-settings } diff --git a/docs/pt/docs/how-to/custom-docs-ui-assets.md b/docs/pt/docs/how-to/custom-docs-ui-assets.md index c7a62aefdf..5437434d57 100644 --- a/docs/pt/docs/how-to/custom-docs-ui-assets.md +++ b/docs/pt/docs/how-to/custom-docs-ui-assets.md @@ -54,7 +54,7 @@ Agora, para poder testar se tudo funciona, crie uma *operação de rota*: ### Teste { #test-it } -Agora, você deve ser capaz de ir para a documentação em http://127.0.0.1:8000/docs, e recarregar a página, ela carregará esses recursos do novo CDN. +Agora, você deve ser capaz de ir para a documentação em [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs), e recarregar a página, ela carregará esses recursos do novo CDN. ## Hospedagem Própria de JavaScript e CSS para a documentação { #self-hosting-javascript-and-css-for-docs } @@ -89,16 +89,16 @@ Sua nova estrutura de arquivos poderia se parecer com isso: Baixe os arquivos estáticos necessários para a documentação e coloque-os no diretório `static/`. -Você provavelmente pode clicar com o botão direito em cada link e selecionar uma opção semelhante a `Salvar link como...`. +Você provavelmente pode clicar com o botão direito em cada link e selecionar uma opção semelhante a "Salvar link como...". **Swagger UI** usa os arquivos: -* `swagger-ui-bundle.js` -* `swagger-ui.css` +* [`swagger-ui-bundle.js`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js) +* [`swagger-ui.css`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css) E o **ReDoc** usa o arquivo: -* `redoc.standalone.js` +* [`redoc.standalone.js`](https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js) Depois disso, sua estrutura de arquivos deve se parecer com: @@ -122,9 +122,9 @@ Depois disso, sua estrutura de arquivos deve se parecer com: ### Teste os arquivos estáticos { #test-the-static-files } -Inicialize seu aplicativo e vá para http://127.0.0.1:8000/static/redoc.standalone.js. +Inicialize seu aplicativo e vá para [http://127.0.0.1:8000/static/redoc.standalone.js](http://127.0.0.1:8000/static/redoc.standalone.js). -Você deverá ver um arquivo JavaScript muito longo para o **ReDoc**. +Você deverá ser ver um arquivo JavaScript muito longo para o **ReDoc**. Esse arquivo pode começar com algo como: @@ -180,6 +180,6 @@ Agora, para poder testar se tudo funciona, crie uma *operação de rota*: ### Teste a UI de Arquivos Estáticos { #test-static-files-ui } -Agora, você deve ser capaz de desconectar o WiFi, ir para a documentação em http://127.0.0.1:8000/docs, e recarregar a página. +Agora, você deve ser capaz de desconectar o WiFi, ir para a documentação em [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs), e recarregar a página. E mesmo sem Internet, você será capaz de ver a documentação da sua API e interagir com ela. diff --git a/docs/pt/docs/how-to/custom-request-and-route.md b/docs/pt/docs/how-to/custom-request-and-route.md index b4ea1c282b..5603535320 100644 --- a/docs/pt/docs/how-to/custom-request-and-route.md +++ b/docs/pt/docs/how-to/custom-request-and-route.md @@ -18,7 +18,7 @@ Se você for um iniciante em **FastAPI** você deve considerar pular essa seçã Alguns casos de uso incluem: -* Converter requisições não-JSON para JSON (por exemplo, `msgpack`). +* Converter requisições não-JSON para JSON (por exemplo, [`msgpack`](https://msgpack.org/index.html)). * Descomprimir corpos de requisição comprimidos com gzip. * Registrar automaticamente todos os corpos de requisição. @@ -32,7 +32,7 @@ E uma subclasse de `APIRoute` para usar essa classe de requisição personalizad /// tip | Dica -Isso é um exemplo de brincadeira para demonstrar como funciona, se você precisar de suporte para Gzip, você pode usar o [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware){.internal-link target=_blank} fornecido. +Isso é um exemplo de brincadeira para demonstrar como funciona, se você precisar de suporte para Gzip, você pode usar o [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware) fornecido. /// @@ -66,7 +66,7 @@ O dicionário `scope` e a função `receive` são ambos parte da especificação E essas duas coisas, `scope` e `receive`, são o que é necessário para criar uma nova instância de `Request`. -Para aprender mais sobre o `Request` confira a documentação do Starlette sobre Requests. +Para aprender mais sobre o `Request` confira a [documentação do Starlette sobre Requests](https://www.starlette.dev/requests/). /// @@ -82,7 +82,7 @@ Mas por causa das nossas mudanças em `GzipRequest.body`, o corpo da requisiçã /// tip | Dica -Para resolver esse mesmo problema, é provavelmente muito mais fácil usar o `body` em um manipulador personalizado para `RequestValidationError` ([Tratando Erros](../tutorial/handling-errors.md#use-the-requestvalidationerror-body){.internal-link target=_blank}). +Para resolver esse mesmo problema, é provavelmente muito mais fácil usar o `body` em um manipulador personalizado para `RequestValidationError` ([Tratando Erros](../tutorial/handling-errors.md#use-the-requestvalidationerror-body)). Mas esse exemplo ainda é valido e mostra como interagir com os componentes internos. diff --git a/docs/pt/docs/how-to/extending-openapi.md b/docs/pt/docs/how-to/extending-openapi.md index b8277c1c4b..23737e5fa1 100644 --- a/docs/pt/docs/how-to/extending-openapi.md +++ b/docs/pt/docs/how-to/extending-openapi.md @@ -37,7 +37,7 @@ O parâmetro `summary` está disponível no OpenAPI 3.1.0 e superior, suportado Com as informações acima, você pode usar a mesma função utilitária para gerar o esquema OpenAPI e sobrescrever cada parte que precisar. -Por exemplo, vamos adicionar Extensão OpenAPI do ReDoc para incluir um logo personalizado. +Por exemplo, vamos adicionar [Extensão OpenAPI do ReDoc para incluir um logo personalizado](https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo). ### **FastAPI** Normal { #normal-fastapi } @@ -75,6 +75,6 @@ Agora, você pode substituir o método `.openapi()` pela sua nova função. ### Verificar { #check-it } -Uma vez que você acessar http://127.0.0.1:8000/redoc, verá que está usando seu logo personalizado (neste exemplo, o logo do **FastAPI**): +Uma vez que você acessar [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc), verá que está usando seu logo personalizado (neste exemplo, o logo do **FastAPI**): diff --git a/docs/pt/docs/how-to/general.md b/docs/pt/docs/how-to/general.md index 3cabb6753e..ce04ada16e 100644 --- a/docs/pt/docs/how-to/general.md +++ b/docs/pt/docs/how-to/general.md @@ -1,38 +1,42 @@ # Geral - Como Fazer - Receitas { #general-how-to-recipes } -Aqui estão vários links para outros locais na documentação, para perguntas gerais ou frequentes +Aqui estão vários links para outros locais na documentação, para perguntas gerais ou frequentes. ## Filtro de dados- Segurança { #filter-data-security } -Para assegurar que você não vai retornar mais dados do que deveria, leia a seção [Tutorial - Modelo de Resposta - Tipo de Retorno](../tutorial/response-model.md){.internal-link target=_blank}. +Para assegurar que você não vai retornar mais dados do que deveria, leia a documentação de [Tutorial - Modelo de Resposta - Tipo de Retorno](../tutorial/response-model.md). + +## Otimizar Desempenho da Resposta - Modelo de Resposta - Tipo de Retorno { #optimize-response-performance-response-model-return-type } + +Para otimizar o desempenho ao retornar dados JSON, use um tipo de retorno ou modelo de resposta; assim, o Pydantic fará a serialização para JSON no lado do Rust, sem passar pelo Python. Leia mais na documentação de [Tutorial - Modelo de Resposta - Tipo de Retorno](../tutorial/response-model.md). ## Tags de Documentação - OpenAPI { #documentation-tags-openapi } -Para adicionar tags às suas *operações de rota* e agrupá-las na UI da documentação, leia a seção [Tutorial - Configurações da Operação de Rota - Tags](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank}. +Para adicionar tags às suas *operações de rota* e agrupá-las na UI da documentação, leia a documentação de [Tutorial - Configurações da Operação de Rota - Tags](../tutorial/path-operation-configuration.md#tags). ## Resumo e Descrição da documentação - OpenAPI { #documentation-summary-and-description-openapi } -Para adicionar um resumo e uma descrição às suas *operações de rota* e exibi-los na UI da documentação, leia a seção [Tutorial - Configurações da Operação de Rota - Resumo e Descrição](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank}. +Para adicionar um resumo e uma descrição às suas *operações de rota* e exibi-los na UI da documentação, leia a documentação de [Tutorial - Configurações da Operação de Rota - Resumo e Descrição](../tutorial/path-operation-configuration.md#summary-and-description). -## Documentação das Descrições de Resposta - OpenAPI { #documentation-response-description-openapi } +## Documentação - Descrição da Resposta - OpenAPI { #documentation-response-description-openapi } -Para definir a descrição de uma resposta exibida na interface da documentação, leia a seção [Tutorial - Configurações da Operação de Rota - Descrição da Resposta](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank}. +Para definir a descrição de uma resposta exibida na interface da documentação, leia a documentação de [Tutorial - Configurações da Operação de Rota - Descrição da Resposta](../tutorial/path-operation-configuration.md#response-description). -## Documentação para Depreciar uma *Operação de Rota* - OpenAPI { #documentation-deprecate-a-path-operation-openapi } +## Documentação - Descontinuar uma *Operação de Rota* - OpenAPI { #documentation-deprecate-a-path-operation-openapi } -Para depreciar uma *operação de rota* e exibi-la na interface da documentação, leia a seção [Tutorial - Configurações da Operação de Rota - Depreciação](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank}. +Para descontinuar uma *operação de rota* e exibi-la na UI da documentação, leia a documentação de [Tutorial - Configurações da Operação de Rota - Descontinuação](../tutorial/path-operation-configuration.md#deprecate-a-path-operation). ## Converter qualquer dado para compatível com JSON { #convert-any-data-to-json-compatible } -Para converter qualquer dado para um formato compatível com JSON, leia a seção [Tutorial - Codificador Compatível com JSON](../tutorial/encoder.md){.internal-link target=_blank}. +Para converter qualquer dado para um formato compatível com JSON, leia a documentação de [Tutorial - Codificador Compatível com JSON](../tutorial/encoder.md). ## OpenAPI Metadata - Docs { #openapi-metadata-docs } -Para adicionar metadados ao seu esquema OpenAPI, incluindo licença, versão, contato, etc, leia a seção [Tutorial - Metadados e URLs da Documentação](../tutorial/metadata.md){.internal-link target=_blank}. +Para adicionar metadados ao seu esquema OpenAPI, incluindo licença, versão, contato, etc, leia a documentação de [Tutorial - Metadados e URLs da Documentação](../tutorial/metadata.md). ## OpenAPI com URL customizada { #openapi-custom-url } -Para customizar a URL do OpenAPI (ou removê-la), leia a seção [Tutorial - Metadados e URLs da Documentação](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}. +Para customizar a URL do OpenAPI (ou removê-la), leia a documentação de [Tutorial - Metadados e URLs da Documentação](../tutorial/metadata.md#openapi-url). ## URLs de documentação do OpenAPI { #openapi-docs-urls } -Para alterar as URLs usadas ​​para as interfaces de usuário da documentação gerada automaticamente, leia a seção [Tutorial - Metadados e URLs da Documentação](../tutorial/metadata.md#docs-urls){.internal-link target=_blank}. +Para alterar as URLs usadas ​​para as interfaces de usuário da documentação gerada automaticamente, leia a documentação de [Tutorial - Metadados e URLs da Documentação](../tutorial/metadata.md#docs-urls). diff --git a/docs/pt/docs/how-to/graphql.md b/docs/pt/docs/how-to/graphql.md index 3fcaa4dd28..f96a202f08 100644 --- a/docs/pt/docs/how-to/graphql.md +++ b/docs/pt/docs/how-to/graphql.md @@ -18,18 +18,18 @@ Certifique-se de avaliar se os **benefícios** para o seu caso de uso compensam Aqui estão algumas das bibliotecas **GraphQL** que têm suporte **ASGI**. Você pode usá-las com **FastAPI**: -* Strawberry 🍓 - * Com docs para FastAPI -* Ariadne - * Com docs para FastAPI -* Tartiflette - * Com Tartiflette ASGI para fornecer integração ASGI -* Graphene - * Com starlette-graphene3 +* [Strawberry](https://strawberry.rocks/) 🍓 + * Com [documentação para FastAPI](https://strawberry.rocks/docs/integrations/fastapi) +* [Ariadne](https://ariadnegraphql.org/) + * Com [documentação para FastAPI](https://ariadnegraphql.org/docs/fastapi-integration) +* [Tartiflette](https://tartiflette.io/) + * Com [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) para fornecer integração ASGI +* [Graphene](https://graphene-python.org/) + * Com [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3) ## GraphQL com Strawberry { #graphql-with-strawberry } -Se você precisar ou quiser trabalhar com **GraphQL**, **Strawberry** é a biblioteca **recomendada** pois tem o design mais próximo ao design do **FastAPI**, ela é toda baseada em **anotações de tipo**. +Se você precisar ou quiser trabalhar com **GraphQL**, [**Strawberry**](https://strawberry.rocks/) é a biblioteca **recomendada** pois tem o design mais próximo ao design do **FastAPI**, ela é toda baseada em **anotações de tipo**. Dependendo do seu caso de uso, você pode preferir usar uma biblioteca diferente, mas se você me perguntasse, eu provavelmente sugeriria que você experimentasse o **Strawberry**. @@ -37,24 +37,24 @@ Aqui está uma pequena prévia de como você poderia integrar Strawberry com Fas {* ../../docs_src/graphql_/tutorial001_py310.py hl[3,22,25] *} -Você pode aprender mais sobre Strawberry na documentação do Strawberry. +Você pode aprender mais sobre Strawberry na [documentação do Strawberry](https://strawberry.rocks/). -E também na documentação sobre Strawberry com FastAPI. +E também na documentação sobre [Strawberry com FastAPI](https://strawberry.rocks/docs/integrations/fastapi). ## Antigo `GraphQLApp` do Starlette { #older-graphqlapp-from-starlette } -Versões anteriores do Starlette incluiam uma classe `GraphQLApp` para integrar com Graphene. +Versões anteriores do Starlette incluiam uma classe `GraphQLApp` para integrar com [Graphene](https://graphene-python.org/). -Ela foi descontinuada do Starlette, mas se você tem código que a utilizava, você pode facilmente **migrar** para starlette-graphene3, que cobre o mesmo caso de uso e tem uma **interface quase idêntica**. +Ela foi descontinuada do Starlette, mas se você tem código que a utilizava, você pode facilmente **migrar** para [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3), que cobre o mesmo caso de uso e tem uma **interface quase idêntica**. /// tip | Dica -Se você precisa de GraphQL, eu ainda recomendaria que você desse uma olhada no Strawberry, pois ele é baseado em anotações de tipo em vez de classes e tipos personalizados. +Se você precisa de GraphQL, eu ainda recomendaria que você desse uma olhada no [Strawberry](https://strawberry.rocks/), pois ele é baseado em anotações de tipo em vez de classes e tipos personalizados. /// ## Saiba Mais { #learn-more } -Você pode aprender mais sobre **GraphQL** na documentação oficial do GraphQL. +Você pode aprender mais sobre **GraphQL** na [documentação oficial do GraphQL](https://graphql.org/). Você também pode ler mais sobre cada uma das bibliotecas descritas acima em seus links. diff --git a/docs/pt/docs/how-to/index.md b/docs/pt/docs/how-to/index.md index 91df638d7a..3f3d344354 100644 --- a/docs/pt/docs/how-to/index.md +++ b/docs/pt/docs/how-to/index.md @@ -8,6 +8,6 @@ Se algo parecer interessante e útil para o seu projeto, vá em frente e dê uma /// tip | Dica -Se você deseja **aprender FastAPI** de forma estruturada (recomendado), leia capítulo por capítulo [Tutorial - Guia de Usuário](../tutorial/index.md){.internal-link target=_blank} em vez disso. +Se você deseja **aprender FastAPI** de forma estruturada (recomendado), leia capítulo por capítulo [Tutorial - Guia de Usuário](../tutorial/index.md) em vez disso. /// diff --git a/docs/pt/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/pt/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md index 0995e10285..1352abda94 100644 --- a/docs/pt/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md +++ b/docs/pt/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md @@ -22,7 +22,7 @@ Se você tem uma aplicação FastAPI antiga com Pydantic v1, aqui vou mostrar co ## Guia oficial { #official-guide } -O Pydantic tem um Guia de Migração oficial do v1 para o v2. +O Pydantic tem um [Guia de Migração](https://docs.pydantic.dev/latest/migration/) oficial do v1 para o v2. Ele também inclui o que mudou, como as validações agora são mais corretas e rigorosas, possíveis ressalvas, etc. @@ -30,7 +30,7 @@ Você pode lê-lo para entender melhor o que mudou. ## Testes { #tests } -Garanta que você tenha [testes](../tutorial/testing.md){.internal-link target=_blank} para sua aplicação e que os execute na integração contínua (CI). +Garanta que você tenha [testes](../tutorial/testing.md) para sua aplicação e que os execute na integração contínua (CI). Assim, você pode fazer a atualização e garantir que tudo continua funcionando como esperado. @@ -38,7 +38,7 @@ Assim, você pode fazer a atualização e garantir que tudo continua funcionando Em muitos casos, quando você usa modelos Pydantic regulares sem personalizações, será possível automatizar a maior parte do processo de migração do Pydantic v1 para o Pydantic v2. -Você pode usar o `bump-pydantic` da própria equipe do Pydantic. +Você pode usar [`bump-pydantic`](https://github.com/pydantic/bump-pydantic) da própria equipe do Pydantic. Essa ferramenta ajuda a alterar automaticamente a maior parte do código que precisa ser modificado. diff --git a/docs/pt/docs/how-to/testing-database.md b/docs/pt/docs/how-to/testing-database.md index 4258d1e24c..1ec82ae6d8 100644 --- a/docs/pt/docs/how-to/testing-database.md +++ b/docs/pt/docs/how-to/testing-database.md @@ -1,7 +1,7 @@ # Testando a Base de Dados { #testing-a-database } -Você pode estudar sobre bases de dados, SQL e SQLModel na documentação de SQLModel. 🤓 +Você pode estudar sobre bases de dados, SQL e SQLModel na [documentação de SQLModel](https://sqlmodel.tiangolo.com/). 🤓 -Aqui tem um mini tutorial de como usar SQLModel com FastAPI. ✨ +Aqui tem um mini [tutorial de como usar SQLModel com FastAPI](https://sqlmodel.tiangolo.com/tutorial/fastapi/). ✨ -Esse tutorial inclui uma seção sobre testar bases de dados SQL. 😎 +Esse tutorial inclui uma seção sobre [testar bases de dados SQL](https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/). 😎 diff --git a/docs/pt/docs/index.md b/docs/pt/docs/index.md index c337f6d3ac..1679e34bae 100644 --- a/docs/pt/docs/index.md +++ b/docs/pt/docs/index.md @@ -8,43 +8,43 @@ FastAPI

- Framework FastAPI, alta performance, fácil de aprender, fácil de codar, pronto para produção + Framework FastAPI, alta performance, fácil de aprender, rápido para codar, pronto para produção

- + Test - + Coverage - + Package version - + Supported Python versions

--- -**Documentação**: https://fastapi.tiangolo.com +**Documentação**: [https://fastapi.tiangolo.com/pt](https://fastapi.tiangolo.com/pt) -**Código fonte**: https://github.com/fastapi/fastapi +**Código fonte**: [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi) --- -FastAPI é um moderno e rápido (alta performance) framework web para construção de APIs com Python, baseado nos type hints padrões do Python. +FastAPI é um framework web moderno e rápido (alta performance) para construção de APIs com Python, baseado nos type hints padrões do Python. Os recursos chave são: -* **Rápido**: alta performance, equivalente a **NodeJS** e **Go** (graças ao Starlette e Pydantic). [Um dos frameworks mais rápidos disponíveis](#performance). +* **Rápido**: alta performance, equivalente a **NodeJS** e **Go** (graças ao Starlette e Pydantic). [Um dos frameworks Python mais rápidos disponíveis](#performance). * **Rápido para codar**: Aumenta a velocidade para desenvolver recursos entre 200% a 300%. * * **Poucos bugs**: Reduz cerca de 40% de erros induzidos por humanos (desenvolvedores). * * **Intuitivo**: Grande suporte a editores. Completação em todos os lugares. Menos tempo debugando. * **Fácil**: Projetado para ser fácil de aprender e usar. Menos tempo lendo docs. * **Enxuto**: Minimize duplicação de código. Múltiplas funcionalidades para cada declaração de parâmetro. Menos bugs. * **Robusto**: Tenha código pronto para produção. E com documentação interativa automática. -* **Baseado em padrões**: Baseado em (e totalmente compatível com) os padrões abertos para APIs: OpenAPI (anteriormente conhecido como Swagger) e JSON Schema. +* **Baseado em padrões**: Baseado em (e totalmente compatível com) os padrões abertos para APIs: [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (anteriormente conhecido como Swagger) e [JSON Schema](https://json-schema.org/). * estimativas baseadas em testes realizados com equipe interna de desenvolvimento, construindo aplicações em produção. @@ -55,51 +55,51 @@ Os recursos chave são: ### Patrocinador Keystone { #keystone-sponsor } {% for sponsor in sponsors.keystone -%} - + {% endfor -%} ### Patrocinadores Ouro e Prata { #gold-and-silver-sponsors } {% for sponsor in sponsors.gold -%} - + {% endfor -%} {%- for sponsor in sponsors.silver -%} - + {% endfor %} -Outros patrocinadores +[Outros patrocinadores](https://fastapi.tiangolo.com/pt/fastapi-people/#sponsors) ## Opiniões { #opinions } "_[...] Estou usando **FastAPI** muito esses dias. [...] Estou na verdade planejando utilizar ele em todos os times de **serviços ML na Microsoft**. Alguns deles estão sendo integrados no _core_ do produto **Windows** e alguns produtos **Office**._" -
Kabir Khan - Microsoft (ref)
+
Kabir Khan - Microsoft (ref)
--- "_Nós adotamos a biblioteca **FastAPI** para iniciar um servidor **REST** que pode ser consultado para obter **previsões**. [para o Ludwig]_" -
Piero Molino, Yaroslav Dudin, e Sai Sumanth Miryala - Uber (ref)
+
Piero Molino, Yaroslav Dudin, e Sai Sumanth Miryala - Uber (ref)
--- "_A **Netflix** tem o prazer de anunciar o lançamento open-source do nosso framework de orquestração de **gerenciamento de crises**: **Dispatch**! [criado com **FastAPI**]_" -
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
+
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
--- "_Estou muito entusiasmado com o **FastAPI**. É tão divertido!_" -
Brian Okken - Python Bytes apresentador do podcast (ref)
+
Brian Okken - [Python Bytes](https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855) apresentador do podcast (ref)
--- "_Honestamente, o que você construiu parece super sólido e refinado. De muitas formas, é o que eu queria que o **Hug** fosse - é realmente inspirador ver alguém construir isso._" -
Timothy Crosley - criador doHug (ref)
+
Timothy Crosley - criador do [Hug](https://github.com/hugapi/hug) (ref)
--- @@ -107,27 +107,27 @@ Os recursos chave são: "_Nós trocamos nossas **APIs** por **FastAPI** [...] Acredito que você gostará dele [...]_" -
Ines Montani - Matthew Honnibal - fundadores da Explosion AI - criadores da spaCy (ref) - (ref)
+
Ines Montani - Matthew Honnibal - fundadores da [Explosion AI](https://explosion.ai) - criadores da [spaCy](https://spacy.io) (ref) - (ref)
--- "_Se alguém estiver procurando construir uma API Python para produção, eu recomendaria fortemente o **FastAPI**. Ele é **lindamente projetado**, **simples de usar** e **altamente escalável**, e se tornou um **componente chave** para a nossa estratégia de desenvolvimento API first, impulsionando diversas automações e serviços, como o nosso Virtual TAC Engineer._" -
Deon Pillsbury - Cisco (ref)
+
Deon Pillsbury - Cisco (ref)
--- ## Mini documentário do FastAPI { #fastapi-mini-documentary } -Há um mini documentário do FastAPI lançado no fim de 2025, você pode assisti-lo online: +Há um [mini documentário do FastAPI](https://www.youtube.com/watch?v=mpR8ngthqiE) lançado no fim de 2025, você pode assisti-lo online: -FastAPI Mini Documentary +FastAPI Mini Documentary ## **Typer**, o FastAPI das interfaces de linhas de comando { #typer-the-fastapi-of-clis } - + -Se você estiver construindo uma aplicação CLI para ser utilizada no terminal ao invés de uma API web, dê uma olhada no **Typer**. +Se você estiver construindo uma aplicação CLI para ser utilizada no terminal ao invés de uma API web, dê uma olhada no [**Typer**](https://typer.tiangolo.com/). **Typer** é o irmão menor do FastAPI. E seu propósito é ser o **FastAPI das CLIs**. ⌨️ 🚀 @@ -135,12 +135,12 @@ Se você estiver construindo uma aplicação Starlette para as partes web. -* Pydantic para a parte de dados. +* [Starlette](https://www.starlette.dev/) para as partes web. +* [Pydantic](https://docs.pydantic.dev/) para a parte de dados. ## Instalação { #installation } -Crie e ative um ambiente virtual e então instale o FastAPI: +Crie e ative um [ambiente virtual](https://fastapi.tiangolo.com/pt/virtual-environments/) e então instale o FastAPI:
@@ -199,7 +199,7 @@ async def read_item(item_id: int, q: str | None = None): **Nota**: -Se você não sabe, verifique a seção _"Com pressa?"_ sobre `async` e `await` nas docs. +Se você não sabe, verifique a seção _"Com pressa?"_ sobre [`async` e `await` nas docs](https://fastapi.tiangolo.com/pt/async/#in-a-hurry). @@ -210,7 +210,7 @@ Rode o servidor com:
```console -$ fastapi dev main.py +$ fastapi dev ╭────────── FastAPI CLI - Development mode ───────────╮ │ │ @@ -235,19 +235,19 @@ INFO: Application startup complete.
-Sobre o comando fastapi dev main.py... +Sobre o comando fastapi dev... -O comando `fastapi dev` lê o seu arquivo `main.py`, identifica o aplicativo **FastAPI** nele, e inicia um servidor usando o Uvicorn. +O comando `fastapi dev` lê automaticamente o seu arquivo `main.py`, detecta a aplicação **FastAPI** nele e inicia um servidor usando o [Uvicorn](https://www.uvicorn.dev). -Por padrão, o `fastapi dev` iniciará com *auto-reload* habilitado para desenvolvimento local. +Por padrão, o `fastapi dev` iniciará com auto-reload habilitado para desenvolvimento local. -Você pode ler mais sobre isso na documentação do FastAPI CLI. +Você pode ler mais sobre isso na [documentação do FastAPI CLI](https://fastapi.tiangolo.com/pt/fastapi-cli/).
### Verifique { #check-it } -Abra seu navegador em http://127.0.0.1:8000/items/5?q=somequery. +Abra seu navegador em [http://127.0.0.1:8000/items/5?q=somequery](http://127.0.0.1:8000/items/5?q=somequery). Você verá a resposta JSON como: @@ -264,17 +264,17 @@ Você acabou de criar uma API que: ### Documentação Interativa da API { #interactive-api-docs } -Agora vá para http://127.0.0.1:8000/docs. +Agora vá para [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). -Você verá a documentação automática interativa da API (fornecida por Swagger UI): +Você verá a documentação automática interativa da API (fornecida por [Swagger UI](https://github.com/swagger-api/swagger-ui)): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Documentação Alternativa da API { #alternative-api-docs } -E agora, vá para http://127.0.0.1:8000/redoc. +E agora, vá para [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). -Você verá a documentação automática alternativa (fornecida por ReDoc): +Você verá a documentação automática alternativa (fornecida por [ReDoc](https://github.com/Rebilly/ReDoc)): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -316,7 +316,7 @@ O servidor `fastapi dev` deverá recarregar automaticamente. ### Evoluindo a Documentação Interativa da API { #interactive-api-docs-upgrade } -Agora vá para http://127.0.0.1:8000/docs. +Agora vá para [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). * A documentação interativa da API será automaticamente atualizada, incluindo o novo corpo: @@ -332,7 +332,7 @@ Agora vá para http://127.0.0.1:8000/redoc. +E agora, vá para [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). * A documentação alternativa também irá refletir o novo parâmetro query e o corpo: @@ -344,7 +344,7 @@ Resumindo, você declara **uma vez** os tipos dos parâmetros, corpo etc. como p Você faz isso com os tipos padrão do Python moderno. -Você não terá que aprender uma nova sintaxe, métodos ou classes de uma biblioteca específica etc. +Você não terá que aprender uma nova sintaxe, os métodos ou classes de uma biblioteca específica etc. Apenas **Python** padrão. @@ -433,7 +433,7 @@ Experimente mudar a seguinte linha: ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) -Para um exemplo mais completo incluindo mais recursos, veja Tutorial - Guia do Usuário. +Para um exemplo mais completo incluindo mais recursos, veja o Tutorial - Guia do Usuário. **Alerta de Spoiler**: o tutorial - guia do usuário inclui: @@ -442,7 +442,7 @@ Para um exemplo mais completo incluindo mais recursos, veja Injeção de Dependência**. * Segurança e autenticação, incluindo suporte para **OAuth2** com autenticação com **JWT tokens** e **HTTP Basic**. * Técnicas mais avançadas (mas igualmente fáceis) para declaração de **modelos JSON profundamente aninhados** (graças ao Pydantic). -* Integrações **GraphQL** com o Strawberry e outras bibliotecas. +* Integrações **GraphQL** com o [Strawberry](https://strawberry.rocks) e outras bibliotecas. * Muitos recursos extras (graças ao Starlette) como: * **WebSockets** * testes extremamente fáceis baseados em HTTPX e `pytest` @@ -452,24 +452,10 @@ Para um exemplo mais completo incluindo mais recursos, veja FastAPI Cloud, vá e entre na lista de espera se ainda não o fez. 🚀 +Você pode opcionalmente implantar sua aplicação FastAPI na [FastAPI Cloud](https://fastapicloud.com), vá e entre na lista de espera se ainda não o fez. 🚀 Se você já tem uma conta na **FastAPI Cloud** (nós convidamos você da lista de espera 😉), pode implantar sua aplicação com um único comando. -Antes de implantar, certifique-se de que está autenticado: - -
- -```console -$ fastapi login - -You are logged in to FastAPI Cloud 🚀 -``` - -
- -Depois, implemente sua aplicação: -
```console @@ -488,7 +474,7 @@ Deploying to FastAPI Cloud... #### Sobre a FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** é construída pelo mesmo autor e equipe por trás do **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** é construída pelo mesmo autor e equipe por trás do **FastAPI**. Ela simplifica o processo de **construir**, **implantar** e **acessar** uma API com esforço mínimo. @@ -504,9 +490,9 @@ Siga os tutoriais do seu provedor de nuvem para implantar aplicações FastAPI c ## Performance { #performance } -Testes de performance da Independent TechEmpower mostram aplicações **FastAPI** rodando sob Uvicorn como um dos frameworks Python mais rápidos disponíveis, somente atrás de Starlette e Uvicorn (utilizados internamente pelo FastAPI). (*) +Testes de performance independentes do TechEmpower mostram aplicações **FastAPI** rodando sob Uvicorn como [um dos frameworks Python mais rápidos disponíveis](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), somente atrás de Starlette e Uvicorn (utilizados internamente pelo FastAPI). (*) -Para entender mais sobre isso, veja a seção Comparações. +Para entender mais sobre isso, veja a seção [Comparações](https://fastapi.tiangolo.com/pt/benchmarks/). ## Dependências { #dependencies } @@ -518,19 +504,19 @@ Quando você instala o FastAPI com `pip install "fastapi[standard]"`, ele vem co Utilizado pelo Pydantic: -* email-validator - para validação de email. +* [`email-validator`](https://github.com/JoshData/python-email-validator) - para validação de email. Utilizado pelo Starlette: -* httpx - Obrigatório caso você queira utilizar o `TestClient`. -* jinja2 - Obrigatório se você quer utilizar a configuração padrão de templates. -* python-multipart - Obrigatório se você deseja suporte a "parsing" de formulário, com `request.form()`. +* [`httpx`](https://www.python-httpx.org) - Obrigatório caso você queira utilizar o `TestClient`. +* [`jinja2`](https://jinja.palletsprojects.com) - Obrigatório se você quer utilizar a configuração padrão de templates. +* [`python-multipart`](https://github.com/Kludex/python-multipart) - Obrigatório se você deseja suporte a "parsing" de formulário, com `request.form()`. Utilizado pelo FastAPI: -* uvicorn - para o servidor que carrega e serve a sua aplicação. Isto inclui `uvicorn[standard]`, que inclui algumas dependências (e.g. `uvloop`) necessárias para servir em alta performance. +* [`uvicorn`](https://www.uvicorn.dev) - para o servidor que carrega e serve a sua aplicação. Isto inclui `uvicorn[standard]`, que inclui algumas dependências (e.g. `uvloop`) necessárias para servir em alta performance. * `fastapi-cli[standard]` - que disponibiliza o comando `fastapi`. - * Isso inclui `fastapi-cloud-cli`, que permite implantar sua aplicação FastAPI na FastAPI Cloud. + * Isso inclui `fastapi-cloud-cli`, que permite implantar sua aplicação FastAPI na [FastAPI Cloud](https://fastapicloud.com). ### Sem as dependências `standard` { #without-standard-dependencies } @@ -546,13 +532,13 @@ Existem algumas dependências adicionais que você pode querer instalar. Dependências opcionais adicionais do Pydantic: -* pydantic-settings - para gerenciamento de configurações. -* pydantic-extra-types - para tipos extras a serem utilizados com o Pydantic. +* [`pydantic-settings`](https://docs.pydantic.dev/latest/usage/pydantic_settings/) - para gerenciamento de configurações. +* [`pydantic-extra-types`](https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/) - para tipos extras a serem utilizados com o Pydantic. Dependências opcionais adicionais do FastAPI: -* orjson - Obrigatório se você deseja utilizar o `ORJSONResponse`. -* ujson - Obrigatório se você deseja utilizar o `UJSONResponse`. +* [`orjson`](https://github.com/ijl/orjson) - Obrigatório se você deseja utilizar o `ORJSONResponse`. +* [`ujson`](https://github.com/esnme/ultrajson) - Obrigatório se você deseja utilizar o `UJSONResponse`. ## Licença { #license } diff --git a/docs/pt/docs/project-generation.md b/docs/pt/docs/project-generation.md index 419a39879f..8a34071a65 100644 --- a/docs/pt/docs/project-generation.md +++ b/docs/pt/docs/project-generation.md @@ -4,7 +4,7 @@ _Templates_, embora tipicamente venham com alguma configuração específica, s Você pode usar esse _template_ para começar, já que ele inclui várias configurações iniciais, segurança, banco de dados, e alguns _endpoints_ de API já feitos para você. -Repositório GitHub: Full Stack FastAPI Template +Repositório GitHub: [Full Stack FastAPI Template](https://github.com/tiangolo/full-stack-fastapi-template) ## Full Stack FastAPI Template - Pilha de Tecnologias e Recursos { #full-stack-fastapi-template-technology-stack-and-features } @@ -19,10 +19,10 @@ Repositório GitHub: Pydantic é uma biblioteca Python para executar a validação de dados. +[Pydantic](https://docs.pydantic.dev/) é uma biblioteca Python para executar a validação de dados. Você declara a "forma" dos dados como classes com atributos. @@ -285,13 +285,13 @@ Um exemplo da documentação oficial do Pydantic: /// info | Informação -Para saber mais sobre o Pydantic, verifique a sua documentação. +Para saber mais sobre o [Pydantic, verifique a documentação](https://docs.pydantic.dev/). /// O **FastAPI** é todo baseado em Pydantic. -Você verá muito mais disso na prática no [Tutorial - Guia do usuário](tutorial/index.md){.internal-link target=_blank}. +Você verá muito mais disso na prática no [Tutorial - Guia do usuário](tutorial/index.md). ## Type Hints com Metadados de Anotações { #type-hints-with-metadata-annotations } @@ -337,12 +337,12 @@ Com o **FastAPI**, você declara parâmetros com type hints e obtém: * **Documentar** a API usando OpenAPI: * que é usada pelas interfaces de usuário da documentação interativa automática. -Tudo isso pode parecer abstrato. Não se preocupe. Você verá tudo isso em ação no [Tutorial - Guia do usuário](tutorial/index.md){.internal-link target=_blank}. +Tudo isso pode parecer abstrato. Não se preocupe. Você verá tudo isso em ação no [Tutorial - Guia do usuário](tutorial/index.md). O importante é que, usando tipos padrão de Python, em um único local (em vez de adicionar mais classes, decoradores, etc.), o **FastAPI** fará muito trabalho para você. /// info | Informação -Se você já passou por todo o tutorial e voltou para ver mais sobre os tipos, um bom recurso é a "cheat sheet" do `mypy`. +Se você já passou por todo o tutorial e voltou para ver mais sobre os tipos, um bom recurso é [a "cheat sheet" do `mypy`](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html). /// diff --git a/docs/pt/docs/tutorial/background-tasks.md b/docs/pt/docs/tutorial/background-tasks.md index 462fb00dcb..20152d9cf4 100644 --- a/docs/pt/docs/tutorial/background-tasks.md +++ b/docs/pt/docs/tutorial/background-tasks.md @@ -62,7 +62,7 @@ E então outra tarefa em segundo plano gerada na *função de operação de rota ## Detalhes técnicos { #technical-details } -A classe `BackgroundTasks` vem diretamente de `starlette.background`. +A classe `BackgroundTasks` vem diretamente de [`starlette.background`](https://www.starlette.dev/background/). Ela é importada/incluída diretamente no FastAPI para que você possa importá-la de `fastapi` e evitar importar acidentalmente a alternativa `BackgroundTask` (sem o `s` no final) de `starlette.background`. @@ -70,11 +70,11 @@ Usando apenas `BackgroundTasks` (e não `BackgroundTask`), é possível usá-la Ainda é possível usar `BackgroundTask` sozinho no FastAPI, mas você precisa criar o objeto no seu código e retornar uma `Response` da Starlette incluindo-o. -Você pode ver mais detalhes na documentação oficial da Starlette para tarefas em segundo plano. +Você pode ver mais detalhes na [documentação oficial da Starlette para tarefas em segundo plano](https://www.starlette.dev/background/). ## Ressalva { #caveat } -Se você precisar realizar computação pesada em segundo plano e não necessariamente precisar que seja executada pelo mesmo processo (por exemplo, você não precisa compartilhar memória, variáveis, etc.), pode se beneficiar do uso de outras ferramentas maiores, como o Celery. +Se você precisar realizar computação pesada em segundo plano e não necessariamente precisar que seja executada pelo mesmo processo (por exemplo, você não precisa compartilhar memória, variáveis, etc.), pode se beneficiar do uso de outras ferramentas maiores, como o [Celery](https://docs.celeryq.dev). Elas tendem a exigir configurações mais complexas, um gerenciador de fila de mensagens/tarefas, como RabbitMQ ou Redis, mas permitem executar tarefas em segundo plano em vários processos e, especialmente, em vários servidores. diff --git a/docs/pt/docs/tutorial/bigger-applications.md b/docs/pt/docs/tutorial/bigger-applications.md index ad758988f7..971504fa4f 100644 --- a/docs/pt/docs/tutorial/bigger-applications.md +++ b/docs/pt/docs/tutorial/bigger-applications.md @@ -123,7 +123,7 @@ Agora usaremos uma dependência simples para ler um cabeçalho `X-Token` persona Estamos usando um cabeçalho inventado para simplificar este exemplo. -Mas em casos reais, você obterá melhores resultados usando os [Utilitários de Segurança](security/index.md){.internal-link target=_blank} integrados. +Mas em casos reais, você obterá melhores resultados usando os [Utilitários de Segurança](security/index.md) integrados. /// @@ -169,7 +169,7 @@ E podemos adicionar uma list de `dependencies` que serão adicionadas a todas as /// tip | Dica -Observe que, assim como [dependências em *decoradores de operação de rota*](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, nenhum valor será passado para sua *função de operação de rota*. +Observe que, assim como [dependências em *decoradores de operação de rota*](dependencies/dependencies-in-path-operation-decorators.md), nenhum valor será passado para sua *função de operação de rota*. /// @@ -185,8 +185,8 @@ O resultado final é que os paths dos itens agora são: * Todas elas incluirão as `responses` predefinidas. * Todas essas *operações de rota* terão a list de `dependencies` avaliada/executada antes delas. * Se você também declarar dependências em uma *operação de rota* específica, **elas também serão executadas**. - * As dependências do router são executadas primeiro, depois as [`dependencies` no decorador](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank} e, em seguida, as dependências de parâmetros normais. - * Você também pode adicionar [dependências de `Segurança` com `scopes`](../advanced/security/oauth2-scopes.md){.internal-link target=_blank}. + * As dependências do router são executadas primeiro, depois as [`dependencies` no decorador](dependencies/dependencies-in-path-operation-decorators.md) e, em seguida, as dependências de parâmetros normais. + * Você também pode adicionar [dependências de `Segurança` com `scopes`](../advanced/security/oauth2-scopes.md). /// tip | Dica @@ -303,7 +303,7 @@ E como a maior parte de sua lógica agora viverá em seu próprio módulo espec Você importa e cria uma classe `FastAPI` normalmente. -E podemos até declarar [dependências globais](dependencies/global-dependencies.md){.internal-link target=_blank} que serão combinadas com as dependências para cada `APIRouter`: +E podemos até declarar [dependências globais](dependencies/global-dependencies.md) que serão combinadas com as dependências para cada `APIRouter`: {* ../../docs_src/bigger_applications/app_an_py310/main.py hl[1,3,7] title["app/main.py"] *} @@ -353,7 +353,7 @@ A segunda versão é uma "importação absoluta": from app.routers import items, users ``` -Para saber mais sobre pacotes e módulos Python, leia a documentação oficial do Python sobre módulos. +Para saber mais sobre pacotes e módulos Python, leia [a documentação oficial do Python sobre módulos](https://docs.python.org/3/tutorial/modules.html). /// @@ -465,6 +465,37 @@ Como não podemos simplesmente isolá-los e "montá-los" independentemente do re /// +## Configure o `entrypoint` em `pyproject.toml` { #configure-the-entrypoint-in-pyproject-toml } + +Como seu objeto `app` do FastAPI fica em `app/main.py`, você pode configurar o `entrypoint` no seu arquivo `pyproject.toml` assim: + +```toml +[tool.fastapi] +entrypoint = "app.main:app" +``` + +isso é equivalente a importar como: + +```python +from app.main import app +``` + +Dessa forma o comando `fastapi` saberá onde encontrar sua aplicação. + +/// Note | Nota + +Você também poderia passar o path para o comando, como: + +```console +$ fastapi dev app/main.py +``` + +Mas você teria que lembrar de passar o path correto toda vez que chamar o comando `fastapi`. + +Além disso, outras ferramentas podem não conseguir encontrá-la, por exemplo a [Extensão do VS Code](../editor-support.md) ou a [FastAPI Cloud](https://fastapicloud.com), portanto é recomendável usar o `entrypoint` em `pyproject.toml`. + +/// + ## Verifique a documentação automática da API { #check-the-automatic-api-docs } Agora, execute sua aplicação: @@ -472,14 +503,14 @@ Agora, execute sua aplicação:
```console -$ fastapi dev app/main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-E abra a documentação em http://127.0.0.1:8000/docs. +E abra a documentação em [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Você verá a documentação automática da API, incluindo os paths de todos os submódulos, usando os paths (e prefixos) corretos e as tags corretas: diff --git a/docs/pt/docs/tutorial/body-nested-models.md b/docs/pt/docs/tutorial/body-nested-models.md index d53d3f649a..343f94997a 100644 --- a/docs/pt/docs/tutorial/body-nested-models.md +++ b/docs/pt/docs/tutorial/body-nested-models.md @@ -65,7 +65,7 @@ Por exemplo, nós podemos definir um modelo `Image`: ### Use o sub-modelo como um tipo { #use-the-submodel-as-a-type } -E então podemos usa-lo como o tipo de um atributo: +E então podemos usá-lo como o tipo de um atributo: {* ../../docs_src/body_nested_models/tutorial004_py310.py hl[18] *} @@ -90,15 +90,15 @@ Novamente, apenas fazendo essa declaração, com o **FastAPI**, você ganha: * Suporte do editor (preenchimento automático, etc.), inclusive para modelos aninhados * Conversão de dados * Validação de dados -* Documentação automatica +* Documentação automática ## Tipos especiais e validação { #special-types-and-validation } Além dos tipos singulares normais como `str`, `int`, `float`, etc. Você também pode usar tipos singulares mais complexos que herdam de `str`. -Para ver todas as opções possíveis, consulte a Visão geral dos tipos do Pydantic. Você verá alguns exemplos no próximo capítulo. +Para ver todas as opções possíveis, consulte a [Visão geral dos tipos do Pydantic](https://docs.pydantic.dev/latest/concepts/types/). Você verá alguns exemplos no próximo capítulo. -Por exemplo, no modelo `Image` nós temos um campo `url`, nós podemos declara-lo como um `HttpUrl` do Pydantic invés de como uma `str`: +Por exemplo, no modelo `Image` nós temos um campo `url`, nós podemos declará-lo como um `HttpUrl` do Pydantic invés de como uma `str`: {* ../../docs_src/body_nested_models/tutorial005_py310.py hl[2,8] *} @@ -110,7 +110,7 @@ Você também pode usar modelos Pydantic como subtipos de `list`, `set`, etc: {* ../../docs_src/body_nested_models/tutorial006_py310.py hl[18] *} -Isso vai esperar(converter, validar, documentar, etc) um corpo JSON tal qual: +Isso vai esperar (converter, validar, documentar, etc) um corpo JSON tal qual: ```JSON hl_lines="11" { @@ -198,7 +198,7 @@ Neste caso, você aceitaria qualquer `dict`, desde que tenha chaves` int` com va /// tip | Dica -Leve em condideração que o JSON só suporta `str` como chaves. +Leve em consideração que o JSON só suporta `str` como chaves. Mas o Pydantic tem conversão automática de dados. diff --git a/docs/pt/docs/tutorial/body-updates.md b/docs/pt/docs/tutorial/body-updates.md index 95f89c8d23..abd14c42ce 100644 --- a/docs/pt/docs/tutorial/body-updates.md +++ b/docs/pt/docs/tutorial/body-updates.md @@ -2,7 +2,7 @@ ## Atualização substituindo com `PUT` { #update-replacing-with-put } -Para atualizar um item, você pode usar a operação HTTP `PUT`. +Para atualizar um item, você pode usar a operação [HTTP `PUT`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT). Você pode usar `jsonable_encoder` para converter os dados de entrada em dados que podem ser armazenados como JSON (por exemplo, com um banco de dados NoSQL). Por exemplo, convertendo `datetime` em `str`. @@ -28,7 +28,7 @@ E os dados seriam salvos com esse "novo" `tax` de `10.5`. ## Atualizações parciais com `PATCH` { #partial-updates-with-patch } -Você também pode usar a operação HTTP `PATCH` para atualizar dados *parcialmente*. +Você também pode usar a operação [HTTP `PATCH`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) para atualizar dados *parcialmente*. Isso significa que você pode enviar apenas os dados que deseja atualizar, deixando o restante intacto. @@ -95,6 +95,6 @@ Observe que o modelo de entrada ainda é validado. Portanto, se você quiser receber atualizações parciais que possam omitir todos os atributos, você precisa ter um modelo com todos os atributos marcados como opcionais (com valores padrão ou `None`). -Para distinguir entre os modelos com todos os valores opcionais para **atualizações** e modelos com valores obrigatórios para **criação**, você pode usar as ideias descritas em [Modelos Adicionais](extra-models.md){.internal-link target=_blank}. +Para distinguir entre os modelos com todos os valores opcionais para **atualizações** e modelos com valores obrigatórios para **criação**, você pode usar as ideias descritas em [Modelos Adicionais](extra-models.md). /// diff --git a/docs/pt/docs/tutorial/body.md b/docs/pt/docs/tutorial/body.md index bec553e215..926de84fac 100644 --- a/docs/pt/docs/tutorial/body.md +++ b/docs/pt/docs/tutorial/body.md @@ -6,7 +6,7 @@ O corpo da **requisição** é a informação enviada pelo cliente para sua API. Sua API quase sempre precisa enviar um corpo na **resposta**. Mas os clientes não necessariamente precisam enviar **corpos de requisição** o tempo todo, às vezes eles apenas requisitam um path, talvez com alguns parâmetros de consulta, mas não enviam um corpo. -Para declarar um corpo da **requisição**, você utiliza os modelos do Pydantic com todos os seus poderes e benefícios. +Para declarar um corpo da **requisição**, você utiliza os modelos do [Pydantic](https://docs.pydantic.dev/) com todos os seus poderes e benefícios. /// info | Informação @@ -73,7 +73,7 @@ Apenas com essa declaração de tipos do Python, o **FastAPI** irá: * Se algum dado for inválido, irá retornar um erro bem claro, indicando exatamente onde e o que estava incorreto. * Entregar a você a informação recebida no parâmetro `item`. * Como você o declarou na função como do tipo `Item`, você também terá o suporte do editor (preenchimento automático, etc) para todos os atributos e seus tipos. -* Gerar definições de JSON Schema para o seu modelo; você também pode usá-las em qualquer outro lugar se fizer sentido para o seu projeto. +* Gerar definições de [JSON Schema](https://json-schema.org) para o seu modelo; você também pode usá-las em qualquer outro lugar se fizer sentido para o seu projeto. * Esses schemas farão parte do esquema OpenAPI gerado, e serão usados pelas UIs de documentação automática. ## Documentação automática { #automatic-docs } @@ -102,15 +102,15 @@ E foi imensamente testado na fase de design, antes de qualquer implementação, Houveram mudanças no próprio Pydantic para que isso fosse possível. -As capturas de tela anteriores foram capturas no Visual Studio Code. +As capturas de tela anteriores foram capturas no [Visual Studio Code](https://code.visualstudio.com). -Mas você terá o mesmo suporte do editor no PyCharm e na maioria dos editores Python: +Mas você terá o mesmo suporte do editor no [PyCharm](https://www.jetbrains.com/pycharm/) e na maioria dos editores Python: /// tip | Dica -Se você utiliza o PyCharm como editor, você pode utilizar o Plugin do Pydantic para o PyCharm . +Se você utiliza o [PyCharm](https://www.jetbrains.com/pycharm/) como editor, você pode utilizar o [Plugin do Pydantic para o PyCharm](https://github.com/koxudaxi/pydantic-pycharm-plugin/). Melhora o suporte do editor para seus modelos Pydantic com: @@ -163,4 +163,4 @@ Mas adicionar as anotações de tipo permitirá ao seu editor oferecer um suport ## Sem o Pydantic { #without-pydantic } -Se você não quer utilizar os modelos Pydantic, você também pode utilizar o parâmetro **Body**. Veja a documentação para [Body - Parâmetros múltiplos: Valores singulares no body](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank}. +Se você não quer utilizar os modelos Pydantic, você também pode utilizar o parâmetro **Body**. Veja a documentação para [Body - Parâmetros múltiplos: Valores singulares no body](body-multiple-params.md#singular-values-in-body). diff --git a/docs/pt/docs/tutorial/cors.md b/docs/pt/docs/tutorial/cors.md index 055cfeacad..e351d5c5cf 100644 --- a/docs/pt/docs/tutorial/cors.md +++ b/docs/pt/docs/tutorial/cors.md @@ -1,6 +1,6 @@ # CORS (Cross-Origin Resource Sharing) { #cors-cross-origin-resource-sharing } -CORS ou "Cross-Origin Resource Sharing" refere-se às situações em que um frontend rodando em um navegador possui um código JavaScript que se comunica com um backend, e o backend está em uma "origem" diferente do frontend. +[CORS ou "Cross-Origin Resource Sharing"](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) refere-se às situações em que um frontend rodando em um navegador possui um código JavaScript que se comunica com um backend, e o backend está em uma "origem" diferente do frontend. ## Origem { #origin } @@ -56,10 +56,10 @@ Os seguintes argumentos são suportados: * `allow_origins` - Uma lista de origens que devem ter permissão para fazer requisições de origem cruzada. Por exemplo, `['https://example.org', 'https://www.example.org']`. Você pode usar `['*']` para permitir qualquer origem. * `allow_origin_regex` - Uma string regex para corresponder às origens que devem ter permissão para fazer requisições de origem cruzada. Por exemplo, `'https://.*\.example\.org'`. * `allow_methods` - Uma lista de métodos HTTP que devem ser permitidos para requisições de origem cruzada. O padrão é `['GET']`. Você pode usar `['*']` para permitir todos os métodos padrão. -* `allow_headers` - Uma lista de cabeçalhos de solicitação HTTP que devem ter suporte para requisições de origem cruzada. O padrão é `[]`. Você pode usar `['*']` para permitir todos os cabeçalhos. Os cabeçalhos `Accept`, `Accept-Language`, `Content-Language` e `Content-Type` são sempre permitidos para requisições CORS simples. +* `allow_headers` - Uma lista de cabeçalhos de solicitação HTTP que devem ter suporte para requisições de origem cruzada. O padrão é `[]`. Você pode usar `['*']` para permitir todos os cabeçalhos. Os cabeçalhos `Accept`, `Accept-Language`, `Content-Language` e `Content-Type` são sempre permitidos para [requisições CORS simples](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests). * `allow_credentials` - Indica que os cookies devem ser suportados para requisições de origem cruzada. O padrão é `False`. - Nenhum de `allow_origins`, `allow_methods` e `allow_headers` pode ser definido como `['*']` se `allow_credentials` estiver definido como `True`. Todos eles devem ser especificados explicitamente. + Nenhum de `allow_origins`, `allow_methods` e `allow_headers` pode ser definido como `['*']` se `allow_credentials` estiver definido como `True`. Todos eles devem ser [especificados explicitamente](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards). * `expose_headers` - Indica quaisquer cabeçalhos de resposta que devem ser disponibilizados ao navegador. O padrão é `[]`. * `max_age` - Define um tempo máximo em segundos para os navegadores armazenarem em cache as respostas CORS. O padrão é `600`. @@ -78,7 +78,7 @@ Qualquer solicitação com um cabeçalho `Origin`. Neste caso, o middleware pass ## Mais informações { #more-info } -Para mais informações sobre CORS, consulte a documentação do CORS da Mozilla. +Para mais informações sobre CORS, consulte a [documentação do CORS da Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS). /// note | Detalhes Técnicos diff --git a/docs/pt/docs/tutorial/debugging.md b/docs/pt/docs/tutorial/debugging.md index 773921bb3c..b2c0ed8caf 100644 --- a/docs/pt/docs/tutorial/debugging.md +++ b/docs/pt/docs/tutorial/debugging.md @@ -74,7 +74,7 @@ não será executada. /// info | Informação -Para mais informações, consulte a documentação oficial do Python. +Para mais informações, consulte [a documentação oficial do Python](https://docs.python.org/3/library/__main__.html). /// diff --git a/docs/pt/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/pt/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md index 4a99091d11..05742c8e0c 100644 --- a/docs/pt/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md +++ b/docs/pt/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md @@ -8,7 +8,7 @@ Mas você ainda precisa que ela seja executada/resolvida. Para esses casos, em vez de declarar um parâmetro em uma *função de operação de rota* com `Depends`, você pode adicionar um argumento `dependencies` do tipo `list` ao decorador da operação de rota. -## Adicione `dependencies` ao decorador da operação de rota { #add-dependencies-to-the-path-operation-decorator } +## Adicione `dependencies` ao *decorador da operação de rota* { #add-dependencies-to-the-path-operation-decorator } O *decorador da operação de rota* recebe um argumento opcional `dependencies`. @@ -32,7 +32,7 @@ Isso também pode ser útil para evitar confundir novos desenvolvedores que ao v Neste exemplo utilizamos cabeçalhos personalizados inventados `X-Key` e `X-Token`. -Mas em situações reais, como implementações de segurança, você pode obter mais vantagens em usar as [Ferramentas de segurança integradas (o próximo capítulo)](../security/index.md){.internal-link target=_blank}. +Mas em situações reais, como implementações de segurança, você pode obter mais vantagens em usar as [Ferramentas de segurança integradas (o próximo capítulo)](../security/index.md). /// @@ -62,7 +62,7 @@ Então, você pode reutilizar uma dependência comum (que retorna um valor) que ## Dependências para um grupo de *operações de rota* { #dependencies-for-a-group-of-path-operations } -Mais a frente, quando você ler sobre como estruturar aplicações maiores ([Aplicações maiores - Múltiplos arquivos](../../tutorial/bigger-applications.md){.internal-link target=_blank}), possivelmente com múltiplos arquivos, você aprenderá a declarar um único parâmetro `dependencies` para um grupo de *operações de rota*. +Mais a frente, quando você ler sobre como estruturar aplicações maiores ([Aplicações maiores - Múltiplos arquivos](../../tutorial/bigger-applications.md)), possivelmente com múltiplos arquivos, você aprenderá a declarar um único parâmetro `dependencies` para um grupo de *operações de rota*. ## Dependências globais { #global-dependencies } diff --git a/docs/pt/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/pt/docs/tutorial/dependencies/dependencies-with-yield.md index dd9d9fbe6d..3e4a31d6ff 100644 --- a/docs/pt/docs/tutorial/dependencies/dependencies-with-yield.md +++ b/docs/pt/docs/tutorial/dependencies/dependencies-with-yield.md @@ -14,8 +14,8 @@ Garanta utilizar `yield` apenas uma vez por dependência. Qualquer função que possa ser utilizada com: -* `@contextlib.contextmanager` ou -* `@contextlib.asynccontextmanager` +* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) ou +* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager) pode ser utilizada como uma dependência do **FastAPI**. @@ -87,7 +87,7 @@ O **FastAPI** se encarrega de executá-las na ordem certa. /// note | Detalhes Técnicos -Tudo isso funciona graças aos gerenciadores de contexto do Python. +Tudo isso funciona graças aos [gerenciadores de contexto](https://docs.python.org/3/library/contextlib.html) do Python. O **FastAPI** utiliza eles internamente para alcançar isso. @@ -111,7 +111,7 @@ Mas ela existe para ser utilizada caso você precise. 🤓 {* ../../docs_src/dependencies/tutorial008b_an_py310.py hl[18:22,31] *} -Se você quiser capturar exceções e criar uma resposta personalizada com base nisso, crie um [Manipulador de Exceções Customizado](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}. +Se você quiser capturar exceções e criar uma resposta personalizada com base nisso, crie um [Manipulador de Exceções Customizado](../handling-errors.md#install-custom-exception-handlers). ## Dependências com `yield` e `except` { #dependencies-with-yield-and-except } @@ -233,14 +233,14 @@ participant operation as Operação de Rota Dependências com `yield` evoluíram ao longo do tempo para cobrir diferentes casos de uso e corrigir alguns problemas. -Se você quiser ver o que mudou em diferentes versões do FastAPI, você pode ler mais sobre isso no guia avançado, em [Dependências Avançadas - Dependências com `yield`, `HTTPException`, `except` e Tarefas de Background](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks){.internal-link target=_blank}. +Se você quiser ver o que mudou em diferentes versões do FastAPI, você pode ler mais sobre isso no guia avançado, em [Dependências Avançadas - Dependências com `yield`, `HTTPException`, `except` e Tarefas de Background](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks). ## Gerenciadores de contexto { #context-managers } ### O que são "Gerenciadores de Contexto" { #what-are-context-managers } "Gerenciadores de Contexto" são qualquer um dos objetos Python que podem ser utilizados com a declaração `with`. -Por exemplo, você pode utilizar `with` para ler um arquivo: +Por exemplo, [você pode utilizar `with` para ler um arquivo](https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files): ```Python with open("./somefile.txt") as f: @@ -264,7 +264,7 @@ Se você está apenas iniciando com o **FastAPI** você pode querer pular isso p /// -Em Python, você pode criar Gerenciadores de Contexto ao criar uma classe com dois métodos: `__enter__()` e `__exit__()`. +Em Python, você pode criar Gerenciadores de Contexto ao [criar uma classe com dois métodos: `__enter__()` e `__exit__()`](https://docs.python.org/3/reference/datamodel.html#context-managers). Você também pode usá-los dentro de dependências com `yield` do **FastAPI** ao utilizar `with` ou `async with` dentro da função da dependência: @@ -275,8 +275,8 @@ Você também pode usá-los dentro de dependências com `yield` do **FastAPI** a Outra forma de criar um gerenciador de contexto é utilizando: -* `@contextlib.contextmanager` ou -* `@contextlib.asynccontextmanager` +* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) ou +* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager) Para decorar uma função com um único `yield`. diff --git a/docs/pt/docs/tutorial/dependencies/global-dependencies.md b/docs/pt/docs/tutorial/dependencies/global-dependencies.md index d85b72f8e7..5ff106c230 100644 --- a/docs/pt/docs/tutorial/dependencies/global-dependencies.md +++ b/docs/pt/docs/tutorial/dependencies/global-dependencies.md @@ -2,15 +2,15 @@ Para alguns tipos de aplicação você pode querer adicionar dependências para toda a aplicação. -De forma semelhante a [adicionar `dependencies` aos *decoradores de operação de rota*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, você pode adicioná-las à aplicação `FastAPI`. +De forma semelhante a [adicionar `dependencies` aos *decoradores de operação de rota*](dependencies-in-path-operation-decorators.md), você pode adicioná-las à aplicação `FastAPI`. Nesse caso, elas serão aplicadas a todas as *operações de rota* da aplicação: {* ../../docs_src/dependencies/tutorial012_an_py310.py hl[17] *} -E todos os conceitos apresentados na seção sobre [adicionar `dependencies` aos *decoradores de operação de rota*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} ainda se aplicam, mas nesse caso, para todas as *operações de rota* da aplicação. +E todos os conceitos apresentados na seção sobre [adicionar `dependencies` aos *decoradores de operação de rota*](dependencies-in-path-operation-decorators.md) ainda se aplicam, mas nesse caso, para todas as *operações de rota* da aplicação. ## Dependências para conjuntos de *operações de rota* { #dependencies-for-groups-of-path-operations } -Mais para a frente, quando você ler sobre como estruturar aplicações maiores ([Aplicações Maiores - Múltiplos Arquivos](../../tutorial/bigger-applications.md){.internal-link target=_blank}), possivelmente com múltiplos arquivos, você irá aprender a declarar um único parâmetro `dependencies` para um conjunto de *operações de rota*. +Mais para a frente, quando você ler sobre como estruturar aplicações maiores ([Aplicações Maiores - Múltiplos Arquivos](../../tutorial/bigger-applications.md)), possivelmente com múltiplos arquivos, você irá aprender a declarar um único parâmetro `dependencies` para um conjunto de *operações de rota*. diff --git a/docs/pt/docs/tutorial/dependencies/index.md b/docs/pt/docs/tutorial/dependencies/index.md index 5b8afe783b..baea97f7ff 100644 --- a/docs/pt/docs/tutorial/dependencies/index.md +++ b/docs/pt/docs/tutorial/dependencies/index.md @@ -1,6 +1,6 @@ # Dependências { #dependencies } -O **FastAPI** possui um poderoso, mas intuitivo sistema de **Injeção de Dependência**. +O **FastAPI** possui um poderoso, mas intuitivo sistema de **Injeção de Dependência**. Esse sistema foi pensado para ser fácil de usar, e permitir que qualquer desenvolvedor possa integrar facilmente outros componentes ao **FastAPI**. @@ -57,7 +57,7 @@ FastAPI passou a suportar a notação `Annotated` (e começou a recomendá-la) n Se você utiliza uma versão anterior, ocorrerão erros ao tentar utilizar `Annotated`. -Certifique-se de [Atualizar a versão do FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} para pelo menos 0.95.1 antes de usar `Annotated`. +Certifique-se de [Atualizar a versão do FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions) para pelo menos 0.95.1 antes de usar `Annotated`. /// @@ -152,7 +152,7 @@ Não faz diferença. O **FastAPI** sabe o que fazer. /// note | Nota -Caso você não conheça, veja em [Async: *"Com Pressa?"*](../../async.md#in-a-hurry){.internal-link target=_blank} a sessão acerca de `async` e `await` na documentação. +Caso você não conheça, veja em [Async: *"Com Pressa?"*](../../async.md#in-a-hurry) a sessão acerca de `async` e `await` na documentação. /// diff --git a/docs/pt/docs/tutorial/encoder.md b/docs/pt/docs/tutorial/encoder.md index b3b1b69bc3..e1ee2eccfd 100644 --- a/docs/pt/docs/tutorial/encoder.md +++ b/docs/pt/docs/tutorial/encoder.md @@ -12,7 +12,7 @@ Vamos imaginar que você tenha um banco de dados `fake_db` que recebe apenas dad Por exemplo, ele não recebe objetos `datetime`, pois estes objetos não são compatíveis com JSON. -Então, um objeto `datetime` teria que ser convertido em um `str` contendo os dados no formato ISO. +Então, um objeto `datetime` teria que ser convertido em um `str` contendo os dados no [formato ISO](https://en.wikipedia.org/wiki/ISO_8601). Da mesma forma, este banco de dados não receberia um modelo Pydantic (um objeto com atributos), apenas um `dict`. @@ -24,7 +24,7 @@ A função recebe um objeto, como um modelo Pydantic e retorna uma versão compa Neste exemplo, ele converteria o modelo Pydantic em um `dict`, e o `datetime` em um `str`. -O resultado de chamar a função é algo que pode ser codificado com o padrão do Python `json.dumps()`. +O resultado de chamar a função é algo que pode ser codificado com o padrão do Python [`json.dumps()`](https://docs.python.org/3/library/json.html#json.dumps). A função não retorna um grande `str` contendo os dados no formato JSON (como uma string). Mas sim, retorna uma estrutura de dados padrão do Python (por exemplo, um `dict`) com valores e subvalores compatíveis com JSON. diff --git a/docs/pt/docs/tutorial/extra-data-types.md b/docs/pt/docs/tutorial/extra-data-types.md index 97e4cc4757..e323d57301 100644 --- a/docs/pt/docs/tutorial/extra-data-types.md +++ b/docs/pt/docs/tutorial/extra-data-types.md @@ -36,12 +36,12 @@ Aqui estão alguns dos tipos de dados adicionais que você pode usar: * `datetime.timedelta`: * O `datetime.timedelta` do Python. * Em requisições e respostas será representado como um `float` de segundos totais. - * O Pydantic também permite representá-lo como uma "codificação ISO 8601 diferença de tempo", cheque a documentação para mais informações. + * O Pydantic também permite representá-lo como uma "codificação ISO 8601 diferença de tempo", [cheque a documentação para mais informações](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers). * `frozenset`: * Em requisições e respostas, será tratado da mesma forma que um `set`: * Nas requisições, uma lista será lida, eliminando duplicadas e convertendo-a em um `set`. * Nas respostas, o `set` será convertido para uma `list`. - * O esquema gerado vai especificar que os valores do `set` são unicos (usando o `uniqueItems` do JSON Schema). + * O esquema gerado vai especificar que os valores do `set` são únicos (usando o `uniqueItems` do JSON Schema). * `bytes`: * O `bytes` padrão do Python. * Em requisições e respostas será representado como uma `str`. @@ -49,7 +49,7 @@ Aqui estão alguns dos tipos de dados adicionais que você pode usar: * `Decimal`: * O `Decimal` padrão do Python. * Em requisições e respostas será representado como um `float`. -* Você pode checar todos os tipos de dados válidos do Pydantic aqui: Tipos de dados do Pydantic. +* Você pode checar todos os tipos de dados válidos do Pydantic aqui: [Tipos de dados do Pydantic](https://docs.pydantic.dev/latest/usage/types/types/). ## Exemplo { #example } @@ -57,6 +57,6 @@ Aqui está um exemplo de *operação de rota* com parâmetros utilizando-se de a {* ../../docs_src/extra_data_types/tutorial001_an_py310.py hl[1,3,12:16] *} -Note que os parâmetros dentro da função tem seu tipo de dados natural, e você pode, por exemplo, realizar manipulações normais de data, como: +Note que os parâmetros dentro da função têm seu tipo de dados natural, e você pode, por exemplo, realizar manipulações normais de data, como: {* ../../docs_src/extra_data_types/tutorial001_an_py310.py hl[18:19] *} diff --git a/docs/pt/docs/tutorial/extra-models.md b/docs/pt/docs/tutorial/extra-models.md index 3136597417..424e0fe185 100644 --- a/docs/pt/docs/tutorial/extra-models.md +++ b/docs/pt/docs/tutorial/extra-models.md @@ -12,7 +12,7 @@ Isso é especialmente o caso para modelos de usuários, porque: Nunca armazene senhas em texto simples dos usuários. Sempre armazene uma "hash segura" que você pode verificar depois. -Se não souber, você aprenderá o que é uma "senha hash" nos [capítulos de segurança](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}. +Se não souber, você aprenderá o que é uma "senha hash" nos [capítulos de segurança](security/simple-oauth2.md#password-hashing). /// @@ -162,11 +162,11 @@ Você pode declarar uma resposta como o `Union` de dois ou mais tipos, o que sig Isso será definido no OpenAPI com `anyOf`. -Para fazer isso, use a anotação de tipo padrão do Python `typing.Union`: +Para fazer isso, use a anotação de tipo padrão do Python [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union): /// note | Nota -Ao definir um `Union`, inclua o tipo mais específico primeiro, seguido pelo tipo menos específico. No exemplo abaixo, o tipo mais específico `PlaneItem` vem antes de `CarItem` em `Union[PlaneItem, CarItem]`. +Ao definir um [`Union`](https://docs.pydantic.dev/latest/concepts/types/#unions), inclua o tipo mais específico primeiro, seguido pelo tipo menos específico. No exemplo abaixo, o tipo mais específico `PlaneItem` vem antes de `CarItem` em `Union[PlaneItem, CarItem]`. /// diff --git a/docs/pt/docs/tutorial/first-steps.md b/docs/pt/docs/tutorial/first-steps.md index 4ccc7cf040..719a38c209 100644 --- a/docs/pt/docs/tutorial/first-steps.md +++ b/docs/pt/docs/tutorial/first-steps.md @@ -6,12 +6,12 @@ O arquivo FastAPI mais simples pode se parecer com: Copie o conteúdo para um arquivo `main.py`. -Execute o servidor: +Execute o servidor ao vivo:
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -58,7 +58,7 @@ Essa linha mostra a URL onde a sua aplicação está sendo servida, na sua máqu ### Confira { #check-it } -Abra o seu navegador em http://127.0.0.1:8000. +Abra o seu navegador em [http://127.0.0.1:8000](http://127.0.0.1:8000). Você verá essa resposta em JSON: @@ -68,17 +68,17 @@ Você verá essa resposta em JSON: ### Documentação Interativa de APIs { #interactive-api-docs } -Agora vá para http://127.0.0.1:8000/docs. +Agora vá para [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). -Você verá a documentação interativa automática da API (fornecida por Swagger UI): +Você verá a documentação interativa automática da API (fornecida por [Swagger UI](https://github.com/swagger-api/swagger-ui)): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Documentação Alternativa de APIs { #alternative-api-docs } -E agora, vá para http://127.0.0.1:8000/redoc. +E agora, vá para [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). -Você verá a documentação alternativa automática (fornecida por ReDoc): +Você verá a documentação alternativa automática (fornecida por [ReDoc](https://github.com/Rebilly/ReDoc)): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -92,7 +92,7 @@ Um "*schema*" é uma definição ou descrição de algo. Não o código que o im #### API "*schema*" { #api-schema } -Nesse caso, OpenAPI é uma especificação que determina como definir um *schema* da sua API. +Nesse caso, [OpenAPI](https://github.com/OAI/OpenAPI-Specification) é uma especificação que determina como definir um *schema* da sua API. Esta definição de *schema* inclui os paths da sua API, os parâmetros possíveis que eles usam, etc. @@ -110,7 +110,7 @@ OpenAPI define um *schema* de API para sua API. E esse *schema* inclui definiç Se você está curioso(a) sobre a aparência do *schema* bruto OpenAPI, o FastAPI gera automaticamente um JSON (*schema*) com as descrições de toda a sua API. -Você pode ver isso diretamente em: http://127.0.0.1:8000/openapi.json. +Você pode ver isso diretamente em: [http://127.0.0.1:8000/openapi.json](http://127.0.0.1:8000/openapi.json). Ele mostrará um JSON começando com algo como: @@ -143,9 +143,58 @@ E existem dezenas de alternativas, todas baseadas em OpenAPI. Você pode facilme Você também pode usá-lo para gerar código automaticamente para clientes que se comunicam com sua API. Por exemplo, aplicativos front-end, móveis ou IoT. +### Configure o `entrypoint` da aplicação em `pyproject.toml` { #configure-the-app-entrypoint-in-pyproject-toml } + +Você pode configurar onde sua aplicação está localizada em um arquivo `pyproject.toml`, assim: + +```toml +[tool.fastapi] +entrypoint = "main:app" +``` + +Esse `entrypoint` dirá ao comando `fastapi` que ele deve importar a aplicação assim: + +```python +from main import app +``` + +Se o seu código estiver estruturado assim: + +``` +. +├── backend +│   ├── main.py +│   ├── __init__.py +``` + +Então você definiria o `entrypoint` como: + +```toml +[tool.fastapi] +entrypoint = "backend.main:app" +``` + +o que seria equivalente a: + +```python +from backend.main import app +``` + +### `fastapi dev` com path { #fastapi-dev-with-path } + +Você também pode passar o path do arquivo para o comando `fastapi dev`, e ele vai deduzir o objeto de aplicação FastAPI a ser usado: + +```console +$ fastapi dev main.py +``` + +Mas você teria que lembrar de passar o path correto toda vez que chamar o comando `fastapi`. + +Além disso, outras ferramentas podem não conseguir encontrá-la, por exemplo, a [Extensão do VS Code](../editor-support.md) ou a [FastAPI Cloud](https://fastapicloud.com), então é recomendado usar o `entrypoint` no `pyproject.toml`. + ### Faça o deploy da sua aplicação (opcional) { #deploy-your-app-optional } -Você pode, opcionalmente, fazer o deploy da sua aplicação FastAPI na FastAPI Cloud; acesse e entre na lista de espera, se ainda não entrou. 🚀 +Você pode, opcionalmente, fazer o deploy da sua aplicação FastAPI na [FastAPI Cloud](https://fastapicloud.com); acesse e entre na lista de espera, se ainda não entrou. 🚀 Se você já tem uma conta na **FastAPI Cloud** (nós convidamos você da lista de espera 😉), pode fazer o deploy da sua aplicação com um único comando. @@ -191,7 +240,7 @@ Deploying to FastAPI Cloud... `FastAPI` é uma classe que herda diretamente de `Starlette`. -Você pode usar todas as funcionalidades do Starlette com `FastAPI` também. +Você pode usar todas as funcionalidades do [Starlette](https://www.starlette.dev/) com `FastAPI` também. /// @@ -312,7 +361,7 @@ Por exemplo, ao usar GraphQL, você normalmente executa todas as ações usando /// -### Passo 4: defina a função de operação de rota { #step-4-define-the-path-operation-function } +### Passo 4: defina a **função de operação de rota** { #step-4-define-the-path-operation-function } Esta é a nossa "**função de operação de rota**": @@ -336,7 +385,7 @@ Você também pode defini-la como uma função normal em vez de `async def`: /// note | Nota -Se você não sabe a diferença, verifique o [Async: *"Com pressa?"*](../async.md#in-a-hurry){.internal-link target=_blank}. +Se você não sabe a diferença, verifique o [Async: *"Com pressa?"*](../async.md#in-a-hurry). /// @@ -352,11 +401,11 @@ Existem muitos outros objetos e modelos que serão convertidos automaticamente p ### Passo 6: Faça o deploy { #step-6-deploy-it } -Faça o deploy da sua aplicação para a **FastAPI Cloud** com um comando: `fastapi deploy`. 🎉 +Faça o deploy da sua aplicação para a **[FastAPI Cloud](https://fastapicloud.com)** com um comando: `fastapi deploy`. 🎉 #### Sobre o FastAPI Cloud { #about-fastapi-cloud } -A **FastAPI Cloud** é construída pelo mesmo autor e equipe por trás do **FastAPI**. +A **[FastAPI Cloud](https://fastapicloud.com)** é construída pelo mesmo autor e equipe por trás do **FastAPI**. Ela simplifica o processo de **construir**, **fazer deploy** e **acessar** uma API com o mínimo de esforço. diff --git a/docs/pt/docs/tutorial/handling-errors.md b/docs/pt/docs/tutorial/handling-errors.md index 252dbb06fb..c400a1e848 100644 --- a/docs/pt/docs/tutorial/handling-errors.md +++ b/docs/pt/docs/tutorial/handling-errors.md @@ -81,7 +81,7 @@ Mas caso você precise, para um cenário mais complexo, você pode adicionar hea ## Instale manipuladores de exceções customizados { #install-custom-exception-handlers } -Você pode adicionar manipuladores de exceção customizados com a mesma seção de utilidade de exceções presentes no Starlette. +Você pode adicionar manipuladores de exceção customizados com [a mesma seção de utilidade de exceções presentes no Starlette](https://www.starlette.dev/exceptions/). Digamos que você tenha uma exceção customizada `UnicornException` que você (ou uma biblioteca que você use) precise lançar (`raise`). diff --git a/docs/pt/docs/tutorial/index.md b/docs/pt/docs/tutorial/index.md index cd7dd88fe9..49cb48adb1 100644 --- a/docs/pt/docs/tutorial/index.md +++ b/docs/pt/docs/tutorial/index.md @@ -10,12 +10,12 @@ Ele também foi construído para servir como uma referência futura, então voc Todos os blocos de código podem ser copiados e utilizados diretamente (eles são, na verdade, arquivos Python testados). -Para rodar qualquer um dos exemplos, copie o código para um arquivo `main.py`, e inicie o `fastapi dev` com: +Para rodar qualquer um dos exemplos, copie o código para um arquivo `main.py`, e inicie o `fastapi dev`:
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -62,7 +62,7 @@ Usá-lo em seu editor é o que realmente te mostra os benefícios do FastAPI, ve O primeiro passo é instalar o FastAPI. -Certifique-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo e então **instalar o FastAPI**: +Certifique-se de criar um [ambiente virtual](../virtual-environments.md), ativá-lo e então **instalar o FastAPI**:
@@ -76,7 +76,7 @@ $ pip install "fastapi[standard]" /// note | Nota -Quando você instala com `pip install "fastapi[standard]"`, ele vem com algumas dependências opcionais padrão, incluindo `fastapi-cloud-cli`, que permite fazer deploy na FastAPI Cloud. +Quando você instala com `pip install "fastapi[standard]"`, ele vem com algumas dependências opcionais padrão, incluindo `fastapi-cloud-cli`, que permite fazer deploy na [FastAPI Cloud](https://fastapicloud.com). Se você não quiser ter essas dependências opcionais, pode instalar `pip install fastapi` em vez disso. @@ -84,6 +84,12 @@ Se você quiser instalar as dependências padrão, mas sem o `fastapi-cloud-cli` /// +/// tip | Dica + +O FastAPI tem uma [extensão oficial para o VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (e para o Cursor), que fornece vários recursos, incluindo um explorador de operações de rota, busca de operações de rota, navegação CodeLens em testes (ir para a definição a partir dos testes) e deploy e logs da FastAPI Cloud, tudo direto do seu editor. + +/// + ## Guia Avançado de Usuário { #advanced-user-guide } Há também um **Guia Avançado de Usuário** que você pode ler após esse **Tutorial - Guia de Usuário**. diff --git a/docs/pt/docs/tutorial/metadata.md b/docs/pt/docs/tutorial/metadata.md index 476b5c806e..3d96109789 100644 --- a/docs/pt/docs/tutorial/metadata.md +++ b/docs/pt/docs/tutorial/metadata.md @@ -14,7 +14,7 @@ Você pode definir os seguintes campos que são usados na especificação OpenAP | `version` | `string` | A versão da API. Esta é a versão da sua aplicação, não do OpenAPI. Por exemplo, `2.5.0`. | | `terms_of_service` | `str` | Uma URL para os Termos de Serviço da API. Se fornecido, deve ser uma URL. | | `contact` | `dict` | As informações de contato da API exposta. Pode conter vários campos.
Campos de contact
ParâmetroTipoDescrição
namestrO nome identificador da pessoa/organização de contato.
urlstrA URL que aponta para as informações de contato. DEVE estar no formato de uma URL.
emailstrO endereço de e-mail da pessoa/organização de contato. DEVE estar no formato de um endereço de e-mail.
| -| `license_info` | `dict` | As informações de licença para a API exposta. Ela pode conter vários campos.
Campos de license_info
ParâmetroTipoDescrição
namestrOBRIGATÓRIO (se um license_info for definido). O nome da licença usada para a API.
identifierstrUma expressão de licença SPDX para a API. O campo identifier é mutuamente exclusivo do campo url. Disponível desde OpenAPI 3.1.0, FastAPI 0.99.0.
urlstrUma URL para a licença usada para a API. DEVE estar no formato de uma URL.
| +| `license_info` | `dict` | As informações de licença para a API exposta. Ela pode conter vários campos.
Campos de license_info
ParâmetroTipoDescrição
namestrOBRIGATÓRIO (se um license_info for definido). O nome da licença usada para a API.
identifierstrUma 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.
urlstrUma URL para a licença usada para a API. DEVE estar no formato de uma URL.
| Você pode defini-los da seguinte maneira: @@ -76,7 +76,7 @@ Use o parâmetro `tags` com suas *operações de rota* (e `APIRouter`s) para atr /// info | Informação -Leia mais sobre tags em [Configuração de operação de rota](path-operation-configuration.md#tags){.internal-link target=_blank}. +Leia mais sobre tags em [Configuração de operação de rota](path-operation-configuration.md#tags). /// diff --git a/docs/pt/docs/tutorial/middleware.md b/docs/pt/docs/tutorial/middleware.md index 7cccfcb6ac..5ae5854da7 100644 --- a/docs/pt/docs/tutorial/middleware.md +++ b/docs/pt/docs/tutorial/middleware.md @@ -15,7 +15,7 @@ Um "middleware" é uma função que manipula cada **requisição** antes de ser Se você tiver dependências com `yield`, o código de saída será executado *depois* do middleware. -Se houver alguma tarefa em segundo plano (abordada na seção [Tarefas em segundo plano](background-tasks.md){.internal-link target=_blank}, que você verá mais adiante), ela será executada *depois* de todo o middleware. +Se houver alguma tarefa em segundo plano (abordada na seção [Tarefas em segundo plano](background-tasks.md), que você verá mais adiante), ela será executada *depois* de todo o middleware. /// @@ -35,9 +35,9 @@ A função middleware recebe: /// tip | Dica -Tenha em mente que cabeçalhos proprietários personalizados podem ser adicionados usando o prefixo `X-`. +Tenha em mente que cabeçalhos proprietários personalizados podem ser adicionados [usando o prefixo `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). -Mas se você tiver cabeçalhos personalizados desejando que um cliente em um navegador esteja apto a ver, você precisa adicioná-los às suas configurações CORS ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) usando o parâmetro `expose_headers` documentado em Documentação CORS da Starlette. +Mas se você tiver cabeçalhos personalizados desejando que um cliente em um navegador esteja apto a ver, você precisa adicioná-los às suas configurações CORS ([CORS (Cross-Origin Resource Sharing)](cors.md)) usando o parâmetro `expose_headers` documentado na [Documentação CORS da Starlette](https://www.starlette.dev/middleware/#corsmiddleware). /// @@ -61,7 +61,7 @@ Por exemplo, você pode adicionar um cabeçalho personalizado `X-Process-Time` c /// tip | Dica -Aqui usamos `time.perf_counter()` em vez de `time.time()` porque ele pode ser mais preciso para esses casos de uso. 🤓 +Aqui usamos [`time.perf_counter()`](https://docs.python.org/3/library/time.html#time.perf_counter) em vez de `time.time()` porque ele pode ser mais preciso para esses casos de uso. 🤓 /// @@ -90,6 +90,6 @@ Esse comportamento de empilhamento garante que os middlewares sejam executados e ## Outros middlewares { #other-middlewares } -Mais tarde, você pode ler mais sobre outros middlewares no [Guia do usuário avançado: Middleware avançado](../advanced/middleware.md){.internal-link target=_blank}. +Mais tarde, você pode ler mais sobre outros middlewares no [Guia do usuário avançado: Middleware avançado](../advanced/middleware.md). Você lerá sobre como manipular CORS com um middleware na próxima seção. diff --git a/docs/pt/docs/tutorial/path-operation-configuration.md b/docs/pt/docs/tutorial/path-operation-configuration.md index c17b12e2bd..745b9b6980 100644 --- a/docs/pt/docs/tutorial/path-operation-configuration.md +++ b/docs/pt/docs/tutorial/path-operation-configuration.md @@ -40,7 +40,7 @@ Eles serão adicionados ao esquema OpenAPI e usados pelas interfaces de document ### Tags com Enums { #tags-with-enums } -Se você tem uma grande aplicação, você pode acabar acumulando **várias tags**, e você gostaria de ter certeza de que você sempre usa a **mesma tag** para *operações de rota* relacionadas. +Se você tem uma grande aplicação, você pode acabar acumulando **várias tags**, e você gostaria de ter certeza de que você sempre usa a ** mesma tag** para *operações de rota* relacionadas. Nestes casos, pode fazer sentido armazenar as tags em um `Enum`. @@ -58,7 +58,7 @@ Você pode adicionar um `summary` e uma `description`: Como as descrições tendem a ser longas e cobrir várias linhas, você pode declarar a descrição da *operação de rota* na docstring da função e o **FastAPI** irá lê-la de lá. -Você pode escrever Markdown na docstring, ele será interpretado e exibido corretamente (levando em conta a indentação da docstring). +Você pode escrever [Markdown](https://en.wikipedia.org/wiki/Markdown) na docstring, ele será interpretado e exibido corretamente (levando em conta a indentação da docstring). {* ../../docs_src/path_operation_configuration/tutorial004_py310.py hl[17:25] *} diff --git a/docs/pt/docs/tutorial/path-params-numeric-validations.md b/docs/pt/docs/tutorial/path-params-numeric-validations.md index bb2e154f43..9bbe14c759 100644 --- a/docs/pt/docs/tutorial/path-params-numeric-validations.md +++ b/docs/pt/docs/tutorial/path-params-numeric-validations.md @@ -14,7 +14,7 @@ O FastAPI adicionou suporte a `Annotated` (e passou a recomendá-lo) na versão Se você tiver uma versão mais antiga, verá erros ao tentar usar `Annotated`. -Certifique-se de [Atualizar a versão do FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} para pelo menos 0.95.1 antes de usar `Annotated`. +Certifique-se de [Atualizar a versão do FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions) para pelo menos 0.95.1 antes de usar `Annotated`. /// @@ -122,7 +122,7 @@ E o mesmo para lt. ## Recapitulando { #recap } -Com `Query`, `Path` (e outras que você ainda não viu) você pode declarar metadados e validações de string do mesmo modo que em [Parâmetros de consulta e validações de string](query-params-str-validations.md){.internal-link target=_blank}. +Com `Query`, `Path` (e outras que você ainda não viu) você pode declarar metadados e validações de string do mesmo modo que em [Parâmetros de consulta e validações de string](query-params-str-validations.md). E você também pode declarar validações numéricas: diff --git a/docs/pt/docs/tutorial/path-params.md b/docs/pt/docs/tutorial/path-params.md index e8e420ad0d..ea9af63f36 100644 --- a/docs/pt/docs/tutorial/path-params.md +++ b/docs/pt/docs/tutorial/path-params.md @@ -6,7 +6,7 @@ Você pode declarar "parâmetros" ou "variáveis" de path com a mesma sintaxe us O valor do parâmetro de path `item_id` será passado para a sua função como o argumento `item_id`. -Então, se você executar este exemplo e acessar http://127.0.0.1:8000/items/foo, você verá uma resposta: +Então, se você executar este exemplo e acessar [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo), você verá uma resposta: ```JSON {"item_id":"foo"} @@ -26,7 +26,7 @@ Isso fornecerá suporte do editor dentro da sua função, com verificações de ## Dados conversão { #data-conversion } -Se você executar este exemplo e abrir seu navegador em http://127.0.0.1:8000/items/3, você verá uma resposta: +Se você executar este exemplo e abrir seu navegador em [http://127.0.0.1:8000/items/3](http://127.0.0.1:8000/items/3), você verá uma resposta: ```JSON {"item_id":3} @@ -40,7 +40,7 @@ Então, com essa declaração de tipo, o **FastAPI** fornece http://127.0.0.1:8000/items/foo, verá um bom erro HTTP: +Mas se você for no navegador para [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo), verá um bom erro HTTP: ```JSON { @@ -60,7 +60,7 @@ Mas se você for no navegador para http://127.0.0.1:8000/items/4.2 +O mesmo erro apareceria se você fornecesse um `float` em vez de um `int`, como em: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2) /// check | Verifique Então, com a mesma declaração de tipo do Python, o **FastAPI** fornece validação de dados. @@ -72,7 +72,7 @@ Isso é incrivelmente útil ao desenvolver e depurar código que interage com su ## Documentação { #documentation } -E quando você abrir seu navegador em http://127.0.0.1:8000/docs, você verá documentação automática, interativa, da API como: +E quando você abrir seu navegador em [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs), você verá documentação automática, interativa, da API como: @@ -84,9 +84,9 @@ Observe que o parâmetro de path está declarado como um inteiro. ## Benefícios baseados em padrões, documentação alternativa { #standards-based-benefits-alternative-documentation } -E como o schema gerado é do padrão OpenAPI, existem muitas ferramentas compatíveis. +E como o schema gerado é do padrão [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md), existem muitas ferramentas compatíveis. -Por causa disso, o próprio **FastAPI** fornece uma documentação alternativa da API (usando ReDoc), que você pode acessar em http://127.0.0.1:8000/redoc: +Por causa disso, o próprio **FastAPI** fornece uma documentação alternativa da API (usando ReDoc), que você pode acessar em [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc): @@ -94,7 +94,7 @@ Da mesma forma, existem muitas ferramentas compatíveis. Incluindo ferramentas d ## Pydantic { #pydantic } -Toda a validação de dados é realizada nos bastidores pelo Pydantic, então você recebe todos os benefícios disso. E você sabe que está em boas mãos. +Toda a validação de dados é realizada nos bastidores pelo [Pydantic](https://docs.pydantic.dev/), então você recebe todos os benefícios disso. E você sabe que está em boas mãos. Você pode usar as mesmas declarações de tipo com `str`, `float`, `bool` e muitos outros tipos de dados complexos. @@ -122,7 +122,7 @@ A primeira sempre será usada, já que o path corresponde primeiro. ## Valores predefinidos { #predefined-values } -Se você tem uma *operação de rota* que recebe um *parâmetro de path*, mas quer que os valores válidos possíveis do *parâmetro de path* sejam predefinidos, você pode usar um `Enum` padrão do Python. +Se você tem uma *operação de rota* que recebe um *parâmetro de path*, mas quer que os valores válidos possíveis do *parâmetro de path* sejam predefinidos, você pode usar um `Enum` padrão do Python. ### Crie uma classe `Enum` { #create-an-enum-class } diff --git a/docs/pt/docs/tutorial/query-params-str-validations.md b/docs/pt/docs/tutorial/query-params-str-validations.md index b76b76a268..5ee41684a2 100644 --- a/docs/pt/docs/tutorial/query-params-str-validations.md +++ b/docs/pt/docs/tutorial/query-params-str-validations.md @@ -35,13 +35,13 @@ O FastAPI adicionou suporte a `Annotated` (e passou a recomendá-lo) na versão Se você tiver uma versão mais antiga, teria erros ao tentar usar `Annotated`. -Certifique-se de [Atualizar a versão do FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} para pelo menos 0.95.1 antes de usar `Annotated`. +Certifique-se de [Atualizar a versão do FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions) para pelo menos 0.95.1 antes de usar `Annotated`. /// ## Use `Annotated` no tipo do parâmetro `q` { #use-annotated-in-the-type-for-the-q-parameter } -Lembra que eu disse antes que `Annotated` pode ser usado para adicionar metadados aos seus parâmetros na [Introdução aos tipos do Python](../python-types.md#type-hints-with-metadata-annotations){.internal-link target=_blank}? +Lembra que eu disse antes que `Annotated` pode ser usado para adicionar metadados aos seus parâmetros na [Introdução aos tipos do Python](../python-types.md#type-hints-with-metadata-annotations)? Agora é a hora de usá-lo com FastAPI. 🚀 @@ -158,7 +158,7 @@ Você poderia chamar essa mesma função em outros lugares sem FastAPI, e ela fu 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. 🚀 +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/). 🚀 ## Adicione mais validações { #add-more-validations } @@ -370,11 +370,11 @@ Podem existir casos em que você precise fazer alguma validação personalizada 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 dentro de `Annotated`. +Você pode fazer isso usando o [`AfterValidator` do Pydantic](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) dentro de `Annotated`. /// tip | Dica -O Pydantic também tem `BeforeValidator` e outros. 🤓 +O Pydantic também tem [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator) e outros. 🤓 /// diff --git a/docs/pt/docs/tutorial/query-params.md b/docs/pt/docs/tutorial/query-params.md index f429885660..472c12be64 100644 --- a/docs/pt/docs/tutorial/query-params.md +++ b/docs/pt/docs/tutorial/query-params.md @@ -129,7 +129,7 @@ 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 de consulta `needy` é um valor obrigatório, do tipo `str`. +Aqui o parâmetro da consulta `needy` é um valor obrigatório, do tipo `str`. Se você abrir no seu navegador a URL: @@ -182,6 +182,6 @@ Nesse caso, existem 3 parâmetros de consulta: /// tip | Dica -Você também poderia usar `Enum` da mesma forma que com [Path Parameters](path-params.md#predefined-values){.internal-link target=_blank}. +Você também poderia usar `Enum`s da mesma forma que com [Parâmetros de rota](path-params.md#predefined-values). /// diff --git a/docs/pt/docs/tutorial/request-files.md b/docs/pt/docs/tutorial/request-files.md index 1364a1dd46..912878cd52 100644 --- a/docs/pt/docs/tutorial/request-files.md +++ b/docs/pt/docs/tutorial/request-files.md @@ -4,9 +4,9 @@ Você pode definir arquivos para serem enviados pelo cliente usando `File`. /// info | Informação -Para receber arquivos enviados, primeiro instale o `python-multipart`. +Para receber arquivos enviados, primeiro instale [`python-multipart`](https://github.com/Kludex/python-multipart). -Garanta que você criou um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, o ativou e então o instalou, por exemplo: +Garanta que você criou um [ambiente virtual](../virtual-environments.md), o ativou e então o instalou, por exemplo: ```console $ pip install python-multipart @@ -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 interface `assíncrona`. -* Ele expõe um objeto python `SpooledTemporaryFile` que você pode passar diretamente para outras bibliotecas que esperam um objeto semelhante a um arquivo("file-like"). +* 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. ### `UploadFile` { #uploadfile } @@ -72,7 +72,7 @@ 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` (um file-like 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-like"). +* `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. `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). @@ -121,7 +121,7 @@ Dados de formulários normalmente são codificados usando o "media type" `applic 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. -Se você quiser ler mais sobre essas codificações e campos de formulário, vá para a MDN web docs para POST. +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). /// diff --git a/docs/pt/docs/tutorial/request-form-models.md b/docs/pt/docs/tutorial/request-form-models.md index 38f160aa83..953c3fdcee 100644 --- a/docs/pt/docs/tutorial/request-form-models.md +++ b/docs/pt/docs/tutorial/request-form-models.md @@ -4,9 +4,9 @@ Você pode utilizar **Modelos Pydantic** para declarar **campos de formulários* /// info | Informação -Para utilizar formulários, instale primeiramente o `python-multipart`. +Para utilizar formulários, instale primeiramente o [`python-multipart`](https://github.com/Kludex/python-multipart). -Certifique-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo, e então instalar. Por exemplo: +Certifique-se de criar um [ambiente virtual](../virtual-environments.md), ativá-lo, e então instalar. Por exemplo: ```console $ pip install python-multipart diff --git a/docs/pt/docs/tutorial/request-forms-and-files.md b/docs/pt/docs/tutorial/request-forms-and-files.md index 8b5f034e9e..04d7f9a4eb 100644 --- a/docs/pt/docs/tutorial/request-forms-and-files.md +++ b/docs/pt/docs/tutorial/request-forms-and-files.md @@ -4,9 +4,9 @@ Você pode definir arquivos e campos de formulário ao mesmo tempo usando `File` /// info | Informação -Para receber arquivos carregados e/ou dados de formulário, primeiro instale `python-multipart`. +Para receber arquivos carregados e/ou dados de formulário, primeiro instale [`python-multipart`](https://github.com/Kludex/python-multipart). -Certifique-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo e então instalar, por exemplo: +Certifique-se de criar um [ambiente virtual](../virtual-environments.md), ativá-lo e então instalar, por exemplo: ```console $ pip install python-multipart diff --git a/docs/pt/docs/tutorial/request-forms.md b/docs/pt/docs/tutorial/request-forms.md index d255d0f9be..5b7c4d8090 100644 --- a/docs/pt/docs/tutorial/request-forms.md +++ b/docs/pt/docs/tutorial/request-forms.md @@ -4,9 +4,9 @@ Quando você precisar receber campos de formulário em vez de JSON, você pode u /// info | Informação -Para usar formulários, primeiro instale `python-multipart`. +Para usar formulários, primeiro instale [`python-multipart`](https://github.com/Kludex/python-multipart). -Certifique-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo e então instalá-lo, por exemplo: +Certifique-se de criar um [ambiente virtual](../virtual-environments.md), ativá-lo e então instalá-lo, por exemplo: ```console $ pip install python-multipart @@ -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. +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). /// diff --git a/docs/pt/docs/tutorial/response-model.md b/docs/pt/docs/tutorial/response-model.md index e3b97b630f..7a28bcecdd 100644 --- a/docs/pt/docs/tutorial/response-model.md +++ b/docs/pt/docs/tutorial/response-model.md @@ -13,6 +13,7 @@ O FastAPI usará este tipo de retorno para: * Adicionar um **JSON Schema** para a resposta, na *operação de rota* do OpenAPI. * Isso será usado pela **documentação automática**. * Também será usado por ferramentas de geração automática de código do cliente. +* **Serializar** os dados retornados para JSON usando Pydantic, que é escrito em **Rust**, então será **muito mais rápido**. Mas o mais importante: @@ -73,9 +74,9 @@ Aqui estamos declarando um modelo `UserIn`, ele conterá uma senha em texto simp /// info | Informação -Para usar `EmailStr`, primeiro instale `email-validator`. +Para usar `EmailStr`, primeiro instale [`email-validator`](https://github.com/JoshData/python-email-validator). -Certifique-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ative-o e instale-o, por exemplo: +Certifique-se de criar um [ambiente virtual](../virtual-environments.md), ative-o e então instale-o, por exemplo: ```console $ pip install email-validator @@ -181,7 +182,7 @@ Pode haver casos em que você retorna algo que não é um campo Pydantic válido ### Retorne uma Response diretamente { #return-a-response-directly } -O caso mais comum seria [retornar uma Response diretamente, conforme explicado posteriormente na documentação avançada](../advanced/response-directly.md){.internal-link target=_blank}. +O caso mais comum seria [retornar uma Response diretamente, conforme explicado posteriormente na documentação avançada](../advanced/response-directly.md). {* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *} @@ -257,7 +258,7 @@ Você também pode usar: * `response_model_exclude_defaults=True` * `response_model_exclude_none=True` -conforme descrito na documentação do Pydantic para `exclude_defaults` e `exclude_none`. +conforme descrito na [documentação do Pydantic](https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict) para `exclude_defaults` e `exclude_none`. /// diff --git a/docs/pt/docs/tutorial/response-status-code.md b/docs/pt/docs/tutorial/response-status-code.md index a3f8d8a568..d5a81fa03b 100644 --- a/docs/pt/docs/tutorial/response-status-code.md +++ b/docs/pt/docs/tutorial/response-status-code.md @@ -20,7 +20,7 @@ O parâmetro `status_code` recebe um número com o código de status HTTP. /// info | Informação -`status_code` também pode receber um `IntEnum`, como o do Python `http.HTTPStatus`. +`status_code` também pode receber um `IntEnum`, como [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus) do Python. /// @@ -66,7 +66,7 @@ Resumidamente: /// tip | Dica -Para saber mais sobre cada código de status e qual código serve para quê, verifique a documentação do MDN sobre códigos de status HTTP. +Para saber mais sobre cada código de status e qual código serve para quê, verifique a [documentação do MDN sobre códigos de status HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status). /// @@ -98,4 +98,4 @@ Você também pode usar `from starlette import status`. ## Alterando o padrão { #changing-the-default } -Mais tarde, no [Guia do Usuário Avançado](../advanced/response-change-status-code.md){.internal-link target=_blank}, você verá como retornar um código de status diferente do padrão que você está declarando aqui. +Mais tarde, no [Guia do Usuário Avançado](../advanced/response-change-status-code.md), você verá como retornar um código de status diferente do padrão que você está declarando aqui. diff --git a/docs/pt/docs/tutorial/schema-extra-example.md b/docs/pt/docs/tutorial/schema-extra-example.md index 560fda908e..cd2ac13c5f 100644 --- a/docs/pt/docs/tutorial/schema-extra-example.md +++ b/docs/pt/docs/tutorial/schema-extra-example.md @@ -1,4 +1,4 @@ -# Declarar dados de exemplo da requisição { #declare-request-example-data } +# Declare dados de exemplo da requisição { #declare-request-example-data } Você pode declarar exemplos dos dados que sua aplicação pode receber. @@ -12,7 +12,7 @@ Você pode declarar `examples` para um modelo Pydantic que serão adicionados ao Essas informações extras serão adicionadas como estão ao **JSON Schema** de saída para esse modelo e serão usadas na documentação da API. -Você pode usar o atributo `model_config`, que recebe um `dict`, conforme descrito na documentação do Pydantic: Configuration. +Você pode usar o atributo `model_config`, que recebe um `dict`, conforme descrito na [documentação do Pydantic: Configuration](https://docs.pydantic.dev/latest/api/config/). Você pode definir `"json_schema_extra"` com um `dict` contendo quaisquer dados adicionais que você queira que apareçam no JSON Schema gerado, incluindo `examples`. @@ -145,12 +145,12 @@ O JSON Schema não tinha `examples`, então o OpenAPI adicionou seu próprio cam O OpenAPI também adicionou os campos `example` e `examples` a outras partes da especificação: -* `Parameter Object` (na especificação), usado no FastAPI por: +* [`Parameter Object` (na especificação)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object), usado no FastAPI por: * `Path()` * `Query()` * `Header()` * `Cookie()` -* `Request Body Object`, no campo `content`, no `Media Type Object` (na especificação), usado no FastAPI por: +* [`Request Body Object`, no campo `content`, no `Media Type Object` (na especificação)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object), usado no FastAPI por: * `Body()` * `File()` * `Form()` @@ -163,7 +163,7 @@ Esse parâmetro antigo `examples` específico do OpenAPI agora é `openapi_examp ### Campo `examples` do JSON Schema { #json-schemas-examples-field } -Depois, o JSON Schema adicionou um campo `examples` em uma nova versão da especificação. +Depois, o JSON Schema adicionou um campo [`examples`](https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5) em uma nova versão da especificação. E então o novo OpenAPI 3.1.0 passou a se basear na versão mais recente (JSON Schema 2020-12), que incluiu esse novo campo `examples`. diff --git a/docs/pt/docs/tutorial/security/first-steps.md b/docs/pt/docs/tutorial/security/first-steps.md index f0edd57533..d16c15140e 100644 --- a/docs/pt/docs/tutorial/security/first-steps.md +++ b/docs/pt/docs/tutorial/security/first-steps.md @@ -26,11 +26,11 @@ Copie o exemplo em um arquivo `main.py`: /// info | Informação -O pacote `python-multipart` é instalado automaticamente com o **FastAPI** quando você executa o comando `pip install "fastapi[standard]"`. +O pacote [`python-multipart`](https://github.com/Kludex/python-multipart) é instalado automaticamente com o **FastAPI** quando você executa o comando `pip install "fastapi[standard]"`. Entretanto, se você usar o comando `pip install fastapi`, o pacote `python-multipart` não é incluído por padrão. -Para instalá-lo manualmente, certifique-se de criar um [ambiente virtual](../../virtual-environments.md){.internal-link target=_blank}, ativá-lo e então instalá-lo com: +Para instalá-lo manualmente, certifique-se de criar um [ambiente virtual](../../virtual-environments.md), ativá-lo e então instalá-lo com: ```console $ pip install python-multipart @@ -45,7 +45,7 @@ Execute o exemplo com:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -54,7 +54,7 @@ $ fastapi dev main.py ## Verifique-o { #check-it } -Vá até a documentação interativa em: http://127.0.0.1:8000/docs. +Vá até a documentação interativa em: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Você verá algo deste tipo: @@ -140,7 +140,7 @@ Aqui `tokenUrl="token"` refere-se a uma URL relativa `token` que ainda não cria Como estamos usando uma URL relativa, se sua API estivesse localizada em `https://example.com/`, então se referiria a `https://example.com/token`. Mas se sua API estivesse localizada em `https://example.com/api/v1/`, então se referiria a `https://example.com/api/v1/token`. -Usar uma URL relativa é importante para garantir que sua aplicação continue funcionando mesmo em um caso de uso avançado como [Atrás de um Proxy](../../advanced/behind-a-proxy.md){.internal-link target=_blank}. +Usar uma URL relativa é importante para garantir que sua aplicação continue funcionando mesmo em um caso de uso avançado como [Atrás de um Proxy](../../advanced/behind-a-proxy.md). /// diff --git a/docs/pt/docs/tutorial/security/oauth2-jwt.md b/docs/pt/docs/tutorial/security/oauth2-jwt.md index 4ba38b9f04..6397664fbf 100644 --- a/docs/pt/docs/tutorial/security/oauth2-jwt.md +++ b/docs/pt/docs/tutorial/security/oauth2-jwt.md @@ -24,13 +24,13 @@ Dessa forma, você pode criar um token com um prazo de expiração, digamos, de Depois de uma semana, o token expirará e o usuário não estará autorizado, precisando fazer login novamente para obter um novo token. E se o usuário (ou uma terceira parte) tentar modificar o token para alterar a expiração, você seria capaz de descobrir isso, pois as assinaturas não iriam corresponder. -Se você quiser brincar com tokens JWT e ver como eles funcionam, visite https://jwt.io. +Se você quiser brincar com tokens JWT e ver como eles funcionam, visite [https://jwt.io](https://jwt.io/). ## Instalar `PyJWT` { #install-pyjwt } Nós precisamos instalar o `PyJWT` para criar e verificar os tokens JWT em Python. -Certifique-se de criar um [ambiente virtual](../../virtual-environments.md){.internal-link target=_blank}, ativá-lo e então instalar o `pyjwt`: +Certifique-se de criar um [ambiente virtual](../../virtual-environments.md), ativá-lo e então instalar o `pyjwt`:
@@ -46,7 +46,7 @@ $ pip install pyjwt 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]`. -Você pode ler mais sobre isso na documentação de instalação do PyJWT. +Você pode ler mais sobre isso na [documentação de instalação do PyJWT](https://pyjwt.readthedocs.io/en/latest/installation.html). /// @@ -72,7 +72,7 @@ Ele suporta muitos algoritmos de hashing seguros e utilitários para trabalhar c O algoritmo recomendado é o "Argon2". -Certifique-se de criar um [ambiente virtual](../../virtual-environments.md){.internal-link target=_blank}, ativá-lo e então instalar o pwdlib com Argon2: +Certifique-se de criar um [ambiente virtual](../../virtual-environments.md), ativá-lo e então instalar o pwdlib com Argon2:
@@ -200,7 +200,7 @@ O importante a se lembrar é que a chave `sub` deve ter um identificador único ## Verifique { #check-it } -Execute o servidor e vá para a documentação: http://127.0.0.1:8000/docs. +Execute o servidor e vá para a documentação: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Você verá a interface de usuário assim: diff --git a/docs/pt/docs/tutorial/security/simple-oauth2.md b/docs/pt/docs/tutorial/security/simple-oauth2.md index 902ae2d225..f582a81417 100644 --- a/docs/pt/docs/tutorial/security/simple-oauth2.md +++ b/docs/pt/docs/tutorial/security/simple-oauth2.md @@ -144,9 +144,10 @@ UserInDB( ) ``` + /// 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){.internal-link target=_blank}. +Para uma explicação mais completa de `**user_dict`, verifique [a documentação para **Extra Models**](../extra-models.md#about-user-in-dict). /// @@ -216,7 +217,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. +Abra o docs interativo: [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 new file mode 100644 index 0000000000..33389873ce --- /dev/null +++ b/docs/pt/docs/tutorial/server-sent-events.md @@ -0,0 +1,120 @@ +# Eventos Enviados pelo Servidor (SSE) { #server-sent-events-sse } + +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 + +Adicionado no FastAPI 0.135.0. + +/// + +## O que são Server-Sent Events? { #what-are-server-sent-events } + +SSE é um padrão para transmitir dados do servidor para o cliente via HTTP. + +Cada evento é um pequeno bloco de texto com “campos” como `data`, `event`, `id` e `retry`, separados por linhas em branco. + +Fica assim: + +``` +data: {"name": "Portal Gun", "price": 999.99} + +data: {"name": "Plumbus", "price": 32.99} + +``` + +SSE é comumente usado para streaming de chat de IA, notificações em tempo real, logs e observabilidade, e outros casos em que o servidor envia atualizações para o cliente. + +/// tip | Dica + +Se você quiser transmitir dados binários, por exemplo vídeo ou áudio, veja o guia avançado: [Stream de Dados](../advanced/stream-data.md). + +/// + +## Transmitir SSE com FastAPI { #stream-sse-with-fastapi } + +Para transmitir SSE com FastAPI, use `yield` na sua função de operação de rota e defina `response_class=EventSourceResponse`. + +Importe `EventSourceResponse` de `fastapi.sse`: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[4,22] *} + +Cada item produzido é codificado como JSON e enviado no campo `data:` de um evento SSE. + +Se você declarar o tipo de retorno como `AsyncIterable[Item]`, o FastAPI o usará para validar, documentar e serializar os dados com o Pydantic. + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[10:12,23] *} + +/// tip | Dica + +Como o Pydantic fará a serialização no lado em **Rust**, você terá um desempenho muito maior do que se não declarar um tipo de retorno. + +/// + +### *Funções de operação de rota* não assíncronas { #non-async-path-operation-functions } + +Você também pode usar funções `def` normais (sem `async`) e usar `yield` da mesma forma. + +O FastAPI garantirá a execução correta para não bloquear o event loop. + +Como, neste caso, a função não é assíncrona, o tipo de retorno adequado seria `Iterable[Item]`: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[28:31] hl[29] *} + +### Sem tipo de retorno { #no-return-type } + +Você também pode omitir o tipo de retorno. O FastAPI usará o [`jsonable_encoder`](./encoder.md) para converter os dados e enviá-los. + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[34:37] hl[35] *} + +## `ServerSentEvent` { #serversentevent } + +Se você precisar definir campos de SSE como `event`, `id`, `retry` ou `comment`, você pode produzir objetos `ServerSentEvent` em vez de dados simples. + +Importe `ServerSentEvent` de `fastapi.sse`: + +{* ../../docs_src/server_sent_events/tutorial002_py310.py hl[4,26] *} + +O campo `data` é sempre codificado como JSON. Você pode passar qualquer valor que possa ser serializado como JSON, incluindo modelos do Pydantic. + +## Dados brutos { #raw-data } + +Se você precisar enviar dados sem codificação JSON, use `raw_data` em vez de `data`. + +Isto é útil para enviar texto pré-formatado, linhas de log ou valores "sentinela" especiais como `[DONE]`. + +{* ../../docs_src/server_sent_events/tutorial003_py310.py hl[17] *} + +/// note | Nota + +`data` e `raw_data` são mutuamente exclusivos. Você só pode definir um deles em cada `ServerSentEvent`. + +/// + +## Retomando com `Last-Event-ID` { #resuming-with-last-event-id } + +Quando um navegador se reconecta após uma queda na conexão, ele envia o último `id` recebido no cabeçalho `Last-Event-ID`. + +Você pode lê-lo como um parâmetro de cabeçalho e usá-lo para retomar o stream de onde o cliente parou: + +{* ../../docs_src/server_sent_events/tutorial004_py310.py hl[25,27,31] *} + +## SSE com POST { #sse-with-post } + +SSE funciona com qualquer método HTTP, não apenas `GET`. + +Isso é útil para protocolos como o [MCP](https://modelcontextprotocol.io) que fazem stream de SSE via `POST`: + +{* ../../docs_src/server_sent_events/tutorial005_py310.py hl[14] *} + +## Detalhes Técnicos { #technical-details } + +O FastAPI implementa algumas boas práticas de SSE prontas para uso. + +- Enviar um comentário de keep alive `ping` a cada 15 segundos quando não houver mensagens, para evitar que alguns proxies fechem a conexão, como sugerido na [especificação HTML: Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes). +- Definir o cabeçalho `Cache-Control: no-cache` para evitar o cache do stream. +- Definir o cabeçalho especial `X-Accel-Buffering: no` para evitar buffering em alguns proxies como o Nginx. + +Você não precisa fazer nada, isso funciona automaticamente. 🤓 diff --git a/docs/pt/docs/tutorial/sql-databases.md b/docs/pt/docs/tutorial/sql-databases.md index 543e164e9f..10be4c865c 100644 --- a/docs/pt/docs/tutorial/sql-databases.md +++ b/docs/pt/docs/tutorial/sql-databases.md @@ -2,13 +2,13 @@ **FastAPI** não exige que você use um banco de dados SQL (relacional). Mas você pode usar **qualquer banco de dados** que quiser. -Aqui veremos um exemplo usando SQLModel. +Aqui veremos um exemplo usando [SQLModel](https://sqlmodel.tiangolo.com/). -**SQLModel** é construído sobre SQLAlchemy 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 -Você pode usar qualquer outra biblioteca de banco de dados SQL ou NoSQL que quiser (em alguns casos chamadas de "ORMs"), o FastAPI não obriga você a usar nada. 😎 +Você pode usar qualquer outra biblioteca de banco de dados SQL ou NoSQL que quiser (em alguns casos chamadas de "ORMs"), o FastAPI não obriga você a usar nada. 😎 /// @@ -26,15 +26,15 @@ Mais tarde, para sua aplicação em produção, você pode querer usar um servid /// tip | Dica -Existe um gerador de projetos oficial com **FastAPI** e **PostgreSQL** incluindo um frontend e mais ferramentas: https://github.com/fastapi/full-stack-fastapi-template +Existe um gerador de projetos oficial com **FastAPI** e **PostgreSQL** incluindo um frontend e mais ferramentas: [https://github.com/fastapi/full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template) /// -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. +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 } -Primeiro, certifique-se de criar seu [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo e, em seguida, instalar o `sqlmodel`: +Primeiro, certifique-se de criar seu [ambiente virtual](../virtual-environments.md), ativá-lo e, em seguida, instalar o `sqlmodel`:
@@ -45,7 +45,7 @@ $ pip install sqlmodel
-## Criar o App com um Único Modelo { #create-the-app-with-a-single-model } +## Crear 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**. @@ -65,7 +65,7 @@ Existem algumas diferenças: * `Field(primary_key=True)` informa ao SQLModel que o `id` é a **chave primária** no banco de dados SQL (você pode aprender mais sobre chaves primárias SQL na documentação do SQLModel). - **Nota:** Usamos `int | None` para o campo de chave primária para que, no código Python, possamos *criar um objeto sem um `id`* (`id=None`), assumindo que o banco de dados irá *gerá-lo ao salvar*. O SQLModel entende que o banco de dados fornecerá o `id` e *define a coluna como um `INTEGER` não nulo* no esquema do banco de dados. Veja a documentação do SQLModel sobre chaves primárias para detalhes. + **Nota:** Usamos `int | None` para o campo de chave primária para que, no código Python, possamos *criar um objeto sem um `id`* (`id=None`), assumindo que o banco de dados irá *gerá-lo ao salvar*. O SQLModel entende que o banco de dados fornecerá o `id` e *define a coluna como um `INTEGER` não nulo* no esquema do banco de dados. Veja a [documentação do SQLModel sobre chaves primárias](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id) para detalhes. * `Field(index=True)` informa ao SQLModel que ele deve criar um **índice SQL** para essa coluna, o que permitirá buscas mais rápidas no banco de dados ao ler dados filtrados por essa coluna. @@ -96,7 +96,7 @@ Vamos criar uma **dependência** do FastAPI com `yield` que fornecerá uma nova Então, criamos uma dependência `Annotated` chamada `SessionDep` para simplificar o restante do código que usará essa dependência. -{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[25:30] hl[25:27,30] *} +{* ../../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 } @@ -110,7 +110,7 @@ Para produção, você provavelmente usaria um script de migração que é execu /// tip | Dica -O SQLModel terá utilitários de migração envolvendo o Alembic, mas por enquanto, você pode usar o Alembic diretamente. +O SQLModel terá utilitários de migração envolvendo o Alembic, mas por enquanto, você pode usar o [Alembic](https://alembic.sqlalchemy.org/en/latest/) diretamente. /// @@ -151,7 +151,7 @@ Você pode executar o app:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -168,7 +168,7 @@ Então, vá para a interface `/docs`, você verá que o **FastAPI** está usando Agora vamos **refatorar** este app um pouco para aumentar a **segurança** e **versatilidade**. -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. 😱 +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. 😱 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**. @@ -336,7 +336,7 @@ Você pode executar o app novamente:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -351,6 +351,6 @@ Se você for para a interface `/docs` da API, verá que agora ela está atualiza ## Recapitulando { #recap } -Você pode usar **SQLModel** para interagir com um banco de dados SQL e simplificar o código com *modelos de dados* e *modelos de tabela*. +Você pode usar [**SQLModel**](https://sqlmodel.tiangolo.com/) para interagir com um banco de dados SQL e simplificar o código com *modelos de dados* e *modelos de tabela*. -Você pode aprender muito mais na documentação do **SQLModel**, há um mini tutorial sobre como usar SQLModel com **FastAPI** mais longo. 🚀 +Você pode aprender muito mais na documentação do **SQLModel**, há um mini [tutorial sobre como usar SQLModel com **FastAPI**](https://sqlmodel.tiangolo.com/tutorial/fastapi/) mais longo. 🚀 diff --git a/docs/pt/docs/tutorial/static-files.md b/docs/pt/docs/tutorial/static-files.md index 0b2d0718f2..e9150facd9 100644 --- a/docs/pt/docs/tutorial/static-files.md +++ b/docs/pt/docs/tutorial/static-files.md @@ -23,7 +23,7 @@ O **FastAPI** fornece o mesmo que `starlette.staticfiles` como `fastapi.staticfi Isso é diferente de usar um `APIRouter`, pois uma aplicação montada é completamente independente. A OpenAPI e a documentação da sua aplicação principal não incluirão nada da aplicação montada, etc. -Você pode ler mais sobre isso no [Guia Avançado do Usuário](../advanced/index.md){.internal-link target=_blank}. +Você pode ler mais sobre isso no [Guia Avançado do Usuário](../advanced/index.md). ## Detalhes { #details } @@ -37,4 +37,4 @@ Todos esses parâmetros podem ser diferentes de "`static`", ajuste-os de acordo ## Mais informações { #more-info } -Para mais detalhes e opções, consulte a documentação da Starlette sobre Arquivos Estáticos. +Para mais detalhes e opções, consulte [a documentação da Starlette sobre Arquivos Estáticos](https://www.starlette.dev/staticfiles/). diff --git a/docs/pt/docs/tutorial/stream-json-lines.md b/docs/pt/docs/tutorial/stream-json-lines.md new file mode 100644 index 0000000000..f6d5c26f09 --- /dev/null +++ b/docs/pt/docs/tutorial/stream-json-lines.md @@ -0,0 +1,111 @@ +# Stream de JSON Lines { #stream-json-lines } + +Você pode ter uma sequência de dados que deseja enviar em um "**Stream**"; é possível fazer isso com **JSON Lines**. + +/// info | Informação + +Adicionado no FastAPI 0.134.0. + +/// + +## O que é um Stream? { #what-is-a-stream } + +"**Streaming**" de dados significa que sua aplicação começará a enviar itens ao cliente sem esperar que toda a sequência esteja pronta. + +Assim, ela envia o primeiro item, o cliente o recebe e começa a processá-lo, enquanto você ainda pode estar produzindo o próximo item. + +```mermaid +sequenceDiagram + participant App + participant Client + + App->>App: Produce Item 1 + App->>Client: Send Item 1 + App->>App: Produce Item 2 + Client->>Client: Process Item 1 + App->>Client: Send Item 2 + App->>App: Produce Item 3 + Client->>Client: Process Item 2 + App->>Client: Send Item 3 + Client->>Client: Process Item 3 + Note over App: Keeps producing... + Note over Client: Keeps consuming... +``` + +Pode até ser um Stream infinito, em que você continua enviando dados. + +## JSON Lines { #json-lines } + +Nesses casos, é comum enviar "**JSON Lines**", um formato em que você envia um objeto JSON por linha. + +Uma response teria um tipo de conteúdo `application/jsonl` (em vez de `application/json`) e o corpo seria algo como: + +```json +{"name": "Plumbus", "description": "A multi-purpose household device."} +{"name": "Portal Gun", "description": "A portal opening device."} +{"name": "Meeseeks Box", "description": "A box that summons a Meeseeks."} +``` + +É 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 + +O ponto importante é que sua aplicação poderá produzir cada linha em sequência, enquanto o cliente consome as anteriores. + +/// + +/// note | Detalhes Técnicos + +Como cada objeto JSON será separado por uma nova linha, eles não podem conter caracteres de nova linha literais em seu conteúdo, mas podem conter novas linhas com escape (`\n`), o que faz parte do padrão JSON. + +Mas, normalmente, você não precisará se preocupar com isso, é feito automaticamente, continue lendo. 🤓 + +/// + +## Casos de uso { #use-cases } + +Você pode usar isso para transmitir dados de um serviço de **IA LLM**, de **logs** ou **telemetria**, ou de outros tipos de dados que possam ser estruturados em itens **JSON**. + +/// tip | Dica + +Se você quiser transmitir dados binários, por exemplo vídeo ou áudio, confira o guia avançado: [Stream Data](../advanced/stream-data.md). + +/// + +## Stream de JSON Lines com FastAPI { #stream-json-lines-with-fastapi } + +Para transmitir JSON Lines com FastAPI, em vez de usar `return` na sua *função de operação de rota*, use `yield` para produzir cada item em sequência. + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[24] *} + +Se cada item JSON que você quer enviar de volta for do tipo `Item` (um modelo Pydantic) e a função for assíncrona, você pode declarar o tipo de retorno como `AsyncIterable[Item]`: + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[9:11,22] *} + +Se você declarar o tipo de retorno, o FastAPI o usará para **validar** os dados, **documentá-los** no OpenAPI, **filtrá-los** e **serializá-los** usando o Pydantic. + +/// tip | Dica + +Como o Pydantic fará a serialização no lado em **Rust**, você terá uma **performance** muito maior do que se não declarar um tipo de retorno. + +/// + +### Funções de operação de rota não assíncronas { #non-async-path-operation-functions } + +Você também pode usar funções `def` normais (sem `async`) e usar `yield` da mesma forma. + +O FastAPI garantirá que sejam executadas corretamente para não bloquear o event loop. + +Como, neste caso, a função não é assíncrona, o tipo de retorno adequado seria `Iterable[Item]`: + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[27:30] hl[28] *} + +### Sem tipo de retorno { #no-return-type } + +Você também pode omitir o tipo de retorno. O FastAPI então usará o [`jsonable_encoder`](./encoder.md) para converter os dados em algo que possa ser serializado para JSON e depois enviá-los como JSON Lines. + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[33:36] hl[34] *} + +## Eventos enviados pelo servidor (SSE) { #server-sent-events-sse } + +O FastAPI também tem suporte de primeira classe a Server-Sent Events (SSE), que são bastante semelhantes, mas com alguns detalhes extras. Você pode aprender sobre eles no próximo capítulo: [Eventos enviados pelo servidor (SSE)](server-sent-events.md). 🤓 diff --git a/docs/pt/docs/tutorial/testing.md b/docs/pt/docs/tutorial/testing.md index 44dc2d2257..1730511e6d 100644 --- a/docs/pt/docs/tutorial/testing.md +++ b/docs/pt/docs/tutorial/testing.md @@ -1,18 +1,18 @@ # Testando { #testing } -Graças ao Starlette, testar aplicações **FastAPI** é fácil e agradável. +Graças ao [Starlette](https://www.starlette.dev/testclient/), testar aplicações **FastAPI** é fácil e agradável. -Ele é baseado no HTTPX, que por sua vez é projetado com base em Requests, por isso é muito familiar e intuitivo. +Ele é baseado no [HTTPX](https://www.python-httpx.org), que por sua vez é projetado com base em Requests, por isso é muito familiar e intuitivo. -Com ele, você pode usar o pytest diretamente com **FastAPI**. +Com ele, você pode usar o [pytest](https://docs.pytest.org/) diretamente com **FastAPI**. ## Usando `TestClient` { #using-testclient } /// info | Informação -Para usar o `TestClient`, primeiro instale o `httpx`. +Para usar o `TestClient`, primeiro instale [`httpx`](https://www.python-httpx.org). -Certifique-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo e instalá-lo, por exemplo: +Certifique-se de criar um [ambiente virtual](../virtual-environments.md), ativá-lo e instalá-lo, por exemplo: ```console $ pip install httpx @@ -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){.internal-link target=_blank} no tutorial avançado. +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. /// @@ -64,7 +64,7 @@ E sua aplicação **FastAPI** também pode ser composta de vários arquivos/mód ### Arquivo da aplicação **FastAPI** { #fastapi-app-file } -Digamos que você tenha uma estrutura de arquivo conforme descrito em [Aplicações maiores](bigger-applications.md){.internal-link target=_blank}: +Digamos que você tenha uma estrutura de arquivo conforme descrito em [Aplicações maiores](bigger-applications.md): ``` . @@ -140,13 +140,13 @@ Por exemplo: * Para passar *headers*, use um `dict` no parâmetro `headers`. * Para *cookies*, um `dict` no parâmetro `cookies`. -Para mais informações sobre como passar dados para o backend (usando `httpx` ou `TestClient`), consulte a documentação do HTTPX. +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 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){.internal-link target=_blank}. +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). /// @@ -154,7 +154,7 @@ Se você tiver um modelo Pydantic em seu teste e quiser enviar seus dados para o Depois disso, você só precisa instalar o `pytest`. -Certifique-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo e instalá-lo, por exemplo: +Certifique-se de criar um [ambiente virtual](../virtual-environments.md), ativá-lo e instalá-lo, por exemplo:
diff --git a/docs/pt/docs/virtual-environments.md b/docs/pt/docs/virtual-environments.md index e222c61ad6..cfb86887fd 100644 --- a/docs/pt/docs/virtual-environments.md +++ b/docs/pt/docs/virtual-environments.md @@ -22,7 +22,7 @@ Um **ambiente virtual** é um diretório com alguns arquivos. Esta página lhe ensinará como usar **ambientes virtuais** e como eles funcionam. -Se você estiver pronto para adotar uma **ferramenta que gerencia tudo** para você (incluindo a instalação do Python), experimente uv. +Se você estiver pronto para adotar uma **ferramenta que gerencia tudo** para você (incluindo a instalação do Python), experimente [uv](https://github.com/astral-sh/uv). /// @@ -86,7 +86,7 @@ $ python -m venv .venv //// tab | `uv` -Se você tiver o `uv` instalado, poderá usá-lo para criar um ambiente virtual. +Se você tiver [`uv`](https://github.com/astral-sh/uv) instalado, poderá usá-lo para criar um ambiente virtual.
@@ -150,7 +150,7 @@ $ .venv\Scripts\Activate.ps1 //// tab | Windows Bash -Ou se você usa o Bash para Windows (por exemplo, Git Bash): +Ou se você usa o Bash para Windows (por exemplo, [Git Bash](https://gitforwindows.org/)):
@@ -216,7 +216,7 @@ Se ele mostrar o binário `python` em `.venv\Scripts\python`, dentro do seu proj /// tip | Dica -Se você usar `uv`, você o usará para instalar coisas em vez do `pip`, então não precisará atualizar o `pip`. 😎 +Se você usar [`uv`](https://github.com/astral-sh/uv), você o usará para instalar coisas em vez do `pip`, então não precisará atualizar o `pip`. 😎 /// @@ -268,7 +268,7 @@ Se você estiver usando **Git** (você deveria), adicione um arquivo `.gitignore /// tip | Dica -Se você usou `uv` para criar o ambiente virtual, ele já fez isso para você, você pode pular esta etapa. 😎 +Se você usou [`uv`](https://github.com/astral-sh/uv) para criar o ambiente virtual, ele já fez isso para você, você pode pular esta etapa. 😎 /// @@ -340,7 +340,7 @@ $ pip install "fastapi[standard]" //// tab | `uv` -Se você tem o `uv`: +Se você tem o [`uv`](https://github.com/astral-sh/uv):
@@ -372,7 +372,7 @@ $ pip install -r requirements.txt //// tab | `uv` -Se você tem o `uv`: +Se você tem o [`uv`](https://github.com/astral-sh/uv):
@@ -416,8 +416,8 @@ Você provavelmente usaria um editor. Certifique-se de configurá-lo para usar o Por exemplo: -* VS Code -* PyCharm +* [VS Code](https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment) +* [PyCharm](https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html) /// tip | Dica @@ -455,7 +455,7 @@ Continue lendo. 👇🤓 ## Por que ambientes virtuais { #why-virtual-environments } -Para trabalhar com o FastAPI, você precisa instalar o Python. +Para trabalhar com o FastAPI, você precisa instalar o [Python](https://www.python.org/). Depois disso, você precisará **instalar** o FastAPI e quaisquer outros **pacotes** que queira usar. @@ -564,7 +564,7 @@ $ pip install "fastapi[standard]"
-Isso fará o download de um arquivo compactado com o código FastAPI, normalmente do PyPI. +Isso fará o download de um arquivo compactado com o código FastAPI, normalmente do [PyPI](https://pypi.org/project/fastapi/). Ele também fará o **download** de arquivos para outros pacotes dos quais o FastAPI depende. @@ -627,7 +627,7 @@ $ .venv\Scripts\Activate.ps1 //// tab | Windows Bash -Ou se você usa o Bash para Windows (por exemplo, Git Bash): +Ou se você usa o Bash para Windows (por exemplo, [Git Bash](https://gitforwindows.org/)):
@@ -639,13 +639,13 @@ $ source .venv/Scripts/activate //// -Esse comando criará ou modificará algumas [variáveis ​​de ambiente](environment-variables.md){.internal-link target=_blank} que estarão disponíveis para os próximos comandos. +Esse comando criará ou modificará algumas [variáveis ​​de ambiente](environment-variables.md) que estarão disponíveis para os próximos comandos. Uma dessas variáveis ​​é a variável `PATH`. /// tip | Dica -Você pode aprender mais sobre a variável de ambiente `PATH` na seção [Variáveis ​​de ambiente](environment-variables.md#path-environment-variable){.internal-link target=_blank}. +Você pode aprender mais sobre a variável de ambiente `PATH` na seção [Variáveis ​​de ambiente](environment-variables.md#path-environment-variable). /// @@ -846,7 +846,7 @@ Este é um guia simples para você começar e lhe ensinar como tudo funciona **p Existem muitas **alternativas** para gerenciar ambientes virtuais, dependências de pacotes (requisitos) e projetos. -Quando estiver pronto e quiser usar uma ferramenta para **gerenciar todo o projeto**, dependências de pacotes, ambientes virtuais, etc., sugiro que você experimente o uv. +Quando estiver pronto e quiser usar uma ferramenta para **gerenciar todo o projeto**, dependências de pacotes, ambientes virtuais, etc., sugiro que você experimente o [uv](https://github.com/astral-sh/uv). `uv` pode fazer muitas coisas, ele pode: diff --git a/docs/ru/docs/_llm-test.md b/docs/ru/docs/_llm-test.md index 247d3a964f..dbb1a2b7fe 100644 --- a/docs/ru/docs/_llm-test.md +++ b/docs/ru/docs/_llm-test.md @@ -11,7 +11,7 @@ * Проверьте, всё ли в порядке в переводе. * При необходимости улучшите ваш языковой специфичный промпт, общий промпт или английский документ. * Затем вручную исправьте оставшиеся проблемы в переводе, чтобы он был хорошим. -* Переведите заново, имея хороший перевод на месте. Идеальным результатом будет ситуация, когда LLM больше не вносит изменений в перевод. Это означает, что общий промпт и ваш языковой специфичный промпт настолько хороши, насколько это возможно (иногда он будет делать несколько, казалось бы, случайных изменений, причина в том, что LLM — недетерминированные алгоритмы). +* Переведите заново, имея хороший перевод на месте. Идеальным результатом будет ситуация, когда LLM больше не вносит изменений в перевод. Это означает, что общий промпт и ваш языковой специфичный промпт настолько хороши, насколько это возможно (иногда он будет делать несколько, казалось бы, случайных изменений, причина в том, что [LLM — недетерминированные алгоритмы](https://doublespeak.chat/#/handbook#deterministic-output)). Тесты: @@ -169,15 +169,15 @@ works(foo="bar") # Это работает 🎉 Текст ссылок должен переводиться, адрес ссылки не должен изменяться: * [Ссылка на заголовок выше](#code-snippets) -* [Внутренняя ссылка](index.md#installation){.internal-link target=_blank} -* Внешняя ссылка -* Ссылка на стиль -* Ссылка на скрипт -* Ссылка на изображение +* [Внутренняя ссылка](index.md#installation) +* [Внешняя ссылка](https://sqlmodel.tiangolo.com/) +* [Ссылка на стиль](https://fastapi.tiangolo.com/css/styles.css) +* [Ссылка на скрипт](https://fastapi.tiangolo.com/js/logic.js) +* [Ссылка на изображение](https://fastapi.tiangolo.com/img/foo.jpg) Текст ссылок должен переводиться, адрес ссылки должен указывать на перевод: -* Ссылка на FastAPI +* [Ссылка на FastAPI](https://fastapi.tiangolo.com/ru/) //// @@ -294,7 +294,7 @@ works(foo="bar") # Это работает 🎉 * чувствительный к регистру * нечувствительный к регистру -* обслуживать приложение +* отдавать приложение * отдавать страницу * приложение diff --git a/docs/ru/docs/advanced/additional-responses.md b/docs/ru/docs/advanced/additional-responses.md index ca36ba20e3..f7e8d9dec0 100644 --- a/docs/ru/docs/advanced/additional-responses.md +++ b/docs/ru/docs/advanced/additional-responses.md @@ -243,5 +243,5 @@ new_dict = {**old_dict, "new key": "new value"} Чтобы увидеть, что именно можно включать в ответы, посмотрите эти разделы спецификации OpenAPI: -* Объект Responses OpenAPI, он включает `Response Object`. -* Объект Response OpenAPI, вы можете включить всё из этого объекта напрямую в каждый ответ внутри вашего параметра `responses`. Включая `description`, `headers`, `content` (внутри него вы объявляете разные типы содержимого и JSON‑схемы) и `links`. +* [Объект Responses OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#responses-object), он включает `Response Object`. +* [Объект Response OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#response-object), вы можете включить всё из этого объекта напрямую в каждый ответ внутри вашего параметра `responses`. Включая `description`, `headers`, `content` (внутри него вы объявляете разные типы содержимого и JSON‑схемы) и `links`. diff --git a/docs/ru/docs/advanced/additional-status-codes.md b/docs/ru/docs/advanced/additional-status-codes.md index 7c73cf5d5d..aec66a13ff 100644 --- a/docs/ru/docs/advanced/additional-status-codes.md +++ b/docs/ru/docs/advanced/additional-status-codes.md @@ -38,4 +38,4 @@ Если вы возвращаете дополнительные статус-коды и ответы напрямую, они не будут включены в схему OpenAPI (документацию API), потому что у FastAPI нет способа заранее знать, что вы собираетесь вернуть. -Но вы можете задокументировать это в своём коде, используя: [Дополнительные ответы](additional-responses.md){.internal-link target=_blank}. +Но вы можете задокументировать это в своём коде, используя: [Дополнительные ответы](additional-responses.md). diff --git a/docs/ru/docs/advanced/advanced-dependencies.md b/docs/ru/docs/advanced/advanced-dependencies.md index 686a0cf91e..fe37a79c1f 100644 --- a/docs/ru/docs/advanced/advanced-dependencies.md +++ b/docs/ru/docs/advanced/advanced-dependencies.md @@ -48,7 +48,7 @@ checker(q="somequery") ``` -…и передаст возвращённое значение как значение зависимости в параметр `fixed_content_included` нашей *функции-обработчика пути*: +…и передаст возвращённое значение как значение зависимости в параметр `fixed_content_included` нашей *функции-обработчику пути*: {* ../../docs_src/dependencies/tutorial011_an_py310.py hl[22] *} @@ -132,7 +132,7 @@ checker(q="somequery") Так сессия освободит подключение к базе данных, и другие запросы смогут его использовать. -Если у вас есть другой сценарий, где нужно раннее завершение зависимости с `yield`, пожалуйста, создайте вопрос в GitHub Discussions с описанием конкретного кейса и почему вам было бы полезно иметь раннее закрытие для зависимостей с `yield`. +Если у вас есть другой сценарий, где нужно раннее завершение зависимости с `yield`, пожалуйста, создайте [вопрос в GitHub Discussions](https://github.com/fastapi/fastapi/discussions/new?category=questions) с описанием конкретного кейса и почему вам было бы полезно иметь раннее закрытие для зависимостей с `yield`. Если появятся веские причины для раннего закрытия в зависимостях с `yield`, я рассмотрю добавление нового способа опционально включать раннее закрытие. @@ -144,7 +144,7 @@ checker(q="somequery") ### Фоновые задачи и зависимости с `yield`, технические детали { #background-tasks-and-dependencies-with-yield-technical-details } -До FastAPI 0.106.0 вызывать исключения после `yield` было невозможно: код после `yield` в зависимостях выполнялся уже после отправки ответа, поэтому [Обработчики исключений](../tutorial/handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank} к тому моменту уже отработали. +До FastAPI 0.106.0 вызывать исключения после `yield` было невозможно: код после `yield` в зависимостях выполнялся уже после отправки ответа, поэтому [Обработчики исключений](../tutorial/handling-errors.md#install-custom-exception-handlers) к тому моменту уже отработали. Так было сделано в основном для того, чтобы можно было использовать те же объекты, «отданные» зависимостями через `yield`, внутри фоновых задач, потому что код после `yield` выполнялся после завершения фоновых задач. diff --git a/docs/ru/docs/advanced/async-tests.md b/docs/ru/docs/advanced/async-tests.md index 52939c2559..1c0b888cc9 100644 --- a/docs/ru/docs/advanced/async-tests.md +++ b/docs/ru/docs/advanced/async-tests.md @@ -16,11 +16,11 @@ Чтобы работать с асинхронным FastAPI приложением в ваших обычных тестовых функциях `def`, используя стандартный pytest, `TestClient` внутри себя делает некоторую магию. Но эта магия перестает работать, когда мы используем его внутри асинхронных функций. Запуская наши тесты асинхронно, мы больше не можем использовать `TestClient` внутри наших тестовых функций. -`TestClient` основан на HTTPX, и, к счастью, мы можем использовать его (`HTTPX`) напрямую для тестирования API. +`TestClient` основан на [HTTPX](https://www.python-httpx.org), и, к счастью, мы можем использовать его (`HTTPX`) напрямую для тестирования API. ## Пример { #example } -В качестве простого примера, давайте рассмотрим файловую структуру, схожую с описанной в [Большие приложения](../tutorial/bigger-applications.md){.internal-link target=_blank} и [Тестирование](../tutorial/testing.md){.internal-link target=_blank}: +В качестве простого примера, давайте рассмотрим файловую структуру, схожую с описанной в [Большие приложения](../tutorial/bigger-applications.md) и [Тестирование](../tutorial/testing.md): ``` . @@ -84,7 +84,7 @@ response = client.get('/') /// warning | Внимание -Если ваше приложение полагается на lifespan события, то `AsyncClient` не запустит эти события. Чтобы обеспечить их срабатывание используйте `LifespanManager` из florimondmanca/asgi-lifespan. +Если ваше приложение полагается на lifespan события, то `AsyncClient` не запустит эти события. Чтобы обеспечить их срабатывание используйте `LifespanManager` из [florimondmanca/asgi-lifespan](https://github.com/florimondmanca/asgi-lifespan#usage). /// @@ -94,6 +94,6 @@ response = client.get('/') /// tip | Подсказка -Если вы столкнулись с `RuntimeError: Task attached to a different loop` при вызове асинхронных функций в ваших тестах (например, при использовании MongoDB's MotorClient), то не забывайте инициализировать объекты, которым нужен цикл событий (event loop), только внутри асинхронных функций, например, в `@app.on_event("startup")` callback. +Если вы столкнулись с `RuntimeError: Task attached to a different loop` при вызове асинхронных функций в ваших тестах (например, при использовании [MongoDB's MotorClient](https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop)), то не забывайте создавать экземпляры объектов, которым нужен цикл событий (event loop), только внутри асинхронных функций, например, в `@app.on_event("startup")` callback. /// diff --git a/docs/ru/docs/advanced/behind-a-proxy.md b/docs/ru/docs/advanced/behind-a-proxy.md index ec75ed3698..4f212868ad 100644 --- a/docs/ru/docs/advanced/behind-a-proxy.md +++ b/docs/ru/docs/advanced/behind-a-proxy.md @@ -16,9 +16,9 @@ Заголовки прокси: -* X-Forwarded-For -* X-Forwarded-Proto -* X-Forwarded-Host +* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For) +* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto) +* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host) /// @@ -60,7 +60,7 @@ https://mysuperapp.com/items/ /// tip | Совет -Если хотите узнать больше об HTTPS, смотрите руководство [О HTTPS](../deployment/https.md){.internal-link target=_blank}. +Если хотите узнать больше об HTTPS, смотрите руководство [О HTTPS](../deployment/https.md). /// @@ -228,7 +228,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 Учтите, что сервер (Uvicorn) не использует `root_path` ни для чего, кроме как передать его в приложение. -Если вы откроете в браузере http://127.0.0.1:8000/app, вы увидите обычный ответ: +Если вы откроете в браузере [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app), вы увидите обычный ответ: ```JSON { @@ -251,9 +251,9 @@ Uvicorn ожидает, что прокси обратится к нему по ## Локальное тестирование с Traefik { #testing-locally-with-traefik } -Вы можете легко поэкспериментировать локально с функцией удаления префикса пути, используя Traefik. +Вы можете легко поэкспериментировать локально с функцией удаления префикса пути, используя [Traefik](https://docs.traefik.io/). -Скачайте Traefik — это один бинарный файл; распакуйте архив и запустите его прямо из терминала. +[Скачайте Traefik](https://github.com/containous/traefik/releases) — это один бинарный файл; распакуйте архив и запустите его прямо из терминала. Затем создайте файл `traefik.toml` со следующим содержимым: @@ -330,7 +330,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 ### Проверьте ответы { #check-the-responses } -Теперь, если вы перейдёте на URL с портом Uvicorn: http://127.0.0.1:8000/app, вы увидите обычный ответ: +Теперь, если вы перейдёте на URL с портом Uvicorn: [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app), вы увидите обычный ответ: ```JSON { @@ -345,7 +345,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 /// -А теперь откройте URL с портом Traefik и префиксом пути: http://127.0.0.1:9999/api/v1/app. +А теперь откройте URL с портом Traefik и префиксом пути: [http://127.0.0.1:9999/api/v1/app](http://127.0.0.1:9999/api/v1/app). Мы получим тот же ответ: @@ -370,13 +370,13 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 «Официальный» способ доступа к приложению — через прокси с заданным префиксом пути. Поэтому, как и ожидается, если открыть интерфейс документации, отдаваемый напрямую Uvicorn, без префикса пути в URL, он не будет работать, так как предполагается доступ через прокси. -Проверьте по адресу http://127.0.0.1:8000/docs: +Проверьте по адресу [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs): А вот если открыть интерфейс документации по «официальному» URL через прокси на порту `9999`, по `/api/v1/docs`, всё работает корректно! 🎉 -Проверьте по адресу http://127.0.0.1:9999/api/v1/docs: +Проверьте по адресу [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs): @@ -433,7 +433,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 /// -В интерфейсе документации по адресу http://127.0.0.1:9999/api/v1/docs это будет выглядеть так: +В интерфейсе документации по адресу [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs) это будет выглядеть так: @@ -461,6 +461,6 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 ## Монтирование вложенного приложения { #mounting-a-sub-application } -Если вам нужно смонтировать вложенное приложение (как описано в [Вложенные приложения — монтирование](sub-applications.md){.internal-link target=_blank}), и при этом вы используете прокси с `root_path`, делайте это обычным образом — всё будет работать, как ожидается. +Если вам нужно смонтировать вложенное приложение (как описано в [Вложенные приложения — монтирование](sub-applications.md)), и при этом вы используете прокси с `root_path`, делайте это обычным образом — всё будет работать, как ожидается. FastAPI умно использует `root_path` внутри, так что всё просто работает. ✨ diff --git a/docs/ru/docs/advanced/custom-response.md b/docs/ru/docs/advanced/custom-response.md index b9f91373da..fdfe2c5498 100644 --- a/docs/ru/docs/advanced/custom-response.md +++ b/docs/ru/docs/advanced/custom-response.md @@ -1,52 +1,36 @@ # Кастомные ответы — HTML, поток, файл и другие { #custom-response-html-stream-file-others } -По умолчанию **FastAPI** возвращает ответы с помощью `JSONResponse`. +По умолчанию **FastAPI** возвращает ответы в формате JSON. -Вы можете переопределить это, вернув `Response` напрямую, как показано в разделе [Вернуть Response напрямую](response-directly.md){.internal-link target=_blank}. +Вы можете переопределить это, вернув `Response` напрямую, как показано в разделе [Вернуть Response напрямую](response-directly.md). Но если вы возвращаете `Response` напрямую (или любой его подкласс, например `JSONResponse`), данные не будут автоматически преобразованы (даже если вы объявили `response_model`), и документация не будет автоматически сгенерирована (например, со специфичным «типом содержимого» в HTTP-заголовке `Content-Type` как частью сгенерированного OpenAPI). -Но вы можете также объявить `Response`, который хотите использовать (например, любой подкласс `Response`), в декораторе операции пути, используя параметр `response_class`. +Но вы также можете объявить `Response`, который хотите использовать (например, любой подкласс `Response`), в декораторе операции пути, указав параметр `response_class`. Содержимое, которое вы возвращаете из своей функции-обработчика пути, будет помещено внутрь этого `Response`. -И если у этого `Response` тип содержимого JSON (`application/json`), как в случае с `JSONResponse` и `UJSONResponse`, данные, которые вы возвращаете, будут автоматически преобразованы (и отфильтрованы) любым объявленным вами в декораторе операции пути Pydantic `response_model`. - /// note | Примечание Если вы используете класс ответа без типа содержимого, FastAPI будет ожидать, что у вашего ответа нет содержимого, поэтому он не будет документировать формат ответа в сгенерированной документации OpenAPI. /// -## Используйте `ORJSONResponse` { #use-orjsonresponse } - -Например, если вы выжимаете максимум производительности, вы можете установить и использовать `orjson` и задать ответ как `ORJSONResponse`. - -Импортируйте класс (подкласс) `Response`, который вы хотите использовать, и объявите его в декораторе операции пути. - -Для больших ответов возвращать `Response` напрямую значительно быстрее, чем возвращать словарь. - -Это потому, что по умолчанию FastAPI проверяет каждый элемент внутри и убеждается, что он сериализуем в JSON, используя тот же [JSON Compatible Encoder](../tutorial/encoder.md){.internal-link target=_blank}, объяснённый в руководстве. Это позволяет возвращать **произвольные объекты**, например модели из базы данных. - -Но если вы уверены, что содержимое, которое вы возвращаете, **сериализуемо в JSON**, вы можете передать его напрямую в класс ответа и избежать дополнительных накладных расходов, которые FastAPI понёс бы, пропуская возвращаемое содержимое через `jsonable_encoder` перед передачей в класс ответа. +## JSON-ответы { #json-responses } -{* ../../docs_src/custom_response/tutorial001b_py310.py hl[2,7] *} +По умолчанию FastAPI возвращает ответы в формате JSON. -/// info | Информация - -Параметр `response_class` также используется для указания «типа содержимого» ответа. +Если вы объявите [Модель ответа](../tutorial/response-model.md), FastAPI использует её для сериализации данных в JSON с помощью Pydantic. -В этом случае HTTP-заголовок `Content-Type` будет установлен в `application/json`. +Если вы не объявите модель ответа, FastAPI использует `jsonable_encoder`, описанный в разделе [JSON-совместимый энкодер](../tutorial/encoder.md), и поместит результат в `JSONResponse`. -И это будет задокументировано как таковое в OpenAPI. +Если вы объявите `response_class` с JSON типом содержимого (`application/json`), как в случае с `JSONResponse`, данные, которые вы возвращаете, будут автоматически преобразованы (и отфильтрованы) любой Pydantic-моделью ответа (`response_model`), объявленной вами в декораторе операции пути. Но данные не будут сериализованы в JSON-байты через Pydantic; вместо этого они будут преобразованы с помощью `jsonable_encoder`, а затем переданы в класс `JSONResponse`, который сериализует их в байты, используя стандартную JSON-библиотеку Python. -/// +### Производительность JSON { #json-performance } -/// tip | Совет +Коротко: если вам нужна максимальная производительность, используйте [Модель ответа](../tutorial/response-model.md) и не объявляйте `response_class` в декораторе операции пути. -`ORJSONResponse` доступен только в FastAPI, а не в Starlette. - -/// +{* ../../docs_src/response_model/tutorial001_01_py310.py ln[15:17] hl[16] *} ## HTML-ответ { #html-response } @@ -69,7 +53,7 @@ ### Вернуть `Response` { #return-a-response } -Как показано в разделе [Вернуть Response напрямую](response-directly.md){.internal-link target=_blank}, вы также можете переопределить ответ прямо в своей операции пути, просто вернув его. +Как показано в разделе [Вернуть Response напрямую](response-directly.md), вы также можете переопределить ответ прямо в своей операции пути, просто вернув его. Тот же пример сверху, возвращающий `HTMLResponse`, может выглядеть так: @@ -154,37 +138,11 @@ FastAPI (фактически Starlette) автоматически добави Это ответ по умолчанию, используемый в **FastAPI**, как было сказано выше. -### `ORJSONResponse` { #orjsonresponse } - -Быстрая альтернативная реализация JSON-ответа с использованием `orjson`, как было сказано выше. - -/// info | Информация - -Требуется установка `orjson`, например командой `pip install orjson`. - -/// - -### `UJSONResponse` { #ujsonresponse } - -Альтернативная реализация JSON-ответа с использованием `ujson`. - -/// info | Информация - -Требуется установка `ujson`, например командой `pip install ujson`. - -/// - -/// warning | Предупреждение - -`ujson` менее аккуратен, чем встроенная реализация Python, в обработке некоторых крайних случаев. - -/// - -{* ../../docs_src/custom_response/tutorial001_py310.py hl[2,7] *} +/// note | Технические детали -/// tip | Совет +Но если вы объявите модель ответа или тип возвращаемого значения, они будут использованы напрямую для сериализации данных в JSON, и ответ с корректным типом содержимого для JSON будет возвращён напрямую, без использования класса `JSONResponse`. -Возможно, `ORJSONResponse` окажется более быстрым вариантом. +Это идеальный способ получить наилучшую производительность. /// @@ -214,31 +172,25 @@ FastAPI (фактически Starlette) автоматически добави ### `StreamingResponse` { #streamingresponse } -Принимает асинхронный генератор или обычный генератор/итератор и отправляет тело ответа потоково. - -{* ../../docs_src/custom_response/tutorial007_py310.py hl[2,14] *} - -#### Использование `StreamingResponse` с файлоподобными объектами { #using-streamingresponse-with-file-like-objects } +Принимает асинхронный генератор или обычный генератор/итератор (функцию с `yield`) и отправляет тело ответа потоково. -Если у вас есть файлоподобный объект (например, объект, возвращаемый `open()`), вы можете создать функцию-генератор для итерации по этому файлоподобному объекту. +{* ../../docs_src/custom_response/tutorial007_py310.py hl[3,16] *} -Таким образом, вам не нужно сначала читать всё в память, вы можете передать эту функцию-генератор в `StreamingResponse` и вернуть его. - -Это включает многие библиотеки для работы с облачным хранилищем, обработки видео и т.д. +/// note | Технические детали -{* ../../docs_src/custom_response/tutorial008_py310.py hl[2,10:12,14] *} +Задача `async` может быть отменена только при достижении `await`. Если `await` отсутствует, генератор (функция с `yield`) не может быть корректно отменён и может продолжить работу даже после запроса на отмену. -1. Это функция-генератор. Она является «функцией-генератором», потому что содержит оператор(ы) `yield` внутри. -2. Используя блок `with`, мы гарантируем, что файлоподобный объект будет закрыт после завершения работы функции-генератора. То есть после того, как она закончит отправку ответа. -3. Этот `yield from` говорит функции итерироваться по объекту с именем `file_like`. И затем, для каждой итерации, отдавать эту часть как исходящую из этой функции-генератора (`iterfile`). +Так как этому небольшому примеру не нужны операторы `await`, мы добавляем `await anyio.sleep(0)`, чтобы дать циклу событий возможность обработать отмену. - Таким образом, это функция-генератор, которая внутренне передаёт работу по «генерации» чему-то другому. +Это ещё более важно для больших или бесконечных потоков. - Делая это таким образом, мы можем поместить её в блок `with` и тем самым гарантировать, что файлоподобный объект будет закрыт после завершения. +/// /// tip | Совет -Заметьте, что здесь мы используем стандартный `open()`, который не поддерживает `async` и `await`, поэтому объявляем операцию пути обычной `def`. +Вместо того чтобы возвращать `StreamingResponse` напрямую, вероятно, лучше следовать стилю из раздела [Передача данных потоком](./stream-data.md) - так гораздо удобнее, и отмена обрабатывается «за кулисами». + +Если вы передаёте JSON Lines потоком, следуйте руководству [Поток JSON Lines](../tutorial/stream-json-lines.md). /// @@ -267,7 +219,7 @@ FastAPI (фактически Starlette) автоматически добави Вы можете создать собственный класс ответа, унаследовавшись от `Response`, и использовать его. -Например, предположим, что вы хотите использовать `orjson`, но с некоторыми пользовательскими настройками, которые не используются во встроенном классе `ORJSONResponse`. +Например, предположим, что вы хотите использовать [`orjson`](https://github.com/ijl/orjson) с некоторыми настройками. Скажем, вы хотите, чтобы возвращался отформатированный JSON с отступами, то есть хотите использовать опцию orjson `orjson.OPT_INDENT_2`. @@ -291,13 +243,21 @@ FastAPI (фактически Starlette) автоматически добави Разумеется, вы наверняка найдёте гораздо более полезные способы воспользоваться этим, чем просто форматирование JSON. 😉 +### `orjson` или Модель ответа { #orjson-or-response-model } + +Если вы стремитесь увеличить производительность, вероятно, лучше использовать [Модель ответа](../tutorial/response-model.md), чем ответ на базе `orjson`. + +С моделью ответа FastAPI использует Pydantic для сериализации данных в JSON, без промежуточных шагов, таких как преобразование через `jsonable_encoder`, которое происходило бы в любом другом случае. + +А под капотом Pydantic использует те же базовые механизмы на Rust, что и `orjson`, для сериализации в JSON, так что с моделью ответа вы и так получите лучшую производительность. + ## Класс ответа по умолчанию { #default-response-class } При создании экземпляра класса **FastAPI** или `APIRouter` вы можете указать, какой класс ответа использовать по умолчанию. Параметр, который это определяет, — `default_response_class`. -В примере ниже **FastAPI** будет использовать `ORJSONResponse` по умолчанию во всех операциях пути вместо `JSONResponse`. +В примере ниже **FastAPI** будет использовать `HTMLResponse` по умолчанию во всех операциях пути, вместо JSON. {* ../../docs_src/custom_response/tutorial010_py310.py hl[2,4] *} @@ -309,4 +269,4 @@ FastAPI (фактически Starlette) автоматически добави ## Дополнительная документация { #additional-documentation } -Вы также можете объявить тип содержимого и многие другие детали в OpenAPI с помощью `responses`: [Дополнительные ответы в OpenAPI](additional-responses.md){.internal-link target=_blank}. +Вы также можете объявить тип содержимого и многие другие детали в OpenAPI с помощью `responses`: [Дополнительные ответы в OpenAPI](additional-responses.md). diff --git a/docs/ru/docs/advanced/dataclasses.md b/docs/ru/docs/advanced/dataclasses.md index 87a5763c10..f9f8689b04 100644 --- a/docs/ru/docs/advanced/dataclasses.md +++ b/docs/ru/docs/advanced/dataclasses.md @@ -2,11 +2,11 @@ FastAPI построен поверх **Pydantic**, и я показывал вам, как использовать Pydantic-модели для объявления HTTP-запросов и HTTP-ответов. -Но FastAPI также поддерживает использование `dataclasses` тем же способом: +Но FastAPI также поддерживает использование [`dataclasses`](https://docs.python.org/3/library/dataclasses.html) тем же способом: {* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *} -Это по-прежнему поддерживается благодаря **Pydantic**, так как в нём есть встроенная поддержка `dataclasses`. +Это по-прежнему поддерживается благодаря **Pydantic**, так как в нём есть [встроенная поддержка `dataclasses`](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel). Так что даже если в коде выше Pydantic не используется явно, FastAPI использует Pydantic, чтобы конвертировать стандартные dataclasses в собственный вариант dataclasses от Pydantic. @@ -74,7 +74,7 @@ FastAPI построен поверх **Pydantic**, и я показывал в Как и всегда в FastAPI, вы можете сочетать `def` и `async def` по необходимости. - Если хотите освежить в памяти, когда что использовать, посмотрите раздел _"Нет времени?"_ в документации про [`async` и `await`](../async.md#in-a-hurry){.internal-link target=_blank}. + Если хотите освежить в памяти, когда что использовать, посмотрите раздел _"Нет времени?"_ в документации про [`async` и `await`](../async.md#in-a-hurry). 9. Эта *функция-обработчик пути* возвращает не dataclasses (хотя могла бы), а список словарей с внутренними данными. @@ -88,7 +88,7 @@ FastAPI построен поверх **Pydantic**, и я показывал в Вы также можете комбинировать `dataclasses` с другими Pydantic-моделями, наследоваться от них, включать их в свои модели и т.д. -Чтобы узнать больше, посмотрите документацию Pydantic о dataclasses. +Чтобы узнать больше, посмотрите [документацию Pydantic о dataclasses](https://docs.pydantic.dev/latest/concepts/dataclasses/). ## Версия { #version } diff --git a/docs/ru/docs/advanced/events.md b/docs/ru/docs/advanced/events.md index bcb5b000a4..464bba93e9 100644 --- a/docs/ru/docs/advanced/events.md +++ b/docs/ru/docs/advanced/events.md @@ -150,11 +150,11 @@ async with lifespan(app): Немного технических подробностей для любопытных умников. 🤓 -Под капотом, в ASGI-технической спецификации, это часть Протокола Lifespan, и он определяет события `startup` и `shutdown`. +Под капотом, в ASGI-технической спецификации, это часть [Протокола Lifespan](https://asgi.readthedocs.io/en/latest/specs/lifespan.html), и он определяет события `startup` и `shutdown`. /// info | Информация -Вы можете прочитать больше про обработчики `lifespan` в Starlette в документации Starlette по Lifespan. +Вы можете прочитать больше про обработчики `lifespan` в Starlette в [документации Starlette по Lifespan](https://www.starlette.dev/lifespan/). Включая то, как работать с состоянием lifespan, которое можно использовать в других частях вашего кода. @@ -162,4 +162,4 @@ async with lifespan(app): ## Подприложения { #sub-applications } -🚨 Имейте в виду, что эти события lifespan (startup и shutdown) будут выполнены только для основного приложения, а не для [Подприложения — Mounts](sub-applications.md){.internal-link target=_blank}. +🚨 Имейте в виду, что эти события lifespan (startup и shutdown) будут выполнены только для основного приложения, а не для [Подприложения — Mounts](sub-applications.md). diff --git a/docs/ru/docs/advanced/generate-clients.md b/docs/ru/docs/advanced/generate-clients.md index 4eb098a88f..75bd7c47c4 100644 --- a/docs/ru/docs/advanced/generate-clients.md +++ b/docs/ru/docs/advanced/generate-clients.md @@ -8,11 +8,11 @@ ## Генераторы SDK с открытым исходным кодом { #open-source-sdk-generators } -Гибкий вариант — OpenAPI Generator, который поддерживает **многие языки программирования** и умеет генерировать SDK из вашей спецификации OpenAPI. +Гибкий вариант — [OpenAPI Generator](https://openapi-generator.tech/), который поддерживает **многие языки программирования** и умеет генерировать SDK из вашей спецификации OpenAPI. -Для **TypeScript‑клиентов** Hey API — специализированное решение, обеспечивающее оптимальный опыт для экосистемы TypeScript. +Для **TypeScript‑клиентов** [Hey API](https://heyapi.dev/) — специализированное решение, обеспечивающее оптимальный опыт для экосистемы TypeScript. -Больше генераторов SDK можно найти на OpenAPI.Tools. +Больше генераторов SDK можно найти на [OpenAPI.Tools](https://openapi.tools/#sdk). /// tip | Совет @@ -24,15 +24,15 @@ FastAPI автоматически генерирует спецификации В этом разделе представлены решения с **венчурной поддержкой** и **поддержкой компаний** от компаний, которые спонсируют FastAPI. Эти продукты предоставляют **дополнительные возможности** и **интеграции** сверх высококачественно генерируемых SDK. -Благодаря ✨ [**спонсорству FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨ эти компании помогают обеспечивать, чтобы фреймворк и его **экосистема** оставались здоровыми и **устойчивыми**. +Благодаря ✨ [**спонсорству FastAPI**](../help-fastapi.md#sponsor-the-author) ✨ эти компании помогают обеспечивать, чтобы фреймворк и его **экосистема** оставались здоровыми и **устойчивыми**. Их спонсорство также демонстрирует серьёзную приверженность **сообществу** FastAPI (вам), показывая, что им важно не только предоставлять **отличный сервис**, но и поддерживать **надёжный и процветающий фреймворк** FastAPI. 🙇 Например, вы можете попробовать: -* Speakeasy -* Stainless -* liblab +* [Speakeasy](https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship) +* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) +* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi) Некоторые из этих решений также могут быть open source или иметь бесплатные тарифы, так что вы сможете попробовать их без финансовых затрат. Другие коммерческие генераторы SDK доступны и их можно найти онлайн. 🤓 @@ -66,11 +66,11 @@ npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client Это сгенерирует TypeScript SDK в `./src/client`. -Вы можете узнать, как установить `@hey-api/openapi-ts` и почитать о сгенерированном результате на их сайте. +Вы можете узнать, как [установить `@hey-api/openapi-ts`](https://heyapi.dev/openapi-ts/get-started) и почитать о [сгенерированном результате](https://heyapi.dev/openapi-ts/output) на их сайте. ### Использование SDK { #using-the-sdk } -Теперь вы можете импортировать и использовать клиентский код. Это может выглядеть так, обратите внимание, что вы получаете автозавершение для методoв: +Теперь вы можете импортировать и использовать клиентский код. Это может выглядеть так, обратите внимание, что вы получаете автозавершение для методов: diff --git a/docs/ru/docs/advanced/index.md b/docs/ru/docs/advanced/index.md index c0a52c6c14..6cb92dd004 100644 --- a/docs/ru/docs/advanced/index.md +++ b/docs/ru/docs/advanced/index.md @@ -2,7 +2,7 @@ ## Дополнительные возможности { #additional-features } -Основное [Учебник - Руководство пользователя](../tutorial/index.md){.internal-link target=_blank} должно быть достаточно, чтобы познакомить вас со всеми основными функциями **FastAPI**. +Основное [Учебник - Руководство пользователя](../tutorial/index.md) должно быть достаточно, чтобы познакомить вас со всеми основными функциями **FastAPI**. В следующих разделах вы увидите другие варианты, конфигурации и дополнительные возможности. @@ -16,6 +16,6 @@ ## Сначала прочитайте Учебник - Руководство пользователя { #read-the-tutorial-first } -Вы все еще можете использовать большинство функций **FastAPI** со знаниями из [Учебник - Руководство пользователя](../tutorial/index.md){.internal-link target=_blank}. +Вы все еще можете использовать большинство функций **FastAPI** со знаниями из [Учебник - Руководство пользователя](../tutorial/index.md). И следующие разделы предполагают, что вы уже прочитали его, и предполагают, что вы знаете эти основные идеи. diff --git a/docs/ru/docs/advanced/json-base64-bytes.md b/docs/ru/docs/advanced/json-base64-bytes.md new file mode 100644 index 0000000000..390dd17fa1 --- /dev/null +++ b/docs/ru/docs/advanced/json-base64-bytes.md @@ -0,0 +1,63 @@ +# JSON с байтами в Base64 { #json-with-bytes-as-base64 } + +Если вашему приложению нужно принимать и отправлять JSON-данные, но при этом необходимо включать в них бинарные данные, вы можете кодировать их в base64. + +## Base64 и файлы { #base64-vs-files } + +Сначала рассмотрите возможность использовать [Файлы в запросе](../tutorial/request-files.md) для загрузки бинарных данных и [Пользовательский HTTP-ответ — FileResponse](./custom-response.md#fileresponse--fileresponse-) для отправки бинарных данных вместо кодирования их в JSON. + +JSON может содержать только строки в кодировке UTF-8, поэтому он не может содержать «сырые» байты. + +Base64 может кодировать бинарные данные в строки, но для этого используется больше символов, чем в исходных бинарных данных, поэтому обычно это менее эффективно, чем обычные файлы. + +Используйте base64 только если вам действительно нужно включать бинарные данные в JSON и вы не можете использовать файлы для этого. + +## Pydantic `bytes` { #pydantic-bytes } + +Вы можете объявить Pydantic-модель с полями `bytes`, а затем использовать `val_json_bytes` в конфиге модели, чтобы указать использовать base64 для валидации входящих JSON-данных; как часть этой валидации строка base64 будет декодирована в байты. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *} + +Если вы откроете `/docs`, вы увидите, что поле `data` ожидает байты, закодированные в base64: + +
+ +
+ +Вы можете отправить такой HTTP-запрос: + +```json +{ + "description": "Some data", + "data": "aGVsbG8=" +} +``` + +/// tip | Совет + +`aGVsbG8=` — это base64-кодирование строки `hello`. + +/// + +Затем Pydantic декодирует строку base64 и передаст вам исходные байты в поле `data` модели. + +Вы получите такой HTTP-ответ: + +```json +{ + "description": "Some data", + "content": "hello" +} +``` + +## Pydantic `bytes` для выходных данных { #pydantic-bytes-for-output-data } + +Вы также можете использовать поля `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-данных. + +{* ../../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/middleware.md b/docs/ru/docs/advanced/middleware.md index 1f1a160604..805866499c 100644 --- a/docs/ru/docs/advanced/middleware.md +++ b/docs/ru/docs/advanced/middleware.md @@ -1,8 +1,8 @@ # Расширенное использование middleware { #advanced-middleware } -В основном руководстве вы читали, как добавить [пользовательское middleware](../tutorial/middleware.md){.internal-link target=_blank} в ваше приложение. +В основном руководстве вы читали, как добавить [пользовательское middleware](../tutorial/middleware.md) в ваше приложение. -А затем — как работать с [CORS с помощью `CORSMiddleware`](../tutorial/cors.md){.internal-link target=_blank}. +А затем — как работать с [CORS с помощью `CORSMiddleware`](../tutorial/cors.md). В этом разделе посмотрим, как использовать другие middleware. @@ -91,7 +91,7 @@ app.add_middleware(UnicornMiddleware, some_config="rainbow") Например: -- `ProxyHeadersMiddleware` от Uvicorn -- MessagePack +- [`ProxyHeadersMiddleware` от Uvicorn](https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py) +- [MessagePack](https://github.com/florimondmanca/msgpack-asgi) -Чтобы увидеть другие доступные middleware, посмотрите документацию по middleware в Starlette и список ASGI Awesome. +Чтобы увидеть другие доступные middleware, посмотрите [документацию по middleware в Starlette](https://www.starlette.dev/middleware/) и [список ASGI Awesome](https://github.com/florimondmanca/awesome-asgi). diff --git a/docs/ru/docs/advanced/openapi-callbacks.md b/docs/ru/docs/advanced/openapi-callbacks.md index de7e283017..3d791de2c6 100644 --- a/docs/ru/docs/advanced/openapi-callbacks.md +++ b/docs/ru/docs/advanced/openapi-callbacks.md @@ -35,7 +35,7 @@ /// tip | Совет -Query-параметр `callback_url` использует тип Pydantic Url. +Query-параметр `callback_url` использует тип Pydantic [Url](https://docs.pydantic.dev/latest/api/networks/). /// @@ -66,7 +66,7 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) Сам обратный вызов — это всего лишь HTTP-запрос. -Реализуя обратный вызов, вы можете использовать, например, HTTPX или Requests. +Реализуя обратный вызов, вы можете использовать, например, [HTTPX](https://www.python-httpx.org) или [Requests](https://requests.readthedocs.io/). /// @@ -106,11 +106,11 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) Есть 2 основных отличия от обычной *операции пути*: * Ей не нужен реальный код, потому что ваше приложение никогда не будет вызывать эту функцию. Она используется только для документирования *внешнего API*. Поэтому в функции может быть просто `pass`. -* *Путь* может содержать выражение OpenAPI 3 (подробнее ниже), где можно использовать переменные с параметрами и части исходного HTTP-запроса, отправленного *вашему API*. +* *Путь* может содержать [выражение OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) (подробнее ниже), где можно использовать переменные с параметрами и части исходного HTTP-запроса, отправленного *вашему API*. ### Выражение пути для обратного вызова { #the-callback-path-expression } -*Путь* обратного вызова может содержать выражение OpenAPI 3, которое может включать части исходного запроса, отправленного *вашему API*. +*Путь* обратного вызова может содержать [выражение OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression), которое может включать части исходного запроса, отправленного *вашему API*. В нашем случае это `str`: @@ -179,7 +179,7 @@ https://www.external.org/events/invoices/2expen51ve ### Проверьте документацию { #check-the-docs } -Теперь вы можете запустить приложение и перейти по адресу http://127.0.0.1:8000/docs. +Теперь вы можете запустить приложение и перейти по адресу [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Вы увидите документацию, включающую раздел «Callbacks» для вашей *операции пути*, который показывает, как должен выглядеть *внешний API*: diff --git a/docs/ru/docs/advanced/openapi-webhooks.md b/docs/ru/docs/advanced/openapi-webhooks.md index b477075c11..9b1988ff31 100644 --- a/docs/ru/docs/advanced/openapi-webhooks.md +++ b/docs/ru/docs/advanced/openapi-webhooks.md @@ -10,7 +10,7 @@ Обычно процесс таков: вы определяете в своем коде, какое сообщение вы будете отправлять, то есть тело запроса. -Вы также определяете, в какие моменты (при каких событиях) ваше приложение будет отправлять эти запросы. +Вы также определяете, в какие моменты (при каких событиях) ваше приложение будет отправлять эти запросы (события). А ваши пользователи каким-то образом (например, в веб‑панели) указывают URL-адрес, на который ваше приложение должно отправлять эти запросы. @@ -48,7 +48,7 @@ ### Посмотрите документацию { #check-the-docs } -Теперь вы можете запустить приложение и перейти по ссылке http://127.0.0.1:8000/docs. +Теперь вы можете запустить приложение и перейти по ссылке [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Вы увидите, что в документации есть обычные операции пути, а также появились вебхуки: diff --git a/docs/ru/docs/advanced/path-operation-advanced-configuration.md b/docs/ru/docs/advanced/path-operation-advanced-configuration.md index b8c879bf6f..fe2996362b 100644 --- a/docs/ru/docs/advanced/path-operation-advanced-configuration.md +++ b/docs/ru/docs/advanced/path-operation-advanced-configuration.md @@ -60,7 +60,7 @@ Также можно объявлять дополнительные ответы с их моделями, статус-кодами и т.д. -В документации есть целая глава об этом — [Дополнительные ответы в OpenAPI](additional-responses.md){.internal-link target=_blank}. +В документации есть целая глава об этом — [Дополнительные ответы в OpenAPI](additional-responses.md). ## Дополнительные данные OpenAPI { #openapi-extra } @@ -68,7 +68,7 @@ /// note | Технические детали -В спецификации OpenAPI это называется Объект операции. +В спецификации OpenAPI это называется [Объект операции](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operation-object). /// @@ -82,7 +82,7 @@ Это низкоуровневая возможность расширения. -Если вам нужно лишь объявить дополнительные ответы, удобнее сделать это через [Дополнительные ответы в OpenAPI](additional-responses.md){.internal-link target=_blank}. +Если вам нужно лишь объявить дополнительные ответы, удобнее сделать это через [Дополнительные ответы в OpenAPI](additional-responses.md). /// diff --git a/docs/ru/docs/advanced/response-change-status-code.md b/docs/ru/docs/advanced/response-change-status-code.md index 273862bae9..3dd0c9446e 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){.internal-link target=_blank}. +Вы, вероятно, уже читали о том, что можно установить [статус-код ответа по умолчанию](../tutorial/response-status-code.md). Но в некоторых случаях нужно вернуть другой статус-код, отличный от значения по умолчанию. diff --git a/docs/ru/docs/advanced/response-cookies.md b/docs/ru/docs/advanced/response-cookies.md index d3662ef8ed..2adc1af85a 100644 --- a/docs/ru/docs/advanced/response-cookies.md +++ b/docs/ru/docs/advanced/response-cookies.md @@ -20,7 +20,7 @@ Вы также можете установить Cookies, если возвращаете `Response` напрямую в вашем коде. -Для этого создайте объект `Response`, как описано в разделе [Возвращение ответа напрямую](response-directly.md){.internal-link target=_blank}. +Для этого создайте объект `Response`, как описано в разделе [Возвращение ответа напрямую](response-directly.md). Затем установите cookies и верните этот объект: @@ -48,4 +48,4 @@ /// -Чтобы увидеть все доступные параметры и настройки, ознакомьтесь с документацией Starlette. +Чтобы увидеть все доступные параметры и настройки, ознакомьтесь с [документацией Starlette](https://www.starlette.dev/responses/#set-cookie). diff --git a/docs/ru/docs/advanced/response-directly.md b/docs/ru/docs/advanced/response-directly.md index 60facdd857..fcb8d533db 100644 --- a/docs/ru/docs/advanced/response-directly.md +++ b/docs/ru/docs/advanced/response-directly.md @@ -2,19 +2,23 @@ Когда вы создаёте **FastAPI** *операцию пути*, вы можете возвращать из неё любые данные: `dict`, `list`, Pydantic-модель, модель базы данных и т.д. -По умолчанию **FastAPI** автоматически преобразует возвращаемое значение в JSON с помощью `jsonable_encoder`, как описано в [JSON кодировщик](../tutorial/encoder.md){.internal-link target=_blank}. +Если вы объявите [Модель ответа](../tutorial/response-model.md), FastAPI будет использовать её для сериализации данных в JSON с помощью Pydantic. -Затем "под капотом" эти данные, совместимые с JSON (например `dict`), помещаются в `JSONResponse`, который используется для отправки ответа клиенту. +Если вы не объявите модель ответа, FastAPI использует `jsonable_encoder`, как описано в [JSON кодировщик](../tutorial/encoder.md), и поместит результат в `JSONResponse`. -Но вы можете возвращать `JSONResponse` напрямую из ваших *операций пути*. +Также вы можете создать `JSONResponse` напрямую и вернуть его. -Это может быть полезно, например, если нужно вернуть пользовательские HTTP-заголовки или cookie. +/// tip | Подсказка + +Обычно вы получите значительно лучшую производительность, если будете использовать [Модель ответа](../tutorial/response-model.md), а не возвращать `JSONResponse` напрямую, так как в этом случае сериализация данных с помощью Pydantic происходит на стороне Rust. + +/// ## Возврат `Response` { #return-a-response } -На самом деле, вы можете возвращать любой объект `Response` или его подкласс. +Вы можете возвращать `Response` или любой его подкласс. -/// tip | Подсказка +/// info | Информация `JSONResponse` сам по себе является подклассом `Response`. @@ -26,6 +30,8 @@ Это даёт вам большую гибкость. Вы можете возвращать любые типы данных, переопределять любые объявления или валидацию данных и т.д. +Это также накладывает на вас ответственность. Вам нужно удостовериться, что возвращаемые данные корректны, в правильном формате, что их можно сериализовать и т.д. + ## Использование `jsonable_encoder` в `Response` { #using-the-jsonable-encoder-in-a-response } Поскольку **FastAPI** не изменяет объект `Response`, который вы возвращаете, вы должны убедиться, что его содержимое готово к отправке. @@ -50,16 +56,28 @@ Теперь давайте посмотрим, как можно использовать это для возврата пользовательского ответа. -Допустим, вы хотите вернуть ответ в формате XML. +Допустим, вы хотите вернуть ответ в формате [XML](https://en.wikipedia.org/wiki/XML). Вы можете поместить ваш XML-контент в строку, поместить её в `Response` и вернуть: {* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *} +## Как работает модель ответа { #how-a-response-model-works } + +Когда вы объявляете [Модель ответа - возвращаемый тип](../tutorial/response-model.md) в операции пути, **FastAPI** будет использовать её для сериализации данных в JSON с помощью Pydantic. + +{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *} + +Поскольку это происходит на стороне Rust, производительность будет значительно выше, чем если бы это выполнялось обычным Python и классом `JSONResponse`. + +При использовании `response_model` или возвращаемого типа FastAPI не будет использовать `jsonable_encoder` для преобразования данных (что было бы медленнее) и не будет использовать класс `JSONResponse`. + +Вместо этого он берёт JSON-байты, сгенерированные Pydantic с использованием модели ответа (или возвращаемого типа), и возвращает `Response` с правильным типом содержимого для JSON (`application/json`) напрямую. + ## Примечания { #notes } Когда вы возвращаете объект `Response` напрямую, его данные не валидируются, не преобразуются (не сериализуются) и не документируются автоматически. -Но вы всё равно можете задокументировать это, как описано в [Дополнительные ответы в OpenAPI](additional-responses.md){.internal-link target=_blank}. +Но вы всё равно можете задокументировать это, как описано в [Дополнительные ответы в OpenAPI](additional-responses.md). В следующих разделах вы увидите, как использовать/объявлять такие кастомные `Response`, при этом сохраняя автоматическое преобразование данных, документацию и т.д. diff --git a/docs/ru/docs/advanced/response-headers.md b/docs/ru/docs/advanced/response-headers.md index dc821983bc..806b89e1f8 100644 --- a/docs/ru/docs/advanced/response-headers.md +++ b/docs/ru/docs/advanced/response-headers.md @@ -20,7 +20,7 @@ Вы также можете добавить HTTP-заголовки, когда возвращаете `Response` напрямую. -Создайте ответ, как описано в [Вернуть Response напрямую](response-directly.md){.internal-link target=_blank}, и передайте заголовки как дополнительный параметр: +Создайте ответ, как описано в [Вернуть Response напрямую](response-directly.md), и передайте заголовки как дополнительный параметр: {* ../../docs_src/response_headers/tutorial001_py310.py hl[10:12] *} @@ -36,6 +36,6 @@ ## Пользовательские HTTP-заголовки { #custom-headers } -Помните, что собственные проприетарные заголовки можно добавлять, используя префикс `X-`. +Помните, что собственные проприетарные заголовки можно добавлять, [используя префикс `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). -Но если у вас есть пользовательские заголовки, которые вы хотите показывать клиенту в браузере, вам нужно добавить их в настройки CORS (подробнее см. в [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank}), используя параметр `expose_headers`, описанный в документации Starlette по CORS. +Но если у вас есть пользовательские заголовки, которые вы хотите показывать клиенту в браузере, вам нужно добавить их в настройки 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/http-basic-auth.md b/docs/ru/docs/advanced/security/http-basic-auth.md index a6bfb7c546..b094fec773 100644 --- a/docs/ru/docs/advanced/security/http-basic-auth.md +++ b/docs/ru/docs/advanced/security/http-basic-auth.md @@ -32,7 +32,7 @@ Используйте зависимость, чтобы проверить, корректны ли имя пользователя и пароль. -Для этого используйте стандартный модуль Python `secrets` для проверки имени пользователя и пароля. +Для этого используйте стандартный модуль Python [`secrets`](https://docs.python.org/3/library/secrets.html) для проверки имени пользователя и пароля. `secrets.compare_digest()` должен получать `bytes` или `str`, который содержит только символы ASCII (английские символы). Это значит, что он не будет работать с символами вроде `á`, как в `Sebastián`. diff --git a/docs/ru/docs/advanced/security/index.md b/docs/ru/docs/advanced/security/index.md index 912e4812a5..89a7236d81 100644 --- a/docs/ru/docs/advanced/security/index.md +++ b/docs/ru/docs/advanced/security/index.md @@ -2,11 +2,11 @@ ## Дополнительные возможности { #additional-features } -Есть дополнительные возможности для работы с безопасностью помимо тех, что описаны в [Учебник — Руководство пользователя: Безопасность](../../tutorial/security/index.md){.internal-link target=_blank}. +Есть дополнительные возможности для работы с безопасностью помимо тех, что описаны в [Учебник — Руководство пользователя: Безопасность](../../tutorial/security/index.md). /// tip | Совет -Следующие разделы **не обязательно являются «продвинутыми»**. +Следующие разделы не обязательно являются «продвинутыми». И возможно, что решение для вашего варианта использования находится в одном из них. @@ -14,6 +14,6 @@ ## Сначала прочитайте руководство { #read-the-tutorial-first } -В следующих разделах предполагается, что вы уже прочитали основной [Учебник — Руководство пользователя: Безопасность](../../tutorial/security/index.md){.internal-link target=_blank}. +В следующих разделах предполагается, что вы уже прочитали основной [Учебник — Руководство пользователя: Безопасность](../../tutorial/security/index.md). Все они основаны на тех же концепциях, но предоставляют дополнительные возможности. diff --git a/docs/ru/docs/advanced/security/oauth2-scopes.md b/docs/ru/docs/advanced/security/oauth2-scopes.md index 8788df1991..944baeeeb6 100644 --- a/docs/ru/docs/advanced/security/oauth2-scopes.md +++ b/docs/ru/docs/advanced/security/oauth2-scopes.md @@ -1,6 +1,6 @@ # OAuth2 scopes { #oauth2-scopes } -Вы можете использовать OAuth2 scopes (scope - область, рамки) напрямую с **FastAPI** — они интегрированы и работают бесшовно. +Вы можете использовать OAuth2 scopes напрямую с **FastAPI** — они интегрированы и работают бесшовно. Это позволит вам иметь более детальную систему разрешений по стандарту OAuth2, интегрированную в ваше OpenAPI‑приложение (и документацию API). @@ -60,7 +60,7 @@ OAuth2 со scopes — это механизм, который использу ## Взгляд издалека { #global-view } -Сначала быстро посмотрим, что изменилось по сравнению с примерами из основного раздела **Учебник - Руководство пользователя** — [OAuth2 с паролем (и хешированием), Bearer с JWT-токенами](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. Теперь — с использованием OAuth2 scopes: +Сначала быстро посмотрим, что изменилось по сравнению с примерами из основного раздела **Учебник - Руководство пользователя** — [OAuth2 с паролем (и хешированием), Bearer с JWT-токенами](../../tutorial/security/oauth2-jwt.md). Теперь — с использованием OAuth2 scopes: {* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *} @@ -267,8 +267,8 @@ OAuth2 со scopes — это механизм, который использу /// -FastAPI включает утилиты для всех этих OAuth2‑flows в `fastapi.security.oauth2`. +**FastAPI** включает утилиты для всех этих OAuth2‑flows в `fastapi.security.oauth2`. ## `Security` в параметре `dependencies` декоратора { #security-in-decorator-dependencies } -Точно так же, как вы можете определить `list` из `Depends` в параметре `dependencies` декоратора (см. [Зависимости в декораторах операции пути](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}), вы можете использовать там и `Security` со `scopes`. +Точно так же, как вы можете определить `list` из `Depends` в параметре `dependencies` декоратора (см. [Зависимости в декораторах операции пути](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md)), вы можете использовать там и `Security` со `scopes`. diff --git a/docs/ru/docs/advanced/settings.md b/docs/ru/docs/advanced/settings.md index 15537e2b40..3ae063340b 100644 --- a/docs/ru/docs/advanced/settings.md +++ b/docs/ru/docs/advanced/settings.md @@ -8,7 +8,7 @@ /// tip | Совет -Чтобы понять, что такое переменные окружения, вы можете прочитать [Переменные окружения](../environment-variables.md){.internal-link target=_blank}. +Чтобы понять, что такое переменные окружения, вы можете прочитать [Переменные окружения](../environment-variables.md). /// @@ -20,11 +20,11 @@ ## Pydantic `Settings` { #pydantic-settings } -К счастью, Pydantic предоставляет отличную утилиту для работы с этими настройками, поступающими из переменных окружения, — Pydantic: управление настройками. +К счастью, Pydantic предоставляет отличную утилиту для работы с этими настройками, поступающими из переменных окружения, — [Pydantic: управление настройками](https://docs.pydantic.dev/latest/concepts/pydantic_settings/). ### Установка `pydantic-settings` { #install-pydantic-settings } -Сначала убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md){.internal-link target=_blank}, активировали его, а затем установили пакет `pydantic-settings`: +Сначала убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md), активировали его, а затем установили пакет `pydantic-settings`:
@@ -100,7 +100,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.p ## Настройки в другом модуле { #settings-in-another-module } -Вы можете вынести эти настройки в другой модуль, как показано в разделе [Большие приложения — несколько файлов](../tutorial/bigger-applications.md){.internal-link target=_blank}. +Вы можете вынести эти настройки в другой модуль, как показано в разделе [Большие приложения — несколько файлов](../tutorial/bigger-applications.md). Например, у вас может быть файл `config.py` со следующим содержимым: @@ -112,7 +112,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.p /// tip | Совет -Вам также понадобится файл `__init__.py`, как в разделе [Большие приложения — несколько файлов](../tutorial/bigger-applications.md){.internal-link target=_blank}. +Вам также понадобится файл `__init__.py`, как в разделе [Большие приложения — несколько файлов](../tutorial/bigger-applications.md). /// @@ -172,7 +172,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.p /// -Pydantic поддерживает чтение таких файлов с помощью внешней библиотеки. Подробнее вы можете прочитать здесь: Pydantic Settings: поддержка Dotenv (.env). +Pydantic поддерживает чтение таких файлов с помощью внешней библиотеки. Подробнее вы можете прочитать здесь: [Pydantic Settings: поддержка Dotenv (.env)](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support). /// tip | Совет @@ -197,7 +197,7 @@ APP_NAME="ChimichangApp" /// tip | Совет -Атрибут `model_config` используется только для конфигурации Pydantic. Подробнее см. Pydantic: Concepts: Configuration. +Атрибут `model_config` используется только для конфигурации Pydantic. Подробнее см. [Pydantic: Concepts: Configuration](https://docs.pydantic.dev/latest/concepts/config/). /// @@ -291,7 +291,7 @@ participant execute as Execute function Таким образом, она ведет себя почти как глобальная переменная. Но так как используется функция‑зависимость, мы можем легко переопределить ее для тестирования. -`@lru_cache` — часть `functools`, что входит в стандартную библиотеку Python. Подробнее можно прочитать в документации Python по `@lru_cache`. +`@lru_cache` — часть `functools`, что входит в стандартную библиотеку Python. Подробнее можно прочитать в [документации Python по `@lru_cache`](https://docs.python.org/3/library/functools.html#functools.lru_cache). ## Итоги { #recap } diff --git a/docs/ru/docs/advanced/stream-data.md b/docs/ru/docs/advanced/stream-data.md new file mode 100644 index 0000000000..4c373db1ad --- /dev/null +++ b/docs/ru/docs/advanced/stream-data.md @@ -0,0 +1,117 @@ +# Потоковая передача данных { #stream-data } + +Если вам нужно передавать потоковые данные, которые можно представить как JSON, воспользуйтесь [стримингом JSON Lines](../tutorial/stream-json-lines.md). + +Но если вы хотите передавать в потоке чистые бинарные данные или строки, ниже показано, как это сделать. + +/// info | Информация + +Добавлено в FastAPI 0.134.0. + +/// + +## Варианты использования { #use-cases } + +Это можно использовать, если вы хотите стримить чистые строки, например, напрямую из вывода сервиса **AI LLM**. + +Также вы можете стримить **большие бинарные файлы**, передавая каждый чанк данных по мере чтения, без необходимости загружать всё в память сразу. + +Аналогично можно стримить **видео** или **аудио** — данные могут даже генерироваться по мере обработки и отправки. + +## «`StreamingResponse` с `yield`» { #a-streamingresponse-with-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 } + +Можно использовать и обычные функции `def` (без `async`) и точно так же применять `yield`. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[26:29] hl[27] *} + +### Без аннотации { #no-annotation } + +Для потоковой передачи бинарных данных вам не нужно указывать аннотацию типа возвращаемого значения. + +Поскольку FastAPI не будет пытаться конвертировать данные в JSON с помощью Pydantic или сериализовать их каким-либо образом, в данном случае аннотация типа нужна только для вашего редактора кода и инструментов, FastAPI её использовать не будет. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} + +Это также означает, что с `StreamingResponse` у вас есть и свобода, и ответственность — производить и кодировать байты данных ровно в том виде, в котором они должны быть отправлены, независимо от аннотаций типов. 🤓 + +### Потоковая передача байтов { #stream-bytes } + +Один из основных сценариев — стримить `bytes` вместо строк, и, конечно, это можно сделать. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[44:47] hl[47] *} + +## Пользовательский `PNGStreamingResponse` { #a-custom-pngstreamingresponse } + +В примерах выше байты данных передавались потоком, но в ответе не было HTTP-заголовка `Content-Type`, поэтому клиент не знал, какой тип данных он получает. + +Вы можете создать пользовательский подкласс `StreamingResponse`, который устанавливает HTTP-заголовок `Content-Type` в тип данных, которые вы стримите. + +Например, вы можете создать `PNGStreamingResponse`, который устанавливает HTTP-заголовок `Content-Type` в `image/png` с помощью атрибута `media_type`: + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *} + +Затем вы можете использовать этот новый класс в `response_class=PNGStreamingResponse` в своей *функции-обработчике пути*: + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *} + +### Симулировать файл { #simulate-a-file } + +В этом примере мы симулируем файл с помощью `io.BytesIO` — это «файлоподобный» объект, который существует только в памяти, но позволяет использовать тот же интерфейс. + +Например, мы можем итерироваться по нему, чтобы потреблять его содержимое, как и по обычному файлу. + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[1:27] hl[3,12:13,25] *} + +/// note | Технические детали + +Две другие переменные, `image_base64` и `binary_image`, — это изображение, закодированное в Base64, а затем преобразованное в байты, после чего переданное в `io.BytesIO`. + +Только для того, чтобы всё помещалось в одном файле для этого примера, и вы могли скопировать код и запустить его как есть. 🥚 + +/// + +Используя блок `with`, мы гарантируем, что объект, ведущий себя как файл, будет закрыт после завершения работы функции‑генератора (функции с `yield`). То есть после того, как она закончит отправку ответа. + +В этом конкретном примере это не столь важно, потому что это «фейковый» файл в памяти (`io.BytesIO`), но для реального файла важно удостовериться, что файл закрыт после завершения работы с ним. + +### Файлы и async { #files-and-async } + +В большинстве случаев «файлоподобные» объекты по умолчанию не совместимы с async и await. + +Например, у них нет `await file.read()` или `async for chunk in file`. + +И во многих случаях чтение таких объектов будет блокирующей операцией (которая может заблокировать цикл событий), потому что данные читаются с диска или из сети. + +/// info | Информация + +Приведённый выше пример — исключение, потому что объект `io.BytesIO` уже находится в памяти, поэтому чтение ничего не блокирует. + +Но во многих случаях чтение файла или «файлоподобного» объекта будет блокировать. + +/// + +Чтобы не блокировать цикл событий, вы можете просто объявить *функцию-обработчик пути* обычной `def` вместо `async def`. Тогда FastAPI выполнит её в воркере из пула потоков (threadpool), чтобы не блокировать основной цикл. + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *} + +/// tip | Совет + +Если вам нужно вызвать блокирующий код изнутри async-функции, или async-функцию изнутри блокирующей функции, вы можете использовать [Asyncer](https://asyncer.tiangolo.com), родственную библиотеку к FastAPI. + +/// + +### `yield from` { #yield-from } + +Когда вы итерируетесь по чему‑то, например, по «файлоподобному» объекту, и делаете `yield` для каждого элемента, вы можете также использовать `yield from`, чтобы отдавать каждый элемент напрямую и не писать цикл `for`. + +Это не специфично для FastAPI, это просто Python, но полезный приём. 😎 + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[37:40] hl[40] *} diff --git a/docs/ru/docs/advanced/strict-content-type.md b/docs/ru/docs/advanced/strict-content-type.md new file mode 100644 index 0000000000..1a0cbbc31d --- /dev/null +++ b/docs/ru/docs/advanced/strict-content-type.md @@ -0,0 +1,88 @@ +# Строгая проверка HTTP-заголовка Content-Type { #strict-content-type-checking } + +По умолчанию **FastAPI** использует строгую проверку HTTP-заголовка `Content-Type` для JSON-тел запросов. Это означает, что JSON-запросы должны включать корректный заголовок `Content-Type` (например, `application/json`), чтобы тело запроса было обработано как JSON. + +## Риск CSRF { #csrf-risk } + +Такое поведение по умолчанию обеспечивает защиту от класса атак **Cross-Site Request Forgery (CSRF)** в очень специфическом сценарии. + +Эти атаки используют то, что браузеры позволяют скриптам отправлять запросы без выполнения CORS preflight, когда они: + +- не имеют заголовка `Content-Type` (например, при использовании `fetch()` с телом `Blob`) +- и не отправляют никаких учетных данных аутентификации. + +Этот тип атак в основном актуален, когда: + +- приложение запускается локально (например, на `localhost`) или во внутренней сети +- и в приложении нет аутентификации, оно предполагает, что любому запросу из той же сети можно доверять. + +## Пример атаки { #example-attack } + +Представьте, что вы сделали способ запускать локального ИИ-агента. + +Он предоставляет API по адресу + +``` +http://localhost:8000/v1/agents/multivac +``` + +Есть также фронтенд по адресу + +``` +http://localhost:8000 +``` + +/// tip | Совет + +Обратите внимание, что у обоих один и тот же хост. + +/// + +Через фронтенд вы можете заставлять ИИ-агента выполнять действия от вашего имени. + +Так как он работает локально и не в открытом интернете, вы решаете не настраивать аутентификацию, полагаясь на доступ к локальной сети. + +Затем один из ваших пользователей может установить это и запускать локально. + +Потом он может открыть вредоносный сайт, например что-то вроде + +``` +https://evilhackers.example.com +``` + +И этот вредоносный сайт отправит запросы с помощью `fetch()` с телом `Blob` к локальному API по адресу + +``` +http://localhost:8000/v1/agents/multivac +``` + +Несмотря на то, что хост вредоносного сайта и локального приложения различается, браузер не запустит CORS preflight-запрос, потому что: + +- Приложение работает без аутентификации, ему не нужно отправлять какие-либо учетные данные. +- Браузер «считает», что он не отправляет JSON (из-за отсутствия заголовка `Content-Type`). + +В итоге вредоносный сайт может заставить локального ИИ-агента отправить злые сообщения бывшему начальнику пользователя... или что-то похуже. 😅 + +## Открытый интернет { #open-internet } + +Если ваше приложение доступно в открытом интернете, вы не будете «доверять сети» и позволять кому угодно отправлять привилегированные запросы без аутентификации. + +Злоумышленники могут просто запустить скрипт и слать запросы к вашему API, без участия браузера, так что вы, вероятно, уже защищаете любые привилегированные эндпоинты. + +В этом случае эта атака/риск на вас не распространяется. + +Этот риск и атака в основном актуальны, когда приложение работает в локальной сети и это единственная предполагаемая защита. + +## Разрешение запросов без Content-Type { #allowing-requests-without-content-type } + +Если вам нужно поддерживать клиентов, которые не отправляют заголовок `Content-Type`, вы можете отключить строгую проверку, установив `strict_content_type=False`: + +{* ../../docs_src/strict_content_type/tutorial001_py310.py hl[4] *} + +С этой настройкой запросы без заголовка `Content-Type` будут иметь тело запроса, обработанное как JSON — это такое же поведение, как в более старых версиях FastAPI. + +/// info | Информация + +Это поведение и настройка были добавлены в FastAPI 0.132.0. + +/// diff --git a/docs/ru/docs/advanced/sub-applications.md b/docs/ru/docs/advanced/sub-applications.md index 4fd5649ce3..37257e0f3b 100644 --- a/docs/ru/docs/advanced/sub-applications.md +++ b/docs/ru/docs/advanced/sub-applications.md @@ -30,25 +30,25 @@ ### Проверьте автоматическую документацию API { #check-the-automatic-api-docs } -Теперь запустите команду `fastapi` с вашим файлом: +Теперь запустите команду `fastapi`:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-И откройте документацию по адресу http://127.0.0.1:8000/docs. +И откройте документацию по адресу [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Вы увидите автоматическую документацию API для основного приложения, включающую только его собственные _операции пути_: -Затем откройте документацию для подприложения по адресу http://127.0.0.1:8000/subapi/docs. +Затем откройте документацию для подприложения по адресу [http://127.0.0.1:8000/subapi/docs](http://127.0.0.1:8000/subapi/docs). Вы увидите автоматическую документацию API для подприложения, включающую только его собственные _операции пути_, все под корректным префиксом подпути `/subapi`: @@ -64,4 +64,4 @@ $ fastapi dev main.py У подприложения также могут быть свои собственные смонтированные подприложения, и всё будет работать корректно, потому что FastAPI автоматически обрабатывает все эти `root_path`. -Вы узнаете больше о `root_path` и о том, как использовать его явно, в разделе [За прокси](behind-a-proxy.md){.internal-link target=_blank}. +Вы узнаете больше о `root_path` и о том, как использовать его явно, в разделе [За прокси](behind-a-proxy.md). diff --git a/docs/ru/docs/advanced/templates.md b/docs/ru/docs/advanced/templates.md index 68adcb5151..5fc938eec2 100644 --- a/docs/ru/docs/advanced/templates.md +++ b/docs/ru/docs/advanced/templates.md @@ -8,7 +8,7 @@ ## Установка зависимостей { #install-dependencies } -Убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md){.internal-link target=_blank}, активировали его и установили `jinja2`: +Убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md), активировали его и установили `jinja2`:
@@ -123,4 +123,4 @@ Item ID: 42 ## Подробнее { #more-details } -Больше подробностей, включая то, как тестировать шаблоны, смотрите в документации Starlette по шаблонам. +Больше подробностей, включая то, как тестировать шаблоны, смотрите в [документации Starlette по шаблонам](https://www.starlette.dev/templates/). diff --git a/docs/ru/docs/advanced/testing-websockets.md b/docs/ru/docs/advanced/testing-websockets.md index f6fa6a04be..6ab395f8f4 100644 --- a/docs/ru/docs/advanced/testing-websockets.md +++ b/docs/ru/docs/advanced/testing-websockets.md @@ -8,6 +8,6 @@ /// note | Примечание -Подробности смотрите в документации Starlette по тестированию WebSocket. +Подробности смотрите в документации Starlette по [тестированию WebSocket](https://www.starlette.dev/testclient/#testing-websocket-sessions). /// diff --git a/docs/ru/docs/advanced/using-request-directly.md b/docs/ru/docs/advanced/using-request-directly.md index 0c091cdeda..99074bf7b6 100644 --- a/docs/ru/docs/advanced/using-request-directly.md +++ b/docs/ru/docs/advanced/using-request-directly.md @@ -15,7 +15,7 @@ ## Подробности об объекте `Request` { #details-about-the-request-object } -Так как под капотом **FastAPI** — это **Starlette** с дополнительным слоем инструментов, вы можете при необходимости напрямую использовать объект `Request` из Starlette. +Так как под капотом **FastAPI** — это **Starlette** с дополнительным слоем инструментов, вы можете при необходимости напрямую использовать объект [`Request`](https://www.starlette.dev/requests/) из Starlette. Это также означает, что если вы получаете данные напрямую из объекта `Request` (например, читаете тело запроса), то они не будут валидироваться, конвертироваться или документироваться (с OpenAPI, для автоматического пользовательского интерфейса API) средствами FastAPI. @@ -45,7 +45,7 @@ ## Документация по `Request` { #request-documentation } -Подробнее об объекте `Request` на официальном сайте документации Starlette. +Подробнее об [объекте `Request` на официальном сайте документации Starlette](https://www.starlette.dev/requests/). /// note | Технические детали diff --git a/docs/ru/docs/advanced/websockets.md b/docs/ru/docs/advanced/websockets.md index d565d507bc..abfd789a48 100644 --- a/docs/ru/docs/advanced/websockets.md +++ b/docs/ru/docs/advanced/websockets.md @@ -1,10 +1,10 @@ # Веб-сокеты { #websockets } -Вы можете использовать веб-сокеты в **FastAPI**. +Вы можете использовать [веб-сокеты](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) в **FastAPI**. ## Установка `websockets` { #install-websockets } -Убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md){.internal-link target=_blank}, активировали его и установили `websockets` (библиотека Python, упрощающая работу с протоколом "WebSocket"): +Убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md), активировали его и установили `websockets` (библиотека Python, упрощающая работу с протоколом "WebSocket"):
@@ -64,19 +64,19 @@ $ pip install websockets ## Проверка в действии { #try-it } -Если ваш файл называется `main.py`, то запустите приложение командой: +Поместите ваш код в файл `main.py`, затем запустите приложение:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Откройте браузер по адресу http://127.0.0.1:8000. +Откройте браузер по адресу [http://127.0.0.1:8000](http://127.0.0.1:8000). Вы увидите следующую простенькую страницу: @@ -115,25 +115,25 @@ $ fastapi dev main.py В веб-сокете вызывать `HTTPException` не имеет смысла. Вместо этого нужно использовать `WebSocketException`. -Закрывающий статус код можно использовать из valid codes defined in the specification. +Вы можете использовать код закрытия из [допустимых кодов, определённых в спецификации](https://tools.ietf.org/html/rfc6455#section-7.4.1). /// ### Веб-сокеты с зависимостями: проверка в действии { #try-the-websockets-with-dependencies } -Если ваш файл называется `main.py`, то запустите приложение командой: +Запустите приложение:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Откройте браузер по адресу http://127.0.0.1:8000. +Откройте браузер по адресу [http://127.0.0.1:8000](http://127.0.0.1:8000). Там вы можете задать: @@ -152,7 +152,7 @@ $ fastapi dev main.py ## Обработка отключений и работа с несколькими клиентами { #handling-disconnections-and-multiple-clients } -Если веб-сокет соединение закрыто, то `await websocket.receive_text()` вызовет исключение `WebSocketDisconnect`, которое можно поймать и обработать как в этом примере: +Если веб-сокет соединение закрыто, то `await websocket.receive_text()` вызовет исключение `WebSocketDisconnect`, которое можно поймать и обработать как в этом примере. {* ../../docs_src/websockets_/tutorial003_py310.py hl[79:81] *} @@ -174,7 +174,7 @@ Client #1596980209979 left the chat Но имейте в виду, что это будет работать только в одном процессе и только пока он активен, так как всё обрабатывается в простом списке в оперативной памяти. -Если нужно что-то легко интегрируемое с FastAPI, но более надежное и с поддержкой Redis, PostgreSQL или другого, то можно воспользоваться encode/broadcaster. +Если нужно что-то легко интегрируемое с FastAPI, но более надежное и с поддержкой Redis, PostgreSQL или другого, то можно воспользоваться [encode/broadcaster](https://github.com/encode/broadcaster). /// @@ -182,5 +182,5 @@ Client #1596980209979 left the chat Для более глубокого изучения темы воспользуйтесь документацией Starlette: -* The `WebSocket` class. -* Class-based WebSocket handling. +* [Класс `WebSocket`](https://www.starlette.dev/websockets/). +* [Обработка WebSocket на основе классов](https://www.starlette.dev/endpoints/#websocketendpoint). diff --git a/docs/ru/docs/advanced/wsgi.md b/docs/ru/docs/advanced/wsgi.md index aa630c228e..3ed85d0e95 100644 --- a/docs/ru/docs/advanced/wsgi.md +++ b/docs/ru/docs/advanced/wsgi.md @@ -1,6 +1,6 @@ # Подключение WSGI — Flask, Django и другие { #including-wsgi-flask-django-others } -Вы можете монтировать WSGI‑приложения, как вы видели в [Подприложения — Mounts](sub-applications.md){.internal-link target=_blank}, [За прокси‑сервером](behind-a-proxy.md){.internal-link target=_blank}. +Вы можете монтировать WSGI‑приложения, как вы видели в [Подприложения — Mounts](sub-applications.md), [За прокси‑сервером](behind-a-proxy.md). Для этого вы можете использовать `WSGIMiddleware` и обернуть им ваше WSGI‑приложение, например Flask, Django и т.д. @@ -36,13 +36,13 @@ А всё остальное будет обрабатываться **FastAPI**. -Если вы запустите это и перейдёте по http://localhost:8000/v1/, вы увидите HTTP‑ответ от Flask: +Если вы запустите это и перейдёте по [http://localhost:8000/v1/](http://localhost:8000/v1/), вы увидите HTTP‑ответ от Flask: ```txt Hello, World from Flask! ``` -А если вы перейдёте по http://localhost:8000/v2, вы увидите HTTP‑ответ от FastAPI: +А если вы перейдёте по [http://localhost:8000/v2](http://localhost:8000/v2), вы увидите HTTP‑ответ от FastAPI: ```JSON { diff --git a/docs/ru/docs/alternatives.md b/docs/ru/docs/alternatives.md index 1f713c3f39..13bac7f92b 100644 --- a/docs/ru/docs/alternatives.md +++ b/docs/ru/docs/alternatives.md @@ -14,7 +14,7 @@ ## Предшествующие инструменты { #previous-tools } -### Django { #django } +### [Django](https://www.djangoproject.com/) { #django } Это самый популярный Python-фреймворк, ему широко доверяют. Он используется для построения систем вроде Instagram. @@ -22,7 +22,7 @@ Он был создан для генерации HTML на бэкенде, а не для создания API, используемых современным фронтендом (например, React, Vue.js и Angular) или другими системами (например, устройствами IoT), которые с ним общаются. -### Django REST Framework { #django-rest-framework } +### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework } Django REST Framework был создан как гибкий набор инструментов для построения веб-API поверх Django, чтобы улучшить его возможности в части API. @@ -42,7 +42,7 @@ Django REST Framework был создан Томом Кристи. Он же с /// -### Flask { #flask } +### [Flask](https://flask.palletsprojects.com) { #flask } Flask — это «микрофреймворк», он не включает интеграции с базами данных и многие другие вещи, которые в Django идут «из коробки». @@ -64,7 +64,7 @@ Flask — это «микрофреймворк», он не включает и /// -### Requests { #requests } +### [Requests](https://requests.readthedocs.io) { #requests } **FastAPI** на самом деле не альтернатива **Requests**. Их области применения очень различны. @@ -106,7 +106,7 @@ def read_url(): /// -### Swagger / OpenAPI { #swagger-openapi } +### [Swagger](https://swagger.io/) / [OpenAPI](https://github.com/OAI/OpenAPI-Specification/) { #swagger-openapi } Главной возможностью, которую хотелось взять из Django REST Framework, была автоматическая документация API. @@ -124,8 +124,8 @@ def read_url(): И интегрировать основанные на стандартах инструменты пользовательского интерфейса: -* Swagger UI -* ReDoc +* [Swagger UI](https://github.com/swagger-api/swagger-ui) +* [ReDoc](https://github.com/Rebilly/ReDoc) Эти два инструмента выбраны за популярность и стабильность, но даже при беглом поиске можно найти десятки альтернативных интерфейсов для OpenAPI (которые можно использовать с **FastAPI**). @@ -135,7 +135,7 @@ def read_url(): Существует несколько REST-фреймворков для Flask, но, вложив время и усилия в исследование, я обнаружил, что многие из них прекращены или заброшены, с несколькими нерешёнными Issue (тикет\обращение), из-за которых они непригодны. -### Marshmallow { #marshmallow } +### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow } Одна из основных возможностей, нужных системам API, — «сериализация» данных, то есть преобразование данных из кода (Python) во что-то, что можно отправить по сети. Например, преобразование объекта с данными из базы в JSON-объект. Преобразование объектов `datetime` в строки и т. п. @@ -153,7 +153,7 @@ def read_url(): /// -### Webargs { #webargs } +### [Webargs](https://webargs.readthedocs.io/en/latest/) { #webargs } Ещё одна важная возможность для API — парсинг данных из входящих HTTP-запросов. @@ -175,7 +175,7 @@ Webargs был создан теми же разработчиками, что /// -### APISpec { #apispec } +### [APISpec](https://apispec.readthedocs.io/en/stable/) { #apispec } Marshmallow и Webargs предоставляют валидацию, парсинг и сериализацию как плагины. @@ -205,7 +205,7 @@ APISpec был создан теми же разработчиками, что /// -### Flask-apispec { #flask-apispec } +### [Flask-apispec](https://flask-apispec.readthedocs.io/en/latest/) { #flask-apispec } Это плагин для Flask, который связывает Webargs, Marshmallow и APISpec. @@ -219,11 +219,11 @@ APISpec был создан теми же разработчиками, что Его использование привело к созданию нескольких full-stack генераторов на Flask. Это основные стеки, которые я (и несколько внешних команд) использовали до сих пор: -* https://github.com/tiangolo/full-stack -* https://github.com/tiangolo/full-stack-flask-couchbase -* https://github.com/tiangolo/full-stack-flask-couchdb +* [https://github.com/tiangolo/full-stack](https://github.com/tiangolo/full-stack) +* [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) -И эти же full-stack генераторы стали основой для [Генераторов проектов **FastAPI**](project-generation.md){.internal-link target=_blank}. +И эти же full-stack генераторы стали основой для [Генераторов проектов **FastAPI**](project-generation.md). /// info | Информация @@ -237,7 +237,7 @@ Flask-apispec был создан теми же разработчиками, ч /// -### NestJSAngular) { #nestjs-and-angular } +### [NestJS](https://nestjs.com/) (и [Angular](https://angular.io/)) { #nestjs-and-angular } Это даже не Python. NestJS — это JavaScript/TypeScript-фреймворк на NodeJS, вдохновлённый Angular. @@ -259,13 +259,13 @@ Flask-apispec был создан теми же разработчиками, ч /// -### Sanic { #sanic } +### [Sanic](https://sanic.readthedocs.io/en/latest/) { #sanic } Это был один из первых чрезвычайно быстрых Python-фреймворков на основе `asyncio`. Он был сделан очень похожим на Flask. /// note | Технические детали -Он использовал `uvloop` вместо стандартного цикла `asyncio` в Python. Это и сделало его таким быстрым. +Он использовал [`uvloop`](https://github.com/MagicStack/uvloop) вместо стандартного цикла `asyncio` в Python. Это и сделало его таким быстрым. Он явно вдохновил Uvicorn и Starlette, которые сейчас быстрее Sanic в открытых бенчмарках. @@ -279,7 +279,7 @@ Flask-apispec был создан теми же разработчиками, ч /// -### Falcon { #falcon } +### [Falcon](https://falconframework.org/) { #falcon } Falcon — ещё один высокопроизводительный Python-фреймворк, он минималистичен и служит основой для других фреймворков, таких как Hug. @@ -297,7 +297,7 @@ Falcon — ещё один высокопроизводительный Python- /// -### Molten { #molten } +### [Molten](https://moltenframework.com/) { #molten } Я обнаружил Molten на ранних этапах создания **FastAPI**. И у него были очень похожие идеи: @@ -321,7 +321,7 @@ Falcon — ещё один высокопроизводительный Python- /// -### Hug { #hug } +### [Hug](https://github.com/hugapi/hug) { #hug } Hug был одним из первых фреймворков, реализовавших объявление типов параметров API с использованием аннотаций типов Python. Это была отличная идея, которая вдохновила и другие инструменты. @@ -337,7 +337,7 @@ Hug был одним из первых фреймворков, реализов /// info | Информация -Hug был создан Тимоти Кросли, тем же автором `isort`, отличного инструмента для автоматической сортировки импортов в файлах Python. +Hug был создан Тимоти Кросли, тем же автором [`isort`](https://github.com/timothycrosley/isort), отличного инструмента для автоматической сортировки импортов в файлах Python. /// @@ -351,7 +351,7 @@ Hug вдохновил **FastAPI** объявлять параметр `response /// -### APIStar (<= 0.5) { #apistar-0-5 } +### [APIStar](https://github.com/encode/apistar) (<= 0.5) { #apistar-0-5 } Прямо перед решением строить **FastAPI** я нашёл сервер **APIStar**. В нём было почти всё, что я искал, и отличный дизайн. @@ -401,7 +401,7 @@ APIStar был создан Томом Кристи. Тем самым чело ## Что используется в **FastAPI** { #used-by-fastapi } -### Pydantic { #pydantic } +### [Pydantic](https://docs.pydantic.dev/) { #pydantic } Pydantic — это библиотека для определения валидации данных, сериализации и документации (с использованием JSON Schema) на основе аннотаций типов Python. @@ -417,7 +417,7 @@ Pydantic — это библиотека для определения вали /// -### Starlette { #starlette } +### [Starlette](https://www.starlette.dev/) { #starlette } Starlette — это лёгкий ASGI фреймворк/набор инструментов, идеально подходящий для создания высокопроизводительных asyncio‑сервисов. @@ -462,7 +462,7 @@ ASGI — это новый «стандарт», разрабатываемый /// -### Uvicorn { #uvicorn } +### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn } Uvicorn — молниеносный ASGI-сервер, построенный на uvloop и httptools. @@ -476,10 +476,10 @@ Uvicorn — молниеносный ASGI-сервер, построенный Также вы можете использовать опцию командной строки `--workers`, чтобы получить асинхронный многопроцессный сервер. -Подробнее см. раздел [Развёртывание](deployment/index.md){.internal-link target=_blank}. +Подробнее см. раздел [Развёртывание](deployment/index.md). /// ## Бенчмарки и скорость { #benchmarks-and-speed } -Чтобы понять, сравнить и увидеть разницу между Uvicorn, Starlette и FastAPI, см. раздел о [Бенчмарках](benchmarks.md){.internal-link target=_blank}. +Чтобы понять, сравнить и увидеть разницу между Uvicorn, Starlette и FastAPI, см. раздел о [Бенчмарках](benchmarks.md). diff --git a/docs/ru/docs/async.md b/docs/ru/docs/async.md index bff32aaf49..7fd702184c 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 всё равно работает асинхронно и очень быстро. @@ -141,7 +141,7 @@ def results(): /// info | Информация -Прекрасные иллюстрации от Ketrina Thompson. 🎨 +Прекрасные иллюстрации от [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨 /// @@ -207,7 +207,7 @@ def results(): /// info | Информация -Прекрасные иллюстрации от Ketrina Thompson. 🎨 +Прекрасные иллюстрации от [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨 /// @@ -251,7 +251,7 @@ def results(): Того же уровня производительности вы получаете с **FastAPI**. -А так как можно одновременно использовать параллелизм и асинхронность, вы получаете производительность выше, чем у большинства протестированных фреймворков на NodeJS и на уровне Go, который — компилируемый язык, ближе к C (всё благодаря Starlette). +А так как можно одновременно использовать параллелизм и асинхронность, вы получаете производительность выше, чем у большинства протестированных фреймворков на NodeJS и на уровне Go, который — компилируемый язык, ближе к C [(всё благодаря Starlette)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1). ### Конкурентность лучше параллелизма? { #is-concurrency-better-than-parallelism } @@ -298,7 +298,7 @@ def results(): Плюс к этому простой факт, что Python — основной язык для **Data Science**, Машинного обучения и особенно Глубокого обучения, делает FastAPI очень хорошим выбором для веб-API и приложений в области Data Science / Машинного обучения (среди многих других). -Как добиться такого параллелизма в продакшн, см. раздел [Развёртывание](deployment/index.md){.internal-link target=_blank}. +Как добиться такого параллелизма в продакшн, см. раздел [Развёртывание](deployment/index.md). ## `async` и `await` { #async-and-await } @@ -363,13 +363,13 @@ async def read_burgers(): ### Пишите свой асинхронный код { #write-your-own-async-code } -Starlette (и **FastAPI**) основаны на AnyIO, что делает их совместимыми и со стандартной библиотекой Python asyncio, и с Trio. +Starlette (и **FastAPI**) основаны на [AnyIO](https://anyio.readthedocs.io/en/stable/), что делает их совместимыми и со стандартной библиотекой Python [asyncio](https://docs.python.org/3/library/asyncio-task.html), и с [Trio](https://trio.readthedocs.io/en/stable/). -В частности, вы можете напрямую использовать AnyIO для продвинутых сценариев конкурентности, где в вашем коде нужны более сложные паттерны. +В частности, вы можете напрямую использовать [AnyIO](https://anyio.readthedocs.io/en/stable/) для продвинутых сценариев конкурентности, где в вашем коде нужны более сложные паттерны. -И даже если вы не используете FastAPI, вы можете писать свои асинхронные приложения с AnyIO, чтобы они были максимально совместимыми и получали его преимущества (например, *структурную конкурентность*). +И даже если вы не используете FastAPI, вы можете писать свои асинхронные приложения с [AnyIO](https://anyio.readthedocs.io/en/stable/), чтобы они были максимально совместимыми и получали его преимущества (например, *структурную конкурентность*). -Я создал ещё одну библиотеку поверх AnyIO, тонкий слой, чтобы немного улучшить аннотации типов и получить более качественное **автозавершение**, **ошибки прямо в редакторе** и т.д. Там также есть дружелюбное введение и руководство, чтобы помочь вам **понять** и писать **свой собственный асинхронный код**: Asyncer. Она особенно полезна, если вам нужно **комбинировать асинхронный код с обычным** (блокирующим/синхронным) кодом. +Я создал ещё одну библиотеку поверх AnyIO, тонкий слой, чтобы немного улучшить аннотации типов и получить более качественное **автозавершение**, **ошибки прямо в редакторе** и т.д. Там также есть дружелюбное введение и руководство, чтобы помочь вам **понять** и писать **свой собственный асинхронный код**: [Asyncer](https://asyncer.tiangolo.com/). Она особенно полезна, если вам нужно **комбинировать асинхронный код с обычным** (блокирующим/синхронным) кодом. ### Другие формы асинхронного кода { #other-forms-of-asynchronous-code } @@ -381,7 +381,7 @@ Starlette (и **FastAPI**) основаны на Gevent. Но такой код гораздо сложнее понимать, отлаживать и держать в голове. +В предыдущих версиях Python можно было использовать потоки или [Gevent](https://www.gevent.org/). Но такой код гораздо сложнее понимать, отлаживать и держать в голове. В прежних версиях NodeJS/браузерного JavaScript вы бы использовали «callbacks» (обратные вызовы), что приводит к «callback hell» (ад обратных вызовов). @@ -419,15 +419,15 @@ Starlette (и **FastAPI**) основаны на I/O. -Тем не менее, в обоих случаях велика вероятность, что **FastAPI** [всё равно будет быстрее](index.md#performance){.internal-link target=_blank} (или как минимум сопоставим) с вашим предыдущим фреймворком. +Тем не менее, в обоих случаях велика вероятность, что **FastAPI** [всё равно будет быстрее](index.md#performance) (или как минимум сопоставим) с вашим предыдущим фреймворком. ### Зависимости { #dependencies } -То же относится к [зависимостям](tutorial/dependencies/index.md){.internal-link target=_blank}. Если зависимость — это обычная функция `def`, а не `async def`, она запускается во внешнем пуле потоков. +То же относится к [зависимостям](tutorial/dependencies/index.md). Если зависимость — это обычная функция `def`, а не `async def`, она запускается во внешнем пуле потоков. ### Подзависимости { #sub-dependencies } -У вас может быть несколько зависимостей и [подзависимостей](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank}, которые требуют друг друга (в виде параметров определений функций): часть из них может быть объявлена с `async def`, а часть — обычным `def`. Всё будет работать, а те, что объявлены обычным `def`, будут вызываться во внешнем потоке (из пула), а не «ожидаться». +У вас может быть несколько зависимостей и [подзависимостей](tutorial/dependencies/sub-dependencies.md), которые требуют друг друга (в виде параметров определений функций): часть из них может быть объявлена с `async def`, а часть — обычным `def`. Всё будет работать, а те, что объявлены обычным `def`, будут вызываться во внешнем потоке (из пула), а не «ожидаться». ### Другие служебные функции { #other-utility-functions } diff --git a/docs/ru/docs/benchmarks.md b/docs/ru/docs/benchmarks.md index c8cacae5f3..671baba76c 100644 --- a/docs/ru/docs/benchmarks.md +++ b/docs/ru/docs/benchmarks.md @@ -1,6 +1,6 @@ # Бенчмарки (тесты производительности) { #benchmarks } -Независимые бенчмарки TechEmpower показывают, что приложения **FastAPI** под управлением Uvicorn — одни из самых быстрых Python‑фреймворков, уступающие только Starlette и самому Uvicorn (используются внутри FastAPI). +Независимые бенчмарки TechEmpower показывают, что приложения **FastAPI** под управлением Uvicorn — [одни из самых быстрых Python‑фреймворков](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), уступающие только Starlette и самому Uvicorn (используются внутри FastAPI). Но при просмотре бенчмарков и сравнений следует иметь в виду следующее. diff --git a/docs/ru/docs/deployment/cloud.md b/docs/ru/docs/deployment/cloud.md index 955db2a157..cbd517e36e 100644 --- a/docs/ru/docs/deployment/cloud.md +++ b/docs/ru/docs/deployment/cloud.md @@ -6,7 +6,7 @@ ## FastAPI Cloud { #fastapi-cloud } -**FastAPI Cloud** создан тем же автором и командой, стоящими за **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** создан тем же автором и командой, стоящими за **FastAPI**. Он упрощает процесс **создания образа**, **развертывания** и **доступа** к API с минимальными усилиями. @@ -16,9 +16,9 @@ FastAPI Cloud — основной спонсор и источник финан ## Облачные провайдеры — спонсоры { #cloud-providers-sponsors } -Некоторые другие облачные провайдеры ✨ [**спонсируют FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨ тоже. 🙇 +Некоторые другие облачные провайдеры ✨ [**спонсируют FastAPI**](../help-fastapi.md#sponsor-the-author) ✨ тоже. 🙇 Возможно, вы захотите попробовать их сервисы и воспользоваться их руководствами: -* Render -* Railway +* [Render](https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi) +* [Railway](https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi) diff --git a/docs/ru/docs/deployment/concepts.md b/docs/ru/docs/deployment/concepts.md index 173dbb962d..900b842f9a 100644 --- a/docs/ru/docs/deployment/concepts.md +++ b/docs/ru/docs/deployment/concepts.md @@ -25,7 +25,7 @@ ## Безопасность — HTTPS { #security-https } -В [предыдущей главе про HTTPS](https.md){.internal-link target=_blank} мы разобрались, как HTTPS обеспечивает шифрование для вашего API. +В [предыдущей главе про HTTPS](https.md) мы разобрались, как HTTPS обеспечивает шифрование для вашего API. Также мы увидели, что HTTPS обычно обеспечивает компонент, **внешний** по отношению к серверу вашего приложения — **прокси-сервер TSL-терминации**. @@ -190,7 +190,7 @@ ### Процессы‑воркеры и порты { #worker-processes-and-ports } -Помните из раздела [Об HTTPS](https.md){.internal-link target=_blank}, что на сервере только один процесс может слушать конкретную комбинацию порта и IP‑адреса? +Помните из раздела [Об HTTPS](https.md), что на сервере только один процесс может слушать конкретную комбинацию порта и IP‑адреса? Это по‑прежнему так. @@ -243,7 +243,7 @@ Не беспокойтесь, если некоторые пункты про **контейнеры**, Docker или Kubernetes пока кажутся неочевидными. -Я расскажу больше про образы контейнеров, Docker, Kubernetes и т.п. в следующей главе: [FastAPI внутри контейнеров — Docker](docker.md){.internal-link target=_blank}. +Я расскажу больше про образы контейнеров, Docker, Kubernetes и т.п. в следующей главе: [FastAPI внутри контейнеров — Docker](docker.md). /// @@ -281,7 +281,7 @@ /// tip | Совет -Я приведу более конкретные примеры с контейнерами в следующей главе: [FastAPI внутри контейнеров — Docker](docker.md){.internal-link target=_blank}. +Я приведу более конкретные примеры с контейнерами в следующей главе: [FastAPI внутри контейнеров — Docker](docker.md). /// diff --git a/docs/ru/docs/deployment/docker.md b/docs/ru/docs/deployment/docker.md index 5dfa211599..3b16d7798b 100644 --- a/docs/ru/docs/deployment/docker.md +++ b/docs/ru/docs/deployment/docker.md @@ -1,6 +1,6 @@ # FastAPI в контейнерах — Docker { #fastapi-in-containers-docker } -При развёртывании приложений FastAPI распространённый подход — собирать **образ контейнера на Linux**. Обычно это делают с помощью **Docker**. Затем такой образ контейнера можно развернуть несколькими способами. +При развёртывании приложений FastAPI распространённый подход — собирать **образ контейнера на Linux**. Обычно это делают с помощью [**Docker**](https://www.docker.com/). Затем такой образ контейнера можно развернуть несколькими способами. Использование Linux-контейнеров даёт ряд преимуществ: **безопасность**, **воспроизводимость**, **простоту** и другие. @@ -60,16 +60,16 @@ Linux-контейнеры запускаются, используя то же Docker — один из основных инструментов для создания и управления **образами контейнеров** и **контейнерами**. -Существует публичный Docker Hub с готовыми **официальными образами** для многих инструментов, окружений, баз данных и приложений. +Существует публичный [Docker Hub](https://hub.docker.com/) с готовыми **официальными образами** для многих инструментов, окружений, баз данных и приложений. -Например, есть официальный образ Python. +Например, есть официальный [образ Python](https://hub.docker.com/_/python). А также множество образов для разных вещей, например баз данных: -* PostgreSQL -* MySQL -* MongoDB -* Redis, и т.д. +* [PostgreSQL](https://hub.docker.com/_/postgres) +* [MySQL](https://hub.docker.com/_/mysql) +* [MongoDB](https://hub.docker.com/_/mongo) +* [Redis](https://hub.docker.com/_/redis), и т.д. Используя готовые образы, очень легко **комбинировать** разные инструменты и использовать их. Например, чтобы попробовать новую базу данных. В большинстве случаев можно воспользоваться **официальными образами** и просто настроить их через переменные окружения. @@ -111,7 +111,7 @@ Docker — один из основных инструментов для соз Чаще всего используется файл `requirements.txt` с именами пакетов и их версиями по одному на строку. -Разумеется, вы будете придерживаться тех же идей, что описаны здесь: [О версиях FastAPI](versions.md){.internal-link target=_blank}, чтобы задать диапазоны версий. +Разумеется, вы будете придерживаться тех же идей, что описаны здесь: [О версиях FastAPI](versions.md), чтобы задать диапазоны версий. Например, ваш `requirements.txt` может выглядеть так: @@ -238,7 +238,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] #### Используйте `CMD` — exec-форма { #use-cmd-exec-form } -Инструкцию Docker `CMD` можно писать в двух формах: +Инструкцию Docker [`CMD`](https://docs.docker.com/reference/dockerfile/#cmd) можно писать в двух формах: ✅ **Exec**-форма: @@ -254,11 +254,11 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] CMD fastapi run app/main.py --port 80 ``` -Обязательно используйте **exec**-форму, чтобы FastAPI мог корректно завершаться и чтобы срабатывали [события lifespan](../advanced/events.md){.internal-link target=_blank}. +Обязательно используйте **exec**-форму, чтобы FastAPI мог корректно завершаться и чтобы срабатывали [события lifespan](../advanced/events.md). -Подробнее об этом читайте в документации Docker о shell- и exec-формах. +Подробнее об этом читайте в [документации Docker о shell- и exec-формах](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form). -Это особенно заметно при использовании `docker compose`. См. раздел FAQ Docker Compose с техническими подробностями: Почему мои сервисы пересоздаются или останавливаются 10 секунд?. +Это особенно заметно при использовании `docker compose`. См. раздел FAQ Docker Compose с техническими подробностями: [Почему мои сервисы пересоздаются или останавливаются 10 секунд?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop). #### Структура директорий { #directory-structure } @@ -352,7 +352,7 @@ $ docker run -d --name mycontainer -p 80:80 myimage ## Проверка { #check-it } -Проверьте работу по адресу вашего Docker-хоста, например: http://192.168.99.100/items/5?q=somequery или http://127.0.0.1/items/5?q=somequery (или аналогичный URL вашего Docker-хоста). +Проверьте работу по адресу вашего Docker-хоста, например: [http://192.168.99.100/items/5?q=somequery](http://192.168.99.100/items/5?q=somequery) или [http://127.0.0.1/items/5?q=somequery](http://127.0.0.1/items/5?q=somequery) (или аналогичный URL вашего Docker-хоста). Вы увидите что-то вроде: @@ -362,17 +362,17 @@ $ docker run -d --name mycontainer -p 80:80 myimage ## Интерактивная документация API { #interactive-api-docs } -Теперь зайдите на http://192.168.99.100/docs или http://127.0.0.1/docs (или аналогичный URL вашего Docker-хоста). +Теперь зайдите на [http://192.168.99.100/docs](http://192.168.99.100/docs) или [http://127.0.0.1/docs](http://127.0.0.1/docs) (или аналогичный URL вашего Docker-хоста). -Вы увидите автоматическую интерактивную документацию API (на базе Swagger UI): +Вы увидите автоматическую интерактивную документацию API (на базе [Swagger UI](https://github.com/swagger-api/swagger-ui)): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ## Альтернативная документация API { #alternative-api-docs } -Также можно открыть http://192.168.99.100/redoc или http://127.0.0.1/redoc (или аналогичный URL вашего Docker-хоста). +Также можно открыть [http://192.168.99.100/redoc](http://192.168.99.100/redoc) или [http://127.0.0.1/redoc](http://127.0.0.1/redoc) (или аналогичный URL вашего Docker-хоста). -Вы увидите альтернативную автоматическую документацию (на базе ReDoc): +Вы увидите альтернативную автоматическую документацию (на базе [ReDoc](https://github.com/Rebilly/ReDoc)): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -413,7 +413,7 @@ CMD ["fastapi", "run", "main.py", "--port", "80"] ## Концепции развертывания { #deployment-concepts } -Ещё раз рассмотрим [концепции развертывания](concepts.md){.internal-link target=_blank} применительно к контейнерам. +Ещё раз рассмотрим [концепции развертывания](concepts.md) применительно к контейнерам. Контейнеры главным образом упрощают **сборку и развёртывание** приложения, но не навязывают конкретный подход к этим **концепциям развертывания**, и существует несколько стратегий. @@ -432,7 +432,7 @@ CMD ["fastapi", "run", "main.py", "--port", "80"] Если мы рассматриваем только **образ контейнера** для приложения FastAPI (и далее запущенный **контейнер**), то HTTPS обычно обрабатывается **внешним** инструментом. -Это может быть другой контейнер, например с Traefik, который берёт на себя **HTTPS** и **автоматическое** получение **сертификатов**. +Это может быть другой контейнер, например с [Traefik](https://traefik.io/), который берёт на себя **HTTPS** и **автоматическое** получение **сертификатов**. /// tip | Подсказка @@ -558,7 +558,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] /// info | Информация -Если вы используете Kubernetes, это, вероятно, будет Init Container. +Если вы используете Kubernetes, это, вероятно, будет [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/). /// @@ -570,7 +570,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] ### Базовый Docker-образ { #base-docker-image } -Ранее существовал официальный Docker-образ FastAPI: tiangolo/uvicorn-gunicorn-fastapi. Сейчас он помечен как устаревший. ⛔️ +Ранее существовал официальный Docker-образ FastAPI: [tiangolo/uvicorn-gunicorn-fastapi](https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker). Сейчас он помечен как устаревший. ⛔️ Скорее всего, вам **не стоит** использовать этот базовый образ (или какой-либо аналогичный). @@ -600,7 +600,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] ## Docker-образ с `uv` { #docker-image-with-uv } -Если вы используете uv для установки и управления проектом, следуйте их руководству по Docker для uv. +Если вы используете [uv](https://github.com/astral-sh/uv) для установки и управления проектом, следуйте их [руководству по Docker для uv](https://docs.astral.sh/uv/guides/integration/docker/). ## Резюме { #recap } @@ -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 9e7430ecb0..95db3387f2 100644 --- a/docs/ru/docs/deployment/fastapicloud.md +++ b/docs/ru/docs/deployment/fastapicloud.md @@ -1,6 +1,6 @@ # FastAPI Cloud { #fastapi-cloud } -Вы можете развернуть своё приложение FastAPI в FastAPI Cloud одной командой, присоединяйтесь к списку ожидания, если ещё не сделали этого. 🚀 +Вы можете развернуть своё приложение FastAPI в [FastAPI Cloud](https://fastapicloud.com) одной командой, присоединяйтесь к списку ожидания, если ещё не сделали этого. 🚀 ## Вход { #login } @@ -40,7 +40,7 @@ Deploying to FastAPI Cloud... ## О FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** создан тем же автором и командой, что и **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** создан тем же автором и командой, что и **FastAPI**. Он упрощает процесс **создания образа**, **развертывания** и **доступа** к API с минимальными усилиями. diff --git a/docs/ru/docs/deployment/https.md b/docs/ru/docs/deployment/https.md index ffeccfd7da..181cac0d89 100644 --- a/docs/ru/docs/deployment/https.md +++ b/docs/ru/docs/deployment/https.md @@ -10,7 +10,7 @@ /// -Чтобы **изучить основы HTTPS** с точки зрения пользователя, загляните на https://howhttps.works/. +Чтобы **изучить основы HTTPS** с точки зрения пользователя, загляните на [https://howhttps.works/](https://howhttps.works/). Теперь, со стороны **разработчика**, вот несколько вещей, которые стоит держать в голове, размышляя об HTTPS: @@ -28,13 +28,13 @@ * **По умолчанию** это означает, что вы можете иметь **лишь один HTTPS-сертификат на один IP-адрес**. * Неважно, насколько мощный у вас сервер или насколько маленькие приложения на нём работают. * Однако у этого есть **решение**. -* Есть **расширение** протокола **TLS** (того самого, что занимается шифрованием на уровне TCP, до HTTP) под названием **SNI**. +* Есть **расширение** протокола **TLS** (того самого, что занимается шифрованием на уровне TCP, до HTTP) под названием **[SNI](https://en.wikipedia.org/wiki/Server_Name_Indication)**. * Это расширение SNI позволяет одному серверу (с **одним IP-адресом**) иметь **несколько HTTPS-сертификатов** и обслуживать **несколько HTTPS-доменов/приложений**. * Чтобы это работало, **один** компонент (программа), запущенный на сервере и слушающий **публичный IP-адрес**, должен иметь **все HTTPS-сертификаты** на этом сервере. * **После** установления защищённого соединения, протокол обмена данными — **всё ещё HTTP**. * Содержимое **зашифровано**, несмотря на то, что оно отправляется по **протоколу HTTP**. -Обычно на сервере (машине, хосте и т.п.) запускают **одну программу/HTTP‑сервер**, которая **управляет всей частью, связанной с HTTPS**: принимает **зашифрованные HTTPS-запросы**, отправляет **расшифрованные HTTP-запросы** в само HTTP‑приложение, работающее на том же сервере (в нашем случае это приложение **FastAPI**), получает **HTTP-ответ** от приложения, **шифрует его** с использованием подходящего **HTTPS‑сертификата** и отправляет клиенту по **HTTPS**. Такой сервер часто называют **прокси‑сервером TLS-терминации**. +Обычно на сервере (машине, хосте и т.п.) запускают **одну программу/HTTP‑сервер**, которая **управляет всей частью, связанной с HTTPS**: принимает **зашифрованные HTTPS-запросы**, отправляет **расшифрованные HTTP-запросы** в само HTTP‑приложение, работающее на том же сервере (в нашем случае это приложение **FastAPI**), получает **HTTP-ответ** от приложения, **шифрует его** с использованием подходящего **HTTPS‑сертификата** и отправляет клиенту по **HTTPS**. Такой сервер часто называют **[прокси‑сервером TLS-терминации](https://en.wikipedia.org/wiki/TLS_termination_proxy)**. Некоторые варианты, которые вы можете использовать как прокси‑сервер TLS-терминации: @@ -49,7 +49,7 @@ Процесс получения таких сертификатов был неудобным, требовал бумажной волокиты, а сами сертификаты были довольно дорогими. -Затем появился **Let's Encrypt**. +Затем появился **[Let's Encrypt](https://letsencrypt.org/)**. Это проект Linux Foundation. Он предоставляет **HTTPS‑сертификаты бесплатно**, в автоматическом режиме. Эти сертификаты используют стандартные криптографические механизмы и имеют короткий срок действия (около 3 месяцев), поэтому **безопасность фактически выше** благодаря уменьшенному сроку жизни. @@ -200,9 +200,9 @@ DNS‑серверы ответят браузеру, какой **конкре Заголовки прокси: -* X-Forwarded-For -* X-Forwarded-Proto -* X-Forwarded-Host +* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For) +* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto) +* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host) /// @@ -218,7 +218,7 @@ DNS‑серверы ответят браузеру, какой **конкре /// tip | Совет -Подробнее об этом вы можете узнать в документации: [За прокси — Включить пересылаемые заголовки прокси](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers){.internal-link target=_blank} +Подробнее об этом вы можете узнать в документации: [За прокси — Включить пересылаемые заголовки прокси](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers) /// diff --git a/docs/ru/docs/deployment/index.md b/docs/ru/docs/deployment/index.md index 7e735593be..a64366d4da 100644 --- a/docs/ru/docs/deployment/index.md +++ b/docs/ru/docs/deployment/index.md @@ -16,7 +16,7 @@ Вы можете **развернуть сервер** самостоятельно, используя различные инструменты. Например, можно использовать **облачный сервис**, который выполнит часть работы за вас. Также возможны и другие варианты. -Например, мы, команда, стоящая за FastAPI, создали **FastAPI Cloud**, чтобы сделать развёртывание приложений FastAPI в облаке как можно более простым и прямолинейным, с тем же удобством для разработчика, что и при работе с FastAPI. +Например, мы, команда, стоящая за FastAPI, создали [**FastAPI Cloud**](https://fastapicloud.com), чтобы сделать развёртывание приложений FastAPI в облаке как можно более простым и прямолинейным, с тем же удобством для разработчика, что и при работе с FastAPI. Я покажу вам некоторые из основных концепций, которые вы, вероятно, должны иметь в виду при развертывании приложения **FastAPI** (хотя большинство из них применимо к любому другому типу веб-приложений). diff --git a/docs/ru/docs/deployment/manually.md b/docs/ru/docs/deployment/manually.md index 93287372a2..3169f31893 100644 --- a/docs/ru/docs/deployment/manually.md +++ b/docs/ru/docs/deployment/manually.md @@ -52,11 +52,11 @@ FastAPI использует стандарт для построения Python Есть несколько альтернатив, например: -* Uvicorn: высокопроизводительный ASGI‑сервер. -* Hypercorn: ASGI‑сервер, среди прочего совместимый с HTTP/2 и Trio. -* Daphne: ASGI‑сервер, созданный для Django Channels. -* Granian: HTTP‑сервер на Rust для Python‑приложений. -* NGINX Unit: NGINX Unit — лёгкая и многофункциональная среда выполнения веб‑приложений. +* [Uvicorn](https://www.uvicorn.dev/): высокопроизводительный ASGI‑сервер. +* [Hypercorn](https://hypercorn.readthedocs.io/): ASGI‑сервер, среди прочего совместимый с HTTP/2 и Trio. +* [Daphne](https://github.com/django/daphne): ASGI‑сервер, созданный для Django Channels. +* [Granian](https://github.com/emmett-framework/granian): HTTP‑сервер на Rust для Python‑приложений. +* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit — лёгкая и многофункциональная среда выполнения веб‑приложений. ## Сервер как машина и сервер как программа { #server-machine-and-server-program } @@ -74,7 +74,7 @@ FastAPI использует стандарт для построения Python Но вы также можете установить ASGI‑сервер вручную. -Создайте [виртуальное окружение](../virtual-environments.md){.internal-link target=_blank}, активируйте его и затем установите серверное приложение. +Создайте [виртуальное окружение](../virtual-environments.md), активируйте его и затем установите серверное приложение. Например, чтобы установить Uvicorn: diff --git a/docs/ru/docs/deployment/server-workers.md b/docs/ru/docs/deployment/server-workers.md index e756ab3774..2caf79f7d8 100644 --- a/docs/ru/docs/deployment/server-workers.md +++ b/docs/ru/docs/deployment/server-workers.md @@ -13,13 +13,13 @@ При деплое приложения вам, скорее всего, захочется использовать **репликацию процессов**, чтобы задействовать **несколько ядер** и иметь возможность обрабатывать больше запросов. -Как вы видели в предыдущей главе о [Концепциях деплоя](concepts.md){.internal-link target=_blank}, существует несколько стратегий. +Как вы видели в предыдущей главе о [Концепциях деплоя](concepts.md), существует несколько стратегий. Здесь я покажу, как использовать **Uvicorn** с **воркер-процессами** через команду `fastapi` или напрямую через команду `uvicorn`. /// info | Информация -Если вы используете контейнеры, например Docker или Kubernetes, я расскажу об этом подробнее в следующей главе: [FastAPI в контейнерах — Docker](docker.md){.internal-link target=_blank}. +Если вы используете контейнеры, например Docker или Kubernetes, я расскажу об этом подробнее в следующей главе: [FastAPI в контейнерах — Docker](docker.md). В частности, при запуске в **Kubernetes** вам, скорее всего, **не** понадобится использовать воркеры — вместо этого запускайте **один процесс Uvicorn на контейнер**, но об этом подробнее далее в той главе. @@ -126,7 +126,7 @@ $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4 ## Контейнеры и Docker { #containers-and-docker } -В следующей главе о [FastAPI в контейнерах — Docker](docker.md){.internal-link target=_blank} я объясню стратегии, которые можно использовать для решения остальных **концепций деплоя**. +В следующей главе о [FastAPI в контейнерах — Docker](docker.md) я объясню стратегии, которые можно использовать для решения остальных **концепций деплоя**. Я покажу, как **собрать свой образ с нуля**, чтобы запускать один процесс Uvicorn. Это простой подход и, вероятно, именно то, что вам нужно при использовании распределённой системы управления контейнерами, такой как **Kubernetes**. diff --git a/docs/ru/docs/deployment/versions.md b/docs/ru/docs/deployment/versions.md index 4195d689fe..b52ca456f2 100644 --- a/docs/ru/docs/deployment/versions.md +++ b/docs/ru/docs/deployment/versions.md @@ -4,7 +4,7 @@ Часто добавляются новые функции, регулярно исправляются баги, код продолжает постоянно совершенствоваться. -По указанным причинам текущие версии до сих пор `0.x.x`. Это говорит о том, что каждая версия может содержать обратно несовместимые изменения, следуя Семантическому версионированию. +По указанным причинам текущие версии до сих пор `0.x.x`. Это говорит о том, что каждая версия может содержать обратно несовместимые изменения, следуя [Семантическому версионированию](https://semver.org/). Уже сейчас вы можете создавать приложения в продакшн, используя **FastAPI** (и скорее всего так и делаете), главное убедиться в том, что вы используете версию, которая корректно работает с вашим кодом. @@ -34,7 +34,7 @@ fastapi[standard]>=0.112.0,<0.113.0 ## Доступные версии { #available-versions } -Вы можете посмотреть доступные версии (например, проверить последнюю на данный момент) в [Примечаниях к выпуску](../release-notes.md){.internal-link target=_blank}. +Вы можете посмотреть доступные версии (например, проверить последнюю на данный момент) в [Примечаниях к выпуску](../release-notes.md). ## О версиях { #about-versions } @@ -66,7 +66,7 @@ fastapi>=0.45.0,<0.46.0 Вам следует добавить тесты для вашего приложения. -С помощью **FastAPI** это очень просто (благодаря Starlette), см. документацию: [Тестирование](../tutorial/testing.md){.internal-link target=_blank} +С помощью **FastAPI** это очень просто (благодаря Starlette), см. документацию: [Тестирование](../tutorial/testing.md) После создания тестов вы можете обновить свою версию **FastAPI** до более новой. После этого следует убедиться, что ваш код работает корректно, запустив тесты. diff --git a/docs/ru/docs/editor-support.md b/docs/ru/docs/editor-support.md new file mode 100644 index 0000000000..0543e7162d --- /dev/null +++ b/docs/ru/docs/editor-support.md @@ -0,0 +1,23 @@ +# Поддержка редактора кода { #editor-support } + +Официальное [расширение FastAPI](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) улучшает ваш процесс разработки на FastAPI за счет обнаружения и навигации по *операциям пути* (обработчикам пути), а также развертывания в FastAPI Cloud и потоковой передачи логов в реальном времени. + +Подробности о расширении смотрите в README в [репозитории GitHub](https://github.com/fastapi/fastapi-vscode). + +## Установка и настройка { #setup-and-installation } + +**Расширение FastAPI** доступно как для [VS Code](https://code.visualstudio.com/), так и для [Cursor](https://www.cursor.com/). Его можно установить напрямую из панели расширений в каждом редакторе кода, выполнив поиск по «FastAPI» и выбрав расширение от **FastAPI Labs**. Расширение также работает в браузерных редакторах кода, таких как [vscode.dev](https://vscode.dev) и [github.dev](https://github.dev). + +### Обнаружение приложения { #application-discovery } + +По умолчанию расширение автоматически обнаруживает приложения FastAPI в вашем рабочем пространстве, сканируя файлы, где создается экземпляр `FastAPI()`. Если авто-обнаружение не подходит для структуры вашего проекта, вы можете указать точку входа через `[tool.fastapi]` в `pyproject.toml` или настройку VS Code `fastapi.entryPoint`, используя модульную нотацию (например, `myapp.main:app`). + +## Возможности { #features } + +- **Обозреватель операций пути** — древовидное представление на боковой панели всех *операций пути* вашего приложения. Нажмите, чтобы перейти к любому маршруту или определению роутера. +- **Поиск маршрутов** — поиск по пути, методу или имени с помощью Ctrl + Shift + E (на macOS: Cmd + Shift + E). +- **Навигация CodeLens** — кликабельные ссылки над вызовами тестового клиента (например, `client.get('/items')`), которые переходят к соответствующей *операции пути* для быстрой навигации между тестами и реализацией. +- **Развернуть в FastAPI Cloud** — развертывание вашего приложения в один клик в [FastAPI Cloud](https://fastapicloud.com/). +- **Поток логов приложения** — потоковая передача логов в реальном времени из вашего приложения, развернутого в FastAPI Cloud, с фильтрацией по уровню и текстовым поиском. + +Если вы хотите поверхностно ознакомиться с возможностями расширения, откройте палитру команд (Ctrl + Shift + P или на macOS: Cmd + Shift + P), выберите «Welcome: Open walkthrough...», а затем «Get started with FastAPI». diff --git a/docs/ru/docs/environment-variables.md b/docs/ru/docs/environment-variables.md index 759127420f..8db16d16c6 100644 --- a/docs/ru/docs/environment-variables.md +++ b/docs/ru/docs/environment-variables.md @@ -65,7 +65,7 @@ print(f"Hello {name} from Python") /// tip | Совет -Второй аргумент `os.getenv()` - это возвращаемое по умолчанию значение. +Второй аргумент [`os.getenv()`](https://docs.python.org/3.8/library/os.html#os.getenv) - это возвращаемое по умолчанию значение. Если значение не указано, то по умолчанию оно равно `None`. В данном случае мы указываем `«World»` в качестве значения по умолчанию. @@ -153,7 +153,7 @@ Hello World from Python /// tip | Совет -Подробнее об этом можно прочитать на сайте The Twelve-Factor App: Config. +Подробнее об этом можно прочитать на сайте [The Twelve-Factor App: Config](https://12factor.net/config). /// @@ -163,7 +163,7 @@ Hello World from Python Это означает, что **любое значение**, считанное в Python из переменной окружения, **будет `str`**, и любое преобразование к другому типу или любая валидация должны быть выполнены в коде. -Подробнее об использовании переменных окружения для работы с **настройками приложения** вы узнаете в [Расширенное руководство пользователя - Настройки и переменные среды](./advanced/settings.md){.internal-link target=_blank}. +Подробнее об использовании переменных окружения для работы с **настройками приложения** вы узнаете в [Расширенное руководство пользователя - Настройки и переменные среды](./advanced/settings.md). ## Переменная окружения `PATH` { #path-environment-variable } @@ -285,13 +285,13 @@ $ C:\opt\custompython\bin\python //// -Эта информация будет полезна при изучении [Виртуальных окружений](virtual-environments.md){.internal-link target=_blank}. +Эта информация будет полезна при изучении [Виртуальных окружений](virtual-environments.md). ## Вывод { #conclusion } Благодаря этому вы должны иметь базовое представление о том, что такое **переменные окружения** и как использовать их в Python. -Подробнее о них вы также можете прочитать в статье о переменных окружения на википедии. +Подробнее о них вы также можете прочитать в [статье о переменных окружения на википедии](https://en.wikipedia.org/wiki/Environment_variable). Во многих случаях не всегда очевидно, как переменные окружения могут быть полезны и применимы. Но они постоянно появляются в различных сценариях разработки, поэтому знать о них полезно. diff --git a/docs/ru/docs/fastapi-cli.md b/docs/ru/docs/fastapi-cli.md index a46e0053ee..1dc558a8c1 100644 --- a/docs/ru/docs/fastapi-cli.md +++ b/docs/ru/docs/fastapi-cli.md @@ -1,15 +1,15 @@ # FastAPI CLI { #fastapi-cli } -**FastAPI CLI** это программа командной строки, которую вы можете использовать для запуска вашего FastAPI приложения, для управления FastAPI-проектом, а также для многих других вещей. +**FastAPI CLI** - это программа командной строки, которую вы можете использовать, чтобы предоставлять доступ к вашему приложению FastAPI, управлять проектом FastAPI и т.д. -`fastapi-cli` устанавливается вместе со стандартным пакетом FastAPI (при запуске команды `pip install "fastapi[standard]"`). Данный пакет предоставляет доступ к программе `fastapi` через терминал. +При установке FastAPI (например, с помощью `pip install "fastapi[standard]"`) вместе с ним устанавливается программа командной строки, которую можно запускать в терминале. -Чтобы запустить приложение FastAPI в режиме разработки, вы можете использовать команду `fastapi dev`: +Чтобы запустить ваше приложение FastAPI в режиме разработки, используйте команду `fastapi dev`:
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -46,13 +46,66 @@ $ fastapi dev Uvicorn, высокопроизводительный, готовый к работе в продакшн ASGI-сервер. 😎 +Кроме того, другие инструменты могут не найти его, например [Расширение VS Code](editor-support.md) или [FastAPI Cloud](https://fastapicloud.com), поэтому рекомендуется использовать `entrypoint` в `pyproject.toml`. ## `fastapi dev` { #fastapi-dev } @@ -70,6 +123,6 @@ FastAPI CLI берет путь к вашей Python-программе (нап /// tip | Подсказка -Вы можете больше узнать об этом в [документации по развертыванию](deployment/index.md){.internal-link target=_blank}. +Вы можете больше узнать об этом в [документации по развертыванию](deployment/index.md). /// diff --git a/docs/ru/docs/features.md b/docs/ru/docs/features.md index 0bc3dbb2d1..f779c798cc 100644 --- a/docs/ru/docs/features.md +++ b/docs/ru/docs/features.md @@ -6,8 +6,8 @@ ### Основано на открытых стандартах { #based-on-open-standards } -* OpenAPI для создания API, включая объявления операций пути, параметров, тел запросов, безопасности и т.д. -* Автоматическая документация моделей данных с помощью JSON Schema (так как сама спецификация OpenAPI основана на JSON Schema). +* [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) для создания API, включая объявления операций пути, параметров, тел запросов, безопасности и т.д. +* Автоматическая документация моделей данных с помощью [**JSON Schema**](https://json-schema.org/) (так как сама спецификация OpenAPI основана на JSON Schema). * Разработан вокруг этих стандартов, после тщательного их изучения. Это не дополнительная надстройка поверх. * Это также позволяет использовать автоматическую **генерацию клиентского кода** на многих языках. @@ -15,11 +15,11 @@ Интерактивная документация для API и исследовательские веб-интерфейсы. Поскольку фреймворк основан на OpenAPI, существует несколько вариантов документирования, 2 из них включены по умолчанию. -* Swagger UI, с интерактивным исследованием, вызовом и тестированием вашего API прямо из браузера. +* [**Swagger UI**](https://github.com/swagger-api/swagger-ui), с интерактивным исследованием, вызовом и тестированием вашего API прямо из браузера. ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) -* Альтернативная документация API в ReDoc. +* Альтернативная документация API в [**ReDoc**](https://github.com/Rebilly/ReDoc). ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) @@ -27,7 +27,7 @@ Все основано на стандартных **аннотациях типов Python** (благодаря Pydantic). Не нужно изучать новый синтаксис. Только стандартный современный Python. -Если вам нужно освежить знания о типах в Python (даже если вы не используете FastAPI), выделите 2 минуты и просмотрите краткое руководство: [Типы Python](python-types.md){.internal-link target=_blank}. +Если вам нужно освежить знания о типах в Python (даже если вы не используете FastAPI), выделите 2 минуты и просмотрите краткое руководство: [Типы Python](python-types.md). Вы пишете стандартный Python с типами: @@ -75,7 +75,7 @@ my_second_user: User = User(**second_user_data) Весь фреймворк был продуман так, чтобы быть простым и интуитивно понятным в использовании, все решения были проверены на множестве редакторов еще до начала разработки, чтобы обеспечить наилучшие условия при написании кода. -В опросах Python‑разработчиков видно, что одной из самых часто используемых функций является «автозавершение». +В опросах Python‑разработчиков видно, [что одной из самых часто используемых функций является «автозавершение»](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features). Вся структура **FastAPI** основана на удовлетворении этой возможности. Автозавершение работает везде. @@ -83,11 +83,11 @@ my_second_user: User = User(**second_user_data) Вот как ваш редактор может вам помочь: -* в Visual Studio Code: +* в [Visual Studio Code](https://code.visualstudio.com/): ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) -* в PyCharm: +* в [PyCharm](https://www.jetbrains.com/pycharm/): ![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png) @@ -124,7 +124,7 @@ FastAPI имеет продуманные значения **по умолчан Все схемы безопасности, определённые в OpenAPI, включая: * HTTP Basic. -* **OAuth2** (также с **токенами JWT**). Ознакомьтесь с руководством [OAuth2 с JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. +* **OAuth2** (также с **токенами JWT**). Ознакомьтесь с руководством [OAuth2 с JWT](tutorial/security/oauth2-jwt.md). * Ключи API в: * HTTP-заголовках. * Параметрах запросов. @@ -159,13 +159,13 @@ FastAPI включает в себя чрезвычайно простую в и ## Возможности Starlette { #starlette-features } -**FastAPI** основан на Starlette и полностью совместим с ним. Так что любой дополнительный код Starlette, который у вас есть, также будет работать. +**FastAPI** основан на [**Starlette**](https://www.starlette.dev/) и полностью совместим с ним. Так что любой дополнительный код Starlette, который у вас есть, также будет работать. На самом деле, `FastAPI` — это подкласс `Starlette`. Таким образом, если вы уже знаете или используете Starlette, большая часть функционала будет работать так же. С **FastAPI** вы получаете все возможности **Starlette** (так как FastAPI — это всего лишь Starlette на стероидах): -* Серьёзно впечатляющая производительность. Это один из самых быстрых фреймворков на Python, наравне с **NodeJS** и **Go**. +* Серьёзно впечатляющая производительность. Это [один из самых быстрых фреймворков на Python, наравне с **NodeJS** и **Go**](https://github.com/encode/starlette#performance). * Поддержка **WebSocket**. * Фоновые задачи в том же процессе. * События запуска и выключения. @@ -177,7 +177,7 @@ FastAPI включает в себя чрезвычайно простую в и ## Возможности Pydantic { #pydantic-features } -**FastAPI** полностью совместим с (и основан на) Pydantic. Поэтому любой дополнительный код Pydantic, который у вас есть, также будет работать. +**FastAPI** полностью совместим с (и основан на) [**Pydantic**](https://docs.pydantic.dev/). Поэтому любой дополнительный код Pydantic, который у вас есть, также будет работать. Включая внешние библиотеки, также основанные на Pydantic, такие как ORM’ы, ODM’ы для баз данных. diff --git a/docs/ru/docs/help-fastapi.md b/docs/ru/docs/help-fastapi.md index 6bfabb96cb..1d274e96a2 100644 --- a/docs/ru/docs/help-fastapi.md +++ b/docs/ru/docs/help-fastapi.md @@ -12,7 +12,7 @@ ## Подписаться на новостную рассылку { #subscribe-to-the-newsletter } -Вы можете подписаться на редкую [новостную рассылку **FastAPI и его друзья**](newsletter.md){.internal-link target=_blank} и быть в курсе о: +Вы можете подписаться на редкую [новостную рассылку **FastAPI и его друзья**](newsletter.md) и быть в курсе о: * Новостях о FastAPI и его друзьях 🚀 * Руководствах 📝 @@ -22,17 +22,17 @@ ## Подписаться на FastAPI в X (Twitter) { #follow-fastapi-on-x-twitter } -Подписаться на @fastapi в **X (Twitter)** для получения наисвежайших новостей о **FastAPI**. 🐦 +[Подписаться на @fastapi в **X (Twitter)**](https://x.com/fastapi) для получения наисвежайших новостей о **FastAPI**. 🐦 ## Добавить **FastAPI** звезду на GitHub { #star-fastapi-in-github } -Вы можете добавить FastAPI "звезду" на GitHub (кликнув на кнопку звезды в правом верхнем углу): https://github.com/fastapi/fastapi. ⭐️ +Вы можете добавить FastAPI "звезду" на GitHub (кликнув на кнопку звезды в правом верхнем углу): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). ⭐️ Чем больше звёзд, тем легче другим пользователям найти проект и увидеть, что он уже оказался полезным для многих. ## Отслеживать свежие выпуски в репозитории на GitHub { #watch-the-github-repository-for-releases } -Вы можете "отслеживать" FastAPI на GitHub (кликнув по кнопке "watch" наверху справа): https://github.com/fastapi/fastapi. 👀 +Вы можете "отслеживать" FastAPI на GitHub (кликнув по кнопке "watch" наверху справа): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀 Там же Вы можете выбрать "Releases only". @@ -40,45 +40,45 @@ ## Связаться с автором { #connect-with-the-author } -Можно связаться со мной (Sebastián Ramírez / `tiangolo`), автором. +Можно связаться со [мной (Sebastián Ramírez / `tiangolo`)](https://tiangolo.com), автором. Вы можете: -* Подписаться на меня на **GitHub**. +* [Подписаться на меня на **GitHub**](https://github.com/tiangolo). * Посмотреть другие мои проекты с открытым кодом, которые могут быть полезны Вам. * Подписаться, чтобы видеть, когда я создаю новый проект с открытым кодом. -* Подписаться на меня в **X (Twitter)** или в Mastodon. +* [Подписаться на меня в **X (Twitter)**](https://x.com/tiangolo) или в [Mastodon](https://fosstodon.org/@tiangolo). * Поделиться со мной, как Вы используете FastAPI (я обожаю это читать). * Узнавать, когда я делаю объявления или выпускаю новые инструменты. - * Вы также можете подписаться на @fastapi в X (Twitter) (это отдельный аккаунт). -* Подписаться на меня в **LinkedIn**. + * Вы также можете [подписаться на @fastapi в X (Twitter)](https://x.com/fastapi) (это отдельный аккаунт). +* [Подписаться на меня в **LinkedIn**](https://www.linkedin.com/in/tiangolo/). * Узнавать, когда я делаю объявления или выпускаю новые инструменты (хотя чаще я использую X (Twitter) 🤷‍♂). -* Читать, что я пишу (или подписаться на меня) на **Dev.to** или **Medium**. +* Читать, что я пишу (или подписаться на меня) на [**Dev.to**](https://dev.to/tiangolo) или [**Medium**](https://medium.com/@tiangolo). * Читать другие идеи, статьи и о созданных мной инструментах. * Подписаться, чтобы читать, когда я публикую что-то новое. ## Оставить сообщение в X (Twitter) о **FastAPI** { #tweet-about-fastapi } -Оставьте сообщение в X (Twitter) о **FastAPI** и позвольте мне и другим узнать, почему он Вам нравится. 🎉 +[Оставьте сообщение в X (Twitter) о **FastAPI**](https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi) и позвольте мне и другим узнать, почему он Вам нравится. 🎉 Я люблю узнавать о том, как **FastAPI** используется, что Вам понравилось в нём, в каких проектах/компаниях Вы его используете и т.д. ## Оставить голос за FastAPI { #vote-for-fastapi } -* Голосуйте за **FastAPI** в Slant. -* Голосуйте за **FastAPI** в AlternativeTo. -* Расскажите, что Вы используете **FastAPI** на StackShare. +* [Голосуйте за **FastAPI** в Slant](https://www.slant.co/options/34241/~fastapi-review). +* [Голосуйте за **FastAPI** в AlternativeTo](https://alternativeto.net/software/fastapi/about/). +* [Расскажите, что Вы используете **FastAPI** на StackShare](https://stackshare.io/pypi-fastapi). ## Помочь другим с вопросами на GitHub { #help-others-with-questions-in-github } Вы можете попробовать помочь другим с их вопросами в: -* GitHub Discussions -* GitHub Issues +* [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered) +* [GitHub Issues](https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+) Во многих случаях Вы уже можете знать ответы на эти вопросы. 🤓 -Если Вы много помогаете людям с их вопросами, Вы станете официальным [Экспертом FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}. 🎉 +Если Вы много помогаете людям с их вопросами, Вы станете официальным [Экспертом FastAPI](fastapi-people.md#fastapi-experts). 🎉 Только помните, самое важное — постарайтесь быть добрыми. Люди приходят со своими разочарованиями и часто задают вопросы не лучшим образом, но постарайтесь, насколько можете, быть доброжелательными. 🤗 @@ -104,7 +104,7 @@ Во многих случаях предоставляют только фрагмент кода, но этого недостаточно, чтобы **воспроизвести проблему**. -* Попросите предоставить минимальный воспроизводимый пример, который Вы сможете **скопировать-вставить** и запустить локально, чтобы увидеть ту же ошибку или поведение, или лучше понять их кейс. +* Попросите предоставить [минимальный воспроизводимый пример](https://stackoverflow.com/help/minimal-reproducible-example), который Вы сможете **скопировать-вставить** и запустить локально, чтобы увидеть ту же ошибку или поведение, или лучше понять их кейс. * Если чувствуете себя особенно великодушными, можете попытаться **создать такой пример** сами, основываясь только на описании проблемы. Просто помните, что это может занять много времени, и, возможно, сначала лучше попросить уточнить проблему. @@ -124,7 +124,7 @@ ## Отслеживать репозиторий на GitHub { #watch-the-github-repository } -Вы можете "отслеживать" FastAPI на GitHub (кликнув по кнопке "watch" наверху справа): https://github.com/fastapi/fastapi. 👀 +Вы можете "отслеживать" FastAPI на GitHub (кликнув по кнопке "watch" наверху справа): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀 Если Вы выберете "Watching" вместо "Releases only", то будете получать уведомления, когда кто-либо создаёт новый вопрос или Issue. Вы также можете указать, что хотите получать уведомления только о новых Issues, или обсуждениях, или пулл-реквестах и т.д. @@ -132,7 +132,7 @@ ## Задать вопросы { #ask-questions } -Вы можете создать новый вопрос в репозитории GitHub, например: +Вы можете [создать новый вопрос](https://github.com/fastapi/fastapi/discussions/new?category=questions) в репозитории GitHub, например: * Задать **вопрос** или спросить о **проблеме**. * Предложить новую **возможность**. @@ -195,12 +195,12 @@ ## Создать пулл-реквест { #create-a-pull-request } -Вы можете [сделать вклад](contributing.md){.internal-link target=_blank} в исходный код пулл-реквестами, например: +Вы можете [сделать вклад](contributing.md) в исходный код пулл-реквестами, например: * Исправить опечатку, найденную в документации. -* Поделиться статьёй, видео или подкастом о FastAPI, которые Вы создали или нашли, изменив этот файл. +* Поделиться статьёй, видео или подкастом о FastAPI, которые Вы создали или нашли, [изменив этот файл](https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml). * Убедитесь, что добавили свою ссылку в начало соответствующего раздела. -* Помочь с [переводом документации](contributing.md#translations){.internal-link target=_blank} на Ваш язык. +* Помочь с [переводом документации](contributing.md#translations) на Ваш язык. * Вы также можете проверять переводы, сделанные другими. * Предложить новые разделы документации. * Исправить существующую проблему/баг. @@ -217,8 +217,8 @@ Основные задачи, которые Вы можете выполнить прямо сейчас: -* [Помочь другим с вопросами на GitHub](#help-others-with-questions-in-github){.internal-link target=_blank} (смотрите секцию выше). -* [Проверять пулл-реквесты](#review-pull-requests){.internal-link target=_blank} (смотрите секцию выше). +* [Помочь другим с вопросами на GitHub](#help-others-with-questions-in-github) (смотрите секцию выше). +* [Проверять пулл-реквесты](#review-pull-requests) (смотрите секцию выше). Именно эти две задачи **забирают больше всего времени**. Это основная работа по поддержке FastAPI. @@ -226,11 +226,11 @@ ## Подключиться к чату { #join-the-chat } -Подключайтесь к 👥 серверу чата в Discord 👥 и общайтесь с другими участниками сообщества FastAPI. +Подключайтесь к 👥 [серверу чата в Discord](https://discord.gg/VQjSZaeJmf) 👥 и общайтесь с другими участниками сообщества FastAPI. /// tip | Подсказка -По вопросам — задавайте их в GitHub Discussions, так гораздо выше шанс, что Вы получите помощь от [Экспертов FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}. +По вопросам — задавайте их в [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/new?category=questions), так гораздо выше шанс, что Вы получите помощь от [Экспертов FastAPI](fastapi-people.md#fastapi-experts). Используйте чат только для прочих общих бесед. @@ -242,13 +242,13 @@ На GitHub шаблон поможет Вам правильно сформулировать вопрос, чтобы Вам было легче получить хороший ответ или даже решить проблему самостоятельно ещё до того, как спросите. И на GitHub я могу следить за тем, чтобы всегда отвечать на всё, даже если это занимает время. А с чатами я не могу сделать этого лично. 😅 -Кроме того, переписка в чатах хуже ищется, чем на GitHub, поэтому вопросы и ответы могут теряться среди остальных сообщений. И только те, что на GitHub, учитываются для получения лычки [Эксперт FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}, так что вероятнее всего Вы получите больше внимания именно на GitHub. +Кроме того, переписка в чатах хуже ищется, чем на GitHub, поэтому вопросы и ответы могут теряться среди остальных сообщений. И только те, что на GitHub, учитываются для получения лычки [Эксперт FastAPI](fastapi-people.md#fastapi-experts), так что вероятнее всего Вы получите больше внимания именно на GitHub. С другой стороны, в чатах тысячи пользователей, так что почти всегда есть шанс найти там кого-то для разговора. 😄 ## Спонсировать автора { #sponsor-the-author } -Если Ваш **продукт/компания** зависят от **FastAPI** или связаны с ним и Вы хотите донести до пользователей информацию о себе, Вы можете спонсировать автора (меня) через GitHub Sponsors. В зависимости от уровня поддержки Вы можете получить дополнительные бонусы, например, бейдж в документации. 🎁 +Если Ваш **продукт/компания** зависят от **FastAPI** или связаны с ним и Вы хотите донести до пользователей информацию о себе, Вы можете спонсировать автора (меня) через [GitHub Sponsors](https://github.com/sponsors/tiangolo). В зависимости от уровня поддержки Вы можете получить дополнительные бонусы, например, бейдж в документации. 🎁 --- diff --git a/docs/ru/docs/history-design-future.md b/docs/ru/docs/history-design-future.md index 5019157600..00969461dc 100644 --- a/docs/ru/docs/history-design-future.md +++ b/docs/ru/docs/history-design-future.md @@ -1,6 +1,6 @@ # История, проектирование и будущее { #history-design-and-future } -Однажды, один из пользователей **FastAPI** задал вопрос: +Однажды, [один из пользователей **FastAPI** задал вопрос](https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920): > Какова история этого проекта? Создаётся впечатление, что он явился из ниоткуда и завоевал мир за несколько недель [...] @@ -14,7 +14,7 @@ Во многом история **FastAPI** - история его предшественников. -Как написано в разделе [Альтернативы](alternatives.md){.internal-link target=_blank}: +Как написано в разделе [Альтернативы](alternatives.md):
@@ -44,7 +44,7 @@ Я проверил несколько идей на самых популярных редакторах кода: PyCharm, VS Code, редакторы на базе Jedi. -Согласно последнему опросу Python-разработчиков, который охватывает около 80% пользователей. +Согласно последнему [опросу Python-разработчиков](https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools), который охватывает около 80% пользователей. Это означает, что **FastAPI** был специально проверен на редакторах, используемых 80% Python-разработчиками. И поскольку большинство других редакторов, как правило, работают аналогичным образом, все его преимущества должны работать практически для всех редакторов. @@ -54,11 +54,11 @@ ## Зависимости { #requirements } -Протестировав несколько вариантов, я решил, что в качестве основы буду использовать **Pydantic** и его преимущества. +Протестировав несколько вариантов, я решил, что в качестве основы буду использовать [**Pydantic**](https://docs.pydantic.dev/) и его преимущества. По моим предложениям был изменён код этого фреймворка, чтобы сделать его полностью совместимым с JSON Schema, поддержать различные способы определения ограничений и улучшить поддержку в редакторах кода (проверки типов, автозавершение) на основе тестов в нескольких редакторах. -Во время разработки я также внес вклад в **Starlette**, другую ключевую зависимость. +Во время разработки я также внес вклад в [**Starlette**](https://www.starlette.dev/), другую ключевую зависимость. ## Разработка { #development } @@ -76,4 +76,4 @@ У **FastAPI** великое будущее. -И [ваш вклад в это](help-fastapi.md){.internal-link target=_blank} - очень ценен. +И [ваша помощь](help-fastapi.md) очень ценится. diff --git a/docs/ru/docs/how-to/authentication-error-status-code.md b/docs/ru/docs/how-to/authentication-error-status-code.md index 596563c541..acbc18f336 100644 --- a/docs/ru/docs/how-to/authentication-error-status-code.md +++ b/docs/ru/docs/how-to/authentication-error-status-code.md @@ -2,7 +2,7 @@ До версии FastAPI `0.122.0`, когда встроенные утилиты безопасности возвращали ошибку клиенту после неудачной аутентификации, они использовали HTTP статус-код `403 Forbidden`. -Начиная с версии FastAPI `0.122.0`, используется более подходящий HTTP статус-код `401 Unauthorized`, и в ответе возвращается имеющий смысл HTTP-заголовок `WWW-Authenticate` в соответствии со спецификациями HTTP, RFC 7235, RFC 9110. +Начиная с версии FastAPI `0.122.0`, используется более подходящий HTTP статус-код `401 Unauthorized`, и в ответе возвращается имеющий смысл HTTP-заголовок `WWW-Authenticate` в соответствии со спецификациями HTTP, [RFC 7235](https://datatracker.ietf.org/doc/html/rfc7235#section-3.1), [RFC 9110](https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized). Но если по какой-то причине ваши клиенты зависят от старого поведения, вы можете вернуть его, переопределив метод `make_not_authenticated_error` в ваших Security-классах. diff --git a/docs/ru/docs/how-to/conditional-openapi.md b/docs/ru/docs/how-to/conditional-openapi.md index 6efa30608e..5fece06c14 100644 --- a/docs/ru/docs/how-to/conditional-openapi.md +++ b/docs/ru/docs/how-to/conditional-openapi.md @@ -10,7 +10,7 @@ Если в вашем коде есть уязвимость, она всё равно останется. -Сокрытие документации лишь усложняет понимание того, как взаимодействовать с вашим API, и может усложнить его отладку в продакшн. Это можно считать просто разновидностью безопасности через сокрытие. +Сокрытие документации лишь усложняет понимание того, как взаимодействовать с вашим API, и может усложнить его отладку в продакшн. Это можно считать просто разновидностью [безопасности через сокрытие](https://en.wikipedia.org/wiki/Security_through_obscurity). Если вы хотите обезопасить свой API, есть несколько более эффективных вещей, которые можно сделать, например: diff --git a/docs/ru/docs/how-to/configure-swagger-ui.md b/docs/ru/docs/how-to/configure-swagger-ui.md index f4f2a0e549..b57a086b6c 100644 --- a/docs/ru/docs/how-to/configure-swagger-ui.md +++ b/docs/ru/docs/how-to/configure-swagger-ui.md @@ -1,6 +1,6 @@ # Настройка Swagger UI { #configure-swagger-ui } -Вы можете настроить дополнительные параметры Swagger UI. +Вы можете настроить дополнительные [параметры Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/). Чтобы настроить их, передайте аргумент `swagger_ui_parameters` при создании объекта приложения `FastAPI()` или в функцию `get_swagger_ui_html()`. @@ -50,7 +50,7 @@ FastAPI включает некоторые параметры конфигур ## Другие параметры Swagger UI { #other-swagger-ui-parameters } -Чтобы увидеть все остальные возможные настройки, прочитайте официальную документацию по параметрам Swagger UI. +Чтобы увидеть все остальные возможные настройки, прочитайте официальную [документацию по параметрам Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/). ## Настройки только для JavaScript { #javascript-only-settings } diff --git a/docs/ru/docs/how-to/custom-docs-ui-assets.md b/docs/ru/docs/how-to/custom-docs-ui-assets.md index e3c31b32c5..b8398cdb08 100644 --- a/docs/ru/docs/how-to/custom-docs-ui-assets.md +++ b/docs/ru/docs/how-to/custom-docs-ui-assets.md @@ -54,7 +54,7 @@ Swagger UI сделает это за вас «за кулисами», но д ### Тестирование { #test-it } -Теперь вы должны иметь возможность открыть свою документацию по адресу http://127.0.0.1:8000/docs и перезагрузить страницу — «ассеты» (статические файлы) будут загружаться с нового CDN. +Теперь вы должны иметь возможность открыть свою документацию по адресу [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) и перезагрузить страницу — «ассеты» (статические файлы) будут загружаться с нового CDN. ## Самостоятельный хостинг JavaScript и CSS для документации { #self-hosting-javascript-and-css-for-docs } @@ -93,12 +93,12 @@ Swagger UI сделает это за вас «за кулисами», но д **Swagger UI** использует файлы: -* `swagger-ui-bundle.js` -* `swagger-ui.css` +* [`swagger-ui-bundle.js`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js) +* [`swagger-ui.css`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css) А **ReDoc** использует файл: -* `redoc.standalone.js` +* [`redoc.standalone.js`](https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js) После этого структура файлов может выглядеть так: @@ -122,7 +122,7 @@ Swagger UI сделает это за вас «за кулисами», но д ### Протестируйте статические файлы { #test-the-static-files } -Запустите своё приложение и откройте http://127.0.0.1:8000/static/redoc.standalone.js. +Запустите своё приложение и откройте [http://127.0.0.1:8000/static/redoc.standalone.js](http://127.0.0.1:8000/static/redoc.standalone.js). Вы должны увидеть очень длинный JavaScript-файл для **ReDoc**. @@ -180,6 +180,6 @@ Swagger UI сделает это за вас «за кулисами», но д ### Тестирование UI со статическими файлами { #test-static-files-ui } -Теперь вы можете отключить Wi‑Fi, открыть свою документацию по адресу http://127.0.0.1:8000/docs и перезагрузить страницу. +Теперь вы можете отключить Wi‑Fi, открыть свою документацию по адресу [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) и перезагрузить страницу. Даже без Интернета вы сможете видеть документацию к своему API и взаимодействовать с ним. diff --git a/docs/ru/docs/how-to/custom-request-and-route.md b/docs/ru/docs/how-to/custom-request-and-route.md index feef9670ad..1e3a608562 100644 --- a/docs/ru/docs/how-to/custom-request-and-route.md +++ b/docs/ru/docs/how-to/custom-request-and-route.md @@ -18,7 +18,7 @@ Некоторые сценарии: -* Преобразование тел запросов, не в формате JSON, в JSON (например, `msgpack`). +* Преобразование тел запросов, не в формате JSON, в JSON (например, [`msgpack`](https://msgpack.org/index.html)). * Распаковка тел запросов, сжатых с помощью gzip. * Автоматическое логирование всех тел запросов. @@ -32,7 +32,7 @@ /// tip | Совет -Это учебный пример, демонстрирующий принцип работы. Если вам нужна поддержка Gzip, вы можете использовать готовый [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware){.internal-link target=_blank}. +Это учебный пример, демонстрирующий принцип работы. Если вам нужна поддержка Gzip, вы можете использовать готовый [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware). /// @@ -66,7 +66,7 @@ Именно этих двух компонентов — `scope` и `receive` — достаточно, чтобы создать новый экземпляр `Request`. -Чтобы узнать больше о `Request`, см. документацию Starlette о запросах. +Чтобы узнать больше о `Request`, см. [документацию Starlette о запросах](https://www.starlette.dev/requests/). /// @@ -82,7 +82,7 @@ /// tip | Совет -Для решения этой задачи, вероятно, намного проще использовать `body` в пользовательском обработчике `RequestValidationError` ([Обработка ошибок](../tutorial/handling-errors.md#use-the-requestvalidationerror-body){.internal-link target=_blank}). +Для решения этой задачи, вероятно, намного проще использовать `body` в пользовательском обработчике `RequestValidationError` ([Обработка ошибок](../tutorial/handling-errors.md#use-the-requestvalidationerror-body)). Но этот пример всё равно актуален и показывает, как взаимодействовать с внутренними компонентами. diff --git a/docs/ru/docs/how-to/extending-openapi.md b/docs/ru/docs/how-to/extending-openapi.md index 197a1790a2..c1e369f5e5 100644 --- a/docs/ru/docs/how-to/extending-openapi.md +++ b/docs/ru/docs/how-to/extending-openapi.md @@ -37,7 +37,7 @@ Используя информацию выше, вы можете той же вспомогательной функцией сгенерировать схему OpenAPI и переопределить любые нужные части. -Например, добавим расширение OpenAPI ReDoc для включения собственного логотипа. +Например, добавим [расширение OpenAPI ReDoc для включения собственного логотипа](https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo). ### Обычный **FastAPI** { #normal-fastapi } @@ -75,6 +75,6 @@ ### Проверьте { #check-it } -Перейдите на http://127.0.0.1:8000/redoc — вы увидите, что используется ваш кастомный логотип (в этом примере — логотип **FastAPI**): +Перейдите на [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) — вы увидите, что используется ваш кастомный логотип (в этом примере — логотип **FastAPI**): diff --git a/docs/ru/docs/how-to/general.md b/docs/ru/docs/how-to/general.md index 029ea1d274..886105eec4 100644 --- a/docs/ru/docs/how-to/general.md +++ b/docs/ru/docs/how-to/general.md @@ -4,36 +4,40 @@ ## Фильтрация данных — Безопасность { #filter-data-security } -Чтобы убедиться, что вы не возвращаете больше данных, чем следует, прочитайте документацию: [Руководство — Модель ответа — Возвращаемый тип](../tutorial/response-model.md){.internal-link target=_blank}. +Чтобы убедиться, что вы не возвращаете больше данных, чем следует, прочитайте документацию: [Руководство — Модель ответа — Возвращаемый тип](../tutorial/response-model.md). + +## Оптимизация производительности ответа — Модель ответа — Возвращаемый тип { #optimize-response-performance-response-model-return-type } + +Чтобы оптимизировать производительность при возврате JSON-данных, используйте возвращаемый тип или модель ответа; таким образом Pydantic выполнит сериализацию в JSON на стороне Rust, без прохождения через Python. Подробнее читайте в документации: [Руководство — Модель ответа — Возвращаемый тип](../tutorial/response-model.md). ## Теги в документации — OpenAPI { #documentation-tags-openapi } -Чтобы добавить теги к вашим *операциям пути* и группировать их в интерфейсе документации, прочитайте документацию: [Руководство — Конфигурации операций пути — Теги](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank}. +Чтобы добавить теги к вашим *операциям пути* и группировать их в интерфейсе документации, прочитайте документацию: [Руководство — Конфигурации операций пути — Теги](../tutorial/path-operation-configuration.md#tags). ## Краткое описание и описание в документации — OpenAPI { #documentation-summary-and-description-openapi } -Чтобы добавить краткое описание и описание к вашим *операциям пути* и отобразить их в интерфейсе документации, прочитайте документацию: [Руководство — Конфигурации операций пути — Краткое описание и описание](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank}. +Чтобы добавить краткое описание и описание к вашим *операциям пути* и отобразить их в интерфейсе документации, прочитайте документацию: [Руководство — Конфигурации операций пути — Краткое описание и описание](../tutorial/path-operation-configuration.md#summary-and-description). ## Описание ответа в документации — OpenAPI { #documentation-response-description-openapi } -Чтобы задать описание ответа, отображаемое в интерфейсе документации, прочитайте документацию: [Руководство — Конфигурации операций пути — Описание ответа](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank}. +Чтобы задать описание ответа, отображаемое в интерфейсе документации, прочитайте документацию: [Руководство — Конфигурации операций пути — Описание ответа](../tutorial/path-operation-configuration.md#response-description). ## Документация — пометить операцию пути устаревшей — OpenAPI { #documentation-deprecate-a-path-operation-openapi } -Чтобы пометить *операцию пути* как устаревшую и показать это в интерфейсе документации, прочитайте документацию: [Руководство — Конфигурации операций пути — Пометить операцию пути устаревшей](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank}. +Чтобы пометить *операцию пути* как устаревшую и показать это в интерфейсе документации, прочитайте документацию: [Руководство — Конфигурации операций пути — Пометить операцию пути устаревшей](../tutorial/path-operation-configuration.md#deprecate-a-path-operation). ## Преобразование любых данных к формату, совместимому с JSON { #convert-any-data-to-json-compatible } -Чтобы преобразовать любые данные к формату, совместимому с JSON, прочитайте документацию: [Руководство — JSON-совместимый кодировщик](../tutorial/encoder.md){.internal-link target=_blank}. +Чтобы преобразовать любые данные к формату, совместимому с JSON, прочитайте документацию: [Руководство — JSON-совместимый кодировщик](../tutorial/encoder.md). ## Метаданные OpenAPI — Документация { #openapi-metadata-docs } -Чтобы добавить метаданные в вашу схему OpenAPI, включая лицензию, версию, контакты и т.д., прочитайте документацию: [Руководство — Метаданные и URL документации](../tutorial/metadata.md){.internal-link target=_blank}. +Чтобы добавить метаданные в вашу схему OpenAPI, включая лицензию, версию, контакты и т.д., прочитайте документацию: [Руководство — Метаданные и URL документации](../tutorial/metadata.md). ## Пользовательский URL OpenAPI { #openapi-custom-url } -Чтобы настроить URL OpenAPI (или удалить его), прочитайте документацию: [Руководство — Метаданные и URL документации](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}. +Чтобы настроить URL OpenAPI (или удалить его), прочитайте документацию: [Руководство — Метаданные и URL документации](../tutorial/metadata.md#openapi-url). ## URL документации OpenAPI { #openapi-docs-urls } -Чтобы изменить URL, используемые для автоматически сгенерированных пользовательских интерфейсов документации, прочитайте документацию: [Руководство — Метаданные и URL документации](../tutorial/metadata.md#docs-urls){.internal-link target=_blank}. +Чтобы изменить URL, используемые для автоматически сгенерированных пользовательских интерфейсов документации, прочитайте документацию: [Руководство — Метаданные и URL документации](../tutorial/metadata.md#docs-urls). diff --git a/docs/ru/docs/how-to/graphql.md b/docs/ru/docs/how-to/graphql.md index 9e28d61822..1829a211c1 100644 --- a/docs/ru/docs/how-to/graphql.md +++ b/docs/ru/docs/how-to/graphql.md @@ -18,18 +18,18 @@ Ниже приведены некоторые библиотеки **GraphQL** с поддержкой **ASGI**. Их можно использовать с **FastAPI**: -* Strawberry 🍓 - * С документацией для FastAPI -* Ariadne - * С документацией для FastAPI -* Tartiflette - * С Tartiflette ASGI для интеграции с ASGI -* Graphene - * С starlette-graphene3 +* [Strawberry](https://strawberry.rocks/) 🍓 + * С [документацией для FastAPI](https://strawberry.rocks/docs/integrations/fastapi) +* [Ariadne](https://ariadnegraphql.org/) + * С [документацией для FastAPI](https://ariadnegraphql.org/docs/fastapi-integration) +* [Tartiflette](https://tartiflette.io/) + * С [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) для интеграции с ASGI +* [Graphene](https://graphene-python.org/) + * С [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3) ## GraphQL со Strawberry { #graphql-with-strawberry } -Если вам нужно или хочется работать с **GraphQL**, **Strawberry** — **рекомендуемая** библиотека, так как её дизайн ближе всего к дизайну **FastAPI**, всё основано на **аннотациях типов**. +Если вам нужно или хочется работать с **GraphQL**, [**Strawberry**](https://strawberry.rocks/) — **рекомендуемая** библиотека, так как её дизайн ближе всего к дизайну **FastAPI**, всё основано на **аннотациях типов**. В зависимости от вашего сценария использования вы можете предпочесть другую библиотеку, но если бы вы спросили меня, я, скорее всего, предложил бы попробовать **Strawberry**. @@ -37,24 +37,24 @@ {* ../../docs_src/graphql_/tutorial001_py310.py hl[3,22,25] *} -Подробнее о Strawberry можно узнать в документации Strawberry. +Подробнее о Strawberry можно узнать в [документации Strawberry](https://strawberry.rocks/). -А также в документации по интеграции Strawberry с FastAPI. +А также в документации по [интеграции Strawberry с FastAPI](https://strawberry.rocks/docs/integrations/fastapi). ## Устаревший `GraphQLApp` из Starlette { #older-graphqlapp-from-starlette } -В предыдущих версиях Starlette был класс `GraphQLApp` для интеграции с Graphene. +В предыдущих версиях Starlette был класс `GraphQLApp` для интеграции с [Graphene](https://graphene-python.org/). -Он был объявлен устаревшим в Starlette, но если у вас есть код, который его использовал, вы можете легко **мигрировать** на starlette-graphene3, который решает ту же задачу и имеет **почти идентичный интерфейс**. +Он был объявлен устаревшим в Starlette, но если у вас есть код, который его использовал, вы можете легко **мигрировать** на [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3), который решает ту же задачу и имеет **почти идентичный интерфейс**. /// tip | Совет -Если вам нужен GraphQL, я всё же рекомендую посмотреть Strawberry, так как он основан на аннотациях типов, а не на пользовательских классах и типах. +Если вам нужен GraphQL, я всё же рекомендую посмотреть [Strawberry](https://strawberry.rocks/), так как он основан на аннотациях типов, а не на пользовательских классах и типах. /// ## Подробнее { #learn-more } -Подробнее о **GraphQL** вы можете узнать в официальной документации GraphQL. +Подробнее о **GraphQL** вы можете узнать в [официальной документации GraphQL](https://graphql.org/). Также можно почитать больше о каждой из указанных выше библиотек по приведённым ссылкам. diff --git a/docs/ru/docs/how-to/index.md b/docs/ru/docs/how-to/index.md index 75e7fff265..23d95ba04c 100644 --- a/docs/ru/docs/how-to/index.md +++ b/docs/ru/docs/how-to/index.md @@ -8,6 +8,6 @@ /// tip | Совет -Если вы хотите **изучить FastAPI** структурированно (рекомендуется), вместо этого читайте [Учебник — Руководство пользователя](../tutorial/index.md){.internal-link target=_blank} по главам. +Если вы хотите **изучить FastAPI** структурированно (рекомендуется), вместо этого читайте [Учебник - Руководство пользователя](../tutorial/index.md) по главам. /// diff --git a/docs/ru/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/ru/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md index 2b47c08f67..46b4071da8 100644 --- a/docs/ru/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md +++ b/docs/ru/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md @@ -22,7 +22,7 @@ FastAPI 0.126.0 убрал поддержку Pydantic v1, при этом ещ ## Официальное руководство { #official-guide } -У Pydantic есть официальное руководство по миграции с v1 на v2. +У Pydantic есть официальное [руководство по миграции](https://docs.pydantic.dev/latest/migration/) с v1 на v2. Там также описано, что изменилось, как валидации стали более корректными и строгими, возможные нюансы и т.д. @@ -30,7 +30,7 @@ FastAPI 0.126.0 убрал поддержку Pydantic v1, при этом ещ ## Тесты { #tests } -Убедитесь, что у вас есть [тесты](../tutorial/testing.md){.internal-link target=_blank} для вашего приложения и что вы запускаете их в системе непрерывной интеграции (CI). +Убедитесь, что у вас есть [тесты](../tutorial/testing.md) для вашего приложения и что вы запускаете их в системе непрерывной интеграции (CI). Так вы сможете выполнить обновление и убедиться, что всё работает как ожидается. @@ -38,7 +38,7 @@ FastAPI 0.126.0 убрал поддержку Pydantic v1, при этом ещ Во многих случаях, когда вы используете обычные Pydantic‑модели без пользовательских настроек, вы сможете автоматизировать большую часть процесса миграции с Pydantic v1 на Pydantic v2. -Вы можете использовать `bump-pydantic` от той же команды Pydantic. +Вы можете использовать [`bump-pydantic`](https://github.com/pydantic/bump-pydantic) от той же команды Pydantic. Этот инструмент поможет автоматически изменить большую часть кода, который нужно изменить. diff --git a/docs/ru/docs/how-to/testing-database.md b/docs/ru/docs/how-to/testing-database.md index 18f4deeca5..09cd48fafd 100644 --- a/docs/ru/docs/how-to/testing-database.md +++ b/docs/ru/docs/how-to/testing-database.md @@ -1,7 +1,7 @@ # Тестирование базы данных { #testing-a-database } -Вы можете изучить базы данных, SQL и SQLModel в документации SQLModel. 🤓 +Вы можете изучить базы данных, SQL и SQLModel в [документации SQLModel](https://sqlmodel.tiangolo.com/). 🤓 -Есть мини-руководство по использованию SQLModel с FastAPI. ✨ +Есть мини-[руководство по использованию SQLModel с FastAPI](https://sqlmodel.tiangolo.com/tutorial/fastapi/). ✨ -В этом руководстве есть раздел о тестировании SQL-баз данных. 😎 +В этом руководстве есть раздел о [тестировании SQL-баз данных](https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/). 😎 diff --git a/docs/ru/docs/index.md b/docs/ru/docs/index.md index 877014a086..5694b9f29e 100644 --- a/docs/ru/docs/index.md +++ b/docs/ru/docs/index.md @@ -11,25 +11,25 @@ Фреймворк FastAPI: высокая производительность, прост в изучении, позволяет быстро писать код, готов к продакшн

- + Тест - + Покрытие - + Версия пакета - + Поддерживаемые версии Python

--- -**Документация**: https://fastapi.tiangolo.com +**Документация**: [https://fastapi.tiangolo.com](https://fastapi.tiangolo.com/ru) -**Исходный код**: https://github.com/fastapi/fastapi +**Исходный код**: [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi) --- @@ -44,7 +44,7 @@ FastAPI — это современный, быстрый (высокопрои * **Простота**: Разработан так, чтобы его было легко использовать и осваивать. Меньше времени на чтение документации. * **Краткость**: Минимизируйте дублирование кода. Несколько возможностей из каждого объявления параметров. Меньше ошибок. * **Надежность**: Получите код, готовый к продакшн. С автоматической интерактивной документацией. -* **На основе стандартов**: Основан на открытых стандартах API и полностью совместим с ними: OpenAPI (ранее известный как Swagger) и JSON Schema. +* **На основе стандартов**: Основан на открытых стандартах API и полностью совместим с ними: [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (ранее известный как Swagger) и [JSON Schema](https://json-schema.org/). * оценка на основе тестов внутренней команды разработчиков, создающих продакшн-приложения. @@ -55,51 +55,51 @@ FastAPI — это современный, быстрый (высокопрои ### Ключевой-спонсор { #keystone-sponsor } {% for sponsor in sponsors.keystone -%} - + {% endfor -%} ### Золотые и серебряные спонсоры { #gold-and-silver-sponsors } {% for sponsor in sponsors.gold -%} - + {% endfor -%} {%- for sponsor in sponsors.silver -%} - + {% endfor %} -Другие спонсоры +[Другие спонсоры](https://fastapi.tiangolo.com/ru/fastapi-people/#sponsors) ## Мнения { #opinions } "_[...] В последнее время я много где использую **FastAPI**. [...] На самом деле я планирую использовать его для всех **ML-сервисов моей команды в Microsoft**. Некоторые из них интегрируются в основной продукт **Windows**, а некоторые — в продукты **Office**._" -
Kabir Khan - Microsoft (ref)
+
Kabir Khan - Microsoft (ref)
--- "_Мы начали использовать библиотеку **FastAPI**, чтобы поднять **REST**-сервер, к которому можно обращаться за **предсказаниями**. [для Ludwig]_" -
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
+
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
--- "_**Netflix** рада объявить об открытом релизе нашего фреймворка оркестрации **антикризисного управления**: **Dispatch**! [создан с помощью **FastAPI**]_" -
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
+
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
--- "_Я в полном восторге от **FastAPI**. Это так весело!_" -
Brian Okken - Ведущий подкаста Python Bytes (ref)
+
Brian Okken - Ведущий подкаста [Python Bytes](https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855) (ref)
--- "_Честно говоря, то, что вы создали, выглядит очень солидно и отполировано. Во многих смыслах это то, чем я хотел видеть **Hug** — очень вдохновляет видеть, как кто-то это создал._" -
Timothy Crosley - Создатель Hug (ref)
+
Timothy Crosley - Создатель [Hug](https://github.com/hugapi/hug) (ref)
--- @@ -107,27 +107,27 @@ FastAPI — это современный, быстрый (высокопрои "_Мы переключились на **FastAPI** для наших **API** [...] Думаю, вам тоже понравится [...]_" -
Ines Montani - Matthew Honnibal - Основатели Explosion AI — создатели spaCy (ref) - (ref)
+
Ines Montani - Matthew Honnibal - Основатели [Explosion AI](https://explosion.ai) — создатели [spaCy](https://spacy.io) (ref) - (ref)
--- "_Если кто-то собирается делать продакшн-API на Python, я настоятельно рекомендую **FastAPI**. Он **прекрасно спроектирован**, **прост в использовании** и **отлично масштабируется**, стал **ключевым компонентом** нашей стратегии API-first и приводит в действие множество автоматизаций и сервисов, таких как наш Virtual TAC Engineer._" -
Deon Pillsbury - Cisco (ref)
+
Deon Pillsbury - Cisco (ref)
--- ## Мини-документальный фильм о FastAPI { #fastapi-mini-documentary } -В конце 2025 года вышел мини-документальный фильм о FastAPI, вы можете посмотреть его онлайн: +В конце 2025 года вышел [мини-документальный фильм о FastAPI](https://www.youtube.com/watch?v=mpR8ngthqiE), вы можете посмотреть его онлайн: -FastAPI Mini Documentary +FastAPI Mini Documentary ## **Typer**, FastAPI для CLI { #typer-the-fastapi-of-clis } - + -Если вы создаёте приложение CLI для использования в терминале вместо веб-API, посмотрите **Typer**. +Если вы создаёте приложение CLI для использования в терминале вместо веб-API, посмотрите [**Typer**](https://typer.tiangolo.com/). **Typer** — младший брат FastAPI. И он задуман как **FastAPI для CLI**. ⌨️ 🚀 @@ -135,12 +135,12 @@ FastAPI — это современный, быстрый (высокопрои FastAPI стоит на плечах гигантов: -* Starlette для части, связанной с вебом. -* Pydantic для части, связанной с данными. +* [Starlette](https://www.starlette.dev/) для части, связанной с вебом. +* [Pydantic](https://docs.pydantic.dev/) для части, связанной с данными. ## Установка { #installation } -Создайте и активируйте виртуальное окружение, затем установите FastAPI: +Создайте и активируйте [виртуальное окружение](https://fastapi.tiangolo.com/ru/virtual-environments/), затем установите FastAPI:
@@ -199,7 +199,7 @@ async def read_item(item_id: int, q: str | None = None): **Примечание**: -Если не уверены, посмотрите раздел _«Нет времени?»_ о `async` и `await` в документации. +Если не уверены, посмотрите раздел _«Нет времени?»_ о [`async` и `await` в документации](https://fastapi.tiangolo.com/ru/async/#in-a-hurry). @@ -210,7 +210,7 @@ async def read_item(item_id: int, q: str | None = None):
```console -$ fastapi dev main.py +$ fastapi dev ╭────────── FastAPI CLI - Development mode ───────────╮ │ │ @@ -235,19 +235,19 @@ INFO: Application startup complete.
-О команде fastapi dev main.py... +О команде fastapi dev... -Команда `fastapi dev` читает ваш файл `main.py`, находит в нём приложение **FastAPI** и запускает сервер с помощью Uvicorn. +Команда `fastapi dev` читает ваш файл `main.py`, находит в нём приложение **FastAPI** и запускает сервер с помощью [Uvicorn](https://www.uvicorn.dev). По умолчанию `fastapi dev` запускается с включённой авто-перезагрузкой для локальной разработки. -Подробнее в документации по FastAPI CLI. +Подробнее в [документации по FastAPI CLI](https://fastapi.tiangolo.com/ru/fastapi-cli/).
### Проверка { #check-it } -Откройте браузер на http://127.0.0.1:8000/items/5?q=somequery. +Откройте браузер на [http://127.0.0.1:8000/items/5?q=somequery](http://127.0.0.1:8000/items/5?q=somequery). Вы увидите JSON-ответ: @@ -264,17 +264,17 @@ INFO: Application startup complete. ### Интерактивная документация API { #interactive-api-docs } -Перейдите на http://127.0.0.1:8000/docs. +Перейдите на [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). -Вы увидите автоматическую интерактивную документацию API (предоставлена Swagger UI): +Вы увидите автоматическую интерактивную документацию API (предоставлена [Swagger UI](https://github.com/swagger-api/swagger-ui)): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Альтернативная документация API { #alternative-api-docs } -Теперь откройте http://127.0.0.1:8000/redoc. +Теперь откройте [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). -Вы увидите альтернативную автоматическую документацию (предоставлена ReDoc): +Вы увидите альтернативную автоматическую документацию (предоставлена [ReDoc](https://github.com/Rebilly/ReDoc)): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -316,7 +316,7 @@ def update_item(item_id: int, item: Item): ### Обновление интерактивной документации API { #interactive-api-docs-upgrade } -Перейдите на http://127.0.0.1:8000/docs. +Перейдите на [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). * Интерактивная документация API будет автоматически обновлена, включая новое тело запроса: @@ -332,7 +332,7 @@ def update_item(item_id: int, item: Item): ### Обновление альтернативной документации API { #alternative-api-docs-upgrade } -Теперь откройте http://127.0.0.1:8000/redoc. +Теперь откройте [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). * Альтернативная документация также отразит новый параметр запроса и тело запроса: @@ -442,7 +442,7 @@ item: Item * Очень мощную и простую в использовании систему **внедрения зависимостей**. * Безопасность и аутентификацию, включая поддержку **OAuth2** с **JWT токенами** и **HTTP Basic** аутентификацию. * Более продвинутые (но столь же простые) приёмы объявления **глубоко вложенных JSON-моделей** (спасибо Pydantic). -* Интеграцию **GraphQL** с Strawberry и другими библиотеками. +* Интеграцию **GraphQL** с [Strawberry](https://strawberry.rocks) и другими библиотеками. * Множество дополнительных функций (благодаря Starlette), таких как: * **WebSockets** * чрезвычайно простые тесты на основе HTTPX и `pytest` @@ -452,24 +452,10 @@ item: Item ### Разверните приложение (опционально) { #deploy-your-app-optional } -При желании вы можете развернуть своё приложение FastAPI в FastAPI Cloud, присоединяйтесь к списку ожидания, если ещё не сделали этого. 🚀 +При желании вы можете развернуть своё приложение FastAPI в [FastAPI Cloud](https://fastapicloud.com), присоединяйтесь к списку ожидания, если ещё не сделали этого. 🚀 Если у вас уже есть аккаунт **FastAPI Cloud** (мы пригласили вас из списка ожидания 😉), вы можете развернуть ваше приложение одной командой. -Перед развертыванием убедитесь, что вы вошли в систему: - -
- -```console -$ fastapi login - -You are logged in to FastAPI Cloud 🚀 -``` - -
- -Затем разверните приложение: -
```console @@ -488,7 +474,7 @@ Deploying to FastAPI Cloud... #### О FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** создан тем же автором и командой, что и **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** создан тем же автором и командой, что и **FastAPI**. Он упрощает процесс **создания образа**, **развертывания** и **доступа** к API при минимальных усилиях. @@ -504,9 +490,9 @@ FastAPI — это open source и стандартизированный фре ## Производительность { #performance } -Независимые бенчмарки TechEmpower показывают приложения **FastAPI**, работающие под управлением Uvicorn, как один из самых быстрых доступных фреймворков Python, уступающий только самим Starlette и Uvicorn (используются внутри FastAPI). (*) +Независимые бенчмарки TechEmpower показывают приложения **FastAPI**, работающие под управлением Uvicorn, как [один из самых быстрых доступных фреймворков Python](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), уступающий только самим Starlette и Uvicorn (используются внутри FastAPI). (*) -Чтобы узнать больше, см. раздел Бенчмарки. +Чтобы узнать больше, см. раздел [Бенчмарки](https://fastapi.tiangolo.com/ru/benchmarks/). ## Зависимости { #dependencies } @@ -518,19 +504,19 @@ FastAPI зависит от Pydantic и Starlette. Используется Pydantic: -* email-validator — для проверки адресов электронной почты. +* [`email-validator`](https://github.com/JoshData/python-email-validator) — для проверки адресов электронной почты. Используется Starlette: -* httpx — обязателен, если вы хотите использовать `TestClient`. -* jinja2 — обязателен, если вы хотите использовать конфигурацию шаблонов по умолчанию. -* python-multipart - обязателен, если вы хотите поддерживать «парсинг» форм через `request.form()`. +* [`httpx`](https://www.python-httpx.org) — обязателен, если вы хотите использовать `TestClient`. +* [`jinja2`](https://jinja.palletsprojects.com) — обязателен, если вы хотите использовать конфигурацию шаблонов по умолчанию. +* [`python-multipart`](https://github.com/Kludex/python-multipart) - обязателен, если вы хотите поддерживать «парсинг» форм через `request.form()`. Используется FastAPI: -* uvicorn — сервер, который загружает и «отдаёт» ваше приложение. Включает `uvicorn[standard]`, содержащий некоторые зависимости (например, `uvloop`), нужные для высокой производительности. +* [`uvicorn`](https://www.uvicorn.dev) — сервер, который загружает и «отдаёт» ваше приложение. Включает `uvicorn[standard]`, содержащий некоторые зависимости (например, `uvloop`), нужные для высокой производительности. * `fastapi-cli[standard]` — чтобы предоставить команду `fastapi`. - * Включает `fastapi-cloud-cli`, который позволяет развернуть ваше приложение FastAPI в FastAPI Cloud. + * Включает `fastapi-cloud-cli`, который позволяет развернуть ваше приложение FastAPI в [FastAPI Cloud](https://fastapicloud.com). ### Без зависимостей `standard` { #without-standard-dependencies } @@ -546,13 +532,13 @@ FastAPI зависит от Pydantic и Starlette. Дополнительные опциональные зависимости Pydantic: -* pydantic-settings — для управления настройками. -* pydantic-extra-types — дополнительные типы для использования с Pydantic. +* [`pydantic-settings`](https://docs.pydantic.dev/latest/usage/pydantic_settings/) — для управления настройками. +* [`pydantic-extra-types`](https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/) — дополнительные типы для использования с Pydantic. Дополнительные опциональные зависимости FastAPI: -* orjson — обязателен, если вы хотите использовать `ORJSONResponse`. -* ujson — обязателен, если вы хотите использовать `UJSONResponse`. +* [`orjson`](https://github.com/ijl/orjson) — обязателен, если вы хотите использовать `ORJSONResponse`. +* [`ujson`](https://github.com/esnme/ultrajson) — обязателен, если вы хотите использовать `UJSONResponse`. ## Лицензия { #license } diff --git a/docs/ru/docs/project-generation.md b/docs/ru/docs/project-generation.md index 8155457e38..7a46b210d6 100644 --- a/docs/ru/docs/project-generation.md +++ b/docs/ru/docs/project-generation.md @@ -4,7 +4,7 @@ Вы можете использовать этот шаблон для старта: в нём уже сделана значительная часть начальной настройки, безопасность, база данных и несколько эндпоинтов API. -Репозиторий GitHub: Full Stack FastAPI Template +Репозиторий GitHub: [Full Stack FastAPI Template](https://github.com/tiangolo/full-stack-fastapi-template) ## Шаблон Full Stack FastAPI — Технологический стек и возможности { #full-stack-fastapi-template-technology-stack-and-features } diff --git a/docs/ru/docs/python-types.md b/docs/ru/docs/python-types.md index 95153c3882..61219704c0 100644 --- a/docs/ru/docs/python-types.md +++ b/docs/ru/docs/python-types.md @@ -269,7 +269,7 @@ def some_function(data: Any): ## Pydantic-модели { #pydantic-models } -Pydantic — это библиотека Python для валидации данных. +[Pydantic](https://docs.pydantic.dev/) — это библиотека Python для валидации данных. Вы объявляете «форму» данных как классы с атрибутами. @@ -285,13 +285,13 @@ def some_function(data: Any): /// info | Информация -Чтобы узнать больше о Pydantic, ознакомьтесь с его документацией. +Чтобы узнать больше о [Pydantic, ознакомьтесь с его документацией](https://docs.pydantic.dev/). /// **FastAPI** целиком основан на Pydantic. -Вы увидите намного больше всего этого на практике в [Учебник - Руководство пользователя](tutorial/index.md){.internal-link target=_blank}. +Вы увидите намного больше всего этого на практике в [Учебник - Руководство пользователя](tutorial/index.md). ## Подсказки типов с аннотациями метаданных { #type-hints-with-metadata-annotations } @@ -337,12 +337,12 @@ def some_function(data: Any): * **Документирования** API с использованием OpenAPI: * что затем используется пользовательскими интерфейсами автоматической интерактивной документации. -Всё это может звучать абстрактно. Не волнуйтесь. Вы увидите всё это в действии в [Учебник - Руководство пользователя](tutorial/index.md){.internal-link target=_blank}. +Всё это может звучать абстрактно. Не волнуйтесь. Вы увидите всё это в действии в [Учебник - Руководство пользователя](tutorial/index.md). Важно то, что, используя стандартные типы Python в одном месте (вместо добавления дополнительных классов, декораторов и т.д.), **FastAPI** сделает за вас большую часть работы. /// info | Информация -Если вы уже прошли всё руководство и вернулись, чтобы узнать больше о типах, хорошим ресурсом будет «шпаргалка» от `mypy`. +Если вы уже прошли всё руководство и вернулись, чтобы узнать больше о типах, хорошим ресурсом будет [«шпаргалка» от `mypy`](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html). /// diff --git a/docs/ru/docs/tutorial/background-tasks.md b/docs/ru/docs/tutorial/background-tasks.md index 9fa7a85029..22827b69f3 100644 --- a/docs/ru/docs/tutorial/background-tasks.md +++ b/docs/ru/docs/tutorial/background-tasks.md @@ -61,7 +61,7 @@ ## Технические детали { #technical-details } -Класс `BackgroundTasks` приходит напрямую из `starlette.background`. +Класс `BackgroundTasks` приходит напрямую из [`starlette.background`](https://www.starlette.dev/background/). Он импортируется/включается прямо в FastAPI, чтобы вы могли импортировать его из `fastapi` и избежать случайного импорта альтернативного `BackgroundTask` (без `s` на конце) из `starlette.background`. @@ -69,11 +69,11 @@ По‑прежнему можно использовать один `BackgroundTask` в FastAPI, но тогда вам нужно создать объект в своём коде и вернуть Starlette `Response`, включающий его. -Подробнее см. в официальной документации Starlette по фоновым задачам. +Подробнее см. в [официальной документации Starlette по фоновым задачам](https://www.starlette.dev/background/). ## Предостережение { #caveat } -Если вам нужно выполнять тяжелые вычисления в фоне, и при этом они не обязательно должны запускаться тем же процессом (например, вам не нужно делиться памятью, переменными и т.п.), вам могут подойти более мощные инструменты, такие как Celery. +Если вам нужно выполнять тяжелые вычисления в фоне, и при этом они не обязательно должны запускаться тем же процессом (например, вам не нужно делиться памятью, переменными и т.п.), вам могут подойти более мощные инструменты, такие как [Celery](https://docs.celeryq.dev). Они обычно требуют более сложной конфигурации, менеджера очереди сообщений/заданий (например, RabbitMQ или Redis), но позволяют запускать фоновые задачи в нескольких процессах и, что особенно важно, на нескольких серверах. diff --git a/docs/ru/docs/tutorial/bigger-applications.md b/docs/ru/docs/tutorial/bigger-applications.md index 3fb36d5a22..972313559a 100644 --- a/docs/ru/docs/tutorial/bigger-applications.md +++ b/docs/ru/docs/tutorial/bigger-applications.md @@ -123,7 +123,7 @@ from app.routers import items Для простоты мы воспользовались выдуманным заголовком. -В реальных случаях для получения наилучших результатов используйте интегрированные [утилиты безопасности](security/index.md){.internal-link target=_blank}. +В реальных случаях для получения наилучших результатов используйте интегрированные [утилиты безопасности](security/index.md). /// @@ -169,7 +169,7 @@ async def read_item(item_id: str): /// tip | Подсказка -Обратите внимание, что так же, как и в случае с [зависимостями в декораторах *операций пути*](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, никакое значение не будет передано в вашу *функцию-обработчик пути*. +Обратите внимание, что так же, как и в случае с [зависимостями в декораторах *операций пути*](dependencies/dependencies-in-path-operation-decorators.md), никакое значение не будет передано в вашу *функцию-обработчик пути*. /// @@ -185,8 +185,8 @@ async def read_item(item_id: str): * Все они будут включать предопределённые `responses`. * Все эти *операции пути* будут иметь список `dependencies`, вычисляемых/выполняемых перед ними. * Если вы также объявите зависимости в конкретной *операции пути*, **они тоже будут выполнены**. - * Сначала выполняются зависимости маршрутизатора, затем [`dependencies` в декораторе](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, и затем обычные параметрические зависимости. - * Вы также можете добавить [`Security`-зависимости с `scopes`](../advanced/security/oauth2-scopes.md){.internal-link target=_blank}. + * Сначала выполняются зависимости маршрутизатора, затем [`dependencies` в декораторе](dependencies/dependencies-in-path-operation-decorators.md), и затем обычные параметрические зависимости. + * Вы также можете добавить [`Security`-зависимости с `scopes`](../advanced/security/oauth2-scopes.md). /// tip | Подсказка @@ -303,7 +303,7 @@ from ...dependencies import get_token_header Вы импортируете и создаёте класс `FastAPI` как обычно. -И мы даже можем объявить [глобальные зависимости](dependencies/global-dependencies.md){.internal-link target=_blank}, которые будут объединены с зависимостями для каждого `APIRouter`: +И мы даже можем объявить [глобальные зависимости](dependencies/global-dependencies.md), которые будут объединены с зависимостями для каждого `APIRouter`: {* ../../docs_src/bigger_applications/app_an_py310/main.py hl[1,3,7] title["app/main.py"] *} @@ -353,7 +353,7 @@ from .routers import items, users from app.routers import items, users ``` -Чтобы узнать больше о Python-пакетах и модулях, прочитайте официальную документацию Python о модулях. +Чтобы узнать больше о Python-пакетах и модулях, прочитайте [официальную документацию Python о модулях](https://docs.python.org/3/tutorial/modules.html). /// @@ -465,6 +465,37 @@ from .routers.users import router /// +## Настройка `entrypoint` в `pyproject.toml` { #configure-the-entrypoint-in-pyproject-toml } + +Так как ваш объект FastAPI `app` находится в `app/main.py`, вы можете настроить `entrypoint` в файле `pyproject.toml` следующим образом: + +```toml +[tool.fastapi] +entrypoint = "app.main:app" +``` + +это эквивалентно импорту: + +```python +from app.main import app +``` + +Таким образом, команда `fastapi` будет знать, где найти ваше приложение. + +/// Note | Примечание + +Вы также можете передать путь в команду, например: + +```console +$ fastapi dev app/main.py +``` + +Но вам придётся каждый раз помнить и указывать корректный путь при вызове команды `fastapi`. + +Кроме того, другие инструменты могут не суметь его найти, например [расширение VS Code](../editor-support.md) или [FastAPI Cloud](https://fastapicloud.com), поэтому рекомендуется использовать `entrypoint` в `pyproject.toml`. + +/// + ## Проверка автоматической документации API { #check-the-automatic-api-docs } Теперь запустите приложение: @@ -472,14 +503,14 @@ from .routers.users import router
```console -$ fastapi dev app/main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Откройте документацию по адресу http://127.0.0.1:8000/docs. +Откройте документацию по адресу [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Вы увидите автоматическую документацию API, включая пути из всех подмодулей, с использованием корректных путей (и префиксов) и корректных тегов: diff --git a/docs/ru/docs/tutorial/body-nested-models.md b/docs/ru/docs/tutorial/body-nested-models.md index 6610b209c2..fab025dbc9 100644 --- a/docs/ru/docs/tutorial/body-nested-models.md +++ b/docs/ru/docs/tutorial/body-nested-models.md @@ -95,7 +95,7 @@ my_list: list[str] Помимо обычных простых типов, таких как `str`, `int`, `float` и т.д., вы можете использовать более сложные простые типы, которые наследуются от `str`. -Чтобы увидеть все варианты, которые у вас есть, ознакомьтесь с обзором типов Pydantic. Вы увидите некоторые примеры в следующей главе. +Чтобы увидеть все варианты, которые у вас есть, ознакомьтесь с [обзором типов Pydantic](https://docs.pydantic.dev/latest/concepts/types/). Вы увидите некоторые примеры в следующей главе. Например, так как в модели `Image` у нас есть поле `url`, то мы можем объявить его как тип `HttpUrl` из Pydantic вместо типа `str`: diff --git a/docs/ru/docs/tutorial/body-updates.md b/docs/ru/docs/tutorial/body-updates.md index 4a7adb2559..7d970a7a93 100644 --- a/docs/ru/docs/tutorial/body-updates.md +++ b/docs/ru/docs/tutorial/body-updates.md @@ -1,8 +1,8 @@ -# Body - Обновления { #body-updates } +# Тело запроса - Обновления { #body-updates } ## Обновление с заменой при помощи `PUT` { #update-replacing-with-put } -Чтобы обновить элемент, вы можете использовать операцию HTTP `PUT`. +Чтобы обновить элемент, вы можете использовать операцию [HTTP `PUT`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT). Вы можете использовать `jsonable_encoder`, чтобы преобразовать входные данные в данные, которые можно сохранить как JSON (например, в NoSQL-базе данных). Например, преобразование `datetime` в `str`. @@ -28,11 +28,11 @@ ## Частичное обновление с помощью `PATCH` { #partial-updates-with-patch } -Также можно использовать операцию HTTP `PATCH` для *частичного* обновления данных. +Также можно использовать операцию [HTTP `PATCH`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) для частичного обновления данных. Это означает, что можно передавать только те данные, которые необходимо обновить, оставляя остальные нетронутыми. -/// note | Технические детали +/// note | Примечание `PATCH` менее распространен и известен, чем `PUT`. @@ -89,12 +89,12 @@ /// -/// note | Технические детали +/// note | Примечание Обратите внимание, что входная модель по-прежнему валидируется. Таким образом, если вы хотите получать частичные обновления, в которых могут быть опущены все атрибуты, вам необходимо иметь модель, в которой все атрибуты помечены как необязательные (со значениями по умолчанию или `None`). -Чтобы отличить модели со всеми необязательными значениями для **обновления** от моделей с обязательными значениями для **создания**, можно воспользоваться идеями, описанными в [Дополнительные модели](extra-models.md){.internal-link target=_blank}. +Чтобы отличить модели со всеми необязательными значениями для обновления и модели с обязательными значениями для создания, можно воспользоваться идеями, описанными в [Дополнительные модели](extra-models.md). /// diff --git a/docs/ru/docs/tutorial/body.md b/docs/ru/docs/tutorial/body.md index 3e55607da5..8a67c8f51e 100644 --- a/docs/ru/docs/tutorial/body.md +++ b/docs/ru/docs/tutorial/body.md @@ -6,7 +6,7 @@ Ваш API почти всегда должен отправлять тело **ответа**. Но клиентам не обязательно всегда отправлять **тело запроса**: иногда они запрашивают только путь, возможно с некоторыми параметрами запроса, но без тела. -Чтобы объявить тело **запроса**, используйте модели Pydantic, со всей их мощью и преимуществами. +Чтобы объявить тело **запроса**, используйте модели [Pydantic](https://docs.pydantic.dev/), со всей их мощью и преимуществами. /// info | Информация @@ -73,7 +73,7 @@ * Если данные некорректны, вернёт понятную и наглядную ошибку, указывающую, где именно и что было некорректно. * Передаст полученные данные в параметр `item`. * Поскольку внутри функции вы объявили его с типом `Item`, у вас будет поддержка со стороны редактора кода (автозавершение и т.п.) для всех атрибутов и их типов. -* Сгенерирует определения JSON Schema для вашей модели; вы можете использовать их и в других местах, если это имеет смысл для вашего проекта. +* Сгенерирует определения [JSON Schema](https://json-schema.org) для вашей модели; вы можете использовать их и в других местах, если это имеет смысл для вашего проекта. * Эти схемы будут частью сгенерированной схемы OpenAPI и будут использоваться автоматической документацией UIs. ## Автоматическая документация { #automatic-docs } @@ -102,15 +102,15 @@ JSON Schema ваших моделей будет частью сгенериро В сам Pydantic даже были внесены некоторые изменения для поддержки этого. -Предыдущие скриншоты сделаны в Visual Studio Code. +Предыдущие скриншоты сделаны в [Visual Studio Code](https://code.visualstudio.com). -Но вы получите такую же поддержку редактора кода в PyCharm и большинстве других редакторов Python: +Но вы получите такую же поддержку редактора кода в [PyCharm](https://www.jetbrains.com/pycharm/) и большинстве других редакторов Python: /// tip | Совет -Если вы используете PyCharm в качестве редактора кода, вы можете использовать плагин Pydantic PyCharm Plugin. +Если вы используете [PyCharm](https://www.jetbrains.com/pycharm/) в качестве редактора кода, вы можете использовать плагин [Pydantic PyCharm Plugin](https://github.com/koxudaxi/pydantic-pycharm-plugin/). Он улучшает поддержку моделей Pydantic в редакторе кода, включая: @@ -163,4 +163,4 @@ FastAPI понимает, что значение `q` не является об ## Без Pydantic { #without-pydantic } -Если вы не хотите использовать модели Pydantic, вы также можете использовать параметры **Body**. См. раздел документации [Тело запроса - Несколько параметров: Единичные значения в теле](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank}. +Если вы не хотите использовать модели Pydantic, вы также можете использовать параметры **Body**. См. раздел документации [Тело запроса - Несколько параметров: Единичные значения в теле](body-multiple-params.md#singular-values-in-body). diff --git a/docs/ru/docs/tutorial/cors.md b/docs/ru/docs/tutorial/cors.md index feaa159683..b18b1ddf46 100644 --- a/docs/ru/docs/tutorial/cors.md +++ b/docs/ru/docs/tutorial/cors.md @@ -1,6 +1,6 @@ # CORS (Cross-Origin Resource Sharing) { #cors-cross-origin-resource-sharing } -Понятие CORS или "Cross-Origin Resource Sharing" относится к ситуациям, при которых запущенный в браузере фронтенд содержит JavaScript-код, который взаимодействует с бэкендом, находящимся на другом "источнике" ("origin"). +[CORS или "Cross-Origin Resource Sharing"](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) относится к ситуациям, при которых запущенный в браузере фронтенд содержит JavaScript-код, который взаимодействует с бэкендом, находящимся на другом "источнике" ("origin"). ## Источник { #origin } @@ -55,10 +55,10 @@ * `allow_origins` - Список источников, на которые разрешено выполнять кросс-доменные запросы. Например, `['https://example.org', 'https://www.example.org']`. Можно использовать `['*']`, чтобы разрешить любые источники. * `allow_origin_regex` - Регулярное выражение для определения источников, на которые разрешено выполнять кросс-доменные запросы. Например, `'https://.*\.example\.org'`. * `allow_methods` - Список HTTP-методов, которые разрешены для кросс-доменных запросов. По умолчанию `['GET']`. Можно использовать `['*']`, чтобы разрешить все стандартные методы. -* `allow_headers` - Список HTTP-заголовков запроса, которые должны поддерживаться при кросс-доменных запросах. По умолчанию `[]`. Можно использовать `['*']`, чтобы разрешить все заголовки. Заголовки `Accept`, `Accept-Language`, `Content-Language` и `Content-Type` всегда разрешены для простых CORS-запросов. +* `allow_headers` - Список HTTP-заголовков запроса, которые должны поддерживаться при кросс-доменных запросах. По умолчанию `[]`. Можно использовать `['*']`, чтобы разрешить все заголовки. Заголовки `Accept`, `Accept-Language`, `Content-Language` и `Content-Type` всегда разрешены для [простых CORS-запросов](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests). * `allow_credentials` - Указывает, что куки разрешены в кросс-доменных запросах. По умолчанию `False`. - Ни один из параметров `allow_origins`, `allow_methods` и `allow_headers` не может быть установлен в `['*']`, если `allow_credentials` имеет значение `True`. Все они должны быть указаны явно. + Ни один из параметров `allow_origins`, `allow_methods` и `allow_headers` не может быть установлен в `['*']`, если `allow_credentials` имеет значение `True`. Все они должны быть [указаны явно](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards). * `expose_headers` - Указывает любые заголовки ответа, которые должны быть доступны браузеру. По умолчанию `[]`. * `max_age` - Устанавливает максимальное время в секундах, в течение которого браузер кэширует CORS-ответы. По умолчанию `600`. @@ -77,7 +77,7 @@ ## Больше информации { #more-info } -Для получения более подробной информации о CORS обратитесь к документации CORS от Mozilla. +Для получения более подробной информации о CORS обратитесь к [документации CORS от Mozilla](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS). /// note | Технические детали diff --git a/docs/ru/docs/tutorial/debugging.md b/docs/ru/docs/tutorial/debugging.md index 483fe80869..330055be4d 100644 --- a/docs/ru/docs/tutorial/debugging.md +++ b/docs/ru/docs/tutorial/debugging.md @@ -74,7 +74,7 @@ from myapp import app /// info | Информация -Для получения дополнительной информации, ознакомьтесь с официальной документацией Python. +Для получения дополнительной информации, ознакомьтесь с [официальной документацией Python](https://docs.python.org/3/library/__main__.html). /// diff --git a/docs/ru/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/ru/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md index 4cfc4e699f..b4b7ce6314 100644 --- a/docs/ru/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md +++ b/docs/ru/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md @@ -32,11 +32,11 @@ В этом примере мы используем выдуманные пользовательские HTTP-заголовки `X-Key` и `X-Token`. -Но в реальных проектах, при внедрении системы безопасности, вы получите больше пользы используя интегрированные [средства защиты (следующая глава)](../security/index.md){.internal-link target=_blank}. +Но в реальных проектах, при внедрении системы безопасности, вы получите больше пользы используя интегрированные [средства защиты (следующая глава)](../security/index.md). /// -## Исключения в Зависимостях и возвращаемые значения { #dependencies-errors-and-return-values } +## Ошибки в зависимостях и возвращаемые значения { #dependencies-errors-and-return-values } Вы можете использовать те же *функции* зависимостей, что и обычно. @@ -62,7 +62,7 @@ ## Зависимости для группы *операций путей* { #dependencies-for-a-group-of-path-operations } -Позже, читая о том как структурировать большие приложения ([Большие приложения — несколько файлов](../../tutorial/bigger-applications.md){.internal-link target=_blank}), возможно, многофайловые, вы узнаете как объявить единый параметр `dependencies` для всей группы *операций путей*. +Позже, читая о том как структурировать большие приложения ([Большие приложения — несколько файлов](../../tutorial/bigger-applications.md)), возможно, многофайловые, вы узнаете как объявить единый параметр `dependencies` для всей группы *операций путей*. ## Глобальные Зависимости { #global-dependencies } diff --git a/docs/ru/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/ru/docs/tutorial/dependencies/dependencies-with-yield.md index 03a7c083c4..04c2c2da42 100644 --- a/docs/ru/docs/tutorial/dependencies/dependencies-with-yield.md +++ b/docs/ru/docs/tutorial/dependencies/dependencies-with-yield.md @@ -14,8 +14,8 @@ FastAPI поддерживает зависимости, которые выпо Любая функция, с которой можно корректно использовать: -* `@contextlib.contextmanager` или -* `@contextlib.asynccontextmanager` +* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) или +* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager) будет корректной для использования в качестве зависимости **FastAPI**. @@ -87,7 +87,7 @@ FastAPI поддерживает зависимости, которые выпо /// note | Технические детали -Это работает благодаря менеджерам контекста в Python. +Это работает благодаря [менеджерам контекста](https://docs.python.org/3/library/contextlib.html) в Python. **FastAPI** использует их внутренне для достижения этого. @@ -111,7 +111,7 @@ FastAPI поддерживает зависимости, которые выпо {* ../../docs_src/dependencies/tutorial008b_an_py310.py hl[18:22,31] *} -Если вы хотите перехватывать исключения и формировать на их основе пользовательский ответ, создайте [Пользовательский обработчик исключений](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}. +Если вы хотите перехватывать исключения и формировать на их основе пользовательский ответ, создайте [Пользовательский обработчик исключений](../handling-errors.md#install-custom-exception-handlers). ## Зависимости с `yield` и `except` { #dependencies-with-yield-and-except } @@ -233,14 +233,14 @@ participant operation as Функция-обработчик пути Зависимости с `yield` со временем эволюционировали, чтобы покрыть разные сценарии и исправить некоторые проблемы. -Если вы хотите посмотреть, что менялось в разных версиях FastAPI, вы можете прочитать об этом подробнее в продвинутом руководстве: [Продвинутые зависимости — зависимости с `yield`, `HTTPException`, `except` и фоновыми задачами](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks){.internal-link target=_blank}. +Если вы хотите посмотреть, что менялось в разных версиях FastAPI, вы можете прочитать об этом подробнее в продвинутом руководстве: [Продвинутые зависимости — зависимости с `yield`, `HTTPException`, `except` и фоновыми задачами](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks). ## Контекстные менеджеры { #context-managers } ### Что такое «контекстные менеджеры» { #what-are-context-managers } «Контекстные менеджеры» — это любые объекты Python, которые можно использовать в операторе `with`. -Например, можно использовать `with` для чтения файла: +Например, [можно использовать `with` для чтения файла](https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files): ```Python with open("./somefile.txt") as f: @@ -264,7 +264,7 @@ with open("./somefile.txt") as f: /// -В Python можно создавать менеджеры контекста, создав класс с двумя методами: `__enter__()` и `__exit__()`. +В Python можно создавать менеджеры контекста, [создав класс с двумя методами: `__enter__()` и `__exit__()`](https://docs.python.org/3/reference/datamodel.html#context-managers). Их также можно использовать внутри зависимостей **FastAPI** с `yield`, применяя операторы `with` или `async with` внутри функции зависимости: @@ -275,8 +275,8 @@ with open("./somefile.txt") as f: Другой способ создания менеджера контекста — с помощью: -* `@contextlib.contextmanager` или -* `@contextlib.asynccontextmanager` +* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) или +* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager) оформив ими функцию с одним `yield`. diff --git a/docs/ru/docs/tutorial/dependencies/global-dependencies.md b/docs/ru/docs/tutorial/dependencies/global-dependencies.md index f488322a9e..1563d3e8fe 100644 --- a/docs/ru/docs/tutorial/dependencies/global-dependencies.md +++ b/docs/ru/docs/tutorial/dependencies/global-dependencies.md @@ -2,14 +2,14 @@ Для некоторых типов приложений может потребоваться добавить зависимости ко всему приложению. -Подобно тому, как вы можете [добавлять `dependencies` (зависимости) в *декораторах операций пути*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, вы можете добавлять зависимости сразу ко всему `FastAPI` приложению. +Подобно тому, как вы можете [добавлять `dependencies` (зависимости) в *декораторах операций пути*](dependencies-in-path-operation-decorators.md), вы можете добавлять зависимости сразу ко всему `FastAPI` приложению. В этом случае они будут применяться ко всем *операциям пути* в приложении: {* ../../docs_src/dependencies/tutorial012_an_py310.py hl[17] *} -Все способы [добавления `dependencies` (зависимостей) в *декораторах операций пути*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} по-прежнему применимы, но в данном случае зависимости применяются ко всем *операциям пути* приложения. +Все способы [добавления `dependencies` (зависимостей) в *декораторах операций пути*](dependencies-in-path-operation-decorators.md) по-прежнему применимы, но в данном случае зависимости применяются ко всем *операциям пути* приложения. ## Зависимости для групп *операций пути* { #dependencies-for-groups-of-path-operations } -Позднее, читая о том, как структурировать более крупные приложения ([приложения, содержащие много файлов](../../tutorial/bigger-applications.md){.internal-link target=_blank}), возможно, состоящие из нескольких файлов, вы узнаете, как объявить один параметр `dependencies` для целой группы *операций пути*. +Позднее, читая о том, как структурировать более крупные приложения ([Более крупные приложения - несколько файлов](../../tutorial/bigger-applications.md)), возможно, состоящие из нескольких файлов, вы узнаете, как объявить один параметр `dependencies` для целой группы *операций пути*. diff --git a/docs/ru/docs/tutorial/dependencies/index.md b/docs/ru/docs/tutorial/dependencies/index.md index 29f735ab61..4aed035541 100644 --- a/docs/ru/docs/tutorial/dependencies/index.md +++ b/docs/ru/docs/tutorial/dependencies/index.md @@ -14,7 +14,7 @@ * Обеспечить общую логику (один и тот же алгоритм снова и снова). * Разделять соединения с базой данных. -* Обеспечить безопасность, аутентификацию, требования к ролям и т. п. +* Обеспечить безопасность, аутентификацию, требования к ролям и т.п. * И многое другое... Всё это при минимизации повторения кода. @@ -57,7 +57,7 @@ FastAPI добавил поддержку `Annotated` (и начал реком Если у вас более старая версия, вы получите ошибки при попытке использовать `Annotated`. -Убедитесь, что вы [обновили версию FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} как минимум до 0.95.1, прежде чем использовать `Annotated`. +Убедитесь, что вы [обновили версию FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions) как минимум до 0.95.1, прежде чем использовать `Annotated`. /// @@ -67,11 +67,11 @@ FastAPI добавил поддержку `Annotated` (и начал реком ### Объявите зависимость в «зависимом» { #declare-the-dependency-in-the-dependant } -Точно так же, как вы используете `Body`, `Query` и т. д. с параметрами вашей *функции обработки пути*, используйте `Depends` с новым параметром: +Точно так же, как вы используете `Body`, `Query` и т.д. с параметрами вашей *функции обработки пути*, используйте `Depends` с новым параметром: {* ../../docs_src/dependencies/tutorial001_an_py310.py hl[13,18] *} -Хотя вы используете `Depends` в параметрах вашей функции так же, как `Body`, `Query` и т. д., `Depends` работает немного иначе. +Хотя вы используете `Depends` в параметрах вашей функции так же, как `Body`, `Query` и т.д., `Depends` работает немного иначе. В `Depends` вы передаёте только один параметр. @@ -146,13 +146,13 @@ commons: Annotated[dict, Depends(common_parameters)] Вы можете использовать `async def` или обычное `def`. -И вы можете объявлять зависимости с `async def` внутри обычных *функций обработки пути* `def`, или зависимости `def` внутри *функций обработки пути* `async def` и т. д. +И вы можете объявлять зависимости с `async def` внутри обычных *функций обработки пути* `def`, или зависимости `def` внутри *функций обработки пути* `async def` и т.д. Это не важно. **FastAPI** знает, что делать. /// note | Примечание -Если вы не уверены, посмотрите раздел [Async: *"In a hurry?"*](../../async.md#in-a-hurry){.internal-link target=_blank} о `async` и `await` в документации. +Если вы не уверены, посмотрите раздел [Async: «Нет времени?»](../../async.md#in-a-hurry) о `async` и `await` в документации. /// diff --git a/docs/ru/docs/tutorial/encoder.md b/docs/ru/docs/tutorial/encoder.md index 28e2a49c0a..f68b401cb4 100644 --- a/docs/ru/docs/tutorial/encoder.md +++ b/docs/ru/docs/tutorial/encoder.md @@ -12,7 +12,7 @@ Например, она не принимает объекты `datetime`, так как они не совместимы с JSON. -В таком случае объект `datetime` следует преобразовать в строку, соответствующую формату ISO. +В таком случае объект `datetime` следует преобразовать в `str`, содержащую данные в [формате ISO](https://en.wikipedia.org/wiki/ISO_8601). Точно так же эта база данных не может принять Pydantic-модель (объект с атрибутами), а только `dict`. @@ -24,7 +24,7 @@ В данном примере она преобразует Pydantic-модель в `dict`, а `datetime` - в `str`. -Результатом её вызова является объект, который может быть закодирован с помощью функции из стандартной библиотеки Python – `json.dumps()`. +Результатом её вызова является объект, который может быть закодирован с помощью функции из стандартной библиотеки Python – [`json.dumps()`](https://docs.python.org/3/library/json.html#json.dumps). Функция не возвращает большой `str`, содержащий данные в формате JSON (в виде строки). Она возвращает стандартную структуру данных Python (например, `dict`) со значениями и подзначениями, которые совместимы с JSON. diff --git a/docs/ru/docs/tutorial/extra-data-types.md b/docs/ru/docs/tutorial/extra-data-types.md index 3b52b5d747..062c195742 100644 --- a/docs/ru/docs/tutorial/extra-data-types.md +++ b/docs/ru/docs/tutorial/extra-data-types.md @@ -36,7 +36,7 @@ * `datetime.timedelta`: * Встроенный в Python `datetime.timedelta`. * В запросах и ответах будет представлен в виде общего количества секунд типа `float`. - * Pydantic также позволяет представить его как "Кодировку разницы во времени ISO 8601", см. документацию для получения дополнительной информации. + * Pydantic также позволяет представить его как "Кодировку разницы во времени ISO 8601", [см. документацию для получения дополнительной информации](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers). * `frozenset`: * В запросах и ответах обрабатывается так же, как и `set`: * В запросах будет прочитан список, исключены дубликаты и преобразован в `set`. @@ -49,7 +49,7 @@ * `Decimal`: * Встроенный в Python `Decimal`. * В запросах и ответах обрабатывается так же, как и `float`. -* Вы можете проверить все допустимые типы данных Pydantic здесь: Типы данных Pydantic. +* Вы можете проверить все допустимые типы данных Pydantic здесь: [Типы данных Pydantic](https://docs.pydantic.dev/latest/usage/types/types/). ## Пример { #example } diff --git a/docs/ru/docs/tutorial/extra-models.md b/docs/ru/docs/tutorial/extra-models.md index f9b63ca70e..becb76bc3f 100644 --- a/docs/ru/docs/tutorial/extra-models.md +++ b/docs/ru/docs/tutorial/extra-models.md @@ -12,7 +12,7 @@ Никогда не храните пароли пользователей в чистом виде. Всегда храните "безопасный хэш", который вы затем сможете проверить. -Если вам это не знакомо, вы можете узнать про "хэш пароля" в [главах о безопасности](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}. +Если вам это не знакомо, вы можете узнать про "хэш пароля" в [главах о безопасности](security/simple-oauth2.md#password-hashing). /// @@ -162,11 +162,11 @@ UserInDB( Он будет определён в OpenAPI как `anyOf`. -Для этого используйте стандартную аннотацию типов в Python `typing.Union`: +Для этого используйте стандартную аннотацию типов в Python [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union): /// note | Примечание -При объявлении `Union` сначала указывайте наиболее специфичный тип, затем менее специфичный. В примере ниже более специфичный `PlaneItem` стоит перед `CarItem` в `Union[PlaneItem, CarItem]`. +При объявлении [`Union`](https://docs.pydantic.dev/latest/concepts/types/#unions) сначала указывайте наиболее специфичный тип, затем менее специфичный. В примере ниже более специфичный `PlaneItem` стоит перед `CarItem` в `Union[PlaneItem, CarItem]`. /// diff --git a/docs/ru/docs/tutorial/first-steps.md b/docs/ru/docs/tutorial/first-steps.md index cee264ff46..7216d4cb79 100644 --- a/docs/ru/docs/tutorial/first-steps.md +++ b/docs/ru/docs/tutorial/first-steps.md @@ -11,7 +11,7 @@
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -58,7 +58,7 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ### Проверьте { #check-it } -Откройте браузер по адресу: http://127.0.0.1:8000. +Откройте браузер по адресу: [http://127.0.0.1:8000](http://127.0.0.1:8000). Вы увидите JSON-ответ вида: @@ -68,17 +68,17 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ### Интерактивная документация API { #interactive-api-docs } -Теперь перейдите по адресу: http://127.0.0.1:8000/docs. +Теперь перейдите по адресу: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). -Вы увидите автоматически сгенерированную интерактивную документацию по API (предоставлено Swagger UI): +Вы увидите автоматически сгенерированную интерактивную документацию по API (предоставлено [Swagger UI](https://github.com/swagger-api/swagger-ui)): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Альтернативная документация API { #alternative-api-docs } -И теперь перейдите по адресу http://127.0.0.1:8000/redoc. +И теперь перейдите по адресу [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). -Вы увидите альтернативную автоматически сгенерированную документацию (предоставлено ReDoc): +Вы увидите альтернативную автоматически сгенерированную документацию (предоставлено [ReDoc](https://github.com/Rebilly/ReDoc)): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -92,15 +92,15 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) #### «Схема» API { #api-schema } -В данном случае OpenAPI — это спецификация, которая определяет, как описывать схему вашего API. +В данном случае [OpenAPI](https://github.com/OAI/OpenAPI-Specification) — это спецификация, которая определяет, как описывать схему вашего API. -Это определение схемы включает пути вашего API, возможные параметры, которые они принимают, и т. п. +Это определение схемы включает пути вашего API, возможные параметры, которые они принимают, и т.п. #### «Схема» данных { #data-schema } Термин «схема» также может относиться к форме некоторых данных, например, к содержимому JSON. -В таком случае это будут атрибуты JSON, их типы данных и т. п. +В таком случае это будут атрибуты JSON, их типы данных и т.п. #### OpenAPI и JSON Schema { #openapi-and-json-schema } @@ -110,7 +110,7 @@ OpenAPI определяет схему API для вашего API. И эта Если вам интересно, как выглядит исходная схема OpenAPI, FastAPI автоматически генерирует JSON (схему) с описанием всего вашего API. -Вы можете посмотреть её напрямую по адресу: http://127.0.0.1:8000/openapi.json. +Вы можете посмотреть её напрямую по адресу: [http://127.0.0.1:8000/openapi.json](http://127.0.0.1:8000/openapi.json). Вы увидите JSON, начинающийся примерно так: @@ -143,9 +143,58 @@ OpenAPI определяет схему API для вашего API. И эта Вы также можете использовать её для автоматической генерации кода для клиентов, которые взаимодействуют с вашим API. Например, для фронтенд-, мобильных или IoT-приложений. +### Настройте app `entrypoint` в `pyproject.toml` { #configure-the-app-entrypoint-in-pyproject-toml } + +Вы можете указать расположение вашего приложения в файле `pyproject.toml`, например: + +```toml +[tool.fastapi] +entrypoint = "main:app" +``` + +Этот `entrypoint` подскажет команде `fastapi`, что приложение нужно импортировать так: + +```python +from main import app +``` + +Если структура вашего кода выглядит так: + +``` +. +├── backend +│   ├── main.py +│   ├── __init__.py +``` + +Тогда следует указать такой `entrypoint`: + +```toml +[tool.fastapi] +entrypoint = "backend.main:app" +``` + +что будет эквивалентно: + +```python +from backend.main import app +``` + +### `fastapi dev` с путём { #fastapi-dev-with-path } + +Вы также можете передать путь к файлу в команду `fastapi dev`, и она попытается определить объект приложения FastAPI для использования: + +```console +$ fastapi dev main.py +``` + +Но в этом случае вам придётся каждый раз помнить о передаче корректного пути при вызове команды `fastapi`. + +Кроме того, другие инструменты могут его не найти, например [Расширение VS Code](../editor-support.md) или [FastAPI Cloud](https://fastapicloud.com), поэтому рекомендуется использовать `entrypoint` в `pyproject.toml`. + ### Разверните приложение (необязательно) { #deploy-your-app-optional } -При желании вы можете развернуть своё приложение FastAPI в FastAPI Cloud, перейдите и присоединитесь к списку ожидания, если ещё не сделали этого. 🚀 +При желании вы можете развернуть своё приложение FastAPI в [FastAPI Cloud](https://fastapicloud.com), перейдите и присоединитесь к списку ожидания, если ещё не сделали этого. 🚀 Если у вас уже есть аккаунт **FastAPI Cloud** (мы пригласили вас из списка ожидания 😉), вы можете развернуть приложение одной командой. @@ -191,7 +240,7 @@ Deploying to FastAPI Cloud... `FastAPI` — это класс, который напрямую наследуется от `Starlette`. -Вы можете использовать весь функционал Starlette и в `FastAPI`. +Вы можете использовать весь функционал [Starlette](https://www.starlette.dev/) и в `FastAPI`. /// @@ -336,7 +385,7 @@ https://example.com/items/foo /// note | Примечание -Если вы не знаете, в чём разница, посмотрите [Асинхронность: *"Нет времени?"*](../async.md#in-a-hurry){.internal-link target=_blank}. +Если вы не знаете, в чём разница, посмотрите [Асинхронность: *"Нет времени?"*](../async.md#in-a-hurry). /// @@ -348,15 +397,15 @@ https://example.com/items/foo Также можно вернуть модели Pydantic (подробнее об этом позже). -Многие другие объекты и модели будут автоматически преобразованы в JSON (включая ORM и т. п.). Попробуйте использовать те, что вам привычнее, с высокой вероятностью они уже поддерживаются. +Многие другие объекты и модели будут автоматически преобразованы в JSON (включая ORM и т.п.). Попробуйте использовать те, что вам привычнее, с высокой вероятностью они уже поддерживаются. ### Шаг 6: разверните приложение { #step-6-deploy-it } -Разверните приложение в **FastAPI Cloud** одной командой: `fastapi deploy`. 🎉 +Разверните приложение в **[FastAPI Cloud](https://fastapicloud.com)** одной командой: `fastapi deploy`. 🎉 #### О FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** создан тем же автором и командой, что и **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** создан тем же автором и командой, что и **FastAPI**. Он упрощает процесс **создания образа**, **развертывания** и **доступа** к API с минимальными усилиями. diff --git a/docs/ru/docs/tutorial/handling-errors.md b/docs/ru/docs/tutorial/handling-errors.md index fbd82cf28a..fde188f09f 100644 --- a/docs/ru/docs/tutorial/handling-errors.md +++ b/docs/ru/docs/tutorial/handling-errors.md @@ -81,7 +81,7 @@ ## Установка пользовательских обработчиков исключений { #install-custom-exception-handlers } -Вы можете добавить пользовательские обработчики исключений с помощью тех же утилит обработки исключений из Starlette. +Вы можете добавить пользовательские обработчики исключений с помощью [тех же утилит обработки исключений из Starlette](https://www.starlette.dev/exceptions/). Допустим, у вас есть пользовательское исключение `UnicornException`, которое вы (или используемая вами библиотека) можете `вызвать`. diff --git a/docs/ru/docs/tutorial/index.md b/docs/ru/docs/tutorial/index.md index 6674c6720f..eec217b75b 100644 --- a/docs/ru/docs/tutorial/index.md +++ b/docs/ru/docs/tutorial/index.md @@ -10,12 +10,12 @@ Все блоки кода можно копировать и использовать напрямую (это действительно протестированные файлы Python). -Чтобы запустить любой из примеров, скопируйте код в файл `main.py` и запустите `fastapi dev` с: +Чтобы запустить любой из примеров, скопируйте код в файл `main.py` и запустите `fastapi dev`:
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -62,7 +62,7 @@ $ fastapi dev @@ -76,7 +76,7 @@ $ pip install "fastapi[standard]" /// note | Примечание -При установке с помощью `pip install "fastapi[standard]"` добавляются некоторые стандартные необязательные зависимости по умолчанию, включая `fastapi-cloud-cli`, который позволяет развернуть приложение на FastAPI Cloud. +При установке с помощью `pip install "fastapi[standard]"` добавляются некоторые стандартные необязательные зависимости по умолчанию, включая `fastapi-cloud-cli`, который позволяет развернуть приложение на [FastAPI Cloud](https://fastapicloud.com). Если вы не хотите иметь эти необязательные зависимости, установите просто `pip install fastapi`. @@ -84,6 +84,12 @@ $ pip install "fastapi[standard]" /// +/// tip | Совет + +У FastAPI есть [официальное расширение для VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (и Cursor), которое предоставляет множество функций, включая обзор операций пути, поиск операций пути, навигацию CodeLens в тестах (переход к определению из тестов), а также развертывание в FastAPI Cloud и просмотр логов - всё прямо из вашего редактора кода. + +/// + ## Продвинутое руководство пользователя { #advanced-user-guide } Существует также **Продвинутое руководство пользователя**, которое вы сможете прочитать после **Учебник - Руководство пользователя**. diff --git a/docs/ru/docs/tutorial/metadata.md b/docs/ru/docs/tutorial/metadata.md index 221655aa5d..261cc43f50 100644 --- a/docs/ru/docs/tutorial/metadata.md +++ b/docs/ru/docs/tutorial/metadata.md @@ -14,7 +14,7 @@ | `version` | `string` | Версия API. Версия вашего собственного приложения, а не OpenAPI. К примеру `2.5.0`. | | `terms_of_service` | `str` | Ссылка к условиям пользования API. Если указано, то это должен быть URL-адрес. | | `contact` | `dict` | Контактная информация для открытого API. Может содержать несколько полей.
поля contact
ПараметрТипОписание
namestrИдентификационное имя контактного лица/организации.
urlstrURL указывающий на контактную информацию. ДОЛЖЕН быть в формате URL.
emailstrEmail адрес контактного лица/организации. ДОЛЖЕН быть в формате email адреса.
| -| `license_info` | `dict` | Информация о лицензии открытого API. Может содержать несколько полей.
поля license_info
ПараметрТипОписание
namestrОБЯЗАТЕЛЬНО (если установлен параметр license_info). Название лицензии, используемой для API.
identifierstrВыражение лицензии SPDX для API. Поле identifier взаимоисключающее с полем url. Доступно начиная с OpenAPI 3.1.0, FastAPI 0.99.0.
urlstrURL, указывающий на лицензию, используемую для API. ДОЛЖЕН быть в формате URL.
| +| `license_info` | `dict` | Информация о лицензии открытого API. Может содержать несколько полей.
поля license_info
ПараметрТипОписание
namestrОБЯЗАТЕЛЬНО (если установлен параметр license_info). Название лицензии, используемой для API.
identifierstrВыражение лицензии [SPDX](https://spdx.org/licenses/) для API. Поле identifier взаимоисключающее с полем url. Доступно начиная с OpenAPI 3.1.0, FastAPI 0.99.0.
urlstrURL, указывающий на лицензию, используемую для API. ДОЛЖЕН быть в формате URL.
| Вы можете задать их следующим образом: @@ -76,7 +76,7 @@ /// info | Дополнительная информация -Узнайте больше о тегах в [Конфигурации операции пути](path-operation-configuration.md#tags){.internal-link target=_blank}. +Узнайте больше о тегах в [Конфигурации операции пути](path-operation-configuration.md#tags). /// diff --git a/docs/ru/docs/tutorial/middleware.md b/docs/ru/docs/tutorial/middleware.md index 734545cd8b..81140051f2 100644 --- a/docs/ru/docs/tutorial/middleware.md +++ b/docs/ru/docs/tutorial/middleware.md @@ -15,7 +15,7 @@ Если у вас есть зависимости с `yield`, то код выхода (код после `yield`) будет выполняться *после* middleware. -Если были какие‑либо фоновые задачи (рассматриваются в разделе [Фоновые задачи](background-tasks.md){.internal-link target=_blank}, вы увидите это позже), они будут запущены *после* всех middleware. +Если были какие‑либо фоновые задачи (рассматриваются в разделе [Фоновые задачи](background-tasks.md), вы увидите это позже), они будут запущены *после* всех middleware. /// @@ -35,9 +35,9 @@ /// tip | Совет -Имейте в виду, что можно добавлять проприетарные HTTP-заголовки с префиксом `X-`. +Имейте в виду, что можно добавлять проприетарные HTTP-заголовки [с префиксом `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). -Но если вы хотите, чтобы клиент в браузере мог видеть ваши пользовательские заголовки, необходимо добавить их в настройки CORS ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}), используя параметр `expose_headers`, описанный в документации по CORS Starlette. +Но если вы хотите, чтобы клиент в браузере мог видеть ваши пользовательские заголовки, необходимо добавить их в настройки CORS ([CORS (Cross-Origin Resource Sharing)](cors.md)), используя параметр `expose_headers`, описанный в [документации по CORS Starlette](https://www.starlette.dev/middleware/#corsmiddleware). /// @@ -61,7 +61,7 @@ /// tip | Совет -Мы используем `time.perf_counter()` вместо `time.time()` для обеспечения большей точности в таких случаях. 🤓 +Мы используем [`time.perf_counter()`](https://docs.python.org/3/library/time.html#time.perf_counter) вместо `time.time()` для обеспечения большей точности в таких случаях. 🤓 /// @@ -90,6 +90,6 @@ app.add_middleware(MiddlewareB) ## Другие middleware { #other-middlewares } -О других middleware вы можете узнать больше в разделе [Advanced User Guide: Advanced Middleware](../advanced/middleware.md){.internal-link target=_blank}. +О других middleware вы можете узнать больше в разделе [Расширенное руководство пользователя: Продвинутое middleware](../advanced/middleware.md). В следующем разделе вы можете прочитать, как настроить CORS с помощью middleware. diff --git a/docs/ru/docs/tutorial/path-operation-configuration.md b/docs/ru/docs/tutorial/path-operation-configuration.md index 31531c67f1..965f2a1ba2 100644 --- a/docs/ru/docs/tutorial/path-operation-configuration.md +++ b/docs/ru/docs/tutorial/path-operation-configuration.md @@ -14,7 +14,7 @@ Вы можете передать только `int`-значение кода, например `404`. -Но если вы не помните, для чего нужен каждый числовой код, вы можете использовать сокращенные константы в параметре `status`: +Но если вы не помните, для чего нужен каждый числовой код, вы можете использовать сокращенные константы в `status`: {* ../../docs_src/path_operation_configuration/tutorial001_py310.py hl[1,15] *} @@ -58,7 +58,7 @@ Так как описания обычно длинные и содержат много строк, вы можете объявить описание *операции пути* в строке документации функции, и **FastAPI** прочитает её оттуда. -Вы можете использовать Markdown в строке документации, и он будет интерпретирован и отображён корректно (с учетом отступа в строке документации). +Вы можете использовать [Markdown](https://en.wikipedia.org/wiki/Markdown) в строке документации, и он будет интерпретирован и отображён корректно (с учетом отступа в строке документации). {* ../../docs_src/path_operation_configuration/tutorial004_py310.py hl[17:25] *} diff --git a/docs/ru/docs/tutorial/path-params-numeric-validations.md b/docs/ru/docs/tutorial/path-params-numeric-validations.md index 6c1148b60c..34eeb80cb2 100644 --- a/docs/ru/docs/tutorial/path-params-numeric-validations.md +++ b/docs/ru/docs/tutorial/path-params-numeric-validations.md @@ -14,7 +14,7 @@ Если вы используете более старую версию, вы столкнётесь с ошибками при попытке использовать `Annotated`. -Убедитесь, что вы [обновили версию FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} как минимум до 0.95.1 перед тем, как использовать `Annotated`. +Убедитесь, что вы [обновили версию FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions) как минимум до 0.95.1 перед тем, как использовать `Annotated`. /// @@ -112,17 +112,17 @@ Python не будет ничего делать с `*`, но он будет з Валидация также применима к значениям типа `float`. -В этом случае становится важной возможность добавить ограничение gt, вместо ge, поскольку в таком случае вы можете, например, создать ограничение, чтобы значение было больше `0`, даже если оно меньше `1`. +В этом случае становится важной возможность добавить ограничение gt, вместо ge, поскольку в таком случае вы можете, например, создать ограничение, чтобы значение было больше `0`, даже если оно меньше `1`. Таким образом, `0.5` будет корректным значением. А `0.0` или `0` — нет. -То же самое справедливо и для lt. +То же самое справедливо и для lt. {* ../../docs_src/path_params_numeric_validations/tutorial006_an_py310.py hl[13] *} ## Резюме { #recap } -С помощью `Query`, `Path` (и других классов, которые мы пока не затронули) вы можете добавлять метаданные и строковую валидацию тем же способом, как и в главе [Query-параметры и валидация строк](query-params-str-validations.md){.internal-link target=_blank}. +С помощью `Query`, `Path` (и других классов, которые мы пока не затронули) вы можете добавлять метаданные и строковую валидацию тем же способом, как и в главе [Query-параметры и валидация строк](query-params-str-validations.md). А также вы можете добавить валидацию числовых данных: diff --git a/docs/ru/docs/tutorial/path-params.md b/docs/ru/docs/tutorial/path-params.md index 7295697487..79343a1588 100644 --- a/docs/ru/docs/tutorial/path-params.md +++ b/docs/ru/docs/tutorial/path-params.md @@ -6,7 +6,7 @@ Значение параметра пути `item_id` будет передано в функцию в качестве аргумента `item_id`. -Если запустите этот пример и перейдёте по адресу: http://127.0.0.1:8000/items/foo, то увидите ответ: +Если запустите этот пример и перейдёте по адресу: [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo), то увидите ответ: ```JSON {"item_id":"foo"} @@ -28,7 +28,7 @@ ## Преобразование данных { #data-conversion } -Если запустите этот пример и перейдёте по адресу: http://127.0.0.1:8000/items/3, то увидите ответ: +Если запустите этот пример и перейдёте по адресу: [http://127.0.0.1:8000/items/3](http://127.0.0.1:8000/items/3), то увидите ответ: ```JSON {"item_id":3} @@ -44,7 +44,7 @@ ## Валидация данных { #data-validation } -Если откроете браузер по адресу http://127.0.0.1:8000/items/foo, то увидите интересную HTTP-ошибку: +Если откроете браузер по адресу [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo), то увидите интересную HTTP-ошибку: ```JSON { @@ -64,7 +64,7 @@ из-за того, что параметр пути `item_id` имеет значение `"foo"`, которое не является типом `int`. -Та же ошибка возникнет, если вместо `int` передать `float`, например: http://127.0.0.1:8000/items/4.2 +Та же ошибка возникнет, если вместо `int` передать `float`, например: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2) /// check | Заметка @@ -78,7 +78,7 @@ ## Документация { #documentation } -И теперь, когда откроете браузер по адресу: http://127.0.0.1:8000/docs, то увидите вот такую автоматически сгенерированную документацию API: +И теперь, когда откроете браузер по адресу: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs), то увидите вот такую автоматически сгенерированную документацию API: @@ -92,9 +92,9 @@ ## Преимущества стандартизации, альтернативная документация { #standards-based-benefits-alternative-documentation } -Поскольку сгенерированная схема соответствует стандарту OpenAPI, её можно использовать со множеством совместимых инструментов. +Поскольку сгенерированная схема соответствует стандарту [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md), её можно использовать со множеством совместимых инструментов. -Именно поэтому, **FastAPI** сам предоставляет альтернативную документацию API (используя ReDoc), которую можно получить по адресу: http://127.0.0.1:8000/redoc. +Именно поэтому, **FastAPI** сам предоставляет альтернативную документацию API (используя ReDoc), которую можно получить по адресу: [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). @@ -102,7 +102,7 @@ ## Pydantic { #pydantic } -Вся проверка данных выполняется под капотом с помощью Pydantic. Поэтому вы можете быть уверены в качестве обработки данных. +Вся проверка данных выполняется под капотом с помощью [Pydantic](https://docs.pydantic.dev/), поэтому вы получаете все его преимущества. И вы можете быть уверены, что находитесь в надёжных руках. Вы можете использовать в аннотациях как простые типы данных, вроде `str`, `float`, `bool`, так и более сложные типы. @@ -130,7 +130,7 @@ ## Предопределенные значения { #predefined-values } -Что если нам нужно заранее определить допустимые *параметры пути*, которые *операция пути* может принимать? В таком случае можно использовать стандартное перечисление `Enum` Python. +Что если нам нужно заранее определить допустимые *параметры пути*, которые *операция пути* может принимать? В таком случае можно использовать стандартное перечисление `Enum` Python. ### Создание класса `Enum` { #create-an-enum-class } diff --git a/docs/ru/docs/tutorial/query-params-str-validations.md b/docs/ru/docs/tutorial/query-params-str-validations.md index 43cbcad03c..08a5e11a54 100644 --- a/docs/ru/docs/tutorial/query-params-str-validations.md +++ b/docs/ru/docs/tutorial/query-params-str-validations.md @@ -35,13 +35,13 @@ FastAPI поймёт, что значение `q` не обязательно, Если у вас более старая версия, при попытке использовать `Annotated` вы получите ошибки. -Убедитесь, что вы [обновили версию FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} как минимум до 0.95.1 перед использованием `Annotated`. +Убедитесь, что вы [обновили версию FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions) как минимум до 0.95.1 перед использованием `Annotated`. /// ## Использовать `Annotated` в типе для параметра `q` { #use-annotated-in-the-type-for-the-q-parameter } -Помните, я уже говорил, что `Annotated` можно использовать для добавления метаданных к параметрам в разделе [Введение в типы Python](../python-types.md#type-hints-with-metadata-annotations){.internal-link target=_blank}? +Помните, я уже говорил, что `Annotated` можно использовать для добавления метаданных к параметрам в разделе [Введение в типы Python](../python-types.md#type-hints-with-metadata-annotations)? Пришло время использовать его с FastAPI. 🚀 @@ -157,7 +157,7 @@ q: str = Query(default="rick") Если вы не используете `Annotated`, а применяете **(устаревший) стиль со значением по умолчанию**, то при вызове этой функции без FastAPI в **других местах** вам нужно **помнить** о том, что надо передать аргументы, чтобы всё работало корректно, иначе значения будут не такими, как вы ожидаете (например, вместо `str` будет `QueryInfo` или что-то подобное). И ни редактор, ни Python не будут ругаться при самом вызове функции — ошибка проявится лишь при операциях внутри. -Так как `Annotated` может содержать больше одной аннотации метаданных, теперь вы можете использовать ту же функцию и с другими инструментами, например с Typer. 🚀 +Так как `Annotated` может содержать больше одной аннотации метаданных, теперь вы можете использовать ту же функцию и с другими инструментами, например с [Typer](https://typer.tiangolo.com/). 🚀 ## Больше валидаций { #add-more-validations } @@ -369,11 +369,11 @@ http://127.0.0.1:8000/items/?item-query=foobaritems В таких случаях можно использовать **кастомную функцию-валидатор**, которая применяется после обычной валидации (например, после проверки, что значение — это `str`). -Этого можно добиться, используя `AfterValidator` Pydantic внутри `Annotated`. +Этого можно добиться, используя [`AfterValidator` Pydantic](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) внутри `Annotated`. /// tip | Совет -В Pydantic также есть `BeforeValidator` и другие. 🤓 +В Pydantic также есть [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator) и другие. 🤓 /// @@ -389,7 +389,7 @@ http://127.0.0.1:8000/items/?item-query=foobaritems /// tip | Совет -Если вам нужна валидация, требующая общения с каким‑либо **внешним компонентом** — базой данных или другим API — вместо этого используйте **Зависимости FastAPI** (FastAPI Dependencies), вы познакомитесь с ними позже. +Если вам нужна валидация, требующая общения с каким‑либо **внешним компонентом** — базой данных или другим API — вместо этого используйте **Зависимости FastAPI**, вы познакомитесь с ними позже. Эти кастомные валидаторы предназначены для проверок, которые можно выполнить, имея **только** те же **данные**, что пришли в запросе. diff --git a/docs/ru/docs/tutorial/query-params.md b/docs/ru/docs/tutorial/query-params.md index cbacb129c5..99f2a98aeb 100644 --- a/docs/ru/docs/tutorial/query-params.md +++ b/docs/ru/docs/tutorial/query-params.md @@ -182,6 +182,6 @@ http://127.0.0.1:8000/items/foo-item?needy=sooooneedy /// tip | Подсказка -Вы можете использовать класс `Enum` также, как ранее применяли его с [Path-параметрами](path-params.md#predefined-values){.internal-link target=_blank}. +Вы можете использовать класс `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 41922333f8..e8500adbac 100644 --- a/docs/ru/docs/tutorial/request-files.md +++ b/docs/ru/docs/tutorial/request-files.md @@ -4,9 +4,9 @@ /// info | Дополнительная информация -Чтобы получать загруженные файлы, сначала установите `python-multipart`. +Чтобы получать загруженные файлы, сначала установите [`python-multipart`](https://github.com/Kludex/python-multipart). -Убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md){.internal-link target=_blank}, активировали его, а затем установили пакет, например: +Убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md), активировали его, а затем установили пакет, например: ```console $ pip install python-multipart @@ -63,8 +63,8 @@ $ pip install python-multipart * Файл, хранящийся в памяти до максимального предела размера, после преодоления которого он будет храниться на диске. * Это означает, что он будет хорошо работать с большими файлами, такими как изображения, видео, большие бинарные файлы и т.д., не потребляя при этом всю память. * Из загруженного файла можно получить метаданные. -* Он реализует file-like `async` интерфейс. -* Он предоставляет реальный объект Python `SpooledTemporaryFile` который вы можете передать непосредственно другим библиотекам, которые ожидают файл в качестве объекта. +* Он реализует [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), который вы можете передать непосредственно другим библиотекам, которые ожидают файл в качестве объекта. ### `UploadFile` { #uploadfile } @@ -72,7 +72,7 @@ $ pip install python-multipart * `filename`: Строка `str` с исходным именем файла, который был загружен (например, `myimage.jpg`). * `content_type`: Строка `str` с типом содержимого (MIME type / media type) (например, `image/jpeg`). -* `file`: `SpooledTemporaryFile` (a file-like объект). Это фактический файл Python, который можно передавать непосредственно другим функциям или библиотекам, ожидающим файл в качестве объекта. +* `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, который можно передавать непосредственно другим функциям или библиотекам, ожидающим файл в качестве объекта. `UploadFile` имеет следующие методы `async`. Все они вызывают соответствующие файловые методы (используя внутренний `SpooledTemporaryFile`). @@ -120,9 +120,9 @@ contents = myfile.file.read() Данные из форм обычно кодируются с использованием "media type" `application/x-www-form-urlencoded` когда он не включает файлы. -Но когда форма включает файлы, она кодируется как multipart/form-data. Если вы используете `File`, **FastAPI** будет знать, что ему нужно получить файлы из нужной части тела. +Но когда форма включает файлы, она кодируется как `multipart/form-data`. Если вы используете `File`, **FastAPI** будет знать, что ему нужно получить файлы из нужной части тела. -Если вы хотите узнать больше об этих кодировках и полях форм, перейдите по ссылке MDN web docs for POST. +Если вы хотите узнать больше об этих кодировках и полях форм, перейдите по ссылке [MDN web docs for `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). /// diff --git a/docs/ru/docs/tutorial/request-form-models.md b/docs/ru/docs/tutorial/request-form-models.md index f4411a27bc..c7f37c2baf 100644 --- a/docs/ru/docs/tutorial/request-form-models.md +++ b/docs/ru/docs/tutorial/request-form-models.md @@ -4,9 +4,9 @@ /// info | Дополнительная информация -Чтобы использовать формы, сначала установите `python-multipart`. +Чтобы использовать формы, сначала установите [`python-multipart`](https://github.com/Kludex/python-multipart). -Убедитесь, что вы создали и активировали [виртуальное окружение](../virtual-environments.md){.internal-link target=_blank}, а затем установите пакет, например: +Убедитесь, что вы создали и активировали [виртуальное окружение](../virtual-environments.md), а затем установите пакет, например: ```console $ pip install 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 10836d74fd..f291d53479 100644 --- a/docs/ru/docs/tutorial/request-forms-and-files.md +++ b/docs/ru/docs/tutorial/request-forms-and-files.md @@ -4,9 +4,9 @@ /// info | Информация -Чтобы получать загруженные файлы и/или данные форм, сначала установите `python-multipart`. +Чтобы получать загруженные файлы и/или данные форм, сначала установите [`python-multipart`](https://github.com/Kludex/python-multipart). -Убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md){.internal-link target=_blank}, активировали его, а затем установили пакет, например: +Убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md), активировали его, а затем установили пакет, например: ```console $ pip install python-multipart diff --git a/docs/ru/docs/tutorial/request-forms.md b/docs/ru/docs/tutorial/request-forms.md index 01f71ac2fc..3760a8a3b9 100644 --- a/docs/ru/docs/tutorial/request-forms.md +++ b/docs/ru/docs/tutorial/request-forms.md @@ -4,9 +4,9 @@ /// info | Дополнительная информация -Чтобы использовать формы, сначала установите `python-multipart`. +Чтобы использовать формы, сначала установите [`python-multipart`](https://github.com/Kludex/python-multipart). -Убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md){.internal-link target=_blank}, активировали его, а затем установили пакет, например: +Убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md), активировали его, а затем установили пакет, например: ```console $ pip install python-multipart @@ -56,7 +56,7 @@ $ pip install python-multipart Но когда форма содержит файлы, она кодируется как `multipart/form-data`. О работе с файлами вы прочтёте в следующей главе. -Если вы хотите узнать больше про эти кодировки и поля формы, обратитесь к MDN веб-документации для `POST`. +Если вы хотите узнать больше про эти кодировки и поля формы, обратитесь к [MDN веб-документации для `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). /// diff --git a/docs/ru/docs/tutorial/response-model.md b/docs/ru/docs/tutorial/response-model.md index cd99ce28c7..510143d7b4 100644 --- a/docs/ru/docs/tutorial/response-model.md +++ b/docs/ru/docs/tutorial/response-model.md @@ -13,6 +13,7 @@ FastAPI будет использовать этот возвращаемый т * Добавить **JSON Schema** для ответа в OpenAPI *операции пути*. * Это будет использовано **автоматической документацией**. * Это также будет использовано инструментами автоматической генерации клиентского кода. +* **Сериализовать** возвращаемые данные в JSON с помощью Pydantic, который написан на **Rust**, поэтому это будет **намного быстрее**. Но самое главное: @@ -73,9 +74,9 @@ FastAPI будет использовать этот `response_model` для д /// info | Информация -Чтобы использовать `EmailStr`, сначала установите `email-validator`. +Чтобы использовать `EmailStr`, сначала установите [`email-validator`](https://github.com/JoshData/python-email-validator). -Убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md){.internal-link target=_blank}, активировали его, а затем установите пакет, например: +Убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md), активировали его, а затем установите пакет, например: ```console $ pip install email-validator @@ -181,7 +182,7 @@ FastAPI делает несколько вещей внутри вместе с ### Возврат Response напрямую { #return-a-response-directly } -Самый распространённый случай — [возвращать Response напрямую, как описано далее в разделах документации для продвинутых](../advanced/response-directly.md){.internal-link target=_blank}. +Самый распространённый случай — [возвращать Response напрямую, как описано далее в разделах документации для продвинутых](../advanced/response-directly.md). {* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *} @@ -201,7 +202,7 @@ FastAPI делает несколько вещей внутри вместе с Но когда вы возвращаете произвольный объект, не являющийся валидным типом Pydantic (например, объект базы данных), и аннотируете его таким образом в функции, FastAPI попытается создать модель ответа Pydantic из этой аннотации типа и потерпит неудачу. -То же произойдёт, если у вас будет что-то вроде union разных типов, где один или несколько не являются валидными типами Pydantic, например, это приведёт к ошибке 💥: +То же произойдёт, если у вас будет что-то вроде объединение разных типов, где один или несколько не являются валидными типами Pydantic, например, это приведёт к ошибке 💥: {* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *} @@ -257,7 +258,7 @@ FastAPI делает несколько вещей внутри вместе с * `response_model_exclude_defaults=True` * `response_model_exclude_none=True` -как описано в документации Pydantic для `exclude_defaults` и `exclude_none`. +как описано в [документации Pydantic](https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict) для `exclude_defaults` и `exclude_none`. /// diff --git a/docs/ru/docs/tutorial/response-status-code.md b/docs/ru/docs/tutorial/response-status-code.md index 13d982e803..f3144a33ab 100644 --- a/docs/ru/docs/tutorial/response-status-code.md +++ b/docs/ru/docs/tutorial/response-status-code.md @@ -20,7 +20,7 @@ /// info | Информация -В качестве значения параметра `status_code` также может использоваться `IntEnum`, например, из библиотеки `http.HTTPStatus` в Python. +В качестве значения параметра `status_code` также может использоваться `IntEnum`, например, из библиотеки [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus) в Python. /// @@ -66,7 +66,7 @@ FastAPI знает об этом и создаст документацию Open /// tip | Подсказка -Чтобы узнать больше о HTTP кодах статуса и о том, для чего каждый из них предназначен, ознакомьтесь с MDN документацией об HTTP статус-кодах. +Чтобы узнать больше о HTTP кодах статуса и о том, для чего каждый из них предназначен, ознакомьтесь с [MDN документацией об HTTP статус-кодах](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status). /// @@ -98,4 +98,4 @@ FastAPI знает об этом и создаст документацию Open ## Изменение кода статуса по умолчанию { #changing-the-default } -Позже, в [Руководстве для продвинутых пользователей](../advanced/response-change-status-code.md){.internal-link target=_blank}, вы узнаете, как возвращать HTTP статус-код, отличный от значения по умолчанию, которое вы объявляете здесь. +Позже, в [Руководстве для продвинутых пользователей](../advanced/response-change-status-code.md), вы узнаете, как возвращать HTTP статус-код, отличный от значения по умолчанию, которое вы объявляете здесь. diff --git a/docs/ru/docs/tutorial/schema-extra-example.md b/docs/ru/docs/tutorial/schema-extra-example.md index c7381aae25..ee2f5b9913 100644 --- a/docs/ru/docs/tutorial/schema-extra-example.md +++ b/docs/ru/docs/tutorial/schema-extra-example.md @@ -12,7 +12,7 @@ Эта дополнительная информация будет добавлена как есть в выходную **JSON Schema** этой модели и будет использоваться в документации API. -Вы можете использовать атрибут `model_config`, который принимает `dict`, как описано в Документации Pydantic: Конфигурация. +Вы можете использовать атрибут `model_config`, который принимает `dict`, как описано в [Документация Pydantic: Конфигурация](https://docs.pydantic.dev/latest/api/config/). Вы можете задать `"json_schema_extra"` с `dict`, содержащим любые дополнительные данные, которые вы хотите видеть в сгенерированной JSON Schema, включая `examples`. @@ -145,12 +145,12 @@ OpenAPI 3.1.0 (используется начиная с FastAPI 0.99.0) доб OpenAPI также добавила поля `example` и `examples` в другие части спецификации: -* `Parameter Object` (в спецификации), которое использовалось в FastAPI: +* [`Parameter Object` (в спецификации)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object), которое использовалось в FastAPI: * `Path()` * `Query()` * `Header()` * `Cookie()` -* `Request Body Object`, в поле `content`, в `Media Type Object` (в спецификации), которое использовалось в FastAPI: +* [`Request Body Object`, в поле `content`, в `Media Type Object` (в спецификации)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object), которое использовалось в FastAPI: * `Body()` * `File()` * `Form()` @@ -163,7 +163,7 @@ OpenAPI также добавила поля `example` и `examples` в друг ### Поле `examples` в JSON Schema { #json-schemas-examples-field } -Позже в новой версии спецификации JSON Schema было добавлено поле `examples`. +Позже в новой версии спецификации JSON Schema было добавлено поле [`examples`](https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5). А затем новый OpenAPI 3.1.0 был основан на последней версии (JSON Schema 2020-12), которая включала это новое поле `examples`. diff --git a/docs/ru/docs/tutorial/security/first-steps.md b/docs/ru/docs/tutorial/security/first-steps.md index 9b9673b842..c55e832f40 100644 --- a/docs/ru/docs/tutorial/security/first-steps.md +++ b/docs/ru/docs/tutorial/security/first-steps.md @@ -26,11 +26,11 @@ /// info | Дополнительная информация -Пакет `python-multipart` автоматически устанавливается вместе с **FastAPI**, если вы запускаете команду `pip install "fastapi[standard]"`. +Пакет [`python-multipart`](https://github.com/Kludex/python-multipart) автоматически устанавливается вместе с **FastAPI**, если вы запускаете команду `pip install "fastapi[standard]"`. Однако, если вы используете команду `pip install fastapi`, пакет `python-multipart` по умолчанию не включается. -Чтобы установить его вручную, убедитесь, что вы создали [виртуальное окружение](../../virtual-environments.md){.internal-link target=_blank}, активировали его и затем установили пакет: +Чтобы установить его вручную, убедитесь, что вы создали [виртуальное окружение](../../virtual-environments.md), активировали его и затем установили пакет: ```console $ pip install python-multipart @@ -45,7 +45,7 @@ $ pip install python-multipart
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -54,7 +54,7 @@ $ fastapi dev main.py ## Проверка { #check-it } -Перейдите к интерактивной документации по адресу: http://127.0.0.1:8000/docs. +Перейдите к интерактивной документации по адресу: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Вы увидите примерно следующее: @@ -140,7 +140,7 @@ OAuth2 был спроектирован так, чтобы бэкенд или Поскольку мы используем относительный 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){.internal-link target=_blank}. +Использование относительного URL важно для того, чтобы ваше приложение продолжало работать даже в таком продвинутом случае, как [За прокси-сервером](../../advanced/behind-a-proxy.md). /// diff --git a/docs/ru/docs/tutorial/security/oauth2-jwt.md b/docs/ru/docs/tutorial/security/oauth2-jwt.md index f7853d48f7..e3729dfc83 100644 --- a/docs/ru/docs/tutorial/security/oauth2-jwt.md +++ b/docs/ru/docs/tutorial/security/oauth2-jwt.md @@ -24,13 +24,13 @@ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4 Через неделю срок действия токена истечет, пользователь не будет авторизован и ему придется заново входить в систему, чтобы получить новый токен. А если пользователь (или третье лицо) попытается модифицировать токен, чтобы изменить срок действия, вы сможете это обнаружить, поскольку подписи не будут совпадать. -Если вы хотите поиграть с JWT-токенами и посмотреть, как они работают, посмотрите https://jwt.io. +Если вы хотите поиграть с JWT-токенами и посмотреть, как они работают, посмотрите [https://jwt.io](https://jwt.io/). ## Установка `PyJWT` { #install-pyjwt } Нам необходимо установить `pyjwt` для генерации и проверки JWT-токенов на языке Python. -Убедитесь, что вы создали [виртуальное окружение](../../virtual-environments.md){.internal-link target=_blank}, активируйте его, а затем установите `pyjwt`: +Убедитесь, что вы создали [виртуальное окружение](../../virtual-environments.md), активируйте его, а затем установите `pyjwt`:
@@ -46,7 +46,7 @@ $ pip install pyjwt Если вы планируете использовать алгоритмы цифровой подписи, такие как RSA или ECDSA, вам следует установить зависимость библиотеки криптографии `pyjwt[crypto]`. -Подробнее об этом можно прочитать в документации по установке PyJWT. +Подробнее об этом можно прочитать в [документации по установке PyJWT](https://pyjwt.readthedocs.io/en/latest/installation.html). /// @@ -72,7 +72,7 @@ pwdlib — это отличный пакет Python для работы с хэ Рекомендуемый алгоритм — "Argon2". -Убедитесь, что вы создали [виртуальное окружение](../../virtual-environments.md){.internal-link target=_blank}, активируйте его, и затем установите pwdlib вместе с Argon2: +Убедитесь, что вы создали [виртуальное окружение](../../virtual-environments.md), активируйте его, и затем установите pwdlib вместе с Argon2:
@@ -200,7 +200,7 @@ JWT может использоваться и для других целей, ## Проверка в действии { #check-it } -Запустите сервер и перейдите к документации: http://127.0.0.1:8000/docs. +Запустите сервер и перейдите к документации: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Вы увидите пользовательский интерфейс вида: diff --git a/docs/ru/docs/tutorial/security/simple-oauth2.md b/docs/ru/docs/tutorial/security/simple-oauth2.md index 4b86a40139..4ef5109e4f 100644 --- a/docs/ru/docs/tutorial/security/simple-oauth2.md +++ b/docs/ru/docs/tutorial/security/simple-oauth2.md @@ -137,7 +137,7 @@ UserInDB( ``` /// info | Дополнительная информация -Более полное объяснение `**user_dict` можно найти в [документации к **Дополнительным моделям**](../extra-models.md#about-user-in-dict){.internal-link target=_blank}. +Более полное объяснение `**user_dict` можно найти в [документации к **Дополнительным моделям**](../extra-models.md#about-user-in-dict). /// ## Возврат токена { #return-the-token } @@ -200,7 +200,7 @@ UserInDB( ## Посмотрим, как это работает { #see-it-in-action } -Откройте интерактивную документацию: http://127.0.0.1:8000/docs. +Откройте интерактивную документацию: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). ### Аутентификация { #authenticate } diff --git a/docs/ru/docs/tutorial/server-sent-events.md b/docs/ru/docs/tutorial/server-sent-events.md new file mode 100644 index 0000000000..be6bd23665 --- /dev/null +++ b/docs/ru/docs/tutorial/server-sent-events.md @@ -0,0 +1,120 @@ +# События, отправляемые сервером (SSE) { #server-sent-events-sse } + +Вы можете передавать данные потоком клиенту, используя Server-Sent Events (SSE). + +Это похоже на [Стриминг JSON Lines](stream-json-lines.md), но использует формат `text/event-stream`, который нативно поддерживается браузерами через [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource). + +/// info | Информация + +Добавлено в FastAPI 0.135.0. + +/// + +## Что такое Server-Sent Events? { #what-are-server-sent-events } + +SSE — это стандарт для потоковой передачи данных с сервера на клиента по HTTP. + +Каждое событие — это небольшой текстовый блок с «полями», такими как `data`, `event`, `id` и `retry`, разделёнными пустыми строками. + +Это выглядит так: + +``` +data: {"name": "Portal Gun", "price": 999.99} + +data: {"name": "Plumbus", "price": 32.99} + +``` + +SSE часто используют для стриминга ответов ИИ в чатах, живых уведомлений, логов и наблюдаемости, а также в других случаях, когда сервер «проталкивает» обновления клиенту. + +/// tip | Совет + +Если вам нужно стримить бинарные данные, например видео или аудио, посмотрите расширенное руководство: [Stream Data](../advanced/stream-data.md). + +/// + +## Стриминг SSE с FastAPI { #stream-sse-with-fastapi } + +Чтобы стримить SSE с FastAPI, используйте `yield` в своей функции-обработчике пути и укажите `response_class=EventSourceResponse`. + +Импортируйте `EventSourceResponse` из `fastapi.sse`: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[4,22] *} + +Каждый возвращаемый через `yield` элемент кодируется как JSON и отправляется в поле `data:` события SSE. + +Если вы объявите тип возврата как `AsyncIterable[Item]`, FastAPI будет использовать его, чтобы выполнить **валидацию**, добавить **документацию** и **сериализовать** данные с помощью Pydantic. + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[10:12,23] *} + +/// tip | Совет + +Так как Pydantic будет сериализовать это на стороне **Rust**, вы получите значительно более высокую **производительность**, чем если не объявите тип возврата. + +/// + +### Несинхронные функции-обработчики пути { #non-async-path-operation-functions } + +Вы также можете использовать обычные функции `def` (без `async`) и применять `yield` тем же образом. + +FastAPI проследит, чтобы выполнение прошло корректно и не блокировало цикл событий. + +Так как в этом случае функция не async, правильным типом возврата будет `Iterable[Item]`: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[28:31] hl[29] *} + +### Без объявленного типа возврата { #no-return-type } + +Вы также можете опустить тип возврата. FastAPI использует [`jsonable_encoder`](./encoder.md) для преобразования данных и их отправки. + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[34:37] hl[35] *} + +## `ServerSentEvent` { #serversentevent } + +Если вам нужно задать поля SSE, такие как `event`, `id`, `retry` или `comment`, вы можете возвращать через `yield` объекты `ServerSentEvent` вместо обычных данных. + +Импортируйте `ServerSentEvent` из `fastapi.sse`: + +{* ../../docs_src/server_sent_events/tutorial002_py310.py hl[4,26] *} + +Поле `data` всегда кодируется как JSON. Вы можете передавать любое значение, сериализуемое в JSON, включая Pydantic-модели. + +## Необработанные данные { #raw-data } + +Если нужно отправлять данные без JSON-кодирования, используйте `raw_data` вместо `data`. + +Это полезно для отправки заранее отформатированного текста, строк логов или специальных значений «сентинель», например `[DONE]`. + +{* ../../docs_src/server_sent_events/tutorial003_py310.py hl[17] *} + +/// note | Примечание + +`data` и `raw_data` взаимно исключают друг друга. В каждом `ServerSentEvent` можно задать только одно из них. + +/// + +## Возобновление с `Last-Event-ID` { #resuming-with-last-event-id } + +Когда браузер переподключается после обрыва соединения, он отправляет последний полученный `id` в HTTP-заголовке `Last-Event-ID`. + +Вы можете прочитать его как параметр заголовка и использовать, чтобы возобновить поток с того места, где клиент остановился: + +{* ../../docs_src/server_sent_events/tutorial004_py310.py hl[25,27,31] *} + +## SSE с POST { #sse-with-post } + +SSE работает с любым HTTP-методом, не только с `GET`. + +Это полезно для таких протоколов, как [MCP](https://modelcontextprotocol.io), которые стримят SSE по `POST`: + +{* ../../docs_src/server_sent_events/tutorial005_py310.py hl[14] *} + +## Технические детали { #technical-details } + +FastAPI из коробки реализует некоторые лучшие практики для SSE. + +- Отправлять комментарий «ping» для поддержания соединения («keep alive») каждые 15 секунд, когда нет сообщений, чтобы предотвратить закрытие соединения некоторыми прокси, как рекомендовано в [HTML specification: 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 ed67739cc9..ae86373387 100644 --- a/docs/ru/docs/tutorial/sql-databases.md +++ b/docs/ru/docs/tutorial/sql-databases.md @@ -2,9 +2,9 @@ **FastAPI** не требует использовать SQL (реляционную) базу данных. Но вы можете использовать любую базу данных, которую хотите. -Здесь мы рассмотрим пример с использованием SQLModel. +Здесь мы рассмотрим пример с использованием [SQLModel](https://sqlmodel.tiangolo.com/). -**SQLModel** построен поверх SQLAlchemy и Pydantic. Его создал тот же автор, что и **FastAPI**, чтобы он идеально подходил для приложений FastAPI, которым нужны **SQL базы данных**. +**SQLModel** построен поверх [SQLAlchemy](https://www.sqlalchemy.org/) и Pydantic. Его создал тот же автор, что и **FastAPI**, чтобы он идеально подходил для приложений FastAPI, которым нужны **SQL базы данных**. /// tip | Подсказка @@ -26,15 +26,15 @@ /// tip | Подсказка -Существует официальный генератор проектов на **FastAPI** и **PostgreSQL**, включающий frontend и другие инструменты: https://github.com/fastapi/full-stack-fastapi-template +Существует официальный генератор проектов на **FastAPI** и **PostgreSQL**, включающий frontend и другие инструменты: [https://github.com/fastapi/full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template) /// -Это очень простое и короткое руководство. Если вы хотите узнать больше о базах данных в целом, об SQL или о более продвинутых возможностях, обратитесь к документации SQLModel. +Это очень простое и короткое руководство. Если вы хотите узнать больше о базах данных в целом, об SQL или о более продвинутых возможностях, обратитесь к [документации SQLModel](https://sqlmodel.tiangolo.com/). ## Установка `SQLModel` { #install-sqlmodel } -Сначала убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md){.internal-link target=_blank}, активировали его и затем установили `sqlmodel`: +Сначала убедитесь, что вы создали [виртуальное окружение](../virtual-environments.md), активировали его и затем установили `sqlmodel`:
@@ -57,7 +57,7 @@ $ pip install sqlmodel {* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[1:11] hl[7:11] *} -Класс `Hero` очень похож на модель Pydantic (фактически, под капотом, *это и есть модель Pydantic*). +Класс `Hero` очень похож на модель Pydantic (фактически, под капотом, это и есть модель Pydantic). Есть несколько отличий: @@ -65,7 +65,7 @@ $ pip install sqlmodel * `Field(primary_key=True)` сообщает SQLModel, что `id` — это **первичный ключ** в SQL базе данных (подробнее о первичных ключах SQL можно узнать в документации SQLModel). - **Примечание:** Мы используем `int | None` для поля первичного ключа, чтобы в Python-коде можно было *создать объект без `id`* (`id=None`), предполагая, что база данных *сгенерирует его при сохранении*. SQLModel понимает, что база данных предоставит `id`, и *определяет столбец как `INTEGER` (не `NULL`)* в схеме базы данных. См. документацию SQLModel о первичных ключах для подробностей. + **Примечание:** Мы используем `int | None` для поля первичного ключа, чтобы в Python-коде можно было *создать объект без `id`* (`id=None`), предполагая, что база данных *сгенерирует его при сохранении*. SQLModel понимает, что база данных предоставит `id`, и *определяет столбец как `INTEGER` (не `NULL`)* в схеме базы данных. См. [документацию SQLModel о первичных ключах](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id) для подробностей. * `Field(index=True)` сообщает SQLModel, что нужно создать **SQL индекс** для этого столбца, что позволит быстрее выполнять выборки при чтении данных, отфильтрованных по этому столбцу. @@ -81,7 +81,7 @@ $ pip install sqlmodel Параметр `check_same_thread=False` позволяет FastAPI использовать одну и ту же базу данных SQLite в разных потоках. Это необходимо, так как **один запрос** может использовать **больше одного потока** (например, в зависимостях). -Не волнуйтесь, с такой структурой кода мы позже обеспечим использование **одной *сессии* SQLModel на запрос**, по сути именно этого и добивается `check_same_thread`. +Не волнуйтесь, с такой структурой кода мы позже обеспечим использование **одной сессии SQLModel на запрос**, по сути именно этого и добивается `check_same_thread`. ### Создание таблиц { #create-the-tables } @@ -111,7 +111,7 @@ $ pip install sqlmodel /// tip | Подсказка -В SQLModel появятся утилиты миграций - обёртки над Alembic, но пока вы можете использовать Alembic напрямую. +В SQLModel появятся утилиты миграций — обёртки над Alembic, но пока вы можете использовать [Alembic](https://alembic.sqlalchemy.org/en/latest/) напрямую. /// @@ -152,7 +152,7 @@ $ pip install sqlmodel
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -337,7 +337,7 @@ $ fastapi dev main.py
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -352,6 +352,6 @@ $ fastapi dev main.py ## Резюме { #recap } -Вы можете использовать **SQLModel** для взаимодействия с SQL базой данных и упростить код с помощью *моделей данных* и *моделей-таблиц*. +Вы можете использовать [**SQLModel**](https://sqlmodel.tiangolo.com/) для взаимодействия с SQL базой данных и упростить код с помощью *моделей данных* и *моделей-таблиц*. -Гораздо больше вы можете узнать в документации **SQLModel**, там есть более подробное мини-руководство по использованию SQLModel с **FastAPI**. 🚀 +Гораздо больше вы можете узнать в документации **SQLModel**, там есть более подробное мини-[руководство по использованию SQLModel с **FastAPI**](https://sqlmodel.tiangolo.com/tutorial/fastapi/). 🚀 diff --git a/docs/ru/docs/tutorial/static-files.md b/docs/ru/docs/tutorial/static-files.md index 3b0cab8313..dfcc77b6fd 100644 --- a/docs/ru/docs/tutorial/static-files.md +++ b/docs/ru/docs/tutorial/static-files.md @@ -24,7 +24,7 @@ Это отличается от использования `APIRouter`, так как примонтированное приложение является полностью независимым. OpenAPI и документация из вашего главного приложения не будут содержать ничего из примонтированного приложения, и т.д. -Вы можете прочитать больше об этом в [Расширенном руководстве пользователя](../advanced/index.md){.internal-link target=_blank}. +Вы можете прочитать больше об этом в [Расширенном руководстве пользователя](../advanced/index.md). ## Детали { #details } @@ -38,4 +38,4 @@ OpenAPI и документация из вашего главного прил ## Больше информации { #more-info } -Для получения дополнительной информации о деталях и настройках ознакомьтесь с Документацией Starlette о статических файлах. +Для получения дополнительной информации о деталях и настройках ознакомьтесь с [документацией Starlette о статических файлах](https://www.starlette.dev/staticfiles/). diff --git a/docs/ru/docs/tutorial/stream-json-lines.md b/docs/ru/docs/tutorial/stream-json-lines.md new file mode 100644 index 0000000000..d8bb9132b7 --- /dev/null +++ b/docs/ru/docs/tutorial/stream-json-lines.md @@ -0,0 +1,111 @@ +# Стриминг JSON Lines { #stream-json-lines } + +У вас может быть последовательность данных, которую вы хотите отправлять в «**потоке**». Это можно сделать с помощью **JSON Lines**. + +/// info | Информация + +Добавлено в FastAPI 0.134.0. + +/// + +## Что такое поток? { #what-is-a-stream } + +«**Стриминг**» данных означает, что ваше приложение начнет отправлять элементы данных клиенту, не дожидаясь готовности всей последовательности. + +То есть оно отправит первый элемент, клиент его получит и начнет обрабатывать, а вы в это время можете все еще генерировать следующий элемент. + +```mermaid +sequenceDiagram + participant App + participant Client + + App->>App: Produce Item 1 + App->>Client: Send Item 1 + App->>App: Produce Item 2 + Client->>Client: Process Item 1 + App->>Client: Send Item 2 + App->>App: Produce Item 3 + Client->>Client: Process Item 2 + App->>Client: Send Item 3 + Client->>Client: Process Item 3 + Note over App: Keeps producing... + Note over Client: Keeps consuming... +``` + +Это может быть даже бесконечный поток, когда вы продолжаете отправлять данные. + +## JSON Lines { #json-lines } + +В таких случаях часто отправляют «**JSON Lines**», это формат, в котором отправляется по одному JSON-объекту на строку. + +Ответ будет иметь тип содержимого `application/jsonl` (вместо `application/json`), а тело ответа будет примерно таким: + +```json +{"name": "Plumbus", "description": "A multi-purpose household device."} +{"name": "Portal Gun", "description": "A portal opening device."} +{"name": "Meeseeks Box", "description": "A box that summons a Meeseeks."} +``` + +Это очень похоже на JSON-массив (эквивалент списка Python), но вместо того чтобы быть обернутым в `[]` и иметь `,` между элементами, здесь **один JSON-объект на строку**, они разделены символом новой строки. + +/// info | Информация + +Важный момент в том, что ваше приложение сможет по очереди производить каждую строку, пока клиент потребляет предыдущие строки. + +/// + +/// note | Технические детали + +Так как каждый JSON-объект будет разделен новой строкой, в их содержимом не могут быть буквальные символы новой строки, но могут быть экранированные переводы строк (`\n`), что входит в стандарт JSON. + +Однако обычно об этом не нужно беспокоиться — всё делается автоматически, читайте дальше. 🤓 + +/// + +## Варианты использования { #use-cases } + +Вы можете использовать это для стриминга данных из сервиса **AI LLM**, из **логов** или **телеметрии**, или из других типов данных, которые можно структурировать в элементы **JSON**. + +/// tip | Совет + +Если вы хотите стримить бинарные данные, например видео или аудио, посмотрите расширенное руководство: [Потоковая передача данных](../advanced/stream-data.md). + +/// + +## Стриминг JSON Lines с FastAPI { #stream-json-lines-with-fastapi } + +Чтобы стримить JSON Lines с FastAPI, вместо использования `return` в вашей *функции-обработчике пути* используйте `yield`, чтобы по очереди выдавать каждый элемент. + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[24] *} + +Если каждый JSON-элемент, который вы хотите отправить обратно, имеет тип `Item` (Pydantic-модель), и это асинхронная функция, вы можете объявить тип возвращаемого значения как `AsyncIterable[Item]`: + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[9:11,22] *} + +Если вы объявите тип возвращаемого значения, FastAPI будет использовать его, чтобы **валидировать** данные, **документировать** их в OpenAPI, **фильтровать** и **сериализовать** с помощью Pydantic. + +/// tip | Совет + +Так как Pydantic будет сериализовывать это на стороне **Rust**, вы получите значительно более высокую **производительность**, чем если бы вы не указывали тип возвращаемого значения. + +/// + +### Неасинхронные функции-обработчики пути { #non-async-path-operation-functions } + +Вы также можете использовать обычные функции `def` (без `async`) и использовать `yield` таким же образом. + +FastAPI обеспечит корректное выполнение так, чтобы это не блокировало цикл событий. + +Поскольку в этом случае функция не асинхронная, подходящим типом возвращаемого значения будет `Iterable[Item]`: + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[27:30] hl[28] *} + +### Без возвращаемого типа { #no-return-type } + +Вы также можете опустить тип возвращаемого значения. Тогда FastAPI использует [`jsonable_encoder`](./encoder.md), чтобы преобразовать данные к виду, который можно сериализовать в JSON, и затем отправит их как JSON Lines. + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[33:36] hl[34] *} + +## События, отправляемые сервером (SSE) { #server-sent-events-sse } + +FastAPI также имеет полноценную поддержку Server-Sent Events (SSE), которые довольно похожи, но с парой дополнительных деталей. Вы можете узнать о них в следующей главе: [События, отправляемые сервером (SSE)](server-sent-events.md). 🤓 diff --git a/docs/ru/docs/tutorial/testing.md b/docs/ru/docs/tutorial/testing.md index 6dd2fe579a..aef7b86ded 100644 --- a/docs/ru/docs/tutorial/testing.md +++ b/docs/ru/docs/tutorial/testing.md @@ -1,18 +1,18 @@ # Тестирование { #testing } -Благодаря Starlette, тестировать приложения **FastAPI** легко и приятно. +Благодаря [Starlette](https://www.starlette.dev/testclient/), тестировать приложения **FastAPI** легко и приятно. -Тестирование основано на библиотеке HTTPX, которая в свою очередь основана на библиотеке Requests, так что все действия знакомы и интуитивно понятны. +Тестирование основано на библиотеке [HTTPX](https://www.python-httpx.org), которая в свою очередь основана на библиотеке Requests, так что все действия знакомы и интуитивно понятны. -Используя эти инструменты, Вы можете напрямую задействовать pytest с **FastAPI**. +Используя эти инструменты, Вы можете напрямую задействовать [pytest](https://docs.pytest.org/) с **FastAPI**. ## Использование класса `TestClient` { #using-testclient } /// info | Информация -Для использования класса `TestClient` сначала установите `httpx`. +Для использования класса `TestClient` сначала установите [`httpx`](https://www.python-httpx.org). -Убедитесь, что Вы создали [виртуальное окружение](../virtual-environments.md){.internal-link target=_blank}, активировали его, а затем установили пакет, например: +Убедитесь, что Вы создали [виртуальное окружение](../virtual-environments.md), активировали его, а затем установили пакет, например: ```console $ pip install httpx @@ -52,7 +52,7 @@ $ pip install httpx /// tip | Подсказка -Если для тестирования Вам, помимо запросов к приложению FastAPI, необходимо вызывать асинхронные функции (например, для подключения к базе данных с помощью асинхронного драйвера), то ознакомьтесь со страницей [Асинхронное тестирование](../advanced/async-tests.md){.internal-link target=_blank} в расширенном руководстве. +Если для тестирования Вам, помимо запросов к приложению FastAPI, необходимо вызывать асинхронные функции (например, для подключения к базе данных с помощью асинхронного драйвера), то ознакомьтесь со страницей [Асинхронное тестирование](../advanced/async-tests.md) в расширенном руководстве. /// @@ -64,7 +64,7 @@ $ pip install httpx ### Файл приложения **FastAPI** { #fastapi-app-file } -Допустим, структура файлов Вашего приложения похожа на ту, что описана на странице [Более крупные приложения](bigger-applications.md){.internal-link target=_blank}: +Допустим, структура файлов Вашего приложения похожа на ту, что описана на странице [Более крупные приложения](bigger-applications.md): ``` . @@ -80,7 +80,7 @@ $ pip install httpx ### Файл тестов { #testing-file } -Также у Вас может быть файл `test_main.py` содержащий тесты. Можно разместить тестовый файл и файл приложения в одной директории (в директориях для Python-кода желательно размещать и файл `__init__.py`): +Также у Вас может быть файл `test_main.py` содержащий тесты. Он может находиться в том же Python-пакете (в той же директории с файлом `__init__.py`): ``` hl_lines="5" . @@ -142,13 +142,13 @@ $ pip install httpx * Для передачи *HTTP-заголовков*, передайте объект `dict` через параметр `headers`. * Для передачи *cookies* также передайте `dict`, но через параметр `cookies`. -Для получения дополнительной информации о передаче данных на бэкенд с помощью `httpx` или `TestClient` ознакомьтесь с документацией HTTPX. +Для получения дополнительной информации о передаче данных на бэкенд с помощью `httpx` или `TestClient` ознакомьтесь с [документацией HTTPX](https://www.python-httpx.org). /// info | Информация Обратите внимание, что `TestClient` принимает данные, которые можно конвертировать в JSON, но не модели Pydantic. -Если в Ваших тестах есть модели Pydantic и Вы хотите отправить их в тестируемое приложение, то можете использовать функцию `jsonable_encoder`, описанную на странице [Кодировщик совместимый с JSON](encoder.md){.internal-link target=_blank}. +Если в Ваших тестах есть модели Pydantic и Вы хотите отправить их в тестируемое приложение, то можете использовать функцию `jsonable_encoder`, описанную на странице [Кодировщик совместимый с JSON](encoder.md). /// @@ -156,7 +156,7 @@ $ pip install httpx Далее Вам нужно установить `pytest`. -Убедитесь, что Вы создали [виртуальное окружение](../virtual-environments.md){.internal-link target=_blank}, активировали его, а затем установили пакет, например: +Убедитесь, что Вы создали [виртуальное окружение](../virtual-environments.md), активировали его, а затем установили пакет, например:
diff --git a/docs/ru/docs/virtual-environments.md b/docs/ru/docs/virtual-environments.md index f931cc3c82..633137d09e 100644 --- a/docs/ru/docs/virtual-environments.md +++ b/docs/ru/docs/virtual-environments.md @@ -22,7 +22,7 @@ На этой странице вы узнаете, как пользоваться **виртуальными окружениями** и как они работают. -Если вы готовы начать использовать **инструмент, который управляет всем** за вас (включая установку Python), попробуйте uv. +Если вы готовы начать использовать **инструмент, который управляет всем** за вас (включая установку Python), попробуйте [uv](https://github.com/astral-sh/uv). /// @@ -86,7 +86,7 @@ $ python -m venv .venv //// tab | `uv` -Если у вас установлен `uv`, вы можете использовать его для создания виртуального окружения. +Если у вас установлен [`uv`](https://github.com/astral-sh/uv), вы можете использовать его для создания виртуального окружения.
@@ -150,7 +150,7 @@ $ .venv\Scripts\Activate.ps1 //// tab | Windows Bash -Или если вы используете Bash для Windows (например, Git Bash): +Или если вы используете Bash для Windows (например, [Git Bash](https://gitforwindows.org/)):
@@ -216,7 +216,7 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python /// tip | Подсказка -Если вы используете `uv`, то для установки вы будете использовать его вместо `pip`, поэтому обновлять `pip` не нужно. 😎 +Если вы используете [`uv`](https://github.com/astral-sh/uv), то для установки вы будете использовать его вместо `pip`, поэтому обновлять `pip` не нужно. 😎 /// @@ -268,7 +268,7 @@ $ python -m ensurepip --upgrade /// tip | Подсказка -Если вы использовали `uv` для создания виртуального окружения, он уже сделал это за вас — можно пропустить этот шаг. 😎 +Если вы использовали [`uv`](https://github.com/astral-sh/uv) для создания виртуального окружения, он уже сделал это за вас — можно пропустить этот шаг. 😎 /// @@ -340,7 +340,7 @@ $ pip install "fastapi[standard]" //// tab | `uv` -Если у вас установлен `uv`: +Если у вас установлен [`uv`](https://github.com/astral-sh/uv):
@@ -372,7 +372,7 @@ $ pip install -r requirements.txt //// tab | `uv` -Если у вас установлен `uv`: +Если у вас установлен [`uv`](https://github.com/astral-sh/uv):
@@ -416,8 +416,8 @@ Hello World Например: -* VS Code -* PyCharm +* [VS Code](https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment) +* [PyCharm](https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html) /// tip | Подсказка @@ -455,7 +455,7 @@ $ deactivate ## Зачем нужны виртуальные окружения { #why-virtual-environments } -Чтобы работать с FastAPI, вам нужно установить Python. +Чтобы работать с FastAPI, вам нужно установить [Python](https://www.python.org/). После этого вам нужно будет **установить** FastAPI и другие **пакеты**, которые вы хотите использовать. @@ -564,7 +564,7 @@ $ pip install "fastapi[standard]"
-Будет загружен сжатый файл с кодом FastAPI, обычно с PyPI. +Будет загружен сжатый файл с кодом FastAPI, обычно с [PyPI](https://pypi.org/project/fastapi/). Также будут **загружены** файлы для других пакетов, от которых зависит FastAPI. @@ -627,7 +627,7 @@ $ .venv\Scripts\Activate.ps1 //// tab | Windows Bash -Или если вы используете Bash для Windows (например, Git Bash): +Или если вы используете Bash для Windows (например, [Git Bash](https://gitforwindows.org/)):
@@ -639,13 +639,13 @@ $ source .venv/Scripts/activate //// -Эта команда создаст или изменит некоторые [переменные окружения](environment-variables.md){.internal-link target=_blank}, которые будут доступны для следующих команд. +Эта команда создаст или изменит некоторые [переменные окружения](environment-variables.md), которые будут доступны для следующих команд. Одна из таких переменных — `PATH`. /// tip | Подсказка -Вы можете узнать больше о переменной окружения `PATH` в разделе [Переменные окружения](environment-variables.md#path-environment-variable){.internal-link target=_blank}. +Вы можете узнать больше о переменной окружения `PATH` в разделе [Переменные окружения](environment-variables.md#path-environment-variable). /// @@ -846,7 +846,7 @@ I solemnly swear 🐺 Существует много **альтернатив** для управления виртуальными окружениями, зависимостями (requirements), проектами. -Когда вы будете готовы и захотите использовать инструмент для **управления всем проектом** — зависимостями пакетов, виртуальными окружениями и т. п., я бы предложил попробовать uv. +Когда вы будете готовы и захотите использовать инструмент для **управления всем проектом** — зависимостями пакетов, виртуальными окружениями и т.п., я бы предложил попробовать [uv](https://github.com/astral-sh/uv). `uv` может многое: diff --git a/docs/tr/docs/advanced/json-base64-bytes.md b/docs/tr/docs/advanced/json-base64-bytes.md new file mode 100644 index 0000000000..68e1cba7aa --- /dev/null +++ b/docs/tr/docs/advanced/json-base64-bytes.md @@ -0,0 +1,63 @@ +# JSON'da Bytes'i Base64 Olarak Kullanma { #json-with-bytes-as-base64 } + +Uygulamanız JSON veri alıp gönderiyorsa ve bunun içine ikili (binary) veri eklemeniz gerekiyorsa, veriyi base64 olarak encode edebilirsiniz. + +## Base64 ve Dosyalar { #base64-vs-files } + +İkili veriyi JSON içinde encode etmek yerine, yükleme için [Request Files](../tutorial/request-files.md) ve gönderim için [Custom Response - FileResponse](./custom-response.md#fileresponse--fileresponse-) kullanıp kullanamayacağınıza önce bir bakın. + +JSON sadece UTF-8 ile encode edilmiş string'ler içerebilir, dolayısıyla ham bytes içeremez. + +Base64 ikili veriyi string olarak encode edebilir, ancak bunu yapmak için orijinal ikili veriden daha fazla karakter kullanır; bu yüzden genellikle normal dosyalardan daha verimsiz olur. + +Base64'ü sadece gerçekten JSON içine ikili veri koymanız gerekiyorsa ve bunun için dosya kullanamıyorsanız tercih edin. + +## Pydantic `bytes` { #pydantic-bytes } + +`bytes` alanları olan bir Pydantic model tanımlayabilir, ardından model config'inde `val_json_bytes` kullanarak giriş JSON verisini base64 ile doğrulamasını (validate) söyleyebilirsiniz; bu doğrulamanın bir parçası olarak base64 string'i bytes'a decode eder. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *} + +`/docs`'a bakarsanız, `data` alanının base64 ile encode edilmiş bytes beklediğini görürsünüz: + +
+ +
+ +Şöyle bir request gönderebilirsiniz: + +```json +{ + "description": "Some data", + "data": "aGVsbG8=" +} +``` + +/// tip | İpucu + +`aGVsbG8=` değeri, `hello` kelimesinin base64 encoding'idir. + +/// + +Sonrasında Pydantic base64 string'ini decode eder ve modelin `data` alanında size orijinal bytes'ı verir. + +Şöyle bir response alırsınız: + +```json +{ + "description": "Some data", + "content": "hello" +} +``` + +## Çıkış Verisi için Pydantic `bytes` { #pydantic-bytes-for-output-data } + +Çıkış verisi için de model config'inde `ser_json_bytes` ile `bytes` alanları kullanabilirsiniz; Pydantic JSON response üretirken bytes'ı base64 olarak serialize eder. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *} + +## Giriş ve Çıkış Verisi için Pydantic `bytes` { #pydantic-bytes-for-input-and-output-data } + +Elbette, aynı modeli base64 kullanacak şekilde yapılandırıp hem girişte (*validate*) `val_json_bytes` ile hem de çıkışta (*serialize*) `ser_json_bytes` ile JSON veri alıp gönderirken kullanabilirsiniz. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *} diff --git a/docs/tr/docs/advanced/stream-data.md b/docs/tr/docs/advanced/stream-data.md new file mode 100644 index 0000000000..4310edc350 --- /dev/null +++ b/docs/tr/docs/advanced/stream-data.md @@ -0,0 +1,117 @@ +# Veri Akışı { #stream-data } + +Veriyi JSON olarak yapılandırabiliyorsanız, [JSON Lines Akışı](../tutorial/stream-json-lines.md) kullanın. + +Ancak saf ikili (binary) veri ya da string akıtmak istiyorsanız, bunu şöyle yapabilirsiniz. + +/// info | Bilgi + +FastAPI 0.134.0 ile eklendi. + +/// + +## Kullanım Senaryoları { #use-cases } + +Doğrudan bir AI LLM (Büyük Dil Modeli) servisinin çıktısından saf string'leri akıtmak istediğinizde kullanabilirsiniz. + +Ayrıca **büyük ikili (binary) dosyaları** akıtmak için de kullanabilirsiniz; veriyi okurken her parçayı (chunk) sırayla gönderirsiniz, tamamını belleğe almak zorunda kalmazsınız. + +Bu şekilde **video** veya **ses** de akıtabilirsiniz; hatta işledikçe üretilip gönderilebilir. + +## `yield` ile bir `StreamingResponse` { #a-streamingresponse-with-yield } + +*Path operation function* içinde `response_class=StreamingResponse` belirtirseniz, her veri parçasını sırayla göndermek için `yield` kullanabilirsiniz. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *} + +FastAPI her veri parçasını olduğu gibi `StreamingResponse`'a verir; JSON'a ya da benzeri bir formata dönüştürmeye çalışmaz. + +### Async Olmayan Path Operation Function'lar { #non-async-path-operation-functions } + +Normal `def` fonksiyonlarını (yani `async` olmadan) da kullanabilir ve aynı şekilde `yield` yazabilirsiniz. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[26:29] hl[27] *} + +### Tip Annotasyonu Yok { #no-annotation } + +İkili (binary) veri akıtıyorsanız dönüş tipi annotasyonu belirtmeniz şart değildir. + +FastAPI veriyi Pydantic ile JSON'a çevirmeye veya herhangi bir şekilde serileştirmeye çalışmayacağı için, bu durumda tip annotasyonu sadece editörünüz ve araçlarınız içindir; FastAPI tarafından kullanılmaz. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} + +Bu aynı zamanda `StreamingResponse` ile veriyi tam olarak ihtiyaç duyduğunuz biçimde üretme ve encode etme konusunda hem bir özgürlük hem de bir sorumluluk verdiği anlamına gelir; tip annotasyonlarından bağımsızdır. 🤓 + +### Bytes Akışı { #stream-bytes } + +Başlıca kullanım senaryolarından biri string yerine `bytes` akıtmaktır; elbette bunu yapabilirsiniz. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[44:47] hl[47] *} + +## Özel bir `PNGStreamingResponse` { #a-custom-pngstreamingresponse } + +Yukarıdaki örneklerde veri baytları akıtıldı, ancak response'ta bir `Content-Type` header'ı yoktu; bu nedenle istemci hangi tür veriyi aldığını bilmiyordu. + +Akıttığınız veri türüne uygun `Content-Type` header'ını ayarlayan, `StreamingResponse`'tan türetilmiş özel bir alt sınıf (subclass) oluşturabilirsiniz. + +Örneğin, `media_type` özniteliğini kullanarak `Content-Type` header'ını `image/png` olarak ayarlayan bir `PNGStreamingResponse` oluşturabilirsiniz: + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *} + +Ardından bu yeni sınıfı *path operation function* içinde `response_class=PNGStreamingResponse` olarak kullanabilirsiniz: + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *} + +### Bir Dosyayı Simüle Etme { #simulate-a-file } + +Bu örnekte, yalnızca bellekte yaşayan ama aynı arayüzü kullanmamıza izin veren, dosya benzeri bir nesne olan `io.BytesIO` ile bir dosyayı simüle ediyoruz. + +Örneğin, bir dosyada yapabileceğimiz gibi, içeriğini tüketmek için üzerinde iterate edebiliriz. + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[1:27] hl[3,12:13,25] *} + +/// note | Teknik Detaylar + +Diğer iki değişken olan `image_base64` ve `binary_image`, Base64 ile encode edilmiş bir görüntüdür; daha sonra bayt'lara çevrilip `io.BytesIO`'ya aktarılır. + +Sadece bu örnek aynı dosyada yaşayabilsin, kopyalayıp olduğu gibi çalıştırabilesiniz diye. 🥚 + +/// + +`with` bloğu kullanarak, jeneratör fonksiyonu (içinde `yield` olan fonksiyon) tamamlandığında dosya benzeri nesnenin kapandığından emin oluruz. Yani response gönderimi bittikten sonra. + +Bu özel örnekte o kadar da önemli değil, çünkü sahte ve bellekte (yani `io.BytesIO` ile). Ancak gerçek bir dosyada, onunla işiniz bittiğinde dosyanın kapandığından emin olmak önemlidir. + +### Dosyalar ve Async { #files-and-async } + +Çoğu durumda dosya benzeri nesneler, varsayılan olarak async ve await ile uyumlu değildir. + +Örneğin, `await file.read()` ya da `async for chunk in file` gibi şeyler yoktur. + +Ve birçok durumda, diskte ya da ağda okundukları için, okumak engelleyici (event loop'u bloke edebilen) bir işlem olabilir. + +/// info | Bilgi + +Yukarıdaki örnek aslında bir istisna; çünkü `io.BytesIO` nesnesi zaten bellekte, dolayısıyla onu okumak hiçbir şeyi bloke etmez. + +Ancak çoğu durumda bir dosyayı veya dosya benzeri bir nesneyi okumak bloke edicidir. + +/// + +Event loop'u bloke etmemek için, *path operation function*'ı `async def` yerine normal `def` ile tanımlayabilirsiniz; böylece FastAPI ana döngüyü bloke etmemek için bunu bir thread pool worker (iş parçacığı havuzu çalışanı) üzerinde çalıştırır. + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *} + +/// tip | İpucu + +Async bir fonksiyonun içinden bloklayıcı kod çağırmanız ya da bloklayıcı bir fonksiyonun içinden async bir fonksiyon çağırmanız gerekirse, FastAPI'nin kardeş kütüphanesi olan [Asyncer](https://asyncer.tiangolo.com)'ı kullanabilirsiniz. + +/// + +### `yield from` { #yield-from } + +Bir şeyin (ör. dosya benzeri bir nesne) üzerinde iterate ederken, her öğe için `yield` yapıyorsanız, `for` döngüsünü yazmak yerine `yield from` ile her öğeyi doğrudan yield edebilirsiniz. + +Bu FastAPI'ye özgü değildir, tamamen Python'dur, ama bilinmesi güzel bir püf noktasıdır. 😎 + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[37:40] hl[40] *} diff --git a/docs/tr/docs/advanced/strict-content-type.md b/docs/tr/docs/advanced/strict-content-type.md new file mode 100644 index 0000000000..94716e31fa --- /dev/null +++ b/docs/tr/docs/advanced/strict-content-type.md @@ -0,0 +1,88 @@ +# Sıkı Content-Type Kontrolü { #strict-content-type-checking } + +Varsayılan olarak FastAPI, JSON request body'leri için sıkı Content-Type header kontrolü uygular. Bu, JSON request'lerin body'lerinin JSON olarak parse edilebilmesi için geçerli bir Content-Type header'ı (örn. application/json) içermesi gerektiği anlamına gelir. + +## CSRF Riski { #csrf-risk } + +Bu varsayılan davranış, çok belirli bir senaryoda bir sınıf Cross-Site Request Forgery (CSRF) saldırılarına karşı koruma sağlar. + +Bu saldırılar, tarayıcıların aşağıdaki durumlarda herhangi bir CORS preflight kontrolü yapmadan script’lerin request göndermesine izin vermesinden faydalanır: + +- bir Content-Type header’ı yoksa (örn. body olarak Blob ile fetch() kullanıldığında) +- ve herhangi bir kimlik doğrulama bilgisi gönderilmiyorsa. + +Bu tür saldırılar özellikle şu durumlarda önemlidir: + +- uygulama yerelde (örn. localhost’ta) veya dahili bir ağda çalışıyorsa +- ve uygulamada hiç kimlik doğrulama yoksa, aynı ağdan gelen her request’in güvenilir olduğu varsayılıyorsa. + +## Örnek Saldırı { #example-attack } + +Yerelde çalışan bir AI agent’ı (yapay zeka ajanı) çalıştırmanın bir yolunu geliştirdiğinizi düşünün. + +Bir API sunuyor: + +``` +http://localhost:8000/v1/agents/multivac +``` + +Ayrıca bir frontend var: + +``` +http://localhost:8000 +``` + +/// tip | İpucu + +İkisinin de host’u aynıdır. + +/// + +Frontend’i kullanarak AI agent’a sizin adınıza işler yaptırabiliyorsunuz. + +Uygulama yerelde çalıştığı ve açık internette olmadığı için, sadece yerel ağa güvenip herhangi bir kimlik doğrulama kurmamaya karar verdiniz. + +Kullanıcılarınızdan biri de bunu indirip yerelde çalıştırabilir. + +Sonra kötü niyetli bir web sitesini açabilir, örneğin: + +``` +https://evilhackers.example.com +``` + +Ve bu kötü niyetli site, body olarak Blob kullanan fetch() ile yerel API’ye request’ler gönderebilir: + +``` +http://localhost:8000/v1/agents/multivac +``` + +Kötü niyetli sitenin host’u ile yerel uygulamanın host’u farklı olsa bile, tarayıcı şu nedenlerle bir CORS preflight isteği tetiklemez: + +- Herhangi bir kimlik doğrulama yoktur, bu nedenle credential göndermesi gerekmez. +- Tarayıcı, Content-Type header’ı eksik olduğundan JSON gönderildiğini düşünmez. + +Böylece kötü niyetli site, yerel AI agent’ın kullanıcının eski patronuna sinirli mesajlar göndermesini sağlayabilir... ya da daha kötüsü. 😅 + +## Açık İnternet { #open-internet } + +Uygulamanız açık internetteyse “ağa güvenmez” ve kimlik doğrulama olmadan kimsenin ayrıcalıklı request’ler göndermesine izin vermezsiniz. + +Saldırganlar tarayıcı etkileşimine ihtiyaç duymadan basitçe bir script çalıştırıp API’nize request gönderebilir, bu yüzden muhtemelen ayrıcalıklı endpoint’leri zaten güvenceye almışsınızdır. + +Bu durumda bu saldırı/riski sizler için geçerli değildir. + +Bu risk ve saldırı, esasen uygulama sadece yerel ağda çalıştığında ve tek koruma varsayımının bu olduğu durumlarda önemlidir. + +## Content-Type Olmadan Gelen Request’lere İzin Vermek { #allowing-requests-without-content-type } + +Content-Type header’ı göndermeyen client’ları desteklemeniz gerekiyorsa, strict kontrolü strict_content_type=False ayarıyla kapatabilirsiniz: + +{* ../../docs_src/strict_content_type/tutorial001_py310.py hl[4] *} + +Bu ayarla, Content-Type header’ı olmayan request’lerin body’si JSON olarak parse edilir. Bu, FastAPI’nin eski sürümlerindeki davranışla aynıdır. + +/// info | Bilgi + +Bu davranış ve yapılandırma FastAPI 0.132.0’da eklendi. + +/// diff --git a/docs/tr/docs/editor-support.md b/docs/tr/docs/editor-support.md new file mode 100644 index 0000000000..47182834ed --- /dev/null +++ b/docs/tr/docs/editor-support.md @@ -0,0 +1,23 @@ +# Editör Desteği { #editor-support } + +Resmi [FastAPI Extension](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode), FastAPI geliştirme akışınızı iyileştirir: *path operation* keşfi, gezinme, FastAPI Cloud’a deploy ve canlı log akışı. + +Daha fazla ayrıntı için, GitHub deposundaki README’ye bakın: [GitHub repository](https://github.com/fastapi/fastapi-vscode). + +## Kurulum ve Yükleme { #setup-and-installation } + +**FastAPI Extension**, hem [VS Code](https://code.visualstudio.com/) hem de [Cursor](https://www.cursor.com/) için mevcuttur. Her editörde Extensions panelinden "FastAPI" aratıp **FastAPI Labs** tarafından yayımlanan eklentiyi seçerek doğrudan kurabilirsiniz. Eklenti [vscode.dev](https://vscode.dev) ve [github.dev](https://github.dev) gibi tarayıcı tabanlı editörlerde de çalışır. + +### Uygulama Keşfi { #application-discovery } + +Varsayılan olarak, eklenti çalışma alanınızda `FastAPI()` örnekleyen dosyaları tarayarak FastAPI uygulamalarını otomatik olarak keşfeder. Proje yapınız nedeniyle otomatik algılama çalışmazsa, `pyproject.toml` içindeki `[tool.fastapi]` ile veya VS Code ayarı `fastapi.entryPoint` üzerinden modül gösterimiyle (ör. `myapp.main:app`) bir entrypoint belirtebilirsiniz. + +## Özellikler { #features } + +- **Path Operation Explorer** - Uygulamanızdaki tüm *path operation*'lar için yan panelde bir ağaç görünümü. Herhangi bir route veya router tanımına tıklayarak atlayın. +- **Route Search** - Ctrl + Shift + E (macOS: Cmd + Shift + E) ile path, method veya ada göre arama. +- **CodeLens Navigation** - Test client çağrılarının (ör. `client.get('/items')`) üzerinde, ilgili *path operation*’a atlayan tıklanabilir bağlantılar; testlerle implementasyon arasında hızlı gezinme sağlar. +- **Deploy to FastAPI Cloud** - Uygulamanızı tek tıkla [FastAPI Cloud](https://fastapicloud.com/)'a deploy edin. +- **Stream Application Logs** - FastAPI Cloud’a deploy ettiğiniz uygulamadan, seviye filtreleme ve metin arama ile gerçek zamanlı log akışı. + +Eklentinin özelliklerine hızlıca aşina olmak isterseniz, Komut Paleti’ni açın (Ctrl + Shift + P veya macOS: Cmd + Shift + P), "Welcome: Open walkthrough..." öğesini seçin ve ardından "Get started with FastAPI" walkthrough’unu açın. diff --git a/docs/tr/docs/tutorial/server-sent-events.md b/docs/tr/docs/tutorial/server-sent-events.md new file mode 100644 index 0000000000..3855410125 --- /dev/null +++ b/docs/tr/docs/tutorial/server-sent-events.md @@ -0,0 +1,120 @@ +# Server-Sent Events (SSE) { #server-sent-events-sse } + +İstemciye veri akışını **Server-Sent Events** (SSE) ile sağlayabilirsiniz. + +Bu, [JSON Lines Akışı](stream-json-lines.md) ile benzerdir ancak tarayıcılar tarafından yerel olarak desteklenen [`EventSource` API'si](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) ile `text/event-stream` formatını kullanır. + +/// info | Bilgi + +FastAPI 0.135.0'da eklendi. + +/// + +## Server-Sent Events Nedir? { #what-are-server-sent-events } + +SSE, HTTP üzerinden sunucudan istemciye veri akışı için bir standarttır. + +Her olay, aralarında boş satırlar bulunan ve `data`, `event`, `id` ve `retry` gibi "alanlar" içeren küçük bir metin bloğudur. + +Şuna benzer: + +``` +data: {"name": "Portal Gun", "price": 999.99} + +data: {"name": "Plumbus", "price": 32.99} + +``` + +SSE; yapay zekâ sohbet akışı, canlı bildirimler, log ve gözlemlenebilirlik (observability) gibi senaryolarda ve sunucunun istemciye güncellemeleri ittiği diğer durumlarda yaygın olarak kullanılır. + +/// tip | İpucu + +İkili (binary) veri akışı yapmak istiyorsanız, gelişmiş kılavuza bakın: [Veri Akışı](../advanced/stream-data.md). + +/// + +## FastAPI ile SSE Akışı { #stream-sse-with-fastapi } + +FastAPI ile SSE akışı yapmak için, *path operation function* içinde `yield` kullanın ve `response_class=EventSourceResponse` olarak ayarlayın. + +`EventSourceResponse`'u `fastapi.sse` içinden içe aktarın: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[4,22] *} + +Yield edilen her öğe JSON olarak kodlanır ve bir SSE olayının `data:` alanında gönderilir. + +Dönüş tipini `AsyncIterable[Item]` olarak bildirirseniz, FastAPI bunu Pydantic ile veriyi **doğrulamak**, **belgelemek** ve **serileştirmek** için kullanır. + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[10:12,23] *} + +/// tip | İpucu + +Pydantic serileştirmeyi **Rust** tarafında yapacağından, dönüş tipi bildirmediğiniz duruma göre çok daha yüksek **performans** elde edersiniz. + +/// + +### Async Olmayan Path Operation Fonksiyonları { #non-async-path-operation-functions } + +Normal `def` fonksiyonlarını (yani `async` olmadan) da kullanabilir ve aynı şekilde `yield` kullanabilirsiniz. + +FastAPI, event loop'u bloke etmeyecek şekilde doğru biçimde çalışmasını sağlar. + +Bu örnekte fonksiyon async olmadığı için doğru dönüş tipi `Iterable[Item]` olur: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[28:31] hl[29] *} + +### Dönüş Tipi Olmadan { #no-return-type } + +Dönüş tipini belirtmeyebilirsiniz. FastAPI, veriyi dönüştürmek ve göndermek için [`jsonable_encoder`](./encoder.md) kullanır. + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[34:37] hl[35] *} + +## `ServerSentEvent` { #serversentevent } + +`event`, `id`, `retry` veya `comment` gibi SSE alanlarını ayarlamanız gerekirse, düz veri yerine `ServerSentEvent` nesneleri yield edebilirsiniz. + +`ServerSentEvent`'i `fastapi.sse` içinden içe aktarın: + +{* ../../docs_src/server_sent_events/tutorial002_py310.py hl[4,26] *} + +`data` alanı her zaman JSON olarak kodlanır. Pydantic modelleri dâhil, JSON olarak serileştirilebilen herhangi bir değeri geçebilirsiniz. + +## Ham Veri { #raw-data } + +Veriyi JSON kodlaması olmadan göndermeniz gerekiyorsa, `data` yerine `raw_data` kullanın. + +Bu, önceden biçimlendirilmiş metin, log satırları veya `[DONE]` gibi özel "işaretçi" değerleri göndermek için kullanışlıdır. + +{* ../../docs_src/server_sent_events/tutorial003_py310.py hl[17] *} + +/// note | Not + +`data` ve `raw_data` birbirini dışlar. Her `ServerSentEvent` için bunlardan yalnızca birini ayarlayabilirsiniz. + +/// + +## `Last-Event-ID` ile Devam Etme { #resuming-with-last-event-id } + +Bir tarayıcı bağlantı koptuktan sonra yeniden bağlandığında, son aldığı `id`'yi `Last-Event-ID` header'ında gönderir. + +Bunu bir header parametresi olarak okuyup, istemcinin kaldığı yerden akışı sürdürmek için kullanabilirsiniz: + +{* ../../docs_src/server_sent_events/tutorial004_py310.py hl[25,27,31] *} + +## POST ile SSE { #sse-with-post } + +SSE, sadece `GET` değil, **tüm HTTP metodlarıyla** çalışır. + +Bu, SSE'yi `POST` üzerinden akıtan [MCP](https://modelcontextprotocol.io) gibi protokoller için kullanışlıdır: + +{* ../../docs_src/server_sent_events/tutorial005_py310.py hl[14] *} + +## Teknik Detaylar { #technical-details } + +FastAPI, bazı SSE en iyi uygulamalarını kutudan çıktığı gibi uygular. + +- [HTML spesifikasyonu: Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes) önerisine uygun olarak, bazı proxy'lerin bağlantıyı kapatmasını önlemek için, 15 saniye boyunca hiç mesaj gelmezse **"keep alive" `ping` yorumu** gönderir. +- Akışın **cache'lenmesini önlemek** için `Cache-Control: no-cache` header'ını ayarlar. +- Nginx gibi bazı proxy'lerde **buffering'i önlemek** için özel `X-Accel-Buffering: no` header'ını ayarlar. + +Bunun için ekstra bir şey yapmanız gerekmez, doğrudan çalışır. 🤓 diff --git a/docs/tr/docs/tutorial/stream-json-lines.md b/docs/tr/docs/tutorial/stream-json-lines.md new file mode 100644 index 0000000000..200689d71e --- /dev/null +++ b/docs/tr/docs/tutorial/stream-json-lines.md @@ -0,0 +1,111 @@ +# JSON Lines Akışı { #stream-json-lines } + +Bir veri dizisini “akış” olarak göndermek istediğiniz durumlar olabilir; bunu **JSON Lines** ile yapabilirsiniz. + +/// info | Bilgi + +FastAPI 0.134.0 ile eklendi. + +/// + +## Akış (Stream) Nedir? { #what-is-a-stream } + +Verileri “streaming” olarak göndermek, uygulamanızın tüm öğe dizisi hazır olmasını beklemeden, öğeleri istemciye göndermeye başlaması demektir. + +Yani ilk öğeyi gönderirsiniz, istemci onu alıp işlemeye başlar, bu sırada siz bir sonraki öğeyi üretmeye devam edebilirsiniz. + +```mermaid +sequenceDiagram + participant App + participant Client + + App->>App: Produce Item 1 + App->>Client: Send Item 1 + App->>App: Produce Item 2 + Client->>Client: Process Item 1 + App->>Client: Send Item 2 + App->>App: Produce Item 3 + Client->>Client: Process Item 2 + App->>Client: Send Item 3 + Client->>Client: Process Item 3 + Note over App: Keeps producing... + Note over Client: Keeps consuming... +``` + +Hatta, sürekli veri gönderdiğiniz sonsuz bir akış da olabilir. + +## JSON Lines { #json-lines } + +Bu tür durumlarda, her satıra bir JSON nesnesi gönderdiğiniz bir biçim olan “**JSON Lines**” kullanmak yaygındır. + +Response’un `application/json` yerine `application/jsonl` içerik türü (Content-Type) olur ve body aşağıdaki gibi görünür: + +```json +{"name": "Plumbus", "description": "A multi-purpose household device."} +{"name": "Portal Gun", "description": "A portal opening device."} +{"name": "Meeseeks Box", "description": "A box that summons a Meeseeks."} +``` + +Bir JSON dizisine (Python list eşdeğeri) çok benzer; ancak öğeler `[]` içine alınmak ve araya `,` konmak yerine, her satırda **bir JSON nesnesi** vardır; bunlar yeni satır karakteri ile ayrılır. + +/// info | Bilgi + +Önemli nokta, uygulamanız her satırı sırayla üretebilirken, istemcinin de önceki satırları tüketmeye devam edebilmesidir. + +/// + +/// note | Teknik Detaylar + +Her JSON nesnesi yeni bir satırla ayrıldığı için, içeriklerinde gerçek yeni satır karakterleri bulunamaz; ancak JSON standardının bir parçası olan kaçışlı yeni satırlar (`\n`) bulunabilir. + +Genelde bununla sizin uğraşmanız gerekmez, otomatik olarak halledilir, okumaya devam edin. 🤓 + +/// + +## Kullanım Senaryoları { #use-cases } + +Bunu bir **AI LLM** servisinden, **loglar**dan veya **telemetri**den ya da **JSON** öğeleri halinde yapılandırılabilen başka tür verilerden akış yapmak için kullanabilirsiniz. + +/// tip | İpucu + +İkili (binary) veri akışı yapmak istiyorsanız, örneğin video veya ses, gelişmiş kılavuza bakın: [Veri Akışı](../advanced/stream-data.md). + +/// + +## FastAPI ile JSON Lines Akışı { #stream-json-lines-with-fastapi } + +FastAPI ile JSON Lines akışı yapmak için, *path operation function* içinde `return` kullanmak yerine, her öğeyi sırayla üretmek için `yield` kullanabilirsiniz. + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[24] *} + +Göndermek istediğiniz her JSON öğesi `Item` tipindeyse (bir Pydantic modeli) ve fonksiyon async ise, dönüş tipini `AsyncIterable[Item]` olarak belirtebilirsiniz: + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[9:11,22] *} + +Dönüş tipini belirtirseniz, FastAPI bu tipi kullanarak veriyi **doğrular**, OpenAPI’de **dokümante** eder, **filtreler** ve Pydantic ile **serileştirir**. + +/// tip | İpucu + +Pydantic serileştirmeyi **Rust** tarafında yapacağı için, dönüş tipi belirtmediğiniz duruma göre çok daha yüksek **performans** elde edersiniz. + +/// + +### Async Olmayan path operation function'lar { #non-async-path-operation-functions } + +`async` olmadan normal `def` fonksiyonları da kullanabilir ve aynı şekilde `yield` yazabilirsiniz. + +FastAPI, event loop’u bloklamayacak şekilde doğru çalışmasını garanti eder. + +Bu durumda fonksiyon async olmadığı için doğru dönüş tipi `Iterable[Item]` olur: + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[27:30] hl[28] *} + +### Dönüş Tipi Olmadan { #no-return-type } + +Dönüş tipini belirtmeyebilirsiniz de. Bu durumda FastAPI, veriyi JSON’a serileştirilebilir bir yapıya dönüştürmek için [`jsonable_encoder`](./encoder.md)’ı kullanır ve ardından JSON Lines olarak gönderir. + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[33:36] hl[34] *} + +## Server-Sent Events (SSE) { #server-sent-events-sse } + +FastAPI, Server-Sent Events (SSE) için de birinci sınıf destek sağlar; benzerlerdir ancak birkaç ekstra ayrıntı vardır. Bir sonraki bölümden öğrenebilirsiniz: [Server-Sent Events (SSE)](server-sent-events.md). 🤓 diff --git a/docs/uk/docs/_llm-test.md b/docs/uk/docs/_llm-test.md index 0dbfaa3db4..2673fb3e9c 100644 --- a/docs/uk/docs/_llm-test.md +++ b/docs/uk/docs/_llm-test.md @@ -11,7 +11,7 @@ * Перевірте, чи все гаразд у перекладі. * За потреби покращіть вашу мовно-специфічну підсказку, загальну підсказку або англійський документ. * Потім вручну виправте решту проблем у перекладі, щоб він був якісним. -* Перекладіть повторно, маючи якісний переклад на місці. Ідеальний результат - коли LLM більше не вносить змін до перекладу. Це означає, що загальна підсказка та ваша мовно-специфічна підсказка настільки добрі, наскільки це можливо (інколи він робитиме кілька, здавалося б, випадкових змін, причина в тому, що LLM-и не є детерміністичними алгоритмами). +* Перекладіть повторно, маючи якісний переклад на місці. Ідеальний результат - коли LLM більше не вносить змін до перекладу. Це означає, що загальна підсказка та ваша мовно-специфічна підсказка настільки добрі, наскільки це можливо (інколи він робитиме кілька, здавалося б, випадкових змін, причина в тому, що [LLM-и не є детерміністичними алгоритмами](https://doublespeak.chat/#/handbook#deterministic-output)). Тести: @@ -95,7 +95,7 @@ $ fastapi run Зовнішнє посилання -* Посилання на стиль -* Посилання на скрипт -* Посилання на зображення +* [Внутрішнє посилання](index.md#installation) +* [Зовнішнє посилання](https://sqlmodel.tiangolo.com/) +* [Посилання на стиль](https://fastapi.tiangolo.com/css/styles.css) +* [Посилання на скрипт](https://fastapi.tiangolo.com/js/logic.js) +* [Посилання на зображення](https://fastapi.tiangolo.com/img/foo.jpg) Текст посилання має бути перекладений, адреса посилання має вказувати на переклад: -* Посилання на FastAPI +* [Посилання на FastAPI](https://fastapi.tiangolo.com/uk/) //// @@ -313,6 +313,7 @@ Some text * тіло відповіді * тіло JSON * тіло форми +* тіло файлу * тіло функції * параметр diff --git a/docs/uk/docs/advanced/additional-responses.md b/docs/uk/docs/advanced/additional-responses.md index 089967a51a..2d2005837f 100644 --- a/docs/uk/docs/advanced/additional-responses.md +++ b/docs/uk/docs/advanced/additional-responses.md @@ -243,5 +243,5 @@ new_dict = {**old_dict, "new key": "new value"} Щоб побачити, що саме можна включати у відповіді, ознайомтеся з цими розділами специфікації OpenAPI: -- Об'єкт відповідей OpenAPI, він включає `Response Object`. -- Об'єкт відповіді OpenAPI, ви можете включити будь-що з цього безпосередньо в кожну відповідь у параметрі `responses`. Зокрема `description`, `headers`, `content` (усередині нього ви оголошуєте різні типи медіа та Схеми JSON) і `links`. +- [Об'єкт відповідей OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#responses-object), він включає `Response Object`. +- [Об'єкт відповіді OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#response-object), ви можете включити будь-що з цього безпосередньо в кожну відповідь у параметрі `responses`. Зокрема `description`, `headers`, `content` (усередині нього ви оголошуєте різні типи медіа та Схеми JSON) і `links`. diff --git a/docs/uk/docs/advanced/additional-status-codes.md b/docs/uk/docs/advanced/additional-status-codes.md index afba933e20..26e2c14545 100644 --- a/docs/uk/docs/advanced/additional-status-codes.md +++ b/docs/uk/docs/advanced/additional-status-codes.md @@ -38,4 +38,4 @@ Якщо ви повертаєте додаткові коди статусу та відповіді безпосередньо, вони не будуть включені до схеми OpenAPI (документації API), адже FastAPI не має способу заздалегідь знати, що саме ви повернете. -Але ви можете задокументувати це у своєму коді, використовуючи: [Додаткові відповіді](additional-responses.md){.internal-link target=_blank}. +Але ви можете задокументувати це у своєму коді, використовуючи: [Додаткові відповіді](additional-responses.md). diff --git a/docs/uk/docs/advanced/advanced-dependencies.md b/docs/uk/docs/advanced/advanced-dependencies.md index 0c6f8cbb34..48a10ba4d4 100644 --- a/docs/uk/docs/advanced/advanced-dependencies.md +++ b/docs/uk/docs/advanced/advanced-dependencies.md @@ -132,7 +132,7 @@ checker(q="somequery") Так сесія звільнить з'єднання з базою даних, і його зможуть використовувати інші запити. -Якщо у вас інший сценарій, де потрібно раннє завершення залежності з `yield`, створіть, будь ласка, питання в обговореннях GitHub із вашим конкретним випадком і поясненням, чому вам корисне раннє закриття для залежностей з `yield`. +Якщо у вас інший сценарій, де потрібно раннє завершення залежності з `yield`, створіть, будь ласка, [питання в обговореннях GitHub](https://github.com/fastapi/fastapi/discussions/new?category=questions) із вашим конкретним випадком і поясненням, чому вам корисне раннє закриття для залежностей з `yield`. Якщо будуть переконливі приклади для раннього закриття в залежностях з `yield`, я розгляну додавання нового способу увімкнути раннє закриття. @@ -144,7 +144,7 @@ checker(q="somequery") ### Фонові задачі та залежності з `yield`, технічні деталі { #background-tasks-and-dependencies-with-yield-technical-details } -До **FastAPI** 0.106.0 піднімати винятки після `yield` було неможливо: завершальний код у залежностях з `yield` виконувався після надсилання відповіді, тож [обробники винятків](../tutorial/handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank} уже відпрацювали б. +До **FastAPI** 0.106.0 піднімати винятки після `yield` було неможливо: завершальний код у залежностях з `yield` виконувався після надсилання відповіді, тож [обробники винятків](../tutorial/handling-errors.md#install-custom-exception-handlers) уже відпрацювали б. Так було спроєктовано головно для того, щоб дозволити використовувати ті самі об'єкти, «віддані» залежностями через `yield`, усередині фонових задач, оскільки завершальний код виконувався після завершення фонових задач. @@ -160,4 +160,4 @@ checker(q="somequery") Якщо ви раніше покладалися на цю поведінку, тепер слід створювати ресурси для фонових задач усередині самої фонової задачі та використовувати всередині лише дані, що не залежать від ресурсів залежностей із `yield`. -Наприклад, замість використання тієї самої сесії бази даних ви створюватимете нову сесію в самій фоновій задачі та отримуватимете об'єкти з бази даних, використовуючи цю нову сесію. І далі, замість передавання об'єкта з бази даних як параметра у функцію фонової задачі, ви передасте ідентифікатор цього об'єкта, а потім отримаєте об'єкт знову всередині функції фонової задачі. +Наприклад, замість використання тієї самої сесії бази даних ви створюватимете нову сесію в самій фоновій задачі та отримуватимете об'єкти з бази даних, використовуючи Цю нову сесію. І далі, замість передавання об'єкта з бази даних як параметра у функцію фонової задачі, ви передасте ідентифікатор цього об'єкта, а потім отримаєте об'єкт знову всередині функції фонової задачі. diff --git a/docs/uk/docs/advanced/async-tests.md b/docs/uk/docs/advanced/async-tests.md index 51d0d57610..9f19bed14d 100644 --- a/docs/uk/docs/advanced/async-tests.md +++ b/docs/uk/docs/advanced/async-tests.md @@ -16,11 +16,11 @@ `TestClient` робить певну «магію» всередині, щоб викликати асинхронний застосунок FastAPI у ваших звичайних тестових функціях `def`, використовуючи стандартний pytest. Але ця «магія» більше не працює, коли ми використовуємо його всередині асинхронних функцій. Запускаючи тести асинхронно, ми більше не можемо використовувати `TestClient` у наших тестових функціях. -`TestClient` побудований на основі HTTPX, і на щастя, ми можемо використовувати його безпосередньо для тестування API. +`TestClient` побудований на основі [HTTPX](https://www.python-httpx.org), і на щастя, ми можемо використовувати його безпосередньо для тестування API. ## Приклад { #example } -Для простого прикладу розгляньмо структуру файлів, подібну до описаної в [Більші застосунки](../tutorial/bigger-applications.md){.internal-link target=_blank} та [Тестування](../tutorial/testing.md){.internal-link target=_blank}: +Для простого прикладу розгляньмо структуру файлів, подібну до описаної в [Більші застосунки](../tutorial/bigger-applications.md) та [Тестування](../tutorial/testing.md): ``` . @@ -84,7 +84,7 @@ response = client.get('/') /// warning | Попередження -Якщо ваш застосунок залежить від подій тривалості життя, `AsyncClient` не ініціюватиме ці події. Щоб гарантувати їх ініціалізацію, використовуйте `LifespanManager` з florimondmanca/asgi-lifespan. +Якщо ваш застосунок залежить від подій тривалості життя, `AsyncClient` не ініціюватиме ці події. Щоб гарантувати їх ініціалізацію, використовуйте `LifespanManager` з [florimondmanca/asgi-lifespan](https://github.com/florimondmanca/asgi-lifespan#usage). /// @@ -94,6 +94,6 @@ response = client.get('/') /// tip | Порада -Якщо ви натрапили на `RuntimeError: Task attached to a different loop` під час інтеграції асинхронних викликів у ваші тести (наприклад, при використанні MongoDB's MotorClient), пам'ятайте створювати об'єкти, яким потрібен цикл подій, лише всередині асинхронних функцій, наприклад, у зворотному виклику `@app.on_event("startup")`. +Якщо ви натрапили на `RuntimeError: Task attached to a different loop` під час інтеграції асинхронних викликів у ваші тести (наприклад, при використанні [MongoDB's MotorClient](https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop)), пам'ятайте створювати об'єкти, яким потрібен цикл подій, лише всередині асинхронних функцій, наприклад, у зворотному виклику `@app.on_event("startup")`. /// diff --git a/docs/uk/docs/advanced/behind-a-proxy.md b/docs/uk/docs/advanced/behind-a-proxy.md index 66bb4c0827..55fc248f9a 100644 --- a/docs/uk/docs/advanced/behind-a-proxy.md +++ b/docs/uk/docs/advanced/behind-a-proxy.md @@ -16,9 +16,9 @@ Заголовки представника: -* X-Forwarded-For -* X-Forwarded-Proto -* X-Forwarded-Host +* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For) +* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto) +* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host) /// @@ -60,7 +60,7 @@ https://mysuperapp.com/items/ /// tip | Порада -Якщо хочете дізнатися більше про HTTPS, перегляньте посібник [Про HTTPS](../deployment/https.md){.internal-link target=_blank}. +Якщо хочете дізнатися більше про HTTPS, перегляньте посібник [Про HTTPS](../deployment/https.md). /// @@ -228,7 +228,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 Майте на увазі, що сервер (Uvicorn) не використовуватиме `root_path` ні для чого, окрім передачі його застосунку. -Але якщо ви перейдете у вашому браузері на http://127.0.0.1:8000/app, ви побачите звичайну відповідь: +Але якщо ви перейдете у вашому браузері на [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app), ви побачите звичайну відповідь: ```JSON { @@ -251,9 +251,9 @@ Uvicorn очікуватиме, що представник буде зверт ## Локальне тестування з Traefik { #testing-locally-with-traefik } -Ви можете легко провести експеримент локально з вилученим префіксом шляху, використовуючи Traefik. +Ви можете легко провести експеримент локально з вилученим префіксом шляху, використовуючи [Traefik](https://docs.traefik.io/). -Завантажте Traefik, це один бінарний файл, ви можете розпакувати архів і запустити його безпосередньо з термінала. +[Завантажте Traefik](https://github.com/containous/traefik/releases), це один бінарний файл, ви можете розпакувати архів і запустити його безпосередньо з термінала. Потім створіть файл `traefik.toml` з таким вмістом: @@ -330,7 +330,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 ### Перевірте відповіді { #check-the-responses } -Тепер, якщо ви перейдете за URL із портом Uvicorn: http://127.0.0.1:8000/app, ви побачите звичайну відповідь: +Тепер, якщо ви перейдете за URL із портом Uvicorn: [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app), ви побачите звичайну відповідь: ```JSON { @@ -345,7 +345,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 /// -А тепер відкрийте URL із портом Traefik, включно з префіксом шляху: http://127.0.0.1:9999/api/v1/app. +А тепер відкрийте URL із портом Traefik, включно з префіксом шляху: [http://127.0.0.1:9999/api/v1/app](http://127.0.0.1:9999/api/v1/app). Ми отримуємо ту саму відповідь: @@ -370,13 +370,13 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 «Офіційний» спосіб доступу до застосунку - через представника з префіксом шляху, який ми визначили. Тож, як і очікується, якщо ви спробуєте інтерфейс документації, який обслуговує безпосередньо Uvicorn без префікса шляху в URL, це не запрацює, оскільки він очікує доступу через представника. -Ви можете перевірити це на http://127.0.0.1:8000/docs: +Ви можете перевірити це на [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs): Але якщо ми звернемося до інтерфейсу документації за «офіційним» URL, використовуючи представника з портом `9999`, за адресою `/api/v1/docs`, усе працює коректно! 🎉 -Ви можете перевірити це на http://127.0.0.1:9999/api/v1/docs: +Ви можете перевірити це на [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs): @@ -433,7 +433,7 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 /// -В інтерфейсі документації за адресою http://127.0.0.1:9999/api/v1/docs це виглядатиме так: +В інтерфейсі документації за адресою [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs) це виглядатиме так: @@ -461,6 +461,6 @@ $ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 ## Монтування підзастосунку { #mounting-a-sub-application } -Якщо вам потрібно змонтувати підзастосунок (як описано в [Підзастосунки - монтування](sub-applications.md){.internal-link target=_blank}), одночасно використовуючи представника з `root_path`, ви можете робити це звичайним чином, як і очікуєте. +Якщо вам потрібно змонтувати підзастосунок (як описано в [Підзастосунки - монтування](sub-applications.md)), одночасно використовуючи представника з `root_path`, ви можете робити це звичайним чином, як і очікуєте. FastAPI внутрішньо розумно використовуватиме `root_path`, тож усе просто працюватиме. ✨ diff --git a/docs/uk/docs/advanced/custom-response.md b/docs/uk/docs/advanced/custom-response.md index ebd0ec24a1..4ed7616bf7 100644 --- a/docs/uk/docs/advanced/custom-response.md +++ b/docs/uk/docs/advanced/custom-response.md @@ -1,52 +1,36 @@ # Користувацька відповідь - HTML, стрім, файл, інше { #custom-response-html-stream-file-others } -Типово **FastAPI** повертатиме відповіді, використовуючи `JSONResponse`. +Типово **FastAPI** повертатиме JSON-відповіді. -Ви можете переписати це, повернувши безпосередньо `Response`, як показано в [Повернути відповідь безпосередньо](response-directly.md){.internal-link target=_blank}. +Ви можете переписати це, повернувши `Response` безпосередньо, як показано в [Повернути відповідь безпосередньо](response-directly.md). -Але якщо ви повертаєте `Response` безпосередньо (або будь-який його підклас, як-от `JSONResponse`), дані не будуть автоматично конвертовані (навіть якщо ви оголосите `response_model`), і документація не буде автоматично згенерована (наприклад, із включенням конкретного «медіа-типу» в HTTP-заголовку `Content-Type` як частини згенерованого OpenAPI). +Але якщо ви повертаєте `Response` безпосередньо (або будь-який його підклас, як-от `JSONResponse`), дані не будуть автоматично конвертовані (навіть якщо ви оголосите `response_model`), і документація не буде автоматично згенерована (наприклад, з включенням конкретного «медіа-типу» в HTTP-заголовку `Content-Type` як частини згенерованого OpenAPI). Ви також можете оголосити `Response`, який слід використовувати (наприклад, будь-який підклас `Response`), у декораторі операції шляху через параметр `response_class`. Вміст, який ви повертаєте з вашої функції операції шляху, буде поміщений усередину цього `Response`. -І якщо цей `Response` має JSON медіа-тип (`application/json`), як у випадку з `JSONResponse` та `UJSONResponse`, дані, що повертаються, будуть автоматично перетворені (і відфільтровані) з урахуванням будь-якого Pydantic `response_model`, який ви оголосили в декораторі операції шляху. - /// note | Примітка -Якщо ви використовуєте клас відповіді без медіа-типу, FastAPI очікуватиме, що у вашої відповіді не буде вмісту, тож формат відповіді не буде задокументовано в згенерованих OpenAPI-документах. +Якщо ви використовуєте клас відповіді без медіа-типу, FastAPI очікуватиме, що у вашої відповіді не буде вмісту, тож формат відповіді не буде задокументовано в згенерованій документації OpenAPI. /// -## Використовуйте `ORJSONResponse` { #use-orjsonresponse } - -Наприклад, якщо ви максимально оптимізуєте продуктивність, можете встановити та використовувати `orjson` і встановити відповідь як `ORJSONResponse`. - -Імпортуйте потрібний клас `Response` (підклас) і оголосіть його в декораторі операції шляху. - -Для великих відповідей повернення `Response` безпосередньо значно швидше, ніж повернення словника. - -Це тому, що за замовчуванням FastAPI перевірятиме кожен елемент усередині та переконуватиметься, що його можна серіалізувати як JSON, використовуючи той самий [Сумісний кодувальник JSON](../tutorial/encoder.md){.internal-link target=_blank}, описаний у навчальному посібнику. Саме це дозволяє повертати довільні об'єкти, наприклад моделі бази даних. - -Але якщо ви впевнені, що вміст, який повертається, серіалізується в JSON, ви можете передати його безпосередньо класу відповіді та уникнути додаткових витрат FastAPI на пропускання вашого вмісту через `jsonable_encoder` перед передаванням його класу відповіді. +## JSON-відповіді { #json-responses } -{* ../../docs_src/custom_response/tutorial001b_py310.py hl[2,7] *} +Типово FastAPI повертає JSON-відповіді. -/// info | Інформація - -Параметр `response_class` також визначатиме «медіа-тип» відповіді. +Якщо ви оголосите [Модель відповіді](../tutorial/response-model.md), FastAPI використає її, щоб серіалізувати дані в JSON за допомогою Pydantic. -У цьому випадку HTTP-заголовок `Content-Type` буде встановлено в `application/json`. +Якщо ви не оголосите модель відповіді, FastAPI використає `jsonable_encoder`, пояснений у [Сумісний кодувальник JSON](../tutorial/encoder.md), і помістить результат у `JSONResponse`. -І це буде задокументовано відповідно в OpenAPI. +Якщо ви оголосите `response_class` з JSON медіа-типом (`application/json`), як у випадку з `JSONResponse`, дані, що повертаються, будуть автоматично перетворені (і відфільтровані) згідно з будь-якою Pydantic `response_model`, яку ви оголосили в декораторі операції шляху. Але дані не будуть серіалізовані в JSON-байти за допомогою Pydantic, натомість вони будуть перетворені з `jsonable_encoder`, а потім передані класу `JSONResponse`, який і серіалізує їх у байти, використовуючи стандартну JSON-бібліотеку в Python. -/// +### Продуктивність JSON { #json-performance } -/// tip | Порада +Коротко: якщо вам потрібна максимальна продуктивність, використовуйте [Модель відповіді](../tutorial/response-model.md) і не оголошуйте `response_class` у декораторі операції шляху. -`ORJSONResponse` доступний лише у FastAPI, не в Starlette. - -/// +{* ../../docs_src/response_model/tutorial001_01_py310.py ln[15:17] hl[16] *} ## HTML-відповідь { #html-response } @@ -69,7 +53,7 @@ ### Повернути `Response` { #return-a-response } -Як показано в [Повернути відповідь безпосередньо](response-directly.md){.internal-link target=_blank}, ви також можете переписати відповідь безпосередньо у вашій операції шляху, просто повернувши її. +Як показано в [Повернути відповідь безпосередньо](response-directly.md), ви також можете переписати відповідь безпосередньо у вашій операції шляху, просто повернувши її. Той самий приклад вище, що повертає `HTMLResponse`, може виглядати так: @@ -134,7 +118,7 @@ - `headers` - `dict` строк. - `media_type` - `str`, що задає медіа-тип, напр. `"text/html"`. -FastAPI (насправді Starlette) автоматично додасть заголовок Content-Length. Також буде додано заголовок Content-Type, на основі `media_type` з додаванням набору символів для текстових типів. +FastAPI (насправді Starlette) автоматично додасть заголовок Content-Length. Також буде додано заголовок Content-Type на основі `media_type` з додаванням набору символів для текстових типів. {* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *} @@ -154,37 +138,11 @@ FastAPI (насправді Starlette) автоматично додасть з Це типова відповідь, яку використовує **FastAPI**, як зазначено вище. -### `ORJSONResponse` { #orjsonresponse } - -Швидка альтернативна JSON-відповідь з використанням `orjson`, як описано вище. - -/// info | Інформація - -Потрібно встановити `orjson`, наприклад `pip install orjson`. - -/// - -### `UJSONResponse` { #ujsonresponse } - -Альтернативна JSON-відповідь з використанням `ujson`. - -/// info | Інформація - -Потрібно встановити `ujson`, наприклад `pip install ujson`. - -/// - -/// warning | Попередження - -`ujson` менш обережний, ніж вбудована реалізація Python, у поводженні з деякими крайніми випадками. - -/// - -{* ../../docs_src/custom_response/tutorial001_py310.py hl[2,7] *} +/// note | Технічні деталі -/// tip | Порада +Але якщо ви оголосите модель відповіді або тип, його буде використано безпосередньо для серіалізації даних у JSON, і відповідь з коректним медіа-типом для JSON буде повернута безпосередньо, без використання класу `JSONResponse`. -Ймовірно, `ORJSONResponse` може бути швидшою альтернативою. +Це ідеальний спосіб отримати найкращу продуктивність. /// @@ -200,6 +158,7 @@ FastAPI (насправді Starlette) автоматично додасть з Або ви можете використати його в параметрі `response_class`: + {* ../../docs_src/custom_response/tutorial006b_py310.py hl[2,7,9] *} У такому разі ви можете повертати URL безпосередньо з вашої функції операції шляху. @@ -214,31 +173,25 @@ FastAPI (насправді Starlette) автоматично додасть з ### `StreamingResponse` { #streamingresponse } -Приймає async-генератор або звичайний генератор/ітератор і транслює тіло відповіді потоково. - -{* ../../docs_src/custom_response/tutorial007_py310.py hl[2,14] *} - -#### Використання `StreamingResponse` з об'єктами типу file-like { #using-streamingresponse-with-file-like-objects } +Приймає async-генератор або звичайний генератор/ітератор (функцію з `yield`) і потоково передає тіло відповіді. -Якщо у вас є file-like об'єкт (наприклад, об'єкт, що повертається `open()`), ви можете створити генераторну функцію для ітерації по цьому file-like об'єкту. +{* ../../docs_src/custom_response/tutorial007_py310.py hl[3,16] *} -Таким чином, вам не потрібно спочатку читати все в пам'ять, і ви можете передати цю генераторну функцію в `StreamingResponse` і повернути її. - -Сюди входить багато бібліотек для взаємодії з хмарними сховищами, обробки відео та інші. +/// note | Технічні деталі -{* ../../docs_src/custom_response/tutorial008_py310.py hl[2,10:12,14] *} +Завдання `async` може бути скасовано лише тоді, коли воно досягає `await`. Якщо немає `await`, генератор (функція з `yield`) не може бути коректно скасований і може продовжувати працювати навіть після запиту на скасування. -1. Це генераторна функція. Вона є «генераторною функцією», бо містить оператори `yield` усередині. -2. Використовуючи блок `with`, ми гарантуємо, що file-like об'єкт буде закрито після завершення роботи генераторної функції. Тобто після того, як вона завершить надсилання відповіді. -3. Цей `yield from` вказує функції ітеруватися по об'єкту з назвою `file_like`. А потім, для кожної ітерованої частини, повертати цю частину, ніби вона надходить з цієї генераторної функції (`iterfile`). +Оскільки цьому невеликому прикладу не потрібні жодні оператори `await`, ми додаємо `await anyio.sleep(0)`, щоб надати циклу подій шанс обробити скасування. - Тож це генераторна функція, яка всередині передає роботу «генерації» чомусь іншому. +Це ще важливіше для великих або нескінченних потоків. - Роблячи це таким чином, ми можемо помістити її в блок `with` і таким чином гарантувати, що file-like об'єкт буде закрито після завершення. +/// /// tip | Порада -Зверніть увагу, що тут ми використовуємо стандартний `open()`, який не підтримує `async` та `await`, тому ми оголошуємо операцію шляху звичайною `def`. +Замість того щоб повертати `StreamingResponse` безпосередньо, імовірно, краще дотримуватися стилю в [Потокова передача даних](./stream-data.md), це значно зручніше та обробляє скасування «за лаштунками» для вас. + +Якщо ви транслюєте JSON Lines, дотримуйтесь навчального посібника [Потоки JSON Lines](../tutorial/stream-json-lines.md). /// @@ -267,7 +220,7 @@ FastAPI (насправді Starlette) автоматично додасть з Ви можете створити власний клас відповіді, успадкувавши його від `Response`, і використовувати його. -Наприклад, скажімо, ви хочете використовувати `orjson`, але з деякими користувацькими налаштуваннями, які не використовуються у вбудованому класі `ORJSONResponse`. +Наприклад, скажімо, ви хочете використовувати [`orjson`](https://github.com/ijl/orjson) з деякими налаштуваннями. Припустімо, ви хочете, щоб повертався відформатований із відступами JSON, тож ви хочете використати опцію orjson `orjson.OPT_INDENT_2`. @@ -291,13 +244,21 @@ FastAPI (насправді Starlette) автоматично додасть з Звісно, ви, ймовірно, знайдете значно кращі способи скористатися цим, ніж просто форматування JSON. 😉 +### `orjson` або Модель відповіді { #orjson-or-response-model } + +Якщо ви шукаєте продуктивність, імовірно, краще використати [Модель відповіді](../tutorial/response-model.md), ніж відповідь `orjson`. + +З моделлю відповіді FastAPI використає Pydantic, щоб серіалізувати дані в JSON без проміжних кроків, як-от перетворення за допомогою `jsonable_encoder`, що відбувалося б в іншому випадку. + +І «під капотом» Pydantic використовує ті самі внутрішні механізми Rust, що й `orjson`, для серіалізації в JSON, тож ви вже отримаєте найкращу продуктивність із моделлю відповіді. + ## Типова відповідь за замовчуванням { #default-response-class } Створюючи екземпляр класу **FastAPI** або `APIRouter`, ви можете вказати, який клас відповіді використовувати за замовчуванням. Параметр, що це визначає, - `default_response_class`. -У прикладі нижче **FastAPI** використовуватиме `ORJSONResponse` за замовчуванням в усіх операціях шляху замість `JSONResponse`. +У прикладі нижче **FastAPI** використовуватиме `HTMLResponse` за замовчуванням в усіх операціях шляху, замість JSON. {* ../../docs_src/custom_response/tutorial010_py310.py hl[2,4] *} @@ -309,4 +270,4 @@ FastAPI (насправді Starlette) автоматично додасть з ## Додаткова документація { #additional-documentation } -Ви також можете оголосити медіа-тип і багато інших деталей в OpenAPI, використовуючи `responses`: [Додаткові відповіді в OpenAPI](additional-responses.md){.internal-link target=_blank}. +Ви також можете оголосити медіа-тип і багато інших деталей в OpenAPI, використовуючи `responses`: [Додаткові відповіді в OpenAPI](additional-responses.md). diff --git a/docs/uk/docs/advanced/dataclasses.md b/docs/uk/docs/advanced/dataclasses.md index a41e6e5890..1c91304b08 100644 --- a/docs/uk/docs/advanced/dataclasses.md +++ b/docs/uk/docs/advanced/dataclasses.md @@ -2,11 +2,11 @@ FastAPI побудовано поверх **Pydantic**, і я показував вам, як використовувати моделі Pydantic для оголошення запитів і відповідей. -Але FastAPI також підтримує використання `dataclasses` таким самим чином: +Але FastAPI також підтримує використання [`dataclasses`](https://docs.python.org/3/library/dataclasses.html) таким самим чином: {* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *} -Це підтримується завдяки **Pydantic**, адже він має внутрішню підтримку `dataclasses`. +Це підтримується завдяки **Pydantic**, адже він має [внутрішню підтримку `dataclasses`](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel). Тож навіть із наведеним вище кодом, який явно не використовує Pydantic, FastAPI використовує Pydantic, щоб перетворити стандартні dataclasses у власний варіант dataclasses Pydantic. @@ -18,7 +18,7 @@ FastAPI побудовано поверх **Pydantic**, і я показував Це працює так само, як із моделями Pydantic. Насправді під капотом це також досягається за допомогою Pydantic. -/// info | Інформація +/// info Майте на увазі, що dataclasses не можуть робити все те, що можуть моделі Pydantic. @@ -64,7 +64,7 @@ Dataclass буде автоматично перетворено на dataclass 6. Тут ми повертаємо словник, що містить `items`, який є списком dataclass. - FastAPI усе ще здатний серіалізувати дані до JSON. + FastAPI усе ще здатний серіалізувати дані до JSON. 7. Тут у `response_model` використано анотацію типу список dataclass `Author`. @@ -74,7 +74,7 @@ Dataclass буде автоматично перетворено на dataclass Як завжди, у FastAPI ви можете поєднувати `def` і `async def` за потреби. - Якщо вам потрібне коротке нагадування, коли що використовувати, перегляньте розділ _«Поспішаєте?»_ у документації про [`async` та `await`](../async.md#in-a-hurry){.internal-link target=_blank}. + Якщо вам потрібне коротке нагадування, коли що використовувати, перегляньте розділ _«Поспішаєте?»_ у документації про [`async` та `await`](../async.md#in-a-hurry). 9. Ця *функція операції шляху* не повертає dataclasses (хоча могла б), а список словників із внутрішніми даними. @@ -88,7 +88,7 @@ Dataclass буде автоматично перетворено на dataclass Можна поєднувати `dataclasses` з іншими моделями Pydantic, наслідувати їх, включати у власні моделі тощо. -Щоб дізнатися більше, перегляньте документацію Pydantic про dataclasses. +Щоб дізнатися більше, перегляньте [документацію Pydantic про dataclasses](https://docs.pydantic.dev/latest/concepts/dataclasses/). ## Версія { #version } diff --git a/docs/uk/docs/advanced/events.md b/docs/uk/docs/advanced/events.md index 7c05ee4a4e..33f6314fe1 100644 --- a/docs/uk/docs/advanced/events.md +++ b/docs/uk/docs/advanced/events.md @@ -150,11 +150,11 @@ async with lifespan(app): Невелика технічна деталь для допитливих нердів. 🤓 -Під капотом, у технічній специфікації ASGI, це частина Протоколу тривалості життя, і там визначені події `startup` і `shutdown`. +Під капотом, у технічній специфікації ASGI, це частина [Протоколу тривалості життя](https://asgi.readthedocs.io/en/latest/specs/lifespan.html), і там визначені події `startup` і `shutdown`. /// info | Інформація -Ви можете прочитати більше про обробники `lifespan` у документації Starlette про Lifespan. +Ви можете прочитати більше про обробники `lifespan` у [документації Starlette про Lifespan](https://www.starlette.dev/lifespan/). Зокрема, як працювати зі станом тривалості життя, який можна використовувати в інших ділянках вашого коду. @@ -162,4 +162,4 @@ async with lifespan(app): ## Підзастосунки { #sub-applications } -🚨 Майте на увазі, що ці події тривалості життя (startup і shutdown) виконуються лише для головного застосунку, а не для [Підзастосунки - монтування](sub-applications.md){.internal-link target=_blank}. +🚨 Майте на увазі, що ці події тривалості життя (startup і shutdown) виконуються лише для головного застосунку, а не для [Підзастосунки - монтування](sub-applications.md). diff --git a/docs/uk/docs/advanced/generate-clients.md b/docs/uk/docs/advanced/generate-clients.md index 66e9193ac3..257089c41a 100644 --- a/docs/uk/docs/advanced/generate-clients.md +++ b/docs/uk/docs/advanced/generate-clients.md @@ -8,11 +8,11 @@ ## Генератори SDK з відкритим кодом { #open-source-sdk-generators } -Універсальним варіантом є OpenAPI Generator, який підтримує **багато мов програмування** та може генерувати SDK з вашої специфікації OpenAPI. +Універсальним варіантом є [OpenAPI Generator](https://openapi-generator.tech/), який підтримує **багато мов програмування** та може генерувати SDK з вашої специфікації OpenAPI. -Для **клієнтів TypeScript** Hey API — спеціалізоване рішення, що надає оптимізований досвід для екосистеми TypeScript. +Для **клієнтів TypeScript** [Hey API](https://heyapi.dev/) — спеціалізоване рішення, що надає оптимізований досвід для екосистеми TypeScript. -Більше генераторів SDK ви можете знайти на OpenAPI.Tools. +Більше генераторів SDK ви можете знайти на [OpenAPI.Tools](https://openapi.tools/#sdk). /// tip | Порада @@ -24,15 +24,15 @@ FastAPI автоматично генерує специфікації **OpenAPI У цьому розділі представлено рішення від компаній, що спонсорують FastAPI: вони мають **венчурну підтримку** та **корпоративну підтримку**. Ці продукти надають **додаткові можливості** та **інтеграції** поверх високоякісно згенерованих SDK. -Завдяки ✨ [**спонсорству FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨ ці компанії допомагають підтримувати фреймворк та його **екосистему** здоровими та **сталими**. +Завдяки ✨ [**спонсорству FastAPI**](../help-fastapi.md#sponsor-the-author) ✨ ці компанії допомагають підтримувати фреймворк та його **екосистему** здоровими та **сталими**. Їхня підтримка також демонструє сильну відданість **спільноті** FastAPI (вам), показуючи, що їм важливо не лише надавати **відмінний сервіс**, а й підтримувати **міцний і процвітаючий фреймворк**, FastAPI. 🙇 Наприклад, ви можете спробувати: -* Speakeasy -* Stainless -* liblab +* [Speakeasy](https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship) +* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) +* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi) Деякі з цих рішень також можуть бути з відкритим кодом або мати безкоштовні тарифи, тож ви можете спробувати їх без фінансових зобов'язань. Інші комерційні генератори SDK також доступні й їх можна знайти онлайн. 🤓 @@ -66,7 +66,7 @@ npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client Це згенерує TypeScript SDK у `./src/client`. -Ви можете дізнатися, як встановити `@hey-api/openapi-ts`, і почитати про згенерований результат на їхньому сайті. +Ви можете дізнатися, як [встановити `@hey-api/openapi-ts`](https://heyapi.dev/openapi-ts/get-started), і почитати про [згенерований результат](https://heyapi.dev/openapi-ts/output) на їхньому сайті. ### Використання SDK { #using-the-sdk } diff --git a/docs/uk/docs/advanced/index.md b/docs/uk/docs/advanced/index.md index 1cffe0cecd..d856c1e9e1 100644 --- a/docs/uk/docs/advanced/index.md +++ b/docs/uk/docs/advanced/index.md @@ -2,13 +2,13 @@ ## Додаткові можливості { #additional-features } -Основний [Навчальний посібник - Посібник користувача](../tutorial/index.md){.internal-link target=_blank} має бути достатнім, щоб провести вас через усі основні можливості **FastAPI**. +Основний [Навчальний посібник - Посібник користувача](../tutorial/index.md) має бути достатнім, щоб провести вас через усі основні можливості **FastAPI**. У наступних розділах ви побачите інші опції, конфігурації та додаткові можливості. -/// tip | Порада +/// tip -Наступні розділи не обов'язково «просунуті». +Наступні розділи **не обов'язково «просунуті»**. І можливо, що рішення для вашого випадку використання може бути в одному з них. @@ -16,6 +16,6 @@ ## Спершу прочитайте навчальний посібник { #read-the-tutorial-first } -Ви все ще можете використовувати більшість можливостей **FastAPI**, маючи знання з основного [Навчального посібника - Посібника користувача](../tutorial/index.md){.internal-link target=_blank}. +Ви все ще можете використовувати більшість можливостей **FastAPI**, маючи знання з основного [Навчального посібника - Посібника користувача](../tutorial/index.md). А в наступних розділах передбачається, що ви вже його прочитали і знайомі з основними ідеями. diff --git a/docs/uk/docs/advanced/json-base64-bytes.md b/docs/uk/docs/advanced/json-base64-bytes.md new file mode 100644 index 0000000000..2cb6461ec7 --- /dev/null +++ b/docs/uk/docs/advanced/json-base64-bytes.md @@ -0,0 +1,63 @@ +# JSON з байтами як Base64 { #json-with-bytes-as-base64 } + +Якщо ваш застосунок має отримувати і надсилати дані JSON, але потрібно включати туди двійкові дані, ви можете кодувати їх як base64. + +## Base64 проти файлів { #base64-vs-files } + +Насамперед розгляньте, чи можете ви використати [Файли запиту](../tutorial/request-files.md) для завантаження двійкових даних і [Користувацька відповідь - FileResponse](./custom-response.md#fileresponse--fileresponse-) для надсилання двійкових даних замість кодування їх у JSON. + +JSON може містити лише строки, закодовані в UTF-8, тому він не може містити «сирі» байти. + +Base64 може кодувати двійкові дані у строках, але для цього потрібно більше символів, ніж у початкових двійкових даних, тож зазвичай це менш ефективно, ніж звичайні файли. + +Використовуйте base64 лише якщо справді потрібно включати двійкові дані в JSON і ви не можете використати файли для цього. + +## Pydantic `bytes` { #pydantic-bytes } + +Ви можете оголосити модель Pydantic з полями `bytes`, а потім використати `val_json_bytes` у конфігурації моделі, щоб вказати їй використовувати base64 для перевірки вхідних даних JSON; як частина цієї перевірки, вона декодує строку base64 у байти. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *} + +Якщо ви перевірите `/docs`, там буде показано, що поле `data` очікує байти, закодовані в base64: + +
+ +
+ +Ви можете надіслати запит так: + +```json +{ + "description": "Some data", + "data": "aGVsbG8=" +} +``` + +/// tip | Порада + +`aGVsbG8=` - це кодування base64 для `hello`. + +/// + +Після цього Pydantic декодує строку base64 і надасть вам початкові байти в полі моделі `data`. + +Ви отримаєте відповідь приблизно таку: + +```json +{ + "description": "Some data", + "content": "hello" +} +``` + +## Pydantic `bytes` для вихідних даних { #pydantic-bytes-for-output-data } + +Ви також можете використовувати поля `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. + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *} diff --git a/docs/uk/docs/advanced/middleware.md b/docs/uk/docs/advanced/middleware.md index 207ca96e0a..d24bc4a5c2 100644 --- a/docs/uk/docs/advanced/middleware.md +++ b/docs/uk/docs/advanced/middleware.md @@ -1,8 +1,8 @@ # Просунуте проміжне програмне забезпечення { #advanced-middleware } -У головному навчальному посібнику ви читали, як додати [Користувацьке проміжне ПЗ](../tutorial/middleware.md){.internal-link target=_blank} до вашого застосунку. +У головному навчальному посібнику ви читали, як додати [Користувацьке проміжне ПЗ](../tutorial/middleware.md) до вашого застосунку. -Також ви читали, як обробляти [CORS за допомогою `CORSMiddleware`](../tutorial/cors.md){.internal-link target=_blank}. +Також ви читали, як обробляти [CORS за допомогою `CORSMiddleware`](../tutorial/cors.md). У цьому розділі розглянемо, як використовувати інше проміжне ПЗ. @@ -91,7 +91,7 @@ Middleware обробляє як стандартні, так і потоков Наприклад: -- `ProxyHeadersMiddleware` з Uvicorn -- MessagePack +- [`ProxyHeadersMiddleware` з Uvicorn](https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py) +- [MessagePack](https://github.com/florimondmanca/msgpack-asgi) -Щоб переглянути інші доступні middleware, ознайомтеся з документацією Starlette щодо middleware та списком ASGI Awesome. +Щоб переглянути інші доступні middleware, ознайомтеся з [документацією Starlette щодо middleware](https://www.starlette.dev/middleware/) та [списком ASGI Awesome](https://github.com/florimondmanca/awesome-asgi). diff --git a/docs/uk/docs/advanced/openapi-callbacks.md b/docs/uk/docs/advanced/openapi-callbacks.md index 1f2adb1fc0..5c5c966614 100644 --- a/docs/uk/docs/advanced/openapi-callbacks.md +++ b/docs/uk/docs/advanced/openapi-callbacks.md @@ -35,7 +35,7 @@ /// tip | Порада -Параметр запиту `callback_url` використовує тип Pydantic Url. +Параметр запиту `callback_url` використовує тип Pydantic [Url](https://docs.pydantic.dev/latest/api/networks/). /// @@ -66,7 +66,7 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) Фактичний зворотний виклик - це просто HTTP-запит. -Реалізуючи зворотний виклик самостійно, ви можете скористатися, наприклад, HTTPX або Requests. +Реалізуючи зворотний виклик самостійно, ви можете скористатися, наприклад, [HTTPX](https://www.python-httpx.org) або [Requests](https://requests.readthedocs.io/). /// @@ -106,11 +106,11 @@ httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) Є 2 основні відмінності від звичайної операції шляху: - Їй не потрібен реальний код, адже ваш застосунок ніколи не викликатиме цей код. Вона використовується лише для документування зовнішнього API. Тому функція може просто містити `pass`. -- Шлях може містити вираз OpenAPI 3 (див. нижче), де можна використовувати змінні з параметрами та частини оригінального запиту, надісланого до вашого API. +- Шлях може містити [вираз OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) (див. нижче), де можна використовувати змінні з параметрами та частини оригінального запиту, надісланого до вашого API. ### Вираз шляху зворотного виклику { #the-callback-path-expression } -Шлях зворотного виклику може містити вираз OpenAPI 3, який включає частини оригінального запиту, надісланого до вашого API. +Шлях зворотного виклику може містити [вираз OpenAPI 3](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression), який включає частини оригінального запиту, надісланого до вашого API. У цьому випадку це строка: @@ -179,7 +179,7 @@ https://www.external.org/events/invoices/2expen51ve ### Перевірте документацію { #check-the-docs } -Тепер ви можете запустити застосунок і перейти за адресою http://127.0.0.1:8000/docs. +Тепер ви можете запустити застосунок і перейти за адресою [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Ви побачите вашу документацію з розділом «Callbacks» для вашої операції шляху, який показує, як має виглядати зовнішній API: diff --git a/docs/uk/docs/advanced/openapi-webhooks.md b/docs/uk/docs/advanced/openapi-webhooks.md index 0d8a7f4c5f..bf51f54667 100644 --- a/docs/uk/docs/advanced/openapi-webhooks.md +++ b/docs/uk/docs/advanced/openapi-webhooks.md @@ -48,7 +48,7 @@ ### Перевірте документацію { #check-the-docs } -Тепер ви можете запустити свій застосунок і перейти за адресою http://127.0.0.1:8000/docs. +Тепер ви можете запустити свій застосунок і перейти за адресою [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Ви побачите у своїй документації звичайні *операції шляху*, а також деякі **вебхуки**: diff --git a/docs/uk/docs/advanced/path-operation-advanced-configuration.md b/docs/uk/docs/advanced/path-operation-advanced-configuration.md index 202f9317ed..f760209abe 100644 --- a/docs/uk/docs/advanced/path-operation-advanced-configuration.md +++ b/docs/uk/docs/advanced/path-operation-advanced-configuration.md @@ -24,7 +24,7 @@ /// tip | Порада -Якщо ви вручну викликаєте `app.openapi()`, оновіть значення `operationId` до цього. +Якщо ви вручну викликаєте `app.openapi()`, оновіть усі `operationId` до цього. /// @@ -60,7 +60,7 @@ Також можна оголосити додаткові відповіді з їхніми моделями, кодами статусу тощо. -У документації є цілий розділ про це, ви можете прочитати його тут: [Додаткові відповіді в OpenAPI](additional-responses.md){.internal-link target=_blank}. +У документації є цілий розділ про це, ви можете прочитати його тут: [Додаткові відповіді в OpenAPI](additional-responses.md). ## Додатково в OpenAPI { #openapi-extra } @@ -68,7 +68,7 @@ /// note | Технічні деталі -У специфікації OpenAPI це називається Об'єкт Operation. +У специфікації OpenAPI це називається [Об'єкт Operation](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operation-object). /// @@ -82,7 +82,7 @@ Це низькорівнева точка розширення. -Якщо вам потрібно лише оголосити додаткові відповіді, зручніше зробити це через [Додаткові відповіді в OpenAPI](additional-responses.md){.internal-link target=_blank}. +Якщо вам потрібно лише оголосити додаткові відповіді, зручніше зробити це через [Додаткові відповіді в OpenAPI](additional-responses.md). /// diff --git a/docs/uk/docs/advanced/response-change-status-code.md b/docs/uk/docs/advanced/response-change-status-code.md index fdf9f81c56..167df83132 100644 --- a/docs/uk/docs/advanced/response-change-status-code.md +++ b/docs/uk/docs/advanced/response-change-status-code.md @@ -1,6 +1,6 @@ # Відповідь - зміна коду статусу { #response-change-status-code } -Ймовірно, ви вже читали, що можна встановити типовий [код статусу відповіді](../tutorial/response-status-code.md){.internal-link target=_blank}. +Ймовірно, ви вже читали, що можна встановити типовий [код статусу відповіді](../tutorial/response-status-code.md). Але інколи потрібно повернути інший код статусу, ніж типовий. diff --git a/docs/uk/docs/advanced/response-cookies.md b/docs/uk/docs/advanced/response-cookies.md index 826602e708..f4a79fb985 100644 --- a/docs/uk/docs/advanced/response-cookies.md +++ b/docs/uk/docs/advanced/response-cookies.md @@ -20,13 +20,13 @@ Ви також можете створювати кукі, повертаючи `Response` безпосередньо у вашому коді. -Для цього ви можете створити відповідь, як описано в [Повернути відповідь безпосередньо](response-directly.md){.internal-link target=_blank}. +Для цього ви можете створити відповідь, як описано в [Повернути відповідь безпосередньо](response-directly.md). Потім встановіть у ньому кукі і поверніть його: {* ../../docs_src/response_cookies/tutorial001_py310.py hl[10:12] *} -/// tip | Порада +/// tip Майте на увазі, що якщо ви повертаєте відповідь безпосередньо замість використання параметра `Response`, FastAPI поверне її напряму. @@ -48,4 +48,4 @@ /// -Щоб побачити всі доступні параметри та опції, перегляньте документацію в Starlette. +Щоб побачити всі доступні параметри та опції, перегляньте [документацію в Starlette](https://www.starlette.dev/responses/#set-cookie). diff --git a/docs/uk/docs/advanced/response-directly.md b/docs/uk/docs/advanced/response-directly.md index 7396ab7565..30d8f58609 100644 --- a/docs/uk/docs/advanced/response-directly.md +++ b/docs/uk/docs/advanced/response-directly.md @@ -1,36 +1,42 @@ # Повернення Response безпосередньо { #return-a-response-directly } -Коли ви створюєте операцію шляху FastAPI, зазвичай ви можете повертати з неї будь-які дані: `dict`, `list`, модель Pydantic, модель бази даних тощо. +Коли ви створюєте операцію шляху **FastAPI**, зазвичай ви можете повертати з неї будь-які дані: `dict`, `list`, модель Pydantic, модель бази даних тощо. -Типово FastAPI автоматично перетворить це значення повернення на JSON, використовуючи `jsonable_encoder`, описаний у [Сумісному з JSON кодері](../tutorial/encoder.md){.internal-link target=_blank}. +Якщо ви оголосите [Модель відповіді](../tutorial/response-model.md), **FastAPI** використає її, щоб серіалізувати дані у JSON за допомогою Pydantic. -Потім, за лаштунками, він помістить ці дані, сумісні з JSON (наприклад, `dict`), у `JSONResponse`, який буде використано для надсилання відповіді клієнту. +Якщо ви не оголошуєте модель відповіді, **FastAPI** використає `jsonable_encoder`, описаний у [Сумісному з JSON кодері](../tutorial/encoder.md), і помістить результат у `JSONResponse`. -Але ви можете повертати `JSONResponse` безпосередньо з ваших операцій шляху. +Ви також можете створити `JSONResponse` безпосередньо і повернути його. -Це може бути корисним, наприклад, щоб повертати власні заголовки або кукі. +/// tip | Порада + +Зазвичай ви отримаєте значно кращу продуктивність, використовуючи [Модель відповіді](../tutorial/response-model.md), ніж повертаючи `JSONResponse` безпосередньо, адже так дані серіалізуються Pydantic на Rust. + +/// ## Повернення `Response` { #return-a-response } -Насправді ви можете повертати будь-який `Response` або будь-який його підклас. +Ви можете повертати `Response` або будь-який його підклас. -/// tip | Порада +/// info | Інформація `JSONResponse` сам є підкласом `Response`. /// -І коли ви повертаєте `Response`, FastAPI передасть його безпосередньо. +І коли ви повертаєте `Response`, **FastAPI** передасть його безпосередньо. Він не виконуватиме жодних перетворень даних за допомогою моделей Pydantic, не перетворюватиме вміст на будь-який тип тощо. Це дає вам багато гнучкості. Ви можете повертати будь-які типи даних, переписувати будь-які оголошення або перевірки даних тощо. +Це також покладає на вас багато відповідальності. Ви маєте переконатися, що дані, які ви повертаєте, коректні, у правильному форматі, можуть бути серіалізовані тощо. + ## Використання `jsonable_encoder` у `Response` { #using-the-jsonable-encoder-in-a-response } -Оскільки FastAPI не вносить змін у `Response`, який ви повертаєте, вам потрібно впевнитися, що його вміст готовий. +Оскільки **FastAPI** не вносить змін у `Response`, який ви повертаєте, вам потрібно впевнитися, що його вміст готовий. -Наприклад, ви не можете покласти модель Pydantic у `JSONResponse`, не перетворивши її спочатку на `dict` з усіма типами даних (як-от `datetime`, `UUID` тощо), перетвореними на типи, сумісні з JSON. +Наприклад, ви не можете помістити модель Pydantic у `JSONResponse`, не перетворивши її спочатку на `dict` з усіма типами даних (як-от `datetime`, `UUID` тощо), перетвореними на типи, сумісні з JSON. Для таких випадків ви можете використати `jsonable_encoder`, щоб перетворити ваші дані перед тим, як передати їх у відповідь: @@ -40,26 +46,38 @@ Ви також можете використати `from starlette.responses import JSONResponse`. -FastAPI надає ті самі `starlette.responses` як `fastapi.responses` просто як зручність для вас, розробника. Але більшість доступних `Response` походять безпосередньо зі Starlette. +**FastAPI** надає ті самі `starlette.responses` як `fastapi.responses` просто як зручність для вас, розробника. Але більшість доступних відповідей походять безпосередньо зі Starlette. /// ## Повернення власного `Response` { #returning-a-custom-response } -Наведений вище приклад показує всі необхідні частини, але він ще не дуже корисний, адже ви могли просто повернути `item` безпосередньо, і FastAPI помістив би його у `JSONResponse`, перетворивши на `dict` тощо. Усе це відбувається за замовчуванням. +Наведений вище приклад показує всі необхідні частини, але він ще не дуже корисний, адже ви могли просто повернути `item` безпосередньо, і **FastAPI** помістив би його у `JSONResponse`, перетворивши на `dict` тощо. Усе це відбувається за замовчуванням. Тепер подивімося, як це використати, щоб повернути власну відповідь. -Припустімо, ви хочете повернути відповідь XML. +Припустімо, ви хочете повернути відповідь [XML](https://en.wikipedia.org/wiki/XML). Ви можете помістити свій вміст XML у строку, помістити це в `Response` і повернути: {* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *} +## Як працює модель відповіді { #how-a-response-model-works } + +Коли ви оголошуєте [Модель відповіді - Тип, що повертається](../tutorial/response-model.md) в операції шляху, **FastAPI** використає її, щоб серіалізувати дані у JSON за допомогою Pydantic. + +{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *} + +Оскільки це відбувається на боці Rust, продуктивність буде значно кращою, ніж якби це робилося звичайним Python і класом `JSONResponse`. + +Коли використовується `response_model` або тип, що повертається, **FastAPI** не використовуватиме `jsonable_encoder` для перетворення даних (що було б повільніше) і не використовуватиме клас `JSONResponse`. + +Натомість воно бере байти JSON, згенеровані Pydantic за допомогою моделі відповіді (або типу, що повертається), і повертає `Response` з відповідним медіа-типом для JSON (`application/json`) безпосередньо. + ## Примітки { #notes } Коли ви повертаєте `Response` безпосередньо, його дані не перевіряються, не перетворюються (серіалізуються) і не документуються автоматично. -Але ви все ще можете задокументувати це, як описано в [Додаткових відповідях в OpenAPI](additional-responses.md){.internal-link target=_blank}. +Але ви все ще можете задокументувати це, як описано в [Додаткових відповідях в OpenAPI](additional-responses.md). У подальших розділах ви побачите, як використовувати/оголошувати ці власні `Response`, водночас зберігаючи автоматичне перетворення даних, документацію тощо. diff --git a/docs/uk/docs/advanced/response-headers.md b/docs/uk/docs/advanced/response-headers.md index 1c9d4e6773..95ab57fe08 100644 --- a/docs/uk/docs/advanced/response-headers.md +++ b/docs/uk/docs/advanced/response-headers.md @@ -12,7 +12,7 @@ Якщо ви оголосили `response_model`, його все одно буде використано для фільтрації та перетворення поверненого обʼєкта. -FastAPI використає цей *тимчасовий* обʼєкт відповіді, щоб витягти заголовки (а також кукі та код статусу) і помістить їх у кінцеву відповідь, яка міститиме повернуте вами значення, відфільтроване будь-яким `response_model`. +**FastAPI** використає цей *тимчасовий* обʼєкт відповіді, щоб витягти заголовки (а також кукі та код статусу) і помістить їх у кінцеву відповідь, яка міститиме повернуте вами значення, відфільтроване будь-яким `response_model`. Також ви можете оголосити параметр `Response` у залежностях і встановлювати в них заголовки (та кукі). @@ -20,7 +20,7 @@ FastAPI використає цей *тимчасовий* обʼєкт відп Ви також можете додавати заголовки, коли повертаєте `Response` безпосередньо. -Створіть відповідь, як описано в [Повернення Response безпосередньо](response-directly.md){.internal-link target=_blank}, і передайте заголовки як додатковий параметр: +Створіть відповідь, як описано в [Повернення Response безпосередньо](response-directly.md), і передайте заголовки як додатковий параметр: {* ../../docs_src/response_headers/tutorial001_py310.py hl[10:12] *} @@ -28,14 +28,14 @@ FastAPI використає цей *тимчасовий* обʼєкт відп Ви також можете використати `from starlette.responses import Response` або `from starlette.responses import JSONResponse`. -FastAPI надає ті самі `starlette.responses` як `fastapi.responses` просто для зручності для вас, розробника. Але більшість доступних типів відповідей походять безпосередньо зі Starlette. +**FastAPI** надає ті самі `starlette.responses` як `fastapi.responses` просто для зручності для вас, розробника. Але більшість доступних типів відповідей походять безпосередньо зі Starlette. -Оскільки `Response` часто використовують для встановлення заголовків і кукі, FastAPI також надає його як `fastapi.Response`. +Оскільки `Response` часто використовують для встановлення заголовків і кукі, **FastAPI** також надає його як `fastapi.Response`. /// ## Власні заголовки { #custom-headers } -Майте на увазі, що власні закриті заголовки можна додавати за допомогою префікса `X-`. +Майте на увазі, що власні пропрієтарні заголовки можна додавати [за допомогою префікса `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). -Але якщо у вас є власні заголовки, які клієнт у браузері має бачити, вам потрібно додати їх у вашу конфігурацію CORS (докладніше в [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank}), використовуючи параметр `expose_headers`, задокументований у документації Starlette щодо CORS. +Але якщо у вас є власні заголовки, які клієнт у браузері має бачити, вам потрібно додати їх у вашу конфігурацію CORS (докладніше в [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md)), використовуючи параметр `expose_headers`, задокументований у [документації Starlette щодо CORS](https://www.starlette.dev/middleware/#corsmiddleware). diff --git a/docs/uk/docs/advanced/security/http-basic-auth.md b/docs/uk/docs/advanced/security/http-basic-auth.md index e0578772d3..ac356dd8d6 100644 --- a/docs/uk/docs/advanced/security/http-basic-auth.md +++ b/docs/uk/docs/advanced/security/http-basic-auth.md @@ -32,7 +32,7 @@ Використайте залежність, щоб перевірити, чи правильні ім'я користувача та пароль. -Для цього використайте стандартний модуль Python `secrets`, щоб перевірити ім'я користувача та пароль. +Для цього використайте стандартний модуль Python [`secrets`](https://docs.python.org/3/library/secrets.html), щоб перевірити ім'я користувача та пароль. `secrets.compare_digest()` повинен отримувати `bytes` або `str`, що містить лише ASCII-символи (англійські), це означає, що він не працюватиме з символами на кшталт `á`, як у `Sebastián`. @@ -46,7 +46,7 @@ ```Python if not (credentials.username == "stanleyjobson") or not (credentials.password == "swordfish"): - # Return some error + # Поверніть якусь помилку ... ``` diff --git a/docs/uk/docs/advanced/security/index.md b/docs/uk/docs/advanced/security/index.md index a3479794f8..2c00d68a19 100644 --- a/docs/uk/docs/advanced/security/index.md +++ b/docs/uk/docs/advanced/security/index.md @@ -2,11 +2,11 @@ ## Додаткові можливості { #additional-features } -Є кілька додаткових можливостей для роботи з безпекою, окрім тих, що розглянуті в [Навчальний посібник - Посібник користувача: Безпека](../../tutorial/security/index.md){.internal-link target=_blank}. +Є кілька додаткових можливостей для роботи з безпекою, окрім тих, що розглянуті в [Навчальний посібник - Посібник користувача: Безпека](../../tutorial/security/index.md). /// tip | Порада -Наступні розділи не обов'язково «просунуті». +Наступні розділи **не обов'язково «просунуті»**. І можливо, що для вашого випадку використання рішення є в одному з них. @@ -14,6 +14,6 @@ ## Спершу прочитайте навчальний посібник { #read-the-tutorial-first } -У наступних розділах передбачається, що ви вже прочитали основний [Навчальний посібник - Посібник користувача: Безпека](../../tutorial/security/index.md){.internal-link target=_blank}. +У наступних розділах передбачається, що ви вже прочитали основний [Навчальний посібник - Посібник користувача: Безпека](../../tutorial/security/index.md). Усі вони базуються на тих самих концепціях, але надають деякі додаткові можливості. diff --git a/docs/uk/docs/advanced/security/oauth2-scopes.md b/docs/uk/docs/advanced/security/oauth2-scopes.md index 34ef04a288..7f5ba96926 100644 --- a/docs/uk/docs/advanced/security/oauth2-scopes.md +++ b/docs/uk/docs/advanced/security/oauth2-scopes.md @@ -60,7 +60,7 @@ OAuth2 зі scopes - це механізм, який використовуют ## Загальний огляд { #global-view } -Спочатку швидко подивімося на частини, що відрізняються від прикладів у головному **Навчальному посібнику - Керівництві користувача** для [OAuth2 з паролем (і хешуванням), Bearer з JWT-токенами](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. Тепер із використанням OAuth2 scopes: +Спочатку швидко подивімося на частини, що відрізняються від прикладів у головному **Навчальному посібнику - Керівництві користувача** для [OAuth2 з паролем (і хешуванням), Bearer з JWT-токенами](../../tutorial/security/oauth2-jwt.md). Тепер із використанням OAuth2 scopes: {* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *} @@ -271,4 +271,4 @@ OAuth2 зі scopes - це механізм, який використовуют ## `Security` у параметрі декоратора `dependencies` { #security-in-decorator-dependencies } -Так само як ви можете визначити `list` із `Depends` у параметрі `dependencies` декоратора (як пояснено в [Залежності в декораторах операцій шляху](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}), ви також можете використовувати там `Security` зі `scopes`. +Так само як ви можете визначити `list` із `Depends` у параметрі `dependencies` декоратора (як пояснено в [Залежності в декораторах операцій шляху](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md)), ви також можете використовувати там `Security` зі `scopes`. diff --git a/docs/uk/docs/advanced/settings.md b/docs/uk/docs/advanced/settings.md index dccb4b0911..b369e2f120 100644 --- a/docs/uk/docs/advanced/settings.md +++ b/docs/uk/docs/advanced/settings.md @@ -8,7 +8,7 @@ /// tip | Порада -Щоб зрозуміти змінні оточення, ви можете прочитати [Змінні оточення](../environment-variables.md){.internal-link target=_blank}. +Щоб зрозуміти змінні оточення, ви можете прочитати [Змінні оточення](../environment-variables.md). /// @@ -20,11 +20,11 @@ ## Pydantic `Settings` { #pydantic-settings } -На щастя, Pydantic надає чудовий інструмент для обробки цих налаштувань із змінних оточення - Pydantic: Settings management. +На щастя, Pydantic надає чудовий інструмент для обробки цих налаштувань із змінних оточення - [Pydantic: Settings management](https://docs.pydantic.dev/latest/concepts/pydantic_settings/). ### Встановіть `pydantic-settings` { #install-pydantic-settings } -Спершу переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили пакет `pydantic-settings`: +Спершу переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md), активували його, а потім встановили пакет `pydantic-settings`:
@@ -100,7 +100,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.p ## Налаштування в іншому модулі { #settings-in-another-module } -Ви можете розмістити ці налаштування в іншому модулі, як ви бачили в [Більші застосунки - кілька файлів](../tutorial/bigger-applications.md){.internal-link target=_blank}. +Ви можете розмістити ці налаштування в іншому модулі, як ви бачили в [Більші застосунки - кілька файлів](../tutorial/bigger-applications.md). Наприклад, у вас може бути файл `config.py` з: @@ -112,7 +112,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.p /// tip | Порада -Вам також знадобиться файл `__init__.py`, як ви бачили в [Більші застосунки - кілька файлів](../tutorial/bigger-applications.md){.internal-link target=_blank}. +Вам також знадобиться файл `__init__.py`, як ви бачили в [Більші застосунки - кілька файлів](../tutorial/bigger-applications.md). /// @@ -172,7 +172,7 @@ $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.p /// -Pydantic має підтримку читання з таких типів файлів за допомогою зовнішньої бібліотеки. Ви можете дізнатися більше тут: Pydantic Settings: Dotenv (.env) support. +Pydantic має підтримку читання з таких типів файлів за допомогою зовнішньої бібліотеки. Ви можете дізнатися більше тут: [Pydantic Settings: Dotenv (.env) support](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support). /// tip | Порада @@ -197,7 +197,7 @@ APP_NAME="ChimichangApp" /// tip | Порада -Атрибут `model_config` використовується лише для конфігурації Pydantic. Докладніше: Pydantic: Concepts: Configuration. +Атрибут `model_config` використовується лише для конфігурації Pydantic. Докладніше: [Pydantic: Concepts: Configuration](https://docs.pydantic.dev/latest/concepts/config/). /// @@ -291,7 +291,7 @@ participant execute as Execute function Таким чином, вона поводиться майже так само, якби це була просто глобальна змінна. Але оскільки використовується функція залежності, ми можемо легко переписати її для тестування. -`@lru_cache` є частиною `functools`, що входить до стандартної бібліотеки Python, більше про це можна прочитати в документації Python для `@lru_cache`. +`@lru_cache` є частиною `functools`, що входить до стандартної бібліотеки Python, більше про це можна прочитати в [документації Python для `@lru_cache`](https://docs.python.org/3/library/functools.html#functools.lru_cache). ## Підсумок { #recap } diff --git a/docs/uk/docs/advanced/stream-data.md b/docs/uk/docs/advanced/stream-data.md new file mode 100644 index 0000000000..4f12132e06 --- /dev/null +++ b/docs/uk/docs/advanced/stream-data.md @@ -0,0 +1,117 @@ +# Потокова передача даних { #stream-data } + +Якщо ви хочете передавати потоком дані, які можна структурувати як JSON, див. [Потокова передача JSON Lines](../tutorial/stream-json-lines.md). + +Але якщо ви хочете передавати потоком чисті бінарні дані або строки, ось як це зробити. + +/// info | Інформація + +Додано у FastAPI 0.134.0. + +/// + +## Варіанти використання { #use-cases } + +Це можна використовувати, якщо ви хочете передавати потоком чисті строки, наприклад безпосередньо з виводу сервісу AI LLM. + +Також це можна використати для потокової передачі великих бінарних файлів, коли ви надсилаєте кожний фрагмент даних під час читання, без потреби завантажувати все в пам'ять одразу. + +Так само можна стрімити відео чи аудіо; їх навіть можна генерувати під час обробки та надсилання. + +## `StreamingResponse` з `yield` { #a-streamingresponse-with-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 } + +Можна також використовувати звичайні функції `def` (без `async`) і так само застосовувати `yield`. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[26:29] hl[27] *} + +### Без анотації { #no-annotation } + +Для потокової передачі бінарних даних немає потреби оголошувати анотацію типу, що повертається. + +Оскільки FastAPI не намагатиметься перетворювати дані на JSON за допомогою Pydantic чи серіалізувати їх іншим чином, у цьому випадку анотація типу потрібна лише для вашого редактора та інструментів; FastAPI її не використовуватиме. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} + +Це також означає, що з `StreamingResponse` у вас є свобода і відповідальність формувати та кодувати байти даних саме так, як їх потрібно надіслати, незалежно від анотацій типів. 🤓 + +### Потік байтів { #stream-bytes } + +Один з основних сценаріїв - передавати потоком `bytes` замість строк; це, звісно, підтримується. + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[44:47] hl[47] *} + +## Користувацький `PNGStreamingResponse` { #a-custom-pngstreamingresponse } + +У наведених вище прикладах байти даних передавалися потоком, але у відповіді не було заголовка `Content-Type`, тому клієнт не знав, який тип даних він отримує. + +Можна створити власний підклас `StreamingResponse`, який встановлює заголовок `Content-Type` відповідно до типу даних, що ви стрімите. + +Наприклад, можна створити `PNGStreamingResponse`, який встановлює заголовок `Content-Type` у `image/png` за допомогою атрибута `media_type`: + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *} + +Потім ви можете використати цей новий клас у `response_class=PNGStreamingResponse` у вашій функції операції шляху: + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *} + +### Симулювати файл { #simulate-a-file } + +У цьому прикладі ми імітуємо файл за допомогою `io.BytesIO` - це об'єкт на кшталт файлу, який існує лише в пам'яті, але надає той самий інтерфейс. + +Наприклад, ми можемо ітеруватися по ньому, щоб зчитати вміст, так само як і з файлом. + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[1:27] hl[3,12:13,25] *} + +/// note | Технічні деталі + +Інші дві змінні, `image_base64` та `binary_image`, - це зображення, закодоване в Base64, яке потім перетворюється на байти, щоб передати його в `io.BytesIO`. + +Лише для того, щоб усе містилося в одному файлі для цього прикладу, і ви могли скопіювати його та запустити як є. 🥚 + +/// + +Використовуючи блок `with`, ми гарантуємо, що об'єкт, подібний до файлу, буде закрито після завершення генераторної функції (функції з `yield`). Тобто після завершення надсилання відповіді. + +У цьому конкретному прикладі це не так важливо, адже це фальшивий файл у пам'яті (з `io.BytesIO`), але для справжнього файлу важливо переконатися, що файл закрито після завершення роботи з ним. + +### Файли та async { #files-and-async } + +У більшості випадків об'єкти, подібні до файлів, за замовчуванням несумісні з `async` та `await`. + +Наприклад, у них немає `await file.read()` або `async for chunk in file`. + +І часто їх читання є блокувальною операцією (що може блокувати цикл подій), адже дані зчитуються з диска або мережі. + +/// info | Інформація + +Наведений вище приклад - виняток, адже об'єкт `io.BytesIO` вже в пам'яті, тож читання нічого не блокує. + +Але в багатьох випадках читання файлу або схожого на файл об'єкта блокує виконання. + +/// + +Щоб уникнути блокування циклу подій, просто оголосіть функцію операції шляху зі звичайним `def` замість `async def`. Тоді FastAPI виконуватиме її в працівнику пулу потоків, щоб не блокувати головний цикл. + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *} + +/// tip | Порада + +Якщо вам потрібно викликати блокувальний код усередині async-функції або async-функцію зсередини блокувальної функції, ви можете скористатися [Asyncer](https://asyncer.tiangolo.com) - спорідненою бібліотекою до FastAPI. + +/// + +### `yield from` { #yield-from } + +Коли ви ітеруєтеся по чомусь, наприклад по об'єкту, подібному до файлу, і робите `yield` для кожного елемента, можна також використати `yield from`, щоб віддавати кожен елемент напряму і пропустити цикл `for`. + +Це не специфічно для FastAPI, це просто Python, але корисний трюк. 😎 + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[37:40] hl[40] *} diff --git a/docs/uk/docs/advanced/strict-content-type.md b/docs/uk/docs/advanced/strict-content-type.md new file mode 100644 index 0000000000..a244ec9018 --- /dev/null +++ b/docs/uk/docs/advanced/strict-content-type.md @@ -0,0 +1,88 @@ +# Сувора перевірка Content-Type { #strict-content-type-checking } + +За замовчуванням **FastAPI** використовує сувору перевірку заголовка `Content-Type` для тіл запитів JSON, це означає, що запити JSON мають включати дійсний заголовок `Content-Type` (наприклад, `application/json`), щоб тіло було розібране як JSON. + +## Ризик CSRF { #csrf-risk } + +Ця поведінка за замовчуванням забезпечує захист від класу атак **Cross-Site Request Forgery (CSRF)** у дуже конкретному сценарії. + +Ці атаки використовують той факт, що браузери дозволяють скриптам надсилати запити без виконання перевірки CORS preflight, коли вони: + +* не мають заголовка `Content-Type` (наприклад, використовуючи `fetch()` з тілом типу `Blob`) +* і не надсилають жодних облікових даних автентифікації. + +Такий тип атаки головним чином актуальний, коли: + +* застосунок працює локально (наприклад, на `localhost`) або у внутрішній мережі +* і в застосунку немає жодної автентифікації, очікується, що будь-який запит з тієї ж мережі є надійним. + +## Приклад атаки { #example-attack } + +Уявіть, що ви створюєте спосіб запускати локального AI-агента. + +Він надає API за адресою + +``` +http://localhost:8000/v1/agents/multivac +``` + +Є також фронтенд за адресою + +``` +http://localhost:8000 +``` + +/// tip | Порада + +Зауважте, що обидва мають один і той самий хост. + +/// + +Використовуючи фронтенд, ви можете змушувати AI-агента виконувати дії від вашого імені. + +Оскільки він працює локально, а не у відкритому інтернеті, ви вирішуєте не налаштовувати жодної автентифікації, просто покладаючись на доступ до локальної мережі. + +Один із ваших користувачів може встановити його і запустити локально. + +Потім він може відкрити шкідливий вебсайт, напр. щось на кшталт + +``` +https://evilhackers.example.com +``` + +І цей шкідливий вебсайт надсилає запити, використовуючи `fetch()` з тілом типу `Blob`, до локального API за адресою + +``` +http://localhost:8000/v1/agents/multivac +``` + +Хоча хости шкідливого вебсайту та локального застосунку різні, браузер не запустить CORS preflight-запит, тому що: + +* Застосунок працює без будь-якої автентифікації, немає потреби надсилати облікові дані. +* Браузер вважає, що він не надсилає JSON (через відсутній заголовок `Content-Type`). + +Тоді шкідливий вебсайт може змусити локального AI-агента надсилати злі повідомлення колишньому босу користувача... або щось гірше. 😅 + +## Відкритий інтернет { #open-internet } + +Якщо ваш застосунок у відкритому інтернеті, ви не стали б «довіряти мережі» і дозволяти кому завгодно надсилати привілейовані запити без автентифікації. + +Зловмисники можуть просто запустити скрипт, щоб надсилати запити до вашого API, без будь-якої участі браузера, тож ви, ймовірно, вже захищаєте будь-які привілейовані ендпоїнти. + +У такому разі ця атака/ризик до вас не застосовується. + +Цей ризик і атака головним чином актуальні, коли застосунок працює в локальній мережі і це єдиний передбачуваний захист. + +## Дозволення запитів без Content-Type { #allowing-requests-without-content-type } + +Якщо вам потрібно підтримувати клієнтів, які не надсилають заголовок `Content-Type`, ви можете вимкнути сувору перевірку, встановивши `strict_content_type=False`: + +{* ../../docs_src/strict_content_type/tutorial001_py310.py hl[4] *} + +З цим налаштуванням запити без заголовка `Content-Type` матимуть тіло, розібране як JSON, що відповідає поведінці старіших версій FastAPI. + +/// info | Інформація + +Цю поведінку і конфігурацію додано у FastAPI 0.132.0. + +/// diff --git a/docs/uk/docs/advanced/sub-applications.md b/docs/uk/docs/advanced/sub-applications.md index 5e611c6ff2..bc105824ee 100644 --- a/docs/uk/docs/advanced/sub-applications.md +++ b/docs/uk/docs/advanced/sub-applications.md @@ -30,25 +30,25 @@ ### Перевірте автоматичну документацію API { #check-the-automatic-api-docs } -Тепер запустіть команду `fastapi` з вашим файлом: +Тепер запустіть команду `fastapi`:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-І відкрийте документацію за адресою http://127.0.0.1:8000/docs. +І відкрийте документацію за адресою [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Ви побачите автоматичну документацію API для головного застосунку, що містить лише його власні _операції шляху_: -А потім відкрийте документацію для підзастосунку за адресою http://127.0.0.1:8000/subapi/docs. +А потім відкрийте документацію для підзастосунку за адресою [http://127.0.0.1:8000/subapi/docs](http://127.0.0.1:8000/subapi/docs). Ви побачите автоматичну документацію API для підзастосунку, що містить лише його власні _операції шляху_, усі з правильним префіксом підшляху `/subapi`: @@ -64,4 +64,4 @@ $ fastapi dev main.py Підзастосунок також може мати власні змонтовані підзастосунки, і все працюватиме коректно, оскільки FastAPI автоматично обробляє всі ці `root_path`. -Ви дізнаєтеся більше про `root_path` і як використовувати його явно в розділі [За представником](behind-a-proxy.md){.internal-link target=_blank}. +Ви дізнаєтеся більше про `root_path` і як використовувати його явно в розділі [За представником](behind-a-proxy.md). diff --git a/docs/uk/docs/advanced/templates.md b/docs/uk/docs/advanced/templates.md index 9e1ce3709b..3d9f96e72f 100644 --- a/docs/uk/docs/advanced/templates.md +++ b/docs/uk/docs/advanced/templates.md @@ -8,7 +8,7 @@ ## Встановіть залежності { #install-dependencies } -Переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md){.internal-link target=_blank}, активували його та встановили `jinja2`: +Переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md), активували його та встановили `jinja2`:
@@ -123,4 +123,4 @@ Item ID: 42 ## Детальніше { #more-details } -Докладніше, зокрема як тестувати шаблони, дивіться документацію Starlette щодо шаблонів. +Докладніше, зокрема як тестувати шаблони, дивіться [документацію Starlette щодо шаблонів](https://www.starlette.dev/templates/). diff --git a/docs/uk/docs/advanced/testing-websockets.md b/docs/uk/docs/advanced/testing-websockets.md index cec576fddf..717bffac32 100644 --- a/docs/uk/docs/advanced/testing-websockets.md +++ b/docs/uk/docs/advanced/testing-websockets.md @@ -8,6 +8,6 @@ /// note | Примітка -Докладніше дивіться документацію Starlette з тестування WebSocket. +Докладніше дивіться документацію Starlette щодо [тестування WebSocket](https://www.starlette.dev/testclient/#testing-websocket-sessions). /// diff --git a/docs/uk/docs/advanced/using-request-directly.md b/docs/uk/docs/advanced/using-request-directly.md index 81b90f19b9..330a0b751e 100644 --- a/docs/uk/docs/advanced/using-request-directly.md +++ b/docs/uk/docs/advanced/using-request-directly.md @@ -14,7 +14,7 @@ ## Деталі про об'єкт `Request` { #details-about-the-request-object } -Оскільки під капотом **FastAPI** - це **Starlette** з шаром інструментів зверху, ви можете за потреби використовувати об'єкт `Request` Starlette безпосередньо. +Оскільки під капотом **FastAPI** - це **Starlette** з шаром інструментів зверху, ви можете за потреби використовувати об'єкт [`Request`](https://www.starlette.dev/requests/) Starlette безпосередньо. Це також означає, що якщо ви отримуєте дані безпосередньо з об'єкта `Request` (наприклад, читаєте тіло), FastAPI не буде їх перевіряти, перетворювати або документувати (через OpenAPI для автоматичного інтерфейсу користувача API). @@ -44,7 +44,7 @@ ## Документація `Request` { #request-documentation } -Докладніше про об'єкт `Request` на офіційному сайті документації Starlette. +Докладніше про [об'єкт [`Request`] на офіційному сайті документації Starlette](https://www.starlette.dev/requests/). /// note | Технічні деталі diff --git a/docs/uk/docs/advanced/websockets.md b/docs/uk/docs/advanced/websockets.md index bb06ac00b7..aa290b3897 100644 --- a/docs/uk/docs/advanced/websockets.md +++ b/docs/uk/docs/advanced/websockets.md @@ -1,10 +1,10 @@ # WebSockets { #websockets } -Ви можете використовувати WebSockets з **FastAPI**. +Ви можете використовувати [WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) з **FastAPI**. ## Встановіть `websockets` { #install-websockets } -Переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md){.internal-link target=_blank}, активували його та встановили `websockets` (бібліотеку Python, що полегшує використання протоколу «WebSocket»): +Переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md), активували його та встановили `websockets` (бібліотеку Python, що полегшує використання протоколу «WebSocket»):
@@ -64,19 +64,19 @@ $ pip install websockets ## Спробуйте { #try-it } -Якщо ваш файл називається `main.py`, запустіть ваш застосунок командою: +Розмістіть код у файлі `main.py`, а потім запустіть ваш застосунок:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Відкрийте у браузері http://127.0.0.1:8000. +Відкрийте у браузері [http://127.0.0.1:8000](http://127.0.0.1:8000). Ви побачите просту сторінку на кшталт: @@ -115,25 +115,25 @@ $ fastapi dev main.py Оскільки це WebSocket, не має сенсу піднімати `HTTPException`, натомість ми піднімаємо `WebSocketException`. -Ви можете використати код закриття з чинних кодів, визначених у специфікації. +Ви можете використати код закриття з [чинних кодів, визначених у специфікації](https://tools.ietf.org/html/rfc6455#section-7.4.1). /// ### Спробуйте WebSockets із залежностями { #try-the-websockets-with-dependencies } -Якщо ваш файл називається `main.py`, запустіть ваш застосунок командою: +Запустіть ваш застосунок:
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-Відкрийте у браузері http://127.0.0.1:8000. +Відкрийте у браузері [http://127.0.0.1:8000](http://127.0.0.1:8000). Там ви можете встановити: @@ -174,7 +174,7 @@ Client #1596980209979 left the chat Але майте на увазі, що оскільки все обробляється в пам'яті, в одному списку, це працюватиме лише поки процес запущений, і лише з одним процесом. -Якщо вам потрібне щось просте для інтеграції з FastAPI, але більш надійне, з підтримкою Redis, PostgreSQL чи інших, перегляньте encode/broadcaster. +Якщо вам потрібне щось просте для інтеграції з FastAPI, але більш надійне, з підтримкою Redis, PostgreSQL чи інших, перегляньте [encode/broadcaster](https://github.com/encode/broadcaster). /// @@ -182,5 +182,5 @@ Client #1596980209979 left the chat Щоб дізнатися більше про можливості, перегляньте документацію Starlette: -* Клас `WebSocket`. -* Обробка WebSocket на основі класів. +* [Клас `WebSocket`](https://www.starlette.dev/websockets/). +* [Обробка WebSocket на основі класів](https://www.starlette.dev/endpoints/#websocketendpoint). diff --git a/docs/uk/docs/advanced/wsgi.md b/docs/uk/docs/advanced/wsgi.md index 8969241350..84d4aa4609 100644 --- a/docs/uk/docs/advanced/wsgi.md +++ b/docs/uk/docs/advanced/wsgi.md @@ -1,6 +1,6 @@ # Підключення WSGI - Flask, Django та інші { #including-wsgi-flask-django-others } -Ви можете монтувати застосунки WSGI, як ви бачили в [Підзастосунки - монтування](sub-applications.md){.internal-link target=_blank}, [За представником](behind-a-proxy.md){.internal-link target=_blank}. +Ви можете монтувати застосунки WSGI, як ви бачили в [Підзастосунки - монтування](sub-applications.md), [За представником](behind-a-proxy.md). Для цього ви можете використати `WSGIMiddleware` і обгорнути ним ваш застосунок WSGI, наприклад Flask, Django тощо. @@ -36,13 +36,13 @@ А решта - **FastAPI**. -Якщо ви запустите це й перейдете на http://localhost:8000/v1/, ви побачите відповідь від Flask: +Якщо ви запустите це й перейдете на [http://localhost:8000/v1/](http://localhost:8000/v1/), ви побачите відповідь від Flask: ```txt Hello, World from Flask! ``` -А якщо ви перейдете на http://localhost:8000/v2, ви побачите відповідь від FastAPI: +А якщо ви перейдете на [http://localhost:8000/v2](http://localhost:8000/v2), ви побачите відповідь від FastAPI: ```JSON { diff --git a/docs/uk/docs/alternatives.md b/docs/uk/docs/alternatives.md index 5dbf8a96ba..1e9d479da1 100644 --- a/docs/uk/docs/alternatives.md +++ b/docs/uk/docs/alternatives.md @@ -14,7 +14,7 @@ ## Попередні інструменти { #previous-tools } -### Django { #django } +### [Django](https://www.djangoproject.com/) { #django } Це найпопулярніший фреймворк Python, який користується широкою довірою. Він використовується для створення таких систем, як Instagram. @@ -22,7 +22,7 @@ Він був створений для створення HTML у серверній частині, а не для створення API, які використовуються сучасним інтерфейсом (як-от React, Vue.js і Angular) або іншими системами (як-от IoT пристрої), які спілкуються з ним. -### Django REST Framework { #django-rest-framework } +### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework } Фреймворк Django REST був створений як гнучкий інструментарій для створення веб-інтерфейсів API використовуючи Django в основі, щоб покращити його можливості API. @@ -42,7 +42,7 @@ Django REST Framework створив Том Крісті. Той самий тв /// -### Flask { #flask } +### [Flask](https://flask.palletsprojects.com) { #flask } Flask — це «мікрофреймворк», він не включає інтеграцію бази даних, а також багато речей, які за замовчуванням є в Django. @@ -64,7 +64,7 @@ Flask — це «мікрофреймворк», він не включає ін /// -### Requests { #requests } +### [Requests](https://requests.readthedocs.io) { #requests } **FastAPI** насправді не є альтернативою **Requests**. Сфера їх застосування дуже різна. @@ -106,7 +106,7 @@ def read_url(): /// -### Swagger / OpenAPI { #swagger-openapi } +### [Swagger](https://swagger.io/) / [OpenAPI](https://github.com/OAI/OpenAPI-Specification/) { #swagger-openapi } Головною функцією, яку я хотів від Django REST Framework, була автоматична API документація. @@ -124,8 +124,8 @@ def read_url(): Інтегрувати інструменти інтерфейсу на основі стандартів: -* Інтерфейс Swagger -* ReDoc +* [Інтерфейс Swagger](https://github.com/swagger-api/swagger-ui) +* [ReDoc](https://github.com/Rebilly/ReDoc) Ці два було обрано через те, що вони досить популярні та стабільні, але, виконавши швидкий пошук, ви можете знайти десятки додаткових альтернативних інтерфейсів для OpenAPI (які можна використовувати з **FastAPI**). @@ -135,9 +135,9 @@ def read_url(): Існує кілька фреймворків Flask REST, але, витративши час і роботу на їх дослідження, я виявив, що багато з них припинено або залишено, з кількома постійними проблемами, які зробили їх непридатними. -### Marshmallow { #marshmallow } +### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow } -Однією з головних функцій, необхідних для систем API, є "серіалізація", яка бере дані з коду (Python) і перетворює їх на щось, що можна надіслати через мережу. Наприклад, перетворення об’єкта, що містить дані з бази даних, на об’єкт JSON. Перетворення об’єктів `datetime` на строки тощо. +Однією з головних функцій, необхідних для систем API, є «серіалізація», яка бере дані з коду (Python) і перетворює їх на щось, що можна надіслати через мережу. Наприклад, перетворення об’єкта, що містить дані з бази даних, на об’єкт JSON. Перетворення об’єктів `datetime` на строки тощо. Іншою важливою функцією, необхідною для API, є перевірка даних, яка забезпечує дійсність даних за певними параметрами. Наприклад, що деяке поле є `int`, а не деяка випадкова строка. Це особливо корисно для вхідних даних. @@ -153,7 +153,7 @@ Marshmallow створено для забезпечення цих функці /// -### Webargs { #webargs } +### [Webargs](https://webargs.readthedocs.io/en/latest/) { #webargs } Іншою важливою функцією, необхідною для API, є аналіз даних із вхідних запитів. @@ -175,7 +175,7 @@ Webargs був створений тими ж розробниками Marshmall /// -### APISpec { #apispec } +### [APISpec](https://apispec.readthedocs.io/en/stable/) { #apispec } Marshmallow і Webargs забезпечують перевірку, аналіз і серіалізацію як плагіни. @@ -205,7 +205,7 @@ APISpec був створений тими ж розробниками Marshmall /// -### Flask-apispec { #flask-apispec } +### [Flask-apispec](https://flask-apispec.readthedocs.io/en/latest/) { #flask-apispec } Це плагін Flask, який об’єднує Webargs, Marshmallow і APISpec. @@ -219,11 +219,11 @@ APISpec був створений тими ж розробниками Marshmall Її використання призвело до створення кількох генераторів повного стека Flask. Це основний стек, який я (та кілька зовнішніх команд) використовував досі: -* https://github.com/tiangolo/full-stack -* https://github.com/tiangolo/full-stack-flask-couchbase -* https://github.com/tiangolo/full-stack-flask-couchdb +* [https://github.com/tiangolo/full-stack](https://github.com/tiangolo/full-stack) +* [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) -І ці самі генератори повного стеку були основою [**FastAPI** генераторів проектів](project-generation.md){.internal-link target=_blank}. +І ці самі генератори повного стеку були основою [**FastAPI** генераторів проектів](project-generation.md). /// info | Інформація @@ -237,7 +237,7 @@ Flask-apispec був створений тими ж розробниками Mar /// -### NestJS (та Angular) { #nestjs-and-angular } +### [NestJS](https://nestjs.com/) (та [Angular](https://angular.io/)) { #nestjs-and-angular } Це навіть не Python, NestJS — це фреймворк NodeJS JavaScript (TypeScript), натхненний Angular. @@ -259,13 +259,13 @@ Flask-apispec був створений тими ж розробниками Mar /// -### Sanic { #sanic } +### [Sanic](https://sanic.readthedocs.io/en/latest/) { #sanic } Це був один із перших надзвичайно швидких фреймворків Python на основі `asyncio`. Він був дуже схожий на Flask. /// note | Технічні деталі -Він використовував `uvloop` замість стандартного циклу Python `asyncio`. Ось що зробило його таким швидким. +Він використовував [`uvloop`](https://github.com/MagicStack/uvloop) замість стандартного циклу Python `asyncio`. Ось що зробило його таким швидким. Це явно надихнуло Uvicorn і Starlette, які зараз швидші за Sanic у відкритих тестах. @@ -279,7 +279,7 @@ Flask-apispec був створений тими ж розробниками Mar /// -### Falcon { #falcon } +### [Falcon](https://falconframework.org/) { #falcon } Falcon — ще один високопродуктивний фреймворк Python, він розроблений як мінімальний і працює як основа інших фреймворків, таких як Hug. @@ -297,7 +297,7 @@ Falcon — ще один високопродуктивний фреймворк /// -### Molten { #molten } +### [Molten](https://moltenframework.com/) { #molten } Я відкрив для себе Molten на перших етапах створення **FastAPI**. І він має досить схожі ідеї: @@ -321,7 +321,7 @@ Falcon — ще один високопродуктивний фреймворк /// -### Hug { #hug } +### [Hug](https://github.com/hugapi/hug) { #hug } Hug був одним із перших фреймворків, який реалізував оголошення типів параметрів API за допомогою підказок типу Python. Це була чудова ідея, яка надихнула інші інструменти зробити те саме. @@ -337,7 +337,7 @@ Hug був одним із перших фреймворків, який реа /// info | Інформація -Hug створив Тімоті Крослі, той самий творець `isort`, чудовий інструмент для автоматичного сортування імпорту у файлах Python. +Hug створив Тімоті Крослі, той самий творець [`isort`](https://github.com/timothycrosley/isort), чудовий інструмент для автоматичного сортування імпорту у файлах Python. /// @@ -351,7 +351,7 @@ Hug надихнув **FastAPI** оголосити параметр `response` /// -### APIStar (<= 0,5) { #apistar-0-5 } +### [APIStar](https://github.com/encode/apistar) (<= 0,5) { #apistar-0-5 } Безпосередньо перед тим, як вирішити створити **FastAPI**, я знайшов сервер **APIStar**. Він мав майже все, що я шукав, і мав чудовий дизайн. @@ -401,7 +401,7 @@ APIStar створив Том Крісті. Той самий хлопець, я ## Використовується **FastAPI** { #used-by-fastapi } -### Pydantic { #pydantic } +### [Pydantic](https://docs.pydantic.dev/) { #pydantic } Pydantic — це бібліотека для визначення перевірки даних, серіалізації та документації (за допомогою Схеми JSON) на основі підказок типу Python. @@ -417,7 +417,7 @@ Pydantic — це бібліотека для визначення переві /// -### Starlette { #starlette } +### [Starlette](https://www.starlette.dev/) { #starlette } Starlette — це легкий фреймворк/набір інструментів ASGI, який ідеально підходить для створення високопродуктивних asyncio сервісів. @@ -462,7 +462,7 @@ ASGI — це новий «стандарт», який розробляєтьс /// -### Uvicorn { #uvicorn } +### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn } Uvicorn — це блискавичний сервер ASGI, побудований на uvloop і httptools. @@ -476,10 +476,10 @@ Uvicorn — це блискавичний сервер ASGI, побудован Ви також можете використати параметр командного рядка `--workers`, щоб мати асинхронний багатопроцесний сервер. -Додаткову інформацію див. у розділі [Розгортання](deployment/index.md){.internal-link target=_blank}. +Додаткову інформацію див. у розділі [Розгортання](deployment/index.md). /// ## Орієнтири та швидкість { #benchmarks-and-speed } -Щоб зрозуміти, порівняти та побачити різницю між Uvicorn, Starlette і FastAPI, перегляньте розділ про [Бенчмарки](benchmarks.md){.internal-link target=_blank}. +Щоб зрозуміти, порівняти та побачити різницю між Uvicorn, Starlette і FastAPI, перегляньте розділ про [Бенчмарки](benchmarks.md). diff --git a/docs/uk/docs/async.md b/docs/uk/docs/async.md index baf4720542..95ecec21f1 100644 --- a/docs/uk/docs/async.md +++ b/docs/uk/docs/async.md @@ -141,7 +141,7 @@ def results(): /// info | Інформація -Прекрасні ілюстрації від Ketrina Thompson. 🎨 +Прекрасні ілюстрації від [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨 /// @@ -207,7 +207,7 @@ def results(): /// info | Інформація -Прекрасні ілюстрації від Ketrina Thompson. 🎨 +Прекрасні ілюстрації від [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨 /// @@ -215,7 +215,7 @@ def results(): У цьому сценарії паралельних бургерів ви - комп’ютер/програма 🤖 з двома процесорами (ви і ваша симпатія), які обидва чекають 🕙 і приділяють увагу ⏯ «очікуванню біля прилавка» 🕙 тривалий час. -У закладу фастфуду 8 процесорів (касира/кухаря). У той час як у закладі з рівночасними бургерами могло бути лише 2 (один касир і один кухар). +У закладу фастфуду 8 процесорів (касира/кухаря). У той час як у закладу з рівночасними бургерами могло бути лише 2 (один касир і один кухар). Та все одно фінальний досвід не найкращий. 😞 @@ -251,7 +251,7 @@ def results(): І такий самий рівень продуктивності ви отримуєте з **FastAPI**. -А оскільки можна мати паралелізм і асинхронність одночасно, ви отримуєте вищу продуктивність, ніж більшість протестованих фреймворків NodeJS, і на рівні з Go, який є компільованою мовою, ближчою до C (усе завдяки Starlette). +А оскільки можна мати паралелізм і асинхронність одночасно, ви отримуєте вищу продуктивність, ніж більшість протестованих фреймворків NodeJS, і на рівні з Go, який є компільованою мовою, ближчою до C [(усе завдяки Starlette)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1). ### Чи краща рівночасність за паралелізм? { #is-concurrency-better-than-parallelism } @@ -298,7 +298,7 @@ def results(): Це, плюс простий факт, що Python є основною мовою для **Data Science**, машинного навчання і особливо глибокого навчання, робить FastAPI дуже вдалим вибором для веб API та застосунків Data Science / машинного навчання (серед багатьох інших). -Щоб побачити, як досягти цього паралелізму у продакшні, див. розділ про [Розгортання](deployment/index.md){.internal-link target=_blank}. +Щоб побачити, як досягти цього паралелізму у продакшні, див. розділ про [Розгортання](deployment/index.md). ## `async` і `await` { #async-and-await } @@ -363,13 +363,13 @@ async def read_burgers(): ### Пишемо свій власний async-код { #write-your-own-async-code } -Starlette (і **FastAPI**) базуються на AnyIO, що робить їх сумісними як зі стандартною бібліотекою Python asyncio, так і з Trio. +Starlette (і **FastAPI**) базуються на [AnyIO](https://anyio.readthedocs.io/en/stable/), що робить їх сумісними як зі стандартною бібліотекою Python [asyncio](https://docs.python.org/3/library/asyncio-task.html), так і з [Trio](https://trio.readthedocs.io/en/stable/). -Зокрема, ви можете безпосередньо використовувати AnyIO для ваших просунутих сценаріїв рівночасності, що потребують складніших патернів у вашому коді. +Зокрема, ви можете безпосередньо використовувати [AnyIO](https://anyio.readthedocs.io/en/stable/) для ваших просунутих сценаріїв рівночасності, що потребують складніших патернів у вашому коді. -І навіть якщо ви не використовували FastAPI, ви могли б писати свої власні async-застосунки з AnyIO, щоб мати високу сумісність і отримати його переваги (наприклад, *структурована рівночасність*). +І навіть якщо ви не використовували FastAPI, ви могли б писати свої власні async-застосунки з [AnyIO](https://anyio.readthedocs.io/en/stable/), щоб мати високу сумісність і отримати його переваги (наприклад, *структурована рівночасність*). -Я створив іншу бібліотеку поверх AnyIO, як тонкий шар, щоб дещо покращити анотації типів і отримати кращу **автодопомогу** (autocompletion), **вбудовані помилки** (inline errors) тощо. Вона також має дружній вступ і навчальний посібник, щоб допомогти вам **зрозуміти** і написати **власний async-код**: Asyncer. Вона буде особливо корисною, якщо вам потрібно **поєднувати async-код зі звичайним** (блокуючим/синхронним) кодом. +Я створив іншу бібліотеку поверх AnyIO, як тонкий шар, щоб дещо покращити анотації типів і отримати кращу **автодопомогу** (autocompletion), **вбудовані помилки** (inline errors) тощо. Вона також має дружній вступ і навчальний посібник, щоб допомогти вам **зрозуміти** і написати **власний async-код**: [Asyncer](https://asyncer.tiangolo.com/). Вона буде особливо корисною, якщо вам потрібно **поєднувати async-код зі звичайним** (блокуючим/синхронним) кодом. ### Інші форми асинхронного коду { #other-forms-of-asynchronous-code } @@ -381,7 +381,7 @@ Starlette (і **FastAPI**) базуються на Gevent. Але код набагато складніший для розуміння, налагодження і мислення про нього. +У попередніх версіях Python ви могли використовувати потоки (threads) або [Gevent](https://www.gevent.org/). Але код набагато складніший для розуміння, налагодження і мислення про нього. У попередніх версіях NodeJS/Browser JavaScript ви б використовували «callbacks», що призводить до «callback hell». @@ -419,15 +419,15 @@ Starlette (і **FastAPI**) базуються на I/O. -Втім, у будь-якій ситуації є велика ймовірність, що **FastAPI** [все одно буде швидшим](index.md#performance){.internal-link target=_blank} (або принаймні порівнянним) за ваш попередній фреймворк. +Втім, у будь-якій ситуації є велика ймовірність, що **FastAPI** [все одно буде швидшим](index.md#performance) (або принаймні порівнянним) за ваш попередній фреймворк. ### Залежності { #dependencies } -Те саме стосується і [залежностей](tutorial/dependencies/index.md){.internal-link target=_blank}. Якщо залежність є стандартною функцією `def` замість `async def`, вона виконується у зовнішньому пулі потоків. +Те саме стосується і [залежностей](tutorial/dependencies/index.md). Якщо залежність є стандартною функцією `def` замість `async def`, вона виконується у зовнішньому пулі потоків. ### Підзалежності { #sub-dependencies } -Ви можете мати кілька залежностей і [підзалежностей](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank}, які вимагають одна одну (як параметри визначень функцій). Деякі з них можуть бути створені з `async def`, а деякі - зі звичайним `def`. Все працюватиме, і ті, що створені зі звичайним `def`, будуть викликані у зовнішньому потоці (з пулу потоків), а не «очікувані». +Ви можете мати кілька залежностей і [підзалежностей](tutorial/dependencies/sub-dependencies.md), які вимагають одна одну (як параметри визначень функцій). Деякі з них можуть бути створені з `async def`, а деякі - зі звичайним `def`. Все працюватиме, і ті, що створені зі звичайним `def`, будуть викликані у зовнішньому потоці (з пулу потоків), а не «очікувані». ### Інші допоміжні функції { #other-utility-functions } diff --git a/docs/uk/docs/benchmarks.md b/docs/uk/docs/benchmarks.md index d53b7ee989..b55ef720fa 100644 --- a/docs/uk/docs/benchmarks.md +++ b/docs/uk/docs/benchmarks.md @@ -1,6 +1,6 @@ # Бенчмарки { #benchmarks } -Незалежні бенчмарки TechEmpower показують, що застосунки FastAPI, запущені під керуванням Uvicorn, є одним із найшвидших доступних фреймворків Python, поступаючись лише самим Starlette і Uvicorn (використовуються FastAPI внутрішньо). +Незалежні бенчмарки TechEmpower показують, що застосунки **FastAPI**, запущені під керуванням Uvicorn, є [одним із найшвидших доступних фреймворків Python](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), поступаючись лише самим Starlette і Uvicorn (використовуються FastAPI внутрішньо). Але переглядаючи бенчмарки та порівняння, майте на увазі таке. @@ -14,20 +14,20 @@ Ієрархія приблизно така: -* Uvicorn: сервер ASGI - * Starlette: (використовує Uvicorn) веб-мікрофреймворк - * FastAPI: (використовує Starlette) мікрофреймворк для API з низкою додаткових можливостей для створення API, з валідацією даних тощо. +* **Uvicorn**: сервер ASGI + * **Starlette**: (використовує Uvicorn) веб-мікрофреймворк + * **FastAPI**: (використовує Starlette) мікрофреймворк для API з низкою додаткових можливостей для створення API, з валідацією даних тощо. -* Uvicorn: +* **Uvicorn**: * Матиме найвищу продуктивність, адже майже не містить додаткового коду окрім власне сервера. - * Ви не писатимете застосунок безпосередньо на Uvicorn. Це означало б, що ваш код мав би включати принаймні приблизно весь код, який надає Starlette (або FastAPI). І якщо зробити так, ваш кінцевий застосунок матиме ті самі накладні витрати, що й під час використання фреймворку, який мінімізує код застосунку та помилки. + * Ви не писатимете застосунок безпосередньо на Uvicorn. Це означало б, що ваш код мав би включати принаймні приблизно весь код, який надає Starlette (або **FastAPI**). І якщо зробити так, ваш кінцевий застосунок матиме ті самі накладні витрати, що й під час використання фреймворку, який мінімізує код застосунку та помилки. * Якщо ви порівнюєте Uvicorn, порівнюйте його з Daphne, Hypercorn, uWSGI тощо. Сервери застосунків. -* Starlette: +* **Starlette**: * Матиме наступну за швидкістю продуктивність після Uvicorn. Насправді Starlette використовує Uvicorn для запуску. Тож вона може бути «повільнішою» за Uvicorn лише через необхідність виконувати більше коду. * Але надає інструменти для створення простих веб-застосунків із маршрутизацією на основі шляхів тощо. * Якщо ви порівнюєте Starlette, порівнюйте її з Sanic, Flask, Django тощо. Веб-фреймворки (або мікрофреймворки). -* FastAPI: - * Аналогічно до того, як Starlette використовує Uvicorn і не може бути швидшою за нього, FastAPI використовує Starlette, тож не може бути швидшою за неї. +* **FastAPI**: + * Аналогічно до того, як Starlette використовує Uvicorn і не може бути швидшою за нього, **FastAPI** використовує Starlette, тож не може бути швидшою за неї. * FastAPI надає більше можливостей поверх Starlette. Можливості, які майже завжди потрібні під час створення API, як-от валідація та серіалізація даних. І, використовуючи його, ви безкоштовно отримуєте автоматичну документацію (автоматична документація навіть не додає накладних витрат під час роботи застосунку - вона генерується під час запуску). * Якби ви не використовували FastAPI і застосували Starlette безпосередньо (або інший інструмент, наприклад Sanic, Flask, Responder тощо), вам довелося б самостійно реалізувати всю валідацію та серіалізацію даних. Тож ваш кінцевий застосунок усе одно мав би ті самі накладні витрати, ніби він був створений із використанням FastAPI. І в багатьох випадках саме ця валідація та серіалізація даних становить найбільший обсяг коду в застосунках. * Отже, використовуючи FastAPI, ви заощаджуєте час розробки, зменшуєте кількість помилок і рядків коду та, ймовірно, отримуєте таку саму (або кращу) продуктивність, як і без нього (адже інакше вам довелося б реалізувати все це у власному коді). diff --git a/docs/uk/docs/deployment/cloud.md b/docs/uk/docs/deployment/cloud.md index a17aaf2591..97d972717f 100644 --- a/docs/uk/docs/deployment/cloud.md +++ b/docs/uk/docs/deployment/cloud.md @@ -6,7 +6,7 @@ ## FastAPI Cloud { #fastapi-cloud } -**FastAPI Cloud** створено тим самим автором і командою, що стоять за **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** створено тим самим автором і командою, що стоять за **FastAPI**. Воно спрощує процес **створення**, **розгортання** та **доступу** до API з мінімальними зусиллями. @@ -16,9 +16,9 @@ FastAPI Cloud є основним спонсором і джерелом фін ## Хмарні постачальники - спонсори { #cloud-providers-sponsors } -Деякі інші хмарні постачальники ✨ [**спонсорують FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨ також. 🙇 +Деякі інші хмарні постачальники ✨ [**спонсорують FastAPI**](../help-fastapi.md#sponsor-the-author) ✨ також. 🙇 Можливо, ви захочете розглянути їх, щоб дотримуватися їхніх інструкцій і спробувати їхні сервіси: -* Render -* Railway +* [Render](https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi) +* [Railway](https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi) diff --git a/docs/uk/docs/deployment/concepts.md b/docs/uk/docs/deployment/concepts.md index 07ad314405..a6a5bc80e0 100644 --- a/docs/uk/docs/deployment/concepts.md +++ b/docs/uk/docs/deployment/concepts.md @@ -25,7 +25,7 @@ ## Безпека - HTTPS { #security-https } -У [попередньому розділі про HTTPS](https.md){.internal-link target=_blank} ми дізналися, як HTTPS забезпечує шифрування для вашого API. +У [попередньому розділі про HTTPS](https.md) ми дізналися, як HTTPS забезпечує шифрування для вашого API. Ми також бачили, що HTTPS зазвичай надається компонентом, **зовнішнім** щодо вашого серверного застосунку, - **TLS Termination Proxy**. @@ -190,9 +190,9 @@ ### Процеси-працівники і порти { #worker-processes-and-ports } -Пам'ятаєте з документації [Про HTTPS](https.md){.internal-link target=_blank}, що на сервері лише один процес може слухати певну комбінацію порту та IP-адреси? +Пам'ятаєте з документації [Про HTTPS](https.md), що на сервері лише один процес може слухати певну комбінацію порту та IP-адреси? -Це досі так. +Это досі так. Отже, щоб мати **кілька процесів** одночасно, має бути **єдиний процес, який слухає порт**, і який далі якимось чином передає комунікацію кожному процесу-працівнику. @@ -243,7 +243,7 @@ Не хвилюйтеся, якщо деякі пункти про **контейнери**, Docker чи Kubernetes поки що не дуже зрозумілі. -Я розповім більше про образи контейнерів, Docker, Kubernetes тощо в майбутньому розділі: [FastAPI у контейнерах - Docker](docker.md){.internal-link target=_blank}. +Я розповім більше про образи контейнерів, Docker, Kubernetes тощо в майбутньому розділі: [FastAPI у контейнерах - Docker](docker.md). /// @@ -281,7 +281,7 @@ /// tip | Порада -Я наведу більш конкретні приклади для цього з контейнерами у майбутньому розділі: [FastAPI у контейнерах - Docker](docker.md){.internal-link target=_blank}. +Я наведу більш конкретні приклади для цього з контейнерами у майбутньому розділі: [FastAPI у контейнерах - Docker](docker.md). /// diff --git a/docs/uk/docs/deployment/docker.md b/docs/uk/docs/deployment/docker.md index d6faacfe5e..9d9afc0d16 100644 --- a/docs/uk/docs/deployment/docker.md +++ b/docs/uk/docs/deployment/docker.md @@ -1,6 +1,6 @@ # FastAPI у контейнерах - Docker { #fastapi-in-containers-docker } -Під час розгортання застосунків FastAPI поширений підхід - збирати образи контейнерів Linux. Зазвичай це робиться за допомогою Docker. Потім ви можете розгорнути цей образ контейнера кількома різними способами. +Під час розгортання застосунків FastAPI поширений підхід - збирати образи контейнерів Linux. Зазвичай це робиться за допомогою [Docker](https://www.docker.com/). Потім ви можете розгорнути цей образ контейнера кількома різними способами. Використання контейнерів Linux має кілька переваг, зокрема безпека, відтворюваність, простота та інші. @@ -60,16 +60,16 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] Docker був одним з основних інструментів для створення та керування образами контейнерів і контейнерами. -Існує публічний Docker Hub з готовими офіційними образами для багатьох інструментів, середовищ, баз даних і застосунків. +Існує публічний [Docker Hub](https://hub.docker.com/) з готовими офіційними образами для багатьох інструментів, середовищ, баз даних і застосунків. -Наприклад, є офіційний образ Python. +Наприклад, є офіційний [образ Python](https://hub.docker.com/_/python). І є багато інших образів для різних речей, як-от бази даних, наприклад для: -* PostgreSQL -* MySQL -* MongoDB -* Redis тощо. +* [PostgreSQL](https://hub.docker.com/_/postgres) +* [MySQL](https://hub.docker.com/_/mysql) +* [MongoDB](https://hub.docker.com/_/mongo) +* [Redis](https://hub.docker.com/_/redis) тощо. Використовуючи готовий образ контейнера, дуже легко поєднувати та використовувати різні інструменти. Наприклад, щоб випробувати нову базу даних. У більшості випадків ви можете використати офіційні образи та просто налаштувати їх змінними оточення. @@ -111,7 +111,7 @@ Docker був одним з основних інструментів для с Найпоширеніший спосіб - мати файл `requirements.txt` з назвами пакетів і їхніми версіями, по одному на рядок. -Звісно, ви застосуєте ті самі ідеї з [Про версії FastAPI](versions.md){.internal-link target=_blank}, щоб задати діапазони версій. +Звісно, ви застосуєте ті самі ідеї з [Про версії FastAPI](versions.md), щоб задати діапазони версій. Наприклад, ваш `requirements.txt` може виглядати так: @@ -238,7 +238,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] #### Використовуйте `CMD` - exec form { #use-cmd-exec-form } -Інструкцію Docker `CMD` можна записати у двох формах: +Інструкцію Docker [`CMD`](https://docs.docker.com/reference/dockerfile/#cmd) можна записати у двох формах: ✅ Exec form: @@ -254,11 +254,11 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"] CMD fastapi run app/main.py --port 80 ``` -Обов’язково завжди використовуйте exec form, щоб FastAPI міг коректно завершувати роботу та щоб були викликані [події тривалості життя](../advanced/events.md){.internal-link target=_blank}. +Обов’язково завжди використовуйте exec form, щоб FastAPI міг коректно завершувати роботу та щоб були викликані [події тривалості життя](../advanced/events.md). -Докладніше про це можна прочитати в документації Docker про shell та exec form. +Докладніше про це можна прочитати в [документації Docker про shell та exec form](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form). -Це може бути особливо помітно при використанні `docker compose`. Див. розділ FAQ Docker Compose для технічних деталей: Чому мої сервіси потребують 10 секунд, щоб пересотворитися або зупинитися?. +Це може бути особливо помітно при використанні `docker compose`. Див. розділ FAQ Docker Compose для технічних деталей: [Чому мої сервіси потребують 10 секунд, щоб пересотворитися або зупинитися?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop). #### Структура директорій { #directory-structure } @@ -352,7 +352,7 @@ $ docker run -d --name mycontainer -p 80:80 myimage ## Перевірте { #check-it } -Ви маєте змогу перевірити це за URL вашого Docker-контейнера, наприклад: http://192.168.99.100/items/5?q=somequery або http://127.0.0.1/items/5?q=somequery (або еквівалент, використовуючи ваш Docker-хост). +Ви маєте змогу перевірити це за URL вашого Docker-контейнера, наприклад: [http://192.168.99.100/items/5?q=somequery](http://192.168.99.100/items/5?q=somequery) або [http://127.0.0.1/items/5?q=somequery](http://127.0.0.1/items/5?q=somequery) (або еквівалент, використовуючи ваш Docker-хост). Ви побачите щось таке: @@ -362,17 +362,17 @@ $ docker run -d --name mycontainer -p 80:80 myimage ## Інтерактивна документація API { #interactive-api-docs } -Тепер ви можете перейти на http://192.168.99.100/docs або http://127.0.0.1/docs (або еквівалент, використовуючи ваш Docker-хост). +Тепер ви можете перейти на [http://192.168.99.100/docs](http://192.168.99.100/docs) або [http://127.0.0.1/docs](http://127.0.0.1/docs) (або еквівалент, використовуючи ваш Docker-хост). -Ви побачите автоматичну інтерактивну документацію API (надається Swagger UI): +Ви побачите автоматичну інтерактивну документацію API (надається [Swagger UI](https://github.com/swagger-api/swagger-ui)): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ## Альтернативна документація API { #alternative-api-docs } -Також ви можете перейти на http://192.168.99.100/redoc або http://127.0.0.1/redoc (або еквівалент, використовуючи ваш Docker-хост). +Також ви можете перейти на [http://192.168.99.100/redoc](http://192.168.99.100/redoc) або [http://127.0.0.1/redoc](http://127.0.0.1/redoc) (або еквівалент, використовуючи ваш Docker-хост). -Ви побачите альтернативну автоматичну документацію (надається ReDoc): +Ви побачите альтернативну автоматичну документацію (надається [ReDoc](https://github.com/Rebilly/ReDoc)): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -413,7 +413,7 @@ CMD ["fastapi", "run", "main.py", "--port", "80"] ## Концепції розгортання { #deployment-concepts } -Поговорімо знову про деякі з тих самих [Концепцій розгортання](concepts.md){.internal-link target=_blank} у термінах контейнерів. +Поговорімо знову про деякі з тих самих [Концепцій розгортання](concepts.md) у термінах контейнерів. Контейнери - це переважно інструмент для спрощення процесу збирання та розгортання застосунку, але вони не нав’язують конкретний підхід до обробки цих концепцій розгортання, і існує кілька можливих стратегій. @@ -432,7 +432,7 @@ CMD ["fastapi", "run", "main.py", "--port", "80"] Якщо зосередитись лише на образі контейнера для застосунку FastAPI (а згодом на запущеному контейнері), HTTPS зазвичай обробляється зовнішнім іншим інструментом. -Це може бути інший контейнер, наприклад з Traefik, що обробляє HTTPS і автоматичне отримання сертифікатів. +Це може бути інший контейнер, наприклад з [Traefik](https://traefik.io/), що обробляє HTTPS і автоматичне отримання сертифікатів. /// tip | Порада @@ -558,7 +558,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] /// info | Інформація -Якщо ви використовуєте Kubernetes, це, ймовірно, буде Init Container. +Якщо ви використовуєте Kubernetes, це, ймовірно, буде [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/). /// @@ -570,7 +570,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] ### Базовий образ Docker { #base-docker-image } -Колись існував офіційний образ Docker для FastAPI: tiangolo/uvicorn-gunicorn-fastapi. Але зараз він застарілий. ⛔️ +Колись існував офіційний образ Docker для FastAPI: [tiangolo/uvicorn-gunicorn-fastapi](https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker). Але зараз він застарілий. ⛔️ Ймовірно, вам не слід використовувати цей базовий образ Docker (або будь-який інший подібний). @@ -600,7 +600,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] ## Образ Docker з `uv` { #docker-image-with-uv } -Якщо ви використовуєте uv для встановлення та керування вашим проєктом, ви можете скористатися їхнім посібником Docker для uv. +Якщо ви використовуєте [uv](https://github.com/astral-sh/uv) для встановлення та керування вашим проєктом, ви можете скористатися їхнім [посібником Docker для uv](https://docs.astral.sh/uv/guides/integration/docker/). ## Підсумок { #recap } diff --git a/docs/uk/docs/deployment/fastapicloud.md b/docs/uk/docs/deployment/fastapicloud.md index 4b4f3e59be..63d9fa4595 100644 --- a/docs/uk/docs/deployment/fastapicloud.md +++ b/docs/uk/docs/deployment/fastapicloud.md @@ -1,6 +1,6 @@ # FastAPI Cloud { #fastapi-cloud } -Ви можете розгорнути свій застосунок FastAPI на FastAPI Cloud однією командою, приєднуйтесь до списку очікування, якщо ще ні. 🚀 +Ви можете розгорнути свій застосунок FastAPI на [FastAPI Cloud](https://fastapicloud.com) **однією командою**, приєднуйтесь до списку очікування, якщо ще ні. 🚀 ## Вхід { #login } @@ -20,7 +20,7 @@ You are logged in to FastAPI Cloud 🚀 ## Розгортання { #deploy } -Тепер розгорніть свій застосунок однією командою: +Тепер розгорніть свій застосунок **однією командою**:
@@ -40,7 +40,7 @@ Deploying to FastAPI Cloud... ## Про FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** створено тим самим автором і командою, що стоїть за **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** створено тим самим автором і командою, що стоїть за **FastAPI**. Він спрощує процес **створення**, **розгортання** та **доступу** до API з мінімальними зусиллями. diff --git a/docs/uk/docs/deployment/https.md b/docs/uk/docs/deployment/https.md index 29329c88f0..439adf61e2 100644 --- a/docs/uk/docs/deployment/https.md +++ b/docs/uk/docs/deployment/https.md @@ -10,31 +10,31 @@ /// -Щоб вивчити основи HTTPS з точки зору споживача, перегляньте https://howhttps.works/. - -Тепер, з точки зору розробника, ось кілька речей, які варто пам'ятати, розмірковуючи про HTTPS: - -* Для HTTPS сервер має мати «сертифікати», видані третьою стороною. - * Насправді ці сертифікати «отримуються» у третьої сторони, а не «генеруються». -* Сертифікати мають строк дії. - * Їхній строк дії спливає. - * І тоді їх потрібно поновити, знову отримавши у третьої сторони. -* Шифрування з'єднання відбувається на рівні TCP. - * Це один шар нижче від HTTP. - * Тож обробка сертифіката та шифрування виконується до HTTP. -* TCP не знає про «домени». Лише про IP-адреси. - * Інформація про конкретний домен, який запитується, міститься в даних HTTP. -* Сертифікати HTTPS «засвідчують» певний домен, але протокол і шифрування працюють на рівні TCP, до того як відомо, з яким доменом маємо справу. -* Типово це означало б, що на одну IP-адресу можна мати лише один сертифікат HTTPS. +Щоб **вивчити основи HTTPS** з точки зору споживача, перегляньте [https://howhttps.works/](https://howhttps.works/). + +Тепер, з **точки зору розробника**, ось кілька речей, які варто пам'ятати, розмірковуючи про HTTPS: + +* Для HTTPS **сервер** має **мати «сертифікати»**, видані **третьою стороною**. + * Насправді ці сертифікати **«отримуються»** у третьої сторони, а не **«генеруються»**. +* Сертифікати мають **строк дії**. + * Їхній строк дії **спливає**. + * І тоді їх потрібно **поновити**, **знову отримавши** у третьої сторони. +* Шифрування з'єднання відбувається на **рівні TCP**. + * Це один шар **нижче від HTTP**. + * Тож **обробка сертифіката та шифрування** виконується **до HTTP**. +* **TCP не знає про «домени»**. Лише про IP-адреси. + * Інформація про **конкретний домен**, який запитується, міститься в **даних HTTP**. +* **Сертифікати HTTPS** «засвідчують» **певний домен**, але протокол і шифрування працюють на рівні TCP, **до того як відомо**, з яким доменом маємо справу. +* **Типово**, це означало б, що на одну IP-адресу можна мати **лише один сертифікат HTTPS**. * Неважливо, наскільки великий ваш сервер або наскільки малий кожен застосунок на ньому. - * Однак для цього є рішення. -* Є розширення протоколу TLS (який обробляє шифрування на рівні TCP, до HTTP), що називається SNI. - * Це розширення SNI дозволяє одному серверу (з однією IP-адресою) мати кілька сертифікатів HTTPS і обслуговувати кілька доменів/застосунків по HTTPS. - * Щоб це працювало, один-єдиний компонент (програма), що працює на сервері та слухає публічну IP-адресу, має мати всі сертифікати HTTPS на сервері. -* Після отримання захищеного з'єднання протокол обміну все ще HTTP. - * Вміст зашифровано, хоча він надсилається протоколом HTTP. + * Однак для цього є **рішення**. +* Є **розширення** протоколу **TLS** (який обробляє шифрування на рівні TCP, до HTTP), що називається **[SNI](https://en.wikipedia.org/wiki/Server_Name_Indication)**. + * Це розширення SNI дозволяє одному серверу (з **однією IP-адресою**) мати **кілька сертифікатів HTTPS** і обслуговувати **кілька доменів/застосунків через HTTPS**. + * Щоб це працювало, один-єдиний компонент (програма), що працює на сервері та слухає **публічну IP-адресу**, має мати **всі сертифікати HTTPS** на сервері. +* **Після** отримання захищеного з'єднання протокол обміну **залишається HTTP**. + * Вміст **зашифровано**, хоча він надсилається з використанням **протоколу HTTP**. -Поширена практика мати одну програму/HTTP-сервер, що працює на сервері (машині, хості тощо) і керує всіма частинами HTTPS: приймає зашифровані HTTPS-запити, надсилає розшифровані HTTP-запити до фактичного HTTP-застосунку, що працює на тому ж сервері (у нашому випадку застосунок FastAPI), отримує HTTP-відповідь від застосунку, шифрує її за допомогою відповідного сертифіката HTTPS і надсилає її назад клієнту через HTTPS. Такий сервер часто називають TLS Termination Proxy. +Поширена практика мати **одну програму/HTTP-сервер**, що працює на сервері (машині, хості тощо) і **керує всіма частинами HTTPS**: приймає **зашифровані HTTPS-запити**, надсилає **розшифровані HTTP-запити** до фактичного HTTP-застосунку, що працює на тому ж сервері (у нашому випадку застосунок **FastAPI**), отримує **HTTP-відповідь** від застосунку, **шифрує її** за допомогою відповідного **сертифіката HTTPS** і надсилає її назад клієнту через **HTTPS**. Такий сервер часто називають **[TLS Termination Proxy](https://en.wikipedia.org/wiki/TLS_termination_proxy)**. Деякі варіанти, які ви можете використати як TLS Termination Proxy: @@ -45,17 +45,17 @@ ## Let's Encrypt { #lets-encrypt } -До Let's Encrypt ці сертифікати HTTPS продавалися довіреними третіми сторонами. +До Let's Encrypt ці **сертифікати HTTPS** продавалися довіреними третіми сторонами. Процес отримання одного з таких сертифікатів був громіздким, вимагав чимало паперової роботи, а самі сертифікати були доволі дорогими. -Але потім з'явився проєкт Let's Encrypt. +Але потім з'явився проєкт **[Let's Encrypt](https://letsencrypt.org/)**. -Це проєкт Linux Foundation. Він надає сертифікати HTTPS безкоштовно, в автоматизований спосіб. Ці сертифікати використовують усі стандартні криптографічні механізми безпеки і є короткостроковими (близько 3 місяців), тож безпека насправді краща завдяки зменшеній тривалості життя. +Це проєкт Linux Foundation. Він надає **сертифікати HTTPS безкоштовно**, в автоматизований спосіб. Ці сертифікати використовують усі стандартні криптографічні механізми безпеки і є короткостроковими (близько 3 місяців), тож **безпека насправді краща** завдяки зменшеній тривалості життя. Домени безпечно перевіряються, а сертифікати генеруються автоматично. Це також дозволяє автоматизувати поновлення цих сертифікатів. -Ідея полягає в автоматизації отримання та поновлення цих сертифікатів, щоб ви могли мати безпечний HTTPS безкоштовно та назавжди. +Ідея полягає в автоматизації отримання та поновлення цих сертифікатів, щоб ви могли мати **безпечний HTTPS, безкоштовно і назавжди**. ## HTTPS для розробників { #https-for-developers } @@ -63,11 +63,11 @@ ### Доменне ім'я { #domain-name } -Ймовірно, все почнеться з того, що ви придбаєте якесь доменне ім'я. Потім ви налаштуєте його на сервері DNS (можливо, у вашого ж хмарного провайдера). +Ймовірно, все почнеться з того, що ви **придбаєте** якесь **доменне ім'я**. Потім ви налаштуєте його на сервері DNS (можливо, у вашого ж хмарного провайдера). -Ви, скоріш за все, отримаєте хмарний сервер (віртуальну машину) або щось подібне, і він матиме фіксовану публічну IP-адресу. +Ви, скоріш за все, отримаєте хмарний сервер (віртуальну машину) або щось подібне, і він матиме фіксовану **публічну IP-адресу**. -На сервері(ах) DNS ви налаштуєте запис («`A record`»), щоб спрямувати ваш домен на публічну IP-адресу вашого сервера. +На сервері(ах) DNS ви налаштуєте запис («`A record`»), щоб спрямувати **ваш домен** на публічну **IP-адресу вашого сервера**. Ймовірно, ви зробите це лише один раз, уперше, коли все налаштовуватимете. @@ -81,136 +81,136 @@ Тепер зосередьмося на всіх власне частинах HTTPS. -Спочатку браузер звернеться до серверів DNS, щоб дізнатися, яка IP-адреса для домену, у цьому випадку `someapp.example.com`. +Спочатку браузер звернеться до **DNS-серверів**, щоб дізнатися, яка **IP-адреса для домену**, у цьому випадку `someapp.example.com`. -Сервери DNS повідомлять браузеру використати конкретну IP-адресу. Це буде публічна IP-адреса, яку використовує ваш сервер і яку ви налаштували на серверах DNS. +Сервери DNS повідомлять браузеру використати конкретну **IP-адресу**. Це буде публічна IP-адреса, яку використовує ваш сервер і яку ви налаштували на серверах DNS. ### Початок TLS рукостискання { #tls-handshake-start } -Потім браузер зв'яжеться з цією IP-адресою на порту 443 (порт HTTPS). +Потім браузер зв'яжеться з цією IP-адресою на **порту 443** (порт HTTPS). Перша частина комунікації - це просто встановлення з'єднання між клієнтом і сервером та узгодження криптографічних ключів тощо. -Ця взаємодія між клієнтом і сервером для встановлення з'єднання TLS називається TLS рукостисканням. +Ця взаємодія між клієнтом і сервером для встановлення з'єднання TLS називається **TLS рукостисканням**. ### TLS із розширенням SNI { #tls-with-sni-extension } -Лише один процес на сервері може слухати конкретний порт на конкретній IP-адресі. Інші процеси можуть слухати інші порти на тій самій IP-адресі, але лише один для кожної комбінації IP-адреси та порту. +**Лише один процес** на сервері може слухати конкретний **порт** на конкретній **IP-адресі**. Інші процеси можуть слухати інші порти на тій самій IP-адресі, але лише один для кожної комбінації IP-адреси та порту. TLS (HTTPS) за замовчуванням використовує конкретний порт `443`. Отже, це порт, який нам потрібен. -Оскільки лише один процес може слухати цей порт, процесом, що робитиме це, буде TLS Termination Proxy. +Оскільки лише один процес може слухати цей порт, процесом, що робитиме це, буде **TLS Termination Proxy**. -TLS Termination Proxy матиме доступ до одного або кількох сертифікатів TLS (сертифікатів HTTPS). +TLS Termination Proxy матиме доступ до одного або кількох **сертифікатів TLS** (сертифікатів HTTPS). -Використовуючи обговорене вище розширення SNI, TLS Termination Proxy перевірить, який із наявних сертифікатів TLS (HTTPS) слід використати для цього з'єднання, обравши той, що відповідає домену, очікуваному клієнтом. +Використовуючи **розширення SNI**, обговорене вище, TLS Termination Proxy перевірить, який із наявних сертифікатів TLS (HTTPS) слід використати для цього з'єднання, обравши той, що відповідає домену, очікуваному клієнтом. У цьому випадку він використає сертифікат для `someapp.example.com`. -Клієнт уже довіряє сутності, яка видала цей сертифікат TLS (у цьому випадку Let's Encrypt, але про це згодом), тож він може перевірити, що сертифікат дійсний. +Клієнт уже **довіряє** сутності, яка видала цей сертифікат TLS (у цьому випадку Let's Encrypt, але про це згодом), тож він може **перевірити**, що сертифікат дійсний. -Потім, використовуючи сертифікат, клієнт і TLS Termination Proxy узгоджують, як шифрувати решту TCP-комунікації. На цьому частина TLS рукостискання завершується. +Потім, використовуючи сертифікат, клієнт і TLS Termination Proxy **вирішать, як шифрувати** решту **TCP-комунікації**. На цьому частина **TLS рукостискання** завершується. -Після цього клієнт і сервер мають зашифроване TCP-з'єднання - саме це надає TLS. І тоді вони можуть використати це з'єднання, щоб почати власне HTTP-комунікацію. +Після цього клієнт і сервер мають **зашифроване TCP-з'єднання** - саме це надає TLS. І тоді вони можуть використати це з'єднання, щоб почати власне **HTTP-комунікацію**. -І це і є HTTPS: це звичайний HTTP усередині захищеного TLS-з'єднання замість чистого (незашифрованого) TCP-з'єднання. +І це і є **HTTPS**: це звичайний **HTTP** усередині **захищеного TLS-з'єднання** замість чистого (незашифрованого) TCP-з'єднання. /// tip | Порада -Зверніть увагу, що шифрування комунікації відбувається на рівні TCP, а не на рівні HTTP. +Зверніть увагу, що шифрування комунікації відбувається на **рівні TCP**, а не на рівні HTTP. /// ### HTTPS-запит { #https-request } -Тепер, коли клієнт і сервер (конкретно браузер і TLS Termination Proxy) мають зашифроване TCP-з'єднання, вони можуть почати HTTP-комунікацію. +Тепер, коли клієнт і сервер (конкретно браузер і TLS Termination Proxy) мають **зашифроване TCP-з'єднання**, вони можуть почати **HTTP-комунікацію**. -Отже, клієнт надсилає HTTPS-запит. Це просто HTTP-запит через зашифроване TLS-з'єднання. +Отже, клієнт надсилає **HTTPS-запит**. Це просто HTTP-запит через зашифроване TLS-з'єднання. ### Розшифрування запиту { #decrypt-the-request } -TLS Termination Proxy використає узгоджене шифрування, щоб розшифрувати запит, і передасть звичайний (розшифрований) HTTP-запит процесу, що запускає застосунок (наприклад, процесу з Uvicorn, який запускає застосунок FastAPI). +TLS Termination Proxy використає узгоджене шифрування, щоб **розшифрувати запит**, і передасть **звичайний (розшифрований) HTTP-запит** процесу, що запускає застосунок (наприклад, процесу з Uvicorn, який запускає застосунок FastAPI). ### HTTP-відповідь { #http-response } -Застосунок обробить запит і надішле звичайну (незашифровану) HTTP-відповідь TLS Termination Proxy. +Застосунок обробить запит і надішле **звичайну (незашифровану) HTTP-відповідь** TLS Termination Proxy. ### HTTPS-відповідь { #https-response } -Потім TLS Termination Proxy зашифрує відповідь, використовуючи попередньо узгоджену криптографію (що почалася із сертифіката для `someapp.example.com`), і надішле її назад у браузер. +Потім TLS Termination Proxy **зашифрує відповідь**, використовуючи попередньо узгоджену криптографію (що почалася із сертифіката для `someapp.example.com`), і надішле її назад у браузер. -Далі браузер перевірить, що відповідь дійсна й зашифрована правильним криптографічним ключем тощо. Потім він розшифрує відповідь і обробить її. +Далі браузер перевірить, що відповідь дійсна й зашифрована правильним криптографічним ключем тощо. Потім він **розшифрує відповідь** і обробить її. -Клієнт (браузер) знатиме, що відповідь надходить від правильного сервера, тому що використовується узгоджена раніше криптографія з використанням сертифіката HTTPS. +Клієнт (браузер) знатиме, що відповідь надходить від правильного сервера, тому що використовується узгоджена раніше криптографія з використанням **сертифіката HTTPS**. ### Кілька застосунків { #multiple-applications } -На тому самому сервері (або серверах) може бути кілька застосунків, наприклад інші програми API або база даних. +На тому самому сервері (або серверах) може бути **кілька застосунків**, наприклад інші програми API або база даних. -Лише один процес може обробляти конкретну IP-адресу і порт (TLS Termination Proxy у нашому прикладі), але інші застосунки/процеси також можуть працювати на сервері(ах), доки вони не намагаються використати ту саму комбінацію публічної IP-адреси й порту. +Лише один процес може обробляти конкретну IP-адресу і порт (TLS Termination Proxy у нашому прикладі), але інші застосунки/процеси також можуть працювати на сервері(ах), доки вони не намагаються використати ту саму **комбінацію публічної IP-адреси й порту**. -Таким чином, TLS Termination Proxy може обробляти HTTPS і сертифікати для кількох доменів, для кількох застосунків, а потім передавати запити до відповідного застосунку в кожному випадку. +Таким чином, TLS Termination Proxy може обробляти HTTPS і сертифікати для **кількох доменів**, для кількох застосунків, а потім передавати запити до відповідного застосунку в кожному випадку. ### Поновлення сертифіката { #certificate-renewal } -У певний момент у майбутньому строк дії кожного сертифіката спливе (приблизно через 3 місяці після його отримання). +У певний момент у майбутньому строк дії кожного сертифіката **спливе** (приблизно через 3 місяці після його отримання). Потім інша програма (в деяких випадках це інша програма, а в деяких - той самий TLS Termination Proxy) зв'яжеться з Let's Encrypt і поновить сертифікат(и). -Сертифікати TLS пов'язані з доменним іменем, а не з IP-адресою. +**Сертифікати TLS** пов'язані **з доменним іменем**, а не з IP-адресою. -Тому, щоб поновити сертифікати, програма поновлення має довести авторитету (Let's Encrypt), що вона справді «володіє» і контролює цей домен. +Тому, щоб поновити сертифікати, програма поновлення має **довести** авторитету (Let's Encrypt), що вона справді **«володіє» і контролює цей домен**. Щоб зробити це й задовольнити різні потреби застосунків, є кілька способів. Деякі популярні: -* Змінити деякі записи DNS. +* **Змінити деякі записи DNS**. * Для цього програма поновлення має підтримувати API провайдера DNS, тож залежно від того, якого провайдера DNS ви використовуєте, це може бути або не бути варіантом. -* Запуститися як сервер (принаймні під час процесу отримання сертифіката) на публічній IP-адресі, пов'язаній із доменом. +* **Запуститися як сервер** (принаймні під час процесу отримання сертифіката) на публічній IP-адресі, пов'язаній із доменом. * Як ми казали вище, лише один процес може слухати конкретну IP-адресу та порт. * Це одна з причин, чому дуже зручно, коли той самий TLS Termination Proxy також займається процесом поновлення сертифікатів. * Інакше вам, можливо, доведеться на мить зупинити TLS Termination Proxy, запустити програму поновлення, щоб отримати сертифікати, потім налаштувати їх у TLS Termination Proxy і перезапустити TLS Termination Proxy. Це неідеально, оскільки ваші застосунки будуть недоступні під час вимкнення TLS Termination Proxy. -Увесь цей процес поновлення, паралельно з обслуговуванням застосунку, - одна з головних причин, чому ви можете захотіти мати окрему систему для обробки HTTPS за допомогою TLS Termination Proxy замість того, щоб просто використовувати сертифікати TLS безпосередньо з сервером застосунку (наприклад, Uvicorn). +Увесь цей процес поновлення, паралельно з обслуговуванням застосунку, - одна з головних причин, чому ви можете захотіти мати **окрему систему для обробки HTTPS** за допомогою TLS Termination Proxy замість того, щоб просто використовувати сертифікати TLS безпосередньо з сервером застосунку (наприклад, Uvicorn). ## Направлені заголовки проксі { #proxy-forwarded-headers } -Коли ви використовуєте проксі для обробки HTTPS, ваш сервер застосунку (наприклад, Uvicorn через FastAPI CLI) нічого не знає про процес HTTPS, він спілкується звичайним HTTP із TLS Termination Proxy. +Коли ви використовуєте проксі для обробки HTTPS, ваш **сервер застосунку** (наприклад, Uvicorn через FastAPI CLI) нічого не знає про процес HTTPS, він спілкується звичайним HTTP із **TLS Termination Proxy**. -Цей проксі зазвичай динамічно встановлює деякі HTTP-заголовки перед передачею запиту серверу застосунку, щоб дати йому знати, що запит направляється проксі. +Цей **проксі** зазвичай динамічно встановлює деякі HTTP-заголовки перед передачею запиту **серверу застосунку**, щоб дати йому знати, що запит **направляється** проксі. /// note | Технічні деталі Заголовки проксі: -* X-Forwarded-For -* X-Forwarded-Proto -* X-Forwarded-Host +* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For) +* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto) +* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host) /// -Втім, оскільки сервер застосунку не знає, що він стоїть за довіреним проксі, за замовчуванням він не довірятиме цим заголовкам. +Втім, оскільки **сервер застосунку** не знає, що він стоїть за довіреним **проксі**, за замовчуванням він не довірятиме цим заголовкам. -Але ви можете налаштувати сервер застосунку, щоб довіряти направленим заголовкам, надісланим проксі. Якщо ви використовуєте FastAPI CLI, ви можете скористатися курсивною *опцією CLI* `--forwarded-allow-ips`, щоб повідомити, з яких IP-адрес слід довіряти цим направленим заголовкам. +Але ви можете налаштувати **сервер застосунку**, щоб довіряти направленим заголовкам, надісланим **проксі**. Якщо ви використовуєте FastAPI CLI, ви можете скористатися курсивною *опцією CLI* `--forwarded-allow-ips`, щоб повідомити, з яких IP-адрес слід довіряти цим направленим заголовкам. -Наприклад, якщо сервер застосунку отримує комунікацію лише від довіреного проксі, ви можете встановити `--forwarded-allow-ips="*"`, щоб довіряти всім вхідним IP-адресам, оскільки він отримуватиме запити лише з тієї IP-адреси, яку використовує проксі. +Наприклад, якщо **сервер застосунку** отримує комунікацію лише від довіреного **проксі**, ви можете встановити `--forwarded-allow-ips="*"`, щоб довіряти всім вхідним IP-адресам, оскільки він отримуватиме запити лише з тієї IP-адреси, яку використовує **проксі**. Так застосунок зможе знати свою публічну URL-адресу, чи використовує він HTTPS, домен тощо. @@ -218,14 +218,14 @@ TLS Termination Proxy використає узгоджене шифруванн /// tip | Порада -Ви можете дізнатися більше про це в документації [За проксі - Увімкнути направлені заголовки проксі](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers){.internal-link target=_blank} +Ви можете дізнатися більше про це в документації [За проксі - Увімкнути направлені заголовки проксі](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers) /// ## Підсумок { #recap } -Наявність HTTPS дуже важлива і в більшості випадків критична. Більшість зусиль, які вам як розробнику доведеться докласти навколо HTTPS, полягають лише в розумінні цих концепцій і того, як вони працюють. +Наявність **HTTPS** дуже важлива і в більшості випадків **критична**. Більшість зусиль, які вам як розробнику доведеться докласти навколо HTTPS, полягають лише в **розумінні цих концепцій** і того, як вони працюють. -Але як тільки ви знаєте базову інформацію про HTTPS для розробників, ви можете легко комбінувати й налаштовувати різні інструменти, щоб керувати всім просто. +Але як тільки ви знаєте базову інформацію про **HTTPS для розробників**, ви можете легко комбінувати й налаштовувати різні інструменти, щоб керувати всім просто. -У деяких наступних розділах я покажу кілька конкретних прикладів налаштування HTTPS для застосунків FastAPI. 🔒 +У деяких наступних розділах я покажу кілька конкретних прикладів налаштування **HTTPS** для застосунків **FastAPI**. 🔒 diff --git a/docs/uk/docs/deployment/index.md b/docs/uk/docs/deployment/index.md index 7386681397..aa9c1f1fdf 100644 --- a/docs/uk/docs/deployment/index.md +++ b/docs/uk/docs/deployment/index.md @@ -16,7 +16,7 @@ Ви можете розгорнути сервер самостійно, використовуючи комбінацію інструментів, можете скористатися **хмарним сервісом**, який виконує частину роботи за вас, або обрати інші варіанти. -Наприклад, ми, команда, що стоїть за FastAPI, створили **FastAPI Cloud**, щоб зробити розгортання застосунків FastAPI у хмарі якомога простішим і з тим самим досвідом розробки, що й під час роботи з FastAPI. +Наприклад, ми, команда, що стоїть за FastAPI, створили [**FastAPI Cloud**](https://fastapicloud.com), щоб зробити розгортання застосунків FastAPI у хмарі якомога простішим і з тим самим досвідом розробки, що й під час роботи з FastAPI. Я покажу вам кілька основних концепцій, про які, ймовірно, варто пам'ятати під час розгортання **FastAPI**-застосунку (хоча більшість із них стосується будь-яких інших типів веб-застосунків). diff --git a/docs/uk/docs/deployment/manually.md b/docs/uk/docs/deployment/manually.md index d70ec5d5d0..7ea2c78e39 100644 --- a/docs/uk/docs/deployment/manually.md +++ b/docs/uk/docs/deployment/manually.md @@ -52,11 +52,11 @@ FastAPI використовує стандарт для побудови Python Є кілька альтернатив, зокрема: -* Uvicorn: високопродуктивний ASGI-сервер. -* Hypercorn: ASGI-сервер, сумісний з HTTP/2 і Trio, серед інших можливостей. -* Daphne: ASGI-сервер, створений для Django Channels. -* Granian: Rust HTTP-сервер для Python-застосунків. -* NGINX Unit: NGINX Unit - легке й універсальне середовище виконання вебзастосунків. +* [Uvicorn](https://www.uvicorn.dev/): високопродуктивний ASGI-сервер. +* [Hypercorn](https://hypercorn.readthedocs.io/): ASGI-сервер, сумісний з HTTP/2 і Trio, серед інших можливостей. +* [Daphne](https://github.com/django/daphne): ASGI-сервер, створений для Django Channels. +* [Granian](https://github.com/emmett-framework/granian): Rust HTTP-сервер для Python-застосунків. +* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit - легке й універсальне середовище виконання вебзастосунків. ## Серверна машина і серверна програма { #server-machine-and-server-program } @@ -74,7 +74,7 @@ FastAPI використовує стандарт для побудови Python Але ви також можете встановити ASGI-сервер вручну. -Переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md){.internal-link target=_blank}, активували його, після чого можете встановити серверну програму. +Переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md), активували його, після чого можете встановити серверну програму. Наприклад, щоб установити Uvicorn: @@ -137,7 +137,7 @@ Uvicorn та інші сервери підтримують опцію `--reload Опція `--reload` споживає значно більше ресурсів, є менш стабільною тощо. -Вона дуже допомагає під час розробки, але її не слід використовувати в продакшні. +Вона дуже допомагає під час **розробки**, але її **не слід** використовувати в **продакшні**. /// diff --git a/docs/uk/docs/deployment/server-workers.md b/docs/uk/docs/deployment/server-workers.md index 81a8bd2a4d..f165bb7079 100644 --- a/docs/uk/docs/deployment/server-workers.md +++ b/docs/uk/docs/deployment/server-workers.md @@ -5,7 +5,7 @@ - Безпека - HTTPS - Запуск під час старту - Перезапуски -- Реплікація (кількість процесів, що виконуються) +- **Реплікація (кількість процесів, що виконуються)** - Пам'ять - Попередні кроки перед запуском @@ -13,13 +13,13 @@ Під час розгортання застосунків ви, найімовірніше, захочете мати реплікацію процесів, щоб використовувати кілька ядер і обробляти більше запитів. -Як ви бачили в попередньому розділі про [Концепції розгортання](concepts.md){.internal-link target=_blank}, існує кілька стратегій, які можна використовувати. +Як ви бачили в попередньому розділі про [Концепції розгортання](concepts.md), існує кілька стратегій, які можна використовувати. Тут я покажу, як використовувати Uvicorn із процесами-працівниками за допомогою команди `fastapi` або безпосередньо команди `uvicorn`. /// info | Інформація -Якщо ви використовуєте контейнери, наприклад з Docker або Kubernetes, я розповім про це більше в наступному розділі: [FastAPI у контейнерах - Docker](docker.md){.internal-link target=_blank}. +Якщо ви використовуєте контейнери, наприклад з Docker або Kubernetes, я розповім про це більше в наступному розділі: [FastAPI у контейнерах - Docker](docker.md). Зокрема, під час запуску в Kubernetes вам, найімовірніше, не варто використовувати працівників, натомість запускати один процес Uvicorn на контейнер. Але про це я розповім пізніше в тому розділі. @@ -117,16 +117,16 @@ $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4 Із наведеного вище списку концепцій розгортання, використання працівників головним чином допоможе з частиною про реплікацію і трохи з перезапусками, але про інше все ще треба подбати: -- Безпека - HTTPS -- Запуск під час старту +- **Безпека - HTTPS** +- **Запуск під час старту** - ***Перезапуски*** - Реплікація (кількість процесів, що виконуються) -- Пам'ять -- Попередні кроки перед запуском +- **Пам'ять** +- **Попередні кроки перед запуском** ## Контейнери і Docker { #containers-and-docker } -У наступному розділі про [FastAPI у контейнерах - Docker](docker.md){.internal-link target=_blank} я поясню кілька стратегій, які ви можете використати для інших концепцій розгортання. +У наступному розділі про [FastAPI у контейнерах - Docker](docker.md) я поясню кілька стратегій, які ви можете використати для інших концепцій розгортання. Я покажу, як побудувати власний образ з нуля для запуску одного процесу Uvicorn. Це простий процес і, ймовірно, саме те, що потрібно при використанні розподіленої системи керування контейнерами, такої як Kubernetes. diff --git a/docs/uk/docs/deployment/versions.md b/docs/uk/docs/deployment/versions.md index 4f6d1b01a2..568ff40ee4 100644 --- a/docs/uk/docs/deployment/versions.md +++ b/docs/uk/docs/deployment/versions.md @@ -4,7 +4,7 @@ Нові можливості додаються часто, помилки регулярно виправляються, а код постійно поліпшується. -Тому поточні версії все ще `0.x.x`, це відображає те, що кожна версія потенційно може містити несумісні зміни. Це відповідає правилам Семантичного версіонування. +Тому поточні версії все ще `0.x.x`, це відображає те, що кожна версія потенційно може містити несумісні зміни. Це відповідає правилам [Семантичного версіонування](https://semver.org/). Ви можете створювати продакшн-застосунки з **FastAPI** вже зараз (і, ймовірно, робите це вже певний час), просто переконайтеся, що ви використовуєте версію, яка коректно працює з рештою вашого коду. @@ -34,7 +34,7 @@ fastapi[standard]>=0.112.0,<0.113.0 ## Доступні версії { #available-versions } -Ви можете переглянути доступні версії (наприклад, щоб перевірити поточну останню) в [Примітках до випусків](../release-notes.md){.internal-link target=_blank}. +Ви можете переглянути доступні версії (наприклад, щоб перевірити поточну останню) в [Примітках до випусків](../release-notes.md). ## Про версії { #about-versions } @@ -66,7 +66,7 @@ fastapi>=0.45.0,<0.46.0 Ви повинні додати тести для вашого застосунку. -З **FastAPI** це дуже легко (завдяки Starlette), перегляньте документацію: [Тестування](../tutorial/testing.md){.internal-link target=_blank} +З **FastAPI** це дуже легко (завдяки Starlette), перегляньте документацію: [Тестування](../tutorial/testing.md) Після того як у вас є тести, ви можете оновити версію **FastAPI** до новішої і переконатися, що весь ваш код працює правильно, запустивши тести. diff --git a/docs/uk/docs/editor-support.md b/docs/uk/docs/editor-support.md new file mode 100644 index 0000000000..f0edf62972 --- /dev/null +++ b/docs/uk/docs/editor-support.md @@ -0,0 +1,23 @@ +# Підтримка редакторів { #editor-support } + +Офіційне [FastAPI Extension](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) покращує ваш робочий процес розробки FastAPI завдяки виявленню й навігації по *операціях шляху*, а також розгортанню у FastAPI Cloud і потоковому передаванню журналів у реальному часі. + +Докладніше про розширення дивіться у README в [репозиторії GitHub](https://github.com/fastapi/fastapi-vscode). + +## Налаштування та встановлення { #setup-and-installation } + +**FastAPI Extension** доступне для [VS Code](https://code.visualstudio.com/) і [Cursor](https://www.cursor.com/). Його можна встановити безпосередньо з панелі Extensions у кожному редакторі, знайшовши «FastAPI» і вибравши розширення від **FastAPI Labs**. Розширення також працює у браузерних редакторах, таких як [vscode.dev](https://vscode.dev) і [github.dev](https://github.dev). + +### Виявлення застосунку { #application-discovery } + +Типово розширення автоматично виявляє застосунки FastAPI у вашому робочому просторі, скануючи файли, які створюють екземпляр `FastAPI()`. Якщо автовиявлення не працює для структури вашого проєкту, ви можете вказати точку входу через `[tool.fastapi]` у `pyproject.toml` або налаштування VS Code `fastapi.entryPoint`, використовуючи нотацію модуля (наприклад, `myapp.main:app`). + +## Можливості { #features } + +- **Провідник операцій шляху** - Бічне деревоподібне представлення всіх *операцій шляху* у вашому застосунку. Натисніть, щоб перейти до будь-якого визначення маршруту або маршрутизатора. +- **Пошук маршрутів** - Пошук за шляхом, методом або назвою за допомогою Ctrl + Shift + E (на macOS: Cmd + Shift + E). +- **Навігація CodeLens** - Клікабельні посилання над викликами тестового клієнта (наприклад, `client.get('/items')`), які переходять до відповідної *операції шляху* для швидкої навігації між тестами та реалізацією. +- **Розгортання у FastAPI Cloud** - Розгортання вашого застосунку у [FastAPI Cloud](https://fastapicloud.com/) в один клік. +- **Потокове передавання журналів застосунку** - Потокове передавання журналів у реальному часі з вашого застосунку, розгорнутого у FastAPI Cloud, з фільтруванням за рівнем і пошуком по тексту. + +Щоб ознайомитися з можливостями розширення, відкрийте Палітру команд (Ctrl + Shift + P або на macOS: Cmd + Shift + P), виберіть «Welcome: Open walkthrough...», а потім «Get started with FastAPI». diff --git a/docs/uk/docs/environment-variables.md b/docs/uk/docs/environment-variables.md index b61fd011f6..7b5223bc21 100644 --- a/docs/uk/docs/environment-variables.md +++ b/docs/uk/docs/environment-variables.md @@ -65,7 +65,7 @@ print(f"Hello {name} from Python") /// tip | Порада -Другий аргумент до `os.getenv()` - це значення за замовчуванням, яке буде повернено. +Другий аргумент до [`os.getenv()`](https://docs.python.org/3.8/library/os.html#os.getenv) - це значення за замовчуванням, яке буде повернено. Якщо його не вказано, за замовчуванням це `None`. Тут ми надаємо `"World"` як значення за замовчуванням. @@ -153,7 +153,7 @@ Hello World from Python /// tip | Порада -Докладніше про це можна прочитати у The Twelve-Factor App: Config. +Ви можете прочитати більше у [The Twelve-Factor App: Config](https://12factor.net/config). /// @@ -163,7 +163,7 @@ Hello World from Python Це означає, що будь-яке значення, прочитане в Python зі змінної оточення, буде `str`, а будь-яке перетворення до іншого типу або будь-яка перевірка має виконуватися в коді. -Ви дізнаєтеся більше про використання змінних оточення для роботи з налаштуваннями застосунку в розділі [Просунутий посібник користувача - Налаштування і змінні оточення](./advanced/settings.md){.internal-link target=_blank}. +Ви дізнаєтеся більше про використання змінних оточення для роботи з налаштуваннями застосунку в розділі [Просунутий посібник користувача - Налаштування і змінні оточення](./advanced/settings.md). ## Змінна оточення `PATH` { #path-environment-variable } @@ -285,13 +285,13 @@ $ C:\opt\custompython\bin\python //// -Ця інформація стане у пригоді під час вивчення [Віртуальних середовищ](virtual-environments.md){.internal-link target=_blank}. +Ця інформація стане у пригоді під час вивчення [Віртуальних середовищ](virtual-environments.md). ## Висновок { #conclusion } Тепер ви маєте базове розуміння того, що таке змінні оточення і як їх використовувати в Python. -Також можна прочитати більше у Вікіпедії про змінну оточення. +Також можна прочитати більше у [Вікіпедії про змінну оточення](https://en.wikipedia.org/wiki/Environment_variable). У багатьох випадках не одразу очевидно, як змінні оточення будуть корисними та застосовними. Але вони постійно з’являються в різних сценаріях під час розробки, тож варто про них знати. diff --git a/docs/uk/docs/fastapi-cli.md b/docs/uk/docs/fastapi-cli.md index eb55382302..1183c08c0f 100644 --- a/docs/uk/docs/fastapi-cli.md +++ b/docs/uk/docs/fastapi-cli.md @@ -1,15 +1,15 @@ # FastAPI CLI { #fastapi-cli } -**FastAPI CLI** — це програма командного рядка, яку ви можете використовувати, щоб обслуговувати ваш застосунок FastAPI, керувати вашим проєктом FastAPI тощо. +**FastAPI CLI** — це програма командного рядка, яку ви можете використовувати, щоб обслуговувати ваш застосунок FastAPI, керувати вашим проєктом FastAPI тощо. -Коли ви встановлюєте FastAPI (наприклад, за допомогою `pip install "fastapi[standard]"`), він включає пакет під назвою `fastapi-cli`, цей пакет надає команду `fastapi` у терміналі. +Коли ви встановлюєте FastAPI (наприклад, за допомогою `pip install "fastapi[standard]"`), він постачається з програмою командного рядка, яку можна запускати в терміналі. Щоб запустити ваш застосунок FastAPI для розробки, ви можете використати команду `fastapi dev`:
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -46,13 +46,66 @@ $ fastapi dev Uvicorn, високопродуктивний, production-ready, ASGI сервер. 😎 +Крім того, інші інструменти можуть не знайти його, наприклад [Розширення VS Code](editor-support.md) або [FastAPI Cloud](https://fastapicloud.com), тому рекомендується використовувати `entrypoint` у `pyproject.toml`. ## `fastapi dev` { #fastapi-dev } @@ -70,6 +123,6 @@ FastAPI CLI бере шлях до вашої Python-програми (напр /// tip | Порада -Ви можете дізнатися більше про це в [документації з розгортання](deployment/index.md){.internal-link target=_blank}. +Ви можете дізнатися більше про це в [документації з розгортання](deployment/index.md). /// diff --git a/docs/uk/docs/features.md b/docs/uk/docs/features.md index db044bf947..0dee012cd5 100644 --- a/docs/uk/docs/features.md +++ b/docs/uk/docs/features.md @@ -6,8 +6,8 @@ ### На основі відкритих стандартів { #based-on-open-standards } -* OpenAPI для створення API, включаючи оголошення шляхів, операцій, параметрів, тіл запитів, безпеки тощо. -* Автоматична документація моделей даних за допомогою JSON Schema (оскільки OpenAPI базується саме на JSON Schema). +* [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification) для створення API, включаючи оголошення шляхів операцій, параметрів, тіл запитів, безпеки тощо. +* Автоматична документація моделей даних за допомогою [**JSON Schema**](https://json-schema.org/) (оскільки OpenAPI базується саме на JSON Schema). * Розроблено на основі цих стандартів після ретельного аналізу, а не як додатковий рівень поверх основної архітектури. * Це також дає змогу використовувати автоматичну **генерацію клієнтського коду** багатьма мовами. @@ -15,11 +15,11 @@ Інтерактивна документація API та вебінтерфейси для його дослідження. Оскільки фреймворк базується на OpenAPI, є кілька варіантів, 2 з яких включені за замовчуванням. -* Swagger UI — з інтерактивним дослідженням, викликом і тестуванням вашого API прямо з браузера. +* [**Swagger UI**](https://github.com/swagger-api/swagger-ui) — з інтерактивним дослідженням, викликом і тестуванням вашого API прямо з браузера. ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) -* Альтернативна документація API за допомогою ReDoc. +* Альтернативна документація API за допомогою [**ReDoc**](https://github.com/Rebilly/ReDoc). ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) @@ -27,7 +27,7 @@ Усе базується на стандартних оголошеннях **типів Python** (завдяки Pydantic). Жодного нового синтаксису для вивчення. Лише стандартний сучасний Python. -Якщо вам потрібно 2-хвилинне нагадування про те, як використовувати типи Python (навіть якщо ви не використовуєте FastAPI), перегляньте короткий підручник: [Типи Python](python-types.md){.internal-link target=_blank}. +Якщо вам потрібно 2-хвилинне нагадування про те, як використовувати типи Python (навіть якщо ви не використовуєте FastAPI), перегляньте короткий підручник: [Типи Python](python-types.md). Ви пишете стандартний Python з типами: @@ -71,11 +71,11 @@ my_second_user: User = User(**second_user_data) /// -### Підтримка редакторів (IDE) { #editor-support } +### Підтримка редакторів { #editor-support } Увесь фреймворк спроєктовано так, щоб ним було легко та інтуїтивно користуватися; усі рішення тестувалися у кількох редакторах ще до початку розробки, щоб забезпечити найкращий досвід розробки. -З опитувань розробників Python зрозуміло що однією з найуживаніших функцій є «автодоповнення». +З опитувань розробників Python зрозуміло [що однією з найуживаніших функцій є «автодоповнення»](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features). Увесь фреймворк **FastAPI** побудований так, щоб це забезпечити. Автодоповнення працює всюди. @@ -83,11 +83,11 @@ my_second_user: User = User(**second_user_data) Ось як ваш редактор може вам допомогти: -* у Visual Studio Code: +* у [Visual Studio Code](https://code.visualstudio.com/): ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) -* у PyCharm: +* у [PyCharm](https://www.jetbrains.com/pycharm/): ![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png) @@ -124,7 +124,7 @@ FastAPI має розумні **налаштування за замовчува Підтримуються всі схеми безпеки, визначені в OpenAPI, включно з: * HTTP Basic. -* **OAuth2** (також із підтримкою **JWT tokens**). Перегляньте підручник: [OAuth2 із JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. +* **OAuth2** (також із підтримкою **JWT tokens**). Перегляньте підручник: [OAuth2 із JWT](tutorial/security/oauth2-jwt.md). * Ключі API в: * Заголовках. * Параметрах запиту. @@ -141,7 +141,7 @@ FastAPI містить надзвичайно просту у використа * Навіть залежності можуть мати власні залежності, утворюючи ієрархію або **«граф» залежностей**. * Усе **автоматично обробляється** фреймворком. * Усі залежності можуть вимагати дані із запитів і **розширювати обмеження операції шляху** та автоматичну документацію. -* **Автоматична валідація** навіть для параметрів *операції шляху*, визначених у залежностях. +* **Автоматична валідація** навіть для *операції шляху*, визначених у залежностях. * Підтримка складних систем автентифікації користувачів, **підключень до баз даних** тощо. * **Жодних компромісів** із базами даних, фронтендами тощо. Але проста інтеграція з усіма ними. @@ -159,13 +159,13 @@ FastAPI містить надзвичайно просту у використа ## Можливості Starlette { #starlette-features } -**FastAPI** повністю сумісний із (та побудований на основі) Starlette. Тому будь-який додатковий код Starlette, який ви маєте, також працюватиме. +**FastAPI** повністю сумісний із (та побудований на основі) [**Starlette**](https://www.starlette.dev/). Тому будь-який додатковий код Starlette, який ви маєте, також працюватиме. `FastAPI` фактично є підкласом `Starlette`. Тому, якщо ви вже знайомі зі Starlette або використовуєте його, більшість функціональності працюватиме так само. З **FastAPI** ви отримуєте всі можливості **Starlette** (адже FastAPI — це просто Starlette на стероїдах): -* Разюча продуктивність. Це один із найшвидших доступних Python-фреймворків, на рівні з **NodeJS** і **Go**. +* Разюча продуктивність. Це [один із найшвидших доступних Python-фреймворків, на рівні з **NodeJS** і **Go**](https://github.com/encode/starlette#performance). * Підтримка **WebSocket**. * Фонові задачі у процесі. * Події запуску та завершення роботи. @@ -177,7 +177,7 @@ FastAPI містить надзвичайно просту у використа ## Можливості Pydantic { #pydantic-features } -**FastAPI** повністю сумісний із (та побудований на основі) Pydantic. Тому будь-який додатковий код Pydantic, який ви маєте, також працюватиме. +**FastAPI** повністю сумісний із (та побудований на основі) [**Pydantic**](https://docs.pydantic.dev/). Тому будь-який додатковий код Pydantic, який ви маєте, також працюватиме. Включно із зовнішніми бібліотеками, які також базуються на Pydantic, як-от ORM-и, ODM-и для баз даних. diff --git a/docs/uk/docs/help-fastapi.md b/docs/uk/docs/help-fastapi.md index a98e56c260..152bf2e291 100644 --- a/docs/uk/docs/help-fastapi.md +++ b/docs/uk/docs/help-fastapi.md @@ -12,7 +12,7 @@ ## Підпишіться на розсилку { #subscribe-to-the-newsletter } -Ви можете підписатися на (нечасту) розсилку [**FastAPI and friends**](newsletter.md){.internal-link target=_blank}, щоб бути в курсі: +Ви можете підписатися на (нечасту) розсилку [**FastAPI and friends**](newsletter.md), щоб бути в курсі: * Новин про FastAPI та друзів 🚀 * Посібників 📝 @@ -22,17 +22,17 @@ ## Стежте за FastAPI в X (Twitter) { #follow-fastapi-on-x-twitter } -Стежте за @fastapi в **X (Twitter)**, щоб отримувати найсвіжіші новини про **FastAPI**. 🐦 +[Стежте за @fastapi в **X (Twitter)**](https://x.com/fastapi), щоб отримувати найсвіжіші новини про **FastAPI**. 🐦 ## Додайте зірочку **FastAPI** на GitHub { #star-fastapi-in-github } -Ви можете «поставити зірочку» FastAPI на GitHub (натиснувши кнопку зірочки у верхньому правому куті): https://github.com/fastapi/fastapi. ⭐️ +Ви можете «поставити зірочку» FastAPI на GitHub (натиснувши кнопку зірочки у верхньому правому куті): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). ⭐️ Додавши зірочку, іншим користувачам буде легше його знайти і побачити, що він уже був корисним для інших. ## Стежте за випусками в репозиторії GitHub { #watch-the-github-repository-for-releases } -Ви можете «спостерігати» за FastAPI на GitHub (натиснувши кнопку «watch» у верхньому правому куті): https://github.com/fastapi/fastapi. 👀 +Ви можете «спостерігати» за FastAPI на GitHub (натиснувши кнопку «watch» у верхньому правому куті): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀 Там ви можете вибрати «Releases only». @@ -40,45 +40,45 @@ ## Зв'яжіться з автором { #connect-with-the-author } -Ви можете зв'язатися зі мною (Sebastián Ramírez / `tiangolo`), автором. +Ви можете зв'язатися зі [мною (Sebastián Ramírez / `tiangolo`)](https://tiangolo.com), автором. Ви можете: -* Стежити за мною на **GitHub**. +* [Стежити за мною на **GitHub**](https://github.com/tiangolo). * Подивитися інші Open Source-проєкти, які я створив і які можуть вам допомогти. * Стежити, щоб бачити, коли я створюю новий Open Source-проєкт. -* Стежити за мною в **X (Twitter)** або Mastodon. +* [Стежити за мною в **X (Twitter)**](https://x.com/tiangolo) або [Mastodon](https://fosstodon.org/@tiangolo). * Розкажіть мені, як ви використовуєте FastAPI (мені дуже приємно це чути). * Дізнаватися, коли я роблю оголошення або випускаю нові інструменти. - * Також ви можете стежити за @fastapi в X (Twitter) (окремий акаунт). -* Стежити за мною в **LinkedIn**. + * Також ви можете [стежити за @fastapi в X (Twitter)](https://x.com/fastapi) (окремий акаунт). +* [Стежити за мною в **LinkedIn**](https://www.linkedin.com/in/tiangolo/). * Дізнаватися, коли я роблю оголошення або випускаю нові інструменти (хоча X (Twitter) я використовую частіше 🤷‍♂). -* Читати, що я пишу (або стежити за мною) на **Dev.to** або **Medium**. +* Читати, що я пишу (або стежити за мною) на [**Dev.to**](https://dev.to/tiangolo) або [**Medium**](https://medium.com/@tiangolo). * Читати інші ідеї, статті та про інструменти, які я створив. * Стежити, щоб читати нове, коли я щось публікую. ## Твітніть про **FastAPI** { #tweet-about-fastapi } -Твітніть про **FastAPI** і дайте мені та іншим знати, чому він вам подобається. 🎉 +[Твітніть про **FastAPI**](https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi) і дайте мені та іншим знати, чому він вам подобається. 🎉 Мені дуже подобається дізнаватися, як використовують **FastAPI**, що вам у ньому сподобалося, у якому проєкті/компанії ви його застосовуєте тощо. ## Голосуйте за FastAPI { #vote-for-fastapi } -* Проголосуйте за **FastAPI** на Slant. -* Проголосуйте за **FastAPI** на AlternativeTo. -* Повідомте, що ви використовуєте **FastAPI**, на StackShare. +* [Проголосуйте за **FastAPI** на Slant](https://www.slant.co/options/34241/~fastapi-review). +* [Проголосуйте за **FastAPI** на AlternativeTo](https://alternativeto.net/software/fastapi/about/). +* [Повідомте, що ви використовуєте **FastAPI**, на StackShare](https://stackshare.io/pypi-fastapi). ## Допомагайте іншим з питаннями на GitHub { #help-others-with-questions-in-github } Ви можете спробувати допомагати іншим з їхніми питаннями у: -* GitHub Discussions -* GitHub Issues +* [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered) +* [GitHub Issues](https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+) У багатьох випадках ви вже можете знати відповідь на ці питання. 🤓 -Якщо ви багато допомагаєте людям із їхніми питаннями, ви станете офіційним [Експертом FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}. 🎉 +Якщо ви багато допомагаєте людям із їхніми питаннями, ви станете офіційним [Експертом FastAPI](fastapi-people.md#fastapi-experts). 🎉 Пам'ятайте, найважливіше: намагайтеся бути добрими. Люди приходять зі своєю фрустрацією і часто питають не найкращим чином, але постарайтеся бути якомога доброзичливішими. 🤗 @@ -104,7 +104,7 @@ Часто вони наводять лише фрагмент коду, але цього недостатньо, щоб **відтворити проблему**. -* Ви можете попросити надати мінімальний, відтворюваний приклад, який ви зможете **скопіювати-вставити** і запустити локально, щоб побачити ту саму помилку або поведінку, яку бачать вони, або краще зрозуміти їхній варіант використання. +* Ви можете попросити надати [мінімальний, відтворюваний приклад](https://stackoverflow.com/help/minimal-reproducible-example), який ви зможете **скопіювати-вставити** і запустити локально, щоб побачити ту саму помилку або поведінку, яку бачать вони, або краще зрозуміти їхній варіант використання. * Якщо ви дуже щедрі, можете спробувати **створити такий приклад** самостійно, лише на основі опису проблеми. Просто майте на увазі, що це може зайняти багато часу, і краще спочатку попросити їх уточнити проблему. @@ -125,7 +125,7 @@ ## Стежте за репозиторієм GitHub { #watch-the-github-repository } -Ви можете «спостерігати» за FastAPI на GitHub (натиснувши кнопку «watch» у верхньому правому куті): https://github.com/fastapi/fastapi. 👀 +Ви можете «спостерігати» за FastAPI на GitHub (натиснувши кнопку «watch» у верхньому правому куті): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀 Якщо вибрати «Watching» замість «Releases only», ви отримуватимете сповіщення, коли хтось створює нове issue або питання. Ви також можете вказати, що хочете отримувати сповіщення лише про нові issues, або discussions, або PR тощо. @@ -133,7 +133,7 @@ ## Ставте питання { #ask-questions } -Ви можете створити нове питання у репозиторії GitHub, наприклад, щоб: +Ви можете [створити нове питання](https://github.com/fastapi/fastapi/discussions/new?category=questions) у репозиторії GitHub, наприклад, щоб: * Поставити **питання** або запитати про **проблему**. * Запропонувати нову **можливість**. @@ -170,7 +170,7 @@ * Потім залиште **коментар**, що ви це зробили, так я знатиму, що ви справді перевірили. -/// info | Інформація +/// info На жаль, я не можу просто довіряти PR, які мають кілька схвалень. @@ -196,12 +196,12 @@ ## Створіть запит на витяг { #create-a-pull-request } -Ви можете [зробити внесок](contributing.md){.internal-link target=_blank} у вихідний код із запитами на витяг, наприклад: +Ви можете [зробити внесок](contributing.md) у вихідний код із запитами на витяг, наприклад: * Щоб виправити описку, знайдену в документації. -* Щоб поділитися статтею, відео або подкастом про FastAPI, який ви створили або знайшли, відредагувавши цей файл. +* Щоб поділитися статтею, відео або подкастом про FastAPI, який ви створили або знайшли, [відредагувавши цей файл](https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml). * Обов'язково додайте ваше посилання на початок відповідного розділу. -* Щоб допомогти [перекласти документацію](contributing.md#translations){.internal-link target=_blank} вашою мовою. +* Щоб допомогти [перекласти документацію](contributing.md#translations) вашою мовою. * Ви також можете допомогти з переглядом перекладів, створених іншими. * Щоб запропонувати нові розділи документації. * Щоб виправити наявну проблему/помилку. @@ -218,8 +218,8 @@ Основні завдання, які ви можете виконувати вже зараз: -* [Допомагайте іншим з питаннями на GitHub](#help-others-with-questions-in-github){.internal-link target=_blank} (див. розділ вище). -* [Переглядайте запити на витяг](#review-pull-requests){.internal-link target=_blank} (див. розділ вище). +* [Допомагайте іншим з питаннями на GitHub](#help-others-with-questions-in-github) (див. розділ вище). +* [Переглядайте запити на витяг](#review-pull-requests) (див. розділ вище). Ці два завдання **найбільше споживають час**. Це основна робота з підтримки FastAPI. @@ -227,11 +227,11 @@ ## Долучайтеся до чату { #join-the-chat } -Долучайтеся до 👥 серверу чату Discord 👥 і спілкуйтеся з іншими в спільноті FastAPI. +Долучайтеся до 👥 [серверу чату Discord](https://discord.gg/VQjSZaeJmf) 👥 і спілкуйтеся з іншими в спільноті FastAPI. -/// tip | Порада +/// tip -Для запитань ставте їх у GitHub Discussions, там значно вища ймовірність, що вам допоможуть [Експерти FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}. +Для запитань ставте їх у [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/new?category=questions), там значно вища ймовірність, що вам допоможуть [Експерти FastAPI](fastapi-people.md#fastapi-experts). Використовуйте чат лише для інших загальних розмов. @@ -243,13 +243,13 @@ У GitHub шаблон підкаже вам, як написати правильне питання, щоб ви легше отримали хорошу відповідь, або навіть вирішили проблему самостійно ще до запиту. І в GitHub я можу гарантувати, що завжди на все відповім, навіть якщо це займе трохи часу. Особисто я не можу робити це в чатах. 😅 -Розмови в чатах також не так просто шукати, як у GitHub, тож питання та відповіді можуть загубитися. І лише ті, що в GitHub, зараховуються, щоб стати [Експертом FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}, тож швидше за все ви отримаєте більше уваги саме в GitHub. +Розмови в чатах також не так просто шукати, як у GitHub, тож питання та відповіді можуть загубитися. І лише ті, що в GitHub, зараховуються, щоб стати [Експертом FastAPI](fastapi-people.md#fastapi-experts), тож швидше за все ви отримаєте більше уваги саме в GitHub. З іншого боку, у чатах є тисячі користувачів, тож дуже ймовірно, що ви майже завжди знайдете там співрозмовника. 😄 ## Спонсоруйте автора { #sponsor-the-author } -Якщо ваш **продукт/компанія** залежить від **FastAPI** або пов'язана з ним і ви хочете охопити його користувачів, ви можете спонсорувати автора (мене) через GitHub sponsors. Залежно від рівня ви можете отримати додаткові переваги, наприклад значок у документації. 🎁 +Якщо ваш **продукт/компанія** залежить від **FastAPI** або пов'язана з ним і ви хочете охопити його користувачів, ви можете спонсорувати автора (мене) через [GitHub sponsors](https://github.com/sponsors/tiangolo). Залежно від рівня ви можете отримати додаткові переваги, наприклад значок у документації. 🎁 --- diff --git a/docs/uk/docs/history-design-future.md b/docs/uk/docs/history-design-future.md index 1897807c84..621885904a 100644 --- a/docs/uk/docs/history-design-future.md +++ b/docs/uk/docs/history-design-future.md @@ -1,6 +1,6 @@ # Історія, проєктування і майбутнє { #history-design-and-future } -Деякий час тому користувач **FastAPI** запитав: +Деякий час тому [користувач **FastAPI** запитав](https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920): > Яка історія цього проєкту? Здається, він нізвідки за кілька тижнів став чудовим [...] @@ -14,7 +14,7 @@ Історія **FastAPI** значною мірою - це історія його попередників. -Як сказано в розділі [Альтернативи](alternatives.md){.internal-link target=_blank}: +Як сказано в розділі [Альтернативи](alternatives.md):
@@ -44,7 +44,7 @@ Я протестував кілька ідей у найпопулярніших Python-редакторах: PyCharm, VS Code, редакторах на основі Jedi. -За даними Python Developer Survey, це охоплює близько 80% користувачів. +За даними [Python Developer Survey](https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools), це охоплює близько 80% користувачів. Це означає, що **FastAPI** спеціально тестувався з редакторами, якими користуються 80% розробників Python. І оскільки більшість інших редакторів працюють подібно, усі ці переваги мають працювати практично у всіх редакторах. @@ -54,11 +54,11 @@ ## Вимоги { #requirements } -Після перевірки кількох альтернатив я вирішив використовувати **Pydantic** через його переваги. +Після перевірки кількох альтернатив я вирішив використовувати [**Pydantic**](https://docs.pydantic.dev/) через його переваги. Потім я зробив внески до нього, щоб зробити його повністю сумісним із Схемою JSON, додати підтримку різних способів оголошення обмежень і поліпшити підтримку редакторів (перевірки типів, автодоповнення) на основі тестів у кількох редакторах. -Під час розробки я також зробив внески до **Starlette**, іншої ключової залежності. +Під час розробки я також зробив внески до [**Starlette**](https://www.starlette.dev/), іншої ключової залежності. ## Розробка { #development } @@ -76,4 +76,4 @@ **FastAPI** має велике майбутнє. -І [ваша допомога](help-fastapi.md){.internal-link target=_blank} дуже цінується. +І [ваша допомога](help-fastapi.md) дуже цінується. diff --git a/docs/uk/docs/how-to/authentication-error-status-code.md b/docs/uk/docs/how-to/authentication-error-status-code.md index 58016f261b..d670713711 100644 --- a/docs/uk/docs/how-to/authentication-error-status-code.md +++ b/docs/uk/docs/how-to/authentication-error-status-code.md @@ -2,7 +2,7 @@ До версії FastAPI `0.122.0`, коли інтегровані засоби безпеки повертали клієнту помилку після невдалої автентифікації, вони використовували HTTP код статусу `403 Forbidden`. -Починаючи з версії FastAPI `0.122.0`, вони використовують більш доречний HTTP код статусу `401 Unauthorized` і повертають змістовний заголовок `WWW-Authenticate` у відповіді, відповідно до специфікацій HTTP, RFC 7235, RFC 9110. +Починаючи з версії FastAPI `0.122.0`, вони використовують більш доречний HTTP код статусу `401 Unauthorized` і повертають змістовний заголовок `WWW-Authenticate` у відповіді, відповідно до специфікацій HTTP, [RFC 7235](https://datatracker.ietf.org/doc/html/rfc7235#section-3.1), [RFC 9110](https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized). Але якщо з якоїсь причини ваші клієнти залежать від старої поведінки, ви можете повернутися до неї, переписавши метод `make_not_authenticated_error` у ваших класах безпеки. diff --git a/docs/uk/docs/how-to/conditional-openapi.md b/docs/uk/docs/how-to/conditional-openapi.md index f8bbaa6498..80c22eeb5d 100644 --- a/docs/uk/docs/how-to/conditional-openapi.md +++ b/docs/uk/docs/how-to/conditional-openapi.md @@ -4,13 +4,13 @@ ## Про безпеку, API та документацію { #about-security-apis-and-docs } -Приховування інтерфейсів документації у продукційному середовищі *не має* бути способом захисту вашого API. +Приховування інтерфейсів документації у продукційному середовищі не має бути способом захисту вашого API. -Це не додає жодної додаткової безпеки вашому API, *операції шляху* й надалі будуть доступні там, де вони є. +Це не додає жодної додаткової безпеки вашому API, операції шляху й надалі будуть доступні там, де вони є. Якщо у вашому коді є вразливість, вона залишиться. -Приховування документації лише ускладнює розуміння того, як взаємодіяти з вашим API, і може ускладнити для вас його налагодження у продакшні. Це можна вважати просто формою Безпека через неясність. +Приховування документації лише ускладнює розуміння того, як взаємодіяти з вашим API, і може ускладнити для вас його налагодження у продакшні. Це можна вважати просто формою [Безпека через неясність](https://en.wikipedia.org/wiki/Security_through_obscurity). Якщо ви хочете захистити ваш API, є кілька кращих дій, які ви можете зробити, наприклад: diff --git a/docs/uk/docs/how-to/configure-swagger-ui.md b/docs/uk/docs/how-to/configure-swagger-ui.md index f8c4470dfa..5fe47d12e6 100644 --- a/docs/uk/docs/how-to/configure-swagger-ui.md +++ b/docs/uk/docs/how-to/configure-swagger-ui.md @@ -1,6 +1,6 @@ # Налаштуйте Swagger UI { #configure-swagger-ui } -Ви можете налаштувати додаткові параметри Swagger UI. +Ви можете налаштувати додаткові [параметри Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/). Щоб їх налаштувати, передайте аргумент `swagger_ui_parameters` під час створення об’єкта додатка `FastAPI()` або до функції `get_swagger_ui_html()`. @@ -50,7 +50,7 @@ FastAPI містить деякі параметри конфігурації з ## Інші параметри Swagger UI { #other-swagger-ui-parameters } -Щоб побачити всі можливі налаштування, які ви можете використовувати, прочитайте офіційну документацію щодо параметрів Swagger UI. +Щоб побачити всі можливі налаштування, які ви можете використовувати, прочитайте офіційну [документацію щодо параметрів Swagger UI](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/). ## Налаштування лише для JavaScript { #javascript-only-settings } diff --git a/docs/uk/docs/how-to/custom-docs-ui-assets.md b/docs/uk/docs/how-to/custom-docs-ui-assets.md index faea3ccc4a..f8a4f99662 100644 --- a/docs/uk/docs/how-to/custom-docs-ui-assets.md +++ b/docs/uk/docs/how-to/custom-docs-ui-assets.md @@ -54,7 +54,7 @@ Swagger UI впорається з цим «за лаштунками», але ### Перевірте { #test-it } -Тепер ви маєте змогу відкрити документацію за http://127.0.0.1:8000/docs і перезавантажити сторінку, вона завантажить ці ресурси з нового CDN. +Тепер ви маєте змогу відкрити документацію за [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) і перезавантажити сторінку, вона завантажить ці ресурси з нового CDN. ## Самохостинг JavaScript і CSS для документації { #self-hosting-javascript-and-css-for-docs } @@ -93,12 +93,12 @@ Swagger UI впорається з цим «за лаштунками», але **Swagger UI** використовує файли: -- `swagger-ui-bundle.js` -- `swagger-ui.css` +- [`swagger-ui-bundle.js`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js) +- [`swagger-ui.css`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css) А **ReDoc** використовує файл: -- `redoc.standalone.js` +- [`redoc.standalone.js`](https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js) Після цього ваша структура файлів може виглядати так: @@ -122,7 +122,7 @@ Swagger UI впорається з цим «за лаштунками», але ### Перевірте статичні файли { #test-the-static-files } -Запустіть ваш застосунок і перейдіть до http://127.0.0.1:8000/static/redoc.standalone.js. +Запустіть ваш застосунок і перейдіть до [http://127.0.0.1:8000/static/redoc.standalone.js](http://127.0.0.1:8000/static/redoc.standalone.js). Ви маєте побачити дуже довгий файл JavaScript для **ReDoc**. @@ -180,6 +180,6 @@ Swagger UI впорається з цим «за лаштунками», але ### Перевірте UI зі статичними файлами { #test-static-files-ui } -Тепер ви маєте змогу вимкнути WiFi, відкрити документацію за http://127.0.0.1:8000/docs і перезавантажити сторінку. +Тепер ви маєте змогу вимкнути WiFi, відкрити документацію за [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) і перезавантажити сторінку. І навіть без Інтернету ви зможете побачити документацію для вашого API і взаємодіяти з ним. diff --git a/docs/uk/docs/how-to/custom-request-and-route.md b/docs/uk/docs/how-to/custom-request-and-route.md index 9f21da7a86..6a46b57239 100644 --- a/docs/uk/docs/how-to/custom-request-and-route.md +++ b/docs/uk/docs/how-to/custom-request-and-route.md @@ -18,7 +18,7 @@ Деякі варіанти використання: -- Перетворення не-JSON тіл запитів на JSON (наприклад, `msgpack`). +- Перетворення не-JSON тіл запитів на JSON (наприклад, [`msgpack`](https://msgpack.org/index.html)). - Розпакування тіл запитів, стиснених gzip. - Автоматичне логування всіх тіл запитів. @@ -32,7 +32,7 @@ /// tip | Порада -Це навчальний приклад, щоб продемонструвати принцип роботи. Якщо вам потрібна підтримка Gzip, скористайтеся вбудованим [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware){.internal-link target=_blank}. +Це навчальний приклад, щоб продемонструвати принцип роботи. Якщо вам потрібна підтримка Gzip, скористайтеся вбудованим [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware). /// @@ -66,7 +66,7 @@ І саме ці дві сутності - `scope` та `receive` - потрібні для створення нового екземпляра `Request`. -Щоб дізнатися більше про `Request`, перегляньте документацію Starlette про запити. +Щоб дізнатися більше про `Request`, перегляньте [документацію Starlette про запити](https://www.starlette.dev/requests/). /// @@ -82,7 +82,7 @@ /// tip | Порада -Щоб розв’язати це саме завдання, скоріш за все, простіше використати `body` у користувацькому обробнику `RequestValidationError` ([Обробка помилок](../tutorial/handling-errors.md#use-the-requestvalidationerror-body){.internal-link target=_blank}). +Щоб розв’язати це саме завдання, скоріш за все, простіше використати `body` у користувацькому обробнику `RequestValidationError` ([Обробка помилок](../tutorial/handling-errors.md#use-the-requestvalidationerror-body)). Але цей приклад усе ще корисний і показує, як взаємодіяти з внутрішніми компонентами. diff --git a/docs/uk/docs/how-to/extending-openapi.md b/docs/uk/docs/how-to/extending-openapi.md index 1597cbc762..fcd0982a9d 100644 --- a/docs/uk/docs/how-to/extending-openapi.md +++ b/docs/uk/docs/how-to/extending-openapi.md @@ -37,7 +37,7 @@ Використовуючи наведене вище, ви можете скористатися тією ж утилітарною функцією для генерації схеми OpenAPI і переписати потрібні частини. -Наприклад, додаймо розширення OpenAPI для ReDoc для додавання власного логотипа. +Наприклад, додаймо [розширення OpenAPI ReDoc для додавання власного логотипа](https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo). ### Звичайний **FastAPI** { #normal-fastapi } @@ -75,6 +75,6 @@ ### Перевірте { #check-it } -Коли ви перейдете за адресою http://127.0.0.1:8000/redoc, побачите, що використовується ваш власний логотип (у цьому прикладі логотип **FastAPI**): +Коли ви перейдете за адресою [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc), побачите, що використовується ваш власний логотип (у цьому прикладі логотип **FastAPI**): diff --git a/docs/uk/docs/how-to/general.md b/docs/uk/docs/how-to/general.md index f33ae195c6..75761dff53 100644 --- a/docs/uk/docs/how-to/general.md +++ b/docs/uk/docs/how-to/general.md @@ -4,36 +4,40 @@ ## Фільтрування даних - Безпека { #filter-data-security } -Щоб гарантувати, що ви не повертаєте більше даних, ніж слід, прочитайте документацію [Навчальний посібник - Модель відповіді - Тип повернення](../tutorial/response-model.md){.internal-link target=_blank}. +Щоб гарантувати, що ви не повертаєте більше даних, ніж слід, прочитайте документацію [Навчальний посібник - Модель відповіді - Тип повернення](../tutorial/response-model.md). + +## Оптимізувати продуктивність відповіді - Модель відповіді - Тип повернення { #optimize-response-performance-response-model-return-type } + +Щоб оптимізувати продуктивність під час повернення даних JSON, використовуйте тип повернення або модель відповіді, таким чином Pydantic виконуватиме серіалізацію в JSON на боці Rust, без проходження через Python. Докладніше читайте в документації [Навчальний посібник - Модель відповіді - Тип повернення](../tutorial/response-model.md). ## Мітки документації - OpenAPI { #documentation-tags-openapi } -Щоб додати мітки до ваших *операцій шляху* та згрупувати їх в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Мітки](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank}. +Щоб додати мітки до ваших *операцій шляху* та згрупувати їх в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Мітки](../tutorial/path-operation-configuration.md#tags). ## Короткий опис і опис - OpenAPI { #documentation-summary-and-description-openapi } -Щоб додати короткий опис і опис до ваших *операцій шляху* і показати їх в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Короткий опис і опис](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank}. +Щоб додати короткий опис і опис до ваших *операцій шляху* і показати їх в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Короткий опис і опис](../tutorial/path-operation-configuration.md#summary-and-description). ## Опис відповіді в документації - OpenAPI { #documentation-response-description-openapi } -Щоб визначити опис відповіді, що відображається в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Опис відповіді](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank}. +Щоб визначити опис відповіді, що відображається в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Опис відповіді](../tutorial/path-operation-configuration.md#response-description). ## Позначити застарілою *операцію шляху* - OpenAPI { #documentation-deprecate-a-path-operation-openapi } -Щоб позначити *операцію шляху* як застарілу і показати це в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Позначення як застаріле](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank}. +Щоб позначити *операцію шляху* як застарілу і показати це в інтерфейсі документації, прочитайте документацію [Навчальний посібник - Налаштування операції шляху - Позначення як застаріле](../tutorial/path-operation-configuration.md#deprecate-a-path-operation). ## Перетворити будь-які дані на сумісні з JSON { #convert-any-data-to-json-compatible } -Щоб перетворити будь-які дані на сумісні з JSON, прочитайте документацію [Навчальний посібник - Кодувальник, сумісний з JSON](../tutorial/encoder.md){.internal-link target=_blank}. +Щоб перетворити будь-які дані на сумісні з JSON, прочитайте документацію [Навчальний посібник - Кодувальник, сумісний з JSON](../tutorial/encoder.md). ## Метадані OpenAPI - Документація { #openapi-metadata-docs } -Щоб додати метадані до вашої схеми OpenAPI, зокрема ліцензію, версію, контактні дані тощо, прочитайте документацію [Навчальний посібник - Метадані та URL документації](../tutorial/metadata.md){.internal-link target=_blank}. +Щоб додати метадані до вашої схеми OpenAPI, зокрема ліцензію, версію, контактні дані тощо, прочитайте документацію [Навчальний посібник - Метадані та URL документації](../tutorial/metadata.md). ## Власний URL OpenAPI { #openapi-custom-url } -Щоб налаштувати URL OpenAPI (або прибрати його), прочитайте документацію [Навчальний посібник - Метадані та URL документації](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}. +Щоб налаштувати URL OpenAPI (або прибрати його), прочитайте документацію [Навчальний посібник - Метадані та URL документації](../tutorial/metadata.md#openapi-url). ## URL документації OpenAPI { #openapi-docs-urls } -Щоб оновити URL, які використовуються для автоматично згенерованих інтерфейсів користувача документації, прочитайте документацію [Навчальний посібник - Метадані та URL документації](../tutorial/metadata.md#docs-urls){.internal-link target=_blank}. +Щоб оновити URL, які використовуються для автоматично згенерованих інтерфейсів користувача документації, прочитайте документацію [Навчальний посібник - Метадані та URL документації](../tutorial/metadata.md#docs-urls). diff --git a/docs/uk/docs/how-to/graphql.md b/docs/uk/docs/how-to/graphql.md index 2d0e355ea4..c070c7e0cd 100644 --- a/docs/uk/docs/how-to/graphql.md +++ b/docs/uk/docs/how-to/graphql.md @@ -18,18 +18,18 @@ GraphQL розв’язує деякі дуже специфічні сцена Ось деякі бібліотеки GraphQL з підтримкою ASGI. Ви можете використовувати їх із FastAPI: -* Strawberry 🍓 - * З документацією для FastAPI -* Ariadne - * З документацією для FastAPI -* Tartiflette - * З Tartiflette ASGI для інтеграції з ASGI -* Graphene - * З starlette-graphene3 +* [Strawberry](https://strawberry.rocks/) 🍓 + * З [документацією для FastAPI](https://strawberry.rocks/docs/integrations/fastapi) +* [Ariadne](https://ariadnegraphql.org/) + * З [документацією для FastAPI](https://ariadnegraphql.org/docs/fastapi-integration) +* [Tartiflette](https://tartiflette.io/) + * З [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) для інтеграції з ASGI +* [Graphene](https://graphene-python.org/) + * З [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3) ## GraphQL зі Strawberry { #graphql-with-strawberry } -Якщо вам потрібен або ви хочете використовувати GraphQL, Strawberry - рекомендована бібліотека, адже її дизайн найближчий до дизайну FastAPI; усе базується на анотаціях типів. +Якщо вам потрібен або ви хочете використовувати GraphQL, [Strawberry](https://strawberry.rocks/) - рекомендована бібліотека, адже її дизайн найближчий до дизайну FastAPI; усе базується на анотаціях типів. Залежно від вашого сценарію використання ви можете надати перевагу іншій бібліотеці, але якби ви запитали мене, я, ймовірно, порадив би спробувати Strawberry. @@ -37,24 +37,24 @@ GraphQL розв’язує деякі дуже специфічні сцена {* ../../docs_src/graphql_/tutorial001_py310.py hl[3,22,25] *} -Більше про Strawberry ви можете дізнатися в документації Strawberry. +Більше про Strawberry ви можете дізнатися в [документації Strawberry](https://strawberry.rocks/). -І також документацію про Strawberry з FastAPI. +І також [документацію про Strawberry з FastAPI](https://strawberry.rocks/docs/integrations/fastapi). ## Застарілий `GraphQLApp` зі Starlette { #older-graphqlapp-from-starlette } -Попередні версії Starlette містили клас `GraphQLApp` для інтеграції з Graphene. +Попередні версії Starlette містили клас `GraphQLApp` для інтеграції з [Graphene](https://graphene-python.org/). -Його вилучено з Starlette як застарілий, але якщо у вас є код, що його використовував, ви можете легко мігрувати на starlette-graphene3, який покриває той самий сценарій використання та має майже ідентичний інтерфейс. +Його вилучено з Starlette як застарілий, але якщо у вас є код, що його використовував, ви можете легко мігрувати на [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3), який покриває той самий сценарій використання та має майже ідентичний інтерфейс. /// tip | Порада -Якщо вам потрібен GraphQL, я все ж рекомендую звернути увагу на Strawberry, адже він базується на анотаціях типів, а не на власних класах і типах. +Якщо вам потрібен GraphQL, я все ж рекомендую звернути увагу на [Strawberry](https://strawberry.rocks/), адже він базується на анотаціях типів, а не на власних класах і типах. /// ## Дізнайтеся більше { #learn-more } -Ви можете дізнатися більше про GraphQL в офіційній документації GraphQL. +Ви можете дізнатися більше про GraphQL в [офіційній документації GraphQL](https://graphql.org/). Також ви можете почитати більше про кожну з цих бібліотек за наведеними посиланнями. diff --git a/docs/uk/docs/how-to/index.md b/docs/uk/docs/how-to/index.md index ac2dd16eb9..db72181a35 100644 --- a/docs/uk/docs/how-to/index.md +++ b/docs/uk/docs/how-to/index.md @@ -8,6 +8,6 @@ /// tip | Порада -Якщо ви хочете **вивчити FastAPI** у структурований спосіб (рекомендується), натомість прочитайте [Навчальний посібник - Посібник користувача](../tutorial/index.md){.internal-link target=_blank} розділ за розділом. +Якщо ви хочете **вивчити FastAPI** у структурований спосіб (рекомендується), натомість прочитайте [Навчальний посібник - Посібник користувача](../tutorial/index.md) розділ за розділом. /// diff --git a/docs/uk/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/uk/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md index 0f5d1c924e..c5519b98d8 100644 --- a/docs/uk/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md +++ b/docs/uk/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md @@ -22,7 +22,7 @@ FastAPI 0.126.0 припинив підтримку Pydantic v1, водноча ## Офіційний посібник { #official-guide } -У Pydantic є офіційний Посібник з міграції з v1 на v2. +У Pydantic є офіційний [Посібник з міграції](https://docs.pydantic.dev/latest/migration/) з v1 на v2. Там описано, що змінилося, як перевірки тепер стали коректнішими та суворішими, можливі застереження тощо. @@ -30,7 +30,7 @@ FastAPI 0.126.0 припинив підтримку Pydantic v1, водноча ## Тести { #tests } -Переконайтеся, що у вашій програмі є [тести](../tutorial/testing.md){.internal-link target=_blank} і що ви запускаєте їх у системі безперервної інтеграції (CI). +Переконайтеся, що у вашій програмі є [тести](../tutorial/testing.md) і що ви запускаєте їх у системі безперервної інтеграції (CI). Так ви зможете виконати оновлення і впевнитися, що все працює як очікується. @@ -38,7 +38,7 @@ FastAPI 0.126.0 припинив підтримку Pydantic v1, водноча У багатьох випадках, якщо ви використовуєте звичайні моделі Pydantic без налаштувань, більшу частину процесу міграції з Pydantic v1 на Pydantic v2 можна автоматизувати. -Ви можете скористатися `bump-pydantic` від тієї ж команди Pydantic. +Ви можете скористатися [`bump-pydantic`](https://github.com/pydantic/bump-pydantic) від тієї ж команди Pydantic. Цей інструмент допоможе автоматично змінити більшість коду, який потрібно змінити. diff --git a/docs/uk/docs/how-to/testing-database.md b/docs/uk/docs/how-to/testing-database.md index 2e6b21ced0..0f12b9d529 100644 --- a/docs/uk/docs/how-to/testing-database.md +++ b/docs/uk/docs/how-to/testing-database.md @@ -1,7 +1,7 @@ # Тестування бази даних { #testing-a-database } -Ви можете ознайомитися з базами даних, SQL і SQLModel у документації SQLModel. 🤓 +Ви можете ознайомитися з базами даних, SQL і SQLModel у [документації SQLModel](https://sqlmodel.tiangolo.com/). 🤓 -Є невеликий навчальний посібник про використання SQLModel з FastAPI. ✨ +Є невеликий [навчальний посібник про використання SQLModel з FastAPI](https://sqlmodel.tiangolo.com/tutorial/fastapi/). ✨ -Цей навчальний посібник містить розділ про тестування баз даних SQL. 😎 +Цей навчальний посібник містить розділ про [тестування баз даних SQL](https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/). 😎 diff --git a/docs/uk/docs/index.md b/docs/uk/docs/index.md index 0a6788502a..06bf865d92 100644 --- a/docs/uk/docs/index.md +++ b/docs/uk/docs/index.md @@ -11,25 +11,25 @@ Фреймворк FastAPI - це висока продуктивність, легко вивчати, швидко писати код, готовий до продакшину

- + Test - + Coverage - + Package version - + Supported Python versions

--- -**Документація**: https://fastapi.tiangolo.com +**Документація**: [https://fastapi.tiangolo.com](https://fastapi.tiangolo.com/uk) -**Вихідний код**: https://github.com/fastapi/fastapi +**Вихідний код**: [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi) --- @@ -44,7 +44,7 @@ FastAPI - це сучасний, швидкий (високопродуктив * **Простий**: спроєктований так, щоб бути простим у використанні та вивченні. Менше часу на читання документації. * **Короткий**: мінімізує дублювання коду. Кілька можливостей з кожного оголошення параметра. Менше помилок. * **Надійний**: ви отримуєте код, готовий до продакшину. З автоматичною інтерактивною документацією. -* **Заснований на стандартах**: базується на (і повністю сумісний з) відкритими стандартами для API: OpenAPI (раніше відомий як Swagger) та JSON Schema. +* **Заснований на стандартах**: базується на (і повністю сумісний з) відкритими стандартами для API: [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (раніше відомий як Swagger) та [JSON Schema](https://json-schema.org/). * оцінка на основі тестів, проведених внутрішньою командою розробників, що створює продакшн-застосунки. @@ -55,51 +55,51 @@ FastAPI - це сучасний, швидкий (високопродуктив ### Ключовий спонсор { #keystone-sponsor } {% for sponsor in sponsors.keystone -%} - + {% endfor -%} ### Золоті та срібні спонсори { #gold-and-silver-sponsors } {% for sponsor in sponsors.gold -%} - + {% endfor -%} {%- for sponsor in sponsors.silver -%} - + {% endfor %} -Інші спонсори +[Інші спонсори](https://fastapi.tiangolo.com/uk/fastapi-people/#sponsors) ## Враження { #opinions } "_[...] I'm using **FastAPI** a ton these days. [...] I'm actually planning to use it for all of my team's **ML services at Microsoft**. Some of them are getting integrated into the core **Windows** product and some **Office** products._" -
Kabir Khan - Microsoft (ref)
+
Kabir Khan - Microsoft (ref)
--- "_We adopted the **FastAPI** library to spawn a **REST** server that can be queried to obtain **predictions**. [for Ludwig]_" -
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
+
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
--- "_**Netflix** is pleased to announce the open-source release of our **crisis management** orchestration framework: **Dispatch**! [built with **FastAPI**]_" -
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
+
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
--- "_I’m over the moon excited about **FastAPI**. It’s so fun!_" -
Brian Okken - Python Bytes podcast host (ref)
+
Brian Okken - [Python Bytes](https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855) podcast host (ref)
--- "_Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted **Hug** to be - it's really inspiring to see someone build that._" -
Timothy Crosley - Hug creator (ref)
+
Timothy Crosley - [Hug](https://github.com/hugapi/hug) creator (ref)
--- @@ -107,27 +107,27 @@ FastAPI - це сучасний, швидкий (високопродуктив "_We've switched over to **FastAPI** for our **APIs** [...] I think you'll like it [...]_" -
Ines Montani - Matthew Honnibal - Explosion AI founders - spaCy creators (ref) - (ref)
+
Ines Montani - Matthew Honnibal - [Explosion AI](https://explosion.ai) founders - [spaCy](https://spacy.io) creators (ref) - (ref)
--- "_If anyone is looking to build a production Python API, I would highly recommend **FastAPI**. It is **beautifully designed**, **simple to use** and **highly scalable**, it has become a **key component** in our API first development strategy and is driving many automations and services such as our Virtual TAC Engineer._" -
Deon Pillsbury - Cisco (ref)
+
Deon Pillsbury - Cisco (ref)
--- ## Міні-документальний фільм про FastAPI { #fastapi-mini-documentary } -Наприкінці 2025 року вийшов міні-документальний фільм про FastAPI, ви можете переглянути його онлайн: +Наприкінці 2025 року вийшов [міні-документальний фільм про FastAPI](https://www.youtube.com/watch?v=mpR8ngthqiE), ви можете переглянути його онлайн: -FastAPI Mini Documentary +FastAPI Mini Documentary ## **Typer**, FastAPI для CLI { #typer-the-fastapi-of-clis } - + -Якщо ви створюєте застосунок CLI для використання в терміналі замість веб-API, зверніть увагу на **Typer**. +Якщо ви створюєте застосунок CLI для використання в терміналі замість веб-API, зверніть увагу на [**Typer**](https://typer.tiangolo.com/). **Typer** - молодший брат FastAPI. І його задумано як **FastAPI для CLI**. ⌨️ 🚀 @@ -135,12 +135,12 @@ FastAPI - це сучасний, швидкий (високопродуктив FastAPI стоїть на плечах гігантів: -* Starlette для вебчастини. -* Pydantic для частини даних. +* [Starlette](https://www.starlette.dev/) для вебчастини. +* [Pydantic](https://docs.pydantic.dev/) для частини даних. ## Встановлення { #installation } -Створіть і активуйте віртуальне середовище, а потім встановіть FastAPI: +Створіть і активуйте [віртуальне середовище](https://fastapi.tiangolo.com/uk/virtual-environments/), а потім встановіть FastAPI:
@@ -199,7 +199,7 @@ async def read_item(item_id: int, q: str | None = None): **Примітка**: -Якщо ви не знаєте, перегляньте розділ _"In a hurry?"_ про `async` та `await` у документації. +Якщо ви не знаєте, перегляньте розділ _"In a hurry?"_ про [`async` та `await` у документації](https://fastapi.tiangolo.com/uk/async/#in-a-hurry). @@ -210,7 +210,7 @@ async def read_item(item_id: int, q: str | None = None):
```console -$ fastapi dev main.py +$ fastapi dev ╭────────── FastAPI CLI - Development mode ───────────╮ │ │ @@ -235,19 +235,19 @@ INFO: Application startup complete.
-Про команду fastapi dev main.py... +Про команду fastapi dev... -Команда `fastapi dev` читає ваш файл `main.py`, знаходить у ньому застосунок **FastAPI** і запускає сервер за допомогою Uvicorn. +Команда `fastapi dev` автоматично читає ваш файл `main.py`, знаходить у ньому застосунок **FastAPI** і запускає сервер за допомогою [Uvicorn](https://www.uvicorn.dev). За замовчуванням `fastapi dev` запускається з авто-перезавантаженням для локальної розробки. -Докладніше читайте в документації FastAPI CLI. +Докладніше читайте в [документації FastAPI CLI](https://fastapi.tiangolo.com/uk/fastapi-cli/).
### Перевірте { #check-it } -Відкрийте браузер і перейдіть на http://127.0.0.1:8000/items/5?q=somequery. +Відкрийте браузер і перейдіть на [http://127.0.0.1:8000/items/5?q=somequery](http://127.0.0.1:8000/items/5?q=somequery). Ви побачите JSON-відповідь: @@ -264,17 +264,17 @@ INFO: Application startup complete. ### Інтерактивна документація API { #interactive-api-docs } -Тепер перейдіть на http://127.0.0.1:8000/docs. +Тепер перейдіть на [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). -Ви побачите автоматичну інтерактивну документацію API (надану Swagger UI): +Ви побачите автоматичну інтерактивну документацію API (надану [Swagger UI](https://github.com/swagger-api/swagger-ui)): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Альтернативна документація API { #alternative-api-docs } -А тепер перейдіть на http://127.0.0.1:8000/redoc. +А тепер перейдіть на [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). -Ви побачите альтернативну автоматичну документацію (надану ReDoc): +Ви побачите альтернативну автоматичну документацію (надану [ReDoc](https://github.com/Rebilly/ReDoc)): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -316,7 +316,7 @@ def update_item(item_id: int, item: Item): ### Оновлення інтерактивної документації API { #interactive-api-docs-upgrade } -Тепер перейдіть на http://127.0.0.1:8000/docs. +Тепер перейдіть на [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). * Інтерактивна документація API буде автоматично оновлена, включно з новим тілом: @@ -332,7 +332,7 @@ def update_item(item_id: int, item: Item): ### Оновлення альтернативної документації API { #alternative-api-docs-upgrade } -А тепер перейдіть на http://127.0.0.1:8000/redoc. +А тепер перейдіть на [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). * Альтернативна документація також відобразить новий параметр запиту та тіло: @@ -442,7 +442,7 @@ item: Item * Дуже потужну і просту у використанні систему **Впровадження залежностей**. * Безпеку та автентифікацію, включно з підтримкою **OAuth2** з **JWT tokens** та **HTTP Basic** auth. * Досконаліші (але однаково прості) техніки для оголошення **глибоко вкладених моделей JSON** (завдяки Pydantic). -* Інтеграцію **GraphQL** з Strawberry та іншими бібліотеками. +* Інтеграцію **GraphQL** з [Strawberry](https://strawberry.rocks) та іншими бібліотеками. * Багато додаткових можливостей (завдяки Starlette) як-от: * **WebSockets** * надзвичайно прості тести на основі HTTPX та `pytest` @@ -452,24 +452,10 @@ item: Item ### Розгортання застосунку (необовʼязково) { #deploy-your-app-optional } -За бажання ви можете розгорнути ваш застосунок FastAPI у FastAPI Cloud, перейдіть і приєднайтеся до списку очікування, якщо ви ще цього не зробили. 🚀 +За бажання ви можете розгорнути ваш застосунок FastAPI у [FastAPI Cloud](https://fastapicloud.com), перейдіть і приєднайтеся до списку очікування, якщо ви ще цього не зробили. 🚀 Якщо у вас вже є обліковий запис **FastAPI Cloud** (ми запросили вас зі списку очікування 😉), ви можете розгорнути ваш застосунок однією командою. -Перед розгортанням переконайтеся, що ви ввійшли в систему: - -
- -```console -$ fastapi login - -You are logged in to FastAPI Cloud 🚀 -``` - -
- -Потім розгорніть ваш застосунок: -
```console @@ -488,7 +474,7 @@ Deploying to FastAPI Cloud... #### Про FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** створено тим самим автором і командою, що стоять за **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** створено тим самим автором і командою, що стоять за **FastAPI**. Він спрощує процес **створення**, **розгортання** та **доступу** до API з мінімальними зусиллями. @@ -504,9 +490,9 @@ FastAPI - open source проект і базується на стандарта ## Продуктивність { #performance } -Незалежні тести TechEmpower показують застосунки **FastAPI**, які працюють під керуванням Uvicorn, як одні з найшвидших доступних Python-фреймворків, поступаючись лише Starlette та Uvicorn (які внутрішньо використовуються в FastAPI). (*) +Незалежні тести TechEmpower показують застосунки **FastAPI**, які працюють під керуванням Uvicorn, як [одні з найшвидших доступних Python-фреймворків](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), поступаючись лише Starlette та Uvicorn (які внутрішньо використовуються в FastAPI). (*) -Щоб дізнатися більше, перегляньте розділ Benchmarks. +Щоб дізнатися більше, перегляньте розділ [Benchmarks](https://fastapi.tiangolo.com/uk/benchmarks/). ## Залежності { #dependencies } @@ -518,19 +504,19 @@ FastAPI залежить від Pydantic і Starlette. Використовується Pydantic: -* email-validator - для валідації електронної пошти. +* [`email-validator`](https://github.com/JoshData/python-email-validator) - для валідації електронної пошти. Використовується Starlette: -* httpx - потрібно, якщо ви хочете використовувати `TestClient`. -* jinja2 - потрібно, якщо ви хочете використовувати конфігурацію шаблонів за замовчуванням. -* python-multipart - потрібно, якщо ви хочете підтримувати форми з «парсингом» через `request.form()`. +* [`httpx`](https://www.python-httpx.org) - потрібно, якщо ви хочете використовувати `TestClient`. +* [`jinja2`](https://jinja.palletsprojects.com) - потрібно, якщо ви хочете використовувати конфігурацію шаблонів за замовчуванням. +* [`python-multipart`](https://github.com/Kludex/python-multipart) - потрібно, якщо ви хочете підтримувати форми з «парсингом» через `request.form()`. Використовується FastAPI: -* uvicorn - для сервера, який завантажує та обслуговує ваш застосунок. Це включає `uvicorn[standard]`, до якого входять деякі залежності (наприклад, `uvloop`), потрібні для високопродуктивної роботи сервера. +* [`uvicorn`](https://www.uvicorn.dev) - для сервера, який завантажує та обслуговує ваш застосунок. Це включає `uvicorn[standard]`, до якого входять деякі залежності (наприклад, `uvloop`), потрібні для високопродуктивної роботи сервера. * `fastapi-cli[standard]` - щоб надати команду `fastapi`. - * Це включає `fastapi-cloud-cli`, який дозволяє розгортати ваш застосунок FastAPI у FastAPI Cloud. + * Це включає `fastapi-cloud-cli`, який дозволяє розгортати ваш застосунок FastAPI у [FastAPI Cloud](https://fastapicloud.com). ### Без залежностей `standard` { #without-standard-dependencies } @@ -546,13 +532,13 @@ FastAPI залежить від Pydantic і Starlette. Додаткові необовʼязкові залежності Pydantic: -* pydantic-settings - для керування налаштуваннями. -* pydantic-extra-types - для додаткових типів, що можуть бути використані з Pydantic. +* [`pydantic-settings`](https://docs.pydantic.dev/latest/usage/pydantic_settings/) - для керування налаштуваннями. +* [`pydantic-extra-types`](https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/) - для додаткових типів, що можуть бути використані з Pydantic. Додаткові необовʼязкові залежності FastAPI: -* orjson - потрібно, якщо ви хочете використовувати `ORJSONResponse`. -* ujson - потрібно, якщо ви хочете використовувати `UJSONResponse`. +* [`orjson`](https://github.com/ijl/orjson) - потрібно, якщо ви хочете використовувати `ORJSONResponse`. +* [`ujson`](https://github.com/esnme/ultrajson) - потрібно, якщо ви хочете використовувати `UJSONResponse`. ## Ліцензія { #license } diff --git a/docs/uk/docs/project-generation.md b/docs/uk/docs/project-generation.md index 4899090d42..6e3781740e 100644 --- a/docs/uk/docs/project-generation.md +++ b/docs/uk/docs/project-generation.md @@ -4,7 +4,7 @@ Ви можете використати цей шаблон для старту, адже в ньому вже виконано значну частину початкового налаштування, безпеки, роботи з базою даних і деяких кінцевих точок API. -Репозиторій GitHub: Шаблон Full Stack FastAPI +Репозиторій GitHub: [Шаблон Full Stack FastAPI](https://github.com/tiangolo/full-stack-fastapi-template) ## Шаблон Full Stack FastAPI - стек технологій і можливості { #full-stack-fastapi-template-technology-stack-and-features } diff --git a/docs/uk/docs/python-types.md b/docs/uk/docs/python-types.md index deeeb2f9c5..274da80cec 100644 --- a/docs/uk/docs/python-types.md +++ b/docs/uk/docs/python-types.md @@ -269,7 +269,7 @@ def some_function(data: Any): ## Pydantic моделі { #pydantic-models } -Pydantic — це бібліотека Python для валідації даних. +[Pydantic](https://docs.pydantic.dev/) — це бібліотека Python для валідації даних. Ви оголошуєте «форму» даних як класи з атрибутами. @@ -285,13 +285,13 @@ def some_function(data: Any): /// info | Інформація -Щоб дізнатись більше про Pydantic, перегляньте його документацію. +Щоб дізнатись більше про [Pydantic, перегляньте його документацію](https://docs.pydantic.dev/). /// **FastAPI** повністю базується на Pydantic. -Ви побачите набагато більше цього всього на практиці в [Навчальний посібник - Посібник користувача](tutorial/index.md){.internal-link target=_blank}. +Ви побачите набагато більше цього всього на практиці в [Навчальний посібник - Посібник користувача](tutorial/index.md). ## Підказки типів з анотаціями метаданих { #type-hints-with-metadata-annotations } @@ -337,12 +337,12 @@ def some_function(data: Any): * **Документування** API за допомогою OpenAPI: * який потім використовується для автоматичної інтерактивної документації користувальницьких інтерфейсів. -Все це може здатися абстрактним. Не хвилюйтеся. Ви побачите все це в дії в [Навчальний посібник - Посібник користувача](tutorial/index.md){.internal-link target=_blank}. +Все це може здатися абстрактним. Не хвилюйтеся. Ви побачите все це в дії в [Навчальний посібник - Посібник користувача](tutorial/index.md). Важливо те, що за допомогою стандартних типів Python в одному місці (замість того, щоб додавати більше класів, декораторів тощо), **FastAPI** зробить багато роботи за вас. /// info | Інформація -Якщо ви вже пройшли весь навчальний посібник і повернулися, щоб дізнатися більше про типи, ось хороший ресурс: «шпаргалка» від `mypy`. +Якщо ви вже пройшли весь навчальний посібник і повернулися, щоб дізнатися більше про типи, ось хороший ресурс: [«шпаргалка» від `mypy`](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html). /// diff --git a/docs/uk/docs/tutorial/background-tasks.md b/docs/uk/docs/tutorial/background-tasks.md index 71266a8b10..2894bd2d08 100644 --- a/docs/uk/docs/tutorial/background-tasks.md +++ b/docs/uk/docs/tutorial/background-tasks.md @@ -61,7 +61,7 @@ ## Технічні деталі { #technical-details } -Клас `BackgroundTasks` походить безпосередньо з `starlette.background`. +Клас `BackgroundTasks` походить безпосередньо з [`starlette.background`](https://www.starlette.dev/background/). Він імпортується/включається безпосередньо у FastAPI, щоб ви могли імпортувати його з `fastapi` і випадково не імпортували альтернативний `BackgroundTask` (без `s` в кінці) з `starlette.background`. @@ -69,11 +69,11 @@ Також можна використовувати `BackgroundTask` окремо в FastAPI, але для цього вам доведеться створити об'єкт у коді та повернути Starlette `Response`, включаючи його. -Детальніше можна почитати в офіційній документації Starlette про Background Tasks. +Детальніше можна почитати в [офіційній документації Starlette про Background Tasks](https://www.starlette.dev/background/). ## Застереження { #caveat } -Якщо вам потрібно виконувати складні фонові обчислення, і при цьому нема потреби запускати їх у тому ж процесі (наприклад, не потрібно спільного доступу до пам’яті чи змінних), можливо, варто скористатися більш потужними інструментами, такими як Celery. +Якщо вам потрібно виконувати складні фонові обчислення, і при цьому нема потреби запускати їх у тому ж процесі (наприклад, не потрібно спільного доступу до пам’яті чи змінних), можливо, варто скористатися більш потужними інструментами, такими як [Celery](https://docs.celeryq.dev). Такі інструменти зазвичай потребують складнішої конфігурації та менеджера черги повідомлень/завдань, наприклад, RabbitMQ або Redis. Однак вони дозволяють виконувати фонові задачі в кількох процесах і особливо — на кількох серверах. diff --git a/docs/uk/docs/tutorial/bigger-applications.md b/docs/uk/docs/tutorial/bigger-applications.md index a75da2ac6d..7745509ddf 100644 --- a/docs/uk/docs/tutorial/bigger-applications.md +++ b/docs/uk/docs/tutorial/bigger-applications.md @@ -123,7 +123,7 @@ from app.routers import items Ми використовуємо вигаданий заголовок, щоб спростити приклад. -Але в реальних випадках ви отримаєте кращі результати, використовуючи інтегровані [засоби безпеки](security/index.md){.internal-link target=_blank}. +Але в реальних випадках ви отримаєте кращі результати, використовуючи інтегровані [засоби безпеки](security/index.md). /// @@ -169,7 +169,7 @@ async def read_item(item_id: str): /// tip | Порада -Зверніть увагу, що так само як і для [залежностей у декораторах *операцій шляху*](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, жодне значення не буде передано вашій *функції операції шляху*. +Зверніть увагу, що так само як і для [залежностей у декораторах *операцій шляху*](dependencies/dependencies-in-path-operation-decorators.md), жодне значення не буде передано вашій *функції операції шляху*. /// @@ -185,8 +185,8 @@ async def read_item(item_id: str): * Усі вони включатимуть наперед визначені `responses`. * Для всіх цих *операцій шляху* список `dependencies` буде оцінений/виконаний перед ними. * Якщо ви також оголосите залежності в конкретній *операції шляху*, **вони також будуть виконані**. - * Спочатку виконуються залежності router'а, потім [`dependencies` у декораторі](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, а потім звичайні параметричні залежності. - * Ви також можете додати [`Security` залежності з `scopes`](../advanced/security/oauth2-scopes.md){.internal-link target=_blank}. + * Спочатку виконуються залежності router'а, потім [`dependencies` у декораторі](dependencies/dependencies-in-path-operation-decorators.md), а потім звичайні параметричні залежності. + * Ви також можете додати [`Security` залежності з `scopes`](../advanced/security/oauth2-scopes.md). /// tip | Порада @@ -303,7 +303,7 @@ from ...dependencies import get_token_header Імпортуйте та створіть клас `FastAPI`, як зазвичай. -І ми навіть можемо оголосити [глобальні залежності](dependencies/global-dependencies.md){.internal-link target=_blank}, які будуть поєднані із залежностями кожного `APIRouter`: +І ми навіть можемо оголосити [глобальні залежності](dependencies/global-dependencies.md), які будуть поєднані із залежностями кожного `APIRouter`: {* ../../docs_src/bigger_applications/app_an_py310/main.py hl[1,3,7] title["app/main.py"] *} @@ -353,7 +353,7 @@ from .routers import items, users from app.routers import items, users ``` -Щоб дізнатися більше про пакети й модулі Python, прочитайте офіційну документацію Python про модулі. +Щоб дізнатися більше про пакети й модулі Python, прочитайте [офіційну документацію Python про модулі](https://docs.python.org/3/tutorial/modules.html). /// @@ -465,6 +465,37 @@ from .routers.users import router /// +## Налаштуйте `entrypoint` у `pyproject.toml` { #configure-the-entrypoint-in-pyproject-toml } + +Оскільки ваш об'єкт FastAPI `app` знаходиться в `app/main.py`, ви можете налаштувати `entrypoint` у файлі `pyproject.toml` так: + +```toml +[tool.fastapi] +entrypoint = "app.main:app" +``` + +це еквівалентно імпорту: + +```python +from app.main import app +``` + +Таким чином команда `fastapi` знатиме, де знайти ваш застосунок. + +/// Note | Примітка + +Ви також могли б передати шлях команді, наприклад: + +```console +$ fastapi dev app/main.py +``` + +Але тоді вам доведеться щоразу пам'ятати, щоб передавати правильний шлях, коли ви викликаєте команду `fastapi`. + +Крім того, інші інструменти можуть не знайти його, наприклад [розширення VS Code](../editor-support.md) або [FastAPI Cloud](https://fastapicloud.com), тому рекомендовано використовувати `entrypoint` у `pyproject.toml`. + +/// + ## Перевірте автоматичну документацію API { #check-the-automatic-api-docs } Тепер запустіть ваш застосунок: @@ -472,14 +503,14 @@ from .routers.users import router
```console -$ fastapi dev app/main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
-І відкрийте документацію за адресою http://127.0.0.1:8000/docs. +І відкрийте документацію за адресою [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Ви побачите автоматичну документацію API, що включає шляхи з усіх підмодулів, з правильними шляхами (і префіксами) та правильними мітками: diff --git a/docs/uk/docs/tutorial/body-nested-models.md b/docs/uk/docs/tutorial/body-nested-models.md index a56ae484df..97fea36dc5 100644 --- a/docs/uk/docs/tutorial/body-nested-models.md +++ b/docs/uk/docs/tutorial/body-nested-models.md @@ -17,7 +17,7 @@ ### Оголошення `list` з параметром типу { #declare-a-list-with-a-type-parameter } Щоб оголосити типи з параметрами типу (внутрішніми типами), такими як `list`, `dict`, `tuple`, -передайте внутрішні тип(и) як «параметри типу», використовуючи квадратні дужки: `[` and `]` +передайте внутрішні тип(и) як «параметри типу», використовуючи квадратні дужки: `[` та `]` ```Python my_list: list[str] @@ -96,7 +96,7 @@ my_list: list[str] Окрім звичайних типів, таких як `str`, `int`, `float`, та ін. ви можете використовувати складніші типи, які наслідують `str`. -Щоб побачити всі доступні варіанти, ознайомтеся з оглядом типів у Pydantic. Деякі приклади будуть у наступних розділах. +Щоб побачити всі доступні варіанти, ознайомтеся з [Оглядом типів у Pydantic](https://docs.pydantic.dev/latest/concepts/types/). Деякі приклади будуть у наступному розділі. Наприклад, у моделі `Image` є поле `url`, тому ми можемо оголосити його як `HttpUrl` від Pydantic замість `str`: @@ -215,7 +215,7 @@ images: list[Image] А також отримуєте всі переваги: * Підтримка в редакторі (автодоповнення всюди!) -* Конвертація даних (парсинг/сериалізація) +* Конвертація даних (парсинг/серіалізація) * Валідація даних * Документація схем * Автоматичне створення документації diff --git a/docs/uk/docs/tutorial/body-updates.md b/docs/uk/docs/tutorial/body-updates.md index 2ae68291ca..082bec1f03 100644 --- a/docs/uk/docs/tutorial/body-updates.md +++ b/docs/uk/docs/tutorial/body-updates.md @@ -2,7 +2,7 @@ ## Оновлення із заміною за допомогою `PUT` { #update-replacing-with-put } -Щоб оновити елемент, ви можете використати HTTP `PUT` операцію. +Щоб оновити елемент, ви можете використати [HTTP `PUT`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT) операцію. Ви можете використати `jsonable_encoder`, щоб перетворити вхідні дані на такі, які можна зберігати як JSON (наприклад, у NoSQL базі даних). Наприклад, перетворюючи `datetime` у `str`. @@ -28,7 +28,7 @@ ## Часткові оновлення з `PATCH` { #partial-updates-with-patch } -Ви також можете використовувати операцію HTTP `PATCH` для *часткового* оновлення даних. +Ви також можете використовувати операцію [HTTP `PATCH`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) для *часткового* оновлення даних. Це означає, що Ви можете надіслати лише ті дані, які хочете оновити, залишаючи інші без змін. @@ -95,6 +95,6 @@ Тож, якщо Ви хочете отримувати часткові оновлення, які можуть пропускати всі атрибути, Вам потрібно мати модель, де всі атрибути позначені як необов’язкові (зі значеннями за замовчуванням або `None`). -Щоб розрізняти моделі з усіма необов’язковими значеннями для **оновлення** і моделі з обов’язковими значеннями для **створення**, Ви можете скористатись ідеями, описаними у [Додаткові моделі](extra-models.md){.internal-link target=_blank}. +Щоб розрізняти моделі з усіма необов’язковими значеннями для **оновлення** і моделі з обов’язковими значеннями для **створення**, Ви можете скористатись ідеями, описаними у [Додаткові моделі](extra-models.md). /// diff --git a/docs/uk/docs/tutorial/body.md b/docs/uk/docs/tutorial/body.md index 615f0274cc..91c4b42527 100644 --- a/docs/uk/docs/tutorial/body.md +++ b/docs/uk/docs/tutorial/body.md @@ -2,13 +2,13 @@ Коли вам потрібно надіслати дані з клієнта (скажімо, браузера) до вашого API, ви надсилаєте їх як **тіло запиту**. -Тіло **запиту** — це дані, надіслані клієнтом до вашого API. Тіло **відповіді** — це дані, які ваш API надсилає клієнту. +Тіло **запиту** - це дані, надіслані клієнтом до вашого API. Тіло **відповіді** - це дані, які ваш API надсилає клієнту. Ваш API майже завжди має надсилати тіло **відповіді**. Але клієнтам не обов’язково потрібно постійно надсилати тіла **запитів** — інколи вони лише запитують шлях, можливо з деякими параметрами запиту, але не надсилають тіло. -Щоб оголосити тіло **запиту**, ви використовуєте Pydantic моделі з усією їх потужністю та перевагами. +Щоб оголосити тіло **запиту**, ви використовуєте [Pydantic](https://docs.pydantic.dev/) моделі з усією їх потужністю та перевагами. -/// info +/// info | Інформація Щоб надіслати дані, ви повинні використовувати один із: `POST` (більш поширений), `PUT`, `DELETE` або `PATCH`. @@ -73,7 +73,7 @@ * Якщо дані недійсні, він поверне гарну та чітку помилку, вказуючи, де саме і які дані були неправильними. * Надавати отримані дані у параметрі `item`. * Оскільки ви оголосили його у функції як тип `Item`, ви також матимете всю підтримку редактора (автозаповнення, тощо) для всіх атрибутів та їх типів. -* Генерувати визначення Схеми JSON для вашої моделі, ви також можете використовувати їх де завгодно, якщо це має сенс для вашого проекту. +* Генерувати визначення [Схеми JSON](https://json-schema.org) для вашої моделі, ви також можете використовувати їх де завгодно, якщо це має сенс для вашого проекту. * Ці схеми будуть частиною згенерованої схеми OpenAPI і використовуватимуться автоматичною документацією UIs. ## Автоматична документація { #automatic-docs } @@ -102,15 +102,15 @@ Були навіть деякі зміни в самому Pydantic, щоб підтримати це. -Попередні скріншоти були зроблені у Visual Studio Code. +Попередні скріншоти були зроблені у [Visual Studio Code](https://code.visualstudio.com). -Але ви отримаєте ту саму підтримку редактора у PyCharm та більшість інших редакторів Python: +Але ви отримаєте ту саму підтримку редактора у [PyCharm](https://www.jetbrains.com/pycharm/) та більшість інших редакторів Python: -/// tip +/// tip | Порада -Якщо ви використовуєте PyCharm як ваш редактор, ви можете використати Pydantic PyCharm Plugin. +Якщо ви використовуєте [PyCharm](https://www.jetbrains.com/pycharm/) як ваш редактор, ви можете використати [Pydantic PyCharm Plugin](https://github.com/koxudaxi/pydantic-pycharm-plugin/). Він покращує підтримку редакторів для моделей Pydantic за допомогою: @@ -151,7 +151,7 @@ * Якщо параметр має **сингулярний тип** (наприклад, `int`, `float`, `str`, `bool` тощо), він буде інтерпретуватися як параметр **запиту**. * Якщо параметр оголошується як тип **Pydantic моделі**, він інтерпретується як **тіло** **запиту**. -/// note +/// note | Примітка FastAPI буде знати, що значення `q` не є обов'язковим через значення за замовчуванням `= None`. @@ -163,4 +163,4 @@ FastAPI буде знати, що значення `q` не є обов'язко ## Без Pydantic { #without-pydantic } -Якщо ви не хочете використовувати моделі Pydantic, ви також можете використовувати параметри **Body**. Перегляньте документацію для [Тіло - Кілька параметрів: Окремі значення в тілі](body-multiple-params.md#singular-values-in-body){.internal-link target=_blank}. +Якщо ви не хочете використовувати моделі Pydantic, ви також можете використовувати параметри **Body**. Перегляньте документацію для [Тіло - Кілька параметрів: Окремі значення в тілі](body-multiple-params.md#singular-values-in-body). diff --git a/docs/uk/docs/tutorial/cors.md b/docs/uk/docs/tutorial/cors.md index 5c959cef18..993bf31f58 100644 --- a/docs/uk/docs/tutorial/cors.md +++ b/docs/uk/docs/tutorial/cors.md @@ -1,6 +1,6 @@ # CORS (Обмін ресурсами між різними джерелами) { #cors-cross-origin-resource-sharing } -CORS або «Cross-Origin Resource Sharing» є ситуація, коли фронтенд, що працює в браузері, містить JavaScript-код, який взаємодіє з бекендом, розташованим в іншому «джерелі» (origin). +[CORS або «Cross-Origin Resource Sharing»](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) є ситуація, коли фронтенд, що працює в браузері, містить JavaScript-код, який взаємодіє з бекендом, розташованим в іншому «джерелі» (origin). ## Джерело (Origin) { #origin } @@ -29,7 +29,7 @@ Можна також оголосити список як `"*"` (дика карта), що означає дозвіл для всіх джерел. -Однак це дозволить лише певні типи комунікації, виключаючи все, що пов'язане з обліковими даними: Cookies, заголовки авторизації, як-от ті, що використовуються з токенами носія, тощо. +Однак це дозволить лише певні типи комунікації, виключаючи все, що пов'язане з обліковими даними: кукі, заголовки авторизації, як-от ті, що використовуються з токенами носія, тощо. Тому для коректної роботи краще явно вказувати дозволені джерела. @@ -43,7 +43,7 @@ Також можна вказати, чи дозволяє ваш бекенд: -* Облікові дані (заголовки авторизації, Cookies, тощо). +* Облікові дані (заголовки авторизації, кукі, тощо). * Конкретні HTTP-методи (`POST`, `PUT`) або всі за допомогою `"*"` * Конкретні HTTP-заголовки або всі за допомогою `"*"`. @@ -58,10 +58,10 @@ * `allow_origins` - Список джерел, яким дозволено здійснювати міждоменні запити. Наприклад `['https://example.org', 'https://www.example.org']`. Ви можете використовувати `['*']`, щоб дозволити будь-яке джерело. * `allow_origin_regex` - Рядок регулярного виразу для відповідності джерелам, яким дозволено здійснювати міждоменні запити. Наприклад, `'https://.*\.example\.org'`. * `allow_methods` - Список HTTP-методів, дозволених для міждоменних запитів. За замовчуванням `['GET']`. Ви можете використовувати `['*']`, щоб дозволити всі стандартні методи. -* `allow_headers` - Список HTTP-заголовків запиту, які підтримуються для міждоменних запитів. За замовчуванням `[]`. Ви можете використовувати `['*']`, щоб дозволити всі заголовки. Заголовки `Accept`, `Accept-Language`, `Content-Language` і `Content-Type` завжди дозволені для простих CORS-запитів. -* `allow_credentials` - Визначає, чи повинні підтримуватися cookies для міждоменних запитів. За замовчуванням `False`. +* `allow_headers` - Список HTTP-заголовків запиту, які підтримуються для міждоменних запитів. За замовчуванням `[]`. Ви можете використовувати `['*']`, щоб дозволити всі заголовки. Заголовки `Accept`, `Accept-Language`, `Content-Language` і `Content-Type` завжди дозволені для [простих CORS-запитів](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests). +* `allow_credentials` - Визначає, чи повинні підтримуватися кукі для міждоменних запитів. За замовчуванням `False`. - Жоден із параметрів `allow_origins`, `allow_methods` і `allow_headers` не можна встановлювати як `['*']`, якщо `allow_credentials` встановлено як `True`. Усі вони мають бути явно вказані. + Жоден із параметрів `allow_origins`, `allow_methods` і `allow_headers` не можна встановлювати як `['*']`, якщо `allow_credentials` встановлено як `True`. Усі вони мають бути [явно вказані](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards). * `expose_headers` - Вказує, які заголовки відповіді повинні бути доступні для браузера. За замовчуванням `[]`. * `max_age` - Встановлює максимальний час (у секундах) для кешування CORS-відповідей у браузерах. За замовчуванням `600`. @@ -72,20 +72,20 @@ Це будь-які `OPTIONS` - запити, що містять заголовки `Origin` та `Access-Control-Request-Method`. -У такому випадку middleware перехопить вхідний запит і відповість відповідними CORS-заголовками, повертаючи або `200`, або `400` для інформаційних цілей. +У такому випадку проміжне програмне забезпечення перехопить вхідний запит і відповість відповідними CORS-заголовками, повертаючи або `200`, або `400` для інформаційних цілей. ### Прості запити { #simple-requests } -Будь-які запити із заголовком `Origin`. У цьому випадку middleware пропустить запит як звичайний, але додасть відповідні CORS-заголовки у відповідь. +Будь-які запити із заголовком `Origin`. У цьому випадку проміжне програмне забезпечення пропустить запит як звичайний, але додасть відповідні CORS-заголовки у відповідь. ## Додаткова інформація { #more-info } -Більше про CORS можна дізнатися в документації Mozilla про CORS. +Більше про CORS можна дізнатися в [документації Mozilla про CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS). /// note | Технічні деталі Також можна використовувати `from starlette.middleware.cors import CORSMiddleware`. -**FastAPI** надає кілька middleware у `fastapi.middleware` для зручності розробників. Але більшість доступних middleware походять безпосередньо зі Starlette. +**FastAPI** надає кілька проміжних програмних забезпечень у `fastapi.middleware` для зручності розробників. Але більшість доступного проміжного програмного забезпечення походить безпосередньо зі Starlette. /// diff --git a/docs/uk/docs/tutorial/debugging.md b/docs/uk/docs/tutorial/debugging.md index 679018cc2f..d0100587b8 100644 --- a/docs/uk/docs/tutorial/debugging.md +++ b/docs/uk/docs/tutorial/debugging.md @@ -59,7 +59,7 @@ $ python myapp.py ```Python from myapp import app -# Some more code +# Ще трохи коду ``` у цьому випадку автоматично створена змінна `__name__` всередині `myapp.py` не матиме значення `"__main__"`. @@ -72,9 +72,9 @@ from myapp import app не буде виконано. -/// info | Інформація +/// info -Для отримання додаткової інформації дивіться офіційну документацію Python. +Для отримання додаткової інформації дивіться [офіційну документацію Python](https://docs.python.org/3/library/__main__.html). /// diff --git a/docs/uk/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/uk/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md index 4614c626c5..a82461c8dc 100644 --- a/docs/uk/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md +++ b/docs/uk/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md @@ -32,7 +32,7 @@ У цьому прикладі ми використовуємо вигадані власні заголовки `X-Key` і `X-Token`. -Але в реальних випадках, під час впровадження безпеки, ви отримаєте більше користі, використовуючи вбудовані [Інструменти безпеки (наступний розділ)](../security/index.md){.internal-link target=_blank}. +Але в реальних випадках, під час впровадження безпеки, ви отримаєте більше користі, використовуючи вбудовані [Інструменти безпеки (наступний розділ)](../security/index.md). /// @@ -62,7 +62,7 @@ ## Залежності для групи операцій шляху { #dependencies-for-a-group-of-path-operations } -Далі, читаючи про структурування великих застосунків ([Більші застосунки - декілька файлів](../../tutorial/bigger-applications.md){.internal-link target=_blank}), можливо з кількома файлами, ви дізнаєтеся, як оголосити один параметр `dependencies` для групи *операцій шляху*. +Далі, читаючи про структурування великих застосунків ([Більші застосунки - декілька файлів](../../tutorial/bigger-applications.md)), можливо з кількома файлами, ви дізнаєтеся, як оголосити один параметр `dependencies` для групи *операцій шляху*. ## Глобальні залежності { #global-dependencies } diff --git a/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md index 70d4210a1c..53b49e61b6 100644 --- a/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md +++ b/docs/uk/docs/tutorial/dependencies/dependencies-with-yield.md @@ -1,6 +1,6 @@ # Залежності з yield { #dependencies-with-yield } -FastAPI підтримує залежності, які виконують деякі додаткові кроки після завершення. +FastAPI підтримує залежності, які виконують деякі додаткові кроки після завершення. Щоб це зробити, використовуйте `yield` замість `return` і напишіть додаткові кроки (код) після нього. @@ -14,8 +14,8 @@ FastAPI підтримує залежності, які виконують де Будь-яка функція, яку можна використовувати з: -* `@contextlib.contextmanager` або -* `@contextlib.asynccontextmanager` +* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) або +* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager) буде придатною як залежність у **FastAPI**. @@ -87,7 +87,7 @@ FastAPI підтримує залежності, які виконують де /// note | Технічні деталі -Це працює завдяки Менеджерам контексту Python. +Це працює завдяки Python [Менеджерам контексту](https://docs.python.org/3/library/contextlib.html). **FastAPI** використовує їх внутрішньо, щоб досягти цього. @@ -111,7 +111,7 @@ FastAPI підтримує залежності, які виконують де {* ../../docs_src/dependencies/tutorial008b_an_py310.py hl[18:22,31] *} -Якщо ви хочете перехоплювати винятки та створювати на їх основі користувацьку відповідь, створіть [Користувацький обробник винятків](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank}. +Якщо ви хочете перехоплювати винятки та створювати на їх основі користувацьку відповідь, створіть [Користувацький обробник винятків](../handling-errors.md#install-custom-exception-handlers). ## Залежності з `yield` та `except` { #dependencies-with-yield-and-except } @@ -233,14 +233,14 @@ participant operation as Path Operation Залежності з `yield` еволюціонували з часом, щоб покрити різні сценарії та виправити деякі проблеми. -Якщо ви хочете дізнатися, що змінювалося в різних версіях FastAPI, прочитайте про це в просунутому посібнику користувача: [Розширені залежності - Залежності з `yield`, `HTTPException`, `except` і фоновими задачами](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks){.internal-link target=_blank}. +Якщо ви хочете дізнатися, що змінювалося в різних версіях FastAPI, прочитайте про це в просунутому посібнику користувача: [Розширені залежності - Залежності з `yield`, `HTTPException`, `except` і фоновими задачами](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks). ## Менеджери контексту { #context-managers } ### Що таке «Менеджери контексту» { #what-are-context-managers } «Менеджери контексту» - це будь-які Python-об'єкти, які можна використовувати в операторі `with`. -Наприклад, можна використати `with`, щоб прочитати файл: +Наприклад, [можна використати `with`, щоб прочитати файл](https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files): ```Python with open("./somefile.txt") as f: @@ -264,7 +264,7 @@ with open("./somefile.txt") as f: /// -У Python ви можете створювати Менеджери контексту, створивши клас із двома методами: `__enter__()` і `__exit__()`. +У Python ви можете створювати Менеджери контексту, [створивши клас із двома методами: `__enter__()` і `__exit__()`](https://docs.python.org/3/reference/datamodel.html#context-managers). Ви також можете використовувати їх усередині залежностей **FastAPI** з `yield`, використовуючи `with` або `async with` у середині функції залежності: @@ -275,8 +275,8 @@ with open("./somefile.txt") as f: Інший спосіб створити менеджер контексту: -* `@contextlib.contextmanager` або -* `@contextlib.asynccontextmanager` +* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) або +* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager) використовуючи їх для декорування функції з одним `yield`. diff --git a/docs/uk/docs/tutorial/dependencies/global-dependencies.md b/docs/uk/docs/tutorial/dependencies/global-dependencies.md index 3cffa1752c..da8b08cdff 100644 --- a/docs/uk/docs/tutorial/dependencies/global-dependencies.md +++ b/docs/uk/docs/tutorial/dependencies/global-dependencies.md @@ -2,14 +2,14 @@ Для деяких типів застосунків ви можете захотіти додати залежності до всього застосунку. -Подібно до того, як ви можете [додавати `dependencies` до *декораторів операцій шляху*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, ви можете додати їх до застосунку `FastAPI`. +Подібно до того, як ви можете [додавати `dependencies` до *декораторів операцій шляху*](dependencies-in-path-operation-decorators.md), ви можете додати їх до застосунку `FastAPI`. У такому разі вони будуть застосовані до всіх *операцій шляху* в застосунку: {* ../../docs_src/dependencies/tutorial012_an_py310.py hl[17] *} -Усі ідеї з розділу про [додавання `dependencies` до *декораторів операцій шляху*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} так само застосовні, але в цьому випадку - до всіх *операцій шляху* в застосунку. +Усі ідеї з розділу про [додавання `dependencies` до *декораторів операцій шляху*](dependencies-in-path-operation-decorators.md) так само застосовні, але в цьому випадку - до всіх *операцій шляху* в застосунку. ## Залежності для груп *операцій шляху* { #dependencies-for-groups-of-path-operations } -Пізніше, читаючи про структуру більших застосунків ([Більші застосунки - кілька файлів](../../tutorial/bigger-applications.md){.internal-link target=_blank}), можливо з кількома файлами, ви дізнаєтеся, як оголосити єдиний параметр `dependencies` для групи *операцій шляху*. +Пізніше, читаючи про структуру більших застосунків ([Більші застосунки - кілька файлів](../../tutorial/bigger-applications.md)), можливо з кількома файлами, ви дізнаєтеся, як оголосити єдиний параметр `dependencies` для групи *операцій шляху*. diff --git a/docs/uk/docs/tutorial/dependencies/index.md b/docs/uk/docs/tutorial/dependencies/index.md index cbcf693077..bea5f598d6 100644 --- a/docs/uk/docs/tutorial/dependencies/index.md +++ b/docs/uk/docs/tutorial/dependencies/index.md @@ -57,7 +57,7 @@ FastAPI додав підтримку `Annotated` (і почав її реком Якщо у вас старіша версія, ви отримаєте помилки при спробі використати `Annotated`. -Переконайтеся, що ви [Оновіть версію FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} щонайменше до 0.95.1 перед використанням `Annotated`. +Переконайтеся, що ви [Оновіть версію FastAPI](../../deployment/versions.md#upgrading-the-fastapi-versions) щонайменше до 0.95.1 перед використанням `Annotated`. /// @@ -152,7 +152,7 @@ commons: Annotated[dict, Depends(common_parameters)] /// note | Примітка -Якщо ви не впевнені, перегляньте розділ [Async: *"In a hurry?"*](../../async.md#in-a-hurry){.internal-link target=_blank} про `async` і `await` у документації. +Якщо ви не впевнені, перегляньте розділ [Async: *"In a hurry?"*](../../async.md#in-a-hurry) про `async` і `await` у документації. /// diff --git a/docs/uk/docs/tutorial/encoder.md b/docs/uk/docs/tutorial/encoder.md index 1b403d5bba..7bbc45ef7b 100644 --- a/docs/uk/docs/tutorial/encoder.md +++ b/docs/uk/docs/tutorial/encoder.md @@ -12,7 +12,7 @@ Наприклад, вона не приймає об'єкти типу `datetime`, оскільки вони не сумісні з JSON. -Отже, об'єкт типу `datetime` потрібно перетворити на `str`, який містить дані в форматі ISO. +Отже, об'єкт типу `datetime` потрібно перетворити на `str`, який містить дані в [форматі ISO](https://en.wikipedia.org/wiki/ISO_8601). Так само ця база даних не прийматиме модель Pydantic (об'єкт з атрибутами), а лише `dict`. @@ -24,7 +24,7 @@ У цьому прикладі вона конвертує модель Pydantic у `dict`, а `datetime` у `str`. -Результат виклику цієї функції — це щось, що можна кодувати з використанням стандарту Python `json.dumps()`. +Результат виклику цієї функції — це щось, що можна кодувати з використанням стандарту Python [`json.dumps()`](https://docs.python.org/3/library/json.html#json.dumps). Вона не повертає великий `str`, який містить дані у форматі JSON (як рядок). Вона повертає стандартну структуру даних Python (наприклад, `dict`) зі значеннями та підзначеннями, які є сумісними з JSON. diff --git a/docs/uk/docs/tutorial/extra-data-types.md b/docs/uk/docs/tutorial/extra-data-types.md index a3545e0746..26d7c306fe 100644 --- a/docs/uk/docs/tutorial/extra-data-types.md +++ b/docs/uk/docs/tutorial/extra-data-types.md @@ -36,7 +36,7 @@ * `datetime.timedelta`: * Пайтонівський `datetime.timedelta`. * У запитах та відповідях буде представлений як `float` загальної кількості секунд. - * Pydantic також дозволяє представляти це як "ISO 8601 time diff encoding", дивіться документацію для отримання додаткової інформації. + * Pydantic також дозволяє представляти це як "ISO 8601 time diff encoding", [дивіться документацію для отримання додаткової інформації](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers). * `frozenset`: * У запитах і відповідях це буде оброблено так само, як і `set`: * У запитах список буде зчитано, дублікати буде видалено, і його буде перетворено на `set`. @@ -49,7 +49,7 @@ * `Decimal`: * Стандартний Пайтонівський `Decimal`. * У запитах і відповідях це буде оброблено так само, як і `float`. -* Ви можете перевірити всі дійсні типи даних Pydantic тут: типи даних Pydantic. +* Ви можете перевірити всі дійсні типи даних Pydantic тут: [типи даних Pydantic](https://docs.pydantic.dev/latest/usage/types/types/). ## Приклад { #example } diff --git a/docs/uk/docs/tutorial/extra-models.md b/docs/uk/docs/tutorial/extra-models.md index 25930b8c0b..271e553fd8 100644 --- a/docs/uk/docs/tutorial/extra-models.md +++ b/docs/uk/docs/tutorial/extra-models.md @@ -12,7 +12,7 @@ Ніколи не зберігайте паролі користувачів у відкритому вигляді. Завжди зберігайте «безпечний хеш», який потім можна перевірити. -Якщо ви ще не знаєте, що таке «хеш пароля», ви дізнаєтесь у [розділах про безпеку](security/simple-oauth2.md#password-hashing){.internal-link target=_blank}. +Якщо ви ще не знаєте, що таке «хеш пароля», ви дізнаєтесь у [розділах про безпеку](security/simple-oauth2.md#password-hashing). /// @@ -108,7 +108,7 @@ UserInDB(**user_dict) UserInDB(**user_in.model_dump()) ``` -...тому що `user_in.model_dump()` повертає `dict`, а ми змушуємо Python «розпакувати» його, передаючи в `UserInDB` з префіксом `**`. +...тому що `user_in.model_dump()` - це `dict`, а ми змушуємо Python «розпакувати» його, передаючи в `UserInDB` з префіксом `**`. Тож ми отримуємо модель Pydantic з даних іншої моделі Pydantic. @@ -162,11 +162,11 @@ UserInDB( В OpenAPI це буде визначено як `anyOf`. -Для цього використайте стандартну підказку типу Python `typing.Union`: +Для цього використайте стандартну підказку типу Python [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union): /// note | Примітка -Під час визначення `Union` спочатку вказуйте найконкретніший тип, а потім менш конкретний. У прикладі нижче більш конкретний `PlaneItem` стоїть перед `CarItem` у `Union[PlaneItem, CarItem]`. +Під час визначення [`Union`](https://docs.pydantic.dev/latest/concepts/types/#unions) спочатку вказуйте найконкретніший тип, а потім менш конкретний. У прикладі нижче більш конкретний `PlaneItem` стоїть перед `CarItem` у `Union[PlaneItem, CarItem]`. /// diff --git a/docs/uk/docs/tutorial/first-steps.md b/docs/uk/docs/tutorial/first-steps.md index f03a120a09..0f46890d9b 100644 --- a/docs/uk/docs/tutorial/first-steps.md +++ b/docs/uk/docs/tutorial/first-steps.md @@ -11,7 +11,7 @@
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -58,7 +58,7 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ### Перевірте { #check-it } -Відкрийте браузер та введіть адресу http://127.0.0.1:8000. +Відкрийте браузер за адресою [http://127.0.0.1:8000](http://127.0.0.1:8000). Ви побачите JSON-відповідь: @@ -68,17 +68,17 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ### Інтерактивна API документація { #interactive-api-docs } -Тепер перейдіть сюди http://127.0.0.1:8000/docs. +Тепер перейдіть сюди [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). -Ви побачите автоматичну інтерактивну API документацію (надається Swagger UI): +Ви побачите автоматичну інтерактивну API документацію (надається [Swagger UI](https://github.com/swagger-api/swagger-ui)): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Альтернативна API документація { #alternative-api-docs } -А тепер перейдіть сюди http://127.0.0.1:8000/redoc. +А тепер перейдіть сюди [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc). -Ви побачите альтернативну автоматичну документацію (надається ReDoc): +Ви побачите альтернативну автоматичну документацію (надається [ReDoc](https://github.com/Rebilly/ReDoc)): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) @@ -92,7 +92,7 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) #### API «схема» { #api-schema } -У цьому випадку, OpenAPI є специфікацією, яка визначає, як описати схему вашого API. +У цьому випадку, [OpenAPI](https://github.com/OAI/OpenAPI-Specification) є специфікацією, яка визначає, як описати схему вашого API. Це визначення схеми включає шляхи (paths) вашого API, можливі параметри, які вони приймають, тощо. @@ -110,7 +110,7 @@ OpenAPI описує схему API для вашого API. І ця схема Якщо вас цікавить, як виглядає «сирий» OpenAPI schema, FastAPI автоматично генерує JSON (schema) з описами всього вашого API. -Ви можете побачити це напряму тут: http://127.0.0.1:8000/openapi.json. +Ви можете побачити це напряму тут: [http://127.0.0.1:8000/openapi.json](http://127.0.0.1:8000/openapi.json). Ви побачите JSON, що починається приблизно так: @@ -143,9 +143,58 @@ OpenAPI schema — це те, на чому працюють дві включе Ви також можете використовувати його для автоматичної генерації коду для клієнтів, які взаємодіють з вашим API. Наприклад, для фронтенд-, мобільних або IoT-застосунків. +### Налаштуйте `entrypoint` застосунку в `pyproject.toml` { #configure-the-app-entrypoint-in-pyproject-toml } + +Ви можете налаштувати, де знаходиться ваш застосунок, у файлі `pyproject.toml`, приблизно так: + +```toml +[tool.fastapi] +entrypoint = "main:app" +``` + +Цей `entrypoint` повідомить команді `fastapi`, що вона має імпортувати застосунок так: + +```python +from main import app +``` + +Якщо структура вашого коду виглядала б так: + +``` +. +├── backend +│   ├── main.py +│   ├── __init__.py +``` + +Тоді ви б задали `entrypoint` як: + +```toml +[tool.fastapi] +entrypoint = "backend.main:app" +``` + +що було б еквівалентно: + +```python +from backend.main import app +``` + +### `fastapi dev` із шляхом { #fastapi-dev-with-path } + +Ви також можете передати шлях до файлу в команду `fastapi dev`, і вона вгадає обʼєкт FastAPI app, який слід використовувати: + +```console +$ fastapi dev main.py +``` + +Але вам доведеться щоразу памʼятати передавати правильний шлях під час виклику команди `fastapi`. + +Крім того, інші інструменти можуть не знайти його, наприклад [Розширення VS Code](../editor-support.md) або [FastAPI Cloud](https://fastapicloud.com), тому рекомендується використовувати `entrypoint` у `pyproject.toml`. + ### Розгорніть ваш застосунок (необовʼязково) { #deploy-your-app-optional } -За бажанням ви можете розгорнути ваш FastAPI-застосунок у FastAPI Cloud, перейдіть і приєднайтеся до списку очікування, якщо ви цього ще не зробили. 🚀 +За бажанням ви можете розгорнути ваш FastAPI-застосунок у [FastAPI Cloud](https://fastapicloud.com), перейдіть і приєднайтеся до списку очікування, якщо ви цього ще не зробили. 🚀 Якщо у вас вже є обліковий запис **FastAPI Cloud** (ми запросили вас зі списку очікування 😉), ви можете розгорнути ваш застосунок однією командою. @@ -191,7 +240,7 @@ Deploying to FastAPI Cloud... `FastAPI` — це клас, який успадковується безпосередньо від `Starlette`. -Ви також можете використовувати всю функціональність Starlette у `FastAPI`. +Ви також можете використовувати всю функціональність [Starlette](https://www.starlette.dev/) у `FastAPI`. /// @@ -336,7 +385,7 @@ https://example.com/items/foo /// note -Якщо ви не знаєте різницю, подивіться [Асинхронність: *«Поспішаєте?»*](../async.md#in-a-hurry){.internal-link target=_blank}. +Якщо ви не знаєте різницю, подивіться [Асинхронність: *«Поспішаєте?»*](../async.md#in-a-hurry). /// @@ -352,11 +401,11 @@ https://example.com/items/foo ### Крок 6: розгорніть його { #step-6-deploy-it } -Розгорніть ваш застосунок у **FastAPI Cloud** однією командою: `fastapi deploy`. 🎉 +Розгорніть ваш застосунок у **[FastAPI Cloud](https://fastapicloud.com)** однією командою: `fastapi deploy`. 🎉 #### Про FastAPI Cloud { #about-fastapi-cloud } -**FastAPI Cloud** створено тим самим автором і командою, які стоять за **FastAPI**. +**[FastAPI Cloud](https://fastapicloud.com)** створено тим самим автором і командою, які стоять за **FastAPI**. Він спрощує процес **створення**, **розгортання** та **доступу** до API з мінімальними зусиллями. diff --git a/docs/uk/docs/tutorial/handling-errors.md b/docs/uk/docs/tutorial/handling-errors.md index 28a83127ff..262efa0e03 100644 --- a/docs/uk/docs/tutorial/handling-errors.md +++ b/docs/uk/docs/tutorial/handling-errors.md @@ -11,11 +11,11 @@ * Елемент, до якого він намагається отримати доступ, не існує. * тощо. -У таких випадках зазвичай повертається **HTTP статус-код** в діапазоні **400** (від 400 до 499). +У таких випадках зазвичай повертається **код статусу HTTP** у діапазоні **400** (від 400 до 499). -Це схоже на HTTP статус-коди 200 (від 200 до 299). Ці «200» статус-коди означають, що якимось чином запит був «успішним». +Це схоже на коди статусу HTTP 200 (від 200 до 299). Ці «200» коди статусу означають, що якимось чином запит був «успішним». -Статус-коди в діапазоні 400 означають, що сталася помилка з боку клієнта. +Коди статусу в діапазоні 400 означають, що сталася помилка з боку клієнта. Пам'ятаєте всі ці помилки **«404 Not Found»** (і жарти про них)? @@ -29,7 +29,7 @@ ### Згенеруйте `HTTPException` у своєму коді { #raise-an-httpexception-in-your-code } -`HTTPException` — це звичайна помилка Python із додатковими даними, які стосуються API. +`HTTPException` - це звичайна помилка Python із додатковими даними, які стосуються API. Оскільки це помилка Python, ви не `return` її, а `raise` її. @@ -37,13 +37,13 @@ Перевага генерації виключення замість повернення значення стане більш очевидною в розділі про залежності та безпеку. -У цьому прикладі, коли клієнт запитує елемент за ID, якого не існує, згенеруйте виключення зі статус-кодом `404`: +У цьому прикладі, коли клієнт запитує елемент за ID, якого не існує, згенеруйте виключення з кодом статусу `404`: {* ../../docs_src/handling_errors/tutorial001_py310.py hl[11] *} ### Отримана відповідь { #the-resulting-response } -Якщо клієнт робить запит за шляхом `http://example.com/items/foo` (де `item_id` `"foo"`), він отримає HTTP статус-код 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"`), то отримає HTTP статус-код 404 (помилка «не знайдено») та JSON відповідь: +Але якщо клієнт робить запит на `http://example.com/items/bar` (де `item_id` має не існуюче значення `"bar"`), то отримає код статусу HTTP 404 (помилка «не знайдено») та JSON відповідь: ```JSON { @@ -81,7 +81,7 @@ ## Встановлення власних обробників виключень { #install-custom-exception-handlers } -Ви можете додати власні обробники виключень за допомогою тих самих утиліт для виключень зі Starlette. +Ви можете додати власні обробники виключень за допомогою [тих самих утиліт для виключень зі Starlette](https://www.starlette.dev/exceptions/). Припустімо, у вас є власне виключення `UnicornException`, яке ви (або бібліотека, яку ви використовуєте) можете `raise`. @@ -95,7 +95,7 @@ Але вона буде оброблена функцією-обробником `unicorn_exception_handler`. -Отже, ви отримаєте зрозумілу помилку зі HTTP-статусом `418` і JSON-вмістом: +Отже, ви отримаєте зрозумілу помилку з кодом статусу HTTP `418` і JSON-вмістом: ```JSON {"message": "Oops! yolo did something. There goes a rainbow..."} diff --git a/docs/uk/docs/tutorial/index.md b/docs/uk/docs/tutorial/index.md index ed53ac7728..629b71decc 100644 --- a/docs/uk/docs/tutorial/index.md +++ b/docs/uk/docs/tutorial/index.md @@ -1,4 +1,4 @@ -# Туторіал - Посібник користувача { #tutorial-user-guide } +# Навчальний посібник - Посібник користувача { #tutorial-user-guide } У цьому посібнику показано, як користуватися **FastAPI** з більшістю його функцій, крок за кроком. @@ -10,12 +10,12 @@ Усі блоки коду можна скопіювати та використовувати безпосередньо (це фактично перевірені файли Python). -Щоб запустити будь-який із прикладів, скопіюйте код у файл `main.py` і запустіть `fastapi dev` за допомогою: +Щоб запустити будь-який із прикладів, скопіюйте код у файл `main.py`, і запустіть `fastapi dev`:
```console -$ fastapi dev main.py +$ fastapi dev FastAPI Starting development server 🚀 @@ -62,7 +62,7 @@ $ fastapi dev @@ -76,7 +76,7 @@ $ pip install "fastapi[standard]" /// note | Примітка -Коли ви встановлюєте через `pip install "fastapi[standard]"`, він постачається з деякими типовими необов’язковими стандартними залежностями, включно з `fastapi-cloud-cli`, який дозволяє розгортати в FastAPI Cloud. +Коли ви встановлюєте через `pip install "fastapi[standard]"`, він постачається з деякими типовими необов’язковими стандартними залежностями, включно з `fastapi-cloud-cli`, який дозволяє розгортати в [FastAPI Cloud](https://fastapicloud.com). Якщо ви не хочете мати ці необов’язкові залежності, натомість можете встановити `pip install fastapi`. @@ -84,12 +84,18 @@ $ pip install "fastapi[standard]" /// +/// tip | Порада + +FastAPI має [офіційне розширення для VS Code](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (та Cursor), яке надає багато можливостей, включно з переглядачем операцій шляху, пошуком операцій шляху, навігацією CodeLens у тестах (перехід до визначення з тестів), а також розгортанням і журналами FastAPI Cloud — усе безпосередньо з вашого редактора. + +/// + ## Просунутий посібник користувача { #advanced-user-guide } -Існує також **Просунутий посібник користувача**, який ви зможете прочитати пізніше після цього **Туторіал - Посібник користувача**. +Існує також **Просунутий посібник користувача**, який ви зможете прочитати пізніше після цього **Навчальний посібник - Посібник користувача**. **Просунутий посібник користувача** засновано на цьому, використовує ті самі концепції та навчає вас деяким додатковим функціям. -Але вам слід спочатку прочитати **Туторіал - Посібник користувача** (те, що ви зараз читаєте). +Але вам слід спочатку прочитати **Навчальний посібник - Посібник користувача** (те, що ви зараз читаєте). -Він розроблений таким чином, що ви можете створити повну програму лише за допомогою **Туторіал - Посібник користувача**, а потім розширити її різними способами, залежно від ваших потреб, використовуючи деякі з додаткових ідей з **Просунутого посібника користувача**. +Він розроблений таким чином, що ви можете створити повну програму лише за допомогою **Навчальний посібник - Посібник користувача**, а потім розширити її різними способами, залежно від ваших потреб, використовуючи деякі з додаткових ідей з **Просунутого посібника користувача**. diff --git a/docs/uk/docs/tutorial/metadata.md b/docs/uk/docs/tutorial/metadata.md index ebe8dc40e1..ee1fdaf6dd 100644 --- a/docs/uk/docs/tutorial/metadata.md +++ b/docs/uk/docs/tutorial/metadata.md @@ -14,7 +14,7 @@ | `version` | `string` | Версія API. Це версія Вашого додатка, а не OpenAPI. Наприклад, `2.5.0`. | | `terms_of_service` | `str` | URL до умов використання API. Якщо вказано, має бути у форматі URL. | | `contact` | `dict` | Інформація для контакту з опублікованим API. Може містити кілька полів.
contact поля
ПараметрТипОпис
namestrІдентифікаційне ім'я контактної особи або організації.
urlstrURL, що вказує на контактну інформацію. МАЄ бути у форматі URL.
emailstrАдреса електронної пошти контактної особи або організації. МАЄ бути у форматі адреси електронної пошти.
| -| `license_info` | `dict` | Інформація про ліцензію для опублікованого API. Може містити кілька полів.
license_info поля
ПараметрТипОпис
namestrОБОВ'ЯЗКОВО (якщо встановлено license_info). Назва ліцензії для API.
identifierstrЛіцензійний вираз за SPDX для API. Поле identifier взаємовиключне з полем url. Доступно з OpenAPI 3.1.0, FastAPI 0.99.0.
urlstrURL до ліцензії, яка використовується для API. МАЄ бути у форматі URL.
| +| `license_info` | `dict` | Інформація про ліцензію для опублікованого API. Може містити кілька полів.
license_info поля
ПараметрТипОпис
namestrОБОВ'ЯЗКОВО (якщо встановлено license_info). Назва ліцензії для API.
identifierstrЛіцензійний вираз за [SPDX](https://spdx.org/licenses/) для API. Поле identifier взаємовиключне з полем url. Доступно з OpenAPI 3.1.0, FastAPI 0.99.0.
urlstrURL до ліцензії, яка використовується для API. МАЄ бути у форматі URL.
| Ви можете налаштувати їх наступним чином: @@ -40,7 +40,7 @@ ## Метадані для тегів { #metadata-for-tags } -Ви також можете додати додаткові метадані для різних тегів, які використовуються для групування операцій шляхів, за допомогою параметра `openapi_tags`. +Ви також можете додати додаткові метадані для різних тегів, які використовуються для групування операцій шляху, за допомогою параметра `openapi_tags`. Він приймає список, який містить один словник для кожного тега. @@ -60,7 +60,7 @@ {* ../../docs_src/metadata/tutorial004_py310.py hl[3:16,18] *} -Зверніть увагу, що в описах можна використовувати Markdown, наприклад, "login" буде показано жирним шрифтом (**login**), а "fancy" буде показано курсивом (_fancy_). +Зверніть увагу, що в описах можна використовувати Markdown, наприклад, «login» буде показано жирним шрифтом (**login**), а «fancy» буде показано курсивом (_fancy_). /// tip | Порада @@ -76,7 +76,7 @@ /// info | Інформація -Детальніше про теги читайте в розділі [Конфігурація операції шляху](path-operation-configuration.md#tags){.internal-link target=_blank}. +Детальніше про теги читайте в розділі [Конфігурація операції шляху](path-operation-configuration.md#tags). /// diff --git a/docs/uk/docs/tutorial/middleware.md b/docs/uk/docs/tutorial/middleware.md index 961fb179e7..a31357ba10 100644 --- a/docs/uk/docs/tutorial/middleware.md +++ b/docs/uk/docs/tutorial/middleware.md @@ -15,7 +15,7 @@ Якщо у вас є залежності з `yield`, код виходу виконається *після* middleware. -Якщо були заплановані фонові задачі (розглянуто в розділі [Background Tasks](background-tasks.md){.internal-link target=_blank}, ви побачите це пізніше), вони виконаються *після* всіх middleware. +Якщо були заплановані фонові задачі (розглянуто в розділі [Фонові задачі](background-tasks.md), ви побачите це пізніше), вони виконаються *після* всіх middleware. /// @@ -35,9 +35,9 @@ /// tip -Пам’ятайте, що власні пропрієтарні заголовки можна додавати використовуючи префікс `X-`. +Пам’ятайте, що власні пропрієтарні заголовки можна додавати [використовуючи префікс `X-`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers). -Але якщо у вас є власні заголовки, які ви хочете, щоб клієнт у браузері міг побачити, потрібно додати їх до ваших конфігурацій CORS ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) за допомогою параметра `expose_headers`, описаного в документації Starlette по CORS. +Але якщо у вас є власні заголовки, які ви хочете, щоб клієнт у браузері міг побачити, потрібно додати їх до ваших конфігурацій CORS ([CORS (Спільне використання ресурсів між джерелами)](cors.md)) за допомогою параметра `expose_headers`, описаного в [документації Starlette по CORS](https://www.starlette.dev/middleware/#corsmiddleware). /// @@ -61,7 +61,7 @@ /// tip -Тут ми використовуємо `time.perf_counter()` замість `time.time()` оскільки він може бути більш точним для таких випадків. 🤓 +Тут ми використовуємо [`time.perf_counter()`](https://docs.python.org/3/library/time.html#time.perf_counter) замість `time.time()` оскільки він може бути більш точним для таких випадків. 🤓 /// @@ -90,6 +90,6 @@ app.add_middleware(MiddlewareB) ## Інші middlewares { #other-middlewares } -Ви можете пізніше прочитати більше про інші middlewares в [Advanced User Guide: Advanced Middleware](../advanced/middleware.md){.internal-link target=_blank}. +Ви можете пізніше прочитати більше про інші middlewares у [просунутому посібнику користувача: просунуте middleware](../advanced/middleware.md). Ви дізнаєтесь, як обробляти CORS за допомогою middleware в наступному розділі. diff --git a/docs/uk/docs/tutorial/path-operation-configuration.md b/docs/uk/docs/tutorial/path-operation-configuration.md index 91b58b24ec..292066c1f8 100644 --- a/docs/uk/docs/tutorial/path-operation-configuration.md +++ b/docs/uk/docs/tutorial/path-operation-configuration.md @@ -58,7 +58,7 @@ FastAPI підтримує це так само, як і зі звичайним Оскільки описи зазвичай довгі та займають кілька рядків, ви можете оголосити опис «операції шляху» у строці документації функції, і FastAPI прочитає його звідти. -Ви можете писати Markdown у строці документації, його буде інтерпретовано та показано коректно (з урахуванням відступів у строці документації). +Ви можете писати [Markdown](https://en.wikipedia.org/wiki/Markdown) у строці документації, його буде інтерпретовано та показано коректно (з урахуванням відступів у строці документації). {* ../../docs_src/path_operation_configuration/tutorial004_py310.py hl[17:25] *} diff --git a/docs/uk/docs/tutorial/path-params-numeric-validations.md b/docs/uk/docs/tutorial/path-params-numeric-validations.md index 9458436fd3..39397a3b1d 100644 --- a/docs/uk/docs/tutorial/path-params-numeric-validations.md +++ b/docs/uk/docs/tutorial/path-params-numeric-validations.md @@ -14,7 +14,7 @@ FastAPI додав підтримку `Annotated` (і почав рекомен Якщо у вас стара версія, при спробі використати `Annotated` можуть виникати помилки. -Переконайтеся, що ви [оновили версію FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} принаймні до версії 0.95.1 перед використанням `Annotated`. +Переконайтеся, що ви [оновили версію FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions) принаймні до версії 0.95.1 перед використанням `Annotated`. /// @@ -122,7 +122,7 @@ Python нічого не зробить із цією `*`, але розпізн ## Підсумок { #recap } -За допомогою `Query`, `Path` (і інших параметрів, які ви ще не бачили) можна оголошувати метадані та перевірки рядків так само як у [Query параметри та валідація рядків](query-params-str-validations.md){.internal-link target=_blank}. +За допомогою `Query`, `Path` (і інших параметрів, які ви ще не бачили) можна оголошувати метадані та перевірки рядків так само як у [Query параметри та валідація рядків](query-params-str-validations.md). Також можна оголошувати числові перевірки: diff --git a/docs/uk/docs/tutorial/path-params.md b/docs/uk/docs/tutorial/path-params.md index 17b99cf39a..eb05a4412f 100644 --- a/docs/uk/docs/tutorial/path-params.md +++ b/docs/uk/docs/tutorial/path-params.md @@ -6,7 +6,7 @@ Значення параметра шляху `item_id` буде передано у вашу функцію як аргумент `item_id`. -Отже, якщо ви запустите цей приклад і перейдете за посиланням http://127.0.0.1:8000/items/foo, то побачите відповідь: +Отже, якщо ви запустите цей приклад і перейдете за посиланням [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo), то побачите відповідь: ```JSON {"item_id":"foo"} @@ -28,7 +28,7 @@ ## Перетворення даних { #data-conversion } -Якщо ви запустите цей приклад і відкриєте у браузері http://127.0.0.1:8000/items/3, то побачите відповідь: +Якщо ви запустите цей приклад і відкриєте у браузері [http://127.0.0.1:8000/items/3](http://127.0.0.1:8000/items/3), то побачите відповідь: ```JSON {"item_id":3} @@ -44,7 +44,7 @@ ## Валідація даних { #data-validation } -Але якщо ви перейдете у браузері за посиланням http://127.0.0.1:8000/items/foo, ви побачите гарну HTTP-помилку: +Але якщо ви перейдете у браузері за посиланням [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo), ви побачите гарну HTTP-помилку: ```JSON { @@ -64,7 +64,7 @@ тому що параметр шляху `item_id` мав значення `"foo"`, яке не є `int`. -Та сама помилка з’явиться, якщо ви передасте `float` замість `int`, як у: http://127.0.0.1:8000/items/4.2 +Та сама помилка з’явиться, якщо ви передасте `float` замість `int`, як у: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2) /// check | Перевірте @@ -78,7 +78,7 @@ ## Документація { #documentation } -А коли ви відкриєте у браузері http://127.0.0.1:8000/docs, ви побачите автоматичну, інтерактивну, API-документацію на кшталт: +А коли ви відкриєте у браузері [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs), ви побачите автоматичну, інтерактивну, API-документацію на кшталт: @@ -92,9 +92,9 @@ ## Переваги стандартів, альтернативна документація { #standards-based-benefits-alternative-documentation } -І оскільки згенерована схема відповідає стандарту OpenAPI, існує багато сумісних інструментів. +І оскільки згенерована схема відповідає стандарту [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md), існує багато сумісних інструментів. -Через це **FastAPI** також надає альтернативну API-документацію (використовуючи ReDoc), до якої ви можете отримати доступ за посиланням http://127.0.0.1:8000/redoc: +Через це **FastAPI** також надає альтернативну API-документацію (використовуючи ReDoc), до якої ви можете отримати доступ за посиланням [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc): @@ -102,7 +102,7 @@ ## Pydantic { #pydantic } -Уся валідація даних виконується за лаштунками за допомогою Pydantic, тож ви отримуєте всі переваги від його використання. І ви знаєте, що ви в надійних руках. +Уся валідація даних виконується за лаштунками за допомогою [Pydantic](https://docs.pydantic.dev/), тож ви отримуєте всі переваги від його використання. І ви знаєте, що ви в надійних руках. Ви можете використовувати ті самі оголошення типів з `str`, `float`, `bool` та багатьма іншими складними типами даних. diff --git a/docs/uk/docs/tutorial/query-params-str-validations.md b/docs/uk/docs/tutorial/query-params-str-validations.md index 706dc670aa..afe86d482b 100644 --- a/docs/uk/docs/tutorial/query-params-str-validations.md +++ b/docs/uk/docs/tutorial/query-params-str-validations.md @@ -35,13 +35,13 @@ FastAPI додав підтримку `Annotated` (і почав рекомен Якщо у вас старіша версія, під час використання `Annotated` можуть виникати помилки. -Переконайтеся, що ви [оновили версію FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions){.internal-link target=_blank} до принаймні 0.95.1, перш ніж використовувати `Annotated`. +Переконайтеся, що ви [оновили версію FastAPI](../deployment/versions.md#upgrading-the-fastapi-versions) до принаймні 0.95.1, перш ніж використовувати `Annotated`. /// ## Використання `Annotated` у типі параметра `q` { #use-annotated-in-the-type-for-the-q-parameter } -Пам’ятаєте, як я раніше розповідав, що `Annotated` можна використовувати для додавання метаданих до параметрів у [Вступі до типів Python](../python-types.md#type-hints-with-metadata-annotations){.internal-link target=_blank}? +Пам’ятаєте, як я раніше розповідав, що `Annotated` можна використовувати для додавання метаданих до параметрів у [Вступі до типів Python](../python-types.md#type-hints-with-metadata-annotations)? Зараз саме час використати його разом із FastAPI. 🚀 @@ -157,7 +157,7 @@ q: str = Query(default="rick") Якщо ви не використовуєте `Annotated`, а використовуєте (старий) стиль значень за замовчуванням, то при виклику цієї функції без FastAPI в інших місцях потрібно пам’ятати передати їй аргументи, щоб вона працювала коректно, інакше значення будуть відрізнятися від очікуваних (наприклад, ви отримаєте `QueryInfo` або щось подібне замість `str`). І ваш редактор не повідомить про помилку, і Python не скаржитиметься під час запуску цієї функції — лише коли операції всередині завершаться помилкою. -Оскільки `Annotated` може містити кілька анотацій метаданих, тепер ви навіть можете використовувати ту саму функцію з іншими інструментами, такими як Typer. 🚀 +Оскільки `Annotated` може містити кілька анотацій метаданих, тепер ви навіть можете використовувати ту саму функцію з іншими інструментами, такими як [Typer](https://typer.tiangolo.com/). 🚀 ## Додавання додаткових валідацій { #add-more-validations } @@ -223,7 +223,7 @@ q: Annotated[str | None, Query(min_length=3)] = None Ви можете вказати, що параметр може приймати `None`, але при цьому залишається обов’язковим. Це змусить клієнтів надіслати значення, навіть якщо значення дорівнює `None`. -Щоб зробити це, оголосіть, що `None` є допустимим типом, але просто не вказуйте значення за замовчуванням: +Щоб зробити це, оголосіть, що `None` є допустимим типом, але просто не вкажіть значення за замовчуванням: {* ../../docs_src/query_params_str_validations/tutorial006c_an_py310.py hl[9] *} @@ -369,11 +369,11 @@ http://127.0.0.1:8000/items/?item-query=foobaritems У таких випадках ви можете використати кастомну функцію-валідатор, яка буде застосована після звичайної валідації (наприклад, після перевірки, що значення є типом `str`). -Це можна досягти за допомогою Pydantic's `AfterValidator` в середині `Annotated`. +Це можна досягти за допомогою [Pydantic's `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) в середині `Annotated`. /// tip | Порада -Pydantic також має `BeforeValidator` та інші. 🤓 +Pydantic також має [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator) та інші. 🤓 /// diff --git a/docs/uk/docs/tutorial/query-params.md b/docs/uk/docs/tutorial/query-params.md index 4888f4c461..b665a620e5 100644 --- a/docs/uk/docs/tutorial/query-params.md +++ b/docs/uk/docs/tutorial/query-params.md @@ -183,6 +183,6 @@ http://127.0.0.1:8000/items/foo-item?needy=sooooneedy /// tip | Порада -Ви також можете використовувати `Enum` так само, як і з [Параметри шляху](path-params.md#predefined-values){.internal-link target=_blank}. +Ви також можете використовувати `Enum` так само, як і з [Параметри шляху](path-params.md#predefined-values). /// diff --git a/docs/uk/docs/tutorial/request-files.md b/docs/uk/docs/tutorial/request-files.md index 8e64b12c38..f81e468d0d 100644 --- a/docs/uk/docs/tutorial/request-files.md +++ b/docs/uk/docs/tutorial/request-files.md @@ -4,9 +4,9 @@ /// info | Інформація -Щоб отримувати завантажені файли, спочатку встановіть `python-multipart`. +Щоб отримувати завантажені файли, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart). -Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили пакет, наприклад: +Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, а потім встановили його, наприклад: ```console $ pip install python-multipart @@ -63,8 +63,8 @@ $ pip install python-multipart * Файл зберігається в пам'яті до досягнення максимального обмеження розміру, після чого він буде збережений на диску. * Це означає, що він добре працюватиме для великих файлів, таких як зображення, відео, великі двійкові файли тощо, не споживаючи всю пам'ять. * Ви можете отримати метадані про завантажений файл. -* Він має file-like `async` інтерфейс. -* Він надає фактичний об'єкт Python `SpooledTemporaryFile`, який можна передавати безпосередньо іншим бібліотекам, що очікують file-like об'єкт. +* Він має [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), який можна передавати безпосередньо іншим бібліотекам, що очікують file-like об'єкт. ### `UploadFile` { #uploadfile } @@ -72,7 +72,7 @@ $ pip install python-multipart * `filename`: Рядок `str` з оригінальною назвою файлу, який був завантажений (наприклад, `myimage.jpg`). * `content_type`: Рядок `str` з типом вмісту (MIME type / media type) (наприклад, `image/jpeg`). -* `file`: `SpooledTemporaryFile` (file-like об'єкт). Це фактичний файловий об'єкт Python, який ви можете передавати безпосередньо іншим функціям або бібліотекам, що очікують «file-like» об'єкт. +* `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`). @@ -121,7 +121,7 @@ contents = myfile.file.read() Але якщо форма містить файли, вона кодується як `multipart/form-data`. Якщо ви використовуєте `File`, **FastAPI** знатиме, що потрібно отримати файли з правильної частини тіла. -Якщо ви хочете дізнатися більше про ці типи кодування та формові поля, ознайомтеся з MDN web docs для POST. +Якщо ви хочете дізнатися більше про ці типи кодування та формові поля, ознайомтеся з [MDN web docs для `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). /// diff --git a/docs/uk/docs/tutorial/request-form-models.md b/docs/uk/docs/tutorial/request-form-models.md index 86510be589..6f785016da 100644 --- a/docs/uk/docs/tutorial/request-form-models.md +++ b/docs/uk/docs/tutorial/request-form-models.md @@ -2,11 +2,11 @@ У FastAPI ви можете використовувати **Pydantic-моделі** для оголошення **полів форми**. -/// info | Інформація +/// info -Щоб використовувати форми, спочатку встановіть `python-multipart`. +Щоб використовувати форми, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart). -Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили його, наприклад: +Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, а потім встановили його, наприклад: ```console $ pip install 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 817769b714..c6d2548084 100644 --- a/docs/uk/docs/tutorial/request-forms-and-files.md +++ b/docs/uk/docs/tutorial/request-forms-and-files.md @@ -4,9 +4,9 @@ /// info | Інформація -Щоб отримувати завантажені файли та/або дані форми, спочатку встановіть `python-multipart`. +Щоб отримувати завантажені файли та/або дані форми, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart). -Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили бібліотеку, наприклад: +Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, а потім встановили бібліотеку, наприклад: ```console $ pip install python-multipart diff --git a/docs/uk/docs/tutorial/request-forms.md b/docs/uk/docs/tutorial/request-forms.md index 7f0c6e9bb3..d02b85068b 100644 --- a/docs/uk/docs/tutorial/request-forms.md +++ b/docs/uk/docs/tutorial/request-forms.md @@ -4,9 +4,9 @@ /// info | Інформація -Щоб використовувати форми, спочатку встановіть `python-multipart`. +Щоб використовувати форми, спочатку встановіть [`python-multipart`](https://github.com/Kludex/python-multipart). -Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, і потім встановили бібліотеку, наприклад: +Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, і потім встановили бібліотеку, наприклад: ```console $ pip install python-multipart @@ -56,7 +56,7 @@ HTML-форми (`
`) надсилають дані на серве Але якщо форма містить файли, вона кодується як `multipart/form-data`. Ви дізнаєтеся про обробку файлів у наступному розділі. -Якщо ви хочете дізнатися більше про ці кодування та поля форм, зверніться до MDN вебдокументації для POST. +Якщо ви хочете дізнатися більше про ці кодування та поля форм, зверніться до [MDN вебдокументації для `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST). /// diff --git a/docs/uk/docs/tutorial/response-model.md b/docs/uk/docs/tutorial/response-model.md index fcf765c9da..86f12bff44 100644 --- a/docs/uk/docs/tutorial/response-model.md +++ b/docs/uk/docs/tutorial/response-model.md @@ -13,6 +13,7 @@ FastAPI використовуватиме цей тип повернення, * Додати **JSON Schema** для відповіді в OpenAPI *операції шляху*. * Це буде використано в **автоматичній документації**. * Це також буде використано інструментами, які автоматично генерують клієнтський код. +* **Серіалізувати** повернені дані в JSON за допомогою Pydantic, який написаний мовою **Rust**, тому це буде **набагато швидше**. Але найголовніше: @@ -73,9 +74,9 @@ FastAPI використовуватиме цей `response_model` для вик /// info | Інформація -Щоб використовувати `EmailStr`, спочатку встановіть `email-validator`. +Щоб використовувати `EmailStr`, спочатку встановіть [`email-validator`](https://github.com/JoshData/python-email-validator). -Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили пакет, наприклад: +Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, а потім встановили пакет, наприклад: ```console $ pip install email-validator @@ -101,7 +102,7 @@ $ pip install "pydantic[email]" /// danger | Обережно -Ніколи не зберігайте пароль користувача у відкритому вигляді та не надсилайте його у відповіді таким чином, якщо тільки ви не знаєте всіх застережень і точно розумієте, що робите. +Ніколи не зберігайте пароль користувача у відкритому вигляді та не надсилайте його у відповіді таким чином, якщо тільки ви не знаєте всі застереження і точно розумієте, що робите. /// @@ -181,7 +182,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd ### Повернути Response напряму { #return-a-response-directly } -Найпоширенішим випадком буде [повернення Response напряму, як пояснюється пізніше у розширеній документації](../advanced/response-directly.md){.internal-link target=_blank}. +Найпоширенішим випадком буде [повернення Response напряму, як пояснюється пізніше у розширеній документації](../advanced/response-directly.md). {* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *} @@ -257,7 +258,7 @@ FastAPI виконує кілька внутрішніх операцій з Pyd * `response_model_exclude_defaults=True` * `response_model_exclude_none=True` -як описано в документації Pydantic для `exclude_defaults` та `exclude_none`. +як описано в [документації Pydantic](https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict) для `exclude_defaults` та `exclude_none`. /// diff --git a/docs/uk/docs/tutorial/response-status-code.md b/docs/uk/docs/tutorial/response-status-code.md index c9ceb8f508..d453510f92 100644 --- a/docs/uk/docs/tutorial/response-status-code.md +++ b/docs/uk/docs/tutorial/response-status-code.md @@ -20,7 +20,7 @@ /// info | Інформація -`status_code` також може, як альтернативу, приймати `IntEnum`, наприклад, Python `http.HTTPStatus`. +`status_code` також може, як альтернативу, приймати `IntEnum`, наприклад, Python [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus). /// @@ -66,7 +66,7 @@ FastAPI знає про це і створить документацію OpenAP /// tip | Порада -Щоб дізнатися більше про кожен код статусу і для чого призначений кожен із них, перегляньте документацію MDN про HTTP коди статусу. +Щоб дізнатися більше про кожен код статусу і для чого призначений кожен із них, перегляньте [документацію MDN про HTTP коди статусу](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status). /// @@ -98,4 +98,4 @@ FastAPI знає про це і створить документацію OpenAP ## Зміна значення за замовчуванням { #changing-the-default } -Пізніше, у [Посібнику для досвідчених користувачів](../advanced/response-change-status-code.md){.internal-link target=_blank}, ви побачите, як повертати інший код статусу, ніж значення за замовчуванням, яке ви оголошуєте тут. +Пізніше, у [Просунутому посібнику користувача](../advanced/response-change-status-code.md), ви побачите, як повертати інший код статусу, ніж значення за замовчуванням, яке ви оголошуєте тут. diff --git a/docs/uk/docs/tutorial/schema-extra-example.md b/docs/uk/docs/tutorial/schema-extra-example.md index 38ce0eb303..742871e394 100644 --- a/docs/uk/docs/tutorial/schema-extra-example.md +++ b/docs/uk/docs/tutorial/schema-extra-example.md @@ -1,34 +1,34 @@ # Декларування прикладів вхідних даних { #declare-request-example-data } -Ви можете задати приклади даних, які Ваш застосунок може отримувати. +Ви можете задати приклади даних, які ваш застосунок може отримувати. Ось кілька способів, як це зробити. -## Додаткові дані JSON-схеми в моделях Pydantic { #extra-json-schema-data-in-pydantic-models } +## Додаткові дані Схеми JSON у моделях Pydantic { #extra-json-schema-data-in-pydantic-models } -Ви можете задати `examples` для моделі Pydantic, які буде додано до згенерованої JSON-схеми. +Ви можете задати `examples` для моделі Pydantic, які буде додано до згенерованої Схеми JSON. {* ../../docs_src/schema_extra_example/tutorial001_py310.py hl[13:24] *} -Ця додаткова інформація буде додана як є до **JSON-схеми** для цієї моделі, і вона буде використана в документації до API. +Ця додаткова інформація буде додана як є до **Схеми JSON** для цієї моделі, і вона буде використана в документації до API. -Ви можете використати атрибут `model_config`, який приймає `dict`, як описано в документації Pydantic: Configuration. +Ви можете використати атрибут `model_config`, який приймає `dict`, як описано в [документації Pydantic: Configuration](https://docs.pydantic.dev/latest/api/config/). -Ви можете встановити `"json_schema_extra"` як `dict`, що містить будь-які додаткові дані, які Ви хочете відобразити у згенерованій JSON-схемі, включаючи `examples`. +Ви можете встановити `"json_schema_extra"` як `dict`, що містить будь-які додаткові дані, які ви хочете відобразити у згенерованій Схемі JSON, включаючи `examples`. /// tip | Порада -Ви можете використати ту ж техніку, щоб розширити JSON-схему і додати власну додаткову інформацію. +Ви можете використати ту ж техніку, щоб розширити Схему JSON і додати власну додаткову інформацію. -Наприклад, Ви можете використати її для додавання метаданих для інтерфейсу користувача на фронтенді тощо. +Наприклад, ви можете використати її для додавання метаданих для інтерфейсу користувача на фронтенді тощо. /// /// info | Інформація -OpenAPI 3.1.0 (який використовується починаючи з FastAPI 0.99.0) додав підтримку `examples`, що є частиною стандарту **JSON-схеми**. +OpenAPI 3.1.0 (який використовується починаючи з FastAPI 0.99.0) додав підтримку `examples`, що є частиною стандарту **Схеми JSON**. -До цього підтримувався лише ключ `example` з одним прикладом. Він все ще підтримується в OpenAPI 3.1.0, але є застарілим і не входить до стандарту JSON Schema. Тому рекомендується перейти з `example` на `examples`. 🤓 +До цього підтримувався лише ключ `example` з одним прикладом. Він все ще підтримується в OpenAPI 3.1.0, але є застарілим і не входить до стандарту Схеми JSON. Тому рекомендується перейти з `example` на `examples`. 🤓 Більше про це можна прочитати в кінці цієї сторінки. @@ -36,11 +36,11 @@ OpenAPI 3.1.0 (який використовується починаючи з F ## Додаткові аргументи `Field` { #field-additional-arguments } -Коли ви використовуєте `Field()` у моделях Pydantic, Ви також можете вказати додаткові `examples`: +Коли ви використовуєте `Field()` у моделях Pydantic, ви також можете вказати додаткові `examples`: {* ../../docs_src/schema_extra_example/tutorial002_py310.py hl[2,8:11] *} -## `examples` у JSON-схемі - OpenAPI { #examples-in-json-schema-openapi } +## `examples` у Схемі JSON - OpenAPI { #examples-in-json-schema-openapi } При використанні будь-кого з наступного: @@ -52,7 +52,7 @@ OpenAPI 3.1.0 (який використовується починаючи з F * `Form()` * `File()` -Ви також можете задати набір `examples` з додатковою інформацією, яка буде додана до їхніх **JSON-схем** у **OpenAPI**. +ви також можете задати набір `examples` з додатковою інформацією, яка буде додана до їхніх **Схем JSON** у **OpenAPI**. ### `Body` з `examples` { #body-with-examples } @@ -68,25 +68,25 @@ OpenAPI 3.1.0 (який використовується починаючи з F ### `Body` з кількома `examples` { #body-with-multiple-examples } -Звичайно, Ви також можете передати кілька `examples`: +Звичайно, ви також можете передати кілька `examples`: {* ../../docs_src/schema_extra_example/tutorial004_an_py310.py hl[23:38] *} -Коли Ви це робите, приклади будуть частиною внутрішньої **JSON-схеми** для цих даних тіла. +Коли ви це робите, приклади будуть частиною внутрішньої **Схеми JSON** для цих даних тіла. -Втім, на час написання цього, Swagger UI — інструмент, який відповідає за відображення UI документації — не підтримує показ кількох прикладів для даних у **JSON-схемі**. Але нижче можна прочитати про обхідний шлях. +Втім, на час написання цього, Swagger UI - інструмент, який відповідає за відображення UI документації - не підтримує показ кількох прикладів для даних у **Схемі JSON**. Але нижче можна прочитати про обхідний шлях. ### Специфічні для OpenAPI `examples` { #openapi-specific-examples } -Ще до того, як **JSON-схема** почала підтримувати `examples`, OpenAPI вже мала підтримку іншого поля, яке також називається `examples`. +Ще до того, як **Схема JSON** почала підтримувати `examples`, OpenAPI вже мала підтримку іншого поля, яке також називається `examples`. -Це **специфічне для OpenAPI** поле `examples` розміщується в іншому розділі специфікації OpenAPI. Воно розміщується в **деталях кожної *операції шляху***, а не всередині кожної JSON-схеми. +Це **специфічне для OpenAPI** поле `examples` розміщується в іншому розділі специфікації OpenAPI. Воно розміщується в **деталях кожної *операції шляху***, а не всередині кожної Схеми JSON. -І Swagger UI вже давно підтримує це поле `examples`. Тому Ви можете використовувати його, щоб **відображати** різні **приклади в UI документації**. +І Swagger UI вже давно підтримує це поле `examples`. Тому ви можете використовувати його, щоб **відображати** різні **приклади в UI документації**. -Форма цього специфічного для OpenAPI поля `examples` — це `dict` з **кількома прикладами** (а не `list`), кожен із яких має додаткову інформацію, яка також буде додана до **OpenAPI**. +Форма цього специфічного для OpenAPI поля `examples` - це `dict` з **кількома прикладами** (а не `list`), кожен із яких має додаткову інформацію, яка також буде додана до **OpenAPI**. -Воно не включається всередину кожної JSON-схеми, що міститься в OpenAPI, воно розміщується зовні, безпосередньо в *операції шляху*. +Воно не включається всередину кожної Схеми JSON, що міститься в OpenAPI, воно розміщується зовні, безпосередньо в *операції шляху*. ### Використання параметра `openapi_examples` { #using-the-openapi-examples-parameter } @@ -100,7 +100,7 @@ OpenAPI 3.1.0 (який використовується починаючи з F * `Form()` * `File()` -Ключі `dict` ідентифікують кожен приклад, а кожне значення — це інший `dict`. +Ключі `dict` ідентифікують кожен приклад, а кожне значення - це інший `dict`. Кожен специфічний `dict` прикладу в `examples` може містити: @@ -123,34 +123,34 @@ OpenAPI 3.1.0 (який використовується починаючи з F /// tip | Порада -Якщо Ви вже використовуєте **FastAPI** версії **0.99.0 або вище**, Ви, ймовірно, можете **пропустити** ці технічні деталі. +Якщо ви вже використовуєте **FastAPI** версії **0.99.0 або вище**, ви, ймовірно, можете **пропустити** ці технічні деталі. Вони більш актуальні для старих версій, до появи OpenAPI 3.1.0. -Можна вважати це коротким **історичним екскурсом** у OpenAPI та JSON Schema. 🤓 +Можна вважати це коротким **історичним екскурсом** у OpenAPI та Схему JSON. 🤓 /// /// warning | Попередження -Це дуже технічна інформація про стандарти **JSON Schema** і **OpenAPI**. +Це дуже технічна інформація про стандарти **Схема JSON** і **OpenAPI**. -Якщо вищезгадані ідеї вже працюють у Вас, цього може бути достатньо, і Вам, ймовірно, не потрібні ці деталі — можете пропустити. +Якщо вищезгадані ідеї вже працюють у вас, цього може бути достатньо, і вам, ймовірно, не потрібні ці деталі - можете пропустити. /// -До OpenAPI 3.1.0 OpenAPI використовував стару та модифіковану версію **JSON Schema**. +До OpenAPI 3.1.0 OpenAPI використовував стару та модифіковану версію **Схеми JSON**. -JSON Schema не мала `examples`, тож OpenAPI додала власне поле `example` до своєї модифікованої версії. +Схема JSON не мала `examples`, тож OpenAPI додала власне поле `example` до своєї модифікованої версії. OpenAPI також додала поля `example` і `examples` до інших частин специфікації: -* `Parameter Object` (в специфікації), який використовувався утилітами FastAPI: +* [`Parameter Object` (у специфікації)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object), який використовувався утилітами FastAPI: * `Path()` * `Query()` * `Header()` * `Cookie()` -* `Request Body Object`, у полі `content`, у `Media Type Object` (в специфікації), який використовувався утилітами FastAPI: +* [`Request Body Object`, у полі `content`, у `Media Type Object` (у специфікації)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object), який використовувався утилітами FastAPI: * `Body()` * `File()` * `Form()` @@ -161,19 +161,19 @@ OpenAPI також додала поля `example` і `examples` до інших /// -### Поле `examples` у JSON Schema { #json-schemas-examples-field } +### Поле `examples` у Схемі JSON { #json-schemas-examples-field } -Пізніше JSON Schema додала поле `examples` у нову версію специфікації. +Пізніше Схема JSON додала поле [`examples`](https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5) у нову версію специфікації. А потім новий OpenAPI 3.1.0 базувався на найновішій версії (JSON Schema 2020-12), яка включала це нове поле `examples`. І тепер це нове поле `examples` має вищий пріоритет за старе одиночне (і кастомне) поле `example`, яке тепер є застарілим. -Це нове поле `examples` у JSON Schema — це **просто `list`** прикладів, а не `dict` з додатковими метаданими, як в інших місцях OpenAPI (описаних вище). +Це нове поле `examples` у Схемі JSON - це **просто `list`** прикладів, а не `dict` з додатковими метаданими, як в інших місцях OpenAPI (описаних вище). /// info | Інформація -Навіть після релізу OpenAPI 3.1.0 з цією новою простішою інтеграцією з JSON Schema, протягом певного часу Swagger UI, інструмент, який надає автоматичну документацію, не підтримував OpenAPI 3.1.0 (тепер підтримує, починаючи з версії 5.0.0 🎉). +Навіть після релізу OpenAPI 3.1.0 з цією новою простішою інтеграцією зі Схемою JSON, протягом певного часу Swagger UI, інструмент, який надає автоматичну документацію, не підтримував OpenAPI 3.1.0 (тепер підтримує, починаючи з версії 5.0.0 🎉). Через це версії FastAPI до 0.99.0 все ще використовували версії OpenAPI нижчі за 3.1.0. @@ -181,22 +181,22 @@ OpenAPI також додала поля `example` і `examples` до інших ### `examples` у Pydantic і FastAPI { #pydantic-and-fastapi-examples } -Коли Ви додаєте `examples` у модель Pydantic через `schema_extra` або `Field(examples=["something"])`, цей приклад додається до **JSON Schema** для цієї моделі Pydantic. +Коли ви додаєте `examples` у модель Pydantic через `schema_extra` або `Field(examples=["something"])`, цей приклад додається до **Схеми JSON** для цієї моделі Pydantic. -І ця **JSON Schema** Pydantic-моделі включається до **OpenAPI** Вашого API, а потім використовується в UI документації. +І ця **Схема JSON** Pydantic-моделі включається до **OpenAPI** вашого API, а потім використовується в UI документації. -У версіях FastAPI до 0.99.0 (0.99.0 і вище використовують новіший OpenAPI 3.1.0), коли Ви використовували `example` або `examples` з будь-якими іншими утилітами (`Query()`, `Body()` тощо), ці приклади не додавалися до JSON Schema, що описує ці дані (навіть не до власної версії JSON Schema в OpenAPI), натомість вони додавалися безпосередньо до декларації *операції шляху* в OpenAPI (поза межами частин OpenAPI, які використовують JSON Schema). +У версіях FastAPI до 0.99.0 (0.99.0 і вище використовують новіший OpenAPI 3.1.0), коли ви використовували `example` або `examples` з будь-якими іншими утилітами (`Query()`, `Body()` тощо), ці приклади не додавалися до Схеми JSON, що описує ці дані (навіть не до власної версії Схеми JSON в OpenAPI), натомість вони додавалися безпосередньо до декларації *операції шляху* в OpenAPI (поза межами частин OpenAPI, які використовують Схему JSON). -Але тепер, коли FastAPI 0.99.0 і вище використовує OpenAPI 3.1.0, який використовує JSON Schema 2020-12, і Swagger UI 5.0.0 і вище, все стало більш узгодженим, і приклади включаються до JSON Schema. +Але тепер, коли FastAPI 0.99.0 і вище використовує OpenAPI 3.1.0, який використовує JSON Schema 2020-12, і Swagger UI 5.0.0 і вище, все стало більш узгодженим, і приклади включаються до Схеми JSON. ### Swagger UI та специфічні для OpenAPI `examples` { #swagger-ui-and-openapi-specific-examples } -Оскільки Swagger UI не підтримував кілька прикладів JSON Schema (станом на 2023-08-26), користувачі не мали можливості показати кілька прикладів у документації. +Оскільки Swagger UI не підтримував кілька прикладів Схеми JSON (станом на 2023-08-26), користувачі не мали можливості показати кілька прикладів у документації. Щоб вирішити це, FastAPI `0.103.0` **додав підтримку** оголошення того самого старого **OpenAPI-специфічного** поля `examples` через новий параметр `openapi_examples`. 🤓 ### Підсумок { #summary } -Раніше я казав, що не дуже люблю історію... а тепер подивіться на мене — читаю «технічні історичні» лекції. 😅 +Раніше я казав, що не дуже люблю історію... а тепер подивіться на мене - читаю «технічні історичні» лекції. 😅 -Коротко: **оновіться до FastAPI 0.99.0 або вище** — і все стане значно **простішим, узгодженим та інтуїтивно зрозумілим**, і Вам не доведеться знати всі ці історичні деталі. 😎 +Коротко: **оновіться до FastAPI 0.99.0 або вище** - і все стане значно **простішим, узгодженим та інтуїтивно зрозумілим**, і вам не доведеться знати всі ці історичні деталі. 😎 diff --git a/docs/uk/docs/tutorial/security/first-steps.md b/docs/uk/docs/tutorial/security/first-steps.md index 491328d865..bfe1962234 100644 --- a/docs/uk/docs/tutorial/security/first-steps.md +++ b/docs/uk/docs/tutorial/security/first-steps.md @@ -26,11 +26,11 @@ /// info | Інформація -Пакет `python-multipart` автоматично встановлюється з **FastAPI**, коли ви виконуєте команду `pip install "fastapi[standard]"`. +Пакет [`python-multipart`](https://github.com/Kludex/python-multipart) автоматично встановлюється з **FastAPI**, коли ви виконуєте команду `pip install "fastapi[standard]"`. Однак, якщо ви використовуєте команду `pip install fastapi`, пакет `python-multipart` за замовчуванням не включено. -Щоб встановити його вручну, переконайтеся, що ви створили [віртуальне оточення](../../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили: +Щоб встановити його вручну, переконайтеся, що ви створили [віртуальне оточення](../../virtual-environments.md), активували його, а потім встановили: ```console $ pip install python-multipart @@ -45,7 +45,7 @@ $ pip install python-multipart
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -54,7 +54,7 @@ $ fastapi dev main.py ## Перевірте { #check-it } -Перейдіть до інтерактивної документації: http://127.0.0.1:8000/docs. +Перейдіть до інтерактивної документації: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Ви побачите щось подібне: @@ -140,7 +140,7 @@ OAuth2 був спроєктований так, щоб backend або API мо Тому, якщо ваш API розміщений на `https://example.com/`, це буде `https://example.com/token`. А якщо на `https://example.com/api/v1/`, тоді це буде `https://example.com/api/v1/token`. -Використання відносної URL-адреси важливе, щоб ваша програма продовжувала працювати навіть у просунутому сценарії, як-от [Behind a Proxy](../../advanced/behind-a-proxy.md){.internal-link target=_blank}. +Використання відносної URL-адреси важливе, щоб ваша програма продовжувала працювати навіть у просунутому сценарії, як-от [За представником](../../advanced/behind-a-proxy.md). /// diff --git a/docs/uk/docs/tutorial/security/oauth2-jwt.md b/docs/uk/docs/tutorial/security/oauth2-jwt.md index f94abb897b..64774af6d0 100644 --- a/docs/uk/docs/tutorial/security/oauth2-jwt.md +++ b/docs/uk/docs/tutorial/security/oauth2-jwt.md @@ -24,13 +24,13 @@ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4 Через тиждень токен завершить термін дії, і користувач не буде авторизований та має знову увійти, щоб отримати новий токен. І якщо користувач (або третя сторона) намагатиметься змінити токен, щоб змінити термін дії, ви це виявите, бо підписи не співпадатимуть. -Якщо хочете «погратися» з токенами JWT і побачити, як вони працюють, перегляньте https://jwt.io. +Якщо хочете «погратися» з токенами JWT і побачити, як вони працюють, перегляньте [https://jwt.io](https://jwt.io/). ## Встановіть `PyJWT` { #install-pyjwt } Нам потрібно встановити `PyJWT`, щоб створювати та перевіряти токени JWT у Python. -Переконайтеся, що ви створили [віртуальне оточення](../../virtual-environments.md){.internal-link target=_blank}, активували його і тоді встановіть `pyjwt`: +Переконайтеся, що ви створили [віртуальне оточення](../../virtual-environments.md), активували його і тоді встановіть `pyjwt`:
@@ -46,7 +46,7 @@ $ pip install pyjwt Якщо ви плануєте використовувати алгоритми цифрового підпису на кшталт RSA або ECDSA, слід встановити залежність криптобібліотеки `pyjwt[crypto]`. -Докладніше про це можна прочитати у документації з встановлення PyJWT. +Докладніше про це можна прочитати у [документації з встановлення PyJWT](https://pyjwt.readthedocs.io/en/latest/installation.html). /// @@ -72,7 +72,7 @@ pwdlib - це чудовий пакет Python для роботи з хешам Рекомендований алгоритм - «Argon2». -Переконайтеся, що ви створили [віртуальне оточення](../../virtual-environments.md){.internal-link target=_blank}, активували його і тоді встановіть pwdlib з Argon2: +Переконайтеся, що ви створили [віртуальне оточення](../../virtual-environments.md), активували його і тоді встановіть pwdlib з Argon2:
@@ -200,7 +200,7 @@ JWT може використовуватися й для інших речей, ## Перевірте { #check-it } -Запустіть сервер і перейдіть до документації: http://127.0.0.1:8000/docs. +Запустіть сервер і перейдіть до документації: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). Ви побачите такий інтерфейс користувача: diff --git a/docs/uk/docs/tutorial/security/simple-oauth2.md b/docs/uk/docs/tutorial/security/simple-oauth2.md index 05f949738d..7c83e4c2a7 100644 --- a/docs/uk/docs/tutorial/security/simple-oauth2.md +++ b/docs/uk/docs/tutorial/security/simple-oauth2.md @@ -146,7 +146,7 @@ UserInDB( /// info | Інформація -Для повнішого пояснення `**user_dict` перегляньте [документацію для **Додаткових моделей**](../extra-models.md#about-user-in-dict){.internal-link target=_blank}. +Для повнішого пояснення `**user_dict` перегляньте [документацію для **Додаткових моделей**](../extra-models.md#about-user-in-dict). /// @@ -216,7 +216,7 @@ UserInDB( ## Подивіться в дії { #see-it-in-action } -Відкрийте інтерактивну документацію: http://127.0.0.1:8000/docs. +Відкрийте інтерактивну документацію: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs). ### Автентифікація { #authenticate } diff --git a/docs/uk/docs/tutorial/server-sent-events.md b/docs/uk/docs/tutorial/server-sent-events.md new file mode 100644 index 0000000000..8234085cfa --- /dev/null +++ b/docs/uk/docs/tutorial/server-sent-events.md @@ -0,0 +1,120 @@ +# Події, надіслані сервером (SSE) { #server-sent-events-sse } + +Ви можете транслювати дані клієнту за допомогою **Server-Sent Events** (SSE). + +Це подібно до [Потік JSON Lines](stream-json-lines.md), але використовує формат `text/event-stream`, який нативно підтримується браузерами через [API `EventSource`](https://developer.mozilla.org/en-US/docs/Web/API/EventSource). + +/// info | Інформація + +Додано у FastAPI 0.135.0. + +/// + +## Що таке Server-Sent Events { #what-are-server-sent-events } + +SSE - це стандарт для трансляції даних із сервера до клієнта по HTTP. + +Кожна подія - це невеликий текстовий блок із «полями» на кшталт `data`, `event`, `id` та `retry`, розділений порожніми рядками. + +Виглядає так: + +``` +data: {"name": "Portal Gun", "price": 999.99} + +data: {"name": "Plumbus", "price": 32.99} + +``` + +SSE часто використовують для стрімінгу чатів ШІ, живих сповіщень, логів і спостережуваності, а також інших випадків, коли сервер надсилає оновлення клієнту. + +/// tip | Порада + +Якщо ви хочете транслювати бінарні дані, наприклад відео чи аудіо, перегляньте просунутий посібник: [Потік даних](../advanced/stream-data.md). + +/// + +## Стрімінг SSE у FastAPI { #stream-sse-with-fastapi } + +Щоб транслювати SSE з FastAPI, використовуйте `yield` у вашій *функції операції шляху* і встановіть `response_class=EventSourceResponse`. + +Імпортуйте `EventSourceResponse` з `fastapi.sse`: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[4,22] *} + +Кожен елемент, повернений через `yield`, кодується як JSON і надсилається в полі `data:` події SSE. + +Якщо ви оголосите тип повернення як `AsyncIterable[Item]`, FastAPI використає його, щоб **перевіряти**, **документувати** і **серіалізувати** дані за допомогою Pydantic. + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[10:12,23] *} + +/// tip | Порада + +Оскільки Pydantic серіалізує це на боці **Rust**, ви отримаєте значно вищу **продуктивність**, ніж якби не оголошували тип повернення. + +/// + +### Не-async *функції операцій шляху* { #non-async-path-operation-functions } + +Ви також можете використовувати звичайні функції `def` (без `async`) і використовувати `yield` так само. + +FastAPI подбає про коректне виконання, щоб воно не блокувало цикл подій. + +Оскільки в цьому випадку функція не async, коректним типом повернення буде `Iterable[Item]`: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[28:31] hl[29] *} + +### Без типу повернення { #no-return-type } + +Можна також опустити тип повернення. FastAPI використає [`jsonable_encoder`](./encoder.md), щоб конвертувати дані і надіслати їх. + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[34:37] hl[35] *} + +## `ServerSentEvent` { #serversentevent } + +Якщо вам потрібно встановити поля SSE, такі як `event`, `id`, `retry` або `comment`, ви можете повертати через `yield` об'єкти `ServerSentEvent` замість звичайних даних. + +Імпортуйте `ServerSentEvent` з `fastapi.sse`: + +{* ../../docs_src/server_sent_events/tutorial002_py310.py hl[4,26] *} + +Поле `data` завжди кодується як JSON. Ви можете передати будь-яке значення, яке можна серіалізувати в JSON, включно з моделями Pydantic. + +## Сирі дані { #raw-data } + +Якщо потрібно надіслати дані **без** кодування в JSON, використовуйте `raw_data` замість `data`. + +Це корисно для надсилання попередньо відформатованого тексту, рядків логів або спеціальних значень «значення-сторож», як-от `[DONE]`. + +{* ../../docs_src/server_sent_events/tutorial003_py310.py hl[17] *} + +/// note | Примітка + +`data` і `raw_data` взаємовиключні. У кожному `ServerSentEvent` ви можете встановити лише одне з них. + +/// + +## Відновлення з `Last-Event-ID` { #resuming-with-last-event-id } + +Коли браузер перепідключається після розриву з'єднання, він надсилає останній отриманий `id` у заголовку `Last-Event-ID`. + +Ви можете прочитати його як параметр заголовка і використати, щоб відновити потік із місця, де клієнт зупинився: + +{* ../../docs_src/server_sent_events/tutorial004_py310.py hl[25,27,31] *} + +## SSE з POST { #sse-with-post } + +SSE працює з **будь-яким HTTP-методом**, не лише з `GET`. + +Це корисно для протоколів на кшталт [MCP](https://modelcontextprotocol.io), які транслюють SSE через `POST`: + +{* ../../docs_src/server_sent_events/tutorial005_py310.py hl[14] *} + +## Технічні деталі { #technical-details } + +FastAPI реалізує деякі найкращі практики SSE «з коробки». + +- Надсилати **коментар «keep alive» `ping`** кожні 15 секунд, коли не було жодного повідомлення, щоб запобігти закриттю з'єднання деякими проксі, як рекомендовано у [Специфікації HTML: Події, надіслані сервером](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/uk/docs/tutorial/sql-databases.md b/docs/uk/docs/tutorial/sql-databases.md index 991d1e33aa..57b67226a0 100644 --- a/docs/uk/docs/tutorial/sql-databases.md +++ b/docs/uk/docs/tutorial/sql-databases.md @@ -2,9 +2,9 @@ **FastAPI** не вимагає від вас використовувати SQL (реляційну) базу даних. Але ви можете скористатися будь-якою базою даних, яку забажаєте. -Тут ми розглянемо приклад з SQLModel. +Тут ми розглянемо приклад з [SQLModel](https://sqlmodel.tiangolo.com/). -**SQLModel** побудовано поверх SQLAlchemy та Pydantic. Її створив той самий автор, що і **FastAPI**, як ідеальну пару для застосунків FastAPI, яким потрібні **SQL бази даних**. +**SQLModel** побудовано поверх [SQLAlchemy](https://www.sqlalchemy.org/) та Pydantic. Її створив той самий автор, що і **FastAPI**, як ідеальну пару для застосунків FastAPI, яким потрібні **SQL бази даних**. /// tip | Порада @@ -26,15 +26,15 @@ /// tip | Порада -Існує офіційний генератор проєкту з **FastAPI** та **PostgreSQL**, включно з фронтендом та іншими інструментами: https://github.com/fastapi/full-stack-fastapi-template +Існує офіційний генератор проєкту з **FastAPI** та **PostgreSQL**, включно з фронтендом та іншими інструментами: [https://github.com/fastapi/full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template) /// -Це дуже простий і короткий навчальний посібник. Якщо ви хочете вивчити бази даних загалом, SQL або більш просунуті можливості, зверніться до документації SQLModel. +Це дуже простий і короткий навчальний посібник. Якщо ви хочете вивчити бази даних загалом, SQL або більш просунуті можливості, зверніться до [документації SQLModel](https://sqlmodel.tiangolo.com/). ## Встановіть `SQLModel` { #install-sqlmodel } -Спочатку переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md){.internal-link target=_blank}, активували його та встановили `sqlmodel`: +Спочатку переконайтеся, що ви створили [віртуальне оточення](../virtual-environments.md), активували його та встановили `sqlmodel`:
@@ -65,7 +65,7 @@ $ pip install sqlmodel * `Field(primary_key=True)` каже SQLModel, що `id` - це **первинний ключ** у SQL базі даних (більше про первинні ключі в SQL див. у документації SQLModel). - Примітка: Ми використовуємо `int | None` для поля первинного ключа, щоб у Python-коді можна було створити об’єкт без `id` (`id=None`), припускаючи, що база даних згенерує його під час збереження. SQLModel розуміє, що `id` надасть база даних, і визначає стовпець як ненульовий `INTEGER` у схемі бази даних. Докладніше див. документацію SQLModel про первинні ключі. + Примітка: Ми використовуємо `int | None` для поля первинного ключа, щоб у Python-коді можна було створити об’єкт без `id` (`id=None`), припускаючи, що база даних згенерує його під час збереження. SQLModel розуміє, що `id` надасть база даних, і визначає стовпець як ненульовий `INTEGER` у схемі бази даних. Докладніше див. [документацію SQLModel про первинні ключі](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id). * `Field(index=True)` каже SQLModel створити **SQL-індекс** для цього стовпця, що дозволить швидше виконувати пошук у базі даних під час читання даних, відфільтрованих за цим стовпцем. @@ -111,7 +111,7 @@ $ pip install sqlmodel /// tip | Порада -SQLModel матиме утиліти міграцій-обгортки над Alembic, але поки що ви можете використовувати Alembic напряму. +SQLModel матиме утиліти міграцій-обгортки над Alembic, але поки що ви можете використовувати [Alembic](https://alembic.sqlalchemy.org/en/latest/) напряму. /// @@ -152,7 +152,7 @@ SQLModel матиме утиліти міграцій-обгортки над Al
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -337,7 +337,7 @@ $ fastapi dev main.py
```console -$ fastapi dev main.py +$ fastapi dev INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -352,6 +352,6 @@ $ fastapi dev main.py ## Підсумок { #recap } -Ви можете використовувати **SQLModel** для взаємодії з SQL базою даних і спростити код за допомогою «моделей даних» та «табличних моделей». +Ви можете використовувати [**SQLModel**](https://sqlmodel.tiangolo.com/) для взаємодії з SQL базою даних і спростити код за допомогою «моделей даних» та «табличних моделей». -Багато чого ще можна дізнатися в документації **SQLModel**, там є розширений міні-навчальний посібник з використання SQLModel з **FastAPI**. 🚀 +Багато чого ще можна дізнатися в документації **SQLModel**, там є розширений міні-[навчальний посібник з використання SQLModel з **FastAPI**](https://sqlmodel.tiangolo.com/tutorial/fastapi/). 🚀 diff --git a/docs/uk/docs/tutorial/static-files.md b/docs/uk/docs/tutorial/static-files.md index 7f45973df3..2141744c33 100644 --- a/docs/uk/docs/tutorial/static-files.md +++ b/docs/uk/docs/tutorial/static-files.md @@ -23,7 +23,7 @@ Це відрізняється від використання `APIRouter`, оскільки під'єднаний застосунок є повністю незалежним. OpenAPI та документація вашого основного застосунку не будуть знати нічого про ваш під'єднаний застосунок тощо. -Ви можете дізнатися більше про це в [Посібнику для просунутих користувачів](../advanced/index.md){.internal-link target=_blank}. +Ви можете дізнатися більше про це в [Посібнику для просунутих користувачів](../advanced/index.md). ## Деталі { #details } @@ -37,4 +37,4 @@ ## Додаткова інформація { #more-info } -Детальніше про налаштування та можливості можна дізнатися в документації Starlette про статичні файли. +Детальніше про налаштування та можливості можна дізнатися в [документації Starlette про статичні файли](https://www.starlette.dev/staticfiles/). diff --git a/docs/uk/docs/tutorial/stream-json-lines.md b/docs/uk/docs/tutorial/stream-json-lines.md new file mode 100644 index 0000000000..f7be4a1b24 --- /dev/null +++ b/docs/uk/docs/tutorial/stream-json-lines.md @@ -0,0 +1,111 @@ +# Стрімінг JSON Lines { #stream-json-lines } + +У вас може бути послідовність даних, яку ви хочете надсилати у **«потоці»**, це можна зробити за допомогою **JSON Lines**. + +/// info | Інформація + +Додано в FastAPI 0.134.0. + +/// + +## Що таке потік { #what-is-a-stream } + +«**Стрімінг**» даних означає, що ваш застосунок почне надсилати елементи даних клієнту, не чекаючи, доки буде готова вся послідовність елементів. + +Тобто він надішле перший елемент, клієнт його отримає і почне обробляти, а ви в цей час уже можете створювати наступний елемент. + +```mermaid +sequenceDiagram + participant App + participant Client + + App->>App: Produce Item 1 + App->>Client: Send Item 1 + App->>App: Produce Item 2 + Client->>Client: Process Item 1 + App->>Client: Send Item 2 + App->>App: Produce Item 3 + Client->>Client: Process Item 2 + App->>Client: Send Item 3 + Client->>Client: Process Item 3 + Note over App: Keeps producing... + Note over Client: Keeps consuming... +``` + +Це може бути навіть нескінченний потік, у якому ви постійно надсилаєте дані. + +## JSON Lines { #json-lines } + +У таких випадках часто надсилають «**JSON Lines**» - формат, у якому ви надсилаєте по одному об’єкту JSON на рядок. + +Відповідь матиме тип вмісту `application/jsonl` (замість `application/json`), а тіло буде приблизно таким: + +```json +{"name": "Plumbus", "description": "A multi-purpose household device."} +{"name": "Portal Gun", "description": "A portal opening device."} +{"name": "Meeseeks Box", "description": "A box that summons a Meeseeks."} +``` + +Це дуже схоже на масив JSON (еквівалент списку Python), але замість того, щоб бути загорнутим у `[]` і мати `,` між елементами, тут є **по одному об’єкту JSON на рядок**, вони розділені символом нового рядка. + +/// info | Інформація + +Важливо те, що ваш застосунок зможе по черзі створювати кожен рядок, поки клієнт споживає попередні рядки. + +/// + +/// note | Технічні деталі + +Оскільки кожен об’єкт JSON буде розділено новим рядком, він не може містити буквальні символи нового рядка у своєму вмісті, але може містити екрановані нові рядки (`\n`), що є частиною стандарту JSON. + +Зазвичай про це не треба турбуватися, усе робиться автоматично, читайте далі. 🤓 + +/// + +## Випадки використання { #use-cases } + +Ви можете використовувати це, щоб стрімити дані зі служби **AI LLM**, із **логів** чи **телеметрії**, або з інших типів даних, які можна структурувати як елементи **JSON**. + +/// tip | Порада + +Якщо ви хочете стрімити бінарні дані, наприклад відео чи аудіо, перегляньте просунутий посібник: [Потокова передача даних](../advanced/stream-data.md). + +/// + +## Стрімінг JSON Lines з FastAPI { #stream-json-lines-with-fastapi } + +Щоб стрімити JSON Lines з FastAPI, замість використання `return` у вашій *функції операції шляху* використовуйте `yield`, щоб по черзі створювати кожен елемент. + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[24] *} + +Якщо кожен елемент JSON, який ви хочете надіслати у відповідь, має тип `Item` (модель Pydantic) і це async-функція, ви можете оголосити тип повернення як `AsyncIterable[Item]`: + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[9:11,22] *} + +Якщо ви оголосите тип повернення, FastAPI використає його, щоб **перевіряти** дані, **документувати** їх в OpenAPI, **фільтрувати** їх і **серіалізувати** за допомогою Pydantic. + +/// tip | Порада + +Оскільки Pydantic серіалізуватиме це на боці **Rust**, ви отримаєте значно вищу **продуктивність**, ніж якби не оголошували тип повернення. + +/// + +### Не-async *функції операцій шляху* { #non-async-path-operation-functions } + +Ви також можете використовувати звичайні функції `def` (без `async`) і використовувати `yield` так само. + +FastAPI подбає про коректне виконання, щоб це не блокувало цикл подій. + +Оскільки в цьому випадку функція не є async, правильним типом повернення буде `Iterable[Item]`: + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[27:30] hl[28] *} + +### Без типу повернення { #no-return-type } + +Ви також можете опустити тип повернення. Тоді FastAPI використає [`jsonable_encoder`](./encoder.md), щоб перетворити дані на щось, що можна серіалізувати в JSON, і потім надішле їх як JSON Lines. + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[33:36] hl[34] *} + +## Події, надіслані сервером (SSE) { #server-sent-events-sse } + +FastAPI також має повноцінну підтримку Server-Sent Events (SSE), які досить схожі, але мають кілька додаткових деталей. Ви можете дізнатися про них у наступному розділі: [Події, надіслані сервером (SSE)](server-sent-events.md). 🤓 diff --git a/docs/uk/docs/tutorial/testing.md b/docs/uk/docs/tutorial/testing.md index ff32e9fb66..ccae2303a4 100644 --- a/docs/uk/docs/tutorial/testing.md +++ b/docs/uk/docs/tutorial/testing.md @@ -1,18 +1,18 @@ # Тестування { #testing } -Завдяки Starlette тестувати застосунки **FastAPI** просто й приємно. +Завдяки [Starlette](https://www.starlette.dev/testclient/), тестувати застосунки **FastAPI** просто й приємно. -Воно базується на HTTPX, який, своєю чергою, спроєктований на основі Requests, тож він дуже знайомий та інтуїтивно зрозумілий. +Воно базується на [HTTPX](https://www.python-httpx.org), який, своєю чергою, спроєктований на основі Requests, тож він дуже знайомий та інтуїтивно зрозумілий. -З його допомогою ви можете використовувати pytest безпосередньо з **FastAPI**. +З його допомогою ви можете використовувати [pytest](https://docs.pytest.org/) безпосередньо з **FastAPI**. ## Використання `TestClient` { #using-testclient } /// info | Інформація -Щоб використовувати `TestClient`, спочатку встановіть `httpx`. +Щоб використовувати `TestClient`, спочатку встановіть [`httpx`](https://www.python-httpx.org). -Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його, а потім встановили `httpx`, наприклад: +Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його, а потім встановили `httpx`, наприклад: ```console $ pip install httpx @@ -52,7 +52,7 @@ $ pip install httpx /// tip | Порада -Якщо ви хочете викликати `async`-функції у ваших тестах, окрім відправлення запитів до вашого застосунку FastAPI (наприклад, асинхронні функції роботи з базою даних), перегляньте [Async Tests](../advanced/async-tests.md){.internal-link target=_blank} у розширеному керівництві. +Якщо ви хочете викликати `async`-функції у ваших тестах, окрім відправлення запитів до вашого застосунку FastAPI (наприклад, асинхронні функції роботи з базою даних), перегляньте [Async Tests](../advanced/async-tests.md) у розширеному керівництві. /// @@ -64,7 +64,7 @@ $ pip install httpx ### Файл застосунку **FastAPI** { #fastapi-app-file } -Припустимо, у вас є структура файлів, описана в розділі [Bigger Applications](bigger-applications.md){.internal-link target=_blank}: +Припустимо, у вас є структура файлів, описана в розділі [Bigger Applications](bigger-applications.md): ``` . @@ -142,13 +142,13 @@ $ pip install httpx * Щоб передати заголовки *headers*, використовуйте `dict` у параметрі `headers`. * Для *cookies* використовуйте `dict` у параметрі `cookies`. -Докладніше про передачу даних у бекенд (за допомогою `httpx` або `TestClient`) можна знайти в документації HTTPX. +Докладніше про передачу даних у бекенд (за допомогою `httpx` або `TestClient`) можна знайти в [документації HTTPX](https://www.python-httpx.org). /// info | Інформація Зверніть увагу, що `TestClient` отримує дані, які можна конвертувати в JSON, а не Pydantic-моделі. -Якщо у вас є Pydantic-модель у тесті, і ви хочете передати її дані в застосунок під час тестування, ви можете використати `jsonable_encoder`, описаний у розділі [JSON Compatible Encoder](encoder.md){.internal-link target=_blank}. +Якщо у вас є Pydantic-модель у тесті, і ви хочете передати її дані в застосунок під час тестування, ви можете використати `jsonable_encoder`, описаний у розділі [JSON Compatible Encoder](encoder.md). /// @@ -156,7 +156,7 @@ $ pip install httpx Після цього вам потрібно встановити `pytest`. -Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md){.internal-link target=_blank}, активували його і встановили необхідні пакети, наприклад: +Переконайтеся, що ви створили [віртуальне середовище](../virtual-environments.md), активували його і встановили необхідні пакети, наприклад:
diff --git a/docs/uk/docs/virtual-environments.md b/docs/uk/docs/virtual-environments.md index 78e7ab32f5..d7735b234f 100644 --- a/docs/uk/docs/virtual-environments.md +++ b/docs/uk/docs/virtual-environments.md @@ -22,7 +22,7 @@ На цій сторінці ви дізнаєтеся, як використовувати віртуальні середовища і як вони працюють. -Якщо ви готові прийняти інструмент, що керує всім за вас (включно з установленням Python), спробуйте uv. +Якщо ви готові прийняти інструмент, що керує всім за вас (включно з установленням Python), спробуйте [uv](https://github.com/astral-sh/uv). /// @@ -86,7 +86,7 @@ $ python -m venv .venv //// tab | `uv` -Якщо у вас встановлено `uv`, ви можете використати його для створення віртуального середовища. +Якщо у вас встановлено [`uv`](https://github.com/astral-sh/uv), ви можете використати його для створення віртуального середовища.
@@ -150,7 +150,7 @@ $ .venv\Scripts\Activate.ps1 //// tab | Windows Bash -Або якщо ви використовуєте Bash для Windows (напр., Git Bash): +Або якщо ви використовуєте Bash для Windows (напр., [Git Bash](https://gitforwindows.org/)):
@@ -216,7 +216,7 @@ C:\Users\user\code\awesome-project\.venv\Scripts\python /// tip | Порада -Якщо ви використовуєте `uv`, ви використовуватимете його для встановлення замість `pip`, тож вам не потрібно оновлювати `pip`. 😎 +Якщо ви використовуєте [`uv`](https://github.com/astral-sh/uv), ви використовуватимете його для встановлення замість `pip`, тож вам не потрібно оновлювати `pip`. 😎 /// @@ -268,7 +268,7 @@ $ python -m ensurepip --upgrade /// tip | Порада -Якщо ви використали `uv` для створення віртуального середовища, він уже зробив це за вас, можете пропустити цей крок. 😎 +Якщо ви використали [`uv`](https://github.com/astral-sh/uv) для створення віртуального середовища, він уже зробив це за вас, можете пропустити цей крок. 😎 /// @@ -340,7 +340,7 @@ $ pip install "fastapi[standard]" //// tab | `uv` -Якщо у вас є `uv`: +Якщо у вас є [`uv`](https://github.com/astral-sh/uv):
@@ -372,7 +372,7 @@ $ pip install -r requirements.txt //// tab | `uv` -Якщо у вас є `uv`: +Якщо у вас є [`uv`](https://github.com/astral-sh/uv):
@@ -416,8 +416,8 @@ Hello World Наприклад: -* VS Code -* PyCharm +* [VS Code](https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment) +* [PyCharm](https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html) /// tip | Порада @@ -453,7 +453,7 @@ $ deactivate ## Навіщо віртуальні середовища { #why-virtual-environments } -Щоб працювати з FastAPI, вам потрібно встановити Python. +Щоб працювати з FastAPI, вам потрібно встановити [Python](https://www.python.org/). Після цього вам потрібно буде встановити FastAPI та інші пакети, які ви хочете використовувати. @@ -562,7 +562,7 @@ $ pip install "fastapi[standard]"
-Це завантажить стиснений файл з кодом FastAPI, зазвичай із PyPI. +Це завантажить стиснений файл з кодом FastAPI, зазвичай із [PyPI](https://pypi.org/project/fastapi/). Також будуть завантажені файли для інших пакетів, від яких залежить FastAPI. @@ -625,7 +625,7 @@ $ .venv\Scripts\Activate.ps1 //// tab | Windows Bash -Або якщо ви використовуєте Bash для Windows (напр., Git Bash): +Або якщо ви використовуєте Bash для Windows (напр., [Git Bash](https://gitforwindows.org/)):
@@ -637,13 +637,13 @@ $ source .venv/Scripts/activate //// -Ця команда створить або змінить деякі [Змінні оточення](environment-variables.md){.internal-link target=_blank}, які будуть доступні для наступних команд. +Ця команда створить або змінить деякі [Змінні оточення](environment-variables.md), які будуть доступні для наступних команд. Однією з цих змінних є змінна `PATH`. /// tip | Порада -Ви можете дізнатися більше про змінну оточення `PATH` у розділі [Змінні оточення](environment-variables.md#path-environment-variable){.internal-link target=_blank}. +Ви можете дізнатися більше про змінну оточення `PATH` у розділі [Змінні оточення](environment-variables.md#path-environment-variable). /// @@ -844,7 +844,7 @@ I solemnly swear 🐺 Існує багато альтернатив керування віртуальними середовищами, залежностями пакетів (вимогами), проєктами. -Коли будете готові й захочете використовувати інструмент для керування всім проєктом, залежностями пакетів, віртуальними середовищами тощо, я раджу спробувати uv. +Коли будете готові й захочете використовувати інструмент для керування всім проєктом, залежностями пакетів, віртуальними середовищами тощо, я раджу спробувати [uv](https://github.com/astral-sh/uv). `uv` уміє багато чого, зокрема: diff --git a/scripts/doc_parsing_utils.py b/scripts/doc_parsing_utils.py index 1cd2299e66..88ff2c50bd 100644 --- a/scripts/doc_parsing_utils.py +++ b/scripts/doc_parsing_utils.py @@ -17,7 +17,7 @@ MARKDOWN_LINK_RE = re.compile( r"(?P[^)\s]+)" # url (no spaces and `)`) r'(?:\s+["\'](?P.*?)["\'])?' # optional title in "" or '' r"\)" - r"(?:\s*\{(?P<attrs>[^}]*)\})?" # optional attributes in {} + r"(?:\{(?P<attrs>[^}]*)\})?" # optional attributes in {} ) HTML_LINK_RE = re.compile(r"<a\s+[^>]*>.*?</a>") diff --git a/scripts/translate.py b/scripts/translate.py index ddcfa311d6..1bfa92f887 100644 --- a/scripts/translate.py +++ b/scripts/translate.py @@ -142,7 +142,6 @@ def translate_page( continue # Retry if not reached max attempts else: # Max retry attempts reached print(f"Translation failed for {out_path} after {MAX_ATTEMPTS} attempts") - raise typer.Exit(code=1) print(f"Saving translation to {out_path}") out_path.write_text(out_content, encoding="utf-8", newline="\n")