diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 0a59adbd6..8979aabf8 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -12,9 +12,5 @@ updates:
directory: "/"
schedule:
interval: "monthly"
- groups:
- python-packages:
- patterns:
- - "*"
commit-message:
prefix: ⬆
diff --git a/README.md b/README.md
index 67275d29d..bcb18ac66 100644
--- a/README.md
+++ b/README.md
@@ -463,12 +463,12 @@ Used by Starlette:
* python-multipart - Required if you want to support form "parsing", with `request.form()`.
* itsdangerous - Required for `SessionMiddleware` support.
* pyyaml - Required for Starlette's `SchemaGenerator` support (you probably don't need it with FastAPI).
-* ujson - Required if you want to use `UJSONResponse`.
Used by FastAPI / Starlette:
* uvicorn - for the server that loads and serves your application.
* orjson - Required if you want to use `ORJSONResponse`.
+* ujson - Required if you want to use `UJSONResponse`.
You can install all of these with `pip install "fastapi[all]"`.
diff --git a/docs/bn/docs/index.md b/docs/bn/docs/index.md
index 688f3f95a..bbc3e9a3a 100644
--- a/docs/bn/docs/index.md
+++ b/docs/bn/docs/index.md
@@ -439,7 +439,6 @@ item: Item
Pydantic দ্বারা ব্যবহৃত:
-- ujson - দ্রুত JSON এর জন্য "parsing".
- email_validator - ইমেল যাচাইকরণের জন্য।
স্টারলেট দ্বারা ব্যবহৃত:
@@ -450,12 +449,12 @@ Pydantic দ্বারা ব্যবহৃত:
- itsdangerous - `SessionMiddleware` সহায়তার জন্য প্রয়োজন।
- pyyaml - স্টারলেটের SchemaGenerator সাপোর্ট এর জন্য প্রয়োজন (আপনার সম্ভাবত FastAPI প্রয়োজন নেই)।
- graphene - `GraphQLApp` সহায়তার জন্য প্রয়োজন।
-- ujson - আপনি `UJSONResponse` ব্যবহার করতে চাইলে প্রয়োজন।
FastAPI / Starlette দ্বারা ব্যবহৃত:
- uvicorn - সার্ভারের জন্য যা আপনার অ্যাপ্লিকেশন লোড করে এবং পরিবেশন করে।
- orjson - আপনি `ORJSONResponse` ব্যবহার করতে চাইলে প্রয়োজন।
+- ujson - আপনি `UJSONResponse` ব্যবহার করতে চাইলে প্রয়োজন।
আপনি এই সব ইনস্টল করতে পারেন `pip install fastapi[all]` দিয়ে.
diff --git a/docs/em/docs/index.md b/docs/em/docs/index.md
index cf4fa0def..c4e41ce17 100644
--- a/docs/em/docs/index.md
+++ b/docs/em/docs/index.md
@@ -454,7 +454,6 @@ item: Item
⚙️ Pydantic:
-* ujson - ⏩ 🎻 "🎻".
* email_validator - 📧 🔬.
⚙️ 💃:
@@ -464,12 +463,12 @@ item: Item
* python-multipart - ✔ 🚥 👆 💚 🐕🦺 📨 "✍", ⏮️ `request.form()`.
* itsdangerous - ✔ `SessionMiddleware` 🐕🦺.
* pyyaml - ✔ 💃 `SchemaGenerator` 🐕🦺 (👆 🎲 🚫 💪 ⚫️ ⏮️ FastAPI).
-* ujson - ✔ 🚥 👆 💚 ⚙️ `UJSONResponse`.
⚙️ FastAPI / 💃:
* uvicorn - 💽 👈 📐 & 🍦 👆 🈸.
* orjson - ✔ 🚥 👆 💚 ⚙️ `ORJSONResponse`.
+* ujson - ✔ 🚥 👆 💚 ⚙️ `UJSONResponse`.
👆 💪 ❎ 🌐 👫 ⏮️ `pip install "fastapi[all]"`.
diff --git a/docs/en/docs/index.md b/docs/en/docs/index.md
index 86b0c699b..a5ed8b330 100644
--- a/docs/en/docs/index.md
+++ b/docs/en/docs/index.md
@@ -465,12 +465,12 @@ Used by Starlette:
* python-multipart - Required if you want to support form "parsing", with `request.form()`.
* itsdangerous - Required for `SessionMiddleware` support.
* pyyaml - Required for Starlette's `SchemaGenerator` support (you probably don't need it with FastAPI).
-* ujson - Required if you want to use `UJSONResponse`.
Used by FastAPI / Starlette:
* uvicorn - for the server that loads and serves your application.
* orjson - Required if you want to use `ORJSONResponse`.
+* ujson - Required if you want to use `UJSONResponse`.
You can install all of these with `pip install "fastapi[all]"`.
diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md
index f7342373b..a950414bf 100644
--- a/docs/en/docs/release-notes.md
+++ b/docs/en/docs/release-notes.md
@@ -7,16 +7,27 @@ hide:
## Latest Changes
+### Internal
+
+* ⬆️ Upgrade MkDocs Material and re-enable cards. PR [#11466](https://github.com/tiangolo/fastapi/pull/11466) by [@tiangolo](https://github.com/tiangolo).
+* ⬆ Bump pillow from 10.2.0 to 10.3.0. PR [#11403](https://github.com/tiangolo/fastapi/pull/11403) by [@dependabot[bot]](https://github.com/apps/dependabot).
+* 🔧 Ungroup dependabot updates. PR [#11465](https://github.com/tiangolo/fastapi/pull/11465) by [@tiangolo](https://github.com/tiangolo).
+
+## 0.110.2
+
### Fixes
* 🐛 Fix support for query parameters with list types, handle JSON encoding Pydantic `UndefinedType`. PR [#9929](https://github.com/tiangolo/fastapi/pull/9929) by [@arjwilliams](https://github.com/arjwilliams).
### Refactors
+* ♻️ Simplify Pydantic configs in OpenAPI models in `fastapi/openapi/models.py`. PR [#10886](https://github.com/tiangolo/fastapi/pull/10886) by [@JoeTanto2](https://github.com/JoeTanto2).
* ✨ Add support for Pydantic's 2.7 new deprecated Field parameter, remove URL from validation errors response. PR [#11461](https://github.com/tiangolo/fastapi/pull/11461) by [@tiangolo](https://github.com/tiangolo).
### Docs
+* 📝 Fix types in examples under `docs_src/extra_data_types`. PR [#10535](https://github.com/tiangolo/fastapi/pull/10535) by [@nilslindemann](https://github.com/nilslindemann).
+* 📝 Update references to UJSON. PR [#11464](https://github.com/tiangolo/fastapi/pull/11464) by [@tiangolo](https://github.com/tiangolo).
* 📝 Tweak docs and translations links, typos, format. PR [#11389](https://github.com/tiangolo/fastapi/pull/11389) by [@nilslindemann](https://github.com/nilslindemann).
* 📝 Fix typo in `docs/es/docs/async.md`. PR [#11400](https://github.com/tiangolo/fastapi/pull/11400) by [@fabianfalon](https://github.com/fabianfalon).
* 📝 Update OpenAPI client generation docs to use `@hey-api/openapi-ts`. PR [#11339](https://github.com/tiangolo/fastapi/pull/11339) by [@jordanshatford](https://github.com/jordanshatford).
diff --git a/docs/en/mkdocs.insiders.yml b/docs/en/mkdocs.insiders.yml
index 8f3538a80..d204974b8 100644
--- a/docs/en/mkdocs.insiders.yml
+++ b/docs/en/mkdocs.insiders.yml
@@ -1,8 +1,7 @@
plugins:
- # TODO: Re-enable once this is fixed: https://github.com/squidfunk/mkdocs-material/issues/6983
- # social:
- # cards_layout_dir: ../en/layouts
- # cards_layout: custom
- # cards_layout_options:
- # logo: ../en/docs/img/icon-white.svg
+ social:
+ cards_layout_dir: ../en/layouts
+ cards_layout: custom
+ cards_layout_options:
+ logo: ../en/docs/img/icon-white.svg
typeset:
diff --git a/docs/es/docs/index.md b/docs/es/docs/index.md
index 776d98ce5..9fc275caf 100644
--- a/docs/es/docs/index.md
+++ b/docs/es/docs/index.md
@@ -452,12 +452,12 @@ Usados por Starlette:
* itsdangerous - Requerido para dar soporte a `SessionMiddleware`.
* pyyaml - Requerido para dar soporte al `SchemaGenerator` de Starlette (probablemente no lo necesites con FastAPI).
* graphene - Requerido para dar soporte a `GraphQLApp`.
-* ujson - Requerido si quieres usar `UJSONResponse`.
Usado por FastAPI / Starlette:
* uvicorn - para el servidor que carga y sirve tu aplicación.
* orjson - Requerido si quieres usar `ORJSONResponse`.
+* ujson - Requerido si quieres usar `UJSONResponse`.
Puedes instalarlos con `pip install fastapi[all]`.
diff --git a/docs/fa/docs/index.md b/docs/fa/docs/index.md
index 71c23b7f7..623bc0f75 100644
--- a/docs/fa/docs/index.md
+++ b/docs/fa/docs/index.md
@@ -456,12 +456,12 @@ item: Item
* itsdangerous - در صورتی که بخواید از `SessionMiddleware` پشتیبانی کنید.
* pyyaml - برای پشتیبانی `SchemaGenerator` در Starlet (به احتمال زیاد برای کار کردن با FastAPI به آن نیازی پیدا نمیکنید).
* graphene - در صورتی که از `GraphQLApp` پشتیبانی میکنید.
-* ujson - در صورتی که بخواهید از `UJSONResponse` استفاده کنید.
استفاده شده توسط FastAPI / Starlette:
* uvicorn - برای سرور اجرا کننده برنامه وب.
* orjson - در صورتی که بخواهید از `ORJSONResponse` استفاده کنید.
+* ujson - در صورتی که بخواهید از `UJSONResponse` استفاده کنید.
میتوان همه این موارد را با استفاده از دستور `pip install fastapi[all]`. به صورت یکجا نصب کرد.
diff --git a/docs/fr/docs/index.md b/docs/fr/docs/index.md
index eb02e2a0c..324681a74 100644
--- a/docs/fr/docs/index.md
+++ b/docs/fr/docs/index.md
@@ -463,12 +463,12 @@ Utilisées par Starlette :
* python-multipart - Obligatoire si vous souhaitez supporter le "décodage" de formulaire avec `request.form()`.
* itsdangerous - Obligatoire pour la prise en charge de `SessionMiddleware`.
* pyyaml - Obligatoire pour le support `SchemaGenerator` de Starlette (vous n'en avez probablement pas besoin avec FastAPI).
-* ujson - Obligatoire si vous souhaitez utiliser `UJSONResponse`.
Utilisées par FastAPI / Starlette :
* uvicorn - Pour le serveur qui charge et sert votre application.
* orjson - Obligatoire si vous voulez utiliser `ORJSONResponse`.
+* ujson - Obligatoire si vous souhaitez utiliser `UJSONResponse`.
Vous pouvez tout installer avec `pip install fastapi[all]`.
diff --git a/docs/he/docs/index.md b/docs/he/docs/index.md
index 8f1f2a124..621126128 100644
--- a/docs/he/docs/index.md
+++ b/docs/he/docs/index.md
@@ -458,12 +458,12 @@ item: Item
- python-multipart - דרוש אם ברצונכם לתמוך ב "פרסור" טפסים, באצמעות request.form().
- itsdangerous - דרוש אם ברצונכם להשתמש ב - `SessionMiddleware`.
- pyyaml - דרוש אם ברצונכם להשתמש ב - `SchemaGenerator` של Starlette (כנראה שאתם לא צריכים את זה עם FastAPI).
-- ujson - דרוש אם ברצונכם להשתמש ב - `UJSONResponse`.
בשימוש FastAPI / Starlette:
- uvicorn - לשרת שטוען ומגיש את האפליקציה שלכם.
- orjson - דרוש אם ברצונכם להשתמש ב - `ORJSONResponse`.
+- ujson - דרוש אם ברצונכם להשתמש ב - `UJSONResponse`.
תוכלו להתקין את כל אלו באמצעות pip install "fastapi[all]".
diff --git a/docs/hu/docs/index.md b/docs/hu/docs/index.md
index 75ea88c4d..896db6d1f 100644
--- a/docs/hu/docs/index.md
+++ b/docs/hu/docs/index.md
@@ -456,12 +456,12 @@ Starlette által használt:
* 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).
-* ujson - Követelmény ha `UJSONResponse`-t akarsz használni.
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.
diff --git a/docs/it/docs/index.md b/docs/it/docs/index.md
index a69008d2b..c06d3a174 100644
--- a/docs/it/docs/index.md
+++ b/docs/it/docs/index.md
@@ -438,7 +438,6 @@ Per approfondire, consulta la sezione ujson - per un "parsing" di JSON più veloce.
* email_validator - per la validazione di email.
Usate da Starlette:
@@ -450,12 +449,12 @@ Usate da Starlette:
* 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`.
-* ujson - Richiesto se vuoi usare `UJSONResponse`.
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]`.
diff --git a/docs/ja/docs/index.md b/docs/ja/docs/index.md
index 37cddae5e..a991222cb 100644
--- a/docs/ja/docs/index.md
+++ b/docs/ja/docs/index.md
@@ -450,12 +450,12 @@ Starlette によって使用されるもの:
- itsdangerous - `SessionMiddleware` サポートのためには必要です。
- pyyaml - Starlette の `SchemaGenerator` サポートのために必要です。 (FastAPI では必要ないでしょう。)
- graphene - `GraphQLApp` サポートのためには必要です。
-- ujson - `UJSONResponse`を使用する場合は必須です。
FastAPI / Starlette に使用されるもの:
- uvicorn - アプリケーションをロードしてサーブするサーバーのため。
- orjson - `ORJSONResponse`を使用したい場合は必要です。
+- ujson - `UJSONResponse`を使用する場合は必須です。
これらは全て `pip install fastapi[all]`でインストールできます。
diff --git a/docs/ko/docs/index.md b/docs/ko/docs/index.md
index 85482718e..dea087332 100644
--- a/docs/ko/docs/index.md
+++ b/docs/ko/docs/index.md
@@ -456,12 +456,12 @@ Starlette이 사용하는:
* itsdangerous - `SessionMiddleware` 지원을 위해 필요.
* pyyaml - Starlette의 `SchemaGenerator` 지원을 위해 필요 (FastAPI와 쓸때는 필요 없을 것입니다).
* graphene - `GraphQLApp` 지원을 위해 필요.
-* ujson - `UJSONResponse`를 사용하려면 필요.
FastAPI / Starlette이 사용하는:
* uvicorn - 애플리케이션을 로드하고 제공하는 서버.
* orjson - `ORJSONResponse`을 사용하려면 필요.
+* ujson - `UJSONResponse`를 사용하려면 필요.
`pip install fastapi[all]`를 통해 이 모두를 설치 할 수 있습니다.
diff --git a/docs/pl/docs/index.md b/docs/pl/docs/index.md
index b168b9e5e..06fa706bc 100644
--- a/docs/pl/docs/index.md
+++ b/docs/pl/docs/index.md
@@ -455,12 +455,12 @@ Używane przez Starlette:
* itsdangerous - Wymagany dla wsparcia `SessionMiddleware`.
* pyyaml - Wymagane dla wsparcia `SchemaGenerator` z Starlette (z FastAPI prawdopodobnie tego nie potrzebujesz).
* graphene - Wymagane dla wsparcia `GraphQLApp`.
-* ujson - Wymagane jeżeli chcesz korzystać z `UJSONResponse`.
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]`.
diff --git a/docs/pt/docs/index.md b/docs/pt/docs/index.md
index 1a29a9bea..86b77f117 100644
--- a/docs/pt/docs/index.md
+++ b/docs/pt/docs/index.md
@@ -449,12 +449,12 @@ Usados por Starlette:
* itsdangerous - Necessário para suporte a `SessionMiddleware`.
* pyyaml - Necessário para suporte a `SchemaGenerator` da Starlette (você provavelmente não precisará disso com o FastAPI).
* graphene - Necessário para suporte a `GraphQLApp`.
-* ujson - Necessário se você quer utilizar `UJSONResponse`.
Usados por FastAPI / Starlette:
* uvicorn - para o servidor que carrega e serve sua aplicação.
* orjson - Necessário se você quer utilizar `ORJSONResponse`.
+* ujson - Necessário se você quer utilizar `UJSONResponse`.
Você pode instalar todas essas dependências com `pip install fastapi[all]`.
diff --git a/docs/ru/docs/index.md b/docs/ru/docs/index.md
index e9ecfa520..81c3835d9 100644
--- a/docs/ru/docs/index.md
+++ b/docs/ru/docs/index.md
@@ -457,12 +457,12 @@ item: Item
* python-multipart - Обязательно, если вы хотите поддерживать форму "парсинга" с помощью `request.form()`.
* itsdangerous - Обязательно, для поддержки `SessionMiddleware`.
* pyyaml - Обязательно, для поддержки `SchemaGenerator` Starlette (возможно, вам это не нужно с FastAPI).
-* ujson - Обязательно, если вы хотите использовать `UJSONResponse`.
Используется FastAPI / Starlette:
* uvicorn - сервер, который загружает и обслуживает ваше приложение.
* orjson - Обязательно, если вы хотите использовать `ORJSONResponse`.
+* ujson - Обязательно, если вы хотите использовать `UJSONResponse`.
Вы можете установить все это с помощью `pip install "fastapi[all]"`.
diff --git a/docs/tr/docs/index.md b/docs/tr/docs/index.md
index 1c72595c5..67a9b4462 100644
--- a/docs/tr/docs/index.md
+++ b/docs/tr/docs/index.md
@@ -465,12 +465,12 @@ Starlette tarafında kullanılan:
* python-multipart - Eğer `request.form()` ile form dönüşümü desteğini kullanacaksanız gereklidir.
* itsdangerous - `SessionMiddleware` desteği için gerekli.
* pyyaml - `SchemaGenerator` desteği için gerekli (Muhtemelen FastAPI kullanırken ihtiyacınız olmaz).
-* ujson - `UJSONResponse` kullanacaksanız gerekli.
Hem FastAPI hem de Starlette tarafından kullanılan:
* uvicorn - oluşturduğumuz uygulamayı servis edecek web sunucusu görevini üstlenir.
* orjson - `ORJSONResponse` kullanacaksanız gereklidir.
+* ujson - `UJSONResponse` kullanacaksanız gerekli.
Bunların hepsini `pip install fastapi[all]` ile yükleyebilirsin.
diff --git a/docs/uk/docs/index.md b/docs/uk/docs/index.md
index 32f1f544a..bb21b68c2 100644
--- a/docs/uk/docs/index.md
+++ b/docs/uk/docs/index.md
@@ -451,12 +451,12 @@ Starlette використовує:
* python-multipart - Необхідно, якщо Ви хочете підтримувати "розбір" форми за допомогою `request.form()`.
* itsdangerous - Необхідно для підтримки `SessionMiddleware`.
* pyyaml - Необхідно для підтримки Starlette `SchemaGenerator` (ймовірно, вам це не потрібно з FastAPI).
-* ujson - Необхідно, якщо Ви хочете використовувати `UJSONResponse`.
FastAPI / Starlette використовують:
* uvicorn - для сервера, який завантажує та обслуговує вашу програму.
* orjson - Необхідно, якщо Ви хочете використовувати `ORJSONResponse`.
+* ujson - Необхідно, якщо Ви хочете використовувати `UJSONResponse`.
Ви можете встановити все це за допомогою `pip install fastapi[all]`.
diff --git a/docs/vi/docs/index.md b/docs/vi/docs/index.md
index eb078bc4a..652218afa 100644
--- a/docs/vi/docs/index.md
+++ b/docs/vi/docs/index.md
@@ -457,7 +457,6 @@ Independent TechEmpower benchmarks cho thấy các ứng dụng **FastAPI** ch
Sử dụng bởi Pydantic:
-* ujson - "Parse" JSON nhanh hơn.
* email_validator - cho email validation.
Sử dụng Starlette:
@@ -467,12 +466,12 @@ Sử dụng Starlette:
* python-multipart - Bắt buộc nếu bạn muốn hỗ trợ "parsing", form với `request.form()`.
* itsdangerous - Bắt buộc để hỗ trợ `SessionMiddleware`.
* pyyaml - Bắt buộc để hỗ trợ `SchemaGenerator` cho Starlette (bạn có thể không cần nó trong FastAPI).
-* ujson - Bắt buộc nếu bạn muốn sử dụng `UJSONResponse`.
Sử dụng bởi FastAPI / Starlette:
* uvicorn - Server để chạy ứng dụng của bạn.
* orjson - Bắt buộc nếu bạn muốn sử dụng `ORJSONResponse`.
+* ujson - Bắt buộc nếu bạn muốn sử dụng `UJSONResponse`.
Bạn có thể cài đặt tất cả những dependency trên với `pip install "fastapi[all]"`.
diff --git a/docs/yo/docs/index.md b/docs/yo/docs/index.md
index c3c709350..352bf4df8 100644
--- a/docs/yo/docs/index.md
+++ b/docs/yo/docs/index.md
@@ -465,12 +465,12 @@ Láti ní òye síi nípa rẹ̀, wo abala àwọn 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).
-* ujson - Nílò tí ó bá fẹ́ láti lọ `UJSONResponse`.
È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]"`.
diff --git a/docs/zh-hant/docs/index.md b/docs/zh-hant/docs/index.md
index 9859d3c51..f90eb2177 100644
--- a/docs/zh-hant/docs/index.md
+++ b/docs/zh-hant/docs/index.md
@@ -456,12 +456,12 @@ item: Item
- python-multipart - 需要使用 `request.form()` 對表單進行 "解析" 時安裝。
- itsdangerous - 需要使用 `SessionMiddleware` 支援時安裝。
- pyyaml - 用於支援 Starlette 的 `SchemaGenerator` (如果你使用 FastAPI,可能不需要它)。
-- ujson - 使用 `UJSONResponse` 時必須安裝。
用於 FastAPI / Starlette:
- uvicorn - 用於加載和運行應用程式的服務器。
- orjson - 使用 `ORJSONResponse`時必須安裝。
+- ujson - 使用 `UJSONResponse` 時必須安裝。
你可以使用 `pip install "fastapi[all]"` 來安裝這些所有依賴套件。
diff --git a/docs/zh/docs/index.md b/docs/zh/docs/index.md
index dfe5af827..2a67e8d08 100644
--- a/docs/zh/docs/index.md
+++ b/docs/zh/docs/index.md
@@ -459,12 +459,12 @@ item: Item
* itsdangerous - 需要 `SessionMiddleware` 支持时安装。
* pyyaml - 使用 Starlette 提供的 `SchemaGenerator` 时安装(有 FastAPI 你可能并不需要它)。
* graphene - 需要 `GraphQLApp` 支持时安装。
-* ujson - 使用 `UJSONResponse` 时安装。
用于 FastAPI / Starlette:
* uvicorn - 用于加载和运行你的应用程序的服务器。
* orjson - 使用 `ORJSONResponse` 时安装。
+* ujson - 使用 `UJSONResponse` 时安装。
你可以通过 `pip install "fastapi[all]"` 命令来安装以上所有依赖。
diff --git a/docs_src/extra_data_types/tutorial001.py b/docs_src/extra_data_types/tutorial001.py
index 8ae8472a7..71de958ff 100644
--- a/docs_src/extra_data_types/tutorial001.py
+++ b/docs_src/extra_data_types/tutorial001.py
@@ -10,10 +10,10 @@ app = FastAPI()
@app.put("/items/{item_id}")
async def read_items(
item_id: UUID,
- start_datetime: Union[datetime, None] = Body(default=None),
- end_datetime: Union[datetime, None] = Body(default=None),
+ start_datetime: datetime = Body(),
+ end_datetime: datetime = Body(),
+ process_after: timedelta = Body(),
repeat_at: Union[time, None] = Body(default=None),
- process_after: Union[timedelta, None] = Body(default=None),
):
start_process = start_datetime + process_after
duration = end_datetime - start_process
@@ -21,8 +21,8 @@ async def read_items(
"item_id": item_id,
"start_datetime": start_datetime,
"end_datetime": end_datetime,
- "repeat_at": repeat_at,
"process_after": process_after,
+ "repeat_at": repeat_at,
"start_process": start_process,
"duration": duration,
}
diff --git a/docs_src/extra_data_types/tutorial001_an.py b/docs_src/extra_data_types/tutorial001_an.py
index a4c074241..257d0c7c8 100644
--- a/docs_src/extra_data_types/tutorial001_an.py
+++ b/docs_src/extra_data_types/tutorial001_an.py
@@ -11,10 +11,10 @@ app = FastAPI()
@app.put("/items/{item_id}")
async def read_items(
item_id: UUID,
- start_datetime: Annotated[Union[datetime, None], Body()] = None,
- end_datetime: Annotated[Union[datetime, None], Body()] = None,
+ start_datetime: Annotated[datetime, Body()],
+ end_datetime: Annotated[datetime, Body()],
+ process_after: Annotated[timedelta, Body()],
repeat_at: Annotated[Union[time, None], Body()] = None,
- process_after: Annotated[Union[timedelta, None], Body()] = None,
):
start_process = start_datetime + process_after
duration = end_datetime - start_process
@@ -22,8 +22,8 @@ async def read_items(
"item_id": item_id,
"start_datetime": start_datetime,
"end_datetime": end_datetime,
- "repeat_at": repeat_at,
"process_after": process_after,
+ "repeat_at": repeat_at,
"start_process": start_process,
"duration": duration,
}
diff --git a/docs_src/extra_data_types/tutorial001_an_py310.py b/docs_src/extra_data_types/tutorial001_an_py310.py
index 4f69c40d9..668bf1909 100644
--- a/docs_src/extra_data_types/tutorial001_an_py310.py
+++ b/docs_src/extra_data_types/tutorial001_an_py310.py
@@ -10,10 +10,10 @@ app = FastAPI()
@app.put("/items/{item_id}")
async def read_items(
item_id: UUID,
- start_datetime: Annotated[datetime | None, Body()] = None,
- end_datetime: Annotated[datetime | None, Body()] = None,
+ start_datetime: Annotated[datetime, Body()],
+ end_datetime: Annotated[datetime, Body()],
+ process_after: Annotated[timedelta, Body()],
repeat_at: Annotated[time | None, Body()] = None,
- process_after: Annotated[timedelta | None, Body()] = None,
):
start_process = start_datetime + process_after
duration = end_datetime - start_process
@@ -21,8 +21,8 @@ async def read_items(
"item_id": item_id,
"start_datetime": start_datetime,
"end_datetime": end_datetime,
- "repeat_at": repeat_at,
"process_after": process_after,
+ "repeat_at": repeat_at,
"start_process": start_process,
"duration": duration,
}
diff --git a/docs_src/extra_data_types/tutorial001_an_py39.py b/docs_src/extra_data_types/tutorial001_an_py39.py
index 630d36ae3..fa3551d66 100644
--- a/docs_src/extra_data_types/tutorial001_an_py39.py
+++ b/docs_src/extra_data_types/tutorial001_an_py39.py
@@ -10,10 +10,10 @@ app = FastAPI()
@app.put("/items/{item_id}")
async def read_items(
item_id: UUID,
- start_datetime: Annotated[Union[datetime, None], Body()] = None,
- end_datetime: Annotated[Union[datetime, None], Body()] = None,
+ start_datetime: Annotated[datetime, Body()],
+ end_datetime: Annotated[datetime, Body()],
+ process_after: Annotated[timedelta, Body()],
repeat_at: Annotated[Union[time, None], Body()] = None,
- process_after: Annotated[Union[timedelta, None], Body()] = None,
):
start_process = start_datetime + process_after
duration = end_datetime - start_process
@@ -21,8 +21,8 @@ async def read_items(
"item_id": item_id,
"start_datetime": start_datetime,
"end_datetime": end_datetime,
- "repeat_at": repeat_at,
"process_after": process_after,
+ "repeat_at": repeat_at,
"start_process": start_process,
"duration": duration,
}
diff --git a/docs_src/extra_data_types/tutorial001_py310.py b/docs_src/extra_data_types/tutorial001_py310.py
index d22f81888..a275a0577 100644
--- a/docs_src/extra_data_types/tutorial001_py310.py
+++ b/docs_src/extra_data_types/tutorial001_py310.py
@@ -9,10 +9,10 @@ app = FastAPI()
@app.put("/items/{item_id}")
async def read_items(
item_id: UUID,
- start_datetime: datetime | None = Body(default=None),
- end_datetime: datetime | None = Body(default=None),
+ start_datetime: datetime = Body(),
+ end_datetime: datetime = Body(),
+ process_after: timedelta = Body(),
repeat_at: time | None = Body(default=None),
- process_after: timedelta | None = Body(default=None),
):
start_process = start_datetime + process_after
duration = end_datetime - start_process
@@ -20,8 +20,8 @@ async def read_items(
"item_id": item_id,
"start_datetime": start_datetime,
"end_datetime": end_datetime,
- "repeat_at": repeat_at,
"process_after": process_after,
+ "repeat_at": repeat_at,
"start_process": start_process,
"duration": duration,
}
diff --git a/fastapi/__init__.py b/fastapi/__init__.py
index 5a77101fb..f28657712 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.110.1"
+__version__ = "0.110.2"
from starlette import status as status
diff --git a/fastapi/openapi/models.py b/fastapi/openapi/models.py
index 5f3bdbb20..ed07b40f5 100644
--- a/fastapi/openapi/models.py
+++ b/fastapi/openapi/models.py
@@ -55,35 +55,29 @@ except ImportError: # pragma: no cover
return with_info_plain_validator_function(cls._validate)
-class Contact(BaseModel):
+class BaseModelWithConfig(BaseModel):
+ if PYDANTIC_V2:
+ model_config = {"extra": "allow"}
+
+ else:
+
+ class Config:
+ extra = "allow"
+
+
+class Contact(BaseModelWithConfig):
name: Optional[str] = None
url: Optional[AnyUrl] = None
email: Optional[EmailStr] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
- else:
-
- class Config:
- extra = "allow"
-
-
-class License(BaseModel):
+class License(BaseModelWithConfig):
name: str
identifier: Optional[str] = None
url: Optional[AnyUrl] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
- else:
-
- class Config:
- extra = "allow"
-
-
-class Info(BaseModel):
+class Info(BaseModelWithConfig):
title: str
summary: Optional[str] = None
description: Optional[str] = None
@@ -92,42 +86,18 @@ class Info(BaseModel):
license: Optional[License] = None
version: str
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
- else:
-
- class Config:
- extra = "allow"
-
-
-class ServerVariable(BaseModel):
+class ServerVariable(BaseModelWithConfig):
enum: Annotated[Optional[List[str]], Field(min_length=1)] = None
default: str
description: Optional[str] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
- else:
-
- class Config:
- extra = "allow"
-
-
-class Server(BaseModel):
+class Server(BaseModelWithConfig):
url: Union[AnyUrl, str]
description: Optional[str] = None
variables: Optional[Dict[str, ServerVariable]] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
-
- else:
-
- class Config:
- extra = "allow"
-
class Reference(BaseModel):
ref: str = Field(alias="$ref")
@@ -138,36 +108,20 @@ class Discriminator(BaseModel):
mapping: Optional[Dict[str, str]] = None
-class XML(BaseModel):
+class XML(BaseModelWithConfig):
name: Optional[str] = None
namespace: Optional[str] = None
prefix: Optional[str] = None
attribute: Optional[bool] = None
wrapped: Optional[bool] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
- else:
-
- class Config:
- extra = "allow"
-
-
-class ExternalDocumentation(BaseModel):
+class ExternalDocumentation(BaseModelWithConfig):
description: Optional[str] = None
url: AnyUrl
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
- else:
-
- class Config:
- extra = "allow"
-
-
-class Schema(BaseModel):
+class Schema(BaseModelWithConfig):
# Ref: JSON Schema 2020-12: https://json-schema.org/draft/2020-12/json-schema-core.html#name-the-json-schema-core-vocabu
# Core Vocabulary
schema_: Optional[str] = Field(default=None, alias="$schema")
@@ -253,14 +207,6 @@ class Schema(BaseModel):
),
] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
-
- else:
-
- class Config:
- extra = "allow"
-
# Ref: https://json-schema.org/draft/2020-12/json-schema-core.html#name-json-schema-documents
# A JSON Schema MUST be an object or a boolean.
@@ -289,38 +235,22 @@ class ParameterInType(Enum):
cookie = "cookie"
-class Encoding(BaseModel):
+class Encoding(BaseModelWithConfig):
contentType: Optional[str] = None
headers: Optional[Dict[str, Union["Header", Reference]]] = None
style: Optional[str] = None
explode: Optional[bool] = None
allowReserved: Optional[bool] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
- else:
-
- class Config:
- extra = "allow"
-
-
-class MediaType(BaseModel):
+class MediaType(BaseModelWithConfig):
schema_: Optional[Union[Schema, Reference]] = Field(default=None, alias="schema")
example: Optional[Any] = None
examples: Optional[Dict[str, Union[Example, Reference]]] = None
encoding: Optional[Dict[str, Encoding]] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
- else:
-
- class Config:
- extra = "allow"
-
-
-class ParameterBase(BaseModel):
+class ParameterBase(BaseModelWithConfig):
description: Optional[str] = None
required: Optional[bool] = None
deprecated: Optional[bool] = None
@@ -334,14 +264,6 @@ class ParameterBase(BaseModel):
# Serialization rules for more complex scenarios
content: Optional[Dict[str, MediaType]] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
-
- else:
-
- class Config:
- extra = "allow"
-
class Parameter(ParameterBase):
name: str
@@ -352,21 +274,13 @@ class Header(ParameterBase):
pass
-class RequestBody(BaseModel):
+class RequestBody(BaseModelWithConfig):
description: Optional[str] = None
content: Dict[str, MediaType]
required: Optional[bool] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
- else:
-
- class Config:
- extra = "allow"
-
-
-class Link(BaseModel):
+class Link(BaseModelWithConfig):
operationRef: Optional[str] = None
operationId: Optional[str] = None
parameters: Optional[Dict[str, Union[Any, str]]] = None
@@ -374,31 +288,15 @@ class Link(BaseModel):
description: Optional[str] = None
server: Optional[Server] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
- else:
-
- class Config:
- extra = "allow"
-
-
-class Response(BaseModel):
+class Response(BaseModelWithConfig):
description: str
headers: Optional[Dict[str, Union[Header, Reference]]] = None
content: Optional[Dict[str, MediaType]] = None
links: Optional[Dict[str, Union[Link, Reference]]] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
- else:
-
- class Config:
- extra = "allow"
-
-
-class Operation(BaseModel):
+class Operation(BaseModelWithConfig):
tags: Optional[List[str]] = None
summary: Optional[str] = None
description: Optional[str] = None
@@ -413,16 +311,8 @@ class Operation(BaseModel):
security: Optional[List[Dict[str, List[str]]]] = None
servers: Optional[List[Server]] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
- else:
-
- class Config:
- extra = "allow"
-
-
-class PathItem(BaseModel):
+class PathItem(BaseModelWithConfig):
ref: Optional[str] = Field(default=None, alias="$ref")
summary: Optional[str] = None
description: Optional[str] = None
@@ -437,14 +327,6 @@ class PathItem(BaseModel):
servers: Optional[List[Server]] = None
parameters: Optional[List[Union[Parameter, Reference]]] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
-
- else:
-
- class Config:
- extra = "allow"
-
class SecuritySchemeType(Enum):
apiKey = "apiKey"
@@ -453,18 +335,10 @@ class SecuritySchemeType(Enum):
openIdConnect = "openIdConnect"
-class SecurityBase(BaseModel):
+class SecurityBase(BaseModelWithConfig):
type_: SecuritySchemeType = Field(alias="type")
description: Optional[str] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
-
- else:
-
- class Config:
- extra = "allow"
-
class APIKeyIn(Enum):
query = "query"
@@ -488,18 +362,10 @@ class HTTPBearer(HTTPBase):
bearerFormat: Optional[str] = None
-class OAuthFlow(BaseModel):
+class OAuthFlow(BaseModelWithConfig):
refreshUrl: Optional[str] = None
scopes: Dict[str, str] = {}
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
-
- else:
-
- class Config:
- extra = "allow"
-
class OAuthFlowImplicit(OAuthFlow):
authorizationUrl: str
@@ -518,20 +384,12 @@ class OAuthFlowAuthorizationCode(OAuthFlow):
tokenUrl: str
-class OAuthFlows(BaseModel):
+class OAuthFlows(BaseModelWithConfig):
implicit: Optional[OAuthFlowImplicit] = None
password: Optional[OAuthFlowPassword] = None
clientCredentials: Optional[OAuthFlowClientCredentials] = None
authorizationCode: Optional[OAuthFlowAuthorizationCode] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
-
- else:
-
- class Config:
- extra = "allow"
-
class OAuth2(SecurityBase):
type_: SecuritySchemeType = Field(default=SecuritySchemeType.oauth2, alias="type")
@@ -548,7 +406,7 @@ class OpenIdConnect(SecurityBase):
SecurityScheme = Union[APIKey, HTTPBase, OAuth2, OpenIdConnect, HTTPBearer]
-class Components(BaseModel):
+class Components(BaseModelWithConfig):
schemas: Optional[Dict[str, Union[Schema, Reference]]] = None
responses: Optional[Dict[str, Union[Response, Reference]]] = None
parameters: Optional[Dict[str, Union[Parameter, Reference]]] = None
@@ -561,30 +419,14 @@ class Components(BaseModel):
callbacks: Optional[Dict[str, Union[Dict[str, PathItem], Reference, Any]]] = None
pathItems: Optional[Dict[str, Union[PathItem, Reference]]] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
- else:
-
- class Config:
- extra = "allow"
-
-
-class Tag(BaseModel):
+class Tag(BaseModelWithConfig):
name: str
description: Optional[str] = None
externalDocs: Optional[ExternalDocumentation] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
- else:
-
- class Config:
- extra = "allow"
-
-
-class OpenAPI(BaseModel):
+class OpenAPI(BaseModelWithConfig):
openapi: str
info: Info
jsonSchemaDialect: Optional[str] = None
@@ -597,14 +439,6 @@ class OpenAPI(BaseModel):
tags: Optional[List[Tag]] = None
externalDocs: Optional[ExternalDocumentation] = None
- if PYDANTIC_V2:
- model_config = {"extra": "allow"}
-
- else:
-
- class Config:
- extra = "allow"
-
_model_rebuild(Schema)
_model_rebuild(Operation)
diff --git a/requirements-docs.txt b/requirements-docs.txt
index 8fa64cf39..599e01f16 100644
--- a/requirements-docs.txt
+++ b/requirements-docs.txt
@@ -1,6 +1,6 @@
-e .
-r requirements-docs-tests.txt
-mkdocs-material==9.4.7
+mkdocs-material==9.5.18
mdx-include >=1.4.1,<2.0.0
mkdocs-redirects>=1.2.1,<1.3.0
typer >=0.12.0
@@ -8,7 +8,7 @@ pyyaml >=5.3.1,<7.0.0
# For Material for MkDocs, Chinese search
jieba==0.42.1
# For image processing by Material for MkDocs
-pillow==10.2.0
+pillow==10.3.0
# For image processing by Material for MkDocs
cairosvg==2.7.0
mkdocstrings[python]==0.23.0
diff --git a/tests/test_tutorial/test_extra_data_types/test_tutorial001.py b/tests/test_tutorial/test_extra_data_types/test_tutorial001.py
index 7710446ce..5558671b9 100644
--- a/tests/test_tutorial/test_extra_data_types/test_tutorial001.py
+++ b/tests/test_tutorial/test_extra_data_types/test_tutorial001.py
@@ -67,6 +67,7 @@ def test_openapi_schema():
}
],
"requestBody": {
+ "required": True,
"content": {
"application/json": {
"schema": IsDict(
@@ -86,7 +87,7 @@ def test_openapi_schema():
}
)
}
- }
+ },
},
}
}
@@ -97,40 +98,16 @@ def test_openapi_schema():
"title": "Body_read_items_items__item_id__put",
"type": "object",
"properties": {
- "start_datetime": IsDict(
- {
- "title": "Start Datetime",
- "anyOf": [
- {"type": "string", "format": "date-time"},
- {"type": "null"},
- ],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "Start Datetime",
- "type": "string",
- "format": "date-time",
- }
- ),
- "end_datetime": IsDict(
- {
- "title": "End Datetime",
- "anyOf": [
- {"type": "string", "format": "date-time"},
- {"type": "null"},
- ],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "End Datetime",
- "type": "string",
- "format": "date-time",
- }
- ),
+ "start_datetime": {
+ "title": "Start Datetime",
+ "type": "string",
+ "format": "date-time",
+ },
+ "end_datetime": {
+ "title": "End Datetime",
+ "type": "string",
+ "format": "date-time",
+ },
"repeat_at": IsDict(
{
"title": "Repeat At",
@@ -151,10 +128,8 @@ def test_openapi_schema():
"process_after": IsDict(
{
"title": "Process After",
- "anyOf": [
- {"type": "string", "format": "duration"},
- {"type": "null"},
- ],
+ "type": "string",
+ "format": "duration",
}
)
| IsDict(
@@ -166,6 +141,7 @@ def test_openapi_schema():
}
),
},
+ "required": ["start_datetime", "end_datetime", "process_after"],
},
"ValidationError": {
"title": "ValidationError",
diff --git a/tests/test_tutorial/test_extra_data_types/test_tutorial001_an.py b/tests/test_tutorial/test_extra_data_types/test_tutorial001_an.py
index 9951b3b51..e309f8bd6 100644
--- a/tests/test_tutorial/test_extra_data_types/test_tutorial001_an.py
+++ b/tests/test_tutorial/test_extra_data_types/test_tutorial001_an.py
@@ -67,6 +67,7 @@ def test_openapi_schema():
}
],
"requestBody": {
+ "required": True,
"content": {
"application/json": {
"schema": IsDict(
@@ -86,7 +87,7 @@ def test_openapi_schema():
}
)
}
- }
+ },
},
}
}
@@ -97,40 +98,16 @@ def test_openapi_schema():
"title": "Body_read_items_items__item_id__put",
"type": "object",
"properties": {
- "start_datetime": IsDict(
- {
- "title": "Start Datetime",
- "anyOf": [
- {"type": "string", "format": "date-time"},
- {"type": "null"},
- ],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "Start Datetime",
- "type": "string",
- "format": "date-time",
- }
- ),
- "end_datetime": IsDict(
- {
- "title": "End Datetime",
- "anyOf": [
- {"type": "string", "format": "date-time"},
- {"type": "null"},
- ],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "End Datetime",
- "type": "string",
- "format": "date-time",
- }
- ),
+ "start_datetime": {
+ "title": "Start Datetime",
+ "type": "string",
+ "format": "date-time",
+ },
+ "end_datetime": {
+ "title": "End Datetime",
+ "type": "string",
+ "format": "date-time",
+ },
"repeat_at": IsDict(
{
"title": "Repeat At",
@@ -151,10 +128,8 @@ def test_openapi_schema():
"process_after": IsDict(
{
"title": "Process After",
- "anyOf": [
- {"type": "string", "format": "duration"},
- {"type": "null"},
- ],
+ "type": "string",
+ "format": "duration",
}
)
| IsDict(
@@ -166,6 +141,7 @@ def test_openapi_schema():
}
),
},
+ "required": ["start_datetime", "end_datetime", "process_after"],
},
"ValidationError": {
"title": "ValidationError",
diff --git a/tests/test_tutorial/test_extra_data_types/test_tutorial001_an_py310.py b/tests/test_tutorial/test_extra_data_types/test_tutorial001_an_py310.py
index 7c482b8cb..ca110dc00 100644
--- a/tests/test_tutorial/test_extra_data_types/test_tutorial001_an_py310.py
+++ b/tests/test_tutorial/test_extra_data_types/test_tutorial001_an_py310.py
@@ -76,6 +76,7 @@ def test_openapi_schema(client: TestClient):
}
],
"requestBody": {
+ "required": True,
"content": {
"application/json": {
"schema": IsDict(
@@ -95,7 +96,7 @@ def test_openapi_schema(client: TestClient):
}
)
}
- }
+ },
},
}
}
@@ -106,40 +107,16 @@ def test_openapi_schema(client: TestClient):
"title": "Body_read_items_items__item_id__put",
"type": "object",
"properties": {
- "start_datetime": IsDict(
- {
- "title": "Start Datetime",
- "anyOf": [
- {"type": "string", "format": "date-time"},
- {"type": "null"},
- ],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "Start Datetime",
- "type": "string",
- "format": "date-time",
- }
- ),
- "end_datetime": IsDict(
- {
- "title": "End Datetime",
- "anyOf": [
- {"type": "string", "format": "date-time"},
- {"type": "null"},
- ],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "End Datetime",
- "type": "string",
- "format": "date-time",
- }
- ),
+ "start_datetime": {
+ "title": "Start Datetime",
+ "type": "string",
+ "format": "date-time",
+ },
+ "end_datetime": {
+ "title": "End Datetime",
+ "type": "string",
+ "format": "date-time",
+ },
"repeat_at": IsDict(
{
"title": "Repeat At",
@@ -160,10 +137,8 @@ def test_openapi_schema(client: TestClient):
"process_after": IsDict(
{
"title": "Process After",
- "anyOf": [
- {"type": "string", "format": "duration"},
- {"type": "null"},
- ],
+ "type": "string",
+ "format": "duration",
}
)
| IsDict(
@@ -175,6 +150,7 @@ def test_openapi_schema(client: TestClient):
}
),
},
+ "required": ["start_datetime", "end_datetime", "process_after"],
},
"ValidationError": {
"title": "ValidationError",
diff --git a/tests/test_tutorial/test_extra_data_types/test_tutorial001_an_py39.py b/tests/test_tutorial/test_extra_data_types/test_tutorial001_an_py39.py
index 87473867b..3386fb1fd 100644
--- a/tests/test_tutorial/test_extra_data_types/test_tutorial001_an_py39.py
+++ b/tests/test_tutorial/test_extra_data_types/test_tutorial001_an_py39.py
@@ -76,6 +76,7 @@ def test_openapi_schema(client: TestClient):
}
],
"requestBody": {
+ "required": True,
"content": {
"application/json": {
"schema": IsDict(
@@ -95,7 +96,7 @@ def test_openapi_schema(client: TestClient):
}
)
}
- }
+ },
},
}
}
@@ -106,40 +107,16 @@ def test_openapi_schema(client: TestClient):
"title": "Body_read_items_items__item_id__put",
"type": "object",
"properties": {
- "start_datetime": IsDict(
- {
- "title": "Start Datetime",
- "anyOf": [
- {"type": "string", "format": "date-time"},
- {"type": "null"},
- ],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "Start Datetime",
- "type": "string",
- "format": "date-time",
- }
- ),
- "end_datetime": IsDict(
- {
- "title": "End Datetime",
- "anyOf": [
- {"type": "string", "format": "date-time"},
- {"type": "null"},
- ],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "End Datetime",
- "type": "string",
- "format": "date-time",
- }
- ),
+ "start_datetime": {
+ "title": "Start Datetime",
+ "type": "string",
+ "format": "date-time",
+ },
+ "end_datetime": {
+ "title": "End Datetime",
+ "type": "string",
+ "format": "date-time",
+ },
"repeat_at": IsDict(
{
"title": "Repeat At",
@@ -160,10 +137,8 @@ def test_openapi_schema(client: TestClient):
"process_after": IsDict(
{
"title": "Process After",
- "anyOf": [
- {"type": "string", "format": "duration"},
- {"type": "null"},
- ],
+ "type": "string",
+ "format": "duration",
}
)
| IsDict(
@@ -175,6 +150,7 @@ def test_openapi_schema(client: TestClient):
}
),
},
+ "required": ["start_datetime", "end_datetime", "process_after"],
},
"ValidationError": {
"title": "ValidationError",
diff --git a/tests/test_tutorial/test_extra_data_types/test_tutorial001_py310.py b/tests/test_tutorial/test_extra_data_types/test_tutorial001_py310.py
index 0b71d9177..50c9aefdf 100644
--- a/tests/test_tutorial/test_extra_data_types/test_tutorial001_py310.py
+++ b/tests/test_tutorial/test_extra_data_types/test_tutorial001_py310.py
@@ -76,6 +76,7 @@ def test_openapi_schema(client: TestClient):
}
],
"requestBody": {
+ "required": True,
"content": {
"application/json": {
"schema": IsDict(
@@ -95,7 +96,7 @@ def test_openapi_schema(client: TestClient):
}
)
}
- }
+ },
},
}
}
@@ -106,40 +107,16 @@ def test_openapi_schema(client: TestClient):
"title": "Body_read_items_items__item_id__put",
"type": "object",
"properties": {
- "start_datetime": IsDict(
- {
- "title": "Start Datetime",
- "anyOf": [
- {"type": "string", "format": "date-time"},
- {"type": "null"},
- ],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "Start Datetime",
- "type": "string",
- "format": "date-time",
- }
- ),
- "end_datetime": IsDict(
- {
- "title": "End Datetime",
- "anyOf": [
- {"type": "string", "format": "date-time"},
- {"type": "null"},
- ],
- }
- )
- | IsDict(
- # TODO: remove when deprecating Pydantic v1
- {
- "title": "End Datetime",
- "type": "string",
- "format": "date-time",
- }
- ),
+ "start_datetime": {
+ "title": "Start Datetime",
+ "type": "string",
+ "format": "date-time",
+ },
+ "end_datetime": {
+ "title": "End Datetime",
+ "type": "string",
+ "format": "date-time",
+ },
"repeat_at": IsDict(
{
"title": "Repeat At",
@@ -160,10 +137,8 @@ def test_openapi_schema(client: TestClient):
"process_after": IsDict(
{
"title": "Process After",
- "anyOf": [
- {"type": "string", "format": "duration"},
- {"type": "null"},
- ],
+ "type": "string",
+ "format": "duration",
}
)
| IsDict(
@@ -175,6 +150,7 @@ def test_openapi_schema(client: TestClient):
}
),
},
+ "required": ["start_datetime", "end_datetime", "process_after"],
},
"ValidationError": {
"title": "ValidationError",