committed by
GitHub
274 changed files with 9207 additions and 4220 deletions
@ -24,6 +24,8 @@ jobs: |
|||||
env: |
env: |
||||
GITHUB_CONTEXT: ${{ toJson(github) }} |
GITHUB_CONTEXT: ${{ toJson(github) }} |
||||
run: echo "$GITHUB_CONTEXT" |
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 |
- uses: actions/checkout@v5 |
||||
with: |
with: |
||||
# To allow latest-changes to commit to the main branch |
# 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' }} |
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }} |
||||
with: |
with: |
||||
limit-access-to-actor: true |
limit-access-to-actor: true |
||||
- uses: tiangolo/[email protected].0 |
- uses: tiangolo/[email protected].1 |
||||
with: |
with: |
||||
token: ${{ secrets.GITHUB_TOKEN }} |
token: ${{ secrets.GITHUB_TOKEN }} |
||||
latest_changes_file: docs/en/docs/release-notes.md |
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 for more information |
||||
# See https://pre-commit.com/hooks.html for more hooks |
# See https://pre-commit.com/hooks.html for more hooks |
||||
default_language_version: |
|
||||
python: python3.10 |
|
||||
repos: |
repos: |
||||
- repo: https://github.com/pre-commit/pre-commit-hooks |
- repo: https://github.com/pre-commit/pre-commit-hooks |
||||
rev: v6.0.0 |
rev: v6.0.0 |
||||
hooks: |
hooks: |
||||
- id: check-added-large-files |
- id: check-added-large-files |
||||
- id: check-toml |
- id: check-toml |
||||
- id: check-yaml |
- id: check-yaml |
||||
args: |
args: |
||||
- --unsafe |
- --unsafe |
||||
- id: end-of-file-fixer |
- id: end-of-file-fixer |
||||
- id: trailing-whitespace |
- id: trailing-whitespace |
||||
- repo: https://github.com/astral-sh/ruff-pre-commit |
- repo: https://github.com/astral-sh/ruff-pre-commit |
||||
rev: v0.13.3 |
rev: v0.14.3 |
||||
hooks: |
hooks: |
||||
- id: ruff |
- id: ruff |
||||
args: |
args: |
||||
- --fix |
- --fix |
||||
- id: ruff-format |
- id: ruff-format |
||||
ci: |
- repo: local |
||||
autofix_commit_msg: 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks |
hooks: |
||||
autoupdate_commit_msg: ⬆ [pre-commit.ci] pre-commit autoupdate |
- 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. |
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.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> |
* <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 |
- name: full-stack-fastapi-template |
||||
html_url: https://github.com/fastapi/full-stack-fastapi-template |
html_url: https://github.com/fastapi/full-stack-fastapi-template |
||||
stars: 38085 |
stars: 39475 |
||||
owner_login: fastapi |
owner_login: fastapi |
||||
owner_html_url: https://github.com/fastapi |
owner_html_url: https://github.com/fastapi |
||||
- name: Hello-Python |
- name: Hello-Python |
||||
html_url: https://github.com/mouredev/Hello-Python |
html_url: https://github.com/mouredev/Hello-Python |
||||
stars: 32243 |
stars: 33090 |
||||
owner_login: mouredev |
owner_login: mouredev |
||||
owner_html_url: https://github.com/mouredev |
owner_html_url: https://github.com/mouredev |
||||
- name: serve |
- name: serve |
||||
html_url: https://github.com/jina-ai/serve |
html_url: https://github.com/jina-ai/serve |
||||
stars: 21754 |
stars: 21798 |
||||
owner_login: jina-ai |
owner_login: jina-ai |
||||
owner_html_url: https://github.com/jina-ai |
owner_html_url: https://github.com/jina-ai |
||||
- name: HivisionIDPhotos |
- name: HivisionIDPhotos |
||||
html_url: https://github.com/Zeyi-Lin/HivisionIDPhotos |
html_url: https://github.com/Zeyi-Lin/HivisionIDPhotos |
||||
stars: 19400 |
stars: 20258 |
||||
owner_login: Zeyi-Lin |
owner_login: Zeyi-Lin |
||||
owner_html_url: https://github.com/Zeyi-Lin |
owner_html_url: https://github.com/Zeyi-Lin |
||||
- name: sqlmodel |
- name: sqlmodel |
||||
html_url: https://github.com/fastapi/sqlmodel |
html_url: https://github.com/fastapi/sqlmodel |
||||
stars: 16859 |
stars: 17212 |
||||
owner_login: fastapi |
owner_login: fastapi |
||||
owner_html_url: https://github.com/fastapi |
owner_html_url: https://github.com/fastapi |
||||
- name: Douyin_TikTok_Download_API |
- name: Douyin_TikTok_Download_API |
||||
html_url: https://github.com/Evil0ctal/Douyin_TikTok_Download_API |
html_url: https://github.com/Evil0ctal/Douyin_TikTok_Download_API |
||||
stars: 14452 |
stars: 15145 |
||||
owner_login: Evil0ctal |
owner_login: Evil0ctal |
||||
owner_html_url: https://github.com/Evil0ctal |
owner_html_url: https://github.com/Evil0ctal |
||||
- name: fastapi-best-practices |
- name: fastapi-best-practices |
||||
html_url: https://github.com/zhanymkanov/fastapi-best-practices |
html_url: https://github.com/zhanymkanov/fastapi-best-practices |
||||
stars: 13613 |
stars: 14644 |
||||
owner_login: zhanymkanov |
owner_login: zhanymkanov |
||||
owner_html_url: https://github.com/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 |
- name: fastapi_mcp |
||||
html_url: https://github.com/tadata-org/fastapi_mcp |
html_url: https://github.com/tadata-org/fastapi_mcp |
||||
stars: 10624 |
stars: 11174 |
||||
owner_login: tadata-org |
owner_login: tadata-org |
||||
owner_html_url: https://github.com/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 |
- name: awesome-fastapi |
||||
html_url: https://github.com/mjhea0/awesome-fastapi |
html_url: https://github.com/mjhea0/awesome-fastapi |
||||
stars: 10415 |
stars: 10758 |
||||
owner_login: mjhea0 |
owner_login: mjhea0 |
||||
owner_html_url: https://github.com/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 |
- name: XHS-Downloader |
||||
html_url: https://github.com/JoeanAmier/XHS-Downloader |
html_url: https://github.com/JoeanAmier/XHS-Downloader |
||||
stars: 8824 |
stars: 9313 |
||||
owner_login: JoeanAmier |
owner_login: JoeanAmier |
||||
owner_html_url: https://github.com/JoeanAmier |
owner_html_url: https://github.com/JoeanAmier |
||||
- name: SurfSense |
- name: FastUI |
||||
html_url: https://github.com/MODSetter/SurfSense |
html_url: https://github.com/pydantic/FastUI |
||||
stars: 8257 |
stars: 8915 |
||||
owner_login: MODSetter |
owner_login: pydantic |
||||
owner_html_url: https://github.com/MODSetter |
owner_html_url: https://github.com/pydantic |
||||
- name: FileCodeBox |
|
||||
html_url: https://github.com/vastsa/FileCodeBox |
|
||||
stars: 7367 |
|
||||
owner_login: vastsa |
|
||||
owner_html_url: https://github.com/vastsa |
|
||||
- name: polar |
- name: polar |
||||
html_url: https://github.com/polarsource/polar |
html_url: https://github.com/polarsource/polar |
||||
stars: 7291 |
stars: 8339 |
||||
owner_login: polarsource |
owner_login: polarsource |
||||
owner_html_url: https://github.com/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 |
- name: nonebot2 |
||||
html_url: https://github.com/nonebot/nonebot2 |
html_url: https://github.com/nonebot/nonebot2 |
||||
stars: 7065 |
stars: 7170 |
||||
owner_login: nonebot |
owner_login: nonebot |
||||
owner_html_url: https://github.com/nonebot |
owner_html_url: https://github.com/nonebot |
||||
- name: hatchet |
- name: hatchet |
||||
html_url: https://github.com/hatchet-dev/hatchet |
html_url: https://github.com/hatchet-dev/hatchet |
||||
stars: 6070 |
stars: 6253 |
||||
owner_login: hatchet-dev |
owner_login: hatchet-dev |
||||
owner_html_url: https://github.com/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 |
- name: fastapi-users |
||||
html_url: https://github.com/fastapi-users/fastapi-users |
html_url: https://github.com/fastapi-users/fastapi-users |
||||
stars: 5599 |
stars: 5849 |
||||
owner_login: fastapi-users |
owner_login: fastapi-users |
||||
owner_html_url: https://github.com/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 |
- name: strawberry |
||||
html_url: https://github.com/strawberry-graphql/strawberry |
html_url: https://github.com/strawberry-graphql/strawberry |
||||
stars: 4422 |
stars: 4569 |
||||
owner_login: strawberry-graphql |
owner_login: strawberry-graphql |
||||
owner_html_url: https://github.com/strawberry-graphql |
owner_html_url: https://github.com/strawberry-graphql |
||||
- name: chatgpt-web-share |
- name: chatgpt-web-share |
||||
html_url: https://github.com/chatpire/chatgpt-web-share |
html_url: https://github.com/chatpire/chatgpt-web-share |
||||
stars: 4301 |
stars: 4294 |
||||
owner_login: chatpire |
owner_login: chatpire |
||||
owner_html_url: https://github.com/chatpire |
owner_html_url: https://github.com/chatpire |
||||
- name: poem |
- name: poem |
||||
html_url: https://github.com/poem-web/poem |
html_url: https://github.com/poem-web/poem |
||||
stars: 4197 |
stars: 4276 |
||||
owner_login: poem-web |
owner_login: poem-web |
||||
owner_html_url: https://github.com/poem-web |
owner_html_url: https://github.com/poem-web |
||||
- name: dynaconf |
- name: dynaconf |
||||
html_url: https://github.com/dynaconf/dynaconf |
html_url: https://github.com/dynaconf/dynaconf |
||||
stars: 4144 |
stars: 4202 |
||||
owner_login: dynaconf |
owner_login: dynaconf |
||||
owner_html_url: https://github.com/dynaconf |
owner_html_url: https://github.com/dynaconf |
||||
- name: atrilabs-engine |
- name: atrilabs-engine |
||||
html_url: https://github.com/Atri-Labs/atrilabs-engine |
html_url: https://github.com/Atri-Labs/atrilabs-engine |
||||
stars: 4094 |
stars: 4093 |
||||
owner_login: Atri-Labs |
owner_login: Atri-Labs |
||||
owner_html_url: https://github.com/Atri-Labs |
owner_html_url: https://github.com/Atri-Labs |
||||
- name: Kokoro-FastAPI |
- name: Kokoro-FastAPI |
||||
html_url: https://github.com/remsky/Kokoro-FastAPI |
html_url: https://github.com/remsky/Kokoro-FastAPI |
||||
stars: 3739 |
stars: 4019 |
||||
owner_login: remsky |
owner_login: remsky |
||||
owner_html_url: https://github.com/remsky |
owner_html_url: https://github.com/remsky |
||||
- name: logfire |
- name: logfire |
||||
html_url: https://github.com/pydantic/logfire |
html_url: https://github.com/pydantic/logfire |
||||
stars: 3614 |
stars: 3805 |
||||
owner_login: pydantic |
owner_login: pydantic |
||||
owner_html_url: https://github.com/pydantic |
owner_html_url: https://github.com/pydantic |
||||
- name: LitServe |
- name: LitServe |
||||
html_url: https://github.com/Lightning-AI/LitServe |
html_url: https://github.com/Lightning-AI/LitServe |
||||
stars: 3578 |
stars: 3719 |
||||
owner_login: Lightning-AI |
owner_login: Lightning-AI |
||||
owner_html_url: https://github.com/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 |
- name: fastapi-admin |
||||
html_url: https://github.com/fastapi-admin/fastapi-admin |
html_url: https://github.com/fastapi-admin/fastapi-admin |
||||
stars: 3456 |
stars: 3632 |
||||
owner_login: fastapi-admin |
owner_login: fastapi-admin |
||||
owner_html_url: https://github.com/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 |
- name: huma |
||||
html_url: https://github.com/danielgtaylor/huma |
html_url: https://github.com/danielgtaylor/huma |
||||
stars: 3447 |
stars: 3603 |
||||
owner_login: danielgtaylor |
owner_login: danielgtaylor |
||||
owner_html_url: https://github.com/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 |
- name: tracecat |
||||
html_url: https://github.com/TracecatHQ/tracecat |
html_url: https://github.com/TracecatHQ/tracecat |
||||
stars: 3254 |
stars: 3379 |
||||
owner_login: TracecatHQ |
owner_login: TracecatHQ |
||||
owner_html_url: https://github.com/TracecatHQ |
owner_html_url: https://github.com/TracecatHQ |
||||
- name: opyrator |
- name: opyrator |
||||
html_url: https://github.com/ml-tooling/opyrator |
html_url: https://github.com/ml-tooling/opyrator |
||||
stars: 3134 |
stars: 3135 |
||||
owner_login: ml-tooling |
owner_login: ml-tooling |
||||
owner_html_url: https://github.com/ml-tooling |
owner_html_url: https://github.com/ml-tooling |
||||
- name: docarray |
- name: docarray |
||||
html_url: https://github.com/docarray/docarray |
html_url: https://github.com/docarray/docarray |
||||
stars: 3107 |
stars: 3114 |
||||
owner_login: docarray |
owner_login: docarray |
||||
owner_html_url: https://github.com/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 |
- name: fastapi-realworld-example-app |
||||
html_url: https://github.com/nsidnev/fastapi-realworld-example-app |
html_url: https://github.com/nsidnev/fastapi-realworld-example-app |
||||
stars: 2936 |
stars: 3050 |
||||
owner_login: nsidnev |
owner_login: nsidnev |
||||
owner_html_url: https://github.com/nsidnev |
owner_html_url: https://github.com/nsidnev |
||||
- name: uvicorn-gunicorn-fastapi-docker |
- name: uvicorn-gunicorn-fastapi-docker |
||||
html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker |
html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker |
||||
stars: 2804 |
stars: 2911 |
||||
owner_login: tiangolo |
owner_login: tiangolo |
||||
owner_html_url: https://github.com/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 |
- name: mcp-context-forge |
||||
html_url: https://github.com/IBM/mcp-context-forge |
html_url: https://github.com/IBM/mcp-context-forge |
||||
stars: 2572 |
stars: 2899 |
||||
owner_login: IBM |
owner_login: IBM |
||||
owner_html_url: https://github.com/IBM |
owner_html_url: https://github.com/IBM |
||||
- name: fastapi-react |
- name: best-of-web-python |
||||
html_url: https://github.com/Buuntu/fastapi-react |
html_url: https://github.com/ml-tooling/best-of-web-python |
||||
stars: 2451 |
stars: 2648 |
||||
owner_login: Buuntu |
owner_login: ml-tooling |
||||
owner_html_url: https://github.com/Buuntu |
owner_html_url: https://github.com/ml-tooling |
||||
- name: RasaGPT |
|
||||
html_url: https://github.com/paulpierre/RasaGPT |
|
||||
stars: 2441 |
|
||||
owner_login: paulpierre |
|
||||
owner_html_url: https://github.com/paulpierre |
|
||||
- name: FastAPI-template |
- name: FastAPI-template |
||||
html_url: https://github.com/s3rius/FastAPI-template |
html_url: https://github.com/s3rius/FastAPI-template |
||||
stars: 2424 |
stars: 2637 |
||||
owner_login: s3rius |
owner_login: s3rius |
||||
owner_html_url: https://github.com/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 |
- name: sqladmin |
||||
html_url: https://github.com/aminalaee/sqladmin |
html_url: https://github.com/aminalaee/sqladmin |
||||
stars: 2357 |
stars: 2558 |
||||
owner_login: aminalaee |
owner_login: aminalaee |
||||
owner_html_url: https://github.com/aminalaee |
owner_html_url: https://github.com/aminalaee |
||||
- name: nextpy |
- name: RasaGPT |
||||
html_url: https://github.com/dot-agent/nextpy |
html_url: https://github.com/paulpierre/RasaGPT |
||||
stars: 2324 |
stars: 2451 |
||||
owner_login: dot-agent |
owner_login: paulpierre |
||||
owner_html_url: https://github.com/dot-agent |
owner_html_url: https://github.com/paulpierre |
||||
- name: supabase-py |
- name: supabase-py |
||||
html_url: https://github.com/supabase/supabase-py |
html_url: https://github.com/supabase/supabase-py |
||||
stars: 2236 |
stars: 2344 |
||||
owner_login: supabase |
owner_login: supabase |
||||
owner_html_url: https://github.com/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 |
- name: 30-Days-of-Python |
||||
html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python |
html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python |
||||
stars: 2210 |
stars: 2220 |
||||
owner_login: codingforentrepreneurs |
owner_login: codingforentrepreneurs |
||||
owner_html_url: https://github.com/codingforentrepreneurs |
owner_html_url: https://github.com/codingforentrepreneurs |
||||
- name: langserve |
- name: langserve |
||||
html_url: https://github.com/langchain-ai/langserve |
html_url: https://github.com/langchain-ai/langserve |
||||
stars: 2171 |
stars: 2215 |
||||
owner_login: langchain-ai |
owner_login: langchain-ai |
||||
owner_html_url: https://github.com/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 |
- name: solara |
||||
html_url: https://github.com/widgetti/solara |
html_url: https://github.com/widgetti/solara |
||||
stars: 2102 |
stars: 2122 |
||||
owner_login: widgetti |
owner_login: widgetti |
||||
owner_html_url: https://github.com/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 |
- name: mangum |
||||
html_url: https://github.com/Kludex/mangum |
html_url: https://github.com/Kludex/mangum |
||||
stars: 1989 |
stars: 2029 |
||||
owner_login: Kludex |
owner_login: Kludex |
||||
owner_html_url: https://github.com/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 |
- name: agentkit |
||||
html_url: https://github.com/BCG-X-Official/agentkit |
html_url: https://github.com/BCG-X-Official/agentkit |
||||
stars: 1789 |
stars: 1912 |
||||
owner_login: BCG-X-Official |
owner_login: BCG-X-Official |
||||
owner_html_url: https://github.com/BCG-X-Official |
owner_html_url: https://github.com/BCG-X-Official |
||||
- name: manage-fastapi |
- name: manage-fastapi |
||||
html_url: https://github.com/ycd/manage-fastapi |
html_url: https://github.com/ycd/manage-fastapi |
||||
stars: 1780 |
stars: 1885 |
||||
owner_login: ycd |
owner_login: ycd |
||||
owner_html_url: https://github.com/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 |
- name: openapi-python-client |
||||
html_url: https://github.com/openapi-generators/openapi-python-client |
html_url: https://github.com/openapi-generators/openapi-python-client |
||||
stars: 1707 |
stars: 1862 |
||||
owner_login: openapi-generators |
owner_login: openapi-generators |
||||
owner_html_url: https://github.com/openapi-generators |
owner_html_url: https://github.com/openapi-generators |
||||
- name: piccolo |
- name: piccolo |
||||
html_url: https://github.com/piccolo-orm/piccolo |
html_url: https://github.com/piccolo-orm/piccolo |
||||
stars: 1695 |
stars: 1836 |
||||
owner_login: piccolo-orm |
owner_login: piccolo-orm |
||||
owner_html_url: https://github.com/piccolo-orm |
owner_html_url: https://github.com/piccolo-orm |
||||
- name: vue-fastapi-admin |
- name: vue-fastapi-admin |
||||
html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin |
html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin |
||||
stars: 1695 |
stars: 1831 |
||||
owner_login: mizhexiaoxiao |
owner_login: mizhexiaoxiao |
||||
owner_html_url: https://github.com/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 |
- name: fastapi-cache |
||||
html_url: https://github.com/long2ice/fastapi-cache |
html_url: https://github.com/long2ice/fastapi-cache |
||||
stars: 1653 |
stars: 1789 |
||||
owner_login: long2ice |
owner_login: long2ice |
||||
owner_html_url: https://github.com/long2ice |
owner_html_url: https://github.com/long2ice |
||||
- name: langchain-serve |
- name: ormar |
||||
html_url: https://github.com/jina-ai/langchain-serve |
html_url: https://github.com/collerek/ormar |
||||
stars: 1635 |
stars: 1783 |
||||
owner_login: jina-ai |
owner_login: collerek |
||||
owner_html_url: https://github.com/jina-ai |
owner_html_url: https://github.com/collerek |
||||
- name: termpair |
- name: termpair |
||||
html_url: https://github.com/cs01/termpair |
html_url: https://github.com/cs01/termpair |
||||
stars: 1624 |
stars: 1716 |
||||
owner_login: cs01 |
owner_login: cs01 |
||||
owner_html_url: https://github.com/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 |
- name: FastAPI-boilerplate |
||||
html_url: https://github.com/benavlabs/FastAPI-boilerplate |
html_url: https://github.com/benavlabs/FastAPI-boilerplate |
||||
stars: 1516 |
stars: 1660 |
||||
owner_login: benavlabs |
owner_login: benavlabs |
||||
owner_html_url: https://github.com/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 |
- name: awesome-fastapi-projects |
||||
html_url: https://github.com/Kludex/awesome-fastapi-projects |
html_url: https://github.com/Kludex/awesome-fastapi-projects |
||||
stars: 1481 |
stars: 1589 |
||||
owner_login: Kludex |
owner_login: Kludex |
||||
owner_html_url: https://github.com/Kludex |
owner_html_url: https://github.com/Kludex |
||||
- name: fastapi-pagination |
- name: fastapi-pagination |
||||
html_url: https://github.com/uriyyo/fastapi-pagination |
html_url: https://github.com/uriyyo/fastapi-pagination |
||||
stars: 1453 |
stars: 1585 |
||||
owner_login: uriyyo |
owner_login: uriyyo |
||||
owner_html_url: https://github.com/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 |
- name: bracket |
||||
html_url: https://github.com/evroon/bracket |
html_url: https://github.com/evroon/bracket |
||||
stars: 1415 |
stars: 1489 |
||||
owner_login: evroon |
owner_login: evroon |
||||
owner_html_url: https://github.com/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 |
- name: fastapi-amis-admin |
||||
html_url: https://github.com/amisadmin/fastapi-amis-admin |
html_url: https://github.com/amisadmin/fastapi-amis-admin |
||||
stars: 1342 |
stars: 1475 |
||||
owner_login: amisadmin |
owner_login: amisadmin |
||||
owner_html_url: https://github.com/amisadmin |
owner_html_url: https://github.com/amisadmin |
||||
- name: fastapi-langgraph-agent-production-ready-template |
- name: fastapi-boilerplate |
||||
html_url: https://github.com/wassim249/fastapi-langgraph-agent-production-ready-template |
html_url: https://github.com/teamhide/fastapi-boilerplate |
||||
stars: 1334 |
stars: 1436 |
||||
owner_login: wassim249 |
owner_login: teamhide |
||||
owner_html_url: https://github.com/wassim249 |
owner_html_url: https://github.com/teamhide |
||||
- name: fastapi-tutorial |
- name: awesome-python-resources |
||||
html_url: https://github.com/liaogx/fastapi-tutorial |
html_url: https://github.com/DjangoEx/awesome-python-resources |
||||
stars: 1303 |
stars: 1426 |
||||
owner_login: liaogx |
owner_login: DjangoEx |
||||
owner_html_url: https://github.com/liaogx |
owner_html_url: https://github.com/DjangoEx |
||||
- 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: fastcrud |
- name: fastcrud |
||||
html_url: https://github.com/benavlabs/fastcrud |
html_url: https://github.com/benavlabs/fastcrud |
||||
stars: 1272 |
stars: 1414 |
||||
owner_login: benavlabs |
owner_login: benavlabs |
||||
owner_html_url: https://github.com/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 |
- name: prometheus-fastapi-instrumentator |
||||
html_url: https://github.com/trallnag/prometheus-fastapi-instrumentator |
html_url: https://github.com/trallnag/prometheus-fastapi-instrumentator |
||||
stars: 1246 |
stars: 1388 |
||||
owner_login: trallnag |
owner_login: trallnag |
||||
owner_html_url: https://github.com/trallnag |
owner_html_url: https://github.com/trallnag |
||||
- name: bolt-python |
- name: fastapi_best_architecture |
||||
html_url: https://github.com/slackapi/bolt-python |
html_url: https://github.com/fastapi-practices/fastapi_best_architecture |
||||
stars: 1221 |
stars: 1378 |
||||
owner_login: slackapi |
owner_login: fastapi-practices |
||||
owner_html_url: https://github.com/slackapi |
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 |
- name: bedrock-chat |
||||
html_url: https://github.com/aws-samples/bedrock-chat |
html_url: https://github.com/aws-samples/bedrock-chat |
||||
stars: 1220 |
stars: 1254 |
||||
owner_login: aws-samples |
owner_login: aws-samples |
||||
owner_html_url: https://github.com/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 |
- name: fastapi_production_template |
||||
html_url: https://github.com/zhanymkanov/fastapi_production_template |
html_url: https://github.com/zhanymkanov/fastapi_production_template |
||||
stars: 1202 |
stars: 1217 |
||||
owner_login: zhanymkanov |
owner_login: zhanymkanov |
||||
owner_html_url: https://github.com/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 |
- name: langchain-extract |
||||
html_url: https://github.com/langchain-ai/langchain-extract |
html_url: https://github.com/langchain-ai/langchain-extract |
||||
stars: 1164 |
stars: 1176 |
||||
owner_login: langchain-ai |
owner_login: langchain-ai |
||||
owner_html_url: https://github.com/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 |
- name: restish |
||||
html_url: https://github.com/rest-sh/restish |
html_url: https://github.com/rest-sh/restish |
||||
stars: 1122 |
stars: 1140 |
||||
owner_login: rest-sh |
owner_login: rest-sh |
||||
owner_html_url: https://github.com/rest-sh |
owner_html_url: https://github.com/rest-sh |
||||
- name: runhouse |
- name: odmantic |
||||
html_url: https://github.com/run-house/runhouse |
html_url: https://github.com/art049/odmantic |
||||
stars: 1047 |
stars: 1138 |
||||
owner_login: run-house |
owner_login: art049 |
||||
owner_html_url: https://github.com/run-house |
owner_html_url: https://github.com/art049 |
||||
- name: flock |
|
||||
html_url: https://github.com/Onelevenvy/flock |
|
||||
stars: 1027 |
|
||||
owner_login: Onelevenvy |
|
||||
owner_html_url: https://github.com/Onelevenvy |
|
||||
- name: authx |
- name: authx |
||||
html_url: https://github.com/yezz123/authx |
html_url: https://github.com/yezz123/authx |
||||
stars: 999 |
stars: 1119 |
||||
owner_login: yezz123 |
owner_login: yezz123 |
||||
owner_html_url: https://github.com/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 |
- name: autollm |
||||
html_url: https://github.com/viddexa/autollm |
html_url: https://github.com/viddexa/autollm |
||||
stars: 999 |
stars: 1002 |
||||
owner_login: viddexa |
owner_login: viddexa |
||||
owner_html_url: https://github.com/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 |
- name: titiler |
||||
html_url: https://github.com/developmentseed/titiler |
html_url: https://github.com/developmentseed/titiler |
||||
stars: 952 |
stars: 999 |
||||
owner_login: developmentseed |
owner_login: developmentseed |
||||
owner_html_url: https://github.com/developmentseed |
owner_html_url: https://github.com/developmentseed |
||||
- name: energy-forecasting |
- name: lanarky |
||||
html_url: https://github.com/iusztinpaul/energy-forecasting |
html_url: https://github.com/ajndkr/lanarky |
||||
stars: 946 |
stars: 994 |
||||
owner_login: iusztinpaul |
owner_login: ajndkr |
||||
owner_html_url: https://github.com/iusztinpaul |
owner_html_url: https://github.com/ajndkr |
||||
- 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: every-pdf |
- name: every-pdf |
||||
html_url: https://github.com/DDULDDUCK/every-pdf |
html_url: https://github.com/DDULDDUCK/every-pdf |
||||
stars: 907 |
stars: 985 |
||||
owner_login: DDULDDUCK |
owner_login: DDULDDUCK |
||||
owner_html_url: https://github.com/DDULDDUCK |
owner_html_url: https://github.com/DDULDDUCK |
||||
- name: marker-api |
- name: enterprise-deep-research |
||||
html_url: https://github.com/adithya-s-k/marker-api |
html_url: https://github.com/SalesforceAIResearch/enterprise-deep-research |
||||
stars: 903 |
stars: 973 |
||||
owner_login: adithya-s-k |
owner_login: SalesforceAIResearch |
||||
owner_html_url: https://github.com/adithya-s-k |
owner_html_url: https://github.com/SalesforceAIResearch |
||||
- name: fastapi-observability |
- name: fastapi-mail |
||||
html_url: https://github.com/blueswen/fastapi-observability |
html_url: https://github.com/sabuhish/fastapi-mail |
||||
stars: 902 |
stars: 964 |
||||
owner_login: blueswen |
owner_login: sabuhish |
||||
owner_html_url: https://github.com/blueswen |
owner_html_url: https://github.com/sabuhish |
||||
- 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 |
|
||||
|
|||||
@ -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 |
# 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 |
# updated and written, and the script would remove the env var |
||||
INHERIT: !ENV [INSIDERS_FILE, '../en/mkdocs.no-insiders.yml'] |
|
||||
markdown_extensions: |
markdown_extensions: |
||||
pymdownx.highlight: |
pymdownx.highlight: |
||||
linenums: !ENV [LINENUMS, false] |
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 |
/// 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: |
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://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://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> |
* <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] *} |
{* ../../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`. |
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"> |
<img src="/img/tutorial/generate-clients/image01.png"> |
||||
|
|
||||
Você pode ver esses schemas porque eles foram declarados com os modelos no app. |
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**. |
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 |
### Hey API { #hey-api } |
||||
|
|
||||
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: |
|
||||
|
|
||||
```JSON hl_lines="7" |
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. |
||||
{ |
|
||||
"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"> |
|
||||
|
|
||||
```console |
```sh |
||||
$ npm run generate-client |
npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client |
||||
|
|
||||
[email protected] generate-client /home/user/code/frontend-app |
|
||||
> openapi-ts --input http://localhost:8000/openapi.json --output ./src/client --client axios |
|
||||
``` |
``` |
||||
|
|
||||
</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"> |
<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 |
/// 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"> |
<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: |
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] *} |
{* ../../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: |
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` |
* `ItemsService` |
||||
* `UsersService` |
* `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 |
```TypeScript |
||||
ItemsService.createItemItemsPost({name: "Plumbus", price: 5}) |
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. 🤓 |
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. |
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. |
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). |
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] *} |
{* ../../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: |
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"> |
<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**. |
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**. |
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: |
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. |
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 |
### Gere um cliente TypeScript com o OpenAPI pré-processado { #generate-a-typescript-client-with-the-preprocessed-openapi } |
||||
|
|
||||
Agora, como o resultado final está em um arquivo `openapi.json`, você modificaria o `package.json` para usar esse arquivo local, por exemplo: |
Como o resultado final está agora em um arquivo `openapi.json`, você precisa atualizar o local de entrada: |
||||
|
|
||||
```JSON hl_lines="7" |
```sh |
||||
{ |
npx @hey-api/openapi-ts -i ./openapi.json -o src/client |
||||
"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" |
|
||||
} |
|
||||
} |
|
||||
``` |
``` |
||||
|
|
||||
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"> |
<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. |
* Métodos. |
||||
* Corpo de requisições, parâmetros da query, etc. |
* Corpos de requisições, parâmetros de query, etc. |
||||
* Corpo de respostas. |
* 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. |
Por esse motivo, é comum fornecê-las em variáveis de ambiente lidas 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> |
|
||||
|
|
||||
/// tip | Dica |
/// 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"> |
<div class="termy"> |
||||
|
|
||||
@ -153,7 +35,7 @@ $ pip install pydantic-settings |
|||||
|
|
||||
</div> |
</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"> |
<div class="termy"> |
||||
|
|
||||
@ -164,19 +46,19 @@ $ pip install "fastapi[all]" |
|||||
|
|
||||
</div> |
</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 |
//// tab | Pydantic v2 |
||||
|
|
||||
@ -186,9 +68,9 @@ Você pode utilizar todas as ferramentas e funcionalidades de validação que s |
|||||
|
|
||||
//// tab | Pydantic v1 |
//// 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 |
/// 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] *} |
{* ../../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"> |
<div class="termy"> |
||||
|
|
||||
@ -228,110 +110,110 @@ $ ADMIN_EMAIL="[email protected]" APP_NAME="ChimichangApp" fastapi run main.p |
|||||
|
|
||||
/// tip | Dica |
/// 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 *} |
{* ../../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] *} |
{* ../../docs_src/settings/app01/main.py hl[3,11:13] *} |
||||
|
|
||||
/// tip | Dica |
/// 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] *} |
{* ../../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] *} |
{* ../../docs_src/settings/app02_an_py39/main.py hl[6,12:13] *} |
||||
|
|
||||
/// tip | Dica |
/// 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] *} |
{* ../../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] *} |
{* ../../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 |
/// 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 |
/// 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 |
```bash |
||||
ADMIN_EMAIL="[email protected]" |
ADMIN_EMAIL="[email protected]" |
||||
APP_NAME="ChimichangApp" |
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 |
//// tab | Pydantic v2 |
||||
|
|
||||
@ -339,7 +221,7 @@ E então adicionar o seguinte código em `config.py`: |
|||||
|
|
||||
/// tip | Dica |
/// 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 |
```Python |
||||
Settings() |
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 |
```Python |
||||
def get_settings(): |
def get_settings(): |
||||
return 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] *} |
{* ../../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 |
```Python |
||||
@lru_cache |
@lru_cache |
||||
@ -406,59 +288,59 @@ def say_hi(name: str, salutation: str = "Ms."): |
|||||
return f"Hello {salutation} {name}" |
return f"Hello {salutation} {name}" |
||||
``` |
``` |
||||
|
|
||||
Seu programa poderia executar dessa forma: |
seu programa poderia executar assim: |
||||
|
|
||||
```mermaid |
```mermaid |
||||
sequenceDiagram |
sequenceDiagram |
||||
|
|
||||
participant code as Código |
participant code as Code |
||||
participant function as say_hi() |
participant function as say_hi() |
||||
participant execute as Executar Função |
participant execute as Execute function |
||||
|
|
||||
rect rgba(0, 255, 0, .1) |
rect rgba(0, 255, 0, .1) |
||||
code ->> function: say_hi(name="Camila") |
code ->> function: say_hi(name="Camila") |
||||
function ->> execute: executar código da função |
function ->> execute: execute function code |
||||
execute ->> code: retornar o resultado |
execute ->> code: return the result |
||||
end |
end |
||||
|
|
||||
rect rgba(0, 255, 255, .1) |
rect rgba(0, 255, 255, .1) |
||||
code ->> function: say_hi(name="Camila") |
code ->> function: say_hi(name="Camila") |
||||
function ->> code: retornar resultado armazenado |
function ->> code: return stored result |
||||
end |
end |
||||
|
|
||||
rect rgba(0, 255, 0, .1) |
rect rgba(0, 255, 0, .1) |
||||
code ->> function: say_hi(name="Rick") |
code ->> function: say_hi(name="Rick") |
||||
function ->> execute: executar código da função |
function ->> execute: execute function code |
||||
execute ->> code: retornar o resultado |
execute ->> code: return the result |
||||
end |
end |
||||
|
|
||||
rect rgba(0, 255, 0, .1) |
rect rgba(0, 255, 0, .1) |
||||
code ->> function: say_hi(name="Rick", salutation="Mr.") |
code ->> function: say_hi(name="Rick", salutation="Mr.") |
||||
function ->> execute: executar código da função |
function ->> execute: execute function code |
||||
execute ->> code: retornar o resultado |
execute ->> code: return the result |
||||
end |
end |
||||
|
|
||||
rect rgba(0, 255, 255, .1) |
rect rgba(0, 255, 255, .1) |
||||
code ->> function: say_hi(name="Rick") |
code ->> function: say_hi(name="Rick") |
||||
function ->> code: retornar resultado armazenado |
function ->> code: return stored result |
||||
end |
end |
||||
|
|
||||
rect rgba(0, 255, 255, .1) |
rect rgba(0, 255, 255, .1) |
||||
code ->> function: say_hi(name="Camila") |
code ->> function: say_hi(name="Camila") |
||||
function ->> code: retornar resultado armazenado |
function ->> code: return stored result |
||||
end |
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. |
* Usando uma dependência você pode simplificar os testes. |
||||
- Você pode utilizar arquivos .env junto das configurações do Pydantic. |
* Você pode usar arquivos `.env` com ele. |
||||
- 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. |
* 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] *} |
{* ../../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