mirror of https://github.com/tiangolo/fastapi.git
Merge branch 'master' into multiple-query-params-models
This commit is contained in:
commit
6910a5ff33
|
|
@ -17,6 +17,7 @@ lang-all:
|
||||||
- docs/*/docs/**
|
- docs/*/docs/**
|
||||||
- all-globs-to-all-files:
|
- all-globs-to-all-files:
|
||||||
- '!docs/en/docs/**'
|
- '!docs/en/docs/**'
|
||||||
|
- '!docs/*/**/_*.md'
|
||||||
- '!fastapi/**'
|
- '!fastapi/**'
|
||||||
- '!pyproject.toml'
|
- '!pyproject.toml'
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ jobs:
|
||||||
outputs:
|
outputs:
|
||||||
docs: ${{ steps.filter.outputs.docs }}
|
docs: ${{ steps.filter.outputs.docs }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
# For pull requests it's not necessary to checkout the code but for the main branch it is
|
# For pull requests it's not necessary to checkout the code but for the main branch it is
|
||||||
- uses: dorny/paths-filter@v3
|
- uses: dorny/paths-filter@v3
|
||||||
id: filter
|
id: filter
|
||||||
|
|
@ -32,12 +32,9 @@ jobs:
|
||||||
- docs/**
|
- docs/**
|
||||||
- docs_src/**
|
- docs_src/**
|
||||||
- requirements-docs.txt
|
- requirements-docs.txt
|
||||||
- requirements-docs-insiders.txt
|
|
||||||
- pyproject.toml
|
- pyproject.toml
|
||||||
- mkdocs.yml
|
- mkdocs.yml
|
||||||
- mkdocs.insiders.yml
|
- mkdocs.env.yml
|
||||||
- mkdocs.maybe-insiders.yml
|
|
||||||
- mkdocs.no-insiders.yml
|
|
||||||
- .github/workflows/build-docs.yml
|
- .github/workflows/build-docs.yml
|
||||||
- .github/workflows/deploy-docs.yml
|
- .github/workflows/deploy-docs.yml
|
||||||
- scripts/mkdocs_hooks.py
|
- scripts/mkdocs_hooks.py
|
||||||
|
|
@ -48,13 +45,13 @@ jobs:
|
||||||
outputs:
|
outputs:
|
||||||
langs: ${{ steps.show-langs.outputs.langs }}
|
langs: ${{ steps.show-langs.outputs.langs }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: "3.11"
|
python-version: "3.11"
|
||||||
- name: Setup uv
|
- name: Setup uv
|
||||||
uses: astral-sh/setup-uv@v6
|
uses: astral-sh/setup-uv@v7
|
||||||
with:
|
with:
|
||||||
version: "0.4.15"
|
version: "0.4.15"
|
||||||
enable-cache: true
|
enable-cache: true
|
||||||
|
|
@ -63,12 +60,6 @@ jobs:
|
||||||
pyproject.toml
|
pyproject.toml
|
||||||
- name: Install docs extras
|
- name: Install docs extras
|
||||||
run: uv pip install -r requirements-docs.txt
|
run: uv pip install -r requirements-docs.txt
|
||||||
# Install MkDocs Material Insiders here just to put it in the cache for the rest of the steps
|
|
||||||
- name: Install Material for MkDocs Insiders
|
|
||||||
if: ( github.event_name != 'pull_request' || github.secret_source == 'Actions' )
|
|
||||||
run: uv pip install -r requirements-docs-insiders.txt
|
|
||||||
env:
|
|
||||||
TOKEN: ${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}
|
|
||||||
- name: Verify Docs
|
- name: Verify Docs
|
||||||
run: python ./scripts/docs.py verify-docs
|
run: python ./scripts/docs.py verify-docs
|
||||||
- name: Export Language Codes
|
- name: Export Language Codes
|
||||||
|
|
@ -90,13 +81,13 @@ jobs:
|
||||||
env:
|
env:
|
||||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||||
run: echo "$GITHUB_CONTEXT"
|
run: echo "$GITHUB_CONTEXT"
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: "3.11"
|
python-version: "3.11"
|
||||||
- name: Setup uv
|
- name: Setup uv
|
||||||
uses: astral-sh/setup-uv@v6
|
uses: astral-sh/setup-uv@v7
|
||||||
with:
|
with:
|
||||||
version: "0.4.15"
|
version: "0.4.15"
|
||||||
enable-cache: true
|
enable-cache: true
|
||||||
|
|
@ -105,11 +96,6 @@ jobs:
|
||||||
pyproject.toml
|
pyproject.toml
|
||||||
- name: Install docs extras
|
- name: Install docs extras
|
||||||
run: uv pip install -r requirements-docs.txt
|
run: uv pip install -r requirements-docs.txt
|
||||||
- name: Install Material for MkDocs Insiders
|
|
||||||
if: ( github.event_name != 'pull_request' || github.secret_source == 'Actions' )
|
|
||||||
run: uv pip install -r requirements-docs-insiders.txt
|
|
||||||
env:
|
|
||||||
TOKEN: ${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}
|
|
||||||
- name: Update Languages
|
- name: Update Languages
|
||||||
run: python ./scripts/docs.py update-languages
|
run: python ./scripts/docs.py update-languages
|
||||||
- uses: actions/cache@v4
|
- uses: actions/cache@v4
|
||||||
|
|
@ -118,7 +104,7 @@ jobs:
|
||||||
path: docs/${{ matrix.lang }}/.cache
|
path: docs/${{ matrix.lang }}/.cache
|
||||||
- name: Build Docs
|
- name: Build Docs
|
||||||
run: python ./scripts/docs.py build-lang ${{ matrix.lang }}
|
run: python ./scripts/docs.py build-lang ${{ matrix.lang }}
|
||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: docs-site-${{ matrix.lang }}
|
name: docs-site-${{ matrix.lang }}
|
||||||
path: ./site/**
|
path: ./site/**
|
||||||
|
|
|
||||||
|
|
@ -24,13 +24,13 @@ jobs:
|
||||||
env:
|
env:
|
||||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||||
run: echo "$GITHUB_CONTEXT"
|
run: echo "$GITHUB_CONTEXT"
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: "3.11"
|
python-version: "3.11"
|
||||||
- name: Setup uv
|
- name: Setup uv
|
||||||
uses: astral-sh/setup-uv@v6
|
uses: astral-sh/setup-uv@v7
|
||||||
with:
|
with:
|
||||||
version: "0.4.15"
|
version: "0.4.15"
|
||||||
enable-cache: true
|
enable-cache: true
|
||||||
|
|
|
||||||
|
|
@ -23,13 +23,13 @@ jobs:
|
||||||
env:
|
env:
|
||||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||||
run: echo "$GITHUB_CONTEXT"
|
run: echo "$GITHUB_CONTEXT"
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: "3.11"
|
python-version: "3.11"
|
||||||
- name: Setup uv
|
- name: Setup uv
|
||||||
uses: astral-sh/setup-uv@v6
|
uses: astral-sh/setup-uv@v7
|
||||||
with:
|
with:
|
||||||
version: "0.4.15"
|
version: "0.4.15"
|
||||||
enable-cache: true
|
enable-cache: true
|
||||||
|
|
@ -49,7 +49,7 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
rm -rf ./site
|
rm -rf ./site
|
||||||
mkdir ./site
|
mkdir ./site
|
||||||
- uses: actions/download-artifact@v5
|
- uses: actions/download-artifact@v6
|
||||||
with:
|
with:
|
||||||
path: ./site/
|
path: ./site/
|
||||||
pattern: docs-site-*
|
pattern: docs-site-*
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,11 @@ jobs:
|
||||||
},
|
},
|
||||||
"waiting": {
|
"waiting": {
|
||||||
"delay": 2628000,
|
"delay": 2628000,
|
||||||
"message": "As this PR has been waiting for the original user for a while but seems to be inactive, it's now going to be closed. But if there's anyone interested, feel free to create a new PR."
|
"message": "As this PR has been waiting for the original user for a while but seems to be inactive, it's now going to be closed. But if there's anyone interested, feel free to create a new PR.",
|
||||||
|
"reminder": {
|
||||||
|
"before": "P3D",
|
||||||
|
"message": "Heads-up: this will be closed in 3 days unless there’s new activity."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"invalid": {
|
"invalid": {
|
||||||
"delay": 0,
|
"delay": 0,
|
||||||
|
|
|
||||||
|
|
@ -20,13 +20,13 @@ jobs:
|
||||||
env:
|
env:
|
||||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||||
run: echo "$GITHUB_CONTEXT"
|
run: echo "$GITHUB_CONTEXT"
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: "3.11"
|
python-version: "3.11"
|
||||||
- name: Setup uv
|
- name: Setup uv
|
||||||
uses: astral-sh/setup-uv@v6
|
uses: astral-sh/setup-uv@v7
|
||||||
with:
|
with:
|
||||||
version: "0.4.15"
|
version: "0.4.15"
|
||||||
enable-cache: true
|
enable-cache: true
|
||||||
|
|
|
||||||
|
|
@ -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/latest-changes@0.4.0
|
- uses: tiangolo/latest-changes@0.4.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
|
||||||
|
|
|
||||||
|
|
@ -28,13 +28,13 @@ jobs:
|
||||||
env:
|
env:
|
||||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||||
run: echo "$GITHUB_CONTEXT"
|
run: echo "$GITHUB_CONTEXT"
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: "3.11"
|
python-version: "3.11"
|
||||||
- name: Setup uv
|
- name: Setup uv
|
||||||
uses: astral-sh/setup-uv@v6
|
uses: astral-sh/setup-uv@v7
|
||||||
with:
|
with:
|
||||||
version: "0.4.15"
|
version: "0.4.15"
|
||||||
enable-cache: true
|
enable-cache: true
|
||||||
|
|
|
||||||
|
|
@ -24,13 +24,13 @@ jobs:
|
||||||
env:
|
env:
|
||||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||||
run: echo "$GITHUB_CONTEXT"
|
run: echo "$GITHUB_CONTEXT"
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: "3.11"
|
python-version: "3.11"
|
||||||
- name: Setup uv
|
- name: Setup uv
|
||||||
uses: astral-sh/setup-uv@v6
|
uses: astral-sh/setup-uv@v7
|
||||||
with:
|
with:
|
||||||
version: "0.4.15"
|
version: "0.4.15"
|
||||||
enable-cache: true
|
enable-cache: true
|
||||||
|
|
|
||||||
|
|
@ -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/lite-action@v1.1.0
|
||||||
|
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) }}
|
||||||
|
|
@ -20,7 +20,7 @@ jobs:
|
||||||
env:
|
env:
|
||||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||||
run: echo "$GITHUB_CONTEXT"
|
run: echo "$GITHUB_CONTEXT"
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
|
|
|
||||||
|
|
@ -21,12 +21,12 @@ jobs:
|
||||||
env:
|
env:
|
||||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||||
run: echo "$GITHUB_CONTEXT"
|
run: echo "$GITHUB_CONTEXT"
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- uses: actions/setup-python@v6
|
- uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: '3.9'
|
python-version: '3.9'
|
||||||
- name: Setup uv
|
- name: Setup uv
|
||||||
uses: astral-sh/setup-uv@v6
|
uses: astral-sh/setup-uv@v7
|
||||||
with:
|
with:
|
||||||
version: "0.4.15"
|
version: "0.4.15"
|
||||||
enable-cache: true
|
enable-cache: true
|
||||||
|
|
@ -34,7 +34,7 @@ jobs:
|
||||||
requirements**.txt
|
requirements**.txt
|
||||||
pyproject.toml
|
pyproject.toml
|
||||||
- run: uv pip install -r requirements-github-actions.txt
|
- run: uv pip install -r requirements-github-actions.txt
|
||||||
- uses: actions/download-artifact@v5
|
- uses: actions/download-artifact@v6
|
||||||
with:
|
with:
|
||||||
name: coverage-html
|
name: coverage-html
|
||||||
path: htmlcov
|
path: htmlcov
|
||||||
|
|
|
||||||
|
|
@ -24,13 +24,13 @@ jobs:
|
||||||
env:
|
env:
|
||||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||||
run: echo "$GITHUB_CONTEXT"
|
run: echo "$GITHUB_CONTEXT"
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: "3.11"
|
python-version: "3.11"
|
||||||
- name: Setup uv
|
- name: Setup uv
|
||||||
uses: astral-sh/setup-uv@v6
|
uses: astral-sh/setup-uv@v7
|
||||||
with:
|
with:
|
||||||
version: "0.4.15"
|
version: "0.4.15"
|
||||||
enable-cache: true
|
enable-cache: true
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ jobs:
|
||||||
env:
|
env:
|
||||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||||
run: echo "$GITHUB_CONTEXT"
|
run: echo "$GITHUB_CONTEXT"
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
|
|
|
||||||
|
|
@ -23,13 +23,13 @@ jobs:
|
||||||
env:
|
env:
|
||||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||||
run: echo "$GITHUB_CONTEXT"
|
run: echo "$GITHUB_CONTEXT"
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: "3.11"
|
python-version: "3.11"
|
||||||
- name: Setup uv
|
- name: Setup uv
|
||||||
uses: astral-sh/setup-uv@v6
|
uses: astral-sh/setup-uv@v7
|
||||||
with:
|
with:
|
||||||
version: "0.4.15"
|
version: "0.4.15"
|
||||||
enable-cache: true
|
enable-cache: true
|
||||||
|
|
@ -44,30 +44,57 @@ jobs:
|
||||||
run: bash scripts/lint.sh
|
run: bash scripts/lint.sh
|
||||||
|
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
python-version:
|
os: [ windows-latest, macos-latest ]
|
||||||
- "3.13"
|
python-version: [ "3.14" ]
|
||||||
- "3.12"
|
pydantic-version: [ "pydantic-v2" ]
|
||||||
- "3.11"
|
include:
|
||||||
- "3.10"
|
- os: macos-latest
|
||||||
- "3.9"
|
python-version: "3.8"
|
||||||
- "3.8"
|
pydantic-version: "pydantic-v1"
|
||||||
pydantic-version: ["pydantic-v1", "pydantic-v2"]
|
- os: windows-latest
|
||||||
|
python-version: "3.8"
|
||||||
|
pydantic-version: "pydantic-v2"
|
||||||
|
coverage: coverage
|
||||||
|
- os: ubuntu-latest
|
||||||
|
python-version: "3.9"
|
||||||
|
pydantic-version: "pydantic-v1"
|
||||||
|
coverage: coverage
|
||||||
|
- os: macos-latest
|
||||||
|
python-version: "3.10"
|
||||||
|
pydantic-version: "pydantic-v2"
|
||||||
|
- os: windows-latest
|
||||||
|
python-version: "3.11"
|
||||||
|
pydantic-version: "pydantic-v1"
|
||||||
|
- os: ubuntu-latest
|
||||||
|
python-version: "3.12"
|
||||||
|
pydantic-version: "pydantic-v2"
|
||||||
|
- os: macos-latest
|
||||||
|
python-version: "3.13"
|
||||||
|
pydantic-version: "pydantic-v1"
|
||||||
|
- os: windows-latest
|
||||||
|
python-version: "3.13"
|
||||||
|
pydantic-version: "pydantic-v2"
|
||||||
|
coverage: coverage
|
||||||
|
- os: ubuntu-latest
|
||||||
|
python-version: "3.14"
|
||||||
|
pydantic-version: "pydantic-v2"
|
||||||
|
coverage: coverage
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
steps:
|
steps:
|
||||||
- name: Dump GitHub context
|
- name: Dump GitHub context
|
||||||
env:
|
env:
|
||||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||||
run: echo "$GITHUB_CONTEXT"
|
run: echo "$GITHUB_CONTEXT"
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
- name: Setup uv
|
- name: Setup uv
|
||||||
uses: astral-sh/setup-uv@v6
|
uses: astral-sh/setup-uv@v7
|
||||||
with:
|
with:
|
||||||
version: "0.4.15"
|
version: "0.4.15"
|
||||||
enable-cache: true
|
enable-cache: true
|
||||||
|
|
@ -92,10 +119,12 @@ jobs:
|
||||||
env:
|
env:
|
||||||
COVERAGE_FILE: coverage/.coverage.${{ runner.os }}-py${{ matrix.python-version }}
|
COVERAGE_FILE: coverage/.coverage.${{ runner.os }}-py${{ matrix.python-version }}
|
||||||
CONTEXT: ${{ runner.os }}-py${{ matrix.python-version }}
|
CONTEXT: ${{ runner.os }}-py${{ matrix.python-version }}
|
||||||
|
# Do not store coverage for all possible combinations to avoid file size max errors in Smokeshow
|
||||||
- name: Store coverage files
|
- name: Store coverage files
|
||||||
uses: actions/upload-artifact@v4
|
if: matrix.coverage == 'coverage'
|
||||||
|
uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: coverage-${{ matrix.python-version }}-${{ matrix.pydantic-version }}
|
name: coverage-${{ runner.os }}-${{ matrix.python-version }}-${{ matrix.pydantic-version }}
|
||||||
path: coverage
|
path: coverage
|
||||||
include-hidden-files: true
|
include-hidden-files: true
|
||||||
|
|
||||||
|
|
@ -107,12 +136,12 @@ jobs:
|
||||||
env:
|
env:
|
||||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||||
run: echo "$GITHUB_CONTEXT"
|
run: echo "$GITHUB_CONTEXT"
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- uses: actions/setup-python@v6
|
- uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: '3.8'
|
python-version: '3.8'
|
||||||
- name: Setup uv
|
- name: Setup uv
|
||||||
uses: astral-sh/setup-uv@v6
|
uses: astral-sh/setup-uv@v7
|
||||||
with:
|
with:
|
||||||
version: "0.4.15"
|
version: "0.4.15"
|
||||||
enable-cache: true
|
enable-cache: true
|
||||||
|
|
@ -122,7 +151,7 @@ jobs:
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
run: uv pip install -r requirements-tests.txt
|
run: uv pip install -r requirements-tests.txt
|
||||||
- name: Get coverage files
|
- name: Get coverage files
|
||||||
uses: actions/download-artifact@v5
|
uses: actions/download-artifact@v6
|
||||||
with:
|
with:
|
||||||
pattern: coverage-*
|
pattern: coverage-*
|
||||||
path: coverage
|
path: coverage
|
||||||
|
|
@ -132,7 +161,7 @@ jobs:
|
||||||
- run: coverage report
|
- run: coverage report
|
||||||
- run: coverage html --title "Coverage for ${{ github.sha }}"
|
- run: coverage html --title "Coverage for ${{ github.sha }}"
|
||||||
- name: Store coverage HTML
|
- name: Store coverage HTML
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v5
|
||||||
with:
|
with:
|
||||||
name: coverage-html
|
name: coverage-html
|
||||||
path: htmlcov
|
path: htmlcov
|
||||||
|
|
|
||||||
|
|
@ -19,13 +19,13 @@ jobs:
|
||||||
env:
|
env:
|
||||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||||
run: echo "$GITHUB_CONTEXT"
|
run: echo "$GITHUB_CONTEXT"
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: "3.11"
|
python-version: "3.11"
|
||||||
- name: Setup uv
|
- name: Setup uv
|
||||||
uses: astral-sh/setup-uv@v6
|
uses: astral-sh/setup-uv@v7
|
||||||
with:
|
with:
|
||||||
version: "0.4.15"
|
version: "0.4.15"
|
||||||
enable-cache: true
|
enable-cache: true
|
||||||
|
|
|
||||||
|
|
@ -42,13 +42,13 @@ jobs:
|
||||||
env:
|
env:
|
||||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||||
run: echo "$GITHUB_CONTEXT"
|
run: echo "$GITHUB_CONTEXT"
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v6
|
||||||
with:
|
with:
|
||||||
python-version: "3.11"
|
python-version: "3.11"
|
||||||
- name: Setup uv
|
- name: Setup uv
|
||||||
uses: astral-sh/setup-uv@v6
|
uses: astral-sh/setup-uv@v7
|
||||||
with:
|
with:
|
||||||
version: "0.4.15"
|
version: "0.4.15"
|
||||||
enable-cache: true
|
enable-cache: true
|
||||||
|
|
|
||||||
|
|
@ -28,3 +28,6 @@ archive.zip
|
||||||
|
|
||||||
# macOS
|
# macOS
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
|
# Ignore while the setup still depends on requirements.txt files
|
||||||
|
uv.lock
|
||||||
|
|
|
||||||
|
|
@ -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.2
|
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$
|
||||||
|
|
|
||||||
67
README.md
67
README.md
|
|
@ -40,11 +40,16 @@ The key features are:
|
||||||
* **Robust**: Get production-ready code. With automatic interactive documentation.
|
* **Robust**: Get production-ready code. With automatic interactive documentation.
|
||||||
* **Standards-based**: Based on (and fully compatible with) the open standards for APIs: <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a> (previously known as Swagger) and <a href="https://json-schema.org/" class="external-link" target="_blank">JSON Schema</a>.
|
* **Standards-based**: Based on (and fully compatible with) the open standards for APIs: <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a> (previously known as Swagger) and <a href="https://json-schema.org/" class="external-link" target="_blank">JSON Schema</a>.
|
||||||
|
|
||||||
<small>* estimation based on tests on an internal development team, building production applications.</small>
|
<small>* estimation based on tests conducted by an internal development team, building production applications.</small>
|
||||||
|
|
||||||
## Sponsors
|
## Sponsors
|
||||||
|
|
||||||
<!-- sponsors -->
|
<!-- sponsors -->
|
||||||
|
### Keystone Sponsor
|
||||||
|
|
||||||
|
<a href="https://fastapicloud.com" target="_blank" title="FastAPI Cloud. By the same team behind FastAPI. You code. We Cloud."><img src="https://fastapi.tiangolo.com/img/sponsors/fastapicloud.png"></a>
|
||||||
|
|
||||||
|
### Gold and Silver Sponsors
|
||||||
|
|
||||||
<a href="https://blockbee.io?ref=fastapi" target="_blank" title="BlockBee Cryptocurrency Payment Gateway"><img src="https://fastapi.tiangolo.com/img/sponsors/blockbee.png"></a>
|
<a href="https://blockbee.io?ref=fastapi" target="_blank" title="BlockBee Cryptocurrency Payment Gateway"><img src="https://fastapi.tiangolo.com/img/sponsors/blockbee.png"></a>
|
||||||
<a href="https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge" target="_blank" title="Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files"><img src="https://fastapi.tiangolo.com/img/sponsors/scalar.svg"></a>
|
<a href="https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge" target="_blank" title="Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files"><img src="https://fastapi.tiangolo.com/img/sponsors/scalar.svg"></a>
|
||||||
|
|
@ -55,6 +60,8 @@ The key features are:
|
||||||
<a href="https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=badge&utm_campaign=fastapi" target="_blank" title="Cut Code Review Time & Bugs in Half with CodeRabbit"><img src="https://fastapi.tiangolo.com/img/sponsors/coderabbit.png"></a>
|
<a href="https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=badge&utm_campaign=fastapi" target="_blank" title="Cut Code Review Time & Bugs in Half with CodeRabbit"><img src="https://fastapi.tiangolo.com/img/sponsors/coderabbit.png"></a>
|
||||||
<a href="https://subtotal.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=open-source" target="_blank" title="The Gold Standard in Retail Account Linking"><img src="https://fastapi.tiangolo.com/img/sponsors/subtotal.svg"></a>
|
<a href="https://subtotal.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=open-source" target="_blank" title="The Gold Standard in Retail Account Linking"><img src="https://fastapi.tiangolo.com/img/sponsors/subtotal.svg"></a>
|
||||||
<a href="https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi" target="_blank" title="Deploy enterprise applications at startup speed"><img src="https://fastapi.tiangolo.com/img/sponsors/railway.png"></a>
|
<a href="https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi" target="_blank" title="Deploy enterprise applications at startup speed"><img src="https://fastapi.tiangolo.com/img/sponsors/railway.png"></a>
|
||||||
|
<a href="https://serpapi.com/?utm_source=fastapi_website" target="_blank" title="SerpApi: Web Search API"><img src="https://fastapi.tiangolo.com/img/sponsors/serpapi.png"></a>
|
||||||
|
<a href="https://www.greptile.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=fastapi_sponsor_page" target="_blank" title="Greptile: The AI Code Reviewer"><img src="https://fastapi.tiangolo.com/img/sponsors/greptile.png"></a>
|
||||||
<a href="https://databento.com/?utm_source=fastapi&utm_medium=sponsor&utm_content=display" target="_blank" title="Pay as you go for market data"><img src="https://fastapi.tiangolo.com/img/sponsors/databento.svg"></a>
|
<a href="https://databento.com/?utm_source=fastapi&utm_medium=sponsor&utm_content=display" target="_blank" title="Pay as you go for market data"><img src="https://fastapi.tiangolo.com/img/sponsors/databento.svg"></a>
|
||||||
<a href="https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship" target="_blank" title="SDKs for your API | Speakeasy"><img src="https://fastapi.tiangolo.com/img/sponsors/speakeasy.png"></a>
|
<a href="https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship" target="_blank" title="SDKs for your API | Speakeasy"><img src="https://fastapi.tiangolo.com/img/sponsors/speakeasy.png"></a>
|
||||||
<a href="https://www.svix.com/" target="_blank" title="Svix - Webhooks as a service"><img src="https://fastapi.tiangolo.com/img/sponsors/svix.svg"></a>
|
<a href="https://www.svix.com/" target="_blank" title="Svix - Webhooks as a service"><img src="https://fastapi.tiangolo.com/img/sponsors/svix.svg"></a>
|
||||||
|
|
@ -125,7 +132,7 @@ If you are building a <abbr title="Command Line Interface">CLI</abbr> app to be
|
||||||
|
|
||||||
FastAPI stands on the shoulders of giants:
|
FastAPI stands on the shoulders of giants:
|
||||||
|
|
||||||
* <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a> for the web parts.
|
* <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a> for the web parts.
|
||||||
* <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> for the data parts.
|
* <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> for the data parts.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
@ -231,7 +238,7 @@ INFO: Application startup complete.
|
||||||
<details markdown="1">
|
<details markdown="1">
|
||||||
<summary>About the command <code>fastapi dev main.py</code>...</summary>
|
<summary>About the command <code>fastapi dev main.py</code>...</summary>
|
||||||
|
|
||||||
The command `fastapi dev` reads your `main.py` file, detects the **FastAPI** app in it, and starts a server using <a href="https://www.uvicorn.org" class="external-link" target="_blank">Uvicorn</a>.
|
The command `fastapi dev` reads your `main.py` file, detects the **FastAPI** app in it, and starts a server using <a href="https://www.uvicorn.dev" class="external-link" target="_blank">Uvicorn</a>.
|
||||||
|
|
||||||
By default, `fastapi dev` will start with auto-reload enabled for local development.
|
By default, `fastapi dev` will start with auto-reload enabled for local development.
|
||||||
|
|
||||||
|
|
@ -446,6 +453,58 @@ For a more complete example including more features, see the <a href="https://fa
|
||||||
* **Cookie Sessions**
|
* **Cookie Sessions**
|
||||||
* ...and more.
|
* ...and more.
|
||||||
|
|
||||||
|
### Deploy your app (optional)
|
||||||
|
|
||||||
|
You can optionally deploy your FastAPI app to <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>, go and join the waiting list if you haven't. 🚀
|
||||||
|
|
||||||
|
If you already have a **FastAPI Cloud** account (we invited you from the waiting list 😉), you can deploy your application with one command.
|
||||||
|
|
||||||
|
Before deploying, make sure you are logged in:
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ fastapi login
|
||||||
|
|
||||||
|
You are logged in to FastAPI Cloud 🚀
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Then deploy your app:
|
||||||
|
|
||||||
|
<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
|
||||||
|
|
||||||
|
**<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. 🎉
|
||||||
|
|
||||||
|
FastAPI Cloud is the primary sponsor and funding provider for the *FastAPI and friends* open source projects. ✨
|
||||||
|
|
||||||
|
#### 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. 🤓
|
||||||
|
|
||||||
## Performance
|
## Performance
|
||||||
|
|
||||||
Independent TechEmpower benchmarks show **FastAPI** applications running under Uvicorn as <a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">one of the fastest Python frameworks available</a>, only below Starlette and Uvicorn themselves (used internally by FastAPI). (*)
|
Independent TechEmpower benchmarks show **FastAPI** applications running under Uvicorn as <a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">one of the fastest Python frameworks available</a>, only below Starlette and Uvicorn themselves (used internally by FastAPI). (*)
|
||||||
|
|
@ -472,7 +531,7 @@ Used by Starlette:
|
||||||
|
|
||||||
Used by FastAPI:
|
Used by FastAPI:
|
||||||
|
|
||||||
* <a href="https://www.uvicorn.org" target="_blank"><code>uvicorn</code></a> - for the server that loads and serves your application. This includes `uvicorn[standard]`, which includes some dependencies (e.g. `uvloop`) needed for high performance serving.
|
* <a href="https://www.uvicorn.dev" target="_blank"><code>uvicorn</code></a> - for the server that loads and serves your application. This includes `uvicorn[standard]`, which includes some dependencies (e.g. `uvloop`) needed for high performance serving.
|
||||||
* `fastapi-cli[standard]` - to provide the `fastapi` command.
|
* `fastapi-cli[standard]` - to provide the `fastapi` command.
|
||||||
* This includes `fastapi-cloud-cli`, which allows you to deploy your FastAPI application to <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>.
|
* This includes `fastapi-cloud-cli`, which allows you to deploy your FastAPI application to <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ Das LLM wird dies wahrscheinlich falsch übersetzen. Interessant ist nur, ob es
|
||||||
|
|
||||||
//// tab | Info
|
//// tab | Info
|
||||||
|
|
||||||
Der Prompt-Designer kann entscheiden, ob neutrale Anführungszeichen in typografische Anführungszeichen umgewandelt werden sollen. Es ist in Ordnung, sie unverändert zu lassen.
|
Der Promptdesigner kann entscheiden, ob neutrale Anführungszeichen in typografische Anführungszeichen umgewandelt werden sollen. Es ist in Ordnung, sie unverändert zu lassen.
|
||||||
|
|
||||||
Siehe zum Beispiel den Abschnitt `### Quotes` in `docs/de/llm-prompt.md`.
|
Siehe zum Beispiel den Abschnitt `### Quotes` in `docs/de/llm-prompt.md`.
|
||||||
|
|
||||||
|
|
@ -443,7 +443,7 @@ Für einige sprachspezifische Anweisungen, siehe z. B. den Abschnitt `### Headin
|
||||||
* die Workload
|
* die Workload
|
||||||
|
|
||||||
* das Deployment
|
* das Deployment
|
||||||
* bereitstellen
|
* deployen
|
||||||
|
|
||||||
* das SDK
|
* das SDK
|
||||||
* das Software Development Kit
|
* das Software Development Kit
|
||||||
|
|
@ -459,7 +459,7 @@ Für einige sprachspezifische Anweisungen, siehe z. B. den Abschnitt `### Headin
|
||||||
* der Commit
|
* der Commit
|
||||||
* der Contextmanager
|
* der Contextmanager
|
||||||
* die Coroutine
|
* die Coroutine
|
||||||
* die Datenbank-Session
|
* die Datenbanksession
|
||||||
* die Festplatte
|
* die Festplatte
|
||||||
* die Domain
|
* die Domain
|
||||||
* die Engine
|
* die Engine
|
||||||
|
|
@ -496,7 +496,7 @@ Für einige sprachspezifische Anweisungen, siehe z. B. den Abschnitt `### Headin
|
||||||
|
|
||||||
//// tab | Info
|
//// tab | Info
|
||||||
|
|
||||||
Dies ist eine nicht vollständige und nicht normative Liste von (meist) technischen Begriffen, die in der Dokumentation vorkommen. Sie kann dem Prompt-Designer helfen herauszufinden, bei welchen Begriffen das LLM Unterstützung braucht. Zum Beispiel, wenn es eine gute Übersetzung immer wieder auf eine suboptimale Übersetzung zurücksetzt. Oder wenn es Probleme hat, einen Begriff in Ihrer Sprache zu konjugieren/deklinieren.
|
Dies ist eine nicht vollständige und nicht normative Liste von (meist) technischen Begriffen, die in der Dokumentation vorkommen. Sie kann dem Promptdesigner helfen herauszufinden, bei welchen Begriffen das LLM Unterstützung braucht. Zum Beispiel, wenn es eine gute Übersetzung immer wieder auf eine suboptimale Übersetzung zurücksetzt. Oder wenn es Probleme hat, einen Begriff in Ihrer Sprache zu konjugieren/deklinieren.
|
||||||
|
|
||||||
Siehe z. B. den Abschnitt `### List of English terms and their preferred German translations` in `docs/de/llm-prompt.md`.
|
Siehe z. B. den Abschnitt `### List of English terms and their preferred German translations` in `docs/de/llm-prompt.md`.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -175,7 +175,7 @@ Sie können denselben `responses`-Parameter verwenden, um verschiedene Medientyp
|
||||||
|
|
||||||
Sie können beispielsweise einen zusätzlichen Medientyp `image/png` hinzufügen und damit deklarieren, dass Ihre *Pfadoperation* ein JSON-Objekt (mit dem Medientyp `application/json`) oder ein PNG-Bild zurückgeben kann:
|
Sie können beispielsweise einen zusätzlichen Medientyp `image/png` hinzufügen und damit deklarieren, dass Ihre *Pfadoperation* ein JSON-Objekt (mit dem Medientyp `application/json`) oder ein PNG-Bild zurückgeben kann:
|
||||||
|
|
||||||
{* ../../docs_src/additional_responses/tutorial002.py hl[19:24,28] *}
|
{* ../../docs_src/additional_responses/tutorial002_py310.py hl[17:22,26] *}
|
||||||
|
|
||||||
/// note | Hinweis
|
/// note | Hinweis
|
||||||
|
|
||||||
|
|
@ -237,7 +237,7 @@ Mit dieser Technik können Sie einige vordefinierte Responses in Ihren *Pfadoper
|
||||||
|
|
||||||
Zum Beispiel:
|
Zum Beispiel:
|
||||||
|
|
||||||
{* ../../docs_src/additional_responses/tutorial004.py hl[13:17,26] *}
|
{* ../../docs_src/additional_responses/tutorial004_py310.py hl[11:15,24] *}
|
||||||
|
|
||||||
## Weitere Informationen zu OpenAPI-Responses { #more-information-about-openapi-responses }
|
## Weitere Informationen zu OpenAPI-Responses { #more-information-about-openapi-responses }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -70,12 +70,22 @@ Wenn Sie das hier alles verstanden haben, wissen Sie bereits, wie diese Sicherhe
|
||||||
|
|
||||||
Sie benötigen diese technischen Details höchstwahrscheinlich nicht.
|
Sie benötigen diese technischen Details höchstwahrscheinlich nicht.
|
||||||
|
|
||||||
Diese Details sind hauptsächlich nützlich, wenn Sie eine FastAPI-Anwendung haben, die älter als 0.118.0 ist, und Sie auf Probleme mit Abhängigkeiten mit `yield` stoßen.
|
Diese Details sind hauptsächlich nützlich, wenn Sie eine FastAPI-Anwendung haben, die älter als 0.121.0 ist, und Sie auf Probleme mit Abhängigkeiten mit `yield` stoßen.
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
Abhängigkeiten mit `yield` haben sich im Laufe der Zeit weiterentwickelt, um verschiedene Anwendungsfälle abzudecken und einige Probleme zu beheben, hier ist eine Zusammenfassung der Änderungen.
|
Abhängigkeiten mit `yield` haben sich im Laufe der Zeit weiterentwickelt, um verschiedene Anwendungsfälle abzudecken und einige Probleme zu beheben, hier ist eine Zusammenfassung der Änderungen.
|
||||||
|
|
||||||
|
### Abhängigkeiten mit `yield` und `scope` { #dependencies-with-yield-and-scope }
|
||||||
|
|
||||||
|
In Version 0.121.0 hat FastAPI Unterstützung für `Depends(scope="function")` für Abhängigkeiten mit `yield` hinzugefügt.
|
||||||
|
|
||||||
|
Mit `Depends(scope="function")` wird der Exit-Code nach `yield` direkt nach dem Ende der *Pfadoperation-Funktion* ausgeführt, bevor die Response an den Client gesendet wird.
|
||||||
|
|
||||||
|
Und bei Verwendung von `Depends(scope="request")` (dem Default) wird der Exit-Code nach `yield` ausgeführt, nachdem die Response gesendet wurde.
|
||||||
|
|
||||||
|
Mehr dazu finden Sie in der Dokumentation zu [Abhängigkeiten mit `yield` – Frühes Beenden und `scope`](../tutorial/dependencies/dependencies-with-yield.md#early-exit-and-scope).
|
||||||
|
|
||||||
### Abhängigkeiten mit `yield` und `StreamingResponse`, Technische Details { #dependencies-with-yield-and-streamingresponse-technical-details }
|
### Abhängigkeiten mit `yield` und `StreamingResponse`, Technische Details { #dependencies-with-yield-and-streamingresponse-technical-details }
|
||||||
|
|
||||||
Vor FastAPI 0.118.0 wurde bei Verwendung einer Abhängigkeit mit `yield` der Exit-Code nach der *Pfadoperation-Funktion* ausgeführt, aber unmittelbar bevor die Response gesendet wurde.
|
Vor FastAPI 0.118.0 wurde bei Verwendung einer Abhängigkeit mit `yield` der Exit-Code nach der *Pfadoperation-Funktion* ausgeführt, aber unmittelbar bevor die Response gesendet wurde.
|
||||||
|
|
@ -134,7 +144,7 @@ Dies wurde in Version 0.110.0 geändert, um unbehandelten Speicherverbrauch durc
|
||||||
|
|
||||||
### Hintergrundtasks und Abhängigkeiten mit `yield`, Technische Details { #background-tasks-and-dependencies-with-yield-technical-details }
|
### Hintergrundtasks und Abhängigkeiten mit `yield`, Technische Details { #background-tasks-and-dependencies-with-yield-technical-details }
|
||||||
|
|
||||||
Vor FastAPI 0.106.0 war das Werfen von Exceptions nach `yield` nicht möglich, der Exit-Code in Abhängigkeiten mit `yield` wurde ausgeführt, nachdem die Response gesendet wurde, sodass [Exceptionhandler](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank} bereits ausgeführt worden wären.
|
Vor FastAPI 0.106.0 war das Werfen von Exceptions nach `yield` nicht möglich, der Exit-Code in Abhängigkeiten mit `yield` wurde ausgeführt, nachdem die Response gesendet wurde, sodass [Exceptionhandler](../tutorial/handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank} bereits ausgeführt worden wären.
|
||||||
|
|
||||||
Dies war so designt, hauptsächlich um die Verwendung derselben von Abhängigkeiten „geyieldeten“ Objekte in Hintergrundtasks zu ermöglichen, da der Exit-Code erst ausgeführt wurde, nachdem die Hintergrundtasks abgeschlossen waren.
|
Dies war so designt, hauptsächlich um die Verwendung derselben von Abhängigkeiten „geyieldeten“ Objekte in Hintergrundtasks zu ermöglichen, da der Exit-Code erst ausgeführt wurde, nachdem die Hintergrundtasks abgeschlossen waren.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ Wenn Sie mehr über HTTPS erfahren möchten, lesen Sie den Leitfaden [Über HTTP
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
### Wie Proxy-Forwarded-Header funktionieren
|
### Wie Proxy-Forwarded-Header funktionieren { #how-proxy-forwarded-headers-work }
|
||||||
|
|
||||||
Hier ist eine visuelle Darstellung, wie der **Proxy** weitergeleitete Header zwischen dem Client und dem **Anwendungsserver** hinzufügt:
|
Hier ist eine visuelle Darstellung, wie der **Proxy** weitergeleitete Header zwischen dem Client und dem **Anwendungsserver** hinzufügt:
|
||||||
|
|
||||||
|
|
@ -228,7 +228,7 @@ Die Übergabe des `root_path` an `FastAPI` wäre das Äquivalent zur Übergabe d
|
||||||
|
|
||||||
Beachten Sie, dass der Server (Uvicorn) diesen `root_path` für nichts anderes verwendet als für die Weitergabe an die Anwendung.
|
Beachten Sie, dass der Server (Uvicorn) diesen `root_path` für nichts anderes verwendet als für die Weitergabe an die Anwendung.
|
||||||
|
|
||||||
Aber wenn Sie mit Ihrem Browser auf <a href="http://127.0.0.1:8000" class="external-link" target="_blank">http://127.0.0.1:8000/app</a> gehen, sehen Sie die normale Response:
|
Aber wenn Sie mit Ihrem Browser auf <a href="http://127.0.0.1:8000/app" class="external-link" target="_blank">http://127.0.0.1:8000/app</a> gehen, sehen Sie die normale Response:
|
||||||
|
|
||||||
```JSON
|
```JSON
|
||||||
{
|
{
|
||||||
|
|
@ -443,6 +443,14 @@ Die Dokumentationsoberfläche interagiert mit dem von Ihnen ausgewählten Server
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
|
/// note | Technische Details
|
||||||
|
|
||||||
|
Die Eigenschaft `servers` in der OpenAPI-Spezifikation ist optional.
|
||||||
|
|
||||||
|
Wenn Sie den Parameter `servers` nicht angeben und `root_path` den Wert `/` hat, wird die Eigenschaft `servers` im generierten OpenAPI-Schema standardmäßig vollständig weggelassen, was dem Äquivalent eines einzelnen Servers mit einem `url`-Wert von `/` entspricht.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
### Den automatischen Server von `root_path` deaktivieren { #disable-automatic-server-from-root-path }
|
### Den automatischen Server von `root_path` deaktivieren { #disable-automatic-server-from-root-path }
|
||||||
|
|
||||||
Wenn Sie nicht möchten, dass **FastAPI** einen automatischen Server inkludiert, welcher `root_path` verwendet, können Sie den Parameter `root_path_in_servers=False` verwenden:
|
Wenn Sie nicht möchten, dass **FastAPI** einen automatischen Server inkludiert, welcher `root_path` verwendet, können Sie den Parameter `root_path_in_servers=False` verwenden:
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ FastAPI basiert auf **Pydantic**, und ich habe Ihnen gezeigt, wie Sie Pydantic-M
|
||||||
|
|
||||||
Aber FastAPI unterstützt auf die gleiche Weise auch die Verwendung von <a href="https://docs.python.org/3/library/dataclasses.html" class="external-link" target="_blank">`dataclasses`</a>:
|
Aber FastAPI unterstützt auf die gleiche Weise auch die Verwendung von <a href="https://docs.python.org/3/library/dataclasses.html" class="external-link" target="_blank">`dataclasses`</a>:
|
||||||
|
|
||||||
{* ../../docs_src/dataclasses/tutorial001.py hl[1,7:12,19:20] *}
|
{* ../../docs_src/dataclasses/tutorial001_py310.py hl[1,6:11,18:19] *}
|
||||||
|
|
||||||
Das ist dank **Pydantic** ebenfalls möglich, da es <a href="https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel" class="external-link" target="_blank">`dataclasses` intern unterstützt</a>.
|
Das ist dank **Pydantic** ebenfalls möglich, da es <a href="https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel" class="external-link" target="_blank">`dataclasses` intern unterstützt</a>.
|
||||||
|
|
||||||
|
|
@ -32,7 +32,7 @@ Wenn Sie jedoch eine Menge Datenklassen herumliegen haben, ist dies ein guter Tr
|
||||||
|
|
||||||
Sie können `dataclasses` auch im Parameter `response_model` verwenden:
|
Sie können `dataclasses` auch im Parameter `response_model` verwenden:
|
||||||
|
|
||||||
{* ../../docs_src/dataclasses/tutorial002.py hl[1,7:13,19] *}
|
{* ../../docs_src/dataclasses/tutorial002_py310.py hl[1,6:12,18] *}
|
||||||
|
|
||||||
Die Datenklasse wird automatisch in eine Pydantic-Datenklasse konvertiert.
|
Die Datenklasse wird automatisch in eine Pydantic-Datenklasse konvertiert.
|
||||||
|
|
||||||
|
|
@ -48,7 +48,7 @@ In einigen Fällen müssen Sie möglicherweise immer noch Pydantics Version von
|
||||||
|
|
||||||
In diesem Fall können Sie einfach die Standard-`dataclasses` durch `pydantic.dataclasses` ersetzen, was einen direkten Ersatz darstellt:
|
In diesem Fall können Sie einfach die Standard-`dataclasses` durch `pydantic.dataclasses` ersetzen, was einen direkten Ersatz darstellt:
|
||||||
|
|
||||||
{* ../../docs_src/dataclasses/tutorial003.py hl[1,5,8:11,14:17,23:25,28] *}
|
{* ../../docs_src/dataclasses/tutorial003_py310.py hl[1,4,7:10,13:16,22:24,27] *}
|
||||||
|
|
||||||
1. Wir importieren `field` weiterhin von Standard-`dataclasses`.
|
1. Wir importieren `field` weiterhin von Standard-`dataclasses`.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -154,7 +154,7 @@ In der technischen ASGI-Spezifikation ist dies Teil des <a href="https://asgi.re
|
||||||
|
|
||||||
/// info | Info
|
/// info | Info
|
||||||
|
|
||||||
Weitere Informationen zu Starlettes `lifespan`-Handlern finden Sie in <a href="https://www.starlette.io/lifespan/" class="external-link" target="_blank">Starlettes Lifespan-Dokumentation</a>.
|
Weitere Informationen zu Starlettes `lifespan`-Handlern finden Sie in <a href="https://www.starlette.dev/lifespan/" class="external-link" target="_blank">Starlettes Lifespan-Dokumentation</a>.
|
||||||
|
|
||||||
Einschließlich, wie man Lifespan-Zustand handhabt, der in anderen Bereichen Ihres Codes verwendet werden kann.
|
Einschließlich, wie man Lifespan-Zustand handhabt, der in anderen Bereichen Ihres Codes verwendet werden kann.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -94,4 +94,4 @@ Zum Beispiel:
|
||||||
* <a href="https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py" class="external-link" target="_blank">Uvicorns `ProxyHeadersMiddleware`</a>
|
* <a href="https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py" class="external-link" target="_blank">Uvicorns `ProxyHeadersMiddleware`</a>
|
||||||
* <a href="https://github.com/florimondmanca/msgpack-asgi" class="external-link" target="_blank">MessagePack</a>
|
* <a href="https://github.com/florimondmanca/msgpack-asgi" class="external-link" target="_blank">MessagePack</a>
|
||||||
|
|
||||||
Um mehr über weitere verfügbare Middlewares herauszufinden, besuchen Sie <a href="https://www.starlette.io/middleware/" class="external-link" target="_blank">Starlettes Middleware-Dokumentation</a> und die <a href="https://github.com/florimondmanca/awesome-asgi" class="external-link" target="_blank">ASGI Awesome List</a>.
|
Um mehr über weitere verfügbare Middlewares herauszufinden, besuchen Sie <a href="https://www.starlette.dev/middleware/" class="external-link" target="_blank">Starlettes Middleware-Dokumentation</a> und die <a href="https://github.com/florimondmanca/awesome-asgi" class="external-link" target="_blank">ASGI Awesome List</a>.
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ Sie verfügt über eine *Pfadoperation*, die einen `Invoice`-Body empfängt, und
|
||||||
|
|
||||||
Dieser Teil ist ziemlich normal, der größte Teil des Codes ist Ihnen wahrscheinlich bereits bekannt:
|
Dieser Teil ist ziemlich normal, der größte Teil des Codes ist Ihnen wahrscheinlich bereits bekannt:
|
||||||
|
|
||||||
{* ../../docs_src/openapi_callbacks/tutorial001.py hl[9:13,36:53] *}
|
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[7:11,34:51] *}
|
||||||
|
|
||||||
/// tip | Tipp
|
/// tip | Tipp
|
||||||
|
|
||||||
|
|
@ -90,7 +90,7 @@ Wenn Sie diese Sichtweise (des *externen Entwicklers*) vorübergehend übernehme
|
||||||
|
|
||||||
Erstellen Sie zunächst einen neuen `APIRouter`, der einen oder mehrere Callbacks enthält.
|
Erstellen Sie zunächst einen neuen `APIRouter`, der einen oder mehrere Callbacks enthält.
|
||||||
|
|
||||||
{* ../../docs_src/openapi_callbacks/tutorial001.py hl[3,25] *}
|
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[1,23] *}
|
||||||
|
|
||||||
### Die Callback-*Pfadoperation* erstellen { #create-the-callback-path-operation }
|
### Die Callback-*Pfadoperation* erstellen { #create-the-callback-path-operation }
|
||||||
|
|
||||||
|
|
@ -101,7 +101,7 @@ Sie sollte wie eine normale FastAPI-*Pfadoperation* aussehen:
|
||||||
* Sie sollte wahrscheinlich eine Deklaration des Bodys enthalten, die sie erhalten soll, z. B. `body: InvoiceEvent`.
|
* Sie sollte wahrscheinlich eine Deklaration des Bodys enthalten, die sie erhalten soll, z. B. `body: InvoiceEvent`.
|
||||||
* Und sie könnte auch eine Deklaration der Response enthalten, die zurückgegeben werden soll, z. B. `response_model=InvoiceEventReceived`.
|
* Und sie könnte auch eine Deklaration der Response enthalten, die zurückgegeben werden soll, z. B. `response_model=InvoiceEventReceived`.
|
||||||
|
|
||||||
{* ../../docs_src/openapi_callbacks/tutorial001.py hl[16:18,21:22,28:32] *}
|
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[14:16,19:20,26:30] *}
|
||||||
|
|
||||||
Es gibt zwei Hauptunterschiede zu einer normalen *Pfadoperation*:
|
Es gibt zwei Hauptunterschiede zu einer normalen *Pfadoperation*:
|
||||||
|
|
||||||
|
|
@ -169,7 +169,7 @@ An diesem Punkt haben Sie die benötigte(n) *Callback-Pfadoperation(en)* (diejen
|
||||||
|
|
||||||
Verwenden Sie nun den Parameter `callbacks` im *Pfadoperation-Dekorator Ihrer API*, um das Attribut `.routes` (das ist eigentlich nur eine `list`e von Routen/*Pfadoperationen*) dieses Callback-Routers zu übergeben:
|
Verwenden Sie nun den Parameter `callbacks` im *Pfadoperation-Dekorator Ihrer API*, um das Attribut `.routes` (das ist eigentlich nur eine `list`e von Routen/*Pfadoperationen*) dieses Callback-Routers zu übergeben:
|
||||||
|
|
||||||
{* ../../docs_src/openapi_callbacks/tutorial001.py hl[35] *}
|
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
|
||||||
|
|
||||||
/// tip | Tipp
|
/// tip | Tipp
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ Das Hinzufügen eines `\f` (ein maskiertes „Form Feed“-Zeichen) führt dazu,
|
||||||
|
|
||||||
Sie wird nicht in der Dokumentation angezeigt, aber andere Tools (z. B. Sphinx) können den Rest verwenden.
|
Sie wird nicht in der Dokumentation angezeigt, aber andere Tools (z. B. Sphinx) können den Rest verwenden.
|
||||||
|
|
||||||
{* ../../docs_src/path_operation_advanced_configuration/tutorial004.py hl[19:29] *}
|
{* ../../docs_src/path_operation_advanced_configuration/tutorial004_py310.py hl[17:27] *}
|
||||||
|
|
||||||
## Zusätzliche Responses { #additional-responses }
|
## Zusätzliche Responses { #additional-responses }
|
||||||
|
|
||||||
|
|
@ -155,13 +155,13 @@ In der folgenden Anwendung verwenden wir beispielsweise weder die integrierte Fu
|
||||||
|
|
||||||
//// tab | Pydantic v2
|
//// tab | Pydantic v2
|
||||||
|
|
||||||
{* ../../docs_src/path_operation_advanced_configuration/tutorial007.py hl[17:22, 24] *}
|
{* ../../docs_src/path_operation_advanced_configuration/tutorial007_py39.py hl[15:20, 22] *}
|
||||||
|
|
||||||
////
|
////
|
||||||
|
|
||||||
//// tab | Pydantic v1
|
//// tab | Pydantic v1
|
||||||
|
|
||||||
{* ../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py hl[17:22, 24] *}
|
{* ../../docs_src/path_operation_advanced_configuration/tutorial007_pv1_py39.py hl[15:20, 22] *}
|
||||||
|
|
||||||
////
|
////
|
||||||
|
|
||||||
|
|
@ -179,13 +179,13 @@ Und dann parsen wir in unserem Code diesen YAML-Inhalt direkt und verwenden dann
|
||||||
|
|
||||||
//// tab | Pydantic v2
|
//// tab | Pydantic v2
|
||||||
|
|
||||||
{* ../../docs_src/path_operation_advanced_configuration/tutorial007.py hl[26:33] *}
|
{* ../../docs_src/path_operation_advanced_configuration/tutorial007_py39.py hl[24:31] *}
|
||||||
|
|
||||||
////
|
////
|
||||||
|
|
||||||
//// tab | Pydantic v1
|
//// tab | Pydantic v1
|
||||||
|
|
||||||
{* ../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py hl[26:33] *}
|
{* ../../docs_src/path_operation_advanced_configuration/tutorial007_pv1_py39.py hl[24:31] *}
|
||||||
|
|
||||||
////
|
////
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,4 +48,4 @@ Und da die `Response` häufig zum Setzen von Headern und Cookies verwendet wird,
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
Um alle verfügbaren Parameter und Optionen anzuzeigen, sehen Sie sich deren <a href="https://www.starlette.io/responses/#set-cookie" class="external-link" target="_blank">Dokumentation in Starlette</a> an.
|
Um alle verfügbaren Parameter und Optionen anzuzeigen, sehen Sie sich deren <a href="https://www.starlette.dev/responses/#set-cookie" class="external-link" target="_blank">Dokumentation in Starlette</a> an.
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ Sie können beispielsweise kein Pydantic-Modell in eine `JSONResponse` einfügen
|
||||||
|
|
||||||
In diesen Fällen können Sie den `jsonable_encoder` verwenden, um Ihre Daten zu konvertieren, bevor Sie sie an eine Response übergeben:
|
In diesen Fällen können Sie den `jsonable_encoder` verwenden, um Ihre Daten zu konvertieren, bevor Sie sie an eine Response übergeben:
|
||||||
|
|
||||||
{* ../../docs_src/response_directly/tutorial001.py hl[6:7,21:22] *}
|
{* ../../docs_src/response_directly/tutorial001_py310.py hl[5:6,20:21] *}
|
||||||
|
|
||||||
/// note | Technische Details
|
/// note | Technische Details
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -38,4 +38,4 @@ Und da die `Response` häufig zum Setzen von Headern und Cookies verwendet wird,
|
||||||
|
|
||||||
Beachten Sie, dass benutzerdefinierte proprietäre Header <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">mittels des Präfix `X-`</a> hinzugefügt werden können.
|
Beachten Sie, dass benutzerdefinierte proprietäre Header <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">mittels des Präfix `X-`</a> hinzugefügt werden können.
|
||||||
|
|
||||||
Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen können soll, müssen Sie diese zu Ihrer CORS-Konfiguration hinzufügen (weitere Informationen finden Sie unter [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank}), unter Verwendung des Parameters `expose_headers`, dokumentiert in <a href="https://www.starlette.io/middleware/#corsmiddleware" class="external-link" target="_blank">Starlettes CORS-Dokumentation</a>.
|
Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen können soll, müssen Sie diese zu Ihrer CORS-Konfiguration hinzufügen (weitere Informationen finden Sie unter [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank}), unter Verwendung des Parameters `expose_headers`, dokumentiert in <a href="https://www.starlette.dev/middleware/#corsmiddleware" class="external-link" target="_blank">Starlettes CORS-Dokumentation</a>.
|
||||||
|
|
|
||||||
|
|
@ -148,7 +148,7 @@ Dies könnte besonders beim Testen nützlich sein, da es sehr einfach ist, eine
|
||||||
|
|
||||||
Ausgehend vom vorherigen Beispiel könnte Ihre Datei `config.py` so aussehen:
|
Ausgehend vom vorherigen Beispiel könnte Ihre Datei `config.py` so aussehen:
|
||||||
|
|
||||||
{* ../../docs_src/settings/app02/config.py hl[10] *}
|
{* ../../docs_src/settings/app02_an_py39/config.py hl[10] *}
|
||||||
|
|
||||||
Beachten Sie, dass wir jetzt keine Standardinstanz `settings = Settings()` erstellen.
|
Beachten Sie, dass wir jetzt keine Standardinstanz `settings = Settings()` erstellen.
|
||||||
|
|
||||||
|
|
@ -174,7 +174,7 @@ Und dann können wir das von der *Pfadoperation-Funktion* als Abhängigkeit einf
|
||||||
|
|
||||||
Dann wäre es sehr einfach, beim Testen ein anderes Einstellungsobjekt bereitzustellen, indem man eine Abhängigkeitsüberschreibung für `get_settings` erstellt:
|
Dann wäre es sehr einfach, beim Testen ein anderes Einstellungsobjekt bereitzustellen, indem man eine Abhängigkeitsüberschreibung für `get_settings` erstellt:
|
||||||
|
|
||||||
{* ../../docs_src/settings/app02/test_main.py hl[9:10,13,21] *}
|
{* ../../docs_src/settings/app02_an_py39/test_main.py hl[9:10,13,21] *}
|
||||||
|
|
||||||
Bei der Abhängigkeitsüberschreibung legen wir einen neuen Wert für `admin_email` fest, wenn wir das neue `Settings`-Objekt erstellen, und geben dann dieses neue Objekt zurück.
|
Bei der Abhängigkeitsüberschreibung legen wir einen neuen Wert für `admin_email` fest, wenn wir das neue `Settings`-Objekt erstellen, und geben dann dieses neue Objekt zurück.
|
||||||
|
|
||||||
|
|
@ -217,7 +217,7 @@ Und dann aktualisieren Sie Ihre `config.py` mit:
|
||||||
|
|
||||||
//// tab | Pydantic v2
|
//// tab | Pydantic v2
|
||||||
|
|
||||||
{* ../../docs_src/settings/app03_an/config.py hl[9] *}
|
{* ../../docs_src/settings/app03_an_py39/config.py hl[9] *}
|
||||||
|
|
||||||
/// tip | Tipp
|
/// tip | Tipp
|
||||||
|
|
||||||
|
|
@ -229,7 +229,7 @@ Das Attribut `model_config` wird nur für die Pydantic-Konfiguration verwendet.
|
||||||
|
|
||||||
//// tab | Pydantic v1
|
//// tab | Pydantic v1
|
||||||
|
|
||||||
{* ../../docs_src/settings/app03_an/config_pv1.py hl[9:10] *}
|
{* ../../docs_src/settings/app03_an_py39/config_pv1.py hl[9:10] *}
|
||||||
|
|
||||||
/// tip | Tipp
|
/// tip | Tipp
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -123,4 +123,4 @@ Und da Sie `StaticFiles` verwenden, wird diese CSS-Datei automatisch von Ihrer *
|
||||||
|
|
||||||
## Mehr Details { #more-details }
|
## Mehr Details { #more-details }
|
||||||
|
|
||||||
Weitere Informationen, einschließlich, wie man Templates testet, finden Sie in <a href="https://www.starlette.io/templates/" class="external-link" target="_blank">Starlettes Dokumentation zu Templates</a>.
|
Weitere Informationen, einschließlich, wie man Templates testet, finden Sie in <a href="https://www.starlette.dev/templates/" class="external-link" target="_blank">Starlettes Dokumentation zu Templates</a>.
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ Wenn Sie `lifespan` in Ihren Tests ausführen müssen, können Sie den `TestClie
|
||||||
{* ../../docs_src/app_testing/tutorial004.py hl[9:15,18,27:28,30:32,41:43] *}
|
{* ../../docs_src/app_testing/tutorial004.py hl[9:15,18,27:28,30:32,41:43] *}
|
||||||
|
|
||||||
|
|
||||||
Sie können mehr Details unter [„Lifespan in Tests ausführen in der offiziellen Starlette-Dokumentation.“](https://www.starlette.io/lifespan/#running-lifespan-in-tests) nachlesen.
|
Sie können mehr Details unter [„Lifespan in Tests ausführen in der offiziellen Starlette-Dokumentation.“](https://www.starlette.dev/lifespan/#running-lifespan-in-tests) nachlesen.
|
||||||
|
|
||||||
Für die deprecateten Events <abbr title="Hochfahren">`startup`</abbr> und <abbr title="Herunterfahren">`shutdown`</abbr> können Sie den `TestClient` wie folgt verwenden:
|
Für die deprecateten Events <abbr title="Hochfahren">`startup`</abbr> und <abbr title="Herunterfahren">`shutdown`</abbr> können Sie den `TestClient` wie folgt verwenden:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,6 @@ Dazu verwenden Sie den `TestClient` in einer `with`-Anweisung, eine Verbindung z
|
||||||
|
|
||||||
/// note | Hinweis
|
/// note | Hinweis
|
||||||
|
|
||||||
Weitere Informationen finden Sie in Starlettes Dokumentation zum <a href="https://www.starlette.io/testclient/#testing-websocket-sessions" class="external-link" target="_blank">Testen von WebSockets</a>.
|
Weitere Informationen finden Sie in Starlettes Dokumentation zum <a href="https://www.starlette.dev/testclient/#testing-websocket-sessions" class="external-link" target="_blank">Testen von WebSockets</a>.
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ Es gibt jedoch Situationen, in denen Sie möglicherweise direkt auf das `Request
|
||||||
|
|
||||||
## Details zum `Request`-Objekt { #details-about-the-request-object }
|
## Details zum `Request`-Objekt { #details-about-the-request-object }
|
||||||
|
|
||||||
Da **FastAPI** unter der Haube eigentlich **Starlette** ist, mit einer Ebene von mehreren Tools darüber, können Sie Starlettes <a href="https://www.starlette.io/requests/" class="external-link" target="_blank">`Request`</a>-Objekt direkt verwenden, wenn Sie es benötigen.
|
Da **FastAPI** unter der Haube eigentlich **Starlette** ist, mit einer Ebene von mehreren Tools darüber, können Sie Starlettes <a href="https://www.starlette.dev/requests/" class="external-link" target="_blank">`Request`</a>-Objekt direkt verwenden, wenn Sie es benötigen.
|
||||||
|
|
||||||
Das bedeutet allerdings auch, dass, wenn Sie Daten direkt vom `Request`-Objekt nehmen (z. B. dessen Body lesen), diese von FastAPI nicht validiert, konvertiert oder dokumentiert werden (mit OpenAPI, für die automatische API-Benutzeroberfläche).
|
Das bedeutet allerdings auch, dass, wenn Sie Daten direkt vom `Request`-Objekt nehmen (z. B. dessen Body lesen), diese von FastAPI nicht validiert, konvertiert oder dokumentiert werden (mit OpenAPI, für die automatische API-Benutzeroberfläche).
|
||||||
|
|
||||||
|
|
@ -45,7 +45,7 @@ Auf die gleiche Weise können Sie wie gewohnt jeden anderen Parameter deklariere
|
||||||
|
|
||||||
## `Request`-Dokumentation { #request-documentation }
|
## `Request`-Dokumentation { #request-documentation }
|
||||||
|
|
||||||
Weitere Details zum <a href="https://www.starlette.io/requests/" class="external-link" target="_blank">`Request`-Objekt finden Sie in der offiziellen Starlette-Dokumentation</a>.
|
Weitere Details zum <a href="https://www.starlette.dev/requests/" class="external-link" target="_blank">`Request`-Objekt finden Sie in der offiziellen Starlette-Dokumentation</a>.
|
||||||
|
|
||||||
/// note | Technische Details
|
/// note | Technische Details
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -182,5 +182,5 @@ Wenn Sie etwas benötigen, das sich leicht in FastAPI integrieren lässt, aber r
|
||||||
|
|
||||||
Weitere Informationen zu Optionen finden Sie in der Dokumentation von Starlette:
|
Weitere Informationen zu Optionen finden Sie in der Dokumentation von Starlette:
|
||||||
|
|
||||||
* <a href="https://www.starlette.io/websockets/" class="external-link" target="_blank">Die `WebSocket`-Klasse</a>.
|
* <a href="https://www.starlette.dev/websockets/" class="external-link" target="_blank">Die `WebSocket`-Klasse</a>.
|
||||||
* <a href="https://www.starlette.io/endpoints/#websocketendpoint" class="external-link" target="_blank">Klassen-basierte Handhabung von WebSockets</a>.
|
* <a href="https://www.starlette.dev/endpoints/#websocketendpoint" class="external-link" target="_blank">Klassen-basierte Handhabung von WebSockets</a>.
|
||||||
|
|
|
||||||
|
|
@ -417,7 +417,7 @@ Die gesamte Datenvalidierung, Datenserialisierung und automatische Modelldokumen
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
### <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a> { #starlette }
|
### <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a> { #starlette }
|
||||||
|
|
||||||
Starlette ist ein leichtgewichtiges <abbr title="Der neue Standard für die Erstellung asynchroner Python-Webanwendungen">ASGI</abbr>-Framework/Toolkit, welches sich ideal für die Erstellung hochperformanter asynchroner Dienste eignet.
|
Starlette ist ein leichtgewichtiges <abbr title="Der neue Standard für die Erstellung asynchroner Python-Webanwendungen">ASGI</abbr>-Framework/Toolkit, welches sich ideal für die Erstellung hochperformanter asynchroner Dienste eignet.
|
||||||
|
|
||||||
|
|
@ -462,7 +462,7 @@ Alles, was Sie also mit Starlette machen können, können Sie direkt mit **FastA
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
### <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a> { #uvicorn }
|
### <a href="https://www.uvicorn.dev/" class="external-link" target="_blank">Uvicorn</a> { #uvicorn }
|
||||||
|
|
||||||
Uvicorn ist ein blitzschneller ASGI-Server, der auf uvloop und httptools basiert.
|
Uvicorn ist ein blitzschneller ASGI-Server, der auf uvloop und httptools basiert.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
|
## 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.
|
||||||
|
|
||||||
|
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 }
|
## Cloudanbieter – Sponsoren { #cloud-providers-sponsors }
|
||||||
|
|
||||||
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.
|
Einige andere Cloudanbieter ✨ [**sponsern FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨ ebenfalls. 🙇
|
||||||
|
|
||||||
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. 🙇
|
Sie könnten diese ebenfalls in Betracht ziehen, deren Anleitungen folgen und ihre Dienste ausprobieren:
|
||||||
|
|
||||||
Vielleicht möchten Sie deren Dienste ausprobieren und deren Anleitungen folgen:
|
|
||||||
|
|
||||||
* <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>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# Deployment-Konzepte { #deployments-concepts }
|
# Deployment-Konzepte { #deployments-concepts }
|
||||||
|
|
||||||
Bei dem Deployment – der Bereitstellung – einer **FastAPI**-Anwendung, oder eigentlich jeder Art von Web-API, gibt es mehrere Konzepte, die Sie wahrscheinlich interessieren, und mithilfe der Sie die **am besten geeignete** Methode zur **Bereitstellung Ihrer Anwendung** finden können.
|
Bei dem Deployment – der Bereitstellung – einer **FastAPI**-Anwendung, oder eigentlich jeder Art von Web-API, gibt es mehrere Konzepte, die Sie wahrscheinlich interessieren, und mithilfe der Sie die **am besten geeignete** Methode zum **Deployment Ihrer Anwendung** finden können.
|
||||||
|
|
||||||
Einige wichtige Konzepte sind:
|
Einige wichtige Konzepte sind:
|
||||||
|
|
||||||
|
|
@ -15,11 +15,11 @@ Wir werden sehen, wie diese sich auf das **Deployment** auswirken.
|
||||||
|
|
||||||
Letztendlich besteht das ultimative Ziel darin, **Ihre API-Clients** auf **sichere** Weise zu versorgen, um **Unterbrechungen** zu vermeiden und die **Rechenressourcen** (z. B. entfernte Server/virtuelle Maschinen) so effizient wie möglich zu nutzen. 🚀
|
Letztendlich besteht das ultimative Ziel darin, **Ihre API-Clients** auf **sichere** Weise zu versorgen, um **Unterbrechungen** zu vermeiden und die **Rechenressourcen** (z. B. entfernte Server/virtuelle Maschinen) so effizient wie möglich zu nutzen. 🚀
|
||||||
|
|
||||||
Ich erzähle Ihnen hier etwas mehr über diese **Konzepte**, was Ihnen hoffentlich die **Intuition** gibt, die Sie benötigen, um zu entscheiden, wie Sie Ihre API in sehr unterschiedlichen Umgebungen bereitstellen, möglicherweise sogar in **zukünftigen**, die jetzt noch nicht existieren.
|
Ich erzähle Ihnen hier etwas mehr über diese **Konzepte**, was Ihnen hoffentlich die **Intuition** gibt, die Sie benötigen, um zu entscheiden, wie Sie Ihre API in sehr unterschiedlichen Umgebungen deployen, möglicherweise sogar in **zukünftigen**, die jetzt noch nicht existieren.
|
||||||
|
|
||||||
Durch die Berücksichtigung dieser Konzepte können Sie die beste Variante der Bereitstellung **Ihrer eigenen APIs** **evaluieren und konzipieren**.
|
Durch die Berücksichtigung dieser Konzepte können Sie die beste Variante des Deployments **Ihrer eigenen APIs** **evaluieren und konzipieren**.
|
||||||
|
|
||||||
In den nächsten Kapiteln werde ich Ihnen mehr **konkrete Rezepte** für die Bereitstellung von FastAPI-Anwendungen geben.
|
In den nächsten Kapiteln werde ich Ihnen mehr **konkrete Rezepte** für das Deployment von FastAPI-Anwendungen geben.
|
||||||
|
|
||||||
Aber schauen wir uns zunächst einmal diese grundlegenden **konzeptionellen Ideen** an. Diese Konzepte gelten auch für jede andere Art von Web-API. 💡
|
Aber schauen wir uns zunächst einmal diese grundlegenden **konzeptionellen Ideen** an. Diese Konzepte gelten auch für jede andere Art von Web-API. 💡
|
||||||
|
|
||||||
|
|
@ -271,7 +271,7 @@ In diesem Fall müssen Sie sich darüber keine Sorgen machen. 🤷
|
||||||
|
|
||||||
### Beispiele für Strategien für Vorab-Schritte { #examples-of-previous-steps-strategies }
|
### Beispiele für Strategien für Vorab-Schritte { #examples-of-previous-steps-strategies }
|
||||||
|
|
||||||
Es hängt **stark** davon ab, wie Sie **Ihr System bereitstellen**, und hängt wahrscheinlich mit der Art und Weise zusammen, wie Sie Programme starten, Neustarts durchführen, usw.
|
Es hängt **stark** davon ab, wie Sie **Ihr System deployen**, und hängt wahrscheinlich mit der Art und Weise zusammen, wie Sie Programme starten, Neustarts durchführen, usw.
|
||||||
|
|
||||||
Hier sind einige mögliche Ideen:
|
Hier sind einige mögliche Ideen:
|
||||||
|
|
||||||
|
|
@ -307,7 +307,7 @@ Sie können einfache Tools wie `htop` verwenden, um die in Ihrem Server verwende
|
||||||
|
|
||||||
## Zusammenfassung { #recap }
|
## Zusammenfassung { #recap }
|
||||||
|
|
||||||
Sie haben hier einige der wichtigsten Konzepte gelesen, die Sie wahrscheinlich berücksichtigen müssen, wenn Sie entscheiden, wie Sie Ihre Anwendung bereitstellen:
|
Sie haben hier einige der wichtigsten Konzepte gelesen, die Sie wahrscheinlich berücksichtigen müssen, wenn Sie entscheiden, wie Sie Ihre Anwendung deployen:
|
||||||
|
|
||||||
* Sicherheit – HTTPS
|
* Sicherheit – HTTPS
|
||||||
* Beim Hochfahren ausführen
|
* Beim Hochfahren ausführen
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# FastAPI in Containern – Docker { #fastapi-in-containers-docker }
|
# FastAPI in Containern – Docker { #fastapi-in-containers-docker }
|
||||||
|
|
||||||
Beim Deployment von FastAPI-Anwendungen besteht ein gängiger Ansatz darin, ein **Linux-Containerimage** zu erstellen. Normalerweise erfolgt dies mit <a href="https://www.docker.com/" class="external-link" target="_blank">**Docker**</a>. Sie können dieses Containerimage dann auf eine von mehreren möglichen Arten bereitstellen.
|
Beim Deployment von FastAPI-Anwendungen besteht ein gängiger Ansatz darin, ein **Linux-Containerimage** zu erstellen. Normalerweise erfolgt dies mit <a href="https://www.docker.com/" class="external-link" target="_blank">**Docker**</a>. Sie können dieses Containerimage dann auf eine von mehreren möglichen Arten deployen.
|
||||||
|
|
||||||
Die Verwendung von Linux-Containern bietet mehrere Vorteile, darunter **Sicherheit**, **Replizierbarkeit**, **Einfachheit** und andere.
|
Die Verwendung von Linux-Containern bietet mehrere Vorteile, darunter **Sicherheit**, **Replizierbarkeit**, **Einfachheit** und andere.
|
||||||
|
|
||||||
|
|
@ -40,7 +40,7 @@ Linux-Container werden mit demselben Linux-Kernel des Hosts (Maschine, virtuelle
|
||||||
|
|
||||||
Auf diese Weise verbrauchen Container **wenig Ressourcen**, eine Menge vergleichbar mit der direkten Ausführung der Prozesse (eine virtuelle Maschine würde viel mehr verbrauchen).
|
Auf diese Weise verbrauchen Container **wenig Ressourcen**, eine Menge vergleichbar mit der direkten Ausführung der Prozesse (eine virtuelle Maschine würde viel mehr verbrauchen).
|
||||||
|
|
||||||
Container verfügen außerdem über ihre eigenen **isoliert** laufenden Prozesse (üblicherweise nur einen Prozess), über ihr eigenes Dateisystem und ihr eigenes Netzwerk, was die Bereitstellung, Sicherheit, Entwicklung usw. vereinfacht.
|
Container verfügen außerdem über ihre eigenen **isoliert** laufenden Prozesse (üblicherweise nur einen Prozess), über ihr eigenes Dateisystem und ihr eigenes Netzwerk, was Deployment, Sicherheit, Entwicklung usw. vereinfacht.
|
||||||
|
|
||||||
## Was ist ein Containerimage { #what-is-a-container-image }
|
## Was ist ein Containerimage { #what-is-a-container-image }
|
||||||
|
|
||||||
|
|
@ -598,7 +598,7 @@ Zum Beispiel:
|
||||||
* Mit einem **Kubernetes**-Cluster
|
* Mit einem **Kubernetes**-Cluster
|
||||||
* Mit einem Docker Swarm Mode-Cluster
|
* Mit einem Docker Swarm Mode-Cluster
|
||||||
* Mit einem anderen Tool wie Nomad
|
* Mit einem anderen Tool wie Nomad
|
||||||
* Mit einem Cloud-Dienst, der Ihr Containerimage nimmt und es bereitstellt
|
* Mit einem Cloud-Dienst, der Ihr Containerimage nimmt und es deployt
|
||||||
|
|
||||||
## Docker-Image mit `uv` { #docker-image-with-uv }
|
## Docker-Image mit `uv` { #docker-image-with-uv }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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. 🤓
|
||||||
|
|
@ -14,7 +14,9 @@ Das steht im Gegensatz zu den **Entwicklungsphasen**, in denen Sie ständig den
|
||||||
|
|
||||||
Es gibt mehrere Möglichkeiten, dies zu tun, abhängig von Ihrem spezifischen Anwendungsfall und den von Ihnen verwendeten Tools.
|
Es gibt mehrere Möglichkeiten, dies zu tun, abhängig von Ihrem spezifischen Anwendungsfall und den von Ihnen verwendeten Tools.
|
||||||
|
|
||||||
Sie könnten mithilfe einer Kombination von Tools selbst **einen Server bereitstellen**, Sie könnten einen **Cloud-Dienst** nutzen, der einen Teil der Arbeit für Sie erledigt, oder andere mögliche Optionen.
|
Sie könnten mithilfe einer Kombination von Tools selbst **einen Server deployen**, Sie könnten einen **Cloud-Dienst** nutzen, der einen Teil der Arbeit für Sie erledigt, oder andere mögliche Optionen.
|
||||||
|
|
||||||
|
Zum Beispiel haben wir, das Team hinter FastAPI, <a href="https://fastapicloud.com" class="external-link" target="_blank">**FastAPI Cloud**</a> entwickelt, um das Deployment von FastAPI-Apps in der Cloud so reibungslos wie möglich zu gestalten, mit derselben Developer-Experience wie beim Arbeiten mit FastAPI.
|
||||||
|
|
||||||
Ich zeige Ihnen einige der wichtigsten Konzepte, die Sie beim Deployment einer **FastAPI**-Anwendung wahrscheinlich berücksichtigen sollten (obwohl das meiste davon auch für jede andere Art von Webanwendung gilt).
|
Ich zeige Ihnen einige der wichtigsten Konzepte, die Sie beim Deployment einer **FastAPI**-Anwendung wahrscheinlich berücksichtigen sollten (obwohl das meiste davon auch für jede andere Art von Webanwendung gilt).
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ Das Wichtigste, was Sie benötigen, um eine **FastAPI**-Anwendung (oder eine and
|
||||||
|
|
||||||
Es gibt mehrere Alternativen, einschließlich:
|
Es gibt mehrere Alternativen, einschließlich:
|
||||||
|
|
||||||
* <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>: ein hochperformanter ASGI-Server.
|
* <a href="https://www.uvicorn.dev/" class="external-link" target="_blank">Uvicorn</a>: ein hochperformanter ASGI-Server.
|
||||||
* <a href="https://hypercorn.readthedocs.io/" class="external-link" target="_blank">Hypercorn</a>: ein ASGI-Server, der unter anderem kompatibel mit HTTP/2 und Trio ist.
|
* <a href="https://hypercorn.readthedocs.io/" class="external-link" target="_blank">Hypercorn</a>: ein ASGI-Server, der unter anderem kompatibel mit HTTP/2 und Trio ist.
|
||||||
* <a href="https://github.com/django/daphne" class="external-link" target="_blank">Daphne</a>: der für Django Channels entwickelte ASGI-Server.
|
* <a href="https://github.com/django/daphne" class="external-link" target="_blank">Daphne</a>: der für Django Channels entwickelte ASGI-Server.
|
||||||
* <a href="https://github.com/emmett-framework/granian" class="external-link" target="_blank">Granian</a>: Ein Rust HTTP-Server für Python-Anwendungen.
|
* <a href="https://github.com/emmett-framework/granian" class="external-link" target="_blank">Granian</a>: Ein Rust HTTP-Server für Python-Anwendungen.
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ Schauen wir uns die Deployment-Konzepte von früher noch einmal an:
|
||||||
|
|
||||||
Bis zu diesem Punkt, in allen Tutorials in der Dokumentation, haben Sie wahrscheinlich ein **Serverprogramm** ausgeführt, zum Beispiel mit dem `fastapi`-Befehl, der Uvicorn startet, und einen **einzelnen Prozess** ausführt.
|
Bis zu diesem Punkt, in allen Tutorials in der Dokumentation, haben Sie wahrscheinlich ein **Serverprogramm** ausgeführt, zum Beispiel mit dem `fastapi`-Befehl, der Uvicorn startet, und einen **einzelnen Prozess** ausführt.
|
||||||
|
|
||||||
Wenn Sie Anwendungen bereitstellen, möchten Sie wahrscheinlich eine gewisse **Replikation von Prozessen**, um **mehrere Kerne** zu nutzen und mehr <abbr title="Request – Anfrage: Daten, die der Client zum Server sendet">Requests</abbr> bearbeiten zu können.
|
Wenn Sie Anwendungen deployen, möchten Sie wahrscheinlich eine gewisse **Replikation von Prozessen**, um **mehrere Kerne** zu nutzen und mehr <abbr title="Request – Anfrage: Daten, die der Client zum Server sendet">Requests</abbr> bearbeiten zu können.
|
||||||
|
|
||||||
Wie Sie im vorherigen Kapitel über [Deployment-Konzepte](concepts.md){.internal-link target=_blank} gesehen haben, gibt es mehrere Strategien, die Sie anwenden können.
|
Wie Sie im vorherigen Kapitel über [Deployment-Konzepte](concepts.md){.internal-link target=_blank} gesehen haben, gibt es mehrere Strategien, die Sie anwenden können.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,7 @@ FastAPI CLI nimmt den Pfad zu Ihrem Python-Programm (z. B. `main.py`), erkennt a
|
||||||
|
|
||||||
Für die Produktion würden Sie stattdessen `fastapi run` verwenden. 🚀
|
Für die Produktion würden Sie stattdessen `fastapi run` verwenden. 🚀
|
||||||
|
|
||||||
Intern verwendet das **FastAPI CLI** <a href="https://www.uvicorn.org" class="external-link" target="_blank">Uvicorn</a>, einen leistungsstarken, produktionsreifen, ASGI-Server. 😎
|
Intern verwendet das **FastAPI CLI** <a href="https://www.uvicorn.dev" class="external-link" target="_blank">Uvicorn</a>, einen leistungsstarken, produktionsreifen, ASGI-Server. 😎
|
||||||
|
|
||||||
## `fastapi dev` { #fastapi-dev }
|
## `fastapi dev` { #fastapi-dev }
|
||||||
|
|
||||||
|
|
@ -66,7 +66,7 @@ Das Ausführen von `fastapi run` startet FastAPI standardmäßig im Produktionsm
|
||||||
|
|
||||||
Standardmäßig ist **Autoreload** deaktiviert. Es horcht auch auf der IP-Adresse `0.0.0.0`, was alle verfügbaren IP-Adressen bedeutet, so wird es öffentlich zugänglich für jeden, der mit der Maschine kommunizieren kann. So würden Sie es normalerweise in der Produktion ausführen, beispielsweise in einem Container.
|
Standardmäßig ist **Autoreload** deaktiviert. Es horcht auch auf der IP-Adresse `0.0.0.0`, was alle verfügbaren IP-Adressen bedeutet, so wird es öffentlich zugänglich für jeden, der mit der Maschine kommunizieren kann. So würden Sie es normalerweise in der Produktion ausführen, beispielsweise in einem Container.
|
||||||
|
|
||||||
In den meisten Fällen würden (und sollten) Sie einen „Terminierungsproxy“ haben, der HTTPS für Sie verwaltet. Dies hängt davon ab, wie Sie Ihre Anwendung bereitstellen. Ihr Anbieter könnte dies für Sie erledigen, oder Sie müssen es selbst einrichten.
|
In den meisten Fällen würden (und sollten) Sie einen „Terminierungsproxy“ haben, der HTTPS für Sie verwaltet. Dies hängt davon ab, wie Sie Ihre Anwendung deployen. Ihr Anbieter könnte dies für Sie erledigen, oder Sie müssen es selbst einrichten.
|
||||||
|
|
||||||
/// tip | Tipp
|
/// tip | Tipp
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -159,7 +159,7 @@ Jede Integration wurde so entworfen, dass sie so einfach zu nutzen ist (mit Abh
|
||||||
|
|
||||||
## Starlette Merkmale { #starlette-features }
|
## Starlette Merkmale { #starlette-features }
|
||||||
|
|
||||||
**FastAPI** ist vollkommen kompatibel (und basiert auf) <a href="https://www.starlette.io/" class="external-link" target="_blank"><strong>Starlette</strong></a>. Das bedeutet, wenn Sie eigenen Starlette Quellcode haben, funktioniert der.
|
**FastAPI** ist vollkommen kompatibel (und basiert auf) <a href="https://www.starlette.dev/" class="external-link" target="_blank"><strong>Starlette</strong></a>. Das bedeutet, wenn Sie eigenen Starlette Quellcode haben, funktioniert der.
|
||||||
|
|
||||||
`FastAPI` ist tatsächlich eine Unterklasse von `Starlette`. Wenn Sie also bereits Starlette kennen oder benutzen, das meiste funktioniert genau so.
|
`FastAPI` ist tatsächlich eine Unterklasse von `Starlette`. Wenn Sie also bereits Starlette kennen oder benutzen, das meiste funktioniert genau so.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ Nachdem ich mehrere Alternativen getestet hatte, entschied ich, dass ich <a href
|
||||||
|
|
||||||
Dann habe ich zu dessen Code beigetragen, um es vollständig mit JSON Schema kompatibel zu machen, und so verschiedene Möglichkeiten zum Definieren von einschränkenden Deklarationen (Constraints) zu unterstützen, und die Editorunterstützung (Typprüfungen, Codevervollständigung) zu verbessern, basierend auf den Tests in mehreren Editoren.
|
Dann habe ich zu dessen Code beigetragen, um es vollständig mit JSON Schema kompatibel zu machen, und so verschiedene Möglichkeiten zum Definieren von einschränkenden Deklarationen (Constraints) zu unterstützen, und die Editorunterstützung (Typprüfungen, Codevervollständigung) zu verbessern, basierend auf den Tests in mehreren Editoren.
|
||||||
|
|
||||||
Während der Entwicklung habe ich auch zu <a href="https://www.starlette.io/" class="external-link" target="_blank">**Starlette**</a> beigetragen, der anderen Schlüsselanforderung.
|
Während der Entwicklung habe ich auch zu <a href="https://www.starlette.dev/" class="external-link" target="_blank">**Starlette**</a> beigetragen, der anderen Schlüsselanforderung.
|
||||||
|
|
||||||
## Entwicklung { #development }
|
## Entwicklung { #development }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
@ -40,7 +40,7 @@ FastAPI enthält einige Defaultkonfigurationsparameter, die für die meisten Anw
|
||||||
|
|
||||||
Es umfasst die folgenden Defaultkonfigurationen:
|
Es umfasst die folgenden Defaultkonfigurationen:
|
||||||
|
|
||||||
{* ../../fastapi/openapi/docs.py ln[8:23] hl[17:23] *}
|
{* ../../fastapi/openapi/docs.py ln[9:24] hl[18:24] *}
|
||||||
|
|
||||||
Sie können jede davon überschreiben, indem Sie im Argument `swagger_ui_parameters` einen anderen Wert festlegen.
|
Sie können jede davon überschreiben, indem Sie im Argument `swagger_ui_parameters` einen anderen Wert festlegen.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ Wenn der Header kein `gzip` enthält, wird nicht versucht, den Body zu dekomprim
|
||||||
|
|
||||||
Auf diese Weise kann dieselbe Routenklasse gzip-komprimierte oder unkomprimierte Requests verarbeiten.
|
Auf diese Weise kann dieselbe Routenklasse gzip-komprimierte oder unkomprimierte Requests verarbeiten.
|
||||||
|
|
||||||
{* ../../docs_src/custom_request_and_route/tutorial001.py hl[8:15] *}
|
{* ../../docs_src/custom_request_and_route/tutorial001_an_py310.py hl[9:16] *}
|
||||||
|
|
||||||
### Eine benutzerdefinierte `GzipRoute`-Klasse erstellen { #create-a-custom-gziproute-class }
|
### Eine benutzerdefinierte `GzipRoute`-Klasse erstellen { #create-a-custom-gziproute-class }
|
||||||
|
|
||||||
|
|
@ -54,7 +54,7 @@ Diese Methode gibt eine Funktion zurück. Und diese Funktion empfängt einen <ab
|
||||||
|
|
||||||
Hier verwenden wir sie, um aus dem ursprünglichen Request einen `GzipRequest` zu erstellen.
|
Hier verwenden wir sie, um aus dem ursprünglichen Request einen `GzipRequest` zu erstellen.
|
||||||
|
|
||||||
{* ../../docs_src/custom_request_and_route/tutorial001.py hl[18:26] *}
|
{* ../../docs_src/custom_request_and_route/tutorial001_an_py310.py hl[19:27] *}
|
||||||
|
|
||||||
/// note | Technische Details
|
/// note | Technische Details
|
||||||
|
|
||||||
|
|
@ -66,7 +66,7 @@ Das `scope`-`dict` und die `receive`-Funktion sind beide Teil der ASGI-Spezifika
|
||||||
|
|
||||||
Und diese beiden Dinge, `scope` und `receive`, werden benötigt, um eine neue `Request`-Instanz zu erstellen.
|
Und diese beiden Dinge, `scope` und `receive`, werden benötigt, um eine neue `Request`-Instanz zu erstellen.
|
||||||
|
|
||||||
Um mehr über den `Request` zu erfahren, schauen Sie sich <a href="https://www.starlette.io/requests/" class="external-link" target="_blank">Starlettes Dokumentation zu Requests</a> an.
|
Um mehr über den `Request` zu erfahren, schauen Sie sich <a href="https://www.starlette.dev/requests/" class="external-link" target="_blank">Starlettes Dokumentation zu Requests</a> an.
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
|
|
@ -92,18 +92,18 @@ Wir können denselben Ansatz auch verwenden, um in einem Exceptionhandler auf de
|
||||||
|
|
||||||
Alles, was wir tun müssen, ist, den Request innerhalb eines `try`/`except`-Blocks zu handhaben:
|
Alles, was wir tun müssen, ist, den Request innerhalb eines `try`/`except`-Blocks zu handhaben:
|
||||||
|
|
||||||
{* ../../docs_src/custom_request_and_route/tutorial002.py hl[13,15] *}
|
{* ../../docs_src/custom_request_and_route/tutorial002_an_py310.py hl[14,16] *}
|
||||||
|
|
||||||
Wenn eine Exception auftritt, befindet sich die `Request`-Instanz weiterhin im Gültigkeitsbereich, sodass wir den Requestbody lesen und bei der Fehlerbehandlung verwenden können:
|
Wenn eine Exception auftritt, befindet sich die `Request`-Instanz weiterhin im Gültigkeitsbereich, sodass wir den Requestbody lesen und bei der Fehlerbehandlung verwenden können:
|
||||||
|
|
||||||
{* ../../docs_src/custom_request_and_route/tutorial002.py hl[16:18] *}
|
{* ../../docs_src/custom_request_and_route/tutorial002_an_py310.py hl[17:19] *}
|
||||||
|
|
||||||
## Benutzerdefinierte `APIRoute`-Klasse in einem Router { #custom-apiroute-class-in-a-router }
|
## Benutzerdefinierte `APIRoute`-Klasse in einem Router { #custom-apiroute-class-in-a-router }
|
||||||
|
|
||||||
Sie können auch den Parameter `route_class` eines `APIRouter` festlegen:
|
Sie können auch den Parameter `route_class` eines `APIRouter` festlegen:
|
||||||
|
|
||||||
{* ../../docs_src/custom_request_and_route/tutorial003.py hl[26] *}
|
{* ../../docs_src/custom_request_and_route/tutorial003_py310.py hl[26] *}
|
||||||
|
|
||||||
In diesem Beispiel verwenden die *Pfadoperationen* unter dem `router` die benutzerdefinierte `TimedRoute`-Klasse und haben in der Response einen zusätzlichen `X-Response-Time`-Header mit der Zeit, die zum Generieren der Response benötigt wurde:
|
In diesem Beispiel verwenden die *Pfadoperationen* unter dem `router` die benutzerdefinierte `TimedRoute`-Klasse und haben in der Response einen zusätzlichen `X-Response-Time`-Header mit der Zeit, die zum Generieren der Response benötigt wurde:
|
||||||
|
|
||||||
{* ../../docs_src/custom_request_and_route/tutorial003.py hl[13:20] *}
|
{* ../../docs_src/custom_request_and_route/tutorial003_py310.py hl[13:20] *}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,133 @@
|
||||||
|
# Von Pydantic v1 zu Pydantic v2 migrieren { #migrate-from-pydantic-v1-to-pydantic-v2 }
|
||||||
|
|
||||||
|
Wenn Sie eine ältere FastAPI-App haben, nutzen Sie möglicherweise Pydantic Version 1.
|
||||||
|
|
||||||
|
FastAPI unterstützt seit Version 0.100.0 sowohl Pydantic v1 als auch v2.
|
||||||
|
|
||||||
|
Wenn Sie Pydantic v2 installiert hatten, wurde dieses verwendet. Wenn stattdessen Pydantic v1 installiert war, wurde jenes verwendet.
|
||||||
|
|
||||||
|
Pydantic v1 ist jetzt deprecatet und die Unterstützung dafür wird in den nächsten Versionen von FastAPI entfernt, Sie sollten also zu **Pydantic v2 migrieren**. Auf diese Weise erhalten Sie die neuesten Features, Verbesserungen und Fixes.
|
||||||
|
|
||||||
|
/// warning | Achtung
|
||||||
|
|
||||||
|
Außerdem hat das Pydantic-Team die Unterstützung für Pydantic v1 in den neuesten Python-Versionen eingestellt, beginnend mit **Python 3.14**.
|
||||||
|
|
||||||
|
Wenn Sie die neuesten Features von Python nutzen möchten, müssen Sie sicherstellen, dass Sie Pydantic v2 verwenden.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
Wenn Sie eine ältere FastAPI-App mit Pydantic v1 haben, zeige ich Ihnen hier, wie Sie sie zu Pydantic v2 migrieren, und die **neuen Features in FastAPI 0.119.0**, die Ihnen bei einer schrittweisen Migration helfen.
|
||||||
|
|
||||||
|
## Offizieller Leitfaden { #official-guide }
|
||||||
|
|
||||||
|
Pydantic hat einen offiziellen <a href="https://docs.pydantic.dev/latest/migration/" class="external-link" target="_blank">Migrationsleitfaden</a> von v1 zu v2.
|
||||||
|
|
||||||
|
Er enthält auch, was sich geändert hat, wie Validierungen nun korrekter und strikter sind, mögliche Stolpersteine, usw.
|
||||||
|
|
||||||
|
Sie können ihn lesen, um besser zu verstehen, was sich geändert hat.
|
||||||
|
|
||||||
|
## Tests { #tests }
|
||||||
|
|
||||||
|
Stellen Sie sicher, dass Sie [Tests](../tutorial/testing.md){.internal-link target=_blank} für Ihre App haben und diese in Continuous Integration (CI) ausführen.
|
||||||
|
|
||||||
|
Auf diese Weise können Sie das Update durchführen und sicherstellen, dass weiterhin alles wie erwartet funktioniert.
|
||||||
|
|
||||||
|
## `bump-pydantic` { #bump-pydantic }
|
||||||
|
|
||||||
|
In vielen Fällen, wenn Sie reguläre Pydantic-Modelle ohne Anpassungen verwenden, können Sie den Großteil des Prozesses der Migration von Pydantic v1 auf Pydantic v2 automatisieren.
|
||||||
|
|
||||||
|
Sie können <a href="https://github.com/pydantic/bump-pydantic" class="external-link" target="_blank">`bump-pydantic`</a> vom selben Pydantic-Team verwenden.
|
||||||
|
|
||||||
|
Dieses Tool hilft Ihnen, den Großteil des zu ändernden Codes automatisch anzupassen.
|
||||||
|
|
||||||
|
Danach können Sie die Tests ausführen und prüfen, ob alles funktioniert. Falls ja, sind Sie fertig. 😎
|
||||||
|
|
||||||
|
## Pydantic v1 in v2 { #pydantic-v1-in-v2 }
|
||||||
|
|
||||||
|
Pydantic v2 enthält alles aus Pydantic v1 als Untermodul `pydantic.v1`.
|
||||||
|
|
||||||
|
Das bedeutet, Sie können die neueste Version von Pydantic v2 installieren und die alten Pydantic‑v1‑Komponenten aus diesem Untermodul importieren und verwenden, als hätten Sie das alte Pydantic v1 installiert.
|
||||||
|
|
||||||
|
{* ../../docs_src/pydantic_v1_in_v2/tutorial001_an_py310.py hl[1,4] *}
|
||||||
|
|
||||||
|
### FastAPI-Unterstützung für Pydantic v1 in v2 { #fastapi-support-for-pydantic-v1-in-v2 }
|
||||||
|
|
||||||
|
Seit FastAPI 0.119.0 gibt es außerdem eine teilweise Unterstützung für Pydantic v1 innerhalb von Pydantic v2, um die Migration auf v2 zu erleichtern.
|
||||||
|
|
||||||
|
Sie könnten also Pydantic auf die neueste Version 2 aktualisieren und die Importe so ändern, dass das Untermodul `pydantic.v1` verwendet wird, und in vielen Fällen würde es einfach funktionieren.
|
||||||
|
|
||||||
|
{* ../../docs_src/pydantic_v1_in_v2/tutorial002_an_py310.py hl[2,5,15] *}
|
||||||
|
|
||||||
|
/// warning | Achtung
|
||||||
|
|
||||||
|
Beachten Sie, dass, da das Pydantic‑Team Pydantic v1 in neueren Python‑Versionen nicht mehr unterstützt, beginnend mit Python 3.14, auch die Verwendung von `pydantic.v1` unter Python 3.14 und höher nicht unterstützt wird.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
### Pydantic v1 und v2 in derselben App { #pydantic-v1-and-v2-on-the-same-app }
|
||||||
|
|
||||||
|
Es wird von Pydantic **nicht unterstützt**, dass ein Pydantic‑v2‑Modell Felder hat, die als Pydantic‑v1‑Modelle definiert sind, und umgekehrt.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TB
|
||||||
|
subgraph "❌ Nicht unterstützt"
|
||||||
|
direction TB
|
||||||
|
subgraph V2["Pydantic-v2-Modell"]
|
||||||
|
V1Field["Pydantic-v1-Modell"]
|
||||||
|
end
|
||||||
|
subgraph V1["Pydantic-v1-Modell"]
|
||||||
|
V2Field["Pydantic-v2-Modell"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
style V2 fill:#f9fff3
|
||||||
|
style V1 fill:#fff6f0
|
||||||
|
style V1Field fill:#fff6f0
|
||||||
|
style V2Field fill:#f9fff3
|
||||||
|
```
|
||||||
|
|
||||||
|
... aber Sie können getrennte Modelle, die Pydantic v1 bzw. v2 nutzen, in derselben App verwenden.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
graph TB
|
||||||
|
subgraph "✅ Unterstützt"
|
||||||
|
direction TB
|
||||||
|
subgraph V2["Pydantic-v2-Modell"]
|
||||||
|
V2Field["Pydantic-v2-Modell"]
|
||||||
|
end
|
||||||
|
subgraph V1["Pydantic-v1-Modell"]
|
||||||
|
V1Field["Pydantic-v1-Modell"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
style V2 fill:#f9fff3
|
||||||
|
style V1 fill:#fff6f0
|
||||||
|
style V1Field fill:#fff6f0
|
||||||
|
style V2Field fill:#f9fff3
|
||||||
|
```
|
||||||
|
|
||||||
|
In einigen Fällen ist es sogar möglich, sowohl Pydantic‑v1‑ als auch Pydantic‑v2‑Modelle in derselben **Pfadoperation** Ihrer FastAPI‑App zu verwenden:
|
||||||
|
|
||||||
|
{* ../../docs_src/pydantic_v1_in_v2/tutorial003_an_py310.py hl[2:3,6,12,21:22] *}
|
||||||
|
|
||||||
|
Im obigen Beispiel ist das Eingabemodell ein Pydantic‑v1‑Modell, und das Ausgabemodell (definiert in `response_model=ItemV2`) ist ein Pydantic‑v2‑Modell.
|
||||||
|
|
||||||
|
### Pydantic v1 Parameter { #pydantic-v1-parameters }
|
||||||
|
|
||||||
|
Wenn Sie einige der FastAPI-spezifischen Tools für Parameter wie `Body`, `Query`, `Form`, usw. zusammen mit Pydantic‑v1‑Modellen verwenden müssen, können Sie die aus `fastapi.temp_pydantic_v1_params` importieren, während Sie die Migration zu Pydantic v2 abschließen:
|
||||||
|
|
||||||
|
{* ../../docs_src/pydantic_v1_in_v2/tutorial004_an_py310.py hl[4,18] *}
|
||||||
|
|
||||||
|
### In Schritten migrieren { #migrate-in-steps }
|
||||||
|
|
||||||
|
/// tip | Tipp
|
||||||
|
|
||||||
|
Probieren Sie zuerst `bump-pydantic` aus. Wenn Ihre Tests erfolgreich sind und das funktioniert, sind Sie mit einem einzigen Befehl fertig. ✨
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
Wenn `bump-pydantic` für Ihren Anwendungsfall nicht funktioniert, können Sie die Unterstützung für Pydantic‑v1‑ und Pydantic‑v2‑Modelle in derselben App nutzen, um die Migration zu Pydantic v2 schrittweise durchzuführen.
|
||||||
|
|
||||||
|
Sie könnten zuerst Pydantic auf die neueste Version 2 aktualisieren und die Importe so ändern, dass für all Ihre Modelle `pydantic.v1` verwendet wird.
|
||||||
|
|
||||||
|
Anschließend können Sie beginnen, Ihre Modelle gruppenweise von Pydantic v1 auf v2 zu migrieren – in kleinen, schrittweisen Etappen. 🚶
|
||||||
|
|
@ -46,20 +46,26 @@ Seine Schlüssel-Merkmale sind:
|
||||||
* **Robust**: Erhalten Sie produktionsreifen Code. Mit automatischer, interaktiver Dokumentation.
|
* **Robust**: Erhalten Sie produktionsreifen Code. Mit automatischer, interaktiver Dokumentation.
|
||||||
* **Standards-basiert**: Basierend auf (und vollständig kompatibel mit) den offenen Standards für APIs: <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a> (früher bekannt als Swagger) und <a href="https://json-schema.org/" class="external-link" target="_blank">JSON Schema</a>.
|
* **Standards-basiert**: Basierend auf (und vollständig kompatibel mit) den offenen Standards für APIs: <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a> (früher bekannt als Swagger) und <a href="https://json-schema.org/" class="external-link" target="_blank">JSON Schema</a>.
|
||||||
|
|
||||||
<small>* Schätzung basierend auf Tests in einem internen Entwicklungsteam, das Produktionsanwendungen erstellt.</small>
|
<small>* Schätzung basierend auf Tests, die von einem internen Entwicklungsteam durchgeführt wurden, das Produktionsanwendungen erstellt.</small>
|
||||||
|
|
||||||
## Sponsoren { #sponsors }
|
## Sponsoren { #sponsors }
|
||||||
|
|
||||||
<!-- sponsors -->
|
<!-- sponsors -->
|
||||||
|
|
||||||
{% if sponsors %}
|
### Keystone-Sponsor
|
||||||
|
|
||||||
|
{% for sponsor in sponsors.keystone -%}
|
||||||
|
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
|
||||||
|
{% endfor -%}
|
||||||
|
|
||||||
|
### Gold- und Silber-Sponsoren
|
||||||
|
|
||||||
{% for sponsor in sponsors.gold -%}
|
{% for sponsor in sponsors.gold -%}
|
||||||
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
|
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
|
||||||
{% endfor -%}
|
{% endfor -%}
|
||||||
{%- for sponsor in sponsors.silver -%}
|
{%- for sponsor in sponsors.silver -%}
|
||||||
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
|
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<!-- /sponsors -->
|
<!-- /sponsors -->
|
||||||
|
|
||||||
|
|
@ -123,7 +129,7 @@ Wenn Sie eine <abbr title="Command Line Interface – Kommandozeilen-Schnittstel
|
||||||
|
|
||||||
FastAPI steht auf den Schultern von Giganten:
|
FastAPI steht auf den Schultern von Giganten:
|
||||||
|
|
||||||
* <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a> für die Webanteile.
|
* <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a> für die Webanteile.
|
||||||
* <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> für die Datenanteile.
|
* <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> für die Datenanteile.
|
||||||
|
|
||||||
## Installation { #installation }
|
## Installation { #installation }
|
||||||
|
|
@ -229,7 +235,7 @@ INFO: Application startup complete.
|
||||||
<details markdown="1">
|
<details markdown="1">
|
||||||
<summary>Was der Befehl <code>fastapi dev main.py</code> macht ...</summary>
|
<summary>Was der Befehl <code>fastapi dev main.py</code> macht ...</summary>
|
||||||
|
|
||||||
Der Befehl `fastapi dev` liest Ihre `main.py`-Datei, erkennt die **FastAPI**-App darin und startet einen Server mit <a href="https://www.uvicorn.org" class="external-link" target="_blank">Uvicorn</a>.
|
Der Befehl `fastapi dev` liest Ihre `main.py`-Datei, erkennt die **FastAPI**-App darin und startet einen Server mit <a href="https://www.uvicorn.dev" class="external-link" target="_blank">Uvicorn</a>.
|
||||||
|
|
||||||
Standardmäßig wird `fastapi dev` mit aktiviertem Auto-Reload für die lokale Entwicklung gestartet.
|
Standardmäßig wird `fastapi dev` mit aktiviertem Auto-Reload für die lokale Entwicklung gestartet.
|
||||||
|
|
||||||
|
|
@ -444,6 +450,58 @@ Für ein vollständigeres Beispiel, mit weiteren Funktionen, siehe das <a href="
|
||||||
* **Cookie-Sessions**
|
* **Cookie-Sessions**
|
||||||
* ... und mehr.
|
* ... und mehr.
|
||||||
|
|
||||||
|
### Ihre App deployen (optional) { #deploy-your-app-optional }
|
||||||
|
|
||||||
|
Optional können Sie Ihre FastAPI-App in die <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a> deployen, treten Sie der Warteliste bei, falls noch nicht geschehen. 🚀
|
||||||
|
|
||||||
|
Wenn Sie bereits ein **FastAPI Cloud**-Konto haben (wir haben Sie von der Warteliste eingeladen 😉), können Sie Ihre Anwendung mit einem einzigen Befehl deployen.
|
||||||
|
|
||||||
|
Stellen Sie vor dem Deployen sicher, dass Sie eingeloggt sind:
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ fastapi login
|
||||||
|
|
||||||
|
You are logged in to FastAPI Cloud 🚀
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Stellen Sie dann Ihre App 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 unter dieser URL auf Ihre App zugreifen. ✨
|
||||||
|
|
||||||
|
#### Über FastAPI Cloud { #about-fastapi-cloud }
|
||||||
|
|
||||||
|
**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** wird vom selben Autor und Team hinter **FastAPI** entwickelt.
|
||||||
|
|
||||||
|
Es vereinfacht den Prozess des **Erstellens**, **Deployens** und **Zugreifens** auf eine API mit minimalem Aufwand.
|
||||||
|
|
||||||
|
Es bringt die gleiche **Developer-Experience** beim Erstellen von Apps mit FastAPI auch zum **Deployment** in der Cloud. 🎉
|
||||||
|
|
||||||
|
FastAPI Cloud ist der Hauptsponsor und Finanzierer der „FastAPI and friends“ Open-Source-Projekte. ✨
|
||||||
|
|
||||||
|
#### 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 FastAPI-Apps dort bereitzustellen. 🤓
|
||||||
|
|
||||||
## Performanz { #performance }
|
## Performanz { #performance }
|
||||||
|
|
||||||
Unabhängige TechEmpower-Benchmarks zeigen **FastAPI**-Anwendungen, die unter Uvicorn laufen, als <a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">eines der schnellsten verfügbaren Python-Frameworks</a>, nur hinter Starlette und Uvicorn selbst (intern von FastAPI verwendet). (*)
|
Unabhängige TechEmpower-Benchmarks zeigen **FastAPI**-Anwendungen, die unter Uvicorn laufen, als <a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">eines der schnellsten verfügbaren Python-Frameworks</a>, nur hinter Starlette und Uvicorn selbst (intern von FastAPI verwendet). (*)
|
||||||
|
|
@ -470,7 +528,7 @@ Verwendet von Starlette:
|
||||||
|
|
||||||
Verwendet von FastAPI:
|
Verwendet von FastAPI:
|
||||||
|
|
||||||
* <a href="https://www.uvicorn.org" target="_blank"><code>uvicorn</code></a> – für den Server, der Ihre Anwendung lädt und bereitstellt. Dies umfasst `uvicorn[standard]`, das einige Abhängigkeiten (z. B. `uvloop`) beinhaltet, die für eine Bereitstellung mit hoher Performanz benötigt werden.
|
* <a href="https://www.uvicorn.dev" target="_blank"><code>uvicorn</code></a> – für den Server, der Ihre Anwendung lädt und bereitstellt. Dies umfasst `uvicorn[standard]`, das einige Abhängigkeiten (z. B. `uvloop`) beinhaltet, die für eine Bereitstellung mit hoher Performanz benötigt werden.
|
||||||
* `fastapi-cli[standard]` – um den `fastapi`-Befehl bereitzustellen.
|
* `fastapi-cli[standard]` – um den `fastapi`-Befehl bereitzustellen.
|
||||||
* Dies beinhaltet `fastapi-cloud-cli`, das es Ihnen ermöglicht, Ihre FastAPI-Anwendung auf <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a> bereitzustellen.
|
* Dies beinhaltet `fastapi-cloud-cli`, das es Ihnen ermöglicht, Ihre FastAPI-Anwendung auf <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a> bereitzustellen.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,20 +9,20 @@ GitHub-Repository: <a href="https://github.com/tiangolo/full-stack-fastapi-templ
|
||||||
## Full Stack FastAPI Template – Technologiestack und Funktionen { #full-stack-fastapi-template-technology-stack-and-features }
|
## Full Stack FastAPI Template – Technologiestack und Funktionen { #full-stack-fastapi-template-technology-stack-and-features }
|
||||||
|
|
||||||
- ⚡ [**FastAPI**](https://fastapi.tiangolo.com/de) für die Python-Backend-API.
|
- ⚡ [**FastAPI**](https://fastapi.tiangolo.com/de) für die Python-Backend-API.
|
||||||
- 🧰 [SQLModel](https://sqlmodel.tiangolo.com) für die Interaktion mit der Python-SQL-Datenbank (ORM).
|
- 🧰 [SQLModel](https://sqlmodel.tiangolo.com) für die Interaktion mit der Python-SQL-Datenbank (ORM).
|
||||||
- 🔍 [Pydantic](https://docs.pydantic.dev), verwendet von FastAPI, für die Datenvalidierung und das Einstellungsmanagement.
|
- 🔍 [Pydantic](https://docs.pydantic.dev), verwendet von FastAPI, für die Datenvalidierung und das Einstellungsmanagement.
|
||||||
- 💾 [PostgreSQL](https://www.postgresql.org) als SQL-Datenbank.
|
- 💾 [PostgreSQL](https://www.postgresql.org) als SQL-Datenbank.
|
||||||
- 🚀 [React](https://react.dev) für das Frontend.
|
- 🚀 [React](https://react.dev) für das Frontend.
|
||||||
- 💃 Verwendung von TypeScript, Hooks, [Vite](https://vitejs.dev) und anderen Teilen eines modernen Frontend-Stacks.
|
- 💃 Verwendung von TypeScript, Hooks, [Vite](https://vitejs.dev) und anderen Teilen eines modernen Frontend-Stacks.
|
||||||
- 🎨 [Chakra UI](https://chakra-ui.com) für die Frontend-Komponenten.
|
- 🎨 [Tailwind CSS](https://tailwindcss.com) und [shadcn/ui](https://ui.shadcn.com) für die Frontend-Komponenten.
|
||||||
- 🤖 Ein automatisch generierter Frontend-Client.
|
- 🤖 Ein automatisch generierter Frontend-Client.
|
||||||
- 🧪 [Playwright](https://playwright.dev) für End-to-End-Tests.
|
- 🧪 [Playwright](https://playwright.dev) für End-to-End-Tests.
|
||||||
- 🦇 Unterstützung des Dunkelmodus.
|
- 🦇 „Dark-Mode“-Unterstützung.
|
||||||
- 🐋 [Docker Compose](https://www.docker.com) für Entwicklung und Produktion.
|
- 🐋 [Docker Compose](https://www.docker.com) für Entwicklung und Produktion.
|
||||||
- 🔒 Sicheres Passwort-Hashing standardmäßig.
|
- 🔒 Sicheres Passwort-Hashing standardmäßig.
|
||||||
- 🔑 JWT-Token-Authentifizierung.
|
- 🔑 JWT (JSON Web Token)-Token-Authentifizierung.
|
||||||
- 📫 E-Mail-basierte Passwortwiederherstellung.
|
- 📫 E-Mail-basierte Passwortwiederherstellung.
|
||||||
- ✅ Tests mit [Pytest](https://pytest.org).
|
- ✅ Tests mit [Pytest](https://pytest.org).
|
||||||
- 📞 [Traefik](https://traefik.io) als Reverse-Proxy / Load Balancer.
|
- 📞 [Traefik](https://traefik.io) als Reverse-Proxy / Load Balancer.
|
||||||
- 🚢 Deployment-Anleitungen unter Verwendung von Docker Compose, einschließlich der Einrichtung eines Frontend-Traefik-Proxys zur Handhabung automatischer HTTPS-Zertifikate.
|
- 🚢 Deployment-Anleitungen unter Verwendung von Docker Compose, einschließlich der Einrichtung eines Frontend-Traefik-Proxys zur Handhabung automatischer HTTPS-Zertifikate.
|
||||||
- 🏭 CI (kontinuierliche Integration) und CD (kontinuierliche Bereitstellung) basierend auf GitHub Actions.
|
- 🏭 CI (kontinuierliche Integration) und CD (kontinuierliches Deployment) basierend auf GitHub Actions.
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,3 @@
|
||||||
# Ressourcen { #resources }
|
# Ressourcen { #resources }
|
||||||
|
|
||||||
Zusätzliche Ressourcen, externe Links, Artikel und mehr. ✈️
|
Zusätzliche Ressourcen, externe Links und mehr. ✈️
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ Und dann schreibt ein weiterer Hintergrundtask, der in der *Pfadoperation-Funkti
|
||||||
|
|
||||||
## Technische Details { #technical-details }
|
## Technische Details { #technical-details }
|
||||||
|
|
||||||
Die Klasse `BackgroundTasks` stammt direkt von <a href="https://www.starlette.io/background/" class="external-link" target="_blank">`starlette.background`</a>.
|
Die Klasse `BackgroundTasks` stammt direkt von <a href="https://www.starlette.dev/background/" class="external-link" target="_blank">`starlette.background`</a>.
|
||||||
|
|
||||||
Sie wird direkt in FastAPI importiert/inkludiert, sodass Sie sie von `fastapi` importieren können und vermeiden, versehentlich das alternative `BackgroundTask` (ohne das `s` am Ende) von `starlette.background` zu importieren.
|
Sie wird direkt in FastAPI importiert/inkludiert, sodass Sie sie von `fastapi` importieren können und vermeiden, versehentlich das alternative `BackgroundTask` (ohne das `s` am Ende) von `starlette.background` zu importieren.
|
||||||
|
|
||||||
|
|
@ -71,7 +71,7 @@ Indem Sie nur `BackgroundTasks` (und nicht `BackgroundTask`) verwenden, ist es d
|
||||||
|
|
||||||
Es ist immer noch möglich, `BackgroundTask` allein in FastAPI zu verwenden, aber Sie müssen das Objekt in Ihrem Code erstellen und eine Starlette-`Response` zurückgeben, die es enthält.
|
Es ist immer noch möglich, `BackgroundTask` allein in FastAPI zu verwenden, aber Sie müssen das Objekt in Ihrem Code erstellen und eine Starlette-`Response` zurückgeben, die es enthält.
|
||||||
|
|
||||||
Weitere Details finden Sie in <a href="https://www.starlette.io/background/" class="external-link" target="_blank">Starlettes offizieller Dokumentation für Hintergrundtasks</a>.
|
Weitere Details finden Sie in <a href="https://www.starlette.dev/background/" class="external-link" target="_blank">Starlettes offizieller Dokumentation für Hintergrundtasks</a>.
|
||||||
|
|
||||||
## Vorbehalt { #caveat }
|
## Vorbehalt { #caveat }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -85,9 +85,7 @@ Sie können die *Pfadoperationen* für dieses Modul mit `APIRouter` erstellen.
|
||||||
|
|
||||||
Sie importieren ihn und erstellen eine „Instanz“ auf die gleiche Weise wie mit der Klasse `FastAPI`:
|
Sie importieren ihn und erstellen eine „Instanz“ auf die gleiche Weise wie mit der Klasse `FastAPI`:
|
||||||
|
|
||||||
```Python hl_lines="1 3" title="app/routers/users.py"
|
{* ../../docs_src/bigger_applications/app_an_py39/routers/users.py hl[1,3] title["app/routers/users.py"] *}
|
||||||
{!../../docs_src/bigger_applications/app/routers/users.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
### *Pfadoperationen* mit `APIRouter` { #path-operations-with-apirouter }
|
### *Pfadoperationen* mit `APIRouter` { #path-operations-with-apirouter }
|
||||||
|
|
||||||
|
|
@ -95,9 +93,7 @@ Und dann verwenden Sie ihn, um Ihre *Pfadoperationen* zu deklarieren.
|
||||||
|
|
||||||
Verwenden Sie ihn auf die gleiche Weise wie die Klasse `FastAPI`:
|
Verwenden Sie ihn auf die gleiche Weise wie die Klasse `FastAPI`:
|
||||||
|
|
||||||
```Python hl_lines="6 11 16" title="app/routers/users.py"
|
{* ../../docs_src/bigger_applications/app_an_py39/routers/users.py hl[6,11,16] title["app/routers/users.py"] *}
|
||||||
{!../../docs_src/bigger_applications/app/routers/users.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
Sie können sich `APIRouter` als eine „Mini-`FastAPI`“-Klasse vorstellen.
|
Sie können sich `APIRouter` als eine „Mini-`FastAPI`“-Klasse vorstellen.
|
||||||
|
|
||||||
|
|
@ -121,35 +117,7 @@ Also fügen wir sie in ihr eigenes `dependencies`-Modul (`app/dependencies.py`)
|
||||||
|
|
||||||
Wir werden nun eine einfache Abhängigkeit verwenden, um einen benutzerdefinierten `X-Token`-Header zu lesen:
|
Wir werden nun eine einfache Abhängigkeit verwenden, um einen benutzerdefinierten `X-Token`-Header zu lesen:
|
||||||
|
|
||||||
//// tab | Python 3.9+
|
{* ../../docs_src/bigger_applications/app_an_py39/dependencies.py hl[3,6:8] title["app/dependencies.py"] *}
|
||||||
|
|
||||||
```Python hl_lines="3 6-8" title="app/dependencies.py"
|
|
||||||
{!> ../../docs_src/bigger_applications/app_an_py39/dependencies.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
////
|
|
||||||
|
|
||||||
//// tab | Python 3.8+
|
|
||||||
|
|
||||||
```Python hl_lines="1 5-7" title="app/dependencies.py"
|
|
||||||
{!> ../../docs_src/bigger_applications/app_an/dependencies.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
////
|
|
||||||
|
|
||||||
//// tab | Python 3.8+ nicht annotiert
|
|
||||||
|
|
||||||
/// tip | Tipp
|
|
||||||
|
|
||||||
Bevorzugen Sie die `Annotated`-Version, falls möglich.
|
|
||||||
|
|
||||||
///
|
|
||||||
|
|
||||||
```Python hl_lines="1 4-6" title="app/dependencies.py"
|
|
||||||
{!> ../../docs_src/bigger_applications/app/dependencies.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
////
|
|
||||||
|
|
||||||
/// tip | Tipp
|
/// tip | Tipp
|
||||||
|
|
||||||
|
|
@ -181,9 +149,7 @@ Wir wissen, dass alle *Pfadoperationen* in diesem Modul folgendes haben:
|
||||||
|
|
||||||
Anstatt also alles zu jeder *Pfadoperation* hinzuzufügen, können wir es dem `APIRouter` hinzufügen.
|
Anstatt also alles zu jeder *Pfadoperation* hinzuzufügen, können wir es dem `APIRouter` hinzufügen.
|
||||||
|
|
||||||
```Python hl_lines="5-10 16 21" title="app/routers/items.py"
|
{* ../../docs_src/bigger_applications/app_an_py39/routers/items.py hl[5:10,16,21] title["app/routers/items.py"] *}
|
||||||
{!../../docs_src/bigger_applications/app/routers/items.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
Da der Pfad jeder *Pfadoperation* mit `/` beginnen muss, wie in:
|
Da der Pfad jeder *Pfadoperation* mit `/` beginnen muss, wie in:
|
||||||
|
|
||||||
|
|
@ -242,9 +208,7 @@ Und wir müssen die Abhängigkeitsfunktion aus dem Modul `app.dependencies` impo
|
||||||
|
|
||||||
Daher verwenden wir einen relativen Import mit `..` für die Abhängigkeiten:
|
Daher verwenden wir einen relativen Import mit `..` für die Abhängigkeiten:
|
||||||
|
|
||||||
```Python hl_lines="3" title="app/routers/items.py"
|
{* ../../docs_src/bigger_applications/app_an_py39/routers/items.py hl[3] title["app/routers/items.py"] *}
|
||||||
{!../../docs_src/bigger_applications/app/routers/items.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Wie relative Importe funktionieren { #how-relative-imports-work }
|
#### Wie relative Importe funktionieren { #how-relative-imports-work }
|
||||||
|
|
||||||
|
|
@ -315,9 +279,7 @@ Wir fügen weder das Präfix `/items` noch `tags=["items"]` zu jeder *Pfadoperat
|
||||||
|
|
||||||
Aber wir können immer noch _mehr_ `tags` hinzufügen, die auf eine bestimmte *Pfadoperation* angewendet werden, sowie einige zusätzliche `responses`, die speziell für diese *Pfadoperation* gelten:
|
Aber wir können immer noch _mehr_ `tags` hinzufügen, die auf eine bestimmte *Pfadoperation* angewendet werden, sowie einige zusätzliche `responses`, die speziell für diese *Pfadoperation* gelten:
|
||||||
|
|
||||||
```Python hl_lines="30-31" title="app/routers/items.py"
|
{* ../../docs_src/bigger_applications/app_an_py39/routers/items.py hl[30:31] title["app/routers/items.py"] *}
|
||||||
{!../../docs_src/bigger_applications/app/routers/items.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
/// tip | Tipp
|
/// tip | Tipp
|
||||||
|
|
||||||
|
|
@ -343,17 +305,13 @@ Sie importieren und erstellen wie gewohnt eine `FastAPI`-Klasse.
|
||||||
|
|
||||||
Und wir können sogar [globale Abhängigkeiten](dependencies/global-dependencies.md){.internal-link target=_blank} deklarieren, die mit den Abhängigkeiten für jeden `APIRouter` kombiniert werden:
|
Und wir können sogar [globale Abhängigkeiten](dependencies/global-dependencies.md){.internal-link target=_blank} deklarieren, die mit den Abhängigkeiten für jeden `APIRouter` kombiniert werden:
|
||||||
|
|
||||||
```Python hl_lines="1 3 7" title="app/main.py"
|
{* ../../docs_src/bigger_applications/app_an_py39/main.py hl[1,3,7] title["app/main.py"] *}
|
||||||
{!../../docs_src/bigger_applications/app/main.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Den `APIRouter` importieren { #import-the-apirouter }
|
### Den `APIRouter` importieren { #import-the-apirouter }
|
||||||
|
|
||||||
Jetzt importieren wir die anderen Submodule, die `APIRouter` haben:
|
Jetzt importieren wir die anderen Submodule, die `APIRouter` haben:
|
||||||
|
|
||||||
```Python hl_lines="4-5" title="app/main.py"
|
{* ../../docs_src/bigger_applications/app_an_py39/main.py hl[4:5] title["app/main.py"] *}
|
||||||
{!../../docs_src/bigger_applications/app/main.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
Da es sich bei den Dateien `app/routers/users.py` und `app/routers/items.py` um Submodule handelt, die Teil desselben Python-Packages `app` sind, können wir einen einzelnen Punkt `.` verwenden, um sie mit „relativen Imports“ zu importieren.
|
Da es sich bei den Dateien `app/routers/users.py` und `app/routers/items.py` um Submodule handelt, die Teil desselben Python-Packages `app` sind, können wir einen einzelnen Punkt `.` verwenden, um sie mit „relativen Imports“ zu importieren.
|
||||||
|
|
||||||
|
|
@ -416,17 +374,13 @@ würde der `router` von `users` den von `items` überschreiben und wir könnten
|
||||||
|
|
||||||
Um also beide in derselben Datei verwenden zu können, importieren wir die Submodule direkt:
|
Um also beide in derselben Datei verwenden zu können, importieren wir die Submodule direkt:
|
||||||
|
|
||||||
```Python hl_lines="5" title="app/main.py"
|
{* ../../docs_src/bigger_applications/app_an_py39/main.py hl[5] title["app/main.py"] *}
|
||||||
{!../../docs_src/bigger_applications/app/main.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Die `APIRouter` für `users` und `items` inkludieren { #include-the-apirouters-for-users-and-items }
|
### Die `APIRouter` für `users` und `items` inkludieren { #include-the-apirouters-for-users-and-items }
|
||||||
|
|
||||||
Inkludieren wir nun die `router` aus diesen Submodulen `users` und `items`:
|
Inkludieren wir nun die `router` aus diesen Submodulen `users` und `items`:
|
||||||
|
|
||||||
```Python hl_lines="10-11" title="app/main.py"
|
{* ../../docs_src/bigger_applications/app_an_py39/main.py hl[10:11] title["app/main.py"] *}
|
||||||
{!../../docs_src/bigger_applications/app/main.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
/// info | Info
|
/// info | Info
|
||||||
|
|
||||||
|
|
@ -466,17 +420,13 @@ Sie enthält einen `APIRouter` mit einigen administrativen *Pfadoperationen*, di
|
||||||
|
|
||||||
In diesem Beispiel wird es ganz einfach sein. Nehmen wir jedoch an, dass wir, da sie mit anderen Projekten in der Organisation geteilt wird, sie nicht ändern und kein `prefix`, `dependencies`, `tags`, usw. direkt zum `APIRouter` hinzufügen können:
|
In diesem Beispiel wird es ganz einfach sein. Nehmen wir jedoch an, dass wir, da sie mit anderen Projekten in der Organisation geteilt wird, sie nicht ändern und kein `prefix`, `dependencies`, `tags`, usw. direkt zum `APIRouter` hinzufügen können:
|
||||||
|
|
||||||
```Python hl_lines="3" title="app/internal/admin.py"
|
{* ../../docs_src/bigger_applications/app_an_py39/internal/admin.py hl[3] title["app/internal/admin.py"] *}
|
||||||
{!../../docs_src/bigger_applications/app/internal/admin.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
Aber wir möchten immer noch ein benutzerdefiniertes `prefix` festlegen, wenn wir den `APIRouter` einbinden, sodass alle seine *Pfadoperationen* mit `/admin` beginnen, wir möchten es mit den `dependencies` sichern, die wir bereits für dieses Projekt haben, und wir möchten `tags` und `responses` hinzufügen.
|
Aber wir möchten immer noch ein benutzerdefiniertes `prefix` festlegen, wenn wir den `APIRouter` einbinden, sodass alle seine *Pfadoperationen* mit `/admin` beginnen, wir möchten es mit den `dependencies` sichern, die wir bereits für dieses Projekt haben, und wir möchten `tags` und `responses` hinzufügen.
|
||||||
|
|
||||||
Wir können das alles deklarieren, ohne den ursprünglichen `APIRouter` ändern zu müssen, indem wir diese Parameter an `app.include_router()` übergeben:
|
Wir können das alles deklarieren, ohne den ursprünglichen `APIRouter` ändern zu müssen, indem wir diese Parameter an `app.include_router()` übergeben:
|
||||||
|
|
||||||
```Python hl_lines="14-17" title="app/main.py"
|
{* ../../docs_src/bigger_applications/app_an_py39/main.py hl[14:17] title["app/main.py"] *}
|
||||||
{!../../docs_src/bigger_applications/app/main.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
Auf diese Weise bleibt der ursprüngliche `APIRouter` unverändert, sodass wir dieselbe `app/internal/admin.py`-Datei weiterhin mit anderen Projekten in der Organisation teilen können.
|
Auf diese Weise bleibt der ursprüngliche `APIRouter` unverändert, sodass wir dieselbe `app/internal/admin.py`-Datei weiterhin mit anderen Projekten in der Organisation teilen können.
|
||||||
|
|
||||||
|
|
@ -497,9 +447,7 @@ Wir können *Pfadoperationen* auch direkt zur `FastAPI`-App hinzufügen.
|
||||||
|
|
||||||
Hier machen wir es ... nur um zu zeigen, dass wir es können 🤷:
|
Hier machen wir es ... nur um zu zeigen, dass wir es können 🤷:
|
||||||
|
|
||||||
```Python hl_lines="21-23" title="app/main.py"
|
{* ../../docs_src/bigger_applications/app_an_py39/main.py hl[21:23] title["app/main.py"] *}
|
||||||
{!../../docs_src/bigger_applications/app/main.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
und es wird korrekt funktionieren, zusammen mit allen anderen *Pfadoperationen*, die mit `app.include_router()` hinzugefügt wurden.
|
und es wird korrekt funktionieren, zusammen mit allen anderen *Pfadoperationen*, die mit `app.include_router()` hinzugefügt wurden.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ Ihre API hat jetzt die Macht, ihre eigene <abbr title="Das ist ein Scherz, nur f
|
||||||
|
|
||||||
Sie können die Modellkonfiguration von Pydantic verwenden, um `extra` Felder zu verbieten (`forbid`):
|
Sie können die Modellkonfiguration von Pydantic verwenden, um `extra` Felder zu verbieten (`forbid`):
|
||||||
|
|
||||||
{* ../../docs_src/cookie_param_models/tutorial002_an_py39.py hl[10] *}
|
{* ../../docs_src/cookie_param_models/tutorial002_an_py310.py hl[10] *}
|
||||||
|
|
||||||
Wenn ein Client versucht, einige **zusätzliche Cookies** zu senden, erhält er eine **Error-<abbr title="Response – Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr>**.
|
Wenn ein Client versucht, einige **zusätzliche Cookies** zu senden, erhält er eine **Error-<abbr title="Response – Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr>**.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -184,6 +184,51 @@ Wenn Sie in dem Code der *Pfadoperation-Funktion* irgendeine Exception auslösen
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
|
## Frühes Beenden und `scope` { #early-exit-and-scope }
|
||||||
|
|
||||||
|
Normalerweise wird der Exit-Code von Abhängigkeiten mit `yield` ausgeführt **nachdem die Response** an den Client gesendet wurde.
|
||||||
|
|
||||||
|
Wenn Sie aber wissen, dass Sie die Abhängigkeit nach der Rückkehr aus der *Pfadoperation-Funktion* nicht mehr benötigen, können Sie `Depends(scope="function")` verwenden, um FastAPI mitzuteilen, dass es die Abhängigkeit nach der Rückkehr aus der *Pfadoperation-Funktion* schließen soll, jedoch **bevor** die **Response gesendet wird**.
|
||||||
|
|
||||||
|
{* ../../docs_src/dependencies/tutorial008e_an_py39.py hl[12,16] *}
|
||||||
|
|
||||||
|
`Depends()` erhält einen `scope`-Parameter, der sein kann:
|
||||||
|
|
||||||
|
* `"function"`: startet die Abhängigkeit vor der *Pfadoperation-Funktion*, die den Request bearbeitet, beendet die Abhängigkeit nach dem Ende der *Pfadoperation-Funktion*, aber **bevor** die Response an den Client zurückgesendet wird. Die Abhängigkeitsfunktion wird also **um** die *Pfadoperation-**Funktion*** **herum** ausgeführt.
|
||||||
|
* `"request"`: startet die Abhängigkeit vor der *Pfadoperation-Funktion*, die den Request bearbeitet (ähnlich wie bei `"function"`), beendet sie jedoch **nachdem** die Response an den Client zurückgesendet wurde. Die Abhängigkeitsfunktion wird also **um** den **Request**- und Response-Zyklus **herum** ausgeführt.
|
||||||
|
|
||||||
|
Wenn nicht angegeben und die Abhängigkeit `yield` hat, hat sie standardmäßig einen `scope` von `"request"`.
|
||||||
|
|
||||||
|
### `scope` für Unterabhängigkeiten { #scope-for-sub-dependencies }
|
||||||
|
|
||||||
|
Wenn Sie eine Abhängigkeit mit `scope="request"` (dem Default) deklarieren, muss jede Unterabhängigkeit ebenfalls einen `scope` von `"request"` haben.
|
||||||
|
|
||||||
|
Eine Abhängigkeit mit `scope` von `"function"` kann jedoch Abhängigkeiten mit `scope` von `"function"` und `scope` von `"request"` haben.
|
||||||
|
|
||||||
|
Das liegt daran, dass jede Abhängigkeit in der Lage sein muss, ihren Exit-Code vor den Unterabhängigkeiten auszuführen, da sie diese während ihres Exit-Codes möglicherweise noch verwenden muss.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
sequenceDiagram
|
||||||
|
|
||||||
|
participant client as Client
|
||||||
|
participant dep_req as Abhängigkeit scope="request"
|
||||||
|
participant dep_func as Abhängigkeit scope="function"
|
||||||
|
participant operation as Pfadoperation
|
||||||
|
|
||||||
|
client ->> dep_req: Startet den Request
|
||||||
|
Note over dep_req: Führt den Code bis zum yield aus
|
||||||
|
dep_req ->> dep_func: Reicht Abhängigkeit weiter
|
||||||
|
Note over dep_func: Führt den Code bis zum yield aus
|
||||||
|
dep_func ->> operation: Führt Pfadoperation mit Abhängigkeit aus
|
||||||
|
operation ->> dep_func: Kehrt aus Pfadoperation zurück
|
||||||
|
Note over dep_func: Führt Code nach yield aus
|
||||||
|
Note over dep_func: ✅ Abhängigkeit geschlossen
|
||||||
|
dep_func ->> client: Sendet Response an Client
|
||||||
|
Note over client: Response gesendet
|
||||||
|
Note over dep_req: Führt Code nach yield aus
|
||||||
|
Note over dep_req: ✅ Abhängigkeit geschlossen
|
||||||
|
```
|
||||||
|
|
||||||
## Abhängigkeiten mit `yield`, `HTTPException`, `except` und Hintergrundtasks { #dependencies-with-yield-httpexception-except-and-background-tasks }
|
## Abhängigkeiten mit `yield`, `HTTPException`, `except` und Hintergrundtasks { #dependencies-with-yield-httpexception-except-and-background-tasks }
|
||||||
|
|
||||||
Abhängigkeiten mit `yield` haben sich im Laufe der Zeit weiterentwickelt, um verschiedene Anwendungsfälle abzudecken und einige Probleme zu beheben.
|
Abhängigkeiten mit `yield` haben sich im Laufe der Zeit weiterentwickelt, um verschiedene Anwendungsfälle abzudecken und einige Probleme zu beheben.
|
||||||
|
|
|
||||||
|
|
@ -143,6 +143,42 @@ Es gibt dutzende Alternativen, die alle auf OpenAPI basieren. Sie können jede d
|
||||||
|
|
||||||
Ebenfalls können Sie es verwenden, um automatisch Code für Clients zu generieren, die mit Ihrer API kommunizieren. Zum Beispiel für Frontend-, Mobile- oder IoT-Anwendungen.
|
Ebenfalls können Sie es verwenden, um automatisch Code für Clients zu generieren, die mit Ihrer API kommunizieren. Zum Beispiel für Frontend-, Mobile- oder IoT-Anwendungen.
|
||||||
|
|
||||||
|
### Ihre App deployen (optional) { #deploy-your-app-optional }
|
||||||
|
|
||||||
|
Sie können optional Ihre FastAPI-App in der <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a> deployen, treten Sie der Warteliste bei, falls Sie es noch nicht getan haben. 🚀
|
||||||
|
|
||||||
|
Wenn Sie bereits ein **FastAPI Cloud**-Konto haben (wir haben Sie von der Warteliste eingeladen 😉), können Sie Ihre Anwendung mit einem Befehl deployen.
|
||||||
|
|
||||||
|
Vor dem Deployen, stellen Sie sicher, dass Sie eingeloggt sind:
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ fastapi login
|
||||||
|
|
||||||
|
You are logged in to FastAPI Cloud 🚀
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Dann stellen Sie Ihre App 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. ✨
|
||||||
|
|
||||||
## Zusammenfassung, Schritt für Schritt { #recap-step-by-step }
|
## Zusammenfassung, Schritt für Schritt { #recap-step-by-step }
|
||||||
|
|
||||||
### Schritt 1: `FastAPI` importieren { #step-1-import-fastapi }
|
### Schritt 1: `FastAPI` importieren { #step-1-import-fastapi }
|
||||||
|
|
@ -155,7 +191,7 @@ Ebenfalls können Sie es verwenden, um automatisch Code für Clients zu generier
|
||||||
|
|
||||||
`FastAPI` ist eine Klasse, die direkt von `Starlette` erbt.
|
`FastAPI` ist eine Klasse, die direkt von `Starlette` erbt.
|
||||||
|
|
||||||
Sie können alle <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a>-Funktionalitäten auch mit `FastAPI` nutzen.
|
Sie können alle <a href="https://www.starlette.dev/" class="external-link" target="_blank">Starlette</a>-Funktionalitäten auch mit `FastAPI` nutzen.
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
|
|
@ -314,6 +350,26 @@ Sie können auch Pydantic-Modelle zurückgeben (dazu später mehr).
|
||||||
|
|
||||||
Es gibt viele andere Objekte und Modelle, die automatisch zu JSON konvertiert werden (einschließlich ORMs, usw.). Versuchen Sie, Ihre Lieblingsobjekte zu verwenden. Es ist sehr wahrscheinlich, dass sie bereits unterstützt werden.
|
Es gibt viele andere Objekte und Modelle, die automatisch zu JSON konvertiert werden (einschließlich ORMs, usw.). Versuchen Sie, Ihre Lieblingsobjekte zu verwenden. Es ist sehr wahrscheinlich, dass sie bereits unterstützt werden.
|
||||||
|
|
||||||
|
### Schritt 6: Deployen { #step-6-deploy-it }
|
||||||
|
|
||||||
|
Stellen Sie Ihre App in der **<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** mit einem Befehl bereit: `fastapi deploy`. 🎉
|
||||||
|
|
||||||
|
#### Über FastAPI Cloud { #about-fastapi-cloud }
|
||||||
|
|
||||||
|
**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** wird vom selben Autor und Team hinter **FastAPI** entwickelt.
|
||||||
|
|
||||||
|
Es vereinfacht den Prozess des Erstellens, Deployens und des Zugriffs auf eine API mit minimalem Aufwand.
|
||||||
|
|
||||||
|
Es bringt die gleiche **Developer-Experience** beim Erstellen von Apps mit FastAPI auch zum **Deployment** in der Cloud. 🎉
|
||||||
|
|
||||||
|
FastAPI Cloud ist der Hauptsponsor und Finanzierer der „FastAPI and friends“ Open-Source-Projekte. ✨
|
||||||
|
|
||||||
|
#### Zu 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 bereitzustellen. 🤓
|
||||||
|
|
||||||
## Zusammenfassung { #recap }
|
## Zusammenfassung { #recap }
|
||||||
|
|
||||||
* Importieren Sie `FastAPI`.
|
* Importieren Sie `FastAPI`.
|
||||||
|
|
@ -321,3 +377,4 @@ Es gibt viele andere Objekte und Modelle, die automatisch zu JSON konvertiert we
|
||||||
* Schreiben Sie einen **Pfadoperation-Dekorator** unter Verwendung von Dekoratoren wie `@app.get("/")`.
|
* Schreiben Sie einen **Pfadoperation-Dekorator** unter Verwendung von Dekoratoren wie `@app.get("/")`.
|
||||||
* Definieren Sie eine **Pfadoperation-Funktion**, zum Beispiel `def root(): ...`.
|
* Definieren Sie eine **Pfadoperation-Funktion**, zum Beispiel `def root(): ...`.
|
||||||
* Starten Sie den Entwicklungsserver mit dem Befehl `fastapi dev`.
|
* Starten Sie den Entwicklungsserver mit dem Befehl `fastapi dev`.
|
||||||
|
* Optional: Ihre App mit `fastapi deploy` deployen.
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,7 @@ Aber falls Sie es für ein fortgeschrittenes Szenario benötigen, können Sie be
|
||||||
|
|
||||||
## Benutzerdefinierte Exceptionhandler installieren { #install-custom-exception-handlers }
|
## Benutzerdefinierte Exceptionhandler installieren { #install-custom-exception-handlers }
|
||||||
|
|
||||||
Sie können benutzerdefinierte <abbr title="Ausnahmebehandler: Funktion, die sich um die Bearbeitung einer Exception kümmert">Exceptionhandler</abbr> mit <a href="https://www.starlette.io/exceptions/" class="external-link" target="_blank">den gleichen Exception-Werkzeugen von Starlette</a> hinzufügen.
|
Sie können benutzerdefinierte <abbr title="Ausnahmebehandler: Funktion, die sich um die Bearbeitung einer Exception kümmert">Exceptionhandler</abbr> mit <a href="https://www.starlette.dev/exceptions/" class="external-link" target="_blank">den gleichen Exception-Werkzeugen von Starlette</a> hinzufügen.
|
||||||
|
|
||||||
Angenommen, Sie haben eine benutzerdefinierte Exception `UnicornException`, die Sie (oder eine Bibliothek, die Sie verwenden) `raise`n könnten.
|
Angenommen, Sie haben eine benutzerdefinierte Exception `UnicornException`, die Sie (oder eine Bibliothek, die Sie verwenden) `raise`n könnten.
|
||||||
|
|
||||||
|
|
@ -127,7 +127,7 @@ Um diesen zu überschreiben, importieren Sie den `RequestValidationError` und ve
|
||||||
|
|
||||||
Der Exceptionhandler erhält einen `Request` und die Exception.
|
Der Exceptionhandler erhält einen `Request` und die Exception.
|
||||||
|
|
||||||
{* ../../docs_src/handling_errors/tutorial004.py hl[2,14:16] *}
|
{* ../../docs_src/handling_errors/tutorial004.py hl[2,14:19] *}
|
||||||
|
|
||||||
Wenn Sie nun zu `/items/foo` gehen, erhalten Sie anstelle des standardmäßigen JSON-Fehlers mit:
|
Wenn Sie nun zu `/items/foo` gehen, erhalten Sie anstelle des standardmäßigen JSON-Fehlers mit:
|
||||||
|
|
||||||
|
|
@ -149,36 +149,17 @@ Wenn Sie nun zu `/items/foo` gehen, erhalten Sie anstelle des standardmäßigen
|
||||||
eine Textversion mit:
|
eine Textversion mit:
|
||||||
|
|
||||||
```
|
```
|
||||||
1 validation error
|
Validation errors:
|
||||||
path -> item_id
|
Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to parse string as an integer
|
||||||
value is not a valid integer (type=type_error.integer)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### `RequestValidationError` vs. `ValidationError` { #requestvalidationerror-vs-validationerror }
|
|
||||||
|
|
||||||
/// warning | Achtung
|
|
||||||
|
|
||||||
Dies sind technische Details, die Sie überspringen können, wenn sie für Sie jetzt nicht wichtig sind.
|
|
||||||
|
|
||||||
///
|
|
||||||
|
|
||||||
`RequestValidationError` ist eine Unterklasse von Pydantics <a href="https://docs.pydantic.dev/latest/concepts/models/#error-handling" class="external-link" target="_blank">`ValidationError`</a>.
|
|
||||||
|
|
||||||
**FastAPI** verwendet diesen so, dass, wenn Sie ein Pydantic-Modell in `response_model` verwenden und Ihre Daten einen Fehler haben, Sie den Fehler in Ihrem Log sehen.
|
|
||||||
|
|
||||||
Aber der Client/Benutzer wird ihn nicht sehen. Stattdessen erhält der Client einen „Internal Server Error“ mit einem HTTP-Statuscode `500`.
|
|
||||||
|
|
||||||
Es sollte so sein, denn wenn Sie einen Pydantic `ValidationError` in Ihrer *Response* oder irgendwo anders in Ihrem Code haben (nicht im *Request* des Clients), ist es tatsächlich ein Fehler in Ihrem Code.
|
|
||||||
|
|
||||||
Und während Sie den Fehler beheben, sollten Ihre Clients/Benutzer keinen Zugriff auf interne Informationen über den Fehler haben, da das eine Sicherheitslücke aufdecken könnte.
|
|
||||||
|
|
||||||
### Überschreiben des `HTTPException`-Fehlerhandlers { #override-the-httpexception-error-handler }
|
### Überschreiben des `HTTPException`-Fehlerhandlers { #override-the-httpexception-error-handler }
|
||||||
|
|
||||||
Auf die gleiche Weise können Sie den `HTTPException`-Handler überschreiben.
|
Auf die gleiche Weise können Sie den `HTTPException`-Handler überschreiben.
|
||||||
|
|
||||||
Zum Beispiel könnten Sie eine Klartext-Response statt JSON für diese Fehler zurückgeben wollen:
|
Zum Beispiel könnten Sie eine Klartext-Response statt JSON für diese Fehler zurückgeben wollen:
|
||||||
|
|
||||||
{* ../../docs_src/handling_errors/tutorial004.py hl[3:4,9:11,22] *}
|
{* ../../docs_src/handling_errors/tutorial004.py hl[3:4,9:11,25] *}
|
||||||
|
|
||||||
/// note | Technische Details
|
/// note | Technische Details
|
||||||
|
|
||||||
|
|
@ -188,6 +169,14 @@ Sie könnten auch `from starlette.responses import PlainTextResponse` verwenden.
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
|
/// warning | Achtung
|
||||||
|
|
||||||
|
Beachten Sie, dass der `RequestValidationError` Informationen über den Dateinamen und die Zeile enthält, in der der Validierungsfehler auftritt, sodass Sie ihn bei Bedarf mit den relevanten Informationen in Ihren Logs anzeigen können.
|
||||||
|
|
||||||
|
Das bedeutet aber auch, dass, wenn Sie ihn einfach in einen String umwandeln und diese Informationen direkt zurückgeben, Sie möglicherweise ein paar Informationen über Ihr System preisgeben. Daher extrahiert und zeigt der Code hier jeden Fehler getrennt.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
### Verwenden des `RequestValidationError`-Bodys { #use-the-requestvalidationerror-body }
|
### Verwenden des `RequestValidationError`-Bodys { #use-the-requestvalidationerror-body }
|
||||||
|
|
||||||
Der `RequestValidationError` enthält den empfangenen `body` mit den ungültigen Daten.
|
Der `RequestValidationError` enthält den empfangenen `body` mit den ungültigen Daten.
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ Die Middleware-Funktion erhält:
|
||||||
|
|
||||||
Beachten Sie, dass benutzerdefinierte proprietäre Header hinzugefügt werden können <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">unter Verwendung des `X-`-Präfixes</a>.
|
Beachten Sie, dass benutzerdefinierte proprietäre Header hinzugefügt werden können <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">unter Verwendung des `X-`-Präfixes</a>.
|
||||||
|
|
||||||
Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen soll, müssen Sie sie zu Ihrer CORS-Konfiguration ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) hinzufügen, indem Sie den Parameter `expose_headers` verwenden, der in der <a href="https://www.starlette.io/middleware/#corsmiddleware" class="external-link" target="_blank">Starlettes CORS-Dokumentation</a> dokumentiert ist.
|
Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen soll, müssen Sie sie zu Ihrer CORS-Konfiguration ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) hinzufügen, indem Sie den Parameter `expose_headers` verwenden, der in der <a href="https://www.starlette.dev/middleware/#corsmiddleware" class="external-link" target="_blank">Starlettes CORS-Dokumentation</a> dokumentiert ist.
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ Es gibt ein paar Unterschiede:
|
||||||
|
|
||||||
* `Field(primary_key=True)` sagt SQLModel, dass die `id` der **Primärschlüssel** in der SQL-Datenbank ist (Sie können mehr über SQL-Primärschlüssel in der SQLModel-Dokumentation erfahren).
|
* `Field(primary_key=True)` sagt SQLModel, dass die `id` der **Primärschlüssel** in der SQL-Datenbank ist (Sie können mehr über SQL-Primärschlüssel in der SQLModel-Dokumentation erfahren).
|
||||||
|
|
||||||
Durch das Festlegen des Typs als `int | None` wird SQLModel wissen, dass diese Spalte ein `INTEGER` in der SQL-Datenbank sein sollte und dass sie `NULLABLE` sein sollte.
|
**Hinweis:** Wir verwenden für das Primärschlüsselfeld `int | None`, damit wir im Python-Code *ein Objekt ohne `id` erstellen* können (`id=None`), in der Annahme, dass die Datenbank sie *beim Speichern generiert*. SQLModel versteht, dass die Datenbank die `id` bereitstellt, und *definiert die Spalte im Datenbankschema als ein Nicht-Null-`INTEGER`*. Siehe die <a href="https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id" class="external-link" target="_blank">SQLModel-Dokumentation zu Primärschlüsseln</a> für Details.
|
||||||
|
|
||||||
* `Field(index=True)` sagt SQLModel, dass es einen **SQL-Index** für diese Spalte erstellen soll, was schnelleres Suchen in der Datenbank ermöglicht, wenn Daten mittels dieser Spalte gefiltert werden.
|
* `Field(index=True)` sagt SQLModel, dass es einen **SQL-Index** für diese Spalte erstellen soll, was schnelleres Suchen in der Datenbank ermöglicht, wenn Daten mittels dieser Spalte gefiltert werden.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,4 +37,4 @@ Alle diese Parameter können anders als „`static`“ lauten, passen Sie sie an
|
||||||
|
|
||||||
## Weitere Informationen { #more-info }
|
## Weitere Informationen { #more-info }
|
||||||
|
|
||||||
Weitere Details und Optionen finden Sie in der <a href="https://www.starlette.io/staticfiles/" class="external-link" target="_blank">Dokumentation von Starlette zu statischen Dateien</a>.
|
Weitere Details und Optionen finden Sie in der <a href="https://www.starlette.dev/staticfiles/" class="external-link" target="_blank">Dokumentation von Starlette zu statischen Dateien</a>.
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# Testen { #testing }
|
# Testen { #testing }
|
||||||
|
|
||||||
Dank <a href="https://www.starlette.io/testclient/" class="external-link" target="_blank">Starlette</a> ist das Testen von **FastAPI**-Anwendungen einfach und macht Spaß.
|
Dank <a href="https://www.starlette.dev/testclient/" class="external-link" target="_blank">Starlette</a> ist das Testen von **FastAPI**-Anwendungen einfach und macht Spaß.
|
||||||
|
|
||||||
Es basiert auf <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a>, welches wiederum auf der Grundlage von Requests konzipiert wurde, es ist also sehr vertraut und intuitiv.
|
Es basiert auf <a href="https://www.python-httpx.org" class="external-link" target="_blank">HTTPX</a>, welches wiederum auf der Grundlage von Requests konzipiert wurde, es ist also sehr vertraut und intuitiv.
|
||||||
|
|
||||||
|
|
@ -122,63 +122,13 @@ Sie verfügt über eine `POST`-Operation, die mehrere Fehler zurückgeben könnt
|
||||||
|
|
||||||
Beide *Pfadoperationen* erfordern einen `X-Token`-Header.
|
Beide *Pfadoperationen* erfordern einen `X-Token`-Header.
|
||||||
|
|
||||||
//// tab | Python 3.10+
|
{* ../../docs_src/app_testing/app_b_an_py310/main.py *}
|
||||||
|
|
||||||
```Python
|
|
||||||
{!> ../../docs_src/app_testing/app_b_an_py310/main.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
////
|
|
||||||
|
|
||||||
//// tab | Python 3.9+
|
|
||||||
|
|
||||||
```Python
|
|
||||||
{!> ../../docs_src/app_testing/app_b_an_py39/main.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
////
|
|
||||||
|
|
||||||
//// tab | Python 3.8+
|
|
||||||
|
|
||||||
```Python
|
|
||||||
{!> ../../docs_src/app_testing/app_b_an/main.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
////
|
|
||||||
|
|
||||||
//// tab | Python 3.10+ nicht annotiert
|
|
||||||
|
|
||||||
/// tip | Tipp
|
|
||||||
|
|
||||||
Bevorzugen Sie die `Annotated`-Version, falls möglich.
|
|
||||||
|
|
||||||
///
|
|
||||||
|
|
||||||
```Python
|
|
||||||
{!> ../../docs_src/app_testing/app_b_py310/main.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
////
|
|
||||||
|
|
||||||
//// tab | Python 3.8+ nicht annotiert
|
|
||||||
|
|
||||||
/// tip | Tipp
|
|
||||||
|
|
||||||
Bevorzugen Sie die `Annotated`-Version, falls möglich.
|
|
||||||
|
|
||||||
///
|
|
||||||
|
|
||||||
```Python
|
|
||||||
{!> ../../docs_src/app_testing/app_b/main.py!}
|
|
||||||
```
|
|
||||||
|
|
||||||
////
|
|
||||||
|
|
||||||
### Erweiterte Testdatei { #extended-testing-file }
|
### Erweiterte Testdatei { #extended-testing-file }
|
||||||
|
|
||||||
Anschließend könnten Sie `test_main.py` mit den erweiterten Tests aktualisieren:
|
Anschließend könnten Sie `test_main.py` mit den erweiterten Tests aktualisieren:
|
||||||
|
|
||||||
{* ../../docs_src/app_testing/app_b/test_main.py *}
|
{* ../../docs_src/app_testing/app_b_an_py310/test_main.py *}
|
||||||
|
|
||||||
|
|
||||||
Wenn Sie möchten, dass der Client Informationen im Request übergibt und Sie nicht wissen, wie das geht, können Sie suchen (googeln), wie es mit `httpx` gemacht wird, oder sogar, wie es mit `requests` gemacht wird, da das Design von HTTPX auf dem Design von Requests basiert.
|
Wenn Sie möchten, dass der Client Informationen im Request übergibt und Sie nicht wissen, wie das geht, können Sie suchen (googeln), wie es mit `httpx` gemacht wird, oder sogar, wie es mit `requests` gemacht wird, da das Design von HTTPX auf dem Design von Requests basiert.
|
||||||
|
|
|
||||||
|
|
@ -242,6 +242,26 @@ $ python -m pip install --upgrade pip
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
/// tip | Tipp
|
||||||
|
|
||||||
|
Manchmal kann beim Versuch, `pip` zu aktualisieren, der Fehler **`No module named pip`** auftreten.
|
||||||
|
|
||||||
|
Wenn das passiert, installieren und aktualisieren Sie `pip` mit dem folgenden Befehl:
|
||||||
|
|
||||||
|
<div class="termy">
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ python -m ensurepip --upgrade
|
||||||
|
|
||||||
|
---> 100%
|
||||||
|
```
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
Dieser Befehl installiert `pip`, falls es noch nicht installiert ist, und stellt außerdem sicher, dass die installierte Version von `pip` mindestens so aktuell ist wie die in `ensurepip` verfügbare.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
## `.gitignore` hinzufügen { #add-gitignore }
|
## `.gitignore` hinzufügen { #add-gitignore }
|
||||||
|
|
||||||
Wenn Sie **Git** verwenden (was Sie sollten), fügen Sie eine `.gitignore`-Datei hinzu, um alles in Ihrem `.venv` von Git auszuschließen.
|
Wenn Sie **Git** verwenden (was Sie sollten), fügen Sie eine `.gitignore`-Datei hinzu, um alles in Ihrem `.venv` von Git auszuschließen.
|
||||||
|
|
|
||||||
|
|
@ -185,7 +185,7 @@ Example:
|
||||||
# FastAPI in Containern - Docker { #fastapi-in-containers-docker }
|
# FastAPI in Containern - Docker { #fastapi-in-containers-docker }
|
||||||
»»»
|
»»»
|
||||||
|
|
||||||
3.1) Do not apply rule 3 when there is no space before or no space after the dash.
|
3.1) Do not apply rule 3 when there is no space before or no space after the hyphen.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
|
|
@ -195,13 +195,13 @@ Example:
|
||||||
## Type hints and annotations { #type-hints-and-annotations }
|
## Type hints and annotations { #type-hints-and-annotations }
|
||||||
»»»
|
»»»
|
||||||
|
|
||||||
Translate with (German) – use a short dash:
|
Translate with (German) – notice the hyphen:
|
||||||
|
|
||||||
«««
|
«««
|
||||||
## Typhinweise und -annotationen { #type-hints-and-annotations }
|
## Typhinweise und -annotationen { #type-hints-and-annotations }
|
||||||
»»»
|
»»»
|
||||||
|
|
||||||
Do NOT translate with (German):
|
Do NOT translate with (German) – notice the dash:
|
||||||
|
|
||||||
«««
|
«««
|
||||||
## Typhinweise und –annotationen { #type-hints-and-annotations }
|
## Typhinweise und –annotationen { #type-hints-and-annotations }
|
||||||
|
|
@ -222,7 +222,7 @@ Ich versuche nicht, alles einzudeutschen. Das bezieht sich besonders auf Begriff
|
||||||
|
|
||||||
### List of English terms and their preferred German translations
|
### List of English terms and their preferred German translations
|
||||||
|
|
||||||
Below is a list of English terms and their preferred German translations, separated by a colon («:»). Use these translations, do not use your own. If an existing translation does not use these terms, update it to use them. A term or a translation may be followed by an explanation in brackets, which explains when to translate the term this way. If a translation is preceded by «NOT», then that means: do NOT use this translation for this term. English nouns, starting with the word «the», have the German genus – «der», «die», «das» – prepended to their German translation, to help you to grammatically decline them in the translation. They are given in singular case, unless they have «(plural)» attached, which means they are given in plural case. Verbs are given in the full infinitive – starting with the word «to».
|
Below is a list of English terms and their preferred German translations, separated by a colon («:»). Use these translations, do not use your own. If an existing translation does not use these terms, update it to use them. In the below list, a term or a translation may be followed by an explanation in brackets, which explains when to translate the term this way. If a translation is preceded by «NOT», then that means: do NOT use this translation for this term. English nouns, starting with the word «the», have the German genus – «der», «die», «das» – prepended to their German translation, to help you to grammatically decline them in the translation. They are given in singular case, unless they have «(plural)» attached, which means they are given in plural case. Verbs are given in the full infinitive – starting with the word «to».
|
||||||
|
|
||||||
* «/// check»: «/// check | Testen»
|
* «/// check»: «/// check | Testen»
|
||||||
* «/// danger»: «/// danger | Gefahr»
|
* «/// danger»: «/// danger | Gefahr»
|
||||||
|
|
@ -255,6 +255,7 @@ Below is a list of English terms and their preferred German translations, separa
|
||||||
* «the default value»: «der Defaultwert»
|
* «the default value»: «der Defaultwert»
|
||||||
* «the default value»: NOT «der Standardwert»
|
* «the default value»: NOT «der Standardwert»
|
||||||
* «the default declaration»: «die Default-Deklaration»
|
* «the default declaration»: «die Default-Deklaration»
|
||||||
|
* «the deployment»: «das Deployment»
|
||||||
* «the dict»: «das Dict»
|
* «the dict»: «das Dict»
|
||||||
* «the dictionary»: «das Dictionary»
|
* «the dictionary»: «das Dictionary»
|
||||||
* «the enumeration»: «die Enumeration»
|
* «the enumeration»: «die Enumeration»
|
||||||
|
|
@ -316,6 +317,7 @@ Below is a list of English terms and their preferred German translations, separa
|
||||||
* «the worker process»: «der Workerprozess»
|
* «the worker process»: «der Workerprozess»
|
||||||
* «the worker process»: NOT «der Arbeiterprozess»
|
* «the worker process»: NOT «der Arbeiterprozess»
|
||||||
* «to commit»: «committen»
|
* «to commit»: «committen»
|
||||||
|
* «to deploy» (in the cloud): «deployen»
|
||||||
* «to modify»: «ändern»
|
* «to modify»: «ändern»
|
||||||
* «to serve» (an application): «bereitstellen»
|
* «to serve» (an application): «bereitstellen»
|
||||||
* «to serve» (a response): «ausliefern»
|
* «to serve» (a response): «ausliefern»
|
||||||
|
|
|
||||||
|
|
@ -140,7 +140,7 @@ async with lifespan(app):
|
||||||
|
|
||||||
/// info
|
/// info
|
||||||
|
|
||||||
👆 💪 ✍ 🌅 🔃 👫 🎉 🐕🦺 <a href="https://www.starlette.io/events/" class="external-link" target="_blank">💃 🎉' 🩺</a>.
|
👆 💪 ✍ 🌅 🔃 👫 🎉 🐕🦺 <a href="https://www.starlette.dev/events/" class="external-link" target="_blank">💃 🎉' 🩺</a>.
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -92,4 +92,4 @@ app.add_middleware(UnicornMiddleware, some_config="rainbow")
|
||||||
* <a href="https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py" class="external-link" target="_blank">Uvicorn `ProxyHeadersMiddleware`</a>
|
* <a href="https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py" class="external-link" target="_blank">Uvicorn `ProxyHeadersMiddleware`</a>
|
||||||
* <a href="https://github.com/florimondmanca/msgpack-asgi" class="external-link" target="_blank">🇸🇲</a>
|
* <a href="https://github.com/florimondmanca/msgpack-asgi" class="external-link" target="_blank">🇸🇲</a>
|
||||||
|
|
||||||
👀 🎏 💪 🛠️ ✅ <a href="https://www.starlette.io/middleware/" class="external-link" target="_blank">💃 🛠️ 🩺</a> & <a href="https://github.com/florimondmanca/awesome-asgi" class="external-link" target="_blank">🔫 👌 📇</a>.
|
👀 🎏 💪 🛠️ ✅ <a href="https://www.starlette.dev/middleware/" class="external-link" target="_blank">💃 🛠️ 🩺</a> & <a href="https://github.com/florimondmanca/awesome-asgi" class="external-link" target="_blank">🔫 👌 📇</a>.
|
||||||
|
|
|
||||||
|
|
@ -48,4 +48,4 @@
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
👀 🌐 💪 🔢 & 🎛, ✅ <a href="https://www.starlette.io/responses/#set-cookie" class="external-link" target="_blank">🧾 💃</a>.
|
👀 🌐 💪 🔢 & 🎛, ✅ <a href="https://www.starlette.dev/responses/#set-cookie" class="external-link" target="_blank">🧾 💃</a>.
|
||||||
|
|
|
||||||
|
|
@ -38,4 +38,4 @@
|
||||||
|
|
||||||
✔️ 🤯 👈 🛃 © 🎚 💪 🚮 <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">⚙️ '✖-' 🔡</a>.
|
✔️ 🤯 👈 🛃 © 🎚 💪 🚮 <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">⚙️ '✖-' 🔡</a>.
|
||||||
|
|
||||||
✋️ 🚥 👆 ✔️ 🛃 🎚 👈 👆 💚 👩💻 🖥 💪 👀, 👆 💪 🚮 👫 👆 ⚜ 📳 (✍ 🌅 [⚜ (✖️-🇨🇳 ℹ 🤝)](../tutorial/cors.md){.internal-link target=_blank}), ⚙️ 🔢 `expose_headers` 📄 <a href="https://www.starlette.io/middleware/#corsmiddleware" class="external-link" target="_blank">💃 ⚜ 🩺</a>.
|
✋️ 🚥 👆 ✔️ 🛃 🎚 👈 👆 💚 👩💻 🖥 💪 👀, 👆 💪 🚮 👫 👆 ⚜ 📳 (✍ 🌅 [⚜ (✖️-🇨🇳 ℹ 🤝)](../tutorial/cors.md){.internal-link target=_blank}), ⚙️ 🔢 `expose_headers` 📄 <a href="https://www.starlette.dev/middleware/#corsmiddleware" class="external-link" target="_blank">💃 ⚜ 🩺</a>.
|
||||||
|
|
|
||||||
|
|
@ -81,4 +81,4 @@ $ pip install jinja2
|
||||||
|
|
||||||
## 🌅 ℹ
|
## 🌅 ℹ
|
||||||
|
|
||||||
🌅 ℹ, 🔌 ❔ 💯 📄, ✅ <a href="https://www.starlette.io/templates/" class="external-link" target="_blank">💃 🩺 🔛 📄</a>.
|
🌅 ℹ, 🔌 ❔ 💯 📄, ✅ <a href="https://www.starlette.dev/templates/" class="external-link" target="_blank">💃 🩺 🔛 📄</a>.
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,6 @@
|
||||||
|
|
||||||
/// note
|
/// note
|
||||||
|
|
||||||
🌅 ℹ, ✅ 💃 🧾 <a href="https://www.starlette.io/testclient/#testing-websocket-sessions" class="external-link" target="_blank">🔬 *️⃣ </a>.
|
🌅 ℹ, ✅ 💃 🧾 <a href="https://www.starlette.dev/testclient/#testing-websocket-sessions" class="external-link" target="_blank">🔬 *️⃣ </a>.
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
## ℹ 🔃 `Request` 🎚
|
## ℹ 🔃 `Request` 🎚
|
||||||
|
|
||||||
**FastAPI** 🤙 **💃** 🔘, ⏮️ 🧽 📚 🧰 🔛 🔝, 👆 💪 ⚙️ 💃 <a href="https://www.starlette.io/requests/" class="external-link" target="_blank">`Request`</a> 🎚 🔗 🕐❔ 👆 💪.
|
**FastAPI** 🤙 **💃** 🔘, ⏮️ 🧽 📚 🧰 🔛 🔝, 👆 💪 ⚙️ 💃 <a href="https://www.starlette.dev/requests/" class="external-link" target="_blank">`Request`</a> 🎚 🔗 🕐❔ 👆 💪.
|
||||||
|
|
||||||
⚫️ 🔜 ⛓ 👈 🚥 👆 🤚 📊 ⚪️➡️ `Request` 🎚 🔗 (🖼, ✍ 💪) ⚫️ 🏆 🚫 ✔, 🗜 ⚖️ 📄 (⏮️ 🗄, 🏧 🛠️ 👩💻 🔢) FastAPI.
|
⚫️ 🔜 ⛓ 👈 🚥 👆 🤚 📊 ⚪️➡️ `Request` 🎚 🔗 (🖼, ✍ 💪) ⚫️ 🏆 🚫 ✔, 🗜 ⚖️ 📄 (⏮️ 🗄, 🏧 🛠️ 👩💻 🔢) FastAPI.
|
||||||
|
|
||||||
|
|
@ -45,7 +45,7 @@
|
||||||
|
|
||||||
## `Request` 🧾
|
## `Request` 🧾
|
||||||
|
|
||||||
👆 💪 ✍ 🌅 ℹ 🔃 <a href="https://www.starlette.io/requests/" class="external-link" target="_blank">`Request` 🎚 🛂 💃 🧾 🕸</a>.
|
👆 💪 ✍ 🌅 ℹ 🔃 <a href="https://www.starlette.dev/requests/" class="external-link" target="_blank">`Request` 🎚 🛂 💃 🧾 🕸</a>.
|
||||||
|
|
||||||
/// note | 📡 ℹ
|
/// note | 📡 ℹ
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -182,5 +182,5 @@ Client #1596980209979 left the chat
|
||||||
|
|
||||||
💡 🌅 🔃 🎛, ✅ 💃 🧾:
|
💡 🌅 🔃 🎛, ✅ 💃 🧾:
|
||||||
|
|
||||||
* <a href="https://www.starlette.io/websockets/" class="external-link" target="_blank"> `WebSocket` 🎓</a>.
|
* <a href="https://www.starlette.dev/websockets/" class="external-link" target="_blank"> `WebSocket` 🎓</a>.
|
||||||
* <a href="https://www.starlette.io/endpoints/#websocketendpoint" class="external-link" target="_blank">🎓-⚓️ *️⃣ 🚚</a>.
|
* <a href="https://www.starlette.dev/endpoints/#websocketendpoint" class="external-link" target="_blank">🎓-⚓️ *️⃣ 🚚</a>.
|
||||||
|
|
|
||||||
|
|
@ -417,7 +417,7 @@ Pydantic 🗃 🔬 💽 🔬, 🛠️ & 🧾 (⚙️ 🎻 🔗) ⚓️ 🔛
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
### <a href="https://www.starlette.io/" class="external-link" target="_blank">💃</a>
|
### <a href="https://www.starlette.dev/" class="external-link" target="_blank">💃</a>
|
||||||
|
|
||||||
💃 💿 <abbr title="The new standard for building asynchronous Python web">🔫</abbr> 🛠️/🧰, ❔ 💯 🏗 ↕-🎭 ✳ 🐕🦺.
|
💃 💿 <abbr title="The new standard for building asynchronous Python web">🔫</abbr> 🛠️/🧰, ❔ 💯 🏗 ↕-🎭 ✳ 🐕🦺.
|
||||||
|
|
||||||
|
|
@ -462,7 +462,7 @@ Pydantic 🗃 🔬 💽 🔬, 🛠️ & 🧾 (⚙️ 🎻 🔗) ⚓️ 🔛
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
### <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>
|
### <a href="https://www.uvicorn.dev/" class="external-link" target="_blank">Uvicorn</a>
|
||||||
|
|
||||||
Uvicorn 🌩-⏩ 🔫 💽, 🏗 🔛 uvloop & httptool.
|
Uvicorn 🌩-⏩ 🔫 💽, 🏗 🔛 uvloop & httptool.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
📤 3️⃣ 👑 🎛:
|
📤 3️⃣ 👑 🎛:
|
||||||
|
|
||||||
* <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>: ↕ 🎭 🔫 💽.
|
* <a href="https://www.uvicorn.dev/" class="external-link" target="_blank">Uvicorn</a>: ↕ 🎭 🔫 💽.
|
||||||
* <a href="https://hypercorn.readthedocs.io/" class="external-link" target="_blank">Hypercorn</a>: 🔫 💽 🔗 ⏮️ 🇺🇸🔍/2️⃣ & 🎻 👪 🎏 ⚒.
|
* <a href="https://hypercorn.readthedocs.io/" class="external-link" target="_blank">Hypercorn</a>: 🔫 💽 🔗 ⏮️ 🇺🇸🔍/2️⃣ & 🎻 👪 🎏 ⚒.
|
||||||
* <a href="https://github.com/django/daphne" class="external-link" target="_blank">👸</a>: 🔫 💽 🏗 ✳ 📻.
|
* <a href="https://github.com/django/daphne" class="external-link" target="_blank">👸</a>: 🔫 💽 🏗 ✳ 📻.
|
||||||
|
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
//// tab | Uvicorn
|
//// tab | Uvicorn
|
||||||
|
|
||||||
* <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>, 🌩-⏩ 🔫 💽, 🏗 🔛 uvloop & httptool.
|
* <a href="https://www.uvicorn.dev/" class="external-link" target="_blank">Uvicorn</a>, 🌩-⏩ 🔫 💽, 🏗 🔛 uvloop & httptool.
|
||||||
|
|
||||||
<div class="termy">
|
<div class="termy">
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -159,7 +159,7 @@ FastAPI 🔌 📶 ⏩ ⚙️, ✋️ 📶 🏋️ <abbr title='also known as "co
|
||||||
|
|
||||||
## 💃 ⚒
|
## 💃 ⚒
|
||||||
|
|
||||||
**FastAPI** 🍕 🔗 ⏮️ (& ⚓️ 🔛) <a href="https://www.starlette.io/" class="external-link" target="_blank"><strong>💃</strong></a>. , 🙆 🌖 💃 📟 👆 ✔️, 🔜 👷.
|
**FastAPI** 🍕 🔗 ⏮️ (& ⚓️ 🔛) <a href="https://www.starlette.dev/" class="external-link" target="_blank"><strong>💃</strong></a>. , 🙆 🌖 💃 📟 👆 ✔️, 🔜 👷.
|
||||||
|
|
||||||
`FastAPI` 🤙 🎧-🎓 `Starlette`. , 🚥 👆 ⏪ 💭 ⚖️ ⚙️ 💃, 🌅 🛠️ 🔜 👷 🎏 🌌.
|
`FastAPI` 🤙 🎧-🎓 `Starlette`. , 🚥 👆 ⏪ 💭 ⚖️ ⚙️ 💃, 🌅 🛠️ 🔜 👷 🎏 🌌.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@
|
||||||
|
|
||||||
⤴️ 👤 📉 ⚫️, ⚒ ⚫️ 🍕 🛠️ ⏮️ 🎻 🔗, 🐕🦺 🎏 🌌 🔬 ⚛ 📄, & 📉 👨🎨 🐕🦺 (🆎 ✅, ✍) ⚓️ 🔛 💯 📚 👨🎨.
|
⤴️ 👤 📉 ⚫️, ⚒ ⚫️ 🍕 🛠️ ⏮️ 🎻 🔗, 🐕🦺 🎏 🌌 🔬 ⚛ 📄, & 📉 👨🎨 🐕🦺 (🆎 ✅, ✍) ⚓️ 🔛 💯 📚 👨🎨.
|
||||||
|
|
||||||
⏮️ 🛠️, 👤 📉 <a href="https://www.starlette.io/" class="external-link" target="_blank">**💃**</a>, 🎏 🔑 📄.
|
⏮️ 🛠️, 👤 📉 <a href="https://www.starlette.dev/" class="external-link" target="_blank">**💃**</a>, 🎏 🔑 📄.
|
||||||
|
|
||||||
## 🛠️
|
## 🛠️
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@
|
||||||
|
|
||||||
& 👈 2️⃣ 👜, `scope` & `receive`, ⚫️❔ 💪 ✍ 🆕 `Request` 👐.
|
& 👈 2️⃣ 👜, `scope` & `receive`, ⚫️❔ 💪 ✍ 🆕 `Request` 👐.
|
||||||
|
|
||||||
💡 🌅 🔃 `Request` ✅ <a href="https://www.starlette.io/requests/" class="external-link" target="_blank">💃 🩺 🔃 📨</a>.
|
💡 🌅 🔃 `Request` ✅ <a href="https://www.starlette.dev/requests/" class="external-link" target="_blank">💃 🩺 🔃 📨</a>.
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -125,7 +125,7 @@ FastAPI 🏛, ⏩ (↕-🎭), 🕸 🛠️ 🏗 🛠️ ⏮️ 🐍 3️⃣.8️
|
||||||
|
|
||||||
FastAPI 🧍 🔛 ⌚ 🐘:
|
FastAPI 🧍 🔛 ⌚ 🐘:
|
||||||
|
|
||||||
* <a href="https://www.starlette.io/" class="external-link" target="_blank">💃</a> 🕸 🍕.
|
* <a href="https://www.starlette.dev/" class="external-link" target="_blank">💃</a> 🕸 🍕.
|
||||||
* <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> 📊 🍕.
|
* <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> 📊 🍕.
|
||||||
|
|
||||||
## 👷♂
|
## 👷♂
|
||||||
|
|
@ -140,7 +140,7 @@ $ pip install "fastapi[standard]"
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
👆 🔜 💪 🔫 💽, 🏭 ✅ <a href="https://www.uvicorn.org" class="external-link" target="_blank">Uvicorn</a> ⚖️ <a href="https://github.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a>.
|
👆 🔜 💪 🔫 💽, 🏭 ✅ <a href="https://www.uvicorn.dev" class="external-link" target="_blank">Uvicorn</a> ⚖️ <a href="https://github.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a>.
|
||||||
|
|
||||||
<div class="termy">
|
<div class="termy">
|
||||||
|
|
||||||
|
|
@ -463,7 +463,7 @@ item: Item
|
||||||
|
|
||||||
⚙️ FastAPI / 💃:
|
⚙️ FastAPI / 💃:
|
||||||
|
|
||||||
* <a href="https://www.uvicorn.org" target="_blank"><code>uvicorn</code></a> - 💽 👈 📐 & 🍦 👆 🈸.
|
* <a href="https://www.uvicorn.dev" target="_blank"><code>uvicorn</code></a> - 💽 👈 📐 & 🍦 👆 🈸.
|
||||||
* <a href="https://github.com/ijl/orjson" target="_blank"><code>orjson</code></a> - ✔ 🚥 👆 💚 ⚙️ `ORJSONResponse`.
|
* <a href="https://github.com/ijl/orjson" target="_blank"><code>orjson</code></a> - ✔ 🚥 👆 💚 ⚙️ `ORJSONResponse`.
|
||||||
* <a href="https://github.com/esnme/ultrajson" target="_blank"><code>ujson</code></a> - ✔ 🚥 👆 💚 ⚙️ `UJSONResponse`.
|
* <a href="https://github.com/esnme/ultrajson" target="_blank"><code>ujson</code></a> - ✔ 🚥 👆 💚 ⚙️ `UJSONResponse`.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@
|
||||||
|
|
||||||
## 📡 ℹ
|
## 📡 ℹ
|
||||||
|
|
||||||
🎓 `BackgroundTasks` 👟 🔗 ⚪️➡️ <a href="https://www.starlette.io/background/" class="external-link" target="_blank">`starlette.background`</a>.
|
🎓 `BackgroundTasks` 👟 🔗 ⚪️➡️ <a href="https://www.starlette.dev/background/" class="external-link" target="_blank">`starlette.background`</a>.
|
||||||
|
|
||||||
⚫️ 🗄/🔌 🔗 🔘 FastAPI 👈 👆 💪 🗄 ⚫️ ⚪️➡️ `fastapi` & ❎ 😫 🗄 🎛 `BackgroundTask` (🍵 `s` 🔚) ⚪️➡️ `starlette.background`.
|
⚫️ 🗄/🔌 🔗 🔘 FastAPI 👈 👆 💪 🗄 ⚫️ ⚪️➡️ `fastapi` & ❎ 😫 🗄 🎛 `BackgroundTask` (🍵 `s` 🔚) ⚪️➡️ `starlette.background`.
|
||||||
|
|
||||||
|
|
@ -69,7 +69,7 @@
|
||||||
|
|
||||||
⚫️ 💪 ⚙️ `BackgroundTask` 😞 FastAPI, ✋️ 👆 ✔️ ✍ 🎚 👆 📟 & 📨 💃 `Response` 🔌 ⚫️.
|
⚫️ 💪 ⚙️ `BackgroundTask` 😞 FastAPI, ✋️ 👆 ✔️ ✍ 🎚 👆 📟 & 📨 💃 `Response` 🔌 ⚫️.
|
||||||
|
|
||||||
👆 💪 👀 🌖 ℹ <a href="https://www.starlette.io/background/" class="external-link" target="_blank">💃 🛂 🩺 🖥 📋</a>.
|
👆 💪 👀 🌖 ℹ <a href="https://www.starlette.dev/background/" class="external-link" target="_blank">💃 🛂 🩺 🖥 📋</a>.
|
||||||
|
|
||||||
## ⚠
|
## ⚠
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -139,7 +139,7 @@ INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
|
||||||
|
|
||||||
`FastAPI` 🎓 👈 😖 🔗 ⚪️➡️ `Starlette`.
|
`FastAPI` 🎓 👈 😖 🔗 ⚪️➡️ `Starlette`.
|
||||||
|
|
||||||
👆 💪 ⚙️ 🌐 <a href="https://www.starlette.io/" class="external-link" target="_blank">💃</a> 🛠️ ⏮️ `FastAPI` 💁♂️.
|
👆 💪 ⚙️ 🌐 <a href="https://www.starlette.dev/" class="external-link" target="_blank">💃</a> 🛠️ ⏮️ `FastAPI` 💁♂️.
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,7 @@
|
||||||
|
|
||||||
## ❎ 🛃 ⚠ 🐕🦺
|
## ❎ 🛃 ⚠ 🐕🦺
|
||||||
|
|
||||||
👆 💪 🚮 🛃 ⚠ 🐕🦺 ⏮️ <a href="https://www.starlette.io/exceptions/" class="external-link" target="_blank">🎏 ⚠ 🚙 ⚪️➡️ 💃</a>.
|
👆 💪 🚮 🛃 ⚠ 🐕🦺 ⏮️ <a href="https://www.starlette.dev/exceptions/" class="external-link" target="_blank">🎏 ⚠ 🚙 ⚪️➡️ 💃</a>.
|
||||||
|
|
||||||
➡️ 💬 👆 ✔️ 🛃 ⚠ `UnicornException` 👈 👆 (⚖️ 🗃 👆 ⚙️) 💪 `raise`.
|
➡️ 💬 👆 ✔️ 🛃 ⚠ `UnicornException` 👈 👆 (⚖️ 🗃 👆 ⚙️) 💪 `raise`.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@
|
||||||
|
|
||||||
✔️ 🤯 👈 🛃 © 🎚 💪 🚮 <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">⚙️ '✖-' 🔡</a>.
|
✔️ 🤯 👈 🛃 © 🎚 💪 🚮 <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers" class="external-link" target="_blank">⚙️ '✖-' 🔡</a>.
|
||||||
|
|
||||||
✋️ 🚥 👆 ✔️ 🛃 🎚 👈 👆 💚 👩💻 🖥 💪 👀, 👆 💪 🚮 👫 👆 ⚜ 📳 ([⚜ (✖️-🇨🇳 ℹ 🤝)](cors.md){.internal-link target=_blank}) ⚙️ 🔢 `expose_headers` 📄 <a href="https://www.starlette.io/middleware/#corsmiddleware" class="external-link" target="_blank">💃 ⚜ 🩺</a>.
|
✋️ 🚥 👆 ✔️ 🛃 🎚 👈 👆 💚 👩💻 🖥 💪 👀, 👆 💪 🚮 👫 👆 ⚜ 📳 ([⚜ (✖️-🇨🇳 ℹ 🤝)](cors.md){.internal-link target=_blank}) ⚙️ 🔢 `expose_headers` 📄 <a href="https://www.starlette.dev/middleware/#corsmiddleware" class="external-link" target="_blank">💃 ⚜ 🩺</a>.
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,4 +37,4 @@
|
||||||
|
|
||||||
## 🌅 ℹ
|
## 🌅 ℹ
|
||||||
|
|
||||||
🌖 ℹ & 🎛 ✅ <a href="https://www.starlette.io/staticfiles/" class="external-link" target="_blank">💃 🩺 🔃 🎻 📁</a>.
|
🌖 ℹ & 🎛 ✅ <a href="https://www.starlette.dev/staticfiles/" class="external-link" target="_blank">💃 🩺 🔃 🎻 📁</a>.
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
# 🔬
|
# 🔬
|
||||||
|
|
||||||
👏 <a href="https://www.starlette.io/testclient/" class="external-link" target="_blank">💃</a>, 🔬 **FastAPI** 🈸 ⏩ & 😌.
|
👏 <a href="https://www.starlette.dev/testclient/" class="external-link" target="_blank">💃</a>, 🔬 **FastAPI** 🈸 ⏩ & 😌.
|
||||||
|
|
||||||
⚫️ ⚓️ 🔛 <a href="https://www.python-httpx.org" class="external-link" target="_blank">🇸🇲</a>, ❔ 🔄 🏗 ⚓️ 🔛 📨, ⚫️ 📶 😰 & 🏋️.
|
⚫️ ⚓️ 🔛 <a href="https://www.python-httpx.org" class="external-link" target="_blank">🇸🇲</a>, ❔ 🔄 🏗 ⚓️ 🔛 📨, ⚫️ 📶 😰 & 🏋️.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,21 @@
|
||||||
tiangolo:
|
tiangolo:
|
||||||
login: tiangolo
|
login: tiangolo
|
||||||
count: 782
|
count: 808
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
||||||
url: https://github.com/tiangolo
|
url: https://github.com/tiangolo
|
||||||
dependabot:
|
dependabot:
|
||||||
login: dependabot
|
login: dependabot
|
||||||
count: 117
|
count: 130
|
||||||
avatarUrl: https://avatars.githubusercontent.com/in/29110?v=4
|
avatarUrl: https://avatars.githubusercontent.com/in/29110?v=4
|
||||||
url: https://github.com/apps/dependabot
|
url: https://github.com/apps/dependabot
|
||||||
alejsdev:
|
alejsdev:
|
||||||
login: alejsdev
|
login: alejsdev
|
||||||
count: 52
|
count: 52
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=447d12a1b347f466b35378bee4c7104cc9b2c571&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=85ceac49fb87138aebe8d663912e359447329090&v=4
|
||||||
url: https://github.com/alejsdev
|
url: https://github.com/alejsdev
|
||||||
pre-commit-ci:
|
pre-commit-ci:
|
||||||
login: pre-commit-ci
|
login: pre-commit-ci
|
||||||
count: 45
|
count: 50
|
||||||
avatarUrl: https://avatars.githubusercontent.com/in/68672?v=4
|
avatarUrl: https://avatars.githubusercontent.com/in/68672?v=4
|
||||||
url: https://github.com/apps/pre-commit-ci
|
url: https://github.com/apps/pre-commit-ci
|
||||||
github-actions:
|
github-actions:
|
||||||
|
|
@ -25,44 +25,44 @@ github-actions:
|
||||||
url: https://github.com/apps/github-actions
|
url: https://github.com/apps/github-actions
|
||||||
Kludex:
|
Kludex:
|
||||||
login: Kludex
|
login: Kludex
|
||||||
count: 24
|
count: 25
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4
|
||||||
url: https://github.com/Kludex
|
url: https://github.com/Kludex
|
||||||
|
YuriiMotov:
|
||||||
|
login: YuriiMotov
|
||||||
|
count: 20
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=b9b13d598dddfab529a52d264df80a900bfe7060&v=4
|
||||||
|
url: https://github.com/YuriiMotov
|
||||||
dmontagu:
|
dmontagu:
|
||||||
login: dmontagu
|
login: dmontagu
|
||||||
count: 17
|
count: 17
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/35119617?u=540f30c937a6450812628b9592a1dfe91bbe148e&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/35119617?u=540f30c937a6450812628b9592a1dfe91bbe148e&v=4
|
||||||
url: https://github.com/dmontagu
|
url: https://github.com/dmontagu
|
||||||
|
nilslindemann:
|
||||||
|
login: nilslindemann
|
||||||
|
count: 15
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4
|
||||||
|
url: https://github.com/nilslindemann
|
||||||
|
svlandeg:
|
||||||
|
login: svlandeg
|
||||||
|
count: 14
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4
|
||||||
|
url: https://github.com/svlandeg
|
||||||
euri10:
|
euri10:
|
||||||
login: euri10
|
login: euri10
|
||||||
count: 13
|
count: 13
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1104190?u=321a2e953e6645a7d09b732786c7a8061e0f8a8b&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/1104190?u=321a2e953e6645a7d09b732786c7a8061e0f8a8b&v=4
|
||||||
url: https://github.com/euri10
|
url: https://github.com/euri10
|
||||||
nilslindemann:
|
|
||||||
login: nilslindemann
|
|
||||||
count: 13
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4
|
|
||||||
url: https://github.com/nilslindemann
|
|
||||||
kantandane:
|
kantandane:
|
||||||
login: kantandane
|
login: kantandane
|
||||||
count: 13
|
count: 13
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/3978368?u=cccc199291f991a73b1ebba5abc735a948e0bd16&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/3978368?u=cccc199291f991a73b1ebba5abc735a948e0bd16&v=4
|
||||||
url: https://github.com/kantandane
|
url: https://github.com/kantandane
|
||||||
svlandeg:
|
|
||||||
login: svlandeg
|
|
||||||
count: 11
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4
|
|
||||||
url: https://github.com/svlandeg
|
|
||||||
zhaohan-dong:
|
zhaohan-dong:
|
||||||
login: zhaohan-dong
|
login: zhaohan-dong
|
||||||
count: 11
|
count: 11
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/65422392?u=8260f8781f50248410ebfa4c9bf70e143fe5c9f2&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/65422392?u=8260f8781f50248410ebfa4c9bf70e143fe5c9f2&v=4
|
||||||
url: https://github.com/zhaohan-dong
|
url: https://github.com/zhaohan-dong
|
||||||
YuriiMotov:
|
|
||||||
login: YuriiMotov
|
|
||||||
count: 10
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=b9b13d598dddfab529a52d264df80a900bfe7060&v=4
|
|
||||||
url: https://github.com/YuriiMotov
|
|
||||||
mariacamilagl:
|
mariacamilagl:
|
||||||
login: mariacamilagl
|
login: mariacamilagl
|
||||||
count: 9
|
count: 9
|
||||||
|
|
@ -103,6 +103,11 @@ waynerv:
|
||||||
count: 5
|
count: 5
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/39515546?u=ec35139777597cdbbbddda29bf8b9d4396b429a9&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/39515546?u=ec35139777597cdbbbddda29bf8b9d4396b429a9&v=4
|
||||||
url: https://github.com/waynerv
|
url: https://github.com/waynerv
|
||||||
|
musicinmybrain:
|
||||||
|
login: musicinmybrain
|
||||||
|
count: 5
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/6898909?u=9010312053e7141383b9bdf538036c7f37fbaba0&v=4
|
||||||
|
url: https://github.com/musicinmybrain
|
||||||
krishnamadhavan:
|
krishnamadhavan:
|
||||||
login: krishnamadhavan
|
login: krishnamadhavan
|
||||||
count: 5
|
count: 5
|
||||||
|
|
@ -133,11 +138,6 @@ iudeen:
|
||||||
count: 4
|
count: 4
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/10519440?u=f09cdd745e5bf16138f29b42732dd57c7f02bee1&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/10519440?u=f09cdd745e5bf16138f29b42732dd57c7f02bee1&v=4
|
||||||
url: https://github.com/iudeen
|
url: https://github.com/iudeen
|
||||||
musicinmybrain:
|
|
||||||
login: musicinmybrain
|
|
||||||
count: 4
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/6898909?u=9010312053e7141383b9bdf538036c7f37fbaba0&v=4
|
|
||||||
url: https://github.com/musicinmybrain
|
|
||||||
philipokiokio:
|
philipokiokio:
|
||||||
login: philipokiokio
|
login: philipokiokio
|
||||||
count: 4
|
count: 4
|
||||||
|
|
@ -158,6 +158,11 @@ prostomarkeloff:
|
||||||
count: 3
|
count: 3
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/28061158?u=6918e39a1224194ba636e897461a02a20126d7ad&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/28061158?u=6918e39a1224194ba636e897461a02a20126d7ad&v=4
|
||||||
url: https://github.com/prostomarkeloff
|
url: https://github.com/prostomarkeloff
|
||||||
|
frankie567:
|
||||||
|
login: frankie567
|
||||||
|
count: 3
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/1144727?u=f3e79acfe4ed207e15c2145161a8a9759925fcd2&v=4
|
||||||
|
url: https://github.com/frankie567
|
||||||
nsidnev:
|
nsidnev:
|
||||||
login: nsidnev
|
login: nsidnev
|
||||||
count: 3
|
count: 3
|
||||||
|
|
@ -191,7 +196,7 @@ Serrones:
|
||||||
uriyyo:
|
uriyyo:
|
||||||
login: uriyyo
|
login: uriyyo
|
||||||
count: 3
|
count: 3
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/32038156?u=0c68019beb28381ce5205a838937c61e0fe3fee2&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/32038156?u=c26ca9b821fcf6499b84db75f553d4980bf8d023&v=4
|
||||||
url: https://github.com/uriyyo
|
url: https://github.com/uriyyo
|
||||||
andrew222651:
|
andrew222651:
|
||||||
login: andrew222651
|
login: andrew222651
|
||||||
|
|
@ -261,7 +266,7 @@ Nimitha-jagadeesha:
|
||||||
lucaromagnoli:
|
lucaromagnoli:
|
||||||
login: lucaromagnoli
|
login: lucaromagnoli
|
||||||
count: 3
|
count: 3
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/38782977?u=e66396859f493b4ddcb3a837a1b2b2039c805417&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/38782977?u=15df02e806a2293af40ac619fba11dbe3c0c4fd4&v=4
|
||||||
url: https://github.com/lucaromagnoli
|
url: https://github.com/lucaromagnoli
|
||||||
salmantec:
|
salmantec:
|
||||||
login: salmantec
|
login: salmantec
|
||||||
|
|
@ -328,11 +333,6 @@ svalouch:
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/54674660?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/54674660?v=4
|
||||||
url: https://github.com/svalouch
|
url: https://github.com/svalouch
|
||||||
frankie567:
|
|
||||||
login: frankie567
|
|
||||||
count: 2
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1144727?u=f3e79acfe4ed207e15c2145161a8a9759925fcd2&v=4
|
|
||||||
url: https://github.com/frankie567
|
|
||||||
marier-nico:
|
marier-nico:
|
||||||
login: marier-nico
|
login: marier-nico
|
||||||
count: 2
|
count: 2
|
||||||
|
|
@ -346,7 +346,7 @@ Dustyposa:
|
||||||
aviramha:
|
aviramha:
|
||||||
login: aviramha
|
login: aviramha
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/41201924?u=6883cc4fc13a7b2e60d4deddd4be06f9c5287880&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/41201924?u=ce5d3ea7037c2e6b3f82eff87e2217d4fb63214b&v=4
|
||||||
url: https://github.com/aviramha
|
url: https://github.com/aviramha
|
||||||
iwpnd:
|
iwpnd:
|
||||||
login: iwpnd
|
login: iwpnd
|
||||||
|
|
@ -483,6 +483,11 @@ nzig:
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/7372858?u=e769add36ed73c778cdb136eb10bf96b1e119671&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/7372858?u=e769add36ed73c778cdb136eb10bf96b1e119671&v=4
|
||||||
url: https://github.com/nzig
|
url: https://github.com/nzig
|
||||||
|
kristjanvalur:
|
||||||
|
login: kristjanvalur
|
||||||
|
count: 2
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/6009543?u=1419f20bbfff8f031be8cb470962e7e62de2595e&v=4
|
||||||
|
url: https://github.com/kristjanvalur
|
||||||
yezz123:
|
yezz123:
|
||||||
login: yezz123
|
login: yezz123
|
||||||
count: 2
|
count: 2
|
||||||
|
|
|
||||||
|
|
@ -1,418 +0,0 @@
|
||||||
Articles:
|
|
||||||
English:
|
|
||||||
- author: Balthazar Rouberol
|
|
||||||
author_link: https://balthazar-rouberol.com
|
|
||||||
link: https://blog.balthazar-rouberol.com/how-to-profile-a-fastapi-asynchronous-request
|
|
||||||
title: How to profile a FastAPI asynchronous request
|
|
||||||
- author: Stephen Siegert - Neon
|
|
||||||
link: https://neon.tech/blog/deploy-a-serverless-fastapi-app-with-neon-postgres-and-aws-app-runner-at-any-scale
|
|
||||||
title: Deploy a Serverless FastAPI App with Neon Postgres and AWS App Runner at any scale
|
|
||||||
- author: Kurtis Pykes - NVIDIA
|
|
||||||
link: https://developer.nvidia.com/blog/building-a-machine-learning-microservice-with-fastapi/
|
|
||||||
title: Building a Machine Learning Microservice with FastAPI
|
|
||||||
- author: Ravgeet Dhillon - Twilio
|
|
||||||
link: https://www.twilio.com/en-us/blog/booking-appointments-twilio-notion-fastapi
|
|
||||||
title: Booking Appointments with Twilio, Notion, and FastAPI
|
|
||||||
- author: Abhinav Tripathi - Microsoft Blogs
|
|
||||||
link: https://devblogs.microsoft.com/cosmosdb/azure-cosmos-db-python-and-fastapi/
|
|
||||||
title: Write a Python data layer with Azure Cosmos DB and FastAPI
|
|
||||||
- author: Donny Peeters
|
|
||||||
author_link: https://github.com/Donnype
|
|
||||||
link: https://bitestreams.com/blog/fastapi-sqlalchemy/
|
|
||||||
title: 10 Tips for adding SQLAlchemy to FastAPI
|
|
||||||
- author: Jessica Temporal
|
|
||||||
author_link: https://jtemporal.com/socials
|
|
||||||
link: https://jtemporal.com/tips-on-migrating-from-flask-to-fastapi-and-vice-versa/
|
|
||||||
title: Tips on migrating from Flask to FastAPI and vice-versa
|
|
||||||
- author: Ankit Anchlia
|
|
||||||
author_link: https://linkedin.com/in/aanchlia21
|
|
||||||
link: https://hackernoon.com/explore-how-to-effectively-use-jwt-with-fastapi
|
|
||||||
title: Explore How to Effectively Use JWT With FastAPI
|
|
||||||
- author: Nicoló Lino
|
|
||||||
author_link: https://www.nlino.com
|
|
||||||
link: https://github.com/softwarebloat/python-tracing-demo
|
|
||||||
title: Instrument FastAPI with OpenTelemetry tracing and visualize traces in Grafana Tempo.
|
|
||||||
- author: Mikhail Rozhkov, Elena Samuylova
|
|
||||||
author_link: https://www.linkedin.com/in/mnrozhkov/
|
|
||||||
link: https://www.evidentlyai.com/blog/fastapi-tutorial
|
|
||||||
title: ML serving and monitoring with FastAPI and Evidently
|
|
||||||
- author: Visual Studio Code Team
|
|
||||||
author_link: https://code.visualstudio.com/
|
|
||||||
link: https://code.visualstudio.com/docs/python/tutorial-fastapi
|
|
||||||
title: FastAPI Tutorial in Visual Studio Code
|
|
||||||
- author: Apitally
|
|
||||||
author_link: https://apitally.io
|
|
||||||
link: https://blog.apitally.io/fastapi-application-monitoring-made-easy
|
|
||||||
title: FastAPI application monitoring made easy
|
|
||||||
- author: John Philip
|
|
||||||
author_link: https://medium.com/@amjohnphilip
|
|
||||||
link: https://python.plainenglish.io/building-a-restful-api-with-fastapi-secure-signup-and-login-functionality-included-45cdbcb36106
|
|
||||||
title: "Building a RESTful API with FastAPI: Secure Signup and Login Functionality Included"
|
|
||||||
- author: Keshav Malik
|
|
||||||
author_link: https://theinfosecguy.xyz/
|
|
||||||
link: https://blog.theinfosecguy.xyz/building-a-crud-api-with-fastapi-and-supabase-a-step-by-step-guide
|
|
||||||
title: Building a CRUD API with FastAPI and Supabase
|
|
||||||
- author: Adejumo Ridwan Suleiman
|
|
||||||
author_link: https://www.linkedin.com/in/adejumoridwan/
|
|
||||||
link: https://medium.com/python-in-plain-english/build-an-sms-spam-classifier-serverless-database-with-faunadb-and-fastapi-23dbb275bc5b
|
|
||||||
title: Build an SMS Spam Classifier Serverless Database with FaunaDB and FastAPI
|
|
||||||
- author: Raf Rasenberg
|
|
||||||
author_link: https://rafrasenberg.com/about/
|
|
||||||
link: https://rafrasenberg.com/fastapi-lambda/
|
|
||||||
title: 'FastAPI lambda container: serverless simplified'
|
|
||||||
- author: Teresa N. Fontanella De Santis
|
|
||||||
author_link: https://dev.to/
|
|
||||||
link: https://dev.to/teresafds/authorization-on-fastapi-with-casbin-41og
|
|
||||||
title: Authorization on FastAPI with Casbin
|
|
||||||
- author: New Relic
|
|
||||||
author_link: https://newrelic.com
|
|
||||||
link: https://newrelic.com/instant-observability/fastapi/e559ec64-f765-4470-a15f-1901fcebb468
|
|
||||||
title: How to monitor FastAPI application performance using Python agent
|
|
||||||
- author: Jean-Baptiste Rocher
|
|
||||||
author_link: https://hashnode.com/@jibrocher
|
|
||||||
link: https://dev.indooroutdoor.io/series/fastapi-react-poll-app
|
|
||||||
title: Building the Poll App From Django Tutorial With FastAPI And React
|
|
||||||
- author: Silvan Melchior
|
|
||||||
author_link: https://github.com/silvanmelchior
|
|
||||||
link: https://blog.devgenius.io/seamless-fastapi-configuration-with-confz-90949c14ea12
|
|
||||||
title: Seamless FastAPI Configuration with ConfZ
|
|
||||||
- author: Kaustubh Gupta
|
|
||||||
author_link: https://medium.com/@kaustubhgupta1828/
|
|
||||||
link: https://levelup.gitconnected.com/5-advance-features-of-fastapi-you-should-try-7c0ac7eebb3e
|
|
||||||
title: 5 Advanced Features of FastAPI You Should Try
|
|
||||||
- author: Kaustubh Gupta
|
|
||||||
author_link: https://medium.com/@kaustubhgupta1828/
|
|
||||||
link: https://www.analyticsvidhya.com/blog/2021/06/deploying-ml-models-as-api-using-fastapi-and-heroku/
|
|
||||||
title: Deploying ML Models as API Using FastAPI and Heroku
|
|
||||||
- link: https://jarmos.netlify.app/posts/using-github-actions-to-deploy-a-fastapi-project-to-heroku/
|
|
||||||
title: Using GitHub Actions to Deploy a FastAPI Project to Heroku
|
|
||||||
author_link: https://jarmos.netlify.app/
|
|
||||||
author: Somraj Saha
|
|
||||||
- author: "@pystar"
|
|
||||||
author_link: https://pystar.substack.com/
|
|
||||||
link: https://pystar.substack.com/p/how-to-create-a-fake-certificate
|
|
||||||
title: How to Create A Fake Certificate Authority And Generate TLS Certs for FastAPI
|
|
||||||
- author: Ben Gamble
|
|
||||||
author_link: https://uk.linkedin.com/in/bengamble7
|
|
||||||
link: https://ably.com/blog/realtime-ticket-booking-solution-kafka-fastapi-ably
|
|
||||||
title: Building a realtime ticket booking solution with Kafka, FastAPI, and Ably
|
|
||||||
- author: Shahriyar(Shako) Rzayev
|
|
||||||
author_link: https://www.linkedin.com/in/shahriyar-rzayev/
|
|
||||||
link: https://www.azepug.az/posts/fastapi/#building-simple-e-commerce-with-nuxtjs-and-fastapi-series
|
|
||||||
title: Building simple E-Commerce with NuxtJS and FastAPI
|
|
||||||
- author: Rodrigo Arenas
|
|
||||||
author_link: https://rodrigo-arenas.medium.com/
|
|
||||||
link: https://medium.com/analytics-vidhya/serve-a-machine-learning-model-using-sklearn-fastapi-and-docker-85aabf96729b
|
|
||||||
title: "Serve a machine learning model using Sklearn, FastAPI and Docker"
|
|
||||||
- author: Yashasvi Singh
|
|
||||||
author_link: https://hashnode.com/@aUnicornDev
|
|
||||||
link: https://aunicorndev.hashnode.dev/series/supafast-api
|
|
||||||
title: "Building an API with FastAPI and Supabase and Deploying on Deta"
|
|
||||||
- author: Navule Pavan Kumar Rao
|
|
||||||
author_link: https://www.linkedin.com/in/navule/
|
|
||||||
link: https://www.tutlinks.com/deploy-fastapi-on-ubuntu-gunicorn-caddy-2/
|
|
||||||
title: Deploy FastAPI on Ubuntu and Serve using Caddy 2 Web Server
|
|
||||||
- author: Patrick Ladon
|
|
||||||
author_link: https://dev.to/factorlive
|
|
||||||
link: https://dev.to/factorlive/python-facebook-messenger-webhook-with-fastapi-on-glitch-4n90
|
|
||||||
title: Python Facebook messenger webhook with FastAPI on Glitch
|
|
||||||
- author: Valon Januzaj
|
|
||||||
author_link: https://www.linkedin.com/in/valon-januzaj-b02692187/
|
|
||||||
link: https://valonjanuzaj.medium.com/deploy-a-dockerized-fastapi-application-to-aws-cc757830ba1b
|
|
||||||
title: Deploy a dockerized FastAPI application to AWS
|
|
||||||
- author: Amit Chaudhary
|
|
||||||
author_link: https://x.com/amitness
|
|
||||||
link: https://amitness.com/2020/06/fastapi-vs-flask/
|
|
||||||
title: FastAPI for Flask Users
|
|
||||||
- author: Louis Guitton
|
|
||||||
author_link: https://x.com/louis_guitton
|
|
||||||
link: https://guitton.co/posts/fastapi-monitoring/
|
|
||||||
title: How to monitor your FastAPI service
|
|
||||||
- author: Precious Ndubueze
|
|
||||||
author_link: https://medium.com/@gabbyprecious2000
|
|
||||||
link: https://medium.com/@gabbyprecious2000/creating-a-crud-app-with-fastapi-part-one-7c049292ad37
|
|
||||||
title: Creating a CRUD App with FastAPI (Part one)
|
|
||||||
- author: Farhad Malik
|
|
||||||
author_link: https://medium.com/@farhadmalik
|
|
||||||
link: https://towardsdatascience.com/build-and-host-fast-data-science-applications-using-fastapi-823be8a1d6a0
|
|
||||||
title: Build And Host Fast Data Science Applications Using FastAPI
|
|
||||||
- author: Navule Pavan Kumar Rao
|
|
||||||
author_link: https://www.linkedin.com/in/navule/
|
|
||||||
link: https://www.tutlinks.com/deploy-fastapi-on-azure/
|
|
||||||
title: Deploy FastAPI on Azure App Service
|
|
||||||
- author: Davide Fiocco
|
|
||||||
author_link: https://github.com/davidefiocco
|
|
||||||
link: https://davidefiocco.github.io/streamlit-fastapi-ml-serving/
|
|
||||||
title: Machine learning model serving in Python using FastAPI and streamlit
|
|
||||||
- author: Netflix
|
|
||||||
author_link: https://netflixtechblog.com/
|
|
||||||
link: https://netflixtechblog.com/introducing-dispatch-da4b8a2a8072
|
|
||||||
title: Introducing Dispatch
|
|
||||||
- author: Stavros Korokithakis
|
|
||||||
author_link: https://x.com/Stavros
|
|
||||||
link: https://www.stavros.io/posts/fastapi-with-django/
|
|
||||||
title: Using FastAPI with Django
|
|
||||||
- author: Twilio
|
|
||||||
author_link: https://www.twilio.com
|
|
||||||
link: https://www.twilio.com/blog/build-secure-twilio-webhook-python-fastapi
|
|
||||||
title: Build a Secure Twilio Webhook with Python and FastAPI
|
|
||||||
- author: Sebastián Ramírez (tiangolo)
|
|
||||||
author_link: https://x.com/tiangolo
|
|
||||||
link: https://dev.to/tiangolo/build-a-web-api-from-scratch-with-fastapi-the-workshop-2ehe
|
|
||||||
title: Build a web API from scratch with FastAPI - the workshop
|
|
||||||
- author: Paul Sec
|
|
||||||
author_link: https://x.com/PaulWebSec
|
|
||||||
link: https://paulsec.github.io/posts/fastapi_plus_zeit_serverless_fu/
|
|
||||||
title: FastAPI + Zeit.co = 🚀
|
|
||||||
- author: cuongld2
|
|
||||||
author_link: https://dev.to/cuongld2
|
|
||||||
link: https://dev.to/cuongld2/build-simple-api-service-with-python-fastapi-part-1-581o
|
|
||||||
title: Build simple API service with Python FastAPI — Part 1
|
|
||||||
- author: Paurakh Sharma Humagain
|
|
||||||
author_link: https://x.com/PaurakhSharma
|
|
||||||
link: https://dev.to/paurakhsharma/microservice-in-python-using-fastapi-24cc
|
|
||||||
title: Microservice in Python using FastAPI
|
|
||||||
- author: Guillermo Cruz
|
|
||||||
author_link: https://wuilly.com/
|
|
||||||
link: https://wuilly.com/2019/10/real-time-notifications-with-python-and-postgres/
|
|
||||||
title: Real-time Notifications with Python and Postgres
|
|
||||||
- author: Navule Pavan Kumar Rao
|
|
||||||
author_link: https://www.linkedin.com/in/navule/
|
|
||||||
link: https://www.tutlinks.com/create-and-deploy-fastapi-app-to-heroku/
|
|
||||||
title: Create and Deploy FastAPI app to Heroku without using Docker
|
|
||||||
- author: Arthur Henrique
|
|
||||||
author_link: https://x.com/arthurheinrique
|
|
||||||
link: https://medium.com/@arthur393/another-boilerplate-to-fastapi-azure-pipeline-ci-pytest-3c8d9a4be0bb
|
|
||||||
title: 'Another Boilerplate to FastAPI: Azure Pipeline CI + Pytest'
|
|
||||||
- author: Shane Soh
|
|
||||||
author_link: https://medium.com/@shane.soh
|
|
||||||
link: https://medium.com/analytics-vidhya/deploy-machine-learning-models-with-keras-fastapi-redis-and-docker-4940df614ece
|
|
||||||
title: Deploy Machine Learning Models with Keras, FastAPI, Redis and Docker
|
|
||||||
- author: Mandy Gu
|
|
||||||
author_link: https://towardsdatascience.com/@mandygu
|
|
||||||
link: https://towardsdatascience.com/deploying-iris-classifications-with-fastapi-and-docker-7c9b83fdec3a
|
|
||||||
title: 'Towards Data Science: Deploying Iris Classifications with FastAPI and Docker'
|
|
||||||
- author: Michael Herman
|
|
||||||
author_link: https://testdriven.io/authors/herman
|
|
||||||
link: https://testdriven.io/blog/fastapi-crud/
|
|
||||||
title: 'TestDriven.io: Developing and Testing an Asynchronous API with FastAPI and Pytest'
|
|
||||||
- author: Bernard Brenyah
|
|
||||||
author_link: https://medium.com/@bbrenyah
|
|
||||||
link: https://medium.com/python-data/how-to-deploy-tensorflow-2-0-models-as-an-api-service-with-fastapi-docker-128b177e81f3
|
|
||||||
title: How To Deploy Tensorflow 2.0 Models As An API Service With FastAPI & Docker
|
|
||||||
- author: Dylan Anthony
|
|
||||||
author_link: https://dev.to/dbanty
|
|
||||||
link: https://dev.to/dbanty/why-i-m-leaving-flask-3ki6
|
|
||||||
title: Why I'm Leaving Flask
|
|
||||||
- author: Mike Moritz
|
|
||||||
author_link: https://medium.com/@mike.p.moritz
|
|
||||||
link: https://medium.com/@mike.p.moritz/using-docker-compose-to-deploy-a-lightweight-python-rest-api-with-a-job-queue-37e6072a209b
|
|
||||||
title: Using Docker Compose to deploy a lightweight Python REST API with a job queue
|
|
||||||
- author: '@euri10'
|
|
||||||
author_link: https://gitlab.com/euri10
|
|
||||||
link: https://gitlab.com/euri10/fastapi_cheatsheet
|
|
||||||
title: A FastAPI and Swagger UI visual cheatsheet
|
|
||||||
- author: Uber Engineering
|
|
||||||
author_link: https://eng.uber.com
|
|
||||||
link: https://eng.uber.com/ludwig-v0-2/
|
|
||||||
title: 'Uber: Ludwig v0.2 Adds New Features and Other Improvements to its Deep Learning Toolbox [including a FastAPI server]'
|
|
||||||
- author: Maarten Grootendorst
|
|
||||||
author_link: https://www.linkedin.com/in/mgrootendorst/
|
|
||||||
link: https://towardsdatascience.com/how-to-deploy-a-machine-learning-model-dc51200fe8cf
|
|
||||||
title: How to Deploy a Machine Learning Model
|
|
||||||
- author: Johannes Gontrum
|
|
||||||
author_link: https://x.com/gntrm
|
|
||||||
link: https://medium.com/@gntrm/jwt-authentication-with-fastapi-and-aws-cognito-1333f7f2729e
|
|
||||||
title: JWT Authentication with FastAPI and AWS Cognito
|
|
||||||
- author: Ankush Thakur
|
|
||||||
author_link: https://geekflare.com/author/ankush/
|
|
||||||
link: https://geekflare.com/python-asynchronous-web-frameworks/
|
|
||||||
title: Top 5 Asynchronous Web Frameworks for Python
|
|
||||||
- author: Nico Axtmann
|
|
||||||
author_link: https://www.linkedin.com/in/nico-axtmann
|
|
||||||
link: https://medium.com/@nico.axtmann95/deploying-a-scikit-learn-model-with-onnx-und-fastapi-1af398268915
|
|
||||||
title: Deploying a scikit-learn model with ONNX and FastAPI
|
|
||||||
- author: Nils de Bruin
|
|
||||||
author_link: https://medium.com/@nilsdebruin
|
|
||||||
link: https://medium.com/data-rebels/fastapi-authentication-revisited-enabling-api-key-authentication-122dc5975680
|
|
||||||
title: 'FastAPI authentication revisited: Enabling API key authentication'
|
|
||||||
- author: Nick Cortale
|
|
||||||
author_link: https://nickc1.github.io/
|
|
||||||
link: https://nickc1.github.io/api,/scikit-learn/2019/01/10/scikit-fastapi.html
|
|
||||||
title: 'FastAPI and Scikit-Learn: Easily Deploy Models'
|
|
||||||
- author: Errieta Kostala
|
|
||||||
author_link: https://dev.to/errietta
|
|
||||||
link: https://dev.to/errietta/introduction-to-the-fastapi-python-framework-2n10
|
|
||||||
title: Introduction to the fastapi python framework
|
|
||||||
- author: Nils de Bruin
|
|
||||||
author_link: https://medium.com/@nilsdebruin
|
|
||||||
link: https://medium.com/data-rebels/fastapi-how-to-add-basic-and-cookie-authentication-a45c85ef47d3
|
|
||||||
title: FastAPI — How to add basic and cookie authentication
|
|
||||||
- author: Nils de Bruin
|
|
||||||
author_link: https://medium.com/@nilsdebruin
|
|
||||||
link: https://medium.com/data-rebels/fastapi-google-as-an-external-authentication-provider-3a527672cf33
|
|
||||||
title: FastAPI — Google as an external authentication provider
|
|
||||||
- author: William Hayes
|
|
||||||
author_link: https://medium.com/@williamhayes
|
|
||||||
link: https://medium.com/@williamhayes/fastapi-starlette-debug-vs-prod-5f7561db3a59
|
|
||||||
title: FastAPI/Starlette debug vs prod
|
|
||||||
- author: Mukul Mantosh
|
|
||||||
author_link: https://x.com/MantoshMukul
|
|
||||||
link: https://www.jetbrains.com/pycharm/guide/tutorials/fastapi-aws-kubernetes/
|
|
||||||
title: Developing FastAPI Application using K8s & AWS
|
|
||||||
- author: KrishNa
|
|
||||||
author_link: https://medium.com/@krishnardt365
|
|
||||||
link: https://medium.com/@krishnardt365/fastapi-docker-and-postgres-91943e71be92
|
|
||||||
title: Fastapi, Docker(Docker compose) and Postgres
|
|
||||||
- author: Devon Ray
|
|
||||||
author_link: https://devonray.com
|
|
||||||
link: https://devonray.com/blog/deploying-a-fastapi-project-using-aws-lambda-aurora-cdk
|
|
||||||
title: Deployment using Docker, Lambda, Aurora, CDK & GH Actions
|
|
||||||
- author: Shubhendra Kushwaha
|
|
||||||
author_link: https://www.linkedin.com/in/theshubhendra/
|
|
||||||
link: https://theshubhendra.medium.com/mastering-soft-delete-advanced-sqlalchemy-techniques-4678f4738947
|
|
||||||
title: 'Mastering Soft Delete: Advanced SQLAlchemy Techniques'
|
|
||||||
- author: Shubhendra Kushwaha
|
|
||||||
author_link: https://www.linkedin.com/in/theshubhendra/
|
|
||||||
link: https://theshubhendra.medium.com/role-based-row-filtering-advanced-sqlalchemy-techniques-733e6b1328f6
|
|
||||||
title: 'Role based row filtering: Advanced SQLAlchemy Techniques'
|
|
||||||
German:
|
|
||||||
- author: Marcel Sander (actidoo)
|
|
||||||
author_link: https://www.actidoo.com
|
|
||||||
link: https://www.actidoo.com/de/blog/python-fastapi-domain-driven-design
|
|
||||||
title: Domain-driven Design mit Python und FastAPI
|
|
||||||
- author: Nico Axtmann
|
|
||||||
author_link: https://x.com/_nicoax
|
|
||||||
link: https://blog.codecentric.de/2019/08/inbetriebnahme-eines-scikit-learn-modells-mit-onnx-und-fastapi/
|
|
||||||
title: Inbetriebnahme eines scikit-learn-Modells mit ONNX und FastAPI
|
|
||||||
- author: Felix Schürmeyer
|
|
||||||
author_link: https://hellocoding.de/autor/felix-schuermeyer/
|
|
||||||
link: https://hellocoding.de/blog/coding-language/python/fastapi
|
|
||||||
title: REST-API Programmieren mittels Python und dem FastAPI Modul
|
|
||||||
Japanese:
|
|
||||||
- author: '@bee2'
|
|
||||||
author_link: https://qiita.com/bee2
|
|
||||||
link: https://qiita.com/bee2/items/75d9c0d7ba20e7a4a0e9
|
|
||||||
title: '[FastAPI] Python製のASGI Web フレームワーク FastAPIに入門する'
|
|
||||||
- author: '@bee2'
|
|
||||||
author_link: https://qiita.com/bee2
|
|
||||||
link: https://qiita.com/bee2/items/0ad260ab9835a2087dae
|
|
||||||
title: PythonのWeb frameworkのパフォーマンス比較 (Django, Flask, responder, FastAPI, japronto)
|
|
||||||
- author: ライトコードメディア編集部
|
|
||||||
author_link: https://rightcode.co.jp/author/jun
|
|
||||||
link: https://rightcode.co.jp/blog/information-technology/fastapi-tutorial-todo-apps-admin-page-improvement
|
|
||||||
title: '【第4回】FastAPIチュートリアル: toDoアプリを作ってみよう【管理者ページ改良編】'
|
|
||||||
- author: ライトコードメディア編集部
|
|
||||||
author_link: https://rightcode.co.jp/author/jun
|
|
||||||
link: https://rightcode.co.jp/blog/information-technology/fastapi-tutorial-todo-apps-authentication-user-registration
|
|
||||||
title: '【第3回】FastAPIチュートリアル: toDoアプリを作ってみよう【認証・ユーザ登録編】'
|
|
||||||
- author: ライトコードメディア編集部
|
|
||||||
author_link: https://rightcode.co.jp/author/jun
|
|
||||||
link: https://rightcode.co.jp/blog/information-technology/fastapi-tutorial-todo-apps-model-building
|
|
||||||
title: '【第2回】FastAPIチュートリアル: ToDoアプリを作ってみよう【モデル構築編】'
|
|
||||||
- author: ライトコードメディア編集部
|
|
||||||
author_link: https://rightcode.co.jp/author/jun
|
|
||||||
link: https://rightcode.co.jp/blog/information-technology/fastapi-tutorial-todo-apps-environment
|
|
||||||
title: '【第1回】FastAPIチュートリアル: ToDoアプリを作ってみよう【環境構築編】'
|
|
||||||
- author: Hikaru Takahashi
|
|
||||||
author_link: https://qiita.com/hikarut
|
|
||||||
link: https://qiita.com/hikarut/items/b178af2e2440c67c6ac4
|
|
||||||
title: フロントエンド開発者向けのDockerによるPython開発環境構築
|
|
||||||
- author: '@angel_katayoku'
|
|
||||||
author_link: https://qiita.com/angel_katayoku
|
|
||||||
link: https://qiita.com/angel_katayoku/items/8a458a8952f50b73f420
|
|
||||||
title: FastAPIでPOSTされたJSONのレスポンスbodyを受け取る
|
|
||||||
- author: '@angel_katayoku'
|
|
||||||
author_link: https://qiita.com/angel_katayoku
|
|
||||||
link: https://qiita.com/angel_katayoku/items/4fbc1a4e2b33fa2237d2
|
|
||||||
title: FastAPIをMySQLと接続してDockerで管理してみる
|
|
||||||
- author: '@angel_katayoku'
|
|
||||||
author_link: https://qiita.com/angel_katayoku
|
|
||||||
link: https://qiita.com/angel_katayoku/items/0e1f5dbbe62efc612a78
|
|
||||||
title: FastAPIでCORSを回避
|
|
||||||
- author: '@ryoryomaru'
|
|
||||||
author_link: https://qiita.com/ryoryomaru
|
|
||||||
link: https://qiita.com/ryoryomaru/items/59958ed385b3571d50de
|
|
||||||
title: python製の最新APIフレームワーク FastAPI を触ってみた
|
|
||||||
- author: '@mtitg'
|
|
||||||
author_link: https://qiita.com/mtitg
|
|
||||||
link: https://qiita.com/mtitg/items/47770e9a562dd150631d
|
|
||||||
title: FastAPI|DB接続してCRUDするPython製APIサーバーを構築
|
|
||||||
Portuguese:
|
|
||||||
- author: Eduardo Mendes
|
|
||||||
author_link: https://bolha.us/@dunossauro
|
|
||||||
link: https://fastapidozero.dunossauro.com/
|
|
||||||
title: FastAPI do ZERO
|
|
||||||
- author: Jessica Temporal
|
|
||||||
author_link: https://jtemporal.com/socials
|
|
||||||
link: https://jtemporal.com/dicas-para-migrar-de-flask-para-fastapi-e-vice-versa/
|
|
||||||
title: Dicas para migrar uma aplicação de Flask para FastAPI e vice-versa
|
|
||||||
Russian:
|
|
||||||
- author: Troy Köhler
|
|
||||||
author_link: https://www.linkedin.com/in/trkohler/
|
|
||||||
link: https://trkohler.com/fast-api-introduction-to-framework
|
|
||||||
title: 'FastAPI: знакомимся с фреймворком'
|
|
||||||
- author: prostomarkeloff
|
|
||||||
author_link: https://github.com/prostomarkeloff
|
|
||||||
link: https://habr.com/ru/post/478620/
|
|
||||||
title: Почему Вы должны попробовать FastAPI?
|
|
||||||
- author: Andrey Korchak
|
|
||||||
author_link: https://habr.com/ru/users/57uff3r/
|
|
||||||
link: https://habr.com/ru/post/454440/
|
|
||||||
title: 'Мелкая питонячая радость #2: Starlette - Солидная примочка – FastAPI'
|
|
||||||
Vietnamese:
|
|
||||||
- author: Nguyễn Nhân
|
|
||||||
author_link: https://fullstackstation.com/author/figonking/
|
|
||||||
link: https://fullstackstation.com/fastapi-trien-khai-bang-docker/
|
|
||||||
title: 'FASTAPI: TRIỂN KHAI BẰNG DOCKER'
|
|
||||||
Taiwanese:
|
|
||||||
- author: Leon
|
|
||||||
author_link: http://editor.leonh.space/
|
|
||||||
link: https://editor.leonh.space/2022/tortoise/
|
|
||||||
title: 'Tortoise ORM / FastAPI 整合快速筆記'
|
|
||||||
Spanish:
|
|
||||||
- author: Eduardo Zepeda
|
|
||||||
author_link: https://coffeebytes.dev/en/authors/eduardo-zepeda/
|
|
||||||
link: https://coffeebytes.dev/es/python-fastapi-el-mejor-framework-de-python/
|
|
||||||
title: 'Tutorial de FastAPI, ¿el mejor framework de Python?'
|
|
||||||
Podcasts:
|
|
||||||
English:
|
|
||||||
- author: Real Python
|
|
||||||
author_link: https://realpython.com/
|
|
||||||
link: https://realpython.com/podcasts/rpp/72/
|
|
||||||
title: Starting With FastAPI and Examining Python's Import System - Episode 72
|
|
||||||
- author: Python Bytes FM
|
|
||||||
author_link: https://pythonbytes.fm/
|
|
||||||
link: https://www.pythonpodcast.com/fastapi-web-application-framework-episode-259/
|
|
||||||
title: 'Do you dare to press "."? - Episode 247 - Dan #6: SQLModel - use the same models for SQL and FastAPI'
|
|
||||||
- author: Podcast.`__init__`
|
|
||||||
author_link: https://www.pythonpodcast.com/
|
|
||||||
link: https://www.pythonpodcast.com/fastapi-web-application-framework-episode-259/
|
|
||||||
title: Build The Next Generation Of Python Web Applications With FastAPI - Episode 259 - interview to Sebastían Ramírez (tiangolo)
|
|
||||||
- author: Python Bytes FM
|
|
||||||
author_link: https://pythonbytes.fm/
|
|
||||||
link: https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855
|
|
||||||
title: FastAPI on PythonBytes
|
|
||||||
Talks:
|
|
||||||
English:
|
|
||||||
- author: Jeny Sadadia
|
|
||||||
author_link: https://github.com/JenySadadia
|
|
||||||
link: https://www.youtube.com/watch?v=uZdTe8_Z6BQ
|
|
||||||
title: 'PyCon AU 2023: Testing asynchronous applications with FastAPI and pytest'
|
|
||||||
- author: Sebastián Ramírez (tiangolo)
|
|
||||||
author_link: https://x.com/tiangolo
|
|
||||||
link: https://www.youtube.com/watch?v=PnpTY1f4k2U
|
|
||||||
title: '[VIRTUAL] Py.Amsterdam''s flying Software Circus: Intro to FastAPI'
|
|
||||||
- author: Sebastián Ramírez (tiangolo)
|
|
||||||
author_link: https://x.com/tiangolo
|
|
||||||
link: https://www.youtube.com/watch?v=z9K5pwb0rt8
|
|
||||||
title: 'PyConBY 2020: Serve ML models easily with FastAPI'
|
|
||||||
- author: Chris Withers
|
|
||||||
author_link: https://x.com/chriswithers13
|
|
||||||
link: https://www.youtube.com/watch?v=3DLwPcrE5mA
|
|
||||||
title: 'PyCon UK 2019: FastAPI from the ground up'
|
|
||||||
Taiwanese:
|
|
||||||
- author: Blueswen
|
|
||||||
author_link: https://github.com/blueswen
|
|
||||||
link: https://www.youtube.com/watch?v=y3sumuoDq4w
|
|
||||||
title: 'PyCon TW 2024: 全方位強化 Python 服務可觀測性:以 FastAPI 和 Grafana Stack 為例'
|
|
||||||
|
|
@ -14,15 +14,15 @@ sponsors:
|
||||||
- login: coderabbitai
|
- login: coderabbitai
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/132028505?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/132028505?v=4
|
||||||
url: https://github.com/coderabbitai
|
url: https://github.com/coderabbitai
|
||||||
|
- login: greptileai
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/140149887?v=4
|
||||||
|
url: https://github.com/greptileai
|
||||||
- login: subtotal
|
- login: subtotal
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/176449348?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/176449348?v=4
|
||||||
url: https://github.com/subtotal
|
url: https://github.com/subtotal
|
||||||
- login: railwayapp
|
- login: railwayapp
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/66716858?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/66716858?v=4
|
||||||
url: https://github.com/railwayapp
|
url: https://github.com/railwayapp
|
||||||
- login: scalar
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/301879?v=4
|
|
||||||
url: https://github.com/scalar
|
|
||||||
- - login: dribia
|
- - login: dribia
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/41189616?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/41189616?v=4
|
||||||
url: https://github.com/dribia
|
url: https://github.com/dribia
|
||||||
|
|
@ -41,13 +41,7 @@ sponsors:
|
||||||
- login: permitio
|
- login: permitio
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/71775833?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/71775833?v=4
|
||||||
url: https://github.com/permitio
|
url: https://github.com/permitio
|
||||||
- - login: marvin-robot
|
- - login: Ponte-Energy-Partners
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/41086007?u=b9fcab402d0cd0aec738b6574fe60855cb0cd36d&v=4
|
|
||||||
url: https://github.com/marvin-robot
|
|
||||||
- login: mercedes-benz
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/34240465?v=4
|
|
||||||
url: https://github.com/mercedes-benz
|
|
||||||
- login: Ponte-Energy-Partners
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/114745848?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/114745848?v=4
|
||||||
url: https://github.com/Ponte-Energy-Partners
|
url: https://github.com/Ponte-Energy-Partners
|
||||||
- login: LambdaTest-Inc
|
- login: LambdaTest-Inc
|
||||||
|
|
@ -56,10 +50,16 @@ sponsors:
|
||||||
- login: BoostryJP
|
- login: BoostryJP
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/57932412?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/57932412?v=4
|
||||||
url: https://github.com/BoostryJP
|
url: https://github.com/BoostryJP
|
||||||
|
- login: requestly
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/12287519?v=4
|
||||||
|
url: https://github.com/requestly
|
||||||
- login: acsone
|
- login: acsone
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/7601056?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/7601056?v=4
|
||||||
url: https://github.com/acsone
|
url: https://github.com/acsone
|
||||||
- - login: Trivie
|
- - login: scalar
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/301879?v=4
|
||||||
|
url: https://github.com/scalar
|
||||||
|
- login: Trivie
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/8161763?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/8161763?v=4
|
||||||
url: https://github.com/Trivie
|
url: https://github.com/Trivie
|
||||||
- - login: takashi-yoneya
|
- - login: takashi-yoneya
|
||||||
|
|
@ -68,27 +68,27 @@ sponsors:
|
||||||
- login: Doist
|
- login: Doist
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/2565372?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/2565372?v=4
|
||||||
url: https://github.com/Doist
|
url: https://github.com/Doist
|
||||||
|
- login: bholagabbar
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/11693595?v=4
|
||||||
|
url: https://github.com/bholagabbar
|
||||||
- - login: mainframeindustries
|
- - login: mainframeindustries
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/55092103?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/55092103?v=4
|
||||||
url: https://github.com/mainframeindustries
|
url: https://github.com/mainframeindustries
|
||||||
- login: yasyf
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/709645?u=f36736b3c6a85f578886ecc42a740e7b436e7a01&v=4
|
|
||||||
url: https://github.com/yasyf
|
|
||||||
- - login: alixlahuec
|
- - login: alixlahuec
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/29543316?u=44357eb2a93bccf30fb9d389b8befe94a3d00985&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/29543316?u=44357eb2a93bccf30fb9d389b8befe94a3d00985&v=4
|
||||||
url: https://github.com/alixlahuec
|
url: https://github.com/alixlahuec
|
||||||
- - login: primer-io
|
- - login: primer-io
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/62146168?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/62146168?v=4
|
||||||
url: https://github.com/primer-io
|
url: https://github.com/primer-io
|
||||||
- - login: nilslindemann
|
- - login: upciti
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4
|
|
||||||
url: https://github.com/nilslindemann
|
|
||||||
- login: upciti
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/43346262?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/43346262?v=4
|
||||||
url: https://github.com/upciti
|
url: https://github.com/upciti
|
||||||
- login: thisisfixer
|
- login: ChargeStorm
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/14433035?u=076d52a5b7891c764904af9f462bfb45428e25df&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/26000165?v=4
|
||||||
url: https://github.com/thisisfixer
|
url: https://github.com/ChargeStorm
|
||||||
|
- login: nilslindemann
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4
|
||||||
|
url: https://github.com/nilslindemann
|
||||||
- - login: samuelcolvin
|
- - login: samuelcolvin
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/4039449?u=42eb3b833047c8c4b4f647a031eaef148c16d93f&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/4039449?u=42eb3b833047c8c4b4f647a031eaef148c16d93f&v=4
|
||||||
url: https://github.com/samuelcolvin
|
url: https://github.com/samuelcolvin
|
||||||
|
|
@ -101,6 +101,9 @@ sponsors:
|
||||||
- login: roboflow
|
- login: roboflow
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/53104118?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/53104118?v=4
|
||||||
url: https://github.com/roboflow
|
url: https://github.com/roboflow
|
||||||
|
- login: dudikbender
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/53487583?u=3a57542938ebfd57579a0111db2b297e606d9681&v=4
|
||||||
|
url: https://github.com/dudikbender
|
||||||
- login: ehaca
|
- login: ehaca
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/25950317?u=cec1a3e0643b785288ae8260cc295a85ab344995&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/25950317?u=cec1a3e0643b785288ae8260cc295a85ab344995&v=4
|
||||||
url: https://github.com/ehaca
|
url: https://github.com/ehaca
|
||||||
|
|
@ -113,21 +116,12 @@ sponsors:
|
||||||
- login: Leay15
|
- login: Leay15
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/32212558?u=c4aa9c1737e515959382a5515381757b1fd86c53&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/32212558?u=c4aa9c1737e515959382a5515381757b1fd86c53&v=4
|
||||||
url: https://github.com/Leay15
|
url: https://github.com/Leay15
|
||||||
- login: kaoru0310
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/80977929?u=1b61d10142b490e56af932ddf08a390fae8ee94f&v=4
|
|
||||||
url: https://github.com/kaoru0310
|
|
||||||
- login: DelfinaCare
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/83734439?v=4
|
|
||||||
url: https://github.com/DelfinaCare
|
|
||||||
- login: Karine-Bauch
|
- login: Karine-Bauch
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/90465103?u=7feb1018abb1a5631cfd9a91fea723d1ceb5f49b&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/90465103?u=7feb1018abb1a5631cfd9a91fea723d1ceb5f49b&v=4
|
||||||
url: https://github.com/Karine-Bauch
|
url: https://github.com/Karine-Bauch
|
||||||
- login: jugeeem
|
- login: jugeeem
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/116043716?u=ae590d79c38ac79c91b9c5caa6887d061e865a3d&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/116043716?u=ae590d79c38ac79c91b9c5caa6887d061e865a3d&v=4
|
||||||
url: https://github.com/jugeeem
|
url: https://github.com/jugeeem
|
||||||
- login: dudikbender
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/53487583?u=3a57542938ebfd57579a0111db2b297e606d9681&v=4
|
|
||||||
url: https://github.com/dudikbender
|
|
||||||
- login: patsatsia
|
- login: patsatsia
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/61111267?u=3271b85f7a37b479c8d0ae0a235182e83c166edf&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/61111267?u=3271b85f7a37b479c8d0ae0a235182e83c166edf&v=4
|
||||||
url: https://github.com/patsatsia
|
url: https://github.com/patsatsia
|
||||||
|
|
@ -140,9 +134,12 @@ sponsors:
|
||||||
- login: chickenandstats
|
- login: chickenandstats
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/79477966?u=ae2b894aa954070db1d7830dab99b49eba4e4567&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/79477966?u=ae2b894aa954070db1d7830dab99b49eba4e4567&v=4
|
||||||
url: https://github.com/chickenandstats
|
url: https://github.com/chickenandstats
|
||||||
- login: dodo5522
|
- login: kaoru0310
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1362607?u=9bf1e0e520cccc547c046610c468ce6115bbcf9f&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/80977929?u=1b61d10142b490e56af932ddf08a390fae8ee94f&v=4
|
||||||
url: https://github.com/dodo5522
|
url: https://github.com/kaoru0310
|
||||||
|
- login: jstanden
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/63288?u=c3658d57d2862c607a0e19c2101c3c51876e36ad&v=4
|
||||||
|
url: https://github.com/jstanden
|
||||||
- login: knallgelb
|
- login: knallgelb
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/2358812?u=c48cb6362b309d74cbf144bd6ad3aed3eb443e82&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/2358812?u=c48cb6362b309d74cbf144bd6ad3aed3eb443e82&v=4
|
||||||
url: https://github.com/knallgelb
|
url: https://github.com/knallgelb
|
||||||
|
|
@ -170,12 +167,12 @@ sponsors:
|
||||||
- login: Ryandaydev
|
- login: Ryandaydev
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=679ff84cb7b988c5795a5fa583857f574a055763&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=679ff84cb7b988c5795a5fa583857f574a055763&v=4
|
||||||
url: https://github.com/Ryandaydev
|
url: https://github.com/Ryandaydev
|
||||||
- login: vincentkoc
|
- login: jaredtrog
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/25068?u=fbd5b2d51142daa4bdbc21e21953a3b8b8188a4a&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4
|
||||||
url: https://github.com/vincentkoc
|
url: https://github.com/jaredtrog
|
||||||
- login: jstanden
|
- login: oliverxchen
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/63288?u=c3658d57d2862c607a0e19c2101c3c51876e36ad&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/4471774?u=534191f25e32eeaadda22dfab4b0a428733d5489&v=4
|
||||||
url: https://github.com/jstanden
|
url: https://github.com/oliverxchen
|
||||||
- login: paulcwatts
|
- login: paulcwatts
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/150269?u=1819e145d573b44f0ad74b87206d21cd60331d4e&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/150269?u=1819e145d573b44f0ad74b87206d21cd60331d4e&v=4
|
||||||
url: https://github.com/paulcwatts
|
url: https://github.com/paulcwatts
|
||||||
|
|
@ -197,6 +194,9 @@ sponsors:
|
||||||
- login: mintuhouse
|
- login: mintuhouse
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/769950?u=ecfbd79a97d33177e0d093ddb088283cf7fe8444&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/769950?u=ecfbd79a97d33177e0d093ddb088283cf7fe8444&v=4
|
||||||
url: https://github.com/mintuhouse
|
url: https://github.com/mintuhouse
|
||||||
|
- login: dodo5522
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/1362607?u=9bf1e0e520cccc547c046610c468ce6115bbcf9f&v=4
|
||||||
|
url: https://github.com/dodo5522
|
||||||
- login: wdwinslow
|
- login: wdwinslow
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/11562137?u=371272f2c69e680e0559a7b0a57385e83a5dc728&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/11562137?u=371272f2c69e680e0559a7b0a57385e83a5dc728&v=4
|
||||||
url: https://github.com/wdwinslow
|
url: https://github.com/wdwinslow
|
||||||
|
|
@ -218,12 +218,6 @@ sponsors:
|
||||||
- login: RaamEEIL
|
- login: RaamEEIL
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/20320552?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/20320552?v=4
|
||||||
url: https://github.com/RaamEEIL
|
url: https://github.com/RaamEEIL
|
||||||
- login: jaredtrog
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4
|
|
||||||
url: https://github.com/jaredtrog
|
|
||||||
- login: oliverxchen
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/4471774?u=534191f25e32eeaadda22dfab4b0a428733d5489&v=4
|
|
||||||
url: https://github.com/oliverxchen
|
|
||||||
- login: ternaus
|
- login: ternaus
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/5481618?u=513a26b02a39e7a28d587cd37c6cc877ea368e6e&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/5481618?u=513a26b02a39e7a28d587cd37c6cc877ea368e6e&v=4
|
||||||
url: https://github.com/ternaus
|
url: https://github.com/ternaus
|
||||||
|
|
@ -278,9 +272,6 @@ sponsors:
|
||||||
- login: petercool
|
- login: petercool
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/37613029?u=75aa8c6729e6e8f85a300561c4dbeef9d65c8797&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/37613029?u=75aa8c6729e6e8f85a300561c4dbeef9d65c8797&v=4
|
||||||
url: https://github.com/petercool
|
url: https://github.com/petercool
|
||||||
- login: JulioPeixoto
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/96303574?u=27d4614350cae33653f1be35cb47c92a12627ac9&v=4
|
|
||||||
url: https://github.com/JulioPeixoto
|
|
||||||
- login: johnl28
|
- login: johnl28
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/54412955?u=47dd06082d1c39caa90c752eb55566e4f3813957&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/54412955?u=47dd06082d1c39caa90c752eb55566e4f3813957&v=4
|
||||||
url: https://github.com/johnl28
|
url: https://github.com/johnl28
|
||||||
|
|
@ -290,21 +281,15 @@ sponsors:
|
||||||
- login: PelicanQ
|
- login: PelicanQ
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/77930606?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/77930606?v=4
|
||||||
url: https://github.com/PelicanQ
|
url: https://github.com/PelicanQ
|
||||||
- login: miguelgr
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1484589?u=54556072b8136efa12ae3b6902032ea2a39ace4b&v=4
|
|
||||||
url: https://github.com/miguelgr
|
|
||||||
- login: WillHogan
|
- login: WillHogan
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1661551?u=8a80356e3e7d5a417157aba7ea565dabc8678327&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/1661551?u=8a80356e3e7d5a417157aba7ea565dabc8678327&v=4
|
||||||
url: https://github.com/WillHogan
|
url: https://github.com/WillHogan
|
||||||
- login: my3
|
- login: my3
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1825270?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/1825270?v=4
|
||||||
url: https://github.com/my3
|
url: https://github.com/my3
|
||||||
- login: Alisa-lisa
|
- login: danielunderwood
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/4137964?u=e7e393504f554f4ff15863a1e01a5746863ef9ce&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/4472301?v=4
|
||||||
url: https://github.com/Alisa-lisa
|
url: https://github.com/danielunderwood
|
||||||
- login: moonape1226
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/8532038?u=d9f8b855a429fff9397c3833c2ff83849ebf989d&v=4
|
|
||||||
url: https://github.com/moonape1226
|
|
||||||
- login: ddanier
|
- login: ddanier
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/113563?u=ed1dc79de72f93bd78581f88ebc6952b62f472da&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/113563?u=ed1dc79de72f93bd78581f88ebc6952b62f472da&v=4
|
||||||
url: https://github.com/ddanier
|
url: https://github.com/ddanier
|
||||||
|
|
@ -320,6 +305,9 @@ sponsors:
|
||||||
- login: tochikuji
|
- login: tochikuji
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/851759?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/851759?v=4
|
||||||
url: https://github.com/tochikuji
|
url: https://github.com/tochikuji
|
||||||
|
- login: miguelgr
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/1484589?u=54556072b8136efa12ae3b6902032ea2a39ace4b&v=4
|
||||||
|
url: https://github.com/miguelgr
|
||||||
- login: xncbf
|
- login: xncbf
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/9462045?u=a80a7bb349555b277645632ed66639ff43400614&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/9462045?u=a80a7bb349555b277645632ed66639ff43400614&v=4
|
||||||
url: https://github.com/xncbf
|
url: https://github.com/xncbf
|
||||||
|
|
@ -329,9 +317,6 @@ sponsors:
|
||||||
- login: hard-coders
|
- login: hard-coders
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=95db33927bbff1ed1c07efddeb97ac2ff33068ed&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=95db33927bbff1ed1c07efddeb97ac2ff33068ed&v=4
|
||||||
url: https://github.com/hard-coders
|
url: https://github.com/hard-coders
|
||||||
- login: supdann
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/9986994?u=9671810f4ae9504c063227fee34fd47567ff6954&v=4
|
|
||||||
url: https://github.com/supdann
|
|
||||||
- login: mntolia
|
- login: mntolia
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/10390224?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/10390224?v=4
|
||||||
url: https://github.com/mntolia
|
url: https://github.com/mntolia
|
||||||
|
|
@ -344,9 +329,6 @@ sponsors:
|
||||||
- login: joshuatz
|
- login: joshuatz
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/17817563?u=f1bf05b690d1fc164218f0b420cdd3acb7913e21&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/17817563?u=f1bf05b690d1fc164218f0b420cdd3acb7913e21&v=4
|
||||||
url: https://github.com/joshuatz
|
url: https://github.com/joshuatz
|
||||||
- login: danielunderwood
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/4472301?v=4
|
|
||||||
url: https://github.com/danielunderwood
|
|
||||||
- login: rangulvers
|
- login: rangulvers
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/5235430?u=e254d4af4ace5a05fa58372ae677c7d26f0d5a53&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/5235430?u=e254d4af4ace5a05fa58372ae677c7d26f0d5a53&v=4
|
||||||
url: https://github.com/rangulvers
|
url: https://github.com/rangulvers
|
||||||
|
|
@ -365,7 +347,13 @@ sponsors:
|
||||||
- login: harsh183
|
- login: harsh183
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/7780198?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/7780198?v=4
|
||||||
url: https://github.com/harsh183
|
url: https://github.com/harsh183
|
||||||
- - login: KOZ39
|
- login: moonape1226
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/8532038?u=d9f8b855a429fff9397c3833c2ff83849ebf989d&v=4
|
||||||
|
url: https://github.com/moonape1226
|
||||||
|
- - login: andrecorumba
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/37807517?u=9b9be3b41da9bda60957da9ef37b50dbf65baa61&v=4
|
||||||
|
url: https://github.com/andrecorumba
|
||||||
|
- login: KOZ39
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/38822500?u=9dfc0a697df1c9628f08e20dc3fb17b1afc4e5a7&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/38822500?u=9dfc0a697df1c9628f08e20dc3fb17b1afc4e5a7&v=4
|
||||||
url: https://github.com/KOZ39
|
url: https://github.com/KOZ39
|
||||||
- login: rwxd
|
- login: rwxd
|
||||||
|
|
@ -374,30 +362,27 @@ sponsors:
|
||||||
- login: morzan1001
|
- login: morzan1001
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/47593005?u=c30ab7230f82a12a9b938dcb54f84a996931409a&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/47593005?u=c30ab7230f82a12a9b938dcb54f84a996931409a&v=4
|
||||||
url: https://github.com/morzan1001
|
url: https://github.com/morzan1001
|
||||||
- login: azharthegeek
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/51288109?u=0987b2a9f39c21ccb071b6bdce0fc60d8492f8e8&v=4
|
|
||||||
url: https://github.com/azharthegeek
|
|
||||||
- login: Olegt0rr
|
- login: Olegt0rr
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/25399456?u=3e87b5239a2f4600975ba13be73054f8567c6060&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/25399456?u=3e87b5239a2f4600975ba13be73054f8567c6060&v=4
|
||||||
url: https://github.com/Olegt0rr
|
url: https://github.com/Olegt0rr
|
||||||
|
- login: dinoz0rg
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/32940067?u=739cda1eb123a2dd5e1db45c361396f239e23f8b&v=4
|
||||||
|
url: https://github.com/dinoz0rg
|
||||||
- login: larsyngvelundin
|
- login: larsyngvelundin
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/34173819?u=74958599695bf83ac9f1addd935a51548a10c6b0&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/34173819?u=74958599695bf83ac9f1addd935a51548a10c6b0&v=4
|
||||||
url: https://github.com/larsyngvelundin
|
url: https://github.com/larsyngvelundin
|
||||||
- login: andrecorumba
|
- login: hippoley
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/37807517?u=9b9be3b41da9bda60957da9ef37b50dbf65baa61&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/135493401?u=1164ef48a645a7c12664fabc1638fbb7e1c459b0&v=4
|
||||||
url: https://github.com/andrecorumba
|
url: https://github.com/hippoley
|
||||||
- login: ChenPu2002
|
- login: 4anklee
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/113831763?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/144109238?u=a79c0d581b2a3d8f3897e7ef4c012640a6c1eb3a&v=4
|
||||||
url: https://github.com/ChenPu2002
|
url: https://github.com/4anklee
|
||||||
- login: CoderDeltaLAN
|
- login: CoderDeltaLAN
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/152043745?u=4ff541efffb7d134e60c5fcf2dd1e343f90bb782&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/152043745?u=4ff541efffb7d134e60c5fcf2dd1e343f90bb782&v=4
|
||||||
url: https://github.com/CoderDeltaLAN
|
url: https://github.com/CoderDeltaLAN
|
||||||
- login: aghents
|
- login: onestn
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/60949885?u=d8616ddf22cf998a712cdceefd6a0256a178fe9d&v=4
|
|
||||||
url: https://github.com/aghents
|
|
||||||
- login: 0ne-stone
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/62360849?u=746dd21c34e7e06eefb11b03e8bb01aaae3c2a4f&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/62360849?u=746dd21c34e7e06eefb11b03e8bb01aaae3c2a4f&v=4
|
||||||
url: https://github.com/0ne-stone
|
url: https://github.com/onestn
|
||||||
- login: nayasinghania
|
- login: nayasinghania
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/74111380?u=752e99a5e139389fdc0a0677122adc08438eb076&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/74111380?u=752e99a5e139389fdc0a0677122adc08438eb076&v=4
|
||||||
url: https://github.com/nayasinghania
|
url: https://github.com/nayasinghania
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,7 @@
|
||||||
|
keystone:
|
||||||
|
- url: https://fastapicloud.com
|
||||||
|
title: FastAPI Cloud. By the same team behind FastAPI. You code. We Cloud.
|
||||||
|
img: https://fastapi.tiangolo.com/img/sponsors/fastapicloud.png
|
||||||
gold:
|
gold:
|
||||||
- url: https://blockbee.io?ref=fastapi
|
- url: https://blockbee.io?ref=fastapi
|
||||||
title: BlockBee Cryptocurrency Payment Gateway
|
title: BlockBee Cryptocurrency Payment Gateway
|
||||||
|
|
@ -26,6 +30,12 @@ gold:
|
||||||
- url: https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi
|
- url: https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi
|
||||||
title: Deploy enterprise applications at startup speed
|
title: Deploy enterprise applications at startup speed
|
||||||
img: https://fastapi.tiangolo.com/img/sponsors/railway.png
|
img: https://fastapi.tiangolo.com/img/sponsors/railway.png
|
||||||
|
- url: https://serpapi.com/?utm_source=fastapi_website
|
||||||
|
title: "SerpApi: Web Search API"
|
||||||
|
img: https://fastapi.tiangolo.com/img/sponsors/serpapi.png
|
||||||
|
- url: https://www.greptile.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=fastapi_sponsor_page
|
||||||
|
title: "Greptile: The AI Code Reviewer"
|
||||||
|
img: https://fastapi.tiangolo.com/img/sponsors/greptile.png
|
||||||
silver:
|
silver:
|
||||||
- url: https://databento.com/?utm_source=fastapi&utm_medium=sponsor&utm_content=display
|
- url: https://databento.com/?utm_source=fastapi&utm_medium=sponsor&utm_content=display
|
||||||
title: Pay as you go for market data
|
title: Pay as you go for market data
|
||||||
|
|
@ -58,3 +68,6 @@ bronze:
|
||||||
- url: https://lambdatest.com/?utm_source=fastapi&utm_medium=partner&utm_campaign=sponsor&utm_term=opensource&utm_content=webpage
|
- url: https://lambdatest.com/?utm_source=fastapi&utm_medium=partner&utm_campaign=sponsor&utm_term=opensource&utm_content=webpage
|
||||||
title: LambdaTest, AI-Powered Cloud-based Test Orchestration Platform
|
title: LambdaTest, AI-Powered Cloud-based Test Orchestration Platform
|
||||||
img: https://fastapi.tiangolo.com/img/sponsors/lambdatest.png
|
img: https://fastapi.tiangolo.com/img/sponsors/lambdatest.png
|
||||||
|
- url: https://requestly.com/fastapi
|
||||||
|
title: All-in-one platform to Test, Mock and Intercept APIs. Built for speed, privacy and offline support.
|
||||||
|
img: https://fastapi.tiangolo.com/img/sponsors/requestly.png
|
||||||
|
|
|
||||||
|
|
@ -46,3 +46,5 @@ logins:
|
||||||
- madisonredtfeldt
|
- madisonredtfeldt
|
||||||
- railwayapp
|
- railwayapp
|
||||||
- subtotal
|
- subtotal
|
||||||
|
- requestly
|
||||||
|
- greptileai
|
||||||
|
|
|
||||||
|
|
@ -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: awesome-fastapi
|
|
||||||
html_url: https://github.com/mjhea0/awesome-fastapi
|
|
||||||
stars: 10415
|
|
||||||
owner_login: mjhea0
|
|
||||||
owner_html_url: https://github.com/mjhea0
|
|
||||||
- name: FastUI
|
|
||||||
html_url: https://github.com/pydantic/FastUI
|
|
||||||
stars: 8879
|
|
||||||
owner_login: pydantic
|
|
||||||
owner_html_url: https://github.com/pydantic
|
|
||||||
- name: XHS-Downloader
|
|
||||||
html_url: https://github.com/JoeanAmier/XHS-Downloader
|
|
||||||
stars: 8824
|
|
||||||
owner_login: JoeanAmier
|
|
||||||
owner_html_url: https://github.com/JoeanAmier
|
|
||||||
- name: SurfSense
|
- name: SurfSense
|
||||||
html_url: https://github.com/MODSetter/SurfSense
|
html_url: https://github.com/MODSetter/SurfSense
|
||||||
stars: 8257
|
stars: 10858
|
||||||
owner_login: MODSetter
|
owner_login: MODSetter
|
||||||
owner_html_url: https://github.com/MODSetter
|
owner_html_url: https://github.com/MODSetter
|
||||||
- name: FileCodeBox
|
- name: awesome-fastapi
|
||||||
html_url: https://github.com/vastsa/FileCodeBox
|
html_url: https://github.com/mjhea0/awesome-fastapi
|
||||||
stars: 7367
|
stars: 10758
|
||||||
owner_login: vastsa
|
owner_login: mjhea0
|
||||||
owner_html_url: https://github.com/vastsa
|
owner_html_url: https://github.com/mjhea0
|
||||||
|
- name: XHS-Downloader
|
||||||
|
html_url: https://github.com/JoeanAmier/XHS-Downloader
|
||||||
|
stars: 9313
|
||||||
|
owner_login: JoeanAmier
|
||||||
|
owner_html_url: https://github.com/JoeanAmier
|
||||||
|
- name: FastUI
|
||||||
|
html_url: https://github.com/pydantic/FastUI
|
||||||
|
stars: 8915
|
||||||
|
owner_login: pydantic
|
||||||
|
owner_html_url: https://github.com/pydantic
|
||||||
- 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: ormar
|
||||||
|
html_url: https://github.com/collerek/ormar
|
||||||
|
stars: 1783
|
||||||
|
owner_login: collerek
|
||||||
|
owner_html_url: https://github.com/collerek
|
||||||
|
- name: termpair
|
||||||
|
html_url: https://github.com/cs01/termpair
|
||||||
|
stars: 1716
|
||||||
|
owner_login: cs01
|
||||||
|
owner_html_url: https://github.com/cs01
|
||||||
|
- name: FastAPI-boilerplate
|
||||||
|
html_url: https://github.com/benavlabs/FastAPI-boilerplate
|
||||||
|
stars: 1660
|
||||||
|
owner_login: benavlabs
|
||||||
|
owner_html_url: https://github.com/benavlabs
|
||||||
|
- name: fastapi-langgraph-agent-production-ready-template
|
||||||
|
html_url: https://github.com/wassim249/fastapi-langgraph-agent-production-ready-template
|
||||||
|
stars: 1638
|
||||||
|
owner_login: wassim249
|
||||||
|
owner_html_url: https://github.com/wassim249
|
||||||
- name: langchain-serve
|
- name: langchain-serve
|
||||||
html_url: https://github.com/jina-ai/langchain-serve
|
html_url: https://github.com/jina-ai/langchain-serve
|
||||||
stars: 1635
|
stars: 1635
|
||||||
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: termpair
|
|
||||||
html_url: https://github.com/cs01/termpair
|
|
||||||
stars: 1624
|
|
||||||
owner_login: cs01
|
|
||||||
owner_html_url: https://github.com/cs01
|
|
||||||
- name: slowapi
|
|
||||||
html_url: https://github.com/laurentS/slowapi
|
|
||||||
stars: 1620
|
|
||||||
owner_login: laurentS
|
|
||||||
owner_html_url: https://github.com/laurentS
|
|
||||||
- name: coronavirus-tracker-api
|
|
||||||
html_url: https://github.com/ExpDev07/coronavirus-tracker-api
|
|
||||||
stars: 1576
|
|
||||||
owner_login: ExpDev07
|
|
||||||
owner_html_url: https://github.com/ExpDev07
|
|
||||||
- name: fastapi-crudrouter
|
|
||||||
html_url: https://github.com/awtkns/fastapi-crudrouter
|
|
||||||
stars: 1546
|
|
||||||
owner_login: awtkns
|
|
||||||
owner_html_url: https://github.com/awtkns
|
|
||||||
- name: FastAPI-boilerplate
|
|
||||||
html_url: https://github.com/benavlabs/FastAPI-boilerplate
|
|
||||||
stars: 1516
|
|
||||||
owner_login: benavlabs
|
|
||||||
owner_html_url: https://github.com/benavlabs
|
|
||||||
- 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: bedrock-chat
|
- name: fastapi-code-generator
|
||||||
html_url: https://github.com/aws-samples/bedrock-chat
|
html_url: https://github.com/koxudaxi/fastapi-code-generator
|
||||||
stars: 1220
|
stars: 1375
|
||||||
owner_login: aws-samples
|
owner_login: koxudaxi
|
||||||
owner_html_url: https://github.com/aws-samples
|
owner_html_url: https://github.com/koxudaxi
|
||||||
- name: fastapi_production_template
|
- name: budgetml
|
||||||
html_url: https://github.com/zhanymkanov/fastapi_production_template
|
html_url: https://github.com/ebhy/budgetml
|
||||||
stars: 1202
|
stars: 1345
|
||||||
owner_login: zhanymkanov
|
owner_login: ebhy
|
||||||
owner_html_url: https://github.com/zhanymkanov
|
owner_html_url: https://github.com/ebhy
|
||||||
- name: fastapi-scaff
|
- name: fastapi-tutorial
|
||||||
html_url: https://github.com/atpuxiner/fastapi-scaff
|
html_url: https://github.com/liaogx/fastapi-tutorial
|
||||||
stars: 1193
|
stars: 1327
|
||||||
owner_login: atpuxiner
|
owner_login: liaogx
|
||||||
owner_html_url: https://github.com/atpuxiner
|
owner_html_url: https://github.com/liaogx
|
||||||
- name: langchain-extract
|
|
||||||
html_url: https://github.com/langchain-ai/langchain-extract
|
|
||||||
stars: 1164
|
|
||||||
owner_login: langchain-ai
|
|
||||||
owner_html_url: https://github.com/langchain-ai
|
|
||||||
- name: fastapi-alembic-sqlmodel-async
|
- name: fastapi-alembic-sqlmodel-async
|
||||||
html_url: https://github.com/jonra1993/fastapi-alembic-sqlmodel-async
|
html_url: https://github.com/jonra1993/fastapi-alembic-sqlmodel-async
|
||||||
stars: 1149
|
stars: 1259
|
||||||
owner_login: jonra1993
|
owner_login: jonra1993
|
||||||
owner_html_url: https://github.com/jonra1993
|
owner_html_url: https://github.com/jonra1993
|
||||||
- name: odmantic
|
- name: fastapi-scaff
|
||||||
html_url: https://github.com/art049/odmantic
|
html_url: https://github.com/atpuxiner/fastapi-scaff
|
||||||
stars: 1133
|
stars: 1255
|
||||||
owner_login: art049
|
owner_login: atpuxiner
|
||||||
owner_html_url: https://github.com/art049
|
owner_html_url: https://github.com/atpuxiner
|
||||||
|
- name: bedrock-chat
|
||||||
|
html_url: https://github.com/aws-samples/bedrock-chat
|
||||||
|
stars: 1254
|
||||||
|
owner_login: aws-samples
|
||||||
|
owner_html_url: https://github.com/aws-samples
|
||||||
|
- name: bolt-python
|
||||||
|
html_url: https://github.com/slackapi/bolt-python
|
||||||
|
stars: 1253
|
||||||
|
owner_login: slackapi
|
||||||
|
owner_html_url: https://github.com/slackapi
|
||||||
|
- name: fastapi_production_template
|
||||||
|
html_url: https://github.com/zhanymkanov/fastapi_production_template
|
||||||
|
stars: 1217
|
||||||
|
owner_login: zhanymkanov
|
||||||
|
owner_html_url: https://github.com/zhanymkanov
|
||||||
|
- name: langchain-extract
|
||||||
|
html_url: https://github.com/langchain-ai/langchain-extract
|
||||||
|
stars: 1176
|
||||||
|
owner_login: langchain-ai
|
||||||
|
owner_html_url: https://github.com/langchain-ai
|
||||||
- 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: autollm
|
- name: NoteDiscovery
|
||||||
html_url: https://github.com/viddexa/autollm
|
html_url: https://github.com/gamosoft/NoteDiscovery
|
||||||
stars: 999
|
stars: 1107
|
||||||
owner_login: viddexa
|
owner_login: gamosoft
|
||||||
owner_html_url: https://github.com/viddexa
|
owner_html_url: https://github.com/gamosoft
|
||||||
- name: lanarky
|
- name: flock
|
||||||
html_url: https://github.com/ajndkr/lanarky
|
html_url: https://github.com/Onelevenvy/flock
|
||||||
stars: 995
|
stars: 1055
|
||||||
owner_login: ajndkr
|
owner_login: Onelevenvy
|
||||||
owner_html_url: https://github.com/ajndkr
|
owner_html_url: https://github.com/Onelevenvy
|
||||||
- name: titiler
|
|
||||||
html_url: https://github.com/developmentseed/titiler
|
|
||||||
stars: 952
|
|
||||||
owner_login: developmentseed
|
|
||||||
owner_html_url: https://github.com/developmentseed
|
|
||||||
- name: energy-forecasting
|
|
||||||
html_url: https://github.com/iusztinpaul/energy-forecasting
|
|
||||||
stars: 946
|
|
||||||
owner_login: iusztinpaul
|
|
||||||
owner_html_url: https://github.com/iusztinpaul
|
|
||||||
- name: secure
|
|
||||||
html_url: https://github.com/TypeError/secure
|
|
||||||
stars: 944
|
|
||||||
owner_login: TypeError
|
|
||||||
owner_html_url: https://github.com/TypeError
|
|
||||||
- name: langcorn
|
|
||||||
html_url: https://github.com/msoedov/langcorn
|
|
||||||
stars: 934
|
|
||||||
owner_login: msoedov
|
|
||||||
owner_html_url: https://github.com/msoedov
|
|
||||||
- name: RuoYi-Vue3-FastAPI
|
|
||||||
html_url: https://github.com/insistence/RuoYi-Vue3-FastAPI
|
|
||||||
stars: 930
|
|
||||||
owner_login: insistence
|
|
||||||
owner_html_url: https://github.com/insistence
|
|
||||||
- name: aktools
|
|
||||||
html_url: https://github.com/akfamily/aktools
|
|
||||||
stars: 916
|
|
||||||
owner_login: akfamily
|
|
||||||
owner_html_url: https://github.com/akfamily
|
|
||||||
- name: every-pdf
|
|
||||||
html_url: https://github.com/DDULDDUCK/every-pdf
|
|
||||||
stars: 907
|
|
||||||
owner_login: DDULDDUCK
|
|
||||||
owner_html_url: https://github.com/DDULDDUCK
|
|
||||||
- name: marker-api
|
|
||||||
html_url: https://github.com/adithya-s-k/marker-api
|
|
||||||
stars: 903
|
|
||||||
owner_login: adithya-s-k
|
|
||||||
owner_html_url: https://github.com/adithya-s-k
|
|
||||||
- name: fastapi-observability
|
- name: fastapi-observability
|
||||||
html_url: https://github.com/blueswen/fastapi-observability
|
html_url: https://github.com/blueswen/fastapi-observability
|
||||||
stars: 902
|
stars: 1038
|
||||||
owner_login: blueswen
|
owner_login: blueswen
|
||||||
owner_html_url: https://github.com/blueswen
|
owner_html_url: https://github.com/blueswen
|
||||||
- name: fastapi-do-zero
|
- name: aktools
|
||||||
html_url: https://github.com/dunossauro/fastapi-do-zero
|
html_url: https://github.com/akfamily/aktools
|
||||||
stars: 900
|
stars: 1027
|
||||||
owner_login: dunossauro
|
owner_login: akfamily
|
||||||
owner_html_url: https://github.com/dunossauro
|
owner_html_url: https://github.com/akfamily
|
||||||
|
- name: RuoYi-Vue3-FastAPI
|
||||||
|
html_url: https://github.com/insistence/RuoYi-Vue3-FastAPI
|
||||||
|
stars: 1016
|
||||||
|
owner_login: insistence
|
||||||
|
owner_html_url: https://github.com/insistence
|
||||||
|
- name: autollm
|
||||||
|
html_url: https://github.com/viddexa/autollm
|
||||||
|
stars: 1002
|
||||||
|
owner_login: viddexa
|
||||||
|
owner_html_url: https://github.com/viddexa
|
||||||
|
- name: titiler
|
||||||
|
html_url: https://github.com/developmentseed/titiler
|
||||||
|
stars: 999
|
||||||
|
owner_login: developmentseed
|
||||||
|
owner_html_url: https://github.com/developmentseed
|
||||||
|
- name: lanarky
|
||||||
|
html_url: https://github.com/ajndkr/lanarky
|
||||||
|
stars: 994
|
||||||
|
owner_login: ajndkr
|
||||||
|
owner_html_url: https://github.com/ajndkr
|
||||||
|
- name: every-pdf
|
||||||
|
html_url: https://github.com/DDULDDUCK/every-pdf
|
||||||
|
stars: 985
|
||||||
|
owner_login: DDULDDUCK
|
||||||
|
owner_html_url: https://github.com/DDULDDUCK
|
||||||
|
- name: enterprise-deep-research
|
||||||
|
html_url: https://github.com/SalesforceAIResearch/enterprise-deep-research
|
||||||
|
stars: 973
|
||||||
|
owner_login: SalesforceAIResearch
|
||||||
|
owner_html_url: https://github.com/SalesforceAIResearch
|
||||||
|
- name: fastapi-mail
|
||||||
|
html_url: https://github.com/sabuhish/fastapi-mail
|
||||||
|
stars: 964
|
||||||
|
owner_login: sabuhish
|
||||||
|
owner_html_url: https://github.com/sabuhish
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@ mattwang44:
|
||||||
url: https://github.com/mattwang44
|
url: https://github.com/mattwang44
|
||||||
tiangolo:
|
tiangolo:
|
||||||
login: tiangolo
|
login: tiangolo
|
||||||
count: 55
|
count: 56
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
||||||
url: https://github.com/tiangolo
|
url: https://github.com/tiangolo
|
||||||
Laineyzhang55:
|
Laineyzhang55:
|
||||||
|
|
@ -136,7 +136,7 @@ JavierSanchezCastro:
|
||||||
alejsdev:
|
alejsdev:
|
||||||
login: alejsdev
|
login: alejsdev
|
||||||
count: 37
|
count: 37
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=447d12a1b347f466b35378bee4c7104cc9b2c571&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=85ceac49fb87138aebe8d663912e359447329090&v=4
|
||||||
url: https://github.com/alejsdev
|
url: https://github.com/alejsdev
|
||||||
stlucasgarcia:
|
stlucasgarcia:
|
||||||
login: stlucasgarcia
|
login: stlucasgarcia
|
||||||
|
|
@ -436,7 +436,7 @@ jburckel:
|
||||||
peidrao:
|
peidrao:
|
||||||
login: peidrao
|
login: peidrao
|
||||||
count: 13
|
count: 13
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/32584628?u=64c634bb10381905038ff7faf3c8c3df47fb799a&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/32584628?u=979c62398e16ff000cc0faa028e028efd679887c&v=4
|
||||||
url: https://github.com/peidrao
|
url: https://github.com/peidrao
|
||||||
impocode:
|
impocode:
|
||||||
login: impocode
|
login: impocode
|
||||||
|
|
@ -776,7 +776,7 @@ pablocm83:
|
||||||
d2a-raudenaerde:
|
d2a-raudenaerde:
|
||||||
login: d2a-raudenaerde
|
login: d2a-raudenaerde
|
||||||
count: 7
|
count: 7
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/5213150?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/5213150?u=e6d0ef65c571c7e544fc1c7ec151c7c0a72fb6bb&v=4
|
||||||
url: https://github.com/d2a-raudenaerde
|
url: https://github.com/d2a-raudenaerde
|
||||||
valentinDruzhinin:
|
valentinDruzhinin:
|
||||||
login: valentinDruzhinin
|
login: valentinDruzhinin
|
||||||
|
|
@ -1006,7 +1006,7 @@ takacs:
|
||||||
anton2yakovlev:
|
anton2yakovlev:
|
||||||
login: anton2yakovlev
|
login: anton2yakovlev
|
||||||
count: 5
|
count: 5
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/44229180?u=bdd445ba99074b378e7298d23c4bf6d707d2c282&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/44229180?u=ac245e57bc834ff80f08ca8128000bb650a77a3d&v=4
|
||||||
url: https://github.com/anton2yakovlev
|
url: https://github.com/anton2yakovlev
|
||||||
ILoveSorasakiHina:
|
ILoveSorasakiHina:
|
||||||
login: ILoveSorasakiHina
|
login: ILoveSorasakiHina
|
||||||
|
|
@ -1161,7 +1161,7 @@ cookie-byte217:
|
||||||
AbolfazlKameli:
|
AbolfazlKameli:
|
||||||
login: AbolfazlKameli
|
login: AbolfazlKameli
|
||||||
count: 4
|
count: 4
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/120686133?u=e41743da3c1820efafc59c5870cacd4f4425334c&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/120686133?u=af8f025278cce0d489007071254e4055df60b78c&v=4
|
||||||
url: https://github.com/AbolfazlKameli
|
url: https://github.com/AbolfazlKameli
|
||||||
tyronedamasceno:
|
tyronedamasceno:
|
||||||
login: tyronedamasceno
|
login: tyronedamasceno
|
||||||
|
|
@ -1196,7 +1196,7 @@ Xaraxx:
|
||||||
Suyoung789:
|
Suyoung789:
|
||||||
login: Suyoung789
|
login: Suyoung789
|
||||||
count: 3
|
count: 3
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/31277231?u=744bd3e641413e19bfad6b06a90bb0887c3f9332&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/31277231?u=1591aaf651eb860017231a36590050e154c026b6&v=4
|
||||||
url: https://github.com/Suyoung789
|
url: https://github.com/Suyoung789
|
||||||
akagaeng:
|
akagaeng:
|
||||||
login: akagaeng
|
login: akagaeng
|
||||||
|
|
@ -1206,7 +1206,7 @@ akagaeng:
|
||||||
phamquanganh31101998:
|
phamquanganh31101998:
|
||||||
login: phamquanganh31101998
|
login: phamquanganh31101998
|
||||||
count: 3
|
count: 3
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/43257497?u=36fa4ee689415d869a98453083a7c4213d2136ee&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/43257497?u=6b3419ea9e318c356c42a973fb947682590bd8d3&v=4
|
||||||
url: https://github.com/phamquanganh31101998
|
url: https://github.com/phamquanganh31101998
|
||||||
peebbv6364:
|
peebbv6364:
|
||||||
login: peebbv6364
|
login: peebbv6364
|
||||||
|
|
@ -1806,7 +1806,7 @@ MrL8199:
|
||||||
ivintoiu:
|
ivintoiu:
|
||||||
login: ivintoiu
|
login: ivintoiu
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1853336?u=5e3d0977f44661fb9712fa297cc8f7608ea6ce48&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/1853336?u=e3de5fd0ab17efc12256b4295285b504ca281440&v=4
|
||||||
url: https://github.com/ivintoiu
|
url: https://github.com/ivintoiu
|
||||||
TechnoService2:
|
TechnoService2:
|
||||||
login: TechnoService2
|
login: TechnoService2
|
||||||
|
|
@ -1841,7 +1841,7 @@ NavesSapnis:
|
||||||
eqsdxr:
|
eqsdxr:
|
||||||
login: eqsdxr
|
login: eqsdxr
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/157279130?u=58fddf77ed76966eaa8c73eea9bea4bb0c53b673&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/157279130?u=7927dc0366995334f9a18c3204a41d3a34d6d96f&v=4
|
||||||
url: https://github.com/eqsdxr
|
url: https://github.com/eqsdxr
|
||||||
syedasamina56:
|
syedasamina56:
|
||||||
login: syedasamina56
|
login: syedasamina56
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
nilslindemann:
|
nilslindemann:
|
||||||
login: nilslindemann
|
login: nilslindemann
|
||||||
count: 122
|
count: 125
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4
|
||||||
url: https://github.com/nilslindemann
|
url: https://github.com/nilslindemann
|
||||||
jaystone776:
|
jaystone776:
|
||||||
|
|
@ -8,16 +8,16 @@ jaystone776:
|
||||||
count: 46
|
count: 46
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/11191137?u=299205a95e9b6817a43144a48b643346a5aac5cc&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/11191137?u=299205a95e9b6817a43144a48b643346a5aac5cc&v=4
|
||||||
url: https://github.com/jaystone776
|
url: https://github.com/jaystone776
|
||||||
|
ceb10n:
|
||||||
|
login: ceb10n
|
||||||
|
count: 29
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4
|
||||||
|
url: https://github.com/ceb10n
|
||||||
valentinDruzhinin:
|
valentinDruzhinin:
|
||||||
login: valentinDruzhinin
|
login: valentinDruzhinin
|
||||||
count: 29
|
count: 29
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
|
||||||
url: https://github.com/valentinDruzhinin
|
url: https://github.com/valentinDruzhinin
|
||||||
ceb10n:
|
|
||||||
login: ceb10n
|
|
||||||
count: 27
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4
|
|
||||||
url: https://github.com/ceb10n
|
|
||||||
tokusumi:
|
tokusumi:
|
||||||
login: tokusumi
|
login: tokusumi
|
||||||
count: 23
|
count: 23
|
||||||
|
|
@ -103,6 +103,11 @@ pablocm83:
|
||||||
count: 8
|
count: 8
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/28315068?u=3310fbb05bb8bfc50d2c48b6cb64ac9ee4a14549&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/28315068?u=3310fbb05bb8bfc50d2c48b6cb64ac9ee4a14549&v=4
|
||||||
url: https://github.com/pablocm83
|
url: https://github.com/pablocm83
|
||||||
|
tiangolo:
|
||||||
|
login: tiangolo
|
||||||
|
count: 7
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
||||||
|
url: https://github.com/tiangolo
|
||||||
ptt3199:
|
ptt3199:
|
||||||
login: ptt3199
|
login: ptt3199
|
||||||
count: 7
|
count: 7
|
||||||
|
|
@ -118,11 +123,6 @@ batlopes:
|
||||||
count: 6
|
count: 6
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/33462923?u=0fb3d7acb316764616f11e4947faf080e49ad8d9&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/33462923?u=0fb3d7acb316764616f11e4947faf080e49ad8d9&v=4
|
||||||
url: https://github.com/batlopes
|
url: https://github.com/batlopes
|
||||||
tiangolo:
|
|
||||||
login: tiangolo
|
|
||||||
count: 6
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
|
||||||
url: https://github.com/tiangolo
|
|
||||||
lucasbalieiro:
|
lucasbalieiro:
|
||||||
login: lucasbalieiro
|
login: lucasbalieiro
|
||||||
count: 6
|
count: 6
|
||||||
|
|
@ -286,7 +286,7 @@ hsuanchi:
|
||||||
alejsdev:
|
alejsdev:
|
||||||
login: alejsdev
|
login: alejsdev
|
||||||
count: 3
|
count: 3
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=447d12a1b347f466b35378bee4c7104cc9b2c571&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=85ceac49fb87138aebe8d663912e359447329090&v=4
|
||||||
url: https://github.com/alejsdev
|
url: https://github.com/alejsdev
|
||||||
riroan:
|
riroan:
|
||||||
login: riroan
|
login: riroan
|
||||||
|
|
@ -358,6 +358,11 @@ ruzia:
|
||||||
count: 3
|
count: 3
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/24503?v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/24503?v=4
|
||||||
url: https://github.com/ruzia
|
url: https://github.com/ruzia
|
||||||
|
YuriiMotov:
|
||||||
|
login: YuriiMotov
|
||||||
|
count: 3
|
||||||
|
avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=b9b13d598dddfab529a52d264df80a900bfe7060&v=4
|
||||||
|
url: https://github.com/YuriiMotov
|
||||||
izaguerreiro:
|
izaguerreiro:
|
||||||
login: izaguerreiro
|
login: izaguerreiro
|
||||||
count: 2
|
count: 2
|
||||||
|
|
@ -543,8 +548,3 @@ EdmilsonRodrigues:
|
||||||
count: 2
|
count: 2
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/62777025?u=217d6f3cd6cc750bb8818a3af7726c8d74eb7c2d&v=4
|
avatarUrl: https://avatars.githubusercontent.com/u/62777025?u=217d6f3cd6cc750bb8818a3af7726c8d74eb7c2d&v=4
|
||||||
url: https://github.com/EdmilsonRodrigues
|
url: https://github.com/EdmilsonRodrigues
|
||||||
YuriiMotov:
|
|
||||||
login: YuriiMotov
|
|
||||||
count: 2
|
|
||||||
avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=b9b13d598dddfab529a52d264df80a900bfe7060&v=4
|
|
||||||
url: https://github.com/YuriiMotov
|
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ Use as follows:
|
||||||
|
|
||||||
The tests:
|
The tests:
|
||||||
|
|
||||||
## Code snippets { #code-snippets}
|
## Code snippets { #code-snippets }
|
||||||
|
|
||||||
//// tab | Test
|
//// tab | Test
|
||||||
|
|
||||||
|
|
@ -53,7 +53,7 @@ See for example section `### Quotes` in `docs/de/llm-prompt.md`.
|
||||||
|
|
||||||
////
|
////
|
||||||
|
|
||||||
## Quotes in code snippets { #quotes-in-code-snippets}
|
## Quotes in code snippets { #quotes-in-code-snippets }
|
||||||
|
|
||||||
//// tab | Test
|
//// tab | Test
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -175,7 +175,7 @@ You can use this same `responses` parameter to add different media types for the
|
||||||
|
|
||||||
For example, you can add an additional media type of `image/png`, declaring that your *path operation* can return a JSON object (with media type `application/json`) or a PNG image:
|
For example, you can add an additional media type of `image/png`, declaring that your *path operation* can return a JSON object (with media type `application/json`) or a PNG image:
|
||||||
|
|
||||||
{* ../../docs_src/additional_responses/tutorial002.py hl[19:24,28] *}
|
{* ../../docs_src/additional_responses/tutorial002_py310.py hl[17:22,26] *}
|
||||||
|
|
||||||
/// note
|
/// note
|
||||||
|
|
||||||
|
|
@ -237,7 +237,7 @@ You can use that technique to reuse some predefined responses in your *path oper
|
||||||
|
|
||||||
For example:
|
For example:
|
||||||
|
|
||||||
{* ../../docs_src/additional_responses/tutorial004.py hl[13:17,26] *}
|
{* ../../docs_src/additional_responses/tutorial004_py310.py hl[11:15,24] *}
|
||||||
|
|
||||||
## More information about OpenAPI responses { #more-information-about-openapi-responses }
|
## More information about OpenAPI responses { #more-information-about-openapi-responses }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -70,12 +70,22 @@ If you understood all this, you already know how those utility tools for securit
|
||||||
|
|
||||||
You most probably don't need these technical details.
|
You most probably don't need these technical details.
|
||||||
|
|
||||||
These details are useful mainly if you had a FastAPI application older than 0.118.0 and you are facing issues with dependencies with `yield`.
|
These details are useful mainly if you had a FastAPI application older than 0.121.0 and you are facing issues with dependencies with `yield`.
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
Dependencies with `yield` have evolved over time to account for the different use cases and to fix some issues, here's a summary of what has changed.
|
Dependencies with `yield` have evolved over time to account for the different use cases and to fix some issues, here's a summary of what has changed.
|
||||||
|
|
||||||
|
### Dependencies with `yield` and `scope` { #dependencies-with-yield-and-scope }
|
||||||
|
|
||||||
|
In version 0.121.0, FastAPI added support for `Depends(scope="function")` for dependencies with `yield`.
|
||||||
|
|
||||||
|
Using `Depends(scope="function")`, the exit code after `yield` is executed right after the *path operation function* is finished, before the response is sent back to the client.
|
||||||
|
|
||||||
|
And when using `Depends(scope="request")` (the default), the exit code after `yield` is executed after the response is sent.
|
||||||
|
|
||||||
|
You can read more about it in the docs for [Dependencies with `yield` - Early exit and `scope`](../tutorial/dependencies/dependencies-with-yield.md#early-exit-and-scope).
|
||||||
|
|
||||||
### Dependencies with `yield` and `StreamingResponse`, Technical Details { #dependencies-with-yield-and-streamingresponse-technical-details }
|
### Dependencies with `yield` and `StreamingResponse`, Technical Details { #dependencies-with-yield-and-streamingresponse-technical-details }
|
||||||
|
|
||||||
Before FastAPI 0.118.0, if you used a dependency with `yield`, it would run the exit code after the *path operation function* returned but right before sending the response.
|
Before FastAPI 0.118.0, if you used a dependency with `yield`, it would run the exit code after the *path operation function* returned but right before sending the response.
|
||||||
|
|
@ -134,7 +144,7 @@ This was changed in version 0.110.0 to fix unhandled memory consumption from for
|
||||||
|
|
||||||
### Background Tasks and Dependencies with `yield`, Technical Details { #background-tasks-and-dependencies-with-yield-technical-details }
|
### Background Tasks and Dependencies with `yield`, Technical Details { #background-tasks-and-dependencies-with-yield-technical-details }
|
||||||
|
|
||||||
Before FastAPI 0.106.0, raising exceptions after `yield` was not possible, the exit code in dependencies with `yield` was executed *after* the response was sent, so [Exception Handlers](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank} would have already run.
|
Before FastAPI 0.106.0, raising exceptions after `yield` was not possible, the exit code in dependencies with `yield` was executed *after* the response was sent, so [Exception Handlers](../tutorial/handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank} would have already run.
|
||||||
|
|
||||||
This was designed this way mainly to allow using the same objects "yielded" by dependencies inside of background tasks, because the exit code would be executed after the background tasks were finished.
|
This was designed this way mainly to allow using the same objects "yielded" by dependencies inside of background tasks, because the exit code would be executed after the background tasks were finished.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ If you want to learn more about HTTPS, check the guide [About HTTPS](../deployme
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
### How Proxy Forwarded Headers Work
|
### How Proxy Forwarded Headers Work { #how-proxy-forwarded-headers-work }
|
||||||
|
|
||||||
Here's a visual representation of how the **proxy** adds forwarded headers between the client and the **application server**:
|
Here's a visual representation of how the **proxy** adds forwarded headers between the client and the **application server**:
|
||||||
|
|
||||||
|
|
@ -228,7 +228,7 @@ Passing the `root_path` to `FastAPI` would be the equivalent of passing the `--r
|
||||||
|
|
||||||
Keep in mind that the server (Uvicorn) won't use that `root_path` for anything else than passing it to the app.
|
Keep in mind that the server (Uvicorn) won't use that `root_path` for anything else than passing it to the app.
|
||||||
|
|
||||||
But if you go with your browser to <a href="http://127.0.0.1:8000" class="external-link" target="_blank">http://127.0.0.1:8000/app</a> you will see the normal response:
|
But if you go with your browser to <a href="http://127.0.0.1:8000/app" class="external-link" target="_blank">http://127.0.0.1:8000/app</a> you will see the normal response:
|
||||||
|
|
||||||
```JSON
|
```JSON
|
||||||
{
|
{
|
||||||
|
|
@ -443,6 +443,14 @@ The docs UI will interact with the server that you select.
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
||||||
|
/// note | Technical Details
|
||||||
|
|
||||||
|
The `servers` property in the OpenAPI specification is optional.
|
||||||
|
|
||||||
|
If you don't specify the `servers` parameter and `root_path` is equal to `/`, the `servers` property in the generated OpenAPI schema will be omitted entirely by default, which is the equivalent of a single server with a `url` value of `/`.
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
### Disable automatic server from `root_path` { #disable-automatic-server-from-root-path }
|
### Disable automatic server from `root_path` { #disable-automatic-server-from-root-path }
|
||||||
|
|
||||||
If you don't want **FastAPI** to include an automatic server using the `root_path`, you can use the parameter `root_path_in_servers=False`:
|
If you don't want **FastAPI** to include an automatic server using the `root_path`, you can use the parameter `root_path_in_servers=False`:
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue