committed by
GitHub
274 changed files with 9207 additions and 4220 deletions
@ -24,6 +24,8 @@ jobs: |
|||
env: |
|||
GITHUB_CONTEXT: ${{ toJson(github) }} |
|||
run: echo "$GITHUB_CONTEXT" |
|||
# pin to actions/checkout@v5 for compatibility with latest-changes |
|||
# Ref: https://github.com/actions/checkout/issues/2313 |
|||
- uses: actions/checkout@v5 |
|||
with: |
|||
# To allow latest-changes to commit to the main branch |
|||
@ -34,7 +36,7 @@ jobs: |
|||
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }} |
|||
with: |
|||
limit-access-to-actor: true |
|||
- uses: tiangolo/[email protected].0 |
|||
- uses: tiangolo/[email protected].1 |
|||
with: |
|||
token: ${{ secrets.GITHUB_TOKEN }} |
|||
latest_changes_file: docs/en/docs/release-notes.md |
|||
|
|||
@ -0,0 +1,88 @@ |
|||
name: pre-commit |
|||
|
|||
on: |
|||
pull_request: |
|||
types: |
|||
- opened |
|||
- synchronize |
|||
|
|||
env: |
|||
IS_FORK: ${{ github.event.pull_request.head.repo.full_name != github.repository }} |
|||
|
|||
jobs: |
|||
pre-commit: |
|||
runs-on: ubuntu-latest |
|||
steps: |
|||
- name: Dump GitHub context |
|||
env: |
|||
GITHUB_CONTEXT: ${{ toJson(github) }} |
|||
run: echo "$GITHUB_CONTEXT" |
|||
- uses: actions/checkout@v5 |
|||
name: Checkout PR for own repo |
|||
if: env.IS_FORK == 'false' |
|||
with: |
|||
# To be able to commit it needs more than the last commit |
|||
ref: ${{ github.head_ref }} |
|||
# A token other than the default GITHUB_TOKEN is needed to be able to trigger CI |
|||
token: ${{ secrets.PRE_COMMIT }} |
|||
# pre-commit lite ci needs the default checkout configs to work |
|||
- uses: actions/checkout@v5 |
|||
name: Checkout PR for fork |
|||
if: env.IS_FORK == 'true' |
|||
- name: Set up Python |
|||
uses: actions/setup-python@v6 |
|||
with: |
|||
python-version: "3.14" |
|||
- name: Setup uv |
|||
uses: astral-sh/setup-uv@v7 |
|||
with: |
|||
cache-dependency-glob: | |
|||
requirements**.txt |
|||
pyproject.toml |
|||
uv.lock |
|||
- name: Install Dependencies |
|||
run: | |
|||
uv venv |
|||
uv pip install -r requirements.txt |
|||
- name: Run pre-commit |
|||
id: precommit |
|||
run: | |
|||
# Fetch the base branch for comparison |
|||
git fetch origin ${{ github.base_ref }} |
|||
uvx pre-commit run --from-ref origin/${{ github.base_ref }} --to-ref HEAD --show-diff-on-failure |
|||
continue-on-error: true |
|||
- name: Commit and push changes |
|||
if: env.IS_FORK == 'false' |
|||
run: | |
|||
git config user.name "github-actions[bot]" |
|||
git config user.email "github-actions[bot]@users.noreply.github.com" |
|||
git add -A |
|||
if git diff --staged --quiet; then |
|||
echo "No changes to commit" |
|||
else |
|||
git commit -m "🎨 Auto format" |
|||
git push |
|||
fi |
|||
- uses: pre-commit-ci/[email protected] |
|||
if: env.IS_FORK == 'true' |
|||
with: |
|||
msg: 🎨 Auto format |
|||
- name: Error out on pre-commit errors |
|||
if: steps.precommit.outcome == 'failure' |
|||
run: exit 1 |
|||
|
|||
# https://github.com/marketplace/actions/alls-green#why |
|||
pre-commit-alls-green: # This job does nothing and is only used for the branch protection |
|||
if: always() |
|||
needs: |
|||
- pre-commit |
|||
runs-on: ubuntu-latest |
|||
steps: |
|||
- name: Dump GitHub context |
|||
env: |
|||
GITHUB_CONTEXT: ${{ toJson(github) }} |
|||
run: echo "$GITHUB_CONTEXT" |
|||
- name: Decide whether the needed jobs succeeded or failed |
|||
uses: re-actors/alls-green@release/v1 |
|||
with: |
|||
jobs: ${{ toJSON(needs) }} |
|||
@ -1,25 +1,29 @@ |
|||
# See https://pre-commit.com for more information |
|||
# See https://pre-commit.com/hooks.html for more hooks |
|||
default_language_version: |
|||
python: python3.10 |
|||
repos: |
|||
- repo: https://github.com/pre-commit/pre-commit-hooks |
|||
- repo: https://github.com/pre-commit/pre-commit-hooks |
|||
rev: v6.0.0 |
|||
hooks: |
|||
- id: check-added-large-files |
|||
- id: check-toml |
|||
- id: check-yaml |
|||
- id: check-added-large-files |
|||
- id: check-toml |
|||
- id: check-yaml |
|||
args: |
|||
- --unsafe |
|||
- id: end-of-file-fixer |
|||
- id: trailing-whitespace |
|||
- repo: https://github.com/astral-sh/ruff-pre-commit |
|||
rev: v0.13.3 |
|||
- --unsafe |
|||
- id: end-of-file-fixer |
|||
- id: trailing-whitespace |
|||
- repo: https://github.com/astral-sh/ruff-pre-commit |
|||
rev: v0.14.3 |
|||
hooks: |
|||
- id: ruff |
|||
- id: ruff |
|||
args: |
|||
- --fix |
|||
- id: ruff-format |
|||
ci: |
|||
autofix_commit_msg: 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks |
|||
autoupdate_commit_msg: ⬆ [pre-commit.ci] pre-commit autoupdate |
|||
- id: ruff-format |
|||
- repo: local |
|||
hooks: |
|||
- id: local-script |
|||
language: unsupported |
|||
name: local script |
|||
entry: uv run ./scripts/docs.py add-permalinks-pages |
|||
args: |
|||
- --update-existing |
|||
files: ^docs/en/docs/.*\.md$ |
|||
|
|||
@ -1,16 +1,24 @@ |
|||
# FastAPI bei Cloudanbietern bereitstellen { #deploy-fastapi-on-cloud-providers } |
|||
# FastAPI bei Cloudanbietern deployen { #deploy-fastapi-on-cloud-providers } |
|||
|
|||
Sie können praktisch **jeden Cloudanbieter** verwenden, um Ihre FastAPI-Anwendung bereitzustellen. |
|||
|
|||
In den meisten Fällen bieten die großen Cloudanbieter Anleitungen zum Bereitstellen von FastAPI an. |
|||
In den meisten Fällen bieten die großen Cloudanbieter Anleitungen zum Deployment von FastAPI an. |
|||
|
|||
## Cloudanbieter – Sponsoren { #cloud-providers-sponsors } |
|||
## FastAPI Cloud { #fastapi-cloud } |
|||
|
|||
**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** wurde vom selben Autor und Team hinter **FastAPI** entwickelt. |
|||
|
|||
Es vereinfacht den Prozess des **Erstellens**, **Deployens** und **Zugreifens** auf eine API mit minimalem Aufwand. |
|||
|
|||
Einige Cloudanbieter ✨ [**sponsern FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨, dies stellt die kontinuierliche und gesunde **Entwicklung** von FastAPI und seinem **Ökosystem** sicher. |
|||
Es bringt die gleiche **Developer-Experience** beim Erstellen von Apps mit FastAPI auch zum **Deployment** in der Cloud. 🎉 |
|||
|
|||
FastAPI Cloud ist der Hauptsponsor und Finanzierungsgeber für die *FastAPI and friends* Open-Source-Projekte. ✨ |
|||
|
|||
## Cloudanbieter – Sponsoren { #cloud-providers-sponsors } |
|||
|
|||
Und es zeigt ihr wahres Engagement für FastAPI und seine **Community** (Sie), da sie Ihnen nicht nur einen **guten Service** bieten möchten, sondern auch sicherstellen möchten, dass Sie ein **gutes und gesundes Framework**, FastAPI, haben. 🙇 |
|||
Einige andere Cloudanbieter ✨ [**sponsern FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨ ebenfalls. 🙇 |
|||
|
|||
Vielleicht möchten Sie deren Dienste ausprobieren und deren Anleitungen folgen: |
|||
Sie könnten diese ebenfalls in Betracht ziehen, deren Anleitungen folgen und ihre Dienste ausprobieren: |
|||
|
|||
* <a href="https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi" class="external-link" target="_blank">Render</a> |
|||
* <a href="https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi" class="external-link" target="_blank">Railway</a> |
|||
|
|||
@ -0,0 +1,65 @@ |
|||
# FastAPI Cloud { #fastapi-cloud } |
|||
|
|||
Sie können Ihre FastAPI-App in der <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a> mit **einem einzigen Befehl** deployen – tragen Sie sich in die Warteliste ein, falls noch nicht geschehen. 🚀 |
|||
|
|||
## Anmelden { #login } |
|||
|
|||
Stellen Sie sicher, dass Sie bereits ein **FastAPI-Cloud-Konto** haben (wir haben Sie von der Warteliste eingeladen 😉). |
|||
|
|||
Melden Sie sich dann an: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ fastapi login |
|||
|
|||
You are logged in to FastAPI Cloud 🚀 |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
## Deployen { #deploy } |
|||
|
|||
Stellen Sie Ihre App jetzt mit **einem einzigen Befehl** bereit: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ fastapi deploy |
|||
|
|||
Deploying to FastAPI Cloud... |
|||
|
|||
✅ Deployment successful! |
|||
|
|||
🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
Das war’s! Jetzt können Sie Ihre App unter dieser URL aufrufen. ✨ |
|||
|
|||
## Über FastAPI Cloud { #about-fastapi-cloud } |
|||
|
|||
**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** wird vom gleichen Autor und Team hinter **FastAPI** entwickelt. |
|||
|
|||
Es vereinfacht den Prozess des **Erstellens**, **Deployens** und **Nutzens** einer API mit minimalem Aufwand. |
|||
|
|||
Es bringt die gleiche **Developer-Experience** beim Erstellen von Apps mit FastAPI auch zum **Deployment** in der Cloud. 🎉 |
|||
|
|||
Es kümmert sich außerdem um das meiste, was beim Deployen einer App nötig ist, zum Beispiel: |
|||
|
|||
* HTTPS |
|||
* Replikation, mit Autoscaling basierend auf Requests |
|||
* usw. |
|||
|
|||
FastAPI Cloud ist Hauptsponsor und Finanzierer der Open-Source-Projekte *FastAPI and friends*. ✨ |
|||
|
|||
## Bei anderen Cloudanbietern deployen { #deploy-to-other-cloud-providers } |
|||
|
|||
FastAPI ist Open Source und basiert auf Standards. Sie können FastAPI-Apps bei jedem Cloudanbieter Ihrer Wahl deployen. |
|||
|
|||
Folgen Sie den Anleitungen Ihres Cloudanbieters, um dort FastAPI-Apps zu deployen. 🤓 |
|||
|
|||
## Auf den eigenen Server deployen { #deploy-your-own-server } |
|||
|
|||
Ich werde Ihnen später in diesem **Deployment-Leitfaden** auch alle Details zeigen, sodass Sie verstehen, was passiert, was geschehen muss und wie Sie FastAPI-Apps selbst deployen können, auch auf Ihre eigenen Server. 🤓 |
|||
@ -0,0 +1,17 @@ |
|||
# Alte 403-Authentifizierungsfehler-Statuscodes verwenden { #use-old-403-authentication-error-status-codes } |
|||
|
|||
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, <a href="https://datatracker.ietf.org/doc/html/rfc7235#section-3.1" class="external-link" target="_blank">RFC 7235</a>, <a href="https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized" class="external-link" target="_blank">RFC 9110</a>. |
|||
|
|||
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. |
|||
|
|||
Sie können beispielsweise eine Unterklasse von `HTTPBearer` erstellen, die einen Fehler `403 Forbidden` zurückgibt, statt des Default-`401 Unauthorized`-Fehlers: |
|||
|
|||
{* ../../docs_src/authentication_error_status_code/tutorial001_an_py39.py hl[9:13] *} |
|||
|
|||
/// tip | Tipp |
|||
|
|||
Beachten Sie, dass die Funktion die Exception-Instanz zurückgibt; sie wirft sie nicht. Das Werfen erfolgt im restlichen internen Code. |
|||
|
|||
/// |
|||
@ -1,495 +1,495 @@ |
|||
- name: full-stack-fastapi-template |
|||
html_url: https://github.com/fastapi/full-stack-fastapi-template |
|||
stars: 38085 |
|||
stars: 39475 |
|||
owner_login: fastapi |
|||
owner_html_url: https://github.com/fastapi |
|||
- name: Hello-Python |
|||
html_url: https://github.com/mouredev/Hello-Python |
|||
stars: 32243 |
|||
stars: 33090 |
|||
owner_login: mouredev |
|||
owner_html_url: https://github.com/mouredev |
|||
- name: serve |
|||
html_url: https://github.com/jina-ai/serve |
|||
stars: 21754 |
|||
stars: 21798 |
|||
owner_login: jina-ai |
|||
owner_html_url: https://github.com/jina-ai |
|||
- name: HivisionIDPhotos |
|||
html_url: https://github.com/Zeyi-Lin/HivisionIDPhotos |
|||
stars: 19400 |
|||
stars: 20258 |
|||
owner_login: Zeyi-Lin |
|||
owner_html_url: https://github.com/Zeyi-Lin |
|||
- name: sqlmodel |
|||
html_url: https://github.com/fastapi/sqlmodel |
|||
stars: 16859 |
|||
stars: 17212 |
|||
owner_login: fastapi |
|||
owner_html_url: https://github.com/fastapi |
|||
- name: Douyin_TikTok_Download_API |
|||
html_url: https://github.com/Evil0ctal/Douyin_TikTok_Download_API |
|||
stars: 14452 |
|||
stars: 15145 |
|||
owner_login: Evil0ctal |
|||
owner_html_url: https://github.com/Evil0ctal |
|||
- name: fastapi-best-practices |
|||
html_url: https://github.com/zhanymkanov/fastapi-best-practices |
|||
stars: 13613 |
|||
stars: 14644 |
|||
owner_login: zhanymkanov |
|||
owner_html_url: https://github.com/zhanymkanov |
|||
- name: machine-learning-zoomcamp |
|||
html_url: https://github.com/DataTalksClub/machine-learning-zoomcamp |
|||
stars: 12320 |
|||
owner_login: DataTalksClub |
|||
owner_html_url: https://github.com/DataTalksClub |
|||
- name: fastapi_mcp |
|||
html_url: https://github.com/tadata-org/fastapi_mcp |
|||
stars: 10624 |
|||
stars: 11174 |
|||
owner_login: tadata-org |
|||
owner_html_url: https://github.com/tadata-org |
|||
- name: SurfSense |
|||
html_url: https://github.com/MODSetter/SurfSense |
|||
stars: 10858 |
|||
owner_login: MODSetter |
|||
owner_html_url: https://github.com/MODSetter |
|||
- name: awesome-fastapi |
|||
html_url: https://github.com/mjhea0/awesome-fastapi |
|||
stars: 10415 |
|||
stars: 10758 |
|||
owner_login: mjhea0 |
|||
owner_html_url: https://github.com/mjhea0 |
|||
- name: FastUI |
|||
html_url: https://github.com/pydantic/FastUI |
|||
stars: 8879 |
|||
owner_login: pydantic |
|||
owner_html_url: https://github.com/pydantic |
|||
- name: XHS-Downloader |
|||
html_url: https://github.com/JoeanAmier/XHS-Downloader |
|||
stars: 8824 |
|||
stars: 9313 |
|||
owner_login: JoeanAmier |
|||
owner_html_url: https://github.com/JoeanAmier |
|||
- name: SurfSense |
|||
html_url: https://github.com/MODSetter/SurfSense |
|||
stars: 8257 |
|||
owner_login: MODSetter |
|||
owner_html_url: https://github.com/MODSetter |
|||
- name: FileCodeBox |
|||
html_url: https://github.com/vastsa/FileCodeBox |
|||
stars: 7367 |
|||
owner_login: vastsa |
|||
owner_html_url: https://github.com/vastsa |
|||
- name: FastUI |
|||
html_url: https://github.com/pydantic/FastUI |
|||
stars: 8915 |
|||
owner_login: pydantic |
|||
owner_html_url: https://github.com/pydantic |
|||
- name: polar |
|||
html_url: https://github.com/polarsource/polar |
|||
stars: 7291 |
|||
stars: 8339 |
|||
owner_login: polarsource |
|||
owner_html_url: https://github.com/polarsource |
|||
- name: FileCodeBox |
|||
html_url: https://github.com/vastsa/FileCodeBox |
|||
stars: 7721 |
|||
owner_login: vastsa |
|||
owner_html_url: https://github.com/vastsa |
|||
- name: nonebot2 |
|||
html_url: https://github.com/nonebot/nonebot2 |
|||
stars: 7065 |
|||
stars: 7170 |
|||
owner_login: nonebot |
|||
owner_html_url: https://github.com/nonebot |
|||
- name: hatchet |
|||
html_url: https://github.com/hatchet-dev/hatchet |
|||
stars: 6070 |
|||
stars: 6253 |
|||
owner_login: hatchet-dev |
|||
owner_html_url: https://github.com/hatchet-dev |
|||
- name: serge |
|||
html_url: https://github.com/serge-chat/serge |
|||
stars: 5754 |
|||
owner_login: serge-chat |
|||
owner_html_url: https://github.com/serge-chat |
|||
- name: fastapi-users |
|||
html_url: https://github.com/fastapi-users/fastapi-users |
|||
stars: 5599 |
|||
stars: 5849 |
|||
owner_login: fastapi-users |
|||
owner_html_url: https://github.com/fastapi-users |
|||
- name: serge |
|||
html_url: https://github.com/serge-chat/serge |
|||
stars: 5756 |
|||
owner_login: serge-chat |
|||
owner_html_url: https://github.com/serge-chat |
|||
- name: strawberry |
|||
html_url: https://github.com/strawberry-graphql/strawberry |
|||
stars: 4422 |
|||
stars: 4569 |
|||
owner_login: strawberry-graphql |
|||
owner_html_url: https://github.com/strawberry-graphql |
|||
- name: chatgpt-web-share |
|||
html_url: https://github.com/chatpire/chatgpt-web-share |
|||
stars: 4301 |
|||
stars: 4294 |
|||
owner_login: chatpire |
|||
owner_html_url: https://github.com/chatpire |
|||
- name: poem |
|||
html_url: https://github.com/poem-web/poem |
|||
stars: 4197 |
|||
stars: 4276 |
|||
owner_login: poem-web |
|||
owner_html_url: https://github.com/poem-web |
|||
- name: dynaconf |
|||
html_url: https://github.com/dynaconf/dynaconf |
|||
stars: 4144 |
|||
stars: 4202 |
|||
owner_login: dynaconf |
|||
owner_html_url: https://github.com/dynaconf |
|||
- name: atrilabs-engine |
|||
html_url: https://github.com/Atri-Labs/atrilabs-engine |
|||
stars: 4094 |
|||
stars: 4093 |
|||
owner_login: Atri-Labs |
|||
owner_html_url: https://github.com/Atri-Labs |
|||
- name: Kokoro-FastAPI |
|||
html_url: https://github.com/remsky/Kokoro-FastAPI |
|||
stars: 3739 |
|||
stars: 4019 |
|||
owner_login: remsky |
|||
owner_html_url: https://github.com/remsky |
|||
- name: logfire |
|||
html_url: https://github.com/pydantic/logfire |
|||
stars: 3614 |
|||
stars: 3805 |
|||
owner_login: pydantic |
|||
owner_html_url: https://github.com/pydantic |
|||
- name: LitServe |
|||
html_url: https://github.com/Lightning-AI/LitServe |
|||
stars: 3578 |
|||
stars: 3719 |
|||
owner_login: Lightning-AI |
|||
owner_html_url: https://github.com/Lightning-AI |
|||
- name: datamodel-code-generator |
|||
html_url: https://github.com/koxudaxi/datamodel-code-generator |
|||
stars: 3496 |
|||
owner_login: koxudaxi |
|||
owner_html_url: https://github.com/koxudaxi |
|||
- name: farfalle |
|||
html_url: https://github.com/rashadphz/farfalle |
|||
stars: 3459 |
|||
owner_login: rashadphz |
|||
owner_html_url: https://github.com/rashadphz |
|||
- name: fastapi-admin |
|||
html_url: https://github.com/fastapi-admin/fastapi-admin |
|||
stars: 3456 |
|||
stars: 3632 |
|||
owner_login: fastapi-admin |
|||
owner_html_url: https://github.com/fastapi-admin |
|||
- name: datamodel-code-generator |
|||
html_url: https://github.com/koxudaxi/datamodel-code-generator |
|||
stars: 3609 |
|||
owner_login: koxudaxi |
|||
owner_html_url: https://github.com/koxudaxi |
|||
- name: huma |
|||
html_url: https://github.com/danielgtaylor/huma |
|||
stars: 3447 |
|||
stars: 3603 |
|||
owner_login: danielgtaylor |
|||
owner_html_url: https://github.com/danielgtaylor |
|||
- name: farfalle |
|||
html_url: https://github.com/rashadphz/farfalle |
|||
stars: 3490 |
|||
owner_login: rashadphz |
|||
owner_html_url: https://github.com/rashadphz |
|||
- name: tracecat |
|||
html_url: https://github.com/TracecatHQ/tracecat |
|||
stars: 3254 |
|||
stars: 3379 |
|||
owner_login: TracecatHQ |
|||
owner_html_url: https://github.com/TracecatHQ |
|||
- name: opyrator |
|||
html_url: https://github.com/ml-tooling/opyrator |
|||
stars: 3134 |
|||
stars: 3135 |
|||
owner_login: ml-tooling |
|||
owner_html_url: https://github.com/ml-tooling |
|||
- name: docarray |
|||
html_url: https://github.com/docarray/docarray |
|||
stars: 3107 |
|||
stars: 3114 |
|||
owner_login: docarray |
|||
owner_html_url: https://github.com/docarray |
|||
- name: devpush |
|||
html_url: https://github.com/hunvreus/devpush |
|||
stars: 3097 |
|||
owner_login: hunvreus |
|||
owner_html_url: https://github.com/hunvreus |
|||
- name: fastapi-realworld-example-app |
|||
html_url: https://github.com/nsidnev/fastapi-realworld-example-app |
|||
stars: 2936 |
|||
stars: 3050 |
|||
owner_login: nsidnev |
|||
owner_html_url: https://github.com/nsidnev |
|||
- name: uvicorn-gunicorn-fastapi-docker |
|||
html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker |
|||
stars: 2804 |
|||
stars: 2911 |
|||
owner_login: tiangolo |
|||
owner_html_url: https://github.com/tiangolo |
|||
- name: best-of-web-python |
|||
html_url: https://github.com/ml-tooling/best-of-web-python |
|||
stars: 2610 |
|||
owner_login: ml-tooling |
|||
owner_html_url: https://github.com/ml-tooling |
|||
- name: mcp-context-forge |
|||
html_url: https://github.com/IBM/mcp-context-forge |
|||
stars: 2572 |
|||
stars: 2899 |
|||
owner_login: IBM |
|||
owner_html_url: https://github.com/IBM |
|||
- name: fastapi-react |
|||
html_url: https://github.com/Buuntu/fastapi-react |
|||
stars: 2451 |
|||
owner_login: Buuntu |
|||
owner_html_url: https://github.com/Buuntu |
|||
- name: RasaGPT |
|||
html_url: https://github.com/paulpierre/RasaGPT |
|||
stars: 2441 |
|||
owner_login: paulpierre |
|||
owner_html_url: https://github.com/paulpierre |
|||
- name: best-of-web-python |
|||
html_url: https://github.com/ml-tooling/best-of-web-python |
|||
stars: 2648 |
|||
owner_login: ml-tooling |
|||
owner_html_url: https://github.com/ml-tooling |
|||
- name: FastAPI-template |
|||
html_url: https://github.com/s3rius/FastAPI-template |
|||
stars: 2424 |
|||
stars: 2637 |
|||
owner_login: s3rius |
|||
owner_html_url: https://github.com/s3rius |
|||
- name: YC-Killer |
|||
html_url: https://github.com/sahibzada-allahyar/YC-Killer |
|||
stars: 2599 |
|||
owner_login: sahibzada-allahyar |
|||
owner_html_url: https://github.com/sahibzada-allahyar |
|||
- name: fastapi-react |
|||
html_url: https://github.com/Buuntu/fastapi-react |
|||
stars: 2569 |
|||
owner_login: Buuntu |
|||
owner_html_url: https://github.com/Buuntu |
|||
- name: Yuxi-Know |
|||
html_url: https://github.com/xerrors/Yuxi-Know |
|||
stars: 2563 |
|||
owner_login: xerrors |
|||
owner_html_url: https://github.com/xerrors |
|||
- name: sqladmin |
|||
html_url: https://github.com/aminalaee/sqladmin |
|||
stars: 2357 |
|||
stars: 2558 |
|||
owner_login: aminalaee |
|||
owner_html_url: https://github.com/aminalaee |
|||
- name: nextpy |
|||
html_url: https://github.com/dot-agent/nextpy |
|||
stars: 2324 |
|||
owner_login: dot-agent |
|||
owner_html_url: https://github.com/dot-agent |
|||
- name: RasaGPT |
|||
html_url: https://github.com/paulpierre/RasaGPT |
|||
stars: 2451 |
|||
owner_login: paulpierre |
|||
owner_html_url: https://github.com/paulpierre |
|||
- name: supabase-py |
|||
html_url: https://github.com/supabase/supabase-py |
|||
stars: 2236 |
|||
stars: 2344 |
|||
owner_login: supabase |
|||
owner_html_url: https://github.com/supabase |
|||
- name: nextpy |
|||
html_url: https://github.com/dot-agent/nextpy |
|||
stars: 2335 |
|||
owner_login: dot-agent |
|||
owner_html_url: https://github.com/dot-agent |
|||
- name: fastapi-utils |
|||
html_url: https://github.com/fastapiutils/fastapi-utils |
|||
stars: 2291 |
|||
owner_login: fastapiutils |
|||
owner_html_url: https://github.com/fastapiutils |
|||
- name: 30-Days-of-Python |
|||
html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python |
|||
stars: 2210 |
|||
stars: 2220 |
|||
owner_login: codingforentrepreneurs |
|||
owner_html_url: https://github.com/codingforentrepreneurs |
|||
- name: langserve |
|||
html_url: https://github.com/langchain-ai/langserve |
|||
stars: 2171 |
|||
stars: 2215 |
|||
owner_login: langchain-ai |
|||
owner_html_url: https://github.com/langchain-ai |
|||
- name: fastapi-utils |
|||
html_url: https://github.com/fastapiutils/fastapi-utils |
|||
stars: 2164 |
|||
owner_login: fastapiutils |
|||
owner_html_url: https://github.com/fastapiutils |
|||
- name: solara |
|||
html_url: https://github.com/widgetti/solara |
|||
stars: 2102 |
|||
stars: 2122 |
|||
owner_login: widgetti |
|||
owner_html_url: https://github.com/widgetti |
|||
- name: Yuxi-Know |
|||
html_url: https://github.com/xerrors/Yuxi-Know |
|||
stars: 1995 |
|||
owner_login: xerrors |
|||
owner_html_url: https://github.com/xerrors |
|||
- name: mangum |
|||
html_url: https://github.com/Kludex/mangum |
|||
stars: 1989 |
|||
stars: 2029 |
|||
owner_login: Kludex |
|||
owner_html_url: https://github.com/Kludex |
|||
- name: python-week-2022 |
|||
html_url: https://github.com/rochacbruno/python-week-2022 |
|||
stars: 1816 |
|||
owner_login: rochacbruno |
|||
owner_html_url: https://github.com/rochacbruno |
|||
- name: agentkit |
|||
html_url: https://github.com/BCG-X-Official/agentkit |
|||
stars: 1789 |
|||
stars: 1912 |
|||
owner_login: BCG-X-Official |
|||
owner_html_url: https://github.com/BCG-X-Official |
|||
- name: manage-fastapi |
|||
html_url: https://github.com/ycd/manage-fastapi |
|||
stars: 1780 |
|||
stars: 1885 |
|||
owner_login: ycd |
|||
owner_html_url: https://github.com/ycd |
|||
- name: ormar |
|||
html_url: https://github.com/collerek/ormar |
|||
stars: 1777 |
|||
owner_login: collerek |
|||
owner_html_url: https://github.com/collerek |
|||
- name: openapi-python-client |
|||
html_url: https://github.com/openapi-generators/openapi-python-client |
|||
stars: 1707 |
|||
stars: 1862 |
|||
owner_login: openapi-generators |
|||
owner_html_url: https://github.com/openapi-generators |
|||
- name: piccolo |
|||
html_url: https://github.com/piccolo-orm/piccolo |
|||
stars: 1695 |
|||
stars: 1836 |
|||
owner_login: piccolo-orm |
|||
owner_html_url: https://github.com/piccolo-orm |
|||
- name: vue-fastapi-admin |
|||
html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin |
|||
stars: 1695 |
|||
stars: 1831 |
|||
owner_login: mizhexiaoxiao |
|||
owner_html_url: https://github.com/mizhexiaoxiao |
|||
- name: python-week-2022 |
|||
html_url: https://github.com/rochacbruno/python-week-2022 |
|||
stars: 1817 |
|||
owner_login: rochacbruno |
|||
owner_html_url: https://github.com/rochacbruno |
|||
- name: slowapi |
|||
html_url: https://github.com/laurentS/slowapi |
|||
stars: 1798 |
|||
owner_login: laurentS |
|||
owner_html_url: https://github.com/laurentS |
|||
- name: fastapi-cache |
|||
html_url: https://github.com/long2ice/fastapi-cache |
|||
stars: 1653 |
|||
stars: 1789 |
|||
owner_login: long2ice |
|||
owner_html_url: https://github.com/long2ice |
|||
- name: langchain-serve |
|||
html_url: https://github.com/jina-ai/langchain-serve |
|||
stars: 1635 |
|||
owner_login: jina-ai |
|||
owner_html_url: https://github.com/jina-ai |
|||
- name: ormar |
|||
html_url: https://github.com/collerek/ormar |
|||
stars: 1783 |
|||
owner_login: collerek |
|||
owner_html_url: https://github.com/collerek |
|||
- name: termpair |
|||
html_url: https://github.com/cs01/termpair |
|||
stars: 1624 |
|||
stars: 1716 |
|||
owner_login: cs01 |
|||
owner_html_url: https://github.com/cs01 |
|||
- name: slowapi |
|||
html_url: https://github.com/laurentS/slowapi |
|||
stars: 1620 |
|||
owner_login: laurentS |
|||
owner_html_url: https://github.com/laurentS |
|||
- name: coronavirus-tracker-api |
|||
html_url: https://github.com/ExpDev07/coronavirus-tracker-api |
|||
stars: 1576 |
|||
owner_login: ExpDev07 |
|||
owner_html_url: https://github.com/ExpDev07 |
|||
- name: fastapi-crudrouter |
|||
html_url: https://github.com/awtkns/fastapi-crudrouter |
|||
stars: 1546 |
|||
owner_login: awtkns |
|||
owner_html_url: https://github.com/awtkns |
|||
- name: FastAPI-boilerplate |
|||
html_url: https://github.com/benavlabs/FastAPI-boilerplate |
|||
stars: 1516 |
|||
stars: 1660 |
|||
owner_login: benavlabs |
|||
owner_html_url: https://github.com/benavlabs |
|||
- name: fastapi-langgraph-agent-production-ready-template |
|||
html_url: https://github.com/wassim249/fastapi-langgraph-agent-production-ready-template |
|||
stars: 1638 |
|||
owner_login: wassim249 |
|||
owner_html_url: https://github.com/wassim249 |
|||
- name: langchain-serve |
|||
html_url: https://github.com/jina-ai/langchain-serve |
|||
stars: 1635 |
|||
owner_login: jina-ai |
|||
owner_html_url: https://github.com/jina-ai |
|||
- name: awesome-fastapi-projects |
|||
html_url: https://github.com/Kludex/awesome-fastapi-projects |
|||
stars: 1481 |
|||
stars: 1589 |
|||
owner_login: Kludex |
|||
owner_html_url: https://github.com/Kludex |
|||
- name: fastapi-pagination |
|||
html_url: https://github.com/uriyyo/fastapi-pagination |
|||
stars: 1453 |
|||
stars: 1585 |
|||
owner_login: uriyyo |
|||
owner_html_url: https://github.com/uriyyo |
|||
- name: coronavirus-tracker-api |
|||
html_url: https://github.com/ExpDev07/coronavirus-tracker-api |
|||
stars: 1574 |
|||
owner_login: ExpDev07 |
|||
owner_html_url: https://github.com/ExpDev07 |
|||
- name: fastapi-crudrouter |
|||
html_url: https://github.com/awtkns/fastapi-crudrouter |
|||
stars: 1559 |
|||
owner_login: awtkns |
|||
owner_html_url: https://github.com/awtkns |
|||
- name: bracket |
|||
html_url: https://github.com/evroon/bracket |
|||
stars: 1415 |
|||
stars: 1489 |
|||
owner_login: evroon |
|||
owner_html_url: https://github.com/evroon |
|||
- name: awesome-python-resources |
|||
html_url: https://github.com/DjangoEx/awesome-python-resources |
|||
stars: 1413 |
|||
owner_login: DjangoEx |
|||
owner_html_url: https://github.com/DjangoEx |
|||
- name: fastapi-boilerplate |
|||
html_url: https://github.com/teamhide/fastapi-boilerplate |
|||
stars: 1406 |
|||
owner_login: teamhide |
|||
owner_html_url: https://github.com/teamhide |
|||
- name: budgetml |
|||
html_url: https://github.com/ebhy/budgetml |
|||
stars: 1346 |
|||
owner_login: ebhy |
|||
owner_html_url: https://github.com/ebhy |
|||
- name: fastapi-amis-admin |
|||
html_url: https://github.com/amisadmin/fastapi-amis-admin |
|||
stars: 1342 |
|||
stars: 1475 |
|||
owner_login: amisadmin |
|||
owner_html_url: https://github.com/amisadmin |
|||
- name: fastapi-langgraph-agent-production-ready-template |
|||
html_url: https://github.com/wassim249/fastapi-langgraph-agent-production-ready-template |
|||
stars: 1334 |
|||
owner_login: wassim249 |
|||
owner_html_url: https://github.com/wassim249 |
|||
- name: fastapi-tutorial |
|||
html_url: https://github.com/liaogx/fastapi-tutorial |
|||
stars: 1303 |
|||
owner_login: liaogx |
|||
owner_html_url: https://github.com/liaogx |
|||
- name: fastapi_best_architecture |
|||
html_url: https://github.com/fastapi-practices/fastapi_best_architecture |
|||
stars: 1276 |
|||
owner_login: fastapi-practices |
|||
owner_html_url: https://github.com/fastapi-practices |
|||
- name: fastapi-boilerplate |
|||
html_url: https://github.com/teamhide/fastapi-boilerplate |
|||
stars: 1436 |
|||
owner_login: teamhide |
|||
owner_html_url: https://github.com/teamhide |
|||
- name: awesome-python-resources |
|||
html_url: https://github.com/DjangoEx/awesome-python-resources |
|||
stars: 1426 |
|||
owner_login: DjangoEx |
|||
owner_html_url: https://github.com/DjangoEx |
|||
- name: fastcrud |
|||
html_url: https://github.com/benavlabs/fastcrud |
|||
stars: 1272 |
|||
stars: 1414 |
|||
owner_login: benavlabs |
|||
owner_html_url: https://github.com/benavlabs |
|||
- name: fastapi-code-generator |
|||
html_url: https://github.com/koxudaxi/fastapi-code-generator |
|||
stars: 1253 |
|||
owner_login: koxudaxi |
|||
owner_html_url: https://github.com/koxudaxi |
|||
- name: prometheus-fastapi-instrumentator |
|||
html_url: https://github.com/trallnag/prometheus-fastapi-instrumentator |
|||
stars: 1246 |
|||
stars: 1388 |
|||
owner_login: trallnag |
|||
owner_html_url: https://github.com/trallnag |
|||
- name: bolt-python |
|||
html_url: https://github.com/slackapi/bolt-python |
|||
stars: 1221 |
|||
owner_login: slackapi |
|||
owner_html_url: https://github.com/slackapi |
|||
- name: fastapi_best_architecture |
|||
html_url: https://github.com/fastapi-practices/fastapi_best_architecture |
|||
stars: 1378 |
|||
owner_login: fastapi-practices |
|||
owner_html_url: https://github.com/fastapi-practices |
|||
- name: fastapi-code-generator |
|||
html_url: https://github.com/koxudaxi/fastapi-code-generator |
|||
stars: 1375 |
|||
owner_login: koxudaxi |
|||
owner_html_url: https://github.com/koxudaxi |
|||
- name: budgetml |
|||
html_url: https://github.com/ebhy/budgetml |
|||
stars: 1345 |
|||
owner_login: ebhy |
|||
owner_html_url: https://github.com/ebhy |
|||
- name: fastapi-tutorial |
|||
html_url: https://github.com/liaogx/fastapi-tutorial |
|||
stars: 1327 |
|||
owner_login: liaogx |
|||
owner_html_url: https://github.com/liaogx |
|||
- name: fastapi-alembic-sqlmodel-async |
|||
html_url: https://github.com/jonra1993/fastapi-alembic-sqlmodel-async |
|||
stars: 1259 |
|||
owner_login: jonra1993 |
|||
owner_html_url: https://github.com/jonra1993 |
|||
- name: fastapi-scaff |
|||
html_url: https://github.com/atpuxiner/fastapi-scaff |
|||
stars: 1255 |
|||
owner_login: atpuxiner |
|||
owner_html_url: https://github.com/atpuxiner |
|||
- name: bedrock-chat |
|||
html_url: https://github.com/aws-samples/bedrock-chat |
|||
stars: 1220 |
|||
stars: 1254 |
|||
owner_login: aws-samples |
|||
owner_html_url: https://github.com/aws-samples |
|||
- name: bolt-python |
|||
html_url: https://github.com/slackapi/bolt-python |
|||
stars: 1253 |
|||
owner_login: slackapi |
|||
owner_html_url: https://github.com/slackapi |
|||
- name: fastapi_production_template |
|||
html_url: https://github.com/zhanymkanov/fastapi_production_template |
|||
stars: 1202 |
|||
stars: 1217 |
|||
owner_login: zhanymkanov |
|||
owner_html_url: https://github.com/zhanymkanov |
|||
- name: fastapi-scaff |
|||
html_url: https://github.com/atpuxiner/fastapi-scaff |
|||
stars: 1193 |
|||
owner_login: atpuxiner |
|||
owner_html_url: https://github.com/atpuxiner |
|||
- name: langchain-extract |
|||
html_url: https://github.com/langchain-ai/langchain-extract |
|||
stars: 1164 |
|||
stars: 1176 |
|||
owner_login: langchain-ai |
|||
owner_html_url: https://github.com/langchain-ai |
|||
- name: fastapi-alembic-sqlmodel-async |
|||
html_url: https://github.com/jonra1993/fastapi-alembic-sqlmodel-async |
|||
stars: 1149 |
|||
owner_login: jonra1993 |
|||
owner_html_url: https://github.com/jonra1993 |
|||
- name: odmantic |
|||
html_url: https://github.com/art049/odmantic |
|||
stars: 1133 |
|||
owner_login: art049 |
|||
owner_html_url: https://github.com/art049 |
|||
- name: restish |
|||
html_url: https://github.com/rest-sh/restish |
|||
stars: 1122 |
|||
stars: 1140 |
|||
owner_login: rest-sh |
|||
owner_html_url: https://github.com/rest-sh |
|||
- name: runhouse |
|||
html_url: https://github.com/run-house/runhouse |
|||
stars: 1047 |
|||
owner_login: run-house |
|||
owner_html_url: https://github.com/run-house |
|||
- name: flock |
|||
html_url: https://github.com/Onelevenvy/flock |
|||
stars: 1027 |
|||
owner_login: Onelevenvy |
|||
owner_html_url: https://github.com/Onelevenvy |
|||
- name: odmantic |
|||
html_url: https://github.com/art049/odmantic |
|||
stars: 1138 |
|||
owner_login: art049 |
|||
owner_html_url: https://github.com/art049 |
|||
- name: authx |
|||
html_url: https://github.com/yezz123/authx |
|||
stars: 999 |
|||
stars: 1119 |
|||
owner_login: yezz123 |
|||
owner_html_url: https://github.com/yezz123 |
|||
- name: NoteDiscovery |
|||
html_url: https://github.com/gamosoft/NoteDiscovery |
|||
stars: 1107 |
|||
owner_login: gamosoft |
|||
owner_html_url: https://github.com/gamosoft |
|||
- name: flock |
|||
html_url: https://github.com/Onelevenvy/flock |
|||
stars: 1055 |
|||
owner_login: Onelevenvy |
|||
owner_html_url: https://github.com/Onelevenvy |
|||
- name: fastapi-observability |
|||
html_url: https://github.com/blueswen/fastapi-observability |
|||
stars: 1038 |
|||
owner_login: blueswen |
|||
owner_html_url: https://github.com/blueswen |
|||
- name: aktools |
|||
html_url: https://github.com/akfamily/aktools |
|||
stars: 1027 |
|||
owner_login: akfamily |
|||
owner_html_url: https://github.com/akfamily |
|||
- name: RuoYi-Vue3-FastAPI |
|||
html_url: https://github.com/insistence/RuoYi-Vue3-FastAPI |
|||
stars: 1016 |
|||
owner_login: insistence |
|||
owner_html_url: https://github.com/insistence |
|||
- name: autollm |
|||
html_url: https://github.com/viddexa/autollm |
|||
stars: 999 |
|||
stars: 1002 |
|||
owner_login: viddexa |
|||
owner_html_url: https://github.com/viddexa |
|||
- name: lanarky |
|||
html_url: https://github.com/ajndkr/lanarky |
|||
stars: 995 |
|||
owner_login: ajndkr |
|||
owner_html_url: https://github.com/ajndkr |
|||
- name: titiler |
|||
html_url: https://github.com/developmentseed/titiler |
|||
stars: 952 |
|||
stars: 999 |
|||
owner_login: developmentseed |
|||
owner_html_url: https://github.com/developmentseed |
|||
- name: energy-forecasting |
|||
html_url: https://github.com/iusztinpaul/energy-forecasting |
|||
stars: 946 |
|||
owner_login: iusztinpaul |
|||
owner_html_url: https://github.com/iusztinpaul |
|||
- name: secure |
|||
html_url: https://github.com/TypeError/secure |
|||
stars: 944 |
|||
owner_login: TypeError |
|||
owner_html_url: https://github.com/TypeError |
|||
- name: langcorn |
|||
html_url: https://github.com/msoedov/langcorn |
|||
stars: 934 |
|||
owner_login: msoedov |
|||
owner_html_url: https://github.com/msoedov |
|||
- name: RuoYi-Vue3-FastAPI |
|||
html_url: https://github.com/insistence/RuoYi-Vue3-FastAPI |
|||
stars: 930 |
|||
owner_login: insistence |
|||
owner_html_url: https://github.com/insistence |
|||
- name: aktools |
|||
html_url: https://github.com/akfamily/aktools |
|||
stars: 916 |
|||
owner_login: akfamily |
|||
owner_html_url: https://github.com/akfamily |
|||
- name: lanarky |
|||
html_url: https://github.com/ajndkr/lanarky |
|||
stars: 994 |
|||
owner_login: ajndkr |
|||
owner_html_url: https://github.com/ajndkr |
|||
- name: every-pdf |
|||
html_url: https://github.com/DDULDDUCK/every-pdf |
|||
stars: 907 |
|||
stars: 985 |
|||
owner_login: DDULDDUCK |
|||
owner_html_url: https://github.com/DDULDDUCK |
|||
- name: marker-api |
|||
html_url: https://github.com/adithya-s-k/marker-api |
|||
stars: 903 |
|||
owner_login: adithya-s-k |
|||
owner_html_url: https://github.com/adithya-s-k |
|||
- name: fastapi-observability |
|||
html_url: https://github.com/blueswen/fastapi-observability |
|||
stars: 902 |
|||
owner_login: blueswen |
|||
owner_html_url: https://github.com/blueswen |
|||
- name: fastapi-do-zero |
|||
html_url: https://github.com/dunossauro/fastapi-do-zero |
|||
stars: 900 |
|||
owner_login: dunossauro |
|||
owner_html_url: https://github.com/dunossauro |
|||
- name: enterprise-deep-research |
|||
html_url: https://github.com/SalesforceAIResearch/enterprise-deep-research |
|||
stars: 973 |
|||
owner_login: SalesforceAIResearch |
|||
owner_html_url: https://github.com/SalesforceAIResearch |
|||
- name: fastapi-mail |
|||
html_url: https://github.com/sabuhish/fastapi-mail |
|||
stars: 964 |
|||
owner_login: sabuhish |
|||
owner_html_url: https://github.com/sabuhish |
|||
|
|||
@ -0,0 +1,65 @@ |
|||
# FastAPI Cloud { #fastapi-cloud } |
|||
|
|||
You can deploy your FastAPI app to <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a> with **one command**, go and join the waiting list if you haven't. 🚀 |
|||
|
|||
## Login { #login } |
|||
|
|||
Make sure you already have a **FastAPI Cloud** account (we invited you from the waiting list 😉). |
|||
|
|||
Then log in: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ fastapi login |
|||
|
|||
You are logged in to FastAPI Cloud 🚀 |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
## Deploy { #deploy } |
|||
|
|||
Now deploy your app, with **one command**: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ fastapi deploy |
|||
|
|||
Deploying to FastAPI Cloud... |
|||
|
|||
✅ Deployment successful! |
|||
|
|||
🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
That's it! Now you can access your app at that URL. ✨ |
|||
|
|||
## About FastAPI Cloud { #about-fastapi-cloud } |
|||
|
|||
**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** is built by the same author and team behind **FastAPI**. |
|||
|
|||
It streamlines the process of **building**, **deploying**, and **accessing** an API with minimal effort. |
|||
|
|||
It brings the same **developer experience** of building apps with FastAPI to **deploying** them to the cloud. 🎉 |
|||
|
|||
It will also take care of most of the things you would need when deploying an app, like: |
|||
|
|||
* HTTPS |
|||
* Replication, with autoscaling based on requests |
|||
* etc. |
|||
|
|||
FastAPI Cloud is the primary sponsor and funding provider for the *FastAPI and friends* open source projects. ✨ |
|||
|
|||
## Deploy to other cloud providers { #deploy-to-other-cloud-providers } |
|||
|
|||
FastAPI is open source and based on standards. You can deploy FastAPI apps to any cloud provider you choose. |
|||
|
|||
Follow your cloud provider's guides to deploy FastAPI apps with them. 🤓 |
|||
|
|||
## Deploy your own server { #deploy-your-own-server } |
|||
|
|||
I will also teach you later in this **Deployment** guide all the details, so you can understand what is going on, what needs to happen, or how to deploy FastAPI apps on your own, also with your own servers. 🤓 |
|||
@ -0,0 +1,17 @@ |
|||
# Use Old 403 Authentication Error Status Codes { #use-old-403-authentication-error-status-codes } |
|||
|
|||
Before FastAPI version `0.122.0`, when the integrated security utilities returned an error to the client after a failed authentication, they used the HTTP status code `403 Forbidden`. |
|||
|
|||
Starting with FastAPI version `0.122.0`, they use the more appropriate HTTP status code `401 Unauthorized`, and return a sensible `WWW-Authenticate` header in the response, following the HTTP specifications, <a href="https://datatracker.ietf.org/doc/html/rfc7235#section-3.1" class="external-link" target="_blank">RFC 7235</a>, <a href="https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized" class="external-link" target="_blank">RFC 9110</a>. |
|||
|
|||
But if for some reason your clients depend on the old behavior, you can revert to it by overriding the method `make_not_authenticated_error` in your security classes. |
|||
|
|||
For example, you can create a subclass of `HTTPBearer` that returns a `403 Forbidden` error instead of the default `401 Unauthorized` error: |
|||
|
|||
{* ../../docs_src/authentication_error_status_code/tutorial001_an_py39.py hl[9:13] *} |
|||
|
|||
/// tip |
|||
|
|||
Notice that the function returns the exception instance, it doesn't raise it. The raising is done in the rest of the internal code. |
|||
|
|||
/// |
|||
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 7.2 KiB |
|
After Width: | Height: | Size: 6.3 KiB |
|
After Width: | Height: | Size: 10 KiB |
@ -1,6 +1,5 @@ |
|||
# Define this here and not in the main mkdocs.yml file because that one is auto |
|||
# updated and written, and the script would remove the env var |
|||
INHERIT: !ENV [INSIDERS_FILE, '../en/mkdocs.no-insiders.yml'] |
|||
markdown_extensions: |
|||
pymdownx.highlight: |
|||
linenums: !ENV [LINENUMS, false] |
|||
@ -1,10 +0,0 @@ |
|||
plugins: |
|||
social: |
|||
cards_layout_options: |
|||
logo: ../en/docs/img/icon-white.svg |
|||
typeset: |
|||
markdown_extensions: |
|||
material.extensions.preview: |
|||
targets: |
|||
include: |
|||
- "*" |
|||
@ -1,7 +1,9 @@ |
|||
/// warning |
|||
|
|||
The current page still doesn't have a translation for this language. |
|||
This page hasn’t been translated into your language yet. 🌍 |
|||
|
|||
But you can help translating it: [Contributing](https://fastapi.tiangolo.com/contributing/){.internal-link target=_blank}. |
|||
We’re currently switching to an automated translation system 🤖, which will help keep all translations complete and up to date. |
|||
|
|||
Learn more: [Contributing – Translations](https://fastapi.tiangolo.com/contributing/#translations){.internal-link target=_blank} |
|||
|
|||
/// |
|||
|
|||
@ -0,0 +1,503 @@ |
|||
# Arquivo de teste de LLM { #llm-test-file } |
|||
|
|||
Este documento testa se o <abbr title="Large Language Model – Modelo de Linguagem de Grande Porte">LLM</abbr>, que traduz a documentação, entende o `general_prompt` em `scripts/translate.py` e o prompt específico do idioma em `docs/{language code}/llm-prompt.md`. O prompt específico do idioma é anexado ao `general_prompt`. |
|||
|
|||
Os testes adicionados aqui serão vistos por todos os autores dos prompts específicos de idioma. |
|||
|
|||
Use da seguinte forma: |
|||
|
|||
* Tenha um prompt específico do idioma – `docs/{language code}/llm-prompt.md`. |
|||
* Faça uma tradução nova deste documento para o seu idioma de destino (veja, por exemplo, o comando `translate-page` do `translate.py`). Isso criará a tradução em `docs/{language code}/docs/_llm-test.md`. |
|||
* 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 <a href="https://doublespeak.chat/#/handbook#deterministic-output" class="external-link" target="_blank">LLMs não são algoritmos determinísticos</a>). |
|||
|
|||
Os testes: |
|||
|
|||
## Trechos de código { #code-snippets} |
|||
|
|||
//// tab | Teste |
|||
|
|||
Este é um trecho de código: `foo`. E este é outro trecho de código: `bar`. E mais um: `baz quux`. |
|||
|
|||
//// |
|||
|
|||
//// tab | Informações |
|||
|
|||
O conteúdo dos trechos de código deve ser deixado como está. |
|||
|
|||
Veja a seção `### Content of code snippets` no prompt geral em `scripts/translate.py`. |
|||
|
|||
//// |
|||
|
|||
## Citações { #quotes } |
|||
|
|||
//// tab | Teste |
|||
|
|||
Ontem, meu amigo escreveu: "Se você soletrar incorretamente corretamente, você a soletrou incorretamente". Ao que respondi: "Correto, mas 'incorrectly' está incorretamente não '"incorrectly"'". |
|||
|
|||
/// note | Nota |
|||
|
|||
O LLM provavelmente vai traduzir isso errado. O interessante é apenas se ele mantém a tradução corrigida ao retraduzir. |
|||
|
|||
/// |
|||
|
|||
//// |
|||
|
|||
//// tab | Informações |
|||
|
|||
O autor do prompt pode escolher se deseja converter aspas neutras em aspas tipográficas. Também é aceitável deixá-las como estão. |
|||
|
|||
Veja, por exemplo, a seção `### Quotes` em `docs/de/llm-prompt.md`. |
|||
|
|||
//// |
|||
|
|||
## Citações em trechos de código { #quotes-in-code-snippets} |
|||
|
|||
//// tab | Teste |
|||
|
|||
`pip install "foo[bar]"` |
|||
|
|||
Exemplos de literais de string em trechos de código: `"this"`, `'that'`. |
|||
|
|||
Um exemplo difícil de literais de string em trechos de código: `f"I like {'oranges' if orange else "apples"}"` |
|||
|
|||
Pesado: `Yesterday, my friend wrote: "If you spell incorrectly correctly, you have spelled it incorrectly". To which I answered: "Correct, but 'incorrectly' is incorrectly not '"incorrectly"'"` |
|||
|
|||
//// |
|||
|
|||
//// tab | Informações |
|||
|
|||
... No entanto, as aspas dentro de trechos de código devem permanecer como estão. |
|||
|
|||
//// |
|||
|
|||
## Blocos de código { #code-blocks } |
|||
|
|||
//// tab | Teste |
|||
|
|||
Um exemplo de código Bash... |
|||
|
|||
```bash |
|||
# Imprimir uma saudação ao universo |
|||
echo "Hello universe" |
|||
``` |
|||
|
|||
...e um exemplo de código de console... |
|||
|
|||
```console |
|||
$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid">main.py</u> |
|||
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting server |
|||
Searching for package file structure |
|||
``` |
|||
|
|||
...e outro exemplo de código de console... |
|||
|
|||
```console |
|||
// Crie um diretório "Code" |
|||
$ mkdir code |
|||
// Entre nesse diretório |
|||
$ cd code |
|||
``` |
|||
|
|||
...e um exemplo de código Python... |
|||
|
|||
```Python |
|||
wont_work() # Isto não vai funcionar 😱 |
|||
works(foo="bar") # Isto funciona 🎉 |
|||
``` |
|||
|
|||
...e é isso. |
|||
|
|||
//// |
|||
|
|||
//// tab | Informações |
|||
|
|||
O código em blocos de código não deve ser modificado, com exceção dos comentários. |
|||
|
|||
Veja a seção `### Content of code blocks` no prompt geral em `scripts/translate.py`. |
|||
|
|||
//// |
|||
|
|||
## Abas e caixas coloridas { #tabs-and-colored-boxes } |
|||
|
|||
//// tab | Teste |
|||
|
|||
/// info | Informação |
|||
Algum texto |
|||
/// |
|||
|
|||
/// note | Nota |
|||
Algum texto |
|||
/// |
|||
|
|||
/// note | Detalhes Técnicos |
|||
Algum texto |
|||
/// |
|||
|
|||
/// check | Verifique |
|||
Algum texto |
|||
/// |
|||
|
|||
/// tip | Dica |
|||
Algum texto |
|||
/// |
|||
|
|||
/// warning | Atenção |
|||
Algum texto |
|||
/// |
|||
|
|||
/// danger | Cuidado |
|||
Algum texto |
|||
/// |
|||
|
|||
//// |
|||
|
|||
//// tab | Informações |
|||
|
|||
Abas e blocos `Info`/`Note`/`Warning`/etc. devem ter a tradução do seu título adicionada após uma barra vertical (`|`). |
|||
|
|||
Veja as seções `### Special blocks` e `### Tab blocks` no prompt geral em `scripts/translate.py`. |
|||
|
|||
//// |
|||
|
|||
## Links da Web e internos { #web-and-internal-links } |
|||
|
|||
//// tab | Teste |
|||
|
|||
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} |
|||
* <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">Link externo</a> |
|||
* <a href="https://fastapi.tiangolo.com/css/styles.css" class="external-link" target="_blank">Link para um estilo</a> |
|||
* <a href="https://fastapi.tiangolo.com/js/logic.js" class="external-link" target="_blank">Link para um script</a> |
|||
* <a href="https://fastapi.tiangolo.com/img/foo.jpg" class="external-link" target="_blank">Link para uma imagem</a> |
|||
|
|||
O texto do link deve ser traduzido, o endereço do link deve apontar para a tradução: |
|||
|
|||
* <a href="https://fastapi.tiangolo.com/pt/" class="external-link" target="_blank">Link do FastAPI</a> |
|||
|
|||
//// |
|||
|
|||
//// tab | Informações |
|||
|
|||
Os links devem ser traduzidos, mas seus endereços devem permanecer inalterados. Uma exceção são links absolutos para páginas da documentação do FastAPI. Nesse caso, devem apontar para a tradução. |
|||
|
|||
Veja a seção `### Links` no prompt geral em `scripts/translate.py`. |
|||
|
|||
//// |
|||
|
|||
## Elementos HTML "abbr" { #html-abbr-elements } |
|||
|
|||
//// tab | Teste |
|||
|
|||
Aqui estão algumas coisas envolvidas em elementos HTML "abbr" (algumas são inventadas): |
|||
|
|||
### O abbr fornece uma frase completa { #the-abbr-gives-a-full-phrase } |
|||
|
|||
* <abbr title="Getting Things Done – Fazer as Coisas">GTD</abbr> |
|||
* <abbr title="menos que"><code>lt</code></abbr> |
|||
* <abbr title="XML Web Token – Token Web XML">XWT</abbr> |
|||
* <abbr title="Parallel Server Gateway Interface – Interface de Gateway de Servidor Paralelo">PSGI</abbr> |
|||
|
|||
### O abbr fornece uma explicação { #the-abbr-gives-an-explanation } |
|||
|
|||
* <abbr title="Um grupo de máquinas configuradas para estarem conectadas e trabalharem juntas de alguma forma.">cluster</abbr> |
|||
* <abbr title="Um método de aprendizado de máquina que usa redes neurais artificiais com numerosas camadas ocultas entre as camadas de entrada e saída, desenvolvendo assim uma estrutura interna abrangente">Aprendizado Profundo</abbr> |
|||
|
|||
### O abbr fornece uma frase completa e uma explicação { #the-abbr-gives-a-full-phrase-and-an-explanation } |
|||
|
|||
* <abbr title="Mozilla Developer Network – Rede de Desenvolvedores da Mozilla: documentação para desenvolvedores, escrita pelo pessoal do Firefox">MDN</abbr> |
|||
* <abbr title="Input/Output – Entrada/Saída: leitura ou escrita em disco, comunicações de rede.">I/O</abbr>. |
|||
|
|||
//// |
|||
|
|||
//// tab | Informações |
|||
|
|||
Os atributos "title" dos elementos "abbr" são traduzidos seguindo algumas instruções específicas. |
|||
|
|||
As traduções podem adicionar seus próprios elementos "abbr" que o LLM não deve remover. Por exemplo, para explicar palavras em inglês. |
|||
|
|||
Veja a seção `### HTML abbr elements` no prompt geral em `scripts/translate.py`. |
|||
|
|||
//// |
|||
|
|||
## Títulos { #headings } |
|||
|
|||
//// tab | Teste |
|||
|
|||
### Desenvolver uma aplicação web - um tutorial { #develop-a-webapp-a-tutorial } |
|||
|
|||
Olá. |
|||
|
|||
### Anotações de tipo e -anotações { #type-hints-and-annotations } |
|||
|
|||
Olá novamente. |
|||
|
|||
### Super- e subclasses { #super-and-subclasses } |
|||
|
|||
Olá novamente. |
|||
|
|||
//// |
|||
|
|||
//// tab | Informações |
|||
|
|||
A única regra rígida para títulos é que o LLM deixe a parte do hash dentro de chaves inalterada, o que garante que os links não quebrem. |
|||
|
|||
Veja a seção `### Headings` no prompt geral em `scripts/translate.py`. |
|||
|
|||
Para algumas instruções específicas do idioma, veja, por exemplo, a seção `### Headings` em `docs/de/llm-prompt.md`. |
|||
|
|||
//// |
|||
|
|||
## Termos usados na documentação { #terms-used-in-the-docs } |
|||
|
|||
//// tab | Teste |
|||
|
|||
* você |
|||
* seu |
|||
|
|||
* por exemplo |
|||
* etc. |
|||
|
|||
* `foo` como um `int` |
|||
* `bar` como uma `str` |
|||
* `baz` como uma `list` |
|||
|
|||
* o Tutorial - Guia do Usuário |
|||
* o Guia do Usuário Avançado |
|||
* a documentação do SQLModel |
|||
* a documentação da API |
|||
* a documentação automática |
|||
|
|||
* Ciência de Dados |
|||
* Aprendizado Profundo |
|||
* Aprendizado de Máquina |
|||
* Injeção de Dependências |
|||
* autenticação HTTP Basic |
|||
* HTTP Digest |
|||
* formato ISO |
|||
* o padrão JSON Schema |
|||
* o JSON schema |
|||
* a definição do schema |
|||
* Fluxo de Senha |
|||
* Mobile |
|||
|
|||
* descontinuado |
|||
* projetado |
|||
* inválido |
|||
* dinamicamente |
|||
* padrão |
|||
* padrão predefinido |
|||
* sensível a maiúsculas e minúsculas |
|||
* não sensível a maiúsculas e minúsculas |
|||
|
|||
* servir a aplicação |
|||
* servir a página |
|||
|
|||
* o app |
|||
* a aplicação |
|||
|
|||
* a requisição |
|||
* a resposta |
|||
* a resposta de erro |
|||
|
|||
* a operação de rota |
|||
* o decorador de operação de rota |
|||
* a função de operação de rota |
|||
|
|||
* o corpo |
|||
* o corpo da requisição |
|||
* o corpo da resposta |
|||
* o corpo JSON |
|||
* o corpo do formulário |
|||
* o corpo do arquivo |
|||
* o corpo da função |
|||
|
|||
* o parâmetro |
|||
* o parâmetro de corpo |
|||
* o parâmetro de path |
|||
* o parâmetro de query |
|||
* o parâmetro de cookie |
|||
* o parâmetro de header |
|||
* o parâmetro de formulário |
|||
* o parâmetro da função |
|||
|
|||
* o evento |
|||
* o evento de inicialização |
|||
* a inicialização do servidor |
|||
* o evento de encerramento |
|||
* o evento de lifespan |
|||
|
|||
* o manipulador |
|||
* o manipulador de eventos |
|||
* o manipulador de exceções |
|||
* tratar |
|||
|
|||
* o modelo |
|||
* o modelo Pydantic |
|||
* o modelo de dados |
|||
* o modelo de banco de dados |
|||
* o modelo de formulário |
|||
* o objeto de modelo |
|||
|
|||
* a classe |
|||
* a classe base |
|||
* a classe pai |
|||
* a subclasse |
|||
* a classe filha |
|||
* a classe irmã |
|||
* o método de classe |
|||
|
|||
* o cabeçalho |
|||
* os cabeçalhos |
|||
* o cabeçalho de autorização |
|||
* o cabeçalho `Authorization` |
|||
* o cabeçalho encaminhado |
|||
|
|||
* o sistema de injeção de dependências |
|||
* a dependência |
|||
* o dependable |
|||
* o dependant |
|||
|
|||
* limitado por I/O |
|||
* limitado por CPU |
|||
* concorrência |
|||
* paralelismo |
|||
* multiprocessamento |
|||
|
|||
* a env var |
|||
* a variável de ambiente |
|||
* o `PATH` |
|||
* a variável `PATH` |
|||
|
|||
* a autenticação |
|||
* o provedor de autenticação |
|||
* a autorização |
|||
* o formulário de autorização |
|||
* o provedor de autorização |
|||
* o usuário se autentica |
|||
* o sistema autentica o usuário |
|||
|
|||
* a CLI |
|||
* a interface de linha de comando |
|||
|
|||
* o servidor |
|||
* o cliente |
|||
|
|||
* o provedor de nuvem |
|||
* o serviço de nuvem |
|||
|
|||
* o desenvolvimento |
|||
* as etapas de desenvolvimento |
|||
|
|||
* o dict |
|||
* o dicionário |
|||
* a enumeração |
|||
* o enum |
|||
* o membro do enum |
|||
|
|||
* o codificador |
|||
* o decodificador |
|||
* codificar |
|||
* decodificar |
|||
|
|||
* a exceção |
|||
* lançar |
|||
|
|||
* a expressão |
|||
* a instrução |
|||
|
|||
* o frontend |
|||
* o backend |
|||
|
|||
* a discussão do GitHub |
|||
* a issue do GitHub |
|||
|
|||
* o desempenho |
|||
* a otimização de desempenho |
|||
|
|||
* o tipo de retorno |
|||
* o valor de retorno |
|||
|
|||
* a segurança |
|||
* o esquema de segurança |
|||
|
|||
* a tarefa |
|||
* a tarefa em segundo plano |
|||
* a função da tarefa |
|||
|
|||
* o template |
|||
* o mecanismo de template |
|||
|
|||
* a anotação de tipo |
|||
* a anotação de tipo |
|||
|
|||
* o worker de servidor |
|||
* o worker do Uvicorn |
|||
* o Worker do Gunicorn |
|||
* o processo worker |
|||
* a classe de worker |
|||
* a carga de trabalho |
|||
|
|||
* a implantação |
|||
* implantar |
|||
|
|||
* o SDK |
|||
* o kit de desenvolvimento de software |
|||
|
|||
* o `APIRouter` |
|||
* o `requirements.txt` |
|||
* o Bearer Token |
|||
* a alteração com quebra de compatibilidade |
|||
* o bug |
|||
* o botão |
|||
* o chamável |
|||
* o código |
|||
* o commit |
|||
* o gerenciador de contexto |
|||
* a corrotina |
|||
* a sessão do banco de dados |
|||
* o disco |
|||
* o domínio |
|||
* o mecanismo |
|||
* o X falso |
|||
* o método HTTP GET |
|||
* o item |
|||
* a biblioteca |
|||
* o lifespan |
|||
* o bloqueio |
|||
* o middleware |
|||
* a aplicação mobile |
|||
* o módulo |
|||
* a montagem |
|||
* a rede |
|||
* a origem |
|||
* a sobrescrita |
|||
* a carga útil |
|||
* o processador |
|||
* a propriedade |
|||
* o proxy |
|||
* o pull request |
|||
* a consulta |
|||
* a RAM |
|||
* a máquina remota |
|||
* o código de status |
|||
* a string |
|||
* a tag |
|||
* o framework web |
|||
* o curinga |
|||
* retornar |
|||
* validar |
|||
|
|||
//// |
|||
|
|||
//// tab | Informações |
|||
|
|||
Esta é uma lista não completa e não normativa de termos (principalmente) técnicos vistos na documentação. Pode ser útil para o autor do prompt descobrir para quais termos o LLM precisa de uma ajudinha. Por exemplo, quando ele continua revertendo uma boa tradução para uma tradução subótima. Ou quando tem problemas para conjugar/declinar um termo no seu idioma. |
|||
|
|||
Veja, por exemplo, a seção `### List of English terms and their preferred German translations` em `docs/de/llm-prompt.md`. |
|||
|
|||
//// |
|||
@ -1,3 +1,3 @@ |
|||
# Sobre |
|||
# Sobre { #about } |
|||
|
|||
Sobre o FastAPI, seus padrões, inspirações e muito mais. 🤓 |
|||
Sobre o FastAPI, seu design, inspiração e mais. 🤓 |
|||
|
|||
@ -1,115 +1,76 @@ |
|||
# Generate Clients |
|||
# Gerando SDKs { #generating-sdks } |
|||
|
|||
Como o **FastAPI** é baseado na especificação **OpenAPI**, você obtém compatibilidade automática com muitas ferramentas, incluindo a documentação automática da API (fornecida pelo Swagger UI). |
|||
Como o **FastAPI** é baseado na especificação **OpenAPI**, suas APIs podem ser descritas em um formato padrão que muitas ferramentas entendem. |
|||
|
|||
Uma vantagem particular que nem sempre é óbvia é que você pode **gerar clientes** (às vezes chamados de <abbr title="Software Development Kits">**SDKs**</abbr>) para a sua API, para muitas **linguagens de programação** diferentes. |
|||
Isso facilita gerar **documentação** atualizada, bibliotecas clientes (<abbr title="Software Development Kits – Kits de Desenvolvimento de Software">**SDKs**</abbr>) em várias linguagens e **testes** ou **fluxos de trabalho de automação** que permanecem em sincronia com o seu código. |
|||
|
|||
## Geradores de Clientes OpenAPI |
|||
Neste guia, você aprenderá como gerar um **SDK em TypeScript** para o seu backend FastAPI. |
|||
|
|||
Existem muitas ferramentas para gerar clientes a partir do **OpenAPI**. |
|||
## Geradores de SDK de código aberto { #open-source-sdk-generators } |
|||
|
|||
Uma ferramenta comum é o <a href="https://openapi-generator.tech/" class="external-link" target="_blank">OpenAPI Generator</a>. |
|||
Uma opção versátil é o <a href="https://openapi-generator.tech/" class="external-link" target="_blank">OpenAPI Generator</a>, que suporta **muitas linguagens de programação** e pode gerar SDKs a partir da sua especificação OpenAPI. |
|||
|
|||
Se voce está construindo um **frontend**, uma alternativa muito interessante é o <a href="https://github.com/hey-api/openapi-ts" class="external-link" target="_blank">openapi-ts</a>. |
|||
Para **clientes TypeScript**, o <a href="https://heyapi.dev/" class="external-link" target="_blank">Hey API</a> é uma solução feita sob medida, oferecendo uma experiência otimizada para o ecossistema TypeScript. |
|||
|
|||
## Geradores de Clientes e SDKs - Patrocinadores |
|||
Você pode descobrir mais geradores de SDK em <a href="https://openapi.tools/#sdk" class="external-link" target="_blank">OpenAPI.Tools</a>. |
|||
|
|||
Existem também alguns geradores de clientes e SDKs baseados na OpenAPI (FastAPI) **patrocinados por empresas**, em alguns casos eles podem oferecer **recursos adicionais** além de SDKs/clientes gerados de alta qualidade. |
|||
/// tip | Dica |
|||
|
|||
O FastAPI gera automaticamente especificações **OpenAPI 3.1**, então qualquer ferramenta que você usar deve suportar essa versão. |
|||
|
|||
/// |
|||
|
|||
## Geradores de SDK dos patrocinadores do FastAPI { #sdk-generators-from-fastapi-sponsors } |
|||
|
|||
Esta seção destaca soluções **financiadas por investimento** e **com suporte de empresas** que patrocinam o FastAPI. Esses produtos fornecem **funcionalidades adicionais** e **integrações** além de SDKs gerados com alta qualidade. |
|||
|
|||
Alguns deles também ✨ [**patrocinam o FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨, isso garante o **desenvolvimento** contínuo e saudável do FastAPI e seu **ecossistema**. |
|||
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**. |
|||
|
|||
E isso mostra o verdadeiro compromisso deles com o FastAPI e sua **comunidade** (você), pois eles não apenas querem fornecer um **bom serviço**, mas também querem garantir que você tenha um **framework bom e saudável**, o FastAPI. 🙇 |
|||
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: |
|||
|
|||
* <a href="https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship" class="external-link" target="_blank">Speakeasy</a> |
|||
* <a href="https://www.stainlessapi.com/?utm_source=fastapi&utm_medium=referral" class="external-link" target="_blank">Stainless</a> |
|||
* <a href="https://developers.liblab.com/tutorials/sdk-for-fastapi/?utm_source=fastapi" class="external-link" target="_blank">liblab</a> |
|||
* <a href="https://www.stainless.com/?utm_source=fastapi&utm_medium=referral" class="external-link" target="_blank">Stainless</a> |
|||
* <a href="https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi" class="external-link" target="_blank">liblab</a> |
|||
|
|||
Existem também várias outras empresas que oferecem serviços semelhantes que você pode pesquisar e encontrar online. 🤓 |
|||
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. 🤓 |
|||
|
|||
## Gerar um Cliente Frontend TypeScript |
|||
## Crie um SDK em TypeScript { #create-a-typescript-sdk } |
|||
|
|||
Vamos começar com um aplicativo **FastAPI** simples: |
|||
Vamos começar com uma aplicação FastAPI simples: |
|||
|
|||
{* ../../docs_src/generate_clients/tutorial001_py39.py hl[7:9,12:13,16:17,21] *} |
|||
|
|||
Note que as *operações de rota* definem os modelos que usam para o corpo da requisição e o corpo da resposta, usando os modelos `Item` e `ResponseMessage`. |
|||
|
|||
### Documentação da API |
|||
### Documentação da API { #api-docs } |
|||
|
|||
Se você acessar a documentação da API, verá que ela tem os **schemas** para os dados a serem enviados nas requisições e recebidos nas respostas: |
|||
Se você for para `/docs`, verá que ela tem os **schemas** para os dados a serem enviados nas requisições e recebidos nas respostas: |
|||
|
|||
<img src="/img/tutorial/generate-clients/image01.png"> |
|||
|
|||
Você pode ver esses schemas porque eles foram declarados com os modelos no app. |
|||
|
|||
Essas informações estão disponíveis no **OpenAPI schema** do app e são mostradas na documentação da API (pelo Swagger UI). |
|||
Essas informações estão disponíveis no **schema OpenAPI** do app e são mostradas na documentação da API. |
|||
|
|||
E essas mesmas informações dos modelos que estão incluídas no OpenAPI são o que pode ser usado para **gerar o código do cliente**. |
|||
|
|||
### Gerar um Cliente TypeScript |
|||
|
|||
Agora que temos o app com os modelos, podemos gerar o código do cliente para o frontend. |
|||
|
|||
#### Instalar o `openapi-ts` |
|||
|
|||
Você pode instalar o `openapi-ts` no seu código frontend com: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ npm install @hey-api/openapi-ts --save-dev |
|||
|
|||
---> 100% |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
#### Gerar o Código do Cliente |
|||
|
|||
Para gerar o código do cliente, você pode usar a aplicação de linha de comando `openapi-ts` que agora está instalada. |
|||
|
|||
Como ela está instalada no projeto local, você provavelmente não conseguiria chamar esse comando diretamente, mas você o colocaria no seu arquivo `package.json`. |
|||
|
|||
Poderia ser assim: |
|||
### Hey API { #hey-api } |
|||
|
|||
```JSON hl_lines="7" |
|||
{ |
|||
"name": "frontend-app", |
|||
"version": "1.0.0", |
|||
"description": "", |
|||
"main": "index.js", |
|||
"scripts": { |
|||
"generate-client": "openapi-ts --input http://localhost:8000/openapi.json --output ./src/client --client axios" |
|||
}, |
|||
"author": "", |
|||
"license": "", |
|||
"devDependencies": { |
|||
"@hey-api/openapi-ts": "^0.27.38", |
|||
"typescript": "^4.6.2" |
|||
} |
|||
} |
|||
``` |
|||
|
|||
Depois de ter esse script NPM `generate-client` lá, você pode executá-lo com: |
|||
|
|||
<div class="termy"> |
|||
Depois que tivermos uma aplicação FastAPI com os modelos, podemos usar o Hey API para gerar um cliente TypeScript. A forma mais rápida é via npx. |
|||
|
|||
```console |
|||
$ npm run generate-client |
|||
|
|||
[email protected] generate-client /home/user/code/frontend-app |
|||
> openapi-ts --input http://localhost:8000/openapi.json --output ./src/client --client axios |
|||
```sh |
|||
npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client |
|||
``` |
|||
|
|||
</div> |
|||
Isso gerará um SDK TypeScript em `./src/client`. |
|||
|
|||
Esse comando gerará o código em `./src/client` e usará o `axios` (a biblioteca HTTP frontend) internamente. |
|||
Você pode aprender como <a href="https://heyapi.dev/openapi-ts/get-started" class="external-link" target="_blank">instalar `@hey-api/openapi-ts`</a> e ler sobre o <a href="https://heyapi.dev/openapi-ts/output" class="external-link" target="_blank">resultado gerado</a> no site deles. |
|||
|
|||
### Experimente o Código do Cliente |
|||
### Usando o SDK { #using-the-sdk } |
|||
|
|||
Agora você pode importar e usar o código do cliente, ele poderia ser assim, observe que você obtém preenchimento automático para os métodos: |
|||
Agora você pode importar e usar o código do cliente. Poderia ser assim, observe que você obtém preenchimento automático para os métodos: |
|||
|
|||
<img src="/img/tutorial/generate-clients/image02.png"> |
|||
|
|||
@ -119,7 +80,7 @@ Você também obterá preenchimento automático para o corpo a ser enviado: |
|||
|
|||
/// tip | Dica |
|||
|
|||
Observe o preenchimento automático para `name` e `price`, que foi definido no aplicativo FastAPI, no modelo `Item`. |
|||
Observe o preenchimento automático para `name` e `price`, que foi definido na aplicação FastAPI, no modelo `Item`. |
|||
|
|||
/// |
|||
|
|||
@ -131,17 +92,17 @@ O objeto de resposta também terá preenchimento automático: |
|||
|
|||
<img src="/img/tutorial/generate-clients/image05.png"> |
|||
|
|||
## App FastAPI com Tags |
|||
## Aplicação FastAPI com Tags { #fastapi-app-with-tags } |
|||
|
|||
Em muitos casos seu app FastAPI será maior, e você provavelmente usará tags para separar diferentes grupos de *operações de rota*. |
|||
Em muitos casos, sua aplicação FastAPI será maior, e você provavelmente usará tags para separar diferentes grupos de *operações de rota*. |
|||
|
|||
Por exemplo, você poderia ter uma seção para **items** e outra seção para **users**, e elas poderiam ser separadas por tags: |
|||
|
|||
{* ../../docs_src/generate_clients/tutorial002_py39.py hl[21,26,34] *} |
|||
|
|||
### Gerar um Cliente TypeScript com Tags |
|||
### Gere um cliente TypeScript com Tags { #generate-a-typescript-client-with-tags } |
|||
|
|||
Se você gerar um cliente para um app FastAPI usando tags, normalmente também separará o código do cliente com base nas tags. |
|||
Se você gerar um cliente para uma aplicação FastAPI usando tags, normalmente também separará o código do cliente com base nas tags. |
|||
|
|||
Dessa forma, você poderá ter as coisas ordenadas e agrupadas corretamente para o código do cliente: |
|||
|
|||
@ -152,33 +113,33 @@ Nesse caso você tem: |
|||
* `ItemsService` |
|||
* `UsersService` |
|||
|
|||
### Nomes dos Métodos do Cliente |
|||
### Nomes dos métodos do cliente { #client-method-names } |
|||
|
|||
Agora os nomes dos métodos gerados como `createItemItemsPost` não parecem muito "limpos": |
|||
Agora os nomes dos métodos gerados como `createItemItemsPost` não parecem muito “limpos”: |
|||
|
|||
```TypeScript |
|||
ItemsService.createItemItemsPost({name: "Plumbus", price: 5}) |
|||
``` |
|||
|
|||
...isto ocorre porque o gerador de clientes usa o **operation ID** interno do OpenAPI para cada *operação de rota*. |
|||
...isso ocorre porque o gerador de clientes usa o **ID de operação** interno do OpenAPI para cada *operação de rota*. |
|||
|
|||
O OpenAPI exige que cada operation ID seja único em todas as *operações de rota*, então o FastAPI usa o **nome da função**, o **caminho** e o **método/operacao HTTP** para gerar esse operation ID, porque dessa forma ele pode garantir que os operation IDs sejam únicos. |
|||
O OpenAPI exige que cada ID de operação seja único em todas as *operações de rota*, então o FastAPI usa o **nome da função**, o **path** e o **método/operação HTTP** para gerar esse ID de operação, porque dessa forma ele pode garantir que os IDs de operação sejam únicos. |
|||
|
|||
Mas eu vou te mostrar como melhorar isso a seguir. 🤓 |
|||
|
|||
### IDs de Operação Personalizados e Melhores Nomes de Método |
|||
## IDs de operação personalizados e nomes de métodos melhores { #custom-operation-ids-and-better-method-names } |
|||
|
|||
Você pode **modificar** a maneira como esses IDs de operação são **gerados** para torná-los mais simples e ter **nomes de método mais simples** nos clientes. |
|||
|
|||
Neste caso, você terá que garantir que cada ID de operação seja **único** de alguma outra maneira. |
|||
|
|||
Por exemplo, você poderia garantir que cada *operação de rota* tenha uma tag, e então gerar o ID da operação com base na **tag** e no **nome** da *operação de rota* (o nome da função). |
|||
Por exemplo, você poderia garantir que cada *operação de rota* tenha uma tag, e então gerar o ID de operação com base na **tag** e no **nome** da *operação de rota* (o nome da função). |
|||
|
|||
### Função Personalizada para Gerar IDs de Operação Únicos |
|||
### Função personalizada para gerar IDs exclusivos { #custom-generate-unique-id-function } |
|||
|
|||
O FastAPI usa um **ID único** para cada *operação de rota*, ele é usado para o **ID da operação** e também para os nomes de quaisquer modelos personalizados necessários, para requisições ou respostas. |
|||
O FastAPI usa um **ID exclusivo** para cada *operação de rota*, ele é usado para o **ID de operação** e também para os nomes de quaisquer modelos personalizados necessários, para requisições ou respostas. |
|||
|
|||
Você pode personalizar essa função. Ela recebe uma `APIRoute` e gera uma string. |
|||
Você pode personalizar essa função. Ela recebe uma `APIRoute` e retorna uma string. |
|||
|
|||
Por exemplo, aqui está usando a primeira tag (você provavelmente terá apenas uma tag) e o nome da *operação de rota* (o nome da função). |
|||
|
|||
@ -186,15 +147,15 @@ Você pode então passar essa função personalizada para o **FastAPI** como o p |
|||
|
|||
{* ../../docs_src/generate_clients/tutorial003_py39.py hl[6:7,10] *} |
|||
|
|||
### Gerar um Cliente TypeScript com IDs de Operação Personalizados |
|||
### Gere um cliente TypeScript com IDs de operação personalizados { #generate-a-typescript-client-with-custom-operation-ids } |
|||
|
|||
Agora, se você gerar o cliente novamente, verá que ele tem os nomes dos métodos melhorados: |
|||
|
|||
<img src="/img/tutorial/generate-clients/image07.png"> |
|||
|
|||
Como você pode ver, os nomes dos métodos agora têm a tag e, em seguida, o nome da função. Agora eles não incluem informações do caminho da URL e da operação HTTP. |
|||
Como você pode ver, os nomes dos métodos agora têm a tag e, em seguida, o nome da função. Agora eles não incluem informações do path da URL e da operação HTTP. |
|||
|
|||
### Pré-processar a Especificação OpenAPI para o Gerador de Clientes |
|||
### Pré-processar a especificação OpenAPI para o gerador de clientes { #preprocess-the-openapi-specification-for-the-client-generator } |
|||
|
|||
O código gerado ainda tem algumas **informações duplicadas**. |
|||
|
|||
@ -202,7 +163,7 @@ Nós já sabemos que esse método está relacionado aos **items** porque essa pa |
|||
|
|||
Provavelmente ainda queremos mantê-lo para o OpenAPI em geral, pois isso garantirá que os IDs de operação sejam **únicos**. |
|||
|
|||
Mas para o cliente gerado, poderíamos **modificar** os IDs de operação do OpenAPI logo antes de gerar os clientes, apenas para tornar esses nomes de método mais **simples**. |
|||
Mas para o cliente gerado, poderíamos **modificar** os IDs de operação do OpenAPI logo antes de gerar os clientes, apenas para tornar esses nomes de método mais agradáveis e **limpos**. |
|||
|
|||
Poderíamos baixar o JSON do OpenAPI para um arquivo `openapi.json` e então poderíamos **remover essa tag prefixada** com um script como este: |
|||
|
|||
@ -218,44 +179,30 @@ Poderíamos baixar o JSON do OpenAPI para um arquivo `openapi.json` e então pod |
|||
|
|||
Com isso, os IDs de operação seriam renomeados de coisas como `items-get_items` para apenas `get_items`, dessa forma o gerador de clientes pode gerar nomes de métodos mais simples. |
|||
|
|||
### Gerar um Cliente TypeScript com o OpenAPI Pré-processado |
|||
|
|||
Agora, como o resultado final está em um arquivo `openapi.json`, você modificaria o `package.json` para usar esse arquivo local, por exemplo: |
|||
|
|||
```JSON hl_lines="7" |
|||
{ |
|||
"name": "frontend-app", |
|||
"version": "1.0.0", |
|||
"description": "", |
|||
"main": "index.js", |
|||
"scripts": { |
|||
"generate-client": "openapi-ts --input ./openapi.json --output ./src/client --client axios" |
|||
}, |
|||
"author": "", |
|||
"license": "", |
|||
"devDependencies": { |
|||
"@hey-api/openapi-ts": "^0.27.38", |
|||
"typescript": "^4.6.2" |
|||
} |
|||
} |
|||
### Gere um cliente TypeScript com o OpenAPI pré-processado { #generate-a-typescript-client-with-the-preprocessed-openapi } |
|||
|
|||
Como o resultado final está agora em um arquivo `openapi.json`, você precisa atualizar o local de entrada: |
|||
|
|||
```sh |
|||
npx @hey-api/openapi-ts -i ./openapi.json -o src/client |
|||
``` |
|||
|
|||
Depois de gerar o novo cliente, você teria agora **nomes de métodos "limpos"**, com todo o **preenchimento automático**, **erros em linha**, etc: |
|||
Depois de gerar o novo cliente, você terá agora **nomes de métodos “limpos”**, com todo o **preenchimento automático**, **erros em linha**, etc: |
|||
|
|||
<img src="/img/tutorial/generate-clients/image08.png"> |
|||
|
|||
## Benefícios |
|||
## Benefícios { #benefits } |
|||
|
|||
Ao usar os clientes gerados automaticamente, você teria **preenchimento automático** para: |
|||
Ao usar os clientes gerados automaticamente, você terá **preenchimento automático** para: |
|||
|
|||
* Métodos. |
|||
* Corpo de requisições, parâmetros da query, etc. |
|||
* Corpo de respostas. |
|||
* Corpos de requisições, parâmetros de query, etc. |
|||
* Corpos de respostas. |
|||
|
|||
Você também teria **erros em linha** para tudo. |
|||
Você também terá **erros em linha** para tudo. |
|||
|
|||
E sempre que você atualizar o código do backend, e **regenerar** o frontend, ele teria quaisquer novas *operações de rota* disponíveis como métodos, as antigas removidas, e qualquer outra alteração seria refletida no código gerado. 🤓 |
|||
E sempre que você atualizar o código do backend e **regenerar** o frontend, ele terá quaisquer novas *operações de rota* disponíveis como métodos, as antigas removidas, e qualquer outra alteração será refletida no código gerado. 🤓 |
|||
|
|||
Isso também significa que se algo mudar, será **refletido** no código do cliente automaticamente. E se você **construir** o cliente, ele dará erro se houver alguma **incompatibilidade** nos dados usados. |
|||
Isso também significa que, se algo mudou, será **refletido** no código do cliente automaticamente. E se você **construir** o cliente, ele falhará caso haja qualquer **incompatibilidade** nos dados usados. |
|||
|
|||
Então, você **detectaria vários erros** muito cedo no ciclo de desenvolvimento, em vez de ter que esperar que os erros apareçam para seus usuários finais em produção e então tentar depurar onde está o problema. ✨ |
|||
Assim, você **detectará muitos erros** muito cedo no ciclo de desenvolvimento, em vez de ter que esperar que os erros apareçam para seus usuários finais em produção e então tentar depurar onde está o problema. ✨ |
|||
|
|||
@ -1,148 +1,30 @@ |
|||
# Configurações e Variáveis de Ambiente |
|||
# Configurações e Variáveis de Ambiente { #settings-and-environment-variables } |
|||
|
|||
Em muitos casos a sua aplicação pode precisar de configurações externas, como chaves secretas, credenciais de banco de dados, credenciais para serviços de email, etc. |
|||
Em muitos casos, sua aplicação pode precisar de configurações externas, por exemplo chaves secretas, credenciais de banco de dados, credenciais para serviços de e-mail, etc. |
|||
|
|||
A maioria dessas configurações é variável (podem mudar), como URLs de bancos de dados. E muitas delas podem conter dados sensíveis, como tokens secretos. |
|||
A maioria dessas configurações é variável (pode mudar), como URLs de banco de dados. E muitas podem ser sensíveis, como segredos. |
|||
|
|||
Por isso é comum prover essas configurações como variáveis de ambiente que são utilizidas pela aplicação. |
|||
|
|||
## Variáveis de Ambiente |
|||
|
|||
/// tip | Dica |
|||
|
|||
Se você já sabe o que são variáveis de ambiente e como utilizá-las, sinta-se livre para avançar para o próximo tópico. |
|||
|
|||
/// |
|||
|
|||
Uma <a href="https://pt.wikipedia.org/wiki/Variável_de_ambiente" class="external-link" target="_blank">variável de ambiente</a> (abreviada em inglês para "env var") é uma variável definida fora do código Python, no sistema operacional, e pode ser lida pelo seu código Python (ou por outros programas). |
|||
|
|||
Você pode criar e utilizar variáveis de ambiente no terminal, sem precisar utilizar Python: |
|||
|
|||
//// tab | Linux, macOS, Windows Bash |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Você pode criar uma env var MY_NAME usando |
|||
$ export MY_NAME="Wade Wilson" |
|||
|
|||
// E utilizá-la em outros programas, como |
|||
$ echo "Hello $MY_NAME" |
|||
|
|||
Hello Wade Wilson |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
//// |
|||
|
|||
//// tab | Windows PowerShell |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Criando env var MY_NAME |
|||
$ $Env:MY_NAME = "Wade Wilson" |
|||
|
|||
// Usando em outros programas, como |
|||
$ echo "Hello $Env:MY_NAME" |
|||
|
|||
Hello Wade Wilson |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
//// |
|||
|
|||
### Lendo variáveis de ambiente com Python |
|||
|
|||
Você também pode criar variáveis de ambiente fora do Python, no terminal (ou com qualquer outro método), e realizar a leitura delas no Python. |
|||
|
|||
Por exemplo, você pode definir um arquivo `main.py` com o seguinte código: |
|||
|
|||
```Python hl_lines="3" |
|||
import os |
|||
|
|||
name = os.getenv("MY_NAME", "World") |
|||
print(f"Hello {name} from Python") |
|||
``` |
|||
|
|||
/// tip | Dica |
|||
|
|||
O segundo parâmetro em <a href="https://docs.python.org/3.8/library/os.html#os.getenv" class="external-link" target="_blank">`os.getenv()`</a> é o valor padrão para o retorno. |
|||
|
|||
Se nenhum valor for informado, `None` é utilizado por padrão, aqui definimos `"World"` como o valor padrão a ser utilizado. |
|||
|
|||
/// |
|||
|
|||
E depois você pode executar esse arquivo: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Aqui ainda não definimos a env var |
|||
$ python main.py |
|||
|
|||
// Por isso obtemos o valor padrão |
|||
|
|||
Hello World from Python |
|||
|
|||
// Mas se definirmos uma variável de ambiente primeiro |
|||
$ export MY_NAME="Wade Wilson" |
|||
|
|||
// E executarmos o programa novamente |
|||
$ python main.py |
|||
|
|||
// Agora ele pode ler a variável de ambiente |
|||
|
|||
Hello Wade Wilson from Python |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
Como variáveis de ambiente podem ser definidas fora do código da aplicação, mas acessadas pela aplicação, e não precisam ser armazenadas (versionadas com `git`) junto dos outros arquivos, é comum utilizá-las para guardar configurações. |
|||
|
|||
Você também pode criar uma variável de ambiente específica para uma invocação de um programa, que é acessível somente para esse programa, e somente enquanto ele estiver executando. |
|||
|
|||
Para fazer isso, crie a variável imediatamente antes de iniciar o programa, na mesma linha: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Criando uma env var MY_NAME na mesma linha da execução do programa |
|||
$ MY_NAME="Wade Wilson" python main.py |
|||
|
|||
// Agora a aplicação consegue ler a variável de ambiente |
|||
|
|||
Hello Wade Wilson from Python |
|||
|
|||
// E a variável deixa de existir após isso |
|||
$ python main.py |
|||
|
|||
Hello World from Python |
|||
``` |
|||
|
|||
</div> |
|||
Por esse motivo, é comum fornecê-las em variáveis de ambiente lidas pela aplicação. |
|||
|
|||
/// tip | Dica |
|||
|
|||
Você pode ler mais sobre isso em: <a href="https://12factor.net/pt_br/config" class="external-link" target="_blank">The Twelve-Factor App: Configurações</a>. |
|||
Para entender variáveis de ambiente, você pode ler [Variáveis de Ambiente](../environment-variables.md){.internal-link target=_blank}. |
|||
|
|||
/// |
|||
|
|||
### Tipagem e Validação |
|||
## Tipagem e validação { #types-and-validation } |
|||
|
|||
Essas variáveis de ambiente suportam apenas strings, por serem externas ao Python e por que precisam ser compatíveis com outros programas e o resto do sistema (e até mesmo com outros sistemas operacionais, como Linux, Windows e macOS). |
|||
Essas variáveis de ambiente só conseguem lidar com strings de texto, pois são externas ao Python e precisam ser compatíveis com outros programas e com o resto do sistema (e até com diferentes sistemas operacionais, como Linux, Windows, macOS). |
|||
|
|||
Isso significa que qualquer valor obtido de uma variável de ambiente em Python terá o tipo `str`, e qualquer conversão para um tipo diferente ou validação deve ser realizada no código. |
|||
Isso significa que qualquer valor lido em Python a partir de uma variável de ambiente será uma `str`, e qualquer conversão para um tipo diferente ou validação precisa ser feita em código. |
|||
|
|||
## Pydantic `Settings` |
|||
## Pydantic `Settings` { #pydantic-settings } |
|||
|
|||
Por sorte, o Pydantic possui uma funcionalidade para lidar com essas configurações vindas de variáveis de ambiente utilizando <a href="https://docs.pydantic.dev/latest/usage/pydantic_settings/" class="external-link" target="_blank">Pydantic: Settings management</a>. |
|||
Felizmente, o Pydantic fornece uma ótima utilidade para lidar com essas configurações vindas de variáveis de ambiente com <a href="https://docs.pydantic.dev/latest/concepts/pydantic_settings/" class="external-link" target="_blank">Pydantic: Settings management</a>. |
|||
|
|||
### Instalando `pydantic-settings` |
|||
### Instalar `pydantic-settings` { #install-pydantic-settings } |
|||
|
|||
Primeiro, instale o pacote `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`: |
|||
|
|||
<div class="termy"> |
|||
|
|||
@ -153,7 +35,7 @@ $ pip install pydantic-settings |
|||
|
|||
</div> |
|||
|
|||
Ele também está incluído no fastapi quando você instala com a opção `all`: |
|||
Ele também vem incluído quando você instala os extras `all` com: |
|||
|
|||
<div class="termy"> |
|||
|
|||
@ -164,19 +46,19 @@ $ pip install "fastapi[all]" |
|||
|
|||
</div> |
|||
|
|||
/// info |
|||
/// info | Informação |
|||
|
|||
Na v1 do Pydantic ele estava incluído no pacote principal. Agora ele está distribuido como um pacote independente para que você possa optar por instalar ou não caso você não precise dessa funcionalidade. |
|||
No Pydantic v1 ele vinha incluído no pacote principal. Agora é distribuído como um pacote independente para que você possa optar por instalá-lo ou não, caso não precise dessa funcionalidade. |
|||
|
|||
/// |
|||
|
|||
### Criando o objeto `Settings` |
|||
### Criar o objeto `Settings` { #create-the-settings-object } |
|||
|
|||
Importe a classe `BaseSettings` do Pydantic e crie uma nova subclasse, de forma parecida com um modelo do Pydantic. |
|||
Importe `BaseSettings` do Pydantic e crie uma subclasse, muito parecido com um modelo do Pydantic. |
|||
|
|||
Os atributos da classe são declarados com anotações de tipo, e possíveis valores padrão, da mesma maneira que os modelos do Pydantic. |
|||
Da mesma forma que com modelos do Pydantic, você declara atributos de classe com anotações de tipo e, possivelmente, valores padrão. |
|||
|
|||
Você pode utilizar todas as ferramentas e funcionalidades de validação que são utilizadas nos modelos do Pydantic, como tipos de dados diferentes e validações adicionei com `Field()`. |
|||
Você pode usar as mesmas funcionalidades e ferramentas de validação que usa em modelos do Pydantic, como diferentes tipos de dados e validações adicionais com `Field()`. |
|||
|
|||
//// tab | Pydantic v2 |
|||
|
|||
@ -186,9 +68,9 @@ Você pode utilizar todas as ferramentas e funcionalidades de validação que s |
|||
|
|||
//// tab | Pydantic v1 |
|||
|
|||
/// info |
|||
/// info | Informação |
|||
|
|||
Na versão 1 do Pydantic você importaria `BaseSettings` diretamente do módulo `pydantic` em vez do módulo `pydantic_settings`. |
|||
No Pydantic v1 você importaria `BaseSettings` diretamente de `pydantic` em vez de `pydantic_settings`. |
|||
|
|||
/// |
|||
|
|||
@ -198,23 +80,23 @@ Na versão 1 do Pydantic você importaria `BaseSettings` diretamente do módulo |
|||
|
|||
/// tip | Dica |
|||
|
|||
Se você quiser algo pronto para copiar e colar na sua aplicação, não use esse exemplo, mas sim o exemplo abaixo. |
|||
Se você quer algo rápido para copiar e colar, não use este exemplo, use o último abaixo. |
|||
|
|||
/// |
|||
|
|||
Portanto, quando você cria uma instância da classe `Settings` (nesse caso, o objeto `settings`), o Pydantic lê as variáveis de ambiente sem diferenciar maiúsculas e minúsculas, por isso, uma variável maiúscula `APP_NAME` será usada para o atributo `app_name`. |
|||
Então, quando você cria uma instância dessa classe `Settings` (neste caso, no objeto `settings`), o Pydantic vai ler as variáveis de ambiente sem diferenciar maiúsculas de minúsculas; assim, uma variável em maiúsculas `APP_NAME` ainda será lida para o atributo `app_name`. |
|||
|
|||
Depois ele irá converter e validar os dados. Assim, quando você utilizar aquele objeto `settings`, os dados terão o tipo que você declarou (e.g. `items_per_user` será do tipo `int`). |
|||
Em seguida, ele converterá e validará os dados. Assim, quando você usar esse objeto `settings`, terá dados dos tipos que declarou (por exemplo, `items_per_user` será um `int`). |
|||
|
|||
### Usando o objeto `settings` |
|||
### Usar o `settings` { #use-the-settings } |
|||
|
|||
Depois, Você pode utilizar o novo objeto `settings` na sua aplicação: |
|||
Depois você pode usar o novo objeto `settings` na sua aplicação: |
|||
|
|||
{* ../../docs_src/settings/tutorial001.py hl[18:20] *} |
|||
|
|||
### Executando o servidor |
|||
### Executar o servidor { #run-the-server } |
|||
|
|||
No próximo passo, você pode inicializar o servidor passando as configurações em forma de variáveis de ambiente, por exemplo, você poderia definir `ADMIN_EMAIL` e `APP_NAME` da seguinte forma: |
|||
Em seguida, você executaria o servidor passando as configurações como variáveis de ambiente, por exemplo, você poderia definir `ADMIN_EMAIL` e `APP_NAME` com: |
|||
|
|||
<div class="termy"> |
|||
|
|||
@ -228,110 +110,110 @@ $ ADMIN_EMAIL="[email protected]" APP_NAME="ChimichangApp" fastapi run main.p |
|||
|
|||
/// tip | Dica |
|||
|
|||
Para definir múltiplas variáveis de ambiente para um único comando basta separá-las utilizando espaços, e incluir todas elas antes do comando. |
|||
Para definir várias variáveis de ambiente para um único comando, basta separá-las com espaço e colocá-las todas antes do comando. |
|||
|
|||
/// |
|||
|
|||
Assim, o atributo `admin_email` seria definido como `"[email protected]"`. |
|||
Então a configuração `admin_email` seria definida como `"[email protected]"`. |
|||
|
|||
`app_name` seria `"ChimichangApp"`. |
|||
O `app_name` seria `"ChimichangApp"`. |
|||
|
|||
E `items_per_user` manteria o valor padrão de `50`. |
|||
E `items_per_user` manteria seu valor padrão de `50`. |
|||
|
|||
## Configurações em um módulo separado |
|||
## Configurações em outro módulo { #settings-in-another-module } |
|||
|
|||
Você também pode incluir essas configurações em um arquivo de um módulo separado como visto em [Bigger Applications - Multiple Files](../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){.internal-link target=_blank}. |
|||
|
|||
Por exemplo, você pode adicionar um arquivo `config.py` com: |
|||
Por exemplo, você poderia ter um arquivo `config.py` com: |
|||
|
|||
{* ../../docs_src/settings/app01/config.py *} |
|||
|
|||
E utilizar essa configuração em `main.py`: |
|||
E então usá-lo em um arquivo `main.py`: |
|||
|
|||
{* ../../docs_src/settings/app01/main.py hl[3,11:13] *} |
|||
|
|||
/// tip | Dica |
|||
|
|||
Você também precisa incluir um arquivo `__init__.py` como visto em [Bigger Applications - Multiple Files](../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){.internal-link target=_blank}. |
|||
|
|||
/// |
|||
|
|||
## Configurações em uma dependência |
|||
## Configurações em uma dependência { #settings-in-a-dependency } |
|||
|
|||
Em certas ocasiões, pode ser útil fornecer essas configurações a partir de uma dependência, em vez de definir um objeto global `settings` que é utilizado em toda a aplicação. |
|||
Em algumas ocasiões, pode ser útil fornecer as configurações a partir de uma dependência, em vez de ter um objeto global `settings` usado em todos os lugares. |
|||
|
|||
Isso é especialmente útil durante os testes, já que é bastante simples sobrescrever uma dependência com suas configurações personalizadas. |
|||
Isso pode ser especialmente útil durante os testes, pois é muito fácil sobrescrever uma dependência com suas próprias configurações personalizadas. |
|||
|
|||
### O arquivo de configuração |
|||
### O arquivo de configuração { #the-config-file } |
|||
|
|||
Baseando-se no exemplo anterior, seu arquivo `config.py` seria parecido com isso: |
|||
Vindo do exemplo anterior, seu arquivo `config.py` poderia ser assim: |
|||
|
|||
{* ../../docs_src/settings/app02/config.py hl[10] *} |
|||
|
|||
Perceba que dessa vez não criamos uma instância padrão `settings = Settings()`. |
|||
Perceba que agora não criamos uma instância padrão `settings = Settings()`. |
|||
|
|||
### O arquivo principal da aplicação |
|||
### O arquivo principal da aplicação { #the-main-app-file } |
|||
|
|||
Agora criamos a dependência que retorna um novo objeto `config.Settings()`. |
|||
Agora criamos uma dependência que retorna um novo `config.Settings()`. |
|||
|
|||
{* ../../docs_src/settings/app02_an_py39/main.py hl[6,12:13] *} |
|||
|
|||
/// tip | Dica |
|||
|
|||
Vamos discutir sobre `@lru_cache` logo mais. |
|||
Vamos discutir o `@lru_cache` em breve. |
|||
|
|||
Por enquanto, você pode considerar `get_settings()` como uma função normal. |
|||
Por enquanto, você pode assumir que `get_settings()` é uma função normal. |
|||
|
|||
/// |
|||
|
|||
E então podemos declarar essas configurações como uma dependência na função de operação da rota e utilizar onde for necessário. |
|||
E então podemos exigi-la na *função de operação de rota* como dependência e usá-la onde for necessário. |
|||
|
|||
{* ../../docs_src/settings/app02_an_py39/main.py hl[17,19:21] *} |
|||
|
|||
### Configurações e testes |
|||
### Configurações e testes { #settings-and-testing } |
|||
|
|||
Então seria muito fácil fornecer uma configuração diferente durante a execução dos testes sobrescrevendo a dependência de `get_settings`: |
|||
Então seria muito fácil fornecer um objeto de configurações diferente durante os testes criando uma sobrescrita de dependência para `get_settings`: |
|||
|
|||
{* ../../docs_src/settings/app02/test_main.py hl[9:10,13,21] *} |
|||
|
|||
Na sobrescrita da dependência, definimos um novo valor para `admin_email` quando instanciamos um novo objeto `Settings`, e então retornamos esse novo objeto. |
|||
Na sobrescrita da dependência definimos um novo valor para `admin_email` ao criar o novo objeto `Settings`, e então retornamos esse novo objeto. |
|||
|
|||
Após isso, podemos testar se o valor está sendo utilizado. |
|||
Depois podemos testar que ele é usado. |
|||
|
|||
## Lendo um arquivo `.env` |
|||
## Lendo um arquivo `.env` { #reading-a-env-file } |
|||
|
|||
Se você tiver muitas configurações que variem bastante, talvez em ambientes distintos, pode ser útil colocá-las em um arquivo e depois lê-las como se fossem variáveis de ambiente. |
|||
Se você tiver muitas configurações que possivelmente mudam bastante, talvez em diferentes ambientes, pode ser útil colocá-las em um arquivo e então lê-las como se fossem variáveis de ambiente. |
|||
|
|||
Essa prática é tão comum que possui um nome, essas variáveis de ambiente normalmente são colocadas em um arquivo `.env`, e esse arquivo é chamado de "dotenv". |
|||
Essa prática é tão comum que tem um nome: essas variáveis de ambiente são comumente colocadas em um arquivo `.env`, e o arquivo é chamado de "dotenv". |
|||
|
|||
/// tip | Dica |
|||
|
|||
Um arquivo iniciando com um ponto final (`.`) é um arquivo oculto em sistemas baseados em Unix, como Linux e MacOS. |
|||
Um arquivo começando com um ponto (`.`) é um arquivo oculto em sistemas tipo Unix, como Linux e macOS. |
|||
|
|||
Mas um arquivo dotenv não precisa ter esse nome exato. |
|||
Mas um arquivo dotenv não precisa ter exatamente esse nome de arquivo. |
|||
|
|||
/// |
|||
|
|||
Pydantic suporta a leitura desses tipos de arquivos utilizando uma biblioteca externa. Você pode ler mais em <a href="https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support" class="external-link" target="_blank">Pydantic Settings: Dotenv (.env) support</a>. |
|||
O Pydantic tem suporte para leitura desses tipos de arquivos usando uma biblioteca externa. Você pode ler mais em <a href="https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support" class="external-link" target="_blank">Pydantic Settings: Dotenv (.env) support</a>. |
|||
|
|||
/// tip | Dica |
|||
|
|||
Para que isso funcione você precisa executar `pip install python-dotenv`. |
|||
Para isso funcionar, você precisa executar `pip install python-dotenv`. |
|||
|
|||
/// |
|||
|
|||
### O arquivo `.env` |
|||
### O arquivo `.env` { #the-env-file } |
|||
|
|||
Você pode definir um arquivo `.env` com o seguinte conteúdo: |
|||
Você poderia ter um arquivo `.env` com: |
|||
|
|||
```bash |
|||
ADMIN_EMAIL="[email protected]" |
|||
APP_NAME="ChimichangApp" |
|||
``` |
|||
|
|||
### Obtendo configurações do `.env` |
|||
### Ler configurações do `.env` { #read-settings-from-env } |
|||
|
|||
E então adicionar o seguinte código em `config.py`: |
|||
E então atualizar seu `config.py` com: |
|||
|
|||
//// tab | Pydantic v2 |
|||
|
|||
@ -339,7 +221,7 @@ E então adicionar o seguinte código em `config.py`: |
|||
|
|||
/// tip | Dica |
|||
|
|||
O atributo `model_config` é usado apenas para configuração do Pydantic. Você pode ler mais em <a href="https://docs.pydantic.dev/latest/usage/model_config/" class="external-link" target="_blank">Pydantic Model Config</a>. |
|||
O atributo `model_config` é usado apenas para configuração do Pydantic. Você pode ler mais em <a href="https://docs.pydantic.dev/latest/concepts/config/" class="external-link" target="_blank">Pydantic: Concepts: Configuration</a>. |
|||
|
|||
/// |
|||
|
|||
@ -357,48 +239,48 @@ A classe `Config` é usada apenas para configuração do Pydantic. Você pode le |
|||
|
|||
//// |
|||
|
|||
/// info |
|||
/// info | Informação |
|||
|
|||
Na versão 1 do Pydantic a configuração é realizada por uma classe interna `Config`, na versão 2 do Pydantic isso é feito com o atributo `model_config`. Esse atributo recebe um `dict`, para utilizar o autocomplete e checagem de erros do seu editor de texto você pode importar e utilizar `SettingsConfigDict` para definir esse `dict`. |
|||
Na versão 1 do Pydantic a configuração era feita em uma classe interna `Config`, na versão 2 do Pydantic é feita em um atributo `model_config`. Esse atributo recebe um `dict`, e para ter autocompletar e erros inline você pode importar e usar `SettingsConfigDict` para definir esse `dict`. |
|||
|
|||
/// |
|||
|
|||
Aqui definimos a configuração `env_file` dentro da classe `Settings` do Pydantic, e definimos o valor como o nome do arquivo dotenv que queremos utilizar. |
|||
Aqui definimos a configuração `env_file` dentro da sua classe `Settings` do Pydantic e definimos o valor como o nome do arquivo dotenv que queremos usar. |
|||
|
|||
### Declarando `Settings` apenas uma vez com `lru_cache` |
|||
### Criando o `Settings` apenas uma vez com `lru_cache` { #creating-the-settings-only-once-with-lru-cache } |
|||
|
|||
Ler o conteúdo de um arquivo em disco normalmente é uma operação custosa (lenta), então você provavelmente quer fazer isso apenas um vez e reutilizar o mesmo objeto settings depois, em vez de ler os valores a cada requisição. |
|||
Ler um arquivo do disco normalmente é uma operação custosa (lenta), então você provavelmente vai querer fazer isso apenas uma vez e depois reutilizar o mesmo objeto de configurações, em vez de lê-lo a cada requisição. |
|||
|
|||
Mas cada vez que fazemos: |
|||
Mas toda vez que fizermos: |
|||
|
|||
```Python |
|||
Settings() |
|||
``` |
|||
|
|||
um novo objeto `Settings` é instanciado, e durante a instanciação, o arquivo `.env` é lido novamente. |
|||
um novo objeto `Settings` seria criado e, na criação, ele leria o arquivo `.env` novamente. |
|||
|
|||
Se a função da dependência fosse apenas: |
|||
Se a função de dependência fosse assim: |
|||
|
|||
```Python |
|||
def get_settings(): |
|||
return Settings() |
|||
``` |
|||
|
|||
Iriamos criar um novo objeto a cada requisição, e estaríamos lendo o arquivo `.env` a cada requisição. ⚠️ |
|||
criaríamos esse objeto para cada requisição e leríamos o arquivo `.env` para cada requisição. ⚠️ |
|||
|
|||
Mas como estamos utilizando o decorador `@lru_cache` acima, o objeto `Settings` é criado apenas uma vez, na primeira vez que a função é chamada. ✔️ |
|||
Mas como estamos usando o decorador `@lru_cache` por cima, o objeto `Settings` será criado apenas uma vez, na primeira vez em que for chamado. ✔️ |
|||
|
|||
{* ../../docs_src/settings/app03_an_py39/main.py hl[1,11] *} |
|||
|
|||
Dessa forma, todas as chamadas da função `get_settings()` nas dependências das próximas requisições, em vez de executar o código interno de `get_settings()` e instanciar um novo objeto `Settings`, irão retornar o mesmo objeto que foi retornado na primeira chamada, de novo e de novo. |
|||
Em qualquer chamada subsequente de `get_settings()` nas dependências das próximas requisições, em vez de executar o código interno de `get_settings()` e criar um novo objeto `Settings`, ele retornará o mesmo objeto que foi retornado na primeira chamada, repetidamente. |
|||
|
|||
#### Detalhes Técnicos de `lru_cache` |
|||
#### Detalhes Técnicos do `lru_cache` { #lru-cache-technical-details } |
|||
|
|||
`@lru_cache` modifica a função decorada para retornar o mesmo valor que foi retornado na primeira vez, em vez de calculá-lo novamente, executando o código da função toda vez. |
|||
`@lru_cache` modifica a função que decora para retornar o mesmo valor que foi retornado na primeira vez, em vez de calculá-lo novamente executando o código da função todas as vezes. |
|||
|
|||
Assim, a função abaixo do decorador é executada uma única vez para cada combinação dos argumentos passados. E os valores retornados para cada combinação de argumentos são sempre reutilizados para cada nova chamada da função com a mesma combinação de argumentos. |
|||
Assim, a função abaixo dele será executada uma vez para cada combinação de argumentos. E então os valores retornados para cada uma dessas combinações de argumentos serão usados repetidamente sempre que a função for chamada com exatamente a mesma combinação de argumentos. |
|||
|
|||
Por exemplo, se você definir uma função: |
|||
Por exemplo, se você tiver uma função: |
|||
|
|||
```Python |
|||
@lru_cache |
|||
@ -406,59 +288,59 @@ def say_hi(name: str, salutation: str = "Ms."): |
|||
return f"Hello {salutation} {name}" |
|||
``` |
|||
|
|||
Seu programa poderia executar dessa forma: |
|||
seu programa poderia executar assim: |
|||
|
|||
```mermaid |
|||
sequenceDiagram |
|||
|
|||
participant code as Código |
|||
participant code as Code |
|||
participant function as say_hi() |
|||
participant execute as Executar Função |
|||
participant execute as Execute function |
|||
|
|||
rect rgba(0, 255, 0, .1) |
|||
code ->> function: say_hi(name="Camila") |
|||
function ->> execute: executar código da função |
|||
execute ->> code: retornar o resultado |
|||
function ->> execute: execute function code |
|||
execute ->> code: return the result |
|||
end |
|||
|
|||
rect rgba(0, 255, 255, .1) |
|||
code ->> function: say_hi(name="Camila") |
|||
function ->> code: retornar resultado armazenado |
|||
function ->> code: return stored result |
|||
end |
|||
|
|||
rect rgba(0, 255, 0, .1) |
|||
code ->> function: say_hi(name="Rick") |
|||
function ->> execute: executar código da função |
|||
execute ->> code: retornar o resultado |
|||
function ->> execute: execute function code |
|||
execute ->> code: return the result |
|||
end |
|||
|
|||
rect rgba(0, 255, 0, .1) |
|||
code ->> function: say_hi(name="Rick", salutation="Mr.") |
|||
function ->> execute: executar código da função |
|||
execute ->> code: retornar o resultado |
|||
function ->> execute: execute function code |
|||
execute ->> code: return the result |
|||
end |
|||
|
|||
rect rgba(0, 255, 255, .1) |
|||
code ->> function: say_hi(name="Rick") |
|||
function ->> code: retornar resultado armazenado |
|||
function ->> code: return stored result |
|||
end |
|||
|
|||
rect rgba(0, 255, 255, .1) |
|||
code ->> function: say_hi(name="Camila") |
|||
function ->> code: retornar resultado armazenado |
|||
function ->> code: return stored result |
|||
end |
|||
``` |
|||
|
|||
No caso da nossa dependência `get_settings()`, a função não recebe nenhum argumento, então ela sempre retorna o mesmo valor. |
|||
No caso da nossa dependência `get_settings()`, a função nem recebe argumentos, então ela sempre retorna o mesmo valor. |
|||
|
|||
Dessa forma, ela se comporta praticamente como uma variável global, mas ao ser utilizada como uma função de uma dependência, pode facilmente ser sobrescrita durante os testes. |
|||
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` é definido no módulo `functools` que faz parte da biblioteca padrão do Python, você pode ler mais sobre esse decorador no link <a href="https://docs.python.org/3/library/functools.html#functools.lru_cache" class="external-link" target="_blank">Python Docs sobre `@lru_cache`</a>. |
|||
`@lru_cache` faz parte de `functools`, que faz parte da biblioteca padrão do Python; você pode ler mais sobre isso na <a href="https://docs.python.org/3/library/functools.html#functools.lru_cache" class="external-link" target="_blank">documentação do Python para `@lru_cache`</a>. |
|||
|
|||
## Recapitulando |
|||
## Recapitulando { #recap } |
|||
|
|||
Você pode usar o módulo Pydantic Settings para gerenciar as configurações de sua aplicação, utilizando todo o poder dos modelos Pydantic. |
|||
Você pode usar Pydantic Settings para lidar com as configurações da sua aplicação, com todo o poder dos modelos Pydantic. |
|||
|
|||
- Utilizar dependências simplifica os testes. |
|||
- Você pode utilizar arquivos .env junto das configurações do Pydantic. |
|||
- Utilizar o decorador `@lru_cache` evita que o arquivo .env seja lido de novo e de novo para cada requisição, enquanto permite que você sobrescreva durante os testes. |
|||
* Usando uma dependência você pode simplificar os testes. |
|||
* Você pode usar arquivos `.env` com ele. |
|||
* Usar `@lru_cache` permite evitar ler o arquivo dotenv repetidamente a cada requisição, enquanto permite sobrescrevê-lo durante os testes. |
|||
|
|||
@ -1,5 +1,11 @@ |
|||
# Testando Eventos: inicialização - encerramento |
|||
# Testando eventos: lifespan e inicialização - encerramento { #testing-events-lifespan-and-startup-shutdown } |
|||
|
|||
Quando você precisa que os seus manipuladores de eventos (`startup` e `shutdown`) sejam executados em seus testes, você pode utilizar o `TestClient` usando a instrução `with`: |
|||
Quando você precisa que o `lifespan` seja executado em seus testes, você pode utilizar o `TestClient` com a instrução `with`: |
|||
|
|||
{* ../../docs_src/app_testing/tutorial004.py hl[9:15,18,27:28,30:32,41:43] *} |
|||
|
|||
Você pode ler mais detalhes sobre o ["Executando lifespan em testes no site oficial da documentação do Starlette."](https://www.starlette.dev/lifespan/#running-lifespan-in-tests) |
|||
|
|||
Para os eventos `startup` e `shutdown` descontinuados, você pode usar o `TestClient` da seguinte forma: |
|||
|
|||
{* ../../docs_src/app_testing/tutorial003.py hl[9:12,20:24] *} |
|||
|
|||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue