committed by
GitHub
1235 changed files with 68061 additions and 35879 deletions
@ -4,13 +4,13 @@ contact_links: |
|||
about: Please report security vulnerabilities to [email protected] |
|||
- name: Question or Problem |
|||
about: Ask a question or ask about a problem in GitHub Discussions. |
|||
url: https://github.com/tiangolo/fastapi/discussions/categories/questions |
|||
url: https://github.com/fastapi/fastapi/discussions/categories/questions |
|||
- name: Feature Request |
|||
about: To suggest an idea or ask about a feature, please start with a question saying what you would like to achieve. There might be a way to do it already. |
|||
url: https://github.com/tiangolo/fastapi/discussions/categories/questions |
|||
url: https://github.com/fastapi/fastapi/discussions/categories/questions |
|||
- name: Show and tell |
|||
about: Show what you built with FastAPI or to be used with FastAPI. |
|||
url: https://github.com/tiangolo/fastapi/discussions/categories/show-and-tell |
|||
url: https://github.com/fastapi/fastapi/discussions/categories/show-and-tell |
|||
- name: Translations |
|||
about: Coordinate translations in GitHub Discussions. |
|||
url: https://github.com/tiangolo/fastapi/discussions/categories/translations |
|||
url: https://github.com/fastapi/fastapi/discussions/categories/translations |
|||
|
@ -1,9 +0,0 @@ |
|||
FROM python:3.10 |
|||
|
|||
COPY ./requirements.txt /app/requirements.txt |
|||
|
|||
RUN pip install -r /app/requirements.txt |
|||
|
|||
COPY ./app /app |
|||
|
|||
CMD ["python", "/app/main.py"] |
@ -1,13 +0,0 @@ |
|||
name: Comment Docs Preview in PR |
|||
description: Comment with the docs URL preview in the PR |
|||
author: Sebastián Ramírez <[email protected]> |
|||
inputs: |
|||
token: |
|||
description: Token for the repo. Can be passed in using {{ secrets.GITHUB_TOKEN }} |
|||
required: true |
|||
deploy_url: |
|||
description: The deployment URL to comment in the PR |
|||
required: true |
|||
runs: |
|||
using: docker |
|||
image: Dockerfile |
@ -1,69 +0,0 @@ |
|||
import logging |
|||
import sys |
|||
from pathlib import Path |
|||
from typing import Union |
|||
|
|||
import httpx |
|||
from github import Github |
|||
from github.PullRequest import PullRequest |
|||
from pydantic import BaseModel, SecretStr, ValidationError |
|||
from pydantic_settings import BaseSettings |
|||
|
|||
github_api = "https://api.github.com" |
|||
|
|||
|
|||
class Settings(BaseSettings): |
|||
github_repository: str |
|||
github_event_path: Path |
|||
github_event_name: Union[str, None] = None |
|||
input_token: SecretStr |
|||
input_deploy_url: str |
|||
|
|||
|
|||
class PartialGithubEventHeadCommit(BaseModel): |
|||
id: str |
|||
|
|||
|
|||
class PartialGithubEventWorkflowRun(BaseModel): |
|||
head_commit: PartialGithubEventHeadCommit |
|||
|
|||
|
|||
class PartialGithubEvent(BaseModel): |
|||
workflow_run: PartialGithubEventWorkflowRun |
|||
|
|||
|
|||
if __name__ == "__main__": |
|||
logging.basicConfig(level=logging.INFO) |
|||
settings = Settings() |
|||
logging.info(f"Using config: {settings.json()}") |
|||
g = Github(settings.input_token.get_secret_value()) |
|||
repo = g.get_repo(settings.github_repository) |
|||
try: |
|||
event = PartialGithubEvent.parse_file(settings.github_event_path) |
|||
except ValidationError as e: |
|||
logging.error(f"Error parsing event file: {e.errors()}") |
|||
sys.exit(0) |
|||
use_pr: Union[PullRequest, None] = None |
|||
for pr in repo.get_pulls(): |
|||
if pr.head.sha == event.workflow_run.head_commit.id: |
|||
use_pr = pr |
|||
break |
|||
if not use_pr: |
|||
logging.error(f"No PR found for hash: {event.workflow_run.head_commit.id}") |
|||
sys.exit(0) |
|||
github_headers = { |
|||
"Authorization": f"token {settings.input_token.get_secret_value()}" |
|||
} |
|||
url = f"{github_api}/repos/{settings.github_repository}/issues/{use_pr.number}/comments" |
|||
logging.info(f"Using comments URL: {url}") |
|||
response = httpx.post( |
|||
url, |
|||
headers=github_headers, |
|||
json={ |
|||
"body": f"📝 Docs preview for commit {use_pr.head.sha} at: {settings.input_deploy_url}" |
|||
}, |
|||
) |
|||
if not (200 <= response.status_code <= 300): |
|||
logging.error(f"Error posting comment: {response.text}") |
|||
sys.exit(1) |
|||
logging.info("Finished") |
@ -0,0 +1,38 @@ |
|||
docs: |
|||
- all: |
|||
- changed-files: |
|||
- any-glob-to-any-file: |
|||
- docs/en/docs/** |
|||
- docs_src/** |
|||
- all-globs-to-all-files: |
|||
- '!fastapi/**' |
|||
- '!pyproject.toml' |
|||
- '!docs/en/data/sponsors.yml' |
|||
- '!docs/en/overrides/main.html' |
|||
|
|||
lang-all: |
|||
- all: |
|||
- changed-files: |
|||
- any-glob-to-any-file: |
|||
- docs/*/docs/** |
|||
- all-globs-to-all-files: |
|||
- '!docs/en/docs/**' |
|||
- '!fastapi/**' |
|||
- '!pyproject.toml' |
|||
|
|||
internal: |
|||
- all: |
|||
- changed-files: |
|||
- any-glob-to-any-file: |
|||
- .github/** |
|||
- scripts/** |
|||
- .gitignore |
|||
- .pre-commit-config.yaml |
|||
- pdm_build.py |
|||
- requirements*.txt |
|||
- docs/en/data/sponsors.yml |
|||
- docs/en/overrides/main.html |
|||
- all-globs-to-all-files: |
|||
- '!docs/*/docs/**' |
|||
- '!fastapi/**' |
|||
- '!pyproject.toml' |
@ -0,0 +1,18 @@ |
|||
name: Add to Project |
|||
|
|||
on: |
|||
pull_request_target: |
|||
issues: |
|||
types: |
|||
- opened |
|||
- reopened |
|||
|
|||
jobs: |
|||
add-to-project: |
|||
name: Add to project |
|||
runs-on: ubuntu-latest |
|||
steps: |
|||
- uses: actions/[email protected] |
|||
with: |
|||
project-url: https://github.com/orgs/fastapi/projects/2 |
|||
github-token: ${{ secrets.PROJECTS_TOKEN }} |
@ -6,6 +6,15 @@ on: |
|||
types: |
|||
- completed |
|||
|
|||
permissions: |
|||
deployments: write |
|||
issues: write |
|||
pull-requests: write |
|||
statuses: write |
|||
|
|||
env: |
|||
UV_SYSTEM_PYTHON: 1 |
|||
|
|||
jobs: |
|||
deploy-docs: |
|||
runs-on: ubuntu-latest |
|||
@ -15,34 +24,57 @@ jobs: |
|||
GITHUB_CONTEXT: ${{ toJson(github) }} |
|||
run: echo "$GITHUB_CONTEXT" |
|||
- uses: actions/checkout@v4 |
|||
- name: Set up Python |
|||
uses: actions/setup-python@v5 |
|||
with: |
|||
python-version: "3.11" |
|||
- name: Setup uv |
|||
uses: astral-sh/setup-uv@v3 |
|||
with: |
|||
version: "0.4.15" |
|||
enable-cache: true |
|||
cache-dependency-glob: | |
|||
requirements**.txt |
|||
pyproject.toml |
|||
- name: Install GitHub Actions dependencies |
|||
run: uv pip install -r requirements-github-actions.txt |
|||
- name: Deploy Docs Status Pending |
|||
run: python ./scripts/deploy_docs_status.py |
|||
env: |
|||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
|||
COMMIT_SHA: ${{ github.event.workflow_run.head_sha }} |
|||
RUN_ID: ${{ github.run_id }} |
|||
- name: Clean site |
|||
run: | |
|||
rm -rf ./site |
|||
mkdir ./site |
|||
- name: Download Artifact Docs |
|||
id: download |
|||
uses: dawidd6/[email protected] |
|||
- uses: actions/download-artifact@v4 |
|||
with: |
|||
if_no_artifact_found: ignore |
|||
github_token: ${{ secrets.FASTAPI_PREVIEW_DOCS_DOWNLOAD_ARTIFACTS }} |
|||
workflow: build-docs.yml |
|||
run_id: ${{ github.event.workflow_run.id }} |
|||
name: docs-site |
|||
path: ./site/ |
|||
pattern: docs-site-* |
|||
merge-multiple: true |
|||
github-token: ${{ secrets.GITHUB_TOKEN }} |
|||
run-id: ${{ github.event.workflow_run.id }} |
|||
- name: Deploy to Cloudflare Pages |
|||
if: steps.download.outputs.found_artifact == 'true' |
|||
# hashFiles returns an empty string if there are no files |
|||
if: hashFiles('./site/*') |
|||
id: deploy |
|||
uses: cloudflare/pages-action@v1 |
|||
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 ) }} |
|||
# TODO: Use v3 when it's fixed, probably in v3.11 |
|||
# https://github.com/cloudflare/wrangler-action/issues/307 |
|||
uses: cloudflare/[email protected] |
|||
# uses: cloudflare/wrangler-action@v3 |
|||
with: |
|||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} |
|||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} |
|||
projectName: fastapitiangolo |
|||
directory: './site' |
|||
gitHubToken: ${{ secrets.GITHUB_TOKEN }} |
|||
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 ) }} |
|||
command: pages deploy ./site --project-name=${{ env.PROJECT_NAME }} --branch=${{ env.BRANCH }} |
|||
- name: Comment Deploy |
|||
if: steps.deploy.outputs.url != '' |
|||
uses: ./.github/actions/comment-docs-preview-in-pr |
|||
with: |
|||
token: ${{ secrets.FASTAPI_PREVIEW_DOCS_COMMENT_DEPLOY }} |
|||
deploy_url: "${{ steps.deploy.outputs.url }}" |
|||
run: python ./scripts/deploy_docs_status.py |
|||
env: |
|||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
|||
DEPLOY_URL: ${{ steps.deploy.outputs.deployment-url }} |
|||
COMMIT_SHA: ${{ github.event.workflow_run.head_sha }} |
|||
RUN_ID: ${{ github.run_id }} |
|||
IS_DONE: "true" |
|||
|
@ -2,7 +2,7 @@ name: Issue Manager |
|||
|
|||
on: |
|||
schedule: |
|||
- cron: "10 3 * * *" |
|||
- cron: "13 22 * * *" |
|||
issue_comment: |
|||
types: |
|||
- created |
|||
@ -14,26 +14,34 @@ on: |
|||
- labeled |
|||
workflow_dispatch: |
|||
|
|||
permissions: |
|||
issues: write |
|||
pull-requests: write |
|||
|
|||
jobs: |
|||
issue-manager: |
|||
if: github.repository_owner == 'tiangolo' |
|||
if: github.repository_owner == 'fastapi' |
|||
runs-on: ubuntu-latest |
|||
steps: |
|||
- name: Dump GitHub context |
|||
env: |
|||
GITHUB_CONTEXT: ${{ toJson(github) }} |
|||
run: echo "$GITHUB_CONTEXT" |
|||
- uses: tiangolo/[email protected].0 |
|||
- uses: tiangolo/[email protected].1 |
|||
with: |
|||
token: ${{ secrets.FASTAPI_ISSUE_MANAGER }} |
|||
token: ${{ secrets.GITHUB_TOKEN }} |
|||
config: > |
|||
{ |
|||
"answered": { |
|||
"delay": 864000, |
|||
"message": "Assuming the original need was handled, this will be automatically closed now. But feel free to add more comments or create new issues or PRs." |
|||
}, |
|||
"changes-requested": { |
|||
"waiting": { |
|||
"delay": 2628000, |
|||
"message": "As this PR had requested changes to be applied but has been inactive for a while, it's now going to be closed. But if there's anyone interested, feel free to create a new PR." |
|||
"message": "As this PR has been waiting for the original user for a while but seems to be inactive, it's now going to be closed. But if there's anyone interested, feel free to create a new PR." |
|||
}, |
|||
"invalid": { |
|||
"delay": 0, |
|||
"message": "This was marked as invalid and will be closed now. If this is an error, please provide additional details." |
|||
} |
|||
} |
|||
|
@ -0,0 +1,33 @@ |
|||
name: Labels |
|||
on: |
|||
pull_request_target: |
|||
types: |
|||
- opened |
|||
- synchronize |
|||
- reopened |
|||
# For label-checker |
|||
- labeled |
|||
- unlabeled |
|||
|
|||
jobs: |
|||
labeler: |
|||
permissions: |
|||
contents: read |
|||
pull-requests: write |
|||
runs-on: ubuntu-latest |
|||
steps: |
|||
- uses: actions/labeler@v5 |
|||
if: ${{ github.event.action != 'labeled' && github.event.action != 'unlabeled' }} |
|||
- run: echo "Done adding labels" |
|||
# Run this after labeler applied labels |
|||
check-labels: |
|||
needs: |
|||
- labeler |
|||
permissions: |
|||
pull-requests: read |
|||
runs-on: ubuntu-latest |
|||
steps: |
|||
- uses: docker://agilepathway/pull-request-label-checker:latest |
|||
with: |
|||
one_of: breaking,security,feature,bug,refactor,upgrade,docs,lang-all,internal |
|||
repo_token: ${{ secrets.GITHUB_TOKEN }} |
@ -34,8 +34,7 @@ jobs: |
|||
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }} |
|||
with: |
|||
limit-access-to-actor: true |
|||
- uses: docker://tiangolo/latest-changes:0.3.0 |
|||
# - uses: tiangolo/latest-changes@main |
|||
- uses: tiangolo/[email protected] |
|||
with: |
|||
token: ${{ secrets.GITHUB_TOKEN }} |
|||
latest_changes_file: docs/en/docs/release-notes.md |
|||
|
@ -8,6 +8,13 @@ on: |
|||
jobs: |
|||
publish: |
|||
runs-on: ubuntu-latest |
|||
strategy: |
|||
matrix: |
|||
package: |
|||
- fastapi |
|||
- fastapi-slim |
|||
permissions: |
|||
id-token: write |
|||
steps: |
|||
- name: Dump GitHub context |
|||
env: |
|||
@ -24,11 +31,11 @@ jobs: |
|||
- name: Install build dependencies |
|||
run: pip install build |
|||
- name: Build distribution |
|||
env: |
|||
TIANGOLO_BUILD_PACKAGE: ${{ matrix.package }} |
|||
run: python -m build |
|||
- name: Publish |
|||
uses: pypa/[email protected] |
|||
with: |
|||
password: ${{ secrets.PYPI_API_TOKEN }} |
|||
uses: pypa/[email protected] |
|||
- name: Dump GitHub context |
|||
env: |
|||
GITHUB_CONTEXT: ${{ toJson(github) }} |
|||
|
@ -8,6 +8,9 @@ on: |
|||
permissions: |
|||
statuses: write |
|||
|
|||
env: |
|||
UV_SYSTEM_PYTHON: 1 |
|||
|
|||
jobs: |
|||
smokeshow: |
|||
if: ${{ github.event.workflow_run.conclusion == 'success' }} |
|||
@ -18,23 +21,30 @@ jobs: |
|||
env: |
|||
GITHUB_CONTEXT: ${{ toJson(github) }} |
|||
run: echo "$GITHUB_CONTEXT" |
|||
- uses: actions/checkout@v4 |
|||
- uses: actions/setup-python@v5 |
|||
with: |
|||
python-version: '3.9' |
|||
|
|||
- run: pip install smokeshow |
|||
|
|||
- uses: dawidd6/[email protected] |
|||
- name: Setup uv |
|||
uses: astral-sh/setup-uv@v3 |
|||
with: |
|||
github_token: ${{ secrets.FASTAPI_SMOKESHOW_DOWNLOAD_ARTIFACTS }} |
|||
workflow: test.yml |
|||
commit: ${{ github.event.workflow_run.head_sha }} |
|||
|
|||
- run: smokeshow upload coverage-html |
|||
version: "0.4.15" |
|||
enable-cache: true |
|||
cache-dependency-glob: | |
|||
requirements**.txt |
|||
pyproject.toml |
|||
- run: uv pip install -r requirements-github-actions.txt |
|||
- uses: actions/download-artifact@v4 |
|||
with: |
|||
name: coverage-html |
|||
path: htmlcov |
|||
github-token: ${{ secrets.GITHUB_TOKEN }} |
|||
run-id: ${{ github.event.workflow_run.id }} |
|||
- run: smokeshow upload htmlcov |
|||
env: |
|||
SMOKESHOW_GITHUB_STATUS_DESCRIPTION: Coverage {coverage-percentage} |
|||
SMOKESHOW_GITHUB_COVERAGE_THRESHOLD: 100 |
|||
SMOKESHOW_GITHUB_CONTEXT: coverage |
|||
SMOKESHOW_GITHUB_TOKEN: ${{ secrets.FASTAPI_SMOKESHOW_UPLOAD }} |
|||
SMOKESHOW_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
|||
SMOKESHOW_GITHUB_PR_HEAD_SHA: ${{ github.event.workflow_run.head_sha }} |
|||
SMOKESHOW_AUTH_KEY: ${{ secrets.SMOKESHOW_AUTH_KEY }} |
|||
|
@ -12,7 +12,7 @@ authors: |
|||
family-names: Ramírez |
|||
email: [email protected] |
|||
identifiers: |
|||
repository-code: 'https://github.com/tiangolo/fastapi' |
|||
repository-code: 'https://github.com/fastapi/fastapi' |
|||
url: 'https://fastapi.tiangolo.com' |
|||
abstract: >- |
|||
FastAPI framework, high performance, easy to learn, fast to code, |
|||
|
@ -1,185 +0,0 @@ |
|||
--- |
|||
hide: |
|||
- navigation |
|||
--- |
|||
|
|||
# FastAPI İnsanlar |
|||
|
|||
FastAPI-ın bütün mənşəli insanları qəbul edən heyrətamiz icması var. |
|||
|
|||
|
|||
|
|||
## Yaradıcı - İcraçı |
|||
|
|||
Salam! 👋 |
|||
|
|||
Bu mənəm: |
|||
|
|||
{% if people %} |
|||
<div class="user-list user-list-center"> |
|||
{% for user in people.maintainers %} |
|||
|
|||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Cavablar: {{ user.answers }}</div><div class="count">Pull Request-lər: {{ user.prs }}</div></div> |
|||
{% endfor %} |
|||
|
|||
</div> |
|||
{% endif %} |
|||
|
|||
Mən **FastAPI**-ın yaradıcısı və icraçısıyam. Əlavə məlumat almaq üçün [Yardım FastAPI - Yardım alın - Müəlliflə əlaqə qurun](help-fastapi.md#connect-with-the-author){.internal-link target=_blank} səhifəsinə baxa bilərsiniz. |
|||
|
|||
...Burada isə sizə icmanı göstərmək istəyirəm. |
|||
|
|||
--- |
|||
|
|||
**FastAPI** icmadan çoxlu dəstək alır və mən onların əməyini vurğulamaq istəyirəm. |
|||
|
|||
Bu insanlar: |
|||
|
|||
* [GitHub-da başqalarının suallarına kömək edirlər](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank}. |
|||
* [Pull Request-lər yaradırlar](help-fastapi.md#create-a-pull-request){.internal-link target=_blank}. |
|||
* Pull Request-ləri ([xüsusilə tərcümələr üçün vacib olan](contributing.md#translations){.internal-link target=_blank}.) nəzərdən keçirirlər. |
|||
|
|||
Bu insanlara təşəkkür edirəm. 👏 🙇 |
|||
|
|||
## Keçən ayın ən fəal istifadəçiləri |
|||
|
|||
Bu istifadəçilər keçən ay [GitHub-da başqalarının suallarına](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank} ən çox kömək edənlərdir. ☕ |
|||
|
|||
{% if people %} |
|||
<div class="user-list user-list-center"> |
|||
{% for user in people.last_month_experts[:10] %} |
|||
|
|||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Cavablandırılmış suallar: {{ user.count }}</div></div> |
|||
{% endfor %} |
|||
|
|||
</div> |
|||
{% endif %} |
|||
|
|||
## Mütəxəssislər |
|||
|
|||
Burada **FastAPI Mütəxəssisləri** var. 🤓 |
|||
|
|||
Bu istifadəçilər indiyə qədər [GitHub-da başqalarının suallarına](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank} ən çox kömək edənlərdir. |
|||
|
|||
Onlar bir çox insanlara kömək edərək mütəxəssis olduqlarını sübut ediblər. ✨ |
|||
|
|||
{% if people %} |
|||
<div class="user-list user-list-center"> |
|||
{% for user in people.experts[:50] %} |
|||
|
|||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Cavablandırılmış suallar: {{ user.count }}</div></div> |
|||
{% endfor %} |
|||
|
|||
</div> |
|||
{% endif %} |
|||
|
|||
## Ən yaxşı əməkdaşlar |
|||
|
|||
Burada **Ən yaxşı əməkdaşlar** var. 👷 |
|||
|
|||
Bu istifadəçilərin ən çox *birləşdirilmiş* [Pull Request-ləri var](help-fastapi.md#create-a-pull-request){.internal-link target=_blank}. |
|||
|
|||
Onlar mənbə kodu, sənədləmə, tərcümələr və s. barədə əmək göstərmişlər. 📦 |
|||
|
|||
{% if people %} |
|||
<div class="user-list user-list-center"> |
|||
{% for user in people.top_contributors[:50] %} |
|||
|
|||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Request-lər: {{ user.count }}</div></div> |
|||
{% endfor %} |
|||
|
|||
</div> |
|||
{% endif %} |
|||
|
|||
Bundan başqa bir neçə (yüzdən çox) əməkdaş var ki, onları <a href="https://github.com/tiangolo/fastapi/graphs/contributors" class="external-link" target="_blank">FastAPI GitHub Əməkdaşlar səhifəsində</a> görə bilərsiniz. 👷 |
|||
|
|||
## Ən çox rəy verənlər |
|||
|
|||
Bu istifadəçilər **ən çox rəy verənlər**dir. |
|||
|
|||
### Tərcümələr üçün rəylər |
|||
|
|||
Mən yalnız bir neçə dildə danışıram (və çox da yaxşı deyil 😅). Bu səbəbdən, rəy verənlər sənədlərin [**tərcümələrini təsdiqləmək üçün gücə malik olanlar**](contributing.md#translations){.internal-link target=_blank}dır. Onlar olmadan, bir çox dilə tərcümə olunmuş sənədlər olmazdı. |
|||
|
|||
--- |
|||
|
|||
Başqalarının Pull Request-lərinə **Ən çox rəy verənlər** 🕵️ kodun, sənədlərin və xüsusilə də **tərcümələrin** keyfiyyətini təmin edirlər. |
|||
|
|||
{% if people %} |
|||
<div class="user-list user-list-center"> |
|||
{% for user in people.top_translations_reviewers[:50] %} |
|||
|
|||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Rəylər: {{ user.count }}</div></div> |
|||
{% endfor %} |
|||
|
|||
</div> |
|||
{% endif %} |
|||
|
|||
## Sponsorlar |
|||
|
|||
Bunlar **Sponsorlar**dır. 😎 |
|||
|
|||
Onlar mənim **FastAPI** (və digər) işlərimi əsasən <a href="hhttps://github.com/sponsors/tiangolo" class="external-link" target="_blank">GitHub Sponsorlar</a> vasitəsilə dəstəkləyirlər. |
|||
|
|||
{% if sponsors %} |
|||
|
|||
{% if sponsors.gold %} |
|||
|
|||
### Qızıl Sponsorlar |
|||
|
|||
{% for sponsor in sponsors.gold -%} |
|||
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a> |
|||
{% endfor %} |
|||
{% endif %} |
|||
|
|||
{% if sponsors.silver %} |
|||
|
|||
### Gümüş Sponsorlar |
|||
|
|||
{% for sponsor in sponsors.silver -%} |
|||
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a> |
|||
{% endfor %} |
|||
{% endif %} |
|||
|
|||
{% if sponsors.bronze %} |
|||
|
|||
### Bürünc Sponsorlar |
|||
|
|||
{% for sponsor in sponsors.bronze -%} |
|||
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a> |
|||
{% endfor %} |
|||
{% endif %} |
|||
|
|||
{% endif %} |
|||
|
|||
### Fərdi Sponsorlar |
|||
|
|||
{% if github_sponsors %} |
|||
{% for group in github_sponsors.sponsors %} |
|||
|
|||
<div class="user-list user-list-center"> |
|||
|
|||
{% for user in group %} |
|||
{% if user.login not in sponsors_badge.logins %} |
|||
|
|||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a></div> |
|||
|
|||
{% endif %} |
|||
{% endfor %} |
|||
|
|||
</div> |
|||
|
|||
{% endfor %} |
|||
{% endif %} |
|||
|
|||
## Məlumatlar haqqında - texniki detallar |
|||
|
|||
Bu səhifənin əsas məqsədi, icmanın başqalarına kömək etmək üçün göstərdiyi əməyi vurğulamaqdır. |
|||
|
|||
Xüsusilə də normalda daha az görünən və bir çox hallarda daha çətin olan, başqalarının suallarına kömək etmək və tərcümələrlə bağlı Pull Request-lərə rəy vermək kimi səy göstərmək. |
|||
|
|||
Bu səhifənin məlumatları hər ay hesablanır və siz <a href="https://github.com/tiangolo/fastapi/blob/master/.github/actions/people/app/main.py" class="external-link" target="_blank">buradan mənbə kodunu</a> oxuya bilərsiniz. |
|||
|
|||
Burada sponsorların əməyini də vurğulamaq istəyirəm. |
|||
|
|||
Mən həmçinin alqoritmi, bölmələri, eşikləri və s. yeniləmək hüququnu da qoruyuram (hər ehtimala qarşı 🤷). |
@ -0,0 +1,596 @@ |
|||
# পাইথন এর <abbr title="একটি ভেরিয়েবল কি ধরনের ডেটা ধারণ করতে পারে।">টাইপ্স</abbr> পরিচিতি |
|||
|
|||
Python-এ ঐচ্ছিক "টাইপ হিন্ট" (যা "টাইপ অ্যানোটেশন" নামেও পরিচিত) এর জন্য সাপোর্ট রয়েছে। |
|||
|
|||
এই **"টাইপ হিন্ট"** বা অ্যানোটেশনগুলি এক ধরণের বিশেষ <abbr title="সিনট্যাক্স হল প্রোগ্রামিং ভাষায় কোড লেখার নিয়ম ও গঠন।">সিনট্যাক্স</abbr> যা একটি ভেরিয়েবলের <abbr title="যেমন: str, int, float, bool">টাইপ</abbr> ঘোষণা করতে দেয়। |
|||
|
|||
ভেরিয়েবলগুলির জন্য টাইপ ঘোষণা করলে, এডিটর এবং টুলগুলি আপনাকে আরও ভালো সাপোর্ট দিতে পারে। |
|||
|
|||
এটি পাইথন টাইপ হিন্ট সম্পর্কে একটি দ্রুত **টিউটোরিয়াল / রিফ্রেশার** মাত্র। এটি **FastAPI** এর সাথে ব্যবহার করার জন্য শুধুমাত্র ন্যূনতম প্রয়োজনীয়তা কভার করে... যা আসলে খুব একটা বেশি না। |
|||
|
|||
**FastAPI** এই টাইপ হিন্টগুলির উপর ভিত্তি করে নির্মিত, যা এটিকে অনেক সুবিধা এবং লাভ প্রদান করে। |
|||
|
|||
তবে, আপনি যদি কখনো **FastAPI** ব্যবহার নাও করেন, তবুও এগুলি সম্পর্কে একটু শেখা আপনার উপকারে আসবে। |
|||
|
|||
/// note |
|||
|
|||
যদি আপনি একজন Python বিশেষজ্ঞ হন, এবং টাইপ হিন্ট সম্পর্কে সবকিছু জানেন, তাহলে পরবর্তী অধ্যায়ে চলে যান। |
|||
|
|||
/// |
|||
|
|||
## প্রেরণা |
|||
|
|||
চলুন একটি সাধারণ উদাহরণ দিয়ে শুরু করি: |
|||
|
|||
```Python |
|||
{!../../docs_src/python_types/tutorial001.py!} |
|||
``` |
|||
|
|||
এই প্রোগ্রামটি কল করলে আউটপুট হয়: |
|||
|
|||
``` |
|||
John Doe |
|||
``` |
|||
|
|||
ফাংশনটি নিম্নলিখিত কাজ করে: |
|||
|
|||
* `first_name` এবং `last_name` নেয়। |
|||
* প্রতিটির প্রথম অক্ষরকে `title()` ব্যবহার করে বড় হাতের অক্ষরে রূপান্তর করে। |
|||
* তাদেরকে মাঝখানে একটি স্পেস দিয়ে <abbr title="একটার পরে একটা একত্রিত করা">concatenate</abbr> করে। |
|||
|
|||
```Python hl_lines="2" |
|||
{!../../docs_src/python_types/tutorial001.py!} |
|||
``` |
|||
|
|||
### এটি সম্পাদনা করুন |
|||
|
|||
এটি একটি খুব সাধারণ প্রোগ্রাম। |
|||
|
|||
কিন্তু এখন কল্পনা করুন যে আপনি এটি শুরু থেকে লিখছিলেন। |
|||
|
|||
এক পর্যায়ে আপনি ফাংশনের সংজ্ঞা শুরু করেছিলেন, আপনার প্যারামিটারগুলি প্রস্তুত ছিল... |
|||
|
|||
কিন্তু তারপর আপনাকে "সেই method কল করতে হবে যা প্রথম অক্ষরকে বড় হাতের অক্ষরে রূপান্তর করে"। |
|||
|
|||
এটা কি `upper` ছিল? নাকি `uppercase`? `first_uppercase`? `capitalize`? |
|||
|
|||
তারপর, আপনি পুরোনো প্রোগ্রামারের বন্ধু, এডিটর অটোকমপ্লিশনের সাহায্যে নেওয়ার চেষ্টা করেন। |
|||
|
|||
আপনি ফাংশনের প্রথম প্যারামিটার `first_name` টাইপ করেন, তারপর একটি ডট (`.`) টাইপ করেন এবং `Ctrl+Space` চাপেন অটোকমপ্লিশন ট্রিগার করার জন্য। |
|||
|
|||
কিন্তু, দুর্ভাগ্যবশত, আপনি কিছুই উপযোগী পান না: |
|||
|
|||
<img src="/img/python-types/image01.png"> |
|||
|
|||
### টাইপ যোগ করুন |
|||
|
|||
আসুন আগের সংস্করণ থেকে একটি লাইন পরিবর্তন করি। |
|||
|
|||
আমরা ঠিক এই অংশটি পরিবর্তন করব অর্থাৎ ফাংশনের প্যারামিটারগুলি, এইগুলি: |
|||
|
|||
```Python |
|||
first_name, last_name |
|||
``` |
|||
|
|||
থেকে এইগুলি: |
|||
|
|||
```Python |
|||
first_name: str, last_name: str |
|||
``` |
|||
|
|||
ব্যাস। |
|||
|
|||
এগুলিই "টাইপ হিন্ট": |
|||
|
|||
```Python hl_lines="1" |
|||
{!../../docs_src/python_types/tutorial002.py!} |
|||
``` |
|||
|
|||
এটি ডিফল্ট ভ্যালু ঘোষণা করার মত নয় যেমন: |
|||
|
|||
```Python |
|||
first_name="john", last_name="doe" |
|||
``` |
|||
|
|||
এটি একটি ভিন্ন জিনিস। |
|||
|
|||
আমরা সমান (`=`) নয়, কোলন (`:`) ব্যবহার করছি। |
|||
|
|||
এবং টাইপ হিন্ট যোগ করা সাধারণত তেমন কিছু পরিবর্তন করে না যা টাইপ হিন্ট ছাড়াই ঘটত। |
|||
|
|||
কিন্তু এখন, কল্পনা করুন আপনি আবার সেই ফাংশন তৈরির মাঝখানে আছেন, কিন্তু টাইপ হিন্ট সহ। |
|||
|
|||
একই পর্যায়ে, আপনি অটোকমপ্লিট ট্রিগার করতে `Ctrl+Space` চাপেন এবং আপনি দেখতে পান: |
|||
|
|||
<img src="/img/python-types/image02.png"> |
|||
|
|||
এর সাথে, আপনি অপশনগুলি দেখে, স্ক্রল করতে পারেন, যতক্ষণ না আপনি এমন একটি অপশন খুঁজে পান যা কিছু মনে পরিয়ে দেয়: |
|||
|
|||
<img src="/img/python-types/image03.png"> |
|||
|
|||
## আরও প্রেরণা |
|||
|
|||
এই ফাংশনটি দেখুন, এটিতে ইতিমধ্যে টাইপ হিন্ট রয়েছে: |
|||
|
|||
```Python hl_lines="1" |
|||
{!../../docs_src/python_types/tutorial003.py!} |
|||
``` |
|||
|
|||
এডিটর ভেরিয়েবলগুলির টাইপ জানার কারণে, আপনি শুধুমাত্র অটোকমপ্লিশনই পান না, আপনি এরর চেকও পান: |
|||
|
|||
<img src="/img/python-types/image04.png"> |
|||
|
|||
এখন আপনি জানেন যে আপনাকে এটি ঠিক করতে হবে, `age`-কে একটি স্ট্রিং হিসেবে রূপান্তর করতে `str(age)` ব্যবহার করতে হবে: |
|||
|
|||
```Python hl_lines="2" |
|||
{!../../docs_src/python_types/tutorial004.py!} |
|||
``` |
|||
|
|||
## টাইপ ঘোষণা |
|||
|
|||
আপনি এতক্ষন টাইপ হিন্ট ঘোষণা করার মূল স্থানটি দেখে ফেলেছেন-- ফাংশন প্যারামিটার হিসেবে। |
|||
|
|||
সাধারণত এটি **FastAPI** এর ক্ষেত্রেও একই। |
|||
|
|||
### সিম্পল টাইপ |
|||
|
|||
আপনি `str` ছাড়াও সমস্ত স্ট্যান্ডার্ড পাইথন টাইপ ঘোষণা করতে পারেন। |
|||
|
|||
উদাহরণস্বরূপ, আপনি এগুলো ব্যবহার করতে পারেন: |
|||
|
|||
* `int` |
|||
* `float` |
|||
* `bool` |
|||
* `bytes` |
|||
|
|||
```Python hl_lines="1" |
|||
{!../../docs_src/python_types/tutorial005.py!} |
|||
``` |
|||
|
|||
### টাইপ প্যারামিটার সহ জেনেরিক টাইপ |
|||
|
|||
কিছু ডাটা স্ট্রাকচার অন্যান্য মান ধারণ করতে পারে, যেমন `dict`, `list`, `set` এবং `tuple`। এবং অভ্যন্তরীণ মানগুলোরও নিজেদের টাইপ থাকতে পারে। |
|||
|
|||
এই ধরনের টাইপগুলিকে বলা হয় "**জেনেরিক**" টাইপ এবং এগুলিকে তাদের অভ্যন্তরীণ টাইপগুলি সহ ঘোষণা করা সম্ভব। |
|||
|
|||
এই টাইপগুলি এবং অভ্যন্তরীণ টাইপগুলি ঘোষণা করতে, আপনি Python মডিউল `typing` ব্যবহার করতে পারেন। এটি বিশেষভাবে এই টাইপ হিন্টগুলি সমর্থন করার জন্য রয়েছে। |
|||
|
|||
#### Python এর নতুন সংস্করণ |
|||
|
|||
`typing` ব্যবহার করা সিনট্যাক্সটি Python 3.6 থেকে সর্বশেষ সংস্করণগুলি পর্যন্ত, অর্থাৎ Python 3.9, Python 3.10 ইত্যাদি সহ সকল সংস্করণের সাথে **সামঞ্জস্যপূর্ণ**। |
|||
|
|||
Python যত এগিয়ে যাচ্ছে, **নতুন সংস্করণগুলি** এই টাইপ অ্যানোটেশনগুলির জন্য তত উন্নত সাপোর্ট নিয়ে আসছে এবং অনেক ক্ষেত্রে আপনাকে টাইপ অ্যানোটেশন ঘোষণা করতে `typing` মডিউল ইম্পোর্ট এবং ব্যবহার করার প্রয়োজন হবে না। |
|||
|
|||
যদি আপনি আপনার প্রজেক্টের জন্য Python-এর আরও সাম্প্রতিক সংস্করণ নির্বাচন করতে পারেন, তাহলে আপনি সেই অতিরিক্ত সরলতা থেকে সুবিধা নিতে পারবেন। |
|||
|
|||
ডক্সে রয়েছে Python-এর প্রতিটি সংস্করণের সাথে সামঞ্জস্যপূর্ণ উদাহরণগুলি (যখন পার্থক্য আছে)। |
|||
|
|||
উদাহরণস্বরূপ, "**Python 3.6+**" মানে এটি Python 3.6 বা তার উপরে সামঞ্জস্যপূর্ণ (যার মধ্যে 3.7, 3.8, 3.9, 3.10, ইত্যাদি অন্তর্ভুক্ত)। এবং "**Python 3.9+**" মানে এটি Python 3.9 বা তার উপরে সামঞ্জস্যপূর্ণ (যার মধ্যে 3.10, ইত্যাদি অন্তর্ভুক্ত)। |
|||
|
|||
যদি আপনি Python-এর **সর্বশেষ সংস্করণগুলি ব্যবহার করতে পারেন**, তাহলে সর্বশেষ সংস্করণের জন্য উদাহরণগুলি ব্যবহার করুন, সেগুলি আপনাকে **সর্বোত্তম এবং সহজতম সিনট্যাক্স** প্রদান করবে, যেমন, "**Python 3.10+**"। |
|||
|
|||
#### লিস্ট |
|||
|
|||
উদাহরণস্বরূপ, একটি ভেরিয়েবলকে `str`-এর একটি `list` হিসেবে সংজ্ঞায়িত করা যাক। |
|||
|
|||
//// tab | Python 3.9+ |
|||
|
|||
ভেরিয়েবলটি ঘোষণা করুন, একই কোলন (`:`) সিনট্যাক্স ব্যবহার করে। |
|||
|
|||
টাইপ হিসেবে, `list` ব্যবহার করুন। |
|||
|
|||
যেহেতু লিস্ট এমন একটি টাইপ যা অভ্যন্তরীণ টাইপগুলি ধারণ করে, আপনি তাদের স্কোয়ার ব্রাকেটের ভিতরে ব্যবহার করুন: |
|||
|
|||
```Python hl_lines="1" |
|||
{!> ../../docs_src/python_types/tutorial006_py39.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
//// tab | Python 3.8+ |
|||
|
|||
`typing` থেকে `List` (বড় হাতের `L` দিয়ে) ইমপোর্ট করুন: |
|||
|
|||
``` Python hl_lines="1" |
|||
{!> ../../docs_src/python_types/tutorial006.py!} |
|||
``` |
|||
|
|||
ভেরিয়েবলটি ঘোষণা করুন, একই কোলন (`:`) সিনট্যাক্স ব্যবহার করে। |
|||
|
|||
টাইপ হিসেবে, `typing` থেকে আপনার ইম্পোর্ট করা `List` ব্যবহার করুন। |
|||
|
|||
যেহেতু লিস্ট এমন একটি টাইপ যা অভ্যন্তরীণ টাইপগুলি ধারণ করে, আপনি তাদের স্কোয়ার ব্রাকেটের ভিতরে করুন: |
|||
|
|||
```Python hl_lines="4" |
|||
{!> ../../docs_src/python_types/tutorial006.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
/// info |
|||
|
|||
স্কোয়ার ব্রাকেট এর ভিতরে ব্যবহৃত এইসব অভন্তরীন টাইপগুলোকে "ইন্টারনাল টাইপ" বলে। |
|||
|
|||
এই উদাহরণে, এটি হচ্ছে `List`(অথবা পাইথন ৩.৯ বা তার উপরের সংস্করণের ক্ষেত্রে `list`) এ পাস করা টাইপ প্যারামিটার। |
|||
|
|||
/// |
|||
|
|||
এর অর্থ হচ্ছে: "ভেরিয়েবল `items` একটি `list`, এবং এই লিস্টের প্রতিটি আইটেম একটি `str`।" |
|||
|
|||
/// tip |
|||
|
|||
যদি আপনি Python 3.9 বা তার উপরে ব্যবহার করেন, আপনার `typing` থেকে `List` আমদানি করতে হবে না, আপনি সাধারণ `list` ওই টাইপের পরিবর্তে ব্যবহার করতে পারেন। |
|||
|
|||
/// |
|||
|
|||
এর মাধ্যমে, আপনার এডিটর লিস্ট থেকে আইটেম প্রসেস করার সময় সাপোর্ট প্রদান করতে পারবে: |
|||
|
|||
<img src="/img/python-types/image05.png"> |
|||
|
|||
টাইপগুলি ছাড়া, এটি করা প্রায় অসম্ভব। |
|||
|
|||
লক্ষ্য করুন যে ভেরিয়েবল `item` হল `items` লিস্টের একটি এলিমেন্ট। |
|||
|
|||
তবুও, এডিটর জানে যে এটি একটি `str`, এবং তার জন্য সাপোর্ট প্রদান করে। |
|||
|
|||
#### টাপল এবং সেট |
|||
|
|||
আপনি `tuple` এবং `set` ঘোষণা করার জন্য একই প্রক্রিয়া অনুসরণ করবেন: |
|||
|
|||
//// tab | Python 3.9+ |
|||
|
|||
```Python hl_lines="1" |
|||
{!> ../../docs_src/python_types/tutorial007_py39.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
//// tab | Python 3.8+ |
|||
|
|||
```Python hl_lines="1 4" |
|||
{!> ../../docs_src/python_types/tutorial007.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
এর মানে হল: |
|||
|
|||
* ভেরিয়েবল `items_t` হল একটি `tuple` যা ৩টি আইটেম ধারণ করে, একটি `int`, অন্য একটি `int`, এবং একটি `str`। |
|||
* ভেরিয়েবল `items_s` হল একটি `set`, এবং এর প্রতিটি আইটেম হল `bytes` টাইপের। |
|||
|
|||
#### ডিক্ট |
|||
|
|||
একটি `dict` সংজ্ঞায়িত করতে, আপনি ২টি টাইপ প্যারামিটার কমা দ্বারা পৃথক করে দেবেন। |
|||
|
|||
প্রথম টাইপ প্যারামিটারটি হল `dict`-এর কীগুলির জন্য। |
|||
|
|||
দ্বিতীয় টাইপ প্যারামিটারটি হল `dict`-এর মানগুলির জন্য: |
|||
|
|||
//// tab | Python 3.9+ |
|||
|
|||
```Python hl_lines="1" |
|||
{!> ../../docs_src/python_types/tutorial008_py39.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
//// tab | Python 3.8+ |
|||
|
|||
```Python hl_lines="1 4" |
|||
{!> ../../docs_src/python_types/tutorial008.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
এর মানে হল: |
|||
|
|||
* ভেরিয়েবল `prices` হল একটি `dict`: |
|||
* এই `dict`-এর কীগুলি হল `str` টাইপের (ধরা যাক, প্রতিটি আইটেমের নাম)। |
|||
* এই `dict`-এর মানগুলি হল `float` টাইপের (ধরা যাক, প্রতিটি আইটেমের দাম)। |
|||
|
|||
#### ইউনিয়ন |
|||
|
|||
আপনি একটি ভেরিয়েবলকে এমনভাবে ঘোষণা করতে পারেন যেন তা **একাধিক টাইপের** হয়, উদাহরণস্বরূপ, একটি `int` অথবা `str`। |
|||
|
|||
Python 3.6 এবং তার উপরের সংস্করণগুলিতে (Python 3.10 অন্তর্ভুক্ত) আপনি `typing` থেকে `Union` টাইপ ব্যবহার করতে পারেন এবং স্কোয়ার ব্র্যাকেটের মধ্যে গ্রহণযোগ্য টাইপগুলি রাখতে পারেন। |
|||
|
|||
Python 3.10-এ একটি **নতুন সিনট্যাক্স** আছে যেখানে আপনি সম্ভাব্য টাইপগুলিকে একটি <abbr title="উল্লম্ব বারালকে 'বিটওয়াইজ বা অপারেটর' বলা হয়, কিন্তু সেই অর্থ এখানে প্রাসঙ্গিক নয়">ভার্টিকাল বার (`|`)</abbr> দ্বারা পৃথক করতে পারেন। |
|||
|
|||
//// tab | Python 3.10+ |
|||
|
|||
```Python hl_lines="1" |
|||
{!> ../../docs_src/python_types/tutorial008b_py310.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
//// tab | Python 3.8+ |
|||
|
|||
```Python hl_lines="1 4" |
|||
{!> ../../docs_src/python_types/tutorial008b.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
উভয় ক্ষেত্রেই এর মানে হল যে `item` হতে পারে একটি `int` অথবা `str`। |
|||
|
|||
#### সম্ভবত `None` |
|||
|
|||
আপনি এমনভাবে ঘোষণা করতে পারেন যে একটি মান হতে পারে এক টাইপের, যেমন `str`, আবার এটি `None`-ও হতে পারে। |
|||
|
|||
Python 3.6 এবং তার উপরের সংস্করণগুলিতে (Python 3.10 অনতর্ভুক্ত) আপনি `typing` মডিউল থেকে `Optional` ইমপোর্ট করে এটি ঘোষণা এবং ব্যবহার করতে পারেন। |
|||
|
|||
```Python hl_lines="1 4" |
|||
{!../../docs_src/python_types/tutorial009.py!} |
|||
``` |
|||
|
|||
`Optional[str]` ব্যবহার করা মানে হল শুধু `str` নয়, এটি হতে পারে `None`-ও, যা আপনার এডিটরকে সেই ত্রুটিগুলি শনাক্ত করতে সাহায্য করবে যেখানে আপনি ধরে নিচ্ছেন যে একটি মান সবসময় `str` হবে, অথচ এটি `None`-ও হতে পারেও। |
|||
|
|||
`Optional[Something]` মূলত `Union[Something, None]`-এর একটি শর্টকাট, এবং তারা সমতুল্য। |
|||
|
|||
এর মানে হল, Python 3.10-এ, আপনি টাইপগুলির ইউনিয়ন ঘোষণা করতে `Something | None` ব্যবহার করতে পারেন: |
|||
|
|||
//// tab | Python 3.10+ |
|||
|
|||
```Python hl_lines="1" |
|||
{!> ../../docs_src/python_types/tutorial009_py310.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
//// tab | Python 3.8+ |
|||
|
|||
```Python hl_lines="1 4" |
|||
{!> ../../docs_src/python_types/tutorial009.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
//// tab | Python 3.8+ বিকল্প |
|||
|
|||
```Python hl_lines="1 4" |
|||
{!> ../../docs_src/python_types/tutorial009b.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
#### `Union` বা `Optional` ব্যবহার |
|||
|
|||
যদি আপনি Python 3.10-এর নীচের সংস্করণ ব্যবহার করেন, তবে এখানে আমার খুবই **ব্যক্তিগত** দৃষ্টিভঙ্গি থেকে একটি টিপস: |
|||
|
|||
* 🚨 `Optional[SomeType]` ব্যবহার এড়িয়ে চলুন। |
|||
* এর পরিবর্তে ✨ **`Union[SomeType, None]` ব্যবহার করুন** ✨। |
|||
|
|||
উভয়ই সমতুল্য এবং মূলে একই, কিন্তু আমি `Union`-এর পক্ষে সুপারিশ করব কারণ "**অপশনাল**" শব্দটি মনে হতে পারে যে মানটি ঐচ্ছিক,অথচ এটি আসলে মানে "এটি হতে পারে `None`", এমনকি যদি এটি ঐচ্ছিক না হয়েও আবশ্যিক হয়। |
|||
|
|||
আমি মনে করি `Union[SomeType, None]` এর অর্থ আরও স্পষ্টভাবে প্রকাশ করে। |
|||
|
|||
এটি কেবল শব্দ এবং নামের ব্যাপার। কিন্তু সেই শব্দগুলি আপনি এবং আপনার সহকর্মীরা কোড সম্পর্কে কীভাবে চিন্তা করেন তা প্রভাবিত করতে পারে। |
|||
|
|||
একটি উদাহরণ হিসেবে, এই ফাংশনটি নিন: |
|||
|
|||
```Python hl_lines="1 4" |
|||
{!../../docs_src/python_types/tutorial009c.py!} |
|||
``` |
|||
|
|||
`name` প্যারামিটারটি `Optional[str]` হিসেবে সংজ্ঞায়িত হয়েছে, কিন্তু এটি **অপশনাল নয়**, আপনি প্যারামিটার ছাড়া ফাংশনটি কল করতে পারবেন না: |
|||
|
|||
```Python |
|||
say_hi() # ওহ না, এটি একটি ত্রুটি নিক্ষেপ করবে! 😱 |
|||
``` |
|||
|
|||
`name` প্যারামিটারটি **এখনও আবশ্যিক** (নন-অপশনাল) কারণ এটির কোনো ডিফল্ট মান নেই। তবুও, `name` এর মান হিসেবে `None` গ্রহণযোগ্য: |
|||
|
|||
```Python |
|||
say_hi(name=None) # এটি কাজ করে, None বৈধ 🎉 |
|||
``` |
|||
|
|||
সুখবর হল, একবার আপনি Python 3.10 ব্যবহার করা শুরু করলে, আপনাকে এগুলোর ব্যাপারে আর চিন্তা করতে হবে না, যেহুতু আপনি | ব্যবহার করেই ইউনিয়ন ঘোষণা করতে পারবেন: |
|||
|
|||
```Python hl_lines="1 4" |
|||
{!../../docs_src/python_types/tutorial009c_py310.py!} |
|||
``` |
|||
|
|||
এবং তারপর আপনাকে নামগুলি যেমন `Optional` এবং `Union` নিয়ে আর চিন্তা করতে হবে না। 😎 |
|||
|
|||
#### জেনেরিক টাইপস |
|||
|
|||
স্কোয়ার ব্র্যাকেটে টাইপ প্যারামিটার নেওয়া এই টাইপগুলিকে **জেনেরিক টাইপ** বা **জেনেরিকস** বলা হয়, যেমন: |
|||
|
|||
//// tab | Python 3.10+ |
|||
|
|||
আপনি সেই একই বিল্টইন টাইপ জেনেরিক্স হিসেবে ব্যবহার করতে পারবেন(ভিতরে টাইপ সহ স্কয়ারে ব্রাকেট দিয়ে): |
|||
|
|||
* `list` |
|||
* `tuple` |
|||
* `set` |
|||
* `dict` |
|||
|
|||
এবং Python 3.8 এর মতোই, `typing` মডিউল থেকে: |
|||
|
|||
* `Union` |
|||
* `Optional` (Python 3.8 এর মতোই) |
|||
* ...এবং অন্যান্য। |
|||
|
|||
Python 3.10-এ, `Union` এবং `Optional` জেনেরিকস ব্যবহার করার বিকল্প হিসেবে, আপনি টাইপগুলির ইউনিয়ন ঘোষণা করতে <abbr title="উল্লম্ব বারালকে 'বিটওয়াইজ বা অপারেটর' বলা হয়, কিন্তু সেই অর্থ এখানে প্রাসঙ্গিক নয়">ভার্টিকাল বার (`|`)</abbr> ব্যবহার করতে পারেন, যা ওদের থেকে অনেক ভালো এবং সহজ। |
|||
|
|||
//// |
|||
|
|||
//// tab | Python 3.9+ |
|||
|
|||
আপনি সেই একই বিল্টইন টাইপ জেনেরিক্স হিসেবে ব্যবহার করতে পারবেন(ভিতরে টাইপ সহ স্কয়ারে ব্রাকেট দিয়ে): |
|||
|
|||
* `list` |
|||
* `tuple` |
|||
* `set` |
|||
* `dict` |
|||
|
|||
এবং Python 3.8 এর মতোই, `typing` মডিউল থেকে: |
|||
|
|||
* `Union` |
|||
* `Optional` |
|||
* ...এবং অন্যান্য। |
|||
|
|||
//// |
|||
|
|||
//// tab | Python 3.8+ |
|||
|
|||
* `List` |
|||
* `Tuple` |
|||
* `Set` |
|||
* `Dict` |
|||
* `Union` |
|||
* `Optional` |
|||
* ...এবং অন্যান্য। |
|||
|
|||
//// |
|||
|
|||
### ক্লাস হিসেবে টাইপস |
|||
|
|||
আপনি একটি ভেরিয়েবলের টাইপ হিসেবে একটি ক্লাস ঘোষণা করতে পারেন। |
|||
|
|||
ধরুন আপনার কাছে `Person` নামে একটি ক্লাস আছে, যার একটি নাম আছে: |
|||
|
|||
```Python hl_lines="1-3" |
|||
{!../../docs_src/python_types/tutorial010.py!} |
|||
``` |
|||
|
|||
তারপর আপনি একটি ভেরিয়েবলকে `Person` টাইপের হিসেবে ঘোষণা করতে পারেন: |
|||
|
|||
```Python hl_lines="6" |
|||
{!../../docs_src/python_types/tutorial010.py!} |
|||
``` |
|||
|
|||
এবং তারপর, আবার, আপনি এডিটর সাপোর্ট পেয়ে যাবেন: |
|||
|
|||
<img src="/img/python-types/image06.png"> |
|||
|
|||
লক্ষ্য করুন যে এর মানে হল "`one_person` হল ক্লাস `Person`-এর একটি **ইন্সট্যান্স**।" |
|||
|
|||
এর মানে এটি নয় যে "`one_person` হল **ক্লাস** যাকে বলা হয় `Person`।" |
|||
|
|||
## Pydantic মডেল |
|||
|
|||
[Pydantic](https://docs.pydantic.dev/) হল একটি Python লাইব্রেরি যা ডাটা ভ্যালিডেশন সম্পাদন করে। |
|||
|
|||
আপনি ডাটার "আকার" এট্রিবিউট সহ ক্লাস হিসেবে ঘোষণা করেন। |
|||
|
|||
এবং প্রতিটি এট্রিবিউট এর একটি টাইপ থাকে। |
|||
|
|||
তারপর আপনি যদি কিছু মান দিয়ে সেই ক্লাসের একটি ইন্সট্যান্স তৈরি করেন-- এটি মানগুলিকে ভ্যালিডেট করবে, প্রয়োজন অনুযায়ী তাদেরকে উপযুক্ত টাইপে রূপান্তর করবে এবং আপনাকে সমস্ত ডাটা সহ একটি অবজেক্ট প্রদান করবে। |
|||
|
|||
এবং আপনি সেই ফলাফল অবজেক্টের সাথে এডিটর সাপোর্ট পাবেন। |
|||
|
|||
অফিসিয়াল Pydantic ডক্স থেকে একটি উদাহরণ: |
|||
|
|||
//// tab | Python 3.10+ |
|||
|
|||
```Python |
|||
{!> ../../docs_src/python_types/tutorial011_py310.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
//// tab | Python 3.9+ |
|||
|
|||
```Python |
|||
{!> ../../docs_src/python_types/tutorial011_py39.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
//// tab | Python 3.8+ |
|||
|
|||
```Python |
|||
{!> ../../docs_src/python_types/tutorial011.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
/// info |
|||
|
|||
[Pydantic সম্পর্কে আরও জানতে, এর ডকুমেন্টেশন দেখুন](https://docs.pydantic.dev/)। |
|||
|
|||
/// |
|||
|
|||
**FastAPI** মূলত Pydantic-এর উপর নির্মিত। |
|||
|
|||
আপনি এই সমস্ত কিছুর অনেক বাস্তবসম্মত উদাহরণ পাবেন [টিউটোরিয়াল - ইউজার গাইডে](https://fastapi.tiangolo.com/tutorial/)। |
|||
|
|||
/// tip |
|||
|
|||
যখন আপনি `Optional` বা `Union[Something, None]` ব্যবহার করেন এবং কোনো ডিফল্ট মান না থাকে, Pydantic-এর একটি বিশেষ আচরণ রয়েছে, আপনি Pydantic ডকুমেন্টেশনে [Required Optional fields](https://docs.pydantic.dev/latest/concepts/models/#required-optional-fields) সম্পর্কে আরও পড়তে পারেন। |
|||
|
|||
/// |
|||
|
|||
## মেটাডাটা অ্যানোটেশন সহ টাইপ হিন্টস |
|||
|
|||
Python-এ এমন একটি ফিচার আছে যা `Annotated` ব্যবহার করে এই টাইপ হিন্টগুলিতে **অতিরিক্ত মেটাডাটা** রাখতে দেয়। |
|||
|
|||
//// tab | Python 3.9+ |
|||
|
|||
Python 3.9-এ, `Annotated` স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্ত, তাই আপনি এটি `typing` থেকে ইমপোর্ট করতে পারেন। |
|||
|
|||
```Python hl_lines="1 4" |
|||
{!> ../../docs_src/python_types/tutorial013_py39.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
//// tab | Python 3.8+ |
|||
|
|||
Python 3.9-এর নীচের সংস্করণগুলিতে, আপনি `Annotated`-কে `typing_extensions` থেকে ইমপোর্ট করেন। |
|||
|
|||
এটি **FastAPI** এর সাথে ইতিমদ্ধে ইনস্টল হয়ে থাকবে। |
|||
|
|||
```Python hl_lines="1 4" |
|||
{!> ../../docs_src/python_types/tutorial013.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
Python নিজে এই `Annotated` দিয়ে কিছুই করে না। এবং এডিটর এবং অন্যান্য টুলগুলির জন্য, টাইপটি এখনও `str`। |
|||
|
|||
কিন্তু আপনি এই `Annotated` এর মধ্যকার জায়গাটির মধ্যে **FastAPI**-এ কীভাবে আপনার অ্যাপ্লিকেশন আচরণ করুক তা সম্পর্কে অতিরিক্ত মেটাডাটা প্রদান করার জন্য ব্যবহার করতে পারেন। |
|||
|
|||
মনে রাখার গুরুত্বপূর্ণ বিষয় হল যে **প্রথম *টাইপ প্যারামিটার*** আপনি `Annotated`-এ পাস করেন সেটি হল **আসল টাইপ**। বাকি শুধুমাত্র অন্যান্য টুলগুলির জন্য মেটাডাটা। |
|||
|
|||
এখন আপনার কেবল জানা প্রয়োজন যে `Annotated` বিদ্যমান, এবং এটি স্ট্যান্ডার্ড Python। 😎 |
|||
|
|||
পরবর্তীতে আপনি দেখবেন এটি কতটা **শক্তিশালী** হতে পারে। |
|||
|
|||
/// tip |
|||
|
|||
এটি **স্ট্যান্ডার্ড Python** হওয়ার মানে হল আপনি আপনার এডিটরে, আপনি যে টুলগুলি কোড বিশ্লেষণ এবং রিফ্যাক্টর করার জন্য ব্যবহার করেন তাতে **সেরা সম্ভাব্য ডেভেলপার এক্সপেরিয়েন্স** পাবেন। ✨ |
|||
|
|||
এবং এছাড়াও আপনার কোড অন্যান্য অনেক Python টুল এবং লাইব্রেরিগুলির সাথে খুব সামঞ্জস্যপূর্ণ হবে। 🚀 |
|||
|
|||
/// |
|||
|
|||
## **FastAPI**-এ টাইপ হিন্টস |
|||
|
|||
**FastAPI** এই টাইপ হিন্টগুলি ব্যবহার করে বেশ কিছু জিনিস করে। |
|||
|
|||
**FastAPI**-এ আপনি টাইপ হিন্টগুলি সহ প্যারামিটার ঘোষণা করেন এবং আপনি পান: |
|||
|
|||
* **এডিটর সাপোর্ট**। |
|||
* **টাইপচেক**। |
|||
|
|||
...এবং **FastAPI** একই ঘোষণাগুলি ব্যবহার করে: |
|||
|
|||
* **রিকুইরেমেন্টস সংজ্ঞায়িত করে**: রিকোয়েস্ট পাথ প্যারামিটার, কুয়েরি প্যারামিটার, হেডার, বডি, ডিপেন্ডেন্সিস, ইত্যাদি থেকে। |
|||
* **ডেটা রূপান্তর করে**: রিকোয়েস্ট থেকে প্রয়োজনীয় টাইপে ডেটা। |
|||
* **ডেটা যাচাই করে**: প্রতিটি রিকোয়েস্ট থেকে আসা ডেটা: |
|||
* যখন ডেটা অবৈধ হয় তখন **স্বয়ংক্রিয় ত্রুটি** গ্রাহকের কাছে ফেরত পাঠানো। |
|||
* **API ডকুমেন্টেশন তৈরি করে**: OpenAPI ব্যবহার করে: |
|||
* যা স্বয়ংক্রিয় ইন্টার্যাক্টিভ ডকুমেন্টেশন ইউজার ইন্টারফেস দ্বারা ব্যবহৃত হয়। |
|||
|
|||
এই সব কিছু আপনার কাছে অস্পষ্ট মনে হতে পারে। চিন্তা করবেন না। আপনি [টিউটোরিয়াল - ইউজার গাইড](https://fastapi.tiangolo.com/tutorial/) এ এই সব কিছু প্র্যাকটিসে দেখতে পাবেন। |
|||
|
|||
গুরুত্বপূর্ণ বিষয় হল, আপনি যদি স্ট্যান্ডার্ড Python টাইপগুলি ব্যবহার করেন, তবে আরও বেশি ক্লাস, ডেকোরেটর ইত্যাদি যোগ না করেই একই স্থানে **FastAPI** আপনার অনেক কাজ করে দিবে। |
|||
|
|||
/// info |
|||
|
|||
যদি আপনি টিউটোরিয়ালের সমস্ত বিষয় পড়ে ফেলে থাকেন এবং টাইপ সম্পর্কে আরও জানতে চান, তবে একটি ভালো রিসোর্স হল [mypy এর "cheat sheet"](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html)। এই "cheat sheet" এ আপনি Python টাইপ হিন্ট সম্পর্কে বেসিক থেকে উন্নত লেভেলের ধারণা পেতে পারেন, যা আপনার কোডে টাইপ সেফটি এবং স্পষ্টতা বাড়াতে সাহায্য করবে। |
|||
|
|||
/// |
@ -10,7 +10,7 @@ Es gibt viele Tools zum Generieren von Clients aus **OpenAPI**. |
|||
|
|||
Ein gängiges Tool ist <a href="https://openapi-generator.tech/" class="external-link" target="_blank">OpenAPI Generator</a>. |
|||
|
|||
Wenn Sie ein **Frontend** erstellen, ist <a href="https://github.com/ferdikoomen/openapi-typescript-codegen" class="external-link" target="_blank">openapi-typescript-codegen</a> eine sehr interessante Alternative. |
|||
Wenn Sie ein **Frontend** erstellen, ist <a href="https://github.com/hey-api/openapi-ts" class="external-link" target="_blank">openapi-ts</a> eine sehr interessante Alternative. |
|||
|
|||
## Client- und SDK-Generatoren – Sponsor |
|||
|
|||
@ -20,7 +20,7 @@ Einige von diesen ✨ [**sponsern FastAPI**](../help-fastapi.md#den-autor-sponse |
|||
|
|||
Und es zeigt deren wahres Engagement für FastAPI und seine **Community** (Sie), da diese Ihnen nicht nur einen **guten Service** bieten möchten, sondern auch sicherstellen möchten, dass Sie über ein **gutes und gesundes Framework** verfügen, FastAPI. 🙇 |
|||
|
|||
Beispielsweise könnten Sie <a href="https://speakeasyapi.dev/?utm_source=fastapi+repo&utm_medium=github+sponsorship" class="external-link" target="_blank">Speakeasy</a> ausprobieren. |
|||
Beispielsweise könnten Sie <a href="https://speakeasy.com/?utm_source=fastapi+repo&utm_medium=github+sponsorship" class="external-link" target="_blank">Speakeasy</a> ausprobieren. |
|||
|
|||
Es gibt auch mehrere andere Unternehmen, welche ähnliche Dienste anbieten und die Sie online suchen und finden können. 🤓 |
|||
|
|||
@ -28,17 +28,21 @@ Es gibt auch mehrere andere Unternehmen, welche ähnliche Dienste anbieten und d |
|||
|
|||
Beginnen wir mit einer einfachen FastAPI-Anwendung: |
|||
|
|||
=== "Python 3.9+" |
|||
//// tab | Python 3.9+ |
|||
|
|||
```Python hl_lines="7-9 12-13 16-17 21" |
|||
{!> ../../../docs_src/generate_clients/tutorial001_py39.py!} |
|||
``` |
|||
```Python hl_lines="7-9 12-13 16-17 21" |
|||
{!> ../../docs_src/generate_clients/tutorial001_py39.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
=== "Python 3.8+" |
|||
//// tab | Python 3.8+ |
|||
|
|||
```Python hl_lines="9-11 14-15 18 19 23" |
|||
{!> ../../../docs_src/generate_clients/tutorial001.py!} |
|||
``` |
|||
```Python hl_lines="9-11 14-15 18 19 23" |
|||
{!> ../../docs_src/generate_clients/tutorial001.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
Beachten Sie, dass die *Pfadoperationen* die Modelle definieren, welche diese für die Request- und Response-<abbr title="Die eigentlichen Nutzdaten, abzüglich der Metadaten">Payload</abbr> verwenden, indem sie die Modelle `Item` und `ResponseMessage` verwenden. |
|||
|
|||
@ -58,14 +62,14 @@ Und dieselben Informationen aus den Modellen, die in OpenAPI enthalten sind, kö |
|||
|
|||
Nachdem wir nun die Anwendung mit den Modellen haben, können wir den Client-Code für das Frontend generieren. |
|||
|
|||
#### `openapi-typescript-codegen` installieren |
|||
#### `openapi-ts` installieren |
|||
|
|||
Sie können `openapi-typescript-codegen` in Ihrem Frontend-Code installieren mit: |
|||
Sie können `openapi-ts` in Ihrem Frontend-Code installieren mit: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ npm install openapi-typescript-codegen --save-dev |
|||
$ npm install @hey-api/openapi-ts --save-dev |
|||
|
|||
---> 100% |
|||
``` |
|||
@ -74,7 +78,7 @@ $ npm install openapi-typescript-codegen --save-dev |
|||
|
|||
#### Client-Code generieren |
|||
|
|||
Um den Client-Code zu generieren, können Sie das Kommandozeilentool `openapi` verwenden, das soeben installiert wurde. |
|||
Um den Client-Code zu generieren, können Sie das Kommandozeilentool `openapi-ts` verwenden, das soeben installiert wurde. |
|||
|
|||
Da es im lokalen Projekt installiert ist, könnten Sie diesen Befehl wahrscheinlich nicht direkt aufrufen, sondern würden ihn in Ihre Datei `package.json` einfügen. |
|||
|
|||
@ -87,12 +91,12 @@ Diese könnte so aussehen: |
|||
"description": "", |
|||
"main": "index.js", |
|||
"scripts": { |
|||
"generate-client": "openapi --input http://localhost:8000/openapi.json --output ./src/client --client axios --useOptions --useUnionTypes" |
|||
"generate-client": "openapi-ts --input http://localhost:8000/openapi.json --output ./src/client --client axios" |
|||
}, |
|||
"author": "", |
|||
"license": "", |
|||
"devDependencies": { |
|||
"openapi-typescript-codegen": "^0.20.1", |
|||
"@hey-api/openapi-ts": "^0.27.38", |
|||
"typescript": "^4.6.2" |
|||
} |
|||
} |
|||
@ -106,7 +110,7 @@ Nachdem Sie das NPM-Skript `generate-client` dort stehen haben, können Sie es a |
|||
$ npm run generate-client |
|||
|
|||
[email protected] generate-client /home/user/code/frontend-app |
|||
> openapi --input http://localhost:8000/openapi.json --output ./src/client --client axios --useOptions --useUnionTypes |
|||
> openapi-ts --input http://localhost:8000/openapi.json --output ./src/client --client axios |
|||
``` |
|||
|
|||
</div> |
|||
@ -123,8 +127,11 @@ Sie erhalten außerdem automatische Vervollständigung für die zu sendende Payl |
|||
|
|||
<img src="/img/tutorial/generate-clients/image03.png"> |
|||
|
|||
!!! tip "Tipp" |
|||
Beachten Sie die automatische Vervollständigung für `name` und `price`, welche in der FastAPI-Anwendung im `Item`-Modell definiert wurden. |
|||
/// tip | Tipp |
|||
|
|||
Beachten Sie die automatische Vervollständigung für `name` und `price`, welche in der FastAPI-Anwendung im `Item`-Modell definiert wurden. |
|||
|
|||
/// |
|||
|
|||
Sie erhalten Inline-Fehlerberichte für die von Ihnen gesendeten Daten: |
|||
|
|||
@ -140,17 +147,21 @@ In vielen Fällen wird Ihre FastAPI-Anwendung größer sein und Sie werden wahrs |
|||
|
|||
Beispielsweise könnten Sie einen Abschnitt für **Items (Artikel)** und einen weiteren Abschnitt für **Users (Benutzer)** haben, und diese könnten durch Tags getrennt sein: |
|||
|
|||
=== "Python 3.9+" |
|||
//// tab | Python 3.9+ |
|||
|
|||
```Python hl_lines="21 26 34" |
|||
{!> ../../docs_src/generate_clients/tutorial002_py39.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
```Python hl_lines="21 26 34" |
|||
{!> ../../../docs_src/generate_clients/tutorial002_py39.py!} |
|||
``` |
|||
//// tab | Python 3.8+ |
|||
|
|||
=== "Python 3.8+" |
|||
```Python hl_lines="23 28 36" |
|||
{!> ../../docs_src/generate_clients/tutorial002.py!} |
|||
``` |
|||
|
|||
```Python hl_lines="23 28 36" |
|||
{!> ../../../docs_src/generate_clients/tutorial002.py!} |
|||
``` |
|||
//// |
|||
|
|||
### Einen TypeScript-Client mit Tags generieren |
|||
|
|||
@ -197,17 +208,21 @@ Hier verwendet sie beispielsweise den ersten Tag (Sie werden wahrscheinlich nur |
|||
|
|||
Anschließend können Sie diese benutzerdefinierte Funktion als Parameter `generate_unique_id_function` an **FastAPI** übergeben: |
|||
|
|||
=== "Python 3.9+" |
|||
//// tab | Python 3.9+ |
|||
|
|||
```Python hl_lines="6-7 10" |
|||
{!> ../../docs_src/generate_clients/tutorial003_py39.py!} |
|||
``` |
|||
|
|||
```Python hl_lines="6-7 10" |
|||
{!> ../../../docs_src/generate_clients/tutorial003_py39.py!} |
|||
``` |
|||
//// |
|||
|
|||
=== "Python 3.8+" |
|||
//// tab | Python 3.8+ |
|||
|
|||
```Python hl_lines="8-9 12" |
|||
{!> ../../docs_src/generate_clients/tutorial003.py!} |
|||
``` |
|||
|
|||
```Python hl_lines="8-9 12" |
|||
{!> ../../../docs_src/generate_clients/tutorial003.py!} |
|||
``` |
|||
//// |
|||
|
|||
### Einen TypeScript-Client mit benutzerdefinierten Operation-IDs generieren |
|||
|
|||
@ -229,17 +244,21 @@ Aber für den generierten Client könnten wir die OpenAPI-Operation-IDs direkt v |
|||
|
|||
Wir könnten das OpenAPI-JSON in eine Datei `openapi.json` herunterladen und dann mit einem Skript wie dem folgenden **den vorangestellten Tag entfernen**: |
|||
|
|||
=== "Python" |
|||
//// tab | Python |
|||
|
|||
```Python |
|||
{!> ../../../docs_src/generate_clients/tutorial004.py!} |
|||
``` |
|||
```Python |
|||
{!> ../../docs_src/generate_clients/tutorial004.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
=== "Node.js" |
|||
//// tab | Node.js |
|||
|
|||
```Javascript |
|||
{!> ../../docs_src/generate_clients/tutorial004.js!} |
|||
``` |
|||
|
|||
```Javascript |
|||
{!> ../../../docs_src/generate_clients/tutorial004.js!} |
|||
``` |
|||
//// |
|||
|
|||
Damit würden die Operation-IDs von Dingen wie `items-get_items` in `get_items` umbenannt, sodass der Client-Generator einfachere Methodennamen generieren kann. |
|||
|
|||
@ -254,12 +273,12 @@ Da das Endergebnis nun in einer Datei `openapi.json` vorliegt, würden Sie die ` |
|||
"description": "", |
|||
"main": "index.js", |
|||
"scripts": { |
|||
"generate-client": "openapi --input ./openapi.json --output ./src/client --client axios --useOptions --useUnionTypes" |
|||
"generate-client": "openapi-ts --input ./openapi.json --output ./src/client --client axios" |
|||
}, |
|||
"author": "", |
|||
"license": "", |
|||
"devDependencies": { |
|||
"openapi-typescript-codegen": "^0.20.1", |
|||
"@hey-api/openapi-ts": "^0.27.38", |
|||
"typescript": "^4.6.2" |
|||
} |
|||
} |
|||
|
@ -8,44 +8,51 @@ Aus diesem Grund werden diese üblicherweise in Umgebungsvariablen bereitgestell |
|||
|
|||
## Umgebungsvariablen |
|||
|
|||
!!! tip "Tipp" |
|||
Wenn Sie bereits wissen, was „Umgebungsvariablen“ sind und wie man sie verwendet, können Sie gerne mit dem nächsten Abschnitt weiter unten fortfahren. |
|||
/// tip | Tipp |
|||
|
|||
Wenn Sie bereits wissen, was „Umgebungsvariablen“ sind und wie man sie verwendet, können Sie gerne mit dem nächsten Abschnitt weiter unten fortfahren. |
|||
|
|||
/// |
|||
|
|||
Eine <a href="https://de.wikipedia.org/wiki/Umgebungsvariable" class="external-link" target="_blank">Umgebungsvariable</a> (auch bekannt als „env var“) ist eine Variable, die sich außerhalb des Python-Codes im Betriebssystem befindet und von Ihrem Python-Code (oder auch von anderen Programmen) gelesen werden kann. |
|||
|
|||
Sie können Umgebungsvariablen in der Shell erstellen und verwenden, ohne Python zu benötigen: |
|||
|
|||
=== "Linux, macOS, Windows Bash" |
|||
//// tab | Linux, macOS, Windows Bash |
|||
|
|||
<div class="termy"> |
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Sie könnten eine Umgebungsvariable MY_NAME erstellen mittels |
|||
$ export MY_NAME="Wade Wilson" |
|||
```console |
|||
// Sie könnten eine Umgebungsvariable MY_NAME erstellen mittels |
|||
$ export MY_NAME="Wade Wilson" |
|||
|
|||
// Dann könnten Sie diese mit anderen Programmen verwenden, etwa |
|||
$ echo "Hello $MY_NAME" |
|||
// Dann könnten Sie diese mit anderen Programmen verwenden, etwa |
|||
$ echo "Hello $MY_NAME" |
|||
|
|||
Hello Wade Wilson |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
Hello Wade Wilson |
|||
``` |
|||
//// |
|||
|
|||
</div> |
|||
//// tab | Windows PowerShell |
|||
|
|||
=== "Windows PowerShell" |
|||
<div class="termy"> |
|||
|
|||
<div class="termy"> |
|||
```console |
|||
// Erstelle eine Umgebungsvariable MY_NAME |
|||
$ $Env:MY_NAME = "Wade Wilson" |
|||
|
|||
```console |
|||
// Erstelle eine Umgebungsvariable MY_NAME |
|||
$ $Env:MY_NAME = "Wade Wilson" |
|||
// Verwende sie mit anderen Programmen, etwa |
|||
$ echo "Hello $Env:MY_NAME" |
|||
|
|||
// Verwende sie mit anderen Programmen, etwa |
|||
$ echo "Hello $Env:MY_NAME" |
|||
Hello Wade Wilson |
|||
``` |
|||
|
|||
Hello Wade Wilson |
|||
``` |
|||
</div> |
|||
|
|||
</div> |
|||
//// |
|||
|
|||
### Umgebungsvariablen mit Python auslesen |
|||
|
|||
@ -60,10 +67,13 @@ name = os.getenv("MY_NAME", "World") |
|||
print(f"Hello {name} from Python") |
|||
``` |
|||
|
|||
!!! tip "Tipp" |
|||
Das zweite Argument für <a href="https://docs.python.org/3.8/library/os.html#os.getenv" class="external-link" target="_blank">`os.getenv()`</a> ist der zurückzugebende Defaultwert. |
|||
/// tip | Tipp |
|||
|
|||
Das zweite Argument für <a href="https://docs.python.org/3.8/library/os.html#os.getenv" class="external-link" target="_blank">`os.getenv()`</a> ist der zurückzugebende Defaultwert. |
|||
|
|||
Wenn nicht angegeben, ist er standardmäßig `None`. Hier übergeben wir `"World"` als Defaultwert. |
|||
Wenn nicht angegeben, ist er standardmäßig `None`. Hier übergeben wir `"World"` als Defaultwert. |
|||
|
|||
/// |
|||
|
|||
Dann könnten Sie dieses Python-Programm aufrufen: |
|||
|
|||
@ -114,8 +124,11 @@ Hello World from Python |
|||
|
|||
</div> |
|||
|
|||
!!! tip "Tipp" |
|||
Weitere Informationen dazu finden Sie unter <a href="https://12factor.net/config" class="external-link" target="_blank">The Twelve-Factor App: Config</a>. |
|||
/// tip | Tipp |
|||
|
|||
Weitere Informationen dazu finden Sie unter <a href="https://12factor.net/config" class="external-link" target="_blank">The Twelve-Factor App: Config</a>. |
|||
|
|||
/// |
|||
|
|||
### Typen und Validierung |
|||
|
|||
@ -151,8 +164,11 @@ $ pip install "fastapi[all]" |
|||
|
|||
</div> |
|||
|
|||
!!! info |
|||
In Pydantic v1 war das im Hauptpackage enthalten. Jetzt wird es als unabhängiges Package verteilt, sodass Sie wählen können, ob Sie es installieren möchten oder nicht, falls Sie die Funktionalität nicht benötigen. |
|||
/// info |
|||
|
|||
In Pydantic v1 war das im Hauptpackage enthalten. Jetzt wird es als unabhängiges Package verteilt, sodass Sie wählen können, ob Sie es installieren möchten oder nicht, falls Sie die Funktionalität nicht benötigen. |
|||
|
|||
/// |
|||
|
|||
### Das `Settings`-Objekt erstellen |
|||
|
|||
@ -162,23 +178,33 @@ Auf die gleiche Weise wie bei Pydantic-Modellen deklarieren Sie Klassenattribute |
|||
|
|||
Sie können dieselben Validierungs-Funktionen und -Tools verwenden, die Sie für Pydantic-Modelle verwenden, z. B. verschiedene Datentypen und zusätzliche Validierungen mit `Field()`. |
|||
|
|||
=== "Pydantic v2" |
|||
//// tab | Pydantic v2 |
|||
|
|||
```Python hl_lines="2 5-8 11" |
|||
{!> ../../docs_src/settings/tutorial001.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
//// tab | Pydantic v1 |
|||
|
|||
```Python hl_lines="2 5-8 11" |
|||
{!> ../../../docs_src/settings/tutorial001.py!} |
|||
``` |
|||
/// info |
|||
|
|||
In Pydantic v1 würden Sie `BaseSettings` direkt von `pydantic` statt von `pydantic_settings` importieren. |
|||
|
|||
/// |
|||
|
|||
```Python hl_lines="2 5-8 11" |
|||
{!> ../../docs_src/settings/tutorial001_pv1.py!} |
|||
``` |
|||
|
|||
=== "Pydantic v1" |
|||
//// |
|||
|
|||
!!! info |
|||
In Pydantic v1 würden Sie `BaseSettings` direkt von `pydantic` statt von `pydantic_settings` importieren. |
|||
/// tip | Tipp |
|||
|
|||
```Python hl_lines="2 5-8 11" |
|||
{!> ../../../docs_src/settings/tutorial001_pv1.py!} |
|||
``` |
|||
Für ein schnelles Copy-and-paste verwenden Sie nicht dieses Beispiel, sondern das letzte unten. |
|||
|
|||
!!! tip "Tipp" |
|||
Für ein schnelles Copy-and-paste verwenden Sie nicht dieses Beispiel, sondern das letzte unten. |
|||
/// |
|||
|
|||
Wenn Sie dann eine Instanz dieser `Settings`-Klasse erstellen (in diesem Fall als `settings`-Objekt), liest Pydantic die Umgebungsvariablen ohne Berücksichtigung der Groß- und Kleinschreibung. Eine Variable `APP_NAME` in Großbuchstaben wird also als Attribut `app_name` gelesen. |
|||
|
|||
@ -189,7 +215,7 @@ Als Nächstes werden die Daten konvertiert und validiert. Wenn Sie also dieses ` |
|||
Dann können Sie das neue `settings`-Objekt in Ihrer Anwendung verwenden: |
|||
|
|||
```Python hl_lines="18-20" |
|||
{!../../../docs_src/settings/tutorial001.py!} |
|||
{!../../docs_src/settings/tutorial001.py!} |
|||
``` |
|||
|
|||
### Den Server ausführen |
|||
@ -206,8 +232,11 @@ $ ADMIN_EMAIL="[email protected]" APP_NAME="ChimichangApp" uvicorn main:app |
|||
|
|||
</div> |
|||
|
|||
!!! tip "Tipp" |
|||
Um mehrere Umgebungsvariablen für einen einzelnen Befehl festzulegen, trennen Sie diese einfach durch ein Leerzeichen und fügen Sie alle vor dem Befehl ein. |
|||
/// tip | Tipp |
|||
|
|||
Um mehrere Umgebungsvariablen für einen einzelnen Befehl festzulegen, trennen Sie diese einfach durch ein Leerzeichen und fügen Sie alle vor dem Befehl ein. |
|||
|
|||
/// |
|||
|
|||
Und dann würde die Einstellung `admin_email` auf `"[email protected]"` gesetzt. |
|||
|
|||
@ -222,17 +251,20 @@ Sie könnten diese Einstellungen in eine andere Moduldatei einfügen, wie Sie in |
|||
Sie könnten beispielsweise eine Datei `config.py` haben mit: |
|||
|
|||
```Python |
|||
{!../../../docs_src/settings/app01/config.py!} |
|||
{!../../docs_src/settings/app01/config.py!} |
|||
``` |
|||
|
|||
Und dann verwenden Sie diese in einer Datei `main.py`: |
|||
|
|||
```Python hl_lines="3 11-13" |
|||
{!../../../docs_src/settings/app01/main.py!} |
|||
{!../../docs_src/settings/app01/main.py!} |
|||
``` |
|||
|
|||
!!! tip "Tipp" |
|||
Sie benötigen außerdem eine Datei `__init__.py`, wie in [Größere Anwendungen – mehrere Dateien](../tutorial/bigger-applications.md){.internal-link target=_blank} gesehen. |
|||
/// tip | Tipp |
|||
|
|||
Sie benötigen außerdem eine Datei `__init__.py`, wie in [Größere Anwendungen – mehrere Dateien](../tutorial/bigger-applications.md){.internal-link target=_blank} gesehen. |
|||
|
|||
/// |
|||
|
|||
## Einstellungen in einer Abhängigkeit |
|||
|
|||
@ -245,7 +277,7 @@ Dies könnte besonders beim Testen nützlich sein, da es sehr einfach ist, eine |
|||
Ausgehend vom vorherigen Beispiel könnte Ihre Datei `config.py` so aussehen: |
|||
|
|||
```Python hl_lines="10" |
|||
{!../../../docs_src/settings/app02/config.py!} |
|||
{!../../docs_src/settings/app02/config.py!} |
|||
``` |
|||
|
|||
Beachten Sie, dass wir jetzt keine Standardinstanz `settings = Settings()` erstellen. |
|||
@ -254,61 +286,82 @@ Beachten Sie, dass wir jetzt keine Standardinstanz `settings = Settings()` erste |
|||
|
|||
Jetzt erstellen wir eine Abhängigkeit, die ein neues `config.Settings()` zurückgibt. |
|||
|
|||
=== "Python 3.9+" |
|||
//// tab | Python 3.9+ |
|||
|
|||
```Python hl_lines="6 12-13" |
|||
{!> ../../../docs_src/settings/app02_an_py39/main.py!} |
|||
``` |
|||
```Python hl_lines="6 12-13" |
|||
{!> ../../docs_src/settings/app02_an_py39/main.py!} |
|||
``` |
|||
|
|||
=== "Python 3.8+" |
|||
//// |
|||
|
|||
```Python hl_lines="6 12-13" |
|||
{!> ../../../docs_src/settings/app02_an/main.py!} |
|||
``` |
|||
//// tab | Python 3.8+ |
|||
|
|||
=== "Python 3.8+ nicht annotiert" |
|||
```Python hl_lines="6 12-13" |
|||
{!> ../../docs_src/settings/app02_an/main.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
!!! tip "Tipp" |
|||
Bevorzugen Sie die `Annotated`-Version, falls möglich. |
|||
//// tab | Python 3.8+ nicht annotiert |
|||
|
|||
```Python hl_lines="5 11-12" |
|||
{!> ../../../docs_src/settings/app02/main.py!} |
|||
``` |
|||
/// tip | Tipp |
|||
|
|||
!!! tip "Tipp" |
|||
Wir werden das `@lru_cache` in Kürze besprechen. |
|||
Bevorzugen Sie die `Annotated`-Version, falls möglich. |
|||
|
|||
Im Moment nehmen Sie an, dass `get_settings()` eine normale Funktion ist. |
|||
/// |
|||
|
|||
```Python hl_lines="5 11-12" |
|||
{!> ../../docs_src/settings/app02/main.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
/// tip | Tipp |
|||
|
|||
Wir werden das `@lru_cache` in Kürze besprechen. |
|||
|
|||
Im Moment nehmen Sie an, dass `get_settings()` eine normale Funktion ist. |
|||
|
|||
/// |
|||
|
|||
Und dann können wir das von der *Pfadoperation-Funktion* als Abhängigkeit einfordern und es überall dort verwenden, wo wir es brauchen. |
|||
|
|||
=== "Python 3.9+" |
|||
//// tab | Python 3.9+ |
|||
|
|||
```Python hl_lines="17 19-21" |
|||
{!> ../../docs_src/settings/app02_an_py39/main.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
//// tab | Python 3.8+ |
|||
|
|||
```Python hl_lines="17 19-21" |
|||
{!> ../../../docs_src/settings/app02_an_py39/main.py!} |
|||
``` |
|||
```Python hl_lines="17 19-21" |
|||
{!> ../../docs_src/settings/app02_an/main.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
=== "Python 3.8+" |
|||
//// tab | Python 3.8+ nicht annotiert |
|||
|
|||
```Python hl_lines="17 19-21" |
|||
{!> ../../../docs_src/settings/app02_an/main.py!} |
|||
``` |
|||
/// tip | Tipp |
|||
|
|||
=== "Python 3.8+ nicht annotiert" |
|||
Bevorzugen Sie die `Annotated`-Version, falls möglich. |
|||
|
|||
!!! tip "Tipp" |
|||
Bevorzugen Sie die `Annotated`-Version, falls möglich. |
|||
/// |
|||
|
|||
```Python hl_lines="16 18-20" |
|||
{!> ../../../docs_src/settings/app02/main.py!} |
|||
``` |
|||
```Python hl_lines="16 18-20" |
|||
{!> ../../docs_src/settings/app02/main.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
### Einstellungen und Tests |
|||
|
|||
Dann wäre es sehr einfach, beim Testen ein anderes Einstellungsobjekt bereitzustellen, indem man eine Abhängigkeitsüberschreibung für `get_settings` erstellt: |
|||
|
|||
```Python hl_lines="9-10 13 21" |
|||
{!../../../docs_src/settings/app02/test_main.py!} |
|||
{!../../docs_src/settings/app02/test_main.py!} |
|||
``` |
|||
|
|||
Bei der Abhängigkeitsüberschreibung legen wir einen neuen Wert für `admin_email` fest, wenn wir das neue `Settings`-Objekt erstellen, und geben dann dieses neue Objekt zurück. |
|||
@ -321,15 +374,21 @@ Wenn Sie viele Einstellungen haben, die sich möglicherweise oft ändern, vielle |
|||
|
|||
Diese Praxis ist so weit verbreitet, dass sie einen Namen hat. Diese Umgebungsvariablen werden üblicherweise in einer Datei `.env` abgelegt und die Datei wird „dotenv“ genannt. |
|||
|
|||
!!! tip "Tipp" |
|||
Eine Datei, die mit einem Punkt (`.`) beginnt, ist eine versteckte Datei in Unix-ähnlichen Systemen wie Linux und macOS. |
|||
/// tip | Tipp |
|||
|
|||
Eine Datei, die mit einem Punkt (`.`) beginnt, ist eine versteckte Datei in Unix-ähnlichen Systemen wie Linux und macOS. |
|||
|
|||
Aber eine dotenv-Datei muss nicht unbedingt genau diesen Dateinamen haben. |
|||
Aber eine dotenv-Datei muss nicht unbedingt genau diesen Dateinamen haben. |
|||
|
|||
/// |
|||
|
|||
Pydantic unterstützt das Lesen dieser Dateitypen mithilfe einer externen Bibliothek. Weitere Informationen finden Sie unter <a href="https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support" class="external-link" target="_blank">Pydantic Settings: Dotenv (.env) support</a>. |
|||
|
|||
!!! tip "Tipp" |
|||
Damit das funktioniert, müssen Sie `pip install python-dotenv` ausführen. |
|||
/// tip | Tipp |
|||
|
|||
Damit das funktioniert, müssen Sie `pip install python-dotenv` ausführen. |
|||
|
|||
/// |
|||
|
|||
### Die `.env`-Datei |
|||
|
|||
@ -344,26 +403,39 @@ APP_NAME="ChimichangApp" |
|||
|
|||
Und dann aktualisieren Sie Ihre `config.py` mit: |
|||
|
|||
=== "Pydantic v2" |
|||
//// tab | Pydantic v2 |
|||
|
|||
```Python hl_lines="9" |
|||
{!> ../../../docs_src/settings/app03_an/config.py!} |
|||
``` |
|||
```Python hl_lines="9" |
|||
{!> ../../docs_src/settings/app03_an/config.py!} |
|||
``` |
|||
|
|||
!!! tip "Tipp" |
|||
Das Attribut `model_config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter <a href="https://docs.pydantic.dev/latest/concepts/config/" class="external-link" target="_blank">Pydantic: Configuration</a>. |
|||
/// tip | Tipp |
|||
|
|||
=== "Pydantic v1" |
|||
Das Attribut `model_config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter <a href="https://docs.pydantic.dev/latest/concepts/config/" class="external-link" target="_blank">Pydantic: Configuration</a>. |
|||
|
|||
```Python hl_lines="9-10" |
|||
{!> ../../../docs_src/settings/app03_an/config_pv1.py!} |
|||
``` |
|||
/// |
|||
|
|||
!!! tip "Tipp" |
|||
Die Klasse `Config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter <a href="https://docs.pydantic.dev/1.10/usage/model_config/" class="external-link" target="_blank">Pydantic Model Config</a>. |
|||
//// |
|||
|
|||
!!! info |
|||
In Pydantic Version 1 erfolgte die Konfiguration in einer internen Klasse `Config`, in Pydantic Version 2 erfolgt sie in einem Attribut `model_config`. Dieses Attribut akzeptiert ein `dict`. Um automatische Codevervollständigung und Inline-Fehlerberichte zu erhalten, können Sie `SettingsConfigDict` importieren und verwenden, um dieses `dict` zu definieren. |
|||
//// tab | Pydantic v1 |
|||
|
|||
```Python hl_lines="9-10" |
|||
{!> ../../docs_src/settings/app03_an/config_pv1.py!} |
|||
``` |
|||
|
|||
/// tip | Tipp |
|||
|
|||
Die Klasse `Config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter <a href="https://docs.pydantic.dev/1.10/usage/model_config/" class="external-link" target="_blank">Pydantic Model Config</a>. |
|||
|
|||
/// |
|||
|
|||
//// |
|||
|
|||
/// info |
|||
|
|||
In Pydantic Version 1 erfolgte die Konfiguration in einer internen Klasse `Config`, in Pydantic Version 2 erfolgt sie in einem Attribut `model_config`. Dieses Attribut akzeptiert ein `dict`. Um automatische Codevervollständigung und Inline-Fehlerberichte zu erhalten, können Sie `SettingsConfigDict` importieren und verwenden, um dieses `dict` zu definieren. |
|||
|
|||
/// |
|||
|
|||
Hier definieren wir die Konfiguration `env_file` innerhalb Ihrer Pydantic-`Settings`-Klasse und setzen den Wert auf den Dateinamen mit der dotenv-Datei, die wir verwenden möchten. |
|||
|
|||
@ -390,26 +462,35 @@ würden wir dieses Objekt für jeden Request erstellen und die `.env`-Datei für |
|||
|
|||
Da wir jedoch den `@lru_cache`-Dekorator oben verwenden, wird das `Settings`-Objekt nur einmal erstellt, nämlich beim ersten Aufruf. ✔️ |
|||
|
|||
=== "Python 3.9+" |
|||
//// tab | Python 3.9+ |
|||
|
|||
```Python hl_lines="1 11" |
|||
{!> ../../../docs_src/settings/app03_an_py39/main.py!} |
|||
``` |
|||
```Python hl_lines="1 11" |
|||
{!> ../../docs_src/settings/app03_an_py39/main.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
//// tab | Python 3.8+ |
|||
|
|||
```Python hl_lines="1 11" |
|||
{!> ../../docs_src/settings/app03_an/main.py!} |
|||
``` |
|||
|
|||
//// |
|||
|
|||
=== "Python 3.8+" |
|||
//// tab | Python 3.8+ nicht annotiert |
|||
|
|||
```Python hl_lines="1 11" |
|||
{!> ../../../docs_src/settings/app03_an/main.py!} |
|||
``` |
|||
/// tip | Tipp |
|||
|
|||
=== "Python 3.8+ nicht annotiert" |
|||
Bevorzugen Sie die `Annotated`-Version, falls möglich. |
|||
|
|||
!!! tip "Tipp" |
|||
Bevorzugen Sie die `Annotated`-Version, falls möglich. |
|||
/// |
|||
|
|||
```Python hl_lines="1 10" |
|||
{!> ../../docs_src/settings/app03/main.py!} |
|||
``` |
|||
|
|||
```Python hl_lines="1 10" |
|||
{!> ../../../docs_src/settings/app03/main.py!} |
|||
``` |
|||
//// |
|||
|
|||
Dann wird bei allen nachfolgenden Aufrufen von `get_settings()`, in den Abhängigkeiten für darauffolgende Requests, dasselbe Objekt zurückgegeben, das beim ersten Aufruf zurückgegeben wurde, anstatt den Code von `get_settings()` erneut auszuführen und ein neues `Settings`-Objekt zu erstellen. |
|||
|
|||
|
@ -1,36 +0,0 @@ |
|||
# Externe Links und Artikel |
|||
|
|||
**FastAPI** hat eine großartige Community, die ständig wächst. |
|||
|
|||
Es gibt viele Beiträge, Artikel, Tools und Projekte zum Thema **FastAPI**. |
|||
|
|||
Hier ist eine unvollständige Liste einiger davon. |
|||
|
|||
!!! tip "Tipp" |
|||
Wenn Sie einen Artikel, ein Projekt, ein Tool oder irgendetwas im Zusammenhang mit **FastAPI** haben, was hier noch nicht aufgeführt ist, erstellen Sie einen <a href="https://github.com/tiangolo/fastapi/edit/master/docs/en/data/external_links.yml" class="external-link" target="_blank">Pull Request und fügen Sie es hinzu</a>. |
|||
|
|||
!!! note "Hinweis Deutsche Übersetzung" |
|||
Die folgenden Überschriften und Links werden aus einer <a href="https://github.com/tiangolo/fastapi/blob/master/docs/en/data/external_links.yml" class="external-link" target="_blank">anderen Datei</a> gelesen und sind daher nicht ins Deutsche übersetzt. |
|||
|
|||
{% for section_name, section_content in external_links.items() %} |
|||
|
|||
## {{ section_name }} |
|||
|
|||
{% for lang_name, lang_content in section_content.items() %} |
|||
|
|||
### {{ lang_name }} |
|||
|
|||
{% for item in lang_content %} |
|||
|
|||
* <a href="{{ item.link }}" class="external-link" target="_blank">{{ item.title }}</a> by <a href="{{ item.author_link }}" class="external-link" target="_blank">{{ item.author }}</a>. |
|||
|
|||
{% endfor %} |
|||
{% endfor %} |
|||
{% endfor %} |
|||
|
|||
## Projekte |
|||
|
|||
Die neuesten GitHub-Projekte zum Thema `fastapi`: |
|||
|
|||
<div class="github-topic-projects"> |
|||
</div> |
@ -1,176 +0,0 @@ |
|||
--- |
|||
hide: |
|||
- navigation |
|||
--- |
|||
|
|||
# FastAPI Leute |
|||
|
|||
FastAPI hat eine großartige Gemeinschaft, die Menschen mit unterschiedlichstem Hintergrund willkommen heißt. |
|||
|
|||
## Erfinder - Betreuer |
|||
|
|||
Hey! 👋 |
|||
|
|||
Das bin ich: |
|||
|
|||
{% if people %} |
|||
<div class="user-list user-list-center"> |
|||
{% for user in people.maintainers %} |
|||
|
|||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Answers: {{ user.answers }}</div><div class="count">Pull Requests: {{ user.prs }}</div></div> |
|||
{% endfor %} |
|||
|
|||
</div> |
|||
{% endif %} |
|||
|
|||
Ich bin der Erfinder und Betreuer von **FastAPI**. Sie können mehr darüber in [FastAPI helfen – Hilfe erhalten – Mit dem Autor vernetzen](help-fastapi.md#mit-dem-autor-vernetzen){.internal-link target=_blank} erfahren. |
|||
|
|||
... Aber hier möchte ich Ihnen die Gemeinschaft vorstellen. |
|||
|
|||
--- |
|||
|
|||
**FastAPI** erhält eine Menge Unterstützung aus der Gemeinschaft. Und ich möchte ihre Beiträge hervorheben. |
|||
|
|||
Das sind die Menschen, die: |
|||
|
|||
* [Anderen bei Fragen auf GitHub helfen](help-fastapi.md#anderen-bei-fragen-auf-github-helfen){.internal-link target=_blank}. |
|||
* [<abbr title='Pull Request – „Zieh-Anfrage“: Geänderten Quellcode senden, mit dem Vorschlag, ihn mit dem aktuellen Quellcode zu verschmelzen'>Pull Requests</abbr> erstellen](help-fastapi.md#einen-pull-request-erstellen){.internal-link target=_blank}. |
|||
* Pull Requests überprüfen (Review), [besonders wichtig für Übersetzungen](contributing.md#ubersetzungen){.internal-link target=_blank}. |
|||
|
|||
Eine Runde Applaus für sie. 👏 🙇 |
|||
|
|||
## Aktivste Benutzer im letzten Monat |
|||
|
|||
Hier die Benutzer, die im letzten Monat am meisten [anderen mit Fragen auf Github](help-fastapi.md#anderen-bei-fragen-auf-github-helfen){.internal-link target=_blank} geholfen haben. ☕ |
|||
|
|||
{% if people %} |
|||
<div class="user-list user-list-center"> |
|||
{% for user in people.last_month_active %} |
|||
|
|||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Fragen beantwortet: {{ user.count }}</div></div> |
|||
{% endfor %} |
|||
|
|||
</div> |
|||
{% endif %} |
|||
|
|||
## Experten |
|||
|
|||
Hier die **FastAPI-Experten**. 🤓 |
|||
|
|||
Das sind die Benutzer, die *insgesamt* [anderen am meisten mit Fragen auf GitHub geholfen haben](help-fastapi.md#anderen-bei-fragen-auf-github-helfen){.internal-link target=_blank}. |
|||
|
|||
Sie haben bewiesen, dass sie Experten sind, weil sie vielen anderen geholfen haben. ✨ |
|||
|
|||
{% if people %} |
|||
<div class="user-list user-list-center"> |
|||
{% for user in people.experts %} |
|||
|
|||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Fragen beantwortet: {{ user.count }}</div></div> |
|||
{% endfor %} |
|||
|
|||
</div> |
|||
{% endif %} |
|||
|
|||
## Top-Mitwirkende |
|||
|
|||
Hier sind die **Top-Mitwirkenden**. 👷 |
|||
|
|||
Diese Benutzer haben [die meisten Pull Requests erstellt](help-fastapi.md#einen-pull-request-erstellen){.internal-link target=_blank} welche *<abbr title="Mergen – Zusammenführen: Unterschiedliche Versionen eines Quellcodes zusammenführen">gemerged</abbr>* wurden. |
|||
|
|||
Sie haben Quellcode, Dokumentation, Übersetzungen, usw. beigesteuert. 📦 |
|||
|
|||
{% if people %} |
|||
<div class="user-list user-list-center"> |
|||
{% for user in people.top_contributors %} |
|||
|
|||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Pull Requests: {{ user.count }}</div></div> |
|||
{% endfor %} |
|||
|
|||
</div> |
|||
{% endif %} |
|||
|
|||
Es gibt viele andere Mitwirkende (mehr als hundert), Sie können sie alle auf der <a href="https://github.com/tiangolo/fastapi/graphs/contributors" class="external-link" target="_blank">FastAPI GitHub Contributors-Seite</a> sehen. 👷 |
|||
|
|||
## Top-Rezensenten |
|||
|
|||
Diese Benutzer sind die **Top-Rezensenten**. 🕵️ |
|||
|
|||
### Rezensionen für Übersetzungen |
|||
|
|||
Ich spreche nur ein paar Sprachen (und nicht sehr gut 😅). Daher bestätigen Reviewer [**Übersetzungen der Dokumentation**](contributing.md#ubersetzungen){.internal-link target=_blank}. Ohne sie gäbe es keine Dokumentation in mehreren anderen Sprachen. |
|||
|
|||
--- |
|||
|
|||
Die **Top-Reviewer** 🕵️ haben die meisten Pull Requests von anderen überprüft und stellen die Qualität des Codes, der Dokumentation und insbesondere der **Übersetzungen** sicher. |
|||
|
|||
{% if people %} |
|||
<div class="user-list user-list-center"> |
|||
{% for user in people.top_reviewers %} |
|||
|
|||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a> <div class="count">Reviews: {{ user.count }}</div></div> |
|||
{% endfor %} |
|||
|
|||
</div> |
|||
{% endif %} |
|||
|
|||
## Sponsoren |
|||
|
|||
Dies sind die **Sponsoren**. 😎 |
|||
|
|||
Sie unterstützen meine Arbeit an **FastAPI** (und andere), hauptsächlich durch <a href="https://github.com/sponsors/tiangolo" class="external-link" target="_blank">GitHub-Sponsoren</a>. |
|||
|
|||
### Gold Sponsoren |
|||
|
|||
{% if sponsors %} |
|||
{% for sponsor in sponsors.gold -%} |
|||
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}"></a> |
|||
{% endfor %} |
|||
{% endif %} |
|||
|
|||
### Silber Sponsoren |
|||
|
|||
{% if sponsors %} |
|||
{% for sponsor in sponsors.silver -%} |
|||
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}"></a> |
|||
{% endfor %} |
|||
{% endif %} |
|||
|
|||
{% if people %} |
|||
{% if people.sponsors_50 %} |
|||
|
|||
### Bronze Sponsoren |
|||
|
|||
<div class="user-list user-list-center"> |
|||
{% for user in people.sponsors_50 %} |
|||
|
|||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a></div> |
|||
{% endfor %} |
|||
|
|||
</div> |
|||
|
|||
{% endif %} |
|||
{% endif %} |
|||
|
|||
### Individuelle Sponsoren |
|||
|
|||
{% if people %} |
|||
<div class="user-list user-list-center"> |
|||
{% for user in people.sponsors %} |
|||
|
|||
<div class="user"><a href="{{ user.url }}" target="_blank"><div class="avatar-wrapper"><img src="{{ user.avatarUrl }}"/></div><div class="title">@{{ user.login }}</div></a></div> |
|||
{% endfor %} |
|||
|
|||
</div> |
|||
{% endif %} |
|||
|
|||
## Über diese Daten - technische Details |
|||
|
|||
Der Hauptzweck dieser Seite ist es zu zeigen, wie die Gemeinschaft anderen hilft. |
|||
|
|||
Das beinhaltet auch Hilfe, die normalerweise weniger sichtbar und in vielen Fällen mühsamer ist, wie, anderen bei Problemen zu helfen und Pull Requests mit Übersetzungen zu überprüfen. |
|||
|
|||
Diese Daten werden jeden Monat berechnet, Sie können den <a href="https://github.com/tiangolo/fastapi/blob/master/.github/actions/people/app/main.py" class="external-link" target="_blank">Quellcode hier lesen</a>. |
|||
|
|||
Hier weise ich auch auf Beiträge von Sponsoren hin. |
|||
|
|||
Ich behalte mir auch das Recht vor, den Algorithmus, die Abschnitte, die Schwellenwerte usw. zu aktualisieren (nur für den Fall 🤷). |
@ -1,3 +0,0 @@ |
|||
# Hilfe |
|||
|
|||
Helfen und Hilfe erhalten, beitragen, mitmachen. 🤝 |
@ -1,5 +0,0 @@ |
|||
# FastAPI und Freunde Newsletter |
|||
|
|||
<iframe data-w-type="embedded" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="https://xr4n4.mjt.lu/wgt/xr4n4/hj5/form?c=40a44fa4" width="100%" style="height: 0;"></iframe> |
|||
|
|||
<script type="text/javascript" src="https://app.mailjet.com/pas-nc-embedded-v1.js"></script> |
@ -1,24 +0,0 @@ |
|||
# `APIRouter`-Klasse |
|||
|
|||
Hier sind die Referenzinformationen für die Klasse `APIRouter` mit all ihren Parametern, Attributen und Methoden. |
|||
|
|||
Sie können die `APIRouter`-Klasse direkt von `fastapi` importieren: |
|||
|
|||
```python |
|||
from fastapi import APIRouter |
|||
``` |
|||
|
|||
::: fastapi.APIRouter |
|||
options: |
|||
members: |
|||
- websocket |
|||
- include_router |
|||
- get |
|||
- put |
|||
- post |
|||
- delete |
|||
- options |
|||
- head |
|||
- patch |
|||
- trace |
|||
- on_event |
@ -1,11 +0,0 @@ |
|||
# Hintergrundtasks – `BackgroundTasks` |
|||
|
|||
Sie können einen Parameter in einer *Pfadoperation-Funktion* oder einer Abhängigkeitsfunktion mit dem Typ `BackgroundTasks` deklarieren und diesen danach verwenden, um die Ausführung von Hintergrundtasks nach dem Senden der Response zu definieren. |
|||
|
|||
Sie können `BackgroundTasks` direkt von `fastapi` importieren: |
|||
|
|||
```python |
|||
from fastapi import BackgroundTasks |
|||
``` |
|||
|
|||
::: fastapi.BackgroundTasks |
@ -1,29 +0,0 @@ |
|||
# Abhängigkeiten – `Depends()` und `Security()` |
|||
|
|||
## `Depends()` |
|||
|
|||
Abhängigkeiten werden hauptsächlich mit der speziellen Funktion `Depends()` behandelt, die ein Callable entgegennimmt. |
|||
|
|||
Hier finden Sie deren Referenz und Parameter. |
|||
|
|||
Sie können sie direkt von `fastapi` importieren: |
|||
|
|||
```python |
|||
from fastapi import Depends |
|||
``` |
|||
|
|||
::: fastapi.Depends |
|||
|
|||
## `Security()` |
|||
|
|||
In vielen Szenarien können Sie die Sicherheit (Autorisierung, Authentifizierung usw.) mit Abhängigkeiten handhaben, indem Sie `Depends()` verwenden. |
|||
|
|||
Wenn Sie jedoch auch OAuth2-Scopes deklarieren möchten, können Sie `Security()` anstelle von `Depends()` verwenden. |
|||
|
|||
Sie können `Security()` direkt von `fastapi` importieren: |
|||
|
|||
```python |
|||
from fastapi import Security |
|||
``` |
|||
|
|||
::: fastapi.Security |
@ -1,3 +0,0 @@ |
|||
# Encoder – `jsonable_encoder` |
|||
|
|||
::: fastapi.encoders.jsonable_encoder |
@ -1,20 +0,0 @@ |
|||
# Exceptions – `HTTPException` und `WebSocketException` |
|||
|
|||
Dies sind die <abbr title="Exception – Ausnahme, Fehler: Python-Objekt, das einen Fehler nebst Metadaten repräsentiert">Exceptions</abbr>, die Sie auslösen können, um dem Client Fehler zu berichten. |
|||
|
|||
Wenn Sie eine Exception auslösen, wird, wie es bei normalem Python der Fall wäre, der Rest der Ausführung abgebrochen. Auf diese Weise können Sie diese Exceptions von überall im Code werfen, um einen Request abzubrechen und den Fehler dem Client anzuzeigen. |
|||
|
|||
Sie können Folgendes verwenden: |
|||
|
|||
* `HTTPException` |
|||
* `WebSocketException` |
|||
|
|||
Diese Exceptions können direkt von `fastapi` importiert werden: |
|||
|
|||
```python |
|||
from fastapi import HTTPException, WebSocketException |
|||
``` |
|||
|
|||
::: fastapi.HTTPException |
|||
|
|||
::: fastapi.WebSocketException |
@ -1,31 +0,0 @@ |
|||
# `FastAPI`-Klasse |
|||
|
|||
Hier sind die Referenzinformationen für die Klasse `FastAPI` mit all ihren Parametern, Attributen und Methoden. |
|||
|
|||
Sie können die `FastAPI`-Klasse direkt von `fastapi` importieren: |
|||
|
|||
```python |
|||
from fastapi import FastAPI |
|||
``` |
|||
|
|||
::: fastapi.FastAPI |
|||
options: |
|||
members: |
|||
- openapi_version |
|||
- webhooks |
|||
- state |
|||
- dependency_overrides |
|||
- openapi |
|||
- websocket |
|||
- include_router |
|||
- get |
|||
- put |
|||
- post |
|||
- delete |
|||
- options |
|||
- head |
|||
- patch |
|||
- trace |
|||
- on_event |
|||
- middleware |
|||
- exception_handler |
@ -1,11 +0,0 @@ |
|||
# `HTTPConnection`-Klasse |
|||
|
|||
Wenn Sie Abhängigkeiten definieren möchten, die sowohl mit HTTP als auch mit WebSockets kompatibel sein sollen, können Sie einen Parameter definieren, der eine `HTTPConnection` anstelle eines `Request` oder eines `WebSocket` akzeptiert. |
|||
|
|||
Sie können diese von `fastapi.requests` importieren: |
|||
|
|||
```python |
|||
from fastapi.requests import HTTPConnection |
|||
``` |
|||
|
|||
::: fastapi.requests.HTTPConnection |
@ -1,8 +0,0 @@ |
|||
# Referenz – Code-API |
|||
|
|||
Hier ist die Referenz oder Code-API, die Klassen, Funktionen, Parameter, Attribute und alle FastAPI-Teile, die Sie in Ihren Anwendungen verwenden können. |
|||
|
|||
Wenn Sie **FastAPI** lernen möchten, ist es viel besser, das [FastAPI-Tutorial](https://fastapi.tiangolo.com/tutorial/) zu lesen. |
|||
|
|||
!!! note "Hinweis Deutsche Übersetzung" |
|||
Die nachfolgende API wird aus der Quelltext-Dokumentation erstellt, daher sind nur die Einleitungen auf Deutsch. |
@ -1,45 +0,0 @@ |
|||
# Middleware |
|||
|
|||
Es gibt mehrere Middlewares, die direkt von Starlette bereitgestellt werden. |
|||
|
|||
Lesen Sie mehr darüber in der [FastAPI-Dokumentation über Middleware](../advanced/middleware.md). |
|||
|
|||
::: fastapi.middleware.cors.CORSMiddleware |
|||
|
|||
Kann von `fastapi` importiert werden: |
|||
|
|||
```python |
|||
from fastapi.middleware.cors import CORSMiddleware |
|||
``` |
|||
|
|||
::: fastapi.middleware.gzip.GZipMiddleware |
|||
|
|||
Kann von `fastapi` importiert werden: |
|||
|
|||
```python |
|||
from fastapi.middleware.gzip import GZipMiddleware |
|||
``` |
|||
|
|||
::: fastapi.middleware.httpsredirect.HTTPSRedirectMiddleware |
|||
|
|||
Kann von `fastapi` importiert werden: |
|||
|
|||
```python |
|||
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware |
|||
``` |
|||
|
|||
::: fastapi.middleware.trustedhost.TrustedHostMiddleware |
|||
|
|||
Kann von `fastapi` importiert werden: |
|||
|
|||
```python |
|||
from fastapi.middleware.trustedhost import TrustedHostMiddleware |
|||
``` |
|||
|
|||
::: fastapi.middleware.wsgi.WSGIMiddleware |
|||
|
|||
Kann von `fastapi` importiert werden: |
|||
|
|||
```python |
|||
from fastapi.middleware.wsgi import WSGIMiddleware |
|||
``` |
@ -1,11 +0,0 @@ |
|||
# OpenAPI `docs` |
|||
|
|||
Werkzeuge zur Verwaltung der automatischen OpenAPI-UI-Dokumentation, einschließlich Swagger UI (standardmäßig unter `/docs`) und ReDoc (standardmäßig unter `/redoc`). |
|||
|
|||
::: fastapi.openapi.docs.get_swagger_ui_html |
|||
|
|||
::: fastapi.openapi.docs.get_redoc_html |
|||
|
|||
::: fastapi.openapi.docs.get_swagger_ui_oauth2_redirect_html |
|||
|
|||
::: fastapi.openapi.docs.swagger_ui_default_parameters |
@ -1,5 +0,0 @@ |
|||
# OpenAPI |
|||
|
|||
Es gibt mehrere Werkzeuge zur Handhabung von OpenAPI. |
|||
|
|||
Normalerweise müssen Sie diese nicht verwenden, es sei denn, Sie haben einen bestimmten fortgeschrittenen Anwendungsfall, welcher das erfordert. |
@ -1,5 +0,0 @@ |
|||
# OpenAPI-`models` |
|||
|
|||
OpenAPI Pydantic-Modelle, werden zum Generieren und Validieren der generierten OpenAPI verwendet. |
|||
|
|||
::: fastapi.openapi.models |
@ -1,35 +0,0 @@ |
|||
# Request-Parameter |
|||
|
|||
Hier die Referenzinformationen für die Request-Parameter. |
|||
|
|||
Dies sind die Sonderfunktionen, die Sie mittels `Annotated` in *Pfadoperation-Funktion*-Parameter oder Abhängigkeitsfunktionen einfügen können, um Daten aus dem Request abzurufen. |
|||
|
|||
Dies beinhaltet: |
|||
|
|||
* `Query()` |
|||
* `Path()` |
|||
* `Body()` |
|||
* `Cookie()` |
|||
* `Header()` |
|||
* `Form()` |
|||
* `File()` |
|||
|
|||
Sie können diese alle direkt von `fastapi` importieren: |
|||
|
|||
```python |
|||
from fastapi import Body, Cookie, File, Form, Header, Path, Query |
|||
``` |
|||
|
|||
::: fastapi.Query |
|||
|
|||
::: fastapi.Path |
|||
|
|||
::: fastapi.Body |
|||
|
|||
::: fastapi.Cookie |
|||
|
|||
::: fastapi.Header |
|||
|
|||
::: fastapi.Form |
|||
|
|||
::: fastapi.File |
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue