diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 7de1590b1..a5761361d 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -40,6 +40,7 @@ jobs: - mkdocs.no-insiders.yml - .github/workflows/build-docs.yml - .github/workflows/deploy-docs.yml + - scripts/mkdocs_hooks.py langs: needs: - changes diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index ffa07b94d..2c432da8c 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -44,6 +44,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} COMMIT_SHA: ${{ github.event.workflow_run.head_sha }} RUN_ID: ${{ github.run_id }} + STATE: "pending" - name: Clean site run: | rm -rf ./site @@ -67,6 +68,14 @@ jobs: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} command: pages deploy ./site --project-name=${{ env.PROJECT_NAME }} --branch=${{ env.BRANCH }} + - name: Deploy Docs Status Error + if: failure() + run: python ./scripts/deploy_docs_status.py + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + COMMIT_SHA: ${{ github.event.workflow_run.head_sha }} + RUN_ID: ${{ github.run_id }} + STATE: "error" - name: Comment Deploy run: python ./scripts/deploy_docs_status.py env: @@ -74,4 +83,4 @@ jobs: DEPLOY_URL: ${{ steps.deploy.outputs.deployment-url }} COMMIT_SHA: ${{ github.event.workflow_run.head_sha }} RUN_ID: ${{ github.run_id }} - IS_DONE: "true" + STATE: "success" diff --git a/docs/az/docs/index.md b/docs/az/docs/index.md deleted file mode 100644 index 4e14d7060..000000000 --- a/docs/az/docs/index.md +++ /dev/null @@ -1,467 +0,0 @@ -
-- FastAPI framework, yüksək məshuldarlı, öyrənməsi asan, çevik kodlama, istifadəyə hazırdır -
- - ---- - -**Sənədlər**: https://fastapi.tiangolo.com - -**Qaynaq Kodu**: https://github.com/fastapi/fastapi - ---- - -FastAPI Python ilə API yaratmaq üçün standart Python tip məsləhətlərinə ə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ə otomatik tamamlama. 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): OpenAPI (əvvəlki adı ilə Swagger) və JSON Schema. - -* Bu fikirlər daxili development komandasının hazırladıqları məhsulların sınaqlarına əsaslanır. - -## Sponsorlar - - - -{% if sponsors %} -{% for sponsor in sponsors.gold -%} -async def...uvicorn main:app --reload əmri haqqında...email-validator - e-poçtun yoxlanılması üçün.
-* pydantic-settings - parametrlərin idarə edilməsi üçün.
-* pydantic-extra-types - Pydantic ilə istifadə edilə bilən əlavə tiplər üçün.
-
-Starlette tərəfindən istifadə olunanlar:
-
-* httpx - Əgər `TestClient` strukturundan istifadə edəcəksinizsə, tələb olunur.
-* jinja2 - Standart şablon konfiqurasiyasından istifadə etmək istəyirsinizsə, tələb olunur.
-* python-multipart - `request.form()` ilə forma "çevirmə" dəstəyindən istifadə etmək istəyirsinizsə, tələb olunur.
-* itsdangerous - `SessionMiddleware` dəstəyi üçün tələb olunur.
-* pyyaml - `SchemaGenerator` dəstəyi üçün tələb olunur (Çox güman ki, FastAPI istifadə edərkən buna ehtiyacınız olmayacaq).
-* ujson - `UJSONResponse` istifadə etmək istəyirsinizsə, tələb olunur.
-
-Həm FastAPI, həm də Starlette tərəfindən istifadə olunur:
-
-* uvicorn - Yaratdığımız proqramı servis edəcək veb server kimi fəaliyyət göstərir.
-* orjson - `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.
diff --git a/docs/az/docs/learn/index.md b/docs/az/docs/learn/index.md
deleted file mode 100644
index cc32108bf..000000000
--- a/docs/az/docs/learn/index.md
+++ /dev/null
@@ -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. 😎
diff --git a/docs/az/mkdocs.yml b/docs/az/mkdocs.yml
deleted file mode 100644
index de18856f4..000000000
--- a/docs/az/mkdocs.yml
+++ /dev/null
@@ -1 +0,0 @@
-INHERIT: ../en/mkdocs.yml
diff --git a/docs/bn/docs/about/index.md b/docs/bn/docs/about/index.md
deleted file mode 100644
index b6d611ae9..000000000
--- a/docs/bn/docs/about/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# সম্পর্কে
-
-**FastAPI** সম্পর্কে বিস্তারিত — এর ডিজাইন, অনুপ্রেরণা ও আরও অনেক কিছু। 🤓
diff --git a/docs/bn/docs/environment-variables.md b/docs/bn/docs/environment-variables.md
deleted file mode 100644
index 9122ca5bf..000000000
--- a/docs/bn/docs/environment-variables.md
+++ /dev/null
@@ -1,298 +0,0 @@
-# এনভায়রনমেন্ট ভেরিয়েবলস
-
-/// tip
-
-আপনি যদি "এনভায়রনমেন্ট ভেরিয়েবলস" কী এবং সেগুলো কীভাবে ব্যবহার করতে হয় সেটা জানেন, তাহলে এই অংশটি স্কিপ করে যেতে পারেন।
-
-///
-
-এনভায়রনমেন্ট ভেরিয়েবল (সংক্ষেপে "**env var**" নামেও পরিচিত) হলো এমন একটি ভেরিয়েবল যা পাইথন কোডের **বাইরে**, **অপারেটিং সিস্টেমে** থাকে এবং আপনার পাইথন কোড (বা অন্যান্য প্রোগ্রাম) দ্বারা যাকে রিড করা যায়।
-
-এনভায়রনমেন্ট ভেরিয়েবলস অ্যাপ্লিকেশনের **সেটিংস** পরিচালনা করতে, পাইথনের **ইনস্টলেশন** প্রক্রিয়ার অংশ হিসেবে, ইত্যাদি কাজে উপযোগী হতে পারে।
-
-## Env Vars তৈরী এবং ব্যবহার
-
-আপনি **শেল (টার্মিনাল)**-এ, পাইথনের প্রয়োজন ছাড়াই, এনভায়রনমেন্ট ভেরিয়েবলস **তৈরি** এবং ব্যবহার করতে পারবেনঃ
-
-//// tab | লিনাক্স, ম্যাকওএস, উইন্ডোজ Bash
-
-- FastAPI উচ্চক্ষমতা সম্পন্ন, সহজে শেখার এবং দ্রুত কোড করে প্রোডাকশনের জন্য ফ্রামওয়ার্ক। -
- - ---- - -**নির্দেশিকা নথি**: https://fastapi.tiangolo.com - -**সোর্স কোড**: https://github.com/fastapi/fastapi - ---- - -FastAPI একটি আধুনিক, দ্রুত ( বেশি ক্ষমতা ) সম্পন্ন, Python 3.6+ দিয়ে API তৈরির জন্য স্ট্যান্ডার্ড পাইথন টাইপ ইঙ্গিত ভিত্তিক ওয়েব ফ্রেমওয়ার্ক। - -এর মূল বৈশিষ্ট্য গুলো হলঃ - -- **গতি**: এটি **NodeJS** এবং **Go** এর মত কার্যক্ষমতা সম্পন্ন (Starlette এবং Pydantic এর সাহায্যে)। [পাইথন এর দ্রুততম ফ্রেমওয়ার্ক গুলোর মধ্যে এটি একটি](#_11)। -- **দ্রুত কোড করা**:বৈশিষ্ট্য তৈরির গতি ২০০% থেকে ৩০০% বৃদ্ধি করে৷ \* -- **স্বল্প bugs**: মানুব (ডেভেলপার) সৃষ্ট ত্রুটির প্রায় ৪০% হ্রাস করে। \* -- **স্বজ্ঞাত**: দুর্দান্ত এডিটর সাহায্য Completion নামেও পরিচিত। দ্রুত ডিবাগ করা যায়। - -- **সহজ**: এটি এমন ভাবে সজানো হয়েছে যেন নির্দেশিকা নথি পড়ে সহজে শেখা এবং ব্যবহার করা যায়। -- **সংক্ষিপ্ত**: কোড পুনরাবৃত্তি কমানোর পাশাপাশি, bug কমায় এবং প্রতিটি প্যারামিটার ঘোষণা থেকে একাধিক ফিচার পাওয়া যায় । -- **জোরালো**: স্বয়ংক্রিয় ভাবে তৈরি ক্রিয়াশীল নির্দেশনা নথি (documentation) সহ উৎপাদন উপযোগি (Production-ready) কোড পাওয়া যায়। -- **মান-ভিত্তিক**: এর ভিত্তি OpenAPI (যা পুর্বে Swagger নামে পরিচিত ছিল) এবং JSON Schema এর আদর্শের মানের ওপর - -\* উৎপাদনমুখি এপ্লিকেশন বানানোর এক দল ডেভেলপার এর মতামত ভিত্তিক ফলাফল। - -## স্পনসর গণ - - - -{% if sponsors %} -{% for sponsor in sponsors.gold -%} -async def...uvicorn main:app --reload...email-validator - ইমেল যাচাইকরণের জন্য।
-
-স্টারলেট দ্বারা ব্যবহৃত:
-
-- httpx - আপনি যদি `TestClient` ব্যবহার করতে চান তাহলে আবশ্যক।
-- jinja2 - আপনি যদি প্রদত্ত টেমপ্লেট রূপরেখা ব্যবহার করতে চান তাহলে প্রয়োজন।
-- python-multipart - আপনি যদি ফর্ম সহায়তা করতে চান তাহলে প্রয়োজন "parsing", `request.form()` সহ।
-- itsdangerous - `SessionMiddleware` সহায়তার জন্য প্রয়োজন।
-- pyyaml - স্টারলেটের SchemaGenerator সাপোর্ট এর জন্য প্রয়োজন (আপনার সম্ভাবত FastAPI প্রয়োজন নেই)।
-- graphene - `GraphQLApp` সহায়তার জন্য প্রয়োজন।
-
-FastAPI / Starlette দ্বারা ব্যবহৃত:
-
-- uvicorn - সার্ভারের জন্য যা আপনার অ্যাপ্লিকেশন লোড করে এবং পরিবেশন করে।
-- orjson - আপনি `ORJSONResponse` ব্যবহার করতে চাইলে প্রয়োজন।
-- ujson - আপনি `UJSONResponse` ব্যবহার করতে চাইলে প্রয়োজন।
-
-আপনি এই সব ইনস্টল করতে পারেন `pip install fastapi[all]` দিয়ে.
-
-## লাইসেন্স
-
-এই প্রজেক্ট MIT লাইসেন্স নীতিমালার অধীনে শর্তায়িত।
diff --git a/docs/bn/docs/learn/index.md b/docs/bn/docs/learn/index.md
deleted file mode 100644
index 4e4c62038..000000000
--- a/docs/bn/docs/learn/index.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# শিখুন
-
-এখানে **FastAPI** শিখার জন্য প্রাথমিক বিভাগগুলি এবং টিউটোরিয়ালগুলি রয়েছে।
-
-আপনি এটিকে একটি **বই**, একটি **কোর্স**, এবং FastAPI শিখার **অফিসিয়াল** এবং প্রস্তাবিত উপায় বিবেচনা করতে পারেন। 😎
diff --git a/docs/bn/docs/python-types.md b/docs/bn/docs/python-types.md
deleted file mode 100644
index d98c2ec87..000000000
--- a/docs/bn/docs/python-types.md
+++ /dev/null
@@ -1,586 +0,0 @@
-# পাইথন এর টাইপ্স পরিচিতি
-
-Python-এ ঐচ্ছিক "টাইপ হিন্ট" (যা "টাইপ অ্যানোটেশন" নামেও পরিচিত) এর জন্য সাপোর্ট রয়েছে।
-
-এই **"টাইপ হিন্ট"** বা অ্যানোটেশনগুলি এক ধরণের বিশেষ সিনট্যাক্স যা একটি ভেরিয়েবলের টাইপ ঘোষণা করতে দেয়।
-
-ভেরিয়েবলগুলির জন্য টাইপ ঘোষণা করলে, এডিটর এবং টুলগুলি আপনাকে আরও ভালো সাপোর্ট দিতে পারে।
-
-এটি পাইথন টাইপ হিন্ট সম্পর্কে একটি দ্রুত **টিউটোরিয়াল / রিফ্রেশার** মাত্র। এটি **FastAPI** এর সাথে ব্যবহার করার জন্য শুধুমাত্র ন্যূনতম প্রয়োজনীয়তা কভার করে... যা আসলে খুব একটা বেশি না।
-
-**FastAPI** এই টাইপ হিন্টগুলির উপর ভিত্তি করে নির্মিত, যা এটিকে অনেক সুবিধা এবং লাভ প্রদান করে।
-
-তবে, আপনি যদি কখনো **FastAPI** ব্যবহার নাও করেন, তবুও এগুলি সম্পর্কে একটু শেখা আপনার উপকারে আসবে।
-
-/// note
-
-যদি আপনি একজন Python বিশেষজ্ঞ হন, এবং টাইপ হিন্ট সম্পর্কে সবকিছু জানেন, তাহলে পরবর্তী অধ্যায়ে চলে যান।
-
-///
-
-## প্রেরণা
-
-চলুন একটি সাধারণ উদাহরণ দিয়ে শুরু করি:
-
-{* ../../docs_src/python_types/tutorial001.py *}
-
-
-এই প্রোগ্রামটি কল করলে আউটপুট হয়:
-
-```
-John Doe
-```
-
-ফাংশনটি নিম্নলিখিত কাজ করে:
-
-* `first_name` এবং `last_name` নেয়।
-* প্রতিটির প্রথম অক্ষরকে `title()` ব্যবহার করে বড় হাতের অক্ষরে রূপান্তর করে।
-* তাদেরকে মাঝখানে একটি স্পেস দিয়ে concatenate করে।
-
-{* ../../docs_src/python_types/tutorial001.py hl[2] *}
-
-
-### এটি সম্পাদনা করুন
-
-এটি একটি খুব সাধারণ প্রোগ্রাম।
-
-কিন্তু এখন কল্পনা করুন যে আপনি এটি শুরু থেকে লিখছিলেন।
-
-এক পর্যায়ে আপনি ফাংশনের সংজ্ঞা শুরু করেছিলেন, আপনার প্যারামিটারগুলি প্রস্তুত ছিল...
-
-কিন্তু তারপর আপনাকে "সেই method কল করতে হবে যা প্রথম অক্ষরকে বড় হাতের অক্ষরে রূপান্তর করে"।
-
-এটা কি `upper` ছিল? নাকি `uppercase`? `first_uppercase`? `capitalize`?
-
-তারপর, আপনি পুরোনো প্রোগ্রামারের বন্ধু, এডিটর অটোকমপ্লিশনের সাহায্যে নেওয়ার চেষ্টা করেন।
-
-আপনি ফাংশনের প্রথম প্যারামিটার `first_name` টাইপ করেন, তারপর একটি ডট (`.`) টাইপ করেন এবং `Ctrl+Space` চাপেন অটোকমপ্লিশন ট্রিগার করার জন্য।
-
-কিন্তু, দুর্ভাগ্যবশত, আপনি কিছুই উপযোগী পান না:
-
-
-
-### টাইপ যোগ করুন
-
-আসুন আগের সংস্করণ থেকে একটি লাইন পরিবর্তন করি।
-
-আমরা ঠিক এই অংশটি পরিবর্তন করব অর্থাৎ ফাংশনের প্যারামিটারগুলি, এইগুলি:
-
-```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` চাপেন এবং আপনি দেখতে পান:
-
-
-
-এর সাথে, আপনি অপশনগুলি দেখে, স্ক্রল করতে পারেন, যতক্ষণ না আপনি এমন একটি অপশন খুঁজে পান যা কিছু মনে পরিয়ে দেয়:
-
-
-
-## আরও প্রেরণা
-
-এই ফাংশনটি দেখুন, এটিতে ইতিমধ্যে টাইপ হিন্ট রয়েছে:
-
-{* ../../docs_src/python_types/tutorial003.py hl[1] *}
-
-
-এডিটর ভেরিয়েবলগুলির টাইপ জানার কারণে, আপনি শুধুমাত্র অটোকমপ্লিশনই পান না, আপনি এরর চেকও পান:
-
-
-
-এখন আপনি জানেন যে আপনাকে এটি ঠিক করতে হবে, `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` ওই টাইপের পরিবর্তে ব্যবহার করতে পারেন।
-
-///
-
-এর মাধ্যমে, আপনার এডিটর লিস্ট থেকে আইটেম প্রসেস করার সময় সাপোর্ট প্রদান করতে পারবে:
-
-
-
-টাইপগুলি ছাড়া, এটি করা প্রায় অসম্ভব।
-
-লক্ষ্য করুন যে ভেরিয়েবল `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-এ একটি **নতুন সিনট্যাক্স** আছে যেখানে আপনি সম্ভাব্য টাইপগুলিকে একটি ভার্টিকাল বার (`|`) দ্বারা পৃথক করতে পারেন।
-
-//// 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` জেনেরিকস ব্যবহার করার বিকল্প হিসেবে, আপনি টাইপগুলির ইউনিয়ন ঘোষণা করতে ভার্টিকাল বার (`|`) ব্যবহার করতে পারেন, যা ওদের থেকে অনেক ভালো এবং সহজ।
-
-////
-
-//// 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] *}
-
-
-এবং তারপর, আবার, আপনি এডিটর সাপোর্ট পেয়ে যাবেন:
-
-
-
-লক্ষ্য করুন যে এর মানে হল "`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 টাইপ হিন্ট সম্পর্কে বেসিক থেকে উন্নত লেভেলের ধারণা পেতে পারেন, যা আপনার কোডে টাইপ সেফটি এবং স্পষ্টতা বাড়াতে সাহায্য করবে।
-
-///
diff --git a/docs/bn/mkdocs.yml b/docs/bn/mkdocs.yml
deleted file mode 100644
index de18856f4..000000000
--- a/docs/bn/mkdocs.yml
+++ /dev/null
@@ -1 +0,0 @@
-INHERIT: ../en/mkdocs.yml
diff --git a/docs/en/docs/advanced/advanced-dependencies.md b/docs/en/docs/advanced/advanced-dependencies.md
index c71c11404..e0404b389 100644
--- a/docs/en/docs/advanced/advanced-dependencies.md
+++ b/docs/en/docs/advanced/advanced-dependencies.md
@@ -63,3 +63,91 @@ In the chapters about security, there are utility functions that are implemented
If you understood all this, you already know how those utility tools for security work underneath.
///
+
+## Dependencies with `yield`, `HTTPException`, `except` and Background Tasks { #dependencies-with-yield-httpexception-except-and-background-tasks }
+
+/// warning
+
+You most probably don't need these technical details.
+
+These details are useful mainly if you had a FastAPI application older than 0.118.0 and you are facing issues with dependencies with `yield`.
+
+///
+
+Dependencies with `yield` have evolved over time to account for the different use cases and to fix some issues, here's a summary of what has changed.
+
+### Dependencies with `yield` and `StreamingResponse`, Technical Details { #dependencies-with-yield-and-streamingresponse-technical-details }
+
+Before FastAPI 0.118.0, if you used a dependency with `yield`, it would run the exit code after the *path operation function* returned but right before sending the response.
+
+The intention was to avoid holding resources for longer than necessary, waiting for the response to travel through the network.
+
+This change also meant that if you returned a `StreamingResponse`, the exit code of the dependency with `yield` would have been already run.
+
+For example, if you had a database session in a dependency with `yield`, the `StreamingResponse` would not be able to use that session while streaming data because the session would have already been closed in the exit code after `yield`.
+
+This behavior was reverted in 0.118.0, to make the exit code after `yield` be executed after the response is sent.
+
+/// info
+
+As you will see below, this is very similar to the behavior before version 0.106.0, but with several improvements and bug fixes for corner cases.
+
+///
+
+#### Use Cases with Early Exit Code { #use-cases-with-early-exit-code }
+
+There are some use cases with specific conditions that could benefit from the old behavior of running the exit code of dependencies with `yield` before sending the response.
+
+For example, imagine you have code that uses a database session in a dependency with `yield` only to verify a user, but the database session is never used again in the *path operation function*, only in the dependency, **and** the response takes a long time to be sent, like a `StreamingResponse` that sends data slowly, but for some reason doesn't use the database.
+
+In this case, the database session would be held until the response is finished being sent, but if you don't use it, then it wouldn't be necessary to hold it.
+
+Here's how it could look like:
+
+{* ../../docs_src/dependencies/tutorial013_an_py310.py *}
+
+The exit code, the automatic closing of the `Session` in:
+
+{* ../../docs_src/dependencies/tutorial013_an_py310.py ln[19:21] *}
+
+...would be run after the the response finishes sending the slow data:
+
+{* ../../docs_src/dependencies/tutorial013_an_py310.py ln[30:38] hl[31:33] *}
+
+But as `generate_stream()` doesn't use the database session, it is not really necessary to keep the session open while sending the response.
+
+If you have this specific use case using SQLModel (or SQLAlchemy), you could explicitly close the session after you don't need it anymore:
+
+{* ../../docs_src/dependencies/tutorial014_an_py310.py ln[24:28] hl[28] *}
+
+That way the session would release the database connection, so other requests could use it.
+
+If you have a different use case that needs to exit early from a dependency with `yield`, please create a GitHub Discussion Question with your specific use case and why you would benefit from having early closing for dependencies with `yield`.
+
+If there are compelling use cases for early closing in dependencies with `yield`, I would consider adding a new way to opt in to early closing.
+
+### Dependencies with `yield` and `except`, Technical Details { #dependencies-with-yield-and-except-technical-details }
+
+Before FastAPI 0.110.0, if you used a dependency with `yield`, and then you captured an exception with `except` in that dependency, and you didn't raise the exception again, the exception would be automatically raised/forwarded to any exception handlers or the internal server error handler.
+
+This was changed in version 0.110.0 to fix unhandled memory consumption from forwarded exceptions without a handler (internal server errors), and to make it consistent with the behavior of regular Python code.
+
+### Background Tasks and Dependencies with `yield`, Technical Details { #background-tasks-and-dependencies-with-yield-technical-details }
+
+Before FastAPI 0.106.0, raising exceptions after `yield` was not possible, the exit code in dependencies with `yield` was executed *after* the response was sent, so [Exception Handlers](../handling-errors.md#install-custom-exception-handlers){.internal-link target=_blank} would have already run.
+
+This was designed this way mainly to allow using the same objects "yielded" by dependencies inside of background tasks, because the exit code would be executed after the background tasks were finished.
+
+This was changed in FastAPI 0.106.0 with the intention to not hold resources while waiting for the response to travel through the network.
+
+/// tip
+
+Additionally, a background task is normally an independent set of logic that should be handled separately, with its own resources (e.g. its own database connection).
+
+So, this way you will probably have cleaner code.
+
+///
+
+If you used to rely on this behavior, now you should create the resources for background tasks inside the background task itself, and use internally only data that doesn't depend on the resources of dependencies with `yield`.
+
+For example, instead of using the same database session, you would create a new database session inside of the background task, and you would obtain the objects from the database using this new session. And then instead of passing the object from the database as a parameter to the background task function, you would pass the ID of that object and then obtain the object again inside the background task function.
diff --git a/docs/en/docs/how-to/conditional-openapi.md b/docs/en/docs/how-to/conditional-openapi.md
index 833123e6a..e5893e584 100644
--- a/docs/en/docs/how-to/conditional-openapi.md
+++ b/docs/en/docs/how-to/conditional-openapi.md
@@ -17,7 +17,7 @@ If you want to secure your API, there are several better things you can do, for
* Make sure you have well defined Pydantic models for your request bodies and responses.
* Configure any required permissions and roles using dependencies.
* Never store plaintext passwords, only password hashes.
-* Implement and use well-known cryptographic tools, like Passlib and JWT tokens, etc.
+* Implement and use well-known cryptographic tools, like pwdlib and JWT tokens, etc.
* Add more granular permission controls with OAuth2 scopes where needed.
* ...etc.
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index fe1fac8cf..367746176 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -7,8 +7,34 @@ hide:
## Latest Changes
+### Translations
+
+* 🌐 Remove configuration files for inactive translations. PR [#14130](https://github.com/fastapi/fastapi/pull/14130) by [@tiangolo](https://github.com/tiangolo).
+
+### Internal
+
+* 👷 Update docs previews comment, single comment, add failure status. PR [#14129](https://github.com/fastapi/fastapi/pull/14129) by [@tiangolo](https://github.com/tiangolo).
+* 🔨 Modify `mkdocs_hooks.py` to add `title` to page's metadata (remove permalinks in social cards). PR [#14125](https://github.com/fastapi/fastapi/pull/14125) by [@YuriiMotov](https://github.com/YuriiMotov).
+
+## 0.118.0
+
+### Fixes
+
+* 🐛 Fix support for `StreamingResponse`s with dependencies with `yield` or `UploadFile`s, close after the response is done. PR [#14099](https://github.com/fastapi/fastapi/pull/14099) by [@tiangolo](https://github.com/tiangolo).
+
+Before FastAPI 0.118.0, if you used a dependency with `yield`, it would run the exit code after the *path operation function* returned but right before sending the response.
+
+This change also meant that if you returned a `StreamingResponse`, the exit code of the dependency with `yield` would have been already run.
+
+For example, if you had a database session in a dependency with `yield`, the `StreamingResponse` would not be able to use that session while streaming data because the session would have already been closed in the exit code after `yield`.
+
+This behavior was reverted in 0.118.0, to make the exit code after `yield` be executed after the response is sent.
+
+You can read more about it in the docs for [Advanced Dependencies - Dependencies with `yield`, `HTTPException`, `except` and Background Tasks](https://fastapi.tiangolo.com/advanced/advanced-dependencies#dependencies-with-yield-httpexception-except-and-background-tasks). Including what you could do if you wanted to close a database session earlier, before returning the response to the client.
+
### Docs
+* 📝 Update `tutorial/security/oauth2-jwt/` to use `pwdlib` with Argon2 instead of `passlib`. PR [#13917](https://github.com/fastapi/fastapi/pull/13917) by [@Neizvestnyj](https://github.com/Neizvestnyj).
* ✏️ Fix typos in OAuth2 password request forms. PR [#14112](https://github.com/fastapi/fastapi/pull/14112) by [@alv2017](https://github.com/alv2017).
* 📝 Update contributing guidelines for installing requirements. PR [#14095](https://github.com/fastapi/fastapi/pull/14095) by [@alejsdev](https://github.com/alejsdev).
diff --git a/docs/en/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/en/docs/tutorial/dependencies/dependencies-with-yield.md
index 2e2a6a8e3..adc1afa8d 100644
--- a/docs/en/docs/tutorial/dependencies/dependencies-with-yield.md
+++ b/docs/en/docs/tutorial/dependencies/dependencies-with-yield.md
@@ -35,7 +35,7 @@ The yielded value is what is injected into *path operations* and other dependenc
{* ../../docs_src/dependencies/tutorial007.py hl[4] *}
-The code following the `yield` statement is executed after creating the response but before sending it:
+The code following the `yield` statement is executed after the response:
{* ../../docs_src/dependencies/tutorial007.py hl[5:6] *}
@@ -51,7 +51,7 @@ You can use `async` or regular functions.
If you use a `try` block in a dependency with `yield`, you'll receive any exception that was thrown when using the dependency.
-For example, if some code at some point in the middle, in another dependency or in a *path operation*, made a database transaction "rollback" or create any other error, you will receive the exception in your dependency.
+For example, if some code at some point in the middle, in another dependency or in a *path operation*, made a database transaction "rollback" or created any other exception, you would receive the exception in your dependency.
So, you can look for that specific exception inside the dependency with `except SomeException`.
@@ -95,9 +95,11 @@ This works thanks to Python's
```console
-$ pip install "passlib[bcrypt]"
+$ pip install "pwdlib[argon2]"
---> 100%
```
@@ -86,7 +86,7 @@ $ pip install "passlib[bcrypt]"
/// tip
-With `passlib`, you could even configure it to be able to read passwords created by **Django**, a **Flask** security plug-in or many others.
+With `pwdlib`, you could even configure it to be able to read passwords created by **Django**, a **Flask** security plug-in or many others.
So, you would be able to, for example, share the same data from a Django application in a database with a FastAPI application. Or gradually migrate a Django application using the same database.
@@ -96,15 +96,15 @@ And your users would be able to login from your Django app or from your **FastAP
## Hash and verify the passwords { #hash-and-verify-the-passwords }
-Import the tools we need from `passlib`.
+Import the tools we need from `pwdlib`.
-Create a PassLib "context". This is what will be used to hash and verify passwords.
+Create a PasswordHash instance with recommended settings - it will be used for hashing and verifying passwords.
/// tip
-The PassLib context also has functionality to use different hashing algorithms, including deprecated old ones only to allow verifying them, etc.
+pwdlib also supports the bcrypt hashing algorithm but does not include legacy algorithms - for working with outdated hashes, it is recommended to use the passlib library.
-For example, you could use it to read and verify passwords generated by another system (like Django) but hash any new passwords with a different algorithm like Bcrypt.
+For example, you could use it to read and verify passwords generated by another system (like Django) but hash any new passwords with a different algorithm like Argon2 or Bcrypt.
And be compatible with all of them at the same time.
@@ -120,7 +120,7 @@ And another one to authenticate and return a user.
/// note
-If you check the new (fake) database `fake_users_db`, you will see how the hashed password looks like now: `"$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW"`.
+If you check the new (fake) database `fake_users_db`, you will see how the hashed password looks like now: `"$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc"`.
///
@@ -264,7 +264,7 @@ Many packages that simplify it a lot have to make many compromises with the data
It gives you all the flexibility to choose the ones that fit your project the best.
-And you can use directly many well maintained and widely used packages like `passlib` and `PyJWT`, because **FastAPI** doesn't require any complex mechanisms to integrate external packages.
+And you can use directly many well maintained and widely used packages like `pwdlib` and `PyJWT`, because **FastAPI** doesn't require any complex mechanisms to integrate external packages.
But it provides you the tools to simplify the process as much as possible without compromising flexibility, robustness, or security.
diff --git a/docs/en/mkdocs.yml b/docs/en/mkdocs.yml
index 27b229590..e85f31102 100644
--- a/docs/en/mkdocs.yml
+++ b/docs/en/mkdocs.yml
@@ -303,10 +303,6 @@ extra:
alternate:
- link: /
name: en - English
- - link: /az/
- name: az - azərbaycan dili
- - link: /bn/
- name: bn - বাংলা
- link: /de/
name: de - Deutsch
- link: /es/
@@ -315,22 +311,10 @@ extra:
name: fa - فارسی
- link: /fr/
name: fr - français
- - link: /he/
- name: he - עברית
- - link: /hu/
- name: hu - magyar
- - link: /id/
- name: id - Bahasa Indonesia
- - link: /it/
- name: it - italiano
- link: /ja/
name: ja - 日本語
- link: /ko/
name: ko - 한국어
- - link: /nl/
- name: nl - Nederlands
- - link: /pl/
- name: pl - Polski
- link: /pt/
name: pt - português
- link: /ru/
@@ -339,12 +323,8 @@ extra:
name: tr - Türkçe
- link: /uk/
name: uk - українська мова
- - link: /ur/
- name: ur - اردو
- link: /vi/
name: vi - Tiếng Việt
- - link: /yo/
- name: yo - Yorùbá
- link: /zh/
name: zh - 简体中文
- link: /zh-hant/
diff --git a/docs/he/docs/index.md b/docs/he/docs/index.md
deleted file mode 100644
index 14ea82f5e..000000000
--- a/docs/he/docs/index.md
+++ /dev/null
@@ -1,469 +0,0 @@
-# FastAPI
-
-
-
-
-- תשתית FastAPI, ביצועים גבוהים, קלה ללמידה, מהירה לתכנות, מוכנה לסביבת ייצור -
- - ---- - -**תיעוד**: https://fastapi.tiangolo.com - -**קוד**: https://github.com/fastapi/fastapi - ---- - -FastAPI היא תשתית רשת מודרנית ומהירה (ביצועים גבוהים) לבניית ממשקי תכנות יישומים (API) עם פייתון 3.6+ בהתבסס על רמזי טיפוסים סטנדרטיים. - -תכונות המפתח הן: - -- **מהירה**: ביצועים גבוהים מאוד, בקנה אחד עם NodeJS ו - Go (תודות ל - Starlette ו - Pydantic). [אחת מתשתיות הפייתון המהירות ביותר](#_14). - -- **מהירה לתכנות**: הגבירו את מהירות פיתוח התכונות החדשות בכ - %200 עד %300. \* -- **פחות שגיאות**: מנעו כ - %40 משגיאות אנוש (מפתחים). \* -- **אינטואיטיבית**: תמיכת עורך מעולה. השלמה בכל מקום. פחות זמן ניפוי שגיאות. -- **קלה**: מתוכננת להיות קלה לשימוש וללמידה. פחות זמן קריאת תיעוד. -- **קצרה**: מזערו שכפול קוד. מספר תכונות מכל הכרזת פרמטר. פחות שגיאות. -- **חסונה**: קבלו קוד מוכן לסביבת ייצור. עם תיעוד אינטרקטיבי אוטומטי. -- **מבוססת סטנדרטים**: מבוססת על (ותואמת לחלוטין ל -) הסטדנרטים הפתוחים לממשקי תכנות יישומים: OpenAPI (ידועים לשעבר כ - Swagger) ו - JSON Schema. - -\* הערכה מבוססת על בדיקות של צוות פיתוח פנימי שבונה אפליקציות בסביבת ייצור. - -## נותני חסות - - - -{% if sponsors %} -{% for sponsor in sponsors.gold -%} -async def...uvicorn main:app --reload...app = FastAPI().
-- --reload: גרמו לשרת להתאתחל לאחר שינויים בקוד. עשו זאת רק בסביבת פיתוח.
-
-/items/{item_id}.
-- שני ה _נתיבים_ מקבלים _בקשות_ `GET` (ידועות גם כ*מתודות* HTTP).
-- ה _נתיב_ /items/{item_id} כולל \*פרמטר נתיב\_ `item_id` שאמור להיות `int`.
-- ה _נתיב_ /items/{item_id} \*פרמטר שאילתא\_ אופציונלי `q`.
-
-### תיעוד API אינטרקטיבי
-
-כעת פנו לכתובת http://127.0.0.1:8000/docs.
-
-אתם תראו את התיעוד האוטומטי (מסופק על ידי Swagger UI):
-
-
-
-### תיעוד אלטרנטיבי
-
-כעת פנו לכתובת http://127.0.0.1:8000/redoc.
-
-אתם תראו תיעוד אלטרנטיבי (מסופק על ידי ReDoc):
-
-
-
-## שדרוג לדוגמא
-
-כעת ערכו את הקובץ `main.py` כך שיוכל לקבל גוף מבקשת `PUT`.
-
-הגדירו את הגוף בעזרת רמזי טיפוסים סטנדרטיים, הודות ל - `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}
-```
-
-השרת אמול להתאתחל אוטומטית (מאחר והוספתם --reload לפקודת `uvicorn` שלמעלה).
-
-### שדרוג התיעוד האינטרקטיבי
-
-כעת פנו לכתובת http://127.0.0.1:8000/docs.
-
-- התיעוד האוטומטי יתעדכן, כולל הגוף החדש:
-
-
-
-- לחצו על הכפתור "Try it out", הוא יאפשר לכם למלא את הפרמטרים ולעבוד ישירות מול ה - API.
-
-
-
-- אחר כך לחצו על הכפתור "Execute", האתר יתקשר עם ה - API שלכם, ישלח את הפרמטרים, ישיג את התוצאות ואז יראה אותן על המסך:
-
-
-
-### שדרוג התיעוד האלטרנטיבי
-
-כעת פנו לכתובת http://127.0.0.1:8000/redoc.
-
-- התיעוד האלטרנטיבי גם יראה את פרמטר השאילתא והגוף החדשים.
-
-
-
-### סיכום
-
-לסיכום, אתם מכריזים ** פעם אחת** על טיפוסי הפרמטרים, גוף וכו' כפרמטרים לפונקציה.
-
-אתם עושים את זה עם טיפוסי פייתון מודרניים.
-
-אתם לא צריכים ללמוד תחביר חדש, מתודות או מחלקות של ספרייה ספיציפית, וכו'
-
-רק **פייתון 3.6+** סטנדרטי.
-
-לדוגמא, ל - `int`:
-
-```Python
-item_id: int
-```
-
-או למודל `Item` מורכב יותר:
-
-```Python
-item: Item
-```
-
-...ועם הכרזת הטיפוס האחת הזו אתם מקבלים:
-
-- תמיכת עורך, כולל:
- - השלמות.
- - בדיקת טיפוסים.
-- אימות מידע:
- - שגיאות ברורות ואטומטיות כאשר מוכנס מידע לא חוקי .
- - אימות אפילו לאובייקטי JSON מקוננים.
-- המרה של מידע קלט: המרה של מידע שמגיע מהרשת למידע וטיפוסים של פייתון. קורא מ:
- - JSON.
- - פרמטרי נתיב.
- - פרמטרי שאילתא.
- - עוגיות.
- - כותרות.
- - טפסים.
- - קבצים.
-- המרה של מידע פלט: המרה של מידע וטיפוסים מפייתון למידע רשת (כ - JSON):
- - המירו טיפוסי פייתון (`str`, `int`, `float`, `bool`, `list`, etc).
- - עצמי `datetime`.
- - עצמי `UUID`.
- - מודלי בסיסי נתונים.
- - ...ורבים אחרים.
-- תיעוד API אוטומטי ואינטרקטיבית כולל שתי אלטרנטיבות לממשק המשתמש:
- - Swagger UI.
- - ReDoc.
-
----
-
-בחזרה לדוגמאת הקוד הקודמת, **FastAPI** ידאג:
-
-- לאמת שיש `item_id` בנתיב בבקשות `GET` ו - `PUT`.
-- לאמת שה - `item_id` הוא מטיפוס `int` בבקשות `GET` ו - `PUT`.
- - אם הוא לא, הלקוח יראה שגיאה ברורה ושימושית.
-- לבדוק האם קיים פרמטר שאילתא בשם `q` (קרי `http://127.0.0.1:8000/items/foo?q=somequery`) לבקשות `GET`.
- - מאחר והפרמטר `q` מוגדר עם = None, הוא אופציונלי.
- - לולא ה - `None` הוא היה חובה (כמו הגוף במקרה של `PUT`).
-- לבקשות `PUT` לנתיב /items/{item_id}, לקרוא את גוף הבקשה כ - JSON:
- - לאמת שהוא כולל את מאפיין החובה `name` שאמור להיות מטיפוס `str`.
- - לאמת שהוא כולל את מאפיין החובה `price` שחייב להיות מטיפוס `float`.
- - לבדוק האם הוא כולל את מאפיין הרשות `is_offer` שאמור להיות מטיפוס `bool`, אם הוא נמצא.
- - כל זה יעבוד גם לאובייקט JSON מקונן.
-- להמיר מ - JSON ול- JSON אוטומטית.
-- לתעד הכל באמצעות OpenAPI, תיעוד שבו יוכלו להשתמש:
- - מערכות תיעוד אינטרקטיביות.
- - מערכות ייצור קוד אוטומטיות, להרבה שפות.
-- לספק ישירות שתי מערכות תיעוד רשתיות.
-
----
-
-רק גרדנו את קצה הקרחון, אבל כבר יש לכם רעיון של איך הכל עובד.
-
-נסו לשנות את השורה:
-
-```Python
- return {"item_name": item.name, "item_id": item_id}
-```
-
-...מ:
-
-```Python
- ... "item_name": item.name ...
-```
-
-...ל:
-
-```Python
- ... "item_price": item.price ...
-```
-
-...וראו איך העורך שלכם משלים את המאפיינים ויודע את הטיפוסים שלהם:
-
-
-
-לדוגמא יותר שלמה שכוללת עוד תכונות, ראו את המדריך - למשתמש.
-
-**התראת ספוילרים**: המדריך - למשתמש כולל:
-
-- הכרזה על **פרמטרים** ממקורות אחרים ושונים כגון: **כותרות**, **עוגיות**, **טפסים** ו - **קבצים**.
-- איך לקבוע **מגבלות אימות** בעזרת `maximum_length` או `regex`.
-- דרך חזקה וקלה להשתמש ב**הזרקת תלויות**.
-- אבטחה והתאמתות, כולל תמיכה ב - **OAuth2** עם **JWT** והתאמתות **HTTP Basic**.
-- טכניקות מתקדמות (אבל קלות באותה מידה) להכרזת אובייקטי JSON מקוננים (תודות ל - Pydantic).
-- אינטרקציה עם **GraphQL** דרך Strawberry וספריות אחרות.
-- תכונות נוספות רבות (תודות ל - Starlette) כגון:
- - **WebSockets**
- - בדיקות קלות במיוחד מבוססות על `requests` ו - `pytest`
- - **CORS**
- - **Cookie Sessions**
- - ...ועוד.
-
-## ביצועים
-
-בדיקות עצמאיות של TechEmpower הראו שאפליקציות **FastAPI** שרצות תחת Uvicorn הן מתשתיות הפייתון המהירות ביותר, רק מתחת ל - Starlette ו - Uvicorn עצמן (ש - FastAPI מבוססת עליהן). (\*)
-
-כדי להבין עוד על הנושא, ראו את הפרק Benchmarks.
-
-## תלויות אופציונליות
-
-בשימוש Pydantic:
-
-- email-validator - לאימות כתובות אימייל.
-
-בשימוש Starlette:
-
-- httpx - דרוש אם ברצונכם להשתמש ב - `TestClient`.
-- jinja2 - דרוש אם ברצונכם להשתמש בברירת המחדל של תצורת הטמפלייטים.
-- python-multipart - דרוש אם ברצונכם לתמוך ב "פרסור" טפסים, באצמעות request.form().
-- itsdangerous - דרוש אם ברצונכם להשתמש ב - `SessionMiddleware`.
-- pyyaml - דרוש אם ברצונכם להשתמש ב - `SchemaGenerator` של Starlette (כנראה שאתם לא צריכים את זה עם FastAPI).
-
-בשימוש FastAPI / Starlette:
-
-- uvicorn - לשרת שטוען ומגיש את האפליקציה שלכם.
-- orjson - דרוש אם ברצונכם להשתמש ב - `ORJSONResponse`.
-- ujson - דרוש אם ברצונכם להשתמש ב - `UJSONResponse`.
-
-תוכלו להתקין את כל אלו באמצעות pip install "fastapi[all]".
-
-## רשיון
-
-הפרויקט הזה הוא תחת התנאים של רשיון MIT.
diff --git a/docs/he/mkdocs.yml b/docs/he/mkdocs.yml
deleted file mode 100644
index de18856f4..000000000
--- a/docs/he/mkdocs.yml
+++ /dev/null
@@ -1 +0,0 @@
-INHERIT: ../en/mkdocs.yml
diff --git a/docs/hu/docs/index.md b/docs/hu/docs/index.md
deleted file mode 100644
index f60b6b349..000000000
--- a/docs/hu/docs/index.md
+++ /dev/null
@@ -1,467 +0,0 @@
-
-- FastAPI keretrendszer, nagy teljesítmény, könnyen tanulható, gyorsan kódolható, productionre kész -
- - ---- - -**Dokumentáció**: https://fastapi.tiangolo.com - -**Forrás kód**: https://github.com/fastapi/fastapi - ---- -A FastAPI egy modern, gyors (nagy teljesítményű), webes keretrendszer API-ok építéséhez Python -al, a Python szabványos típusjelöléseire építve. - - -Kulcs funkciók: - -* **Gyors**: Nagyon nagy teljesítmény, a **NodeJS**-el és a **Go**-val egyenrangú (a Starlettenek és a Pydantic-nek köszönhetően). [Az egyik leggyorsabb Python keretrendszer](#performance). -* **Gyorsan kódolható**: A funkciók fejlesztési sebességét 200-300 százalékkal megnöveli. * -* **Kevesebb hiba**: Körülbelül 40%-al csökkenti az emberi (fejlesztői) hibák számát. * -* **Intuitív**: Kiváló szerkesztő támogatás. Kiegészítés mindenhol. Kevesebb hibakereséssel töltött idő. -* **Egyszerű**: Egyszerű tanulásra és használatra tervezve. Kevesebb dokumentáció olvasással töltött idő. -* **Rövid**: Kód duplikáció minimalizálása. Több funkció minden paraméter deklarálásával. Kevesebb hiba. -* **Robosztus**: Production ready kód. Automatikus interaktív dokumentáció val. -* **Szabvány alapú**: Az API-ok nyílt szabványaira alapuló (és azokkal teljesen kompatibilis): OpenAPI (korábban Swagger néven ismert) és a JSON Schema. - -* Egy production alkalmazásokat építő belső fejlesztői csapat tesztjein alapuló becslés. - -## Szponzorok - - - -{% if sponsors %} -{% for sponsor in sponsors.gold -%} -async def-et...uvicorn main:app --reload...email-validator - e-mail validációkra.
-* pydantic-settings - Beállítások követésére.
-* pydantic-extra-types - Extra típusok Pydantic-hoz.
-
-Starlette által használt:
-
-* httpx - Követelmény ha a `TestClient`-et akarod használni.
-* jinja2 - Követelmény ha az alap template konfigurációt akarod használni.
-* python-multipart - Követelmény ha "parsing"-ot akarsz támogatni, `request.form()`-al.
-* itsdangerous - Követelmény `SessionMiddleware` támogatáshoz.
-* pyyaml - Követelmény a Starlette `SchemaGenerator`-ának támogatásához (valószínűleg erre nincs szükség FastAPI használása esetén).
-
-FastAPI / Starlette által használt
-
-* uvicorn - Szerverekhez amíg betöltik és szolgáltatják az applikációdat.
-* orjson - Követelmény ha `ORJSONResponse`-t akarsz használni.
-* ujson - Követelmény ha `UJSONResponse`-t akarsz használni.
-
-Ezeket mind telepítheted a `pip install "fastapi[all]"` paranccsal.
-
-## Licensz
-Ez a projekt az MIT license, licensz alatt fut
diff --git a/docs/hu/mkdocs.yml b/docs/hu/mkdocs.yml
deleted file mode 100644
index de18856f4..000000000
--- a/docs/hu/mkdocs.yml
+++ /dev/null
@@ -1 +0,0 @@
-INHERIT: ../en/mkdocs.yml
diff --git a/docs/id/docs/index.md b/docs/id/docs/index.md
deleted file mode 100644
index b29d42dfd..000000000
--- a/docs/id/docs/index.md
+++ /dev/null
@@ -1,495 +0,0 @@
-# FastAPI
-
-
-
-
-- FastAPI, framework performa tinggi, mudah dipelajari, cepat untuk coding, siap untuk pengembangan -
- - ---- - -**Dokumentasi**: https://fastapi.tiangolo.com - -**Kode Sumber**: https://github.com/fastapi/fastapi - ---- - -FastAPI adalah *framework* *web* moderen, cepat (performa-tinggi) untuk membangun API dengan Python berdasarkan tipe petunjuk Python. - -Fitur utama FastAPI: - -* **Cepat**: Performa sangat tinggi, setara **NodeJS** dan **Go** (berkat Starlette dan Pydantic). [Salah satu *framework* Python tercepat yang ada](#performa). -* **Cepat untuk coding**: Meningkatkan kecepatan pengembangan fitur dari 200% sampai 300%. * -* **Sedikit bug**: Mengurangi hingga 40% kesalahan dari manusia (pemrogram). * -* **Intuitif**: Dukungan editor hebat. Penyelesaian di mana pun. Lebih sedikit *debugging*. -* **Mudah**: Dibuat mudah digunakan dan dipelajari. Sedikit waktu membaca dokumentasi. -* **Ringkas**: Mengurasi duplikasi kode. Beragam fitur dari setiap deklarasi parameter. Lebih sedikit *bug*. -* **Handal**: Dapatkan kode siap-digunakan. Dengan dokumentasi otomatis interaktif. -* **Standar-resmi**: Berdasarkan (kompatibel dengan ) standar umum untuk API: OpenAPI (sebelumnya disebut Swagger) dan JSON Schema. - -* estimasi berdasarkan pengujian tim internal pengembangan applikasi siap pakai. - -## Sponsor - - - -{% if sponsors %} -{% for sponsor in sponsors.gold -%} -async def...fastapi dev main.py...email-validator - untuk validasi email.
-
-Digunakan oleh Starlette:
-
-* httpx - Dibutuhkan jika anda menggunakan `TestClient`.
-* jinja2 - Dibutuhkan jika anda menggunakan konfigurasi template bawaan.
-* python-multipart - Dibutuhkan jika anda menggunakan form dukungan "parsing", dengan `request.form()`.
-
-Digunakan oleh FastAPI / Starlette:
-
-* uvicorn - untuk server yang memuat dan melayani aplikasi anda. Termasuk `uvicorn[standard]`, yang memasukan sejumlah dependensi (misal `uvloop`) untuk needed melayani dengan performa tinggi.
-* `fastapi-cli` - untuk menyediakan perintah `fastapi`.
-
-### Tanpda dependensi `standard`
-
-Jika anda tidak ingin menambahkan dependensi opsional `standard`, anda dapat menggunakan `pip install fastapi` daripada `pip install "fastapi[standard]"`.
-
-### Dependensi Opsional Tambahan
-
-Ada beberapa dependensi opsional yang bisa anda install.
-
-Dependensi opsional tambahan Pydantic:
-
-* pydantic-settings - untuk manajemen setting.
-* pydantic-extra-types - untuk tipe tambahan yang digunakan dengan Pydantic.
-
-Dependensi tambahan opsional FastAPI:
-
-* orjson - Diperlukan jika anda akan menggunakan`ORJSONResponse`.
-* ujson - Diperlukan jika anda akan menggunakan `UJSONResponse`.
-
-## Lisensi
-
-Project terlisensi dengan lisensi MIT.
diff --git a/docs/id/docs/tutorial/first-steps.md b/docs/id/docs/tutorial/first-steps.md
deleted file mode 100644
index 9b461507d..000000000
--- a/docs/id/docs/tutorial/first-steps.md
+++ /dev/null
@@ -1,332 +0,0 @@
-# Langkah Pertama
-
-File FastAPI yang paling sederhana bisa seperti berikut:
-
-{* ../../docs_src/first_steps/tutorial001.py *}
-
-Salin file tersebut ke `main.py`.
-
-Jalankan di server:
-
-get
-
-/// info | `@decorator` Info
-
-Sintaksis `@sesuatu` di Python disebut "dekorator".
-
-Dekorator ditempatkan di atas fungsi. Seperti sebuah topi cantik (Saya pikir istilah ini berasal dari situ).
-
-"dekorator" memanggil dan bekerja dengan fungsi yang ada di bawahnya
-
-Pada kondisi ini, dekorator ini memberi tahu **FastAPI** bahwa fungsi di bawah nya berhubungan dengan **path** `/` dengan **operasi** `get`.
-
-Sehingga disebut **dekorator operasi path**.
-
-///
-
-Operasi lainnya yang bisa digunakan:
-
-* `@app.post()`
-* `@app.put()`
-* `@app.delete()`
-
-Dan operasi unik lainnya:
-
-* `@app.options()`
-* `@app.head()`
-* `@app.patch()`
-* `@app.trace()`
-
-/// tip | Tips
-
-Jika anda bisa menggunakan operasi apa saja (metode HTTP).
-
-**FastAPI** tidak mengharuskan anda menggunakan operasi tertentu.
-
-Informasi di sini hanyalah sebagai panduan, bukan keharusan.
-
-Sebagai contoh, ketika menggunakan GraphQL, semua operasi umumnya hanya menggunakan `POST`.
-
-///
-
-### Langkah 4: mendefinisikan **fungsi operasi path**
-
-Ini "**fungsi operasi path**" kita:
-
-* **path**: adalah `/`.
-* **operasi**: adalah `get`.
-* **fungsi**: adalah fungsi yang ada di bawah dekorator (di bawah `@app.get("/")`).
-
-{* ../../docs_src/first_steps/tutorial001.py hl[7] *}
-
-Ini adalah fungsi Python.
-
-Fungsi ini dipanggil **FastAPI** setiap kali menerima request ke URL "`/`" dengan operasi `GET`.
-
-Di kondisi ini, ini adalah sebuah fungsi `async`.
-
----
-
-Anda bisa mendefinisikan fungsi ini sebagai fungsi normal daripada `async def`:
-
-{* ../../docs_src/first_steps/tutorial003.py hl[7] *}
-
-/// note | Catatan
-
-Jika anda tidak tahu perbedaannya, kunjungi [Async: *"Panduan cepat"*](../async.md#in-a-hurry){.internal-link target=_blank}.
-
-///
-
-### Langkah 5: hasilkan konten
-
-{* ../../docs_src/first_steps/tutorial001.py hl[8] *}
-
-Anda bisa menghasilkan `dict`, `list`, nilai singular seperti `str`, `int`, dll.
-
-Anda juga bisa menghasilkan model Pydantic (anda akan belajar mengenai ini nanti).
-
-Ada banyak objek dan model yang secara otomatis dikonversi ke JSON (termasuk ORM, dll). Anda bisa menggunakan yang anda suka, kemungkinan sudah didukung.
-
-## Ringkasan
-
-* Impor `FastAPI`.
-* Buat sebuah instance `app`.
-* Tulis **dekorator operasi path** menggunakan dekorator seperti `@app.get("/")`.
-* Definisikan **fungsi operasi path**; sebagai contoh, `def root(): ...`.
-* Jalankan server development dengan perintah `fastapi dev`.
diff --git a/docs/id/docs/tutorial/index.md b/docs/id/docs/tutorial/index.md
deleted file mode 100644
index c01ec9a89..000000000
--- a/docs/id/docs/tutorial/index.md
+++ /dev/null
@@ -1,83 +0,0 @@
-# Tutorial - Pedoman Pengguna - Pengenalan
-
-Tutorial ini menunjukan cara menggunakan ***FastAPI*** dengan semua fitur-fiturnya, tahap demi tahap.
-
-Setiap bagian dibangun secara bertahap dari bagian sebelumnya, tetapi terstruktur untuk memisahkan banyak topik, sehingga kamu bisa secara langsung menuju ke topik spesifik untuk menyelesaikan kebutuhan API tertentu.
-
-Ini juga dibangun untuk digunakan sebagai referensi yang akan datang.
-
-Sehingga kamu dapat kembali lagi dan mencari apa yang kamu butuhkan dengan tepat.
-
-## Jalankan kode
-
-Semua blok-blok kode dapat disalin dan digunakan langsung (Mereka semua sebenarnya adalah file python yang sudah teruji).
-
-Untuk menjalankan setiap contoh, salin kode ke file `main.py`, dan jalankan `uvicorn` dengan:
-
-
-
-/// check | Periksa
-
-Dengan deklarasi tipe data Python yang sama, **FastAPI** membuat dokumentasi interaktif otomatis (terintegrasi Swagger UI).
-
-Perhatikan parameter path dideklarasikan sebagai integer.
-
-///
-
-## Keuntungan basis-standar, dokumentasi alternatif
-
-Karena skema yang dibuat berasal dari standar OpenAPI, maka banyak alat lain yang kompatibel.
-
-Sehingga **FastAPI** menyediakan dokumentasi alternatif (menggunakan ReDoc), yang bisa diakses di http://127.0.0.1:8000/redoc:
-
-
-
-Cara yang sama untuk menggunakan tools kompatibel lainnya. Termasuk alat membuat kode otomatis untuk banyak bahasa.
-
-## Pydantic
-
-Semua validasi data dikerjakan di belakang layar oleh Pydantic, sehingga anda mendapatkan banyak kemudahan. Anda juga tahu proses ini akan ditangani dengan baik.
-
-Anda bisa mendeklarasikan tipe data dengan `str`, `float`, `bool` dan banyak tipe data kompleks lainnya.
-
-Beberapa tipe di atas akan dibahas pada bab berikutnya tutorial ini.
-
-## Urutan berpengaruh
-
-Ketika membuat *operasi path*, anda bisa menghadapi kondisi dimana *path* nya sudah tetap.
-
-Seperti `/users/me`, untuk mendapatkan data user yang sedang aktif.
-
-Kemudian anda bisa memiliki path `/users/{user_id}` untuk mendapatkan data user tertentu melalui user ID.
-
-karena *operasi path* dievaluasi melalui urutan, anda harus memastikan path untuk `/users/me` dideklarasikan sebelum `/user/{user_id}`:
-
-{* ../../docs_src/path_params/tutorial003.py hl[6,11] *}
-
-Sebaliknya, path `/users/{user_id}` juga akan sesuai dengan `/users/me`, "menganggap" menerima parameter `user_id` dengan nilai `"me"`.
-
-Serupa, anda juga tidak bisa mendefinisikan operasi path:
-
-{* ../../docs_src/path_params/tutorial003b.py hl[6,11] *}
-
-Path pertama akan selalu digunakan karena path sesuai dengan yang pertama.
-
-## Nilai terdefinisi
-
-Jika ada *operasi path* yang menerima *parameter path*, tetapi anda ingin nilai valid *parameter path* sudah terdefinisi, anda bisa menggunakan standar Python `Enum`.
-
-### Membuat class `Enum`
-
-Import `Enum` dan buat *sub-class* warisan dari `str` dan `Enum`.
-
-Dengan warisan dari `str` dokumen API mengetahui nilai nya harus berjenis `string` supaya bisa digunakan dengan benar.
-
-Kemudian buat atribut *class* dengan nilai tetap *string* yang benar:
-
-{* ../../docs_src/path_params/tutorial005.py hl[1,6:9] *}
-
-/// info
-
-Enumerasi (atau enum) tersedia di Python sejak versi 3.4.
-
-///
-
-/// tip | Tips
-
-"AlxexNet", "ResNet", dan "LeNet" adalah nama model *Machine Learning*.
-
-///
-
-### Mendeklarasikan *parameter path*
-
-Kemudian buat *parameter path* dengan tipe anotasi menggunakan *class* enum dari (`ModelName`)
-
-{* ../../docs_src/path_params/tutorial005.py hl[16] *}
-
-### Periksa dokumentasi
-
-Karena nilai yang tersedia untuk *parameter path* telah terdefinisi, dokumen interatik bisa memunculkan:
-
-
-
-### Bekerja dengan *enumarasi* Python
-
-Nilai *parameter path* akan menjadi *anggota enumerasi*.
-
-#### Membandingkan *anggota enumerasi*
-
-Anda bisa membandingkan parameter *path* dengan *anggota enumerasi* di enum `ModelName` yang anda buat:
-
-{* ../../docs_src/path_params/tutorial005.py hl[17] *}
-
-#### Mendapatkan *nilai enumerasi*
-
-Anda bisa mendapatkan nilai (`str` dalam kasus ini) menggunakan `model_name.value`, atau secara umum `anggota_enum_anda.value`:
-
-{* ../../docs_src/path_params/tutorial005.py hl[20] *}
-
-/// tip | Tips
-
-Anda bisa mengakses nilai `"lenet"` dnegan `ModelName.lenet.value`.
-
-///
-
-#### Menghasilkan *anggota enumerasi*
-
-Anda bisa menghasilkan *anggota enumerasi* dari *operasi path* bahkan di body JSON bersarang (contoh `dict`).
-
-They will be converted to their corresponding values (strings in this case) before returning them to the client:
-
-{* ../../docs_src/path_params/tutorial005.py hl[18,21,23] *}
-
-Klien akan mendapatkan respon JSON seperti berikut:
-
-```JSON
-{
- "model_name": "alexnet",
- "message": "Deep Learning FTW!"
-}
-```
-
-## Parameter path berisi path
-
-Misalkan terdapat *operasi path* dengan path `/files/{file_path}`.
-
-Tetapi anda memerlukan `file_path` itu berisi *path*, seperti like `home/johndoe/myfile.txt`.
-
-Sehingga URL untuk file tersebut akan seperti: `/files/home/johndoe/myfile.txt`.
-
-### Dukungan OpenAPI
-
-OpenAPI tidak bisa mendeklarasikan *parameter path* berisi *path* di dalamnya, karena menyebabkan kondisi yang sulit di*test* dan didefinisikan.
-
-Tetapi, di **FastAPI** anda tetap bisa melakukannya dengan menggunakan *tools* internal dari Starlette.
-
-Dan dokumentasi tetap berfungsi walaupun tidak menambahkan keterangan bahwa parameter harus berisi *path*.
-
-### Konverter path
-
-Melalui Starlette anda bisa mendeklarasikan *parameter path* berisi *path* dengan URL seperti:
-
-```
-/files/{file_path:path}
-```
-
-Dikondisi ini nama parameter adalah `file_path` dan bagian terakhir `:path` menginformasikan parameter harus sesuai dengan setiap *path*.
-
-Sehingga anda bisa menggunakan:
-
-{* ../../docs_src/path_params/tutorial004.py hl[6] *}
-
-/// tip | Tips
-
-Anda mungkin perlu parameter berisi `/home/johndoe/myfile.txt` di awali garis belakang (`/`).
-
-Di kondisi ini, URL nya menjadi: `/files//home/johndoe/myfile.txt`, dengan dua garis belakang (`//`) di antara `files` dan `home`.
-
-///
-
-## Ringkasan
-
-Di **FastAPI** dengan menggunakan deklarasi tipe Python standar, pendek, intuitif, anda mendapatkan:
-
-* Dukungan editor: pemeriksaan kesalahan, autocompletion, dll.
-* "Parsing" data.
-* Validasi data.
-* Annotasi API dan dokumentasi otomatis.
-
-Semua itu anda hanya perlu mendeklarasikan sekali saja.
-
-Ini adalah salah satu keunggulan **FastAPI** dibandingkan dengan *framework* lainnya (selain dari performa Python *native*c)
diff --git a/docs/id/docs/tutorial/static-files.md b/docs/id/docs/tutorial/static-files.md
deleted file mode 100644
index b55f31394..000000000
--- a/docs/id/docs/tutorial/static-files.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# Berkas Statis
-
-Anda dapat menyajikan berkas statis secara otomatis dari sebuah direktori menggunakan `StaticFiles`.
-
-## Penggunaan `StaticFiles`
-
-* Mengimpor `StaticFiles`.
-* "Mount" representatif `StaticFiles()` di jalur spesifik.
-
-{* ../../docs_src/static_files/tutorial001.py hl[2,6] *}
-
-/// note | Detail Teknis
-
-Anda dapat pula menggunakan `from starlette.staticfiles import StaticFiles`.
-
-**FastAPI** menyediakan `starlette.staticfiles` sama seperti `fastapi.staticfiles` sebagai kemudahan pada Anda, yaitu para pengembang. Tetapi ini asli berasal langsung dari Starlette.
-
-///
-
-### Apa itu "Mounting"
-
-"Mounting" dimaksud menambah aplikasi "independen" secara lengkap di jalur spesifik, kemudian menangani seluruh sub-jalur.
-
-Hal ini berbeda dari menggunakan `APIRouter` karena aplikasi yang dimount benar-benar independen. OpenAPI dan dokumentasi dari aplikasi utama Anda tak akan menyertakan apa pun dari aplikasi yang dimount, dst.
-
-Anda dapat mempelajari mengenai ini dalam [Panduan Pengguna Lanjutan](../advanced/index.md){.internal-link target=_blank}.
-
-## Detail
-
-Terhadap `"/static"` pertama mengacu pada sub-jalur yang akan menjadi tempat "sub-aplikasi" ini akan "dimount". Maka, jalur apa pun yang dimulai dengan `"/static"` akan ditangani oleh sub-jalur tersebut.
-
-Terhadap `directory="static"` mengacu pada nama direktori yang berisi berkas statis Anda.
-
-Terhadap `name="static"` ialah nama yang dapat digunakan secara internal oleh **FastAPI**.
-
-Seluruh parameter ini dapat berbeda dari sekadar "`static`", sesuaikan parameter dengan keperluan dan detail spesifik akan aplikasi Anda.
-
-## Info lanjutan
-
-Sebagai detail dan opsi tambahan lihat dokumentasi Starlette perihal Berkas Statis.
diff --git a/docs/id/mkdocs.yml b/docs/id/mkdocs.yml
deleted file mode 100644
index de18856f4..000000000
--- a/docs/id/mkdocs.yml
+++ /dev/null
@@ -1 +0,0 @@
-INHERIT: ../en/mkdocs.yml
diff --git a/docs/it/docs/index.md b/docs/it/docs/index.md
deleted file mode 100644
index 7214df8a8..000000000
--- a/docs/it/docs/index.md
+++ /dev/null
@@ -1,463 +0,0 @@
-
-- FastAPI framework, alte prestazioni, facile da imparare, rapido da implementare, pronto per il rilascio in produzione -
- - - ---- - -**Documentazione**: https://fastapi.tiangolo.com - -**Codice Sorgente**: https://github.com/fastapi/fastapi - ---- - -FastAPI è un web framework moderno e veloce (a prestazioni elevate) che serve a creare API con Python 3.6+ basato sulle annotazioni di tipo di Python. - -Le sue caratteristiche principali sono: - -* **Velocità**: Prestazioni molto elevate, alla pari di **NodeJS** e **Go** (grazie a Starlette e Pydantic). [Uno dei framework Python più veloci in circolazione](#performance). -* **Veloce da programmare**: Velocizza il lavoro consentendo il rilascio di nuove funzionalità tra il 200% e il 300% più rapidamente. * -* **Meno bug**: Riduce di circa il 40% gli errori che commettono gli sviluppatori durante la scrittura del codice. * -* **Intuitivo**: Grande supporto per gli editor di testo con autocompletamento in ogni dove. In questo modo si può dedicare meno tempo al debugging. -* **Facile**: Progettato per essere facile da usare e imparare. Si riduce il tempo da dedicare alla lettura della documentazione. -* **Sintentico**: Minimizza la duplicazione di codice. Molteplici funzionalità, ognuna con la propria dichiarazione dei parametri. Meno errori. -* **Robusto**: Crea codice pronto per la produzione con documentazione automatica interattiva. -* **Basato sugli standard**: Basato su (e completamente compatibile con) gli open standard per le API: OpenAPI (precedentemente Swagger) e JSON Schema. - -* Stima basata sull'esito di test eseguiti su codice sorgente di applicazioni rilasciate in produzione da un team interno di sviluppatori. - -## Sponsor - - - -{% if sponsors %} -{% for sponsor in sponsors.gold -%} -async def...uvicorn main:app --reload...email-validator - per la validazione di email.
-
-Usate da Starlette:
-
-* requests - Richiesto se vuoi usare il `TestClient`.
-* aiofiles - Richiesto se vuoi usare `FileResponse` o `StaticFiles`.
-* jinja2 - Richiesto se vuoi usare la configurazione template di default.
-* python-multipart - Richiesto se vuoi supportare il "parsing" con `request.form()`.
-* itsdangerous - Richiesto per usare `SessionMiddleware`.
-* pyyaml - Richiesto per il supporto dello `SchemaGenerator` di Starlette (probabilmente non ti serve con FastAPI).
-* graphene - Richiesto per il supporto di `GraphQLApp`.
-
-Usate da FastAPI / Starlette:
-
-* uvicorn - per il server che carica e serve la tua applicazione.
-* orjson - ichiesto se vuoi usare `ORJSONResponse`.
-* ujson - Richiesto se vuoi usare `UJSONResponse`.
-
-Puoi installarle tutte con `pip install fastapi[all]`.
-
-## Licenza
-
-Questo progetto è concesso in licenza in base ai termini della licenza MIT.
diff --git a/docs/it/mkdocs.yml b/docs/it/mkdocs.yml
deleted file mode 100644
index de18856f4..000000000
--- a/docs/it/mkdocs.yml
+++ /dev/null
@@ -1 +0,0 @@
-INHERIT: ../en/mkdocs.yml
diff --git a/docs/nl/docs/environment-variables.md b/docs/nl/docs/environment-variables.md
deleted file mode 100644
index f6b3d285b..000000000
--- a/docs/nl/docs/environment-variables.md
+++ /dev/null
@@ -1,298 +0,0 @@
-# Omgevingsvariabelen
-
-/// tip
-
-Als je al weet wat "omgevingsvariabelen" zijn en hoe je ze kunt gebruiken, kun je deze stap gerust overslaan.
-
-///
-
-Een omgevingsvariabele (ook bekend als "**env var**") is een variabele die **buiten** de Python-code leeft, in het **besturingssysteem** en die door je Python-code (of door andere programma's) kan worden gelezen.
-
-Omgevingsvariabelen kunnen nuttig zijn voor het bijhouden van applicatie **instellingen**, als onderdeel van de **installatie** van Python, enz.
-
-## Omgevingsvariabelen maken en gebruiken
-
-Je kunt omgevingsvariabelen **maken** en gebruiken in de **shell (terminal)**, zonder dat je Python nodig hebt:
-
-//// tab | Linux, macOS, Windows Bash
-
-- FastAPI framework, zeer goede prestaties, eenvoudig te leren, snel te programmeren, klaar voor productie -
- - ---- - -**Documentatie**: https://fastapi.tiangolo.com - -**Broncode**: https://github.com/tiangolo/fastapi - ---- - -FastAPI is een modern, snel (zeer goede prestaties), web framework voor het bouwen van API's in Python, gebruikmakend van standaard Python type-hints. - -De belangrijkste kenmerken zijn: - -* **Snel**: Zeer goede prestaties, vergelijkbaar met **NodeJS** en **Go** (dankzij Starlette en Pydantic). [Een van de snelste beschikbare Python frameworks](#prestaties). -* **Snel te programmeren**: Verhoog de snelheid om functionaliteit te ontwikkelen met ongeveer 200% tot 300%. * -* **Minder bugs**: Verminder ongeveer 40% van de door mensen (ontwikkelaars) veroorzaakte fouten. * -* **Intuïtief**: Buitengewoon goede ondersteuning voor editors. Overal automische code aanvulling. Minder tijd kwijt aan debuggen. -* **Eenvoudig**: Ontworpen om gemakkelijk te gebruiken en te leren. Minder tijd nodig om documentatie te lezen. -* **Kort**: Minimaliseer codeduplicatie. Elke parameterdeclaratie ondersteunt meerdere functionaliteiten. Minder bugs. -* **Robust**: Code gereed voor productie. Met automatische interactieve documentatie. -* **Standards-based**: Gebaseerd op (en volledig verenigbaar met) open standaarden voor API's: OpenAPI (voorheen bekend als Swagger) en JSON Schema. - -* schatting op basis van testen met een intern ontwikkelteam en bouwen van productieapplicaties. - -## Sponsors - - - -{% if sponsors %} -{% for sponsor in sponsors.gold -%} -async def...fastapi dev main.py...email_validator - voor email validatie.
-
-Gebruikt door Starlette:
-
-* httpx - Vereist indien je de `TestClient` wil gebruiken.
-* jinja2 - Vereist als je de standaard templateconfiguratie wil gebruiken.
-* python-multipart - Vereist indien je "parsen" van formulieren wil ondersteunen met `requests.form()`.
-
-Gebruikt door FastAPI / Starlette:
-
-* uvicorn - voor de server die jouw applicatie laadt en bedient.
-* `fastapi-cli` - om het `fastapi` commando te voorzien.
-
-### Zonder `standard` Afhankelijkheden
-
-Indien je de optionele `standard` afhankelijkheden niet wenst te installeren, kan je installeren met `pip install fastapi` in plaats van `pip install "fastapi[standard]"`.
-
-### Bijkomende Optionele Afhankelijkheden
-
-Er zijn nog een aantal bijkomende afhankelijkheden die je eventueel kan installeren.
-
-Bijkomende optionele afhankelijkheden voor Pydantic:
-
-* pydantic-settings - voor het beheren van settings.
-* pydantic-extra-types - voor extra data types die gebruikt kunnen worden met Pydantic.
-
-Bijkomende optionele afhankelijkheden voor FastAPI:
-
-* orjson - Vereist indien je `ORJSONResponse` wil gebruiken.
-* ujson - Vereist indien je `UJSONResponse` wil gebruiken.
-
-## Licentie
-
-Dit project is gelicenseerd onder de voorwaarden van de MIT licentie.
diff --git a/docs/nl/docs/python-types.md b/docs/nl/docs/python-types.md
deleted file mode 100644
index fb8b1e5fd..000000000
--- a/docs/nl/docs/python-types.md
+++ /dev/null
@@ -1,587 +0,0 @@
-# Introductie tot Python Types
-
-Python biedt ondersteuning voor optionele "type hints" (ook wel "type annotaties" genoemd).
-
-Deze **"type hints"** of annotaties zijn een speciale syntax waarmee het type van een variabele kan worden gedeclareerd.
-
-Door types voor je variabelen te declareren, kunnen editors en hulpmiddelen je beter ondersteunen.
-
-Dit is slechts een **korte tutorial/opfrisser** over Python type hints. Het behandelt enkel het minimum dat nodig is om ze te gebruiken met **FastAPI**... en dat is relatief weinig.
-
-**FastAPI** is helemaal gebaseerd op deze type hints, ze geven veel voordelen.
-
-Maar zelfs als je **FastAPI** nooit gebruikt, heb je er baat bij om er iets over te leren.
-
-/// note
-
-Als je een Python expert bent en alles al weet over type hints, sla dan dit hoofdstuk over.
-
-///
-
-## Motivatie
-
-Laten we beginnen met een eenvoudig voorbeeld:
-
-{* ../../docs_src/python_types/tutorial001.py *}
-
-
-Het aanroepen van dit programma leidt tot het volgende resultaat:
-
-```
-John Doe
-```
-
-De functie voert het volgende uit:
-
-* Neem een `first_name` en een `last_name`
-* Converteer de eerste letter van elk naar een hoofdletter met `title()`.
-``
-* Voeg samen met een spatie in het midden.
-
-{* ../../docs_src/python_types/tutorial001.py hl[2] *}
-
-
-### Bewerk het
-
-Dit is een heel eenvoudig programma.
-
-Maar stel je nu voor dat je het vanaf nul zou moeten maken.
-
-Op een gegeven moment zou je aan de definitie van de functie zijn begonnen, je had de parameters klaar...
-
-Maar dan moet je “die methode die de eerste letter naar hoofdletters converteert” aanroepen.
-
-Was het `upper`? Was het `uppercase`? `first_uppercase`? `capitalize`?
-
-Dan roep je de hulp in van je oude programmeursvriend, (automatische) code aanvulling in je editor.
-
-Je typt de eerste parameter van de functie, `first_name`, dan een punt (`.`) en drukt dan op `Ctrl+Spatie` om de aanvulling te activeren.
-
-Maar helaas krijg je niets bruikbaars:
-
-
-
-### Types toevoegen
-
-Laten we een enkele regel uit de vorige versie aanpassen.
-
-We zullen precies dit fragment, de parameters van de functie, wijzigen van:
-
-```Python
- first_name, last_name
-```
-
-naar:
-
-```Python
- first_name: str, last_name: str
-```
-
-Dat is alles.
-
-Dat zijn de "type hints":
-
-{* ../../docs_src/python_types/tutorial002.py hl[1] *}
-
-
-Dit is niet hetzelfde als het declareren van standaardwaarden zoals bij:
-
-```Python
- first_name="john", last_name="doe"
-```
-
-Het is iets anders.
-
-We gebruiken dubbele punten (`:`), geen gelijkheidstekens (`=`).
-
-Het toevoegen van type hints verandert normaal gesproken niet wat er gebeurt in je programma t.o.v. wat er zonder type hints zou gebeuren.
-
-Maar stel je voor dat je weer bezig bent met het maken van een functie, maar deze keer met type hints.
-
-Op hetzelfde moment probeer je de automatische aanvulling te activeren met `Ctrl+Spatie` en je ziet:
-
-
-
-Nu kun je de opties bekijken en er doorheen scrollen totdat je de optie vindt die “een belletje doet rinkelen”:
-
-
-
-### Meer motivatie
-
-Bekijk deze functie, deze heeft al type hints:
-
-{* ../../docs_src/python_types/tutorial003.py hl[1] *}
-
-
-Omdat de editor de types van de variabelen kent, krijgt u niet alleen aanvulling, maar ook controles op fouten:
-
-
-
-Nu weet je hoe je het moet oplossen, converteer `age` naar een string met `str(age)`:
-
-{* ../../docs_src/python_types/tutorial004.py hl[2] *}
-
-
-## Types declareren
-
-Je hebt net de belangrijkste plek om type hints te declareren gezien. Namelijk als functieparameters.
-
-Dit is ook de belangrijkste plek waar je ze gebruikt met **FastAPI**.
-
-### Eenvoudige types
-
-Je kunt alle standaard Python types declareren, niet alleen `str`.
-
-Je kunt bijvoorbeeld het volgende gebruiken:
-
-* `int`
-* `float`
-* `bool`
-* `bytes`
-
-{* ../../docs_src/python_types/tutorial005.py hl[1] *}
-
-
-### Generieke types met typeparameters
-
-Er zijn enkele datastructuren die andere waarden kunnen bevatten, zoals `dict`, `list`, `set` en `tuple` en waar ook de interne waarden hun eigen type kunnen hebben.
-
-Deze types die interne types hebben worden “**generieke**” types genoemd. Het is mogelijk om ze te declareren, zelfs met hun interne types.
-
-Om deze types en de interne types te declareren, kun je de standaard Python module `typing` gebruiken. Deze module is speciaal gemaakt om deze type hints te ondersteunen.
-
-#### Nieuwere versies van Python
-
-De syntax met `typing` is **verenigbaar** met alle versies, van Python 3.6 tot aan de nieuwste, inclusief Python 3.9, Python 3.10, enz.
-
-Naarmate Python zich ontwikkelt, worden **nieuwere versies**, met verbeterde ondersteuning voor deze type annotaties, beschikbaar. In veel gevallen hoef je niet eens de `typing` module te importeren en te gebruiken om de type annotaties te declareren.
-
-Als je een recentere versie van Python kunt kiezen voor je project, kun je profiteren van die extra eenvoud.
-
-In alle documentatie staan voorbeelden die compatibel zijn met elke versie van Python (als er een verschil is).
-
-Bijvoorbeeld “**Python 3.6+**” betekent dat het compatibel is met Python 3.6 of hoger (inclusief 3.7, 3.8, 3.9, 3.10, etc). En “**Python 3.9+**” betekent dat het compatibel is met Python 3.9 of hoger (inclusief 3.10, etc).
-
-Als je de **laatste versies van Python** kunt gebruiken, gebruik dan de voorbeelden voor de laatste versie, die hebben de **beste en eenvoudigste syntax**, bijvoorbeeld “**Python 3.10+**”.
-
-#### List
-
-Laten we bijvoorbeeld een variabele definiëren als een `list` van `str`.
-
-//// tab | Python 3.9+
-
-Declareer de variabele met dezelfde dubbele punt (`:`) syntax.
-
-Als type, vul `list` in.
-
-Doordat de list een type is dat enkele interne types bevat, zet je ze tussen vierkante haakjes:
-
-```Python hl_lines="1"
-{!> ../../docs_src/python_types/tutorial006_py39.py!}
-```
-
-////
-
-//// tab | Python 3.8+
-
-Van `typing`, importeer `List` (met een hoofdletter `L`):
-
-```Python hl_lines="1"
-{!> ../../docs_src/python_types/tutorial006.py!}
-```
-
-Declareer de variabele met dezelfde dubbele punt (`:`) syntax.
-
-Zet als type de `List` die je hebt geïmporteerd uit `typing`.
-
-Doordat de list een type is dat enkele interne types bevat, zet je ze tussen vierkante haakjes:
-
-```Python hl_lines="4"
-{!> ../../docs_src/python_types/tutorial006.py!}
-```
-
-////
-
-/// info
-
-De interne types tussen vierkante haakjes worden “typeparameters” genoemd.
-
-In dit geval is `str` de typeparameter die wordt doorgegeven aan `List` (of `list` in Python 3.9 en hoger).
-
-///
-
-Dat betekent: “de variabele `items` is een `list`, en elk van de items in deze list is een `str`”.
-
-/// tip
-
-Als je Python 3.9 of hoger gebruikt, hoef je `List` niet te importeren uit `typing`, je kunt in plaats daarvan hetzelfde reguliere `list` type gebruiken.
-
-///
-
-Door dat te doen, kan je editor ondersteuning bieden, zelfs tijdens het verwerken van items uit de list:
-
-
-
-Zonder types is dat bijna onmogelijk om te bereiken.
-
-Merk op dat de variabele `item` een van de elementen is in de lijst `items`.
-
-Toch weet de editor dat het een `str` is, en biedt daar vervolgens ondersteuning voor aan.
-
-#### Tuple en Set
-
-Je kunt hetzelfde doen om `tuple`s en `set`s te declareren:
-
-//// 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!}
-```
-
-////
-
-Dit betekent:
-
-* De variabele `items_t` is een `tuple` met 3 items, een `int`, nog een `int`, en een `str`.
-* De variabele `items_s` is een `set`, en elk van de items is van het type `bytes`.
-
-#### Dict
-
-Om een `dict` te definiëren, geef je 2 typeparameters door, gescheiden door komma's.
-
-De eerste typeparameter is voor de sleutels (keys) van de `dict`.
-
-De tweede typeparameter is voor de waarden (values) van het `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!}
-```
-
-////
-
-Dit betekent:
-
-* De variabele `prices` is een `dict`:
- * De sleutels van dit `dict` zijn van het type `str` (bijvoorbeeld de naam van elk item).
- * De waarden van dit `dict` zijn van het type `float` (bijvoorbeeld de prijs van elk item).
-
-#### Union
-
-Je kunt een variable declareren die van **verschillende types** kan zijn, bijvoorbeeld een `int` of een `str`.
-
-In Python 3.6 en hoger (inclusief Python 3.10) kun je het `Union`-type van `typing` gebruiken en de mogelijke types die je wilt accepteren, tussen de vierkante haakjes zetten.
-
-In Python 3.10 is er ook een **nieuwe syntax** waarin je de mogelijke types kunt scheiden door een verticale balk (`|`).
-
-//// 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!}
-```
-
-////
-
-In beide gevallen betekent dit dat `item` een `int` of een `str` kan zijn.
-
-#### Mogelijk `None`
-
-Je kunt declareren dat een waarde een type kan hebben, zoals `str`, maar dat het ook `None` kan zijn.
-
-In Python 3.6 en hoger (inclusief Python 3.10) kun je het declareren door `Optional` te importeren en te gebruiken vanuit de `typing`-module.
-
-```Python hl_lines="1 4"
-{!../../docs_src/python_types/tutorial009.py!}
-```
-
-Door `Optional[str]` te gebruiken in plaats van alleen `str`, kan de editor je helpen fouten te detecteren waarbij je ervan uit zou kunnen gaan dat een waarde altijd een `str` is, terwijl het in werkelijkheid ook `None` zou kunnen zijn.
-
-`Optional[EenType]` is eigenlijk een snelkoppeling voor `Union[EenType, None]`, ze zijn equivalent.
-
-Dit betekent ook dat je in Python 3.10 `EenType | None` kunt gebruiken:
-
-//// 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+ alternative
-
-```Python hl_lines="1 4"
-{!> ../../docs_src/python_types/tutorial009b.py!}
-```
-
-////
-
-#### Gebruik van `Union` of `Optional`
-
-Als je een Python versie lager dan 3.10 gebruikt, is dit een tip vanuit mijn **subjectieve** standpunt:
-
-* 🚨 Vermijd het gebruik van `Optional[EenType]`.
-* Gebruik in plaats daarvan **`Union[EenType, None]`** ✨.
-
-Beide zijn gelijkwaardig en onderliggend zijn ze hetzelfde, maar ik zou `Union` aanraden in plaats van `Optional` omdat het woord “**optional**” lijkt te impliceren dat de waarde optioneel is, en het eigenlijk betekent “het kan `None` zijn”, zelfs als het niet optioneel is en nog steeds vereist is.
-
-Ik denk dat `Union[SomeType, None]` explicieter is over wat het betekent.
-
-Het gaat alleen om de woorden en naamgeving. Maar die naamgeving kan invloed hebben op hoe jij en je teamgenoten over de code denken.
-
-Laten we als voorbeeld deze functie nemen:
-
-{* ../../docs_src/python_types/tutorial009c.py hl[1,4] *}
-
-
-De parameter `name` is gedefinieerd als `Optional[str]`, maar is **niet optioneel**, je kunt de functie niet aanroepen zonder de parameter:
-
-```Python
-say_hi() # Oh, nee, dit geeft een foutmelding! 😱
-```
-
-De `name` parameter is **nog steeds vereist** (niet *optioneel*) omdat het geen standaardwaarde heeft. Toch accepteert `name` `None` als waarde:
-
-```Python
-say_hi(name=None) # Dit werkt, None is geldig 🎉
-```
-
-Het goede nieuws is dat als je eenmaal Python 3.10 gebruikt, je je daar geen zorgen meer over hoeft te maken, omdat je dan gewoon `|` kunt gebruiken om unions van types te definiëren:
-
-{* ../../docs_src/python_types/tutorial009c_py310.py hl[1,4] *}
-
-
-Dan hoef je je geen zorgen te maken over namen als `Optional` en `Union`. 😎
-
-#### Generieke typen
-
-De types die typeparameters in vierkante haakjes gebruiken, worden **Generieke types** of **Generics** genoemd, bijvoorbeeld:
-
-//// tab | Python 3.10+
-
-Je kunt dezelfde ingebouwde types gebruiken als generics (met vierkante haakjes en types erin):
-
-* `list`
-* `tuple`
-* `set`
-* `dict`
-
-Hetzelfde als bij Python 3.8, uit de `typing`-module:
-
-* `Union`
-* `Optional` (hetzelfde als bij Python 3.8)
-* ...en anderen.
-
-In Python 3.10 kun je , als alternatief voor de generieke `Union` en `Optional`, de verticale lijn (`|`) gebruiken om unions van typen te voorzien, dat is veel beter en eenvoudiger.
-
-////
-
-//// tab | Python 3.9+
-
-Je kunt dezelfde ingebouwde types gebruiken als generieke types (met vierkante haakjes en types erin):
-
-* `list`
-* `tuple`
-* `set`
-* `dict`
-
-En hetzelfde als met Python 3.8, vanuit de `typing`-module:
-
-* `Union`
-* `Optional`
-* ...en anderen.
-
-////
-
-//// tab | Python 3.8+
-
-* `List`
-* `Tuple`
-* `Set`
-* `Dict`
-* `Union`
-* `Optional`
-* ...en anderen.
-
-////
-
-### Klassen als types
-
-Je kunt een klasse ook declareren als het type van een variabele.
-
-Stel dat je een klasse `Person` hebt, met een naam:
-
-{* ../../docs_src/python_types/tutorial010.py hl[1:3] *}
-
-
-Vervolgens kun je een variabele van het type `Persoon` declareren:
-
-{* ../../docs_src/python_types/tutorial010.py hl[6] *}
-
-
-Dan krijg je ook nog eens volledige editorondersteuning:
-
-
-
-Merk op dat dit betekent dat "`one_person` een **instantie** is van de klasse `Person`".
-
-Dit betekent niet dat `one_person` de **klasse** is met de naam `Person`.
-
-## Pydantic modellen
-
-Pydantic is een Python-pakket voor het uitvoeren van datavalidatie.
-
-Je declareert de "vorm" van de data als klassen met attributen.
-
-Elk attribuut heeft een type.
-
-Vervolgens maak je een instantie van die klasse met een aantal waarden en het valideert de waarden, converteert ze naar het juiste type (als dat het geval is) en geeft je een object met alle data terug.
-
-Daarnaast krijg je volledige editorondersteuning met dat resulterende object.
-
-Een voorbeeld uit de officiële Pydantic-documentatie:
-
-//// 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
-
-Om meer te leren over Pydantic, bekijk de documentatie.
-
-///
-
-**FastAPI** is volledig gebaseerd op Pydantic.
-
-Je zult veel meer van dit alles in de praktijk zien in de [Tutorial - Gebruikershandleiding](tutorial/index.md){.internal-link target=_blank}.
-
-/// tip
-
-Pydantic heeft een speciaal gedrag wanneer je `Optional` of `Union[EenType, None]` gebruikt zonder een standaardwaarde, je kunt er meer over lezen in de Pydantic-documentatie over Verplichte optionele velden.
-
-///
-
-## Type Hints met Metadata Annotaties
-
-Python heeft ook een functie waarmee je **extra metadata** in deze type hints kunt toevoegen met behulp van `Annotated`.
-
-//// tab | Python 3.9+
-
-In Python 3.9 is `Annotated` onderdeel van de standaardpakket, dus je kunt het importeren vanuit `typing`.
-
-```Python hl_lines="1 4"
-{!> ../../docs_src/python_types/tutorial013_py39.py!}
-```
-
-////
-
-//// tab | Python 3.8+
-
-In versies lager dan Python 3.9 importeer je `Annotated` vanuit `typing_extensions`.
-
-Het wordt al geïnstalleerd met **FastAPI**.
-
-```Python hl_lines="1 4"
-{!> ../../docs_src/python_types/tutorial013.py!}
-```
-
-////
-
-Python zelf doet niets met deze `Annotated` en voor editors en andere hulpmiddelen is het type nog steeds een `str`.
-
-Maar je kunt deze ruimte in `Annotated` gebruiken om **FastAPI** te voorzien van extra metadata over hoe je wilt dat je applicatie zich gedraagt.
-
-Het belangrijkste om te onthouden is dat **de eerste *typeparameter*** die je doorgeeft aan `Annotated` het **werkelijke type** is. De rest is gewoon metadata voor andere hulpmiddelen.
-
-Voor nu hoef je alleen te weten dat `Annotated` bestaat en dat het standaard Python is. 😎
-
-Later zul je zien hoe **krachtig** het kan zijn.
-
-/// tip
-
-Het feit dat dit **standaard Python** is, betekent dat je nog steeds de **best mogelijke ontwikkelaarservaring** krijgt in je editor, met de hulpmiddelen die je gebruikt om je code te analyseren en te refactoren, enz. ✨
-
-Daarnaast betekent het ook dat je code zeer verenigbaar zal zijn met veel andere Python-hulpmiddelen en -pakketten. 🚀
-
-///
-
-## Type hints in **FastAPI**
-
-**FastAPI** maakt gebruik van type hints om verschillende dingen te doen.
-
-Met **FastAPI** declareer je parameters met type hints en krijg je:
-
-* **Editor ondersteuning**.
-* **Type checks**.
-
-...en **FastAPI** gebruikt dezelfde declaraties om:
-
-* **Vereisten te definïeren **: van request pad parameters, query parameters, headers, bodies, dependencies, enz.
-* **Data te converteren**: van de request naar het vereiste type.
-* **Data te valideren**: afkomstig van elke request:
- * **Automatische foutmeldingen** te genereren die naar de client worden geretourneerd wanneer de data ongeldig is.
-* De API met OpenAPI te **documenteren**:
- * die vervolgens wordt gebruikt door de automatische interactieve documentatie gebruikersinterfaces.
-
-Dit klinkt misschien allemaal abstract. Maak je geen zorgen. Je ziet dit allemaal in actie in de [Tutorial - Gebruikershandleiding](tutorial/index.md){.internal-link target=_blank}.
-
-Het belangrijkste is dat door standaard Python types te gebruiken, op één plek (in plaats van meer klassen, decorators, enz. toe te voegen), **FastAPI** een groot deel van het werk voor je doet.
-
-/// info
-
-Als je de hele tutorial al hebt doorgenomen en terug bent gekomen om meer te weten te komen over types, is een goede bron het "cheat sheet" van `mypy`.
-
-///
diff --git a/docs/nl/mkdocs.yml b/docs/nl/mkdocs.yml
deleted file mode 100644
index de18856f4..000000000
--- a/docs/nl/mkdocs.yml
+++ /dev/null
@@ -1 +0,0 @@
-INHERIT: ../en/mkdocs.yml
diff --git a/docs/pl/docs/features.md b/docs/pl/docs/features.md
deleted file mode 100644
index 80d3bdece..000000000
--- a/docs/pl/docs/features.md
+++ /dev/null
@@ -1,201 +0,0 @@
-# Cechy
-
-## Cechy FastAPI
-
-**FastAPI** zapewnia Ci następujące korzyści:
-
-### Oparcie o standardy open
-
-* OpenAPI do tworzenia API, w tym deklaracji ścieżek operacji, parametrów, ciał zapytań, bezpieczeństwa, itp.
-* Automatyczna dokumentacja modelu danych za pomocą JSON Schema (ponieważ OpenAPI bazuje na JSON Schema).
-* Zaprojektowane z myślą o zgodności z powyższymi standardami zamiast dodawania ich obsługi po fakcie.
-* Możliwość automatycznego **generowania kodu klienta** w wielu językach.
-
-### Automatyczna dokumentacja
-
-Interaktywna dokumentacja i webowe interfejsy do eksploracji API. Z racji tego, że framework bazuje na OpenAPI, istnieje wiele opcji, z czego 2 są domyślnie dołączone.
-
-* Swagger UI, z interaktywnym interfejsem - odpytuj i testuj swoje API bezpośrednio z przeglądarki.
-
-
-
-* Alternatywna dokumentacja API z ReDoc.
-
-
-
-### Nowoczesny Python
-
-Wszystko opiera się na standardowych deklaracjach typu **Python 3.8** (dzięki Pydantic). Brak nowej składni do uczenia. Po prostu standardowy, współczesny Python.
-
-Jeśli potrzebujesz szybkiego przypomnienia jak używać deklaracji typów w Pythonie (nawet jeśli nie używasz FastAPI), sprawdź krótki samouczek: [Python Types](python-types.md){.internal-link target=_blank}.
-
-Wystarczy, że napiszesz standardowe deklaracje typów Pythona:
-
-```Python
-from datetime import date
-
-from pydantic import BaseModel
-
-# Zadeklaruj parametr jako str
-# i uzyskaj wsparcie edytora wewnątrz funkcji
-def main(user_id: str):
- return user_id
-
-
-# Model Pydantic
-class User(BaseModel):
- id: int
- name: str
- joined: date
-```
-
-A one będą mogły zostać później użyte w następujący sposób:
-
-```Python
-my_user: User = User(id=3, name="John Doe", joined="2018-07-19")
-
-second_user_data = {
- "id": 4,
- "name": "Mary",
- "joined": "2018-11-30",
-}
-
-my_second_user: User = User(**second_user_data)
-```
-
-/// info
-
-`**second_user_data` oznacza:
-
-Przekaż klucze i wartości słownika `second_user_data` bezpośrednio jako argumenty klucz-wartość, co jest równoznaczne z: `User(id=4, name="Mary", joined="2018-11-30")`
-
-///
-
-### Wsparcie edytora
-
-Cały framework został zaprojektowany tak, aby był łatwy i intuicyjny w użyciu. Wszystkie pomysły zostały przetestowane na wielu edytorach jeszcze przed rozpoczęciem procesu tworzenia, aby zapewnić najlepsze wrażenia programistyczne.
-
-Ostatnia ankieta Python developer survey jasno wskazuje, że najczęściej używaną funkcjonalnością jest autouzupełnianie w edytorze.
-
-Cała struktura frameworku **FastAPI** jest na tym oparta. Autouzupełnianie działa wszędzie.
-
-Rzadko będziesz musiał wracać do dokumentacji.
-
-Oto, jak twój edytor może Ci pomóc:
-
-* Visual Studio Code:
-
-
-
-* PyCharm:
-
-
-
-Otrzymasz uzupełnienie nawet w miejscach, w których normalnie uzupełnienia nie ma. Na przykład klucz "price" w treści JSON (który mógł być zagnieżdżony), który pochodzi z zapytania.
-
-Koniec z wpisywaniem błędnych nazw kluczy, przechodzeniem tam i z powrotem w dokumentacji lub przewijaniem w górę i w dół, aby sprawdzić, czy w końcu użyłeś nazwy `username` czy `user_name`.
-
-### Zwięzłość
-
-Wszystko posiada sensowne **domyślne wartości**. Wszędzie znajdziesz opcjonalne konfiguracje. Wszystkie parametry możesz dostroić, aby zrobić to co potrzebujesz do zdefiniowania API.
-
-Ale domyślnie wszystko **"po prostu działa"**.
-
-### Walidacja
-
-* Walidacja większości (lub wszystkich?) **typów danych** Pythona, w tym:
- * Obiektów JSON (`dict`).
- * Tablic JSON (`list`) ze zdefiniowanym typem elementów.
- * Pól tekstowych (`str`) z określeniem minimalnej i maksymalnej długości.
- * Liczb (`int`, `float`) z wartościami minimalnymi, maksymalnymi, itp.
-
-* Walidacja bardziej egzotycznych typów danych, takich jak:
- * URL.
- * Email.
- * UUID.
- * ...i inne.
-
-Cała walidacja jest obsługiwana przez ugruntowaną i solidną bibliotekę **Pydantic**.
-
-### Bezpieczeństwo i uwierzytelnianie
-
-Bezpieczeństwo i uwierzytelnianie jest zintegrowane. Bez żadnych kompromisów z bazami czy modelami danych.
-
-Wszystkie schematy bezpieczeństwa zdefiniowane w OpenAPI, w tym:
-
-* Podstawowy protokół HTTP.
-* **OAuth2** (również z **tokenami JWT**). Sprawdź samouczek [OAuth2 with JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}.
-* Klucze API w:
- * Nagłówkach.
- * Parametrach zapytań.
- * Ciasteczkach, itp.
-
-Plus wszystkie funkcje bezpieczeństwa Starlette (włączając w to **ciasteczka sesyjne**).
-
-Wszystko zbudowane jako narzędzia i komponenty wielokrotnego użytku, które można łatwo zintegrować z systemami, magazynami oraz bazami danych - relacyjnymi, NoSQL, itp.
-
-### Wstrzykiwanie Zależności
-
-FastAPI zawiera niezwykle łatwy w użyciu, ale niezwykle potężny system Wstrzykiwania Zależności.
-
-* Nawet zależności mogą mieć zależności, tworząc hierarchię lub **"graf" zależności**.
-* Wszystko jest **obsługiwane automatycznie** przez framework.
-* Wszystkie zależności mogą wymagać danych w żądaniach oraz rozszerzać ograniczenia i automatyczną dokumentację **operacji na ścieżce**.
-* **Automatyczna walidacja** parametrów *operacji na ścieżce* zdefiniowanych w zależnościach.
-* Obsługa złożonych systemów uwierzytelniania użytkowników, **połączeń z bazami danych**, itp.
-* Bazy danych, front end, itp. **bez kompromisów**, ale wciąż łatwe do integracji.
-
-### Nieograniczone "wtyczki"
-
-Lub ujmując to inaczej - brak potrzeby wtyczek. Importuj i używaj kod, który potrzebujesz.
-
-Każda integracja została zaprojektowana tak, aby była tak prosta w użyciu (z zależnościami), że możesz utworzyć "wtyczkę" dla swojej aplikacji w 2 liniach kodu, używając tej samej struktury i składni, które są używane w *operacjach na ścieżce*.
-
-### Testy
-
-* 100% pokrycia kodu testami.
-* 100% adnotacji typów.
-* Używany w aplikacjach produkcyjnych.
-
-## Cechy Starlette
-
-**FastAPI** jest w pełni kompatybilny z (oraz bazuje na) Starlette. Tak więc każdy dodatkowy kod Starlette, który posiadasz, również będzie działał.
-
-`FastAPI` jest w rzeczywistości podklasą `Starlette`, więc jeśli już znasz lub używasz Starlette, większość funkcji będzie działać w ten sam sposób.
-
-Dzięki **FastAPI** otrzymujesz wszystkie funkcje **Starlette** (ponieważ FastAPI to po prostu Starlette na sterydach):
-
-* Bardzo imponująca wydajność. Jest to jeden z najszybszych dostępnych frameworków Pythona, na równi z **NodeJS** i **Go**.
-* Wsparcie dla **WebSocket**.
-* Zadania w tle.
-* Eventy startup i shutdown.
-* Klient testowy zbudowany na bazie biblioteki `requests`.
-* **CORS**, GZip, pliki statyczne, streamy.
-* Obsługa **sesji i ciasteczek**.
-* 100% pokrycie testami.
-* 100% adnotacji typów.
-
-## Cechy Pydantic
-
-**FastAPI** jest w pełni kompatybilny z (oraz bazuje na) Pydantic. Tak więc każdy dodatkowy kod Pydantic, który posiadasz, również będzie działał.
-
-Wliczając w to zewnętrzne biblioteki, również oparte o Pydantic, takie jak ORM, ODM dla baz danych.
-
-Oznacza to, że w wielu przypadkach możesz przekazać ten sam obiekt, który otrzymasz z żądania **bezpośrednio do bazy danych**, ponieważ wszystko jest walidowane automatycznie.
-
-Działa to również w drugą stronę, w wielu przypadkach możesz po prostu przekazać obiekt otrzymany z bazy danych **bezpośrednio do klienta**.
-
-Dzięki **FastAPI** otrzymujesz wszystkie funkcje **Pydantic** (ponieważ FastAPI bazuje na Pydantic do obsługi wszystkich danych):
-
-* **Bez prania mózgu**:
- * Brak nowego mikrojęzyka do definiowania schematu, którego trzeba się nauczyć.
- * Jeśli znasz adnotacje typów Pythona to wiesz jak używać Pydantic.
-* Dobrze współpracuje z Twoim **IDE/linterem/mózgiem**:
- * Ponieważ struktury danych Pydantic to po prostu instancje klas, które definiujesz; autouzupełnianie, linting, mypy i twoja intuicja powinny działać poprawnie z Twoimi zwalidowanymi danymi.
-* Walidacja **złożonych struktur**:
- * Wykorzystanie hierarchicznych modeli Pydantic, Pythonowego modułu `typing` zawierającego `List`, `Dict`, itp.
- * Walidatory umożliwiają jasne i łatwe definiowanie, sprawdzanie złożonych struktur danych oraz dokumentowanie ich jako JSON Schema.
- * Możesz mieć głęboko **zagnieżdżone obiekty JSON** i wszystkie je poddać walidacji i adnotować.
-* **Rozszerzalność**:
- * Pydantic umożliwia zdefiniowanie niestandardowych typów danych lub rozszerzenie walidacji o metody na modelu, na których użyty jest dekorator walidatora.
-* 100% pokrycie testami.
diff --git a/docs/pl/docs/help-fastapi.md b/docs/pl/docs/help-fastapi.md
deleted file mode 100644
index 05e491d55..000000000
--- a/docs/pl/docs/help-fastapi.md
+++ /dev/null
@@ -1,269 +0,0 @@
-# Pomóż FastAPI - Uzyskaj pomoc
-
-Czy podoba Ci się **FastAPI**?
-
-Czy chciałbyś pomóc FastAPI, jego użytkownikom i autorowi?
-
-Może napotkałeś na trudności z **FastAPI** i potrzebujesz pomocy?
-
-Istnieje kilka bardzo łatwych sposobów, aby pomóc (czasami wystarczy jedno lub dwa kliknięcia).
-
-Istnieje również kilka sposobów uzyskania pomocy.
-
-## Zapisz się do newslettera
-
-Możesz zapisać się do rzadkiego [newslettera o **FastAPI i jego przyjaciołach**](newsletter.md){.internal-link target=_blank}, aby być na bieżąco z:
-
-* Aktualnościami o FastAPI i przyjaciołach 🚀
-* Przewodnikami 📝
-* Funkcjami ✨
-* Przełomowymi zmianami 🚨
-* Poradami i sztuczkami ✅
-
-## Śledź FastAPI na X (Twitter)
-
-Śledź @fastapi na **X (Twitter)** aby być na bieżąco z najnowszymi wiadomościami o **FastAPI**. 🐦
-
-## Dodaj gwiazdkę **FastAPI** na GitHubie
-
-Możesz "dodać gwiazdkę" FastAPI na GitHubie (klikając przycisk gwiazdki w prawym górnym rogu): https://github.com/fastapi/fastapi. ⭐️
-
-Dodając gwiazdkę, inni użytkownicy będą mogli łatwiej znaleźć projekt i zobaczyć, że był już przydatny dla innych.
-
-## Obserwuj repozytorium GitHub w poszukiwaniu nowych wydań
-
-Możesz "obserwować" FastAPI na GitHubie (klikając przycisk "obserwuj" w prawym górnym rogu): https://github.com/fastapi/fastapi. 👀
-
-Wybierz opcję "Tylko wydania".
-
-Dzięki temu będziesz otrzymywać powiadomienia (na swój adres e-mail) za każdym razem, gdy pojawi się nowe wydanie (nowa wersja) **FastAPI** z poprawkami błędów i nowymi funkcjami.
-
-## Skontaktuj się z autorem
-
-Możesz skontaktować się ze mną (Sebastián Ramírez / `tiangolo`), autorem.
-
-Możesz:
-
-* Śledzić mnie na **GitHubie**.
- * Zobacz inne projekty open source, które stworzyłem, a mogą być dla Ciebie pomocne.
- * Śledź mnie, aby dostać powiadomienie, gdy utworzę nowy projekt open source.
-* Śledzić mnie na **X (Twitter)** lub na Mastodonie.
- * Napisz mi, w jaki sposób korzystasz z FastAPI (uwielbiam o tym czytać).
- * Dowiedz się, gdy ogłoszę coś nowego lub wypuszczę nowe narzędzia.
- * Możesz także śledzić @fastapi na X (Twitter) (to oddzielne konto).
-* Nawiąż ze mną kontakt na **Linkedinie**.
- * Dowiedz się, gdy ogłoszę coś nowego lub wypuszczę nowe narzędzia (chociaż częściej korzystam z Twittera 🤷♂).
-* Czytaj moje posty (lub śledź mnie) na **Dev.to** lub na **Medium**.
- * Czytaj o innych pomysłach, artykułach i dowiedz się o narzędziach, które stworzyłem.
- * Śledź mnie, by wiedzieć gdy opublikuję coś nowego.
-
-## Napisz tweeta o **FastAPI**
-
-Napisz tweeta o **FastAPI** i powiedz czemu Ci się podoba. 🎉
-
-Uwielbiam czytać w jaki sposób **FastAPI** jest używane, co Ci się w nim podobało, w jakim projekcie/firmie go używasz itp.
-
-## Głosuj na FastAPI
-
-* Głosuj na **FastAPI** w Slant.
-* Głosuj na **FastAPI** w AlternativeTo.
-* Powiedz, że używasz **FastAPI** na StackShare.
-
-## Pomagaj innym, odpowiadając na ich pytania na GitHubie
-
-Możesz spróbować pomóc innym, odpowiadając w:
-
-* Dyskusjach na GitHubie
-* Problemach na GitHubie
-
-W wielu przypadkach możesz już znać odpowiedź na te pytania. 🤓
-
-Jeśli pomożesz wielu ludziom, możesz zostać oficjalnym [Ekspertem FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}. 🎉
-
-Pamiętaj tylko o najważniejszym: bądź życzliwy. Ludzie przychodzą sfrustrowani i w wielu przypadkach nie zadają pytań w najlepszy sposób, ale mimo to postaraj się być dla nich jak najbardziej życzliwy. 🤗
-
-Chciałbym, by społeczność **FastAPI** była życzliwa i przyjazna. Nie akceptuj prześladowania ani braku szacunku wobec innych. Dbajmy o siebie nawzajem.
-
----
-
-Oto, jak pomóc innym z pytaniami (w dyskusjach lub problemach):
-
-### Zrozum pytanie
-
-* Upewnij się, czy rozumiesz **cel** i przypadek użycia osoby pytającej.
-
-* Następnie sprawdź, czy pytanie (większość to pytania) jest **jasne**.
-
-* W wielu przypadkach zadane pytanie dotyczy rozwiązania wymyślonego przez użytkownika, ale może istnieć **lepsze** rozwiązanie. Jeśli dokładnie zrozumiesz problem i przypadek użycia, być może będziesz mógł zaproponować lepsze **alternatywne rozwiązanie**.
-
-* Jeśli nie rozumiesz pytania, poproś o więcej **szczegółów**.
-
-### Odtwórz problem
-
-W większości przypadków problem wynika z **autorskiego kodu** osoby pytającej.
-
-Często pytający umieszczają tylko fragment kodu, niewystarczający do **odtworzenia problemu**.
-
-* Możesz poprosić ich o dostarczenie minimalnego, odtwarzalnego przykładu, który możesz **skopiować i wkleić** i uruchomić lokalnie, aby zobaczyć ten sam błąd lub zachowanie, które widzą, lub lepiej zrozumieć ich przypadki użycia.
-
-* Jeśli jesteś wyjątkowo pomocny, możesz spróbować **stworzyć taki przykład** samodzielnie, opierając się tylko na opisie problemu. Miej na uwadze, że może to zająć dużo czasu i lepiej może być najpierw poprosić ich o wyjaśnienie problemu.
-
-### Proponuj rozwiązania
-
-* Po zrozumieniu pytania możesz podać im możliwą **odpowiedź**.
-
-* W wielu przypadkach lepiej zrozumieć ich **podstawowy problem lub przypadek użycia**, ponieważ może istnieć lepszy sposób rozwiązania niż to, co próbują zrobić.
-
-### Poproś o zamknięcie
-
-Jeśli odpowiedzą, jest duża szansa, że rozwiązałeś ich problem, gratulacje, **jesteś bohaterem**! 🦸
-
-* Jeśli Twoja odpowiedź rozwiązała problem, możesz poprosić o:
-
- * W Dyskusjach na GitHubie: oznaczenie komentarza jako **odpowiedź**.
- * W Problemach na GitHubie: **zamknięcie** problemu.
-
-## Obserwuj repozytorium na GitHubie
-
-Możesz "obserwować" FastAPI na GitHubie (klikając przycisk "obserwuj" w prawym górnym rogu): https://github.com/fastapi/fastapi. 👀
-
-Jeśli wybierzesz "Obserwuj" zamiast "Tylko wydania", otrzymasz powiadomienia, gdy ktoś utworzy nowy problem lub pytanie. Możesz również określić, że chcesz być powiadamiany tylko o nowych problemach, dyskusjach, PR-ach itp.
-
-Następnie możesz spróbować pomóc rozwiązać te problemy.
-
-## Zadawaj pytania
-
-Możesz utworzyć nowe pytanie w repozytorium na GitHubie, na przykład aby:
-
-* Zadać **pytanie** lub zapytać o **problem**.
-* Zaproponować nową **funkcję**.
-
-**Uwaga**: jeśli to zrobisz, poproszę Cię również o pomoc innym. 😉
-
-## Przeglądaj Pull Requesty
-
-Możesz pomóc mi w przeglądaniu pull requestów autorstwa innych osób.
-
-Jak wcześniej wspomniałem, postaraj się być jak najbardziej życzliwy. 🤗
-
----
-
-Oto, co warto mieć na uwadze podczas oceny pull requestu:
-
-### Zrozum problem
-
-* Najpierw upewnij się, że **rozumiesz problem**, który próbuje rozwiązać pull request. Może być osadzony w większym kontekście w GitHubowej dyskusji lub problemie.
-
-* Jest też duża szansa, że pull request nie jest konieczny, ponieważ problem można rozwiązać w **inny sposób**. Wtedy możesz to zasugerować lub o to zapytać.
-
-### Nie martw się stylem
-
-* Nie przejmuj się zbytnio rzeczami takimi jak style wiadomości commitów, przy wcielaniu pull requesta łączę commity i modyfikuję opis sumarycznego commita ręcznie.
-
-* Nie przejmuj się również stylem kodu, automatyczne narzędzia w repozytorium sprawdzają to samodzielnie.
-
-A jeśli istnieje jakaś konkretna potrzeba dotycząca stylu lub spójności, sam poproszę o zmiany lub dodam commity z takimi zmianami.
-
-### Sprawdź kod
-
-* Przeczytaj kod, zastanów się czy ma sens, **uruchom go lokalnie** i potwierdź czy faktycznie rozwiązuje problem.
-
-* Następnie dodaj **komentarz** z informacją o tym, że sprawdziłeś kod, dzięki temu będę miał pewność, że faktycznie go sprawdziłeś.
-
-/// info
-
-Niestety, nie mogę ślepo ufać PR-om, nawet jeśli mają kilka zatwierdzeń.
-
-Kilka razy zdarzyło się, że PR-y miały 3, 5 lub więcej zatwierdzeń (prawdopodobnie dlatego, że opis obiecuje rozwiązanie ważnego problemu), ale gdy sam sprawdziłem danego PR-a, okazał się być zbugowany lub nie rozwiązywał problemu, który rzekomo miał rozwiązywać. 😅
-
-Dlatego tak ważne jest, abyś faktycznie przeczytał i uruchomił kod oraz napisał w komentarzu, że to zrobiłeś. 🤓
-
-///
-
-* Jeśli PR można uprościć w jakiś sposób, możesz o to poprosić, ale nie ma potrzeby być zbyt wybrednym, może być wiele subiektywnych punktów widzenia (a ja też będę miał swój 🙈), więc lepiej żebyś skupił się na kluczowych rzeczach.
-
-### Testy
-
-* Pomóż mi sprawdzić, czy PR ma **testy**.
-
-* Sprawdź, czy testy **nie przechodzą** przed PR. 🚨
-
-* Następnie sprawdź, czy testy **przechodzą** po PR. ✅
-
-* Wiele PR-ów nie ma testów, możesz **przypomnieć** im o dodaniu testów, a nawet **zaproponować** samemu jakieś testy. To jedna z rzeczy, które pochłaniają najwięcej czasu i możesz w tym bardzo pomóc.
-
-* Następnie skomentuj również to, czego spróbowałeś, wtedy będę wiedział, że to sprawdziłeś. 🤓
-
-## Utwórz Pull Request
-
-Możesz [wnieść wkład](contributing.md){.internal-link target=_blank} do kodu źródłowego za pomocą Pull Requestu, na przykład:
-
-* Naprawić literówkę, którą znalazłeś w dokumentacji.
-* Podzielić się artykułem, filmem lub podcastem, który stworzyłeś lub znalazłeś na temat FastAPI, edytując ten plik.
- * Upewnij się, że dodajesz swój link na początku odpowiedniej sekcji.
-* Pomóc w [tłumaczeniu dokumentacji](contributing.md#translations){.internal-link target=_blank} na Twój język.
- * Możesz również pomóc w weryfikacji tłumaczeń stworzonych przez innych.
-* Zaproponować nowe sekcje dokumentacji.
-* Naprawić istniejący problem/błąd.
- * Upewnij się, że dodajesz testy.
-* Dodać nową funkcję.
- * Upewnij się, że dodajesz testy.
- * Upewnij się, że dodajesz dokumentację, jeśli jest to istotne.
-
-## Pomóż w utrzymaniu FastAPI
-
-Pomóż mi utrzymać **FastAPI**! 🤓
-
-Jest wiele pracy do zrobienia, a w większości przypadków **TY** możesz to zrobić.
-
-Główne zadania, które możesz wykonać teraz to:
-
-* [Pomóc innym z pytaniami na GitHubie](#pomagaj-innym-odpowiadajac-na-ich-pytania-na-githubie){.internal-link target=_blank} (zobacz sekcję powyżej).
-* [Oceniać Pull Requesty](#przegladaj-pull-requesty){.internal-link target=_blank} (zobacz sekcję powyżej).
-
-Te dwie czynności **zajmują najwięcej czasu**. To główna praca związana z utrzymaniem FastAPI.
-
-Jeśli możesz mi w tym pomóc, **pomożesz mi utrzymać FastAPI** i zapewnisz że będzie **rozwijać się szybciej i lepiej**. 🚀
-
-## Dołącz do czatu
-
-Dołącz do 👥 serwera czatu na Discordzie 👥 i spędzaj czas z innymi w społeczności FastAPI.
-
-/// tip | Wskazówka
-
-Jeśli masz pytania, zadaj je w Dyskusjach na GitHubie, jest dużo większa szansa, że otrzymasz pomoc od [Ekspertów FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}.
-
-Używaj czatu tylko do innych ogólnych rozmów.
-
-///
-
-### Nie zadawaj pytań na czacie
-
-Miej na uwadze, że ponieważ czaty pozwalają na bardziej "swobodną rozmowę", łatwo jest zadawać pytania, które są zbyt ogólne i trudniejsze do odpowiedzi, więc możesz nie otrzymać odpowiedzi.
-
-Na GitHubie szablon poprowadzi Cię do napisania odpowiedniego pytania, dzięki czemu łatwiej uzyskasz dobrą odpowiedź, a nawet rozwiążesz problem samodzielnie, zanim zapytasz. Ponadto na GitHubie mogę się upewnić, że zawsze odpowiadam na wszystko, nawet jeśli zajmuje to trochę czasu. Osobiście nie mogę tego zrobić z systemami czatu. 😅
-
-Rozmów w systemach czatu nie można tak łatwo przeszukiwać, jak na GitHubie, więc pytania i odpowiedzi mogą zaginąć w rozmowie. A tylko te na GitHubie liczą się do zostania [Ekspertem FastAPI](fastapi-people.md#fastapi-experts){.internal-link target=_blank}, więc najprawdopodobniej otrzymasz więcej uwagi na GitHubie.
-
-Z drugiej strony w systemach czatu są tysiące użytkowników, więc jest duża szansa, że znajdziesz tam kogoś do rozmowy, prawie w każdej chwili. 😄
-
-## Wspieraj autora
-
-Możesz również finansowo wesprzeć autora (mnie) poprzez sponsoring na GitHubie.
-
-Tam możesz postawić mi kawę ☕️ aby podziękować. 😄
-
-Możesz także zostać srebrnym lub złotym sponsorem FastAPI. 🏅🎉
-
-## Wspieraj narzędzia, które napędzają FastAPI
-
-Jak widziałeś w dokumentacji, FastAPI stoi na ramionach gigantów, Starlette i Pydantic.
-
-Możesz również wesprzeć:
-
-* Samuel Colvin (Pydantic)
-* Encode (Starlette, Uvicorn)
-
----
-
-Dziękuję! 🚀
diff --git a/docs/pl/docs/index.md b/docs/pl/docs/index.md
deleted file mode 100644
index 976d610d4..000000000
--- a/docs/pl/docs/index.md
+++ /dev/null
@@ -1,467 +0,0 @@
-# FastAPI
-
-
-
-
-- FastAPI to szybki, prosty w nauce i gotowy do użycia w produkcji framework -
- - ---- - -**Dokumentacja**: https://fastapi.tiangolo.com - -**Kod żródłowy**: https://github.com/fastapi/fastapi - ---- - -FastAPI to nowoczesny, wydajny framework webowy do budowania API z użyciem Pythona bazujący na standardowym typowaniu Pythona. - -Kluczowe cechy: - -* **Wydajność**: FastAPI jest bardzo wydajny, na równi z **NodeJS** oraz **Go** (dzięki Starlette i Pydantic). [Jeden z najszybszych dostępnych frameworków Pythonowych](#wydajnosc). -* **Szybkość kodowania**: Przyśpiesza szybkość pisania nowych funkcjonalności o około 200% do 300%. * -* **Mniejsza ilość błędów**: Zmniejsza ilość ludzkich (dewelopera) błędy o około 40%. * -* **Intuicyjność**: Wspaniałe wsparcie dla edytorów kodu. Dostępne wszędzie automatyczne uzupełnianie kodu. Krótszy czas debugowania. -* **Łatwość**: Zaprojektowany by być prosty i łatwy do nauczenia. Mniej czasu spędzonego na czytanie dokumentacji. -* **Kompaktowość**: Minimalizacja powtarzającego się kodu. Wiele funkcjonalności dla każdej deklaracji parametru. Mniej błędów. -* **Solidność**: Kod gotowy dla środowiska produkcyjnego. Wraz z automatyczną interaktywną dokumentacją. -* **Bazujący na standardach**: Oparty na (i w pełni kompatybilny z) otwartych standardach API: OpenAPI (wcześniej znane jako Swagger) oraz JSON Schema. - -* oszacowania bazowane na testach wykonanych przez wewnętrzny zespół deweloperów, budujących aplikacie używane na środowisku produkcyjnym. - -## Sponsorzy - - - -{% if sponsors %} -{% for sponsor in sponsors.gold -%} -async def...uvicorn main:app --reload...email-validator - dla walidacji adresów email.
-
-Używane przez Starlette:
-
-* httpx - Wymagane jeżeli chcesz korzystać z `TestClient`.
-* aiofiles - Wymagane jeżeli chcesz korzystać z `FileResponse` albo `StaticFiles`.
-* jinja2 - Wymagane jeżeli chcesz używać domyślnej konfiguracji szablonów.
-* python-multipart - Wymagane jeżelich chcesz wsparcie "parsowania" formularzy, używając `request.form()`.
-* itsdangerous - Wymagany dla wsparcia `SessionMiddleware`.
-* pyyaml - Wymagane dla wsparcia `SchemaGenerator` z Starlette (z FastAPI prawdopodobnie tego nie potrzebujesz).
-* graphene - Wymagane dla wsparcia `GraphQLApp`.
-
-Używane przez FastAPI / Starlette:
-
-* uvicorn - jako serwer, który ładuje i obsługuje Twoją aplikację.
-* orjson - Wymagane jeżeli chcesz używać `ORJSONResponse`.
-* ujson - Wymagane jeżeli chcesz korzystać z `UJSONResponse`.
-
-Możesz zainstalować wszystkie te aplikacje przy pomocy `pip install fastapi[all]`.
-
-## Licencja
-
-Ten projekt jest na licencji MIT.
diff --git a/docs/pl/docs/tutorial/first-steps.md b/docs/pl/docs/tutorial/first-steps.md
deleted file mode 100644
index 8fa4c75ad..000000000
--- a/docs/pl/docs/tutorial/first-steps.md
+++ /dev/null
@@ -1,335 +0,0 @@
-# Pierwsze kroki
-
-Najprostszy plik FastAPI może wyglądać tak:
-
-{* ../../docs_src/first_steps/tutorial001.py *}
-
-Skopiuj to do pliku `main.py`.
-
-Uruchom serwer:
-
-get
-
-/// info | `@decorator` Info
-
-Składnia `@something` jest w Pythonie nazywana "dekoratorem".
-
-Umieszczasz to na szczycie funkcji. Jak ładną ozdobną czapkę (chyba stąd wzięła się nazwa).
-
-"Dekorator" przyjmuje funkcję znajdującą się poniżej jego i coś z nią robi.
-
-W naszym przypadku dekorator mówi **FastAPI**, że poniższa funkcja odpowiada **ścieżce** `/` z **operacją** `get`.
-
-Jest to "**dekorator operacji na ścieżce**".
-
-///
-
-Możesz również użyć innej operacji:
-
-* `@app.post()`
-* `@app.put()`
-* `@app.delete()`
-
-Oraz tych bardziej egzotycznych:
-
-* `@app.options()`
-* `@app.head()`
-* `@app.patch()`
-* `@app.trace()`
-
-/// tip
-
-Możesz dowolnie używać każdej operacji (metody HTTP).
-
-**FastAPI** nie narzuca żadnego konkretnego znaczenia.
-
-Informacje tutaj są przedstawione jako wskazówka, a nie wymóg.
-
-Na przykład, używając GraphQL, normalnie wykonujesz wszystkie akcje używając tylko operacji `POST`.
-
-///
-
-### Krok 4: zdefiniuj **funkcję obsługującą ścieżkę**
-
-To jest nasza "**funkcja obsługująca ścieżkę**":
-
-* **ścieżka**: to `/`.
-* **operacja**: to `get`.
-* **funkcja**: to funkcja poniżej "dekoratora" (poniżej `@app.get("/")`).
-
-{* ../../docs_src/first_steps/tutorial001.py hl[7] *}
-
-Jest to funkcja Python.
-
-Zostanie ona wywołana przez **FastAPI** za każdym razem, gdy otrzyma żądanie do adresu URL "`/`" przy użyciu operacji `GET`.
-
-W tym przypadku jest to funkcja "asynchroniczna".
-
----
-
-Możesz również zdefiniować to jako normalną funkcję zamiast `async def`:
-
-{* ../../docs_src/first_steps/tutorial003.py hl[7] *}
-
-/// note
-
-Jeśli nie znasz różnicy, sprawdź [Async: *"In a hurry?"*](../async.md#in-a-hurry){.internal-link target=_blank}.
-
-///
-
-### Krok 5: zwróć zawartość
-
-{* ../../docs_src/first_steps/tutorial001.py hl[8] *}
-
-Możesz zwrócić `dict`, `list`, pojedynczą wartość jako `str`, `int`, itp.
-
-Możesz również zwrócić modele Pydantic (więcej o tym później).
-
-Istnieje wiele innych obiektów i modeli, które zostaną automatycznie skonwertowane do formatu JSON (w tym ORM itp.). Spróbuj użyć swoich ulubionych, jest bardzo prawdopodobne, że są już obsługiwane.
-
-## Podsumowanie
-
-* Zaimportuj `FastAPI`.
-* Stwórz instancję `app`.
-* Dodaj **dekorator operacji na ścieżce** (taki jak `@app.get("/")`).
-* Napisz **funkcję obsługującą ścieżkę** (taką jak `def root(): ...` powyżej).
-* Uruchom serwer deweloperski (`uvicorn main:app --reload`).
diff --git a/docs/pl/docs/tutorial/index.md b/docs/pl/docs/tutorial/index.md
deleted file mode 100644
index 66f7c6d62..000000000
--- a/docs/pl/docs/tutorial/index.md
+++ /dev/null
@@ -1,83 +0,0 @@
-# Samouczek
-
-Ten samouczek pokaże Ci, krok po kroku, jak używać większości funkcji **FastAPI**.
-
-Każda część korzysta z poprzednich, ale jest jednocześnie osobnym tematem. Możesz przejść bezpośrednio do każdego rozdziału, jeśli szukasz rozwiązania konkretnego problemu.
-
-Samouczek jest tak zbudowany, żeby służył jako punkt odniesienia w przyszłości.
-
-Możesz wracać i sprawdzać dokładnie to czego potrzebujesz.
-
-## Wykonywanie kodu
-
-Wszystkie fragmenty kodu mogą być skopiowane bezpośrednio i użyte (są poprawnymi i przetestowanymi plikami).
-
-Żeby wykonać każdy przykład skopiuj kod to pliku `main.py` i uruchom `uvicorn` za pomocą:
-
-- Ìlànà wẹ́ẹ́bù FastAPI, iṣẹ́ gíga, ó rọrùn láti kọ̀, o yára láti kóòdù, ó sì ṣetán fún iṣelọpọ ní lílo -
- - ---- - -**Àkọsílẹ̀**: https://fastapi.tiangolo.com - -**Orisun Kóòdù**: https://github.com/fastapi/fastapi - ---- - -FastAPI jẹ́ ìgbàlódé, tí ó yára (iṣẹ-giga), ìlànà wẹ́ẹ́bù fún kikọ àwọn API pẹ̀lú Python èyí tí ó da lori àwọn ìtọ́kasí àmì irúfẹ́ Python. - -Àwọn ẹya pàtàkì ni: - -* **Ó yára**: Iṣẹ tí ó ga púpọ̀, tí ó wa ni ibamu pẹ̀lú **NodeJS** àti **Go** (ọpẹ si Starlette àti Pydantic). [Ọkan nínú àwọn ìlànà Python ti o yára jùlọ ti o wa](#isesi). -* **Ó yára láti kóòdù**: O mu iyara pọ si láti kọ àwọn ẹya tuntun kóòdù nipasẹ "Igba ìdá ọgọ́rùn-ún" (i.e. 200%) si "ọ̀ọ́dúrún ìdá ọgọ́rùn-ún" (i.e. 300%). -* **Àìtọ́ kékeré**: O n din aṣiṣe ku bi ọgbon ìdá ọgọ́rùn-ún (i.e. 40%) ti eda eniyan (oṣiṣẹ kóòdù) fa. * -* **Ọgbọ́n àti ìmọ̀**: Atilẹyin olootu nla. Ìparí nibi gbogbo. Àkókò díẹ̀ nipa wíwá ibi tí ìṣòro kóòdù wà. -* **Irọrun**: A kọ kí ó le rọrun láti lo àti láti kọ ẹkọ nínú rè. Ó máa fún ọ ní àkókò díẹ̀ látı ka àkọsílẹ. -* **Ó kúkurú ní kikọ**: Ó dín àtúnkọ àti àtúntò kóòdù kù. Ìkéde àṣàyàn kọ̀ọ̀kan nínú rẹ̀ ní ọ̀pọ̀lọpọ̀ àwọn ìlò. O ṣe iranlọwọ láti má ṣe ní ọ̀pọ̀lọpọ̀ àṣìṣe. -* **Ó lágbára**: Ó ń ṣe àgbéjáde kóòdù tí ó ṣetán fún ìṣelọ́pọ̀. Pẹ̀lú àkọsílẹ̀ tí ó máa ṣàlàyé ara rẹ̀ fún ẹ ní ìbáṣepọ̀ aládàáṣiṣẹ́ pẹ̀lú rè. -* **Ajohunše/Ìtọ́kasí**: Ó da lori (àti ibamu ni kikun pẹ̀lú) àwọn ìmọ ajohunše/ìtọ́kasí fún àwọn API: OpenAPI (èyí tí a mọ tẹlẹ si Swagger) àti JSON Schema. - -* iṣiro yi da lori àwọn idanwo tí ẹgbẹ ìdàgbàsókè FastAPI ṣe, nígbàtí wọn kọ àwọn ohun elo iṣelọpọ kóòdù pẹ̀lú rẹ. - -## Àwọn onígbọ̀wọ́ - - - -{% if sponsors %} -{% for sponsor in sponsors.gold -%} -async def...uvicorn main:app --reload...email-validator - fún ifọwọsi ímeèlì.
-* pydantic-settings - fún ètò ìsàkóso.
-* pydantic-extra-types - fún àfikún oríṣi láti lọ pẹ̀lú Pydantic.
-
-Èyí tí Starlette ń lò:
-
-* httpx - Nílò tí ó bá fẹ́ láti lọ `TestClient`.
-* jinja2 - Nílò tí ó bá fẹ́ láti lọ iṣeto awoṣe aiyipada.
-* python-multipart - Nílò tí ó bá fẹ́ láti ṣe àtìlẹ́yìn fún "àyẹ̀wò" fọọmu, pẹ̀lú `request.form()`.
-* itsdangerous - Nílò fún àtìlẹ́yìn `SessionMiddleware`.
-* pyyaml - Nílò fún àtìlẹ́yìn Starlette's `SchemaGenerator` (ó ṣe ṣe kí ó má nílò rẹ̀ fún FastAPI).
-
-Èyí tí FastAPI / Starlette ń lò:
-
-* uvicorn - Fún olupin tí yóò sẹ́ àmúyẹ àti tí yóò ṣe ìpèsè fún iṣẹ́ rẹ tàbí ohun èlò rẹ.
-* orjson - Nílò tí ó bá fẹ́ láti lọ `ORJSONResponse`.
-* ujson - Nílò tí ó bá fẹ́ láti lọ `UJSONResponse`.
-
-Ó lè fi gbogbo àwọn wọ̀nyí sórí ẹrọ pẹ̀lú `pip install "fastapi[all]"`.
-
-## Iwe-aṣẹ
-
-Iṣẹ́ yìí ni iwe-aṣẹ lábẹ́ àwọn òfin tí iwe-aṣẹ MIT.
diff --git a/docs/yo/mkdocs.yml b/docs/yo/mkdocs.yml
deleted file mode 100644
index de18856f4..000000000
--- a/docs/yo/mkdocs.yml
+++ /dev/null
@@ -1 +0,0 @@
-INHERIT: ../en/mkdocs.yml
diff --git a/docs_src/dependencies/tutorial013_an_py310.py b/docs_src/dependencies/tutorial013_an_py310.py
new file mode 100644
index 000000000..0c2f62c4f
--- /dev/null
+++ b/docs_src/dependencies/tutorial013_an_py310.py
@@ -0,0 +1,38 @@
+import time
+from typing import Annotated
+
+from fastapi import Depends, FastAPI, HTTPException
+from fastapi.responses import StreamingResponse
+from sqlmodel import Field, Session, SQLModel, create_engine
+
+engine = create_engine("postgresql+psycopg://postgres:postgres@localhost/db")
+
+
+class User(SQLModel, table=True):
+ id: int | None = Field(default=None, primary_key=True)
+ name: str
+
+
+app = FastAPI()
+
+
+def get_session():
+ with Session(engine) as session:
+ yield session
+
+
+def get_user(user_id: int, session: Annotated[Session, Depends(get_session)]):
+ user = session.get(User, user_id)
+ if not user:
+ raise HTTPException(status_code=403, detail="Not authorized")
+
+
+def generate_stream(query: str):
+ for ch in query:
+ yield ch
+ time.sleep(0.1)
+
+
+@app.get("/generate", dependencies=[Depends(get_user)])
+def generate(query: str):
+ return StreamingResponse(content=generate_stream(query))
diff --git a/docs_src/dependencies/tutorial014_an_py310.py b/docs_src/dependencies/tutorial014_an_py310.py
new file mode 100644
index 000000000..ed7c1809a
--- /dev/null
+++ b/docs_src/dependencies/tutorial014_an_py310.py
@@ -0,0 +1,39 @@
+import time
+from typing import Annotated
+
+from fastapi import Depends, FastAPI, HTTPException
+from fastapi.responses import StreamingResponse
+from sqlmodel import Field, Session, SQLModel, create_engine
+
+engine = create_engine("postgresql+psycopg://postgres:postgres@localhost/db")
+
+
+class User(SQLModel, table=True):
+ id: int | None = Field(default=None, primary_key=True)
+ name: str
+
+
+app = FastAPI()
+
+
+def get_session():
+ with Session(engine) as session:
+ yield session
+
+
+def get_user(user_id: int, session: Annotated[Session, Depends(get_session)]):
+ user = session.get(User, user_id)
+ if not user:
+ raise HTTPException(status_code=403, detail="Not authorized")
+ session.close()
+
+
+def generate_stream(query: str):
+ for ch in query:
+ yield ch
+ time.sleep(0.1)
+
+
+@app.get("/generate", dependencies=[Depends(get_user)])
+def generate(query: str):
+ return StreamingResponse(content=generate_stream(query))
diff --git a/docs_src/security/tutorial004.py b/docs_src/security/tutorial004.py
index 222589618..130dc699a 100644
--- a/docs_src/security/tutorial004.py
+++ b/docs_src/security/tutorial004.py
@@ -5,7 +5,7 @@ import jwt
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jwt.exceptions import InvalidTokenError
-from passlib.context import CryptContext
+from pwdlib import PasswordHash
from pydantic import BaseModel
# to get a string like this run:
@@ -20,7 +20,7 @@ fake_users_db = {
"username": "johndoe",
"full_name": "John Doe",
"email": "johndoe@example.com",
- "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW",
+ "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc",
"disabled": False,
}
}
@@ -46,7 +46,7 @@ class UserInDB(User):
hashed_password: str
-pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
+password_hash = PasswordHash.recommended()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@@ -54,11 +54,11 @@ app = FastAPI()
def verify_password(plain_password, hashed_password):
- return pwd_context.verify(plain_password, hashed_password)
+ return password_hash.verify(plain_password, hashed_password)
def get_password_hash(password):
- return pwd_context.hash(password)
+ return password_hash.hash(password)
def get_user(db, username: str):
diff --git a/docs_src/security/tutorial004_an.py b/docs_src/security/tutorial004_an.py
index e2221cd39..018234e30 100644
--- a/docs_src/security/tutorial004_an.py
+++ b/docs_src/security/tutorial004_an.py
@@ -5,7 +5,7 @@ import jwt
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jwt.exceptions import InvalidTokenError
-from passlib.context import CryptContext
+from pwdlib import PasswordHash
from pydantic import BaseModel
from typing_extensions import Annotated
@@ -21,7 +21,7 @@ fake_users_db = {
"username": "johndoe",
"full_name": "John Doe",
"email": "johndoe@example.com",
- "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW",
+ "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc",
"disabled": False,
}
}
@@ -47,7 +47,7 @@ class UserInDB(User):
hashed_password: str
-pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
+password_hash = PasswordHash.recommended()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@@ -55,11 +55,11 @@ app = FastAPI()
def verify_password(plain_password, hashed_password):
- return pwd_context.verify(plain_password, hashed_password)
+ return password_hash.verify(plain_password, hashed_password)
def get_password_hash(password):
- return pwd_context.hash(password)
+ return password_hash.hash(password)
def get_user(db, username: str):
diff --git a/docs_src/security/tutorial004_an_py310.py b/docs_src/security/tutorial004_an_py310.py
index a3f74fc0e..18ea96bc5 100644
--- a/docs_src/security/tutorial004_an_py310.py
+++ b/docs_src/security/tutorial004_an_py310.py
@@ -5,7 +5,7 @@ import jwt
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jwt.exceptions import InvalidTokenError
-from passlib.context import CryptContext
+from pwdlib import PasswordHash
from pydantic import BaseModel
# to get a string like this run:
@@ -20,7 +20,7 @@ fake_users_db = {
"username": "johndoe",
"full_name": "John Doe",
"email": "johndoe@example.com",
- "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW",
+ "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc",
"disabled": False,
}
}
@@ -46,7 +46,7 @@ class UserInDB(User):
hashed_password: str
-pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
+password_hash = PasswordHash.recommended()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@@ -54,11 +54,11 @@ app = FastAPI()
def verify_password(plain_password, hashed_password):
- return pwd_context.verify(plain_password, hashed_password)
+ return password_hash.verify(plain_password, hashed_password)
def get_password_hash(password):
- return pwd_context.hash(password)
+ return password_hash.hash(password)
def get_user(db, username: str):
diff --git a/docs_src/security/tutorial004_an_py39.py b/docs_src/security/tutorial004_an_py39.py
index b33d677ed..d3fd29e5a 100644
--- a/docs_src/security/tutorial004_an_py39.py
+++ b/docs_src/security/tutorial004_an_py39.py
@@ -5,7 +5,7 @@ import jwt
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jwt.exceptions import InvalidTokenError
-from passlib.context import CryptContext
+from pwdlib import PasswordHash
from pydantic import BaseModel
# to get a string like this run:
@@ -20,7 +20,7 @@ fake_users_db = {
"username": "johndoe",
"full_name": "John Doe",
"email": "johndoe@example.com",
- "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW",
+ "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc",
"disabled": False,
}
}
@@ -46,7 +46,7 @@ class UserInDB(User):
hashed_password: str
-pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
+password_hash = PasswordHash.recommended()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@@ -54,11 +54,11 @@ app = FastAPI()
def verify_password(plain_password, hashed_password):
- return pwd_context.verify(plain_password, hashed_password)
+ return password_hash.verify(plain_password, hashed_password)
def get_password_hash(password):
- return pwd_context.hash(password)
+ return password_hash.hash(password)
def get_user(db, username: str):
diff --git a/docs_src/security/tutorial004_py310.py b/docs_src/security/tutorial004_py310.py
index d46ce26bf..cd1dcff46 100644
--- a/docs_src/security/tutorial004_py310.py
+++ b/docs_src/security/tutorial004_py310.py
@@ -4,7 +4,7 @@ import jwt
from fastapi import Depends, FastAPI, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from jwt.exceptions import InvalidTokenError
-from passlib.context import CryptContext
+from pwdlib import PasswordHash
from pydantic import BaseModel
# to get a string like this run:
@@ -19,7 +19,7 @@ fake_users_db = {
"username": "johndoe",
"full_name": "John Doe",
"email": "johndoe@example.com",
- "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW",
+ "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc",
"disabled": False,
}
}
@@ -45,7 +45,7 @@ class UserInDB(User):
hashed_password: str
-pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
+password_hash = PasswordHash.recommended()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
@@ -53,11 +53,11 @@ app = FastAPI()
def verify_password(plain_password, hashed_password):
- return pwd_context.verify(plain_password, hashed_password)
+ return password_hash.verify(plain_password, hashed_password)
def get_password_hash(password):
- return pwd_context.hash(password)
+ return password_hash.hash(password)
def get_user(db, username: str):
diff --git a/docs_src/security/tutorial005.py b/docs_src/security/tutorial005.py
index 447dacb37..fdd73bcd8 100644
--- a/docs_src/security/tutorial005.py
+++ b/docs_src/security/tutorial005.py
@@ -9,7 +9,7 @@ from fastapi.security import (
SecurityScopes,
)
from jwt.exceptions import InvalidTokenError
-from passlib.context import CryptContext
+from pwdlib import PasswordHash
from pydantic import BaseModel, ValidationError
# to get a string like this run:
@@ -24,14 +24,14 @@ fake_users_db = {
"username": "johndoe",
"full_name": "John Doe",
"email": "johndoe@example.com",
- "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW",
+ "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc",
"disabled": False,
},
"alice": {
"username": "alice",
"full_name": "Alice Chains",
"email": "alicechains@example.com",
- "hashed_password": "$2b$12$gSvqqUPvlXP2tfVFaWK1Be7DlH.PKZbv5H8KnzzVgXXbVxpva.pFm",
+ "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$g2/AV1zwopqUntPKJavBFw$BwpRGDCyUHLvHICnwijyX8ROGoiUPwNKZ7915MeYfCE",
"disabled": True,
},
}
@@ -58,7 +58,7 @@ class UserInDB(User):
hashed_password: str
-pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
+password_hash = PasswordHash.recommended()
oauth2_scheme = OAuth2PasswordBearer(
tokenUrl="token",
@@ -69,11 +69,11 @@ app = FastAPI()
def verify_password(plain_password, hashed_password):
- return pwd_context.verify(plain_password, hashed_password)
+ return password_hash.verify(plain_password, hashed_password)
def get_password_hash(password):
- return pwd_context.hash(password)
+ return password_hash.hash(password)
def get_user(db, username: str):
diff --git a/docs_src/security/tutorial005_an.py b/docs_src/security/tutorial005_an.py
index d2c4fe9b8..e1d7b4f62 100644
--- a/docs_src/security/tutorial005_an.py
+++ b/docs_src/security/tutorial005_an.py
@@ -9,7 +9,7 @@ from fastapi.security import (
SecurityScopes,
)
from jwt.exceptions import InvalidTokenError
-from passlib.context import CryptContext
+from pwdlib import PasswordHash
from pydantic import BaseModel, ValidationError
from typing_extensions import Annotated
@@ -25,14 +25,14 @@ fake_users_db = {
"username": "johndoe",
"full_name": "John Doe",
"email": "johndoe@example.com",
- "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW",
+ "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc",
"disabled": False,
},
"alice": {
"username": "alice",
"full_name": "Alice Chains",
"email": "alicechains@example.com",
- "hashed_password": "$2b$12$gSvqqUPvlXP2tfVFaWK1Be7DlH.PKZbv5H8KnzzVgXXbVxpva.pFm",
+ "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$g2/AV1zwopqUntPKJavBFw$BwpRGDCyUHLvHICnwijyX8ROGoiUPwNKZ7915MeYfCE",
"disabled": True,
},
}
@@ -59,7 +59,7 @@ class UserInDB(User):
hashed_password: str
-pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
+password_hash = PasswordHash.recommended()
oauth2_scheme = OAuth2PasswordBearer(
tokenUrl="token",
@@ -70,11 +70,11 @@ app = FastAPI()
def verify_password(plain_password, hashed_password):
- return pwd_context.verify(plain_password, hashed_password)
+ return password_hash.verify(plain_password, hashed_password)
def get_password_hash(password):
- return pwd_context.hash(password)
+ return password_hash.hash(password)
def get_user(db, username: str):
diff --git a/docs_src/security/tutorial005_an_py310.py b/docs_src/security/tutorial005_an_py310.py
index e3527370d..df55951c0 100644
--- a/docs_src/security/tutorial005_an_py310.py
+++ b/docs_src/security/tutorial005_an_py310.py
@@ -9,7 +9,7 @@ from fastapi.security import (
SecurityScopes,
)
from jwt.exceptions import InvalidTokenError
-from passlib.context import CryptContext
+from pwdlib import PasswordHash
from pydantic import BaseModel, ValidationError
# to get a string like this run:
@@ -24,14 +24,14 @@ fake_users_db = {
"username": "johndoe",
"full_name": "John Doe",
"email": "johndoe@example.com",
- "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW",
+ "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc",
"disabled": False,
},
"alice": {
"username": "alice",
"full_name": "Alice Chains",
"email": "alicechains@example.com",
- "hashed_password": "$2b$12$gSvqqUPvlXP2tfVFaWK1Be7DlH.PKZbv5H8KnzzVgXXbVxpva.pFm",
+ "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$g2/AV1zwopqUntPKJavBFw$BwpRGDCyUHLvHICnwijyX8ROGoiUPwNKZ7915MeYfCE",
"disabled": True,
},
}
@@ -58,7 +58,7 @@ class UserInDB(User):
hashed_password: str
-pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
+password_hash = PasswordHash.recommended()
oauth2_scheme = OAuth2PasswordBearer(
tokenUrl="token",
@@ -69,11 +69,11 @@ app = FastAPI()
def verify_password(plain_password, hashed_password):
- return pwd_context.verify(plain_password, hashed_password)
+ return password_hash.verify(plain_password, hashed_password)
def get_password_hash(password):
- return pwd_context.hash(password)
+ return password_hash.hash(password)
def get_user(db, username: str):
diff --git a/docs_src/security/tutorial005_an_py39.py b/docs_src/security/tutorial005_an_py39.py
index 3dc3140c3..983c1c22c 100644
--- a/docs_src/security/tutorial005_an_py39.py
+++ b/docs_src/security/tutorial005_an_py39.py
@@ -9,7 +9,7 @@ from fastapi.security import (
SecurityScopes,
)
from jwt.exceptions import InvalidTokenError
-from passlib.context import CryptContext
+from pwdlib import PasswordHash
from pydantic import BaseModel, ValidationError
# to get a string like this run:
@@ -24,14 +24,14 @@ fake_users_db = {
"username": "johndoe",
"full_name": "John Doe",
"email": "johndoe@example.com",
- "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW",
+ "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc",
"disabled": False,
},
"alice": {
"username": "alice",
"full_name": "Alice Chains",
"email": "alicechains@example.com",
- "hashed_password": "$2b$12$gSvqqUPvlXP2tfVFaWK1Be7DlH.PKZbv5H8KnzzVgXXbVxpva.pFm",
+ "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$g2/AV1zwopqUntPKJavBFw$BwpRGDCyUHLvHICnwijyX8ROGoiUPwNKZ7915MeYfCE",
"disabled": True,
},
}
@@ -58,7 +58,7 @@ class UserInDB(User):
hashed_password: str
-pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
+password_hash = PasswordHash.recommended()
oauth2_scheme = OAuth2PasswordBearer(
tokenUrl="token",
@@ -69,11 +69,11 @@ app = FastAPI()
def verify_password(plain_password, hashed_password):
- return pwd_context.verify(plain_password, hashed_password)
+ return password_hash.verify(plain_password, hashed_password)
def get_password_hash(password):
- return pwd_context.hash(password)
+ return password_hash.hash(password)
def get_user(db, username: str):
diff --git a/docs_src/security/tutorial005_py310.py b/docs_src/security/tutorial005_py310.py
index 3fc15212b..d08e2c59f 100644
--- a/docs_src/security/tutorial005_py310.py
+++ b/docs_src/security/tutorial005_py310.py
@@ -8,7 +8,7 @@ from fastapi.security import (
SecurityScopes,
)
from jwt.exceptions import InvalidTokenError
-from passlib.context import CryptContext
+from pwdlib import PasswordHash
from pydantic import BaseModel, ValidationError
# to get a string like this run:
@@ -23,14 +23,14 @@ fake_users_db = {
"username": "johndoe",
"full_name": "John Doe",
"email": "johndoe@example.com",
- "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW",
+ "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc",
"disabled": False,
},
"alice": {
"username": "alice",
"full_name": "Alice Chains",
"email": "alicechains@example.com",
- "hashed_password": "$2b$12$gSvqqUPvlXP2tfVFaWK1Be7DlH.PKZbv5H8KnzzVgXXbVxpva.pFm",
+ "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$g2/AV1zwopqUntPKJavBFw$BwpRGDCyUHLvHICnwijyX8ROGoiUPwNKZ7915MeYfCE",
"disabled": True,
},
}
@@ -57,7 +57,7 @@ class UserInDB(User):
hashed_password: str
-pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
+password_hash = PasswordHash.recommended()
oauth2_scheme = OAuth2PasswordBearer(
tokenUrl="token",
@@ -68,11 +68,11 @@ app = FastAPI()
def verify_password(plain_password, hashed_password):
- return pwd_context.verify(plain_password, hashed_password)
+ return password_hash.verify(plain_password, hashed_password)
def get_password_hash(password):
- return pwd_context.hash(password)
+ return password_hash.hash(password)
def get_user(db, username: str):
diff --git a/docs_src/security/tutorial005_py39.py b/docs_src/security/tutorial005_py39.py
index f9aed0a42..5bde47ef4 100644
--- a/docs_src/security/tutorial005_py39.py
+++ b/docs_src/security/tutorial005_py39.py
@@ -9,7 +9,7 @@ from fastapi.security import (
SecurityScopes,
)
from jwt.exceptions import InvalidTokenError
-from passlib.context import CryptContext
+from pwdlib import PasswordHash
from pydantic import BaseModel, ValidationError
# to get a string like this run:
@@ -24,14 +24,14 @@ fake_users_db = {
"username": "johndoe",
"full_name": "John Doe",
"email": "johndoe@example.com",
- "hashed_password": "$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW",
+ "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc",
"disabled": False,
},
"alice": {
"username": "alice",
"full_name": "Alice Chains",
"email": "alicechains@example.com",
- "hashed_password": "$2b$12$gSvqqUPvlXP2tfVFaWK1Be7DlH.PKZbv5H8KnzzVgXXbVxpva.pFm",
+ "hashed_password": "$argon2id$v=19$m=65536,t=3,p=4$g2/AV1zwopqUntPKJavBFw$BwpRGDCyUHLvHICnwijyX8ROGoiUPwNKZ7915MeYfCE",
"disabled": True,
},
}
@@ -58,7 +58,7 @@ class UserInDB(User):
hashed_password: str
-pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
+password_hash = PasswordHash.recommended()
oauth2_scheme = OAuth2PasswordBearer(
tokenUrl="token",
@@ -69,11 +69,11 @@ app = FastAPI()
def verify_password(plain_password, hashed_password):
- return pwd_context.verify(plain_password, hashed_password)
+ return password_hash.verify(plain_password, hashed_password)
def get_password_hash(password):
- return pwd_context.hash(password)
+ return password_hash.hash(password)
def get_user(db, username: str):
diff --git a/fastapi/__init__.py b/fastapi/__init__.py
index 986fd200c..03a5aaad5 100644
--- a/fastapi/__init__.py
+++ b/fastapi/__init__.py
@@ -1,6 +1,6 @@
"""FastAPI framework, high performance, easy to learn, fast to code, ready for production"""
-__version__ = "0.117.1"
+__version__ = "0.118.0"
from starlette import status as status
diff --git a/fastapi/applications.py b/fastapi/applications.py
index b3424efcc..915f5f70a 100644
--- a/fastapi/applications.py
+++ b/fastapi/applications.py
@@ -22,6 +22,7 @@ from fastapi.exception_handlers import (
)
from fastapi.exceptions import RequestValidationError, WebSocketRequestValidationError
from fastapi.logger import logger
+from fastapi.middleware.asyncexitstack import AsyncExitStackMiddleware
from fastapi.openapi.docs import (
get_redoc_html,
get_swagger_ui_html,
@@ -36,10 +37,12 @@ from starlette.datastructures import State
from starlette.exceptions import HTTPException
from starlette.middleware import Middleware
from starlette.middleware.base import BaseHTTPMiddleware
+from starlette.middleware.errors import ServerErrorMiddleware
+from starlette.middleware.exceptions import ExceptionMiddleware
from starlette.requests import Request
from starlette.responses import HTMLResponse, JSONResponse, Response
from starlette.routing import BaseRoute
-from starlette.types import ASGIApp, Lifespan, Receive, Scope, Send
+from starlette.types import ASGIApp, ExceptionHandler, Lifespan, Receive, Scope, Send
from typing_extensions import Annotated, Doc, deprecated
AppType = TypeVar("AppType", bound="FastAPI")
@@ -990,6 +993,54 @@ class FastAPI(Starlette):
self.middleware_stack: Union[ASGIApp, None] = None
self.setup()
+ def build_middleware_stack(self) -> ASGIApp:
+ # Duplicate/override from Starlette to add AsyncExitStackMiddleware
+ # inside of ExceptionMiddleware, inside of custom user middlewares
+ debug = self.debug
+ error_handler = None
+ exception_handlers: dict[Any, ExceptionHandler] = {}
+
+ for key, value in self.exception_handlers.items():
+ if key in (500, Exception):
+ error_handler = value
+ else:
+ exception_handlers[key] = value
+
+ middleware = (
+ [Middleware(ServerErrorMiddleware, handler=error_handler, debug=debug)]
+ + self.user_middleware
+ + [
+ Middleware(
+ ExceptionMiddleware, handlers=exception_handlers, debug=debug
+ ),
+ # Add FastAPI-specific AsyncExitStackMiddleware for closing files.
+ # Before this was also used for closing dependencies with yield but
+ # those now have their own AsyncExitStack, to properly support
+ # streaming responses while keeping compatibility with the previous
+ # versions (as of writing 0.117.1) that allowed doing
+ # except HTTPException inside a dependency with yield.
+ # This needs to happen after user middlewares because those create a
+ # new contextvars context copy by using a new AnyIO task group.
+ # This AsyncExitStack preserves the context for contextvars, not
+ # strictly necessary for closing files but it was one of the original
+ # intentions.
+ # If the AsyncExitStack lived outside of the custom middlewares and
+ # contextvars were set, for example in a dependency with 'yield'
+ # in that internal contextvars context, the values would not be
+ # available in the outer context of the AsyncExitStack.
+ # By placing the middleware and the AsyncExitStack here, inside all
+ # user middlewares, the same context is used.
+ # This is currently not needed, only for closing files, but used to be
+ # important when dependencies with yield were closed here.
+ Middleware(AsyncExitStackMiddleware),
+ ]
+ )
+
+ app = self.router
+ for cls, args, kwargs in reversed(middleware):
+ app = cls(app, *args, **kwargs)
+ return app
+
def openapi(self) -> Dict[str, Any]:
"""
Generate the OpenAPI schema of the application. This is called by FastAPI
diff --git a/fastapi/middleware/asyncexitstack.py b/fastapi/middleware/asyncexitstack.py
new file mode 100644
index 000000000..4ce3f5a62
--- /dev/null
+++ b/fastapi/middleware/asyncexitstack.py
@@ -0,0 +1,18 @@
+from contextlib import AsyncExitStack
+
+from starlette.types import ASGIApp, Receive, Scope, Send
+
+
+# Used mainly to close files after the request is done, dependencies are closed
+# in their own AsyncExitStack
+class AsyncExitStackMiddleware:
+ def __init__(
+ self, app: ASGIApp, context_name: str = "fastapi_middleware_astack"
+ ) -> None:
+ self.app = app
+ self.context_name = context_name
+
+ async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
+ async with AsyncExitStack() as stack:
+ scope[self.context_name] = stack
+ await self.app(scope, receive, send)
diff --git a/fastapi/routing.py b/fastapi/routing.py
index f620ced5f..65f739d95 100644
--- a/fastapi/routing.py
+++ b/fastapi/routing.py
@@ -1,5 +1,6 @@
import dataclasses
import email.message
+import functools
import inspect
import json
import sys
@@ -8,6 +9,7 @@ from enum import Enum, IntEnum
from typing import (
Any,
AsyncIterator,
+ Awaitable,
Callable,
Collection,
Coroutine,
@@ -59,6 +61,8 @@ from fastapi.utils import (
)
from pydantic import BaseModel
from starlette import routing
+from starlette._exception_handler import wrap_app_handling_exceptions
+from starlette._utils import is_async_callable
from starlette.concurrency import run_in_threadpool
from starlette.exceptions import HTTPException
from starlette.requests import Request
@@ -68,11 +72,9 @@ from starlette.routing import (
Match,
compile_path,
get_name,
- request_response,
- websocket_session,
)
from starlette.routing import Mount as Mount # noqa
-from starlette.types import AppType, ASGIApp, Lifespan, Scope
+from starlette.types import AppType, ASGIApp, Lifespan, Receive, Scope, Send
from starlette.websockets import WebSocket
from typing_extensions import Annotated, Doc, deprecated
@@ -82,6 +84,73 @@ else: # pragma: no cover
from asyncio import iscoroutinefunction
+# Copy of starlette.routing.request_response modified to include the
+# dependencies' AsyncExitStack
+def request_response(
+ func: Callable[[Request], Union[Awaitable[Response], Response]],
+) -> ASGIApp:
+ """
+ Takes a function or coroutine `func(request) -> response`,
+ and returns an ASGI application.
+ """
+ f: Callable[[Request], Awaitable[Response]] = (
+ func if is_async_callable(func) else functools.partial(run_in_threadpool, func) # type:ignore
+ )
+
+ async def app(scope: Scope, receive: Receive, send: Send) -> None:
+ request = Request(scope, receive, send)
+
+ async def app(scope: Scope, receive: Receive, send: Send) -> None:
+ # Starts customization
+ response_awaited = False
+ async with AsyncExitStack() as stack:
+ scope["fastapi_inner_astack"] = stack
+ # Same as in Starlette
+ response = await f(request)
+ await response(scope, receive, send)
+ # Continues customization
+ response_awaited = True
+ if not response_awaited:
+ raise FastAPIError(
+ "Response not awaited. There's a high chance that the "
+ "application code is raising an exception and a dependency with yield "
+ "has a block with a bare except, or a block with except Exception, "
+ "and is not raising the exception again. Read more about it in the "
+ "docs: https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-with-yield/#dependencies-with-yield-and-except"
+ )
+
+ # Same as in Starlette
+ await wrap_app_handling_exceptions(app, request)(scope, receive, send)
+
+ return app
+
+
+# Copy of starlette.routing.websocket_session modified to include the
+# dependencies' AsyncExitStack
+def websocket_session(
+ func: Callable[[WebSocket], Awaitable[None]],
+) -> ASGIApp:
+ """
+ Takes a coroutine `func(session)`, and returns an ASGI application.
+ """
+ # assert asyncio.iscoroutinefunction(func), "WebSocket endpoints must be async"
+
+ async def app(scope: Scope, receive: Receive, send: Send) -> None:
+ session = WebSocket(scope, receive=receive, send=send)
+
+ async def app(scope: Scope, receive: Receive, send: Send) -> None:
+ # Starts customization
+ async with AsyncExitStack() as stack:
+ scope["fastapi_inner_astack"] = stack
+ # Same as in Starlette
+ await func(session)
+
+ # Same as in Starlette
+ await wrap_app_handling_exceptions(app, session)(scope, receive, send)
+
+ return app
+
+
def _prepare_response_content(
res: Any,
*,
@@ -246,119 +315,120 @@ def get_request_handler(
async def app(request: Request) -> Response:
response: Union[Response, None] = None
- async with AsyncExitStack() as file_stack:
- try:
- body: Any = None
- if body_field:
- if is_body_form:
- body = await request.form()
- file_stack.push_async_callback(body.close)
- else:
- body_bytes = await request.body()
- if body_bytes:
- json_body: Any = Undefined
- content_type_value = request.headers.get("content-type")
- if not content_type_value:
- json_body = await request.json()
- else:
- message = email.message.Message()
- message["content-type"] = content_type_value
- if message.get_content_maintype() == "application":
- subtype = message.get_content_subtype()
- if subtype == "json" or subtype.endswith("+json"):
- json_body = await request.json()
- if json_body != Undefined:
- body = json_body
- else:
- body = body_bytes
- except json.JSONDecodeError as e:
- validation_error = RequestValidationError(
- [
- {
- "type": "json_invalid",
- "loc": ("body", e.pos),
- "msg": "JSON decode error",
- "input": {},
- "ctx": {"error": e.msg},
- }
- ],
- body=e.doc,
- )
- raise validation_error from e
- except HTTPException:
- # If a middleware raises an HTTPException, it should be raised again
- raise
- except Exception as e:
- http_error = HTTPException(
- status_code=400, detail="There was an error parsing the body"
- )
- raise http_error from e
- errors: List[Any] = []
- async with AsyncExitStack() as async_exit_stack:
- solved_result = await solve_dependencies(
- request=request,
- dependant=dependant,
- body=body,
- dependency_overrides_provider=dependency_overrides_provider,
- async_exit_stack=async_exit_stack,
- embed_body_fields=embed_body_fields,
+ file_stack = request.scope.get("fastapi_middleware_astack")
+ assert isinstance(file_stack, AsyncExitStack), (
+ "fastapi_middleware_astack not found in request scope"
+ )
+
+ # Read body and auto-close files
+ try:
+ body: Any = None
+ if body_field:
+ if is_body_form:
+ body = await request.form()
+ file_stack.push_async_callback(body.close)
+ else:
+ body_bytes = await request.body()
+ if body_bytes:
+ json_body: Any = Undefined
+ content_type_value = request.headers.get("content-type")
+ if not content_type_value:
+ json_body = await request.json()
+ else:
+ message = email.message.Message()
+ message["content-type"] = content_type_value
+ if message.get_content_maintype() == "application":
+ subtype = message.get_content_subtype()
+ if subtype == "json" or subtype.endswith("+json"):
+ json_body = await request.json()
+ if json_body != Undefined:
+ body = json_body
+ else:
+ body = body_bytes
+ except json.JSONDecodeError as e:
+ validation_error = RequestValidationError(
+ [
+ {
+ "type": "json_invalid",
+ "loc": ("body", e.pos),
+ "msg": "JSON decode error",
+ "input": {},
+ "ctx": {"error": e.msg},
+ }
+ ],
+ body=e.doc,
+ )
+ raise validation_error from e
+ except HTTPException:
+ # If a middleware raises an HTTPException, it should be raised again
+ raise
+ except Exception as e:
+ http_error = HTTPException(
+ status_code=400, detail="There was an error parsing the body"
+ )
+ raise http_error from e
+
+ # Solve dependencies and run path operation function, auto-closing dependencies
+ errors: List[Any] = []
+ async_exit_stack = request.scope.get("fastapi_inner_astack")
+ assert isinstance(async_exit_stack, AsyncExitStack), (
+ "fastapi_inner_astack not found in request scope"
+ )
+ solved_result = await solve_dependencies(
+ request=request,
+ dependant=dependant,
+ body=body,
+ dependency_overrides_provider=dependency_overrides_provider,
+ async_exit_stack=async_exit_stack,
+ embed_body_fields=embed_body_fields,
+ )
+ errors = solved_result.errors
+ if not errors:
+ raw_response = await run_endpoint_function(
+ dependant=dependant,
+ values=solved_result.values,
+ is_coroutine=is_coroutine,
+ )
+ if isinstance(raw_response, Response):
+ if raw_response.background is None:
+ raw_response.background = solved_result.background_tasks
+ response = raw_response
+ else:
+ response_args: Dict[str, Any] = {
+ "background": solved_result.background_tasks
+ }
+ # If status_code was set, use it, otherwise use the default from the
+ # response class, in the case of redirect it's 307
+ current_status_code = (
+ status_code if status_code else solved_result.response.status_code
)
- errors = solved_result.errors
- if not errors:
- raw_response = await run_endpoint_function(
- dependant=dependant,
- values=solved_result.values,
- is_coroutine=is_coroutine,
- )
- if isinstance(raw_response, Response):
- if raw_response.background is None:
- raw_response.background = solved_result.background_tasks
- response = raw_response
- else:
- response_args: Dict[str, Any] = {
- "background": solved_result.background_tasks
- }
- # If status_code was set, use it, otherwise use the default from the
- # response class, in the case of redirect it's 307
- current_status_code = (
- status_code
- if status_code
- else solved_result.response.status_code
- )
- if current_status_code is not None:
- response_args["status_code"] = current_status_code
- if solved_result.response.status_code:
- response_args["status_code"] = (
- solved_result.response.status_code
- )
- content = await serialize_response(
- field=response_field,
- response_content=raw_response,
- include=response_model_include,
- exclude=response_model_exclude,
- by_alias=response_model_by_alias,
- exclude_unset=response_model_exclude_unset,
- exclude_defaults=response_model_exclude_defaults,
- exclude_none=response_model_exclude_none,
- is_coroutine=is_coroutine,
- )
- response = actual_response_class(content, **response_args)
- if not is_body_allowed_for_status_code(response.status_code):
- response.body = b""
- response.headers.raw.extend(solved_result.response.headers.raw)
- if errors:
- validation_error = RequestValidationError(
- _normalize_errors(errors), body=body
+ if current_status_code is not None:
+ response_args["status_code"] = current_status_code
+ if solved_result.response.status_code:
+ response_args["status_code"] = solved_result.response.status_code
+ content = await serialize_response(
+ field=response_field,
+ response_content=raw_response,
+ include=response_model_include,
+ exclude=response_model_exclude,
+ by_alias=response_model_by_alias,
+ exclude_unset=response_model_exclude_unset,
+ exclude_defaults=response_model_exclude_defaults,
+ exclude_none=response_model_exclude_none,
+ is_coroutine=is_coroutine,
)
- raise validation_error
- if response is None:
- raise FastAPIError(
- "No response object was returned. There's a high chance that the "
- "application code is raising an exception and a dependency with yield "
- "has a block with a bare except, or a block with except Exception, "
- "and is not raising the exception again. Read more about it in the "
- "docs: https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-with-yield/#dependencies-with-yield-and-except"
+ response = actual_response_class(content, **response_args)
+ if not is_body_allowed_for_status_code(response.status_code):
+ response.body = b""
+ response.headers.raw.extend(solved_result.response.headers.raw)
+ if errors:
+ validation_error = RequestValidationError(
+ _normalize_errors(errors), body=body
)
+ raise validation_error
+
+ # Return response
+ assert response
return response
return app
@@ -370,24 +440,23 @@ def get_websocket_app(
embed_body_fields: bool = False,
) -> Callable[[WebSocket], Coroutine[Any, Any, Any]]:
async def app(websocket: WebSocket) -> None:
- async with AsyncExitStack() as async_exit_stack:
- # TODO: remove this scope later, after a few releases
- # This scope fastapi_astack is no longer used by FastAPI, kept for
- # compatibility, just in case
- websocket.scope["fastapi_astack"] = async_exit_stack
- solved_result = await solve_dependencies(
- request=websocket,
- dependant=dependant,
- dependency_overrides_provider=dependency_overrides_provider,
- async_exit_stack=async_exit_stack,
- embed_body_fields=embed_body_fields,
+ async_exit_stack = websocket.scope.get("fastapi_inner_astack")
+ assert isinstance(async_exit_stack, AsyncExitStack), (
+ "fastapi_inner_astack not found in request scope"
+ )
+ solved_result = await solve_dependencies(
+ request=websocket,
+ dependant=dependant,
+ dependency_overrides_provider=dependency_overrides_provider,
+ async_exit_stack=async_exit_stack,
+ embed_body_fields=embed_body_fields,
+ )
+ if solved_result.errors:
+ raise WebSocketRequestValidationError(
+ _normalize_errors(solved_result.errors)
)
- if solved_result.errors:
- raise WebSocketRequestValidationError(
- _normalize_errors(solved_result.errors)
- )
- assert dependant.call is not None, "dependant.call must be a function"
- await dependant.call(**solved_result.values)
+ assert dependant.call is not None, "dependant.call must be a function"
+ await dependant.call(**solved_result.values)
return app
diff --git a/pyproject.toml b/pyproject.toml
index fbfdea79a..41ef1eb76 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -172,8 +172,6 @@ junit_family = "xunit2"
filterwarnings = [
"error",
'ignore:starlette.middleware.wsgi is deprecated and will be removed in a future release\..*:DeprecationWarning:starlette',
- # For passlib
- "ignore:'crypt' is deprecated and slated for removal in Python 3.13:DeprecationWarning",
# see https://trio.readthedocs.io/en/stable/history.html#trio-0-22-0-2022-09-28
"ignore:You seem to already have a custom.*:RuntimeWarning:trio",
# TODO: remove after upgrading SQLAlchemy to a version that includes the following changes
diff --git a/requirements-tests.txt b/requirements-tests.txt
index e87a42162..53ec28d2e 100644
--- a/requirements-tests.txt
+++ b/requirements-tests.txt
@@ -9,7 +9,7 @@ flask >=1.1.2,<4.0.0
anyio[trio] >=3.2.1,<5.0.0
PyJWT==2.9.0
pyyaml >=5.3.1,<7.0.0
-passlib[bcrypt] >=1.7.2,<2.0.0
+pwdlib[argon2] >=0.2.1
inline-snapshot>=0.21.1
# types
types-ujson ==5.10.0.20240515
diff --git a/scripts/deploy_docs_status.py b/scripts/deploy_docs_status.py
index c652cdb6e..e620b15ba 100644
--- a/scripts/deploy_docs_status.py
+++ b/scripts/deploy_docs_status.py
@@ -1,7 +1,8 @@
import logging
import re
+from typing import Literal
-from github import Github
+from github import Auth, Github
from pydantic import BaseModel, SecretStr
from pydantic_settings import BaseSettings
@@ -12,7 +13,7 @@ class Settings(BaseSettings):
deploy_url: str | None = None
commit_sha: str
run_id: int
- is_done: bool = False
+ state: Literal["pending", "success", "error"] = "pending"
class LinkData(BaseModel):
@@ -26,7 +27,7 @@ def main() -> None:
settings = Settings()
logging.info(f"Using config: {settings.model_dump_json()}")
- g = Github(settings.github_token.get_secret_value())
+ g = Github(auth=Auth.Token(settings.github_token.get_secret_value()))
repo = g.get_repo(settings.github_repository)
use_pr = next(
(pr for pr in repo.get_pulls() if pr.head.sha == settings.commit_sha), None
@@ -37,24 +38,35 @@ def main() -> None:
commits = list(use_pr.get_commits())
current_commit = [c for c in commits if c.sha == settings.commit_sha][0]
run_url = f"https://github.com/{settings.github_repository}/actions/runs/{settings.run_id}"
- if settings.is_done and not settings.deploy_url:
+ if settings.state == "pending":
current_commit.create_status(
- state="success",
- description="No Docs Changes",
+ state="pending",
+ description="Deploying Docs",
context="deploy-docs",
target_url=run_url,
)
- logging.info("No docs changes found")
+ logging.info("No deploy URL available yet")
return
+ if settings.state == "error":
+ current_commit.create_status(
+ state="error",
+ description="Error Deploying Docs",
+ context="deploy-docs",
+ target_url=run_url,
+ )
+ logging.info("Error deploying docs")
+ return
+ assert settings.state == "success"
if not settings.deploy_url:
current_commit.create_status(
- state="pending",
- description="Deploying Docs",
+ state="success",
+ description="No Docs Changes",
context="deploy-docs",
target_url=run_url,
)
- logging.info("No deploy URL available yet")
+ logging.info("No docs changes found")
return
+ assert settings.deploy_url
current_commit.create_status(
state="success",
description="Docs Deployed",
@@ -104,7 +116,9 @@ def main() -> None:
current_lang_links.sort(key=lambda x: x.preview_link)
links.extend(current_lang_links)
- message = f"📝 Docs preview for commit {settings.commit_sha} at: {deploy_url}"
+ header = "## 📝 Docs preview"
+ message = header
+ message += f"\n\nLast commit {settings.commit_sha} at: {deploy_url}"
if links:
message += "\n\n### Modified Pages\n\n"
@@ -116,7 +130,17 @@ def main() -> None:
message += "\n"
print(message)
- use_pr.as_issue().create_comment(message)
+ issue = use_pr.as_issue()
+ comments = list(issue.get_comments())
+ for comment in comments:
+ if (
+ comment.body.startswith(header)
+ and comment.user.login == "github-actions[bot]"
+ ):
+ comment.edit(message)
+ break
+ else:
+ issue.create_comment(message)
logging.info("Finished")
diff --git a/scripts/mkdocs_hooks.py b/scripts/mkdocs_hooks.py
index e4a49165c..b9e4ff59e 100644
--- a/scripts/mkdocs_hooks.py
+++ b/scripts/mkdocs_hooks.py
@@ -132,6 +132,15 @@ def on_pre_page(page: Page, *, config: MkDocsConfig, files: Files) -> Page:
def on_page_markdown(
markdown: str, *, page: Page, config: MkDocsConfig, files: Files
) -> str:
+ # Set matadata["social"]["cards_layout_options"]["title"] to clean title (without
+ # permalink)
+ title = page.title
+ clean_title = title.split("{ #")[0]
+ if clean_title:
+ page.meta.setdefault("social", {})
+ page.meta["social"].setdefault("cards_layout_options", {})
+ page.meta["social"]["cards_layout_options"]["title"] = clean_title
+
if isinstance(page.file, EnFile):
for excluded_section in non_translated_sections:
if page.file.src_path.startswith(excluded_section):
diff --git a/tests/test_dependency_after_yield_raise.py b/tests/test_dependency_after_yield_raise.py
new file mode 100644
index 000000000..b560dc36f
--- /dev/null
+++ b/tests/test_dependency_after_yield_raise.py
@@ -0,0 +1,69 @@
+from typing import Any
+
+import pytest
+from fastapi import Depends, FastAPI, HTTPException
+from fastapi.testclient import TestClient
+from typing_extensions import Annotated
+
+
+class CustomError(Exception):
+ pass
+
+
+def catching_dep() -> Any:
+ try:
+ yield "s"
+ except CustomError as err:
+ raise HTTPException(status_code=418, detail="Session error") from err
+
+
+def broken_dep() -> Any:
+ yield "s"
+ raise ValueError("Broken after yield")
+
+
+app = FastAPI()
+
+
+@app.get("/catching")
+def catching(d: Annotated[str, Depends(catching_dep)]) -> Any:
+ raise CustomError("Simulated error during streaming")
+
+
+@app.get("/broken")
+def broken(d: Annotated[str, Depends(broken_dep)]) -> Any:
+ return {"message": "all good?"}
+
+
+client = TestClient(app)
+
+
+def test_catching():
+ response = client.get("/catching")
+ assert response.status_code == 418
+ assert response.json() == {"detail": "Session error"}
+
+
+def test_broken_raise():
+ with pytest.raises(ValueError, match="Broken after yield"):
+ client.get("/broken")
+
+
+def test_broken_no_raise():
+ """
+ When a dependency with yield raises after the yield (not in an except), the
+ response is already "successfully" sent back to the client, but there's still
+ an error in the server afterwards, an exception is raised and captured or shown
+ in the server logs.
+ """
+ with TestClient(app, raise_server_exceptions=False) as client:
+ response = client.get("/broken")
+ assert response.status_code == 200
+ assert response.json() == {"message": "all good?"}
+
+
+def test_broken_return_finishes():
+ client = TestClient(app, raise_server_exceptions=False)
+ response = client.get("/broken")
+ assert response.status_code == 200
+ assert response.json() == {"message": "all good?"}
diff --git a/tests/test_dependency_after_yield_streaming.py b/tests/test_dependency_after_yield_streaming.py
new file mode 100644
index 000000000..7e1c8822b
--- /dev/null
+++ b/tests/test_dependency_after_yield_streaming.py
@@ -0,0 +1,130 @@
+from contextlib import contextmanager
+from typing import Any, Generator
+
+import pytest
+from fastapi import Depends, FastAPI
+from fastapi.responses import StreamingResponse
+from fastapi.testclient import TestClient
+from typing_extensions import Annotated
+
+
+class Session:
+ def __init__(self) -> None:
+ self.data = ["foo", "bar", "baz"]
+ self.open = True
+
+ def __iter__(self) -> Generator[str, None, None]:
+ for item in self.data:
+ if self.open:
+ yield item
+ else:
+ raise ValueError("Session closed")
+
+
+@contextmanager
+def acquire_session() -> Generator[Session, None, None]:
+ session = Session()
+ try:
+ yield session
+ finally:
+ session.open = False
+
+
+def dep_session() -> Any:
+ with acquire_session() as s:
+ yield s
+
+
+def broken_dep_session() -> Any:
+ with acquire_session() as s:
+ s.open = False
+ yield s
+
+
+SessionDep = Annotated[Session, Depends(dep_session)]
+BrokenSessionDep = Annotated[Session, Depends(broken_dep_session)]
+
+app = FastAPI()
+
+
+@app.get("/data")
+def get_data(session: SessionDep) -> Any:
+ data = list(session)
+ return data
+
+
+@app.get("/stream-simple")
+def get_stream_simple(session: SessionDep) -> Any:
+ def iter_data():
+ yield from ["x", "y", "z"]
+
+ return StreamingResponse(iter_data())
+
+
+@app.get("/stream-session")
+def get_stream_session(session: SessionDep) -> Any:
+ def iter_data():
+ yield from session
+
+ return StreamingResponse(iter_data())
+
+
+@app.get("/broken-session-data")
+def get_broken_session_data(session: BrokenSessionDep) -> Any:
+ return list(session)
+
+
+@app.get("/broken-session-stream")
+def get_broken_session_stream(session: BrokenSessionDep) -> Any:
+ def iter_data():
+ yield from session
+
+ return StreamingResponse(iter_data())
+
+
+client = TestClient(app)
+
+
+def test_regular_no_stream():
+ response = client.get("/data")
+ assert response.json() == ["foo", "bar", "baz"]
+
+
+def test_stream_simple():
+ response = client.get("/stream-simple")
+ assert response.text == "xyz"
+
+
+def test_stream_session():
+ response = client.get("/stream-session")
+ assert response.text == "foobarbaz"
+
+
+def test_broken_session_data():
+ with pytest.raises(ValueError, match="Session closed"):
+ client.get("/broken-session-data")
+
+
+def test_broken_session_data_no_raise():
+ client = TestClient(app, raise_server_exceptions=False)
+ response = client.get("/broken-session-data")
+ assert response.status_code == 500
+ assert response.text == "Internal Server Error"
+
+
+def test_broken_session_stream_raise():
+ # Can raise ValueError on Pydantic v2 and ExceptionGroup on Pydantic v1
+ with pytest.raises((ValueError, Exception)):
+ client.get("/broken-session-stream")
+
+
+def test_broken_session_stream_no_raise():
+ """
+ When a dependency with yield raises after the streaming response already started
+ the 200 status code is already sent, but there's still an error in the server
+ afterwards, an exception is raised and captured or shown in the server logs.
+ """
+ with TestClient(app, raise_server_exceptions=False) as client:
+ response = client.get("/broken-session-stream")
+ assert response.status_code == 200
+ assert response.text == ""
diff --git a/tests/test_dependency_after_yield_websockets.py b/tests/test_dependency_after_yield_websockets.py
new file mode 100644
index 000000000..7c323c338
--- /dev/null
+++ b/tests/test_dependency_after_yield_websockets.py
@@ -0,0 +1,79 @@
+from contextlib import contextmanager
+from typing import Any, Generator
+
+import pytest
+from fastapi import Depends, FastAPI, WebSocket
+from fastapi.testclient import TestClient
+from typing_extensions import Annotated
+
+
+class Session:
+ def __init__(self) -> None:
+ self.data = ["foo", "bar", "baz"]
+ self.open = True
+
+ def __iter__(self) -> Generator[str, None, None]:
+ for item in self.data:
+ if self.open:
+ yield item
+ else:
+ raise ValueError("Session closed")
+
+
+@contextmanager
+def acquire_session() -> Generator[Session, None, None]:
+ session = Session()
+ try:
+ yield session
+ finally:
+ session.open = False
+
+
+def dep_session() -> Any:
+ with acquire_session() as s:
+ yield s
+
+
+def broken_dep_session() -> Any:
+ with acquire_session() as s:
+ s.open = False
+ yield s
+
+
+SessionDep = Annotated[Session, Depends(dep_session)]
+BrokenSessionDep = Annotated[Session, Depends(broken_dep_session)]
+
+app = FastAPI()
+
+
+@app.websocket("/ws")
+async def websocket_endpoint(websocket: WebSocket, session: SessionDep):
+ await websocket.accept()
+ for item in session:
+ await websocket.send_text(f"{item}")
+
+
+@app.websocket("/ws-broken")
+async def websocket_endpoint_broken(websocket: WebSocket, session: BrokenSessionDep):
+ await websocket.accept()
+ for item in session:
+ await websocket.send_text(f"{item}") # pragma no cover
+
+
+client = TestClient(app)
+
+
+def test_websocket_dependency_after_yield():
+ with client.websocket_connect("/ws") as websocket:
+ data = websocket.receive_text()
+ assert data == "foo"
+ data = websocket.receive_text()
+ assert data == "bar"
+ data = websocket.receive_text()
+ assert data == "baz"
+
+
+def test_websocket_dependency_after_yield_broken():
+ with pytest.raises(ValueError, match="Session closed"):
+ with client.websocket_connect("/ws-broken"):
+ pass # pragma no cover
diff --git a/tests/test_dependency_contextmanager.py b/tests/test_dependency_contextmanager.py
index 039c423b9..02c10458c 100644
--- a/tests/test_dependency_contextmanager.py
+++ b/tests/test_dependency_contextmanager.py
@@ -286,12 +286,12 @@ def test_background_tasks():
assert data["context_a"] == "started a"
assert data["bg"] == "not set"
middleware_state = json.loads(response.headers["x-state"])
- assert middleware_state["context_b"] == "finished b with a: started a"
- assert middleware_state["context_a"] == "finished a"
+ assert middleware_state["context_b"] == "started b"
+ assert middleware_state["context_a"] == "started a"
assert middleware_state["bg"] == "not set"
assert state["context_b"] == "finished b with a: started a"
assert state["context_a"] == "finished a"
- assert state["bg"] == "bg set - b: finished b with a: started a - a: finished a"
+ assert state["bg"] == "bg set - b: started b - a: started a"
def test_sync_raise_raises():
@@ -397,7 +397,4 @@ def test_sync_background_tasks():
assert data["sync_bg"] == "not set"
assert state["context_b"] == "finished b with a: started a"
assert state["context_a"] == "finished a"
- assert (
- state["sync_bg"]
- == "sync_bg set - b: finished b with a: started a - a: finished a"
- )
+ assert state["sync_bg"] == "sync_bg set - b: started b - a: started a"
diff --git a/tests/test_dependency_normal_exceptions.py b/tests/test_dependency_yield_except_httpexception.py
similarity index 100%
rename from tests/test_dependency_normal_exceptions.py
rename to tests/test_dependency_yield_except_httpexception.py
diff --git a/tests/test_route_scope.py b/tests/test_route_scope.py
index 2021c828f..792ea66c3 100644
--- a/tests/test_route_scope.py
+++ b/tests/test_route_scope.py
@@ -47,4 +47,4 @@ def test_websocket():
def test_websocket_invalid_path_doesnt_match():
with pytest.raises(WebSocketDisconnect):
with client.websocket_connect("/itemsx/portal-gun"):
- pass
+ pass # pragma: no cover
diff --git a/tests/test_tutorial/test_dependencies/test_tutorial008c.py b/tests/test_tutorial/test_dependencies/test_tutorial008c.py
index 11e96bf46..369b0a221 100644
--- a/tests/test_tutorial/test_dependencies/test_tutorial008c.py
+++ b/tests/test_tutorial/test_dependencies/test_tutorial008c.py
@@ -40,7 +40,7 @@ def test_fastapi_error(mod: ModuleType):
client = TestClient(mod.app)
with pytest.raises(FastAPIError) as exc_info:
client.get("/items/portal-gun")
- assert "No response object was returned" in exc_info.value.args[0]
+ assert "raising an exception and a dependency with yield" in exc_info.value.args[0]
def test_internal_server_error(mod: ModuleType):