1961 changed files with 74580 additions and 64867 deletions
@ -24,6 +24,8 @@ jobs: |
|||||
env: |
env: |
||||
GITHUB_CONTEXT: ${{ toJson(github) }} |
GITHUB_CONTEXT: ${{ toJson(github) }} |
||||
run: echo "$GITHUB_CONTEXT" |
run: echo "$GITHUB_CONTEXT" |
||||
|
# pin to actions/checkout@v5 for compatibility with latest-changes |
||||
|
# Ref: https://github.com/actions/checkout/issues/2313 |
||||
- uses: actions/checkout@v5 |
- uses: actions/checkout@v5 |
||||
with: |
with: |
||||
# To allow latest-changes to commit to the main branch |
# To allow latest-changes to commit to the main branch |
||||
@ -34,7 +36,7 @@ jobs: |
|||||
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }} |
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }} |
||||
with: |
with: |
||||
limit-access-to-actor: true |
limit-access-to-actor: true |
||||
- uses: tiangolo/[email protected].0 |
- uses: tiangolo/[email protected].1 |
||||
with: |
with: |
||||
token: ${{ secrets.GITHUB_TOKEN }} |
token: ${{ secrets.GITHUB_TOKEN }} |
||||
latest_changes_file: docs/en/docs/release-notes.md |
latest_changes_file: docs/en/docs/release-notes.md |
||||
|
|||||
@ -0,0 +1,90 @@ |
|||||
|
name: pre-commit |
||||
|
|
||||
|
on: |
||||
|
pull_request: |
||||
|
types: |
||||
|
- opened |
||||
|
- synchronize |
||||
|
|
||||
|
env: |
||||
|
# Forks and Dependabot don't have access to secrets |
||||
|
HAS_SECRETS: ${{ secrets.PRE_COMMIT != '' }} |
||||
|
|
||||
|
jobs: |
||||
|
pre-commit: |
||||
|
runs-on: ubuntu-latest |
||||
|
steps: |
||||
|
- name: Dump GitHub context |
||||
|
env: |
||||
|
GITHUB_CONTEXT: ${{ toJson(github) }} |
||||
|
run: echo "$GITHUB_CONTEXT" |
||||
|
- uses: actions/checkout@v5 |
||||
|
name: Checkout PR for own repo |
||||
|
if: env.HAS_SECRETS == 'true' |
||||
|
with: |
||||
|
# To be able to commit it needs to fetch the head of the branch, not the |
||||
|
# merge commit |
||||
|
ref: ${{ github.head_ref }} |
||||
|
# 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 }} |
||||
|
# pre-commit lite ci needs the default checkout configs to work |
||||
|
- uses: actions/checkout@v5 |
||||
|
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 |
||||
|
- name: Set up Python |
||||
|
uses: actions/setup-python@v6 |
||||
|
with: |
||||
|
python-version-file: ".python-version" |
||||
|
- name: Setup uv |
||||
|
uses: astral-sh/setup-uv@v7 |
||||
|
with: |
||||
|
cache-dependency-glob: | |
||||
|
pyproject.toml |
||||
|
uv.lock |
||||
|
- name: Install Dependencies |
||||
|
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 |
||||
|
continue-on-error: true |
||||
|
- name: Commit and push changes |
||||
|
if: env.HAS_SECRETS == 'true' |
||||
|
run: | |
||||
|
git config user.name "github-actions[bot]" |
||||
|
git config user.email "github-actions[bot]@users.noreply.github.com" |
||||
|
git add -A |
||||
|
if git diff --staged --quiet; then |
||||
|
echo "No changes to commit" |
||||
|
else |
||||
|
git commit -m "🎨 Auto format" |
||||
|
git push |
||||
|
fi |
||||
|
- uses: pre-commit-ci/[email protected] |
||||
|
if: env.HAS_SECRETS == 'false' |
||||
|
with: |
||||
|
msg: 🎨 Auto format |
||||
|
- name: Error out on pre-commit errors |
||||
|
if: steps.precommit.outcome == 'failure' |
||||
|
run: exit 1 |
||||
|
|
||||
|
# https://github.com/marketplace/actions/alls-green#why |
||||
|
pre-commit-alls-green: # This job does nothing and is only used for the branch protection |
||||
|
if: always() |
||||
|
needs: |
||||
|
- pre-commit |
||||
|
runs-on: ubuntu-latest |
||||
|
steps: |
||||
|
- name: Dump GitHub context |
||||
|
env: |
||||
|
GITHUB_CONTEXT: ${{ toJson(github) }} |
||||
|
run: echo "$GITHUB_CONTEXT" |
||||
|
- name: Decide whether the needed jobs succeeded or failed |
||||
|
uses: re-actors/alls-green@release/v1 |
||||
|
with: |
||||
|
jobs: ${{ toJSON(needs) }} |
||||
@ -15,28 +15,25 @@ jobs: |
|||||
- fastapi-slim |
- fastapi-slim |
||||
permissions: |
permissions: |
||||
id-token: write |
id-token: write |
||||
|
contents: read |
||||
steps: |
steps: |
||||
- name: Dump GitHub context |
- name: Dump GitHub context |
||||
env: |
env: |
||||
GITHUB_CONTEXT: ${{ toJson(github) }} |
GITHUB_CONTEXT: ${{ toJson(github) }} |
||||
run: echo "$GITHUB_CONTEXT" |
run: echo "$GITHUB_CONTEXT" |
||||
- uses: actions/checkout@v5 |
- uses: actions/checkout@v6 |
||||
- name: Set up Python |
- name: Set up Python |
||||
uses: actions/setup-python@v6 |
uses: actions/setup-python@v6 |
||||
with: |
with: |
||||
python-version: "3.10" |
python-version-file: ".python-version" |
||||
# Issue ref: https://github.com/actions/setup-python/issues/436 |
# Issue ref: https://github.com/actions/setup-python/issues/436 |
||||
# cache: "pip" |
# cache: "pip" |
||||
# cache-dependency-path: pyproject.toml |
# cache-dependency-path: pyproject.toml |
||||
- name: Install build dependencies |
- name: Install uv |
||||
run: pip install build |
uses: astral-sh/setup-uv@v7 |
||||
- name: Build distribution |
- name: Build distribution |
||||
|
run: uv build |
||||
env: |
env: |
||||
TIANGOLO_BUILD_PACKAGE: ${{ matrix.package }} |
TIANGOLO_BUILD_PACKAGE: ${{ matrix.package }} |
||||
run: python -m build |
|
||||
- name: Publish |
- name: Publish |
||||
uses: pypa/[email protected] |
run: uv publish |
||||
- name: Dump GitHub context |
|
||||
env: |
|
||||
GITHUB_CONTEXT: ${{ toJson(github) }} |
|
||||
run: echo "$GITHUB_CONTEXT" |
|
||||
|
|||||
@ -1,25 +1,66 @@ |
|||||
# See https://pre-commit.com for more information |
# See https://pre-commit.com for more information |
||||
# See https://pre-commit.com/hooks.html for more hooks |
# See https://pre-commit.com/hooks.html for more hooks |
||||
default_language_version: |
|
||||
python: python3.10 |
|
||||
repos: |
repos: |
||||
- repo: https://github.com/pre-commit/pre-commit-hooks |
- repo: https://github.com/pre-commit/pre-commit-hooks |
||||
rev: v6.0.0 |
rev: v6.0.0 |
||||
hooks: |
hooks: |
||||
- id: check-added-large-files |
- id: check-added-large-files |
||||
- id: check-toml |
args: ['--maxkb=750'] |
||||
- id: check-yaml |
exclude: ^uv.lock$ |
||||
|
- id: check-toml |
||||
|
- id: check-yaml |
||||
args: |
args: |
||||
- --unsafe |
- --unsafe |
||||
- id: end-of-file-fixer |
- id: end-of-file-fixer |
||||
- id: trailing-whitespace |
- id: trailing-whitespace |
||||
- repo: https://github.com/astral-sh/ruff-pre-commit |
|
||||
rev: v0.13.1 |
- repo: local |
||||
hooks: |
hooks: |
||||
- id: ruff |
- id: local-ruff-check |
||||
|
name: ruff check |
||||
|
entry: uv run ruff check --force-exclude --fix --exit-non-zero-on-fix |
||||
|
require_serial: true |
||||
|
language: unsupported |
||||
|
types: [python] |
||||
|
|
||||
|
- id: local-ruff-format |
||||
|
name: ruff format |
||||
|
entry: uv run ruff format --force-exclude --exit-non-zero-on-format |
||||
|
require_serial: true |
||||
|
language: unsupported |
||||
|
types: [python] |
||||
|
|
||||
|
- id: add-permalinks-pages |
||||
|
language: unsupported |
||||
|
name: add-permalinks-pages |
||||
|
entry: uv run ./scripts/docs.py add-permalinks-pages |
||||
args: |
args: |
||||
- --fix |
- --update-existing |
||||
- id: ruff-format |
files: ^docs/en/docs/.*\.md$ |
||||
ci: |
|
||||
autofix_commit_msg: 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks |
- id: generate-readme |
||||
autoupdate_commit_msg: ⬆ [pre-commit.ci] pre-commit autoupdate |
language: unsupported |
||||
|
name: generate README.md from index.md |
||||
|
entry: uv run ./scripts/docs.py generate-readme |
||||
|
files: ^docs/en/docs/index\.md|docs/en/data/sponsors\.yml|scripts/docs\.py$ |
||||
|
pass_filenames: false |
||||
|
|
||||
|
- id: update-languages |
||||
|
language: unsupported |
||||
|
name: update languages |
||||
|
entry: uv run ./scripts/docs.py update-languages |
||||
|
files: ^docs/.*|scripts/docs\.py$ |
||||
|
pass_filenames: false |
||||
|
|
||||
|
- id: ensure-non-translated |
||||
|
language: unsupported |
||||
|
name: ensure non-translated files are not modified |
||||
|
entry: uv run ./scripts/docs.py ensure-non-translated |
||||
|
files: ^docs/(?!en/).*|^scripts/docs\.py$ |
||||
|
pass_filenames: false |
||||
|
|
||||
|
- id: fix-translations |
||||
|
language: unsupported |
||||
|
name: fix translations |
||||
|
entry: uv run ./scripts/translation_fixer.py fix-pages |
||||
|
files: ^docs/(?!en/).*/docs/.*\.md$ |
||||
|
|||||
@ -0,0 +1 @@ |
|||||
|
3.11 |
||||
@ -1,467 +0,0 @@ |
|||||
<p align="center"> |
|
||||
<a href="https://fastapi.tiangolo.com"><img src="https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png" alt="FastAPI"></a> |
|
||||
</p> |
|
||||
<p align="center"> |
|
||||
<em>FastAPI framework, yüksək məshuldarlı, öyrənməsi asan, çevik kodlama, istifadəyə hazırdır</em> |
|
||||
</p> |
|
||||
<p align="center"> |
|
||||
<a href="https://github.com/fastapi/fastapi/actions?query=workflow%3ATest+event%3Apush+branch%3Amaster" target="_blank"> |
|
||||
<img src="https://github.com/fastapi/fastapi/actions/workflows/test.yml/badge.svg?event=push&branch=master" alt="Test"> |
|
||||
</a> |
|
||||
<a href="https://coverage-badge.samuelcolvin.workers.dev/redirect/fastapi/fastapi" target="_blank"> |
|
||||
<img src="https://coverage-badge.samuelcolvin.workers.dev/fastapi/fastapi.svg" alt="Əhatə"> |
|
||||
</a> |
|
||||
<a href="https://pypi.org/project/fastapi" target="_blank"> |
|
||||
<img src="https://img.shields.io/pypi/v/fastapi?color=%2334D058&label=pypi%20package" alt="Paket versiyası"> |
|
||||
</a> |
|
||||
<a href="https://pypi.org/project/fastapi" target="_blank"> |
|
||||
<img src="https://img.shields.io/pypi/pyversions/fastapi.svg?color=%2334D058" alt="Dəstəklənən Python versiyaları"> |
|
||||
</a> |
|
||||
</p> |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
**Sənədlər**: <a href="https://fastapi.tiangolo.com" target="_blank">https://fastapi.tiangolo.com</a> |
|
||||
|
|
||||
**Qaynaq Kodu**: <a href="https://github.com/fastapi/fastapi" target="_blank">https://github.com/fastapi/fastapi</a> |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
FastAPI Python ilə API yaratmaq üçün standart Python <abbr title="Tip Məsləhətləri: Type Hints">tip məsləhətlərinə</abbr> əsaslanan, müasir, sürətli (yüksək performanslı) framework-dür. |
|
||||
|
|
||||
Əsas xüsusiyyətləri bunlardır: |
|
||||
|
|
||||
* **Sürətli**: Çox yüksək performans, **NodeJS** və **Go** səviyyəsində (Starlette və Pydantic-ə təşəkkürlər). [Ən sürətli Python frameworklərindən biridir](#performans). |
|
||||
* **Çevik kodlama**: Funksiyanallıqları inkişaf etdirmək sürətini təxminən 200%-dən 300%-ə qədər artırın. * |
|
||||
* **Daha az xəta**: İnsan (developer) tərəfindən törədilən səhvlərin təxminən 40% -ni azaldın. * |
|
||||
* **İntuitiv**: Əla redaktor dəstəyi. Hər yerdə <abbr title="auto-complete, autocompletion, IntelliSense olaraq da bilinir">otomatik tamamlama</abbr>. Xətaları müəyyənləşdirməyə daha az vaxt sərf edəcəksiniz. |
|
||||
* **Asan**: İstifadəsi və öyrənilməsi asan olması üçün nəzərdə tutulmuşdur. Sənədləri oxumaq üçün daha az vaxt ayıracaqsınız. |
|
||||
* **Qısa**: Kod təkrarlanmasını minimuma endirin. Hər bir parametr tərifində birdən çox xüsusiyyət ilə və daha az səhvlə qarşılaşacaqsınız. |
|
||||
* **Güclü**: Avtomatik və interaktiv sənədlərlə birlikdə istifadəyə hazır kod əldə edə bilərsiniz. |
|
||||
* **Standartlara əsaslanan**: API-lar üçün açıq standartlara əsaslanır (və tam uyğun gəlir): <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a> (əvvəlki adı ilə Swagger) və <a href="https://json-schema.org/" class="external-link" target="_blank">JSON Schema</a>. |
|
||||
|
|
||||
<small>* Bu fikirlər daxili development komandasının hazırladıqları məhsulların sınaqlarına əsaslanır.</small> |
|
||||
|
|
||||
## Sponsorlar |
|
||||
|
|
||||
<!-- sponsors --> |
|
||||
|
|
||||
{% if sponsors %} |
|
||||
{% for sponsor in sponsors.gold -%} |
|
||||
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a> |
|
||||
{% endfor -%}` |
|
||||
{%- 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 %} |
|
||||
|
|
||||
<!-- /sponsors --> |
|
||||
|
|
||||
<a href="https://fastapi.tiangolo.com/az/fastapi-people/#sponsors" class="external-link" target="_blank">Digər sponsorlar</a> |
|
||||
|
|
||||
## Rəylər |
|
||||
|
|
||||
"_[...] Son günlərdə **FastAPI**-ı çox istifadə edirəm. [...] Əslində onu komandamın bütün **Microsoftda ML sevislərində** istifadə etməyi planlayıram. Onların bəziləri **windows**-un əsas məhsuluna və bəzi **Office** məhsullarına inteqrasiya olunurlar._" |
|
||||
|
|
||||
<div style="text-align: right; margin-right: 10%;">Kabir Khan - <strong>Microsoft</strong> <a href="https://github.com/fastapi/fastapi/pull/26" target="_blank"><small>(ref)</small></a></div> |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
"_**FastAPI** kitabxanasını **Proqnozlar** əldə etmək üçün sorğulana bilən **REST** serverini yaratmaqda istifadə etdik._" |
|
||||
|
|
||||
<div style="text-align: right; margin-right: 10%;">Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - <strong>Uber</strong> <a href="https://eng.uber.com/ludwig-v0-2/" target="_blank"><small>(ref)</small></a></div> |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
"_**Netflix** **böhran idarəçiliyi** orkestrləşmə framework-nün açıq qaynaqlı buraxılışını elan etməkdən məmnundur: **Dispatch**! [**FastAPI** ilə quruldu]_" |
|
||||
|
|
||||
<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" target="_blank"><small>(ref)</small></a></div> |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
"_**FastAPI** üçün həyəcanlıyam. Çox əyləncəlidir!_" |
|
||||
|
|
||||
<div style="text-align: right; margin-right: 10%;">Brian Okken - <strong><a href="https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855" target="_blank">Python Bytes</a> podcast host</strong> <a href="https://x.com/brianokken/status/1112220079972728832" target="_blank"><small>(ref)</small></a></div> |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
"_Düzünü desəm, sizin qurduğunuz şey həqiqətən möhkəm və peşəkar görünür. Bir çox cəhətdən **Hug**-un olmasını istədiyim kimdir - kiminsə belə bir şey qurduğunu görmək həqiqətən ruhlandırıcıdır._" |
|
||||
|
|
||||
<div style="text-align: right; margin-right: 10%;">Timothy Crosley - <strong><a href="https://github.com/hugapi/hug" target="_blank">Hug</a> creator</strong> <a href="https://news.ycombinator.com/item?id=19455465" target="_blank"><small>(ref)</small></a></div> |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
"_Əgər REST API-lər yaratmaq üçün **müasir framework** öyrənmək istəyirsinizsə, **FastAPI**-a baxın [...] Sürətli, istifadəsi və öyrənməsi asandır. [...]_" |
|
||||
|
|
||||
"_**API** xidmətlərimizi **FastAPI**-a köçürdük [...] Sizin də bəyənəcəyinizi düşünürük._" |
|
||||
|
|
||||
<div style="text-align: right; margin-right: 10%;">Ines Montani - Matthew Honnibal - <strong><a href="https://explosion.ai" target="_blank">Explosion AI</a> founders - <a href="https://spacy.io" target="_blank">spaCy</a> creators</strong> <a href="https://x.com/_inesmontani/status/1144173225322143744" target="_blank"><small>(ref)</small></a> - <a href="https://x.com/honnibal/status/1144031421859655680" target="_blank"><small>(ref)</small></a></div> |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
"_Python ilə istifadəyə hazır API qurmaq istəyən hər kəsə **FastAPI**-ı tövsiyə edirəm. **Möhtəşəm şəkildə dizayn edilmiş**, **istifadəsi asan** və **yüksək dərəcədə genişlənə bilən**-dir, API əsaslı inkişaf strategiyamızın **əsas komponentinə** çevrilib və Virtual TAC Engineer kimi bir çox avtomatlaşdırma və servisləri idarə edir._" |
|
||||
|
|
||||
<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/" target="_blank"><small>(ref)</small></a></div> |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
## **Typer**, CLI-ların FastAPI-ı |
|
||||
|
|
||||
<a href="https://typer.tiangolo.com" target="_blank"><img src="https://typer.tiangolo.com/img/logo-margin/logo-margin-vector.svg" style="width: 20%;"></a> |
|
||||
|
|
||||
Əgər siz veb API əvəzinə terminalda istifadə ediləcək <abbr title="Command Line Interface">CLI</abbr> proqramı qurursunuzsa, <a href="https://typer.tiangolo.com/" class="external-link" target="_blank">**Typer**</a>-a baxa bilərsiniz. |
|
||||
|
|
||||
**Typer** FastAPI-ın kiçik qardaşıdır. Və o, CLI-lərin **FastAPI**-ı olmaq üçün nəzərdə tutulub. ⌨️ 🚀 |
|
||||
|
|
||||
## Tələblər |
|
||||
|
|
||||
FastAPI nəhənglərin çiyinlərində dayanır: |
|
||||
|
|
||||
* Web tərəfi üçün <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a>. |
|
||||
* Data tərəfi üçün <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a>. |
|
||||
|
|
||||
## Quraşdırma |
|
||||
|
|
||||
<div class="termy"> |
|
||||
|
|
||||
```console |
|
||||
$ pip install fastapi |
|
||||
|
|
||||
---> 100% |
|
||||
``` |
|
||||
|
|
||||
</div> |
|
||||
|
|
||||
Tətbiqimizi əlçatan etmək üçün bizə <a href="https://www.uvicorn.org" class="external-link" target="_blank">Uvicorn</a> və ya <a href="https://github.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a> kimi ASGI server lazımdır. |
|
||||
|
|
||||
<div class="termy"> |
|
||||
|
|
||||
```console |
|
||||
$ pip install "uvicorn[standard]" |
|
||||
|
|
||||
---> 100% |
|
||||
``` |
|
||||
|
|
||||
</div> |
|
||||
|
|
||||
## Nümunə |
|
||||
|
|
||||
### Kodu yaradaq |
|
||||
|
|
||||
* `main.py` adlı fayl yaradaq və ona aşağıdakı kodu yerləşdirək: |
|
||||
|
|
||||
```Python |
|
||||
from typing import Union |
|
||||
|
|
||||
from fastapi import FastAPI |
|
||||
|
|
||||
app = FastAPI() |
|
||||
|
|
||||
|
|
||||
@app.get("/") |
|
||||
def read_root(): |
|
||||
return {"Hello": "World"} |
|
||||
|
|
||||
|
|
||||
@app.get("/items/{item_id}") |
|
||||
def read_item(item_id: int, q: Union[str, None] = None): |
|
||||
return {"item_id": item_id, "q": q} |
|
||||
``` |
|
||||
|
|
||||
<details markdown="1"> |
|
||||
<summary>Və ya <code>async def</code>...</summary> |
|
||||
|
|
||||
Əgər kodunuzda `async` və ya `await` vardırsa `async def` istifadə edə bilərik: |
|
||||
|
|
||||
```Python hl_lines="9 14" |
|
||||
from typing import Union |
|
||||
|
|
||||
from fastapi import FastAPI |
|
||||
|
|
||||
app = FastAPI() |
|
||||
|
|
||||
|
|
||||
@app.get("/") |
|
||||
async def read_root(): |
|
||||
return {"Hello": "World"} |
|
||||
|
|
||||
|
|
||||
@app.get("/items/{item_id}") |
|
||||
async def read_item(item_id: int, q: Union[str, None] = None): |
|
||||
return {"item_id": item_id, "q": q} |
|
||||
``` |
|
||||
|
|
||||
**Qeyd**: |
|
||||
|
|
||||
Əgər bu mövzu haqqında məlumatınız yoxdursa <a href="https://fastapi.tiangolo.com/az/async/#in-a-hurry" target="_blank">`async` və `await` sənədindəki</a> _"Tələsirsən?"_ bölməsinə baxa bilərsiniz. |
|
||||
|
|
||||
</details> |
|
||||
|
|
||||
### Kodu işə salaq |
|
||||
|
|
||||
Serveri aşağıdakı əmr ilə işə salaq: |
|
||||
|
|
||||
<div class="termy"> |
|
||||
|
|
||||
```console |
|
||||
$ uvicorn main:app --reload |
|
||||
|
|
||||
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) |
|
||||
INFO: Started reloader process [28720] |
|
||||
INFO: Started server process [28722] |
|
||||
INFO: Waiting for application startup. |
|
||||
INFO: Application startup complete. |
|
||||
``` |
|
||||
|
|
||||
</div> |
|
||||
|
|
||||
<details markdown="1"> |
|
||||
<summary><code>uvicorn main:app --reload</code> əmri haqqında...</summary> |
|
||||
|
|
||||
`uvicorn main:app` əmri aşağıdakılara instinad edir: |
|
||||
|
|
||||
* `main`: `main.py` faylı (yəni Python "modulu"). |
|
||||
* `app`: `main.py` faylında `app = FastAPI()` sətrində yaratdığımız `FastAPI` obyektidir. |
|
||||
* `--reload`: kod dəyişikliyindən sonra avtomatik olaraq serveri yenidən işə salır. Bu parametrdən yalnız development mərhələsində istifadə etməliyik. |
|
||||
|
|
||||
</details> |
|
||||
|
|
||||
### İndi yoxlayaq |
|
||||
|
|
||||
Bu linki brauzerimizdə açaq <a href="http://127.0.0.1:8000/items/5?q=somequery" class="external-link" target="_blank">http://127.0.0.1:8000/items/5?q=somequery</a>. |
|
||||
|
|
||||
Aşağıdakı kimi bir JSON cavabı görəcəksiniz: |
|
||||
|
|
||||
```JSON |
|
||||
{"item_id": 5, "q": "somequery"} |
|
||||
``` |
|
||||
|
|
||||
Siz artıq bir API yaratmısınız, hansı ki: |
|
||||
|
|
||||
* `/` və `/items/{item_id}` <abbr title="Yol: Path ">_yollarında_</abbr> HTTP sorğularını qəbul edir. |
|
||||
* Hər iki _yolda_ `GET` <em>əməliyyatlarını</em> (həmçinin HTTP _metodları_ kimi bilinir) aparır. |
|
||||
* `/items/{item_id}` _yolu_ `item_id` adlı `int` qiyməti almalı olan _yol parametrinə_ sahibdir. |
|
||||
* `/items/{item_id}` _yolunun_ `q` adlı yol parametri var və bu parametr istəyə bağlı olsa da, `str` qiymətini almalıdır. |
|
||||
|
|
||||
### İnteraktiv API Sənədləri |
|
||||
|
|
||||
İndi <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> ünvanına daxil olun. |
|
||||
|
|
||||
Avtomatik interaktiv API sənədlərini görəcəksiniz (<a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a> tərəfindən təmin edilir): |
|
||||
|
|
||||
 |
|
||||
|
|
||||
### Alternativ API sənədləri |
|
||||
|
|
||||
İndi isə <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a> ünvanına daxil olun. |
|
||||
|
|
||||
<a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a> tərəfindən təqdim edilən avtomatik sənədləri görəcəksiniz: |
|
||||
|
|
||||
 |
|
||||
|
|
||||
## Nümunəni Yeniləyək |
|
||||
|
|
||||
İndi gəlin `main.py` faylını `PUT` sorğusu ilə birlikdə <abbr title="Gövdə: Body ">gövdə</abbr> qəbul edəcək şəkildə dəyişdirək. |
|
||||
|
|
||||
Pydantic sayəsində standart Python tiplərindən istifadə edərək <abbr title="Gövdə: Body ">gövdə</abbr>ni müəyyən edək. |
|
||||
|
|
||||
```Python hl_lines="4 9-12 25-27" |
|
||||
from typing import Union |
|
||||
|
|
||||
from fastapi import FastAPI |
|
||||
from pydantic import BaseModel |
|
||||
|
|
||||
app = FastAPI() |
|
||||
|
|
||||
|
|
||||
class Item(BaseModel): |
|
||||
name: str |
|
||||
price: float |
|
||||
is_offer: Union[bool, None] = None |
|
||||
|
|
||||
|
|
||||
@app.get("/") |
|
||||
def read_root(): |
|
||||
return {"Hello": "World"} |
|
||||
|
|
||||
|
|
||||
@app.get("/items/{item_id}") |
|
||||
def read_item(item_id: int, q: Union[str, None] = None): |
|
||||
return {"item_id": item_id, "q": q} |
|
||||
|
|
||||
|
|
||||
@app.put("/items/{item_id}") |
|
||||
def update_item(item_id: int, item: Item): |
|
||||
return {"item_name": item.name, "item_id": item_id} |
|
||||
``` |
|
||||
Server avtomatik olaraq yenidən işə salınmalı idi (çünki biz yuxarıda `uvicorn` əmri ilə `--reload` parametrindən istifadə etmişik). |
|
||||
|
|
||||
### İnteraktiv API sənədlərindəki dəyişikliyə baxaq |
|
||||
|
|
||||
Yenidən <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> ünvanına daxil olun. |
|
||||
|
|
||||
* İnteraktiv API sənədləri yeni gövdə də daxil olmaq ilə avtomatik olaraq yenilənəcək: |
|
||||
|
|
||||
 |
|
||||
|
|
||||
* "Try it out" düyməsini klikləyin, bu, parametrləri doldurmağa və API ilə birbaşa əlaqə saxlamağa imkan verir: |
|
||||
|
|
||||
 |
|
||||
|
|
||||
* Sonra "Execute" düyməsini klikləyin, istifadəçi interfeysi API ilə əlaqə quracaq, parametrləri göndərəcək, nəticələri əldə edəcək və onları ekranda göstərəcək: |
|
||||
|
|
||||
 |
|
||||
|
|
||||
### Alternativ API Sənədlərindəki Dəyişikliyə Baxaq |
|
||||
|
|
||||
İndi isə yenidən <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a> ünvanına daxil olun. |
|
||||
|
|
||||
* Alternativ sənədlər həm də yeni sorğu parametri və gövdəsini əks etdirəcək: |
|
||||
|
|
||||
 |
|
||||
|
|
||||
### Xülasə |
|
||||
|
|
||||
Ümumiləşdirsək, parametrlər, gövdə və s. Biz məlumat növlərini **bir dəfə** funksiya parametrləri kimi təyin edirik. |
|
||||
|
|
||||
Bunu standart müasir Python tipləri ilə edirsiniz. |
|
||||
|
|
||||
Yeni sintaksis, müəyyən bir kitabxananın metodlarını və ya siniflərini və s. öyrənmək məcburiyyətində deyilsiniz. |
|
||||
|
|
||||
Sadəcə standart **Python**. |
|
||||
|
|
||||
Məsələn, `int` üçün: |
|
||||
|
|
||||
```Python |
|
||||
item_id: int |
|
||||
``` |
|
||||
|
|
||||
və ya daha mürəkkəb `Item` modeli üçün: |
|
||||
|
|
||||
```Python |
|
||||
item: Item |
|
||||
``` |
|
||||
|
|
||||
...və yalnız parametr tipini təyin etməklə bunları əldə edirsiniz: |
|
||||
|
|
||||
* Redaktor dəstəyi ilə: |
|
||||
* Avtomatik tamamlama. |
|
||||
* Tip yoxlanması. |
|
||||
* Məlumatların Təsdiqlənməsi: |
|
||||
* Məlumat etibarsız olduqda avtomatik olaraq aydın xətalar göstərir. |
|
||||
* Hətta çox dərin JSON obyektlərində belə doğrulama aparır. |
|
||||
* Daxil olan məlumatları <abbr title="Çevrilmə: serialization, parsing, marshalling olaraq da bilinir">çevirmək</abbr> üçün aşağıdakı məlumat növlərindən istifadə edilir: |
|
||||
* JSON. |
|
||||
* <abbr title="Yol: Path">Yol</abbr> parametrləri. |
|
||||
* <abbr title="Sorğu: Query">Sorğu</abbr> parametrləri. |
|
||||
* <abbr title="Çərəz: Cookie">Çərəzlər</abbr>. |
|
||||
* <abbr title="Başlıq: Header">Başlıqlaq</abbr>. |
|
||||
* <abbr title="Forma: Form">Formalar</abbr>. |
|
||||
* Fayllar. |
|
||||
* Daxil olan məlumatları <abbr title="Çevrilmə: serialization, parsing, marshalling olaraq da bilinir">çevirmək</abbr> üçün aşağıdakı məlumat növlərindən istifadə edilir (JSON olaraq): |
|
||||
* Python tiplərinin (`str`, `int`, `float`, `bool`, `list`, və s) çevrilməsi. |
|
||||
* `datetime` obyektləri. |
|
||||
* `UUID` obyektləri. |
|
||||
* Verilənlər bazası modelləri. |
|
||||
* və daha çoxu... |
|
||||
* 2 alternativ istifadəçi interfeysi daxil olmaqla avtomatik interaktiv API sənədlərini təmin edir: |
|
||||
* Swagger UI. |
|
||||
* ReDoc. |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
Gəlin əvvəlki nümunəyə qayıdaq və **FastAPI**-nin nələr edəcəyinə nəzər salaq: |
|
||||
|
|
||||
* `GET` və `PUT` sorğuları üçün `item_id`-nin <abbr title="Yol: Path">yolda</abbr> olub-olmadığını yoxlayacaq. |
|
||||
* `item_id`-nin `GET` və `PUT` sorğuları üçün növünün `int` olduğunu yoxlayacaq. |
|
||||
* Əgər `int` deyilsə, səbəbini göstərən bir xəta mesajı göstərəcəkdir. |
|
||||
* <abbr title="Məcburi olmayan: Optional">məcburi olmayan</abbr> `q` parametrinin `GET` (`http://127.0.0.1:8000/items/foo?q=somequery` burdakı kimi) sorğusu içərisində olub olmadığını yoxlayacaq. |
|
||||
* `q` parametrini `= None` ilə yaratdığımız üçün, <abbr title="Məcburi olmayan: Optional">məcburi olmayan</abbr> parametr olacaq. |
|
||||
* Əgər `None` olmasaydı, bu məcburi parametr olardı (`PUT` metodunun gövdəsində olduğu kimi). |
|
||||
* `PUT` sorğusu üçün, `/items/{item_id}` gövdəsini JSON olaraq oxuyacaq: |
|
||||
* `name` adında məcburi bir parametr olub olmadığını və əgər varsa, tipinin `str` olub olmadığını yoxlayacaq. |
|
||||
* `price` adında məcburi bir parametr olub olmadığını və əgər varsa, tipinin `float` olub olmadığını yoxlayacaq. |
|
||||
* `is_offer` adında <abbr title="Məcburi olmayan: Optional">məcburi olmayan</abbr> bir parametr olub olmadığını və əgər varsa, tipinin `float` olub olmadığını yoxlayacaq. |
|
||||
* Bütün bunlar ən dərin JSON obyektlərində belə işləyəcək. |
|
||||
* Məlumatların JSON-a və JSON-un Python obyektinə çevrilməsi avtomatik həyata keçiriləcək. |
|
||||
* Hər şeyi OpenAPI ilə uyğun olacaq şəkildə avtomatik olaraq sənədləşdirəcək və onları aşağıdakı kimi istifadə edə biləcək: |
|
||||
* İnteraktiv sənədləşmə sistemləri. |
|
||||
* Bir çox proqramlaşdırma dilləri üçün avtomatlaşdırılmış <abbr title="Müştəri: Client">müştəri</abbr> kodu yaratma sistemləri. |
|
||||
* 2 interaktiv sənədləşmə veb interfeysini birbaşa təmin edəcək. |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
Yeni başlamışıq, amma siz artıq işin məntiqini başa düşmüsünüz. |
|
||||
|
|
||||
İndi aşağıdakı sətri dəyişdirməyə çalışın: |
|
||||
|
|
||||
```Python |
|
||||
return {"item_name": item.name, "item_id": item_id} |
|
||||
``` |
|
||||
|
|
||||
...bundan: |
|
||||
|
|
||||
```Python |
|
||||
... "item_name": item.name ... |
|
||||
``` |
|
||||
|
|
||||
...buna: |
|
||||
|
|
||||
```Python |
|
||||
... "item_price": item.price ... |
|
||||
``` |
|
||||
|
|
||||
...və redaktorun məlumat tiplərini bildiyini və avtomatik tamaladığını görəcəksiniz: |
|
||||
|
|
||||
 |
|
||||
|
|
||||
Daha çox funksiyaya malik daha dolğun nümunə üçün <a href="https://fastapi.tiangolo.com/az/tutorial/">Öyrədici - İstifadəçi Təlimatı</a> səhifəsinə baxa bilərsiniz. |
|
||||
|
|
||||
**Spoiler xəbərdarlığı**: Öyrədici - istifadəçi təlimatına bunlar daxildir: |
|
||||
|
|
||||
* **Parametrlərin**, <abbr title="Başlıq: Header">**başlıqlar**</abbr>, <abbr title="Çərəz: Cookie">çərəzlər</abbr>, **forma sahələri** və **fayllar** olaraq müəyyən edilməsi. |
|
||||
* `maximum_length` və ya `regex` kimi **doğrulama məhdudiyyətlərinin** necə təyin ediləcəyi. |
|
||||
* Çox güclü və istifadəsi asan **<abbr title="components, resources, providers, services, injectables olaraq da bilinir">Dependency Injection</abbr>** sistemi. |
|
||||
* Təhlükəsizlik və autentifikasiya, **JWT tokenləri** ilə **OAuth2** dəstəyi və **HTTP Basic** autentifikasiyası. |
|
||||
* **çox dərin JSON modellərini** müəyyən etmək üçün daha irəli səviyyə (lakin eyni dərəcədə asan) üsullar (Pydantic sayəsində). |
|
||||
* <a href="https://strawberry.rocks" class="external-link" target="_blank">Strawberry</a> və digər kitabxanalar ilə **GraphQL** inteqrasiyası. |
|
||||
* Digər əlavə xüsusiyyətlər (Starlette sayəsində): |
|
||||
* **WebSockets** |
|
||||
* HTTPX və `pytest` sayəsində çox asan testlər |
|
||||
* **CORS** |
|
||||
* **Cookie Sessions** |
|
||||
* ...və daha çoxu. |
|
||||
|
|
||||
## Performans |
|
||||
|
|
||||
Müstəqil TechEmpower meyarları göstərir ki, Uvicorn üzərində işləyən **FastAPI** proqramları <a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">ən sürətli Python kitabxanalarından biridir</a>, yalnız Starlette və Uvicorn-un özündən yavaşdır, ki FastAPI bunların üzərinə qurulmuş bir framework-dür. (*) |
|
||||
|
|
||||
Ətraflı məlumat üçün bu bölməyə nəzər salın <a href="https://fastapi.tiangolo.com/az/benchmarks/" class="internal-link" target="_blank"><abbr title="Müqayisələr: Benchmarks">Müqayisələr</abbr></a>. |
|
||||
|
|
||||
## Məcburi Olmayan Tələblər |
|
||||
|
|
||||
Pydantic tərəfindən istifadə olunanlar: |
|
||||
|
|
||||
* <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email-validator</code></a> - e-poçtun yoxlanılması üçün. |
|
||||
* <a href="https://docs.pydantic.dev/latest/usage/pydantic_settings/" target="_blank"><code>pydantic-settings</code></a> - parametrlərin idarə edilməsi üçün. |
|
||||
* <a href="https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/" target="_blank"><code>pydantic-extra-types</code></a> - Pydantic ilə istifadə edilə bilən əlavə tiplər üçün. |
|
||||
|
|
||||
Starlette tərəfindən istifadə olunanlar: |
|
||||
|
|
||||
* <a href="https://www.python-httpx.org" target="_blank"><code>httpx</code></a> - Əgər `TestClient` strukturundan istifadə edəcəksinizsə, tələb olunur. |
|
||||
* <a href="https://jinja.palletsprojects.com" target="_blank"><code>jinja2</code></a> - Standart <abbr title="Şablon: Template">şablon</abbr> konfiqurasiyasından istifadə etmək istəyirsinizsə, tələb olunur. |
|
||||
* <a href="https://github.com/Kludex/python-multipart" target="_blank"><code>python-multipart</code></a> - `request.form()` ilə forma <abbr title="HTTP sorğusu ilə alınan string məlumatın Python obyektinə çevrilməsi">"çevirmə"</abbr> dəstəyindən istifadə etmək istəyirsinizsə, tələb olunur. |
|
||||
* <a href="https://pythonhosted.org/itsdangerous/" target="_blank"><code>itsdangerous</code></a> - `SessionMiddleware` dəstəyi üçün tələb olunur. |
|
||||
* <a href="https://pyyaml.org/wiki/PyYAMLDocumentation" target="_blank"><code>pyyaml</code></a> - `SchemaGenerator` dəstəyi üçün tələb olunur (Çox güman ki, FastAPI istifadə edərkən buna ehtiyacınız olmayacaq). |
|
||||
* <a href="https://github.com/esnme/ultrajson" target="_blank"><code>ujson</code></a> - `UJSONResponse` istifadə etmək istəyirsinizsə, tələb olunur. |
|
||||
|
|
||||
Həm FastAPI, həm də Starlette tərəfindən istifadə olunur: |
|
||||
|
|
||||
* <a href="https://www.uvicorn.org" target="_blank"><code>uvicorn</code></a> - Yaratdığımız proqramı servis edəcək veb server kimi fəaliyyət göstərir. |
|
||||
* <a href="https://github.com/ijl/orjson" target="_blank"><code>orjson</code></a> - `ORJSONResponse` istifadə edəcəksinizsə tələb olunur. |
|
||||
|
|
||||
Bütün bunları `pip install fastapi[all]` ilə quraşdıra bilərsiniz. |
|
||||
|
|
||||
## Lisenziya |
|
||||
|
|
||||
Bu layihə MIT lisenziyasının şərtlərinə əsasən lisenziyalaşdırılıb. |
|
||||
@ -1,5 +0,0 @@ |
|||||
# Öyrən |
|
||||
|
|
||||
Burada **FastAPI** öyrənmək üçün giriş bölmələri və dərsliklər yer alır. |
|
||||
|
|
||||
Siz bunu kitab, kurs, FastAPI öyrənmək üçün rəsmi və tövsiyə olunan üsul hesab edə bilərsiniz. 😎 |
|
||||
@ -1 +0,0 @@ |
|||||
INHERIT: ../en/mkdocs.yml |
|
||||
@ -1,3 +0,0 @@ |
|||||
# সম্পর্কে |
|
||||
|
|
||||
**FastAPI** সম্পর্কে বিস্তারিত — এর ডিজাইন, অনুপ্রেরণা ও আরও অনেক কিছু। 🤓 |
|
||||
@ -1,298 +0,0 @@ |
|||||
# এনভায়রনমেন্ট ভেরিয়েবলস |
|
||||
|
|
||||
/// tip |
|
||||
|
|
||||
আপনি যদি "এনভায়রনমেন্ট ভেরিয়েবলস" কী এবং সেগুলো কীভাবে ব্যবহার করতে হয় সেটা জানেন, তাহলে এই অংশটি স্কিপ করে যেতে পারেন। |
|
||||
|
|
||||
/// |
|
||||
|
|
||||
এনভায়রনমেন্ট ভেরিয়েবল (সংক্ষেপে "**env var**" নামেও পরিচিত) হলো এমন একটি ভেরিয়েবল যা পাইথন কোডের **বাইরে**, **অপারেটিং সিস্টেমে** থাকে এবং আপনার পাইথন কোড (বা অন্যান্য প্রোগ্রাম) দ্বারা যাকে রিড করা যায়। |
|
||||
|
|
||||
এনভায়রনমেন্ট ভেরিয়েবলস অ্যাপ্লিকেশনের **সেটিংস** পরিচালনা করতে, পাইথনের **ইনস্টলেশন** প্রক্রিয়ার অংশ হিসেবে, ইত্যাদি কাজে উপযোগী হতে পারে। |
|
||||
|
|
||||
## Env Vars তৈরী এবং ব্যবহার |
|
||||
|
|
||||
আপনি **শেল (টার্মিনাল)**-এ, পাইথনের প্রয়োজন ছাড়াই, এনভায়রনমেন্ট ভেরিয়েবলস **তৈরি** এবং ব্যবহার করতে পারবেনঃ |
|
||||
|
|
||||
//// tab | লিনাক্স, ম্যাকওএস, উইন্ডোজ Bash |
|
||||
|
|
||||
<div class="termy"> |
|
||||
|
|
||||
```console |
|
||||
// আপনি চাইলে MY_NAME নামে একটি env var তৈরি করতে পারেন |
|
||||
$ export MY_NAME="Wade Wilson" |
|
||||
|
|
||||
// তারপরে এটিকে চাইলে অন্যান্য প্রোগ্রামে ব্যবহার করতে পারেন |
|
||||
$ echo "Hello $MY_NAME" |
|
||||
|
|
||||
Hello Wade Wilson |
|
||||
``` |
|
||||
|
|
||||
</div> |
|
||||
|
|
||||
//// |
|
||||
|
|
||||
//// tab | উইন্ডোজ পাওয়ারশেল |
|
||||
|
|
||||
<div class="termy"> |
|
||||
|
|
||||
```console |
|
||||
// MY_NAME নামে env var তৈরি |
|
||||
$ $Env:MY_NAME = "Wade Wilson" |
|
||||
|
|
||||
// অন্যান্য প্রোগ্রামে এটিকে ব্যবহার |
|
||||
$ echo "Hello $Env:MY_NAME" |
|
||||
|
|
||||
Hello Wade Wilson |
|
||||
``` |
|
||||
|
|
||||
</div> |
|
||||
|
|
||||
//// |
|
||||
|
|
||||
## পাইথনে env vars রিড করা |
|
||||
|
|
||||
আপনি চাইলে পাইথনের **বাইরে**, টার্মিনালে (বা অন্য কোনো উপায়ে) এনভায়রনমেন্ট ভেরিয়েবলস তৈরি করতে পারেন, এবং পরে সেগুলো **পাইথনে রিড** (অ্যাক্সেস করতে) পারেন। |
|
||||
|
|
||||
উদাহরণস্বরূপ, আপনার `main.py` নামে একটি ফাইল থাকতে পারেঃ |
|
||||
|
|
||||
```Python hl_lines="3" |
|
||||
import os |
|
||||
|
|
||||
name = os.getenv("MY_NAME", "World") |
|
||||
print(f"Hello {name} from Python") |
|
||||
``` |
|
||||
|
|
||||
/// tip |
|
||||
|
|
||||
<a href="https://docs.python.org/3.8/library/os.html#os.getenv" class="external-link" target="_blank">`os.getenv()`</a> এর দ্বিতীয় আর্গুমেন্টটি হলো এর ডিফল্ট ভ্যালু যা রিটার্ন করা হবে। |
|
||||
|
|
||||
যদি এটি দেওয়া না হয়, ডিফল্টভাবে `None` ব্যবহৃত হবে, এখানে আমরা ডিফল্ট ভ্যালু হিসেবে `"World"` ব্যবহার করেছি। |
|
||||
|
|
||||
/// |
|
||||
|
|
||||
তারপরে পাইথন প্রোগ্রামটিকে নিম্নোক্তভাবে কল করা যাবেঃ |
|
||||
|
|
||||
//// tab | লিনাক্স, ম্যাকওএস, উইন্ডোজ Bash |
|
||||
|
|
||||
<div class="termy"> |
|
||||
|
|
||||
```console |
|
||||
// এখনো আমরা এনভায়রনমেন্ট ভেরিয়েবল সেট করিনি |
|
||||
$ python main.py |
|
||||
|
|
||||
// যেহেতু env var সেট করা হয়নি, তাই আমরা ডিফল্ট ভ্যালু পাচ্ছি |
|
||||
|
|
||||
Hello World from Python |
|
||||
|
|
||||
// কিন্তু আমরা প্রথমে যদি একটা এনভায়রনমেন্ট ভারিয়েবল তৈরি করে নেই |
|
||||
$ export MY_NAME="Wade Wilson" |
|
||||
|
|
||||
// এবং তারপর আবার প্রোগ্রাটিকে কল করি |
|
||||
$ python main.py |
|
||||
|
|
||||
// এখন এটি এনভায়রনমেন্ট ভেরিয়েবল রিড করতে পারবে |
|
||||
|
|
||||
Hello Wade Wilson from Python |
|
||||
``` |
|
||||
|
|
||||
</div> |
|
||||
|
|
||||
//// |
|
||||
|
|
||||
//// tab | উইন্ডোজ পাওয়ারশেল |
|
||||
|
|
||||
<div class="termy"> |
|
||||
|
|
||||
```console |
|
||||
// এখনো আমরা এনভায়রনমেন্ট ভেরিয়েবল সেট করিনি |
|
||||
$ python main.py |
|
||||
|
|
||||
// যেহেতু env var সেট করা হয়নি, তাই আমরা ডিফল্ট ভ্যালু পাচ্ছি |
|
||||
|
|
||||
Hello World from Python |
|
||||
|
|
||||
// কিন্তু আমরা প্রথমে যদি একটা এনভায়রনমেন্ট ভারিয়েবল তৈরি করে নেই |
|
||||
$ $Env:MY_NAME = "Wade Wilson" |
|
||||
|
|
||||
// এবং তারপর আবার প্রোগ্রাটিকে কল করি |
|
||||
$ python main.py |
|
||||
|
|
||||
// এখন এটি এনভায়রনমেন্ট ভেরিয়েবল রিড করতে পারবে |
|
||||
|
|
||||
Hello Wade Wilson from Python |
|
||||
``` |
|
||||
|
|
||||
</div> |
|
||||
|
|
||||
//// |
|
||||
|
|
||||
যেহেতু এনভায়রনমেন্ট ভেরিয়েবলস কোডের বাইরে সেট করা যায়, কিন্তু পরবর্তীতে কোড দ্বারা রিড করা যায়, এবং বাকি ফাইলগুলোর সাথে রাখতে (`git` এ কমিট) হয় না, তাই কনফিগারেশনস বা **সেটিংস** এর জন্য এগুলো সাধারণত ব্যবহৃত হয়ে থাকে। |
|
||||
|
|
||||
আপনি একটি এনভায়রনমেন্ট ভেরিয়েবল শুধুমাত্র একটি **নির্দিষ্ট প্রোগ্রাম ইনভোকেশনের** জন্যও তৈরি করতে পারেন, যা শুধুমাত্র সেই প্রোগ্রামের জন্যই এভেইলেবল থাকবে এবং শুধুমাত্র তার চলাকালীন সময় পর্যন্তই সক্রিয় থাকবে। |
|
||||
|
|
||||
এটি করতে, প্রোগ্রামটি রান করার ঠিক আগেই, একই লাইনে এনভায়রনমেন্ট ভেরিয়েবল তৈরি করুন: |
|
||||
|
|
||||
<div class="termy"> |
|
||||
|
|
||||
```console |
|
||||
// প্রোগ্রামটি কল করার সময় একই লাইনে MY_NAME এনভায়রনমেন্ট ভেরিয়েবল তৈরি করুন |
|
||||
$ MY_NAME="Wade Wilson" python main.py |
|
||||
|
|
||||
// এখন এটি এনভায়রনমেন্ট ভ্যরিয়েবলটিকে রিড করতে পারবে |
|
||||
|
|
||||
Hello Wade Wilson from Python |
|
||||
|
|
||||
// পরবর্তীতে এনভায়রনমেন্ট ভেরিয়েবলটিকে আর ব্যবহার করা যাচ্ছে না |
|
||||
$ python main.py |
|
||||
|
|
||||
Hello World from Python |
|
||||
``` |
|
||||
|
|
||||
</div> |
|
||||
|
|
||||
/// tip |
|
||||
|
|
||||
এটি নিয়ে আরো বিস্তারিত পড়তে পারেন এখানে <a href="https://12factor.net/config" class="external-link" target="_blank">The Twelve-Factor App: Config</a>। |
|
||||
|
|
||||
/// |
|
||||
|
|
||||
## টাইপস এবং ভ্যালিডেশন |
|
||||
|
|
||||
এই এনভায়রনমেন্ট ভেরিয়েবলগুলো শুধুমাত্র **টেক্সট স্ট্রিংস** হ্যান্ডেল করতে পারে, যেহেতু এগুলো পাইথনের বাইরে অবস্থিত এবং অন্যান্য প্রোগ্রাম এবং সিস্টেমের বাকি অংশের (এমনকি বিভিন্ন অপারেটিং সিস্টেম যেমন লিনাক্স, উইন্ডোজ, ম্যাকওএস) সাথে সামঞ্জস্যপূর্ণ হতে হয়। |
|
||||
|
|
||||
এর অর্থ হচ্ছে পাইথনে এনভায়রনমেন্ট ভেরিয়েবল থেকে রিড করা **যেকোনো ভ্যালু** একটি `str` হবে, এবং অন্য কোনো টাইপে কনভার্সন বা যেকোনো ভেলিডেশন কোডে আলাদাভাবে করতে হবে। |
|
||||
|
|
||||
এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে **এপ্লিকেশন সেটিংস** হ্যান্ডেল করা নিয়ে আরো বিস্তারিত জানা যাবে [Advanced User Guide - Settings and Environment Variables](./advanced/settings.md){.internal-link target=_blank}. |
|
||||
|
|
||||
## `PATH` এনভায়রনমেন্ট ভেরিয়েবল |
|
||||
|
|
||||
**`PATH`** নামে একটি **বিশেষ** এনভায়রনমেন্ট ভেরিয়েবল রয়েছে, যেটি প্রোগ্রাম রান করার জন্য অপারেটিং সিস্টেমস (লিনাক্স, ম্যাকওএস, উইন্ডোজ) দ্বারা ব্যবহৃত হয়। |
|
||||
|
|
||||
`PATH` ভেরিয়েবল এর ভ্যালু হচ্ছে একটি বিশাল স্ট্রিং যা ডিরেক্টরিকে কোলন `:` দিয়ে আলাদা করার মাধ্যমে লিনাক্সে ও ম্যাকওএস এ, এবং সেমিকোলন `;` এর মাধ্যমে উইন্ডোজ এ তৈরি করা থাকে। |
|
||||
|
|
||||
উদাহরণস্বরূপ, `PATH` ভেরিয়েবল নিচের মতো দেখতে হতে পারেঃ |
|
||||
|
|
||||
//// tab | লিনাক্স, ম্যাকওএস |
|
||||
|
|
||||
```plaintext |
|
||||
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin |
|
||||
``` |
|
||||
|
|
||||
তারমানে হলো সিস্টেম প্রোগ্রামগুলোকে নিচের ডিরেক্টরিগুলোতে খুঁজবেঃ |
|
||||
|
|
||||
* `/usr/local/bin` |
|
||||
* `/usr/bin` |
|
||||
* `/bin` |
|
||||
* `/usr/sbin` |
|
||||
* `/sbin` |
|
||||
|
|
||||
//// |
|
||||
|
|
||||
//// tab | উইন্ডোজ |
|
||||
|
|
||||
```plaintext |
|
||||
C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32 |
|
||||
``` |
|
||||
|
|
||||
তারমানে হলো সিস্টেম প্রোগ্রামগুলোকে নিচের ডিরেক্টরিগুলোতে খুঁজবেঃ |
|
||||
|
|
||||
* `C:\Program Files\Python312\Scripts` |
|
||||
* `C:\Program Files\Python312` |
|
||||
* `C:\Windows\System32` |
|
||||
|
|
||||
//// |
|
||||
|
|
||||
যখন আপনি টার্মিনালে কোনো **কমান্ড** লিখবেন, অপারেটিং সিস্টেম **প্রত্যেকটি ডিরেক্টরিতে** প্রোগ্রামটি **খুঁজবে** যেগুলো `PATH` এনভায়রনমেন্ট ভেরিয়েবল এ লিস্ট করা আছে। |
|
||||
|
|
||||
উদাহরণস্বরূপ, যখন আপনি টার্মিনালে `python` টাইপ করবেন, অপারেটিং সিস্টেম এই লিস্ট এর **প্রথম ডিরেক্টরিতে** `python` নামের একটি প্রোগ্রাম খুঁজবে। |
|
||||
|
|
||||
যদি এটি খুঁজে পায়, তাহলে এটি প্রোগ্রামটিকে ব্যবহার করবে। অন্যথায় এটি **অন্যান্য ডিরেক্টরিগুলোতে** এটিকে খুঁজতে থাকবে। |
|
||||
|
|
||||
### পাইথন ইনস্টল এবং `PATH` আপডেট |
|
||||
|
|
||||
যখন আপনি পাইথন ইনস্টল করেন, আপনি `PATH` এনভায়রনমেন্ট ভেরিয়েবল আপডেট করতে চান কিনা সেটা জিজ্ঞেস করা হতে পারে। |
|
||||
|
|
||||
//// tab | লিনাক্স, ম্যাকওএস |
|
||||
|
|
||||
ধরা যাক আপনি পাইথন ইনস্টল করলেন এবং এটি `/opt/custompython/bin` ডিরেক্টরিতে ইনস্টল হচ্ছে। |
|
||||
|
|
||||
যদি আপনি "Yes" সিলেক্ট করে `PATH` এনভায়রনমেন্ট ভেরিয়েবল আপডেট করতে চান, তাহলে ইনস্টলার `/opt/custompython/bin` কে `PATH` এনভায়রনমেন্ট ভেরিয়েবল এ এড করে দিবে। |
|
||||
|
|
||||
এটা দেখতে এমনটা হতে পারেঃ |
|
||||
|
|
||||
```plaintext |
|
||||
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/custompython/bin |
|
||||
``` |
|
||||
|
|
||||
এইভাবে, আপনি যখন টার্মিনালে `python` টাইপ করেন, সিস্টেম পাইথন প্রোগ্রামটিকে `/opt/custompython/bin` (সর্বশেষ ডিরেক্টরি) তে খুঁজে পাবে এবং এটাকে ব্যবহার করবে। |
|
||||
|
|
||||
//// |
|
||||
|
|
||||
//// tab | উইন্ডোজ |
|
||||
|
|
||||
ধরা যাক আপনি পাইথন ইনস্টল করলেন এবং এটি `C:\opt\custompython\bin` ডিরেক্টরিতে ইনস্টল হচ্ছে। |
|
||||
|
|
||||
যদি আপনি "Yes" সিলেক্ট করে `PATH` এনভায়রনমেন্ট ভেরিয়েবল আপডেট করতে চান, তাহলে ইনস্টলার `C:\opt\custompython\bin` কে `PATH` এনভায়রনমেন্ট ভেরিয়েবল এ এড করে দিবে। |
|
||||
|
|
||||
```plaintext |
|
||||
C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32;C:\opt\custompython\bin |
|
||||
``` |
|
||||
|
|
||||
এইভাবে, আপনি যখন টার্মিনালে `python` টাইপ করেন, সিস্টেম পাইথন প্রোগ্রামটিকে `C:\opt\custompython\bin` (সর্বশেষ ডিরেক্টরি) তে খুঁজে পাবে এবং এটাকে ব্যবহার করবে। |
|
||||
|
|
||||
//// |
|
||||
|
|
||||
তাই, আপনি যদি টাইপ করেনঃ |
|
||||
|
|
||||
<div class="termy"> |
|
||||
|
|
||||
```console |
|
||||
$ python |
|
||||
``` |
|
||||
|
|
||||
</div> |
|
||||
|
|
||||
//// tab | লিনাক্স, ম্যাকওএস |
|
||||
|
|
||||
সিস্টেম `python` প্রোগ্রামকে `/opt/custompython/bin` এ **খুঁজে পাবে** এবং এটাকে রান করবে। |
|
||||
|
|
||||
এটা মোটামুটিভাবে নিচের মতো করে লেখার সমান হবেঃ |
|
||||
|
|
||||
<div class="termy"> |
|
||||
|
|
||||
```console |
|
||||
$ /opt/custompython/bin/python |
|
||||
``` |
|
||||
|
|
||||
</div> |
|
||||
|
|
||||
//// |
|
||||
|
|
||||
//// tab | উইন্ডোজ |
|
||||
|
|
||||
সিস্টেম `python` প্রোগ্রামকে `C:\opt\custompython\bin\python` এ **খুঁজে পাবে** এবং এটাকে রান করবে। |
|
||||
|
|
||||
এটা মোটামুটিভাবে নিচের মতো করে লেখার সমান হবেঃ |
|
||||
|
|
||||
<div class="termy"> |
|
||||
|
|
||||
```console |
|
||||
$ C:\opt\custompython\bin\python |
|
||||
``` |
|
||||
|
|
||||
</div> |
|
||||
|
|
||||
//// |
|
||||
|
|
||||
এই তথ্যগুলো [ভার্চুয়াল এনভায়রনমেন্টস](virtual-environments.md){.internal-link target=_blank} শেখার ক্ষেত্রে সহায়ক হবে। |
|
||||
|
|
||||
## উপসংহার |
|
||||
|
|
||||
এর মাধ্যমে আপনি **এনভায়রনমেন্ট ভেরিয়েবলস** কি এবং এটিকে পাইথনে কিভাবে ব্যবহার করতে হয় তার সম্পর্কে বেসিক ধারনা পেলেন। |
|
||||
|
|
||||
চাইলে এই সম্পর্কে আরো বিস্তারিত পড়তে পারেন <a href="https://en.wikipedia.org/wiki/Environment_variable" class="external-link" target="_blank">Wikipedia for Environment Variable</a> এ। |
|
||||
|
|
||||
অনেক ক্ষেত্রে, দেখা মাত্রই এনভায়রনমেন্ট ভেরিয়েবল কীভাবে প্রয়োজন হবে তা স্পষ্ট হয় না। কিন্তু ডেভেলপমেন্টের সময় আপনি নানা রকম পরিস্থিতিতে এগুলোর সম্মুখীন হবেন, তাই এগুলো সম্পর্কে জেনে রাখা ভালো। |
|
||||
|
|
||||
উদাহরণস্বরূপ, আপনার এই ইনফরমেশনটি পরবর্তী, [ভার্চুয়াল এনভায়রনমেন্টস](virtual-environments.md) অংশে দরকার হবে। |
|
||||
@ -1,466 +0,0 @@ |
|||||
<p align="center"> |
|
||||
<a href="https://fastapi.tiangolo.com"><img src="https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png" alt="FastAPI"></a> |
|
||||
</p> |
|
||||
<p align="center"> |
|
||||
<em>FastAPI উচ্চক্ষমতা সম্পন্ন, সহজে শেখার এবং দ্রুত কোড করে প্রোডাকশনের জন্য ফ্রামওয়ার্ক।</em> |
|
||||
</p> |
|
||||
<p align="center"> |
|
||||
<a href="https://github.com/fastapi/fastapi/actions?query=workflow%3ATest+event%3Apush+branch%3Amaster" target="_blank"> |
|
||||
<img src="https://github.com/fastapi/fastapi/actions/workflows/test.yml/badge.svg?event=push&branch=master" alt="Test"> |
|
||||
</a> |
|
||||
<a href="https://coverage-badge.samuelcolvin.workers.dev/redirect/fastapi/fastapi" target="_blank"> |
|
||||
<img src="https://coverage-badge.samuelcolvin.workers.dev/fastapi/fastapi.svg" alt="Coverage"> |
|
||||
</a> |
|
||||
<a href="https://pypi.org/project/fastapi" target="_blank"> |
|
||||
<img src="https://img.shields.io/pypi/v/fastapi?color=%2334D058&label=pypi%20package" alt="Package version"> |
|
||||
</a> |
|
||||
<a href="https://pypi.org/project/fastapi" target="_blank"> |
|
||||
<img src="https://img.shields.io/pypi/pyversions/fastapi.svg?color=%2334D058" alt="Supported Python versions"> |
|
||||
</a> |
|
||||
</p> |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
**নির্দেশিকা নথি**: <a href="https://fastapi.tiangolo.com" target="_blank">https://fastapi.tiangolo.com</a> |
|
||||
|
|
||||
**সোর্স কোড**: <a href="https://github.com/fastapi/fastapi" target="_blank">https://github.com/fastapi/fastapi</a> |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
FastAPI একটি আধুনিক, দ্রুত ( বেশি ক্ষমতা ) সম্পন্ন, Python 3.6+ দিয়ে API তৈরির জন্য স্ট্যান্ডার্ড পাইথন টাইপ ইঙ্গিত ভিত্তিক ওয়েব ফ্রেমওয়ার্ক। |
|
||||
|
|
||||
এর মূল বৈশিষ্ট্য গুলো হলঃ |
|
||||
|
|
||||
- **গতি**: এটি **NodeJS** এবং **Go** এর মত কার্যক্ষমতা সম্পন্ন (Starlette এবং Pydantic এর সাহায্যে)। [পাইথন এর দ্রুততম ফ্রেমওয়ার্ক গুলোর মধ্যে এটি একটি](#_11)। |
|
||||
- **দ্রুত কোড করা**:বৈশিষ্ট্য তৈরির গতি ২০০% থেকে ৩০০% বৃদ্ধি করে৷ \* |
|
||||
- **স্বল্প bugs**: মানুব (ডেভেলপার) সৃষ্ট ত্রুটির প্রায় ৪০% হ্রাস করে। \* |
|
||||
- **স্বজ্ঞাত**: দুর্দান্ত এডিটর সাহায্য <abbr title="also known as auto-complete, autocompletion, IntelliSense">Completion</abbr> নামেও পরিচিত। দ্রুত ডিবাগ করা যায়। |
|
||||
|
|
||||
- **সহজ**: এটি এমন ভাবে সজানো হয়েছে যেন নির্দেশিকা নথি পড়ে সহজে শেখা এবং ব্যবহার করা যায়। |
|
||||
- **সংক্ষিপ্ত**: কোড পুনরাবৃত্তি কমানোর পাশাপাশি, bug কমায় এবং প্রতিটি প্যারামিটার ঘোষণা থেকে একাধিক ফিচার পাওয়া যায় । |
|
||||
- **জোরালো**: স্বয়ংক্রিয় ভাবে তৈরি ক্রিয়াশীল নির্দেশনা নথি (documentation) সহ উৎপাদন উপযোগি (Production-ready) কোড পাওয়া যায়। |
|
||||
- **মান-ভিত্তিক**: এর ভিত্তি <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a> (যা পুর্বে Swagger নামে পরিচিত ছিল) এবং <a href="https://json-schema.org/" class="external-link" target="_blank">JSON Schema</a> এর আদর্শের মানের ওপর |
|
||||
|
|
||||
<small>\* উৎপাদনমুখি এপ্লিকেশন বানানোর এক দল ডেভেলপার এর মতামত ভিত্তিক ফলাফল।</small> |
|
||||
|
|
||||
## স্পনসর গণ |
|
||||
|
|
||||
<!-- sponsors --> |
|
||||
|
|
||||
{% if sponsors %} |
|
||||
{% for sponsor in sponsors.gold -%} |
|
||||
<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}" style="border-radius:15px"></a> |
|
||||
{% endfor -%} |
|
||||
{%- 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 %} |
|
||||
|
|
||||
<!-- /sponsors --> |
|
||||
|
|
||||
<a href="https://fastapi.tiangolo.com/fastapi-people/#sponsors" class="external-link" target="_blank">অন্যান্য স্পনসর গণ</a> |
|
||||
|
|
||||
## মতামত সমূহ |
|
||||
|
|
||||
"_আমি আজকাল **FastAPI** ব্যবহার করছি। [...] আমরা ভাবছি মাইক্রোসফ্টে **ML সার্ভিস** এ সকল দলের জন্য এটি ব্যবহার করব। যার মধ্যে কিছু পণ্য **Windows** এ সংযোযন হয় এবং কিছু **Office** এর সাথে সংযোযন হচ্ছে।_" |
|
||||
|
|
||||
<div style="text-align: right; margin-right: 10%;">কবির খান - <strong>মাইক্রোসফ্টে</strong> <a href="https://github.com/fastapi/fastapi/pull/26" target="_blank"><small>(ref)</small></a></div> |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
"_আমরা **FastAPI** লাইব্রেরি গ্রহণ করেছি একটি **REST** সার্ভার তৈরি করতে, যা **ভবিষ্যদ্বাণী** পাওয়ার জন্য কুয়েরি করা যেতে পারে। [লুডউইগের জন্য]_" |
|
||||
|
|
||||
<div style="text-align: right; margin-right: 10%;">পিয়েরো মোলিনো, ইয়ারোস্লাভ দুদিন, এবং সাই সুমন্থ মিরিয়ালা - <strong>উবার</strong> <a href="https://eng.uber.com/ludwig-v0-2/" target="_blank"><small>(ref)</small></a></div> |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
"_**Netflix** আমাদের **ক্রাইসিস ম্যানেজমেন্ট** অর্কেস্ট্রেশন ফ্রেমওয়ার্ক: **ডিসপ্যাচ** এর ওপেন সোর্স রিলিজ ঘোষণা করতে পেরে আনন্দিত! [যাকিনা **FastAPI** দিয়ে নির্মিত]_" |
|
||||
|
|
||||
<div style="text-align: right; margin-right: 10%;">কেভিন গ্লিসন, মার্ক ভিলানোভা, ফরেস্ট মনসেন - <strong>নেটফ্লিক্স</strong> <a href="https://netflixtechblog.com/introducing-dispatch-da4b8a2a8072" target="_blank"><small>(ref)</small></a></div> |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
"_আমি **FastAPI** নিয়ে চাঁদের সমান উৎসাহিত। এটি খুবই মজার!_" |
|
||||
|
|
||||
<div style="text-align: right; margin-right: 10%;">ব্রায়ান ওকেন - <strong><a href="https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855" target="_blank">পাইথন বাইটস</a> পডকাস্ট হোস্ট</strong> <a href="https://x.com/brianokken/status/1112220079972728832" target="_blank"><small>(ref)</small></a></div> |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
"\_সত্যিই, আপনি যা তৈরি করেছেন তা খুব মজবুত এবং পরিপূর্ন৷ অনেক উপায়ে, আমি যা **Hug** এ করতে চেয়েছিলাম - তা কাউকে তৈরি করতে দেখে আমি সত্যিই অনুপ্রানিত৷\_" |
|
||||
|
|
||||
<div style="text-align: right; margin-right: 10%;">টিমোথি ক্রসলে - <strong><a href="https://github.com/hugapi/hug" target="_blank">Hug</a> স্রষ্টা</strong> <a href="https://news.ycombinator.com/item?id=19455465" target="_blank"><small>(ref)</small></a></div> |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
"আপনি যদি REST API তৈরির জন্য একটি **আধুনিক ফ্রেমওয়ার্ক** শিখতে চান, তাহলে **FastAPI** দেখুন [...] এটি দ্রুত, ব্যবহার করা সহজ এবং শিখতেও সহজ [...]\_" |
|
||||
|
|
||||
"_আমরা আমাদের **APIs** [...] এর জন্য **FastAPI**- তে এসেছি [...] আমি মনে করি আপনিও এটি পছন্দ করবেন [...]_" |
|
||||
|
|
||||
<div style="text-align: right; margin-right: 10%;">ইনেস মন্টানি - ম্যাথিউ হোনিবাল - <strong><a href="https://explosion.ai" target="_blank">Explosion AI</a> প্রতিষ্ঠাতা - <a href="https://spacy.io" target="_blank">spaCy</a> স্রষ্টা</strong> <a href="https://x.com/_inesmontani/status/1144173225322143744" target="_blank"><small>(ref)</small></a> - <a href="https://x.com/honnibal/status/1144031421859655680" target="_blank"><small>(ref)</small></a></div> |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
## **Typer**, CLI এর জন্য FastAPI |
|
||||
|
|
||||
<a href="https://typer.tiangolo.com" target="_blank"><img src="https://typer.tiangolo.com/img/logo-margin/logo-margin-vector.svg" style="width: 20%;"></a> |
|
||||
|
|
||||
আপনি যদি <abbr title="Command Line Interface">CLI</abbr> অ্যাপ বানাতে চান, যা কিনা ওয়েব API এর পরিবর্তে টার্মিনালে ব্যবহার হবে, তাহলে দেখুন<a href="https://typer.tiangolo.com/" class="external-link" target="_blank">**Typer**</a>. |
|
||||
|
|
||||
**টাইপার** হল FastAPI এর ছোট ভাইয়ের মত। এবং এটির উদ্দেশ্য ছিল **CLIs এর FastAPI** হওয়া। ⌨️ 🚀 |
|
||||
|
|
||||
## প্রয়োজনীয়তা গুলো |
|
||||
|
|
||||
Python 3.7+ |
|
||||
|
|
||||
FastAPI কিছু দানবেদের কাঁধে দাঁড়িয়ে আছে: |
|
||||
|
|
||||
- <a href="https://www.starlette.io/" class="external-link" target="_blank">Starlette</a> ওয়েব অংশের জন্য. |
|
||||
- <a href="https://docs.pydantic.dev/" class="external-link" target="_blank">Pydantic</a> ডেটা অংশগুলির জন্য. |
|
||||
|
|
||||
## ইনস্টলেশন প্রক্রিয়া |
|
||||
|
|
||||
<div class="termy"> |
|
||||
|
|
||||
```console |
|
||||
$ pip install fastapi |
|
||||
|
|
||||
---> 100% |
|
||||
``` |
|
||||
|
|
||||
</div> |
|
||||
|
|
||||
আপনার একটি ASGI সার্ভারেরও প্রয়োজন হবে, প্রোডাকশনের জন্য <a href="https://www.uvicorn.org" class="external-link" target="_blank">Uvicorn</a> অথবা <a href="https://github.com/pgjones/hypercorn" class="external-link" target="_blank">Hypercorn</a>. |
|
||||
|
|
||||
<div class="termy"> |
|
||||
|
|
||||
```console |
|
||||
$ pip install "uvicorn[standard]" |
|
||||
|
|
||||
---> 100% |
|
||||
``` |
|
||||
|
|
||||
</div> |
|
||||
|
|
||||
## উদাহরণ |
|
||||
|
|
||||
### তৈরি |
|
||||
|
|
||||
- `main.py` নামে একটি ফাইল তৈরি করুন: |
|
||||
|
|
||||
```Python |
|
||||
from typing import Union |
|
||||
|
|
||||
from fastapi import FastAPI |
|
||||
|
|
||||
app = FastAPI() |
|
||||
|
|
||||
|
|
||||
@app.get("/") |
|
||||
def read_root(): |
|
||||
return {"Hello": "World"} |
|
||||
|
|
||||
|
|
||||
@app.get("/items/{item_id}") |
|
||||
def read_item(item_id: int, q: Union[str, None] = None): |
|
||||
return {"item_id": item_id, "q": q} |
|
||||
``` |
|
||||
|
|
||||
<details markdown="1"> |
|
||||
<summary>অথবা ব্যবহার করুন <code>async def</code>...</summary> |
|
||||
|
|
||||
যদি আপনার কোড `async` / `await`, ব্যবহার করে তাহলে `async def` ব্যবহার করুন: |
|
||||
|
|
||||
```Python hl_lines="9 14" |
|
||||
from typing import Union |
|
||||
|
|
||||
from fastapi import FastAPI |
|
||||
|
|
||||
app = FastAPI() |
|
||||
|
|
||||
|
|
||||
@app.get("/") |
|
||||
async def read_root(): |
|
||||
return {"Hello": "World"} |
|
||||
|
|
||||
|
|
||||
@app.get("/items/{item_id}") |
|
||||
async def read_item(item_id: int, q: Union[str, None] = None): |
|
||||
return {"item_id": item_id, "q": q} |
|
||||
``` |
|
||||
|
|
||||
**টীকা**: |
|
||||
|
|
||||
আপনি যদি না জানেন, _"তাড়াহুড়ো?"_ বিভাগটি দেখুন <a href="https://fastapi.tiangolo.com/async/#in-a-hurry" target="_blank">`async` এবং `await` নথির মধ্যে দেখুন </a>. |
|
||||
|
|
||||
</details> |
|
||||
|
|
||||
### এটি চালান |
|
||||
|
|
||||
সার্ভার চালু করুন: |
|
||||
|
|
||||
<div class="termy"> |
|
||||
|
|
||||
```console |
|
||||
$ uvicorn main:app --reload |
|
||||
|
|
||||
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) |
|
||||
INFO: Started reloader process [28720] |
|
||||
INFO: Started server process [28722] |
|
||||
INFO: Waiting for application startup. |
|
||||
INFO: Application startup complete. |
|
||||
``` |
|
||||
|
|
||||
</div> |
|
||||
|
|
||||
<details markdown="1"> |
|
||||
<summary>নির্দেশনা সম্পর্কে <code>uvicorn main:app --reload</code>...</summary> |
|
||||
|
|
||||
`uvicorn main:app` নির্দেশনাটি দ্বারা বোঝায়: |
|
||||
|
|
||||
- `main`: ফাইল `main.py` (পাইথন "মডিউল")। |
|
||||
- `app`: `app = FastAPI()` লাইন দিয়ে `main.py` এর ভিতরে তৈরি করা অবজেক্ট। |
|
||||
- `--reload`: কোড পরিবর্তনের পরে সার্ভার পুনরায় চালু করুন। এটি শুধুমাত্র ডেভেলপমেন্ট এর সময় ব্যবহার করুন। |
|
||||
|
|
||||
</details> |
|
||||
|
|
||||
### এটা চেক করুন |
|
||||
|
|
||||
আপনার ব্রাউজার খুলুন <a href="http://127.0.0.1:8000/items/5?q=somequery" class="external-link" target="_blank">http://127.0.0.1:8000/items/5?q=somequery</a> এ। |
|
||||
|
|
||||
আপনি JSON রেসপন্স দেখতে পাবেন: |
|
||||
|
|
||||
```JSON |
|
||||
{"item_id": 5, "q": "somequery"} |
|
||||
``` |
|
||||
|
|
||||
আপনি ইতিমধ্যে একটি API তৈরি করেছেন যা: |
|
||||
|
|
||||
- `/` এবং `/items/{item_id}` _paths_ এ HTTP অনুরোধ গ্রহণ করে। |
|
||||
- উভয় *path*ই `GET` <em>অপারেশন</em> নেয় ( যা HTTP _methods_ নামেও পরিচিত)। |
|
||||
- _path_ `/items/{item_id}`-এ একটি _path প্যারামিটার_ `item_id` আছে যা কিনা `int` হতে হবে। |
|
||||
- _path_ `/items/{item_id}`-এর একটি ঐচ্ছিক `str` _query প্যারামিটার_ `q` আছে। |
|
||||
|
|
||||
### ক্রিয়াশীল API নির্দেশিকা নথি |
|
||||
|
|
||||
এখন যান <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a>. |
|
||||
|
|
||||
আপনি স্বয়ংক্রিয় ভাবে প্রস্তুত ক্রিয়াশীল API নির্দেশিকা নথি দেখতে পাবেন (<a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a> প্রদত্ত): |
|
||||
|
|
||||
 |
|
||||
|
|
||||
### বিকল্প API নির্দেশিকা নথি |
|
||||
|
|
||||
এবং এখন <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a> এ যান. |
|
||||
|
|
||||
আপনি স্বয়ংক্রিয় ভাবে প্রস্তুত বিকল্প নির্দেশিকা নথি দেখতে পাবেন (<a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a> প্রদত্ত): |
|
||||
|
|
||||
 |
|
||||
|
|
||||
## উদাহরণস্বরূপ আপগ্রেড |
|
||||
|
|
||||
এখন `main.py` ফাইলটি পরিবর্তন করুন যেন এটি `PUT` রিকুয়েস্ট থেকে বডি পেতে পারে। |
|
||||
|
|
||||
Python স্ট্যান্ডার্ড লাইব্রেরি, Pydantic এর সাহায্যে বডি ঘোষণা করুন। |
|
||||
|
|
||||
```Python hl_lines="4 9-12 25-27" |
|
||||
from typing import Union |
|
||||
|
|
||||
from fastapi import FastAPI |
|
||||
from pydantic import BaseModel |
|
||||
|
|
||||
app = FastAPI() |
|
||||
|
|
||||
|
|
||||
class Item(BaseModel): |
|
||||
name: str |
|
||||
price: float |
|
||||
is_offer: Union[bool, None] = None |
|
||||
|
|
||||
|
|
||||
@app.get("/") |
|
||||
def read_root(): |
|
||||
return {"Hello": "World"} |
|
||||
|
|
||||
|
|
||||
@app.get("/items/{item_id}") |
|
||||
def read_item(item_id: int, q: Union[str, None] = None): |
|
||||
return {"item_id": item_id, "q": q} |
|
||||
|
|
||||
|
|
||||
@app.put("/items/{item_id}") |
|
||||
def update_item(item_id: int, item: Item): |
|
||||
return {"item_name": item.name, "item_id": item_id} |
|
||||
``` |
|
||||
|
|
||||
সার্ভারটি স্বয়ংক্রিয়ভাবে পুনরায় লোড হওয়া উচিত (কারণ আপনি উপরের `uvicorn` কমান্ডে `--reload` যোগ করেছেন)। |
|
||||
|
|
||||
### ক্রিয়াশীল API নির্দেশিকা নথি উন্নীতকরণ |
|
||||
|
|
||||
এখন <a href="http://127.0.0.1:8000/docs" class="external-link" target="_blank">http://127.0.0.1:8000/docs</a> এডড্রেসে যান. |
|
||||
|
|
||||
- ক্রিয়াশীল API নির্দেশিকা নথিটি স্বয়ংক্রিয়ভাবে উন্নীত হযে যাবে, নতুন বডি সহ: |
|
||||
|
|
||||
 |
|
||||
|
|
||||
- "Try it out" বাটনে চাপুন, এটি আপনাকে পেরামিটারগুলো পূরণ করতে এবং API এর সাথে সরাসরি ক্রিয়া-কলাপ করতে দিবে: |
|
||||
|
|
||||
 |
|
||||
|
|
||||
- তারপরে "Execute" বাটনে চাপুন, ব্যবহারকারীর ইন্টারফেস আপনার API এর সাথে যোগাযোগ করবে, পেরামিটার পাঠাবে, ফলাফলগুলি পাবে এবং সেগুলি পর্রদায় দেখাবে: |
|
||||
|
|
||||
 |
|
||||
|
|
||||
### বিকল্প API নির্দেশিকা নথি আপগ্রেড |
|
||||
|
|
||||
এবং এখন <a href="http://127.0.0.1:8000/redoc" class="external-link" target="_blank">http://127.0.0.1:8000/redoc</a> এ যান। |
|
||||
|
|
||||
- বিকল্প নির্দেশিকা নথিতেও নতুন কুয়েরি প্যারামিটার এবং বডি প্রতিফলিত হবে: |
|
||||
|
|
||||
 |
|
||||
|
|
||||
### সংক্ষিপ্তকরণ |
|
||||
|
|
||||
সংক্ষেপে, আপনি **শুধু একবার** প্যারামিটারের ধরন, বডি ইত্যাদি ফাংশন প্যারামিটার হিসেবে ঘোষণা করেন। |
|
||||
|
|
||||
আপনি সেটি আধুনিক পাইথনের সাথে করেন। |
|
||||
|
|
||||
আপনাকে নতুন করে নির্দিষ্ট কোন লাইব্রেরির বাক্য গঠন, ফাংশন বা ক্লাস কিছুই শিখতে হচ্ছে না। |
|
||||
|
|
||||
শুধুই আধুনিক **Python 3.6+** |
|
||||
|
|
||||
উদাহরণস্বরূপ, `int` এর জন্য: |
|
||||
|
|
||||
```Python |
|
||||
item_id: int |
|
||||
``` |
|
||||
|
|
||||
অথবা আরও জটিল `Item` মডেলের জন্য: |
|
||||
|
|
||||
```Python |
|
||||
item: Item |
|
||||
``` |
|
||||
|
|
||||
...এবং সেই একই ঘোষণার সাথে আপনি পাবেন: |
|
||||
|
|
||||
- এডিটর সাহায্য, যেমন |
|
||||
- সমাপ্তি। |
|
||||
- ধরণ যাচাই |
|
||||
- তথ্য যাচাইকরণ: |
|
||||
- ডেটা অবৈধ হলে স্বয়ংক্রিয় এবং পরিষ্কার ত্রুটির নির্দেশনা। |
|
||||
- এমনকি গভীরভাবে নেস্ট করা JSON অবজেক্টের জন্য বৈধতা। |
|
||||
- প্রেরিত তথ্য <abbr title="যা পরিচিত: serialization, parsing, marshalling">রূপান্তর</abbr>: যা নেটওয়ার্ক থেকে পাইথনের তথ্য এবং ধরনে আসে, এবং সেখান থেকে পড়া: |
|
||||
|
|
||||
- JSON। |
|
||||
- পাথ প্যারামিটার। |
|
||||
- কুয়েরি প্যারামিটার। |
|
||||
- কুকিজ |
|
||||
- হেডার |
|
||||
- ফর্ম |
|
||||
- ফাইল |
|
||||
|
|
||||
- আউটপুট ডেটার <abbr title="যা পরিচিত: serialization, parsing, marshalling">রূপান্তর</abbr>: পাইথন ডেটা এবং টাইপ থেকে নেটওয়ার্ক ডেটাতে রূপান্তর করা (JSON হিসাবে): |
|
||||
-পাইথন টাইপে রূপান্তর করুন (`str`, `int`, `float`, `bool`, `list`, ইত্যাদি)। |
|
||||
- `datetime` অবজেক্ট। |
|
||||
- `UUID` objeঅবজেক্টcts। |
|
||||
- ডাটাবেস মডেল। |
|
||||
- ...এবং আরো অনেক। |
|
||||
- স্বয়ংক্রিয় ক্রিয়াশীল API নির্দেশিকা নথি, 2টি বিকল্প ব্যবহারকারীর ইন্টারফেস সহ: |
|
||||
- সোয়াগার ইউ আই (Swagger UI)। |
|
||||
- রিডক (ReDoc)। |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
পূর্ববর্তী কোড উদাহরণে ফিরে আসা যাক, **FastAPI** যা করবে: |
|
||||
|
|
||||
- `GET` এবং `PUT` অনুরোধের জন্য পথে `item_id` আছে কিনা তা যাচাই করবে। |
|
||||
- `GET` এবং `PUT` অনুরোধের জন্য `item_id` টাইপ `int` এর হতে হবে তা যাচাই করবে। |
|
||||
- যদি না হয় তবে ক্লায়েন্ট একটি উপযুক্ত, পরিষ্কার ত্রুটি দেখতে পাবেন। |
|
||||
- `GET` অনুরোধের জন্য একটি ঐচ্ছিক ক্যুয়েরি প্যারামিটার নামক `q` (যেমন `http://127.0.0.1:8000/items/foo?q=somequery`) আছে কি তা চেক করবে। |
|
||||
- যেহেতু `q` প্যারামিটারটি `= None` দিয়ে ঘোষণা করা হয়েছে, তাই এটি ঐচ্ছিক। |
|
||||
- `None` ছাড়া এটি প্রয়োজনীয় হতো (যেমন `PUT` এর ক্ষেত্রে হয়েছে)। |
|
||||
- `/items/{item_id}` এর জন্য `PUT` অনুরোধের বডি JSON হিসাবে পড়ুন: |
|
||||
- লক্ষ করুন, `name` একটি প্রয়োজনীয় অ্যাট্রিবিউট হিসাবে বিবেচনা করেছে এবং এটি `str` হতে হবে। |
|
||||
- লক্ষ করুন এখানে, `price` অ্যাট্রিবিউটটি আবশ্যক এবং এটি `float` হতে হবে। |
|
||||
- লক্ষ করুন `is_offer` একটি ঐচ্ছিক অ্যাট্রিবিউট এবং এটি `bool` হতে হবে যদি উপস্থিত থাকে। |
|
||||
- এই সবটি গভীরভাবে অবস্থানরত JSON অবজেক্টগুলিতেও কাজ করবে। |
|
||||
- স্বয়ংক্রিয়ভাবে JSON হতে এবং JSON থেকে কনভার্ট করুন। |
|
||||
- OpenAPI দিয়ে সবকিছু ডকুমেন্ট করুন, যা ব্যবহার করা যেতে পারে: |
|
||||
- ক্রিয়াশীল নির্দেশিকা নথি। |
|
||||
- অনেক ভাষার জন্য স্বয়ংক্রিয় ক্লায়েন্ট কোড তৈরির ব্যবস্থা। |
|
||||
- সরাসরি 2টি ক্রিয়াশীল নির্দেশিকা নথি ওয়েব পৃষ্ঠ প্রদান করা হয়েছে। |
|
||||
|
|
||||
--- |
|
||||
|
|
||||
আমরা এতক্ষন শুধু এর পৃষ্ঠ তৈরি করেছি, কিন্তু আপনি ইতমধ্যেই এটি কিভাবে কাজ করে তার ধারণাও পেয়ে গিয়েছেন। |
|
||||
|
|
||||
নিম্নোক্ত লাইন গুলো পরিবর্তন করার চেষ্টা করুন: |
|
||||
|
|
||||
```Python |
|
||||
return {"item_name": item.name, "item_id": item_id} |
|
||||
``` |
|
||||
|
|
||||
...পুর্বে: |
|
||||
|
|
||||
```Python |
|
||||
... "item_name": item.name ... |
|
||||
``` |
|
||||
|
|
||||
...পরবর্তীতে: |
|
||||
|
|
||||
```Python |
|
||||
... "item_price": item.price ... |
|
||||
``` |
|
||||
|
|
||||
...এবং দেখুন কিভাবে আপনার এডিটর উপাদানগুলোকে সয়ংক্রিয়ভাবে-সম্পন্ন করবে এবং তাদের ধরন জানতে পারবে: |
|
||||
|
|
||||
 |
