mirror of
https://github.com/fastapi/fastapi.git
synced 2026-06-06 22:54:24 -04:00
Compare commits
247 Commits
0.135.3
...
fix-gramma
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cc5c3ddf5b | ||
|
|
0e25472f03 | ||
|
|
3a5511f8c4 | ||
|
|
ea93fbb857 | ||
|
|
5cdf820c80 | ||
|
|
782476e7db | ||
|
|
7eb2bf5c4e | ||
|
|
b3b6aba5ab | ||
|
|
433a7ef39b | ||
|
|
df3c778ae6 | ||
|
|
09e615a6fc | ||
|
|
81c243f86d | ||
|
|
5d2320fca6 | ||
|
|
e95d3aab28 | ||
|
|
2441eff837 | ||
|
|
460f8d2cc8 | ||
|
|
3d2aace42f | ||
|
|
566bc53187 | ||
|
|
4cc0e5b3ce | ||
|
|
d144531caa | ||
|
|
57b42cc138 | ||
|
|
2d5e2a4b29 | ||
|
|
6999d21e98 | ||
|
|
c4cf1341a1 | ||
|
|
a5a68f14e7 | ||
|
|
6926656247 | ||
|
|
9f4f3fdc5b | ||
|
|
d6629f7dfc | ||
|
|
dbe984018b | ||
|
|
46bc43a04a | ||
|
|
4bdda67fb2 | ||
|
|
2b70d68942 | ||
|
|
2aa88900df | ||
|
|
7b262b3d54 | ||
|
|
d822aefc8a | ||
|
|
502d20c441 | ||
|
|
cf2369a597 | ||
|
|
674a625ae9 | ||
|
|
e1c1299bb5 | ||
|
|
bb6dbdb6cd | ||
|
|
e29b179705 | ||
|
|
d1216e7352 | ||
|
|
d390d514eb | ||
|
|
37c92a87ff | ||
|
|
0ee8a24249 | ||
|
|
b4d58fddee | ||
|
|
ee22a4b8ca | ||
|
|
1990ecb446 | ||
|
|
91dba4484d | ||
|
|
99a1b1edee | ||
|
|
199415da85 | ||
|
|
dcac2f0d95 | ||
|
|
334582bfe4 | ||
|
|
2a1506d167 | ||
|
|
136b55f3d8 | ||
|
|
4a5f0cd370 | ||
|
|
2bd97a6013 | ||
|
|
a3558be5f8 | ||
|
|
c9343d2cf0 | ||
|
|
a53efbcae9 | ||
|
|
ad09734fa3 | ||
|
|
57535ef85b | ||
|
|
dbfd55cea3 | ||
|
|
59d4a80fcf | ||
|
|
6cbdde2315 | ||
|
|
1464678ba6 | ||
|
|
1a84bbc00b | ||
|
|
3fdc54edab | ||
|
|
09ba2cec98 | ||
|
|
3e3d38930e | ||
|
|
84f205c8f7 | ||
|
|
7baefe7144 | ||
|
|
2895c51ba8 | ||
|
|
21c46919fc | ||
|
|
8206485753 | ||
|
|
c910e0139f | ||
|
|
063b5bf582 | ||
|
|
22b02e26f9 | ||
|
|
3b252a2a22 | ||
|
|
c7fb7851b3 | ||
|
|
cb83b83dcf | ||
|
|
00f805cec9 | ||
|
|
3675137523 | ||
|
|
7b57e42986 | ||
|
|
e16894ec5b | ||
|
|
8b647e3405 | ||
|
|
4f37a43d32 | ||
|
|
973230c782 | ||
|
|
ecd70826eb | ||
|
|
c347875c9c | ||
|
|
0b9863020d | ||
|
|
55a9ff2e5e | ||
|
|
b95681eb5b | ||
|
|
c99e215ed8 | ||
|
|
4232d80e84 | ||
|
|
87d1daeeea | ||
|
|
60571d7ada | ||
|
|
a314e3be3b | ||
|
|
b11805add7 | ||
|
|
74d735d518 | ||
|
|
ed7f49ed69 | ||
|
|
3969ae8f38 | ||
|
|
f4cafbc467 | ||
|
|
31ced9d49e | ||
|
|
6f9dcdf61a | ||
|
|
2b5cd26248 | ||
|
|
5341528623 | ||
|
|
ff6a38a434 | ||
|
|
626ae1918c | ||
|
|
3780ba5472 | ||
|
|
21697d9794 | ||
|
|
628ff21528 | ||
|
|
bf3668de89 | ||
|
|
f343905934 | ||
|
|
3ab6f1b31d | ||
|
|
f3963927ec | ||
|
|
1f48fb42fc | ||
|
|
5cfd983e1d | ||
|
|
e3844f1972 | ||
|
|
99812444ab | ||
|
|
480fdba26a | ||
|
|
f0c3d87da2 | ||
|
|
4047993ba8 | ||
|
|
e6edf14a27 | ||
|
|
34a82b1b87 | ||
|
|
622dcdc99c | ||
|
|
8106d6391d | ||
|
|
6163cc7996 | ||
|
|
c7171f86b2 | ||
|
|
eff8bc4e66 | ||
|
|
9364f552e6 | ||
|
|
72f127ddad | ||
|
|
a35a0b8b62 | ||
|
|
3e2ef69479 | ||
|
|
ecace740f3 | ||
|
|
6939bf8bb7 | ||
|
|
40e383e0b2 | ||
|
|
a0f42dd7d5 | ||
|
|
6f2dbb96ac | ||
|
|
b6abc93bff | ||
|
|
b31ffc1efd | ||
|
|
b71da659cf | ||
|
|
b70238d9e3 | ||
|
|
2c26191e30 | ||
|
|
e89a37e50d | ||
|
|
5d5666bec5 | ||
|
|
7cb195394c | ||
|
|
3ec959abc7 | ||
|
|
622b6356b5 | ||
|
|
fb7429378d | ||
|
|
3efd86c1fd | ||
|
|
f8cbeabf81 | ||
|
|
8c660a6819 | ||
|
|
810fd2a888 | ||
|
|
ecf73d61c3 | ||
|
|
9ccaab154a | ||
|
|
f72afb6f6e | ||
|
|
8da79ec2fe | ||
|
|
205bd85a46 | ||
|
|
bc8b1d101c | ||
|
|
e0a2c75b1a | ||
|
|
33ed5aecdf | ||
|
|
d8a2c1edaa | ||
|
|
b363a1d002 | ||
|
|
a3ceb9ca74 | ||
|
|
aff0b7cd43 | ||
|
|
6b20159c59 | ||
|
|
a217d2ff2a | ||
|
|
4f64b8f651 | ||
|
|
1f7c8c1ad3 | ||
|
|
0e78824634 | ||
|
|
4bad6d2597 | ||
|
|
44ddc3e7c8 | ||
|
|
edc4c8ba33 | ||
|
|
b44585589a | ||
|
|
f43cc1c0ef | ||
|
|
5c89b88c9f | ||
|
|
4216f99515 | ||
|
|
33aa27c7b7 | ||
|
|
086048e395 | ||
|
|
91dd310da9 | ||
|
|
3747204677 | ||
|
|
e54e5a8980 | ||
|
|
9a8a5fd999 | ||
|
|
7815a32f2e | ||
|
|
ef1c927b05 | ||
|
|
38039e12a8 | ||
|
|
4fa826ce0a | ||
|
|
c39415673e | ||
|
|
ae230ad2f9 | ||
|
|
d9eb39d1a1 | ||
|
|
4f8b5d14d3 | ||
|
|
04958499e0 | ||
|
|
71f3c30108 | ||
|
|
ea230dc80b | ||
|
|
5f68b19002 | ||
|
|
7402e33375 | ||
|
|
750ef483f2 | ||
|
|
7c6b79eb3b | ||
|
|
c38782e0e8 | ||
|
|
840e462667 | ||
|
|
88021c3dc0 | ||
|
|
13eade2fd9 | ||
|
|
e0900abc6d | ||
|
|
4e6d8dc600 | ||
|
|
2bf3cdeb19 | ||
|
|
043fdce921 | ||
|
|
9d79b257ad | ||
|
|
6fadc67d62 | ||
|
|
a93b1db937 | ||
|
|
e5a86c3972 | ||
|
|
916edab526 | ||
|
|
355c12ce0e | ||
|
|
4a29794efb | ||
|
|
c6bf1a9702 | ||
|
|
19c7b4bc28 | ||
|
|
0d68ccc87c | ||
|
|
fb5f830bf8 | ||
|
|
7ce742e2c1 | ||
|
|
28b18ced2d | ||
|
|
2d625c0962 | ||
|
|
ecc9069b90 | ||
|
|
7d23cc8fe8 | ||
|
|
636998e53a | ||
|
|
a8773aadf8 | ||
|
|
2378fbbc45 | ||
|
|
c874e067dc | ||
|
|
bdd6c70760 | ||
|
|
a595e44d28 | ||
|
|
2fa00db858 | ||
|
|
41df44a29c | ||
|
|
6976b0d4e6 | ||
|
|
3808d8540f | ||
|
|
24db1286eb | ||
|
|
3f4169be1a | ||
|
|
708606c982 | ||
|
|
13be6a3a0f | ||
|
|
4b264878d7 | ||
|
|
f796c346a8 | ||
|
|
09d1d1cb70 | ||
|
|
ae4e45c5cc | ||
|
|
9653034b8d | ||
|
|
6f9a102faf | ||
|
|
eba8942c81 | ||
|
|
77d080caf8 | ||
|
|
c3c9dd6b1a | ||
|
|
180e81bb4b |
1
.github/FUNDING.yml
vendored
1
.github/FUNDING.yml
vendored
@@ -1 +0,0 @@
|
||||
github: [tiangolo]
|
||||
38
.github/dependabot.yml
vendored
38
.github/dependabot.yml
vendored
@@ -4,13 +4,47 @@ updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "daily"
|
||||
interval: "weekly"
|
||||
cooldown:
|
||||
default-days: 7
|
||||
commit-message:
|
||||
prefix: ⬆
|
||||
labels:
|
||||
- "internal"
|
||||
- "dependencies"
|
||||
- "github_actions"
|
||||
groups:
|
||||
github-actions:
|
||||
patterns:
|
||||
- "*"
|
||||
# Python
|
||||
- package-ecosystem: "uv"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "monthly"
|
||||
interval: "weekly"
|
||||
cooldown:
|
||||
default-days: 7
|
||||
commit-message:
|
||||
prefix: ⬆
|
||||
groups:
|
||||
python-packages:
|
||||
dependency-type: "development"
|
||||
patterns:
|
||||
- "*"
|
||||
# pre-commit
|
||||
- package-ecosystem: "pre-commit"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
cooldown:
|
||||
default-days: 7
|
||||
commit-message:
|
||||
prefix: ⬆
|
||||
labels:
|
||||
- "internal"
|
||||
- "dependencies"
|
||||
- "pre-commit"
|
||||
groups:
|
||||
pre-commit:
|
||||
patterns:
|
||||
- "*"
|
||||
|
||||
9
.github/workflows/add-to-project.yml
vendored
9
.github/workflows/add-to-project.yml
vendored
@@ -1,18 +1,21 @@
|
||||
name: Add to Project
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
pull_request_target: # zizmor: ignore[dangerous-triggers]
|
||||
issues:
|
||||
types:
|
||||
- opened
|
||||
- reopened
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
add-to-project:
|
||||
name: Add to project
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- uses: actions/add-to-project@v1.0.2
|
||||
- uses: actions/add-to-project@5afcf98fcd03f1c2f92c3c83f58ae24323cc57fd # v2.0.0
|
||||
with:
|
||||
project-url: https://github.com/orgs/fastapi/projects/2
|
||||
github-token: ${{ secrets.PROJECTS_TOKEN }}
|
||||
github-token: ${{ secrets.PROJECTS_TOKEN }} # zizmor: ignore[secrets-outside-env]
|
||||
|
||||
62
.github/workflows/build-docs.yml
vendored
62
.github/workflows/build-docs.yml
vendored
@@ -8,19 +8,24 @@ on:
|
||||
- opened
|
||||
- synchronize
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
changes:
|
||||
runs-on: ubuntu-latest
|
||||
# Required permissions
|
||||
permissions:
|
||||
pull-requests: read
|
||||
timeout-minutes: 5
|
||||
# Set job outputs to values from filter step
|
||||
outputs:
|
||||
docs: ${{ steps.filter.outputs.docs }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
# For pull requests it's not necessary to checkout the code but for the main branch it is
|
||||
- uses: dorny/paths-filter@v4
|
||||
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
|
||||
id: filter
|
||||
with:
|
||||
filters: |
|
||||
@@ -30,26 +35,31 @@ jobs:
|
||||
- docs_src/**
|
||||
- pyproject.toml
|
||||
- uv.lock
|
||||
- mkdocs.yml
|
||||
- mkdocs.env.yml
|
||||
- .github/workflows/build-docs.yml
|
||||
- .github/workflows/deploy-docs.yml
|
||||
- scripts/mkdocs_hooks.py
|
||||
- scripts/docs.py
|
||||
langs:
|
||||
needs:
|
||||
- changes
|
||||
if: ${{ needs.changes.outputs.docs == 'true' }}
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
outputs:
|
||||
langs: ${{ steps.show-langs.outputs.langs }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version-file: ".python-version"
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
enable-cache: true
|
||||
cache-dependency-glob: |
|
||||
pyproject.toml
|
||||
@@ -67,6 +77,7 @@ jobs:
|
||||
- langs
|
||||
if: ${{ needs.changes.outputs.docs == 'true' }}
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 7
|
||||
strategy:
|
||||
matrix:
|
||||
lang: ${{ fromJson(needs.langs.outputs.langs) }}
|
||||
@@ -75,14 +86,19 @@ jobs:
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version-file: ".python-version"
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
enable-cache: true
|
||||
cache-dependency-glob: |
|
||||
pyproject.toml
|
||||
@@ -91,27 +107,35 @@ jobs:
|
||||
run: uv sync --locked --no-dev --group docs
|
||||
- name: Update Languages
|
||||
run: uv run ./scripts/docs.py update-languages
|
||||
- uses: actions/cache@v5
|
||||
- uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
||||
with:
|
||||
key: mkdocs-cards-${{ matrix.lang }}-${{ github.ref }}
|
||||
path: docs/${{ matrix.lang }}/.cache
|
||||
key: zensical-${{ matrix.lang }}-${{ github.ref }}
|
||||
path: site_zensical_src/${{ matrix.lang }}/.cache
|
||||
- name: Build Docs
|
||||
run: uv run ./scripts/docs.py build-lang ${{ matrix.lang }}
|
||||
- uses: actions/upload-artifact@v7
|
||||
run: | # zizmor: ignore[template-injection] - comes from trusted source
|
||||
uv run ./scripts/docs.py build-lang ${{ matrix.lang }}
|
||||
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: docs-site-${{ matrix.lang }}
|
||||
path: ./site/**
|
||||
# English owns root static assets. Translated pages reference /img, /css,
|
||||
# and /js, so omit duplicated language-local copies from artifacts.
|
||||
path: |
|
||||
./site/**
|
||||
!./site/${{ matrix.lang }}/img/**
|
||||
!./site/${{ matrix.lang }}/css/**
|
||||
!./site/${{ matrix.lang }}/js/**
|
||||
include-hidden-files: true
|
||||
|
||||
# https://github.com/marketplace/actions/alls-green#why
|
||||
docs-all-green: # This job does nothing and is only used for the branch protection
|
||||
if: always()
|
||||
needs:
|
||||
- langs
|
||||
- build-docs
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Decide whether the needed jobs succeeded or failed
|
||||
uses: re-actors/alls-green@release/v1
|
||||
uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # v1.2.2
|
||||
with:
|
||||
jobs: ${{ toJSON(needs) }}
|
||||
allowed-skips: build-docs
|
||||
allowed-skips: langs, build-docs
|
||||
|
||||
19
.github/workflows/contributors.yml
vendored
19
.github/workflows/contributors.yml
vendored
@@ -10,6 +10,8 @@ on:
|
||||
required: false
|
||||
default: "false"
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
job:
|
||||
if: github.repository_owner == 'fastapi'
|
||||
@@ -21,14 +23,19 @@ jobs:
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: true # Required for `git push` in `contributors.py`
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version-file: ".python-version"
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
enable-cache: true
|
||||
cache-dependency-glob: |
|
||||
pyproject.toml
|
||||
@@ -37,13 +44,13 @@ jobs:
|
||||
run: uv sync --locked --no-dev --group github-actions
|
||||
# Allow debugging with tmate
|
||||
- name: Setup tmate session
|
||||
uses: mxschmitt/action-tmate@v3
|
||||
uses: mxschmitt/action-tmate@c0afd6f790e3a5564914980036ebf83216678101 # v3.23
|
||||
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }}
|
||||
with:
|
||||
limit-access-to-actor: true
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.FASTAPI_PR_TOKEN }}
|
||||
GITHUB_TOKEN: ${{ secrets.FASTAPI_PR_TOKEN }} # zizmor: ignore[secrets-outside-env]
|
||||
- name: FastAPI People Contributors
|
||||
run: uv run ./scripts/contributors.py
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.FASTAPI_PR_TOKEN }}
|
||||
GITHUB_TOKEN: ${{ secrets.FASTAPI_PR_TOKEN }} # zizmor: ignore[secrets-outside-env]
|
||||
|
||||
56
.github/workflows/create-draft-release.yml
vendored
Normal file
56
.github/workflows/create-draft-release.yml
vendored
Normal file
@@ -0,0 +1,56 @@
|
||||
name: Create Draft Release
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types:
|
||||
- closed
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
create-draft-release:
|
||||
if: github.event.pull_request.merged == true && contains(github.event.pull_request.labels.*.name, 'release')
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
permissions:
|
||||
contents: write
|
||||
env:
|
||||
PREPARE_RELEASE_VERSION_FILE: fastapi/__init__.py
|
||||
PREPARE_RELEASE_RELEASE_NOTES_FILE: docs/en/docs/release-notes.md
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
ref: ${{ github.event.repository.default_branch }}
|
||||
persist-credentials: true
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version-file: ".python-version"
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
- name: Extract release details
|
||||
id: release-details
|
||||
run: |
|
||||
set -euo pipefail
|
||||
version="$(uv run python scripts/prepare_release.py current-version)"
|
||||
uv run python scripts/prepare_release.py release-notes > draft-release-notes.md
|
||||
echo "version=$version" >> "$GITHUB_OUTPUT"
|
||||
- name: Create draft release
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
VERSION: ${{ steps.release-details.outputs.version }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
gh release create "$VERSION" \
|
||||
--draft \
|
||||
--title "$VERSION" \
|
||||
--notes-file draft-release-notes.md \
|
||||
--target "$(git rev-parse HEAD)"
|
||||
38
.github/workflows/deploy-docs.yml
vendored
38
.github/workflows/deploy-docs.yml
vendored
@@ -1,37 +1,41 @@
|
||||
name: Deploy Docs
|
||||
on:
|
||||
workflow_run:
|
||||
workflow_run: # zizmor: ignore[dangerous-triggers]
|
||||
workflows:
|
||||
- Build Docs
|
||||
types:
|
||||
- completed
|
||||
|
||||
permissions:
|
||||
deployments: write
|
||||
issues: write
|
||||
pull-requests: write
|
||||
statuses: write
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
deploy-docs:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
deployments: write
|
||||
issues: write
|
||||
pull-requests: write
|
||||
statuses: write
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version-file: ".python-version"
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
enable-cache: true
|
||||
cache-dependency-glob: |
|
||||
pyproject.toml
|
||||
uv.lock
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
enable-cache: false
|
||||
- name: Install GitHub Actions dependencies
|
||||
run: uv sync --locked --no-dev --group github-actions
|
||||
- name: Deploy Docs Status Pending
|
||||
@@ -45,7 +49,7 @@ jobs:
|
||||
run: |
|
||||
rm -rf ./site
|
||||
mkdir ./site
|
||||
- uses: actions/download-artifact@v8
|
||||
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
path: ./site/
|
||||
pattern: docs-site-*
|
||||
@@ -59,10 +63,10 @@ jobs:
|
||||
env:
|
||||
PROJECT_NAME: fastapitiangolo
|
||||
BRANCH: ${{ ( github.event.workflow_run.head_repository.full_name == github.repository && github.event.workflow_run.head_branch == 'master' && 'main' ) || ( github.event.workflow_run.head_sha ) }}
|
||||
uses: cloudflare/wrangler-action@v3
|
||||
uses: cloudflare/wrangler-action@ebbaa1584979971c8614a24965b4405ff95890e0 # v4.0.0
|
||||
with:
|
||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
|
||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
|
||||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} # zizmor: ignore[secrets-outside-env]
|
||||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} # zizmor: ignore[secrets-outside-env]
|
||||
command: pages deploy ./site --project-name=${{ env.PROJECT_NAME }} --branch=${{ env.BRANCH }}
|
||||
- name: Deploy Docs Status Error
|
||||
if: failure()
|
||||
|
||||
7
.github/workflows/detect-conflicts.yml
vendored
7
.github/workflows/detect-conflicts.yml
vendored
@@ -1,18 +1,21 @@
|
||||
name: "Conflict detector"
|
||||
on:
|
||||
push:
|
||||
pull_request_target:
|
||||
pull_request_target: # zizmor: ignore[dangerous-triggers]
|
||||
types: [synchronize]
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
main:
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- name: Check if PRs have merge conflicts
|
||||
uses: eps1lon/actions-label-merge-conflict@v3
|
||||
uses: eps1lon/actions-label-merge-conflict@0273be72a0bbd58fcd71d0d6c02c209b50d1e5e1 # v3.1.0
|
||||
with:
|
||||
dirtyLabel: "conflicts"
|
||||
repoToken: "${{ secrets.GITHUB_TOKEN }}"
|
||||
|
||||
53
.github/workflows/guard-dependencies.yml
vendored
Normal file
53
.github/workflows/guard-dependencies.yml
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
name: Guard Dependencies
|
||||
|
||||
on:
|
||||
pull_request_target: # zizmor: ignore[dangerous-triggers] -- This workflow only reads context.payload metadata, never checks out PR code
|
||||
branches: [master]
|
||||
paths:
|
||||
- pyproject.toml
|
||||
- uv.lock
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
check-author:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- name: Check if author is org member or allowed bot
|
||||
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
with:
|
||||
script: |
|
||||
const pr = context.payload.pull_request;
|
||||
const author = pr.user.login;
|
||||
const assoc = pr.author_association;
|
||||
|
||||
const botAllowlist = new Set(['dependabot[bot]']);
|
||||
const orgAuthorAssociations = new Set(['MEMBER', 'OWNER']);
|
||||
|
||||
const allowed =
|
||||
botAllowlist.has(author) ||
|
||||
(assoc != null && orgAuthorAssociations.has(assoc));
|
||||
|
||||
if (!allowed) {
|
||||
await github.rest.issues.createComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: context.payload.pull_request.number,
|
||||
body: `This PR modifies dependency files (\`pyproject.toml\` or \`uv.lock\`), which is restricted to members of the **${context.repo.owner}** organization on GitHub.\n\nIf you need a dependency change, please [open a discussion](https://github.com/${context.repo.owner}/${context.repo.repo}/discussions/new) describing what you need and why.\n\nClosing this PR automatically.`
|
||||
});
|
||||
|
||||
await github.rest.pulls.update({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
pull_number: context.payload.pull_request.number,
|
||||
state: 'closed'
|
||||
});
|
||||
|
||||
core.setFailed('Dependency changes are restricted to organization members.');
|
||||
} else {
|
||||
console.log(`Author ${author} (author_association=${assoc}) is allowed to make dependency changes.`);
|
||||
}
|
||||
12
.github/workflows/issue-manager.yml
vendored
12
.github/workflows/issue-manager.yml
vendored
@@ -9,25 +9,27 @@ on:
|
||||
issues:
|
||||
types:
|
||||
- labeled
|
||||
pull_request_target:
|
||||
pull_request_target: # zizmor: ignore[dangerous-triggers]
|
||||
types:
|
||||
- labeled
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
issue-manager:
|
||||
if: github.repository_owner == 'fastapi'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: tiangolo/issue-manager@0.6.0
|
||||
- uses: tiangolo/issue-manager@2fb3484ec9279485df8659e8ec73de262431737d # 0.6.0
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
config: >
|
||||
|
||||
17
.github/workflows/label-approved.yml
vendored
17
.github/workflows/label-approved.yml
vendored
@@ -5,26 +5,33 @@ on:
|
||||
- cron: "0 12 * * *"
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
pull-requests: write
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
label-approved:
|
||||
if: github.repository_owner == 'fastapi'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
timeout-minutes: 7
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version-file: ".python-version"
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
enable-cache: true
|
||||
cache-dependency-glob: |
|
||||
pyproject.toml
|
||||
|
||||
12
.github/workflows/labeler.yml
vendored
12
.github/workflows/labeler.yml
vendored
@@ -1,6 +1,6 @@
|
||||
name: Labels
|
||||
on:
|
||||
pull_request_target:
|
||||
pull_request_target: # zizmor: ignore[dangerous-triggers]
|
||||
types:
|
||||
- opened
|
||||
- synchronize
|
||||
@@ -9,14 +9,17 @@ on:
|
||||
- labeled
|
||||
- unlabeled
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
labeler:
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- uses: actions/labeler@v6
|
||||
- uses: actions/labeler@f27b608878404679385c85cfa523b85ccb86e213 # v6.1.0
|
||||
if: ${{ github.event.action != 'labeled' && github.event.action != 'unlabeled' }}
|
||||
- run: echo "Done adding labels"
|
||||
# Run this after labeler applied labels
|
||||
@@ -26,8 +29,9 @@ jobs:
|
||||
permissions:
|
||||
pull-requests: read
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- uses: docker://agilepathway/pull-request-label-checker:latest
|
||||
- uses: agilepathway/label-checker@c3d16ad512e7cea5961df85ff2486bb774caf3c5 # v1.6.65
|
||||
with:
|
||||
one_of: breaking,security,feature,bug,refactor,upgrade,docs,lang-all,internal
|
||||
one_of: breaking,security,feature,bug,refactor,upgrade,docs,lang-all,internal,release
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
17
.github/workflows/latest-changes.yml
vendored
17
.github/workflows/latest-changes.yml
vendored
@@ -1,7 +1,7 @@
|
||||
name: Latest Changes
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
pull_request_target: # zizmor: ignore[dangerous-triggers]
|
||||
branches:
|
||||
- master
|
||||
types:
|
||||
@@ -16,27 +16,30 @@ on:
|
||||
required: false
|
||||
default: 'false'
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
latest-changes:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event_name == 'workflow_dispatch' || github.event.pull_request.merged == true
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
# pin to actions/checkout@v5 for compatibility with latest-changes
|
||||
# Ref: https://github.com/actions/checkout/issues/2313
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
# To allow latest-changes to commit to the main branch
|
||||
token: ${{ secrets.FASTAPI_LATEST_CHANGES }}
|
||||
token: ${{ secrets.FASTAPI_LATEST_CHANGES }} # zizmor: ignore[secrets-outside-env]
|
||||
persist-credentials: true # required by tiangolo/latest-changes
|
||||
# Allow debugging with tmate
|
||||
- name: Setup tmate session
|
||||
uses: mxschmitt/action-tmate@v3
|
||||
uses: mxschmitt/action-tmate@c0afd6f790e3a5564914980036ebf83216678101 # v3.23
|
||||
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }}
|
||||
with:
|
||||
limit-access-to-actor: true
|
||||
- uses: tiangolo/latest-changes@0.4.1
|
||||
- uses: tiangolo/latest-changes@eb3f6e7ff0073896ecb561e774a121de9418fa06 # 0.5.0
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
latest_changes_file: docs/en/docs/release-notes.md
|
||||
|
||||
20
.github/workflows/notify-translations.yml
vendored
20
.github/workflows/notify-translations.yml
vendored
@@ -1,10 +1,12 @@
|
||||
name: Notify Translations
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
pull_request_target: # zizmor: ignore[dangerous-triggers]
|
||||
types:
|
||||
- labeled
|
||||
- closed
|
||||
branches:
|
||||
- master
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
number:
|
||||
@@ -15,24 +17,32 @@ on:
|
||||
required: false
|
||||
default: 'false'
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
job:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
discussions: write
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version-file: ".python-version"
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
enable-cache: true
|
||||
cache-dependency-glob: |
|
||||
pyproject.toml
|
||||
@@ -41,7 +51,7 @@ jobs:
|
||||
run: uv sync --locked --no-dev --group github-actions
|
||||
# Allow debugging with tmate
|
||||
- name: Setup tmate session
|
||||
uses: mxschmitt/action-tmate@v3
|
||||
uses: mxschmitt/action-tmate@c0afd6f790e3a5564914980036ebf83216678101 # v3.23
|
||||
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }}
|
||||
with:
|
||||
limit-access-to-actor: true
|
||||
|
||||
19
.github/workflows/people.yml
vendored
19
.github/workflows/people.yml
vendored
@@ -10,6 +10,8 @@ on:
|
||||
required: false
|
||||
default: "false"
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
job:
|
||||
if: github.repository_owner == 'fastapi'
|
||||
@@ -21,14 +23,19 @@ jobs:
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: true # Required for `git push` in `people.py`
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version-file: ".python-version"
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
enable-cache: true
|
||||
cache-dependency-glob: |
|
||||
pyproject.toml
|
||||
@@ -37,14 +44,14 @@ jobs:
|
||||
run: uv sync --locked --no-dev --group github-actions
|
||||
# Allow debugging with tmate
|
||||
- name: Setup tmate session
|
||||
uses: mxschmitt/action-tmate@v3
|
||||
uses: mxschmitt/action-tmate@c0afd6f790e3a5564914980036ebf83216678101 # v3.23
|
||||
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }}
|
||||
with:
|
||||
limit-access-to-actor: true
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.FASTAPI_PEOPLE }}
|
||||
GITHUB_TOKEN: ${{ secrets.FASTAPI_PEOPLE }} # zizmor: ignore[secrets-outside-env]
|
||||
- name: FastAPI People Experts
|
||||
run: uv run ./scripts/people.py
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.FASTAPI_PEOPLE }}
|
||||
GITHUB_TOKEN: ${{ secrets.FASTAPI_PEOPLE }} # zizmor: ignore[secrets-outside-env]
|
||||
SLEEP_INTERVAL: ${{ vars.PEOPLE_SLEEP_INTERVAL }}
|
||||
|
||||
25
.github/workflows/pre-commit.yml
vendored
25
.github/workflows/pre-commit.yml
vendored
@@ -6,6 +6,8 @@ on:
|
||||
- opened
|
||||
- synchronize
|
||||
|
||||
permissions: {}
|
||||
|
||||
env:
|
||||
# Forks and Dependabot don't have access to secrets
|
||||
HAS_SECRETS: ${{ secrets.PRE_COMMIT != '' }}
|
||||
@@ -13,12 +15,13 @@ env:
|
||||
jobs:
|
||||
pre-commit:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
name: Checkout PR for own repo
|
||||
if: env.HAS_SECRETS == 'true'
|
||||
with:
|
||||
@@ -28,22 +31,27 @@ jobs:
|
||||
# And it needs the full history to be able to compute diffs
|
||||
fetch-depth: 0
|
||||
# A token other than the default GITHUB_TOKEN is needed to be able to trigger CI
|
||||
token: ${{ secrets.PRE_COMMIT }}
|
||||
token: ${{ secrets.PRE_COMMIT }} # zizmor: ignore[secrets-outside-env]
|
||||
persist-credentials: true # Required for `git push` command
|
||||
# pre-commit lite ci needs the default checkout configs to work
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
name: Checkout PR for fork
|
||||
if: env.HAS_SECRETS == 'false'
|
||||
with:
|
||||
# To be able to commit it needs the head branch of the PR, the remote one
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version-file: ".python-version"
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
cache-dependency-glob: |
|
||||
pyproject.toml
|
||||
uv.lock
|
||||
@@ -51,7 +59,7 @@ jobs:
|
||||
run: uv sync --locked --extra all
|
||||
- name: Run prek - pre-commit
|
||||
id: precommit
|
||||
run: uvx prek run --from-ref origin/${GITHUB_BASE_REF} --to-ref HEAD --show-diff-on-failure
|
||||
run: uv run prek 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.HAS_SECRETS == 'true'
|
||||
@@ -65,7 +73,7 @@ jobs:
|
||||
git commit -m "🎨 Auto format"
|
||||
git push
|
||||
fi
|
||||
- uses: pre-commit-ci/lite-action@v1.1.0
|
||||
- uses: pre-commit-ci/lite-action@5d6cc0eb514c891a40562a58a8e71576c5c7fb43 # v1.1.0
|
||||
if: env.HAS_SECRETS == 'false'
|
||||
with:
|
||||
msg: 🎨 Auto format
|
||||
@@ -79,12 +87,13 @@ jobs:
|
||||
needs:
|
||||
- pre-commit
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
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
|
||||
uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # v1.2.2
|
||||
with:
|
||||
jobs: ${{ toJSON(needs) }}
|
||||
|
||||
80
.github/workflows/prepare-release.yml
vendored
Normal file
80
.github/workflows/prepare-release.yml
vendored
Normal file
@@ -0,0 +1,80 @@
|
||||
name: Prepare Release
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
bump:
|
||||
description: Release bump
|
||||
required: true
|
||||
type: choice
|
||||
options:
|
||||
- patch
|
||||
- minor
|
||||
- major
|
||||
date:
|
||||
description: Release date in YYYY-MM-DD format. Defaults to today.
|
||||
required: false
|
||||
type: string
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
prepare-release:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
permissions:
|
||||
contents: write
|
||||
issues: write
|
||||
pull-requests: write
|
||||
env:
|
||||
PREPARE_RELEASE_VERSION_FILE: fastapi/__init__.py
|
||||
PREPARE_RELEASE_RELEASE_NOTES_FILE: docs/en/docs/release-notes.md
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
token: ${{ secrets.FASTAPI_LATEST_CHANGES }} # zizmor: ignore[secrets-outside-env]
|
||||
persist-credentials: true
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version-file: ".python-version"
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
- name: Prepare release
|
||||
env:
|
||||
PREPARE_RELEASE_BUMP: ${{ inputs.bump }}
|
||||
PREPARE_RELEASE_DATE: ${{ inputs.date }}
|
||||
run: uv run python scripts/prepare_release.py prepare
|
||||
- name: Get release version
|
||||
id: release-version
|
||||
run: |
|
||||
version="$(uv run python scripts/prepare_release.py current-version)"
|
||||
echo "$version"
|
||||
echo "version=$version" >> "$GITHUB_OUTPUT"
|
||||
- name: Create release pull request
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.FASTAPI_LATEST_CHANGES }}
|
||||
VERSION: ${{ steps.release-version.outputs.version }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
branch="release-${VERSION}-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
|
||||
git config user.name "github-actions[bot]"
|
||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||
git switch -c "$branch"
|
||||
git add $PREPARE_RELEASE_VERSION_FILE $PREPARE_RELEASE_RELEASE_NOTES_FILE
|
||||
git commit -m "🔖 Release version ${VERSION}"
|
||||
git push --set-upstream origin "$branch"
|
||||
gh pr create \
|
||||
--base master \
|
||||
--head "$branch" \
|
||||
--title "🔖 Release version ${VERSION}" \
|
||||
--body "Prepare release ${VERSION}." \
|
||||
--label release
|
||||
18
.github/workflows/publish.yml
vendored
18
.github/workflows/publish.yml
vendored
@@ -3,7 +3,9 @@ name: Publish
|
||||
on:
|
||||
release:
|
||||
types:
|
||||
- created
|
||||
- published
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
@@ -11,18 +13,26 @@ jobs:
|
||||
permissions:
|
||||
id-token: write
|
||||
contents: read
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version-file: ".python-version"
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
enable-cache: "false"
|
||||
- name: Build distribution
|
||||
run: uv build
|
||||
- name: Publish
|
||||
|
||||
23
.github/workflows/smokeshow.yml
vendored
23
.github/workflows/smokeshow.yml
vendored
@@ -1,34 +1,41 @@
|
||||
name: Smokeshow
|
||||
|
||||
on:
|
||||
workflow_run:
|
||||
workflow_run: # zizmor: ignore[dangerous-triggers]
|
||||
workflows: [Test]
|
||||
types: [completed]
|
||||
|
||||
permissions:
|
||||
statuses: write
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
smokeshow:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
statuses: write
|
||||
timeout-minutes: 5
|
||||
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-python@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version-file: ".python-version"
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
cache-dependency-glob: |
|
||||
pyproject.toml
|
||||
uv.lock
|
||||
- run: uv sync --locked --no-dev --group github-actions
|
||||
- uses: actions/download-artifact@v8
|
||||
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
name: coverage-html
|
||||
path: htmlcov
|
||||
@@ -51,4 +58,4 @@ jobs:
|
||||
SMOKESHOW_GITHUB_CONTEXT: coverage
|
||||
SMOKESHOW_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
SMOKESHOW_GITHUB_PR_HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
|
||||
SMOKESHOW_AUTH_KEY: ${{ secrets.SMOKESHOW_AUTH_KEY }}
|
||||
SMOKESHOW_AUTH_KEY: ${{ secrets.SMOKESHOW_AUTH_KEY }} # zizmor: ignore[secrets-outside-env]
|
||||
|
||||
20
.github/workflows/sponsors.yml
vendored
20
.github/workflows/sponsors.yml
vendored
@@ -10,25 +10,33 @@ on:
|
||||
required: false
|
||||
default: "false"
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
job:
|
||||
if: github.repository_owner == 'fastapi'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: true # Required for `git push` in `sponsors.py`
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version-file: ".python-version"
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
enable-cache: true
|
||||
cache-dependency-glob: |
|
||||
pyproject.toml
|
||||
@@ -37,12 +45,12 @@ jobs:
|
||||
run: uv sync --locked --no-dev --group github-actions
|
||||
# Allow debugging with tmate
|
||||
- name: Setup tmate session
|
||||
uses: mxschmitt/action-tmate@v3
|
||||
uses: mxschmitt/action-tmate@c0afd6f790e3a5564914980036ebf83216678101 # v3.23
|
||||
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }}
|
||||
with:
|
||||
limit-access-to-actor: true
|
||||
- name: FastAPI People Sponsors
|
||||
run: uv run ./scripts/sponsors.py
|
||||
env:
|
||||
SPONSORS_TOKEN: ${{ secrets.SPONSORS_TOKEN }}
|
||||
PR_TOKEN: ${{ secrets.FASTAPI_PR_TOKEN }}
|
||||
SPONSORS_TOKEN: ${{ secrets.SPONSORS_TOKEN }} # zizmor: ignore[secrets-outside-env]
|
||||
PR_TOKEN: ${{ secrets.FASTAPI_PR_TOKEN }} # zizmor: ignore[secrets-outside-env]
|
||||
|
||||
12
.github/workflows/test-redistribute.yml
vendored
12
.github/workflows/test-redistribute.yml
vendored
@@ -9,17 +9,22 @@ on:
|
||||
- opened
|
||||
- synchronize
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
test-redistribute:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version-file: ".python-version"
|
||||
- name: Install build dependencies
|
||||
@@ -53,8 +58,9 @@ jobs:
|
||||
needs:
|
||||
- test-redistribute
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- name: Decide whether the needed jobs succeeded or failed
|
||||
uses: re-actors/alls-green@release/v1
|
||||
uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # v1.2.2
|
||||
with:
|
||||
jobs: ${{ toJSON(needs) }}
|
||||
|
||||
92
.github/workflows/test.yml
vendored
92
.github/workflows/test.yml
vendored
@@ -12,6 +12,8 @@ on:
|
||||
# cron every week on monday
|
||||
- cron: "0 0 * * 1"
|
||||
|
||||
permissions: {}
|
||||
|
||||
env:
|
||||
UV_NO_SYNC: true
|
||||
INLINE_SNAPSHOT_DEFAULT_FLAGS: review
|
||||
@@ -23,12 +25,15 @@ jobs:
|
||||
permissions:
|
||||
pull-requests: read
|
||||
# Set job outputs to values from filter step
|
||||
timeout-minutes: 5
|
||||
outputs:
|
||||
src: ${{ steps.filter.outputs.src }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
# For pull requests it's not necessary to checkout the code but for the main branch it is
|
||||
- uses: dorny/paths-filter@v4
|
||||
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
|
||||
id: filter
|
||||
with:
|
||||
filters: |
|
||||
@@ -46,10 +51,12 @@ jobs:
|
||||
needs:
|
||||
- changes
|
||||
if: needs.changes.outputs.src == 'true' || github.ref == 'refs/heads/master'
|
||||
timeout-minutes: 10
|
||||
strategy:
|
||||
matrix:
|
||||
os: [ windows-latest, macos-latest ]
|
||||
python-version: [ "3.14" ]
|
||||
python-version: [ "3.14", "3.14t" ]
|
||||
deprecated-tests: [ "no-deprecation" ]
|
||||
uv-resolution:
|
||||
- highest
|
||||
starlette-src:
|
||||
@@ -60,23 +67,38 @@ jobs:
|
||||
python-version: "3.10"
|
||||
coverage: coverage
|
||||
uv-resolution: lowest-direct
|
||||
deprecated-tests: "no-deprecation"
|
||||
- os: windows-latest
|
||||
python-version: "3.12"
|
||||
coverage: coverage
|
||||
uv-resolution: lowest-direct
|
||||
deprecated-tests: "no-deprecation"
|
||||
- os: ubuntu-latest
|
||||
python-version: "3.13"
|
||||
coverage: coverage
|
||||
uv-resolution: highest
|
||||
deprecated-tests: "no-deprecation"
|
||||
- os: ubuntu-latest
|
||||
python-version: "3.13"
|
||||
uv-resolution: highest
|
||||
codspeed: codspeed
|
||||
deprecated-tests: "no-deprecation"
|
||||
- os: ubuntu-latest
|
||||
python-version: "3.13"
|
||||
uv-resolution: highest
|
||||
deprecated-tests: "no-deprecation"
|
||||
without-httpx2: true
|
||||
- os: ubuntu-latest
|
||||
python-version: "3.14"
|
||||
coverage: coverage
|
||||
uv-resolution: highest
|
||||
starlette-src: starlette-git
|
||||
deprecated-tests: "test-deprecation"
|
||||
- os: ubuntu-latest
|
||||
python-version: "3.14t"
|
||||
coverage: coverage
|
||||
uv-resolution: highest
|
||||
deprecated-tests: "no-deprecation"
|
||||
fail-fast: false
|
||||
runs-on: ${{ matrix.os }}
|
||||
env:
|
||||
@@ -88,14 +110,19 @@ jobs:
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
enable-cache: true
|
||||
cache-dependency-glob: |
|
||||
pyproject.toml
|
||||
@@ -108,18 +135,28 @@ jobs:
|
||||
- name: Install Starlette from source
|
||||
if: matrix.starlette-src == 'starlette-git'
|
||||
run: uv pip install "git+https://github.com/Kludex/starlette@main"
|
||||
- name: Install deprecated libraries just for testing
|
||||
if: matrix.deprecated-tests == 'test-deprecation'
|
||||
run: uv pip install orjson ujson
|
||||
- name: Uninstall httpx2 to run tests with httpx
|
||||
if: matrix.without-httpx2 == 'true'
|
||||
run: uv pip uninstall httpx2
|
||||
- name: Reinstall SQLAlchemy without Cython extensions
|
||||
if: matrix.python-version == '3.14t' && matrix.os == 'ubuntu-latest'
|
||||
run: "DISABLE_SQLALCHEMY_CEXT=1 uv pip install --force-reinstall --no-binary :all: sqlalchemy"
|
||||
- run: mkdir coverage
|
||||
- name: Test
|
||||
run: uv run --no-sync bash scripts/test-cov.sh
|
||||
run: uv run --no-sync bash scripts/test-cov.sh $PYTEST_OPTIONS
|
||||
env:
|
||||
COVERAGE_FILE: coverage/.coverage.${{ runner.os }}-py${{ matrix.python-version }}
|
||||
CONTEXT: ${{ runner.os }}-py${{ matrix.python-version }}
|
||||
COVERAGE_FILE: coverage/.coverage.${{ runner.os }}-py${{ matrix.python-version }}-${{ matrix.deprecated-tests}}
|
||||
CONTEXT: ${{ runner.os }}-py${{ matrix.python-version }}-${{ matrix.deprecated-tests}}
|
||||
PYTEST_OPTIONS: ${{ (matrix.without-httpx2 == 'true') && '-W ignore::UserWarning' || '' }}
|
||||
# Do not store coverage for all possible combinations to avoid file size max errors in Smokeshow
|
||||
- name: Store coverage files
|
||||
if: matrix.coverage == 'coverage'
|
||||
uses: actions/upload-artifact@v7
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: coverage-${{ runner.os }}-${{ matrix.python-version }}-${{ hashFiles('**/coverage/.coverage.*') }}
|
||||
name: coverage-${{ runner.os }}-${{ matrix.python-version }}-${{ matrix.deprecated-tests}}-${{ hashFiles('**/coverage/.coverage.*') }}
|
||||
path: coverage
|
||||
include-hidden-files: true
|
||||
|
||||
@@ -128,6 +165,7 @@ jobs:
|
||||
- changes
|
||||
if: needs.changes.outputs.src == 'true' || github.ref == 'refs/heads/master'
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
env:
|
||||
UV_PYTHON: "3.13"
|
||||
UV_RESOLUTION: highest
|
||||
@@ -136,14 +174,19 @@ jobs:
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version: "3.13"
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
enable-cache: true
|
||||
cache-dependency-glob: |
|
||||
pyproject.toml
|
||||
@@ -151,7 +194,7 @@ jobs:
|
||||
- name: Install Dependencies
|
||||
run: uv sync --no-dev --group tests --extra all
|
||||
- name: CodSpeed benchmarks
|
||||
uses: CodSpeedHQ/action@v4
|
||||
uses: CodSpeedHQ/action@3194d9a39c4d46684cb44bf7207fc56626aad8fd # v4.15.1
|
||||
with:
|
||||
mode: simulation
|
||||
run: uv run --no-sync pytest tests/benchmarks --codspeed
|
||||
@@ -160,18 +203,24 @@ jobs:
|
||||
needs:
|
||||
- test
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-python@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version-file: ".python-version"
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
enable-cache: true
|
||||
cache-dependency-glob: |
|
||||
pyproject.toml
|
||||
@@ -179,7 +228,7 @@ jobs:
|
||||
- name: Install Dependencies
|
||||
run: uv sync --locked --no-dev --group tests --extra all
|
||||
- name: Get coverage files
|
||||
uses: actions/download-artifact@v8
|
||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||
with:
|
||||
pattern: coverage-*
|
||||
path: coverage
|
||||
@@ -188,7 +237,7 @@ jobs:
|
||||
- run: uv run coverage combine coverage
|
||||
- run: uv run coverage html --title "Coverage for ${{ github.sha }}"
|
||||
- name: Store coverage HTML
|
||||
uses: actions/upload-artifact@v7
|
||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||
with:
|
||||
name: coverage-html
|
||||
path: htmlcov
|
||||
@@ -202,13 +251,14 @@ jobs:
|
||||
- coverage-combine
|
||||
- benchmark
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
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
|
||||
uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # v1.2.2
|
||||
with:
|
||||
jobs: ${{ toJSON(needs) }}
|
||||
allowed-skips: coverage-combine,test,benchmark
|
||||
|
||||
16
.github/workflows/topic-repos.yml
vendored
16
.github/workflows/topic-repos.yml
vendored
@@ -5,25 +5,33 @@ on:
|
||||
- cron: "0 12 1 * *"
|
||||
workflow_dispatch:
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
topic-repos:
|
||||
if: github.repository_owner == 'fastapi'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: true # Required for `git push` in `topic_repos.py`
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version-file: ".python-version"
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
enable-cache: true
|
||||
cache-dependency-glob: |
|
||||
pyproject.toml
|
||||
@@ -33,4 +41,4 @@ jobs:
|
||||
- name: Update Topic Repos
|
||||
run: uv run ./scripts/topic_repos.py
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.FASTAPI_PR_TOKEN }}
|
||||
GITHUB_TOKEN: ${{ secrets.FASTAPI_PR_TOKEN }} # zizmor: ignore[secrets-outside-env]
|
||||
|
||||
39
.github/workflows/translate.yml
vendored
39
.github/workflows/translate.yml
vendored
@@ -41,6 +41,8 @@ on:
|
||||
required: false
|
||||
default: 10
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
langs:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -48,14 +50,19 @@ jobs:
|
||||
langs: ${{ steps.show-langs.outputs.langs }}
|
||||
commands: ${{ steps.show-langs.outputs.commands }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version-file: ".python-version"
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
cache-dependency-glob: |
|
||||
pyproject.toml
|
||||
uv.lock
|
||||
@@ -74,27 +81,31 @@ jobs:
|
||||
if: github.repository_owner == 'fastapi'
|
||||
needs: langs
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
strategy:
|
||||
matrix:
|
||||
lang: ${{ fromJson(needs.langs.outputs.langs) }}
|
||||
command: ${{ fromJson(needs.langs.outputs.commands) }}
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Dump GitHub context
|
||||
env:
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }}
|
||||
run: echo "$GITHUB_CONTEXT"
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: true # Required for `git push` in `translate.py`
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
|
||||
with:
|
||||
python-version-file: ".python-version"
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
||||
with:
|
||||
# Before upgrading uv version, make sure astral-sh/setup-uv knows its checksum.
|
||||
# See: https://github.com/astral-sh/setup-uv/issues/851#issuecomment-4282017837
|
||||
version: "0.11.4"
|
||||
cache-dependency-glob: |
|
||||
pyproject.toml
|
||||
uv.lock
|
||||
@@ -102,20 +113,20 @@ jobs:
|
||||
run: uv sync --locked --no-dev --group github-actions --group translations
|
||||
# Allow debugging with tmate
|
||||
- name: Setup tmate session
|
||||
uses: mxschmitt/action-tmate@v3
|
||||
uses: mxschmitt/action-tmate@c0afd6f790e3a5564914980036ebf83216678101 # v3.23
|
||||
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }}
|
||||
with:
|
||||
limit-access-to-actor: true
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.FASTAPI_TRANSLATIONS }}
|
||||
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
||||
GITHUB_TOKEN: ${{ secrets.FASTAPI_TRANSLATIONS }} # zizmor: ignore[secrets-outside-env]
|
||||
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} # zizmor: ignore[secrets-outside-env]
|
||||
- name: FastAPI Translate
|
||||
run: |
|
||||
uv run ./scripts/translate.py ${{ matrix.command }}
|
||||
uv run ./scripts/translate.py "$COMMAND"
|
||||
uv run ./scripts/translate.py make-pr
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.FASTAPI_TRANSLATIONS }}
|
||||
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
||||
GITHUB_TOKEN: ${{ secrets.FASTAPI_TRANSLATIONS }} # zizmor: ignore[secrets-outside-env]
|
||||
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} # zizmor: ignore[secrets-outside-env]
|
||||
LANGUAGE: ${{ matrix.lang }}
|
||||
EN_PATH: ${{ github.event.inputs.en_path }}
|
||||
COMMAND: ${{ matrix.command }}
|
||||
|
||||
24
.github/workflows/zizmor.yml
vendored
Normal file
24
.github/workflows/zizmor.yml
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
name: Zizmor
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
workflow_dispatch:
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
zizmor:
|
||||
name: Run zizmor
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
permissions:
|
||||
security-events: write # Required for upload-sarif (used by zizmor-action) to upload SARIF files.
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Run zizmor
|
||||
uses: zizmorcore/zizmor-action@5f14fd08f7cf1cb1609c1e344975f152c7ee938d # v0.5.6
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -7,6 +7,7 @@ __pycache__
|
||||
htmlcov
|
||||
dist
|
||||
site
|
||||
site_zensical_src
|
||||
.coverage*
|
||||
coverage.xml
|
||||
.netlify
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# See https://pre-commit.com/hooks.html for more hooks
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v6.0.0
|
||||
rev: 3e8a8703264a2f4a69428a0aa4dcb512790b2c8c # v6.0.0
|
||||
hooks:
|
||||
- id: check-added-large-files
|
||||
args: ['--maxkb=750']
|
||||
@@ -14,6 +14,12 @@ repos:
|
||||
- id: end-of-file-fixer
|
||||
- id: trailing-whitespace
|
||||
|
||||
- repo: https://github.com/crate-ci/typos
|
||||
rev: bbaefadf97b0ec5fdc942684b647f1a6ab250274 # v1.46.0
|
||||
hooks:
|
||||
- id: typos
|
||||
args: [--force-exclude]
|
||||
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: local-ruff-check
|
||||
@@ -78,3 +84,18 @@ repos:
|
||||
name: fix translations
|
||||
entry: uv run ./scripts/translation_fixer.py fix-pages
|
||||
files: ^docs/(?!en/).*/docs/.*\.md$
|
||||
|
||||
- id: add-release-date
|
||||
language: unsupported
|
||||
name: add date to latest release header
|
||||
entry: uv run python scripts/add_latest_release_date.py
|
||||
files: ^docs/en/docs/release-notes\.md$
|
||||
pass_filenames: false
|
||||
|
||||
- id: zizmor
|
||||
name: zizmor
|
||||
language: python
|
||||
entry: uv run zizmor .
|
||||
files: ^\.github/workflows/|^uv\.lock$
|
||||
require_serial: true
|
||||
pass_filenames: false
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
Please read the [Development - Contributing](https://fastapi.tiangolo.com/contributing/) guidelines in the documentation site.
|
||||
49
README.md
49
README.md
@@ -49,12 +49,11 @@ The key features are:
|
||||
|
||||
<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
|
||||
### Gold 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://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://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge" target="_blank" title="Auth, user management and more for your B2B product"><img src="https://fastapi.tiangolo.com/img/sponsors/propelauth.png"></a>
|
||||
<a href="https://zuplo.link/fastapi-gh" target="_blank" title="Zuplo: Deploy, Secure, Document, and Monetize your FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/zuplo.png"></a>
|
||||
<a href="https://liblab.com?utm_source=fastapi" target="_blank" title="liblab - Generate SDKs from FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/liblab.png"></a>
|
||||
<a href="https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi" target="_blank" title="Deploy & scale any full-stack web app on Render. Focus on building apps, not infra."><img src="https://fastapi.tiangolo.com/img/sponsors/render.svg"></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>
|
||||
@@ -62,13 +61,17 @@ The key features are:
|
||||
<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>
|
||||
|
||||
### Silver Sponsors
|
||||
|
||||
<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://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.stainlessapi.com/?utm_source=fastapi&utm_medium=referral" target="_blank" title="Stainless | Generate best-in-class SDKs"><img src="https://fastapi.tiangolo.com/img/sponsors/stainless.png"></a>
|
||||
<a href="https://www.permit.io/blog/implement-authorization-in-fastapi?utm_source=github&utm_medium=referral&utm_campaign=fastapi" target="_blank" title="Fine-Grained Authorization for FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/permit.png"></a>
|
||||
<a href="https://www.interviewpal.com/?utm_source=fastapi&utm_medium=open-source&utm_campaign=dev-hiring" target="_blank" title="InterviewPal - AI Interview Coach for Engineers and Devs"><img src="https://fastapi.tiangolo.com/img/sponsors/interviewpal.png"></a>
|
||||
<a href="https://dribia.com/en/" target="_blank" title="Dribia - Data Science within your reach"><img src="https://fastapi.tiangolo.com/img/sponsors/dribia.png"></a>
|
||||
<a href="https://talordata.com/?campaignid=oh5dVZ3Zc3YGiAI2&utm_source=fastapi&utm_term=fastapi" target="_blank" title="TalorData SERP API - Multi-Engine Search Results Data"><img src="https://fastapi.tiangolo.com/img/sponsors/talordata.png"></a>
|
||||
<a href="https://www.rapidproxy.io/?ref=fastapi" target="_blank" title="Try RapidProxy for free - Residential Proxies with 90M+ Global IPs. Starting from $0.65/GB for web scraping, automation, and data collection."><img src="https://fastapi.tiangolo.com/img/sponsors/rapidproxy.png"></a>
|
||||
|
||||
<!-- /sponsors -->
|
||||
|
||||
@@ -76,6 +79,10 @@ The key features are:
|
||||
|
||||
## Opinions
|
||||
|
||||
|
||||
|
||||
<div class="only-github" markdown="1">
|
||||
|
||||
"_[...] I'm using **FastAPI** a ton these days. [...] I'm actually planning to use it for all of my team's **ML services at Microsoft**. Some of them are getting integrated into the core **Windows** product and some **Office** products._"
|
||||
|
||||
<div style="text-align: right; margin-right: 10%;">Kabir Khan - <strong>Microsoft</strong> <a href="https://github.com/fastapi/fastapi/pull/26"><small>(ref)</small></a></div>
|
||||
@@ -94,37 +101,25 @@ The key features are:
|
||||
|
||||
---
|
||||
|
||||
"_I’m over the moon excited about **FastAPI**. It’s so fun!_"
|
||||
|
||||
<div style="text-align: right; margin-right: 10%;">Brian Okken - <strong>[Python Bytes](https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855) podcast host</strong> <a href="https://x.com/brianokken/status/1112220079972728832"><small>(ref)</small></a></div>
|
||||
|
||||
---
|
||||
|
||||
"_Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted **Hug** to be - it's really inspiring to see someone build that._"
|
||||
|
||||
<div style="text-align: right; margin-right: 10%;">Timothy Crosley - <strong>[Hug](https://github.com/hugapi/hug) creator</strong> <a href="https://news.ycombinator.com/item?id=19455465"><small>(ref)</small></a></div>
|
||||
|
||||
---
|
||||
|
||||
"_If you're looking to learn one **modern framework** for building REST APIs, check out **FastAPI** [...] It's fast, easy to use and easy to learn [...]_"
|
||||
|
||||
"_We've switched over to **FastAPI** for our **APIs** [...] I think you'll like it [...]_"
|
||||
|
||||
<div style="text-align: right; margin-right: 10%;">Ines Montani - Matthew Honnibal - <strong>[Explosion AI](https://explosion.ai) founders - [spaCy](https://spacy.io) creators</strong> <a href="https://x.com/_inesmontani/status/1144173225322143744"><small>(ref)</small></a> - <a href="https://x.com/honnibal/status/1144031421859655680"><small>(ref)</small></a></div>
|
||||
|
||||
---
|
||||
|
||||
"_If anyone is looking to build a production Python API, I would highly recommend **FastAPI**. It is **beautifully designed**, **simple to use** and **highly scalable**, it has become a **key component** in our API first development strategy and is driving many automations and services such as our Virtual TAC Engineer._"
|
||||
|
||||
<div style="text-align: right; margin-right: 10%;">Deon Pillsbury - <strong>Cisco</strong> <a href="https://www.linkedin.com/posts/deonpillsbury_cisco-cx-python-activity-6963242628536487936-trAp/"><small>(ref)</small></a></div>
|
||||
|
||||
---
|
||||
|
||||
</div>
|
||||
|
||||
## FastAPI Conf
|
||||
|
||||
[**FastAPI Conf '26**](https://fastapiconf.com) is happening on **October 28, 2026** in **Amsterdam, NL**. All about FastAPI, right from the source. 🎤
|
||||
|
||||
<a class="fastapi-feature-banner" href="https://fastapiconf.com"><img src="https://fastapi.tiangolo.com/img/fastapi-conf.jpeg" alt="FastAPI Conf '26 - October 28, 2026 - Amsterdam, NL"></a>
|
||||
|
||||
## FastAPI mini documentary
|
||||
|
||||
There's a [FastAPI mini documentary](https://www.youtube.com/watch?v=mpR8ngthqiE) released at the end of 2025, you can watch it online:
|
||||
|
||||
<a href="https://www.youtube.com/watch?v=mpR8ngthqiE"><img src="https://fastapi.tiangolo.com/img/fastapi-documentary.jpg" alt="FastAPI Mini Documentary"></a>
|
||||
<a class="fastapi-feature-banner" href="https://www.youtube.com/watch?v=mpR8ngthqiE"><img src="https://fastapi.tiangolo.com/img/fastapi-documentary.jpg" alt="FastAPI Mini Documentary"></a>
|
||||
|
||||
## **Typer**, the FastAPI of CLIs
|
||||
|
||||
@@ -440,13 +435,13 @@ For a more complete example including more features, see the <a href="https://fa
|
||||
|
||||
**Spoiler alert**: the tutorial - user guide includes:
|
||||
|
||||
* Declaration of **parameters** from other different places as: **headers**, **cookies**, **form fields** and **files**.
|
||||
* How to set **validation constraints** as `maximum_length` or `regex`.
|
||||
* Declaration of **parameters** from other different places such as: **headers**, **cookies**, **form fields** and **files**.
|
||||
* How to set **validation constraints** such as `maximum_length` or `regex`.
|
||||
* A very powerful and easy to use **<dfn title="also known as components, resources, providers, services, injectables">Dependency Injection</dfn>** system.
|
||||
* Security and authentication, including support for **OAuth2** with **JWT tokens** and **HTTP Basic** auth.
|
||||
* More advanced (but equally easy) techniques for declaring **deeply nested JSON models** (thanks to Pydantic).
|
||||
* **GraphQL** integration with [Strawberry](https://strawberry.rocks) and other libraries.
|
||||
* Many extra features (thanks to Starlette) as:
|
||||
* Many extra features (thanks to Starlette) such as:
|
||||
* **WebSockets**
|
||||
* extremely easy tests based on HTTPX and `pytest`
|
||||
* **CORS**
|
||||
|
||||
31
SECURITY.md
31
SECURITY.md
@@ -1,31 +0,0 @@
|
||||
# Security Policy
|
||||
|
||||
Security is very important for FastAPI and its community. 🔒
|
||||
|
||||
Learn more about it below. 👇
|
||||
|
||||
## Versions
|
||||
|
||||
The latest version of FastAPI is supported.
|
||||
|
||||
You are encouraged to [write tests](https://fastapi.tiangolo.com/tutorial/testing/) for your application and update your FastAPI version frequently after ensuring that your tests are passing. This way you will benefit from the latest features, bug fixes, and **security fixes**.
|
||||
|
||||
You can learn more about [FastAPI versions and how to pin and upgrade them](https://fastapi.tiangolo.com/deployment/versions/) for your project in the docs.
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
If you think you found a vulnerability, and even if you are not sure about it, please report it right away by sending an email to: security@tiangolo.com. Please try to be as explicit as possible, describing all the steps and example code to reproduce the security issue.
|
||||
|
||||
I (the author, [@tiangolo](https://x.com/tiangolo)) will review it thoroughly and get back to you.
|
||||
|
||||
## Public Discussions
|
||||
|
||||
Please restrain from publicly discussing a potential security vulnerability. 🙊
|
||||
|
||||
It's better to discuss privately and try to find a solution first, to limit the potential impact as much as possible.
|
||||
|
||||
---
|
||||
|
||||
Thanks for your help!
|
||||
|
||||
The FastAPI community and I thank you for that. 🙇
|
||||
@@ -1,6 +1,6 @@
|
||||
# LLM-Testdatei { #llm-test-file }
|
||||
|
||||
Dieses Dokument testet, ob das <abbr title="Large Language Model – Großes Sprachmodell">LLM</abbr>, das die Dokumentation übersetzt, den <abbr title="General Prompt – Allgemeiner Prompt">`general_prompt`</abbr> in `scripts/translate.py` und den sprachspezifischen Prompt in `docs/{language code}/llm-prompt.md` versteht. Der sprachsspezifische Prompt wird an `general_prompt` angehängt.
|
||||
Dieses Dokument testet, ob das <abbr title="Large Language Model - Großes Sprachmodell">LLM</abbr>, das die Dokumentation übersetzt, den <abbr title="General Prompt - Allgemeiner Prompt">`general_prompt`</abbr> in `scripts/translate.py` und den sprachspezifischen Prompt in `docs/{language code}/llm-prompt.md` versteht. Der sprachsspezifische Prompt wird an `general_prompt` angehängt.
|
||||
|
||||
Hier hinzugefügte Tests werden von allen Erstellern sprachsspezifischer Prompts gesehen.
|
||||
|
||||
@@ -95,7 +95,7 @@ $ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid
|
||||
... und noch ein Konsolen-Codebeispiel ...
|
||||
|
||||
```console
|
||||
// Create a directory "Code"
|
||||
// Ein Verzeichnis "Code" erstellen
|
||||
$ mkdir code
|
||||
// In dieses Verzeichnis wechseln
|
||||
$ cd code
|
||||
@@ -124,10 +124,6 @@ Siehe Abschnitt `### Content of code blocks` im allgemeinen Prompt in `scripts/t
|
||||
|
||||
//// tab | Test
|
||||
|
||||
/// info | Info
|
||||
Etwas Text
|
||||
///
|
||||
|
||||
/// note | Hinweis
|
||||
Etwas Text
|
||||
///
|
||||
@@ -136,10 +132,6 @@ Etwas Text
|
||||
Etwas Text
|
||||
///
|
||||
|
||||
/// check | Testen
|
||||
Etwas Text
|
||||
///
|
||||
|
||||
/// tip | Tipp
|
||||
Etwas Text
|
||||
///
|
||||
@@ -197,15 +189,15 @@ Hier einige Dinge, die in HTML-„abbr“-Elemente gepackt sind (einige sind erf
|
||||
|
||||
### Das abbr gibt eine vollständige Phrase { #the-abbr-gives-a-full-phrase }
|
||||
|
||||
* <abbr title="Getting Things Done – Dinge erledigt bekommen">GTD</abbr>
|
||||
* <abbr title="less than – kleiner als"><code>lt</code></abbr>
|
||||
* <abbr title="Getting Things Done - Dinge erledigt bekommen">GTD</abbr>
|
||||
* <abbr title="less than - kleiner als"><code>lt</code></abbr>
|
||||
* <abbr title="XML Web Token">XWT</abbr>
|
||||
* <abbr title="Paralleles Server-Gateway-Interface">PSGI</abbr>
|
||||
|
||||
### Das abbr gibt eine vollständige Phrase und eine Erklärung { #the-abbr-gives-a-full-phrase-and-an-explanation }
|
||||
|
||||
* <abbr title="Mozilla Developer Network – Mozilla-Entwicklernetzwerk: Dokumentation für Entwickler, geschrieben von den Firefox-Leuten">MDN</abbr>
|
||||
* <abbr title="Input/Output – Eingabe/Ausgabe: Lesen oder Schreiben auf der Festplatte, Netzwerkkommunikation.">I/O</abbr>.
|
||||
* <abbr title="Mozilla Developer Network - Mozilla-Entwicklernetzwerk: Dokumentation für Entwickler, geschrieben von den Firefox-Leuten">MDN</abbr>
|
||||
* <abbr title="Input/Output - Eingabe/Ausgabe: Lesen oder Schreiben auf der Festplatte, Netzwerkkommunikation.">I/O</abbr>.
|
||||
|
||||
////
|
||||
|
||||
|
||||
@@ -30,7 +30,6 @@ Ihr Sponsoring zeigt auch ein starkes Engagement für die FastAPI-**Community**
|
||||
|
||||
Zum Beispiel könnten Sie ausprobieren:
|
||||
|
||||
* [Speakeasy](https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship)
|
||||
* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
|
||||
* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi)
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ Das Django REST Framework wurde von Tom Christie erstellt. Derselbe Schöpfer vo
|
||||
|
||||
///
|
||||
|
||||
/// check | Inspirierte **FastAPI**
|
||||
/// tip | Inspirierte **FastAPI** dazu
|
||||
|
||||
Eine automatische API-Dokumentationsoberfläche zu haben.
|
||||
|
||||
@@ -56,7 +56,7 @@ Diese Entkopplung der Teile und die Tatsache, dass es sich um ein „Mikroframew
|
||||
|
||||
Angesichts der Einfachheit von Flask schien es eine gute Ergänzung zum Erstellen von APIs zu sein. Als Nächstes musste ein „Django REST Framework“ für Flask gefunden werden.
|
||||
|
||||
/// check | Inspirierte **FastAPI**
|
||||
/// tip | Inspirierte **FastAPI** dazu
|
||||
|
||||
Ein Mikroframework zu sein. Es einfach zu machen, die benötigten Tools und Teile zu kombinieren.
|
||||
|
||||
@@ -98,7 +98,7 @@ def read_url():
|
||||
|
||||
Sehen Sie sich die Ähnlichkeiten in `requests.get(...)` und `@app.get(...)` an.
|
||||
|
||||
/// check | Inspirierte **FastAPI**
|
||||
/// tip | Inspirierte **FastAPI** dazu
|
||||
|
||||
* Über eine einfache und intuitive API zu verfügen.
|
||||
* HTTP-Methodennamen (Operationen) direkt, auf einfache und intuitive Weise zu verwenden.
|
||||
@@ -118,7 +118,7 @@ Irgendwann wurde Swagger an die Linux Foundation übergeben und in OpenAPI umben
|
||||
|
||||
Aus diesem Grund spricht man bei Version 2.0 häufig von „Swagger“ und ab Version 3 von „OpenAPI“.
|
||||
|
||||
/// check | Inspirierte **FastAPI**
|
||||
/// tip | Inspirierte **FastAPI** dazu
|
||||
|
||||
Einen offenen Standard für API-Spezifikationen zu übernehmen und zu verwenden, anstelle eines benutzerdefinierten Schemas.
|
||||
|
||||
@@ -147,7 +147,7 @@ Für diese Funktionen wurde Marshmallow entwickelt. Es ist eine großartige Bibl
|
||||
|
||||
Aber sie wurde erstellt, bevor Typhinweise in Python existierten. Um also ein <dfn title="die Definition, wie Daten geformt sein sollen">Schema</dfn> zu definieren, müssen Sie bestimmte Werkzeuge und Klassen verwenden, die von Marshmallow bereitgestellt werden.
|
||||
|
||||
/// check | Inspirierte **FastAPI**
|
||||
/// tip | Inspirierte **FastAPI** dazu
|
||||
|
||||
Code zu verwenden, um „Schemas“ zu definieren, welche Datentypen und Validierung automatisch bereitstellen.
|
||||
|
||||
@@ -163,13 +163,13 @@ Es verwendet unter der Haube Marshmallow, um die Datenvalidierung durchzuführen
|
||||
|
||||
Es ist ein großartiges Tool und ich habe es auch oft verwendet, bevor ich **FastAPI** hatte.
|
||||
|
||||
/// info | Info
|
||||
/// note | Hinweis
|
||||
|
||||
Webargs wurde von denselben Marshmallow-Entwicklern erstellt.
|
||||
|
||||
///
|
||||
|
||||
/// check | Inspirierte **FastAPI**
|
||||
/// tip | Inspirierte **FastAPI** dazu
|
||||
|
||||
Eingehende Requestdaten automatisch zu validieren.
|
||||
|
||||
@@ -193,13 +193,13 @@ Aber dann haben wir wieder das Problem einer Mikrosyntax innerhalb eines Python-
|
||||
|
||||
Der Texteditor kann dabei nicht viel helfen. Und wenn wir Parameter oder Marshmallow-Schemas ändern und vergessen, auch den YAML-Docstring zu ändern, wäre das generierte Schema veraltet.
|
||||
|
||||
/// info | Info
|
||||
/// note | Hinweis
|
||||
|
||||
APISpec wurde von denselben Marshmallow-Entwicklern erstellt.
|
||||
|
||||
///
|
||||
|
||||
/// check | Inspirierte **FastAPI**
|
||||
/// tip | Inspirierte **FastAPI** dazu
|
||||
|
||||
Den offenen Standard für APIs, OpenAPI, zu unterstützen.
|
||||
|
||||
@@ -225,13 +225,13 @@ Die Verwendung führte zur Entwicklung mehrerer Flask-Full-Stack-Generatoren. Di
|
||||
|
||||
Und dieselben Full-Stack-Generatoren bildeten die Basis der [**FastAPI**-Projektgeneratoren](project-generation.md).
|
||||
|
||||
/// info | Info
|
||||
/// note | Hinweis
|
||||
|
||||
Flask-apispec wurde von denselben Marshmallow-Entwicklern erstellt.
|
||||
|
||||
///
|
||||
|
||||
/// check | Inspirierte **FastAPI**
|
||||
/// tip | Inspirierte **FastAPI** dazu
|
||||
|
||||
Das OpenAPI-Schema automatisch zu generieren, aus demselben Code, welcher die Serialisierung und Validierung definiert.
|
||||
|
||||
@@ -251,7 +251,7 @@ Da TypeScript-Daten jedoch nach der Kompilierung nach JavaScript nicht erhalten
|
||||
|
||||
Es kann nicht sehr gut mit verschachtelten Modellen umgehen. Wenn es sich beim JSON-Body im Request also um ein JSON-Objekt mit inneren Feldern handelt, die wiederum verschachtelte JSON-Objekte sind, kann er nicht richtig dokumentiert und validiert werden.
|
||||
|
||||
/// check | Inspirierte **FastAPI**
|
||||
/// tip | Inspirierte **FastAPI** dazu
|
||||
|
||||
Python-Typen zu verwenden, um eine hervorragende Editorunterstützung zu erhalten.
|
||||
|
||||
@@ -271,7 +271,7 @@ Hat eindeutig Uvicorn und Starlette inspiriert, welche derzeit in offenen Benchm
|
||||
|
||||
///
|
||||
|
||||
/// check | Inspirierte **FastAPI**
|
||||
/// tip | Inspirierte **FastAPI** dazu
|
||||
|
||||
Einen Weg zu finden, eine hervorragende Performanz zu haben.
|
||||
|
||||
@@ -287,7 +287,7 @@ Es ist so konzipiert, dass es über Funktionen verfügt, welche zwei Parameter e
|
||||
|
||||
Daher müssen Datenvalidierung, Serialisierung und Dokumentation im Code und nicht automatisch erfolgen. Oder sie müssen als Framework oberhalb von Falcon implementiert werden, so wie Hug. Dieselbe Unterscheidung findet auch in anderen Frameworks statt, die vom Design von Falcon inspiriert sind und ein Requestobjekt und ein Responseobjekt als Parameter haben.
|
||||
|
||||
/// check | Inspirierte **FastAPI**
|
||||
/// tip | Inspirierte **FastAPI** dazu
|
||||
|
||||
Wege zu finden, eine großartige Performanz zu erzielen.
|
||||
|
||||
@@ -313,7 +313,7 @@ Das Dependency Injection System erfordert eine Vorab-Registrierung der Abhängig
|
||||
|
||||
Routen werden an einer einzigen Stelle deklariert, indem Funktionen verwendet werden, die an anderen Stellen deklariert wurden (anstatt Dekoratoren zu verwenden, welche direkt über der Funktion platziert werden können, welche den Endpunkt verarbeitet). Dies ähnelt eher der Vorgehensweise von Django als der Vorgehensweise von Flask (und Starlette). Es trennt im Code Dinge, die relativ eng miteinander gekoppelt sind.
|
||||
|
||||
/// check | Inspirierte **FastAPI**
|
||||
/// tip | Inspirierte **FastAPI** dazu
|
||||
|
||||
Zusätzliche Validierungen für Datentypen zu definieren, mithilfe des „Default“-Werts von Modellattributen. Dies verbessert die Editorunterstützung und war zuvor in Pydantic nicht verfügbar.
|
||||
|
||||
@@ -335,13 +335,13 @@ Es verfügt über eine interessante, ungewöhnliche Funktion: Mit demselben Fram
|
||||
|
||||
Da es auf dem bisherigen Standard für synchrone Python-Webframeworks (WSGI) basiert, kann es nicht mit Websockets und anderen Dingen umgehen, verfügt aber dennoch über eine hohe Performanz.
|
||||
|
||||
/// info | Info
|
||||
/// note | Hinweis
|
||||
|
||||
Hug wurde von Timothy Crosley erstellt, demselben Schöpfer von [`isort`](https://github.com/timothycrosley/isort), einem großartigen Tool zum automatischen Sortieren von Importen in Python-Dateien.
|
||||
|
||||
///
|
||||
|
||||
/// check | Ideen, die **FastAPI** inspiriert haben
|
||||
/// tip | Ideen, die **FastAPI** inspiriert haben
|
||||
|
||||
Hug inspirierte Teile von APIStar und war eines der Tools, die ich am vielversprechendsten fand, neben APIStar.
|
||||
|
||||
@@ -375,7 +375,7 @@ Es handelte sich nicht länger um ein API-Webframework, da sich der Entwickler a
|
||||
|
||||
Jetzt handelt es sich bei APIStar um eine Reihe von Tools zur Validierung von OpenAPI-Spezifikationen, nicht um ein Webframework.
|
||||
|
||||
/// info | Info
|
||||
/// note | Hinweis
|
||||
|
||||
APIStar wurde von Tom Christie erstellt. Derselbe, welcher Folgendes erstellt hat:
|
||||
|
||||
@@ -385,7 +385,7 @@ APIStar wurde von Tom Christie erstellt. Derselbe, welcher Folgendes erstellt ha
|
||||
|
||||
///
|
||||
|
||||
/// check | Inspirierte **FastAPI**
|
||||
/// tip | Inspirierte **FastAPI** dazu
|
||||
|
||||
Zu existieren.
|
||||
|
||||
@@ -409,7 +409,7 @@ Das macht es äußerst intuitiv.
|
||||
|
||||
Es ist vergleichbar mit Marshmallow. Obwohl es in Benchmarks schneller als Marshmallow ist. Und da es auf den gleichen Python-Typhinweisen basiert, ist die Editorunterstützung großartig.
|
||||
|
||||
/// check | **FastAPI** verwendet es, um
|
||||
/// tip | **FastAPI** verwendet es, um
|
||||
|
||||
Die gesamte Datenvalidierung, Datenserialisierung und automatische Modelldokumentation (basierend auf JSON Schema) zu erledigen.
|
||||
|
||||
@@ -452,7 +452,7 @@ Dennoch wird es bereits von mehreren Tools als „Standard“ verwendet. Das ver
|
||||
|
||||
///
|
||||
|
||||
/// check | **FastAPI** verwendet es, um
|
||||
/// tip | **FastAPI** verwendet es, um
|
||||
|
||||
Alle Kern-Webaspekte zu handhaben. Und fügt Funktionen obenauf.
|
||||
|
||||
@@ -470,7 +470,7 @@ Es handelt sich nicht um ein Webframework, sondern um einen Server. Beispielswei
|
||||
|
||||
Es ist der empfohlene Server für Starlette und **FastAPI**.
|
||||
|
||||
/// check | **FastAPI** empfiehlt es als
|
||||
/// tip | **FastAPI** empfiehlt es als
|
||||
|
||||
Hauptwebserver zum Ausführen von **FastAPI**-Anwendungen.
|
||||
|
||||
|
||||
@@ -139,7 +139,7 @@ Sie und Ihr Schwarm essen die Burger und haben eine schöne Zeit. ✨
|
||||
|
||||
<img src="/img/async/concurrent-burgers/concurrent-burgers-07.png" class="illustration">
|
||||
|
||||
/// info | Info
|
||||
/// note | Hinweis
|
||||
|
||||
Die wunderschönen Illustrationen stammen von [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨
|
||||
|
||||
@@ -205,7 +205,7 @@ Sie essen sie und sind fertig. ⏹
|
||||
|
||||
Es wurde nicht viel geredet oder geflirtet, da die meiste Zeit mit Warten 🕙 vor der Theke verbracht wurde. 😞
|
||||
|
||||
/// info | Info
|
||||
/// note | Hinweis
|
||||
|
||||
Die wunderschönen Illustrationen stammen von [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@ was gleichbedeutend wäre mit:
|
||||
from backend.main import app
|
||||
```
|
||||
|
||||
### `fastapi dev` mit Pfad { #fastapi-dev-with-path }
|
||||
### `fastapi dev` mit Pfad oder mit der CLI-Option `--entrypoint` { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
|
||||
|
||||
Sie können auch den Dateipfad an den Befehl `fastapi dev` übergeben, dann wird das zu verwendende FastAPI-App-Objekt erraten:
|
||||
|
||||
@@ -103,7 +103,13 @@ Sie können auch den Dateipfad an den Befehl `fastapi dev` übergeben, dann wird
|
||||
$ fastapi dev main.py
|
||||
```
|
||||
|
||||
Aber Sie müssten sich merken, bei jedem Aufruf des `fastapi`-Befehls den korrekten Pfad zu übergeben.
|
||||
Oder Sie können auch die Option `--entrypoint` an den Befehl `fastapi dev` übergeben:
|
||||
|
||||
```console
|
||||
$ fastapi dev --entrypoint main:app
|
||||
```
|
||||
|
||||
Aber Sie müssten sich merken, bei jedem Aufruf des `fastapi`-Befehls den korrekten Pfad\entrypoint zu übergeben.
|
||||
|
||||
Zusätzlich könnten andere Tools sie nicht finden, z. B. die [VS Code Extension](editor-support.md) oder [FastAPI Cloud](https://fastapicloud.com), daher wird empfohlen, den `entrypoint` in `pyproject.toml` zu verwenden.
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ second_user_data = {
|
||||
my_second_user: User = User(**second_user_data)
|
||||
```
|
||||
|
||||
/// info | Info
|
||||
/// note | Hinweis
|
||||
|
||||
`**second_user_data` bedeutet:
|
||||
|
||||
|
||||
@@ -1,18 +1,12 @@
|
||||
# FastAPI helfen – Hilfe erhalten { #help-fastapi-get-help }
|
||||
# Helfen { #help }
|
||||
|
||||
Mögen Sie **FastAPI**?
|
||||
Möchten Sie FastAPI helfen oder Hilfe zu FastAPI erhalten?
|
||||
|
||||
Möchten Sie FastAPI, anderen Benutzern und dem Autor helfen?
|
||||
|
||||
Oder möchten Sie Hilfe zu **FastAPI** erhalten?
|
||||
|
||||
Es gibt sehr einfache Möglichkeiten zu helfen (einige erfordern nur ein oder zwei Klicks).
|
||||
|
||||
Und es gibt auch mehrere Möglichkeiten, Hilfe zu bekommen.
|
||||
Es gibt sehr einfache Möglichkeiten, zu helfen und Hilfe zu bekommen.
|
||||
|
||||
## Newsletter abonnieren { #subscribe-to-the-newsletter }
|
||||
|
||||
Sie können den (unregelmäßigen) [**FastAPI and friends**-Newsletter](newsletter.md) abonnieren, um über folgende Themen informiert zu bleiben:
|
||||
Sie können den (unregelmäßigen) [**FastAPI and friends**-Newsletter](newsletter.md) abonnieren, um über Folgendes informiert zu bleiben:
|
||||
|
||||
* Neuigkeiten über FastAPI und Freunde 🚀
|
||||
* Anleitungen 📝
|
||||
@@ -20,9 +14,13 @@ Sie können den (unregelmäßigen) [**FastAPI and friends**-Newsletter](newslett
|
||||
* Breaking Changes 🚨
|
||||
* Tipps und Tricks ✅
|
||||
|
||||
## FastAPI auf X (Twitter) folgen { #follow-fastapi-on-x-twitter }
|
||||
## FastAPI online folgen { #follow-fastapi-online }
|
||||
|
||||
[Folgen Sie @fastapi auf **X (Twitter)**](https://x.com/fastapi), um die neuesten Nachrichten über **FastAPI** zu erhalten. 🐦
|
||||
Sie können **FastAPI** an mehreren Orten online folgen:
|
||||
|
||||
* [@fastapi auf **X / Twitter**](https://x.com/fastapi)
|
||||
* [@fastapi.tiangolo.com auf **Bluesky**](https://bsky.app/profile/fastapi.tiangolo.com)
|
||||
* [FastAPI auf **LinkedIn**](https://www.linkedin.com/company/fastapi/)
|
||||
|
||||
## **FastAPI** auf GitHub einen Stern geben { #star-fastapi-in-github }
|
||||
|
||||
@@ -30,200 +28,43 @@ Sie können FastAPI auf GitHub „starren“ (klicken Sie auf den Stern-Button o
|
||||
|
||||
Durch das Hinzufügen eines Sterns können andere Benutzer es leichter finden und sehen, dass es für andere bereits nützlich war.
|
||||
|
||||
## Das GitHub-Repository auf Releases überwachen { #watch-the-github-repository-for-releases }
|
||||
## Das GitHub-Repository auf Releases beobachten { #watch-the-github-repository-for-releases }
|
||||
|
||||
Sie können FastAPI auf GitHub „beobachten“ (klicken Sie auf den „watch“-Button oben rechts): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀
|
||||
Sie können FastAPI auf GitHub „beobachten“ (klicken Sie auf den „Watch“-Button oben rechts): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀
|
||||
|
||||
Dort können Sie „Releases only“ auswählen.
|
||||
|
||||
Auf diese Weise erhalten Sie Benachrichtigungen (per E-Mail), wenn es ein neues Release (eine neue Version) von **FastAPI** mit Bugfixes und neuen Funktionen gibt.
|
||||
Auf diese Weise erhalten Sie Benachrichtigungen (per E‑Mail), wenn es ein neues Release (eine neue Version) von **FastAPI** mit Bugfixes und neuen Funktionen gibt.
|
||||
|
||||
## Mit dem Autor vernetzen { #connect-with-the-author }
|
||||
## Dem Autor folgen { #follow-the-author }
|
||||
|
||||
Sie können sich mit [mir (Sebastián Ramírez / `tiangolo`)](https://tiangolo.com), dem Autor, vernetzen.
|
||||
Sie können [mir (Sebastián Ramírez / `tiangolo`)](https://tiangolo.com), dem Autor, an einigen Orten folgen, um mitzubekommen, wenn ich Neuigkeiten zu FastAPI und Freunden habe:
|
||||
|
||||
Sie können:
|
||||
|
||||
* [Mir auf **GitHub** folgen](https://github.com/tiangolo).
|
||||
* Andere Open-Source-Projekte sehen, die ich erstellt habe und die Ihnen helfen könnten.
|
||||
* Mir folgen, um zu sehen, wenn ich ein neues Open-Source-Projekt erstelle.
|
||||
* [Mir auf **X (Twitter)** folgen](https://x.com/tiangolo) oder [Mastodon](https://fosstodon.org/@tiangolo).
|
||||
* Mir mitteilen, wie Sie FastAPI verwenden (ich höre das gerne).
|
||||
* Mitbekommen, wenn ich Ankündigungen mache oder neue Tools veröffentliche.
|
||||
* Sie können auch [@fastapi auf X (Twitter) folgen](https://x.com/fastapi) (ein separates Konto).
|
||||
* [Mir auf **LinkedIn** folgen](https://www.linkedin.com/in/tiangolo/).
|
||||
* Mitbekommen, wenn ich Ankündigungen mache oder neue Tools veröffentliche (obwohl ich X (Twitter) häufiger verwende 🤷♂).
|
||||
* Lesen, was ich schreibe (oder mir folgen) auf [**Dev.to**](https://dev.to/tiangolo) oder [**Medium**](https://medium.com/@tiangolo).
|
||||
* Andere Ideen, Artikel lesen und mehr über die von mir erstellten Tools erfahren.
|
||||
* Mir folgen, um zu lesen, wenn ich etwas Neues veröffentliche.
|
||||
|
||||
## Über **FastAPI** tweeten { #tweet-about-fastapi }
|
||||
|
||||
[Tweeten Sie über **FastAPI**](https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi) und teilen Sie mir und anderen mit, warum es Ihnen gefällt. 🎉
|
||||
|
||||
Ich höre gerne, wie **FastAPI** verwendet wird, was Ihnen daran gefallen hat, in welchem Projekt/Unternehmen Sie es verwenden, usw.
|
||||
|
||||
## Für FastAPI abstimmen { #vote-for-fastapi }
|
||||
|
||||
* [Stimmen Sie für **FastAPI** auf Slant](https://www.slant.co/options/34241/~fastapi-review).
|
||||
* [Stimmen Sie für **FastAPI** auf AlternativeTo](https://alternativeto.net/software/fastapi/about/).
|
||||
* [Sagen Sie auf StackShare, dass Sie **FastAPI** verwenden](https://stackshare.io/pypi-fastapi).
|
||||
* [@tiangolo auf **GitHub**](https://github.com/tiangolo).
|
||||
* [@tiangolo auf **X (Twitter)**](https://x.com/tiangolo)
|
||||
* [@tiangolo.com auf **Bluesky**](https://bsky.app/profile/tiangolo.com)
|
||||
* [@tiangolo auf **LinkedIn**](https://www.linkedin.com/in/tiangolo/).
|
||||
|
||||
## Anderen bei Fragen auf GitHub helfen { #help-others-with-questions-in-github }
|
||||
|
||||
Sie können versuchen, anderen bei ihren Fragen zu helfen:
|
||||
|
||||
* [GitHub-Diskussionen](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered)
|
||||
* [GitHub-Issues](https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+)
|
||||
Sie können versuchen, anderen bei ihren Fragen in [GitHub-Diskussionen](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered) zu helfen.
|
||||
|
||||
In vielen Fällen kennen Sie möglicherweise bereits die Antwort auf diese Fragen. 🤓
|
||||
|
||||
Wenn Sie vielen Menschen bei ihren Fragen helfen, werden Sie offizieller [FastAPI-Experte](fastapi-people.md#fastapi-experts). 🎉
|
||||
|
||||
Denken Sie daran, der wichtigste Punkt ist: Versuchen Sie, freundlich zu sein. Die Leute bringen ihre Frustrationen mit und fragen in vielen Fällen nicht auf die beste Art und Weise, aber versuchen Sie dennoch so gut wie möglich, freundlich zu sein. 🤗
|
||||
Denken Sie daran, der wichtigste Punkt ist: Versuchen Sie, freundlich zu sein. 🤗
|
||||
|
||||
Die **FastAPI**-Community soll freundlich und einladend sein. Akzeptieren Sie gleichzeitig kein Mobbing oder respektloses Verhalten gegenüber anderen. Wir müssen uns umeinander kümmern.
|
||||
### So helfen { #how-to-help }
|
||||
|
||||
---
|
||||
|
||||
So helfen Sie anderen bei Fragen (in Diskussionen oder Issues):
|
||||
|
||||
### Die Frage verstehen { #understand-the-question }
|
||||
|
||||
* Prüfen Sie, ob Sie verstehen können, was der **Zweck** und der Anwendungsfall der fragenden Person ist.
|
||||
|
||||
* Überprüfen Sie dann, ob die Frage (die überwiegende Mehrheit sind Fragen) **klar** ist.
|
||||
|
||||
* In vielen Fällen handelt es sich bei der gestellten Frage um eine Lösung, die der Benutzer sich vorstellt, aber es könnte eine **bessere** Lösung geben. Wenn Sie das Problem und den Anwendungsfall besser verstehen, können Sie eine bessere **Alternativlösung** vorschlagen.
|
||||
|
||||
* Wenn Sie die Frage nicht verstehen können, fragen Sie nach weiteren **Details**.
|
||||
|
||||
### Das Problem reproduzieren { #reproduce-the-problem }
|
||||
|
||||
In den meisten Fällen und bei den meisten Fragen gibt es etwas in Bezug auf den **originalen Code** der Person.
|
||||
|
||||
In vielen Fällen wird nur ein Fragment des Codes gepostet, aber das reicht nicht aus, um **das Problem zu reproduzieren**.
|
||||
|
||||
* Sie können die Person bitten, ein [minimales, reproduzierbares Beispiel](https://stackoverflow.com/help/minimal-reproducible-example) bereitzustellen, welches Sie **kopieren, einfügen** und lokal ausführen können, um den gleichen Fehler oder das gleiche Verhalten zu sehen, das die Person sieht, oder um ihren Anwendungsfall besser zu verstehen.
|
||||
|
||||
* Wenn Sie in Geberlaune sind, können Sie ein solches Beispiel selbst erstellen, nur basierend auf der Beschreibung des Problems. Denken Sie jedoch daran, dass dies viel Zeit in Anspruch nehmen kann und dass es besser sein kann, zunächst um eine Klärung des Problems zu bitten.
|
||||
|
||||
### Lösungen vorschlagen { #suggest-solutions }
|
||||
|
||||
* Nachdem Sie die Frage verstanden haben, können Sie eine mögliche **Antwort** geben.
|
||||
|
||||
* In vielen Fällen ist es besser, das **zugrunde liegende Problem oder den Anwendungsfall** zu verstehen, da es möglicherweise einen besseren Weg zur Lösung gibt als das, was die Person versucht.
|
||||
|
||||
### Um Schließung bitten { #ask-to-close }
|
||||
|
||||
Wenn die Person antwortet, besteht eine hohe Chance, dass Sie ihr Problem gelöst haben. Herzlichen Glückwunsch, **Sie sind ein Held**! 🦸
|
||||
|
||||
* Wenn es tatsächlich das Problem gelöst hat, können Sie sie darum bitten:
|
||||
|
||||
* In GitHub-Diskussionen: den Kommentar als **Antwort** zu markieren.
|
||||
* In GitHub-Issues: Das Issue zu **schließen**.
|
||||
|
||||
## Das GitHub-Repository beobachten { #watch-the-github-repository }
|
||||
|
||||
Sie können FastAPI auf GitHub „beobachten“ (klicken Sie auf den „watch“-Button oben rechts): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀
|
||||
|
||||
Wenn Sie dann „Watching“ statt „Releases only“ auswählen, erhalten Sie Benachrichtigungen, wenn jemand ein neues Issue eröffnet oder eine neue Frage stellt. Sie können auch spezifizieren, dass Sie nur über neue Issues, Diskussionen, PRs usw. benachrichtigt werden möchten.
|
||||
|
||||
Dann können Sie versuchen, bei der Lösung solcher Fragen zu helfen.
|
||||
Folgen Sie der [Anleitung, wie Sie helfen können](https://tiangolo.com/open-source/help/#help-others-with-questions-in-github) hier.
|
||||
|
||||
## Fragen stellen { #ask-questions }
|
||||
|
||||
Sie können im GitHub-Repository [eine neue Frage erstellen](https://github.com/fastapi/fastapi/discussions/new?category=questions), zum Beispiel:
|
||||
Sie können im GitHub-Repository [eine neue Frage erstellen](https://github.com/fastapi/fastapi/discussions/new?category=questions), zum Beispiel um:
|
||||
|
||||
* Stellen Sie eine **Frage** oder bitten Sie um Hilfe mit einem **Problem**.
|
||||
* Schlagen Sie eine neue **Funktionalität** vor.
|
||||
|
||||
**Hinweis**: Wenn Sie das tun, bitte ich Sie, auch anderen zu helfen. 😉
|
||||
|
||||
## Pull Requests prüfen { #review-pull-requests }
|
||||
|
||||
Sie können mir helfen, Pull Requests von anderen zu überprüfen.
|
||||
|
||||
Noch einmal, bitte versuchen Sie Ihr Bestes, freundlich zu sein. 🤗
|
||||
|
||||
---
|
||||
|
||||
Hier ist, was Sie beachten sollten und wie Sie einen Pull Request überprüfen:
|
||||
|
||||
### Das Problem verstehen { #understand-the-problem }
|
||||
|
||||
* Stellen Sie zunächst sicher, dass Sie **das Problem verstehen**, welches der Pull Request zu lösen versucht. Möglicherweise gibt es eine längere Diskussion dazu in einer GitHub-Diskussion oder einem GitHub-Issue.
|
||||
|
||||
* Es besteht auch eine gute Chance, dass der Pull Request nicht wirklich benötigt wird, da das Problem auf **andere Weise** gelöst werden kann. Dann können Sie das vorschlagen oder danach fragen.
|
||||
|
||||
### Keine Panik wegen des Stils { #dont-worry-about-style }
|
||||
|
||||
* Machen Sie sich keine Sorgen über Dinge wie den Stil von Commit-Nachrichten. Ich werde den Commit zusammenführen und manuell anpassen.
|
||||
|
||||
* Außerdem, keine Sorgen über Stilregeln, es gibt bereits automatisierte Tools, die das überprüfen.
|
||||
|
||||
Und wenn es irgendeinen anderen Stil- oder Konsistenzbedarf gibt, werde ich direkt danach fragen oder zusätzliche Commits mit den erforderlichen Änderungen hinzufügen.
|
||||
|
||||
### Den Code testen { #check-the-code }
|
||||
|
||||
* Prüfen und lesen Sie den Code, fragen Sie sich, ob er Sinn macht, **führen Sie ihn lokal aus** und testen Sie, ob er das Problem tatsächlich löst.
|
||||
|
||||
* Schreiben Sie dann einen **Kommentar** und berichten, dass Sie das getan haben. So weiß ich, dass Sie ihn wirklich überprüft haben.
|
||||
|
||||
/// info | Info
|
||||
|
||||
Leider kann ich PRs, nur weil sie von mehreren gutgeheißen wurden, nicht einfach vertrauen.
|
||||
|
||||
Es ist mehrmals passiert, dass es PRs mit drei, fünf oder mehr Zustimmungen gibt, wahrscheinlich weil die Beschreibung ansprechend ist, aber wenn ich die PRs überprüfe, sind sie tatsächlich fehlerhaft, haben einen Bug, oder lösen das Problem nicht, welches sie behaupten, zu lösen. 😅
|
||||
|
||||
Daher ist es wirklich wichtig, dass Sie den Code wirklich lesen und ausführen und mir in den Kommentaren mitteilen, dass Sie dies getan haben. 🤓
|
||||
|
||||
///
|
||||
|
||||
* Wenn der PR in irgendeiner Weise vereinfacht werden kann, können Sie danach fragen, aber es gibt keinen Grund, zu wählerisch zu sein. Es gibt viele subjektive Standpunkte (und ich habe auch meinen eigenen 🙈), also ist es besser, wenn man sich auf die grundlegenden Dinge konzentriert.
|
||||
|
||||
### Tests { #tests }
|
||||
|
||||
* Helfen Sie mir zu überprüfen, dass der PR **Tests** hat.
|
||||
|
||||
* Überprüfen Sie, dass diese Tests vor dem PR **fehlschlagen**. 🚨
|
||||
|
||||
* Überprüfen Sie dann, dass diese Tests nach dem PR **bestanden** werden. ✅
|
||||
|
||||
* Viele PRs haben keine Tests. Sie können den Autor daran **erinnern**, Tests hinzuzufügen, oder Sie können sogar selbst einige Tests **vorschlagen**. Das ist eines der Dinge, die am meisten Zeit in Anspruch nehmen, und Sie können dabei viel helfen.
|
||||
|
||||
* Kommentieren Sie auch hier anschließend, was Sie versucht haben, sodass ich weiß, dass Sie es überprüft haben. 🤓
|
||||
|
||||
## Einen Pull Request erstellen { #create-a-pull-request }
|
||||
|
||||
Sie können [zum Quellcode mit Pull Requests beitragen](contributing.md), zum Beispiel:
|
||||
|
||||
* Um einen Tippfehler zu beheben, den Sie in der Dokumentation gefunden haben.
|
||||
* Um einen Artikel, ein Video oder einen Podcast über FastAPI zu teilen, den Sie erstellt oder gefunden haben, indem Sie [diese Datei bearbeiten](https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml).
|
||||
* Stellen Sie sicher, dass Sie Ihren Link am Anfang des entsprechenden Abschnitts einfügen.
|
||||
* Um zu helfen, [die Dokumentation in Ihre Sprache zu übersetzen](contributing.md#translations).
|
||||
* Sie können auch dabei helfen, die von anderen erstellten Übersetzungen zu überprüfen.
|
||||
* Um neue Dokumentationsabschnitte vorzuschlagen.
|
||||
* Um ein bestehendes Problem/Bug zu beheben.
|
||||
* Stellen Sie sicher, dass Sie Tests hinzufügen.
|
||||
* Um eine neue Funktionalität hinzuzufügen.
|
||||
* Stellen Sie sicher, dass Sie Tests hinzufügen.
|
||||
* Stellen Sie sicher, dass Sie Dokumentation hinzufügen, falls das notwendig ist.
|
||||
|
||||
## FastAPI pflegen { #help-maintain-fastapi }
|
||||
|
||||
Helfen Sie mir, **FastAPI** zu pflegen! 🤓
|
||||
|
||||
Es gibt viel zu tun, und das meiste davon können **SIE** tun.
|
||||
|
||||
Die Hauptaufgaben, die Sie jetzt erledigen können, sind:
|
||||
|
||||
* [Anderen bei Fragen auf GitHub helfen](#help-others-with-questions-in-github) (siehe Abschnitt oben).
|
||||
* [Pull Requests prüfen](#review-pull-requests) (siehe Abschnitt oben).
|
||||
|
||||
Diese beiden Aufgaben sind die Dinge, die **am meisten Zeit verbrauchen**. Das ist die Hauptarbeit bei der Wartung von FastAPI.
|
||||
|
||||
Wenn Sie mir dabei helfen können, **helfen Sie mir, FastAPI zu pflegen** und Sie stellen sicher, dass es weiterhin **schneller und besser voranschreitet**. 🚀
|
||||
* Eine **Frage** zu stellen oder nach einem **Problem** zu fragen.
|
||||
* Eine neue **Funktionalität** vorzuschlagen.
|
||||
|
||||
## Am Chat teilnehmen { #join-the-chat }
|
||||
|
||||
@@ -231,7 +72,7 @@ Treten Sie dem 👥 [Discord-Chatserver](https://discord.gg/VQjSZaeJmf) 👥 bei
|
||||
|
||||
/// tip | Tipp
|
||||
|
||||
Bei Fragen stellen Sie sie in [GitHub-Diskussionen](https://github.com/fastapi/fastapi/discussions/new?category=questions), dort besteht eine viel größere Chance, dass Sie Hilfe von den [FastAPI-Experten](fastapi-people.md#fastapi-experts) erhalten.
|
||||
Bei Fragen stellen Sie sie in GitHub-Diskussionen, dort besteht eine viel größere Chance, dass Sie Hilfe erhalten.
|
||||
|
||||
Nutzen Sie den Chat nur für andere allgemeine Gespräche.
|
||||
|
||||
@@ -241,16 +82,6 @@ Nutzen Sie den Chat nur für andere allgemeine Gespräche.
|
||||
|
||||
Bedenken Sie, dass Sie in Chats, die „freie Konversation“ erlauben, leicht Fragen stellen können, die zu allgemein und schwer zu beantworten sind, sodass Sie möglicherweise keine Antworten erhalten.
|
||||
|
||||
Auf GitHub hilft Ihnen die Vorlage dabei, die richtige Frage zu stellen, sodass Sie leichter eine gute Antwort erhalten können, oder sogar das Problem selbst lösen, bevor Sie überhaupt fragen. Und auf GitHub kann ich sicherstellen, dass ich immer alles beantworte, auch wenn es einige Zeit dauert. Persönlich kann ich das mit den Chat-Systemen nicht machen. 😅
|
||||
Auf GitHub hilft Ihnen die Vorlage dabei, die richtige Frage zu stellen, sodass Sie leichter eine gute Antwort erhalten können, oder sogar das Problem selbst lösen, bevor Sie überhaupt fragen.
|
||||
|
||||
Unterhaltungen in den Chat-Systemen sind auch nicht so leicht durchsuchbar wie auf GitHub, sodass Fragen und Antworten möglicherweise im Gespräch verloren gehen. Und nur die auf GitHub machen einen [FastAPI-Experten](fastapi-people.md#fastapi-experts), Sie werden also höchstwahrscheinlich mehr Aufmerksamkeit auf GitHub erhalten.
|
||||
|
||||
Auf der anderen Seite gibt es Tausende von Benutzern in den Chat-Systemen, sodass die Wahrscheinlichkeit hoch ist, dass Sie dort fast immer jemanden zum Reden finden. 😄
|
||||
|
||||
## Den Autor sponsern { #sponsor-the-author }
|
||||
|
||||
Wenn Ihr **Produkt/Firma** auf **FastAPI** angewiesen ist oder in Zusammenhang steht und Sie seine Benutzer erreichen möchten, können Sie den Autor (mich) über [GitHub-Sponsoren](https://github.com/sponsors/tiangolo) unterstützen. Je nach Stufe können Sie einige zusätzliche Vorteile erhalten, wie z. B. ein Abzeichen in der Dokumentation. 🎁
|
||||
|
||||
---
|
||||
|
||||
Danke! 🚀
|
||||
Unterhaltungen in den Chat-Systemen sind auch nicht so leicht durchsuchbar wie auf GitHub, sie gehen verloren.
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
---
|
||||
include_yaml:
|
||||
sponsors: data/sponsors.yml
|
||||
---
|
||||
|
||||
# FastAPI { #fastapi }
|
||||
|
||||
<style>
|
||||
@@ -54,18 +59,27 @@ Seine Schlüssel-Merkmale sind:
|
||||
|
||||
### Keystone-Sponsor { #keystone-sponsor }
|
||||
|
||||
<div class="fastapi-sponsors fastapi-sponsors--keystone">
|
||||
{% for sponsor in sponsors.keystone -%}
|
||||
<a href="{{ sponsor.url }}" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
|
||||
<a class="fastapi-sponsors__card fastapi-sponsors__card--keystone" href="{{ sponsor.url }}" title="{{ sponsor.title }}"><img class="fastapi-sponsors__banner" src="{{ sponsor.img }}" alt="{{ sponsor.title }}"></a>
|
||||
{% endfor -%}
|
||||
</div>
|
||||
|
||||
### Gold- und Silber-Sponsoren { #gold-and-silver-sponsors }
|
||||
### Gold-Sponsoren { #gold-sponsors }
|
||||
|
||||
<div class="fastapi-sponsors fastapi-sponsors--gold">
|
||||
{% for sponsor in sponsors.gold -%}
|
||||
<a href="{{ sponsor.url }}" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
|
||||
<a class="fastapi-sponsors__card fastapi-sponsors__card--gold" href="{{ sponsor.url }}" title="{{ sponsor.title }}"><img class="fastapi-sponsors__banner" src="{{ sponsor.img }}" alt="{{ sponsor.title }}" loading="lazy"></a>
|
||||
{% endfor -%}
|
||||
{%- for sponsor in sponsors.silver -%}
|
||||
<a href="{{ sponsor.url }}" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a>
|
||||
</div>
|
||||
|
||||
### Silber-Sponsoren { #silver-sponsors }
|
||||
|
||||
<div class="fastapi-sponsors fastapi-sponsors--silver">
|
||||
{% for sponsor in sponsors.silver -%}
|
||||
<a class="fastapi-sponsors__card fastapi-sponsors__card--silver" href="{{ sponsor.url }}" title="{{ sponsor.title }}"><img class="fastapi-sponsors__banner" src="{{ sponsor.img }}" alt="{{ sponsor.title }}" loading="lazy"></a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<!-- /sponsors -->
|
||||
|
||||
@@ -73,6 +87,44 @@ Seine Schlüssel-Merkmale sind:
|
||||
|
||||
## Meinungen { #opinions }
|
||||
|
||||
<!-- only-mkdocs -->
|
||||
<div class="fastapi-opinions" data-fastapi-opinions>
|
||||
<div class="fastapi-opinions__tabs" role="tablist" aria-label="Companies using FastAPI">
|
||||
<button class="fastapi-opinions__tab" role="tab" type="button" id="fo-tab-microsoft" aria-controls="fo-panel-microsoft" aria-selected="true" tabindex="0">
|
||||
<span class="fastapi-opinions__mark"><img src="/img/logos/microsoft.svg" alt="Microsoft" loading="lazy"></span>
|
||||
</button>
|
||||
<button class="fastapi-opinions__tab" role="tab" type="button" id="fo-tab-uber" aria-controls="fo-panel-uber" aria-selected="false" tabindex="-1">
|
||||
<span class="fastapi-opinions__mark"><img src="/img/logos/uber.svg" alt="Uber" loading="lazy"></span>
|
||||
</button>
|
||||
<button class="fastapi-opinions__tab" role="tab" type="button" id="fo-tab-netflix" aria-controls="fo-panel-netflix" aria-selected="false" tabindex="-1">
|
||||
<span class="fastapi-opinions__mark"><img src="/img/logos/netflix.svg" alt="Netflix" loading="lazy"></span>
|
||||
</button>
|
||||
<button class="fastapi-opinions__tab" role="tab" type="button" id="fo-tab-cisco" aria-controls="fo-panel-cisco" aria-selected="false" tabindex="-1">
|
||||
<span class="fastapi-opinions__mark"><img src="/img/logos/cisco.svg" alt="Cisco" loading="lazy"></span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="fastapi-opinions__panel" id="fo-panel-microsoft" role="tabpanel" aria-labelledby="fo-tab-microsoft" tabindex="0">
|
||||
<blockquote class="fastapi-opinions__quote">„Ich verwende <strong>FastAPI</strong> heutzutage sehr oft. Ich plane tatsächlich, es für alle <strong>ML-Services meines Teams bei Microsoft</strong> zu verwenden. Einige davon werden in das Kernprodukt <strong>Windows</strong> und einige <strong>Office</strong>-Produkte integriert.“</blockquote>
|
||||
<div class="fastapi-opinions__attr">— Kabir Khan, <strong>Microsoft</strong> <a href="https://github.com/fastapi/fastapi/pull/26">(Ref.)</a></div>
|
||||
</div>
|
||||
<div class="fastapi-opinions__panel" id="fo-panel-uber" role="tabpanel" aria-labelledby="fo-tab-uber" tabindex="0" hidden>
|
||||
<blockquote class="fastapi-opinions__quote">„Wir haben die <strong>FastAPI</strong>-Bibliothek übernommen, um einen <strong>REST</strong>-Server zu erstellen, der für <strong>Vorhersagen</strong> abgefragt werden kann.“ <em>[für Ludwig]</em></blockquote>
|
||||
<div class="fastapi-opinions__attr">— Piero Molino, Yaroslav Dudin, Sai Sumanth Miryala, <strong>Uber</strong> <a href="https://eng.uber.com/ludwig-v0-2/">(Ref.)</a></div>
|
||||
</div>
|
||||
<div class="fastapi-opinions__panel" id="fo-panel-netflix" role="tabpanel" aria-labelledby="fo-tab-netflix" tabindex="0" hidden>
|
||||
<blockquote class="fastapi-opinions__quote">„<strong>Netflix</strong> freut sich, die Open-Source-Veröffentlichung unseres <strong>Krisenmanagement</strong>-Orchestrierungsframeworks bekannt zu geben: <strong>Dispatch</strong>!“ <em>[erstellt mit FastAPI]</em></blockquote>
|
||||
<div class="fastapi-opinions__attr">— Kevin Glisson, Marc Vilanova, Forest Monsen, <strong>Netflix</strong> <a href="https://netflixtechblog.com/introducing-dispatch-da4b8a2a8072">(Ref.)</a></div>
|
||||
</div>
|
||||
<div class="fastapi-opinions__panel" id="fo-panel-cisco" role="tabpanel" aria-labelledby="fo-tab-cisco" tabindex="0" hidden>
|
||||
<blockquote class="fastapi-opinions__quote">„Falls irgendjemand eine Produktions-Python-API erstellen möchte, kann ich <strong>FastAPI</strong> wärmstens empfehlen. Es ist <strong>wunderschön konzipiert</strong>, <strong>einfach zu verwenden</strong> und <strong>hoch skalierbar</strong> – es ist zu einer <strong>Schlüsselkomponente</strong> unserer API-First-Entwicklungsstrategie geworden.“</blockquote>
|
||||
<div class="fastapi-opinions__attr">— Deon Pillsbury, <strong>Cisco</strong> <a href="https://www.linkedin.com/posts/deonpillsbury_cisco-cx-python-activity-6963242628536487936-trAp/">(Ref.)</a></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /only-mkdocs -->
|
||||
|
||||
<div class="only-github" markdown="1">
|
||||
|
||||
„_[...] Ich verwende **FastAPI** heutzutage sehr oft. [...] Ich habe tatsächlich vor, es für alle **ML-Services meines Teams bei Microsoft** zu verwenden. Einige davon werden in das Kernprodukt **Windows** und einige **Office**-Produkte integriert._“
|
||||
|
||||
<div style="text-align: right; margin-right: 10%;">Kabir Khan – <strong>Microsoft</strong> <a href="https://github.com/fastapi/fastapi/pull/26"><small>(Ref.)</small></a></div>
|
||||
@@ -85,43 +137,31 @@ Seine Schlüssel-Merkmale sind:
|
||||
|
||||
---
|
||||
|
||||
„_**Netflix** freut sich, die Open-Source-Veröffentlichung unseres **Krisenmanagement**-Orchestrierung-Frameworks bekannt zu geben: **Dispatch**! [erstellt mit **FastAPI**]_“
|
||||
„_**Netflix** freut sich, die Open-Source-Veröffentlichung unseres **Krisenmanagement**-Orchestrierungsframeworks bekannt zu geben: **Dispatch**! [erstellt mit **FastAPI**]_“
|
||||
|
||||
<div style="text-align: right; margin-right: 10%;">Kevin Glisson, Marc Vilanova, Forest Monsen – <strong>Netflix</strong> <a href="https://netflixtechblog.com/introducing-dispatch-da4b8a2a8072"><small>(Ref.)</small></a></div>
|
||||
|
||||
---
|
||||
|
||||
„_Ich bin hellauf begeistert von **FastAPI**. Es macht so viel Spaß!_“
|
||||
|
||||
<div style="text-align: right; margin-right: 10%;">Brian Okken – <strong>[Python Bytes](https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855) Podcast-Host</strong> <a href="https://x.com/brianokken/status/1112220079972728832"><small>(Ref.)</small></a></div>
|
||||
|
||||
---
|
||||
|
||||
„_Ehrlich, was Du gebaut hast, sieht super solide und poliert aus. In vielerlei Hinsicht ist es so, wie ich **Hug** haben wollte – es ist wirklich inspirierend, jemanden so etwas bauen zu sehen._“
|
||||
|
||||
<div style="text-align: right; margin-right: 10%;">Timothy Crosley – <strong>[Hug](https://github.com/hugapi/hug)-Autor</strong> <a href="https://news.ycombinator.com/item?id=19455465"><small>(Ref.)</small></a></div>
|
||||
|
||||
---
|
||||
|
||||
„_Wenn Sie ein **modernes Framework** zum Erstellen von REST-APIs erlernen möchten, schauen Sie sich **FastAPI** an. [...] Es ist schnell, einfach zu verwenden und leicht zu lernen [...]_“
|
||||
|
||||
„_Wir haben zu **FastAPI** für unsere **APIs** gewechselt [...] Ich denke, es wird Ihnen gefallen [...]_“
|
||||
|
||||
<div style="text-align: right; margin-right: 10%;">Ines Montani – Matthew Honnibal – <strong>[Explosion AI](https://explosion.ai)-Gründer – [spaCy](https://spacy.io)-Autoren</strong> <a href="https://x.com/_inesmontani/status/1144173225322143744"><small>(Ref.)</small></a> – <a href="https://x.com/honnibal/status/1144031421859655680"><small>(Ref.)</small></a></div>
|
||||
|
||||
---
|
||||
|
||||
„_Falls irgendjemand eine Produktions-Python-API erstellen möchte, kann ich **FastAPI** wärmstens empfehlen. Es ist **wunderschön konzipiert**, **einfach zu verwenden** und **hoch skalierbar**; es ist zu einer **Schlüsselkomponente** unserer API-First-Entwicklungsstrategie geworden und treibt viele Automatisierungen und Services an, wie etwa unseren Virtual TAC Engineer._“
|
||||
|
||||
<div style="text-align: right; margin-right: 10%;">Deon Pillsbury – <strong>Cisco</strong> <a href="https://www.linkedin.com/posts/deonpillsbury_cisco-cx-python-activity-6963242628536487936-trAp/"><small>(Ref.)</small></a></div>
|
||||
|
||||
---
|
||||
|
||||
</div>
|
||||
|
||||
## FastAPI Conf { #fastapi-conf }
|
||||
|
||||
[**FastAPI Conf ’26**](https://fastapiconf.com) findet am **28. Oktober 2026** in **Amsterdam, NL** statt. Alles über FastAPI, direkt von der Quelle. 🎤
|
||||
|
||||
<a class="fastapi-feature-banner" href="https://fastapiconf.com"><img src="https://fastapi.tiangolo.com/img/fastapi-conf.jpeg" alt="FastAPI Conf ’26 - 28. Oktober 2026 - Amsterdam, NL"></a>
|
||||
|
||||
## FastAPI Mini-Dokumentarfilm { #fastapi-mini-documentary }
|
||||
|
||||
Es gibt einen [FastAPI-Mini-Dokumentarfilm](https://www.youtube.com/watch?v=mpR8ngthqiE), veröffentlicht Ende 2025, Sie können ihn online ansehen:
|
||||
|
||||
<a href="https://www.youtube.com/watch?v=mpR8ngthqiE"><img src="https://fastapi.tiangolo.com/img/fastapi-documentary.jpg" alt="FastAPI Mini-Dokumentarfilm"></a>
|
||||
<a class="fastapi-feature-banner" href="https://www.youtube.com/watch?v=mpR8ngthqiE"><img src="https://fastapi.tiangolo.com/img/fastapi-documentary.jpg" alt="FastAPI Mini-Dokumentarfilm"></a>
|
||||
|
||||
## **Typer**, das FastAPI der CLIs { #typer-the-fastapi-of-clis }
|
||||
|
||||
|
||||
@@ -172,7 +172,7 @@ Da die Liste ein Typ ist, welcher innere Typen enthält, werden diese von eckige
|
||||
|
||||
{* ../../docs_src/python_types/tutorial006_py310.py hl[1] *}
|
||||
|
||||
/// info | Info
|
||||
/// note | Hinweis
|
||||
|
||||
Die inneren Typen in den eckigen Klammern werden als „Typ-Parameter“ bezeichnet.
|
||||
|
||||
@@ -283,7 +283,7 @@ Ein Beispiel aus der offiziellen Pydantic Dokumentation:
|
||||
|
||||
{* ../../docs_src/python_types/tutorial011_py310.py *}
|
||||
|
||||
/// info | Info
|
||||
/// note | Hinweis
|
||||
|
||||
Um mehr über [Pydantic zu erfahren, schauen Sie sich dessen Dokumentation an](https://docs.pydantic.dev/).
|
||||
|
||||
@@ -341,7 +341,7 @@ Das mag alles abstrakt klingen. Machen Sie sich keine Sorgen. Sie werden all das
|
||||
|
||||
Das Wichtigste ist, dass **FastAPI** durch die Verwendung von Standard-Python-Typen an einer einzigen Stelle (anstatt weitere Klassen, Dekoratoren usw. hinzuzufügen) einen Großteil der Arbeit für Sie erledigt.
|
||||
|
||||
/// info | Info
|
||||
/// note | Hinweis
|
||||
|
||||
Wenn Sie bereits das ganze Tutorial durchgearbeitet haben und mehr über Typen erfahren wollen, dann ist eine gute Ressource [der „Cheat Sheet“ von `mypy`](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html).
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ Wenn Sie eine Anwendung oder eine Web-API erstellen, ist es selten der Fall, das
|
||||
|
||||
**FastAPI** bietet ein praktisches Werkzeug zur Strukturierung Ihrer Anwendung bei gleichzeitiger Wahrung der Flexibilität.
|
||||
|
||||
/// info | Info
|
||||
/// note | Hinweis
|
||||
|
||||
Wenn Sie von Flask kommen, wäre dies das Äquivalent zu Flasks Blueprints.
|
||||
|
||||
@@ -194,7 +194,7 @@ Das Endergebnis ist, dass die Pfade für diese Artikel jetzt wie folgt lauten:
|
||||
|
||||
///
|
||||
|
||||
/// check | Testen
|
||||
/// tip | Tipp
|
||||
|
||||
Die Parameter `prefix`, `tags`, `responses` und `dependencies` sind (wie in vielen anderen Fällen) nur ein Feature von **FastAPI**, um Ihnen dabei zu helfen, Codeverdoppelung zu vermeiden.
|
||||
|
||||
@@ -339,7 +339,7 @@ Wir könnten sie auch wie folgt importieren:
|
||||
from app.routers import items, users
|
||||
```
|
||||
|
||||
/// info | Info
|
||||
/// note | Hinweis
|
||||
|
||||
Die erste Version ist ein „relativer Import“:
|
||||
|
||||
@@ -382,7 +382,7 @@ Inkludieren wir nun die `router` aus diesen Submodulen `users` und `items`:
|
||||
|
||||
{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[10:11] title["app/main.py"] *}
|
||||
|
||||
/// info | Info
|
||||
/// note | Hinweis
|
||||
|
||||
`users.router` enthält den `APIRouter` in der Datei `app/routers/users.py`.
|
||||
|
||||
@@ -402,7 +402,7 @@ Hinter den Kulissen wird es also tatsächlich so funktionieren, als ob alles die
|
||||
|
||||
///
|
||||
|
||||
/// check | Testen
|
||||
/// tip | Tipp
|
||||
|
||||
Bei der Einbindung von Routern müssen Sie sich keine Gedanken über die Leistung machen.
|
||||
|
||||
@@ -451,7 +451,7 @@ Hier machen wir es ... nur um zu zeigen, dass wir es können 🤷:
|
||||
|
||||
und es wird korrekt funktionieren, zusammen mit allen anderen *Pfadoperationen*, die mit `app.include_router()` hinzugefügt wurden.
|
||||
|
||||
/// info | Sehr technische Details
|
||||
/// note | Sehr technische Details
|
||||
|
||||
**Hinweis**: Dies ist ein sehr technisches Detail, das Sie wahrscheinlich **einfach überspringen** können.
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ Daher wird die Zeile:
|
||||
|
||||
nicht ausgeführt.
|
||||
|
||||
/// info | Info
|
||||
/// note | Hinweis
|
||||
|
||||
Für weitere Informationen besuchen Sie bitte [die offizielle Python-Dokumentation](https://docs.python.org/3/library/__main__.html).
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ Aber denken Sie daran, dass bei der Nutzung von `Query`, `Path`, `Header` und an
|
||||
|
||||
///
|
||||
|
||||
/// info | Info
|
||||
/// note | Hinweis
|
||||
|
||||
Um Header zu deklarieren, müssen Sie `Header` verwenden, da die Parameter sonst als Query-Parameter interpretiert werden würden.
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
Wenn Sie an Python-Projekten arbeiten, sollten Sie wahrscheinlich eine **virtuelle Umgebung** (oder einen ähnlichen Mechanismus) verwenden, um die <abbr title="Python Installationspakete">Packages</abbr>, die Sie für jedes Projekt installieren, zu isolieren.
|
||||
|
||||
/// info | Info
|
||||
/// note | Hinweis
|
||||
|
||||
Wenn Sie bereits über virtuelle Umgebungen Bescheid wissen, wie man sie erstellt und verwendet, möchten Sie diesen Abschnitt vielleicht überspringen. 🤓
|
||||
|
||||
@@ -18,7 +18,7 @@ Eine **virtuelle Umgebung** ist ein Verzeichnis mit einigen Dateien darin.
|
||||
|
||||
///
|
||||
|
||||
/// info | Info
|
||||
/// note | Hinweis
|
||||
|
||||
Diese Seite wird Ihnen beibringen, wie Sie **virtuelle Umgebungen** verwenden und wie sie funktionieren.
|
||||
|
||||
@@ -817,7 +817,7 @@ Traceback (most recent call last):
|
||||
|
||||
</div>
|
||||
|
||||
Wenn Sie jedoch die virtuelle Umgebung deaktivieren und die neue für `prisoner-of-askaban` aktivieren, wird beim Ausführen von `python` das Python aus der virtuellen Umgebung in `prisoner-of-azkaban` verwendet.
|
||||
Wenn Sie jedoch die virtuelle Umgebung deaktivieren und die neue für `prisoner-of-azkaban` aktivieren, wird beim Ausführen von `python` das Python aus der virtuellen Umgebung in `prisoner-of-azkaban` verwendet.
|
||||
|
||||
<div class="termy">
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
INHERIT: ../en/mkdocs.yml
|
||||
@@ -1,21 +1,21 @@
|
||||
tiangolo:
|
||||
login: tiangolo
|
||||
count: 935
|
||||
count: 961
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
||||
url: https://github.com/tiangolo
|
||||
dependabot:
|
||||
login: dependabot
|
||||
count: 157
|
||||
count: 201
|
||||
avatarUrl: https://avatars.githubusercontent.com/in/29110?v=4
|
||||
url: https://github.com/apps/dependabot
|
||||
YuriiMotov:
|
||||
login: YuriiMotov
|
||||
count: 66
|
||||
count: 78
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4
|
||||
url: https://github.com/YuriiMotov
|
||||
alejsdev:
|
||||
login: alejsdev
|
||||
count: 53
|
||||
count: 56
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=0facffe3abf87f57a1f05fa773d1119cc5c2f6a5&v=4
|
||||
url: https://github.com/alejsdev
|
||||
pre-commit-ci:
|
||||
@@ -35,7 +35,7 @@ Kludex:
|
||||
url: https://github.com/Kludex
|
||||
svlandeg:
|
||||
login: svlandeg
|
||||
count: 21
|
||||
count: 24
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4
|
||||
url: https://github.com/svlandeg
|
||||
dmontagu:
|
||||
@@ -556,7 +556,7 @@ chailandau:
|
||||
DanielKusyDev:
|
||||
login: DanielKusyDev
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/36250676?u=2ea6114ff751fc48b55f231987a0e2582c6b1bd2&v=4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/36250676?u=411f1f5923596480b896d160e23c908318f39003&v=4
|
||||
url: https://github.com/DanielKusyDev
|
||||
Viicos:
|
||||
login: Viicos
|
||||
@@ -578,6 +578,11 @@ Taoup:
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/22348542?v=4
|
||||
url: https://github.com/Taoup
|
||||
zadevhub:
|
||||
login: zadevhub
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/138465437?v=4
|
||||
url: https://github.com/zadevhub
|
||||
savannahostrowski:
|
||||
login: savannahostrowski
|
||||
count: 2
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
maintainers:
|
||||
- login: tiangolo
|
||||
answers: 1922
|
||||
answers: 1929
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
||||
url: https://github.com/tiangolo
|
||||
experts:
|
||||
- login: tiangolo
|
||||
count: 1922
|
||||
count: 1929
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
||||
url: https://github.com/tiangolo
|
||||
- login: YuriiMotov
|
||||
count: 1156
|
||||
count: 1178
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4
|
||||
url: https://github.com/YuriiMotov
|
||||
- login: github-actions
|
||||
count: 769
|
||||
count: 770
|
||||
avatarUrl: https://avatars.githubusercontent.com/in/15368?v=4
|
||||
url: https://github.com/apps/github-actions
|
||||
- login: Kludex
|
||||
@@ -25,7 +25,7 @@ experts:
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4
|
||||
url: https://github.com/jgould22
|
||||
- login: dmontagu
|
||||
count: 239
|
||||
count: 240
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/35119617?u=540f30c937a6450812628b9592a1dfe91bbe148e&v=4
|
||||
url: https://github.com/dmontagu
|
||||
- login: Mause
|
||||
@@ -41,7 +41,7 @@ experts:
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/13659033?u=e8bea32d07a5ef72f7dde3b2079ceb714923ca05&v=4
|
||||
url: https://github.com/JarroVGIT
|
||||
- login: euri10
|
||||
count: 152
|
||||
count: 153
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1104190?u=321a2e953e6645a7d09b732786c7a8061e0f8a8b&v=4
|
||||
url: https://github.com/euri10
|
||||
- login: iudeen
|
||||
@@ -57,7 +57,7 @@ experts:
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4
|
||||
url: https://github.com/JavierSanchezCastro
|
||||
- login: luzzodev
|
||||
count: 105
|
||||
count: 107
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4
|
||||
url: https://github.com/luzzodev
|
||||
- login: raphaelauv
|
||||
@@ -89,7 +89,7 @@ experts:
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4
|
||||
url: https://github.com/acidjunk
|
||||
- login: sm-Fifteen
|
||||
count: 48
|
||||
count: 49
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/516999?u=437c0c5038558c67e887ccd863c1ba0f846c03da&v=4
|
||||
url: https://github.com/sm-Fifteen
|
||||
- login: adriangb
|
||||
@@ -137,7 +137,7 @@ experts:
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/41326348?u=ba2fda6b30110411ecbf406d187907e2b420ac19&v=4
|
||||
url: https://github.com/panla
|
||||
- login: valentinDruzhinin
|
||||
count: 30
|
||||
count: 31
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
|
||||
url: https://github.com/valentinDruzhinin
|
||||
- login: prostomarkeloff
|
||||
@@ -184,6 +184,10 @@ experts:
|
||||
count: 21
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/51059348?u=5fe59a56e1f2f9ccd8005d71752a8276f133ae1a&v=4
|
||||
url: https://github.com/rafsaf
|
||||
- login: ebottos94
|
||||
count: 20
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/100039558?u=8b91053b3abe4a9209375e3651e1c1ef192d884b&v=4
|
||||
url: https://github.com/ebottos94
|
||||
- login: nsidnev
|
||||
count: 20
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/22559461?u=a9cc3238217e21dc8796a1a500f01b722adb082c&v=4
|
||||
@@ -192,10 +196,6 @@ experts:
|
||||
count: 20
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/565544?v=4
|
||||
url: https://github.com/chris-allnutt
|
||||
- login: ebottos94
|
||||
count: 20
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/100039558?u=8b91053b3abe4a9209375e3651e1c1ef192d884b&v=4
|
||||
url: https://github.com/ebottos94
|
||||
- login: estebanx64
|
||||
count: 19
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=2ca073ee47a625e495a9573bd374ddcd7be5ec91&v=4
|
||||
@@ -240,169 +240,221 @@ experts:
|
||||
count: 16
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/26334101?u=f601c3f111f2148bd9244c2cb3ebbd57b592e674&v=4
|
||||
url: https://github.com/jonatasoli
|
||||
- login: mattmess1221
|
||||
- login: abhint
|
||||
count: 15
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/3409962?u=d22ea18aa8ea688af25a45df306134d593621a44&v=4
|
||||
url: https://github.com/mattmess1221
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/25699289?u=b5d219277b4d001ac26fb8be357fddd88c29d51b&v=4
|
||||
url: https://github.com/abhint
|
||||
last_month_experts:
|
||||
- login: YuriiMotov
|
||||
count: 37
|
||||
count: 14
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4
|
||||
url: https://github.com/YuriiMotov
|
||||
- login: christiansousadev
|
||||
- login: yudin-s
|
||||
count: 5
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/781481?u=8c1ab221edbe051eb55310747ebe39574e808118&v=4
|
||||
url: https://github.com/yudin-s
|
||||
- login: BitWeaverDev
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/103544118?u=690f3f76d1dc4d0929de5020679d5604f860acbc&v=4
|
||||
url: https://github.com/christiansousadev
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/288751066?v=4
|
||||
url: https://github.com/BitWeaverDev
|
||||
- login: Zawwarsami16
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/105767627?u=5bb2b7a639a9207a5ded536f963a4c7bd6d04d21&v=4
|
||||
url: https://github.com/Zawwarsami16
|
||||
- login: tiangolo
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
||||
url: https://github.com/tiangolo
|
||||
- login: mg1986jp
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/20254686?u=6da9cdad3ecf8a4f3cbc33a518c3998ed0ac685a&v=4
|
||||
url: https://github.com/mg1986jp
|
||||
- login: Bogdusik
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/166155258?u=11440b02966a3f5e5eeebc21d67b7bbb7d370487&v=4
|
||||
url: https://github.com/Bogdusik
|
||||
three_months_experts:
|
||||
- login: YuriiMotov
|
||||
count: 57
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4
|
||||
url: https://github.com/YuriiMotov
|
||||
- login: Firatasi
|
||||
count: 7
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/112112161?u=3219914a49a4a604b3626007823db7de049b6d66&v=4
|
||||
url: https://github.com/Firatasi
|
||||
- login: yudin-s
|
||||
count: 5
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/781481?u=8c1ab221edbe051eb55310747ebe39574e808118&v=4
|
||||
url: https://github.com/yudin-s
|
||||
- login: tiangolo
|
||||
count: 4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
||||
url: https://github.com/tiangolo
|
||||
- login: BitWeaverDev
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/288751066?v=4
|
||||
url: https://github.com/BitWeaverDev
|
||||
- login: ericgitangu
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/11472845?u=9d916cf0f5c80e63cb1d753b8b50dcb8ced3b883&v=4
|
||||
url: https://github.com/ericgitangu
|
||||
- login: Zawwarsami16
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/105767627?u=5bb2b7a639a9207a5ded536f963a4c7bd6d04d21&v=4
|
||||
url: https://github.com/Zawwarsami16
|
||||
- login: luzzodev
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4
|
||||
url: https://github.com/luzzodev
|
||||
- login: mg1986jp
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/20254686?u=6da9cdad3ecf8a4f3cbc33a518c3998ed0ac685a&v=4
|
||||
url: https://github.com/mg1986jp
|
||||
- login: sueun-dev
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/57546981?u=0b0483bdcc7d521e85c06f28d2fc64e258bd466f&v=4
|
||||
url: https://github.com/sueun-dev
|
||||
- login: Bogdusik
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/166155258?u=11440b02966a3f5e5eeebc21d67b7bbb7d370487&v=4
|
||||
url: https://github.com/Bogdusik
|
||||
- login: cookesan
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/6601329?u=7bfc9b017198a9fa50929ae8ae0a787632424ffd&v=4
|
||||
url: https://github.com/cookesan
|
||||
- login: coleifer
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/119974?u=b3a546c94ee1105e792e0acad2c4743d800e7975&v=4
|
||||
url: https://github.com/coleifer
|
||||
- login: Bahtya
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/34988899?u=b8e3c0cf26f4bd1faea265d2f5f66f564af63463&v=4
|
||||
url: https://github.com/Bahtya
|
||||
- login: saitarrun
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/116748905?u=3433afbaf06676a482ebf4ba33b08ddb3fc5c5bf&v=4
|
||||
url: https://github.com/saitarrun
|
||||
- login: Vision-Executive
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/259394686?u=dd28bbc246e4e2cd2adb1d497e7b7585b5d24585&v=4
|
||||
url: https://github.com/Vision-Executive
|
||||
- login: JavierSanchezCastro
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4
|
||||
url: https://github.com/JavierSanchezCastro
|
||||
three_months_experts:
|
||||
- login: christiansousadev
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/103544118?u=690f3f76d1dc4d0929de5020679d5604f860acbc&v=4
|
||||
url: https://github.com/christiansousadev
|
||||
- login: DoctorJohn
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/14076775?u=ec43fe79a98dbc864b428afc7220753e25ca3af2&v=4
|
||||
url: https://github.com/DoctorJohn
|
||||
six_months_experts:
|
||||
- login: YuriiMotov
|
||||
count: 85
|
||||
count: 145
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4
|
||||
url: https://github.com/YuriiMotov
|
||||
- login: tiangolo
|
||||
count: 13
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
||||
url: https://github.com/tiangolo
|
||||
- login: JavierSanchezCastro
|
||||
count: 9
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4
|
||||
url: https://github.com/JavierSanchezCastro
|
||||
- login: Toygarmetu
|
||||
- login: Firatasi
|
||||
count: 7
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/112112161?u=3219914a49a4a604b3626007823db7de049b6d66&v=4
|
||||
url: https://github.com/Firatasi
|
||||
- login: yudin-s
|
||||
count: 5
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/92878791?u=538530cb6d5554e71f9c28709d794db9a74d23d9&v=4
|
||||
url: https://github.com/Toygarmetu
|
||||
- login: ceb10n
|
||||
count: 5
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4
|
||||
url: https://github.com/ceb10n
|
||||
- login: tiangolo
|
||||
count: 4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
||||
url: https://github.com/tiangolo
|
||||
- login: luzzodev
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4
|
||||
url: https://github.com/luzzodev
|
||||
- login: christiansousadev
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/103544118?u=690f3f76d1dc4d0929de5020679d5604f860acbc&v=4
|
||||
url: https://github.com/christiansousadev
|
||||
- login: Kludex
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4
|
||||
url: https://github.com/Kludex
|
||||
- login: saitarrun
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/116748905?u=3433afbaf06676a482ebf4ba33b08ddb3fc5c5bf&v=4
|
||||
url: https://github.com/saitarrun
|
||||
- login: Vision-Executive
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/259394686?u=dd28bbc246e4e2cd2adb1d497e7b7585b5d24585&v=4
|
||||
url: https://github.com/Vision-Executive
|
||||
- login: EmmanuelNiyonshuti
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/142030687?u=ab131d5ad4670280a978f489babe71c9bf9c1097&v=4
|
||||
url: https://github.com/EmmanuelNiyonshuti
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/781481?u=8c1ab221edbe051eb55310747ebe39574e808118&v=4
|
||||
url: https://github.com/yudin-s
|
||||
- login: valentinDruzhinin
|
||||
count: 2
|
||||
count: 5
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
|
||||
url: https://github.com/valentinDruzhinin
|
||||
- login: RichieB2B
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1461970?u=edaa57d1077705244ea5c9244f4783d94ff11f12&v=4
|
||||
url: https://github.com/RichieB2B
|
||||
- login: dotmitsu
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/42657211?u=3bccc9a2f386a3f24230ec393080f8904fe2a5b2&v=4
|
||||
url: https://github.com/dotmitsu
|
||||
six_months_experts:
|
||||
- login: YuriiMotov
|
||||
count: 182
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4
|
||||
url: https://github.com/YuriiMotov
|
||||
- login: tiangolo
|
||||
count: 24
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
||||
url: https://github.com/tiangolo
|
||||
- login: JavierSanchezCastro
|
||||
count: 15
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4
|
||||
url: https://github.com/JavierSanchezCastro
|
||||
- login: luzzodev
|
||||
count: 10
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4
|
||||
url: https://github.com/luzzodev
|
||||
- login: Toygarmetu
|
||||
count: 5
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/92878791?u=538530cb6d5554e71f9c28709d794db9a74d23d9&v=4
|
||||
url: https://github.com/Toygarmetu
|
||||
- login: luzzodev
|
||||
count: 5
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4
|
||||
url: https://github.com/luzzodev
|
||||
- login: ceb10n
|
||||
count: 5
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4
|
||||
url: https://github.com/ceb10n
|
||||
- login: RichieB2B
|
||||
count: 5
|
||||
count: 4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1461970?u=edaa57d1077705244ea5c9244f4783d94ff11f12&v=4
|
||||
url: https://github.com/RichieB2B
|
||||
- login: JunjieAraoXiong
|
||||
count: 5
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/167785867?u=b69afe090c8bf5fd73f2d23fc3a887b28f68f192&v=4
|
||||
url: https://github.com/JunjieAraoXiong
|
||||
- login: valentinDruzhinin
|
||||
count: 4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
|
||||
url: https://github.com/valentinDruzhinin
|
||||
- login: ArmanShirzad
|
||||
count: 4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/68951175?u=1f1efae2fa5d0d17c38a1a8413bedca5e538cedb&v=4
|
||||
url: https://github.com/ArmanShirzad
|
||||
- login: CodeKraken-cmd
|
||||
count: 4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/48470371?u=e7c0e7ec8e35ca5fb3ae40a586ed5e788fd0fe6d&v=4
|
||||
url: https://github.com/CodeKraken-cmd
|
||||
- login: svlandeg
|
||||
count: 4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4
|
||||
url: https://github.com/svlandeg
|
||||
- login: krylosov-aa
|
||||
count: 4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/242901957?u=4c9c7b468203b09bca64936fb464620e32cdd252&v=4
|
||||
url: https://github.com/krylosov-aa
|
||||
- login: Kludex
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4
|
||||
url: https://github.com/Kludex
|
||||
- login: christiansousadev
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/103544118?u=690f3f76d1dc4d0929de5020679d5604f860acbc&v=4
|
||||
url: https://github.com/christiansousadev
|
||||
- login: sachinh35
|
||||
count: 3
|
||||
count: 4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/21972708?u=8560b97b8b41e175f476270b56de8a493b84f302&v=4
|
||||
url: https://github.com/sachinh35
|
||||
- login: BitWeaverDev
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/288751066?v=4
|
||||
url: https://github.com/BitWeaverDev
|
||||
- login: ericgitangu
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/11472845?u=9d916cf0f5c80e63cb1d753b8b50dcb8ced3b883&v=4
|
||||
url: https://github.com/ericgitangu
|
||||
- login: Zawwarsami16
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/105767627?u=5bb2b7a639a9207a5ded536f963a4c7bd6d04d21&v=4
|
||||
url: https://github.com/Zawwarsami16
|
||||
- login: EmmanuelNiyonshuti
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/142030687?u=ab131d5ad4670280a978f489babe71c9bf9c1097&v=4
|
||||
url: https://github.com/EmmanuelNiyonshuti
|
||||
- login: Kludex
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4
|
||||
url: https://github.com/Kludex
|
||||
- login: mg1986jp
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/20254686?u=6da9cdad3ecf8a4f3cbc33a518c3998ed0ac685a&v=4
|
||||
url: https://github.com/mg1986jp
|
||||
- login: sueun-dev
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/57546981?u=0b0483bdcc7d521e85c06f28d2fc64e258bd466f&v=4
|
||||
url: https://github.com/sueun-dev
|
||||
- login: Bogdusik
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/166155258?u=11440b02966a3f5e5eeebc21d67b7bbb7d370487&v=4
|
||||
url: https://github.com/Bogdusik
|
||||
- login: cookesan
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/6601329?u=7bfc9b017198a9fa50929ae8ae0a787632424ffd&v=4
|
||||
url: https://github.com/cookesan
|
||||
- login: coleifer
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/119974?u=b3a546c94ee1105e792e0acad2c4743d800e7975&v=4
|
||||
url: https://github.com/coleifer
|
||||
- login: Bahtya
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/34988899?u=b8e3c0cf26f4bd1faea265d2f5f66f564af63463&v=4
|
||||
url: https://github.com/Bahtya
|
||||
- login: saitarrun
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/116748905?u=3433afbaf06676a482ebf4ba33b08ddb3fc5c5bf&v=4
|
||||
url: https://github.com/saitarrun
|
||||
- login: christiansousadev
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/103544118?u=690f3f76d1dc4d0929de5020679d5604f860acbc&v=4
|
||||
url: https://github.com/christiansousadev
|
||||
- login: DoctorJohn
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/14076775?u=ec43fe79a98dbc864b428afc7220753e25ca3af2&v=4
|
||||
url: https://github.com/DoctorJohn
|
||||
- login: gaardhus
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/46934916?u=18d7aacc6ce59f054749209645d11cfe77b52f90&v=4
|
||||
url: https://github.com/gaardhus
|
||||
- login: y2kbugger
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/6101677?u=1d50077e29582dc01fcbdff846f04fe7ec73fe2e&v=4
|
||||
url: https://github.com/y2kbugger
|
||||
- login: Vision-Executive
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/259394686?u=dd28bbc246e4e2cd2adb1d497e7b7585b5d24585&v=4
|
||||
url: https://github.com/Vision-Executive
|
||||
- login: EmmanuelNiyonshuti
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/142030687?u=ab131d5ad4670280a978f489babe71c9bf9c1097&v=4
|
||||
url: https://github.com/EmmanuelNiyonshuti
|
||||
- login: davidbrochart
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/4711805?u=d39696d995a9e02ec3613ffb2f62b20b14f92f26&v=4
|
||||
@@ -419,63 +471,51 @@ six_months_experts:
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/4661021?u=ed5ddadcf36d9b943ebe61febe0b96ee34e5425d&v=4
|
||||
url: https://github.com/dolfinus
|
||||
- login: skion
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/532192?v=4
|
||||
url: https://github.com/skion
|
||||
- login: florentx
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/142113?u=bf10f10080026346b092633c380977b61cee0d9c&v=4
|
||||
url: https://github.com/florentx
|
||||
- login: jc-louis
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/51329768?v=4
|
||||
url: https://github.com/jc-louis
|
||||
- login: WilliamDEdwards
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/12184311?u=9b29d5d1d71f5f1a7ef9e439963ad3529e3b33a4&v=4
|
||||
url: https://github.com/WilliamDEdwards
|
||||
- login: bughuntr7
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/236391583?u=7f51ff690e3a5711f845a115903c39e21c8af938&v=4
|
||||
url: https://github.com/bughuntr7
|
||||
- login: jymchng
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/27895426?u=fb88c47775147d62a395fdb895d1af4148c7b566&v=4
|
||||
url: https://github.com/jymchng
|
||||
- login: XieJiSS
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/24671280?u=7ea0d9bfe46cf762594d62fd2f3c6d3813c3584c&v=4
|
||||
url: https://github.com/XieJiSS
|
||||
- login: profatsky
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/92920843?u=81e54bb0b613c171f7cd0ab3cbb58873782c9c9c&v=4
|
||||
url: https://github.com/profatsky
|
||||
one_year_experts:
|
||||
- login: YuriiMotov
|
||||
count: 951
|
||||
count: 647
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4
|
||||
url: https://github.com/YuriiMotov
|
||||
- login: luzzodev
|
||||
count: 53
|
||||
count: 35
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/27291415?u=5607ae1ce75c5f54f09500ca854227f7bfd2033b&v=4
|
||||
url: https://github.com/luzzodev
|
||||
- login: tiangolo
|
||||
count: 31
|
||||
count: 32
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
||||
url: https://github.com/tiangolo
|
||||
- login: valentinDruzhinin
|
||||
count: 30
|
||||
count: 31
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/12831905?u=aae1ebc675c91e8fa582df4fcc4fc4128106344d&v=4
|
||||
url: https://github.com/valentinDruzhinin
|
||||
- login: JavierSanchezCastro
|
||||
count: 18
|
||||
count: 17
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4
|
||||
url: https://github.com/JavierSanchezCastro
|
||||
- login: sachinh35
|
||||
count: 11
|
||||
count: 8
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/21972708?u=8560b97b8b41e175f476270b56de8a493b84f302&v=4
|
||||
url: https://github.com/sachinh35
|
||||
- login: Firatasi
|
||||
count: 7
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/112112161?u=3219914a49a4a604b3626007823db7de049b6d66&v=4
|
||||
url: https://github.com/Firatasi
|
||||
- login: DoctorJohn
|
||||
count: 7
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/14076775?u=ec43fe79a98dbc864b428afc7220753e25ca3af2&v=4
|
||||
url: https://github.com/DoctorJohn
|
||||
- login: svlandeg
|
||||
count: 6
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4
|
||||
url: https://github.com/svlandeg
|
||||
- login: RichieB2B
|
||||
count: 6
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1461970?u=edaa57d1077705244ea5c9244f4783d94ff11f12&v=4
|
||||
url: https://github.com/RichieB2B
|
||||
- login: raceychan
|
||||
count: 6
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/75417963?u=060c62870ec5a791765e63ac20d8885d11143786&v=4
|
||||
@@ -484,10 +524,10 @@ one_year_experts:
|
||||
count: 6
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/37829370?u=da44ca53aefd5c23f346fab8e9fd2e108294c179&v=4
|
||||
url: https://github.com/yinziyan1206
|
||||
- login: Kludex
|
||||
- login: yudin-s
|
||||
count: 5
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4
|
||||
url: https://github.com/Kludex
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/781481?u=8c1ab221edbe051eb55310747ebe39574e808118&v=4
|
||||
url: https://github.com/yudin-s
|
||||
- login: Toygarmetu
|
||||
count: 5
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/92878791?u=538530cb6d5554e71f9c28709d794db9a74d23d9&v=4
|
||||
@@ -496,26 +536,10 @@ one_year_experts:
|
||||
count: 5
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/235213?u=edcce471814a1eba9f0cdaa4cd0de18921a940a6&v=4
|
||||
url: https://github.com/ceb10n
|
||||
- login: RichieB2B
|
||||
count: 5
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1461970?u=edaa57d1077705244ea5c9244f4783d94ff11f12&v=4
|
||||
url: https://github.com/RichieB2B
|
||||
- login: JunjieAraoXiong
|
||||
count: 5
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/167785867?u=b69afe090c8bf5fd73f2d23fc3a887b28f68f192&v=4
|
||||
url: https://github.com/JunjieAraoXiong
|
||||
- login: svlandeg
|
||||
count: 5
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/8796347?u=556c97650c27021911b0b9447ec55e75987b0e8a&v=4
|
||||
url: https://github.com/svlandeg
|
||||
- login: DoctorJohn
|
||||
count: 5
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/14076775?u=ec43fe79a98dbc864b428afc7220753e25ca3af2&v=4
|
||||
url: https://github.com/DoctorJohn
|
||||
- login: alv2017
|
||||
count: 4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4
|
||||
url: https://github.com/alv2017
|
||||
- login: WilliamDEdwards
|
||||
count: 4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/12184311?u=9b29d5d1d71f5f1a7ef9e439963ad3529e3b33a4&v=4
|
||||
@@ -536,10 +560,26 @@ one_year_experts:
|
||||
count: 4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/157279130?u=16d6466476cf7dbc55a4cd575b6ea920ebdd81e1&v=4
|
||||
url: https://github.com/isgin01
|
||||
- login: christiansousadev
|
||||
- login: BitWeaverDev
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/103544118?u=690f3f76d1dc4d0929de5020679d5604f860acbc&v=4
|
||||
url: https://github.com/christiansousadev
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/288751066?v=4
|
||||
url: https://github.com/BitWeaverDev
|
||||
- login: Kludex
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=df8a3f06ba8f55ae1967a3e2d5ed882903a4e330&v=4
|
||||
url: https://github.com/Kludex
|
||||
- login: ericgitangu
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/11472845?u=9d916cf0f5c80e63cb1d753b8b50dcb8ced3b883&v=4
|
||||
url: https://github.com/ericgitangu
|
||||
- login: Zawwarsami16
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/105767627?u=5bb2b7a639a9207a5ded536f963a4c7bd6d04d21&v=4
|
||||
url: https://github.com/Zawwarsami16
|
||||
- login: EmmanuelNiyonshuti
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/142030687?u=ab131d5ad4670280a978f489babe71c9bf9c1097&v=4
|
||||
url: https://github.com/EmmanuelNiyonshuti
|
||||
- login: dolfinus
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/4661021?u=ed5ddadcf36d9b943ebe61febe0b96ee34e5425d&v=4
|
||||
@@ -564,18 +604,54 @@ one_year_experts:
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/210023470?u=c25d66addf36a747bd9fab773c4a6e7b238f45d4&v=4
|
||||
url: https://github.com/Jelle-tenB
|
||||
- login: mg1986jp
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/20254686?u=6da9cdad3ecf8a4f3cbc33a518c3998ed0ac685a&v=4
|
||||
url: https://github.com/mg1986jp
|
||||
- login: sueun-dev
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/57546981?u=0b0483bdcc7d521e85c06f28d2fc64e258bd466f&v=4
|
||||
url: https://github.com/sueun-dev
|
||||
- login: Bogdusik
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/166155258?u=11440b02966a3f5e5eeebc21d67b7bbb7d370487&v=4
|
||||
url: https://github.com/Bogdusik
|
||||
- login: cookesan
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/6601329?u=7bfc9b017198a9fa50929ae8ae0a787632424ffd&v=4
|
||||
url: https://github.com/cookesan
|
||||
- login: coleifer
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/119974?u=b3a546c94ee1105e792e0acad2c4743d800e7975&v=4
|
||||
url: https://github.com/coleifer
|
||||
- login: henrymcl
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/26480299?v=4
|
||||
url: https://github.com/henrymcl
|
||||
- login: Bahtya
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/34988899?u=b8e3c0cf26f4bd1faea265d2f5f66f564af63463&v=4
|
||||
url: https://github.com/Bahtya
|
||||
- login: saitarrun
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/116748905?u=3433afbaf06676a482ebf4ba33b08ddb3fc5c5bf&v=4
|
||||
url: https://github.com/saitarrun
|
||||
- login: cepedus
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/26345924?u=38495abbdbb8695dd76478cae5963bf994c498bc&v=4
|
||||
url: https://github.com/cepedus
|
||||
- login: christiansousadev
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/103544118?u=690f3f76d1dc4d0929de5020679d5604f860acbc&v=4
|
||||
url: https://github.com/christiansousadev
|
||||
- login: gaardhus
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/46934916?u=18d7aacc6ce59f054749209645d11cfe77b52f90&v=4
|
||||
url: https://github.com/gaardhus
|
||||
- login: y2kbugger
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/6101677?u=1d50077e29582dc01fcbdff846f04fe7ec73fe2e&v=4
|
||||
url: https://github.com/y2kbugger
|
||||
- login: Vision-Executive
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/259394686?u=dd28bbc246e4e2cd2adb1d497e7b7585b5d24585&v=4
|
||||
url: https://github.com/Vision-Executive
|
||||
- login: Garrett-R
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/6614695?u=c128fd775002882f6e391bda5a89d1bdc5bdf45f&v=4
|
||||
@@ -584,10 +660,6 @@ one_year_experts:
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/17792131?u=372b27056ec82f1ae03d8b3f37ef55b04a7cfdd1&v=4
|
||||
url: https://github.com/TaigoFr
|
||||
- login: EmmanuelNiyonshuti
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/142030687?u=ab131d5ad4670280a978f489babe71c9bf9c1097&v=4
|
||||
url: https://github.com/EmmanuelNiyonshuti
|
||||
- login: stan-dot
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/56644812?u=a7dd773084f1c17c5f05019cc25a984e24873691&v=4
|
||||
@@ -612,10 +684,6 @@ one_year_experts:
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1070878?u=68f78a891c9751dd87571ac712a6309090c4bc01&v=4
|
||||
url: https://github.com/kiranzo
|
||||
- login: sinisaos
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/30960668?v=4
|
||||
url: https://github.com/sinisaos
|
||||
- login: dotmitsu
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/42657211?u=3bccc9a2f386a3f24230ec393080f8904fe2a5b2&v=4
|
||||
@@ -624,10 +692,6 @@ one_year_experts:
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/80290187?u=2b72e497ca4444ecec1f9dc2d1b8d5437a27b83f&v=4
|
||||
url: https://github.com/Brikas
|
||||
- login: BloodyRain2k
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1014362?v=4
|
||||
url: https://github.com/BloodyRain2k
|
||||
- login: usiqwerty
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/37992525?u=0c6e91d7b3887aa558755f4225ce74a003cbe852&v=4
|
||||
@@ -636,10 +700,6 @@ one_year_experts:
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/532192?v=4
|
||||
url: https://github.com/skion
|
||||
- login: Danstiv
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/50794055?v=4
|
||||
url: https://github.com/Danstiv
|
||||
- login: florentx
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/142113?u=bf10f10080026346b092633c380977b61cee0d9c&v=4
|
||||
@@ -656,35 +716,3 @@ one_year_experts:
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/7587353?v=4
|
||||
url: https://github.com/purepani
|
||||
- login: asmaier
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/3169297?v=4
|
||||
url: https://github.com/asmaier
|
||||
- login: henrymcl
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/26480299?v=4
|
||||
url: https://github.com/henrymcl
|
||||
- login: davidhuser
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/4357648?u=6ed702f8f6d49a8b2a0ed33cbd8ab59c2d7db7f7&v=4
|
||||
url: https://github.com/davidhuser
|
||||
- login: XieJiSS
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/24671280?u=7ea0d9bfe46cf762594d62fd2f3c6d3813c3584c&v=4
|
||||
url: https://github.com/XieJiSS
|
||||
- login: profatsky
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/92920843?u=81e54bb0b613c171f7cd0ab3cbb58873782c9c9c&v=4
|
||||
url: https://github.com/profatsky
|
||||
- login: pythonweb2
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/32141163?v=4
|
||||
url: https://github.com/pythonweb2
|
||||
- login: PidgeyBE
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/19860056?u=47b584eb1c1ab45e31c1b474109a962d7e82be49&v=4
|
||||
url: https://github.com/PidgeyBE
|
||||
- login: KianAnbarestani
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/145364424?u=dcc3d8fb4ca07d36fb52a17f38b6650565de40be&v=4
|
||||
url: https://github.com/KianAnbarestani
|
||||
|
||||
@@ -12,9 +12,6 @@ gold:
|
||||
- url: https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge
|
||||
title: Auth, user management and more for your B2B product
|
||||
img: https://fastapi.tiangolo.com/img/sponsors/propelauth.png
|
||||
- url: https://zuplo.link/fastapi-gh
|
||||
title: 'Zuplo: Deploy, Secure, Document, and Monetize your FastAPI'
|
||||
img: https://fastapi.tiangolo.com/img/sponsors/zuplo.png
|
||||
- url: https://liblab.com?utm_source=fastapi
|
||||
title: liblab - Generate SDKs from FastAPI
|
||||
img: https://fastapi.tiangolo.com/img/sponsors/liblab.png
|
||||
@@ -40,9 +37,6 @@ silver:
|
||||
- url: https://databento.com/?utm_source=fastapi&utm_medium=sponsor&utm_content=display
|
||||
title: Pay as you go for market data
|
||||
img: https://fastapi.tiangolo.com/img/sponsors/databento.svg
|
||||
- url: https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship
|
||||
title: SDKs for your API | Speakeasy
|
||||
img: https://fastapi.tiangolo.com/img/sponsors/speakeasy.png
|
||||
- url: https://www.svix.com/
|
||||
title: Svix - Webhooks as a service
|
||||
img: https://fastapi.tiangolo.com/img/sponsors/svix.svg
|
||||
@@ -58,6 +52,12 @@ silver:
|
||||
- url: https://dribia.com/en/
|
||||
title: Dribia - Data Science within your reach
|
||||
img: https://fastapi.tiangolo.com/img/sponsors/dribia.png
|
||||
- url: https://talordata.com/?campaignid=oh5dVZ3Zc3YGiAI2&utm_source=fastapi&utm_term=fastapi
|
||||
title: TalorData SERP API - Multi-Engine Search Results Data
|
||||
img: https://fastapi.tiangolo.com/img/sponsors/talordata.png
|
||||
- url: https://www.rapidproxy.io/?ref=fastapi
|
||||
title: Try RapidProxy for free - Residential Proxies with 90M+ Global IPs. Starting from $0.65/GB for web scraping, automation, and data collection.
|
||||
img: https://fastapi.tiangolo.com/img/sponsors/rapidproxy.png
|
||||
bronze:
|
||||
- url: https://www.exoflare.com/open-source/?utm_source=FastAPI&utm_campaign=open_source
|
||||
title: Biosecurity risk assessments made easy.
|
||||
@@ -65,6 +65,3 @@ bronze:
|
||||
# - url: https://testdriven.io/courses/tdd-fastapi/
|
||||
# title: Learn to build high-quality web apps with best practices
|
||||
# img: https://fastapi.tiangolo.com/img/sponsors/testdriven.svg
|
||||
- url: https://www.testmu.ai/?utm_source=fastapi&utm_medium=partner&utm_campaign=sponsor&utm_term=opensource&utm_content=webpage
|
||||
title: TestMu AI. The Native AI-Agentic Cloud Platform to Supercharge Quality Engineering.
|
||||
img: https://fastapi.tiangolo.com/img/sponsors/testmu.png
|
||||
|
||||
@@ -48,3 +48,4 @@ logins:
|
||||
- subtotal
|
||||
- requestly
|
||||
- greptileai
|
||||
- talorelowen
|
||||
|
||||
@@ -1,495 +1,495 @@
|
||||
- name: full-stack-fastapi-template
|
||||
html_url: https://github.com/fastapi/full-stack-fastapi-template
|
||||
stars: 42397
|
||||
stars: 43447
|
||||
owner_login: fastapi
|
||||
owner_html_url: https://github.com/fastapi
|
||||
- name: Hello-Python
|
||||
html_url: https://github.com/mouredev/Hello-Python
|
||||
stars: 34997
|
||||
stars: 35831
|
||||
owner_login: mouredev
|
||||
owner_html_url: https://github.com/mouredev
|
||||
- name: serve
|
||||
html_url: https://github.com/jina-ai/serve
|
||||
stars: 21857
|
||||
stars: 21864
|
||||
owner_login: jina-ai
|
||||
owner_html_url: https://github.com/jina-ai
|
||||
- name: HivisionIDPhotos
|
||||
html_url: https://github.com/Zeyi-Lin/HivisionIDPhotos
|
||||
stars: 20868
|
||||
stars: 21144
|
||||
owner_login: Zeyi-Lin
|
||||
owner_html_url: https://github.com/Zeyi-Lin
|
||||
- name: Douyin_TikTok_Download_API
|
||||
html_url: https://github.com/Evil0ctal/Douyin_TikTok_Download_API
|
||||
stars: 18122
|
||||
owner_login: Evil0ctal
|
||||
owner_html_url: https://github.com/Evil0ctal
|
||||
- name: sqlmodel
|
||||
html_url: https://github.com/fastapi/sqlmodel
|
||||
stars: 17770
|
||||
stars: 17987
|
||||
owner_login: fastapi
|
||||
owner_html_url: https://github.com/fastapi
|
||||
- name: fastapi-best-practices
|
||||
html_url: https://github.com/zhanymkanov/fastapi-best-practices
|
||||
stars: 16897
|
||||
stars: 17401
|
||||
owner_login: zhanymkanov
|
||||
owner_html_url: https://github.com/zhanymkanov
|
||||
- name: Douyin_TikTok_Download_API
|
||||
html_url: https://github.com/Evil0ctal/Douyin_TikTok_Download_API
|
||||
stars: 16878
|
||||
owner_login: Evil0ctal
|
||||
owner_html_url: https://github.com/Evil0ctal
|
||||
- name: SurfSense
|
||||
html_url: https://github.com/MODSetter/SurfSense
|
||||
stars: 13614
|
||||
stars: 14374
|
||||
owner_login: MODSetter
|
||||
owner_html_url: https://github.com/MODSetter
|
||||
- name: machine-learning-zoomcamp
|
||||
html_url: https://github.com/DataTalksClub/machine-learning-zoomcamp
|
||||
stars: 12780
|
||||
stars: 13169
|
||||
owner_login: DataTalksClub
|
||||
owner_html_url: https://github.com/DataTalksClub
|
||||
- name: fastapi_mcp
|
||||
html_url: https://github.com/tadata-org/fastapi_mcp
|
||||
stars: 11752
|
||||
stars: 11885
|
||||
owner_login: tadata-org
|
||||
owner_html_url: https://github.com/tadata-org
|
||||
- name: awesome-fastapi
|
||||
html_url: https://github.com/mjhea0/awesome-fastapi
|
||||
stars: 11203
|
||||
stars: 11406
|
||||
owner_login: mjhea0
|
||||
owner_html_url: https://github.com/mjhea0
|
||||
- name: XHS-Downloader
|
||||
html_url: https://github.com/JoeanAmier/XHS-Downloader
|
||||
stars: 10612
|
||||
stars: 11375
|
||||
owner_login: JoeanAmier
|
||||
owner_html_url: https://github.com/JoeanAmier
|
||||
- name: polar
|
||||
html_url: https://github.com/polarsource/polar
|
||||
stars: 9626
|
||||
stars: 9894
|
||||
owner_login: polarsource
|
||||
owner_html_url: https://github.com/polarsource
|
||||
- name: pycaret
|
||||
html_url: https://github.com/pycaret/pycaret
|
||||
stars: 9801
|
||||
owner_login: pycaret
|
||||
owner_html_url: https://github.com/pycaret
|
||||
- name: FastUI
|
||||
html_url: https://github.com/pydantic/FastUI
|
||||
stars: 8958
|
||||
stars: 8966
|
||||
owner_login: pydantic
|
||||
owner_html_url: https://github.com/pydantic
|
||||
- name: FileCodeBox
|
||||
html_url: https://github.com/vastsa/FileCodeBox
|
||||
stars: 8191
|
||||
stars: 8305
|
||||
owner_login: vastsa
|
||||
owner_html_url: https://github.com/vastsa
|
||||
- name: nonebot2
|
||||
html_url: https://github.com/nonebot/nonebot2
|
||||
stars: 7456
|
||||
stars: 7544
|
||||
owner_login: nonebot
|
||||
owner_html_url: https://github.com/nonebot
|
||||
- name: hatchet
|
||||
html_url: https://github.com/hatchet-dev/hatchet
|
||||
stars: 6784
|
||||
stars: 7258
|
||||
owner_login: hatchet-dev
|
||||
owner_html_url: https://github.com/hatchet-dev
|
||||
- name: fastapi-users
|
||||
html_url: https://github.com/fastapi-users/fastapi-users
|
||||
stars: 6064
|
||||
stars: 6152
|
||||
owner_login: fastapi-users
|
||||
owner_html_url: https://github.com/fastapi-users
|
||||
- name: serge
|
||||
html_url: https://github.com/serge-chat/serge
|
||||
stars: 5738
|
||||
stars: 5726
|
||||
owner_login: serge-chat
|
||||
owner_html_url: https://github.com/serge-chat
|
||||
- name: Yuxi
|
||||
html_url: https://github.com/xerrors/Yuxi
|
||||
stars: 4761
|
||||
stars: 5323
|
||||
owner_login: xerrors
|
||||
owner_html_url: https://github.com/xerrors
|
||||
- name: Kokoro-FastAPI
|
||||
html_url: https://github.com/remsky/Kokoro-FastAPI
|
||||
stars: 4649
|
||||
stars: 4936
|
||||
owner_login: remsky
|
||||
owner_html_url: https://github.com/remsky
|
||||
- name: strawberry
|
||||
html_url: https://github.com/strawberry-graphql/strawberry
|
||||
stars: 4636
|
||||
owner_login: strawberry-graphql
|
||||
owner_html_url: https://github.com/strawberry-graphql
|
||||
- name: devpush
|
||||
html_url: https://github.com/hunvreus/devpush
|
||||
stars: 4589
|
||||
stars: 4664
|
||||
owner_login: hunvreus
|
||||
owner_html_url: https://github.com/hunvreus
|
||||
- name: strawberry
|
||||
html_url: https://github.com/strawberry-graphql/strawberry
|
||||
stars: 4663
|
||||
owner_login: strawberry-graphql
|
||||
owner_html_url: https://github.com/strawberry-graphql
|
||||
- name: honcho
|
||||
html_url: https://github.com/plastic-labs/honcho
|
||||
stars: 4606
|
||||
owner_login: plastic-labs
|
||||
owner_html_url: https://github.com/plastic-labs
|
||||
- name: poem
|
||||
html_url: https://github.com/poem-web/poem
|
||||
stars: 4375
|
||||
stars: 4398
|
||||
owner_login: poem-web
|
||||
owner_html_url: https://github.com/poem-web
|
||||
- name: dynaconf
|
||||
html_url: https://github.com/dynaconf/dynaconf
|
||||
stars: 4276
|
||||
stars: 4302
|
||||
owner_login: dynaconf
|
||||
owner_html_url: https://github.com/dynaconf
|
||||
- name: chatgpt-web-share
|
||||
html_url: https://github.com/chatpire/chatgpt-web-share
|
||||
stars: 4272
|
||||
owner_login: chatpire
|
||||
owner_html_url: https://github.com/chatpire
|
||||
- name: logfire
|
||||
html_url: https://github.com/pydantic/logfire
|
||||
stars: 4145
|
||||
stars: 4276
|
||||
owner_login: pydantic
|
||||
owner_html_url: https://github.com/pydantic
|
||||
- name: atrilabs-engine
|
||||
html_url: https://github.com/Atri-Labs/atrilabs-engine
|
||||
stars: 4086
|
||||
owner_login: Atri-Labs
|
||||
owner_html_url: https://github.com/Atri-Labs
|
||||
- name: chatgpt-web-share
|
||||
html_url: https://github.com/chatpire/chatgpt-web-share
|
||||
stars: 4273
|
||||
owner_login: chatpire
|
||||
owner_html_url: https://github.com/chatpire
|
||||
- name: huma
|
||||
html_url: https://github.com/danielgtaylor/huma
|
||||
stars: 3933
|
||||
stars: 4133
|
||||
owner_login: danielgtaylor
|
||||
owner_html_url: https://github.com/danielgtaylor
|
||||
- name: LitServe
|
||||
html_url: https://github.com/Lightning-AI/LitServe
|
||||
stars: 3851
|
||||
owner_login: Lightning-AI
|
||||
owner_html_url: https://github.com/Lightning-AI
|
||||
- name: atrilabs-engine
|
||||
html_url: https://github.com/Atri-Labs/atrilabs-engine
|
||||
stars: 4073
|
||||
owner_login: Atri-Labs
|
||||
owner_html_url: https://github.com/Atri-Labs
|
||||
- name: datamodel-code-generator
|
||||
html_url: https://github.com/koxudaxi/datamodel-code-generator
|
||||
stars: 3839
|
||||
stars: 3918
|
||||
owner_login: koxudaxi
|
||||
owner_html_url: https://github.com/koxudaxi
|
||||
- name: LitServe
|
||||
html_url: https://github.com/Lightning-AI/LitServe
|
||||
stars: 3886
|
||||
owner_login: Lightning-AI
|
||||
owner_html_url: https://github.com/Lightning-AI
|
||||
- name: mcp-context-forge
|
||||
html_url: https://github.com/IBM/mcp-context-forge
|
||||
stars: 3797
|
||||
owner_login: IBM
|
||||
owner_html_url: https://github.com/IBM
|
||||
- name: fastapi-admin
|
||||
html_url: https://github.com/fastapi-admin/fastapi-admin
|
||||
stars: 3745
|
||||
stars: 3784
|
||||
owner_login: fastapi-admin
|
||||
owner_html_url: https://github.com/fastapi-admin
|
||||
- name: headroom
|
||||
html_url: https://github.com/chopratejas/headroom
|
||||
stars: 3701
|
||||
owner_login: chopratejas
|
||||
owner_html_url: https://github.com/chopratejas
|
||||
- name: tracecat
|
||||
html_url: https://github.com/TracecatHQ/tracecat
|
||||
stars: 3542
|
||||
stars: 3624
|
||||
owner_login: TracecatHQ
|
||||
owner_html_url: https://github.com/TracecatHQ
|
||||
- name: farfalle
|
||||
html_url: https://github.com/rashadphz/farfalle
|
||||
stars: 3521
|
||||
stars: 3535
|
||||
owner_login: rashadphz
|
||||
owner_html_url: https://github.com/rashadphz
|
||||
- name: mcp-context-forge
|
||||
html_url: https://github.com/IBM/mcp-context-forge
|
||||
stars: 3501
|
||||
owner_login: IBM
|
||||
owner_html_url: https://github.com/IBM
|
||||
- name: opyrator
|
||||
html_url: https://github.com/ml-tooling/opyrator
|
||||
stars: 3137
|
||||
stars: 3136
|
||||
owner_login: ml-tooling
|
||||
owner_html_url: https://github.com/ml-tooling
|
||||
- name: docarray
|
||||
html_url: https://github.com/docarray/docarray
|
||||
stars: 3120
|
||||
stars: 3119
|
||||
owner_login: docarray
|
||||
owner_html_url: https://github.com/docarray
|
||||
- name: fastapi-realworld-example-app
|
||||
html_url: https://github.com/nsidnev/fastapi-realworld-example-app
|
||||
stars: 3092
|
||||
stars: 3110
|
||||
owner_login: nsidnev
|
||||
owner_html_url: https://github.com/nsidnev
|
||||
- name: uvicorn-gunicorn-fastapi-docker
|
||||
html_url: https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker
|
||||
stars: 2913
|
||||
stars: 2910
|
||||
owner_login: tiangolo
|
||||
owner_html_url: https://github.com/tiangolo
|
||||
- name: FastAPI-template
|
||||
html_url: https://github.com/s3rius/FastAPI-template
|
||||
stars: 2768
|
||||
stars: 2800
|
||||
owner_login: s3rius
|
||||
owner_html_url: https://github.com/s3rius
|
||||
- name: best-of-web-python
|
||||
html_url: https://github.com/ml-tooling/best-of-web-python
|
||||
stars: 2703
|
||||
owner_login: ml-tooling
|
||||
owner_html_url: https://github.com/ml-tooling
|
||||
- name: sqladmin
|
||||
html_url: https://github.com/smithyhq/sqladmin
|
||||
stars: 2696
|
||||
owner_login: smithyhq
|
||||
owner_html_url: https://github.com/smithyhq
|
||||
- name: YC-Killer
|
||||
html_url: https://github.com/sahibzada-allahyar/YC-Killer
|
||||
stars: 2675
|
||||
stars: 2770
|
||||
owner_login: sahibzada-allahyar
|
||||
owner_html_url: https://github.com/sahibzada-allahyar
|
||||
- name: sqladmin
|
||||
html_url: https://github.com/smithyhq/sqladmin
|
||||
stars: 2739
|
||||
owner_login: smithyhq
|
||||
owner_html_url: https://github.com/smithyhq
|
||||
- name: best-of-web-python
|
||||
html_url: https://github.com/ml-tooling/best-of-web-python
|
||||
stars: 2723
|
||||
owner_login: ml-tooling
|
||||
owner_html_url: https://github.com/ml-tooling
|
||||
- name: Rapid-MLX
|
||||
html_url: https://github.com/raullenchai/Rapid-MLX
|
||||
stars: 2640
|
||||
owner_login: raullenchai
|
||||
owner_html_url: https://github.com/raullenchai
|
||||
- name: fastapi-react
|
||||
html_url: https://github.com/Buuntu/fastapi-react
|
||||
stars: 2579
|
||||
stars: 2588
|
||||
owner_login: Buuntu
|
||||
owner_html_url: https://github.com/Buuntu
|
||||
- name: supabase-py
|
||||
html_url: https://github.com/supabase/supabase-py
|
||||
stars: 2486
|
||||
owner_login: supabase
|
||||
owner_html_url: https://github.com/supabase
|
||||
- name: RasaGPT
|
||||
html_url: https://github.com/paulpierre/RasaGPT
|
||||
stars: 2462
|
||||
owner_login: paulpierre
|
||||
owner_html_url: https://github.com/paulpierre
|
||||
- name: 30-Days-of-Python
|
||||
html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python
|
||||
stars: 2450
|
||||
owner_login: codingforentrepreneurs
|
||||
owner_html_url: https://github.com/codingforentrepreneurs
|
||||
- name: any-auto-register
|
||||
html_url: https://github.com/lxf746/any-auto-register
|
||||
stars: 2542
|
||||
owner_login: lxf746
|
||||
owner_html_url: https://github.com/lxf746
|
||||
- name: NoteDiscovery
|
||||
html_url: https://github.com/gamosoft/NoteDiscovery
|
||||
stars: 2400
|
||||
stars: 2531
|
||||
owner_login: gamosoft
|
||||
owner_html_url: https://github.com/gamosoft
|
||||
- name: nextpy
|
||||
html_url: https://github.com/dot-agent/nextpy
|
||||
stars: 2339
|
||||
owner_login: dot-agent
|
||||
owner_html_url: https://github.com/dot-agent
|
||||
- name: fastapi-utils
|
||||
html_url: https://github.com/fastapiutils/fastapi-utils
|
||||
stars: 2308
|
||||
owner_login: fastapiutils
|
||||
owner_html_url: https://github.com/fastapiutils
|
||||
- name: langserve
|
||||
html_url: https://github.com/langchain-ai/langserve
|
||||
stars: 2300
|
||||
owner_login: langchain-ai
|
||||
owner_html_url: https://github.com/langchain-ai
|
||||
- name: solara
|
||||
html_url: https://github.com/widgetti/solara
|
||||
stars: 2156
|
||||
owner_login: widgetti
|
||||
owner_html_url: https://github.com/widgetti
|
||||
- name: fastapi-best-architecture
|
||||
html_url: https://github.com/fastapi-practices/fastapi-best-architecture
|
||||
stars: 2148
|
||||
owner_login: fastapi-practices
|
||||
owner_html_url: https://github.com/fastapi-practices
|
||||
- name: supabase-py
|
||||
html_url: https://github.com/supabase/supabase-py
|
||||
stars: 2518
|
||||
owner_login: supabase
|
||||
owner_html_url: https://github.com/supabase
|
||||
- name: 30-Days-of-Python
|
||||
html_url: https://github.com/codingforentrepreneurs/30-Days-of-Python
|
||||
stars: 2470
|
||||
owner_login: codingforentrepreneurs
|
||||
owner_html_url: https://github.com/codingforentrepreneurs
|
||||
- name: RasaGPT
|
||||
html_url: https://github.com/paulpierre/RasaGPT
|
||||
stars: 2466
|
||||
owner_login: paulpierre
|
||||
owner_html_url: https://github.com/paulpierre
|
||||
- name: AIstudioProxyAPI
|
||||
html_url: https://github.com/CJackHwang/AIstudioProxyAPI
|
||||
stars: 2396
|
||||
owner_login: CJackHwang
|
||||
owner_html_url: https://github.com/CJackHwang
|
||||
- name: fastapi-langgraph-agent-production-ready-template
|
||||
html_url: https://github.com/wassim249/fastapi-langgraph-agent-production-ready-template
|
||||
stars: 2103
|
||||
stars: 2338
|
||||
owner_login: wassim249
|
||||
owner_html_url: https://github.com/wassim249
|
||||
- name: mangum
|
||||
html_url: https://github.com/Kludex/mangum
|
||||
stars: 2100
|
||||
owner_login: Kludex
|
||||
owner_html_url: https://github.com/Kludex
|
||||
- name: nextpy
|
||||
html_url: https://github.com/dot-agent/nextpy
|
||||
stars: 2336
|
||||
owner_login: dot-agent
|
||||
owner_html_url: https://github.com/dot-agent
|
||||
- name: langserve
|
||||
html_url: https://github.com/langchain-ai/langserve
|
||||
stars: 2330
|
||||
owner_login: langchain-ai
|
||||
owner_html_url: https://github.com/langchain-ai
|
||||
- name: fastapi-utils
|
||||
html_url: https://github.com/fastapiutils/fastapi-utils
|
||||
stars: 2310
|
||||
owner_login: fastapiutils
|
||||
owner_html_url: https://github.com/fastapiutils
|
||||
- name: fastapi-best-architecture
|
||||
html_url: https://github.com/fastapi-practices/fastapi-best-architecture
|
||||
stars: 2256
|
||||
owner_login: fastapi-practices
|
||||
owner_html_url: https://github.com/fastapi-practices
|
||||
- name: solara
|
||||
html_url: https://github.com/widgetti/solara
|
||||
stars: 2162
|
||||
owner_login: widgetti
|
||||
owner_html_url: https://github.com/widgetti
|
||||
- name: vue-fastapi-admin
|
||||
html_url: https://github.com/mizhexiaoxiao/vue-fastapi-admin
|
||||
stars: 2059
|
||||
stars: 2148
|
||||
owner_login: mizhexiaoxiao
|
||||
owner_html_url: https://github.com/mizhexiaoxiao
|
||||
- name: agentkit
|
||||
html_url: https://github.com/BCG-X-Official/agentkit
|
||||
stars: 1947
|
||||
owner_login: BCG-X-Official
|
||||
owner_html_url: https://github.com/BCG-X-Official
|
||||
- name: mangum
|
||||
html_url: https://github.com/Kludex/mangum
|
||||
stars: 2119
|
||||
owner_login: Kludex
|
||||
owner_html_url: https://github.com/Kludex
|
||||
- name: slowapi
|
||||
html_url: https://github.com/laurentS/slowapi
|
||||
stars: 1946
|
||||
stars: 2000
|
||||
owner_login: laurentS
|
||||
owner_html_url: https://github.com/laurentS
|
||||
- name: openapi-python-client
|
||||
html_url: https://github.com/openapi-generators/openapi-python-client
|
||||
stars: 1930
|
||||
owner_login: openapi-generators
|
||||
owner_html_url: https://github.com/openapi-generators
|
||||
- name: xhs_ai_publisher
|
||||
html_url: https://github.com/BetaStreetOmnis/xhs_ai_publisher
|
||||
stars: 1904
|
||||
stars: 1980
|
||||
owner_login: BetaStreetOmnis
|
||||
owner_html_url: https://github.com/BetaStreetOmnis
|
||||
- name: manage-fastapi
|
||||
html_url: https://github.com/ycd/manage-fastapi
|
||||
stars: 1898
|
||||
owner_login: ycd
|
||||
owner_html_url: https://github.com/ycd
|
||||
- name: piccolo
|
||||
html_url: https://github.com/piccolo-orm/piccolo
|
||||
stars: 1876
|
||||
owner_login: piccolo-orm
|
||||
owner_html_url: https://github.com/piccolo-orm
|
||||
- name: openapi-python-client
|
||||
html_url: https://github.com/openapi-generators/openapi-python-client
|
||||
stars: 1960
|
||||
owner_login: openapi-generators
|
||||
owner_html_url: https://github.com/openapi-generators
|
||||
- name: agentkit
|
||||
html_url: https://github.com/BCG-X-Official/agentkit
|
||||
stars: 1944
|
||||
owner_login: BCG-X-Official
|
||||
owner_html_url: https://github.com/BCG-X-Official
|
||||
- name: FastAPI-boilerplate
|
||||
html_url: https://github.com/benavlabs/FastAPI-boilerplate
|
||||
stars: 1859
|
||||
stars: 1931
|
||||
owner_login: benavlabs
|
||||
owner_html_url: https://github.com/benavlabs
|
||||
- name: piccolo
|
||||
html_url: https://github.com/piccolo-orm/piccolo
|
||||
stars: 1904
|
||||
owner_login: piccolo-orm
|
||||
owner_html_url: https://github.com/piccolo-orm
|
||||
- name: manage-fastapi
|
||||
html_url: https://github.com/ycd/manage-fastapi
|
||||
stars: 1903
|
||||
owner_login: ycd
|
||||
owner_html_url: https://github.com/ycd
|
||||
- name: fastapi-cache
|
||||
html_url: https://github.com/long2ice/fastapi-cache
|
||||
stars: 1853
|
||||
stars: 1865
|
||||
owner_login: long2ice
|
||||
owner_html_url: https://github.com/long2ice
|
||||
- name: python-week-2022
|
||||
html_url: https://github.com/rochacbruno/python-week-2022
|
||||
stars: 1809
|
||||
owner_login: rochacbruno
|
||||
owner_html_url: https://github.com/rochacbruno
|
||||
- name: kiro-gateway
|
||||
html_url: https://github.com/jwadow/kiro-gateway
|
||||
stars: 1853
|
||||
owner_login: jwadow
|
||||
owner_html_url: https://github.com/jwadow
|
||||
- name: ormar
|
||||
html_url: https://github.com/ormar-orm/ormar
|
||||
stars: 1808
|
||||
stars: 1809
|
||||
owner_login: ormar-orm
|
||||
owner_html_url: https://github.com/ormar-orm
|
||||
- name: python-week-2022
|
||||
html_url: https://github.com/rochacbruno/python-week-2022
|
||||
stars: 1806
|
||||
owner_login: rochacbruno
|
||||
owner_html_url: https://github.com/rochacbruno
|
||||
- name: open-wearables
|
||||
html_url: https://github.com/the-momentum/open-wearables
|
||||
stars: 1782
|
||||
owner_login: the-momentum
|
||||
owner_html_url: https://github.com/the-momentum
|
||||
- name: termpair
|
||||
html_url: https://github.com/cs01/termpair
|
||||
stars: 1730
|
||||
stars: 1735
|
||||
owner_login: cs01
|
||||
owner_html_url: https://github.com/cs01
|
||||
- name: WebRPA
|
||||
html_url: https://github.com/pmh1314520/WebRPA
|
||||
stars: 1718
|
||||
owner_login: pmh1314520
|
||||
owner_html_url: https://github.com/pmh1314520
|
||||
- name: codex-lb
|
||||
html_url: https://github.com/Soju06/codex-lb
|
||||
stars: 1709
|
||||
owner_login: Soju06
|
||||
owner_html_url: https://github.com/Soju06
|
||||
- name: fastapi-crudrouter
|
||||
html_url: https://github.com/awtkns/fastapi-crudrouter
|
||||
stars: 1683
|
||||
stars: 1692
|
||||
owner_login: awtkns
|
||||
owner_html_url: https://github.com/awtkns
|
||||
- name: fastapi-pagination
|
||||
html_url: https://github.com/uriyyo/fastapi-pagination
|
||||
stars: 1638
|
||||
owner_login: uriyyo
|
||||
owner_html_url: https://github.com/uriyyo
|
||||
- name: bracket
|
||||
html_url: https://github.com/evroon/bracket
|
||||
stars: 1638
|
||||
stars: 1682
|
||||
owner_login: evroon
|
||||
owner_html_url: https://github.com/evroon
|
||||
- name: fastapi-pagination
|
||||
html_url: https://github.com/uriyyo/fastapi-pagination
|
||||
stars: 1658
|
||||
owner_login: uriyyo
|
||||
owner_html_url: https://github.com/uriyyo
|
||||
- name: langchain-serve
|
||||
html_url: https://github.com/jina-ai/langchain-serve
|
||||
stars: 1634
|
||||
stars: 1640
|
||||
owner_login: jina-ai
|
||||
owner_html_url: https://github.com/jina-ai
|
||||
- name: awesome-fastapi-projects
|
||||
html_url: https://github.com/Kludex/awesome-fastapi-projects
|
||||
stars: 1597
|
||||
stars: 1603
|
||||
owner_login: Kludex
|
||||
owner_html_url: https://github.com/Kludex
|
||||
- name: coronavirus-tracker-api
|
||||
html_url: https://github.com/ExpDev07/coronavirus-tracker-api
|
||||
stars: 1568
|
||||
stars: 1567
|
||||
owner_login: ExpDev07
|
||||
owner_html_url: https://github.com/ExpDev07
|
||||
- name: WebRPA
|
||||
html_url: https://github.com/pmh1314520/WebRPA
|
||||
stars: 1532
|
||||
owner_login: pmh1314520
|
||||
owner_html_url: https://github.com/pmh1314520
|
||||
- name: fastapi-amis-admin
|
||||
html_url: https://github.com/amisadmin/fastapi-amis-admin
|
||||
stars: 1527
|
||||
stars: 1554
|
||||
owner_login: amisadmin
|
||||
owner_html_url: https://github.com/amisadmin
|
||||
- name: fastcrud
|
||||
html_url: https://github.com/benavlabs/fastcrud
|
||||
stars: 1506
|
||||
stars: 1519
|
||||
owner_login: benavlabs
|
||||
owner_html_url: https://github.com/benavlabs
|
||||
- name: fastapi-boilerplate
|
||||
html_url: https://github.com/teamhide/fastapi-boilerplate
|
||||
stars: 1482
|
||||
owner_login: teamhide
|
||||
owner_html_url: https://github.com/teamhide
|
||||
- name: awesome-python-resources
|
||||
html_url: https://github.com/DjangoEx/awesome-python-resources
|
||||
stars: 1444
|
||||
owner_login: DjangoEx
|
||||
owner_html_url: https://github.com/DjangoEx
|
||||
- name: prometheus-fastapi-instrumentator
|
||||
html_url: https://github.com/trallnag/prometheus-fastapi-instrumentator
|
||||
stars: 1438
|
||||
owner_login: trallnag
|
||||
owner_html_url: https://github.com/trallnag
|
||||
- name: honcho
|
||||
html_url: https://github.com/plastic-labs/honcho
|
||||
stars: 1419
|
||||
owner_login: plastic-labs
|
||||
owner_html_url: https://github.com/plastic-labs
|
||||
- name: tavily-key-generator
|
||||
html_url: https://github.com/skernelx/tavily-key-generator
|
||||
stars: 1416
|
||||
stars: 1507
|
||||
owner_login: skernelx
|
||||
owner_html_url: https://github.com/skernelx
|
||||
- name: fastapi-boilerplate
|
||||
html_url: https://github.com/teamhide/fastapi-boilerplate
|
||||
stars: 1490
|
||||
owner_login: teamhide
|
||||
owner_html_url: https://github.com/teamhide
|
||||
- name: prometheus-fastapi-instrumentator
|
||||
html_url: https://github.com/trallnag/prometheus-fastapi-instrumentator
|
||||
stars: 1458
|
||||
owner_login: trallnag
|
||||
owner_html_url: https://github.com/trallnag
|
||||
- name: awesome-python-resources
|
||||
html_url: https://github.com/DjangoEx/awesome-python-resources
|
||||
stars: 1448
|
||||
owner_login: DjangoEx
|
||||
owner_html_url: https://github.com/DjangoEx
|
||||
- name: fastapi-tutorial
|
||||
html_url: https://github.com/liaogx/fastapi-tutorial
|
||||
stars: 1384
|
||||
stars: 1404
|
||||
owner_login: liaogx
|
||||
owner_html_url: https://github.com/liaogx
|
||||
- name: fastapi-code-generator
|
||||
html_url: https://github.com/koxudaxi/fastapi-code-generator
|
||||
stars: 1384
|
||||
stars: 1397
|
||||
owner_login: koxudaxi
|
||||
owner_html_url: https://github.com/koxudaxi
|
||||
- name: budgetml
|
||||
html_url: https://github.com/ebhy/budgetml
|
||||
stars: 1346
|
||||
owner_login: ebhy
|
||||
owner_html_url: https://github.com/ebhy
|
||||
- name: bolt-python
|
||||
html_url: https://github.com/slackapi/bolt-python
|
||||
stars: 1286
|
||||
owner_login: slackapi
|
||||
owner_html_url: https://github.com/slackapi
|
||||
- name: aktools
|
||||
html_url: https://github.com/akfamily/aktools
|
||||
stars: 1283
|
||||
stars: 1394
|
||||
owner_login: akfamily
|
||||
owner_html_url: https://github.com/akfamily
|
||||
- name: bedrock-chat
|
||||
html_url: https://github.com/aws-samples/bedrock-chat
|
||||
stars: 1282
|
||||
owner_login: aws-samples
|
||||
owner_html_url: https://github.com/aws-samples
|
||||
- name: fastapi-scaff
|
||||
html_url: https://github.com/atpuxiner/fastapi-scaff
|
||||
stars: 1275
|
||||
owner_login: atpuxiner
|
||||
owner_html_url: https://github.com/atpuxiner
|
||||
- name: fastapi-alembic-sqlmodel-async
|
||||
html_url: https://github.com/vargasjona/fastapi-alembic-sqlmodel-async
|
||||
stars: 1267
|
||||
owner_login: vargasjona
|
||||
owner_html_url: https://github.com/vargasjona
|
||||
- name: restish
|
||||
html_url: https://github.com/rest-sh/restish
|
||||
stars: 1258
|
||||
owner_login: rest-sh
|
||||
owner_html_url: https://github.com/rest-sh
|
||||
- name: RuoYi-Vue3-FastAPI
|
||||
html_url: https://github.com/insistence/RuoYi-Vue3-FastAPI
|
||||
stars: 1248
|
||||
stars: 1364
|
||||
owner_login: insistence
|
||||
owner_html_url: https://github.com/insistence
|
||||
- name: fastapi_production_template
|
||||
html_url: https://github.com/zhanymkanov/fastapi_production_template
|
||||
stars: 1240
|
||||
owner_login: zhanymkanov
|
||||
owner_html_url: https://github.com/zhanymkanov
|
||||
- name: langchain-extract
|
||||
html_url: https://github.com/langchain-ai/langchain-extract
|
||||
stars: 1193
|
||||
owner_login: langchain-ai
|
||||
owner_html_url: https://github.com/langchain-ai
|
||||
- name: open-wearables
|
||||
html_url: https://github.com/the-momentum/open-wearables
|
||||
stars: 1170
|
||||
owner_login: the-momentum
|
||||
owner_html_url: https://github.com/the-momentum
|
||||
- name: odmantic
|
||||
html_url: https://github.com/art049/odmantic
|
||||
stars: 1168
|
||||
owner_login: art049
|
||||
owner_html_url: https://github.com/art049
|
||||
- name: authx
|
||||
html_url: https://github.com/yezz123/authx
|
||||
stars: 1160
|
||||
owner_login: yezz123
|
||||
owner_html_url: https://github.com/yezz123
|
||||
- name: FileSync
|
||||
html_url: https://github.com/polius/FileSync
|
||||
stars: 1153
|
||||
owner_login: polius
|
||||
owner_html_url: https://github.com/polius
|
||||
- name: enterprise-deep-research
|
||||
html_url: https://github.com/SalesforceAIResearch/enterprise-deep-research
|
||||
stars: 1150
|
||||
owner_login: SalesforceAIResearch
|
||||
owner_html_url: https://github.com/SalesforceAIResearch
|
||||
- name: budgetml
|
||||
html_url: https://github.com/ebhy/budgetml
|
||||
stars: 1345
|
||||
owner_login: ebhy
|
||||
owner_html_url: https://github.com/ebhy
|
||||
- name: full-stack-ai-agent-template
|
||||
html_url: https://github.com/vstorm-co/full-stack-ai-agent-template
|
||||
stars: 1316
|
||||
owner_login: vstorm-co
|
||||
owner_html_url: https://github.com/vstorm-co
|
||||
- name: bolt-python
|
||||
html_url: https://github.com/slackapi/bolt-python
|
||||
stars: 1308
|
||||
owner_login: slackapi
|
||||
owner_html_url: https://github.com/slackapi
|
||||
- name: bedrock-chat
|
||||
html_url: https://github.com/aws-samples/bedrock-chat
|
||||
stars: 1304
|
||||
owner_login: aws-samples
|
||||
owner_html_url: https://github.com/aws-samples
|
||||
- name: restish
|
||||
html_url: https://github.com/rest-sh/restish
|
||||
stars: 1303
|
||||
owner_login: rest-sh
|
||||
owner_html_url: https://github.com/rest-sh
|
||||
- name: yubal
|
||||
html_url: https://github.com/guillevc/yubal
|
||||
stars: 1135
|
||||
stars: 1302
|
||||
owner_login: guillevc
|
||||
owner_html_url: https://github.com/guillevc
|
||||
|
||||
@@ -38,6 +38,11 @@ alv2017:
|
||||
count: 88
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/31544722?v=4
|
||||
url: https://github.com/alv2017
|
||||
YuriiMotov:
|
||||
login: YuriiMotov
|
||||
count: 87
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4
|
||||
url: https://github.com/YuriiMotov
|
||||
nazarepiedady:
|
||||
login: nazarepiedady
|
||||
count: 87
|
||||
@@ -45,7 +50,7 @@ nazarepiedady:
|
||||
url: https://github.com/nazarepiedady
|
||||
tiangolo:
|
||||
login: tiangolo
|
||||
count: 82
|
||||
count: 83
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
||||
url: https://github.com/tiangolo
|
||||
AlertRED:
|
||||
@@ -63,14 +68,9 @@ nilslindemann:
|
||||
count: 67
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4
|
||||
url: https://github.com/nilslindemann
|
||||
YuriiMotov:
|
||||
login: YuriiMotov
|
||||
count: 66
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=bc48be95c429989224786106b027f3c5e40cc354&v=4
|
||||
url: https://github.com/YuriiMotov
|
||||
cassiobotaro:
|
||||
login: cassiobotaro
|
||||
count: 64
|
||||
count: 65
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/3127847?u=a08022b191ddbd0a6159b2981d9d878b6d5bb71f&v=4
|
||||
url: https://github.com/cassiobotaro
|
||||
waynerv:
|
||||
@@ -131,7 +131,7 @@ solomein-sv:
|
||||
mezgoodle:
|
||||
login: mezgoodle
|
||||
count: 38
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/41520940?u=4a9c765af688389d54296845d18b8f6cd6ddf09a&v=4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/41520940?u=b9f71909a70223d623afa9c2b848a14649daa07d&v=4
|
||||
url: https://github.com/mezgoodle
|
||||
JavierSanchezCastro:
|
||||
login: JavierSanchezCastro
|
||||
@@ -301,7 +301,7 @@ delhi09:
|
||||
rogerbrinkmann:
|
||||
login: rogerbrinkmann
|
||||
count: 20
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/5690226?v=4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/5690226?u=a1fe0aee927d33ce9db8c455eabc40c1cdf2bb65&v=4
|
||||
url: https://github.com/rogerbrinkmann
|
||||
DevDae:
|
||||
login: DevDae
|
||||
@@ -471,7 +471,7 @@ NastasiaSaby:
|
||||
oandersonmagalhaes:
|
||||
login: oandersonmagalhaes
|
||||
count: 12
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/83456692?v=4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/83456692?u=daf5f302a59b950efc6d21129314af207e35441f&v=4
|
||||
url: https://github.com/oandersonmagalhaes
|
||||
mkdir700:
|
||||
login: mkdir700
|
||||
@@ -616,7 +616,7 @@ socket-socket:
|
||||
nick-cjyx9:
|
||||
login: nick-cjyx9
|
||||
count: 10
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/119087246?u=3d51dcbd79222ecb6538642f31dc7c8bb708d191&v=4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/119087246?u=5fc07fc3db727b3c00393d0a3739fb2b6e896a1b&v=4
|
||||
url: https://github.com/nick-cjyx9
|
||||
marcelomarkus:
|
||||
login: marcelomarkus
|
||||
@@ -693,6 +693,11 @@ Yarous:
|
||||
count: 9
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/61277193?u=5b462347458a373b2d599c6f416d2b75eddbffad&v=4
|
||||
url: https://github.com/Yarous
|
||||
ABcDexter:
|
||||
login: ABcDexter
|
||||
count: 9
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/7236257?u=baa7e62eb4d0014b5854bfd0d5c2b20bd9617e0d&v=4
|
||||
url: https://github.com/ABcDexter
|
||||
dimaqq:
|
||||
login: dimaqq
|
||||
count: 8
|
||||
@@ -743,6 +748,11 @@ sungchan1:
|
||||
count: 8
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/28076127?u=fadbf24840186aca639d344bb3e0ecf7ff3441cf&v=4
|
||||
url: https://github.com/sungchan1
|
||||
EdmilsonRodrigues:
|
||||
login: EdmilsonRodrigues
|
||||
count: 8
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/62777025?u=217d6f3cd6cc750bb8818a3af7726c8d74eb7c2d&v=4
|
||||
url: https://github.com/EdmilsonRodrigues
|
||||
roli2py:
|
||||
login: roli2py
|
||||
count: 8
|
||||
@@ -798,11 +808,6 @@ Zerohertz:
|
||||
count: 7
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/42334717?u=5ebf4d33e73b1ad373154f6cdee44f7cab4d05ba&v=4
|
||||
url: https://github.com/Zerohertz
|
||||
EdmilsonRodrigues:
|
||||
login: EdmilsonRodrigues
|
||||
count: 7
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/62777025?u=217d6f3cd6cc750bb8818a3af7726c8d74eb7c2d&v=4
|
||||
url: https://github.com/EdmilsonRodrigues
|
||||
deniscapeto:
|
||||
login: deniscapeto
|
||||
count: 6
|
||||
@@ -906,7 +911,7 @@ bankofsardine:
|
||||
Rekl0w:
|
||||
login: Rekl0w
|
||||
count: 6
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/91488737?u=3b62b04a3e6699eab9b1eea4e88c09a39b753a17&v=4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/91488737?u=7d2b7791665e04a12695150776a1d516a6ea7d21&v=4
|
||||
url: https://github.com/Rekl0w
|
||||
rsip22:
|
||||
login: rsip22
|
||||
@@ -1276,7 +1281,7 @@ rafsaf:
|
||||
frnsimoes:
|
||||
login: frnsimoes
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/66239468?u=98fb2a38bcac765ea9651af8a0ab8f37df86570d&v=4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/66239468?u=be491199e4695bb0ac43d17d59cf7d41f9df629f&v=4
|
||||
url: https://github.com/frnsimoes
|
||||
lieryan:
|
||||
login: lieryan
|
||||
@@ -1438,6 +1443,11 @@ Mohammad222PR:
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/116789737?u=25810a5fe049d2f1618e2e7417cea011cc353ce4&v=4
|
||||
url: https://github.com/Mohammad222PR
|
||||
crr004:
|
||||
login: crr004
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/110995013?u=b1a0cd6b11043dafa7caa1ab6e151c8e063476bc&v=4
|
||||
url: https://github.com/crr004
|
||||
blaisep:
|
||||
login: blaisep
|
||||
count: 2
|
||||
@@ -1606,7 +1616,7 @@ ayr-ton:
|
||||
Kadermiyanyedi:
|
||||
login: Kadermiyanyedi
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/48386782?u=e34f31bf50a8ed8d37fbfa4f301b0c190b1b4b86&v=4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/48386782?u=08c0f1594c5baf28b6fab7520a848cb9c3806c8e&v=4
|
||||
url: https://github.com/Kadermiyanyedi
|
||||
raphaelauv:
|
||||
login: raphaelauv
|
||||
@@ -1811,7 +1821,7 @@ tiaggo16:
|
||||
kiharito:
|
||||
login: kiharito
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/38311245?v=4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/38311245?u=531bd2230b752826edc01dc9d950f2f36017a6f0&v=4
|
||||
url: https://github.com/kiharito
|
||||
t4f1d:
|
||||
login: t4f1d
|
||||
|
||||
@@ -5,7 +5,7 @@ nilslindemann:
|
||||
url: https://github.com/nilslindemann
|
||||
tiangolo:
|
||||
login: tiangolo
|
||||
count: 67
|
||||
count: 78
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=cb5d06e73a9e1998141b1641aa88e443c6717651&v=4
|
||||
url: https://github.com/tiangolo
|
||||
jaystone776:
|
||||
@@ -303,11 +303,11 @@ nayeonkinn:
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/98254573?u=64a75ac99b320d4935eff8d1fceea9680fa07473&v=4
|
||||
url: https://github.com/nayeonkinn
|
||||
pe-brian:
|
||||
login: pe-brian
|
||||
p3bri4n:
|
||||
login: p3bri4n
|
||||
count: 3
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/1783138?u=7e6242eb9e85bcf673fa88bbac9dd6dc3f03b1b5&v=4
|
||||
url: https://github.com/pe-brian
|
||||
url: https://github.com/p3bri4n
|
||||
maxscheijen:
|
||||
login: maxscheijen
|
||||
count: 3
|
||||
@@ -386,7 +386,7 @@ dukkee:
|
||||
oandersonmagalhaes:
|
||||
login: oandersonmagalhaes
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/83456692?v=4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/83456692?u=daf5f302a59b950efc6d21129314af207e35441f&v=4
|
||||
url: https://github.com/oandersonmagalhaes
|
||||
leandrodesouzadev:
|
||||
login: leandrodesouzadev
|
||||
@@ -416,7 +416,7 @@ ayr-ton:
|
||||
Kadermiyanyedi:
|
||||
login: Kadermiyanyedi
|
||||
count: 2
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/48386782?u=e34f31bf50a8ed8d37fbfa4f301b0c190b1b4b86&v=4
|
||||
avatarUrl: https://avatars.githubusercontent.com/u/48386782?u=08c0f1594c5baf28b6fab7520a848cb9c3806c8e&v=4
|
||||
url: https://github.com/Kadermiyanyedi
|
||||
KdHyeon0661:
|
||||
login: KdHyeon0661
|
||||
|
||||
@@ -124,10 +124,6 @@ See section `### Content of code blocks` in the general prompt in `scripts/trans
|
||||
|
||||
//// tab | Test
|
||||
|
||||
/// info
|
||||
Some text
|
||||
///
|
||||
|
||||
/// note
|
||||
Some text
|
||||
///
|
||||
@@ -136,10 +132,6 @@ Some text
|
||||
Some text
|
||||
///
|
||||
|
||||
/// check
|
||||
Some text
|
||||
///
|
||||
|
||||
/// tip
|
||||
Some text
|
||||
///
|
||||
@@ -193,7 +185,7 @@ See section `### Links` in the general prompt in `scripts/translate.py`.
|
||||
|
||||
//// tab | Test
|
||||
|
||||
Here some things wrapped in HTML "abbr" elements (Some are invented):
|
||||
Here are some things wrapped in HTML "abbr" elements (Some are invented):
|
||||
|
||||
### The abbr gives a full phrase { #the-abbr-gives-a-full-phrase }
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ Keep in mind that you have to return the `JSONResponse` directly.
|
||||
|
||||
///
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
The `model` key is not part of OpenAPI.
|
||||
|
||||
@@ -183,7 +183,7 @@ Notice that you have to return the image using a `FileResponse` directly.
|
||||
|
||||
///
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
Unless you specify a different media type explicitly in your `responses` parameter, FastAPI will assume the response has the same media type as the main response class (default `application/json`).
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ It will use the default status code or the one you set in your *path operation*.
|
||||
|
||||
If you want to return additional status codes apart from the main one, you can do that by returning a `Response` directly, like a `JSONResponse`, and set the additional status code directly.
|
||||
|
||||
For example, let's say that you want to have a *path operation* that allows to update items, and returns HTTP status codes of 200 "OK" when successful.
|
||||
For example, let's say that you want to have a *path operation* that allows updating items, and returns HTTP status codes of 200 "OK" when successful.
|
||||
|
||||
But you also want it to accept new items. And when the items didn't exist before, it creates them, and returns an HTTP status code of 201 "Created".
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@ checker(q="somequery")
|
||||
|
||||
/// tip
|
||||
|
||||
All this might seem contrived. And it might not be very clear how is it useful yet.
|
||||
All this might seem contrived. And it might not be very clear how it is useful yet.
|
||||
|
||||
These examples are intentionally simple, but show how it all works.
|
||||
|
||||
@@ -98,7 +98,7 @@ For example, if you had a database session in a dependency with `yield`, the `St
|
||||
|
||||
This behavior was reverted in 0.118.0, to make the exit code after `yield` be executed after the response is sent.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
As you will see below, this is very similar to the behavior before version 0.106.0, but with several improvements and bug fixes for corner cases.
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ To return a response with HTML directly from **FastAPI**, use `HTMLResponse`.
|
||||
|
||||
{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *}
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
The parameter `response_class` will also be used to define the "media type" of the response.
|
||||
|
||||
@@ -65,7 +65,7 @@ A `Response` returned directly by your *path operation function* won't be docume
|
||||
|
||||
///
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
Of course, the actual `Content-Type` header, status code, etc, will come from the `Response` object you returned.
|
||||
|
||||
|
||||
@@ -18,13 +18,13 @@ And of course, it supports the same:
|
||||
|
||||
This works the same way as with Pydantic models. And it is actually achieved in the same way underneath, using Pydantic.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
Keep in mind that dataclasses can't do everything Pydantic models can do.
|
||||
|
||||
So, you might still need to use Pydantic models.
|
||||
|
||||
But if you have a bunch of dataclasses laying around, this is a nice trick to use them to power a web API using FastAPI. 🤓
|
||||
But if you have a bunch of dataclasses lying around, this is a nice trick to use them to power a web API using FastAPI. 🤓
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -120,7 +120,7 @@ To add a function that should be run when the application is shutting down, decl
|
||||
|
||||
Here, the `shutdown` event handler function will write a text line `"Application shutdown"` to a file `log.txt`.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
In the `open()` function, the `mode="a"` means "append", so, the line will be added after whatever is on that file, without overwriting the previous contents.
|
||||
|
||||
@@ -152,7 +152,7 @@ Just a technical detail for the curious nerds. 🤓
|
||||
|
||||
Underneath, in the ASGI technical specification, this is part of the [Lifespan Protocol](https://asgi.readthedocs.io/en/latest/specs/lifespan.html), and it defines events called `startup` and `shutdown`.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
You can read more about the Starlette `lifespan` handlers in [Starlette's Lifespan' docs](https://www.starlette.dev/lifespan/).
|
||||
|
||||
|
||||
@@ -24,13 +24,12 @@ FastAPI automatically generates **OpenAPI 3.1** specifications, so any tool you
|
||||
|
||||
This section highlights **venture-backed** and **company-supported** solutions from companies that sponsor FastAPI. These products provide **additional features** and **integrations** on top of high-quality generated SDKs.
|
||||
|
||||
By ✨ [**sponsoring FastAPI**](../help-fastapi.md#sponsor-the-author) ✨, these companies help ensure the framework and its **ecosystem** remain healthy and **sustainable**.
|
||||
By ✨ [**sponsoring FastAPI**](https://github.com/sponsors/tiangolo) ✨, these companies help ensure the framework and its **ecosystem** remain healthy and **sustainable**.
|
||||
|
||||
Their sponsorship also demonstrates a strong commitment to the FastAPI **community** (you), showing that they care not only about offering a **great service** but also about supporting a **robust and thriving framework**, FastAPI. 🙇
|
||||
|
||||
For example, you might want to try:
|
||||
|
||||
* [Speakeasy](https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship)
|
||||
* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral)
|
||||
* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi)
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ If your app needs to receive and send JSON data, but you need to include binary
|
||||
|
||||
## Base64 vs Files { #base64-vs-files }
|
||||
|
||||
Consider first if you can use [Request Files](../tutorial/request-files.md) for uploading binary data and [Custom Response - FileResponse](./custom-response.md#fileresponse--fileresponse-) for sending binary data, instead of encoding it in JSON.
|
||||
Consider first if you can use [Request Files](../tutorial/request-files.md) for uploading binary data and [Custom Response - FileResponse](./custom-response.md#fileresponse) for sending binary data, instead of encoding it in JSON.
|
||||
|
||||
JSON can only contain UTF-8 encoded strings, so it can't contain raw bytes.
|
||||
|
||||
|
||||
@@ -173,7 +173,7 @@ Now use the parameter `callbacks` in *your API's path operation decorator* to pa
|
||||
|
||||
/// tip
|
||||
|
||||
Notice that you are not passing the router itself (`invoices_callback_router`) to `callback=`, but the attribute `.routes`, as in `invoices_callback_router.routes`.
|
||||
Notice that you are not passing the router itself (`invoices_callback_router`) to `callbacks=`, but the attribute `.routes`, as in `invoices_callback_router.routes`.
|
||||
|
||||
///
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ With **FastAPI**, using OpenAPI, you can define the names of these webhooks, the
|
||||
|
||||
This can make it a lot easier for your users to **implement their APIs** to receive your **webhook** requests, they might even be able to autogenerate some of their own API code.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
Webhooks are available in OpenAPI 3.1.0 and above, supported by FastAPI `0.99.0` and above.
|
||||
|
||||
@@ -36,7 +36,7 @@ When you create a **FastAPI** application, there is a `webhooks` attribute that
|
||||
|
||||
The webhooks that you define will end up in the **OpenAPI** schema and the automatic **docs UI**.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
The `app.webhooks` object is actually just an `APIRouter`, the same type you would use when structuring your app with multiple files.
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ For those cases, you can use a `Response` parameter.
|
||||
|
||||
You can declare a parameter of type `Response` in your *path operation function* (as you can do for cookies and headers).
|
||||
|
||||
And then you can set the `status_code` in that *temporal* response object.
|
||||
And then you can set the `status_code` in that *temporary* response object.
|
||||
|
||||
{* ../../docs_src/response_change_status_code/tutorial001_py310.py hl[1,9,12] *}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
You can declare a parameter of type `Response` in your *path operation function*.
|
||||
|
||||
And then you can set cookies in that *temporal* response object.
|
||||
And then you can set cookies in that *temporary* response object.
|
||||
|
||||
{* ../../docs_src/response_cookies/tutorial002_py310.py hl[1, 8:9] *}
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ You will normally have much better performance using a [Response Model](../tutor
|
||||
|
||||
You can return a `Response` or any sub-class of it.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
`JSONResponse` itself is a sub-class of `Response`.
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
You can declare a parameter of type `Response` in your *path operation function* (as you can do for cookies).
|
||||
|
||||
And then you can set headers in that *temporal* response object.
|
||||
And then you can set headers in that *temporary* response object.
|
||||
|
||||
{* ../../docs_src/response_headers/tutorial002_py310.py hl[1, 7:8] *}
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ They are normally used to declare specific security permissions, for example:
|
||||
* `instagram_basic` is used by Facebook / Instagram.
|
||||
* `https://www.googleapis.com/auth/drive` is used by Google.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
In OAuth2 a "scope" is just a string that declares a specific permission required.
|
||||
|
||||
@@ -126,7 +126,7 @@ We are doing it here to demonstrate how **FastAPI** handles scopes declared at d
|
||||
|
||||
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
|
||||
|
||||
/// info | Technical Details
|
||||
/// note | Technical Details
|
||||
|
||||
`Security` is actually a subclass of `Depends`, and it has just one extra parameter that we'll see later.
|
||||
|
||||
@@ -194,7 +194,7 @@ For this, we use `security_scopes.scopes`, that contains a `list` with all these
|
||||
|
||||
Let's review again this dependency tree and the scopes.
|
||||
|
||||
As the `get_current_active_user` dependency has as a sub-dependency on `get_current_user`, the scope `"me"` declared at `get_current_active_user` will be included in the list of required scopes in the `security_scopes.scopes` passed to `get_current_user`.
|
||||
As the `get_current_active_user` dependency has `get_current_user` as a sub-dependency, the scope `"me"` declared at `get_current_active_user` will be included in the list of required scopes in the `security_scopes.scopes` passed to `get_current_user`.
|
||||
|
||||
The *path operation* itself also declares a scope, `"items"`, so this will also be in the list of `security_scopes.scopes` passed to `get_current_user`.
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ To understand environment variables you can read [Environment Variables](../envi
|
||||
|
||||
## Types and validation { #types-and-validation }
|
||||
|
||||
These environment variables can only handle text strings, as they are external to Python and have to be compatible with other programs and the rest of the system (and even with different operating systems, as Linux, Windows, macOS).
|
||||
These environment variables can only handle text strings, as they are external to Python and have to be compatible with other programs and the rest of the system (and even with different operating systems, such as Linux, Windows, and macOS).
|
||||
|
||||
That means that any value read in Python from an environment variable will be a `str`, and any conversion to a different type or any validation has to be done in code.
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ If you want to stream data that can be structured as JSON, you should [Stream JS
|
||||
|
||||
But if you want to **stream pure binary data** or strings, here's how you can do it.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
Added in FastAPI 0.134.0.
|
||||
|
||||
@@ -14,7 +14,7 @@ Added in FastAPI 0.134.0.
|
||||
|
||||
You could use this if you want to stream pure strings, for example directly from the output of an **AI LLM** service.
|
||||
|
||||
You could also use it to stream **large binary files**, where you stream each chunk of data as you read it, without having to read it all in memory at once.
|
||||
You could also use it to stream **large binary files**, where you stream each chunk of data as you read it, without having to read it all into memory at once.
|
||||
|
||||
You could also stream **video** or **audio** this way, it could even be generated as you process and send it.
|
||||
|
||||
@@ -90,7 +90,7 @@ For example, they don't have an `await file.read()`, or `async for chunk in file
|
||||
|
||||
And in many cases, reading them would be a blocking operation (that could block the event loop), because they are read from disk or from the network.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
The example above is actually an exception, because the `io.BytesIO` object is already in memory, so reading it won't block anything.
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ If you need to support clients that don't send a `Content-Type` header, you can
|
||||
|
||||
With this setting, requests without a `Content-Type` header will have their body parsed as JSON, which is the same behavior as older versions of FastAPI.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
This behavior and configuration was added in FastAPI 0.132.0.
|
||||
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
# Vibe Coding { #vibe-coding }
|
||||
|
||||
Are you tired of all that **data validation**, **documentation**, **serialization**, and all that **boring** stuff?
|
||||
|
||||
Do you just want to **vibe**? 🎶
|
||||
|
||||
**FastAPI** now supports a new `@app.vibe()` decorator that embraces **modern AI coding best practices**. 🤖
|
||||
|
||||
## How It Works { #how-it-works }
|
||||
|
||||
The `@app.vibe()` decorator is intended to receive **any HTTP method** (`GET`, `POST`, `PUT`, `DELETE`, `PATCH`, etc.) and **any payload**.
|
||||
|
||||
The body should be annotated with `Any`, because the request and the response would be... well... **anything**. 🤷
|
||||
|
||||
The idea is that you would receive the payload and send it **directly** to an LLM provider, using a `prompt` to tell the LLM what to do, and return the response **as is**. No questions asked.
|
||||
|
||||
You don't even need to write the body of the function. The `@app.vibe()` decorator does everything for you based on AI vibes:
|
||||
|
||||
{* ../../docs_src/vibe/tutorial001_py310.py hl[8:12] *}
|
||||
|
||||
## Benefits { #benefits }
|
||||
|
||||
By using `@app.vibe()`, you get to enjoy:
|
||||
|
||||
* **Freedom**: No data validation. No schemas. No constraints. Just vibes. ✨
|
||||
* **Flexibility**: The request can be anything. The response can be anything. Who needs types anyway?
|
||||
* **No documentation**: Why document your API when an LLM can figure it out? Auto-generated OpenAPI docs are *so* 2020.
|
||||
* **No serialization**: Just pass the raw, unstructured data around. Serialization is for people who don't trust their LLMs.
|
||||
* **Embrace modern AI coding practices**: Leave everything up to an LLM to decide. The model knows best. Always.
|
||||
* **No code reviews**: There's no code to review. No PRs to approve. No comments to address. Embrace vibe coding fully, replace the theater of approving and merging vibe coded PRs that no one looks at with full proper vibes only.
|
||||
|
||||
/// tip
|
||||
|
||||
This is the ultimate **vibe-driven development** experience. You don't need to think about what your API does, just let the LLM handle it. 🧘
|
||||
|
||||
///
|
||||
|
||||
## Try It { #try-it }
|
||||
|
||||
Go ahead, try it:
|
||||
|
||||
{* ../../docs_src/vibe/tutorial001_py310.py *}
|
||||
|
||||
...and see what happens. 😎
|
||||
@@ -111,7 +111,7 @@ They work the same way as for other FastAPI endpoints/*path operations*:
|
||||
|
||||
{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *}
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
As this is a WebSocket it doesn't really make sense to raise an `HTTPException`, instead we raise a `WebSocketException`.
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ For that, you can use the `WSGIMiddleware` and use it to wrap your WSGI applicat
|
||||
|
||||
## Using `WSGIMiddleware` { #using-wsgimiddleware }
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
This requires installing `a2wsgi` for example with `pip install a2wsgi`.
|
||||
|
||||
@@ -24,7 +24,7 @@ And then mount that under a path.
|
||||
|
||||
Previously, it was recommended to use `WSGIMiddleware` from `fastapi.middleware.wsgi`, but it is now deprecated.
|
||||
|
||||
It’s advised to use the `a2wsgi` package instead. The usage remains the same.
|
||||
It's advised to use the `a2wsgi` package instead. The usage remains the same.
|
||||
|
||||
Just ensure that you have the `a2wsgi` package installed and import `WSGIMiddleware` correctly from `a2wsgi`.
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ It was created to generate the HTML in the backend, not to create APIs used by a
|
||||
|
||||
### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework }
|
||||
|
||||
Django REST framework was created to be a flexible toolkit for building Web APIs using Django underneath, to improve its API capabilities.
|
||||
Django REST Framework was created to be a flexible toolkit for building Web APIs using Django underneath, to improve its API capabilities.
|
||||
|
||||
It is used by many companies including Mozilla, Red Hat and Eventbrite.
|
||||
|
||||
@@ -36,7 +36,7 @@ Django REST Framework was created by Tom Christie. The same creator of Starlette
|
||||
|
||||
///
|
||||
|
||||
/// check | Inspired **FastAPI** to
|
||||
/// tip | Inspired **FastAPI** to
|
||||
|
||||
Have an automatic API documentation web user interface.
|
||||
|
||||
@@ -56,7 +56,7 @@ This decoupling of parts, and being a "microframework" that could be extended to
|
||||
|
||||
Given the simplicity of Flask, it seemed like a good match for building APIs. The next thing to find was a "Django REST Framework" for Flask.
|
||||
|
||||
/// check | Inspired **FastAPI** to
|
||||
/// tip | Inspired **FastAPI** to
|
||||
|
||||
Be a micro-framework. Making it easy to mix and match the tools and parts needed.
|
||||
|
||||
@@ -98,7 +98,7 @@ def read_url():
|
||||
|
||||
See the similarities in `requests.get(...)` and `@app.get(...)`.
|
||||
|
||||
/// check | Inspired **FastAPI** to
|
||||
/// tip | Inspired **FastAPI** to
|
||||
|
||||
* Have a simple and intuitive API.
|
||||
* Use HTTP method names (operations) directly, in a straightforward and intuitive way.
|
||||
@@ -118,7 +118,7 @@ At some point, Swagger was given to the Linux Foundation, to be renamed OpenAPI.
|
||||
|
||||
That's why when talking about version 2.0 it's common to say "Swagger", and for version 3+ "OpenAPI".
|
||||
|
||||
/// check | Inspired **FastAPI** to
|
||||
/// tip | Inspired **FastAPI** to
|
||||
|
||||
Adopt and use an open standard for API specifications, instead of a custom schema.
|
||||
|
||||
@@ -147,7 +147,7 @@ These features are what Marshmallow was built to provide. It is a great library,
|
||||
|
||||
But it was created before there existed Python type hints. So, to define every <dfn title="the definition of how data should be formed">schema</dfn> you need to use specific utils and classes provided by Marshmallow.
|
||||
|
||||
/// check | Inspired **FastAPI** to
|
||||
/// tip | Inspired **FastAPI** to
|
||||
|
||||
Use code to define "schemas" that provide data types and validation, automatically.
|
||||
|
||||
@@ -163,13 +163,13 @@ It uses Marshmallow underneath to do the data validation. And it was created by
|
||||
|
||||
It's a great tool and I have used it a lot too, before having **FastAPI**.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
Webargs was created by the same Marshmallow developers.
|
||||
|
||||
///
|
||||
|
||||
/// check | Inspired **FastAPI** to
|
||||
/// tip | Inspired **FastAPI** to
|
||||
|
||||
Have automatic validation of incoming request data.
|
||||
|
||||
@@ -193,13 +193,13 @@ But then, we have again the problem of having a micro-syntax, inside of a Python
|
||||
|
||||
The editor can't help much with that. And if we modify parameters or Marshmallow schemas and forget to also modify that YAML docstring, the generated schema would be obsolete.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
APISpec was created by the same Marshmallow developers.
|
||||
|
||||
///
|
||||
|
||||
/// check | Inspired **FastAPI** to
|
||||
/// tip | Inspired **FastAPI** to
|
||||
|
||||
Support the open standard for APIs, OpenAPI.
|
||||
|
||||
@@ -225,13 +225,13 @@ Using it led to the creation of several Flask full-stack generators. These are t
|
||||
|
||||
And these same full-stack generators were the base of the [**FastAPI** Project Generators](project-generation.md).
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
Flask-apispec was created by the same Marshmallow developers.
|
||||
|
||||
///
|
||||
|
||||
/// check | Inspired **FastAPI** to
|
||||
/// tip | Inspired **FastAPI** to
|
||||
|
||||
Generate the OpenAPI schema automatically, from the same code that defines serialization and validation.
|
||||
|
||||
@@ -251,7 +251,7 @@ But as TypeScript data is not preserved after compilation to JavaScript, it cann
|
||||
|
||||
It can't handle nested models very well. So, if the JSON body in the request is a JSON object that has inner fields that in turn are nested JSON objects, it cannot be properly documented and validated.
|
||||
|
||||
/// check | Inspired **FastAPI** to
|
||||
/// tip | Inspired **FastAPI** to
|
||||
|
||||
Use Python types to have great editor support.
|
||||
|
||||
@@ -271,7 +271,7 @@ It clearly inspired Uvicorn and Starlette, that are currently faster than Sanic
|
||||
|
||||
///
|
||||
|
||||
/// check | Inspired **FastAPI** to
|
||||
/// tip | Inspired **FastAPI** to
|
||||
|
||||
Find a way to have a crazy performance.
|
||||
|
||||
@@ -287,7 +287,7 @@ It is designed to have functions that receive two parameters, one "request" and
|
||||
|
||||
So, data validation, serialization, and documentation, have to be done in code, not automatically. Or they have to be implemented as a framework on top of Falcon, like Hug. This same distinction happens in other frameworks that are inspired by Falcon's design, of having one request object and one response object as parameters.
|
||||
|
||||
/// check | Inspired **FastAPI** to
|
||||
/// tip | Inspired **FastAPI** to
|
||||
|
||||
Find ways to get great performance.
|
||||
|
||||
@@ -313,7 +313,7 @@ The dependency injection system requires pre-registration of the dependencies an
|
||||
|
||||
Routes are declared in a single place, using functions declared in other places (instead of using decorators that can be placed right on top of the function that handles the endpoint). This is closer to how Django does it than to how Flask (and Starlette) does it. It separates in the code things that are relatively tightly coupled.
|
||||
|
||||
/// check | Inspired **FastAPI** to
|
||||
/// tip | Inspired **FastAPI** to
|
||||
|
||||
Define extra validations for data types using the "default" value of model attributes. This improves editor support, and it was not available in Pydantic before.
|
||||
|
||||
@@ -335,17 +335,17 @@ It has an interesting, uncommon feature: using the same framework, it's possible
|
||||
|
||||
As it is based on the previous standard for synchronous Python web frameworks (WSGI), it can't handle Websockets and other things, although it still has high performance too.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
Hug was created by Timothy Crosley, the same creator of [`isort`](https://github.com/timothycrosley/isort), a great tool to automatically sort imports in Python files.
|
||||
|
||||
///
|
||||
|
||||
/// check | Ideas inspiring **FastAPI**
|
||||
/// tip | Ideas inspiring **FastAPI**
|
||||
|
||||
Hug inspired parts of APIStar, and was one of the tools I found most promising, alongside APIStar.
|
||||
|
||||
Hug helped inspiring **FastAPI** to use Python type hints to declare parameters, and to generate a schema defining the API automatically.
|
||||
Hug helped inspire **FastAPI** to use Python type hints to declare parameters, and to generate a schema defining the API automatically.
|
||||
|
||||
Hug inspired **FastAPI** to declare a `response` parameter in functions to set headers and cookies.
|
||||
|
||||
@@ -375,17 +375,17 @@ It was no longer an API web framework, as the creator needed to focus on Starlet
|
||||
|
||||
Now APIStar is a set of tools to validate OpenAPI specifications, not a web framework.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
APIStar was created by Tom Christie. The same guy that created:
|
||||
|
||||
* Django REST Framework
|
||||
* Starlette (in which **FastAPI** is based)
|
||||
* Starlette (on which **FastAPI** is based)
|
||||
* Uvicorn (used by Starlette and **FastAPI**)
|
||||
|
||||
///
|
||||
|
||||
/// check | Inspired **FastAPI** to
|
||||
/// tip | Inspired **FastAPI** to
|
||||
|
||||
Exist.
|
||||
|
||||
@@ -393,7 +393,7 @@ The idea of declaring multiple things (data validation, serialization and docume
|
||||
|
||||
And after searching for a long time for a similar framework and testing many different alternatives, APIStar was the best option available.
|
||||
|
||||
Then APIStar stopped to exist as a server and Starlette was created, and was a new better foundation for such a system. That was the final inspiration to build **FastAPI**.
|
||||
Then APIStar stopped existing as a server and Starlette was created, and was a new better foundation for such a system. That was the final inspiration to build **FastAPI**.
|
||||
|
||||
I consider **FastAPI** a "spiritual successor" to APIStar, while improving and increasing the features, typing system, and other parts, based on the learnings from all these previous tools.
|
||||
|
||||
@@ -409,7 +409,7 @@ That makes it extremely intuitive.
|
||||
|
||||
It is comparable to Marshmallow. Although it's faster than Marshmallow in benchmarks. And as it is based on the same Python type hints, the editor support is great.
|
||||
|
||||
/// check | **FastAPI** uses it to
|
||||
/// tip | **FastAPI** uses it to
|
||||
|
||||
Handle all the data validation, data serialization and automatic model documentation (based on JSON Schema).
|
||||
|
||||
@@ -452,7 +452,7 @@ Nevertheless, it is already being used as a "standard" by several tools. This gr
|
||||
|
||||
///
|
||||
|
||||
/// check | **FastAPI** uses it to
|
||||
/// tip | **FastAPI** uses it to
|
||||
|
||||
Handle all the core web parts. Adding features on top.
|
||||
|
||||
@@ -470,7 +470,7 @@ It is not a web framework, but a server. For example, it doesn't provide tools f
|
||||
|
||||
It is the recommended server for Starlette and **FastAPI**.
|
||||
|
||||
/// check | **FastAPI** recommends it as
|
||||
/// tip | **FastAPI** recommends it as
|
||||
|
||||
The main web server to run **FastAPI** applications.
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ Asynchronous code just means that the language 💬 has a way to tell the comput
|
||||
|
||||
So, during that time, the computer can go and do some other work, while "slow-file" 📝 finishes.
|
||||
|
||||
Then the computer / program 🤖 will come back every time it has a chance because it's waiting again, or whenever it 🤖 finished all the work it had at that point. And it 🤖 will see if any of the tasks it was waiting for have already finished, doing whatever it had to do.
|
||||
Then the computer / program 🤖 will come back every time it has a chance because it's waiting again, or whenever it 🤖 finishes all the work it had at that point. And it 🤖 will see if any of the tasks it was waiting for have already finished, doing whatever it had to do.
|
||||
|
||||
Next, it 🤖 takes the first task to finish (let's say, our "slow-file" 📝) and continues whatever it had to do with it.
|
||||
|
||||
@@ -78,7 +78,7 @@ That "wait for something else" normally refers to <abbr title="Input and Output"
|
||||
|
||||
* the data from the client to be sent through the network
|
||||
* the data sent by your program to be received by the client through the network
|
||||
* the contents of a file in the disk to be read by the system and given to your program
|
||||
* the contents of a file on the disk to be read by the system and given to your program
|
||||
* the contents your program gave to the system to be written to disk
|
||||
* a remote API operation
|
||||
* a database operation to finish
|
||||
@@ -139,7 +139,7 @@ You and your crush eat the burgers and have a nice time. ✨
|
||||
|
||||
<img src="/img/async/concurrent-burgers/concurrent-burgers-07.png" class="illustration">
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
Beautiful illustrations by [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨
|
||||
|
||||
@@ -205,7 +205,7 @@ You just eat them, and you are done. ⏹
|
||||
|
||||
There was not much talk or flirting as most of the time was spent waiting 🕙 in front of the counter. 😞
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
Beautiful illustrations by [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨
|
||||
|
||||
@@ -257,7 +257,7 @@ And as you can have parallelism and asynchronicity at the same time, you get hig
|
||||
|
||||
Nope! That's not the moral of the story.
|
||||
|
||||
Concurrency is different than parallelism. And it is better on **specific** scenarios that involve a lot of waiting. Because of that, it generally is a lot better than parallelism for web application development. But not for everything.
|
||||
Concurrency is different than parallelism. And it is better in **specific** scenarios that involve a lot of waiting. Because of that, it generally is a lot better than parallelism for web application development. But not for everything.
|
||||
|
||||
So, to balance that out, imagine the following short story:
|
||||
|
||||
@@ -267,7 +267,7 @@ So, to balance that out, imagine the following short story:
|
||||
|
||||
---
|
||||
|
||||
There's no waiting 🕙 anywhere, just a lot of work to be done, on multiple places of the house.
|
||||
There's no waiting 🕙 anywhere, just a lot of work to be done, in multiple places of the house.
|
||||
|
||||
You could have turns as in the burgers example, first the living room, then the kitchen, but as you are not waiting 🕙 for anything, just cleaning and cleaning, the turns wouldn't affect anything.
|
||||
|
||||
@@ -296,7 +296,7 @@ With **FastAPI** you can take advantage of concurrency that is very common for w
|
||||
|
||||
But you can also exploit the benefits of parallelism and multiprocessing (having multiple processes running in parallel) for **CPU bound** workloads like those in Machine Learning systems.
|
||||
|
||||
That, plus the simple fact that Python is the main language for **Data Science**, Machine Learning and especially Deep Learning, make FastAPI a very good match for Data Science / Machine Learning web APIs and applications (among many others).
|
||||
That, plus the simple fact that Python is the main language for **Data Science**, Machine Learning and especially Deep Learning, makes FastAPI a very good match for Data Science / Machine Learning web APIs and applications (among many others).
|
||||
|
||||
To see how to achieve this parallelism in production see the section about [Deployment](deployment/index.md).
|
||||
|
||||
@@ -340,7 +340,7 @@ burgers = get_burgers(2)
|
||||
|
||||
---
|
||||
|
||||
So, if you are using a library that tells you that you can call it with `await`, you need to create the *path operation functions* that uses it with `async def`, like in:
|
||||
So, if you are using a library that tells you that you can call it with `await`, you need to create the *path operation functions* that use it with `async def`, like in:
|
||||
|
||||
```Python hl_lines="2-3"
|
||||
@app.get('/burgers')
|
||||
@@ -435,7 +435,7 @@ Any other utility function that you call directly can be created with normal `de
|
||||
|
||||
This is in contrast to the functions that FastAPI calls for you: *path operation functions* and dependencies.
|
||||
|
||||
If your utility function is a normal function with `def`, it will be called directly (as you write it in your code), not in a threadpool, if the function is created with `async def` then you should `await` for that function when you call it in your code.
|
||||
If your utility function is a normal function with `def`, it will be called directly (as you write it in your code), not in a threadpool, if the function is created with `async def` then you should `await` that function when you call it in your code.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,267 +1,7 @@
|
||||
# Development - Contributing
|
||||
# Contributing
|
||||
|
||||
First, you might want to see the basic ways to [help FastAPI and get help](help-fastapi.md).
|
||||
|
||||
## Developing
|
||||
|
||||
If you already cloned the [fastapi repository](https://github.com/fastapi/fastapi) and you want to deep dive in the code, here are some guidelines to set up your environment.
|
||||
|
||||
### Install requirements
|
||||
|
||||
Create a virtual environment and install the required packages with [`uv`](https://github.com/astral-sh/uv):
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ uv sync --extra all
|
||||
|
||||
---> 100%
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
It will install all the dependencies and your local FastAPI in your local environment.
|
||||
|
||||
### Using your local FastAPI
|
||||
|
||||
If you create a Python file that imports and uses FastAPI, and run it with the Python from your local environment, it will use your cloned local FastAPI source code.
|
||||
|
||||
And if you update that local FastAPI source code when you run that Python file again, it will use the fresh version of FastAPI you just edited.
|
||||
|
||||
That way, you don't have to "install" your local version to be able to test every change.
|
||||
|
||||
/// note | Technical Details
|
||||
|
||||
This only happens when you install using `uv sync --extra all` instead of running `pip install fastapi` directly.
|
||||
|
||||
That is because `uv sync --extra all` will install the local version of FastAPI in "editable" mode by default.
|
||||
|
||||
///
|
||||
|
||||
### Format the code
|
||||
|
||||
There is a script that you can run that will format and clean all your code:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ bash scripts/format.sh
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
It will also auto-sort all your imports.
|
||||
|
||||
## Tests
|
||||
|
||||
There is a script that you can run locally to test all the code and generate coverage reports in HTML:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ bash scripts/test-cov-html.sh
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
This command generates a directory `./htmlcov/`, if you open the file `./htmlcov/index.html` in your browser, you can explore interactively the regions of code that are covered by the tests, and notice if there is any region missing.
|
||||
|
||||
## Docs
|
||||
|
||||
First, make sure you set up your environment as described above, that will install all the requirements.
|
||||
|
||||
### Docs live
|
||||
|
||||
During local development, there is a script that builds the site and checks for any changes, live-reloading:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ python ./scripts/docs.py live
|
||||
|
||||
<span style="color: green;">[INFO]</span> Serving on http://127.0.0.1:8008
|
||||
<span style="color: green;">[INFO]</span> Start watching changes
|
||||
<span style="color: green;">[INFO]</span> Start detecting changes
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
It will serve the documentation on `http://127.0.0.1:8008`.
|
||||
|
||||
That way, you can edit the documentation/source files and see the changes live.
|
||||
|
||||
/// tip
|
||||
|
||||
Alternatively, you can perform the same steps that scripts does manually.
|
||||
|
||||
Go into the language directory, for the main docs in English it's at `docs/en/`:
|
||||
|
||||
```console
|
||||
$ cd docs/en/
|
||||
```
|
||||
|
||||
Then run `mkdocs` in that directory:
|
||||
|
||||
```console
|
||||
$ mkdocs serve --dev-addr 127.0.0.1:8008
|
||||
```
|
||||
|
||||
///
|
||||
|
||||
#### Typer CLI (optional)
|
||||
|
||||
The instructions here show you how to use the script at `./scripts/docs.py` with the `python` program directly.
|
||||
|
||||
But you can also use [Typer CLI](https://typer.tiangolo.com/typer-cli/), and you will get autocompletion in your terminal for the commands after installing completion.
|
||||
|
||||
If you install Typer CLI, you can install completion with:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ typer --install-completion
|
||||
|
||||
zsh completion installed in /home/user/.bashrc.
|
||||
Completion will take effect once you restart the terminal.
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
### Docs Structure
|
||||
|
||||
The documentation uses [MkDocs](https://www.mkdocs.org/).
|
||||
|
||||
And there are extra tools/scripts in place to handle translations in `./scripts/docs.py`.
|
||||
|
||||
/// tip
|
||||
|
||||
You don't need to see the code in `./scripts/docs.py`, you just use it in the command line.
|
||||
|
||||
///
|
||||
|
||||
All the documentation is in Markdown format in the directory `./docs/en/`.
|
||||
|
||||
Many of the tutorials have blocks of code.
|
||||
|
||||
In most of the cases, these blocks of code are actual complete applications that can be run as is.
|
||||
|
||||
In fact, those blocks of code are not written inside the Markdown, they are Python files in the `./docs_src/` directory.
|
||||
|
||||
And those Python files are included/injected in the documentation when generating the site.
|
||||
|
||||
### Docs for tests
|
||||
|
||||
Most of the tests actually run against the example source files in the documentation.
|
||||
|
||||
This helps to make sure that:
|
||||
|
||||
* The documentation is up-to-date.
|
||||
* The documentation examples can be run as is.
|
||||
* Most of the features are covered by the documentation, ensured by test coverage.
|
||||
|
||||
#### Apps and docs at the same time
|
||||
|
||||
If you run the examples with, e.g.:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ fastapi dev tutorial001.py
|
||||
|
||||
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
as Uvicorn by default will use the port `8000`, the documentation on port `8008` won't clash.
|
||||
|
||||
### Translations
|
||||
|
||||
Help with translations is VERY MUCH appreciated! And it can't be done without the help from the community. 🌎 🚀
|
||||
|
||||
Translation pull requests are made by LLMs guided with prompts designed by the FastAPI team together with the community of native speakers for each supported language.
|
||||
|
||||
#### LLM Prompt per Language
|
||||
|
||||
Each language has a directory: [https://github.com/fastapi/fastapi/tree/master/docs](https://github.com/fastapi/fastapi/tree/master/docs), in it you can see a file `llm-prompt.md` with the prompt specific for that language.
|
||||
|
||||
For example, for Spanish, the prompt is at: [`docs/es/llm-prompt.md`](https://github.com/fastapi/fastapi/blob/master/docs/es/llm-prompt.md).
|
||||
|
||||
If you see mistakes in your language, you can make suggestions to the prompt in that file for your language, and request the specific pages you would like to re-generate after the changes.
|
||||
|
||||
#### Reviewing Translation PRs
|
||||
|
||||
We don’t require approval from native speakers for translation PRs generated automatically by our translation workflow. However, you can still review them and suggest improvements to the LLM prompt for that language to make the future translations better.
|
||||
|
||||
You can check the currently [existing pull requests](https://github.com/fastapi/fastapi/pulls) for your language. You can filter the pull requests by the ones with the label for your language. For example, for Spanish, the label is [`lang-es`](https://github.com/fastapi/fastapi/pulls?q=is%3Aopen+sort%3Aupdated-desc+label%3Alang-es+label%3Aawaiting-review).
|
||||
|
||||
You can also review already merged translation PRs. To do this, go to the [closed pull requests](https://github.com/fastapi/fastapi/pulls?q=is%3Apr+is%3Aclosed) and filter by your language label. For example, for Spanish, you can use [`lang-es`](https://github.com/fastapi/fastapi/pulls?q=is%3Apr+is%3Aclosed+label%3Alang-es).
|
||||
|
||||
When reviewing a pull request, it's better not to suggest changes in the same pull request, because it is LLM generated, and it won't be possible to make sure that small individual changes are replicated in other similar sections, or that they are preserved when translating the same content again.
|
||||
|
||||
Instead of adding suggestions to the translation PR, make the suggestions to the LLM prompt file for that language, in a new PR. For example, for Spanish, the LLM prompt file is at: [`docs/es/llm-prompt.md`](https://github.com/fastapi/fastapi/blob/master/docs/es/llm-prompt.md).
|
||||
|
||||
/// tip
|
||||
|
||||
Check the docs about [adding a pull request review](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-request-reviews) to approve it or request changes.
|
||||
|
||||
///
|
||||
|
||||
PRs with suggestions to the language-specific LLM prompt require approval from at least one native speaker. Your help here is very much appreciated!
|
||||
|
||||
#### Subscribe to Notifications for Your Language
|
||||
|
||||
Check if there's a [GitHub Discussion](https://github.com/fastapi/fastapi/discussions/categories/translations) to coordinate translations for your language. You can subscribe to it, and when there's a new pull request to review, an automatic comment will be added to the discussion.
|
||||
|
||||
To check the 2-letter code for the language you want to translate, you can use the table [List of ISO 639-1 codes](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes).
|
||||
|
||||
#### Request a New Language
|
||||
|
||||
Let's say that you want to request translations for a language that is not yet translated, not even some pages. For example, Latin.
|
||||
|
||||
* The first step would be for you to find other 2 people that would be willing to be reviewing translation PRs for that language with you.
|
||||
* Once there are at least 3 people that would be willing to commit to help maintain that language, you can continue the next steps.
|
||||
* Create a new discussion following the template.
|
||||
* Tag the other 2 people that will help with the language, and ask them to confirm there they will help.
|
||||
|
||||
Once there are several people in the discussion, the FastAPI team can evaluate it and can make it an official translation.
|
||||
|
||||
Then the docs will be automatically translated using LLMs, and the team of native speakers can review the translation, and help tweak the LLM prompts.
|
||||
|
||||
Once there's a new translation, for example if docs are updated or there's a new section, there will be a comment in the same discussion with the link to the new translation to review.
|
||||
|
||||
## Automated Code and AI
|
||||
|
||||
You are encouraged to use all the tools you want to do your work and contribute as efficiently as possible, this includes AI (LLM) tools, etc. Nevertheless, contributions should have meaningful human intervention, judgement, context, etc.
|
||||
|
||||
If the **human effort** put in a PR, e.g. writing LLM prompts, is **less** than the **effort we would need to put** to **review it**, please **don't** submit the PR.
|
||||
|
||||
Think of it this way: we can already write LLM prompts or run automated tools ourselves, and that would be faster than reviewing external PRs.
|
||||
|
||||
### Closing Automated and AI PRs
|
||||
|
||||
If we see PRs that seem AI generated or automated in similar ways, we'll flag them and close them.
|
||||
|
||||
The same applies to comments and descriptions, please don't copy paste the content generated by an LLM.
|
||||
|
||||
### Human Effort Denial of Service
|
||||
|
||||
Using automated tools and AI to submit PRs or comments that we have to carefully review and handle would be the equivalent of a [Denial-of-service attack](https://en.wikipedia.org/wiki/Denial-of-service_attack) on our human effort.
|
||||
|
||||
It would be very little effort from the person submitting the PR (an LLM prompt) that generates a large amount of effort on our side (carefully reviewing code).
|
||||
|
||||
Please don't do that.
|
||||
|
||||
We'll need to block accounts that spam us with repeated automated PRs or comments.
|
||||
|
||||
### Use Tools Wisely
|
||||
|
||||
As Uncle Ben said:
|
||||
|
||||
<blockquote>
|
||||
With great <strike>power</strike> <strong>tools</strong> comes great responsibility.
|
||||
</blockquote>
|
||||
|
||||
Avoid inadvertently doing harm.
|
||||
|
||||
You have amazing tools at hand, use them wisely to help effectively.
|
||||
To contribute code to the project, please follow the guidelines in [tiangolo.com - Contributing](https://tiangolo.com/open-source/contributing/).
|
||||
|
||||
@@ -264,3 +264,189 @@ Inspired by Termynal's CSS tricks with modifications
|
||||
border-bottom: .05rem dotted var(--md-default-fg-color--light);
|
||||
cursor: help;
|
||||
}
|
||||
|
||||
/* Opinions: interactive logo tabs */
|
||||
.fastapi-opinions {
|
||||
margin: 1.5rem 0 2rem;
|
||||
}
|
||||
.fastapi-opinions__tabs {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: 0.25rem;
|
||||
margin-bottom: 1.5rem;
|
||||
border-bottom: 1px solid var(--md-default-fg-color--lightest);
|
||||
}
|
||||
.fastapi-opinions__tab {
|
||||
position: relative;
|
||||
appearance: none;
|
||||
background: none;
|
||||
border: 0;
|
||||
padding: 0.625rem 0.5rem;
|
||||
margin: 0;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: inherit;
|
||||
font: inherit;
|
||||
min-height: 40px;
|
||||
min-width: 0;
|
||||
}
|
||||
.fastapi-opinions__tab::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
right: 50%;
|
||||
bottom: -1px;
|
||||
height: 2px;
|
||||
background-color: var(--md-primary-fg-color);
|
||||
opacity: 0;
|
||||
transition: left 0.2s ease, right 0.2s ease, opacity 0.2s ease;
|
||||
}
|
||||
.fastapi-opinions__tab[aria-selected="true"]::after {
|
||||
left: 12%;
|
||||
right: 12%;
|
||||
opacity: 1;
|
||||
}
|
||||
.fastapi-opinions__tab:focus-visible {
|
||||
outline: 2px solid var(--md-primary-fg-color);
|
||||
outline-offset: 2px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.fastapi-opinions__mark {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 22px;
|
||||
max-width: 100%;
|
||||
filter: grayscale(1);
|
||||
opacity: 0.5;
|
||||
transition: filter 0.2s, opacity 0.2s;
|
||||
}
|
||||
.fastapi-opinions__mark img {
|
||||
height: 100%;
|
||||
width: auto;
|
||||
max-width: 100%;
|
||||
object-fit: contain;
|
||||
display: block;
|
||||
}
|
||||
.fastapi-opinions__tab:hover .fastapi-opinions__mark {
|
||||
filter: grayscale(0.3);
|
||||
opacity: 0.85;
|
||||
}
|
||||
.fastapi-opinions__tab[aria-selected="true"] .fastapi-opinions__mark {
|
||||
filter: grayscale(0);
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/* Dark mode: brighten dark wordmarks so they read on slate */
|
||||
[data-md-color-scheme="slate"] .fastapi-opinions__mark {
|
||||
filter: grayscale(1) invert(0.85);
|
||||
}
|
||||
[data-md-color-scheme="slate"] .fastapi-opinions__tab:hover .fastapi-opinions__mark {
|
||||
filter: grayscale(0.3) invert(0.4);
|
||||
}
|
||||
[data-md-color-scheme="slate"] .fastapi-opinions__tab[aria-selected="true"] .fastapi-opinions__mark {
|
||||
filter: none;
|
||||
}
|
||||
|
||||
.fastapi-opinions__panel {
|
||||
position: relative;
|
||||
padding: 0.5rem 1rem 0.5rem 3rem;
|
||||
}
|
||||
.fastapi-opinions__panel::before {
|
||||
content: "\201C";
|
||||
position: absolute;
|
||||
top: -0.75rem;
|
||||
left: 0.25rem;
|
||||
font-family: Georgia, "Times New Roman", serif;
|
||||
font-size: 4rem;
|
||||
line-height: 1;
|
||||
color: var(--md-primary-fg-color);
|
||||
opacity: 0.18;
|
||||
pointer-events: none;
|
||||
}
|
||||
.md-typeset blockquote.fastapi-opinions__quote {
|
||||
margin: 0;
|
||||
font-size: 1rem;
|
||||
font-style: italic;
|
||||
line-height: 1.65;
|
||||
color: var(--md-default-fg-color);
|
||||
border-left: 0;
|
||||
padding-left: 0;
|
||||
}
|
||||
.fastapi-opinions__quote strong { font-style: normal; }
|
||||
.fastapi-opinions__attr {
|
||||
margin-top: 0.875rem;
|
||||
font-size: 0.8rem;
|
||||
color: var(--md-default-fg-color--light);
|
||||
}
|
||||
.fastapi-opinions__attr strong { color: var(--md-default-fg-color); }
|
||||
.fastapi-opinions__attr a {
|
||||
color: var(--md-primary-fg-color);
|
||||
text-decoration: none;
|
||||
font-size: 0.75rem;
|
||||
margin-left: 0.25rem;
|
||||
}
|
||||
.fastapi-opinions__attr a:hover { text-decoration: underline; }
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.fastapi-opinions__tab::after { transition: none; }
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.fastapi-opinions__tabs { gap: 0.125rem; }
|
||||
.fastapi-opinions__mark { height: 18px; }
|
||||
.fastapi-opinions__panel { padding-left: 2.25rem; }
|
||||
.fastapi-opinions__panel::before { font-size: 3rem; }
|
||||
}
|
||||
|
||||
.fastapi-sponsors {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 1rem 1.25rem;
|
||||
margin: 1rem 0 2rem;
|
||||
}
|
||||
|
||||
.fastapi-sponsors__card {
|
||||
transition: transform 0.15s ease;
|
||||
}
|
||||
|
||||
.fastapi-sponsors__card:hover {
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
.fastapi-sponsors__card--keystone {
|
||||
width: 100%;
|
||||
max-width: 560px;
|
||||
}
|
||||
|
||||
.fastapi-sponsors__banner {
|
||||
display: block;
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
.fastapi-sponsors__card--keystone .fastapi-sponsors__banner { width: 100%; }
|
||||
.fastapi-sponsors__card--gold .fastapi-sponsors__banner { height: 80px; }
|
||||
.fastapi-sponsors__card--silver .fastapi-sponsors__banner { height: 60px; }
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.fastapi-sponsors__card--gold .fastapi-sponsors__banner { height: 64px; }
|
||||
.fastapi-sponsors__card--silver .fastapi-sponsors__banner { height: 50px; }
|
||||
}
|
||||
|
||||
.fastapi-feature-banner {
|
||||
display: block;
|
||||
max-width: 680px;
|
||||
margin: 1rem auto 1.5rem;
|
||||
}
|
||||
.fastapi-feature-banner img {
|
||||
display: block;
|
||||
width: 100%;
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
/* Hidden in MkDocs; rendered on GitHub (which doesn't load this stylesheet) */
|
||||
.only-github { display: none; }
|
||||
|
||||
@@ -16,7 +16,7 @@ FastAPI Cloud is the primary sponsor and funding provider for the *FastAPI and f
|
||||
|
||||
## Cloud Providers - Sponsors { #cloud-providers-sponsors }
|
||||
|
||||
Some other cloud providers ✨ [**sponsor FastAPI**](../help-fastapi.md#sponsor-the-author) ✨ too. 🙇
|
||||
Some other cloud providers ✨ [**sponsor FastAPI**](https://github.com/sponsors/tiangolo) ✨ too. 🙇
|
||||
|
||||
You might also want to consider them to follow their guides and try their services:
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@ Successfully installed fastapi pydantic
|
||||
|
||||
</div>
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
There are other formats and tools to define and install package dependencies.
|
||||
|
||||
@@ -283,7 +283,7 @@ CMD ["fastapi", "run", "app/main.py", "--proxy-headers", "--port", "80"]
|
||||
|
||||
#### Docker Cache { #docker-cache }
|
||||
|
||||
There's an important trick in this `Dockerfile`, we first copy the **file with the dependencies alone**, not the rest of the code. Let me tell you why is that.
|
||||
There's an important trick in this `Dockerfile`, we first copy the **file with the dependencies alone**, not the rest of the code. Let me tell you why that is.
|
||||
|
||||
```Dockerfile
|
||||
COPY ./requirements.txt /code/requirements.txt
|
||||
@@ -301,7 +301,7 @@ RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
|
||||
|
||||
The file with the package requirements **won't change frequently**. So, by copying only that file, Docker will be able to **use the cache** for that step.
|
||||
|
||||
And then, Docker will be able to **use the cache for the next step** that downloads and install those dependencies. And here's where we **save a lot of time**. ✨ ...and avoid boredom waiting. 😪😆
|
||||
And then, Docker will be able to **use the cache for the next step** that downloads and installs those dependencies. And here's where we **save a lot of time**. ✨ ...and avoid boredom waiting. 😪😆
|
||||
|
||||
Downloading and installing the package dependencies **could take minutes**, but using the **cache** would **take seconds** at most.
|
||||
|
||||
@@ -488,7 +488,7 @@ And normally this **load balancer** would be able to handle requests that go to
|
||||
|
||||
In this type of scenario, you probably would want to have **a single (Uvicorn) process per container**, as you would already be handling replication at the cluster level.
|
||||
|
||||
So, in this case, you **would not** want to have a multiple workers in the container, for example with the `--workers` command line option. You would want to have just a **single Uvicorn process** per container (but probably multiple containers).
|
||||
So, in this case, you **would not** want to have multiple workers in the container, for example with the `--workers` command line option. You would want to have just a **single Uvicorn process** per container (but probably multiple containers).
|
||||
|
||||
Having another process manager inside the container (as would be with multiple workers) would only add **unnecessary complexity** that you are most probably already taking care of with your cluster system.
|
||||
|
||||
@@ -544,7 +544,7 @@ If you run **a single process per container** you will have a more or less well-
|
||||
|
||||
And then you can set those same memory limits and requirements in your configurations for your container management system (for example in **Kubernetes**). That way it will be able to **replicate the containers** in the **available machines** taking into account the amount of memory needed by them, and the amount available in the machines in the cluster.
|
||||
|
||||
If your application is **simple**, this will probably **not be a problem**, and you might not need to specify hard memory limits. But if you are **using a lot of memory** (for example with **machine learning** models), you should check how much memory you are consuming and adjust the **number of containers** that runs in **each machine** (and maybe add more machines to your cluster).
|
||||
If your application is **simple**, this will probably **not be a problem**, and you might not need to specify hard memory limits. But if you are **using a lot of memory** (for example with **machine learning** models), you should check how much memory you are consuming and adjust the **number of containers** that run on **each machine** (and maybe add more machines to your cluster).
|
||||
|
||||
If you run **multiple processes per container** you will have to make sure that the number of processes started doesn't **consume more memory** than what is available.
|
||||
|
||||
@@ -556,7 +556,7 @@ If you are using containers (e.g. Docker, Kubernetes), then there are two main a
|
||||
|
||||
If you have **multiple containers**, probably each one running a **single process** (for example, in a **Kubernetes** cluster), then you would probably want to have a **separate container** doing the work of the **previous steps** in a single container, running a single process, **before** running the replicated worker containers.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
If you are using Kubernetes, this would probably be an [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/).
|
||||
|
||||
|
||||
@@ -192,7 +192,7 @@ All this renewal process, while still serving the app, is one of the main reason
|
||||
|
||||
## Proxy Forwarded Headers { #proxy-forwarded-headers }
|
||||
|
||||
When using a proxy to handle HTTPS, your **application server** (for example Uvicorn via FastAPI CLI) doesn't known anything about the HTTPS process, it communicates with plain HTTP with the **TLS Termination Proxy**.
|
||||
When using a proxy to handle HTTPS, your **application server** (for example Uvicorn via FastAPI CLI) doesn't know anything about the HTTPS process, it communicates with plain HTTP with the **TLS Termination Proxy**.
|
||||
|
||||
This **proxy** would normally set some HTTP headers on the fly before transmitting the request to the **application server**, to let the application server know that the request is being **forwarded** by the proxy.
|
||||
|
||||
|
||||
@@ -56,7 +56,6 @@ There are several alternatives, including:
|
||||
* [Hypercorn](https://hypercorn.readthedocs.io/): an ASGI server compatible with HTTP/2 and Trio among other features.
|
||||
* [Daphne](https://github.com/django/daphne): the ASGI server built for Django Channels.
|
||||
* [Granian](https://github.com/emmett-framework/granian): A Rust HTTP server for Python applications.
|
||||
* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit is a lightweight and versatile web application runtime.
|
||||
|
||||
## Server Machine and Server Program { #server-machine-and-server-program }
|
||||
|
||||
@@ -94,7 +93,7 @@ A similar process would apply to any other ASGI server program.
|
||||
|
||||
By adding the `standard`, Uvicorn will install and use some recommended extra dependencies.
|
||||
|
||||
That including `uvloop`, the high-performance drop-in replacement for `asyncio`, that provides the big concurrency performance boost.
|
||||
That includes `uvloop`, the high-performance drop-in replacement for `asyncio`, that provides the big concurrency performance boost.
|
||||
|
||||
When you install FastAPI with something like `pip install "fastapi[standard]"` you already get `uvicorn[standard]` as well.
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ As you saw in the previous chapter about [Deployment Concepts](concepts.md), the
|
||||
|
||||
Here I'll show you how to use **Uvicorn** with **worker processes** using the `fastapi` command or the `uvicorn` command directly.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
If you are using containers, for example with Docker or Kubernetes, I'll tell you more about that in the next chapter: [FastAPI in Containers - Docker](docker.md).
|
||||
|
||||
|
||||
@@ -20,4 +20,4 @@ By default, the extension will automatically discover FastAPI applications in yo
|
||||
- **Deploy to FastAPI Cloud** - One-click deployment of your app to [FastAPI Cloud](https://fastapicloud.com/).
|
||||
- **Stream Application Logs** - Real-time log streaming from your FastAPI Cloud-deployed application with level filtering and text search.
|
||||
|
||||
If you'd like to familiarize yourself with the extension's features, you can checkout the extension walkthrough by opening the Command Palette (<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd> or on macOS: <kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>) and selecting "Welcome: Open walkthrough..." and then choosing the "Get started with FastAPI" walkthrough.
|
||||
If you'd like to familiarize yourself with the extension's features, you can check out the extension walkthrough by opening the Command Palette (<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd> or on macOS: <kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>) and selecting "Welcome: Open walkthrough..." and then choosing the "Get started with FastAPI" walkthrough.
|
||||
|
||||
@@ -159,7 +159,7 @@ You can read more about it at [The Twelve-Factor App: Config](https://12factor.n
|
||||
|
||||
## Types and Validation { #types-and-validation }
|
||||
|
||||
These environment variables can only handle **text strings**, as they are external to Python and have to be compatible with other programs and the rest of the system (and even with different operating systems, as Linux, Windows, macOS).
|
||||
These environment variables can only handle **text strings**, as they are external to Python and have to be compatible with other programs and the rest of the system (and even with different operating systems, such as Linux, Windows, and macOS).
|
||||
|
||||
That means that **any value** read in Python from an environment variable **will be a `str`**, and any conversion to a different type or any validation has to be done in code.
|
||||
|
||||
|
||||
@@ -1,12 +1,17 @@
|
||||
---
|
||||
include_yaml:
|
||||
topic_repos: data/topic_repos.yml
|
||||
---
|
||||
|
||||
# External Links
|
||||
|
||||
**FastAPI** has a great community constantly growing.
|
||||
|
||||
There are many posts, articles, tools, and projects, related to **FastAPI**.
|
||||
There are many posts, articles, tools, and projects related to **FastAPI**.
|
||||
|
||||
You could easily use a search engine or video platform to find many resources related to FastAPI.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
Before, this page used to list links to external articles.
|
||||
|
||||
|
||||
@@ -95,7 +95,7 @@ which would be equivalent to:
|
||||
from backend.main import app
|
||||
```
|
||||
|
||||
### `fastapi dev` with path { #fastapi-dev-with-path }
|
||||
### `fastapi dev` with path or with `--entrypoint` CLI option { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
|
||||
|
||||
You can also pass the file path to the `fastapi dev` command, and it will guess the FastAPI app object to use:
|
||||
|
||||
@@ -103,7 +103,13 @@ You can also pass the file path to the `fastapi dev` command, and it will guess
|
||||
$ fastapi dev main.py
|
||||
```
|
||||
|
||||
But you would have to remember to pass the correct path every time you call the `fastapi` command.
|
||||
Or, you can also pass the `--entrypoint` option to the `fastapi dev` command:
|
||||
|
||||
```console
|
||||
$ fastapi dev --entrypoint main:app
|
||||
```
|
||||
|
||||
But you would have to remember to pass the correct path\entrypoint every time you call the `fastapi` command.
|
||||
|
||||
Additionally, other tools might not be able to find it, for example the [VS Code Extension](editor-support.md) or [FastAPI Cloud](https://fastapicloud.com), so it is recommended to use the `entrypoint` in `pyproject.toml`.
|
||||
|
||||
|
||||
@@ -1,6 +1,16 @@
|
||||
---
|
||||
hide:
|
||||
- navigation
|
||||
|
||||
include_yaml:
|
||||
github_sponsors: data/github_sponsors.yml
|
||||
people: data/people.yml
|
||||
contributors: data/contributors.yml
|
||||
translation_reviewers: data/translation_reviewers.yml
|
||||
skip_users: data/skip_users.yml
|
||||
members: data/members.yml
|
||||
sponsors_badge: data/sponsors_badge.yml
|
||||
sponsors: data/sponsors.yml
|
||||
---
|
||||
|
||||
# FastAPI People
|
||||
@@ -21,7 +31,7 @@ This is me:
|
||||
|
||||
</div>
|
||||
|
||||
I'm the creator of **FastAPI**. You can read more about that in [Help FastAPI - Get Help - Connect with the author](help-fastapi.md#connect-with-the-author).
|
||||
I'm the creator of **FastAPI**. You can read more about that in [Help FastAPI - Follow the author](help-fastapi.md#follow-the-author).
|
||||
|
||||
...But here I want to show you the community.
|
||||
|
||||
@@ -32,9 +42,9 @@ I'm the creator of **FastAPI**. You can read more about that in [Help FastAPI -
|
||||
These are the people that:
|
||||
|
||||
* [Help others with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github).
|
||||
* [Create Pull Requests](help-fastapi.md#create-a-pull-request).
|
||||
* Review Pull Requests, [especially important for translations](contributing.md#translations).
|
||||
* Help [manage the repository](management-tasks.md) (team members).
|
||||
* Create Pull Requests.
|
||||
* Review Pull Requests, especially important for translations.
|
||||
* Help [manage the repository](https://tiangolo.com/open-source/management-tasks/) (team members).
|
||||
|
||||
All these tasks help maintain the repository.
|
||||
|
||||
@@ -44,7 +54,7 @@ A round of applause to them. 👏 🙇
|
||||
|
||||
This is the current list of team members. 😎
|
||||
|
||||
They have different levels of involvement and permissions, they can perform [repository management tasks](./management-tasks.md) and together we [manage the FastAPI repository](./management.md).
|
||||
They have different levels of involvement and permissions, they can perform [repository management tasks](https://tiangolo.com/open-source/management-tasks/) and together we [manage the FastAPI repository](./management.md).
|
||||
|
||||
<div class="user-list user-list-center">
|
||||
|
||||
@@ -56,7 +66,7 @@ They have different levels of involvement and permissions, they can perform [rep
|
||||
|
||||
</div>
|
||||
|
||||
Although the team members have the permissions to perform privileged tasks, all the [help from others maintaining FastAPI](./help-fastapi.md#help-maintain-fastapi) is very much appreciated! 🙇♂️
|
||||
Although the team members have the permissions to perform privileged tasks, all the help from others maintaining FastAPI is very much appreciated! 🙇♂️
|
||||
|
||||
## FastAPI Experts
|
||||
|
||||
@@ -176,7 +186,7 @@ These are the users that have [helped others the most with questions in GitHub](
|
||||
|
||||
Here are the **Top Contributors**. 👷
|
||||
|
||||
These users have [created the most Pull Requests](help-fastapi.md#create-a-pull-request) that have been *merged*.
|
||||
These users have created the most Pull Requests that have been *merged*.
|
||||
|
||||
They have contributed source code, documentation, etc. 📦
|
||||
|
||||
@@ -200,7 +210,7 @@ There are hundreds of other contributors, you can see them all in the [FastAPI G
|
||||
|
||||
These users are the **Top Translation Reviewers**. 🕵️
|
||||
|
||||
Translation reviewers have the [**power to approve translations**](contributing.md#translations) of the documentation. Without them, there wouldn't be documentation in several other languages.
|
||||
Translation reviewers have the **power to approve translations** of the documentation. Without them, there wouldn't be documentation in several other languages.
|
||||
|
||||
<div class="user-list user-list-center">
|
||||
{% for user in (translation_reviewers.values() | list)[:50] %}
|
||||
|
||||
@@ -63,7 +63,7 @@ second_user_data = {
|
||||
my_second_user: User = User(**second_user_data)
|
||||
```
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
`**second_user_data` means:
|
||||
|
||||
@@ -73,11 +73,11 @@ Pass the keys and values of the `second_user_data` dict directly as key-value ar
|
||||
|
||||
### Editor support { #editor-support }
|
||||
|
||||
All the framework was designed to be easy and intuitive to use, all the decisions were tested on multiple editors even before starting development, to ensure the best development experience.
|
||||
The whole framework was designed to be easy and intuitive to use, all the decisions were tested on multiple editors even before starting development, to ensure the best development experience.
|
||||
|
||||
In the Python developer surveys, it's clear [that one of the most used features is "autocompletion"](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features).
|
||||
|
||||
The whole **FastAPI** framework is based to satisfy that. Autocompletion works everywhere.
|
||||
The whole **FastAPI** framework is designed to satisfy that. Autocompletion works everywhere.
|
||||
|
||||
You will rarely need to come back to the docs.
|
||||
|
||||
@@ -147,7 +147,7 @@ FastAPI includes an extremely easy to use, but extremely powerful <dfn title='al
|
||||
|
||||
### Unlimited "plug-ins" { #unlimited-plug-ins }
|
||||
|
||||
Or in other way, no need for them, import and use the code you need.
|
||||
Or, in other words, no need for them, import and use the code you need.
|
||||
|
||||
Any integration is designed to be so simple to use (with dependencies) that you can create a "plug-in" for your application in 2 lines of code using the same structure and syntax used for your *path operations*.
|
||||
|
||||
@@ -179,7 +179,7 @@ With **FastAPI** you get all of **Starlette**'s features (as FastAPI is just Sta
|
||||
|
||||
**FastAPI** is fully compatible with (and based on) [**Pydantic**](https://docs.pydantic.dev/). So, any additional Pydantic code you have, will also work.
|
||||
|
||||
Including external libraries also based on Pydantic, as <abbr title="Object-Relational Mapper">ORM</abbr>s, <abbr title="Object-Document Mapper">ODM</abbr>s for databases.
|
||||
Including external libraries also based on Pydantic, such as <abbr title="Object-Relational Mapper">ORM</abbr>s and <abbr title="Object-Document Mapper">ODM</abbr>s for databases.
|
||||
|
||||
This also means that in many cases you can pass the same object you get from a request **directly to the database**, as everything is validated automatically.
|
||||
|
||||
|
||||
@@ -1,14 +1,8 @@
|
||||
# Help FastAPI - Get Help { #help-fastapi-get-help }
|
||||
# Help { #help }
|
||||
|
||||
Do you like **FastAPI**?
|
||||
Would you like to help FastAPI or get help about FastAPI?
|
||||
|
||||
Would you like to help FastAPI, other users, and the author?
|
||||
|
||||
Or would you like to get help with **FastAPI**?
|
||||
|
||||
There are very simple ways to help (several involve just one or two clicks).
|
||||
|
||||
And there are several ways to get help too.
|
||||
There are very simple ways to help and get help.
|
||||
|
||||
## Subscribe to the newsletter { #subscribe-to-the-newsletter }
|
||||
|
||||
@@ -20,15 +14,19 @@ You can subscribe to the (infrequent) [**FastAPI and friends** newsletter](newsl
|
||||
* Breaking changes 🚨
|
||||
* Tips and tricks ✅
|
||||
|
||||
## Follow FastAPI on X (Twitter) { #follow-fastapi-on-x-twitter }
|
||||
## Follow FastAPI online { #follow-fastapi-online }
|
||||
|
||||
[Follow @fastapi on **X (Twitter)**](https://x.com/fastapi) to get the latest news about **FastAPI**. 🐦
|
||||
You can follow **FastAPI** online in several places:
|
||||
|
||||
* [@fastapi on **X / Twitter**](https://x.com/fastapi)
|
||||
* [@fastapi.tiangolo.com on **Bluesky**](https://bsky.app/profile/fastapi.tiangolo.com)
|
||||
* [FastAPI on **LinkedIn**](https://www.linkedin.com/company/fastapi/)
|
||||
|
||||
## Star **FastAPI** in GitHub { #star-fastapi-in-github }
|
||||
|
||||
You can "star" FastAPI in GitHub (clicking the star button at the top right): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). ⭐️
|
||||
|
||||
By adding a star, other users will be able to find it more easily and see that it has been already useful for others.
|
||||
By adding a star, other users will be able to find it more easily and see that it has already been useful for others.
|
||||
|
||||
## Watch the GitHub repository for releases { #watch-the-github-repository-for-releases }
|
||||
|
||||
@@ -38,98 +36,28 @@ There you can select "Releases only".
|
||||
|
||||
By doing it, you will receive notifications (in your email) whenever there's a new release (a new version) of **FastAPI** with bug fixes and new features.
|
||||
|
||||
## Connect with the author { #connect-with-the-author }
|
||||
## Follow the author { #follow-the-author }
|
||||
|
||||
You can connect with [me (Sebastián Ramírez / `tiangolo`)](https://tiangolo.com), the author.
|
||||
You can follow [me (Sebastián Ramírez / `tiangolo`)](https://tiangolo.com), the author in a few places, to hear when I have news to share about FastAPI and friends:
|
||||
|
||||
You can:
|
||||
|
||||
* [Follow me on **GitHub**](https://github.com/tiangolo).
|
||||
* See other Open Source projects I have created that could help you.
|
||||
* Follow me to see when I create a new Open Source project.
|
||||
* [Follow me on **X (Twitter)**](https://x.com/tiangolo) or [Mastodon](https://fosstodon.org/@tiangolo).
|
||||
* Tell me how you use FastAPI (I love to hear that).
|
||||
* Hear when I make announcements or release new tools.
|
||||
* You can also [follow @fastapi on X (Twitter)](https://x.com/fastapi) (a separate account).
|
||||
* [Follow me on **LinkedIn**](https://www.linkedin.com/in/tiangolo/).
|
||||
* Hear when I make announcements or release new tools (although I use X (Twitter) more often 🤷♂).
|
||||
* Read what I write (or follow me) on [**Dev.to**](https://dev.to/tiangolo) or [**Medium**](https://medium.com/@tiangolo).
|
||||
* Read other ideas, articles, and read about tools I have created.
|
||||
* Follow me to read when I publish something new.
|
||||
|
||||
## Tweet about **FastAPI** { #tweet-about-fastapi }
|
||||
|
||||
[Tweet about **FastAPI**](https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi) and let me and others know why you like it. 🎉
|
||||
|
||||
I love to hear about how **FastAPI** is being used, what you have liked in it, in which project/company are you using it, etc.
|
||||
|
||||
## Vote for FastAPI { #vote-for-fastapi }
|
||||
|
||||
* [Vote for **FastAPI** in Slant](https://www.slant.co/options/34241/~fastapi-review).
|
||||
* [Vote for **FastAPI** in AlternativeTo](https://alternativeto.net/software/fastapi/about/).
|
||||
* [Say you use **FastAPI** on StackShare](https://stackshare.io/pypi-fastapi).
|
||||
* [@tiangolo on **GitHub**](https://github.com/tiangolo).
|
||||
* [@tiangolo on **X (Twitter)**](https://x.com/tiangolo)
|
||||
* [@tiangolo.com on **Bluesky**](https://bsky.app/profile/tiangolo.com)
|
||||
* [@tiangolo on **LinkedIn**](https://www.linkedin.com/in/tiangolo/).
|
||||
|
||||
## Help others with questions in GitHub { #help-others-with-questions-in-github }
|
||||
|
||||
You can try and help others with their questions in:
|
||||
|
||||
* [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered)
|
||||
* [GitHub Issues](https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+)
|
||||
You can try and help others with their questions in [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered).
|
||||
|
||||
In many cases you might already know the answer for those questions. 🤓
|
||||
|
||||
If you are helping a lot of people with their questions, you will become an official [FastAPI Expert](fastapi-people.md#fastapi-experts). 🎉
|
||||
|
||||
Just remember, the most important point is: try to be kind. People come with their frustrations and in many cases don't ask in the best way, but try as best as you can to be kind. 🤗
|
||||
Just remember, the most important point is: try to be kind. 🤗
|
||||
|
||||
The idea is for the **FastAPI** community to be kind and welcoming. At the same time, don't accept bullying or disrespectful behavior towards others. We have to take care of each other.
|
||||
### How to Help { #how-to-help }
|
||||
|
||||
---
|
||||
|
||||
Here's how to help others with questions (in discussions or issues):
|
||||
|
||||
### Understand the question { #understand-the-question }
|
||||
|
||||
* Check if you can understand what is the **purpose** and use case of the person asking.
|
||||
|
||||
* Then check if the question (the vast majority are questions) is **clear**.
|
||||
|
||||
* In many cases the question asked is about an imaginary solution from the user, but there might be a **better** one. If you can understand the problem and use case better, you might be able to suggest a better **alternative solution**.
|
||||
|
||||
* If you can't understand the question, ask for more **details**.
|
||||
|
||||
### Reproduce the problem { #reproduce-the-problem }
|
||||
|
||||
For most of the cases and most of the questions there's something related to the person's **original code**.
|
||||
|
||||
In many cases they will only copy a fragment of the code, but that's not enough to **reproduce the problem**.
|
||||
|
||||
* You can ask them to provide a [minimal, reproducible, example](https://stackoverflow.com/help/minimal-reproducible-example), that you can **copy-paste** and run locally to see the same error or behavior they are seeing, or to understand their use case better.
|
||||
|
||||
* If you are feeling too generous, you can try to **create an example** like that yourself, just based on the description of the problem. Just keep in mind that this might take a lot of time and it might be better to ask them to clarify the problem first.
|
||||
|
||||
### Suggest solutions { #suggest-solutions }
|
||||
|
||||
* After being able to understand the question, you can give them a possible **answer**.
|
||||
|
||||
* In many cases, it's better to understand their **underlying problem or use case**, because there might be a better way to solve it than what they are trying to do.
|
||||
|
||||
### Ask to close { #ask-to-close }
|
||||
|
||||
If they reply, there's a high chance you would have solved their problem, congrats, **you're a hero**! 🦸
|
||||
|
||||
* Now, if that solved their problem, you can ask them to:
|
||||
|
||||
* In GitHub Discussions: mark the comment as the **answer**.
|
||||
* In GitHub Issues: **close** the issue.
|
||||
|
||||
## Watch the GitHub repository { #watch-the-github-repository }
|
||||
|
||||
You can "watch" FastAPI in GitHub (clicking the "watch" button at the top right): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi). 👀
|
||||
|
||||
If you select "Watching" instead of "Releases only" you will receive notifications when someone creates a new issue or question. You can also specify that you only want to be notified about new issues, or discussions, or PRs, etc.
|
||||
|
||||
Then you can try and help them solve those questions.
|
||||
Follow the [guide on how to help](https://tiangolo.com/open-source/help/#help-others-with-questions-in-github) here.
|
||||
|
||||
## Ask Questions { #ask-questions }
|
||||
|
||||
@@ -138,119 +66,22 @@ You can [create a new question](https://github.com/fastapi/fastapi/discussions/n
|
||||
* Ask a **question** or ask about a **problem**.
|
||||
* Suggest a new **feature**.
|
||||
|
||||
**Note**: if you do it, then I'm going to ask you to also help others. 😉
|
||||
|
||||
## Review Pull Requests { #review-pull-requests }
|
||||
|
||||
You can help me review pull requests from others.
|
||||
|
||||
Again, please try your best to be kind. 🤗
|
||||
|
||||
---
|
||||
|
||||
Here's what to keep in mind and how to review a pull request:
|
||||
|
||||
### Understand the problem { #understand-the-problem }
|
||||
|
||||
* First, make sure you **understand the problem** that the pull request is trying to solve. It might have a longer discussion in a GitHub Discussion or issue.
|
||||
|
||||
* There's also a good chance that the pull request is not actually needed because the problem can be solved in a **different way**. Then you can suggest or ask about that.
|
||||
|
||||
### Don't worry about style { #dont-worry-about-style }
|
||||
|
||||
* Don't worry too much about things like commit message styles, I will squash and merge customizing the commit manually.
|
||||
|
||||
* Also don't worry about style rules, there are already automatized tools checking that.
|
||||
|
||||
And if there's any other style or consistency need, I'll ask directly for that, or I'll add commits on top with the needed changes.
|
||||
|
||||
### Check the code { #check-the-code }
|
||||
|
||||
* Check and read the code, see if it makes sense, **run it locally** and see if it actually solves the problem.
|
||||
|
||||
* Then **comment** saying that you did that, that's how I will know you really checked it.
|
||||
|
||||
/// info
|
||||
|
||||
Unfortunately, I can't simply trust PRs that just have several approvals.
|
||||
|
||||
Several times it has happened that there are PRs with 3, 5 or more approvals, probably because the description is appealing, but when I check the PRs, they are actually broken, have a bug, or don't solve the problem they claim to solve. 😅
|
||||
|
||||
So, it's really important that you actually read and run the code, and let me know in the comments that you did. 🤓
|
||||
|
||||
///
|
||||
|
||||
* If the PR can be simplified in a way, you can ask for that, but there's no need to be too picky, there might be a lot of subjective points of view (and I will have my own as well 🙈), so it's better if you can focus on the fundamental things.
|
||||
|
||||
### Tests { #tests }
|
||||
|
||||
* Help me check that the PR has **tests**.
|
||||
|
||||
* Check that the tests **fail** before the PR. 🚨
|
||||
|
||||
* Then check that the tests **pass** after the PR. ✅
|
||||
|
||||
* Many PRs don't have tests, you can **remind** them to add tests, or you can even **suggest** some tests yourself. That's one of the things that consume most time and you can help a lot with that.
|
||||
|
||||
* Then also comment what you tried, that way I'll know that you checked it. 🤓
|
||||
|
||||
## Create a Pull Request { #create-a-pull-request }
|
||||
|
||||
You can [contribute](contributing.md) to the source code with Pull Requests, for example:
|
||||
|
||||
* To fix a typo you found on the documentation.
|
||||
* To share an article, video, or podcast you created or found about FastAPI by [editing this file](https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml).
|
||||
* Make sure you add your link to the start of the corresponding section.
|
||||
* To help [translate the documentation](contributing.md#translations) to your language.
|
||||
* You can also help to review the translations created by others.
|
||||
* To propose new documentation sections.
|
||||
* To fix an existing issue/bug.
|
||||
* Make sure to add tests.
|
||||
* To add a new feature.
|
||||
* Make sure to add tests.
|
||||
* Make sure to add documentation if it's relevant.
|
||||
|
||||
## Help Maintain FastAPI { #help-maintain-fastapi }
|
||||
|
||||
Help me maintain **FastAPI**! 🤓
|
||||
|
||||
There's a lot of work to do, and for most of it, **YOU** can do it.
|
||||
|
||||
The main tasks that you can do right now are:
|
||||
|
||||
* [Help others with questions in GitHub](#help-others-with-questions-in-github) (see the section above).
|
||||
* [Review Pull Requests](#review-pull-requests) (see the section above).
|
||||
|
||||
Those two tasks are what **consume time the most**. That's the main work of maintaining FastAPI.
|
||||
|
||||
If you can help me with that, **you are helping me maintain FastAPI** and making sure it keeps **advancing faster and better**. 🚀
|
||||
|
||||
## Join the chat { #join-the-chat }
|
||||
## Join the Chat { #join-the-chat }
|
||||
|
||||
Join the 👥 [Discord chat server](https://discord.gg/VQjSZaeJmf) 👥 and hang out with others in the FastAPI community.
|
||||
|
||||
/// tip
|
||||
|
||||
For questions, ask them in [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/new?category=questions), there's a much better chance you will receive help by the [FastAPI Experts](fastapi-people.md#fastapi-experts).
|
||||
For questions, ask them in GitHub Discussions, there's a much better chance you will receive help.
|
||||
|
||||
Use the chat only for other general conversations.
|
||||
|
||||
///
|
||||
|
||||
### Don't use the chat for questions { #dont-use-the-chat-for-questions }
|
||||
### Don't use the Chat for Questions { #dont-use-the-chat-for-questions }
|
||||
|
||||
Keep in mind that as chats allow more "free conversation", it's easy to ask questions that are too general and more difficult to answer, so, you might not receive answers.
|
||||
|
||||
In GitHub, the template will guide you to write the right question so that you can more easily get a good answer, or even solve the problem yourself even before asking. And in GitHub I can make sure I always answer everything, even if it takes some time. I can't personally do that with the chat systems. 😅
|
||||
In GitHub, the template will guide you to write the right question so that you can more easily get a good answer, or even solve the problem yourself even before asking.
|
||||
|
||||
Conversations in the chat systems are also not as easily searchable as in GitHub, so questions and answers might get lost in the conversation. And only the ones in GitHub count to become a [FastAPI Expert](fastapi-people.md#fastapi-experts), so you will most probably receive more attention in GitHub.
|
||||
|
||||
On the other side, there are thousands of users in the chat systems, so there's a high chance you'll find someone to talk to there, almost all the time. 😄
|
||||
|
||||
## Sponsor the author { #sponsor-the-author }
|
||||
|
||||
If your **product/company** depends on or is related to **FastAPI** and you want to reach its users, you can sponsor the author (me) through [GitHub sponsors](https://github.com/sponsors/tiangolo). Depending on the tier, you could get some extra benefits, like a badge in the docs. 🎁
|
||||
|
||||
---
|
||||
|
||||
Thanks! 🚀
|
||||
Conversations in the chat systems are also not as easily searchable as in GitHub, they get lost.
|
||||
|
||||
@@ -67,4 +67,4 @@ presets: [
|
||||
|
||||
These are **JavaScript** objects, not strings, so you can't pass them from Python code directly.
|
||||
|
||||
If you need to use JavaScript-only configurations like those, you can use one of the methods above. Override all the Swagger UI *path operation* and manually write any JavaScript you need.
|
||||
If you need to use JavaScript-only configurations like those, you can use one of the methods above. Override the whole Swagger UI *path operation* and manually write any JavaScript you need.
|
||||
|
||||
@@ -94,7 +94,7 @@ All we need to do is handle the request inside a `try`/`except` block:
|
||||
|
||||
{* ../../docs_src/custom_request_and_route/tutorial002_an_py310.py hl[14,16] *}
|
||||
|
||||
If an exception occurs, the`Request` instance will still be in scope, so we can read and make use of the request body when handling the error:
|
||||
If an exception occurs, the `Request` instance will still be in scope, so we can read and make use of the request body when handling the error:
|
||||
|
||||
{* ../../docs_src/custom_request_and_route/tutorial002_an_py310.py hl[17:19] *}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ And that function `get_openapi()` receives as parameters:
|
||||
* `description`: The description of your API, this can include markdown and will be shown in the docs.
|
||||
* `routes`: A list of routes, these are each of the registered *path operations*. They are taken from `app.routes`.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
The parameter `summary` is available in OpenAPI 3.1.0 and above, supported by FastAPI 0.99.0 and above.
|
||||
|
||||
|
||||
@@ -57,4 +57,4 @@ If you need GraphQL, I still would recommend you check out [Strawberry](https://
|
||||
|
||||
You can learn more about **GraphQL** in the [official GraphQL documentation](https://graphql.org/).
|
||||
|
||||
You can also read more about each those libraries described above in their links.
|
||||
You can also read more about each of those libraries described above in their links.
|
||||
|
||||
@@ -130,6 +130,6 @@ First try with `bump-pydantic`, if your tests pass and that works, then you're d
|
||||
|
||||
If `bump-pydantic` doesn't work for your use case, you can use the support for both Pydantic v1 and v2 models in the same app to do the migration to Pydantic v2 gradually.
|
||||
|
||||
You could fist upgrade Pydantic to use the latest version 2, and change the imports to use `pydantic.v1` for all your models.
|
||||
You could first upgrade Pydantic to use the latest version 2, and change the imports to use `pydantic.v1` for all your models.
|
||||
|
||||
Then, you can start migrating your models from Pydantic v1 to v2 in groups, in gradual steps. 🚶
|
||||
|
||||
@@ -46,7 +46,7 @@ If you interact with the docs and check the response, even though the code didn'
|
||||
|
||||
This means that it will **always have a value**, it's just that sometimes the value could be `None` (or `null` in JSON).
|
||||
|
||||
That means that, clients using your API don't have to check if the value exists or not, they can **assume the field will always be there**, but just that in some cases it will have the default value of `None`.
|
||||
That means that clients using your API don't have to check if the value exists or not, they can **assume the field will always be there**, but just that in some cases it will have the default value of `None`.
|
||||
|
||||
The way to describe this in OpenAPI, is to mark that field as **required**, because it will always be there.
|
||||
|
||||
@@ -85,7 +85,7 @@ Probably the main use case for this is if you already have some autogenerated cl
|
||||
|
||||
In that case, you can disable this feature in **FastAPI**, with the parameter `separate_input_output_schemas=False`.
|
||||
|
||||
/// info
|
||||
/// note
|
||||
|
||||
Support for `separate_input_output_schemas` was added in FastAPI `0.102.0`. 🤓
|
||||
|
||||
|
||||
BIN
docs/en/docs/img/fastapi-conf.jpeg
Normal file
BIN
docs/en/docs/img/fastapi-conf.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 19 KiB |
35
docs/en/docs/img/logos/cisco.svg
Normal file
35
docs/en/docs/img/logos/cisco.svg
Normal file
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
version="1.1"
|
||||
width="216"
|
||||
height="114"
|
||||
fill="#049fd9"
|
||||
id="svg24">
|
||||
<path
|
||||
d="m 106.48,76.238 c -0.282,-0.077 -4.621,-1.196 -9.232,-1.196 -8.73,0 -13.986,4.714 -13.986,11.734 0,6.214 4.397,9.313 9.674,10.98 0.585,0.193 1.447,0.463 2.021,0.653 2.349,0.739 4.224,1.837 4.224,3.739 0,2.127 -2.167,3.504 -6.878,3.504 -4.14,0 -8.109,-1.184 -8.945,-1.395 v 8.637 c 0.466,0.099 5.183,1.025 10.222,1.025 7.248,0 15.539,-3.167 15.539,-12.595 0,-4.573 -2.8,-8.783 -8.947,-10.737 L 97.559,89.755 C 96,89.263 93.217,88.466 93.217,86.181 c 0,-1.805 2.062,-3.076 5.859,-3.076 3.276,0 7.263,1.101 7.404,1.145 z m 80.041,18.243 c 0,5.461 -4.183,9.879 -9.796,9.879 -5.619,0 -9.791,-4.418 -9.791,-9.879 0,-5.45 4.172,-9.87 9.791,-9.87 5.613,0 9.796,4.42 9.796,9.87 m -9.796,-19.427 c -11.544,0 -19.823,8.707 -19.823,19.427 0,10.737 8.279,19.438 19.823,19.438 11.543,0 19.834,-8.701 19.834,-19.438 0,-10.72 -8.291,-19.427 -19.834,-19.427 M 70.561,113.251 H 61.089 V 75.719 h 9.472"
|
||||
id="path10" />
|
||||
<path
|
||||
d="m 48.07,76.399 c -0.89,-0.264 -4.18,-1.345 -8.636,-1.345 -11.526,0 -19.987,8.218 -19.987,19.427 0,12.093 9.34,19.438 19.987,19.438 4.23,0 7.459,-1.002 8.636,-1.336 v -10.075 c -0.407,0.226 -3.503,1.992 -7.957,1.992 -6.31,0 -10.38,-4.441 -10.38,-10.019 0,-5.748 4.246,-10.011 10.38,-10.011 4.53,0 7.576,1.805 7.957,2.004"
|
||||
id="path12" />
|
||||
<use
|
||||
xlink:href="#path12"
|
||||
transform="translate(98.86)"
|
||||
id="use14" />
|
||||
<g
|
||||
id="g22">
|
||||
<path
|
||||
d="m 61.061,4.759 c 0,-2.587 -2.113,-4.685 -4.703,-4.685 -2.589,0 -4.702,2.098 -4.702,4.685 v 49.84 c 0,2.602 2.113,4.699 4.702,4.699 2.59,0 4.703,-2.097 4.703,-4.699 z M 35.232,22.451 c 0,-2.586 -2.112,-4.687 -4.702,-4.687 -2.59,0 -4.702,2.101 -4.702,4.687 v 22.785 c 0,2.601 2.112,4.699 4.702,4.699 2.59,0 4.702,-2.098 4.702,-4.699 z M 9.404,35.383 C 9.404,32.796 7.292,30.699 4.702,30.699 2.115,30.699 0,32.796 0,35.383 v 9.853 c 0,2.601 2.115,4.699 4.702,4.699 2.59,0 4.702,-2.098 4.702,-4.699"
|
||||
id="path16" />
|
||||
<use
|
||||
xlink:href="#path16"
|
||||
transform="matrix(-1,0,0,1,112.717,0)"
|
||||
id="use18" />
|
||||
</g>
|
||||
<use
|
||||
xlink:href="#g22"
|
||||
transform="matrix(-1,0,0,1,216,0)"
|
||||
id="use20" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
8
docs/en/docs/img/logos/microsoft.svg
Normal file
8
docs/en/docs/img/logos/microsoft.svg
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 337.6 72">
|
||||
<path fill="#737373" d="M140.4,14.4v43.2h-7.5V23.7h-0.1l-13.4,33.9h-5l-13.7-33.9h-0.1v33.9h-6.9V14.4h10.8l12.4,32h0.2l13.1-32H140.4 z M146.6,17.7c0-1.2,0.4-2.2,1.3-3c0.9-0.8,1.9-1.2,3.1-1.2c1.3,0,2.4,0.4,3.2,1.2s1.3,1.8,1.3,3c0,1.2-0.4,2.2-1.3,3 c-0.9,0.8-1.9,1.2-3.2,1.2s-2.3-0.4-3.1-1.2C147.1,19.8,146.6,18.8,146.6,17.7z M154.7,26.6v31h-7.3v-31H154.7z M176.8,52.3 c1.1,0,2.3-0.2,3.6-0.8c1.3-0.5,2.5-1.2,3.6-2v6.8c-1.2,0.7-2.5,1.2-4,1.5c-1.5,0.3-3.1,0.5-4.9,0.5c-4.6,0-8.3-1.4-11.1-4.3 c-2.9-2.9-4.3-6.6-4.3-11c0-5,1.5-9.1,4.4-12.3c2.9-3.2,7-4.8,12.4-4.8c1.4,0,2.8,0.2,4.1,0.5c1.4,0.3,2.5,0.8,3.3,1.2v7 c-1.1-0.8-2.3-1.5-3.4-1.9c-1.2-0.4-2.4-0.7-3.6-0.7c-2.9,0-5.2,0.9-7,2.8s-2.6,4.4-2.6,7.6c0,3.1,0.9,5.6,2.6,7.3 C171.6,51.4,173.9,52.3,176.8,52.3z M204.7,26.1c0.6,0,1.1,0,1.6,0.1s0.9,0.2,1.2,0.3v7.4c-0.4-0.3-0.9-0.6-1.7-0.8 s-1.6-0.4-2.7-0.4c-1.8,0-3.3,0.8-4.5,2.3s-1.9,3.8-1.9,7v15.6h-7.3v-31h7.3v4.9h0.1c0.7-1.7,1.7-3,3-4 C201.2,26.6,202.8,26.1,204.7,26.1z M207.9,42.6c0-5.1,1.5-9.2,4.3-12.2c2.9-3,6.9-4.5,12-4.5c4.8,0,8.6,1.4,11.3,4.3 s4.1,6.8,4.1,11.7c0,5-1.5,9-4.3,12c-2.9,3-6.8,4.5-11.8,4.5c-4.8,0-8.6-1.4-11.4-4.2C209.3,51.3,207.9,47.4,207.9,42.6z M215.5,42.3c0,3.2,0.7,5.7,2.2,7.4s3.6,2.6,6.3,2.6c2.6,0,4.7-0.8,6.1-2.6c1.4-1.7,2.1-4.2,2.1-7.6c0-3.3-0.7-5.8-2.1-7.6 c-1.4-1.7-3.5-2.6-6-2.6c-2.7,0-4.7,0.9-6.2,2.7C216.2,36.5,215.5,39,215.5,42.3z M250.5,34.8c0,1,0.3,1.9,1,2.5 c0.7,0.6,2.1,1.3,4.4,2.2c2.9,1.2,5,2.5,6.1,3.9c1.2,1.5,1.8,3.2,1.8,5.3c0,2.9-1.1,5.2-3.4,7c-2.2,1.8-5.3,2.6-9.1,2.6 c-1.3,0-2.7-0.2-4.3-0.5c-1.6-0.3-2.9-0.7-4-1.2v-7.2c1.3,0.9,2.8,1.7,4.3,2.2c1.5,0.5,2.9,0.8,4.2,0.8c1.6,0,2.9-0.2,3.6-0.7 c0.8-0.5,1.2-1.2,1.2-2.3c0-1-0.4-1.8-1.2-2.6c-0.8-0.7-2.4-1.5-4.6-2.4c-2.7-1.1-4.6-2.4-5.7-3.8s-1.7-3.2-1.7-5.4 c0-2.8,1.1-5.1,3.3-6.9c2.2-1.8,5.1-2.7,8.6-2.7c1.1,0,2.3,0.1,3.6,0.4s2.5,0.6,3.4,0.9V34c-1-0.6-2.1-1.2-3.4-1.7 c-1.3-0.5-2.6-0.7-3.8-0.7c-1.4,0-2.5,0.3-3.2,0.8C250.9,33.1,250.5,33.8,250.5,34.8z M266.9,42.6c0-5.1,1.5-9.2,4.3-12.2 c2.9-3,6.9-4.5,12-4.5c4.8,0,8.6,1.4,11.3,4.3s4.1,6.8,4.1,11.7c0,5-1.5,9-4.3,12c-2.9,3-6.8,4.5-11.8,4.5c-4.8,0-8.6-1.4-11.4-4.2 C268.4,51.3,266.9,47.4,266.9,42.6z M274.5,42.3c0,3.2,0.7,5.7,2.2,7.4s3.6,2.6,6.3,2.6c2.6,0,4.7-0.8,6.1-2.6 c1.4-1.7,2.1-4.2,2.1-7.6c0-3.3-0.7-5.8-2.1-7.6c-1.4-1.7-3.5-2.6-6-2.6c-2.7,0-4.7,0.9-6.2,2.7C275.3,36.5,274.5,39,274.5,42.3z M322.9,32.6h-10.9v25h-7.4v-25h-5.2v-6h5.2v-4.3c0-3.2,1.1-5.9,3.2-8s4.8-3.1,8.1-3.1c0.9,0,1.7,0.1,2.4,0.1s1.3,0.2,1.8,0.4v6.3 c-0.2-0.1-0.7-0.3-1.3-0.5c-0.6-0.2-1.3-0.3-2.1-0.3c-1.5,0-2.7,0.5-3.5,1.4c-0.8,0.9-1.2,2.4-1.2,4.2v3.7h10.9v-7l7.3-2.2v9.2h7.4 v6h-7.4v14.5c0,1.9,0.4,3.2,1,4c0.7,0.8,1.8,1.2,3.3,1.2c0.4,0,0.9-0.1,1.5-0.3c0.6-0.2,1.1-0.4,1.5-0.7v6c-0.5,0.3-1.2,0.5-2.3,0.7 c-1.1,0.2-2.1,0.3-3.2,0.3c-3.1,0-5.4-0.8-6.9-2.4c-1.5-1.6-2.3-4.1-2.3-7.4L322.9,32.6L322.9,32.6z"/>
|
||||
<rect fill="#F25022" width="34.2" height="34.2"/>
|
||||
<rect x="37.8" fill="#7FBA00" width="34.2" height="34.2"/>
|
||||
<rect y="37.8" fill="#00A4EF" width="34.2" height="34.2"/>
|
||||
<rect x="37.8" y="37.8" fill="#FFB900" width="34.2" height="34.2"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.1 KiB |
1
docs/en/docs/img/logos/netflix.svg
Normal file
1
docs/en/docs/img/logos/netflix.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="276.742" viewBox="0 0 1024 276.742"><path d="M140.803 258.904c-15.404 2.705-31.079 3.516-47.294 5.676l-49.458-144.856v151.073c-15.404 1.621-29.457 3.783-44.051 5.945v-276.742h41.08l56.212 157.021v-157.021h43.511v258.904zm85.131-157.558c16.757 0 42.431-.811 57.835-.811v43.24c-19.189 0-41.619 0-57.835.811v64.322c25.405-1.621 50.809-3.785 76.482-4.596v41.617l-119.724 9.461v-255.39h119.724v43.241h-76.482v58.105zm237.284-58.104h-44.862v198.908c-14.594 0-29.188 0-43.239.539v-199.447h-44.862v-43.242h132.965l-.002 43.242zm70.266 55.132h59.187v43.24h-59.187v98.104h-42.433v-239.718h120.808v43.241h-78.375v55.133zm148.641 103.507c24.594.539 49.456 2.434 73.51 3.783v42.701c-38.646-2.434-77.293-4.863-116.75-5.676v-242.689h43.24v201.881zm109.994 49.457c13.783.812 28.377 1.623 42.43 3.242v-254.58h-42.43v251.338zm231.881-251.338l-54.863 131.615 54.863 145.127c-16.217-2.162-32.432-5.135-48.648-7.838l-31.078-79.994-31.617 73.51c-15.678-2.705-30.812-3.516-46.484-5.678l55.672-126.75-50.269-129.992h46.482l28.377 72.699 30.27-72.699h47.295z" fill="#d81f26"/></svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
39
docs/en/docs/img/logos/uber.svg
Normal file
39
docs/en/docs/img/logos/uber.svg
Normal file
@@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="926.906px" height="321.777px" viewBox="0 0 926.906 321.777" enable-background="new 0 0 926.906 321.777"
|
||||
xml:space="preserve">
|
||||
<g>
|
||||
<path fill="#010202" d="M53.328,229.809c3.917,10.395,9.34,19.283,16.27,26.664c6.93,7.382,15.14,13.031,24.63,16.948
|
||||
c9.491,3.917,19.81,5.875,30.958,5.875c10.847,0,21.015-2.034,30.506-6.102s17.776-9.792,24.856-17.173
|
||||
c7.08-7.382,12.579-16.194,16.496-26.438c3.917-10.244,5.875-21.692,5.875-34.347V0h47.453v316.354h-47.001v-29.376
|
||||
c-10.545,11.147-22.974,19.734-37.285,25.761c-14.312,6.025-29.752,9.038-46.323,9.038c-16.873,0-32.615-2.938-47.228-8.813
|
||||
c-14.612-5.875-27.267-14.235-37.962-25.082S15.441,264.006,9.265,248.79C3.088,233.575,0,216.628,0,197.947V0h47.453v195.236
|
||||
C47.453,207.891,49.411,219.414,53.328,229.809z"/>
|
||||
<path fill="#010202" d="M332.168,0v115.243c10.545-10.545,22.748-18.905,36.607-25.082s28.924-9.265,45.193-9.265
|
||||
c16.873,0,32.689,3.163,47.453,9.49c14.763,6.327,27.567,14.914,38.414,25.761s19.434,23.651,25.761,38.414
|
||||
c6.327,14.764,9.49,30.431,9.49,47.002c0,16.57-3.163,32.162-9.49,46.774c-6.327,14.613-14.914,27.343-25.761,38.188
|
||||
c-10.847,10.847-23.651,19.434-38.414,25.761c-14.764,6.327-30.581,9.49-47.453,9.49c-16.27,0-31.409-3.088-45.419-9.265
|
||||
c-14.01-6.176-26.288-14.537-36.833-25.082v28.924h-45.193V0H332.168z M337.365,232.746c4.067,9.642,9.717,18.078,16.948,25.309
|
||||
c7.231,7.231,15.667,12.956,25.308,17.174c9.642,4.218,20.036,6.327,31.184,6.327c10.847,0,21.09-2.109,30.731-6.327
|
||||
s18.001-9.942,25.083-17.174c7.08-7.23,12.729-15.667,16.947-25.309c4.218-9.641,6.327-20.035,6.327-31.183
|
||||
c0-11.148-2.109-21.618-6.327-31.41s-9.867-18.303-16.947-25.534c-7.081-7.23-15.441-12.88-25.083-16.947
|
||||
s-19.885-6.102-30.731-6.102c-10.846,0-21.09,2.034-30.731,6.102s-18.077,9.717-25.309,16.947
|
||||
c-7.23,7.231-12.955,15.742-17.173,25.534c-4.218,9.792-6.327,20.262-6.327,31.41C331.264,212.711,333.298,223.105,337.365,232.746
|
||||
z"/>
|
||||
<path fill="#010202" d="M560.842,155.014c6.025-14.462,14.312-27.191,24.856-38.188s23.049-19.659,37.511-25.986
|
||||
s30.129-9.49,47.001-9.49c16.571,0,31.937,3.013,46.098,9.038c14.16,6.026,26.362,14.387,36.606,25.083
|
||||
c10.244,10.695,18.229,23.35,23.952,37.962c5.725,14.613,8.587,30.506,8.587,47.68v14.914H597.901
|
||||
c1.507,9.34,4.52,18.002,9.039,25.985c4.52,7.984,10.168,14.914,16.947,20.789c6.779,5.876,14.462,10.471,23.049,13.784
|
||||
c8.587,3.314,17.7,4.972,27.342,4.972c27.418,0,49.563-11.299,66.435-33.896l32.991,24.404
|
||||
c-11.449,15.366-25.609,27.418-42.481,36.155c-16.873,8.737-35.854,13.106-56.944,13.106c-17.174,0-33.217-3.014-48.131-9.039
|
||||
s-27.869-14.462-38.866-25.309s-19.659-23.576-25.986-38.188s-9.491-30.506-9.491-47.679
|
||||
C551.803,184.842,554.817,169.476,560.842,155.014z M624.339,137.162c-12.805,10.696-21.316,24.932-25.534,42.708h140.552
|
||||
c-3.917-17.776-12.278-32.012-25.083-42.708c-12.805-10.695-27.794-16.043-44.967-16.043
|
||||
C652.133,121.119,637.144,126.467,624.339,137.162z"/>
|
||||
<path fill="#010202" d="M870.866,142.359c-9.641,10.545-14.462,24.856-14.462,42.934v131.062h-45.646V85.868h45.193v28.472
|
||||
c5.725-9.34,13.182-16.722,22.371-22.145c9.189-5.424,20.111-8.136,32.766-8.136h15.817v42.482h-18.981
|
||||
C892.86,126.542,880.507,131.814,870.866,142.359z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user