diff --git a/docs/hi/docs/advanced/advanced-python-types.md b/docs/hi/docs/advanced/advanced-python-types.md index d73a95fd86..85204e563b 100644 --- a/docs/hi/docs/advanced/advanced-python-types.md +++ b/docs/hi/docs/advanced/advanced-python-types.md @@ -13,7 +13,7 @@ from typing import Union def say_hi(name: Union[str, None]): - print(f"Hi {name}!") + print(f"Hi {name}!") ``` `typing` में `Optional` के साथ यह declare करने का एक shortcut भी है कि कोई चीज़ `None` हो सकती है। diff --git a/docs/hi/docs/advanced/async-tests.md b/docs/hi/docs/advanced/async-tests.md index dee1651268..3b7e682945 100644 --- a/docs/hi/docs/advanced/async-tests.md +++ b/docs/hi/docs/advanced/async-tests.md @@ -71,7 +71,7 @@ marker `@pytest.mark.anyio` pytest को बताता है कि इस t यह इसके बराबर है: ```Python -response = client.get('/') +response = client.get("/") ``` ...जिसका उपयोग हम `TestClient` के साथ अपनी requests बनाने के लिए करते थे। @@ -84,7 +84,7 @@ response = client.get('/') /// warning | चेतावनी -अगर आपकी application lifespan events पर निर्भर करती है, तो `AsyncClient` इन events को trigger नहीं करेगा। यह सुनिश्चित करने के लिए कि वे trigger हों, [florimondmanca/asgi-lifespan](https://github.com/florimondmanca/asgi-lifespan#usage) से `LifespanManager` का उपयोग करें। +अगर आपकी application lifespan event पर निर्भर करती है, तो `AsyncClient` इन event को trigger नहीं करेगा। यह सुनिश्चित करने के लिए कि वे trigger हों, [florimondmanca/asgi-lifespan](https://github.com/florimondmanca/asgi-lifespan#usage) से `LifespanManager` का उपयोग करें। /// diff --git a/docs/hi/docs/advanced/behind-a-proxy.md b/docs/hi/docs/advanced/behind-a-proxy.md index 7890efb44b..15ea1b416a 100644 --- a/docs/hi/docs/advanced/behind-a-proxy.md +++ b/docs/hi/docs/advanced/behind-a-proxy.md @@ -8,7 +8,7 @@ आपकी application के सामने मौजूद **proxy** आम तौर पर requests को आपके **server** तक भेजने से पहले तुरंत कुछ headers सेट करेगा, ताकि server को पता चल सके कि request proxy द्वारा **forwarded** की गई थी, उसे मूल (public) URL पता चल सके, जिसमें domain शामिल हो, कि वह HTTPS उपयोग कर रहा है, आदि। -**server** program (उदाहरण के लिए **FastAPI CLI** के जरिए **Uvicorn**) इन headers को समझने में सक्षम है, और फिर वह जानकारी आपकी application को पास कर सकता है। +`fastapi run` द्वारा शुरू किया गया **server** इन headers को समझने में सक्षम है, और फिर वह जानकारी आपकी application को पास कर सकता है। लेकिन security के लिए, क्योंकि server को यह नहीं पता कि वह किसी trusted proxy के पीछे है, वह उन headers को interpret नहीं करेगा। @@ -34,8 +34,6 @@ Proxy headers हैं: ```console $ uv run fastapi run --forwarded-allow-ips="*" - -INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` @@ -101,7 +99,7 @@ sequenceDiagram आपके पास ऐसा proxy हो सकता है जो आपकी application में एक path prefix जोड़ता हो। -इन मामलों में आप अपनी application configure करने के लिए `root_path` का उपयोग कर सकते हैं। +इन मामलों में आप `fastapi run --root-path` के साथ server configure कर सकते हैं। `root_path` ASGI specification द्वारा प्रदान किया गया एक mechanism है (जिस पर FastAPI, Starlette के जरिए, बना है)। @@ -117,7 +115,7 @@ sequenceDiagram {* ../../docs_src/behind_a_proxy/tutorial001_py310.py hl[6] *} -और proxy app server (शायद FastAPI CLI के जरिए Uvicorn) तक request भेजने से पहले तुरंत **path prefix** को **"strip"** कर देगा, आपकी application को यह भरोसा दिलाते हुए कि वह `/app` पर serve हो रही है, ताकि आपको prefix `/api/v1` शामिल करने के लिए अपना सारा code update न करना पड़े। +और proxy server तक request भेजने से पहले तुरंत **path prefix** को **"strip"** कर देगा, आपकी application को यह भरोसा दिलाते हुए कि वह `/app` पर serve हो रही है, ताकि आपको prefix `/api/v1` शामिल करने के लिए अपना सारा code update न करना पड़े। यहाँ तक, सब कुछ सामान्य रूप से काम करेगा। @@ -161,7 +159,7 @@ Docs UI को OpenAPI schema में यह declare करने की भ } ``` -इस उदाहरण में, "Proxy" कुछ **Traefik** जैसा हो सकता है। और server **Uvicorn** के साथ FastAPI CLI जैसा हो सकता है, जो आपकी FastAPI application चला रहा है। +इस उदाहरण में, "Proxy" कुछ **Traefik** जैसा हो सकता है। और `fastapi run` आपकी FastAPI application चलाने वाला server शुरू करेगा। ### `root_path` प्रदान करना { #providing-the-root-path } @@ -171,14 +169,10 @@ Docs UI को OpenAPI schema में यह declare करने की भ ```console $ uv run fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1 - -INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` -अगर आप Hypercorn उपयोग करते हैं, तो उसमें भी option `--root-path` है। - /// note | तकनीकी विवरण ASGI specification इस use case के लिए `root_path` define करती है। @@ -195,14 +189,12 @@ ASGI specification इस use case के लिए `root_path` define करत {* ../../docs_src/behind_a_proxy/tutorial001_py310.py hl[8] *} -फिर, अगर आप Uvicorn को इस तरह शुरू करते हैं: +फिर, अगर आप server को इस तरह शुरू करते हैं:
"मैं इन दिनों FastAPI का बहुत उपयोग कर रहा/रही हूँ। वास्तव में मैं अपनी team की Microsoft में ML सेवाओं के लिए इसे उपयोग करने की योजना बना रहा/रही हूँ। इनमें से कुछ को मुख्य Windows product और कुछ Office products में इंटीग्रेट किया जा रहा है।"+
"मैं इन दिनों FastAPI का बहुत उपयोग कर रहा/रही हूँ। वास्तव में मैं अपनी team की Microsoft में सभी ML सेवाओं के लिए इसे उपयोग करने की योजना बना रहा/रही हूँ। इनमें से कुछ को मुख्य Windows product और कुछ Office products में इंटीग्रेट किया जा रहा है।"
kwargs भी कहा जाता है। भले ही उनके पास default value न हो।
+Python उस `*` के साथ कुछ नहीं करेगा, लेकिन उसे पता चल जाएगा कि उसके बाद आने वाले सभी parameters को keyword arguments (key-value pairs) के रूप में call किया जाना चाहिए, जिन्हें kwargs भी कहा जाता है। भले ही उनके पास default value न हो।
{* ../../docs_src/path_params_numeric_validations/tutorial003_py310.py hl[7] *}
diff --git a/docs/hi/docs/tutorial/query-param-models.md b/docs/hi/docs/tutorial/query-param-models.md
index 1727b7654c..28eafb05d3 100644
--- a/docs/hi/docs/tutorial/query-param-models.md
+++ b/docs/hi/docs/tutorial/query-param-models.md
@@ -57,6 +57,42 @@ https://example.com/items/?limit=10&tool=plumbus
}
```
+## Parameter Models को साथ में उपयोग करें { #combine-parameter-models }
+
+आप कई query parameter models declare कर सकते हैं, और उन्हें अलग-अलग query parameters या dependencies के साथ उपयोग कर सकते हैं।
+
+{* ../../docs_src/query_param_models/tutorial003_an_py310.py hl[9:15,20:22] *}
+
+request parameters एक ही स्तर पर रहते हैं।
+
+```http
+https://example.com/items/?limit=5&offset=10&tags=red&tags=blue&search=shirt
+```
+
+query string में `pagination` या `filters` keys नहीं होती हैं। हर model अपने default values, field validators और model validators के साथ query parameters को स्वतंत्र रूप से validate करता है। यही बात तब भी लागू होती है जब models या अलग-अलग parameters dependencies में declare किए जाते हैं।
+
+अगर models किसी parameter नाम या alias को साझा करते हैं, तो हर model उस request parameter को स्वतंत्र रूप से validate करता है। स्वतंत्र values के लिए अलग-अलग नाम या aliases का उपयोग करें। OpenAPI साझा parameter को एक बार सूचीबद्ध करता है, जैसे वह dependencies के साथ साझा किए गए parameters के लिए करता है, इसलिए साझा declarations में एक ही type और constraints का वर्णन होना चाहिए।
+
+हर model की `extra` configuration सभी query parameters पर लागू होती है, जिनमें अन्य models या dependencies में declare किए गए parameters भी शामिल हैं। `extra="forbid"` के साथ, उस model के बाहर का कोई भी parameter अस्वीकार कर दिया जाता है। `extra="allow"` के साथ, वे parameters model extras के रूप में शामिल किए जाते हैं।
+
+यह `Header` और `Cookie` models के लिए भी काम करता है।
+
+## वैकल्पिक Query Parameter Models { #optional-query-parameter-models }
+
+समूह को वैकल्पिक बनाने के लिए query parameter model को `| None` और `None` की default value के साथ declare करें।
+
+{* ../../docs_src/query_param_models/tutorial004_an_py310.py hl[18] *}
+
+अगर न तो `start` और न ही `end` भेजा जाता है, तो `date_range` की value `None` होती है। अगर इनमें से कोई भी भेजा जाता है, तो FastAPI model को validate करता है और दोनों fields को required मानता है।
+
+default के बिना `| None` का उपयोग करने पर parameter फिर भी required रहता है।
+
+अतिरिक्त parameters model की `extra` configuration का पालन करते हैं। अनदेखा किए गए अतिरिक्त parameters से model को मौजूद नहीं माना जाता।
+
+OpenAPI समूह के fields को अलग-अलग सूचीबद्ध करता है और उन्हें वैकल्पिक के रूप में चिह्नित करता है।
+
+आप वैकल्पिक [header parameter models](header-param-models.md#optional-header-parameter-models) और [cookie parameter models](cookie-param-models.md#optional-cookie-parameter-models) भी declare कर सकते हैं।
+
## सारांश { #summary }
आप **FastAPI** में **query parameters** declare करने के लिए **Pydantic models** का उपयोग कर सकते हैं। 😎
diff --git a/docs/hi/docs/tutorial/query-params-str-validations.md b/docs/hi/docs/tutorial/query-params-str-validations.md
index 3320a9d7a5..5ceba488ce 100644
--- a/docs/hi/docs/tutorial/query-params-str-validations.md
+++ b/docs/hi/docs/tutorial/query-params-str-validations.md
@@ -220,14 +220,22 @@ q: Annotated[str | None, Query(min_length=3)] = None
{* ../../docs_src/query_params_str_validations/tutorial006_an_py310.py hl[9] *}
-### Required, `None` हो सकता है { #required-can-be-none }
+### Required parameters और `None` { #required-parameters-and-none }
-आप declare कर सकते हैं कि parameter `None` accept कर सकता है, लेकिन फिर भी यह required है। यह clients को value भेजने के लिए मजबूर करेगा, भले ही value `None` हो।
-
-ऐसा करने के लिए, आप declare कर सकते हैं कि `None` एक valid type है लेकिन बस default value declare न करें:
+type `str | None` Python value के रूप में `None` की अनुमति देता है, लेकिन यह query parameter को optional नहीं बनाता। default value के बिना, parameter अभी भी required है:
{* ../../docs_src/query_params_str_validations/tutorial006c_an_py310.py hl[9] *}
+query parameter की values strings के रूप में आती हैं और उनमें `None` के लिए कोई built-in representation नहीं होता। `?q=None` या `?q=null` भेजने पर क्रमशः strings `"None"` और `"null"` भेजी जाती हैं। `?q=` भेजने पर एक खाली string भेजी जाती है, जो इस example में `min_length=3` validation में fail होती है।
+
+clients को `q` न भेजने और उसकी value के रूप में `None` use करने की अनुमति देने के लिए, उसकी default value `None` रखें:
+
+```Python
+q: Annotated[str | None, Query(min_length=3)] = None
+```
+
+query parameters के विपरीत, JSON request bodies में स्पष्ट रूप से `null` value हो सकती है।
+
## Query parameter list / multiple values { #query-parameter-list-multiple-values }
जब आप query parameter को स्पष्ट रूप से `Query` के साथ define करते हैं तो आप इसे values की list receive करने के लिए भी declare कर सकते हैं, या दूसरे शब्दों में, multiple values receive करने के लिए।
diff --git a/docs/hi/docs/tutorial/query-params.md b/docs/hi/docs/tutorial/query-params.md
index bc85731799..c0d2bfbf7b 100644
--- a/docs/hi/docs/tutorial/query-params.md
+++ b/docs/hi/docs/tutorial/query-params.md
@@ -107,7 +107,13 @@ http://127.0.0.1:8000/items/foo?short=on
http://127.0.0.1:8000/items/foo?short=yes
```
-या कोई भी दूसरी case variation (uppercase, पहले अक्षर को uppercase, आदि), आपका function parameter `short` को `True` के `bool` value के साथ देखेगा। अन्यथा `False` के रूप में।
+या कोई भी दूसरी case variation (uppercase, पहले अक्षर को uppercase, आदि), आपका function parameter `short` को `True` के `bool` value के साथ देखेगा।
+
+`0`, `false`, `off`, और `no` जैसी values (case variations सहित) `False` में convert की जाती हैं।
+
+अगर `short` नहीं दिया जाता है, तो **FastAPI** उसकी default value का उपयोग करता है, जो इस उदाहरण में `False` है।
+
+खाली value (`?short=`) या कोई अपरिचित value (उदाहरण के लिए, `?short=maybe`) से `422` validation error आती है।
## कई path और query parameters { #multiple-path-and-query-parameters }
diff --git a/docs/hi/docs/tutorial/request-form-models.md b/docs/hi/docs/tutorial/request-form-models.md
index 3b4307cbf3..1c9ba49177 100644
--- a/docs/hi/docs/tutorial/request-form-models.md
+++ b/docs/hi/docs/tutorial/request-form-models.md
@@ -28,6 +28,8 @@ $ uv add python-multipart
**FastAPI** request में मौजूद **form data** से **हर field** के लिए data **extract** करेगा और आपको वह Pydantic model देगा जिसे आपने define किया है।
+[HTML checkboxes](request-forms.md#boolean-form-fields) के लिए, boolean fields को `False` की default value के साथ declare करें।
+
## Docs जाँचें { #check-the-docs }
आप इसे `/docs` पर docs UI में verify कर सकते हैं:
@@ -73,6 +75,58 @@ $ uv add python-multipart
}
```
+## Form Models को संयोजित करें { #combine-form-models }
+
+आप कई form models को अलग-अलग `Form` parameters के साथ संयोजित कर सकते हैं।
+
+{* ../../docs_src/request_form_models/tutorial003_an_py310.py hl[9:14,19:21] *}
+
+client `name`, `tags`, और `token` को form fields के रूप में भेजता है। हर model form fields को स्वतंत्र रूप से validate करता है।
+
+हर model की `extra` configuration सभी form fields पर लागू होती है, जिनमें अन्य parameters या dependencies में declare किए गए fields और files भी शामिल हैं। `extra="forbid"` के साथ, उस model से बाहर का कोई भी field अस्वीकार कर दिया जाता है। `extra="allow"` के साथ, वे fields model extras के रूप में शामिल किए जाते हैं।
+
+अगर कई declarations एक ही form field नाम का उपयोग करते हैं, तो हर declaration उस field की value को validate करता है। साझा fields के लिए संगत types और constraints का उपयोग करें ताकि OpenAPI schema उनका सुसंगत रूप से वर्णन कर सके।
+
+## वैकल्पिक Form Models { #optional-form-models }
+
+समूह को वैकल्पिक बनाने के लिए, form model को `| None` और `None` की default value के साथ declare करें।
+
+{* ../../docs_src/request_form_models/tutorial005_an_py310.py hl[17] *}
+
+अगर न तो `name` और न ही `age` भेजा जाता है, तो `profile` की value `None` होती है। अगर इनमें से कोई भी भेजा जाता है, तो FastAPI model को validate करता है और दोनों fields को required मानता है। खाली value सबमिट करना भी field प्रदान करना माना जाता है।
+
+default value के बिना `| None` का उपयोग करने पर भी parameter required रहता है।
+
+Extra fields model की `extra` configuration का पालन करते हैं। अनदेखा किए गए extras से model को मौजूद नहीं माना जाता।
+
+केवल unchecked checkboxes वाला वैकल्पिक model छोड़ दिया जाता है। इसे स्पष्ट रूप से प्रदान करने के लिए `enabled=false` जैसी value भेजें।
+
+## Form Models के वैकल्पिक Unions { #optional-unions-of-form-models }
+
+आप models के वैकल्पिक union का भी उपयोग कर सकते हैं।
+
+{* ../../docs_src/request_form_models/tutorial006_an_py310.py hl[9:16,21] *}
+
+अगर कोई form fields नहीं भेजे जाते हैं, तो `contact` की value `None` होती है। `name` के साथ `kind=person`, या `company_name` के साथ `kind=company` भेजें। discriminator चुनता है कि किस model को validate करना है।
+
+## Form Models के Unions को संयोजित करें { #combine-unions-of-form-models }
+
+आप unions को अन्य form models, अलग-अलग `Form` parameters, और `File` parameters के साथ संयोजित कर सकते हैं। हर union को स्वतंत्र रूप से validate किया जाता है।
+
+{* ../../docs_src/request_form_models/tutorial007_an_py310.py hl[31:35] *}
+
+सभी fields एक ही form में भेजें। उदाहरण के लिए, `contact_type=person`, `name=Rick`, `notification_type=email`, `email=rick@example.com`, और `token=secret` भेजें।
+
+`notification` की value `None` रखने के लिए notification fields छोड़ दें।
+
+## Form Models और Files { #form-models-and-files }
+
+आप form model को [file parameters](request-files.md) के साथ भी संयोजित कर सकते हैं।
+
+{* ../../docs_src/request_form_models/tutorial004_an_py310.py hl[14] *}
+
+यहाँ client `multipart/form-data` का उपयोग करके `name` field और `avatar` file भेजता है।
+
## सारांश { #summary }
आप FastAPI में form fields declare करने के लिए Pydantic models का उपयोग कर सकते हैं। 😎
diff --git a/docs/hi/docs/tutorial/request-forms.md b/docs/hi/docs/tutorial/request-forms.md
index ba5e5281d0..70e7cd355d 100644
--- a/docs/hi/docs/tutorial/request-forms.md
+++ b/docs/hi/docs/tutorial/request-forms.md
@@ -44,6 +44,14 @@ form bodies declare करने के लिए, आपको स्पष्
///
+## Boolean Form Fields { #boolean-form-fields }
+
+HTML forms submit करते समय browsers unchecked checkboxes को छोड़ देते हैं। unchecked होने पर `False` प्राप्त करने के लिए `False` default वाला boolean form parameter declare करें:
+
+{* ../../docs_src/request_forms/tutorial002_an_py310.py hl[9] *}
+
+एक checked checkbox अपनी value भेजता है, जो default रूप से `"on"` होती है। **FastAPI** `"on"` को `True` के रूप में स्वीकार करता है।
+
## "Form Fields" के बारे में { #about-form-fields }
HTML forms (``) आमतौर पर data को server पर भेजने के लिए उस data के लिए एक "special" encoding का उपयोग करते हैं, यह JSON से अलग होता है।
@@ -56,6 +64,8 @@ forms से आने वाला data आमतौर पर "media type" `ap
लेकिन जब form में files शामिल होती हैं, तो इसे `multipart/form-data` के रूप में encoded किया जाता है। files को handle करने के बारे में आप अगले chapter में पढ़ेंगे।
+OpenAPI में multipart form का वर्णन करने के लिए आप `Form(media_type="multipart/form-data")` का उपयोग कर सकते हैं। form parameters या models को मिलाते समय इसे एक parameter पर सेट करना पर्याप्त है।
+
अगर आप इन encodings और form fields के बारे में अधिक पढ़ना चाहते हैं, तो [`POST` के लिए MDN web docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) देखें।
///
diff --git a/docs/hi/docs/tutorial/response-model.md b/docs/hi/docs/tutorial/response-model.md
index 5e0ab32782..411eee7b7f 100644
--- a/docs/hi/docs/tutorial/response-model.md
+++ b/docs/hi/docs/tutorial/response-model.md
@@ -266,6 +266,7 @@ FastAPI internally Pydantic के साथ कई चीज़ें करत
लेकिन अगर आपके data में model के default values वाले fields के लिए values हैं, जैसे ID `bar` वाला item:
+
```Python hl_lines="3 5"
{
"name": "Bar",
@@ -274,6 +275,7 @@ FastAPI internally Pydantic के साथ कई चीज़ें करत
"tax": 20.2
}
```
+
तो वे response में शामिल होंगे।
@@ -281,6 +283,7 @@ FastAPI internally Pydantic के साथ कई चीज़ें करत
अगर data में default values जैसे ही values हैं, जैसे ID `baz` वाला item:
+
```Python hl_lines="3 5-6"
{
"name": "Baz",
@@ -290,6 +293,7 @@ FastAPI internally Pydantic के साथ कई चीज़ें करत
"tags": []
}
```
+
FastAPI इतना smart है (दरअसल, Pydantic इतना smart है) कि यह समझ सके कि, भले ही `description`, `tax`, और `tags` के values defaults जैसे ही हैं, उन्हें explicitly set किया गया था (defaults से लिए जाने के बजाय)।
diff --git a/docs/hi/docs/tutorial/security/simple-oauth2.md b/docs/hi/docs/tutorial/security/simple-oauth2.md
index 87c9a4a287..e173c4bd59 100644
--- a/docs/hi/docs/tutorial/security/simple-oauth2.md
+++ b/docs/hi/docs/tutorial/security/simple-oauth2.md
@@ -136,11 +136,11 @@ Error के लिए, हम exception `HTTPException` का उपयोग
```Python
UserInDB(
- username = user_dict["username"],
- email = user_dict["email"],
- full_name = user_dict["full_name"],
- disabled = user_dict["disabled"],
- hashed_password = user_dict["hashed_password"],
+ username=user_dict["username"],
+ email=user_dict["email"],
+ full_name=user_dict["full_name"],
+ disabled=user_dict["disabled"],
+ hashed_password=user_dict["hashed_password"],
)
```