|
||||
|
|
||||
আরও বৈশিষ্ট্য সম্পন্ন উদাহরণের জন্য, দেখুন <a href="https://fastapi.tiangolo.com/tutorial/">টিউটোরিয়াল - ব্যবহারকারীর গাইড</a>. |
|
||||
|
|
||||
**স্পয়লার সতর্কতা**: টিউটোরিয়াল - ব্যবহারকারীর গাইড নিম্নোক্ত বিষয়গুলি অন্তর্ভুক্ত করে: |
|
||||
|
|
||||
- **হেডার**, **কুকিজ**, **ফর্ম ফিল্ড** এবং **ফাইলগুলি** এমন অন্যান্য জায়গা থেকে প্যারামিটার ঘোষণা করা। |
|
||||
- `maximum_length` বা `regex` এর মতো **যাচাইকরণ বাধামুক্তি** সেট করা হয় কিভাবে, তা নিয়ে আলোচনা করা হবে। |
|
||||
- একটি খুব শক্তিশালী এবং ব্যবহার করা সহজ <abbr title="also known as components, resources, providers, services, injectables">ডিপেন্ডেন্সি ইনজেকশন</abbr> পদ্ধতি |
|
||||
- **OAuth2** এবং **JWT টোকেন** এবং **HTTP Basic** auth সহ নিরাপত্তা এবং অনুমোদনপ্রাপ্তি সম্পর্কিত বিষয়সমূহের উপর। |
|
||||
- **গভীরভাবে অবস্থানরত JSON মডেল** ঘোষণা করার জন্য আরও উন্নত (কিন্তু সমান সহজ) কৌশল (Pydantic কে ধন্যবাদ)। |
|
||||
- আরো অতিরিক্ত বৈশিষ্ট্য (স্টারলেটকে ধন্যবাদ) হিসাবে: |
|
||||
- **WebSockets** |
|
||||
- **GraphQL** |
|
||||
- HTTPX এবং `pytest` ভিত্তিক অত্যন্ত সহজ পরীক্ষা |
|
||||
- **CORS** |
|
||||
- **Cookie Sessions** |
|
||||
- ...এবং আরো। |
|
||||
|
|
||||
## কর্মক্ষমতা |
|
||||
|
|
||||
স্বাধীন TechEmpower Benchmarks দেখায় যে **FastAPI** অ্যাপ্লিকেশনগুলি Uvicorn-এর অধীনে চলমান দ্রুততম<a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank">পাইথন ফ্রেমওয়ার্কগুলির মধ্যে একটি,</a> শুধুমাত্র Starlette এবং Uvicorn-এর পর (FastAPI দ্বারা অভ্যন্তরীণভাবে ব্যবহৃত)। (\*) |
|
||||
|
|
||||
এটি সম্পর্কে আরও বুঝতে, দেখুন <a href="https://fastapi.tiangolo.com/benchmarks/" class="internal-link" target="_blank">Benchmarks</a>. |
|
||||
|
|
||||
## ঐচ্ছিক নির্ভরশীলতা |
|
||||
|
|
||||
Pydantic দ্বারা ব্যবহৃত: |
|
||||
|
|
||||
- <a href="https://github.com/JoshData/python-email-validator" target="_blank"><code>email-validator</code></a> - ইমেল যাচাইকরণের জন্য। |
|
||||
|
|
||||
স্টারলেট দ্বারা ব্যবহৃত: |
|
||||
|
|
||||
- <a href="https://www.python-httpx.org" target="_blank"><code>httpx</code></a> - আপনি যদি `TestClient` ব্যবহার করতে চান তাহলে আবশ্যক। |
|
||||
- <a href="https://jinja.palletsprojects.com" target="_blank"><code>jinja2</code></a> - আপনি যদি প্রদত্ত টেমপ্লেট রূপরেখা ব্যবহার করতে চান তাহলে প্রয়োজন। |
|
||||
- <a href="https://github.com/Kludex/python-multipart" target="_blank"><code>python-multipart</code></a> - আপনি যদি ফর্ম সহায়তা করতে চান তাহলে প্রয়োজন <abbr title="converting the string that comes from an HTTP request into Python data">"parsing"</abbr>, `request.form()` সহ। |
|
||||
- <a href="https://pythonhosted.org/itsdangerous/" target="_blank"><code>itsdangerous</code></a> - `SessionMiddleware` সহায়তার জন্য প্রয়োজন। |
|
||||
- <a href="https://pyyaml.org/wiki/PyYAMLDocumentation" target="_blank"><code>pyyaml</code></a> - স্টারলেটের SchemaGenerator সাপোর্ট এর জন্য প্রয়োজন (আপনার সম্ভাবত FastAPI প্রয়োজন নেই)। |
|
||||
- <a href="https://graphene-python.org/" target="_blank"><code>graphene</code></a> - `GraphQLApp` সহায়তার জন্য প্রয়োজন। |
|
||||
|
|
||||
FastAPI / Starlette দ্বারা ব্যবহৃত: |
|
||||
|
|
||||
- <a href="https://www.uvicorn.org" target="_blank"><code>uvicorn</code></a> - সার্ভারের জন্য যা আপনার অ্যাপ্লিকেশন লোড করে এবং পরিবেশন করে। |
|
||||
- <a href="https://github.com/ijl/orjson" target="_blank"><code>orjson</code></a> - আপনি `ORJSONResponse` ব্যবহার করতে চাইলে প্রয়োজন। |
|
||||
- <a href="https://github.com/esnme/ultrajson" target="_blank"><code>ujson</code></a> - আপনি `UJSONResponse` ব্যবহার করতে চাইলে প্রয়োজন। |
|
||||
|
|
||||
আপনি এই সব ইনস্টল করতে পারেন `pip install fastapi[all]` দিয়ে. |
|
||||
|
|
||||
## লাইসেন্স |
|
||||
|
|
||||
এই প্রজেক্ট MIT লাইসেন্স নীতিমালার অধীনে শর্তায়িত। |
|
||||
@ -1,5 +0,0 @@ |
|||||
# শিখুন |
|
||||
|
|
||||
এখানে **FastAPI** শিখার জন্য প্রাথমিক বিভাগগুলি এবং টিউটোরিয়ালগুলি রয়েছে। |
|
||||
|
|
||||
আপনি এটিকে একটি **বই**, একটি **কোর্স**, এবং FastAPI শিখার **অফিসিয়াল** এবং প্রস্তাবিত উপায় বিবেচনা করতে পারেন। 😎 |
|
||||
@ -1,586 +0,0 @@ |
|||||
# পাইথন এর <abbr title="একটি ভেরিয়েবল কি ধরনের ডেটা ধারণ করতে পারে।">টাইপ্স</abbr> পরিচিতি |
|
||||
|
|
||||
Python-এ ঐচ্ছিক "টাইপ হিন্ট" (যা "টাইপ অ্যানোটেশন" নামেও পরিচিত) এর জন্য সাপোর্ট রয়েছে। |
|
||||
|
|
||||
এই **"টাইপ হিন্ট"** বা অ্যানোটেশনগুলি এক ধরণের বিশেষ <abbr title="সিনট্যাক্স হল প্রোগ্রামিং ভাষায় কোড লেখার নিয়ম ও গঠন।">সিনট্যাক্স</abbr> যা একটি ভেরিয়েবলের <abbr title="যেমন: str, int, float, bool">টাইপ</abbr> ঘোষণা করতে দেয়। |
|
||||
|
|
||||
ভেরিয়েবলগুলির জন্য টাইপ ঘোষণা করলে, এডিটর এবং টুলগুলি আপনাকে আরও ভালো সাপোর্ট দিতে পারে। |
|
||||
|
|
||||
এটি পাইথন টাইপ হিন্ট সম্পর্কে একটি দ্রুত **টিউটোরিয়াল / রিফ্রেশার** মাত্র। এটি **FastAPI** এর সাথে ব্যবহার করার জন্য শুধুমাত্র ন্যূনতম প্রয়োজনীয়তা কভার করে... যা আসলে খুব একটা বেশি না। |
|
||||
|
|
||||
**FastAPI** এই টাইপ হিন্টগুলির উপর ভিত্তি করে নির্মিত, যা এটিকে অনেক সুবিধা এবং লাভ প্রদান করে। |
|
||||
|
|
||||
তবে, আপনি যদি কখনো **FastAPI** ব্যবহার নাও করেন, তবুও এগুলি সম্পর্কে একটু শেখা আপনার উপকারে আসবে। |
|
||||
|
|
||||
/// note |
|
||||
|
|
||||
যদি আপনি একজন Python বিশেষজ্ঞ হন, এবং টাইপ হিন্ট সম্পর্কে সবকিছু জানেন, তাহলে পরবর্তী অধ্যায়ে চলে যান। |
|
||||
|
|
||||
/// |
|
||||
|
|
||||
## প্রেরণা |
|
||||
|
|
||||
চলুন একটি সাধারণ উদাহরণ দিয়ে শুরু করি: |
|
||||
|
|
||||
{* ../../docs_src/python_types/tutorial001.py *} |
|
||||
|
|
||||
|
|
||||
এই প্রোগ্রামটি কল করলে আউটপুট হয়: |
|
||||
|
|
||||
``` |
|
||||
John Doe |
|
||||
``` |
|
||||
|
|
||||
ফাংশনটি নিম্নলিখিত কাজ করে: |
|
||||
|
|
||||
* `first_name` এবং `last_name` নেয়। |
|
||||
* প্রতিটির প্রথম অক্ষরকে `title()` ব্যবহার করে বড় হাতের অক্ষরে রূপান্তর করে। |
|
||||
* তাদেরকে মাঝখানে একটি স্পেস দিয়ে <abbr title="একটার পরে একটা একত্রিত করা">concatenate</abbr> করে। |
|
||||
|
|
||||
{* ../../docs_src/python_types/tutorial001.py hl[2] *} |
|
||||
|
|
||||
|
|
||||
### এটি সম্পাদনা করুন |
|
||||
|
|
||||
এটি একটি খুব সাধারণ প্রোগ্রাম। |
|
||||
|
|
||||
কিন্তু এখন কল্পনা করুন যে আপনি এটি শুরু থেকে লিখছিলেন। |
|
||||
|
|
||||
এক পর্যায়ে আপনি ফাংশনের সংজ্ঞা শুরু করেছিলেন, আপনার প্যারামিটারগুলি প্রস্তুত ছিল... |
|
||||
|
|
||||
কিন্তু তারপর আপনাকে "সেই 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 |
|
||||
``` |
|
||||
|
|
||||
ব্যাস। |
|
||||
|
|
||||
এগুলিই "টাইপ হিন্ট": |
|
||||
|
|
||||
{* ../../docs_src/python_types/tutorial002.py hl[1] *} |
|
||||
|
|
||||
|
|
||||
এটি ডিফল্ট ভ্যালু ঘোষণা করার মত নয় যেমন: |
|
||||
|
|
||||
```Python |
|
||||
first_name="john", last_name="doe" |
|
||||
``` |
|
||||
|
|
||||
এটি একটি ভিন্ন জিনিস। |
|
||||
|
|
||||
আমরা সমান (`=`) নয়, কোলন (`:`) ব্যবহার করছি। |
|
||||
|
|
||||
এবং টাইপ হিন্ট যোগ করা সাধারণত তেমন কিছু পরিবর্তন করে না যা টাইপ হিন্ট ছাড়াই ঘটত। |
|
||||
|
|
||||
কিন্তু এখন, কল্পনা করুন আপনি আবার সেই ফাংশন তৈরির মাঝখানে আছেন, কিন্তু টাইপ হিন্ট সহ। |
|
||||
|
|
||||
একই পর্যায়ে, আপনি অটোকমপ্লিট ট্রিগার করতে `Ctrl+Space` চাপেন এবং আপনি দেখতে পান: |
|
||||
|
|
||||
<img src="/img/python-types/image02.png"> |
|
||||
|
|
||||
এর সাথে, আপনি অপশনগুলি দেখে, স্ক্রল করতে পারেন, যতক্ষণ না আপনি এমন একটি অপশন খুঁজে পান যা কিছু মনে পরিয়ে দেয়: |
|
||||
|
|
||||
<img src="/img/python-types/image03.png"> |
|
||||
|
|
||||
## আরও প্রেরণা |
|
||||
|
|
||||
এই ফাংশনটি দেখুন, এটিতে ইতিমধ্যে টাইপ হিন্ট রয়েছে: |
|
||||
|
|
||||
{* ../../docs_src/python_types/tutorial003.py hl[1] *} |
|
||||
|
|
||||
|
|
||||
এডিটর ভেরিয়েবলগুলির টাইপ জানার কারণে, আপনি শুধুমাত্র অটোকমপ্লিশনই পান না, আপনি এরর চেকও পান: |
|
||||
|
|
||||
<img src="/img/python-types/image04.png"> |
|
||||
|
|
||||
এখন আপনি জানেন যে আপনাকে এটি ঠিক করতে হবে, `age`-কে একটি স্ট্রিং হিসেবে রূপান্তর করতে `str(age)` ব্যবহার করতে হবে: |
|
||||
|
|
||||
{* ../../docs_src/python_types/tutorial004.py hl[2] *} |
|
||||
|
|
||||
|
|
||||
## টাইপ ঘোষণা |
|
||||
|
|
||||
আপনি এতক্ষন টাইপ হিন্ট ঘোষণা করার মূল স্থানটি দেখে ফেলেছেন-- ফাংশন প্যারামিটার হিসেবে। |
|
||||
|
|
||||
সাধারণত এটি **FastAPI** এর ক্ষেত্রেও একই। |
|
||||
|
|
||||
### সিম্পল টাইপ |
|
||||
|
|
||||
আপনি `str` ছাড়াও সমস্ত স্ট্যান্ডার্ড পাইথন টাইপ ঘোষণা করতে পারেন। |
|
||||
|
|
||||
উদাহরণস্বরূপ, আপনি এগুলো ব্যবহার করতে পারেন: |
|
||||
|
|
||||
* `int` |
|
||||
* `float` |
|
||||
* `bool` |
|
||||
* `bytes` |
|
||||
|
|
||||
{* ../../docs_src/python_types/tutorial005.py hl[1] *} |
|
||||
|
|
||||
|
|
||||
### টাইপ প্যারামিটার সহ জেনেরিক টাইপ |
|
||||
|
|
||||
কিছু ডাটা স্ট্রাকচার অন্যান্য মান ধারণ করতে পারে, যেমন `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]` এর অর্থ আরও স্পষ্টভাবে প্রকাশ করে। |
|
||||
|
|
||||
এটি কেবল শব্দ এবং নামের ব্যাপার। কিন্তু সেই শব্দগুলি আপনি এবং আপনার সহকর্মীরা কোড সম্পর্কে কীভাবে চিন্তা করেন তা প্রভাবিত করতে পারে। |
|
||||
|
|
||||
একটি উদাহরণ হিসেবে, এই ফাংশনটি নিন: |
|
||||
|
|
||||
{* ../../docs_src/python_types/tutorial009c.py hl[1,4] *} |
|
||||
|
|
||||
|
|
||||
`name` প্যারামিটারটি `Optional[str]` হিসেবে সংজ্ঞায়িত হয়েছে, কিন্তু এটি **অপশনাল নয়**, আপনি প্যারামিটার ছাড়া ফাংশনটি কল করতে পারবেন না: |
|
||||
|
|
||||
```Python |
|
||||
say_hi() # ওহ না, এটি একটি ত্রুটি নিক্ষেপ করবে! 😱 |
|
||||
``` |
|
||||
|
|
||||
`name` প্যারামিটারটি **এখনও আবশ্যিক** (নন-অপশনাল) কারণ এটির কোনো ডিফল্ট মান নেই। তবুও, `name` এর মান হিসেবে `None` গ্রহণযোগ্য: |
|
||||
|
|
||||
```Python |
|
||||
say_hi(name=None) # এটি কাজ করে, None বৈধ 🎉 |
|
||||
``` |
|
||||
|
|
||||
সুখবর হল, একবার আপনি Python 3.10 ব্যবহার করা শুরু করলে, আপনাকে এগুলোর ব্যাপারে আর চিন্তা করতে হবে না, যেহুতু আপনি | ব্যবহার করেই ইউনিয়ন ঘোষণা করতে পারবেন: |
|
||||
|
|
||||
{* ../../docs_src/python_types/tutorial009c_py310.py hl[1,4] *} |
|
||||
|
|
||||
|
|
||||
এবং তারপর আপনাকে নামগুলি যেমন `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` নামে একটি ক্লাস আছে, যার একটি নাম আছে: |
|
||||
|
|
||||
{* ../../docs_src/python_types/tutorial010.py hl[1:3] *} |
|
||||
|
|
||||
|
|
||||
তারপর আপনি একটি ভেরিয়েবলকে `Person` টাইপের হিসেবে ঘোষণা করতে পারেন: |
|
||||
|
|
||||
{* ../../docs_src/python_types/tutorial010.py hl[6] *} |
|
||||
|
|
||||
|
|
||||
এবং তারপর, আবার, আপনি এডিটর সাপোর্ট পেয়ে যাবেন: |
|
||||
|
|
||||
<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 টাইপ হিন্ট সম্পর্কে বেসিক থেকে উন্নত লেভেলের ধারণা পেতে পারেন, যা আপনার কোডে টাইপ সেফটি এবং স্পষ্টতা বাড়াতে সাহায্য করবে। |
|
||||
|
|
||||
/// |
|
||||
@ -1 +0,0 @@ |
|||||
INHERIT: ../en/mkdocs.yml |
|
||||
@ -1,16 +1,24 @@ |
|||||
# FastAPI bei Cloudanbietern bereitstellen { #deploy-fastapi-on-cloud-providers } |
# FastAPI bei Cloudanbietern deployen { #deploy-fastapi-on-cloud-providers } |
||||
|
|
||||
Sie können praktisch **jeden Cloudanbieter** verwenden, um Ihre FastAPI-Anwendung bereitzustellen. |
Sie können praktisch **jeden Cloudanbieter** verwenden, um Ihre FastAPI-Anwendung bereitzustellen. |
||||
|
|
||||
In den meisten Fällen bieten die großen Cloudanbieter Anleitungen zum Bereitstellen von FastAPI an. |
In den meisten Fällen bieten die großen Cloudanbieter Anleitungen zum Deployment von FastAPI an. |
||||
|
|
||||
## Cloudanbieter – Sponsoren { #cloud-providers-sponsors } |
## FastAPI Cloud { #fastapi-cloud } |
||||
|
|
||||
|
**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** wurde vom selben Autor und Team hinter **FastAPI** entwickelt. |
||||
|
|
||||
|
Es vereinfacht den Prozess des **Erstellens**, **Deployens** und **Zugreifens** auf eine API mit minimalem Aufwand. |
||||
|
|
||||
Einige Cloudanbieter ✨ [**sponsern FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨, dies stellt die kontinuierliche und gesunde **Entwicklung** von FastAPI und seinem **Ökosystem** sicher. |
Es bringt die gleiche **Developer-Experience** beim Erstellen von Apps mit FastAPI auch zum **Deployment** in der Cloud. 🎉 |
||||
|
|
||||
|
FastAPI Cloud ist der Hauptsponsor und Finanzierungsgeber für die *FastAPI and friends* Open-Source-Projekte. ✨ |
||||
|
|
||||
|
## Cloudanbieter – Sponsoren { #cloud-providers-sponsors } |
||||
|
|
||||
Und es zeigt ihr wahres Engagement für FastAPI und seine **Community** (Sie), da sie Ihnen nicht nur einen **guten Service** bieten möchten, sondern auch sicherstellen möchten, dass Sie ein **gutes und gesundes Framework**, FastAPI, haben. 🙇 |
Einige andere Cloudanbieter ✨ [**sponsern FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨ ebenfalls. 🙇 |
||||
|
|
||||
Vielleicht möchten Sie deren Dienste ausprobieren und deren Anleitungen folgen: |
Sie könnten diese ebenfalls in Betracht ziehen, deren Anleitungen folgen und ihre Dienste ausprobieren: |
||||
|
|
||||
* <a href="https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi" class="external-link" target="_blank">Render</a> |
* <a href="https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi" class="external-link" target="_blank">Render</a> |
||||
* <a href="https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi" class="external-link" target="_blank">Railway</a> |
* <a href="https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi" class="external-link" target="_blank">Railway</a> |
||||
|
|||||
@ -0,0 +1,65 @@ |
|||||
|
# FastAPI Cloud { #fastapi-cloud } |
||||
|
|
||||
|
Sie können Ihre FastAPI-App in der <a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a> mit **einem einzigen Befehl** deployen – tragen Sie sich in die Warteliste ein, falls noch nicht geschehen. 🚀 |
||||
|
|
||||
|
## Anmelden { #login } |
||||
|
|
||||
|
Stellen Sie sicher, dass Sie bereits ein **FastAPI-Cloud-Konto** haben (wir haben Sie von der Warteliste eingeladen 😉). |
||||
|
|
||||
|
Melden Sie sich dann an: |
||||
|
|
||||
|
<div class="termy"> |
||||
|
|
||||
|
```console |
||||
|
$ fastapi login |
||||
|
|
||||
|
You are logged in to FastAPI Cloud 🚀 |
||||
|
``` |
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
## Deployen { #deploy } |
||||
|
|
||||
|
Stellen Sie Ihre App jetzt mit **einem einzigen Befehl** bereit: |
||||
|
|
||||
|
<div class="termy"> |
||||
|
|
||||
|
```console |
||||
|
$ fastapi deploy |
||||
|
|
||||
|
Deploying to FastAPI Cloud... |
||||
|
|
||||
|
✅ Deployment successful! |
||||
|
|
||||
|
🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev |
||||
|
``` |
||||
|
|
||||
|
</div> |
||||
|
|
||||
|
Das war’s! Jetzt können Sie Ihre App unter dieser URL aufrufen. ✨ |
||||
|
|
||||
|
## Über FastAPI Cloud { #about-fastapi-cloud } |
||||
|
|
||||
|
**<a href="https://fastapicloud.com" class="external-link" target="_blank">FastAPI Cloud</a>** wird vom gleichen Autor und Team hinter **FastAPI** entwickelt. |
||||
|
|
||||
|
Es vereinfacht den Prozess des **Erstellens**, **Deployens** und **Nutzens** einer API mit minimalem Aufwand. |
||||
|
|
||||
|
Es bringt die gleiche **Developer-Experience** beim Erstellen von Apps mit FastAPI auch zum **Deployment** in der Cloud. 🎉 |
||||
|
|
||||
|
Es kümmert sich außerdem um das meiste, was beim Deployen einer App nötig ist, zum Beispiel: |
||||
|
|
||||
|
* HTTPS |
||||
|
* Replikation, mit Autoscaling basierend auf Requests |
||||
|
* usw. |
||||
|
|
||||
|
FastAPI Cloud ist Hauptsponsor und Finanzierer der Open-Source-Projekte *FastAPI and friends*. ✨ |
||||
|
|
||||
|
## Bei anderen Cloudanbietern deployen { #deploy-to-other-cloud-providers } |
||||
|
|
||||
|
FastAPI ist Open Source und basiert auf Standards. Sie können FastAPI-Apps bei jedem Cloudanbieter Ihrer Wahl deployen. |
||||
|
|
||||
|
Folgen Sie den Anleitungen Ihres Cloudanbieters, um dort FastAPI-Apps zu deployen. 🤓 |
||||
|
|
||||
|
## Auf den eigenen Server deployen { #deploy-your-own-server } |
||||
|
|
||||
|
Ich werde Ihnen später in diesem **Deployment-Leitfaden** auch alle Details zeigen, sodass Sie verstehen, was passiert, was geschehen muss und wie Sie FastAPI-Apps selbst deployen können, auch auf Ihre eigenen Server. 🤓 |
||||
@ -0,0 +1,17 @@ |
|||||
|
# Alte 403-Authentifizierungsfehler-Statuscodes verwenden { #use-old-403-authentication-error-status-codes } |
||||
|
|
||||
|
Vor FastAPI-Version `0.122.0` verwendeten die integrierten Sicherheits-Utilities den HTTP-Statuscode `403 Forbidden`, wenn sie dem Client nach einer fehlgeschlagenen Authentifizierung einen Fehler zurückgaben. |
||||
|
|
||||
|
Ab FastAPI-Version `0.122.0` verwenden sie den passenderen HTTP-Statuscode `401 Unauthorized` und geben in der Response einen sinnvollen `WWW-Authenticate`-Header zurück, gemäß den HTTP-Spezifikationen, <a href="https://datatracker.ietf.org/doc/html/rfc7235#section-3.1" class="external-link" target="_blank">RFC 7235</a>, <a href="https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized" class="external-link" target="_blank">RFC 9110</a>. |
||||
|
|
||||
|
Aber falls Ihre Clients aus irgendeinem Grund vom alten Verhalten abhängen, können Sie darauf zurückgreifen, indem Sie in Ihren Sicherheitsklassen die Methode `make_not_authenticated_error` überschreiben. |
||||
|
|
||||
|
Sie können beispielsweise eine Unterklasse von `HTTPBearer` erstellen, die einen Fehler `403 Forbidden` zurückgibt, statt des Default-`401 Unauthorized`-Fehlers: |
||||
|
|
||||
|
{* ../../docs_src/authentication_error_status_code/tutorial001_an_py39.py hl[9:13] *} |
||||
|
|
||||
|
/// tip | Tipp |
||||
|
|
||||
|
Beachten Sie, dass die Funktion die Exception-Instanz zurückgibt; sie wirft sie nicht. Das Werfen erfolgt im restlichen internen Code. |
||||
|
|
||||
|
/// |
||||
@ -0,0 +1,135 @@ |
|||||
|
# Von Pydantic v1 zu Pydantic v2 migrieren { #migrate-from-pydantic-v1-to-pydantic-v2 } |
||||
|
|
||||
|
Wenn Sie eine ältere FastAPI-App haben, nutzen Sie möglicherweise Pydantic Version 1. |
||||
|
|
||||
|
FastAPI Version 0.100.0 unterstützte sowohl Pydantic v1 als auch v2. Es verwendete, was auch immer Sie installiert hatten. |
||||
|
|
||||
|
FastAPI Version 0.119.0 führte eine teilweise Unterstützung für Pydantic v1 innerhalb von Pydantic v2 (als `pydantic.v1`) ein, um die Migration zu v2 zu erleichtern. |
||||
|
|
||||
|
FastAPI 0.126.0 entfernte die Unterstützung für Pydantic v1, während `pydantic.v1` noch eine Weile unterstützt wurde. |
||||
|
|
||||
|
/// warning | Achtung |
||||
|
|
||||
|
Das Pydantic-Team hat die Unterstützung für Pydantic v1 in den neuesten Python-Versionen eingestellt, beginnend mit **Python 3.14**. |
||||
|
|
||||
|
Dies schließt `pydantic.v1` ein, das unter Python 3.14 und höher nicht mehr unterstützt wird. |
||||
|
|
||||
|
Wenn Sie die neuesten Features von Python nutzen möchten, müssen Sie sicherstellen, dass Sie Pydantic v2 verwenden. |
||||
|
|
||||
|
/// |
||||
|
|
||||
|
Wenn Sie eine ältere FastAPI-App mit Pydantic v1 haben, zeige ich Ihnen hier, wie Sie sie zu Pydantic v2 migrieren, und die **Features in FastAPI 0.119.0**, die Ihnen bei einer schrittweisen Migration helfen. |
||||
|
|
||||
|
## Offizieller Leitfaden { #official-guide } |
||||
|
|
||||
|
Pydantic hat einen offiziellen <a href="https://docs.pydantic.dev/latest/migration/" class="external-link" target="_blank">Migrationsleitfaden</a> von v1 zu v2. |
||||
|
|
||||
|
Er enthält auch, was sich geändert hat, wie Validierungen nun korrekter und strikter sind, mögliche Stolpersteine, usw. |
||||
|
|
||||
|
Sie können ihn lesen, um besser zu verstehen, was sich geändert hat. |
||||
|
|
||||
|
## Tests { #tests } |
||||
|
|
||||
|
Stellen Sie sicher, dass Sie [Tests](../tutorial/testing.md){.internal-link target=_blank} für Ihre App haben und diese in Continuous Integration (CI) ausführen. |
||||
|
|
||||
|
Auf diese Weise können Sie das Update durchführen und sicherstellen, dass weiterhin alles wie erwartet funktioniert. |
||||
|
|
||||
|
## `bump-pydantic` { #bump-pydantic } |
||||
|
|
||||
|
In vielen Fällen, wenn Sie reguläre Pydantic-Modelle ohne Anpassungen verwenden, können Sie den Großteil des Prozesses der Migration von Pydantic v1 auf Pydantic v2 automatisieren. |
||||
|
|
||||
|
Sie können <a href="https://github.com/pydantic/bump-pydantic" class="external-link" target="_blank">`bump-pydantic`</a> vom selben Pydantic-Team verwenden. |
||||
|
|
||||
|
Dieses Tool hilft Ihnen, den Großteil des zu ändernden Codes automatisch anzupassen. |
||||
|
|
||||
|
Danach können Sie die Tests ausführen und prüfen, ob alles funktioniert. Falls ja, sind Sie fertig. 😎 |
||||
|
|
||||
|
## Pydantic v1 in v2 { #pydantic-v1-in-v2 } |
||||
|
|
||||
|
Pydantic v2 enthält alles aus Pydantic v1 als Untermodul `pydantic.v1`. Dies wird aber in Versionen oberhalb von Python 3.13 nicht mehr unterstützt. |
||||
|
|
||||
|
Das bedeutet, Sie können die neueste Version von Pydantic v2 installieren und die alten Pydantic‑v1‑Komponenten aus diesem Untermodul importieren und verwenden, als hätten Sie das alte Pydantic v1 installiert. |
||||
|
|
||||
|
{* ../../docs_src/pydantic_v1_in_v2/tutorial001_an_py310.py hl[1,4] *} |
||||
|
|
||||
|
### FastAPI-Unterstützung für Pydantic v1 in v2 { #fastapi-support-for-pydantic-v1-in-v2 } |
||||
|
|
||||
|
Seit FastAPI 0.119.0 gibt es außerdem eine teilweise Unterstützung für Pydantic v1 innerhalb von Pydantic v2, um die Migration auf v2 zu erleichtern. |
||||
|
|
||||
|
Sie könnten also Pydantic auf die neueste Version 2 aktualisieren und die Importe so ändern, dass das Untermodul `pydantic.v1` verwendet wird, und in vielen Fällen würde es einfach funktionieren. |
||||
|
|
||||
|
{* ../../docs_src/pydantic_v1_in_v2/tutorial002_an_py310.py hl[2,5,15] *} |
||||
|
|
||||
|
/// warning | Achtung |
||||
|
|
||||
|
Beachten Sie, dass, da das Pydantic‑Team Pydantic v1 in neueren Python‑Versionen nicht mehr unterstützt, beginnend mit Python 3.14, auch die Verwendung von `pydantic.v1` unter Python 3.14 und höher nicht unterstützt wird. |
||||
|
|
||||
|
/// |
||||
|
|
||||
|
### Pydantic v1 und v2 in derselben App { #pydantic-v1-and-v2-on-the-same-app } |
||||
|
|
||||
|
Es wird von Pydantic **nicht unterstützt**, dass ein Pydantic‑v2‑Modell Felder hat, die als Pydantic‑v1‑Modelle definiert sind, und umgekehrt. |
||||
|
|
||||
|
```mermaid |
||||
|
graph TB |
||||
|
subgraph "❌ Nicht unterstützt" |
||||
|
direction TB |
||||
|
subgraph V2["Pydantic-v2-Modell"] |
||||
|
V1Field["Pydantic-v1-Modell"] |
||||
|
end |
||||
|
subgraph V1["Pydantic-v1-Modell"] |
||||
|
V2Field["Pydantic-v2-Modell"] |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
style V2 fill:#f9fff3 |
||||
|
style V1 fill:#fff6f0 |
||||
|
style V1Field fill:#fff6f0 |
||||
|
style V2Field fill:#f9fff3 |
||||
|
``` |
||||
|
|
||||
|
... aber Sie können getrennte Modelle, die Pydantic v1 bzw. v2 nutzen, in derselben App verwenden. |
||||
|
|
||||
|
```mermaid |
||||
|
graph TB |
||||
|
subgraph "✅ Unterstützt" |
||||
|
direction TB |
||||
|
subgraph V2["Pydantic-v2-Modell"] |
||||
|
V2Field["Pydantic-v2-Modell"] |
||||
|
end |
||||
|
subgraph V1["Pydantic-v1-Modell"] |
||||
|
V1Field["Pydantic-v1-Modell"] |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
style V2 fill:#f9fff3 |
||||
|
style V1 fill:#fff6f0 |
||||
|
style V1Field fill:#fff6f0 |
||||
|
style V2Field fill:#f9fff3 |
||||
|
``` |
||||
|
|
||||
|
In einigen Fällen ist es sogar möglich, sowohl Pydantic‑v1‑ als auch Pydantic‑v2‑Modelle in derselben **Pfadoperation** Ihrer FastAPI‑App zu verwenden: |
||||
|
|
||||
|
{* ../../docs_src/pydantic_v1_in_v2/tutorial003_an_py310.py hl[2:3,6,12,21:22] *} |
||||
|
|
||||
|
Im obigen Beispiel ist das Eingabemodell ein Pydantic‑v1‑Modell, und das Ausgabemodell (definiert in `response_model=ItemV2`) ist ein Pydantic‑v2‑Modell. |
||||
|
|
||||
|
### Pydantic v1 Parameter { #pydantic-v1-parameters } |
||||
|
|
||||
|
Wenn Sie einige der FastAPI-spezifischen Tools für Parameter wie `Body`, `Query`, `Form`, usw. zusammen mit Pydantic‑v1‑Modellen verwenden müssen, können Sie die aus `fastapi.temp_pydantic_v1_params` importieren, während Sie die Migration zu Pydantic v2 abschließen: |
||||
|
|
||||
|
{* ../../docs_src/pydantic_v1_in_v2/tutorial004_an_py310.py hl[4,18] *} |
||||
|
|
||||
|
### In Schritten migrieren { #migrate-in-steps } |
||||
|
|
||||
|
/// tip | Tipp |
||||
|
|
||||
|
Probieren Sie zuerst `bump-pydantic` aus. Wenn Ihre Tests erfolgreich sind und das funktioniert, sind Sie mit einem einzigen Befehl fertig. ✨ |
||||
|
|
||||
|
/// |
||||
|
|
||||
|
Wenn `bump-pydantic` für Ihren Anwendungsfall nicht funktioniert, können Sie die Unterstützung für Pydantic‑v1‑ und Pydantic‑v2‑Modelle in derselben App nutzen, um die Migration zu Pydantic v2 schrittweise durchzuführen. |
||||
|
|
||||
|
Sie könnten zuerst Pydantic auf die neueste Version 2 aktualisieren und die Importe so ändern, dass für all Ihre Modelle `pydantic.v1` verwendet wird. |
||||
|
|
||||
|
Anschließend können Sie beginnen, Ihre Modelle gruppenweise von Pydantic v1 auf v2 zu migrieren – in kleinen, schrittweisen Etappen. 🚶 |
||||
@ -1,3 +1,3 @@ |
|||||
# Ressourcen { #resources } |
# Ressourcen { #resources } |
||||
|
|
||||
Zusätzliche Ressourcen, externe Links, Artikel und mehr. ✈️ |
Zusätzliche Ressourcen, externe Links und mehr. ✈️ |
||||
|
|||||
@ -22,21 +22,13 @@ Hier ist eine allgemeine Idee, wie die Modelle mit ihren Passwortfeldern aussehe |
|||||
|
|
||||
{* ../../docs_src/extra_models/tutorial001_py310.py hl[7,9,14,20,22,27:28,31:33,38:39] *} |
{* ../../docs_src/extra_models/tutorial001_py310.py hl[7,9,14,20,22,27:28,31:33,38:39] *} |
||||
|
|
||||
/// info | Info |
### Über `**user_in.model_dump()` { #about-user-in-model-dump } |
||||
|
|
||||
In Pydantic v1 hieß die Methode `.dict()`, in Pydantic v2 wurde sie <abbr title="veraltet, obsolet: Es soll nicht mehr verwendet werden">deprecatet</abbr> (aber weiterhin unterstützt) und in `.model_dump()` umbenannt. |
#### Pydantics `.model_dump()` { #pydantics-model-dump } |
||||
|
|
||||
Die Beispiele hier verwenden `.dict()` für die Kompatibilität mit Pydantic v1, aber Sie sollten `.model_dump()` verwenden, wenn Sie Pydantic v2 verwenden können. |
|
||||
|
|
||||
/// |
|
||||
|
|
||||
### Über `**user_in.dict()` { #about-user-in-dict } |
|
||||
|
|
||||
#### Die `.dict()`-Methode von Pydantic { #pydantics-dict } |
|
||||
|
|
||||
`user_in` ist ein Pydantic-Modell der Klasse `UserIn`. |
`user_in` ist ein Pydantic-Modell der Klasse `UserIn`. |
||||
|
|
||||
Pydantic-Modelle haben eine `.dict()`-Methode, die ein <abbr title="Dictionary – Zuordnungstabelle: In anderen Sprachen auch Hash, Map, Objekt, Assoziatives Array genannt">`dict`</abbr> mit den Daten des Modells zurückgibt. |
Pydantic-Modelle haben eine `.model_dump()`-Methode, die ein <abbr title="Dictionary – Zuordnungstabelle: In anderen Sprachen auch Hash, Map, Objekt, Assoziatives Array genannt">`dict`</abbr> mit den Daten des Modells zurückgibt. |
||||
|
|
||||
Wenn wir also ein Pydantic-Objekt `user_in` erstellen, etwa so: |
Wenn wir also ein Pydantic-Objekt `user_in` erstellen, etwa so: |
||||
|
|
||||
@ -47,7 +39,7 @@ user_in = UserIn(username="john", password="secret", email="[email protected] |
|||||
und dann aufrufen: |
und dann aufrufen: |
||||
|
|
||||
```Python |
```Python |
||||
user_dict = user_in.dict() |
user_dict = user_in.model_dump() |
||||
``` |
``` |
||||
|
|
||||
haben wir jetzt ein `dict` mit den Daten in der Variablen `user_dict` (es ist ein `dict` statt eines Pydantic-Modellobjekts). |
haben wir jetzt ein `dict` mit den Daten in der Variablen `user_dict` (es ist ein `dict` statt eines Pydantic-Modellobjekts). |
||||
@ -103,20 +95,20 @@ UserInDB( |
|||||
|
|
||||
#### Ein Pydantic-Modell aus dem Inhalt eines anderen { #a-pydantic-model-from-the-contents-of-another } |
#### Ein Pydantic-Modell aus dem Inhalt eines anderen { #a-pydantic-model-from-the-contents-of-another } |
||||
|
|
||||
Da wir im obigen Beispiel `user_dict` von `user_in.dict()` bekommen haben, wäre dieser Code: |
Da wir im obigen Beispiel `user_dict` von `user_in.model_dump()` bekommen haben, wäre dieser Code: |
||||
|
|
||||
```Python |
```Python |
||||
user_dict = user_in.dict() |
user_dict = user_in.model_dump() |
||||
UserInDB(**user_dict) |
UserInDB(**user_dict) |
||||
``` |
``` |
||||
|
|
||||
gleichwertig zu: |
gleichwertig zu: |
||||
|
|
||||
```Python |
```Python |
||||
UserInDB(**user_in.dict()) |
UserInDB(**user_in.model_dump()) |
||||
``` |
``` |
||||
|
|
||||
... weil `user_in.dict()` ein `dict` ist, und dann lassen wir Python es „entpacken“, indem wir es an `UserInDB` mit vorangestelltem `**` übergeben. |
... weil `user_in.model_dump()` ein `dict` ist, und dann lassen wir Python es „entpacken“, indem wir es an `UserInDB` mit vorangestelltem `**` übergeben. |
||||
|
|
||||
Auf diese Weise erhalten wir ein Pydantic-Modell aus den Daten eines anderen Pydantic-Modells. |
Auf diese Weise erhalten wir ein Pydantic-Modell aus den Daten eines anderen Pydantic-Modells. |
||||
|
|
||||
@ -125,7 +117,7 @@ Auf diese Weise erhalten wir ein Pydantic-Modell aus den Daten eines anderen Pyd |
|||||
Und dann fügen wir das zusätzliche Schlüsselwort-Argument `hashed_password=hashed_password` hinzu, wie in: |
Und dann fügen wir das zusätzliche Schlüsselwort-Argument `hashed_password=hashed_password` hinzu, wie in: |
||||
|
|
||||
```Python |
```Python |
||||
UserInDB(**user_in.dict(), hashed_password=hashed_password) |
UserInDB(**user_in.model_dump(), hashed_password=hashed_password) |
||||
``` |
``` |
||||
|
|
||||
... was so ist wie: |
... was so ist wie: |
||||
@ -180,7 +172,6 @@ Wenn Sie eine <a href="https://docs.pydantic.dev/latest/concepts/types/#unions" |
|||||
|
|
||||
{* ../../docs_src/extra_models/tutorial003_py310.py hl[1,14:15,18:20,33] *} |
{* ../../docs_src/extra_models/tutorial003_py310.py hl[1,14:15,18:20,33] *} |
||||
|
|
||||
|
|
||||
### `Union` in Python 3.10 { #union-in-python-3-10 } |
### `Union` in Python 3.10 { #union-in-python-3-10 } |
||||
|
|
||||
In diesem Beispiel übergeben wir `Union[PlaneItem, CarItem]` als Wert des Arguments `response_model`. |
In diesem Beispiel übergeben wir `Union[PlaneItem, CarItem]` als Wert des Arguments `response_model`. |
||||
@ -203,7 +194,6 @@ Dafür verwenden Sie Pythons Standard-`typing.List` (oder nur `list` in Python 3 |
|||||
|
|
||||
{* ../../docs_src/extra_models/tutorial004_py39.py hl[18] *} |
{* ../../docs_src/extra_models/tutorial004_py39.py hl[18] *} |
||||
|
|
||||
|
|
||||
## Response mit beliebigem `dict` { #response-with-arbitrary-dict } |
## Response mit beliebigem `dict` { #response-with-arbitrary-dict } |
||||
|
|
||||
Sie können auch eine Response deklarieren, die ein beliebiges `dict` zurückgibt, indem Sie nur die Typen der Schlüssel und Werte ohne ein Pydantic-Modell deklarieren. |
Sie können auch eine Response deklarieren, die ein beliebiges `dict` zurückgibt, indem Sie nur die Typen der Schlüssel und Werte ohne ein Pydantic-Modell deklarieren. |
||||
@ -214,7 +204,6 @@ In diesem Fall können Sie `typing.Dict` verwenden (oder nur `dict` in Python 3. |
|||||
|
|
||||
{* ../../docs_src/extra_models/tutorial005_py39.py hl[6] *} |
{* ../../docs_src/extra_models/tutorial005_py39.py hl[6] *} |
||||
|
|
||||
|
|
||||
## Zusammenfassung { #recap } |
## Zusammenfassung { #recap } |
||||
|
|
||||
Verwenden Sie gerne mehrere Pydantic-Modelle und vererben Sie je nach Bedarf. |
Verwenden Sie gerne mehrere Pydantic-Modelle und vererben Sie je nach Bedarf. |
||||
|
|||||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue