diff --git a/docs/ur/docs/_llm-test.md b/docs/ur/docs/_llm-test.md new file mode 100644 index 000000000..98f81230c --- /dev/null +++ b/docs/ur/docs/_llm-test.md @@ -0,0 +1,503 @@ +# LLM ٹیسٹ فائل { #llm-test-file } + +یہ document ٹیسٹ کرتا ہے کہ آیا LLM، جو documentation کا ترجمہ کرتا ہے، `scripts/translate.py` میں `general_prompt` اور `docs/{language code}/llm-prompt.md` میں زبان کے لیے مخصوص prompt کو سمجھتا ہے۔ زبان کے لیے مخصوص prompt، `general_prompt` کے ساتھ جوڑا جاتا ہے۔ + +یہاں شامل کیے گئے ٹیسٹ تمام زبان کے مخصوص prompt ڈیزائنرز کو نظر آئیں گے۔ + +اس طرح استعمال کریں: + +* زبان کے لیے مخصوص prompt رکھیں - `docs/{language code}/llm-prompt.md`۔ +* اس document کا اپنی مطلوبہ ہدف زبان میں تازہ ترجمہ کریں (مثلاً `translate.py` کا `translate-page` command دیکھیں)۔ یہ `docs/{language code}/docs/_llm-test.md` کے تحت ترجمہ بنائے گا۔ +* چیک کریں کہ ترجمے میں سب ٹھیک ہے۔ +* اگر ضروری ہو تو اپنے زبان کے مخصوص prompt، عمومی prompt، یا انگریزی document کو بہتر بنائیں۔ +* پھر ترجمے میں باقی رہ جانے والے مسائل خود ٹھیک کریں، تاکہ یہ اچھا ترجمہ ہو۔ +* اچھا ترجمہ موجود ہونے کے بعد دوبارہ ترجمہ کریں۔ مثالی نتیجہ یہ ہوگا کہ LLM ترجمے میں مزید کوئی تبدیلی نہ کرے۔ اس کا مطلب ہے کہ عمومی prompt اور آپ کا زبان کے مخصوص prompt اتنے اچھے ہیں جتنے ہو سکتے ہیں (یہ بعض اوقات کچھ بظاہر بے ترتیب تبدیلیاں کرے گا، اس کی وجہ یہ ہے کہ [LLMs deterministic algorithms نہیں ہیں](https://doublespeak.chat/#/handbook#deterministic-output))۔ + +ٹیسٹ: + +## Code snippets { #code-snippets } + +//// tab | Test + +یہ ایک code snippet ہے: `foo`۔ اور یہ ایک اور code snippet ہے: `bar`۔ اور ایک اور: `baz quux`۔ + +//// + +//// tab | Info + +Code snippets کا مواد جوں کا توں رہنا چاہیے۔ + +`scripts/translate.py` میں عمومی prompt کا سیکشن `### Content of code snippets` دیکھیں۔ + +//// + +## اقتباسات { #quotes } + +//// tab | Test + +کل میرے دوست نے لکھا: "If you spell incorrectly correctly, you have spelled it incorrectly"۔ جس پر میں نے جواب دیا: "Correct, but 'incorrectly' is incorrectly not '"incorrectly"'"۔ + +/// note | نوٹ + +LLM شاید اس کا ترجمہ غلط کرے گا۔ دلچسپ صرف یہ ہے کہ دوبارہ ترجمہ کرتے وقت یہ ٹھیک کیا گیا ترجمہ محفوظ رکھتا ہے یا نہیں۔ + +/// + +//// + +//// tab | Info + +Prompt ڈیزائنر یہ فیصلہ کر سکتا ہے کہ آیا وہ neutral quotes کو typographic quotes میں تبدیل کرنا چاہتے ہیں۔ انہیں جوں کا توں چھوڑنا بھی ٹھیک ہے۔ + +مثال کے طور پر `docs/de/llm-prompt.md` میں سیکشن `### Quotes` دیکھیں۔ + +//// + +## Code snippets میں اقتباسات { #quotes-in-code-snippets } + +//// tab | Test + +`pip install "foo[bar]"` + +Code snippets میں string literals کی مثالیں: `"this"`, `'that'`۔ + +Code snippets میں string literals کی مشکل مثال: `f"I like {'oranges' if orange else "apples"}"` + +سخت ترین: `Yesterday, my friend wrote: "If you spell incorrectly correctly, you have spelled it incorrectly". To which I answered: "Correct, but 'incorrectly' is incorrectly not '"incorrectly"'"` + +//// + +//// tab | Info + +... تاہم، code snippets کے اندر اقتباسات جوں کے توں رہنے چاہئیں۔ + +//// + +## Code blocks { #code-blocks } + +//// tab | Test + +ایک Bash code مثال... + +```bash +# Print a greeting to the universe +echo "Hello universe" +``` + +...اور ایک console code مثال... + +```console +$ fastapi run main.py + FastAPI Starting server + Searching for package file structure +``` + +...اور ایک اور console code مثال... + +```console +// "Code" نامی directory بنائیں +$ mkdir code +// اس directory میں جائیں +$ cd code +``` + +...اور ایک Python code مثال... + +```Python +wont_work() # This won't work 😱 +works(foo="bar") # This works 🎉 +``` + +...اور بس۔ + +//// + +//// tab | Info + +Code blocks میں code کو تبدیل نہیں کیا جانا چاہیے، سوائے تبصروں کے۔ + +`scripts/translate.py` میں عمومی prompt کا سیکشن `### Content of code blocks` دیکھیں۔ + +//// + +## Tabs اور رنگین خانے { #tabs-and-colored-boxes } + +//// tab | Test + +/// info | معلومات +کچھ متن +/// + +/// note | نوٹ +کچھ متن +/// + +/// note | تکنیکی تفصیلات +کچھ متن +/// + +/// check +کچھ متن +/// + +/// tip | مشورہ +کچھ متن +/// + +/// warning | انتباہ +کچھ متن +/// + +/// danger +کچھ متن +/// + +//// + +//// tab | Info + +Tabs اور `Info`/`Note`/`Warning` وغیرہ بلاکس میں عمودی خط (`|`) کے بعد ان کے عنوان کا ترجمہ شامل ہونا چاہیے۔ + +`scripts/translate.py` میں عمومی prompt کے سیکشنز `### Special blocks` اور `### Tab blocks` دیکھیں۔ + +//// + +## Web اور اندرونی لنکس { #web-and-internal-links } + +//// tab | Test + +لنک کا متن ترجمہ ہونا چاہیے، لنک کا پتہ تبدیل نہیں ہونا چاہیے: + +* [اوپر والی heading کا لنک](#code-snippets) +* [اندرونی لنک](index.md#installation) +* [بیرونی لنک](https://sqlmodel.tiangolo.com/) +* [ایک style کا لنک](https://fastapi.tiangolo.com/css/styles.css) +* [ایک script کا لنک](https://fastapi.tiangolo.com/js/logic.js) +* [ایک تصویر کا لنک](https://fastapi.tiangolo.com/img/foo.jpg) + +لنک کا متن ترجمہ ہونا چاہیے، لنک کا پتہ ترجمے کی طرف اشارہ کرنا چاہیے: + +* [FastAPI لنک](https://fastapi.tiangolo.com/) + +//// + +//// tab | Info + +لنکس کا ترجمہ ہونا چاہیے، لیکن ان کا پتہ تبدیل نہیں ہونا چاہیے۔ استثناء FastAPI documentation کے صفحات کے مطلق لنکس ہیں۔ اس صورت میں اسے ترجمے کی طرف لنک کرنا چاہیے۔ + +`scripts/translate.py` میں عمومی prompt کا سیکشن `### Links` دیکھیں۔ + +//// + +## HTML "abbr" عناصر { #html-abbr-elements } + +//// tab | Test + +یہاں HTML "abbr" عناصر میں لپٹی کچھ چیزیں ہیں (کچھ من گھڑت ہیں): + +### abbr مکمل جملہ دیتا ہے { #the-abbr-gives-a-full-phrase } + +* GTD +* lt +* XWT +* PSGI + +### abbr مکمل جملہ اور وضاحت دیتا ہے { #the-abbr-gives-a-full-phrase-and-an-explanation } + +* MDN +* I/O. + +//// + +//// tab | Info + +"abbr" عناصر کی "title" attributes کا مخصوص ہدایات کے مطابق ترجمہ کیا جاتا ہے۔ + +تراجم اپنے "abbr" عناصر شامل کر سکتے ہیں جنہیں LLM نہیں ہٹانا چاہیے۔ مثلاً انگریزی الفاظ کی وضاحت کے لیے۔ + +`scripts/translate.py` میں عمومی prompt کا سیکشن `### HTML abbr elements` دیکھیں۔ + +//// + +## HTML "dfn" عناصر { #html-dfn-elements } + +* cluster +* Deep Learning + +## عنوانات { #headings } + +//// tab | Test + +### ایک webapp تیار کریں - ایک tutorial { #develop-a-webapp-a-tutorial } + +ہیلو۔ + +### Type hints اور -annotations { #type-hints-and-annotations } + +دوبارہ ہیلو۔ + +### Super- اور subclasses { #super-and-subclasses } + +دوبارہ ہیلو۔ + +//// + +//// tab | Info + +عنوانات کے لیے واحد سخت قاعدہ یہ ہے کہ LLM گھنگھریالے قوسین کے اندر hash حصے کو تبدیل نہ کرے، جو یقینی بناتا ہے کہ لنکس نہ ٹوٹیں۔ + +`scripts/translate.py` میں عمومی prompt کا سیکشن `### Headings` دیکھیں۔ + +کچھ زبان کے مخصوص ہدایات کے لیے، مثلاً `docs/de/llm-prompt.md` میں سیکشن `### Headings` دیکھیں۔ + +//// + +## Docs میں استعمال ہونے والی اصطلاحات { #terms-used-in-the-docs } + +//// tab | Test + +* you +* your + +* e.g. +* etc. + +* `foo` as an `int` +* `bar` as a `str` +* `baz` as a `list` + +* the Tutorial - User guide +* the Advanced User Guide +* the SQLModel docs +* the API docs +* the automatic docs + +* Data Science +* Deep Learning +* Machine Learning +* Dependency Injection +* HTTP Basic authentication +* HTTP Digest +* ISO format +* the JSON Schema standard +* the JSON schema +* the schema definition +* Password Flow +* Mobile + +* deprecated +* designed +* invalid +* on the fly +* standard +* default +* case-sensitive +* case-insensitive + +* to serve the application +* to serve the page + +* the app +* the application + +* the request +* the response +* the error response + +* the path operation +* the path operation decorator +* the path operation function + +* the body +* the request body +* the response body +* the JSON body +* the form body +* the file body +* the function body + +* the parameter +* the body parameter +* the path parameter +* the query parameter +* the cookie parameter +* the header parameter +* the form parameter +* the function parameter + +* the event +* the startup event +* the startup of the server +* the shutdown event +* the lifespan event + +* the handler +* the event handler +* the exception handler +* to handle + +* the model +* the Pydantic model +* the data model +* the database model +* the form model +* the model object + +* the class +* the base class +* the parent class +* the subclass +* the child class +* the sibling class +* the class method + +* the header +* the headers +* the authorization header +* the `Authorization` header +* the forwarded header + +* the dependency injection system +* the dependency +* the dependable +* the dependant + +* I/O bound +* CPU bound +* concurrency +* parallelism +* multiprocessing + +* the env var +* the environment variable +* the `PATH` +* the `PATH` variable + +* the authentication +* the authentication provider +* the authorization +* the authorization form +* the authorization provider +* the user authenticates +* the system authenticates the user + +* the CLI +* the command line interface + +* the server +* the client + +* the cloud provider +* the cloud service + +* the development +* the development stages + +* the dict +* the dictionary +* the enumeration +* the enum +* the enum member + +* the encoder +* the decoder +* to encode +* to decode + +* the exception +* to raise + +* the expression +* the statement + +* the frontend +* the backend + +* the GitHub discussion +* the GitHub issue + +* the performance +* the performance optimization + +* the return type +* the return value + +* the security +* the security scheme + +* the task +* the background task +* the task function + +* the template +* the template engine + +* the type annotation +* the type hint + +* the server worker +* the Uvicorn worker +* the Gunicorn Worker +* the worker process +* the worker class +* the workload + +* the deployment +* to deploy + +* the SDK +* the software development kit + +* the `APIRouter` +* the `requirements.txt` +* the Bearer Token +* the breaking change +* the bug +* the button +* the callable +* the code +* the commit +* the context manager +* the coroutine +* the database session +* the disk +* the domain +* the engine +* the fake X +* the HTTP GET method +* the item +* the library +* the lifespan +* the lock +* the middleware +* the mobile application +* the module +* the mounting +* the network +* the origin +* the override +* the payload +* the processor +* the property +* the proxy +* the pull request +* the query +* the RAM +* the remote machine +* the status code +* the string +* the tag +* the web framework +* the wildcard +* to return +* to validate + +//// + +//// tab | Info + +یہ docs میں نظر آنے والی (زیادہ تر) تکنیکی اصطلاحات کی ایک نامکمل اور غیر حتمی فہرست ہے۔ یہ prompt ڈیزائنر کے لیے مفید ہو سکتی ہے تاکہ معلوم ہو کہ کن اصطلاحات کے لیے LLM کو مدد کی ضرورت ہے۔ مثلاً جب یہ اچھے ترجمے کو بار بار کسی کمتر ترجمے میں واپس لے آئے۔ یا جب اسے آپ کی زبان میں کسی اصطلاح کو conjugate/declinate کرنے میں مسائل ہوں۔ + +مثال کے طور پر `docs/de/llm-prompt.md` میں سیکشن `### List of English terms and their preferred German translations` دیکھیں۔ + +//// diff --git a/docs/ur/docs/about/index.md b/docs/ur/docs/about/index.md new file mode 100644 index 000000000..3dcf347a7 --- /dev/null +++ b/docs/ur/docs/about/index.md @@ -0,0 +1,3 @@ +# کے بارے میں { #about } + +FastAPI کے بارے میں، اس کی ڈیزائن، الہام اور مزید۔ 🤓 diff --git a/docs/ur/docs/advanced/additional-responses.md b/docs/ur/docs/advanced/additional-responses.md new file mode 100644 index 000000000..0c1483502 --- /dev/null +++ b/docs/ur/docs/advanced/additional-responses.md @@ -0,0 +1,247 @@ +# OpenAPI میں اضافی Responses { #additional-responses-in-openapi } + +/// warning | انتباہ + +یہ ایک کافی ایڈوانسڈ موضوع ہے۔ + +اگر آپ **FastAPI** کے ساتھ شروعات کر رہے ہیں تو آپ کو شاید اس کی ضرورت نہ ہو۔ + +/// + +آپ اضافی responses کا اعلان کر سکتے ہیں، اضافی status codes، media types، وضاحتوں وغیرہ کے ساتھ۔ + +یہ اضافی responses OpenAPI schema میں شامل کیے جائیں گے، لہذا وہ API docs میں بھی ظاہر ہوں گے۔ + +لیکن ان اضافی responses کے لیے آپ کو یقینی بنانا ہوگا کہ آپ براہ راست `Response` جیسے `JSONResponse` واپس کریں، اپنے status code اور مواد کے ساتھ۔ + +## `model` کے ساتھ اضافی Response { #additional-response-with-model } + +آپ اپنے *path operation decorators* کو ایک parameter `responses` دے سکتے ہیں۔ + +یہ ایک `dict` وصول کرتا ہے: کلیدیں ہر response کے لیے status codes ہیں (جیسے `200`)، اور قدریں دوسری `dict` ہیں جن میں ہر ایک کی معلومات ہوتی ہیں۔ + +ان response `dict` میں سے ہر ایک میں `model` نامی ایک کلید ہو سکتی ہے، جس میں Pydantic model ہوتا ہے، بالکل `response_model` کی طرح۔ + +**FastAPI** اس model کو لے گا، اس کا JSON Schema تیار کرے گا اور اسے OpenAPI میں صحیح جگہ شامل کرے گا۔ + +مثال کے طور پر، status code `404` اور Pydantic model `Message` کے ساتھ ایک اور response کا اعلان کرنے کے لیے، آپ یہ لکھ سکتے ہیں: + +{* ../../docs_src/additional_responses/tutorial001_py310.py hl[18,22] *} + +/// note | نوٹ + +ذہن میں رکھیں کہ آپ کو `JSONResponse` براہ راست واپس کرنا ہوگا۔ + +/// + +/// info | معلومات + +`model` کلید OpenAPI کا حصہ نہیں ہے۔ + +**FastAPI** وہاں سے Pydantic model لے گا، JSON Schema تیار کرے گا، اور اسے صحیح جگہ رکھے گا۔ + +صحیح جگہ یہ ہے: + +* کلید `content` میں، جس کی قدر ایک اور JSON object (`dict`) ہے جس میں شامل ہے: + * media type والی ایک کلید، مثلاً `application/json`، جس کی قدر ایک اور JSON object ہے، جس میں شامل ہے: + * ایک کلید `schema`، جس کی قدر model سے JSON Schema ہے، یہ ہے صحیح جگہ۔ + * **FastAPI** یہاں عالمی JSON Schemas کا حوالہ شامل کرتا ہے جو آپ کے OpenAPI میں کسی اور جگہ ہوتے ہیں بجائے اسے براہ راست شامل کرنے کے۔ اس طرح، دوسری ایپلیکیشنز اور clients ان JSON Schemas کو براہ راست استعمال کر سکتے ہیں، بہتر code generation ٹولز فراہم کر سکتے ہیں وغیرہ۔ + +/// + +اس *path operation* کے لیے OpenAPI میں تیار شدہ responses یہ ہوں گے: + +```JSON hl_lines="3-12" +{ + "responses": { + "404": { + "description": "Additional Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Message" + } + } + } + }, + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Item" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } +} +``` + +Schemas کا حوالہ OpenAPI schema کے اندر کسی اور جگہ دیا گیا ہے: + +```JSON hl_lines="4-16" +{ + "components": { + "schemas": { + "Message": { + "title": "Message", + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "title": "Message", + "type": "string" + } + } + }, + "Item": { + "title": "Item", + "required": [ + "id", + "value" + ], + "type": "object", + "properties": { + "id": { + "title": "Id", + "type": "string" + }, + "value": { + "title": "Value", + "type": "string" + } + } + }, + "ValidationError": { + "title": "ValidationError", + "required": [ + "loc", + "msg", + "type" + ], + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": { + "type": "string" + } + }, + "msg": { + "title": "Message", + "type": "string" + }, + "type": { + "title": "Error Type", + "type": "string" + } + } + }, + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": { + "$ref": "#/components/schemas/ValidationError" + } + } + } + } + } + } +} +``` + +## بنیادی response کے لیے اضافی media types { #additional-media-types-for-the-main-response } + +آپ اسی `responses` parameter کو استعمال کر کے بنیادی response میں مختلف media types شامل کر سکتے ہیں۔ + +مثال کے طور پر، آپ `image/png` کی اضافی media type شامل کر سکتے ہیں، یہ اعلان کرتے ہوئے کہ آپ کا *path operation* ایک JSON object (media type `application/json` کے ساتھ) یا PNG تصویر واپس کر سکتا ہے: + +{* ../../docs_src/additional_responses/tutorial002_py310.py hl[17:22,26] *} + +/// note | نوٹ + +دھیان دیں کہ آپ کو تصویر براہ راست `FileResponse` استعمال کر کے واپس کرنی ہوگی۔ + +/// + +/// info | معلومات + +جب تک آپ اپنے `responses` parameter میں واضح طور پر کوئی مختلف media type بیان نہیں کرتے، FastAPI فرض کرے گا کہ response کی media type بنیادی response class جیسی ہی ہے (پہلے سے طے شدہ `application/json`)۔ + +لیکن اگر آپ نے `None` کو اس کی media type کے طور پر اپنی مرضی کی response class بیان کی ہے، تو FastAPI کسی بھی اضافی response کے لیے `application/json` استعمال کرے گا جس کے ساتھ ایک model منسلک ہے۔ + +/// + +## معلومات کو یکجا کرنا { #combining-information } + +آپ متعدد جگہوں سے response کی معلومات کو بھی یکجا کر سکتے ہیں، بشمول `response_model`، `status_code`، اور `responses` parameters۔ + +آپ `response_model` کا اعلان کر سکتے ہیں، پہلے سے طے شدہ status code `200` (یا ضرورت کے مطابق کوئی اور) استعمال کرتے ہوئے، اور پھر اسی response کے لیے `responses` میں اضافی معلومات کا اعلان کر سکتے ہیں، براہ راست OpenAPI schema میں۔ + +**FastAPI** `responses` سے اضافی معلومات رکھے گا، اور اسے آپ کے model سے JSON Schema کے ساتھ ملا دے گا۔ + +مثال کے طور پر، آپ status code `404` والا response اعلان کر سکتے ہیں جو Pydantic model استعمال کرتا ہے اور اپنی مرضی کی `description` رکھتا ہے۔ + +اور status code `200` والا response جو آپ کا `response_model` استعمال کرتا ہے، لیکن اپنی مرضی کی `example` شامل کرتا ہے: + +{* ../../docs_src/additional_responses/tutorial003_py310.py hl[20:31] *} + +یہ سب یکجا ہو کر آپ کے OpenAPI میں شامل ہو جائے گا، اور API docs میں دکھایا جائے گا: + + + +## پہلے سے طے شدہ اور اپنی مرضی کے responses کو ملانا { #combine-predefined-responses-and-custom-ones } + +ہو سکتا ہے آپ چاہیں کہ کچھ پہلے سے طے شدہ responses ہوں جو بہت سے *path operations* پر لاگو ہوں، لیکن آپ انہیں ہر *path operation* کے لیے درکار اپنی مرضی کے responses کے ساتھ ملانا چاہتے ہیں۔ + +ان صورتوں میں، آپ Python کی `dict` کو `**dict_to_unpack` کے ساتھ "unpack" کرنے کی تکنیک استعمال کر سکتے ہیں: + +```Python +old_dict = { + "old key": "old value", + "second old key": "second old value", +} +new_dict = {**old_dict, "new key": "new value"} +``` + +یہاں، `new_dict` میں `old_dict` کے تمام key-value جوڑے اور نیا key-value جوڑا شامل ہوگا: + +```Python +{ + "old key": "old value", + "second old key": "second old value", + "new key": "new value", +} +``` + +آپ اس تکنیک کو اپنے *path operations* میں پہلے سے طے شدہ responses کو دوبارہ استعمال کرنے اور انہیں اضافی اپنی مرضی کے responses کے ساتھ ملانے کے لیے استعمال کر سکتے ہیں۔ + +مثال کے طور پر: + +{* ../../docs_src/additional_responses/tutorial004_py310.py hl[11:15,24] *} + +## OpenAPI responses کے بارے میں مزید معلومات { #more-information-about-openapi-responses } + +یہ دیکھنے کے لیے کہ آپ responses میں بالکل کیا شامل کر سکتے ہیں، آپ OpenAPI specification میں یہ حصے دیکھ سکتے ہیں: + +* [OpenAPI Responses Object](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#responses-object)، اس میں `Response Object` شامل ہے۔ +* [OpenAPI Response Object](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#response-object)، آپ اپنے `responses` parameter کے اندر ہر response میں اس سے کچھ بھی براہ راست شامل کر سکتے ہیں۔ بشمول `description`، `headers`، `content` (اس کے اندر آپ مختلف media types اور JSON Schemas کا اعلان کرتے ہیں)، اور `links`۔ diff --git a/docs/ur/docs/advanced/additional-status-codes.md b/docs/ur/docs/advanced/additional-status-codes.md new file mode 100644 index 000000000..323488415 --- /dev/null +++ b/docs/ur/docs/advanced/additional-status-codes.md @@ -0,0 +1,41 @@ +# اضافی Status Codes { #additional-status-codes } + +پہلے سے طے شدہ طور پر، **FastAPI** responses کو `JSONResponse` استعمال کر کے واپس کرے گا، آپ کے *path operation* سے واپس آنے والے مواد کو اس `JSONResponse` میں ڈال کر۔ + +یہ پہلے سے طے شدہ status code یا وہ استعمال کرے گا جو آپ نے اپنے *path operation* میں مقرر کیا ہے۔ + +## اضافی status codes { #additional-status-codes_1 } + +اگر آپ بنیادی status code کے علاوہ اضافی status codes واپس کرنا چاہتے ہیں، تو آپ براہ راست `Response` واپس کر کے ایسا کر سکتے ہیں، جیسے `JSONResponse`، اور اضافی status code براہ راست مقرر کر سکتے ہیں۔ + +مثال کے طور پر، فرض کریں کہ آپ ایک *path operation* چاہتے ہیں جو آئٹمز کو اپ ڈیٹ کرنے کی اجازت دے، اور کامیاب ہونے پر HTTP status code 200 "OK" واپس کرے۔ + +لیکن آپ یہ بھی چاہتے ہیں کہ یہ نئے آئٹمز قبول کرے۔ اور جب آئٹمز پہلے سے موجود نہیں تھے، تو یہ انہیں بنائے اور HTTP status code 201 "Created" واپس کرے۔ + +اس کے لیے، `JSONResponse` import کریں، اور اپنا مواد وہاں براہ راست واپس کریں، جو `status_code` آپ چاہتے ہیں وہ مقرر کرتے ہوئے: + +{* ../../docs_src/additional_status_codes/tutorial001_an_py310.py hl[4,25] *} + +/// warning | انتباہ + +جب آپ براہ راست `Response` واپس کرتے ہیں، جیسا کہ اوپر کی مثال میں، تو یہ براہ راست واپس کیا جائے گا۔ + +اسے model وغیرہ کے ساتھ serialize نہیں کیا جائے گا۔ + +یقینی بنائیں کہ اس میں وہ ڈیٹا ہے جو آپ چاہتے ہیں، اور قدریں درست JSON ہیں (اگر آپ `JSONResponse` استعمال کر رہے ہیں)۔ + +/// + +/// note | تکنیکی تفصیلات + +آپ `from starlette.responses import JSONResponse` بھی استعمال کر سکتے ہیں۔ + +**FastAPI** وہی `starlette.responses` فراہم کرتا ہے جو `fastapi.responses` کے طور پر، بس آپ یعنی developer کی سہولت کے لیے۔ لیکن زیادہ تر دستیاب responses براہ راست Starlette سے آتے ہیں۔ `status` کے ساتھ بھی یہی ہے۔ + +/// + +## OpenAPI اور API docs { #openapi-and-api-docs } + +اگر آپ اضافی status codes اور responses براہ راست واپس کرتے ہیں، تو وہ OpenAPI schema (API docs) میں شامل نہیں ہوں گے، کیونکہ FastAPI کے پاس پہلے سے یہ جاننے کا کوئی طریقہ نہیں ہے کہ آپ کیا واپس کرنے والے ہیں۔ + +لیکن آپ اپنے کوڈ میں اسے دستاویزی شکل دے سکتے ہیں، استعمال کرتے ہوئے: [OpenAPI میں اضافی Responses](additional-responses.md)۔ diff --git a/docs/ur/docs/advanced/advanced-dependencies.md b/docs/ur/docs/advanced/advanced-dependencies.md new file mode 100644 index 000000000..347f68461 --- /dev/null +++ b/docs/ur/docs/advanced/advanced-dependencies.md @@ -0,0 +1,163 @@ +# ایڈوانسڈ Dependencies { #advanced-dependencies } + +## پیرامیٹرائزڈ dependencies { #parameterized-dependencies } + +ہم نے اب تک جتنی بھی dependencies دیکھی ہیں وہ ایک مقررہ function یا class ہیں۔ + +لیکن ایسے مواقع ہو سکتے ہیں جہاں آپ dependency پر parameters سیٹ کرنا چاہیں، بغیر بہت سے مختلف functions یا classes بنائے۔ + +آئیے تصور کریں کہ ہم ایک ایسی dependency چاہتے ہیں جو چیک کرے کہ query parameter `q` میں کوئی مقررہ مواد موجود ہے یا نہیں۔ + +لیکن ہم اس مقررہ مواد کو پیرامیٹرائز کرنا چاہتے ہیں۔ + +## ایک "callable" instance { #a-callable-instance } + +Python میں کسی class کے instance کو "callable" بنانے کا ایک طریقہ ہے۔ + +خود class نہیں (جو پہلے سے ہی callable ہے)، بلکہ اس class کا ایک instance۔ + +اس کے لیے ہم `__call__` method بیان کرتے ہیں: + +{* ../../docs_src/dependencies/tutorial011_an_py310.py hl[12] *} + +اس صورت میں، یہ `__call__` وہ ہے جسے **FastAPI** اضافی parameters اور sub-dependencies چیک کرنے کے لیے استعمال کرے گا، اور بعد میں آپ کے *path operation function* میں parameter کو قدر دینے کے لیے یہی call کیا جائے گا۔ + +## Instance کو پیرامیٹرائز کریں { #parameterize-the-instance } + +اب ہم `__init__` استعمال کر کے instance کے parameters بیان کر سکتے ہیں جنہیں ہم dependency کو "پیرامیٹرائز" کرنے کے لیے استعمال کر سکتے ہیں: + +{* ../../docs_src/dependencies/tutorial011_an_py310.py hl[9] *} + +اس صورت میں، **FastAPI** کبھی `__init__` کو چھوئے گا نہ اس کی فکر کرے گا، ہم اسے براہ راست اپنے کوڈ میں استعمال کریں گے۔ + +## ایک instance بنائیں { #create-an-instance } + +ہم اس class کا ایک instance اس طرح بنا سکتے ہیں: + +{* ../../docs_src/dependencies/tutorial011_an_py310.py hl[18] *} + +اور اس طرح ہم اپنی dependency کو "پیرامیٹرائز" کر سکتے ہیں، جس میں اب `"bar"` موجود ہے، بطور attribute `checker.fixed_content`۔ + +## Instance کو dependency کے طور پر استعمال کریں { #use-the-instance-as-a-dependency } + +پھر ہم اس `checker` کو `Depends(checker)` میں استعمال کر سکتے ہیں، `Depends(FixedContentQueryChecker)` کی بجائے، کیونکہ dependency خود instance ہے، `checker`، نہ کہ class۔ + +اور dependency حل کرتے وقت، **FastAPI** اس `checker` کو اس طرح call کرے گا: + +```Python +checker(q="somequery") +``` + +...اور جو بھی یہ واپس کرے اسے ہمارے *path operation function* میں dependency کی قدر کے طور پر parameter `fixed_content_included` میں دے گا: + +{* ../../docs_src/dependencies/tutorial011_an_py310.py hl[22] *} + +/// tip | مشورہ + +یہ سب کچھ پیچیدہ لگ سکتا ہے۔ اور ابھی شاید یہ واضح نہ ہو کہ یہ کتنا مفید ہے۔ + +یہ مثالیں جان بوجھ کر سادہ ہیں، لیکن دکھاتی ہیں کہ یہ سب کیسے کام کرتا ہے۔ + +Security کے ابواب میں، ایسے utility functions ہیں جو بالکل اسی طرح بنائے گئے ہیں۔ + +اگر آپ نے یہ سب سمجھ لیا، تو آپ پہلے سے جانتے ہیں کہ security کے لیے وہ utility tools اندرونی طور پر کیسے کام کرتے ہیں۔ + +/// + +## `yield`، `HTTPException`، `except` اور Background Tasks کے ساتھ Dependencies { #dependencies-with-yield-httpexception-except-and-background-tasks } + +/// warning | انتباہ + +آپ کو شاید ان تکنیکی تفصیلات کی ضرورت نہیں ہے۔ + +یہ تفصیلات بنیادی طور پر اس وقت مفید ہیں جب آپ کی FastAPI ایپلیکیشن 0.121.0 سے پرانی ہو اور آپ کو `yield` والی dependencies کے ساتھ مسائل درپیش ہوں۔ + +/// + +`yield` والی Dependencies وقت کے ساتھ مختلف استعمال کے مواقع کے لیے اور کچھ مسائل حل کرنے کے لیے بدلتی رہی ہیں، یہاں تبدیلیوں کا خلاصہ ہے۔ + +### `yield` اور `scope` والی Dependencies { #dependencies-with-yield-and-scope } + +ورژن 0.121.0 میں، FastAPI نے `yield` والی dependencies کے لیے `Depends(scope="function")` کی سہولت شامل کی۔ + +`Depends(scope="function")` استعمال کرنے سے، `yield` کے بعد والا exit کوڈ *path operation function* ختم ہونے کے فوراً بعد چلتا ہے، response کلائنٹ کو واپس بھیجنے سے پہلے۔ + +اور `Depends(scope="request")` (جو کہ default ہے) استعمال کرنے سے، `yield` کے بعد والا exit کوڈ response بھیجنے کے بعد چلتا ہے۔ + +آپ اس کے بارے میں مزید [Dependencies with `yield` - Early exit and `scope`](../tutorial/dependencies/dependencies-with-yield.md#early-exit-and-scope) کی دستاویزات میں پڑھ سکتے ہیں۔ + +### `yield` اور `StreamingResponse` والی Dependencies، تکنیکی تفصیلات { #dependencies-with-yield-and-streamingresponse-technical-details } + +FastAPI 0.118.0 سے پہلے، اگر آپ `yield` والی dependency استعمال کرتے، تو exit کوڈ *path operation function* کے واپس آنے کے بعد لیکن response بھیجنے سے پہلے چلتا تھا۔ + +اس کا مقصد وسائل کو ضرورت سے زیادہ دیر تک نہ رکھنا تھا، response کے نیٹ ورک پر سفر کرنے کا انتظار کرتے ہوئے۔ + +اس تبدیلی کا یہ بھی مطلب تھا کہ اگر آپ `StreamingResponse` واپس کرتے، تو `yield` والی dependency کا exit کوڈ پہلے ہی چل چکا ہوتا۔ + +مثال کے طور پر، اگر آپ کے پاس `yield` والی dependency میں database session ہو، تو `StreamingResponse` ڈیٹا stream کرتے وقت اس session کو استعمال نہیں کر سکتا کیونکہ `yield` کے بعد exit کوڈ میں session پہلے ہی بند ہو چکا ہوتا۔ + +یہ رویہ 0.118.0 میں واپس بدل دیا گیا، تاکہ `yield` کے بعد والا exit کوڈ response بھیجنے کے بعد چلے۔ + +/// info | معلومات + +جیسا کہ آپ نیچے دیکھیں گے، یہ ورژن 0.106.0 سے پہلے کے رویے سے بہت ملتا جلتا ہے، لیکن کئی بہتریوں اور خاص صورتوں میں bug fixes کے ساتھ۔ + +/// + +#### ابتدائی Exit کوڈ کے ساتھ استعمال کے مواقع { #use-cases-with-early-exit-code } + +کچھ مخصوص شرائط کے ساتھ استعمال کے مواقع ہیں جو `yield` والی dependencies کے exit کوڈ کو response بھیجنے سے پہلے چلانے کے پرانے رویے سے فائدہ اٹھا سکتے ہیں۔ + +مثال کے طور پر، تصور کریں کہ آپ کے پاس ایسا کوڈ ہے جو `yield` والی dependency میں database session صرف صارف کی تصدیق کے لیے استعمال کرتا ہے، لیکن database session کبھی *path operation function* میں دوبارہ استعمال نہیں ہوتا، صرف dependency میں، **اور** response بھیجنے میں بہت وقت لگتا ہے، جیسے `StreamingResponse` جو آہستہ آہستہ ڈیٹا بھیجتا ہے، لیکن کسی وجہ سے database استعمال نہیں کرتا۔ + +اس صورت میں، database session response مکمل ہونے تک رکھا جائے گا، لیکن اگر آپ اسے استعمال نہیں کرتے، تو اسے رکھنا ضروری نہیں ہوگا۔ + +یہ کچھ اس طرح نظر آ سکتا ہے: + +{* ../../docs_src/dependencies/tutorial013_an_py310.py *} + +Exit کوڈ، `Session` کی خودکار بندش: + +{* ../../docs_src/dependencies/tutorial013_an_py310.py ln[19:21] *} + +...سست ڈیٹا بھیجنے کے بعد response مکمل ہونے پر چلے گا: + +{* ../../docs_src/dependencies/tutorial013_an_py310.py ln[30:38] hl[31:33] *} + +لیکن چونکہ `generate_stream()` database session استعمال نہیں کرتا، اس لیے response بھیجتے وقت session کھلا رکھنا واقعی ضروری نہیں ہے۔ + +اگر آپ کے پاس SQLModel (یا SQLAlchemy) استعمال کرنے والا یہ مخصوص معاملہ ہے، تو آپ ضرورت نہ رہنے پر session کو واضح طور پر بند کر سکتے ہیں: + +{* ../../docs_src/dependencies/tutorial014_an_py310.py ln[24:28] hl[28] *} + +اس طرح session database connection چھوڑ دے گا، تاکہ دوسری requests اسے استعمال کر سکیں۔ + +اگر آپ کے پاس کوئی مختلف استعمال کا موقع ہے جس میں `yield` والی dependency سے جلد باہر نکلنے کی ضرورت ہو، تو براہ کرم اپنے مخصوص استعمال کے ساتھ ایک [GitHub Discussion Question](https://github.com/fastapi/fastapi/discussions/new?category=questions) بنائیں اور بتائیں کہ آپ کو `yield` والی dependencies کے لیے جلد بند ہونے سے کیا فائدہ ہوگا۔ + +اگر `yield` والی dependencies میں جلد بند ہونے کے لیے قابل ذکر استعمال کے مواقع ہوں، تو میں جلد بند ہونے کا اختیار دینے کا ایک نیا طریقہ شامل کرنے پر غور کروں گا۔ + +### `yield` اور `except` والی Dependencies، تکنیکی تفصیلات { #dependencies-with-yield-and-except-technical-details } + +FastAPI 0.110.0 سے پہلے، اگر آپ `yield` والی dependency استعمال کرتے، اور پھر اس dependency میں `except` سے کوئی exception پکڑتے، اور آپ exception دوبارہ raise نہیں کرتے تھے، تو exception خودکار طور پر کسی بھی exception handlers یا internal server error handler کو raise/forward کر دیا جاتا تھا۔ + +یہ ورژن 0.110.0 میں تبدیل کیا گیا تاکہ بغیر handler کے forward کیے گئے exceptions سے غیر منظم memory consumption (internal server errors) کو ٹھیک کیا جا سکے، اور اسے عام Python کوڈ کے رویے سے ہم آہنگ بنایا جا سکے۔ + +### Background Tasks اور `yield` والی Dependencies، تکنیکی تفصیلات { #background-tasks-and-dependencies-with-yield-technical-details } + +FastAPI 0.106.0 سے پہلے، `yield` کے بعد exceptions raise کرنا ممکن نہیں تھا، `yield` والی dependencies میں exit کوڈ response بھیجنے کے *بعد* چلتا تھا، اس لیے [Exception Handlers](../tutorial/handling-errors.md#install-custom-exception-handlers) پہلے ہی چل چکے ہوتے تھے۔ + +یہ بنیادی طور پر اس لیے ڈیزائن کیا گیا تھا تاکہ dependencies سے "yield" کیے گئے اشیاء کو background tasks کے اندر استعمال کیا جا سکے، کیونکہ exit کوڈ background tasks مکمل ہونے کے بعد چلتا تھا۔ + +یہ FastAPI 0.106.0 میں اس ارادے سے تبدیل کیا گیا کہ response کے نیٹ ورک پر سفر کرنے کا انتظار کرتے ہوئے وسائل کو نہ رکھا جائے۔ + +/// tip | مشورہ + +مزید برآں، ایک background task عام طور پر منطق کا ایک آزاد حصہ ہوتا ہے جسے الگ سے، اپنے وسائل کے ساتھ (مثلاً اپنا database connection) سنبھالا جانا چاہیے۔ + +اس طرح آپ کا کوڈ شاید زیادہ صاف ہوگا۔ + +/// + +اگر آپ پہلے اس رویے پر انحصار کرتے تھے، تو اب آپ کو background task کے اندر ہی background tasks کے لیے وسائل بنانے چاہئیں، اور اندرونی طور پر صرف وہ ڈیٹا استعمال کرنا چاہیے جو `yield` والی dependencies کے وسائل پر منحصر نہ ہو۔ + +مثال کے طور پر، ایک ہی database session استعمال کرنے کی بجائے، آپ background task کے اندر ایک نیا database session بنائیں گے، اور اس نئے session سے database سے اشیاء حاصل کریں گے۔ اور پھر background task function کو parameter کے طور پر database سے آبجیکٹ دینے کی بجائے، آپ اس آبجیکٹ کی ID دیں گے اور پھر background task function کے اندر دوبارہ آبجیکٹ حاصل کریں گے۔ diff --git a/docs/ur/docs/advanced/advanced-python-types.md b/docs/ur/docs/advanced/advanced-python-types.md new file mode 100644 index 000000000..4d885845b --- /dev/null +++ b/docs/ur/docs/advanced/advanced-python-types.md @@ -0,0 +1,61 @@ +# ایڈوانسڈ Python Types { #advanced-python-types } + +یہاں کچھ اضافی خیالات ہیں جو Python types کے ساتھ کام کرتے وقت مفید ہو سکتے ہیں۔ + +## `Union` یا `Optional` کا استعمال { #using-union-or-optional } + +اگر آپ کا کوڈ کسی وجہ سے `|` استعمال نہیں کر سکتا، مثلاً اگر یہ type annotation میں نہیں بلکہ `response_model=` جیسی کسی چیز میں ہے، تو عمودی بار (`|`) استعمال کرنے کی بجائے آپ `typing` سے `Union` استعمال کر سکتے ہیں۔ + +مثال کے طور پر، آپ بیان کر سکتے ہیں کہ کچھ `str` یا `None` ہو سکتا ہے: + +```python +from typing import Union + + +def say_hi(name: Union[str, None]): + print(f"Hi {name}!") +``` + +`typing` میں `None` بیان کرنے کا ایک شارٹ کٹ بھی ہے، `Optional` کے ساتھ۔ + +یہاں میرے بہت **ذاتی** نقطہ نظر سے ایک مشورہ: + +* `Optional[SomeType]` استعمال کرنے سے بچیں +* اس کی بجائے **`Union[SomeType, None]`** استعمال کریں۔ + +دونوں ایک جیسے ہیں اور اندرونی طور پر وہی ہیں، لیکن میں `Optional` کی بجائے `Union` تجویز کروں گا کیونکہ لفظ "**optional**" یہ تاثر دے سکتا ہے کہ قدر اختیاری ہے، اور اس کا اصل مطلب ہے "یہ `None` ہو سکتا ہے"، چاہے یہ اختیاری نہ ہو اور پھر بھی ضروری ہو۔ + +مجھے لگتا ہے کہ `Union[SomeType, None]` زیادہ واضح طور پر بتاتا ہے کہ اس کا مطلب کیا ہے۔ + +یہ صرف الفاظ اور ناموں کے بارے میں ہے۔ لیکن یہ الفاظ اثر ڈال سکتے ہیں کہ آپ اور آپ کے ساتھی کوڈ کے بارے میں کیسے سوچتے ہیں۔ + +بطور مثال، یہ function لیں: + +```python +from typing import Optional + + +def say_hi(name: Optional[str]): + print(f"Hey {name}!") +``` + +parameter `name` کو `Optional[str]` بیان کیا گیا ہے، لیکن یہ **اختیاری نہیں** ہے، آپ function کو بغیر parameter کے نہیں بلا سکتے: + +```Python +say_hi() # اوہ نہیں، یہ غلطی دے گا! +``` + +`name` parameter پھر بھی **ضروری** ہے (نہ کہ *اختیاری*) کیونکہ اس کی ڈیفالٹ قدر نہیں ہے۔ پھر بھی، `name` قدر کے طور پر `None` قبول کرتا ہے: + +```Python +say_hi(name=None) # یہ کام کرتا ہے، None درست ہے +``` + +خوشخبری یہ ہے کہ زیادہ تر صورتوں میں، آپ آسانی سے types کی unions بیان کرنے کے لیے `|` استعمال کر سکتے ہیں: + +```python +def say_hi(name: str | None): + print(f"Hey {name}!") +``` + +تو، عام طور پر آپ کو `Optional` اور `Union` جیسے ناموں کی فکر کرنے کی ضرورت نہیں ہے۔ diff --git a/docs/ur/docs/advanced/async-tests.md b/docs/ur/docs/advanced/async-tests.md new file mode 100644 index 000000000..8a6a2ba91 --- /dev/null +++ b/docs/ur/docs/advanced/async-tests.md @@ -0,0 +1,99 @@ +# Async Tests { #async-tests } + +آپ پہلے ہی دیکھ چکے ہیں کہ فراہم کیے گئے `TestClient` کا استعمال کرتے ہوئے اپنی **FastAPI** ایپلیکیشنز کی جانچ کیسے کی جائے۔ اب تک آپ نے صرف synchronous ٹیسٹ لکھنا دیکھا ہے، بغیر `async` functions کے استعمال کے۔ + +اپنے ٹیسٹوں میں asynchronous functions استعمال کر سکنا مفید ہو سکتا ہے، مثال کے طور پر، جب آپ اپنے database سے asynchronously query کر رہے ہوں۔ تصور کریں کہ آپ اپنی FastAPI ایپلیکیشن کو requests بھیجنا چاہتے ہیں اور پھر تصدیق کرنا چاہتے ہیں کہ آپ کے backend نے database میں درست ڈیٹا لکھا ہے، ایک async database library استعمال کرتے ہوئے۔ + +آئیے دیکھتے ہیں کہ ہم یہ کیسے کر سکتے ہیں۔ + +## pytest.mark.anyio { #pytest-mark-anyio } + +اگر ہم اپنے ٹیسٹوں میں asynchronous functions call کرنا چاہتے ہیں، تو ہمارے test functions کو asynchronous ہونا ہوگا۔ AnyIO اس کے لیے ایک عمدہ plugin فراہم کرتا ہے، جو ہمیں یہ بتانے دیتا ہے کہ کچھ test functions asynchronously call کیے جائیں۔ + +## HTTPX { #httpx } + +اگر آپ کی **FastAPI** ایپلیکیشن `async def` کی بجائے عام `def` functions استعمال کرتی ہے، تب بھی یہ اندرونی طور پر ایک `async` ایپلیکیشن ہے۔ + +`TestClient` اندرونی طور پر کچھ خاص عمل کرتا ہے تاکہ آپ کے عام `def` test functions میں asynchronous FastAPI ایپلیکیشن کو call کیا جا سکے، معیاری pytest استعمال کرتے ہوئے۔ لیکن وہ خاص عمل asynchronous functions کے اندر استعمال ہونے پر مزید کام نہیں کرتا۔ اپنے ٹیسٹ asynchronously چلانے سے، ہم اپنے test functions کے اندر `TestClient` مزید استعمال نہیں کر سکتے۔ + +`TestClient` [HTTPX](https://www.python-httpx.org) پر مبنی ہے، اور خوش قسمتی سے، ہم اسے براہ راست API کی جانچ کے لیے استعمال کر سکتے ہیں۔ + +## مثال { #example } + +ایک سادہ مثال کے لیے، آئیے ایسا فائل ڈھانچہ لیتے ہیں جو [Bigger Applications](../tutorial/bigger-applications.md) اور [Testing](../tutorial/testing.md) میں بیان کیے گئے سے ملتا جلتا ہو: + +``` +. +├── app +│ ├── __init__.py +│ ├── main.py +│ └── test_main.py +``` + +`main.py` فائل میں ہوگا: + +{* ../../docs_src/async_tests/app_a_py310/main.py *} + +`test_main.py` فائل میں `main.py` کے ٹیسٹ ہوں گے، یہ اب کچھ اس طرح نظر آ سکتی ہے: + +{* ../../docs_src/async_tests/app_a_py310/test_main.py *} + +## اسے چلائیں { #run-it } + +آپ اپنے ٹیسٹ حسب معمول اس طرح چلا سکتے ہیں: + +
+ +```console +$ pytest + +---> 100% +``` + +
+ +## تفصیل سے { #in-detail } + +`@pytest.mark.anyio` marker pytest کو بتاتا ہے کہ یہ test function asynchronously call کیا جانا چاہیے: + +{* ../../docs_src/async_tests/app_a_py310/test_main.py hl[7] *} + +/// tip | مشورہ + +نوٹ کریں کہ test function اب `async def` ہے نہ کہ پہلے کی طرح صرف `def` جب `TestClient` استعمال ہوتا تھا۔ + +/// + +پھر ہم app کے ساتھ ایک `AsyncClient` بنا سکتے ہیں، اور `await` استعمال کرتے ہوئے اسے async requests بھیج سکتے ہیں۔ + +{* ../../docs_src/async_tests/app_a_py310/test_main.py hl[9:12] *} + +یہ اس کے مساوی ہے: + +```Python +response = client.get('/') +``` + +...جو ہم `TestClient` کے ساتھ اپنی requests بنانے کے لیے استعمال کرتے تھے۔ + +/// tip | مشورہ + +نوٹ کریں کہ ہم نئے `AsyncClient` کے ساتھ async/await استعمال کر رہے ہیں - request asynchronous ہے۔ + +/// + +/// warning | انتباہ + +اگر آپ کی ایپلیکیشن lifespan events پر انحصار کرتی ہے، تو `AsyncClient` ان events کو trigger نہیں کرے گا۔ ان کو trigger ہونا یقینی بنانے کے لیے، [florimondmanca/asgi-lifespan](https://github.com/florimondmanca/asgi-lifespan#usage) سے `LifespanManager` استعمال کریں۔ + +/// + +## دیگر Asynchronous Function Calls { #other-asynchronous-function-calls } + +چونکہ testing function اب asynchronous ہے، آپ اب اپنی FastAPI ایپلیکیشن کو requests بھیجنے کے علاوہ دیگر `async` functions بھی call (اور `await`) کر سکتے ہیں، بالکل اسی طرح جیسے آپ انہیں اپنے کوڈ میں کہیں بھی call کرتے۔ + +/// tip | مشورہ + +اگر آپ کو اپنے ٹیسٹوں میں asynchronous function calls integrate کرتے وقت `RuntimeError: Task attached to a different loop` آئے (مثلاً [MongoDB کا MotorClient](https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop) استعمال کرتے وقت)، تو یاد رکھیں کہ event loop کی ضرورت رکھنے والے objects صرف async functions کے اندر بنائیں، مثلاً `@app.on_event("startup")` callback۔ + +/// diff --git a/docs/ur/docs/advanced/behind-a-proxy.md b/docs/ur/docs/advanced/behind-a-proxy.md new file mode 100644 index 000000000..b183a7e1f --- /dev/null +++ b/docs/ur/docs/advanced/behind-a-proxy.md @@ -0,0 +1,466 @@ +# Proxy کے پیچھے { #behind-a-proxy } + +بہت سے حالات میں، آپ اپنی FastAPI ایپ کے سامنے **Traefik** یا **Nginx** جیسا **proxy** استعمال کریں گے۔ + +یہ proxy HTTPS سرٹیفکیٹ اور دیگر چیزیں ہینڈل کر سکتے ہیں۔ + +## Proxy Forwarded Headers { #proxy-forwarded-headers } + +آپ کی ایپلیکیشن کے سامنے موجود **proxy** عام طور پر requests کو آپ کے **server** تک بھیجنے سے پہلے کچھ headers شامل کرتا ہے تاکہ server کو معلوم ہو کہ request proxy سے **forward** کی گئی ہے، اور اسے اصل (عوامی) URL، domain، اور HTTPS استعمال ہونے وغیرہ کی معلومات مل سکیں۔ + +**server** پروگرام (مثال کے طور پر **Uvicorn** بذریعہ **FastAPI CLI**) ان headers کو سمجھنے اور پھر وہ معلومات آپ کی ایپلیکیشن کو فراہم کرنے کے قابل ہے۔ + +لیکن سیکیورٹی کی وجہ سے، چونکہ server کو معلوم نہیں کہ وہ کسی قابل اعتماد proxy کے پیچھے ہے، یہ ان headers کو نہیں پڑھے گا۔ + +/// note | تکنیکی تفصیلات + +proxy headers یہ ہیں: + +* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For) +* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto) +* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host) + +/// + +### Proxy Forwarded Headers کو فعال کرنا { #enable-proxy-forwarded-headers } + +آپ FastAPI CLI کو *CLI Option* `--forwarded-allow-ips` کے ساتھ شروع کر سکتے ہیں اور ان IP addresses کو پاس کر سکتے ہیں جن پر forwarded headers پڑھنے کے لیے بھروسہ کرنا ہے۔ + +اگر آپ اسے `--forwarded-allow-ips="*"` پر سیٹ کریں تو یہ تمام آنے والے IPs پر بھروسہ کرے گا۔ + +اگر آپ کا **server** کسی قابل اعتماد **proxy** کے پیچھے ہے اور صرف proxy ہی اس سے بات کرتا ہے، تو یہ اس **proxy** کے IP کو قبول کر لے گا۔ + +
+ +```console +$ fastapi run --forwarded-allow-ips="*" + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +### HTTPS کے ساتھ Redirects { #redirects-with-https } + +مثال کے طور پر، فرض کریں آپ ایک *path operation* `/items/` بناتے ہیں: + +{* ../../docs_src/behind_a_proxy/tutorial001_01_py310.py hl[6] *} + +اگر client `/items` پر جانے کی کوشش کرے تو بطور ڈیفالٹ اسے `/items/` کی طرف redirect کیا جائے گا۔ + +لیکن `--forwarded-allow-ips` *CLI Option* سیٹ کرنے سے پہلے یہ `http://localhost:8000/items/` کی طرف redirect کر سکتا تھا۔ + +لیکن شاید آپ کی ایپلیکیشن `https://mysuperapp.com` پر ہوسٹ ہے، اور redirect `https://mysuperapp.com/items/` کی طرف ہونا چاہیے۔ + +`--proxy-headers` سیٹ کرنے کے بعد اب FastAPI درست جگہ پر redirect کر سکے گا۔ + +``` +https://mysuperapp.com/items/ +``` + +/// tip | مشورہ + +اگر آپ HTTPS کے بارے میں مزید جاننا چاہتے ہیں تو [HTTPS کے بارے میں](../deployment/https.md) گائیڈ دیکھیں۔ + +/// + +### Proxy Forwarded Headers کیسے کام کرتے ہیں { #how-proxy-forwarded-headers-work } + +یہاں ایک بصری نمائندگی ہے کہ **proxy** client اور **application server** کے درمیان forwarded headers کیسے شامل کرتا ہے: + +```mermaid +sequenceDiagram + participant Client + participant Proxy as Proxy/Load Balancer + participant Server as FastAPI Server + + Client->>Proxy: HTTPS Request
Host: mysuperapp.com
Path: /items + + Note over Proxy: Proxy adds forwarded headers + + Proxy->>Server: HTTP Request
X-Forwarded-For: [client IP]
X-Forwarded-Proto: https
X-Forwarded-Host: mysuperapp.com
Path: /items + + Note over Server: Server interprets headers
(if --forwarded-allow-ips is set) + + Server->>Proxy: HTTP Response
with correct HTTPS URLs + + Proxy->>Client: HTTPS Response +``` + +**proxy** اصل client request کو روکتا ہے اور خصوصی *forwarded* headers (`X-Forwarded-*`) شامل کرتا ہے اس سے پہلے کہ request **application server** کو بھیجے۔ + +یہ headers اصل request کی وہ معلومات محفوظ رکھتے ہیں جو بصورت دیگر ضائع ہو جاتیں: + +* **X-Forwarded-For**: اصل client کا IP address +* **X-Forwarded-Proto**: اصل protocol (`https`) +* **X-Forwarded-Host**: اصل host (`mysuperapp.com`) + +جب **FastAPI CLI** کو `--forwarded-allow-ips` کے ساتھ ترتیب دیا جائے تو یہ ان headers پر بھروسہ کرتا ہے اور انہیں استعمال کرتا ہے، مثلاً redirects میں درست URLs بنانے کے لیے۔ + +## ہٹائے گئے path prefix والا Proxy { #proxy-with-a-stripped-path-prefix } + +آپ کے پاس ایسا proxy ہو سکتا ہے جو آپ کی ایپلیکیشن میں path prefix شامل کرے۔ + +ان صورتوں میں آپ اپنی ایپلیکیشن کو ترتیب دینے کے لیے `root_path` استعمال کر سکتے ہیں۔ + +`root_path` ASGI specification کی فراہم کردہ ایک مکینزم ہے (جس پر FastAPI بنایا گیا ہے، Starlette کے ذریعے)۔ + +`root_path` ان مخصوص صورتوں کو ہینڈل کرنے کے لیے استعمال ہوتا ہے۔ + +اور اسے اندرونی طور پر sub-applications mount کرتے وقت بھی استعمال کیا جاتا ہے۔ + +ہٹائے گئے path prefix والے proxy کا مطلب ہے کہ آپ اپنے کوڈ میں `/app` پر path بیان کر سکتے ہیں، لیکن پھر آپ اوپر ایک تہہ شامل کرتے ہیں (proxy) جو آپ کی **FastAPI** ایپلیکیشن کو `/api/v1` جیسے path کے نیچے رکھے گا۔ + +اس صورت میں، اصل path `/app` دراصل `/api/v1/app` پر serve ہوگا۔ + +خواہ آپ کا سارا کوڈ یہ سمجھ کر لکھا گیا ہو کہ صرف `/app` ہے۔ + +{* ../../docs_src/behind_a_proxy/tutorial001_py310.py hl[6] *} + +اور proxy request کو app server (شاید Uvicorn بذریعہ FastAPI CLI) تک بھیجنے سے پہلے **"path prefix کو ہٹا"** رہا ہوگا، تاکہ آپ کی ایپلیکیشن یہ سمجھے کہ وہ `/app` پر serve ہو رہی ہے، اور آپ کو اپنے تمام کوڈ میں `/api/v1` prefix شامل کرنے کی ضرورت نہ ہو۔ + +یہاں تک سب کچھ عام طور پر کام کرے گا۔ + +لیکن پھر، جب آپ integrated docs UI (frontend) کھولیں گے، تو وہ OpenAPI schema `/openapi.json` سے لینے کی کوشش کرے گا، `/api/v1/openapi.json` سے نہیں۔ + +تو، frontend (جو browser میں چلتا ہے) `/openapi.json` تک پہنچنے کی کوشش کرے گا اور OpenAPI schema نہیں مل پائے گا۔ + +چونکہ ہمارے پاس ایپ کے لیے `/api/v1` path prefix والا proxy ہے، frontend کو OpenAPI schema `/api/v1/openapi.json` سے لینا ہوگا۔ + +```mermaid +graph LR + +browser("Browser") +proxy["Proxy on http://0.0.0.0:9999/api/v1/app"] +server["Server on http://127.0.0.1:8000/app"] + +browser --> proxy +proxy --> server +``` + +/// tip | مشورہ + +IP `0.0.0.0` عام طور پر اس بات کی نشاندہی کرتا ہے کہ پروگرام اس مشین/server پر دستیاب تمام IPs پر سنتا ہے۔ + +/// + +docs UI کو یہ بھی ضرورت ہوگی کہ OpenAPI schema یہ بتائے کہ یہ API `server` `/api/v1` پر واقع ہے (proxy کے پیچھے)۔ مثال کے طور پر: + +```JSON hl_lines="4-8" +{ + "openapi": "3.1.0", + // More stuff here + "servers": [ + { + "url": "/api/v1" + } + ], + "paths": { + // More stuff here + } +} +``` + +اس مثال میں، "Proxy" کچھ **Traefik** جیسا ہو سکتا ہے۔ اور server کچھ FastAPI CLI بمع **Uvicorn** جیسا ہو سکتا ہے، جو آپ کی FastAPI ایپلیکیشن چلا رہا ہو۔ + +### `root_path` فراہم کرنا { #providing-the-root-path } + +یہ حاصل کرنے کے لیے، آپ command line option `--root-path` اس طرح استعمال کر سکتے ہیں: + +
+ +```console +$ 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 استعمال کرتے ہیں تو اس میں بھی `--root-path` آپشن ہے۔ + +/// note | تکنیکی تفصیلات + +ASGI specification اس استعمال کے لیے `root_path` بیان کرتا ہے۔ + +اور `--root-path` command line option وہ `root_path` فراہم کرتا ہے۔ + +/// + +### موجودہ `root_path` چیک کرنا { #checking-the-current-root-path } + +آپ ہر request کے لیے اپنی ایپلیکیشن کا استعمال شدہ موجودہ `root_path` حاصل کر سکتے ہیں، یہ `scope` dictionary کا حصہ ہے (جو ASGI spec کا حصہ ہے)۔ + +یہاں ہم اسے صرف مظاہرے کے مقاصد کے لیے پیغام میں شامل کر رہے ہیں۔ + +{* ../../docs_src/behind_a_proxy/tutorial001_py310.py hl[8] *} + +پھر، اگر آپ Uvicorn اس طرح شروع کریں: + +
+ +```console +$ 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) +``` + +
+ +response کچھ اس طرح ہوگا: + +```JSON +{ + "message": "Hello World", + "root_path": "/api/v1" +} +``` + +### FastAPI ایپ میں `root_path` سیٹ کرنا { #setting-the-root-path-in-the-fastapi-app } + +متبادل طور پر، اگر آپ کے پاس `--root-path` جیسا command line option فراہم کرنے کا کوئی طریقہ نہیں ہے، تو آپ اپنی FastAPI ایپ بناتے وقت `root_path` parameter سیٹ کر سکتے ہیں: + +{* ../../docs_src/behind_a_proxy/tutorial002_py310.py hl[3] *} + +`FastAPI` کو `root_path` پاس کرنا Uvicorn یا Hypercorn کو `--root-path` command line option پاس کرنے کے برابر ہے۔ + +### `root_path` کے بارے میں { #about-root-path } + +یاد رکھیں کہ server (Uvicorn) اس `root_path` کو ایپ کو پاس کرنے کے علاوہ کسی اور چیز کے لیے استعمال نہیں کرے گا۔ + +لیکن اگر آپ اپنے browser سے [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app) پر جائیں تو آپ کو عام response نظر آئے گا: + +```JSON +{ + "message": "Hello World", + "root_path": "/api/v1" +} +``` + +تو، یہ `http://127.0.0.1:8000/api/v1/app` پر رسائی کی توقع نہیں رکھے گا۔ + +Uvicorn توقع رکھے گا کہ proxy، Uvicorn تک `http://127.0.0.1:8000/app` پر رسائی کرے، اور پھر اوپر اضافی `/api/v1` prefix شامل کرنا proxy کی ذمہ داری ہوگی۔ + +## ہٹائے گئے path prefix والے proxy کے بارے میں { #about-proxies-with-a-stripped-path-prefix } + +یاد رکھیں کہ ہٹائے گئے path prefix والا proxy اسے ترتیب دینے کے طریقوں میں سے صرف ایک ہے۔ + +شاید بہت سے معاملات میں ڈیفالٹ یہ ہوگا کہ proxy کے پاس ہٹایا گیا path prefix نہیں ہوگا۔ + +ایسی صورت میں (بغیر ہٹائے گئے path prefix کے)، proxy کچھ ایسے `https://myawesomeapp.com` پر سنے گا، اور پھر اگر browser `https://myawesomeapp.com/api/v1/app` پر جائے اور آپ کا server (مثلاً Uvicorn) `http://127.0.0.1:8000` پر سنتا ہو تو proxy (بغیر ہٹائے گئے path prefix کے) Uvicorn تک اسی path پر رسائی کرے گا: `http://127.0.0.1:8000/api/v1/app`۔ + +## Traefik کے ساتھ مقامی جانچ { #testing-locally-with-traefik } + +آپ [Traefik](https://docs.traefik.io/) استعمال کرتے ہوئے ہٹائے گئے path prefix کے ساتھ آسانی سے مقامی طور پر تجربہ کر سکتے ہیں۔ + +[Traefik ڈاؤن لوڈ کریں](https://github.com/containous/traefik/releases)، یہ ایک واحد binary ہے، آپ compressed فائل نکال کر اسے براہ راست terminal سے چلا سکتے ہیں۔ + +پھر ایک فائل `traefik.toml` بنائیں جس میں یہ ہو: + +```TOML hl_lines="3" +[entryPoints] + [entryPoints.http] + address = ":9999" + +[providers] + [providers.file] + filename = "routes.toml" +``` + +یہ Traefik کو بتاتا ہے کہ port 9999 پر سنے اور ایک اور فائل `routes.toml` استعمال کرے۔ + +/// tip | مشورہ + +ہم معیاری HTTP port 80 کی بجائے port 9999 استعمال کر رہے ہیں تاکہ آپ کو اسے admin (`sudo`) مراعات کے ساتھ چلانے کی ضرورت نہ ہو۔ + +/// + +اب وہ دوسری فائل `routes.toml` بنائیں: + +```TOML hl_lines="5 12 20" +[http] + [http.middlewares] + + [http.middlewares.api-stripprefix.stripPrefix] + prefixes = ["/api/v1"] + + [http.routers] + + [http.routers.app-http] + entryPoints = ["http"] + service = "app" + rule = "PathPrefix(`/api/v1`)" + middlewares = ["api-stripprefix"] + + [http.services] + + [http.services.app] + [http.services.app.loadBalancer] + [[http.services.app.loadBalancer.servers]] + url = "http://127.0.0.1:8000" +``` + +یہ فائل Traefik کو path prefix `/api/v1` استعمال کرنے کے لیے ترتیب دیتی ہے۔ + +اور پھر Traefik اپنی requests `http://127.0.0.1:8000` پر چلنے والے آپ کے Uvicorn کو redirect کرے گا۔ + +اب Traefik شروع کریں: + +
+ +```console +$ ./traefik --configFile=traefik.toml + +INFO[0000] Configuration loaded from file: /home/user/awesomeapi/traefik.toml +``` + +
+ +اور اب `--root-path` آپشن کے ساتھ اپنی ایپ شروع کریں: + +
+ +```console +$ 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) +``` + +
+ +### Responses چیک کریں { #check-the-responses } + +اب، اگر آپ Uvicorn کے port والے URL پر جائیں: [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app)، تو آپ کو عام response نظر آئے گا: + +```JSON +{ + "message": "Hello World", + "root_path": "/api/v1" +} +``` + +/// tip | مشورہ + +غور کریں کہ باوجود اس کے کہ آپ `http://127.0.0.1:8000/app` پر رسائی کر رہے ہیں، یہ `/api/v1` کا `root_path` دکھاتا ہے، جو `--root-path` آپشن سے لیا گیا ہے۔ + +/// + +اور اب path prefix سمیت Traefik کے port والا URL کھولیں: [http://127.0.0.1:9999/api/v1/app](http://127.0.0.1:9999/api/v1/app)۔ + +ہمیں وہی response ملتا ہے: + +```JSON +{ + "message": "Hello World", + "root_path": "/api/v1" +} +``` + +لیکن اس بار proxy کے فراہم کردہ prefix path والے URL پر: `/api/v1`۔ + +ظاہر ہے، یہاں خیال یہ ہے کہ ہر کوئی ایپ تک proxy کے ذریعے رسائی کرے، تو path prefix `/api/v1` والا ورژن "درست" ہے۔ + +اور بغیر path prefix کا ورژن (`http://127.0.0.1:8000/app`)، جو Uvicorn براہ راست فراہم کرتا ہے، خصوصی طور پر _proxy_ (Traefik) کے لیے ہے تاکہ وہ اس تک رسائی کرے۔ + +یہ ظاہر کرتا ہے کہ Proxy (Traefik) path prefix کیسے استعمال کرتا ہے اور server (Uvicorn) `--root-path` آپشن سے `root_path` کیسے استعمال کرتا ہے۔ + +### Docs UI چیک کریں { #check-the-docs-ui } + +لیکن یہاں دلچسپ حصہ ہے۔ + +ایپ تک رسائی کا "سرکاری" طریقہ اس path prefix والے proxy کے ذریعے ہے جو ہم نے بیان کیا۔ تو، جیسا کہ ہم توقع کریں گے، اگر آپ Uvicorn کے براہ راست فراہم کردہ docs UI کو آزمائیں، بغیر URL میں path prefix کے، تو یہ کام نہیں کرے گا، کیونکہ اسے proxy کے ذریعے رسائی کی توقع ہے۔ + +آپ اسے [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) پر چیک کر سکتے ہیں: + + + +لیکن اگر ہم "سرکاری" URL سے proxy کے ذریعے port `9999` پر docs UI رسائی کریں، `/api/v1/docs` پر، تو یہ درست طریقے سے کام کرتا ہے! + +آپ اسے [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs) پر چیک کر سکتے ہیں: + + + +بالکل جیسا ہم چاہتے تھے۔ + +اس کی وجہ یہ ہے کہ FastAPI اس `root_path` کو استعمال کرکے OpenAPI میں `root_path` کے فراہم کردہ URL کے ساتھ ڈیفالٹ `server` بناتا ہے۔ + +## اضافی servers { #additional-servers } + +/// warning | انتباہ + +یہ ایک زیادہ ایڈوانسڈ استعمال ہے۔ اسے چھوڑ دینے میں کوئی حرج نہیں۔ + +/// + +بطور ڈیفالٹ، **FastAPI** OpenAPI schema میں `root_path` کے URL کے ساتھ ایک `server` بنائے گا۔ + +لیکن آپ دیگر متبادل `servers` بھی فراہم کر سکتے ہیں، مثال کے طور پر اگر آپ چاہتے ہیں کہ *وہی* docs UI staging اور production دونوں ماحول کے ساتھ بات چیت کرے۔ + +اگر آپ `servers` کی حسب ضرورت فہرست پاس کریں اور `root_path` موجود ہو (کیونکہ آپ کا API proxy کے پیچھے ہے)، تو **FastAPI** فہرست کے شروع میں اس `root_path` کے ساتھ ایک "server" داخل کرے گا۔ + +مثال کے طور پر: + +{* ../../docs_src/behind_a_proxy/tutorial003_py310.py hl[4:7] *} + +یہ اس طرح کا OpenAPI schema بنائے گا: + +```JSON hl_lines="5-7" +{ + "openapi": "3.1.0", + // More stuff here + "servers": [ + { + "url": "/api/v1" + }, + { + "url": "https://stag.example.com", + "description": "Staging environment" + }, + { + "url": "https://prod.example.com", + "description": "Production environment" + } + ], + "paths": { + // More stuff here + } +} +``` + +/// tip | مشورہ + +غور کریں خود بخود بنایا گیا server جس کی `url` ویلیو `/api/v1` ہے، جو `root_path` سے لی گئی ہے۔ + +/// + +[http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs) پر docs UI میں یہ اس طرح نظر آئے گا: + + + +/// tip | مشورہ + +docs UI اس server کے ساتھ بات چیت کرے گا جسے آپ منتخب کریں۔ + +/// + +/// note | تکنیکی تفصیلات + +OpenAPI specification میں `servers` خاصیت اختیاری ہے۔ + +اگر آپ `servers` parameter بیان نہ کریں اور `root_path` `/` کے برابر ہو، تو بنائے گئے OpenAPI schema میں `servers` خاصیت مکمل طور پر چھوڑ دی جائے گی، جو بطور ڈیفالٹ `url` ویلیو `/` والے ایک واحد server کے برابر ہے۔ + +/// + +### `root_path` سے خودکار server غیر فعال کرنا { #disable-automatic-server-from-root-path } + +اگر آپ نہیں چاہتے کہ **FastAPI** `root_path` استعمال کرتے ہوئے خودکار server شامل کرے، تو آپ `root_path_in_servers=False` parameter استعمال کر سکتے ہیں: + +{* ../../docs_src/behind_a_proxy/tutorial004_py310.py hl[9] *} + +اور پھر اسے OpenAPI schema میں شامل نہیں کیا جائے گا۔ + +## Sub-application mount کرنا { #mounting-a-sub-application } + +اگر آپ کو sub-application mount کرنی ہو (جیسا کہ [Sub Applications - Mounts](sub-applications.md) میں بیان ہے) جبکہ `root_path` کے ساتھ proxy بھی استعمال ہو رہا ہو، تو آپ اسے عام طور پر کر سکتے ہیں، جیسا کہ آپ توقع کریں گے۔ + +FastAPI اندرونی طور پر `root_path` کو سمجھداری سے استعمال کرے گا، تو یہ بس کام کر جائے گا۔ diff --git a/docs/ur/docs/advanced/custom-response.md b/docs/ur/docs/advanced/custom-response.md new file mode 100644 index 000000000..38927a556 --- /dev/null +++ b/docs/ur/docs/advanced/custom-response.md @@ -0,0 +1,272 @@ +# حسب ضرورت Response - HTML, Stream, File, اور دیگر { #custom-response-html-stream-file-others } + +پہلے سے طے شدہ طور پر، **FastAPI** JSON responses واپس کرے گا۔ + +آپ اسے براہ راست `Response` واپس کر کے تبدیل کر سکتے ہیں جیسا کہ [براہ راست Response واپس کریں](response-directly.md) میں بتایا گیا ہے۔ + +لیکن اگر آپ براہ راست `Response` واپس کرتے ہیں (یا کوئی بھی subclass، جیسے `JSONResponse`)، تو ڈیٹا خود بخود تبدیل نہیں ہوگا (چاہے آپ نے `response_model` کا اعلان کیا ہو)، اور دستاویزات خود بخود تیار نہیں ہوں گی (مثال کے طور پر، مخصوص "media type" شامل کرنا، HTTP header `Content-Type` میں، تیار شدہ OpenAPI کے حصے کے طور پر)۔ + +لیکن آپ وہ `Response` بھی اعلان کر سکتے ہیں جو آپ استعمال کرنا چاہتے ہیں (مثلاً کوئی بھی `Response` subclass)، *path operation decorator* میں `response_class` parameter استعمال کر کے۔ + +آپ کے *path operation function* سے واپس آنے والا مواد اس `Response` میں ڈالا جائے گا۔ + +/// note | نوٹ + +اگر آپ بغیر media type والی response class استعمال کرتے ہیں، تو FastAPI توقع کرے گا کہ آپ کے response میں کوئی مواد نہیں ہے، لہذا یہ تیار شدہ OpenAPI docs میں response format کو دستاویزی شکل نہیں دے گا۔ + +/// + +## JSON Responses { #json-responses } + +پہلے سے طے شدہ طور پر FastAPI JSON responses واپس کرتا ہے۔ + +اگر آپ [Response Model](../tutorial/response-model.md) کا اعلان کرتے ہیں تو FastAPI اسے Pydantic استعمال کر کے ڈیٹا کو JSON میں serialize کرنے کے لیے استعمال کرے گا۔ + +اگر آپ response model کا اعلان نہیں کرتے، تو FastAPI [JSON Compatible Encoder](../tutorial/encoder.md) میں بیان کردہ `jsonable_encoder` استعمال کرے گا اور اسے `JSONResponse` میں ڈالے گا۔ + +اگر آپ JSON media type (`application/json`) والی `response_class` کا اعلان کرتے ہیں، جیسا کہ `JSONResponse` کے معاملے میں ہے، تو آپ کا واپس کردہ ڈیٹا خود بخود Pydantic `response_model` کے ساتھ تبدیل (اور فلٹر) ہوگا جو آپ نے *path operation decorator* میں اعلان کیا تھا۔ لیکن ڈیٹا کو Pydantic کے ذریعے JSON bytes میں serialize نہیں کیا جائے گا، بلکہ اسے `jsonable_encoder` سے تبدیل کیا جائے گا اور پھر `JSONResponse` class کو دیا جائے گا، جو اسے Python کی معیاری JSON library استعمال کر کے bytes میں serialize کرے گی۔ + +### JSON کارکردگی { #json-performance } + +مختصراً، اگر آپ زیادہ سے زیادہ کارکردگی چاہتے ہیں تو [Response Model](../tutorial/response-model.md) استعمال کریں اور *path operation decorator* میں `response_class` کا اعلان نہ کریں۔ + +{* ../../docs_src/response_model/tutorial001_01_py310.py ln[15:17] hl[16] *} + +## HTML Response { #html-response } + +**FastAPI** سے براہ راست HTML کے ساتھ response واپس کرنے کے لیے، `HTMLResponse` استعمال کریں۔ + +* `HTMLResponse` import کریں۔ +* اپنے *path operation decorator* کے parameter `response_class` میں `HTMLResponse` دیں۔ + +{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *} + +/// info | معلومات + +parameter `response_class` کو response کی "media type" کی تعریف کے لیے بھی استعمال کیا جائے گا۔ + +اس صورت میں، HTTP header `Content-Type` کو `text/html` پر مقرر کیا جائے گا۔ + +اور اسے OpenAPI میں اسی طرح دستاویزی شکل دی جائے گی۔ + +/// + +### `Response` واپس کریں { #return-a-response } + +جیسا کہ [براہ راست Response واپس کریں](response-directly.md) میں بتایا گیا ہے، آپ اپنے *path operation* میں response کو براہ راست واپس کر کے بھی تبدیل کر سکتے ہیں۔ + +اوپر والی مثال، `HTMLResponse` واپس کرتے ہوئے، اس طرح دکھ سکتی ہے: + +{* ../../docs_src/custom_response/tutorial003_py310.py hl[2,7,19] *} + +/// warning | انتباہ + +آپ کے *path operation function* سے براہ راست واپس کیا گیا `Response` OpenAPI میں دستاویزی شکل نہیں دیا جائے گا (مثال کے طور پر، `Content-Type` دستاویزی نہیں ہوگا) اور خودکار انٹرایکٹو docs میں نظر نہیں آئے گا۔ + +/// + +/// info | معلومات + +یقیناً، اصل `Content-Type` header، status code وغیرہ آپ کے واپس کردہ `Response` آبجیکٹ سے آئیں گے۔ + +/// + +### OpenAPI میں دستاویز بنائیں اور `Response` کو تبدیل کریں { #document-in-openapi-and-override-response } + +اگر آپ function کے اندر سے response کو تبدیل کرنا چاہتے ہیں لیکن ساتھ ہی OpenAPI میں "media type" کو دستاویزی شکل دینا چاہتے ہیں، تو آپ `response_class` parameter استعمال کر سکتے ہیں اور ساتھ ہی `Response` آبجیکٹ واپس کر سکتے ہیں۔ + +`response_class` پھر صرف OpenAPI *path operation* کی دستاویز بنانے کے لیے استعمال ہوگی، لیکن آپ کا `Response` جیسا ہے ویسا ہی استعمال ہوگا۔ + +#### براہ راست `HTMLResponse` واپس کریں { #return-an-htmlresponse-directly } + +مثال کے طور پر، یہ کچھ اس طرح ہو سکتا ہے: + +{* ../../docs_src/custom_response/tutorial004_py310.py hl[7,21,23] *} + +اس مثال میں، function `generate_html_response()` پہلے سے ہی HTML کو `str` میں واپس کرنے کی بجائے `Response` تیار اور واپس کرتا ہے۔ + +`generate_html_response()` کو کال کرنے کا نتیجہ واپس کر کے، آپ پہلے سے ہی ایک `Response` واپس کر رہے ہیں جو **FastAPI** کے پہلے سے طے شدہ رویے کو تبدیل کر دے گا۔ + +لیکن چونکہ آپ نے `HTMLResponse` کو `response_class` میں بھی دیا ہے، **FastAPI** جانے گا کہ اسے OpenAPI اور انٹرایکٹو docs میں HTML کے طور پر `text/html` کے ساتھ دستاویزی شکل کیسے دینی ہے: + + + +## دستیاب responses { #available-responses } + +یہاں کچھ دستیاب responses ہیں۔ + +ذہن میں رکھیں کہ آپ `Response` استعمال کر کے کچھ بھی واپس کر سکتے ہیں، یا حتی کہ اپنی مرضی کی sub-class بنا سکتے ہیں۔ + +/// note | تکنیکی تفصیلات + +آپ `from starlette.responses import HTMLResponse` بھی استعمال کر سکتے ہیں۔ + +**FastAPI** وہی `starlette.responses` فراہم کرتا ہے جو `fastapi.responses` کے طور پر، بس آپ یعنی developer کی سہولت کے لیے۔ لیکن زیادہ تر دستیاب responses براہ راست Starlette سے آتے ہیں۔ + +/// + +### `Response` { #response } + +بنیادی `Response` class، باقی تمام responses اس سے وراثت میں ملتے ہیں۔ + +آپ اسے براہ راست واپس کر سکتے ہیں۔ + +یہ درج ذیل parameters قبول کرتا ہے: + +* `content` - ایک `str` یا `bytes`۔ +* `status_code` - ایک `int` HTTP status code۔ +* `headers` - strings کی ایک `dict`۔ +* `media_type` - media type دینے والی ایک `str`۔ مثلاً `"text/html"`۔ + +FastAPI (دراصل Starlette) خود بخود Content-Length header شامل کرے گا۔ یہ Content-Type header بھی شامل کرے گا، `media_type` کی بنیاد پر اور متنی اقسام کے لیے charset شامل کرے گا۔ + +{* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *} + +### `HTMLResponse` { #htmlresponse } + +کچھ متن یا bytes لیتا ہے اور HTML response واپس کرتا ہے، جیسا کہ آپ نے اوپر پڑھا۔ + +### `PlainTextResponse` { #plaintextresponse } + +کچھ متن یا bytes لیتا ہے اور سادہ متنی response واپس کرتا ہے۔ + +{* ../../docs_src/custom_response/tutorial005_py310.py hl[2,7,9] *} + +### `JSONResponse` { #jsonresponse } + +کچھ ڈیٹا لیتا ہے اور `application/json` encoded response واپس کرتا ہے۔ + +یہ **FastAPI** میں استعمال ہونے والا پہلے سے طے شدہ response ہے، جیسا کہ آپ نے اوپر پڑھا۔ + +/// note | تکنیکی تفصیلات + +لیکن اگر آپ response model یا return type کا اعلان کرتے ہیں، تو اسے ڈیٹا کو JSON میں براہ راست serialize کرنے کے لیے استعمال کیا جائے گا، اور JSON کے لیے صحیح media type والا response براہ راست واپس کیا جائے گا، `JSONResponse` class استعمال کیے بغیر۔ + +یہ بہترین کارکردگی حاصل کرنے کا مثالی طریقہ ہے۔ + +/// + +### `RedirectResponse` { #redirectresponse } + +HTTP redirect واپس کرتا ہے۔ پہلے سے طے شدہ طور پر 307 status code (Temporary Redirect) استعمال کرتا ہے۔ + +آپ براہ راست `RedirectResponse` واپس کر سکتے ہیں: + +{* ../../docs_src/custom_response/tutorial006_py310.py hl[2,9] *} + +--- + +یا آپ اسے `response_class` parameter میں استعمال کر سکتے ہیں: + +{* ../../docs_src/custom_response/tutorial006b_py310.py hl[2,7,9] *} + +اگر آپ ایسا کرتے ہیں، تو آپ اپنے *path operation* function سے براہ راست URL واپس کر سکتے ہیں۔ + +اس صورت میں، استعمال ہونے والا `status_code` `RedirectResponse` کا پہلے سے طے شدہ ہوگا، جو `307` ہے۔ + +--- + +آپ `status_code` parameter کو `response_class` parameter کے ساتھ بھی استعمال کر سکتے ہیں: + +{* ../../docs_src/custom_response/tutorial006c_py310.py hl[2,7,9] *} + +### `StreamingResponse` { #streamingresponse } + +ایک async generator یا عام generator/iterator (ایک function جس میں `yield` ہو) لیتا ہے اور response body کو stream کرتا ہے۔ + +{* ../../docs_src/custom_response/tutorial007_py310.py hl[3,16] *} + +/// note | تکنیکی تفصیلات + +ایک `async` task صرف اس وقت منسوخ ہو سکتا ہے جب یہ `await` پر پہنچتا ہے۔ اگر `await` نہیں ہے، تو generator (function جس میں `yield` ہو) صحیح طریقے سے منسوخ نہیں ہو سکتا اور منسوخی کی درخواست کے بعد بھی چلتا رہ سکتا ہے۔ + +چونکہ اس چھوٹی مثال کو کسی `await` statement کی ضرورت نہیں ہے، ہم `await anyio.sleep(0)` شامل کرتے ہیں تاکہ event loop کو منسوخی سنبھالنے کا موقع مل سکے۔ + +بڑے یا لامحدود streams کے ساتھ یہ اور بھی اہم ہوگا۔ + +/// + +/// tip | مشورہ + +براہ راست `StreamingResponse` واپس کرنے کی بجائے، آپ کو شاید [Stream Data](./stream-data.md) میں دیے گئے طریقے پر عمل کرنا چاہیے، یہ بہت زیادہ آسان ہے اور پس پردہ منسوخی کو آپ کے لیے سنبھالتا ہے۔ + +اگر آپ JSON Lines stream کر رہے ہیں، تو [Stream JSON Lines](../tutorial/stream-json-lines.md) ٹیوٹوریل دیکھیں۔ + +/// + +### `FileResponse` { #fileresponse } + +فائل کو غیر ہم وقتی (asynchronously) response کے طور پر stream کرتا ہے۔ + +دوسری response اقسام سے مختلف arguments لیتا ہے: + +* `path` - فائل کا path جو stream کرنی ہے۔ +* `headers` - شامل کرنے کے لیے کوئی بھی حسب ضرورت headers، بطور dictionary۔ +* `media_type` - media type دینے والی ایک string۔ اگر مقرر نہ ہو تو فائل نام یا path سے media type کا اندازہ لگایا جائے گا۔ +* `filename` - اگر مقرر ہو تو یہ response `Content-Disposition` میں شامل ہوگا۔ + +File responses میں مناسب `Content-Length`، `Last-Modified` اور `ETag` headers شامل ہوں گے۔ + +{* ../../docs_src/custom_response/tutorial009_py310.py hl[2,10] *} + +آپ `response_class` parameter بھی استعمال کر سکتے ہیں: + +{* ../../docs_src/custom_response/tutorial009b_py310.py hl[2,8,10] *} + +اس صورت میں، آپ اپنے *path operation* function سے براہ راست فائل کا path واپس کر سکتے ہیں۔ + +## حسب ضرورت response class { #custom-response-class } + +آپ `Response` سے وراثت میں لے کر اپنی مرضی کی response class بنا سکتے ہیں اور اسے استعمال کر سکتے ہیں۔ + +مثال کے طور پر، فرض کریں کہ آپ [`orjson`](https://github.com/ijl/orjson) کو کچھ ترتیبات کے ساتھ استعمال کرنا چاہتے ہیں۔ + +فرض کریں آپ چاہتے ہیں کہ یہ indented اور formatted JSON واپس کرے، لہذا آپ orjson آپشن `orjson.OPT_INDENT_2` استعمال کرنا چاہتے ہیں۔ + +آپ `CustomORJSONResponse` بنا سکتے ہیں۔ سب سے اہم بات یہ ہے کہ آپ کو ایک `Response.render(content)` method بنانا ہے جو مواد کو `bytes` کے طور پر واپس کرے: + +{* ../../docs_src/custom_response/tutorial009c_py310.py hl[9:14,17] *} + +اب واپس کرنے کی بجائے: + +```json +{"message": "Hello World"} +``` + +...یہ response واپس کرے گا: + +```json +{ + "message": "Hello World" +} +``` + +یقیناً، آپ کو JSON فارمیٹنگ سے کہیں بہتر طریقے مل جائیں گے اس سے فائدہ اٹھانے کے لیے۔ + +### `orjson` یا Response Model { #orjson-or-response-model } + +اگر آپ کارکردگی کی تلاش میں ہیں تو شاید `orjson` response سے بہتر یہ ہے کہ آپ [Response Model](../tutorial/response-model.md) استعمال کریں۔ + +Response model کے ساتھ، FastAPI ڈیٹا کو JSON میں serialize کرنے کے لیے Pydantic استعمال کرے گا، بغیر درمیانی مراحل کے، جیسے اسے `jsonable_encoder` سے تبدیل کرنا، جو کسی بھی اور صورت میں ہوتا۔ + +اور پس پردہ، Pydantic JSON میں serialize کرنے کے لیے `orjson` جیسے ہی بنیادی Rust میکانزم استعمال کرتا ہے، لہذا response model کے ساتھ آپ کو پہلے سے ہی بہترین کارکردگی مل جائے گی۔ + +## پہلے سے طے شدہ response class { #default-response-class } + +**FastAPI** class instance یا `APIRouter` بناتے وقت آپ بتا سکتے ہیں کہ پہلے سے طے شدہ طور پر کون سی response class استعمال ہو۔ + +اسے بیان کرنے والا parameter `default_response_class` ہے۔ + +نیچے دی گئی مثال میں، **FastAPI** تمام *path operations* میں JSON کی بجائے پہلے سے طے شدہ طور پر `HTMLResponse` استعمال کرے گا۔ + +{* ../../docs_src/custom_response/tutorial010_py310.py hl[2,4] *} + +/// tip | مشورہ + +آپ پہلے کی طرح *path operations* میں `response_class` کو تبدیل کر سکتے ہیں۔ + +/// + +## اضافی دستاویزات { #additional-documentation } + +آپ OpenAPI میں media type اور بہت سی دوسری تفصیلات کا بھی `responses` استعمال کر کے اعلان کر سکتے ہیں: [OpenAPI میں اضافی Responses](additional-responses.md)۔ diff --git a/docs/ur/docs/advanced/dataclasses.md b/docs/ur/docs/advanced/dataclasses.md new file mode 100644 index 000000000..d88a22d3b --- /dev/null +++ b/docs/ur/docs/advanced/dataclasses.md @@ -0,0 +1,95 @@ +# Dataclasses کا استعمال { #using-dataclasses } + +FastAPI **Pydantic** کے اوپر بنایا گیا ہے، اور میں آپ کو دکھاتا رہا ہوں کہ requests اور responses بیان کرنے کے لیے Pydantic models کیسے استعمال کریں۔ + +لیکن FastAPI [`dataclasses`](https://docs.python.org/3/library/dataclasses.html) استعمال کرنے کی بھی اسی طرح سپورٹ کرتا ہے: + +{* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *} + +یہ **Pydantic** کی بدولت اب بھی سپورٹ ہے، کیونکہ اس میں [`dataclasses` کی اندرونی سپورٹ](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel) موجود ہے۔ + +تو، اوپر والے کوڈ میں بھی جو واضح طور پر Pydantic استعمال نہیں کرتا، FastAPI ان معیاری dataclasses کو Pydantic کے اپنے مخصوص dataclasses میں تبدیل کرنے کے لیے Pydantic استعمال کر رہا ہے۔ + +اور یقیناً، یہ وہی سب سپورٹ کرتا ہے: + +* ڈیٹا validation +* ڈیٹا serialization +* ڈیٹا دستاویزات، وغیرہ۔ + +یہ Pydantic models کی طرح ہی کام کرتا ہے۔ اور یہ دراصل اندرونی طور پر اسی طرح حاصل کیا جاتا ہے، Pydantic استعمال کرتے ہوئے۔ + +/// info | معلومات + +یاد رکھیں کہ dataclasses وہ سب کچھ نہیں کر سکتیں جو Pydantic models کر سکتے ہیں۔ + +تو، آپ کو پھر بھی Pydantic models استعمال کرنے کی ضرورت پڑ سکتی ہے۔ + +لیکن اگر آپ کے پاس بہت سی dataclasses پڑی ہیں تو FastAPI استعمال کر کے web API بنانے کے لیے انہیں استعمال کرنا ایک اچھی تدبیر ہے۔ + +/// + +## `response_model` میں Dataclasses { #dataclasses-in-response-model } + +آپ `response_model` parameter میں بھی `dataclasses` استعمال کر سکتے ہیں: + +{* ../../docs_src/dataclasses_/tutorial002_py310.py hl[1,6:12,18] *} + +dataclass خود بخود Pydantic dataclass میں تبدیل ہو جائے گی۔ + +اس طرح، اس کا schema API docs user interface میں نظر آئے گا: + + + +## نیسٹڈ ڈیٹا ڈھانچوں میں Dataclasses { #dataclasses-in-nested-data-structures } + +آپ `dataclasses` کو دوسری type annotations کے ساتھ ملا کر نیسٹڈ ڈیٹا ڈھانچے بنا سکتے ہیں۔ + +بعض صورتوں میں، آپ کو پھر بھی Pydantic کے ورژن کی `dataclasses` استعمال کرنی ہو سکتی ہیں۔ مثال کے طور پر، اگر خود بخود بنائی گئی API دستاویزات میں غلطیاں ہوں۔ + +اس صورت میں، آپ معیاری `dataclasses` کو `pydantic.dataclasses` سے بدل سکتے ہیں، جو ایک متبادل ہے: + +{* ../../docs_src/dataclasses_/tutorial003_py310.py hl[1,4,7:10,13:16,22:24,27] *} + +1. ہم پھر بھی معیاری `dataclasses` سے `field` import کرتے ہیں۔ + +2. `pydantic.dataclasses` `dataclasses` کا متبادل ہے۔ + +3. `Author` dataclass میں `Item` dataclasses کی فہرست شامل ہے۔ + +4. `Author` dataclass `response_model` parameter کے طور پر استعمال ہوتی ہے۔ + +5. آپ dataclasses کے ساتھ دیگر معیاری type annotations کو request body کے طور پر استعمال کر سکتے ہیں۔ + + اس صورت میں، یہ `Item` dataclasses کی فہرست ہے۔ + +6. یہاں ہم dictionary واپس کر رہے ہیں جس میں `items` ہے جو dataclasses کی فہرست ہے۔ + + FastAPI پھر بھی ڈیٹا کو JSON میں serialize کرنے کے قابل ہے۔ + +7. یہاں `response_model` `Author` dataclasses کی فہرست کی type annotation استعمال کر رہا ہے۔ + + دوبارہ، آپ `dataclasses` کو معیاری type annotations کے ساتھ ملا سکتے ہیں۔ + +8. غور کریں کہ یہ *path operation function* `async def` کی بجائے عام `def` استعمال کرتا ہے۔ + + ہمیشہ کی طرح، FastAPI میں آپ `def` اور `async def` کو ضرورت کے مطابق ملا سکتے ہیں۔ + + اگر آپ کو یاد دہانی چاہیے کہ کب کون سا استعمال کریں، تو [`async` اور `await`](../async.md#in-a-hurry) کی دستاویزات میں _"جلدی میں ہیں؟"_ سیکشن دیکھیں۔ + +9. یہ *path operation function* dataclasses واپس نہیں کر رہا (حالانکہ کر سکتا ہے)، بلکہ اندرونی ڈیٹا کے ساتھ dictionaries کی فہرست واپس کر رہا ہے۔ + + FastAPI `response_model` parameter (جس میں dataclasses شامل ہیں) استعمال کرکے response تبدیل کرے گا۔ + +آپ `dataclasses` کو دیگر type annotations کے ساتھ بہت سے مختلف مجموعوں میں ملا کر پیچیدہ ڈیٹا ڈھانچے بنا سکتے ہیں۔ + +مزید مخصوص تفصیلات دیکھنے کے لیے اوپر کوڈ میں موجود annotation مشورے دیکھیں۔ + +## مزید جانیں { #learn-more } + +آپ `dataclasses` کو دیگر Pydantic models کے ساتھ بھی ملا سکتے ہیں، ان سے inherit کر سکتے ہیں، انہیں اپنے models میں شامل کر سکتے ہیں، وغیرہ۔ + +مزید جاننے کے لیے، [dataclasses کے بارے میں Pydantic دستاویزات](https://docs.pydantic.dev/latest/concepts/dataclasses/) دیکھیں۔ + +## ورژن { #version } + +یہ FastAPI ورژن `0.67.0` سے دستیاب ہے۔ diff --git a/docs/ur/docs/advanced/events.md b/docs/ur/docs/advanced/events.md new file mode 100644 index 000000000..497fd0d58 --- /dev/null +++ b/docs/ur/docs/advanced/events.md @@ -0,0 +1,165 @@ +# Lifespan Events { #lifespan-events } + +آپ ایسی منطق (کوڈ) بیان کر سکتے ہیں جو ایپلیکیشن **شروع ہونے** سے پہلے عمل میں آئے۔ اس کا مطلب ہے کہ یہ کوڈ ایپلیکیشن کے **requests وصول کرنا شروع** کرنے سے **پہلے**، **ایک بار** عمل میں آئے گا۔ + +اسی طرح، آپ ایسی منطق (کوڈ) بیان کر سکتے ہیں جو ایپلیکیشن کے **بند ہونے** کے وقت عمل میں آئے۔ اس صورت میں، یہ کوڈ ممکنہ طور پر **بہت سی requests** ہینڈل کرنے کے **بعد**، **ایک بار** عمل میں آئے گا۔ + +چونکہ یہ کوڈ ایپلیکیشن کے requests لینا **شروع** کرنے سے پہلے عمل میں آتا ہے، اور requests ہینڈل کرنا **ختم** کرنے کے فوراً بعد، یہ پوری ایپلیکیشن کی **lifespan** کا احاطہ کرتا ہے (لفظ "lifespan" ایک لمحے میں اہم ہوگا)۔ + +یہ ایسے **وسائل** سیٹ اپ کرنے کے لیے بہت مفید ہو سکتا ہے جو آپ کو پوری ایپ میں استعمال کرنے ہیں، اور جو requests کے درمیان **مشترک** ہیں، اور/یا جنہیں آپ کو بعد میں **صاف** کرنا ہے۔ مثال کے طور پر، database connection pool، یا مشترکہ machine learning model لوڈ کرنا۔ + +## استعمال کی صورت { #use-case } + +آئیے ایک مثال **استعمال کی صورت** سے شروع کریں اور پھر دیکھیں کہ اسے کیسے حل کیا جائے۔ + +فرض کریں کہ آپ کے پاس کچھ **machine learning models** ہیں جو آپ requests ہینڈل کرنے کے لیے استعمال کرنا چاہتے ہیں۔ + +وہی models requests کے درمیان مشترک ہیں، تو یہ ہر request کے لیے ایک model نہیں، یا ہر صارف کے لیے ایک یا اس جیسی کوئی بات نہیں۔ + +فرض کریں کہ model لوڈ کرنے میں **کافی وقت** لگ سکتا ہے، کیونکہ اسے **ڈسک سے بہت سا ڈیٹا** پڑھنا ہوتا ہے۔ تو آپ ہر request پر یہ نہیں کرنا چاہتے۔ + +آپ اسے module/فائل کی اعلیٰ سطح پر لوڈ کر سکتے ہیں، لیکن اس کا مطلب یہ بھی ہوگا کہ اگر آپ صرف ایک سادہ خودکار ٹیسٹ چلا رہے ہیں تو بھی یہ **model لوڈ** کرے گا، پھر وہ ٹیسٹ **سست** ہوگا کیونکہ اسے کوڈ کا آزاد حصہ چلانے سے پہلے model لوڈ ہونے کا انتظار کرنا ہوگا۔ + +یہی ہم حل کریں گے، requests ہینڈل ہونے سے پہلے model لوڈ کریں، لیکن صرف ایپلیکیشن کے requests وصول کرنا شروع کرنے سے ٹھیک پہلے، نہ کہ جب کوڈ لوڈ ہو رہا ہو۔ + +## Lifespan { #lifespan } + +آپ `FastAPI` ایپ کے `lifespan` parameter اور ایک "context manager" استعمال کرکے یہ *startup* اور *shutdown* منطق بیان کر سکتے ہیں (میں آپ کو ایک لمحے میں بتاؤں گا کہ یہ کیا ہے)۔ + +آئیے ایک مثال سے شروع کریں اور پھر تفصیل سے دیکھیں۔ + +ہم `yield` کے ساتھ ایک async function `lifespan()` اس طرح بناتے ہیں: + +{* ../../docs_src/events/tutorial003_py310.py hl[16,19] *} + +یہاں ہم model لوڈ کرنے کے مہنگے *startup* عمل کی نقل کر رہے ہیں (جعلی) model function کو `yield` سے پہلے machine learning models کی dictionary میں رکھ کر۔ یہ کوڈ ایپلیکیشن کے **requests لینا شروع** کرنے سے **پہلے**، *startup* کے دوران عمل میں آئے گا۔ + +اور پھر، `yield` کے فوراً بعد، ہم model کو unload کرتے ہیں۔ یہ کوڈ ایپلیکیشن کے **requests ہینڈل کرنا ختم** کرنے کے **بعد**، *shutdown* سے ٹھیک پہلے عمل میں آئے گا۔ یہ مثال کے طور پر، memory یا GPU جیسے وسائل آزاد کر سکتا ہے۔ + +/// tip | مشورہ + +`shutdown` تب ہوگا جب آپ ایپلیکیشن **بند** کر رہے ہوں۔ + +شاید آپ کو نیا ورژن شروع کرنا ہو، یا آپ بس اسے چلاتے چلاتے تھک گئے ہوں۔ + +/// + +### Lifespan function { #lifespan-function } + +سب سے پہلے غور کریں کہ ہم `yield` کے ساتھ ایک async function بیان کر رہے ہیں۔ یہ `yield` والی Dependencies سے بہت ملتا جلتا ہے۔ + +{* ../../docs_src/events/tutorial003_py310.py hl[14:19] *} + +function کا پہلا حصہ، `yield` سے پہلے، ایپلیکیشن شروع ہونے سے **پہلے** عمل میں آئے گا۔ + +اور `yield` کے بعد والا حصہ ایپلیکیشن ختم ہونے کے **بعد** عمل میں آئے گا۔ + +### Async Context Manager { #async-context-manager } + +اگر آپ دیکھیں، تو function کو `@asynccontextmanager` سے decorate کیا گیا ہے۔ + +یہ function کو "**async context manager**" نامی چیز میں تبدیل کرتا ہے۔ + +{* ../../docs_src/events/tutorial003_py310.py hl[1,13] *} + +Python میں **context manager** وہ چیز ہے جسے آپ `with` statement میں استعمال کر سکتے ہیں، مثال کے طور پر، `open()` context manager کے طور پر استعمال ہو سکتا ہے: + +```Python +with open("file.txt") as file: + file.read() +``` + +Python کے حالیہ ورژنز میں، ایک **async context manager** بھی ہے۔ آپ اسے `async with` کے ساتھ استعمال کریں گے: + +```Python +async with lifespan(app): + await do_stuff() +``` + +جب آپ اوپر کی طرح context manager یا async context manager بناتے ہیں، تو یہ `with` بلاک میں داخل ہونے سے پہلے `yield` سے پہلے والا کوڈ عمل میں لائے گا، اور `with` بلاک سے باہر نکلنے کے بعد `yield` کے بعد والا کوڈ عمل میں لائے گا۔ + +ہماری اوپر والی کوڈ مثال میں، ہم اسے براہ راست استعمال نہیں کرتے، بلکہ FastAPI کو استعمال کرنے کے لیے پاس کرتے ہیں۔ + +`FastAPI` ایپ کا `lifespan` parameter ایک **async context manager** لیتا ہے، تو ہم اپنا نیا `lifespan` async context manager اسے پاس کر سکتے ہیں۔ + +{* ../../docs_src/events/tutorial003_py310.py hl[22] *} + +## متبادل Events (deprecated) { #alternative-events-deprecated } + +/// warning | انتباہ + +*startup* اور *shutdown* کو ہینڈل کرنے کا تجویز کردہ طریقہ اوپر بیان کردہ `FastAPI` ایپ کا `lifespan` parameter استعمال کرنا ہے۔ اگر آپ `lifespan` parameter فراہم کریں تو `startup` اور `shutdown` event handlers مزید نہیں بلائے جائیں گے۔ یہ یا تو سب `lifespan` ہے یا سب events، دونوں نہیں۔ + +آپ شاید اس حصے کو چھوڑ سکتے ہیں۔ + +/// + +*startup* اور *shutdown* کے دوران عمل میں آنے والی منطق بیان کرنے کا ایک متبادل طریقہ ہے۔ + +آپ ایسے event handler functions بیان کر سکتے ہیں جو ایپلیکیشن شروع ہونے سے پہلے، یا بند ہوتے وقت عمل میں آنے چاہییں۔ + +یہ functions `async def` یا عام `def` کے ساتھ بیان کیے جا سکتے ہیں۔ + +### `startup` event { #startup-event } + +ایسا function شامل کرنے کے لیے جو ایپلیکیشن شروع ہونے سے پہلے چلے، اسے `"startup"` event کے ساتھ بیان کریں: + +{* ../../docs_src/events/tutorial001_py310.py hl[8] *} + +اس صورت میں، `startup` event handler function آئٹمز کے "database" (صرف ایک `dict`) کو کچھ اقدار سے شروع کرے گا۔ + +آپ ایک سے زیادہ event handler functions شامل کر سکتے ہیں۔ + +اور آپ کی ایپلیکیشن تب تک requests وصول کرنا شروع نہیں کرے گی جب تک تمام `startup` event handlers مکمل نہیں ہو جاتے۔ + +### `shutdown` event { #shutdown-event } + +ایسا function شامل کرنے کے لیے جو ایپلیکیشن بند ہوتے وقت چلے، اسے `"shutdown"` event کے ساتھ بیان کریں: + +{* ../../docs_src/events/tutorial002_py310.py hl[6] *} + +یہاں، `shutdown` event handler function `log.txt` فائل میں ایک ٹیکسٹ لائن `"Application shutdown"` لکھے گا۔ + +/// info | معلومات + +`open()` function میں، `mode="a"` کا مطلب "append" ہے، تو لائن فائل میں پہلے سے موجود مواد کو مٹائے بغیر آخر میں شامل ہوگی۔ + +/// + +/// tip | مشورہ + +غور کریں کہ اس صورت میں ہم معیاری Python `open()` function استعمال کر رہے ہیں جو فائل کے ساتھ بات چیت کرتا ہے۔ + +تو، اس میں I/O (input/output) شامل ہے، جس کے لیے ڈسک پر لکھے جانے کا "انتظار" کرنا ہوتا ہے۔ + +لیکن `open()` `async` اور `await` استعمال نہیں کرتا۔ + +تو، ہم event handler function کو `async def` کی بجائے معیاری `def` کے ساتھ بیان کرتے ہیں۔ + +/// + +### `startup` اور `shutdown` ایک ساتھ { #startup-and-shutdown-together } + +بہت زیادہ امکان ہے کہ آپ کی *startup* اور *shutdown* منطق آپس میں جڑی ہوئی ہے، آپ شاید کچھ شروع کرنا اور پھر ختم کرنا چاہیں، کوئی وسیلہ حاصل کرنا اور پھر آزاد کرنا چاہیں وغیرہ۔ + +یہ الگ functions میں کرنا جو منطق یا متغیرات شیئر نہیں کرتے، زیادہ مشکل ہے کیونکہ آپ کو اقدار global variables یا اسی طرح کی تدبیروں میں محفوظ کرنی ہوں گی۔ + +اسی لیے، اب تجویز یہ ہے کہ اوپر بیان کردہ `lifespan` استعمال کریں۔ + +## تکنیکی تفصیلات { #technical-details } + +متجسس لوگوں کے لیے صرف ایک تکنیکی تفصیل۔ + +اندرونی طور پر، ASGI تکنیکی specification میں، یہ [Lifespan Protocol](https://asgi.readthedocs.io/en/latest/specs/lifespan.html) کا حصہ ہے، اور یہ `startup` اور `shutdown` نامی events بیان کرتا ہے۔ + +/// info | معلومات + +آپ Starlette کے `lifespan` handlers کے بارے میں مزید [Starlette کی Lifespan دستاویزات](https://www.starlette.dev/lifespan/) میں پڑھ سکتے ہیں۔ + +بشمول یہ کہ lifespan state کو کیسے ہینڈل کریں جو آپ کے کوڈ کے دوسرے حصوں میں استعمال ہو سکتا ہے۔ + +/// + +## Sub Applications { #sub-applications } + +یاد رکھیں کہ یہ lifespan events (startup اور shutdown) صرف مرکزی ایپلیکیشن کے لیے عمل میں آئیں گے، [Sub Applications - Mounts](sub-applications.md) کے لیے نہیں۔ diff --git a/docs/ur/docs/advanced/generate-clients.md b/docs/ur/docs/advanced/generate-clients.md new file mode 100644 index 000000000..3a301aef8 --- /dev/null +++ b/docs/ur/docs/advanced/generate-clients.md @@ -0,0 +1,208 @@ +# SDKs بنانا { #generating-sdks } + +چونکہ **FastAPI** **OpenAPI** specification پر مبنی ہے، اس کے APIs کو ایک معیاری فارمیٹ میں بیان کیا جا سکتا ہے جسے بہت سے ٹولز سمجھتے ہیں۔ + +اس سے تازہ ترین **دستاویزات**، متعدد زبانوں میں client لائبریریاں (**SDKs**)، اور **testing** یا **automation workflows** بنانا آسان ہو جاتا ہے جو آپ کے کوڈ کے ساتھ ہم آہنگ رہتے ہیں۔ + +اس گائیڈ میں، آپ سیکھیں گے کہ اپنے FastAPI backend کے لیے **TypeScript SDK** کیسے بنائیں۔ + +## اوپن سورس SDK Generators { #open-source-sdk-generators } + +ایک ورسٹائل آپشن [OpenAPI Generator](https://openapi-generator.tech/) ہے، جو **بہت سی پروگرامنگ زبانوں** کو سپورٹ کرتا ہے اور آپ کی OpenAPI specification سے SDKs بنا سکتا ہے۔ + +**TypeScript clients** کے لیے، [Hey API](https://heyapi.dev/) ایک مقصد کے لیے بنایا گیا حل ہے، جو TypeScript ایکو سسٹم کے لیے بہترین تجربہ فراہم کرتا ہے۔ + +آپ [OpenAPI.Tools](https://openapi.tools/#sdk) پر مزید SDK generators دریافت کر سکتے ہیں۔ + +/// tip | مشورہ + +FastAPI خود بخود **OpenAPI 3.1** specifications بناتا ہے، لہذا آپ جو بھی ٹول استعمال کریں اسے اس ورژن کو سپورٹ کرنا ضروری ہے۔ + +/// + +## FastAPI کے اسپانسرز سے SDK Generators { #sdk-generators-from-fastapi-sponsors } + +یہ سیکشن FastAPI کے اسپانسر کمپنیوں کے **وینچر بیکڈ** اور **کمپنی سپورٹ یافتہ** حل نمایاں کرتا ہے۔ یہ پروڈکٹس اعلیٰ معیار کی بنائی گئی SDKs کے ساتھ **اضافی خصوصیات** اور **integrations** فراہم کرتے ہیں۔ + +**FastAPI** کو ✨ [**اسپانسر**](../help-fastapi.md#sponsor-the-author) ✨ کرکے، یہ کمپنیاں framework اور اس کے **ایکو سسٹم** کو صحت مند اور **پائیدار** رکھنے میں مدد کرتی ہیں۔ + +ان کی اسپانسرشپ FastAPI **کمیونٹی** (آپ) کے ساتھ مضبوط وابستگی بھی ظاہر کرتی ہے، یہ دکھاتے ہوئے کہ وہ نہ صرف **بہترین سروس** فراہم کرنے بلکہ ایک **مضبوط اور ترقی پذیر framework**، FastAPI، کو سپورٹ کرنے میں بھی دلچسپی رکھتے ہیں۔ + +مثال کے طور پر، آپ آزما سکتے ہیں: + +* [Speakeasy](https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship) +* [Stainless](https://www.stainless.com/?utm_source=fastapi&utm_medium=referral) +* [liblab](https://developers.liblab.com/tutorials/sdk-for-fastapi?utm_source=fastapi) + +ان میں سے کچھ حل اوپن سورس بھی ہو سکتے ہیں یا مفت درجے پیش کر سکتے ہیں، تو آپ انہیں بغیر مالی وابستگی کے آزما سکتے ہیں۔ دیگر تجارتی SDK generators بھی دستیاب ہیں اور آن لائن مل سکتے ہیں۔ + +## TypeScript SDK بنائیں { #create-a-typescript-sdk } + +آئیے ایک سادہ FastAPI ایپلیکیشن سے شروع کریں: + +{* ../../docs_src/generate_clients/tutorial001_py310.py hl[7:9,12:13,16:17,21] *} + +غور کریں کہ *path operations* اپنے استعمال شدہ models کو request payload اور response payload کے لیے بیان کرتے ہیں، `Item` اور `ResponseMessage` models استعمال کرتے ہوئے۔ + +### API Docs { #api-docs } + +اگر آپ `/docs` پر جائیں تو آپ دیکھیں گے کہ اس میں requests میں بھیجے جانے والے اور responses میں وصول ہونے والے ڈیٹا کے **schemas** موجود ہیں: + + + +آپ وہ schemas اس لیے دیکھ سکتے ہیں کیونکہ وہ ایپ میں models کے ساتھ بیان کیے گئے تھے۔ + +وہ معلومات ایپ کے **OpenAPI schema** میں دستیاب ہیں، اور پھر API docs میں دکھائی جاتی ہیں۔ + +OpenAPI میں شامل models کی وہی معلومات **client کوڈ بنانے** کے لیے استعمال ہو سکتی ہیں۔ + +### Hey API { #hey-api } + +جب ہمارے پاس models والی FastAPI ایپ ہو تو ہم TypeScript client بنانے کے لیے Hey API استعمال کر سکتے ہیں۔ اس کا سب سے تیز طریقہ npx کے ذریعے ہے۔ + +```sh +npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client +``` + +یہ `./src/client` میں TypeScript SDK بنائے گا۔ + +آپ [`@hey-api/openapi-ts` انسٹال کرنے](https://heyapi.dev/openapi-ts/get-started) اور [بنائے گئے output](https://heyapi.dev/openapi-ts/output) کے بارے میں ان کی ویب سائٹ پر پڑھ سکتے ہیں۔ + +### SDK استعمال کرنا { #using-the-sdk } + +اب آپ client کوڈ import اور استعمال کر سکتے ہیں۔ یہ کچھ اس طرح نظر آ سکتا ہے، غور کریں کہ آپ کو methods کے لیے autocompletion ملتا ہے: + + + +آپ کو بھیجے جانے والے payload کے لیے بھی autocompletion ملے گا: + + + +/// tip | مشورہ + +`name` اور `price` کے لیے autocompletion غور کریں، جو FastAPI ایپلیکیشن میں `Item` model میں بیان کیے گئے تھے۔ + +/// + +آپ کو بھیجے جانے والے ڈیٹا کے لیے inline errors بھی ملیں گے: + + + +response آبجیکٹ میں بھی autocompletion ہوگا: + + + +## Tags کے ساتھ FastAPI ایپ { #fastapi-app-with-tags } + +بہت سے معاملات میں، آپ کی FastAPI ایپ بڑی ہوگی، اور آپ شاید *path operations* کے مختلف گروپس الگ کرنے کے لیے tags استعمال کریں گے۔ + +مثال کے طور پر، آپ کے پاس **items** کا سیکشن اور **users** کا الگ سیکشن ہو سکتا ہے، اور وہ tags سے الگ ہو سکتے ہیں: + +{* ../../docs_src/generate_clients/tutorial002_py310.py hl[21,26,34] *} + +### Tags کے ساتھ TypeScript Client بنائیں { #generate-a-typescript-client-with-tags } + +اگر آپ tags استعمال کرنے والی FastAPI ایپ کے لیے client بنائیں، تو یہ عام طور پر tags کی بنیاد پر client کوڈ کو الگ بھی کرے گا۔ + +اس طریقے سے، آپ کو client کوڈ میں چیزیں درست ترتیب اور گروپنگ میں ملیں گی: + + + +اس صورت میں، آپ کے پاس ہیں: + +* `ItemsService` +* `UsersService` + +### Client Method کے نام { #client-method-names } + +اس وقت، بنائے گئے method کے نام جیسے `createItemItemsPost` بہت صاف نہیں لگتے: + +```TypeScript +ItemsService.createItemItemsPost({name: "Plumbus", price: 5}) +``` + +...اس کی وجہ یہ ہے کہ client generator ہر *path operation* کے لیے OpenAPI کا اندرونی **operation ID** استعمال کرتا ہے۔ + +OpenAPI تقاضا کرتا ہے کہ ہر operation ID تمام *path operations* میں منفرد ہو، اس لیے FastAPI اس operation ID کو بنانے کے لیے **function کا نام**، **path**، اور **HTTP method/operation** استعمال کرتا ہے، کیونکہ اس طرح یہ یقینی بنا سکتا ہے کہ operation IDs منفرد ہیں۔ + +لیکن میں آپ کو اگلے حصے میں دکھاؤں گا کہ اسے کیسے بہتر بنائیں۔ + +## حسب ضرورت Operation IDs اور بہتر Method نام { #custom-operation-ids-and-better-method-names } + +آپ ان operation IDs کی **بنانے کے طریقے کو تبدیل** کر سکتے ہیں تاکہ وہ آسان ہوں اور clients میں **آسان method نام** ہوں۔ + +اس صورت میں، آپ کو یقینی بنانا ہوگا کہ ہر operation ID کسی اور طریقے سے **منفرد** ہو۔ + +مثال کے طور پر، آپ یقینی بنا سکتے ہیں کہ ہر *path operation* میں ایک tag ہو، اور پھر **tag** اور *path operation* کے **نام** (function نام) کی بنیاد پر operation ID بنائیں۔ + +### حسب ضرورت Unique ID Function بنائیں { #custom-generate-unique-id-function } + +FastAPI ہر *path operation* کے لیے ایک **unique ID** استعمال کرتا ہے، جو **operation ID** کے لیے اور requests یا responses کے لیے کسی ضروری حسب ضرورت models کے ناموں کے لیے بھی استعمال ہوتا ہے۔ + +آپ اس function کو حسب ضرورت بنا سکتے ہیں۔ یہ ایک `APIRoute` لیتا ہے اور string واپس کرتا ہے۔ + +مثال کے طور پر، یہاں یہ پہلا tag (آپ کے پاس شاید صرف ایک tag ہوگا) اور *path operation* کا نام (function نام) استعمال کر رہا ہے۔ + +پھر آپ اس حسب ضرورت function کو **FastAPI** کو `generate_unique_id_function` parameter کے طور پر پاس کر سکتے ہیں: + +{* ../../docs_src/generate_clients/tutorial003_py310.py hl[6:7,10] *} + +### حسب ضرورت Operation IDs کے ساتھ TypeScript Client بنائیں { #generate-a-typescript-client-with-custom-operation-ids } + +اب، اگر آپ دوبارہ client بنائیں تو آپ دیکھیں گے کہ اس میں بہتر method نام ہیں: + + + +جیسا کہ آپ دیکھ سکتے ہیں، method ناموں میں اب tag اور پھر function نام ہے، اب ان میں URL path اور HTTP operation کی معلومات شامل نہیں ہیں۔ + +### Client Generator کے لیے OpenAPI Specification پری پروسیس کریں { #preprocess-the-openapi-specification-for-the-client-generator } + +بنائے گئے کوڈ میں ابھی بھی کچھ **دہرائی ہوئی معلومات** ہیں۔ + +ہم پہلے ہی جانتے ہیں کہ یہ method **items** سے متعلق ہے کیونکہ وہ لفظ `ItemsService` (tag سے لیا گیا) میں ہے، لیکن method نام میں بھی tag نام prefix ہے۔ + +ہم شاید اسے عام طور پر OpenAPI کے لیے رکھنا چاہیں گے، کیونکہ یہ یقینی بنائے گا کہ operation IDs **منفرد** ہیں۔ + +لیکن بنائے گئے client کے لیے، ہم clients بنانے سے بالکل پہلے OpenAPI operation IDs **تبدیل** کر سکتے ہیں، تاکہ وہ method نام بہتر اور **صاف** ہوں۔ + +ہم OpenAPI JSON کو `openapi.json` فائل میں ڈاؤن لوڈ کر سکتے ہیں اور پھر اس script سے **وہ prefix tag ہٹا** سکتے ہیں: + +{* ../../docs_src/generate_clients/tutorial004_py310.py *} + +//// tab | Node.js + +```Javascript +{!> ../../docs_src/generate_clients/tutorial004.js!} +``` + +//// + +اس سے، operation IDs `items-get_items` جیسی چیزوں سے صرف `get_items` میں تبدیل ہو جائیں گے، اس طریقے سے client generator آسان method نام بنا سکتا ہے۔ + +### پری پروسیس شدہ OpenAPI کے ساتھ TypeScript Client بنائیں { #generate-a-typescript-client-with-the-preprocessed-openapi } + +چونکہ آخری نتیجہ اب `openapi.json` فائل میں ہے، آپ کو اپنی input location اپ ڈیٹ کرنی ہوگی: + +```sh +npx @hey-api/openapi-ts -i ./openapi.json -o src/client +``` + +نیا client بنانے کے بعد، آپ کے پاس اب **صاف method نام** ہوں گے، تمام **autocompletion**، **inline errors** وغیرہ کے ساتھ: + + + +## فوائد { #benefits } + +خود بخود بنائے گئے clients استعمال کرتے وقت آپ کو **autocompletion** ملے گا: + +* Methods کے لیے۔ +* Body میں Request payloads، query parameters وغیرہ کے لیے۔ +* Response payloads کے لیے۔ + +آپ کو ہر چیز کے لیے **inline errors** بھی ملیں گے۔ + +اور جب بھی آپ backend کوڈ اپ ڈیٹ کریں، اور frontend **دوبارہ بنائیں**، اس میں تمام نئی *path operations* methods کے طور پر دستیاب ہوں گی، پرانی ہٹ جائیں گی، اور کوئی بھی تبدیلی بنائے گئے کوڈ میں ظاہر ہوگی۔ + +اس کا مطلب یہ بھی ہے کہ اگر کچھ بدلا تو یہ خود بخود client کوڈ میں **ظاہر** ہوگا۔ اور اگر آپ client **بلڈ** کریں تو اگر استعمال شدہ ڈیٹا میں کوئی **مماثلت نہ ہو** تو غلطی آئے گی۔ + +تو، آپ ترقیاتی عمل میں بہت جلد **بہت سی غلطیاں پکڑ** لیں گے بجائے اس کے کہ غلطیاں پروڈکشن میں آپ کے آخری صارفین کو نظر آئیں اور پھر آپ مسئلے کی تشخیص کرنے کی کوشش کریں۔ diff --git a/docs/ur/docs/advanced/index.md b/docs/ur/docs/advanced/index.md new file mode 100644 index 000000000..da83935d3 --- /dev/null +++ b/docs/ur/docs/advanced/index.md @@ -0,0 +1,21 @@ +# ایڈوانسڈ صارف گائیڈ { #advanced-user-guide } + +## اضافی خصوصیات { #additional-features } + +بنیادی [ٹیوٹوریل - صارف گائیڈ](../tutorial/index.md) آپ کو **FastAPI** کی تمام اہم خصوصیات کا مکمل جائزہ دینے کے لیے کافی ہونا چاہیے۔ + +آنے والے حصوں میں آپ مزید اختیارات، ترتیبات اور اضافی خصوصیات دیکھیں گے۔ + +/// tip | مشورہ + +آنے والے حصے **ضروری نہیں کہ "ایڈوانسڈ" ہوں**۔ + +اور یہ ممکن ہے کہ آپ کے استعمال کے لیے حل انہیں میں سے کسی ایک میں ہو۔ + +/// + +## پہلے ٹیوٹوریل پڑھیں { #read-the-tutorial-first } + +آپ بنیادی [ٹیوٹوریل - صارف گائیڈ](../tutorial/index.md) کے علم سے **FastAPI** کی زیادہ تر خصوصیات استعمال کر سکتے ہیں۔ + +اور آنے والے حصے فرض کرتے ہیں کہ آپ نے اسے پہلے ہی پڑھ لیا ہے، اور یہ فرض کرتے ہیں کہ آپ ان بنیادی تصورات سے واقف ہیں۔ diff --git a/docs/ur/docs/advanced/json-base64-bytes.md b/docs/ur/docs/advanced/json-base64-bytes.md new file mode 100644 index 000000000..7ab76e174 --- /dev/null +++ b/docs/ur/docs/advanced/json-base64-bytes.md @@ -0,0 +1,63 @@ +# Base64 کے طور پر Bytes کے ساتھ JSON { #json-with-bytes-as-base64 } + +اگر آپ کی ایپ کو JSON ڈیٹا وصول اور بھیجنا ہے، لیکن اس میں binary ڈیٹا بھی شامل کرنا ہے، تو آپ اسے base64 کے طور پر encode کر سکتے ہیں۔ + +## Base64 بمقابلہ فائلیں { #base64-vs-files } + +پہلے غور کریں کہ کیا آپ binary ڈیٹا اپ لوڈ کرنے کے لیے [Request Files](../tutorial/request-files.md) اور binary ڈیٹا بھیجنے کے لیے [Custom Response - FileResponse](./custom-response.md#fileresponse--fileresponse-) استعمال کر سکتے ہیں، JSON میں encode کرنے کی بجائے۔ + +JSON صرف UTF-8 encoded strings رکھ سکتا ہے، اس لیے اس میں خام bytes نہیں ہو سکتے۔ + +Base64 binary ڈیٹا کو strings میں encode کر سکتا ہے، لیکن ایسا کرنے کے لیے اسے اصل binary ڈیٹا سے زیادہ characters استعمال کرنے ہوتے ہیں، اس لیے یہ عام طور پر عام فائلوں سے کم موثر ہوتا ہے۔ + +Base64 صرف اسی وقت استعمال کریں جب آپ کو یقینی طور پر JSON میں binary ڈیٹا شامل کرنا ہو، اور آپ اس کے لیے فائلیں استعمال نہیں کر سکتے۔ + +## Pydantic `bytes` { #pydantic-bytes } + +آپ `bytes` fields کے ساتھ Pydantic model بیان کر سکتے ہیں، اور پھر model config میں `val_json_bytes` استعمال کر کے بتا سکتے ہیں کہ input JSON ڈیٹا کو *validate* کرنے کے لیے base64 استعمال کرے، اس validation کے حصے کے طور پر یہ base64 string کو bytes میں decode کرے گا۔ + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *} + +اگر آپ `/docs` چیک کریں، تو وہ دکھائیں گے کہ `data` field base64 encoded bytes کی توقع رکھتا ہے: + +
+ +
+ +آپ اس طرح request بھیج سکتے ہیں: + +```json +{ + "description": "Some data", + "data": "aGVsbG8=" +} +``` + +/// tip | مشورہ + +`aGVsbG8=` `hello` کی base64 encoding ہے۔ + +/// + +اور پھر Pydantic base64 string decode کرے گا اور آپ کو model کے `data` field میں اصل bytes دے گا۔ + +آپ کو اس طرح response ملے گا: + +```json +{ + "description": "Some data", + "content": "hello" +} +``` + +## آؤٹ پٹ ڈیٹا کے لیے Pydantic `bytes` { #pydantic-bytes-for-output-data } + +آپ آؤٹ پٹ ڈیٹا کے لیے بھی model config میں `ser_json_bytes` کے ساتھ `bytes` fields استعمال کر سکتے ہیں، اور JSON response بناتے وقت Pydantic bytes کو base64 کے طور پر *serialize* کرے گا۔ + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *} + +## ان پٹ اور آؤٹ پٹ ڈیٹا دونوں کے لیے Pydantic `bytes` { #pydantic-bytes-for-input-and-output-data } + +اور یقیناً، آپ JSON ڈیٹا وصول اور بھیجتے وقت `val_json_bytes` سے input (*validate*) اور `ser_json_bytes` سے output (*serialize*) دونوں ہینڈل کرنے کے لیے base64 استعمال کرنے کے لیے ترتیب شدہ وہی model استعمال کر سکتے ہیں۔ + +{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *} diff --git a/docs/ur/docs/advanced/middleware.md b/docs/ur/docs/advanced/middleware.md new file mode 100644 index 000000000..20916b0e9 --- /dev/null +++ b/docs/ur/docs/advanced/middleware.md @@ -0,0 +1,97 @@ +# ایڈوانسڈ Middleware { #advanced-middleware } + +بنیادی ٹیوٹوریل میں آپ نے پڑھا کہ اپنی ایپلیکیشن میں [اپنی مرضی کا Middleware](../tutorial/middleware.md) کیسے شامل کریں۔ + +اور پھر آپ نے یہ بھی پڑھا کہ [`CORSMiddleware`](../tutorial/cors.md) سے CORS کو کیسے ہینڈل کریں۔ + +اس سیکشن میں ہم دیکھیں گے کہ دوسرے middleware کیسے استعمال کریں۔ + +## ASGI middleware شامل کرنا { #adding-asgi-middlewares } + +چونکہ **FastAPI** Starlette پر مبنی ہے اور ASGI specification کو لاگو کرتا ہے، آپ کوئی بھی ASGI middleware استعمال کر سکتے ہیں۔ + +middleware کا FastAPI یا Starlette کے لیے مخصوص ہونا ضروری نہیں ہے، بس یہ ASGI spec کی پیروی کرے۔ + +عام طور پر، ASGI middleware ایسی classes ہوتی ہیں جو پہلے argument کے طور پر ASGI app وصول کرتی ہیں۔ + +تو، third-party ASGI middleware کی دستاویزات میں وہ شاید آپ کو کچھ اس طرح کرنے کا کہیں گے: + +```Python +from unicorn import UnicornMiddleware + +app = SomeASGIApp() + +new_app = UnicornMiddleware(app, some_config="rainbow") +``` + +لیکن FastAPI (دراصل Starlette) ایسا کرنے کا ایک آسان طریقہ فراہم کرتا ہے جو یقینی بناتا ہے کہ اندرونی middleware server errors اور حسب ضرورت exception handlers کو صحیح طریقے سے ہینڈل کریں۔ + +اس کے لیے، آپ `app.add_middleware()` استعمال کریں (جیسا کہ CORS کی مثال میں)۔ + +```Python +from fastapi import FastAPI +from unicorn import UnicornMiddleware + +app = FastAPI() + +app.add_middleware(UnicornMiddleware, some_config="rainbow") +``` + +`app.add_middleware()` پہلے argument کے طور پر middleware class وصول کرتا ہے اور باقی اضافی arguments middleware کو پاس کر دیے جاتے ہیں۔ + +## شامل middleware { #integrated-middlewares } + +**FastAPI** عام استعمال کے لیے کئی middleware شامل کرتا ہے، آگے ہم دیکھیں گے کہ انہیں کیسے استعمال کریں۔ + +/// note | تکنیکی تفصیلات + +اگلی مثالوں کے لیے، آپ `from starlette.middleware.something import SomethingMiddleware` بھی استعمال کر سکتے ہیں۔ + +**FastAPI** آپ کی سہولت کے لیے `fastapi.middleware` میں کئی middleware فراہم کرتا ہے۔ لیکن زیادہ تر دستیاب middleware براہ راست Starlette سے آتے ہیں۔ + +/// + +## `HTTPSRedirectMiddleware` { #httpsredirectmiddleware } + +یہ لازم کرتا ہے کہ تمام آنے والی requests `https` یا `wss` ہوں۔ + +`http` یا `ws` پر آنے والی کسی بھی request کو محفوظ scheme کی طرف redirect کر دیا جائے گا۔ + +{* ../../docs_src/advanced_middleware/tutorial001_py310.py hl[2,6] *} + +## `TrustedHostMiddleware` { #trustedhostmiddleware } + +یہ لازم کرتا ہے کہ تمام آنے والی requests میں `Host` header درست طریقے سے سیٹ ہو، تاکہ HTTP Host Header حملوں سے بچا جا سکے۔ + +{* ../../docs_src/advanced_middleware/tutorial002_py310.py hl[2,6:8] *} + +درج ذیل arguments سپورٹ ہوتے ہیں: + +* `allowed_hosts` - ان domain ناموں کی فہرست جنہیں hostname کے طور پر اجازت ہونی چاہیے۔ Wildcard domains جیسے `*.example.com` subdomains کی matching کے لیے سپورٹ ہوتے ہیں۔ کسی بھی hostname کو اجازت دینے کے لیے `allowed_hosts=["*"]` استعمال کریں یا middleware کو چھوڑ دیں۔ +* `www_redirect` - اگر True پر سیٹ ہو تو، اجازت یافتہ hosts کے غیر www ورژنز کی requests ان کے www ہم منصبوں کی طرف redirect ہو جائیں گی۔ بطور ڈیفالٹ `True` ہے۔ + +اگر آنے والی request درست طریقے سے validate نہیں ہوتی تو `400` response بھیجا جائے گا۔ + +## `GZipMiddleware` { #gzipmiddleware } + +GZip responses کو ہینڈل کرتا ہے ہر اس request کے لیے جس کے `Accept-Encoding` header میں `"gzip"` شامل ہو۔ + +یہ middleware معیاری اور streaming دونوں قسم کے responses کو ہینڈل کرے گا۔ + +{* ../../docs_src/advanced_middleware/tutorial003_py310.py hl[2,6] *} + +درج ذیل arguments سپورٹ ہوتے ہیں: + +* `minimum_size` - اس کم از کم سائز (bytes میں) سے چھوٹے responses کو GZip نہ کریں۔ بطور ڈیفالٹ `500` ہے۔ +* `compresslevel` - GZip compression کے دوران استعمال ہوتا ہے۔ یہ 1 سے 9 تک کا integer ہے۔ بطور ڈیفالٹ `9` ہے۔ کم قدر تیز compression لیکن بڑے فائل سائز کا نتیجہ ہے، جبکہ زیادہ قدر سست compression لیکن چھوٹے فائل سائز کا نتیجہ ہے۔ + +## دوسرے middleware { #other-middlewares } + +بہت سے دوسرے ASGI middleware موجود ہیں۔ + +مثال کے طور پر: + +* [Uvicorn کا `ProxyHeadersMiddleware`](https://github.com/encode/uvicorn/blob/master/uvicorn/middleware/proxy_headers.py) +* [MessagePack](https://github.com/florimondmanca/msgpack-asgi) + +دوسرے دستیاب middleware دیکھنے کے لیے [Starlette کی Middleware دستاویزات](https://www.starlette.dev/middleware/) اور [ASGI Awesome List](https://github.com/florimondmanca/awesome-asgi) دیکھیں۔ diff --git a/docs/ur/docs/advanced/openapi-callbacks.md b/docs/ur/docs/advanced/openapi-callbacks.md new file mode 100644 index 000000000..b765cee5b --- /dev/null +++ b/docs/ur/docs/advanced/openapi-callbacks.md @@ -0,0 +1,186 @@ +# OpenAPI Callbacks { #openapi-callbacks } + +آپ ایک ایسا API بنا سکتے ہیں جس میں *path operation* کسی *بیرونی API* کو request بھیجنے کا عمل شروع کرے جو کسی اور نے بنایا ہو (شاید وہی ڈویلپر جو آپ کا API *استعمال* کر رہا ہو)۔ + +جب آپ کا API ایپ *بیرونی API* کو کال کرتا ہے تو اس عمل کو "callback" کہتے ہیں۔ کیونکہ بیرونی ڈویلپر کا سافٹ ویئر آپ کے API کو request بھیجتا ہے اور پھر آپ کا API *واپس کال کرتا ہے*، *بیرونی API* کو request بھیج کر (جو شاید اسی ڈویلپر نے بنایا ہو)۔ + +اس صورت میں، آپ یہ دستاویز کرنا چاہیں گے کہ وہ بیرونی API *کیسا* ہونا چاہیے۔ اس کی *path operation* کیا ہونی چاہیے، اسے کیا body توقع کرنا چاہیے، کیا response واپس کرنا چاہیے، وغیرہ۔ + +## Callbacks والی ایپ { #an-app-with-callbacks } + +آئیے یہ سب ایک مثال سے دیکھتے ہیں۔ + +فرض کریں آپ ایک ایسی ایپ بناتے ہیں جو invoices بنانے کی اجازت دیتی ہے۔ + +ان invoices میں `id`، `title` (اختیاری)، `customer`، اور `total` ہوگا۔ + +آپ کے API کا صارف (بیرونی ڈویلپر) آپ کے API میں POST request کے ساتھ invoice بنائے گا۔ + +پھر آپ کا API (فرض کریں): + +* بیرونی ڈویلپر کے کسی کسٹمر کو invoice بھیجے گا۔ +* رقم وصول کرے گا۔ +* API صارف (بیرونی ڈویلپر) کو واپس اطلاع بھیجے گا۔ + * یہ (*آپ کے API* سے) بیرونی ڈویلپر کی فراہم کردہ *بیرونی API* کو POST request بھیج کر کیا جائے گا (یہ "callback" ہے)۔ + +## عام **FastAPI** ایپ { #the-normal-fastapi-app } + +آئیے پہلے دیکھیں کہ callback شامل کرنے سے پہلے عام API ایپ کیسی ہوگی۔ + +اس میں ایک *path operation* ہوگی جو `Invoice` body وصول کرے گی، اور ایک query parameter `callback_url` جس میں callback کا URL ہوگا۔ + +یہ حصہ کافی عام ہے، زیادہ تر کوڈ شاید آپ کو پہلے سے مانوس ہوگا: + +{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[7:11,34:51] *} + +/// tip | مشورہ + +`callback_url` query parameter Pydantic [Url](https://docs.pydantic.dev/latest/api/networks/) قسم استعمال کرتا ہے۔ + +/// + +واحد نئی چیز `callbacks=invoices_callback_router.routes` ہے بطور *path operation decorator* کے argument۔ ہم اگلے حصے میں دیکھیں گے کہ یہ کیا ہے۔ + +## Callback کی دستاویزات { #documenting-the-callback } + +اصل callback کوڈ آپ کی اپنی API ایپ پر بہت زیادہ منحصر ہوگا۔ + +اور یہ شاید ایک ایپ سے دوسری تک بہت مختلف ہوگا۔ + +یہ صرف ایک یا دو لائنیں کوڈ ہو سکتی ہیں، جیسے: + +```Python +callback_url = "https://example.com/api/v1/invoices/events/" +httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) +``` + +لیکن شاید callback کا سب سے اہم حصہ یہ یقینی بنانا ہے کہ آپ کے API صارف (بیرونی ڈویلپر) *بیرونی API* کو درست طریقے سے بنائیں، اس ڈیٹا کے مطابق جو *آپ کا API* callback کی request body میں بھیجے گا، وغیرہ۔ + +تو، اگلا ہم وہ کوڈ شامل کریں گے جو دستاویز کرے کہ وہ *بیرونی API* *آپ کے API* سے callback وصول کرنے کے لیے کیسی ہونی چاہیے۔ + +وہ دستاویزات آپ کے API میں `/docs` پر Swagger UI میں نظر آئیں گی، اور بیرونی ڈویلپرز کو بتائیں گی کہ *بیرونی API* کیسے بنائیں۔ + +یہ مثال خود callback لاگو نہیں کرتی (وہ صرف کوڈ کی ایک لائن ہو سکتا ہے)، صرف دستاویزات والا حصہ۔ + +/// tip | مشورہ + +اصل callback صرف ایک HTTP request ہے۔ + +خود callback لاگو کرتے وقت، آپ [HTTPX](https://www.python-httpx.org) یا [Requests](https://requests.readthedocs.io/) جیسی کوئی چیز استعمال کر سکتے ہیں۔ + +/// + +## Callback دستاویزات کا کوڈ لکھیں { #write-the-callback-documentation-code } + +یہ کوڈ آپ کی ایپ میں عمل میں نہیں آئے گا، ہمیں اس کی صرف اس *بیرونی API* کی دستاویزات کے لیے ضرورت ہے۔ + +لیکن، آپ پہلے سے جانتے ہیں کہ **FastAPI** کے ساتھ API کے لیے خودکار دستاویزات آسانی سے کیسے بنائیں۔ + +تو ہم اسی علم کو استعمال کرتے ہوئے دستاویز کریں گے کہ *بیرونی API* کیسی ہونی چاہیے... وہ *path operation(s)* بنا کر جو بیرونی API کو لاگو کرنی چاہییں (جنہیں آپ کا API کال کرے گا)۔ + +/// tip | مشورہ + +callback کی دستاویزات کا کوڈ لکھتے وقت، یہ تصور کرنا مفید ہو سکتا ہے کہ آپ وہ *بیرونی ڈویلپر* ہیں۔ اور آپ اس وقت *بیرونی API* لاگو کر رہے ہیں، نہ کہ *آپ کا API*۔ + +عارضی طور پر یہ نقطہ نظر (*بیرونی ڈویلپر* کا) اپنانے سے آپ کو یہ زیادہ واضح محسوس ہو سکتا ہے کہ اس *بیرونی API* کے لیے parameters، Pydantic model body کے لیے، response کے لیے، وغیرہ کہاں رکھیں۔ + +/// + +### Callback `APIRouter` بنائیں { #create-a-callback-apirouter } + +سب سے پہلے ایک نیا `APIRouter` بنائیں جس میں ایک یا زیادہ callbacks ہوں۔ + +{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[1,23] *} + +### Callback *path operation* بنائیں { #create-the-callback-path-operation } + +callback *path operation* بنانے کے لیے اوپر بنایا گیا وہی `APIRouter` استعمال کریں۔ + +یہ عام FastAPI *path operation* جیسا ہی ہونا چاہیے: + +* اس میں شاید body کی بیان ہونی چاہیے جو اسے وصول کرنا ہے، مثلاً `body: InvoiceEvent`۔ +* اور اس میں response کی بیان بھی ہو سکتی ہے جو اسے واپس کرنا چاہیے، مثلاً `response_model=InvoiceEventReceived`۔ + +{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[14:16,19:20,26:30] *} + +عام *path operation* سے 2 اہم فرق ہیں: + +* اس میں کوئی اصل کوڈ ہونے کی ضرورت نہیں، کیونکہ آپ کی ایپ کبھی یہ کوڈ نہیں بلائے گی۔ یہ صرف *بیرونی API* کی دستاویزات کے لیے استعمال ہوتا ہے۔ تو، function میں صرف `pass` ہو سکتا ہے۔ +* *path* میں [OpenAPI 3 expression](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) ہو سکتا ہے (نیچے مزید دیکھیں) جہاں یہ *آپ کے API* کو بھیجی گئی اصل request کے parameters اور حصوں سے variables استعمال کر سکتا ہے۔ + +### Callback path expression { #the-callback-path-expression } + +callback *path* میں [OpenAPI 3 expression](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) ہو سکتا ہے جس میں *آپ کے API* کو بھیجی گئی اصل request کے حصے شامل ہوں۔ + +اس صورت میں، یہ `str` ہے: + +```Python +"{$callback_url}/invoices/{$request.body.id}" +``` + +تو، اگر آپ کے API کا صارف (بیرونی ڈویلپر) *آپ کے API* کو اس پر request بھیجے: + +``` +https://yourapi.com/invoices/?callback_url=https://www.external.org/events +``` + +JSON body کے ساتھ: + +```JSON +{ + "id": "2expen51ve", + "customer": "Mr. Richie Rich", + "total": "9999" +} +``` + +تو پھر *آپ کا API* invoice پروسیس کرے گا، اور کچھ وقت بعد، callback request `callback_url` (وہ *بیرونی API*) کو بھیجے گا: + +``` +https://www.external.org/events/invoices/2expen51ve +``` + +JSON body کے ساتھ جس میں کچھ ایسا ہوگا: + +```JSON +{ + "description": "Payment celebration", + "paid": true +} +``` + +اور یہ اس *بیرونی API* سے JSON body کے ساتھ اس طرح کا response توقع کرے گا: + +```JSON +{ + "ok": true +} +``` + +/// tip | مشورہ + +غور کریں کہ callback URL میں query parameter `callback_url` میں وصول شدہ URL (`https://www.external.org/events`) اور JSON body کے اندر سے invoice `id` (`2expen51ve`) دونوں شامل ہیں۔ + +/// + +### Callback router شامل کریں { #add-the-callback-router } + +اس مقام پر آپ کے پاس اوپر بنائے گئے callback router میں ضروری *callback path operation(s)* موجود ہیں (جو *بیرونی ڈویلپر* کو *بیرونی API* میں لاگو کرنی چاہییں)۔ + +اب *آپ کے API کے path operation decorator* میں `callbacks` parameter استعمال کریں اور اس callback router سے attribute `.routes` (جو دراصل routes/*path operations* کی `list` ہے) پاس کریں: + +{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *} + +/// tip | مشورہ + +غور کریں کہ آپ خود router (`invoices_callback_router`) کو `callback=` میں پاس نہیں کر رہے، بلکہ attribute `.routes`، یعنی `invoices_callback_router.routes` پاس کر رہے ہیں۔ + +/// + +### Docs چیک کریں { #check-the-docs } + +اب آپ اپنی ایپ شروع کر سکتے ہیں اور [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) پر جائیں۔ + +آپ کو اپنے docs میں اپنی *path operation* کے لیے "Callbacks" سیکشن نظر آئے گا جو دکھائے گا کہ *بیرونی API* کیسی ہونی چاہیے: + + diff --git a/docs/ur/docs/advanced/openapi-webhooks.md b/docs/ur/docs/advanced/openapi-webhooks.md new file mode 100644 index 000000000..a09901fad --- /dev/null +++ b/docs/ur/docs/advanced/openapi-webhooks.md @@ -0,0 +1,55 @@ +# OpenAPI Webhooks { #openapi-webhooks } + +ایسی صورتیں ہوتی ہیں جہاں آپ اپنے API **صارفین** کو بتانا چاہتے ہیں کہ آپ کی ایپ *ان کی* ایپ کو (request بھیج کر) کچھ ڈیٹا بھیج سکتی ہے، عام طور پر کسی قسم کے **واقعے** کی **اطلاع** دینے کے لیے۔ + +اس کا مطلب ہے کہ عام عمل کی بجائے جہاں آپ کے صارفین آپ کے API کو requests بھیجتے ہیں، یہاں **آپ کا API** (یا آپ کی ایپ) **ان کے سسٹم** (ان کے API، ان کی ایپ) کو **requests بھیج** سکتا ہے۔ + +اسے عام طور پر **webhook** کہتے ہیں۔ + +## Webhooks کے مراحل { #webhooks-steps } + +عمل عام طور پر یہ ہوتا ہے کہ **آپ بیان کرتے ہیں** اپنے کوڈ میں کہ وہ پیغام کیا ہوگا جو آپ بھیجیں گے، request کی **body**۔ + +آپ کسی طریقے سے یہ بھی بیان کرتے ہیں کہ آپ کی ایپ وہ requests یا events **کن لمحات** پر بھیجے گی۔ + +اور **آپ کے صارفین** کسی طریقے سے (مثلاً کہیں ویب dashboard میں) وہ **URL** بیان کرتے ہیں جہاں آپ کی ایپ کو وہ requests بھیجنی چاہییں۔ + +webhooks کے لیے URLs رجسٹر کرنے کی **منطق** اور requests بھیجنے کا اصل کوڈ آپ پر ہے۔ آپ اسے اپنے **کوڈ** میں جیسے چاہیں لکھتے ہیں۔ + +## **FastAPI** اور OpenAPI کے ساتھ webhooks دستاویز کرنا { #documenting-webhooks-with-fastapi-and-openapi } + +**FastAPI** کے ساتھ، OpenAPI استعمال کرتے ہوئے، آپ ان webhooks کے نام، HTTP operations کی اقسام جو آپ کی ایپ بھیج سکتی ہے (مثلاً `POST`، `PUT` وغیرہ) اور request **bodies** جو آپ کی ایپ بھیجے گی، بیان کر سکتے ہیں۔ + +اس سے آپ کے صارفین کے لیے آپ کی **webhook** requests وصول کرنے کے لیے **اپنے APIs بنانا** بہت آسان ہو سکتا ہے، وہ شاید اپنا API کوڈ خود بخود بنانے کے بھی قابل ہوں۔ + +/// info | معلومات + +Webhooks OpenAPI 3.1.0 اور اس سے اوپر میں دستیاب ہیں، FastAPI `0.99.0` اور اس سے اوپر میں سپورٹ ہوتے ہیں۔ + +/// + +## Webhooks والی ایپ { #an-app-with-webhooks } + +جب آپ **FastAPI** ایپلیکیشن بناتے ہیں، تو ایک `webhooks` attribute ہوتا ہے جسے آپ *webhooks* بیان کرنے کے لیے استعمال کر سکتے ہیں، بالکل اسی طرح جیسے آپ *path operations* بیان کرتے ہیں، مثلاً `@app.webhooks.post()` کے ساتھ۔ + +{* ../../docs_src/openapi_webhooks/tutorial001_py310.py hl[9:12,15:20] *} + +آپ جو webhooks بیان کریں گے وہ **OpenAPI** schema اور خودکار **docs UI** میں نظر آئیں گے۔ + +/// info | معلومات + +`app.webhooks` آبجیکٹ دراصل ایک `APIRouter` ہے، وہی قسم جو آپ اپنی ایپ کو متعدد فائلوں سے ترتیب دیتے وقت استعمال کرتے ہیں۔ + +/// + +غور کریں کہ webhooks کے ساتھ آپ دراصل *path* (جیسے `/items/`) بیان نہیں کر رہے، وہاں جو ٹیکسٹ آپ پاس کرتے ہیں وہ صرف webhook کا **شناختی نام** (event کا نام) ہے، مثلاً `@app.webhooks.post("new-subscription")` میں، webhook کا نام `new-subscription` ہے۔ + +اس کی وجہ یہ ہے کہ یہ توقع کی جاتی ہے کہ **آپ کے صارفین** اصل **URL path** کسی اور طریقے سے بیان کریں گے جہاں وہ webhook request وصول کرنا چاہتے ہیں (مثلاً ویب dashboard)۔ + +### Docs چیک کریں { #check-the-docs } + +اب آپ اپنی ایپ شروع کر سکتے ہیں اور [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) پر جائیں۔ + +آپ دیکھیں گے کہ آپ کے docs میں عام *path operations* اور کچھ **webhooks** بھی ہیں: + + diff --git a/docs/ur/docs/advanced/path-operation-advanced-configuration.md b/docs/ur/docs/advanced/path-operation-advanced-configuration.md new file mode 100644 index 000000000..d505acff8 --- /dev/null +++ b/docs/ur/docs/advanced/path-operation-advanced-configuration.md @@ -0,0 +1,172 @@ +# Path Operation ایڈوانسڈ ترتیب { #path-operation-advanced-configuration } + +## OpenAPI operationId { #openapi-operationid } + +/// warning | انتباہ + +اگر آپ OpenAPI میں "ماہر" نہیں ہیں، تو آپ کو شاید اس کی ضرورت نہ ہو۔ + +/// + +آپ اپنے *path operation* میں `operation_id` parameter استعمال کر کے OpenAPI `operationId` مقرر کر سکتے ہیں۔ + +آپ کو یقینی بنانا ہوگا کہ یہ ہر operation کے لیے منفرد ہو۔ + +{* ../../docs_src/path_operation_advanced_configuration/tutorial001_py310.py hl[6] *} + +### *path operation function* کا نام بطور operationId استعمال کرنا { #using-the-path-operation-function-name-as-the-operationid } + +اگر آپ اپنے APIs کے function ناموں کو `operationId` کے طور پر استعمال کرنا چاہتے ہیں، تو آپ ان سب پر iterate کر سکتے ہیں اور ہر *path operation* کے `operation_id` کو ان کے `APIRoute.name` سے تبدیل کر سکتے ہیں۔ + +آپ کو یہ اپنے تمام *path operations* شامل کرنے کے بعد کرنا چاہیے۔ + +{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2, 12:21, 24] *} + +/// tip | مشورہ + +اگر آپ دستی طور پر `app.openapi()` کال کرتے ہیں، تو آپ کو اس سے پہلے `operationId` اپ ڈیٹ کرنے چاہئیں۔ + +/// + +/// warning | انتباہ + +اگر آپ ایسا کرتے ہیں، تو آپ کو یقینی بنانا ہوگا کہ آپ کے ہر *path operation function* کا نام منفرد ہو۔ + +چاہے وہ مختلف modules (Python فائلوں) میں ہوں۔ + +/// + +## OpenAPI سے خارج کریں { #exclude-from-openapi } + +کسی *path operation* کو تیار شدہ OpenAPI schema سے (اور اس طرح خودکار دستاویزی نظاموں سے) خارج کرنے کے لیے، parameter `include_in_schema` استعمال کریں اور اسے `False` پر مقرر کریں: + +{* ../../docs_src/path_operation_advanced_configuration/tutorial003_py310.py hl[6] *} + +## docstring سے ایڈوانسڈ وضاحت { #advanced-description-from-docstring } + +آپ *path operation function* کے docstring سے OpenAPI کے لیے استعمال ہونے والی سطروں کو محدود کر سکتے ہیں۔ + +`\f` (ایک escaped "form feed" حرف) شامل کرنے سے **FastAPI** اس مقام پر OpenAPI کے لیے استعمال ہونے والی آؤٹ پٹ کو تراش دے گا۔ + +یہ دستاویزات میں نظر نہیں آئے گا، لیکن دوسرے ٹولز (جیسے Sphinx) باقی حصہ استعمال کر سکیں گے۔ + +{* ../../docs_src/path_operation_advanced_configuration/tutorial004_py310.py hl[17:27] *} + +## اضافی Responses { #additional-responses } + +آپ نے شاید دیکھا ہوگا کہ *path operation* کے لیے `response_model` اور `status_code` کا اعلان کیسے کیا جاتا ہے۔ + +یہ *path operation* کے بنیادی response کے بارے میں metadata بیان کرتا ہے۔ + +آپ اضافی responses بھی اعلان کر سکتے ہیں ان کے models، status codes وغیرہ کے ساتھ۔ + +دستاویزات میں اس بارے میں ایک مکمل باب ہے، آپ اسے [OpenAPI میں اضافی Responses](additional-responses.md) پر پڑھ سکتے ہیں۔ + +## OpenAPI Extra { #openapi-extra } + +جب آپ اپنی ایپلیکیشن میں *path operation* کا اعلان کرتے ہیں، **FastAPI** خود بخود اس *path operation* کے بارے میں متعلقہ metadata تیار کرتا ہے تاکہ اسے OpenAPI schema میں شامل کیا جا سکے۔ + +/// note | تکنیکی تفصیلات + +OpenAPI specification میں اسے [Operation Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operation-object) کہا جاتا ہے۔ + +/// + +اس میں *path operation* کے بارے میں تمام معلومات ہوتی ہیں اور اسے خودکار دستاویزات تیار کرنے کے لیے استعمال کیا جاتا ہے۔ + +اس میں `tags`، `parameters`، `requestBody`، `responses` وغیرہ شامل ہیں۔ + +یہ *path operation* مخصوص OpenAPI schema عام طور پر **FastAPI** کی طرف سے خود بخود تیار ہوتا ہے، لیکن آپ اسے بڑھا بھی سکتے ہیں۔ + +/// tip | مشورہ + +یہ ایک نچلی سطح کا extension point ہے۔ + +اگر آپ کو صرف اضافی responses کا اعلان کرنا ہے، تو اس کا ایک زیادہ آسان طریقہ [OpenAPI میں اضافی Responses](additional-responses.md) ہے۔ + +/// + +آپ `openapi_extra` parameter استعمال کر کے *path operation* کے OpenAPI schema کو بڑھا سکتے ہیں۔ + +### OpenAPI Extensions { #openapi-extensions } + +یہ `openapi_extra` مفید ہو سکتا ہے، مثال کے طور پر، [OpenAPI Extensions](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions) کا اعلان کرنے کے لیے: + +{* ../../docs_src/path_operation_advanced_configuration/tutorial005_py310.py hl[6] *} + +اگر آپ خودکار API docs کھولتے ہیں، تو آپ کی extension مخصوص *path operation* کے نیچے ظاہر ہوگی۔ + + + +اور اگر آپ نتیجے میں آنے والا OpenAPI دیکھتے ہیں (آپ کے API میں `/openapi.json` پر)، تو آپ اپنی extension مخصوص *path operation* کے حصے کے طور پر بھی دیکھیں گے: + +```JSON hl_lines="22" +{ + "openapi": "3.1.0", + "info": { + "title": "FastAPI", + "version": "0.1.0" + }, + "paths": { + "/items/": { + "get": { + "summary": "Read Items", + "operationId": "read_items_items__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {} + } + } + } + }, + "x-aperture-labs-portal": "blue" + } + } + } +} +``` + +### حسب ضرورت OpenAPI *path operation* schema { #custom-openapi-path-operation-schema } + +`openapi_extra` میں موجود dictionary کو *path operation* کے خود بخود تیار شدہ OpenAPI schema کے ساتھ گہرائی سے merge کیا جائے گا۔ + +لہذا، آپ خود بخود تیار شدہ schema میں اضافی ڈیٹا شامل کر سکتے ہیں۔ + +مثال کے طور پر، آپ فیصلہ کر سکتے ہیں کہ request کو اپنے کوڈ سے پڑھیں اور توثیق کریں، Pydantic کے ساتھ FastAPI کی خودکار خصوصیات استعمال کیے بغیر، لیکن آپ پھر بھی OpenAPI schema میں request کی تعریف کرنا چاہیں۔ + +آپ یہ `openapi_extra` کے ساتھ کر سکتے ہیں: + +{* ../../docs_src/path_operation_advanced_configuration/tutorial006_py310.py hl[19:36, 39:40] *} + +اس مثال میں، ہم نے کوئی Pydantic model اعلان نہیں کیا۔ دراصل، request body کو JSON کے طور پر parse بھی نہیں کیا گیا، اسے براہ راست `bytes` کے طور پر پڑھا گیا ہے، اور function `magic_data_reader()` اسے کسی طرح parse کرنے کا ذمہ دار ہوگا۔ + +بہرحال، ہم request body کے لیے متوقع schema کا اعلان کر سکتے ہیں۔ + +### حسب ضرورت OpenAPI content type { #custom-openapi-content-type } + +اسی چال کا استعمال کرتے ہوئے، آپ Pydantic model استعمال کر کے JSON Schema بیان کر سکتے ہیں جو پھر *path operation* کے حسب ضرورت OpenAPI schema حصے میں شامل ہوتا ہے۔ + +اور آپ یہ اس صورت میں بھی کر سکتے ہیں جب request میں ڈیٹا کی قسم JSON نہ ہو۔ + +مثال کے طور پر، اس ایپلیکیشن میں ہم FastAPI کی مربوط فعالیت استعمال نہیں کرتے Pydantic models سے JSON Schema نکالنے یا JSON کے لیے خودکار توثیق کے لیے۔ دراصل، ہم request content type کو JSON کی بجائے YAML بیان کر رہے ہیں: + +{* ../../docs_src/path_operation_advanced_configuration/tutorial007_py310.py hl[15:20, 22] *} + +بہرحال، اگرچہ ہم پہلے سے طے شدہ مربوط فعالیت استعمال نہیں کر رہے، ہم پھر بھی Pydantic model استعمال کر رہے ہیں تاکہ دستی طور پر اس ڈیٹا کے لیے JSON Schema تیار کیا جا سکے جو ہم YAML میں وصول کرنا چاہتے ہیں۔ + +پھر ہم request کو براہ راست استعمال کرتے ہیں، اور body کو `bytes` کے طور پر نکالتے ہیں۔ اس کا مطلب ہے کہ FastAPI request payload کو JSON کے طور پر parse کرنے کی کوشش بھی نہیں کرے گا۔ + +اور پھر اپنے کوڈ میں، ہم اس YAML مواد کو براہ راست parse کرتے ہیں، اور پھر ہم دوبارہ وہی Pydantic model استعمال کر کے YAML مواد کی توثیق کرتے ہیں: + +{* ../../docs_src/path_operation_advanced_configuration/tutorial007_py310.py hl[24:31] *} + +/// tip | مشورہ + +یہاں ہم وہی Pydantic model دوبارہ استعمال کر رہے ہیں۔ + +لیکن اسی طرح، ہم اسے کسی اور طریقے سے بھی توثیق کر سکتے تھے۔ + +/// diff --git a/docs/ur/docs/advanced/response-change-status-code.md b/docs/ur/docs/advanced/response-change-status-code.md new file mode 100644 index 000000000..2388dcc44 --- /dev/null +++ b/docs/ur/docs/advanced/response-change-status-code.md @@ -0,0 +1,31 @@ +# Response - Status Code تبدیل کریں { #response-change-status-code } + +آپ نے شاید پہلے پڑھا ہوگا کہ آپ پہلے سے طے شدہ [Response Status Code](../tutorial/response-status-code.md) مقرر کر سکتے ہیں۔ + +لیکن بعض صورتوں میں آپ کو پہلے سے طے شدہ status code سے مختلف status code واپس کرنے کی ضرورت ہوتی ہے۔ + +## استعمال کی صورت { #use-case } + +مثال کے طور پر، تصور کریں کہ آپ پہلے سے طے شدہ طور پر HTTP status code "OK" `200` واپس کرنا چاہتے ہیں۔ + +لیکن اگر ڈیٹا موجود نہیں تھا، تو آپ اسے بنانا چاہتے ہیں، اور HTTP status code "CREATED" `201` واپس کرنا چاہتے ہیں۔ + +لیکن آپ پھر بھی `response_model` کے ساتھ واپس کیے گئے ڈیٹا کو فلٹر اور تبدیل کرنے کے قابل رہنا چاہتے ہیں۔ + +ان صورتوں میں، آپ `Response` parameter استعمال کر سکتے ہیں۔ + +## `Response` parameter استعمال کریں { #use-a-response-parameter } + +آپ اپنے *path operation function* میں `Response` قسم کا parameter اعلان کر سکتے ہیں (جیسا کہ آپ cookies اور headers کے لیے کر سکتے ہیں)۔ + +اور پھر آپ اس *عارضی* response آبجیکٹ میں `status_code` مقرر کر سکتے ہیں۔ + +{* ../../docs_src/response_change_status_code/tutorial001_py310.py hl[1,9,12] *} + +اور پھر آپ جیسے عام طور پر کرتے ہیں، کوئی بھی آبجیکٹ واپس کر سکتے ہیں (ایک `dict`، database model وغیرہ)۔ + +اور اگر آپ نے `response_model` کا اعلان کیا ہے، تو اسے پھر بھی آپ کے واپس کردہ آبجیکٹ کو فلٹر اور تبدیل کرنے کے لیے استعمال کیا جائے گا۔ + +**FastAPI** اس *عارضی* response کو status code (نیز cookies اور headers) نکالنے کے لیے استعمال کرے گا، اور انہیں حتمی response میں ڈالے گا جس میں آپ کی واپس کردہ قدر ہوگی، کسی بھی `response_model` سے فلٹر شدہ۔ + +آپ dependencies میں بھی `Response` parameter کا اعلان کر سکتے ہیں، اور ان میں status code مقرر کر سکتے ہیں۔ لیکن ذہن میں رکھیں کہ آخری مقرر کیا گیا غالب آئے گا۔ diff --git a/docs/ur/docs/advanced/response-cookies.md b/docs/ur/docs/advanced/response-cookies.md new file mode 100644 index 000000000..e5d6755cc --- /dev/null +++ b/docs/ur/docs/advanced/response-cookies.md @@ -0,0 +1,51 @@ +# Response Cookies { #response-cookies } + +## `Response` parameter استعمال کریں { #use-a-response-parameter } + +آپ اپنے *path operation function* میں `Response` قسم کا parameter اعلان کر سکتے ہیں۔ + +اور پھر آپ اس *عارضی* response آبجیکٹ میں cookies مقرر کر سکتے ہیں۔ + +{* ../../docs_src/response_cookies/tutorial002_py310.py hl[1, 8:9] *} + +اور پھر آپ جیسے عام طور پر کرتے ہیں، کوئی بھی آبجیکٹ واپس کر سکتے ہیں (ایک `dict`، database model وغیرہ)۔ + +اور اگر آپ نے `response_model` کا اعلان کیا ہے، تو اسے پھر بھی آپ کے واپس کردہ آبجیکٹ کو فلٹر اور تبدیل کرنے کے لیے استعمال کیا جائے گا۔ + +**FastAPI** اس *عارضی* response کو cookies (نیز headers اور status code) نکالنے کے لیے استعمال کرے گا، اور انہیں حتمی response میں ڈالے گا جس میں آپ کی واپس کردہ قدر ہوگی، کسی بھی `response_model` سے فلٹر شدہ۔ + +آپ dependencies میں بھی `Response` parameter کا اعلان کر سکتے ہیں، اور ان میں cookies (اور headers) مقرر کر سکتے ہیں۔ + +## براہ راست `Response` واپس کریں { #return-a-response-directly } + +آپ اپنے کوڈ میں براہ راست `Response` واپس کرتے وقت بھی cookies بنا سکتے ہیں۔ + +ایسا کرنے کے لیے، آپ [براہ راست Response واپس کریں](response-directly.md) میں بیان کردہ طریقے سے response بنا سکتے ہیں۔ + +پھر اس میں Cookies مقرر کریں، اور پھر اسے واپس کریں: + +{* ../../docs_src/response_cookies/tutorial001_py310.py hl[10:12] *} + +/// tip | مشورہ + +ذہن میں رکھیں کہ اگر آپ `Response` parameter استعمال کرنے کی بجائے براہ راست response واپس کرتے ہیں، تو FastAPI اسے براہ راست واپس کرے گا۔ + +لہذا، آپ کو یقینی بنانا ہوگا کہ آپ کا ڈیٹا صحیح قسم کا ہے۔ مثلاً اگر آپ `JSONResponse` واپس کر رہے ہیں تو یہ JSON کے موافق ہو۔ + +اور یہ بھی کہ آپ ایسا کوئی ڈیٹا نہیں بھیج رہے جو `response_model` سے فلٹر ہونا چاہیے تھا۔ + +/// + +### مزید معلومات { #more-info } + +/// note | تکنیکی تفصیلات + +آپ `from starlette.responses import Response` یا `from starlette.responses import JSONResponse` بھی استعمال کر سکتے ہیں۔ + +**FastAPI** وہی `starlette.responses` فراہم کرتا ہے جو `fastapi.responses` کے طور پر، بس آپ یعنی developer کی سہولت کے لیے۔ لیکن زیادہ تر دستیاب responses براہ راست Starlette سے آتے ہیں۔ + +اور چونکہ `Response` اکثر headers اور cookies مقرر کرنے کے لیے استعمال ہوتا ہے، **FastAPI** اسے `fastapi.Response` پر بھی فراہم کرتا ہے۔ + +/// + +تمام دستیاب parameters اور اختیارات دیکھنے کے لیے، [Starlette کی دستاویزات](https://www.starlette.dev/responses/#set-cookie) دیکھیں۔ diff --git a/docs/ur/docs/advanced/response-directly.md b/docs/ur/docs/advanced/response-directly.md new file mode 100644 index 000000000..0dcd3fbe1 --- /dev/null +++ b/docs/ur/docs/advanced/response-directly.md @@ -0,0 +1,83 @@ +# براہ راست Response واپس کریں { #return-a-response-directly } + +جب آپ **FastAPI** *path operation* بناتے ہیں تو آپ عام طور پر اس سے کوئی بھی ڈیٹا واپس کر سکتے ہیں: ایک `dict`، ایک `list`، ایک Pydantic model، database model وغیرہ۔ + +اگر آپ [Response Model](../tutorial/response-model.md) کا اعلان کرتے ہیں تو FastAPI اسے Pydantic استعمال کر کے ڈیٹا کو JSON میں serialize کرنے کے لیے استعمال کرے گا۔ + +اگر آپ response model کا اعلان نہیں کرتے، تو FastAPI [JSON Compatible Encoder](../tutorial/encoder.md) میں بیان کردہ `jsonable_encoder` استعمال کرے گا اور اسے `JSONResponse` میں ڈالے گا۔ + +آپ براہ راست `JSONResponse` بنا کر بھی واپس کر سکتے ہیں۔ + +/// tip | مشورہ + +`JSONResponse` براہ راست واپس کرنے کی بجائے [Response Model](../tutorial/response-model.md) استعمال کرنے سے آپ کو عام طور پر بہت بہتر کارکردگی ملے گی، کیونکہ اس طرح یہ Pydantic کا استعمال کرتے ہوئے Rust میں ڈیٹا کو serialize کرتا ہے۔ + +/// + +## `Response` واپس کریں { #return-a-response } + +آپ `Response` یا اس کی کوئی بھی sub-class واپس کر سکتے ہیں۔ + +/// info | معلومات + +`JSONResponse` خود `Response` کی ایک sub-class ہے۔ + +/// + +اور جب آپ `Response` واپس کرتے ہیں، **FastAPI** اسے براہ راست منتقل کرے گا۔ + +یہ Pydantic models کے ساتھ کوئی ڈیٹا تبدیلی نہیں کرے گا، مواد کو کسی قسم میں تبدیل نہیں کرے گا وغیرہ۔ + +یہ آپ کو بہت زیادہ **لچک** دیتا ہے۔ آپ کسی بھی ڈیٹا قسم کو واپس کر سکتے ہیں، کسی بھی ڈیٹا اعلان یا توثیق کو تبدیل کر سکتے ہیں وغیرہ۔ + +یہ آپ کو بہت زیادہ **ذمہ داری** بھی دیتا ہے۔ آپ کو یقینی بنانا ہوگا کہ آپ جو ڈیٹا واپس کر رہے ہیں وہ درست ہے، صحیح فارمیٹ میں ہے، serialize ہو سکتا ہے وغیرہ۔ + +## `Response` میں `jsonable_encoder` استعمال کرنا { #using-the-jsonable-encoder-in-a-response } + +چونکہ **FastAPI** آپ کے واپس کردہ `Response` میں کوئی تبدیلی نہیں کرتا، آپ کو یقینی بنانا ہوگا کہ اس کا مواد اس کے لیے تیار ہے۔ + +مثال کے طور پر، آپ Pydantic model کو `JSONResponse` میں پہلے اسے `dict` میں تبدیل کیے بغیر نہیں ڈال سکتے، جس میں تمام ڈیٹا اقسام (جیسے `datetime`، `UUID` وغیرہ) JSON کے موافق اقسام میں تبدیل ہوں۔ + +ان صورتوں میں، آپ `jsonable_encoder` استعمال کر سکتے ہیں اپنے ڈیٹا کو response میں دینے سے پہلے تبدیل کرنے کے لیے: + +{* ../../docs_src/response_directly/tutorial001_py310.py hl[5:6,20:21] *} + +/// note | تکنیکی تفصیلات + +آپ `from starlette.responses import JSONResponse` بھی استعمال کر سکتے ہیں۔ + +**FastAPI** وہی `starlette.responses` فراہم کرتا ہے جو `fastapi.responses` کے طور پر، بس آپ یعنی developer کی سہولت کے لیے۔ لیکن زیادہ تر دستیاب responses براہ راست Starlette سے آتے ہیں۔ + +/// + +## حسب ضرورت `Response` واپس کرنا { #returning-a-custom-response } + +اوپر کی مثال تمام ضروری حصے دکھاتی ہے، لیکن ابھی بہت مفید نہیں ہے، کیونکہ آپ صرف `item` براہ راست واپس کر سکتے تھے، اور **FastAPI** اسے آپ کے لیے `JSONResponse` میں ڈال دیتا، اسے `dict` میں تبدیل کر دیتا وغیرہ۔ یہ سب پہلے سے طے شدہ طور پر ہوتا ہے۔ + +اب، آئیں دیکھتے ہیں کہ آپ اسے حسب ضرورت response واپس کرنے کے لیے کیسے استعمال کر سکتے ہیں۔ + +فرض کریں کہ آپ [XML](https://en.wikipedia.org/wiki/XML) response واپس کرنا چاہتے ہیں۔ + +آپ اپنا XML مواد ایک string میں رکھ سکتے ہیں، اسے `Response` میں ڈال سکتے ہیں، اور واپس کر سکتے ہیں: + +{* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *} + +## Response Model کیسے کام کرتا ہے { #how-a-response-model-works } + +جب آپ path operation میں [Response Model - Return Type](../tutorial/response-model.md) کا اعلان کرتے ہیں، **FastAPI** اسے Pydantic استعمال کر کے ڈیٹا کو JSON میں serialize کرنے کے لیے استعمال کرے گا۔ + +{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *} + +چونکہ یہ Rust کی طرف ہوگا، کارکردگی عام Python اور `JSONResponse` class سے بہت بہتر ہوگی۔ + +`response_model` یا return type استعمال کرتے وقت، FastAPI ڈیٹا کو تبدیل کرنے کے لیے `jsonable_encoder` (جو سست ہوتا) اور نہ `JSONResponse` class استعمال کرے گا۔ + +اس کی بجائے یہ response model (یا return type) استعمال کر کے Pydantic سے تیار شدہ JSON bytes لیتا ہے اور JSON کے لیے صحیح media type (`application/json`) کے ساتھ براہ راست `Response` واپس کرتا ہے۔ + +## نوٹس { #notes } + +جب آپ براہ راست `Response` واپس کرتے ہیں تو اس کا ڈیٹا خود بخود توثیق، تبدیل (serialize) یا دستاویزی نہیں ہوتا۔ + +لیکن آپ پھر بھی اسے دستاویزی شکل دے سکتے ہیں جیسا کہ [OpenAPI میں اضافی Responses](additional-responses.md) میں بیان کیا گیا ہے۔ + +آنے والے حصوں میں آپ دیکھ سکتے ہیں کہ خودکار ڈیٹا تبدیلی، دستاویزات وغیرہ رکھتے ہوئے ان حسب ضرورت `Response` کو کیسے استعمال/اعلان کیا جائے۔ diff --git a/docs/ur/docs/advanced/response-headers.md b/docs/ur/docs/advanced/response-headers.md new file mode 100644 index 000000000..24e0efc0c --- /dev/null +++ b/docs/ur/docs/advanced/response-headers.md @@ -0,0 +1,41 @@ +# Response Headers { #response-headers } + +## `Response` parameter استعمال کریں { #use-a-response-parameter } + +آپ اپنے *path operation function* میں `Response` قسم کا parameter اعلان کر سکتے ہیں (جیسا کہ آپ cookies کے لیے کر سکتے ہیں)۔ + +اور پھر آپ اس *عارضی* response آبجیکٹ میں headers مقرر کر سکتے ہیں۔ + +{* ../../docs_src/response_headers/tutorial002_py310.py hl[1, 7:8] *} + +اور پھر آپ جیسے عام طور پر کرتے ہیں، کوئی بھی آبجیکٹ واپس کر سکتے ہیں (ایک `dict`، database model وغیرہ)۔ + +اور اگر آپ نے `response_model` کا اعلان کیا ہے، تو اسے پھر بھی آپ کے واپس کردہ آبجیکٹ کو فلٹر اور تبدیل کرنے کے لیے استعمال کیا جائے گا۔ + +**FastAPI** اس *عارضی* response کو headers (نیز cookies اور status code) نکالنے کے لیے استعمال کرے گا، اور انہیں حتمی response میں ڈالے گا جس میں آپ کی واپس کردہ قدر ہوگی، کسی بھی `response_model` سے فلٹر شدہ۔ + +آپ dependencies میں بھی `Response` parameter کا اعلان کر سکتے ہیں، اور ان میں headers (اور cookies) مقرر کر سکتے ہیں۔ + +## براہ راست `Response` واپس کریں { #return-a-response-directly } + +آپ براہ راست `Response` واپس کرتے وقت بھی headers شامل کر سکتے ہیں۔ + +[براہ راست Response واپس کریں](response-directly.md) میں بیان کردہ طریقے سے response بنائیں اور headers کو اضافی parameter کے طور پر دیں: + +{* ../../docs_src/response_headers/tutorial001_py310.py hl[10:12] *} + +/// note | تکنیکی تفصیلات + +آپ `from starlette.responses import Response` یا `from starlette.responses import JSONResponse` بھی استعمال کر سکتے ہیں۔ + +**FastAPI** وہی `starlette.responses` فراہم کرتا ہے جو `fastapi.responses` کے طور پر، بس آپ یعنی developer کی سہولت کے لیے۔ لیکن زیادہ تر دستیاب responses براہ راست Starlette سے آتے ہیں۔ + +اور چونکہ `Response` اکثر headers اور cookies مقرر کرنے کے لیے استعمال ہوتا ہے، **FastAPI** اسے `fastapi.Response` پر بھی فراہم کرتا ہے۔ + +/// + +## حسب ضرورت Headers { #custom-headers } + +ذہن میں رکھیں کہ حسب ضرورت ملکیتی headers [`X-` سابقہ استعمال کر کے](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers) شامل کیے جا سکتے ہیں۔ + +لیکن اگر آپ کے پاس حسب ضرورت headers ہیں جو آپ چاہتے ہیں کہ براؤزر میں ایک client انہیں دیکھ سکے، تو آپ کو انہیں اپنی CORS ترتیبات میں شامل کرنا ہوگا ([CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md) میں مزید پڑھیں)، [Starlette کی CORS دستاویزات](https://www.starlette.dev/middleware/#corsmiddleware) میں بیان کردہ `expose_headers` parameter استعمال کرتے ہوئے۔ diff --git a/docs/ur/docs/advanced/security/http-basic-auth.md b/docs/ur/docs/advanced/security/http-basic-auth.md new file mode 100644 index 000000000..611d7db5d --- /dev/null +++ b/docs/ur/docs/advanced/security/http-basic-auth.md @@ -0,0 +1,107 @@ +# HTTP Basic Auth { #http-basic-auth } + +سب سے سادہ صورتوں کے لیے، آپ HTTP Basic Auth استعمال کر سکتے ہیں۔ + +HTTP Basic Auth میں، ایپلیکیشن ایک ایسا header توقع کرتی ہے جس میں username اور password ہو۔ + +اگر اسے یہ نہیں ملتا، تو یہ HTTP 401 "Unauthorized" error واپس کرتی ہے۔ + +اور `WWW-Authenticate` header واپس کرتی ہے جس کی قدر `Basic` ہوتی ہے، اور ایک اختیاری `realm` parameter۔ + +اس سے browser کو username اور password کے لیے پہلے سے موجود prompt دکھانے کا اشارہ ملتا ہے۔ + +پھر جب آپ وہ username اور password ٹائپ کرتے ہیں، تو browser انہیں خودکار طور پر header میں بھیجتا ہے۔ + +## سادہ HTTP Basic Auth { #simple-http-basic-auth } + +* `HTTPBasic` اور `HTTPBasicCredentials` import کریں۔ +* `HTTPBasic` استعمال کر کے ایک "`security` scheme" بنائیں۔ +* اس `security` کو اپنے *path operation* میں dependency کے ساتھ استعمال کریں۔ +* یہ `HTTPBasicCredentials` قسم کا ایک object واپس کرتا ہے: + * اس میں بھیجے گئے `username` اور `password` ہوتے ہیں۔ + +{* ../../docs_src/security/tutorial006_an_py310.py hl[4,8,12] *} + +جب آپ پہلی بار URL کھولنے کی کوشش کریں گے (یا docs میں "Execute" بٹن پر کلک کریں گے) تو browser آپ سے username اور password پوچھے گا: + + + +## Username چیک کریں { #check-the-username } + +یہاں ایک زیادہ مکمل مثال ہے۔ + +username اور password درست ہیں یا نہیں یہ چیک کرنے کے لیے dependency استعمال کریں۔ + +اس کے لیے Python کا معیاری module [`secrets`](https://docs.python.org/3/library/secrets.html) استعمال کریں تاکہ username اور password چیک کیے جا سکیں۔ + +`secrets.compare_digest()` کو `bytes` یا ایسی `str` لینی ہوتی ہے جس میں صرف ASCII حروف ہوں (انگریزی والے)، اس کا مطلب ہے کہ یہ `á` جیسے حروف کے ساتھ کام نہیں کرے گا، جیسے `Sebastián` میں۔ + +اسے سنبھالنے کے لیے، ہم پہلے `username` اور `password` کو UTF-8 سے encode کر کے `bytes` میں تبدیل کرتے ہیں۔ + +پھر ہم `secrets.compare_digest()` استعمال کر سکتے ہیں تاکہ یقینی بنایا جا سکے کہ `credentials.username` `"stanleyjobson"` ہے، اور `credentials.password` `"swordfish"` ہے۔ + +{* ../../docs_src/security/tutorial007_an_py310.py hl[1,12:24] *} + +یہ اس کے مشابہ ہوگا: + +```Python +if not (credentials.username == "stanleyjobson") or not (credentials.password == "swordfish"): + # Return some error + ... +``` + +لیکن `secrets.compare_digest()` استعمال کرنے سے یہ "timing attacks" نامی حملوں سے محفوظ رہے گا۔ + +### Timing Attacks { #timing-attacks } + +لیکن "timing attack" کیا ہے؟ + +تصور کریں کہ کچھ حملہ آور username اور password کا اندازہ لگانے کی کوشش کر رہے ہیں۔ + +اور وہ username `johndoe` اور password `love123` کے ساتھ ایک request بھیجتے ہیں۔ + +پھر آپ کی ایپلیکیشن میں Python کوڈ کچھ اس طرح ہوگا: + +```Python +if "johndoe" == "stanleyjobson" and "love123" == "swordfish": + ... +``` + +لیکن جس لمحے Python `johndoe` کے پہلے `j` کا `stanleyjobson` کے پہلے `s` سے موازنہ کرتا ہے، یہ `False` واپس کر دے گا، کیونکہ اسے پہلے سے معلوم ہو جاتا ہے کہ یہ دونوں strings ایک جیسی نہیں ہیں، یہ سوچتے ہوئے کہ "باقی حروف کا موازنہ کرنے میں مزید وقت ضائع کرنے کی ضرورت نہیں"۔ اور آپ کی ایپلیکیشن کہے گی "غلط username یا password"۔ + +لیکن پھر حملہ آور username `stanleyjobsox` اور password `love123` کے ساتھ کوشش کرتے ہیں۔ + +اور آپ کی ایپلیکیشن کا کوڈ کچھ ایسا کرتا ہے: + +```Python +if "stanleyjobsox" == "stanleyjobson" and "love123" == "swordfish": + ... +``` + +Python کو `stanleyjobsox` اور `stanleyjobson` دونوں میں پورا `stanleyjobso` موازنہ کرنا ہوگا اس سے پہلے کہ اسے پتا چلے کہ دونوں strings ایک جیسی نہیں ہیں۔ تو "غلط username یا password" جواب دینے میں کچھ اضافی مائیکرو سیکنڈز لگیں گے۔ + +#### جواب دینے کا وقت حملہ آوروں کی مدد کرتا ہے { #the-time-to-answer-helps-the-attackers } + +اس مقام پر، یہ دیکھ کر کہ server نے "غلط username یا password" جواب بھیجنے میں کچھ مائیکرو سیکنڈز زیادہ لگائے، حملہ آوروں کو معلوم ہو جائے گا کہ انہوں نے _کچھ_ درست کیا، ابتدائی حروف میں سے کچھ صحیح تھے۔ + +اور پھر وہ دوبارہ کوشش کر سکتے ہیں یہ جانتے ہوئے کہ یہ شاید `johndoe` سے زیادہ `stanleyjobsox` سے ملتا جلتا ہے۔ + +#### ایک "پیشہ ورانہ" حملہ { #a-professional-attack } + +یقیناً، حملہ آور یہ سب ہاتھ سے نہیں کریں گے، وہ ایک پروگرام لکھیں گے جو ممکنہ طور پر فی سیکنڈ ہزاروں یا لاکھوں ٹیسٹ کرے۔ اور وہ ایک وقت میں صرف ایک اضافی درست حرف حاصل کریں گے۔ + +لیکن ایسا کرنے سے، کچھ منٹوں یا گھنٹوں میں حملہ آوروں نے ہماری ایپلیکیشن کی "مدد" سے، صرف جواب دینے کا وقت استعمال کر کے، صحیح username اور password کا اندازہ لگا لیا ہوگا۔ + +#### `secrets.compare_digest()` سے ٹھیک کریں { #fix-it-with-secrets-compare-digest } + +لیکن ہمارے کوڈ میں ہم دراصل `secrets.compare_digest()` استعمال کر رہے ہیں۔ + +مختصراً، `stanleyjobsox` کا `stanleyjobson` سے موازنہ کرنے میں اتنا ہی وقت لگے گا جتنا `johndoe` کا `stanleyjobson` سے موازنہ میں لگتا ہے۔ اور password کے لیے بھی ایسا ہی ہے۔ + +اس طرح، اپنی ایپلیکیشن کے کوڈ میں `secrets.compare_digest()` استعمال کرنے سے، یہ security حملوں کی اس پوری قسم سے محفوظ رہے گا۔ + +### Error واپس کریں { #return-the-error } + +credentials غلط ہونے کا پتا لگنے کے بعد، status code 401 کے ساتھ ایک `HTTPException` واپس کریں (وہی جو credentials فراہم نہ ہونے پر واپس آتا ہے) اور `WWW-Authenticate` header شامل کریں تاکہ browser دوبارہ login prompt دکھائے: + +{* ../../docs_src/security/tutorial007_an_py310.py hl[26:30] *} diff --git a/docs/ur/docs/advanced/security/index.md b/docs/ur/docs/advanced/security/index.md new file mode 100644 index 000000000..cd91742aa --- /dev/null +++ b/docs/ur/docs/advanced/security/index.md @@ -0,0 +1,19 @@ +# ایڈوانسڈ Security { #advanced-security } + +## اضافی خصوصیات { #additional-features } + +[ٹیوٹوریل - صارف گائیڈ: Security](../../tutorial/security/index.md) میں شامل خصوصیات کے علاوہ security کو سنبھالنے کے لیے کچھ اضافی خصوصیات موجود ہیں۔ + +/// tip | مشورہ + +اگلے حصے **ضروری نہیں کہ "ایڈوانسڈ" ہوں**۔ + +اور یہ ممکن ہے کہ آپ کے استعمال کے لیے حل انہی میں سے کسی ایک میں ہو۔ + +/// + +## پہلے ٹیوٹوریل پڑھیں { #read-the-tutorial-first } + +اگلے حصے یہ فرض کرتے ہیں کہ آپ پہلے سے مرکزی [ٹیوٹوریل - صارف گائیڈ: Security](../../tutorial/security/index.md) پڑھ چکے ہیں۔ + +یہ سب انہی تصورات پر مبنی ہیں، لیکن کچھ اضافی فعالیت فراہم کرتے ہیں۔ diff --git a/docs/ur/docs/advanced/security/oauth2-scopes.md b/docs/ur/docs/advanced/security/oauth2-scopes.md new file mode 100644 index 000000000..b8e55860a --- /dev/null +++ b/docs/ur/docs/advanced/security/oauth2-scopes.md @@ -0,0 +1,274 @@ +# OAuth2 scopes { #oauth2-scopes } + +آپ **FastAPI** کے ساتھ براہ راست OAuth2 scopes استعمال کر سکتے ہیں، یہ بغیر کسی رکاوٹ کے کام کرنے کے لیے مربوط ہیں۔ + +یہ آپ کو OAuth2 معیار کے مطابق، آپ کی OpenAPI ایپلیکیشن (اور API docs) میں مربوط، ایک زیادہ باریک بینی سے اجازتوں کا نظام رکھنے کی سہولت دے گا۔ + +OAuth2 with scopes وہ طریقہ کار ہے جو بہت سے بڑے authentication فراہم کنندگان استعمال کرتے ہیں، جیسے Facebook، Google، GitHub، Microsoft، X (Twitter) وغیرہ۔ وہ اسے صارفین اور ایپلیکیشنز کو مخصوص اجازتیں دینے کے لیے استعمال کرتے ہیں۔ + +جب بھی آپ Facebook، Google، GitHub، Microsoft، X (Twitter) کے ساتھ "log in" کرتے ہیں، وہ ایپلیکیشن OAuth2 with scopes استعمال کر رہی ہوتی ہے۔ + +اس حصے میں آپ دیکھیں گے کہ اپنی **FastAPI** ایپلیکیشن میں اسی OAuth2 with scopes کے ساتھ authentication اور authorization کیسے منظم کی جائے۔ + +/// warning | انتباہ + +یہ ایک کم و بیش ایڈوانسڈ حصہ ہے۔ اگر آپ ابھی شروع کر رہے ہیں، تو آپ اسے چھوڑ سکتے ہیں۔ + +آپ کو لازمی طور پر OAuth2 scopes کی ضرورت نہیں، اور آپ authentication اور authorization جیسے چاہیں سنبھال سکتے ہیں۔ + +لیکن OAuth2 with scopes آپ کی API (OpenAPI کے ساتھ) اور آپ کے API docs میں اچھی طرح مربوط ہو سکتا ہے۔ + +بہرحال، آپ ان scopes، یا کسی بھی دوسری security/authorization ضرورت کو، اپنے کوڈ میں جیسے چاہیں نافذ کرتے ہیں۔ + +بہت سی صورتوں میں، OAuth2 with scopes ضرورت سے زیادہ ہو سکتا ہے۔ + +لیکن اگر آپ جانتے ہیں کہ آپ کو اس کی ضرورت ہے، یا آپ متجسس ہیں، تو پڑھتے رہیں۔ + +/// + +## OAuth2 scopes اور OpenAPI { #oauth2-scopes-and-openapi } + +OAuth2 specification "scopes" کو خالی جگہوں سے الگ کیے گئے strings کی فہرست کے طور پر بیان کرتی ہے۔ + +ہر ایک string کا مواد کسی بھی شکل میں ہو سکتا ہے، لیکن اس میں خالی جگہیں نہیں ہونی چاہئیں۔ + +یہ scopes "اجازتوں" کی نمائندگی کرتے ہیں۔ + +OpenAPI (مثلاً API docs) میں، آپ "security schemes" بیان کر سکتے ہیں۔ + +جب ان میں سے کوئی security scheme OAuth2 استعمال کرے، تو آپ scopes بھی بیان اور استعمال کر سکتے ہیں۔ + +ہر "scope" بس ایک string ہے (بغیر خالی جگہوں کے)۔ + +یہ عام طور پر مخصوص security اجازتیں بیان کرنے کے لیے استعمال ہوتے ہیں، مثال کے طور پر: + +* `users:read` یا `users:write` عام مثالیں ہیں۔ +* `instagram_basic` Facebook / Instagram استعمال کرتا ہے۔ +* `https://www.googleapis.com/auth/drive` Google استعمال کرتا ہے۔ + +/// info | معلومات + +OAuth2 میں "scope" صرف ایک string ہے جو ایک مخصوص مطلوبہ اجازت بیان کرتی ہے۔ + +اس سے کوئی فرق نہیں پڑتا کہ اس میں `:` جیسے دوسرے حروف ہیں یا یہ URL ہے۔ + +یہ تفصیلات عمل درآمد کے لحاظ سے مخصوص ہیں۔ + +OAuth2 کے لیے یہ بس strings ہیں۔ + +/// + +## مجموعی نظارہ { #global-view } + +پہلے آئیے جلدی سے ان حصوں کو دیکھیں جو مرکزی **ٹیوٹوریل - صارف گائیڈ** کی [OAuth2 with Password (and hashing), Bearer with JWT tokens](../../tutorial/security/oauth2-jwt.md) مثالوں سے تبدیل ہوتے ہیں۔ اب OAuth2 scopes استعمال کرتے ہوئے: + +{* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *} + +اب آئیے ان تبدیلیوں کا قدم بہ قدم جائزہ لیتے ہیں۔ + +## OAuth2 Security scheme { #oauth2-security-scheme } + +پہلی تبدیلی یہ ہے کہ اب ہم OAuth2 security scheme کو دو دستیاب scopes، `me` اور `items` کے ساتھ بیان کر رہے ہیں۔ + +`scopes` parameter ایک `dict` لیتا ہے جس میں ہر scope بطور key اور وضاحت بطور value ہوتی ہے: + +{* ../../docs_src/security/tutorial005_an_py310.py hl[63:66] *} + +چونکہ ہم اب ان scopes کو بیان کر رہے ہیں، یہ API docs میں جب آپ log-in/authorize کریں گے تو دکھائی دیں گے۔ + +اور آپ منتخب کر سکیں گے کہ آپ کون سے scopes تک رسائی دینا چاہتے ہیں: `me` اور `items`۔ + +یہ وہی طریقہ کار ہے جو Facebook، Google، GitHub وغیرہ کے ساتھ login کرتے وقت اجازتیں دیتے وقت استعمال ہوتا ہے: + + + +## Scopes کے ساتھ JWT token { #jwt-token-with-scopes } + +اب token *path operation* میں تبدیلی کریں تاکہ درخواست کیے گئے scopes واپس کیے جائیں۔ + +ہم ابھی بھی وہی `OAuth2PasswordRequestForm` استعمال کر رہے ہیں۔ اس میں `scopes` property شامل ہے جس میں `str` کی `list` ہوتی ہے، request میں موصول ہونے والے ہر scope کے ساتھ۔ + +اور ہم scopes کو JWT token کے حصے کے طور پر واپس کرتے ہیں۔ + +/// danger + +سادگی کے لیے، یہاں ہم موصول ہونے والے scopes کو براہ راست token میں شامل کر رہے ہیں۔ + +لیکن آپ کی ایپلیکیشن میں، security کے لیے، آپ کو یقینی بنانا چاہیے کہ آپ صرف وہ scopes شامل کریں جو صارف واقعی رکھ سکتا ہے، یا جو آپ نے پہلے سے مقرر کیے ہیں۔ + +/// + +{* ../../docs_src/security/tutorial005_an_py310.py hl[157] *} + +## *path operations* اور dependencies میں scopes بیان کریں { #declare-scopes-in-path-operations-and-dependencies } + +اب ہم بیان کرتے ہیں کہ `/users/me/items/` کے *path operation* کو scope `items` درکار ہے۔ + +اس کے لیے ہم `fastapi` سے `Security` import اور استعمال کرتے ہیں۔ + +آپ `Security` استعمال کر کے dependencies بیان کر سکتے ہیں (بالکل `Depends` کی طرح)، لیکن `Security` ایک اضافی parameter `scopes` بھی لیتا ہے جس میں scopes (strings) کی فہرست ہوتی ہے۔ + +اس صورت میں، ہم dependency function `get_current_active_user` کو `Security` میں دیتے ہیں (اسی طرح جیسے ہم `Depends` کے ساتھ کرتے)۔ + +لیکن ہم scopes کی ایک `list` بھی دیتے ہیں، اس صورت میں صرف ایک scope: `items` (اس میں مزید بھی ہو سکتے ہیں)۔ + +اور dependency function `get_current_active_user` بھی sub-dependencies بیان کر سکتا ہے، نہ صرف `Depends` کے ساتھ بلکہ `Security` کے ساتھ بھی۔ اپنا sub-dependency function (`get_current_user`) بیان کرتے ہوئے، اور مزید scope کی ضروریات۔ + +اس صورت میں، اسے scope `me` درکار ہے (اسے ایک سے زیادہ scopes بھی درکار ہو سکتے ہیں)۔ + +/// note | نوٹ + +آپ کو لازمی طور پر مختلف جگہوں پر مختلف scopes شامل کرنے کی ضرورت نہیں۔ + +ہم یہاں یہ دکھانے کے لیے کر رہے ہیں کہ **FastAPI** مختلف سطحوں پر بیان کیے گئے scopes کو کیسے سنبھالتا ہے۔ + +/// + +{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *} + +/// info | تکنیکی تفصیلات + +`Security` دراصل `Depends` کی ایک subclass ہے، اور اس میں صرف ایک اضافی parameter ہے جو ہم بعد میں دیکھیں گے۔ + +لیکن `Depends` کی بجائے `Security` استعمال کرنے سے، **FastAPI** جان لے گا کہ وہ security scopes بیان کر سکتا ہے، انہیں اندرونی طور پر استعمال کر سکتا ہے، اور API کو OpenAPI کے ساتھ دستاویز بنا سکتا ہے۔ + +لیکن جب آپ `fastapi` سے `Query`، `Path`، `Depends`، `Security` اور دیگر import کرتے ہیں، تو یہ دراصل ایسے functions ہیں جو خصوصی classes واپس کرتے ہیں۔ + +/// + +## `SecurityScopes` استعمال کریں { #use-securityscopes } + +اب dependency `get_current_user` کو اپ ڈیٹ کریں۔ + +یہ وہی ہے جسے اوپر کی dependencies استعمال کرتی ہیں۔ + +یہاں ہم وہی OAuth2 scheme استعمال کر رہے ہیں جو ہم نے پہلے بنایا تھا، اسے dependency کے طور پر بیان کرتے ہوئے: `oauth2_scheme`۔ + +چونکہ اس dependency function کو خود کسی scope کی ضرورت نہیں، ہم `Depends` کو `oauth2_scheme` کے ساتھ استعمال کر سکتے ہیں، جب ہمیں security scopes بیان کرنے کی ضرورت نہ ہو تو `Security` استعمال کرنا ضروری نہیں۔ + +ہم `fastapi.security` سے import کیا ہوا `SecurityScopes` قسم کا ایک خصوصی parameter بھی بیان کرتے ہیں۔ + +یہ `SecurityScopes` class `Request` سے ملتی جلتی ہے (`Request` براہ راست request object حاصل کرنے کے لیے استعمال ہوتا تھا)۔ + +{* ../../docs_src/security/tutorial005_an_py310.py hl[9,106] *} + +## `scopes` استعمال کریں { #use-the-scopes } + +`security_scopes` parameter کی قسم `SecurityScopes` ہوگی۔ + +اس میں `scopes` property ہوگی جس میں خود اور تمام dependencies جو اسے sub-dependency کے طور پر استعمال کرتی ہیں، کے درکار تمام scopes کی فہرست ہوگی۔ یعنی تمام "dependants"... یہ الجھا دینے والا لگ سکتا ہے، نیچے اسے دوبارہ سمجھایا گیا ہے۔ + +`security_scopes` object (`SecurityScopes` class کا) ایک `scope_str` attribute بھی فراہم کرتا ہے جس میں ان scopes پر مشتمل ایک واحد string ہوتی ہے، خالی جگہوں سے الگ (ہم اسے استعمال کریں گے)۔ + +ہم ایک `HTTPException` بناتے ہیں جسے ہم بعد میں کئی مقامات پر دوبارہ استعمال (`raise`) کر سکتے ہیں۔ + +اس exception میں، ہم درکار scopes (اگر کوئی ہوں) خالی جگہوں سے الگ string کے طور پر (`scope_str` استعمال کرتے ہوئے) شامل کرتے ہیں۔ ہم scopes پر مشتمل وہ string `WWW-Authenticate` header میں ڈالتے ہیں (یہ specification کا حصہ ہے)۔ + +{* ../../docs_src/security/tutorial005_an_py310.py hl[106,108:116] *} + +## `username` اور ڈیٹا کی شکل کی تصدیق کریں { #verify-the-username-and-data-shape } + +ہم تصدیق کرتے ہیں کہ ہمیں `username` ملا ہے، اور scopes نکالتے ہیں۔ + +اور پھر ہم اس ڈیٹا کی Pydantic model سے تصدیق کرتے ہیں (`ValidationError` exception پکڑتے ہوئے)، اور اگر JWT token پڑھنے یا Pydantic سے ڈیٹا کی تصدیق کرنے میں کوئی error آئے، تو ہم وہ `HTTPException` raise کرتے ہیں جو ہم نے پہلے بنایا تھا۔ + +اس کے لیے، ہم Pydantic model `TokenData` کو ایک نئی property `scopes` کے ساتھ اپ ڈیٹ کرتے ہیں۔ + +Pydantic سے ڈیٹا کی تصدیق کر کے ہم یقینی بنا سکتے ہیں کہ ہمارے پاس، مثال کے طور پر، scopes کے ساتھ بالکل `str` کی `list` ہے اور `username` کے ساتھ ایک `str`۔ + +مثال کے طور پر، `dict` یا کچھ اور کی بجائے، کیونکہ یہ بعد میں کسی مقام پر ایپلیکیشن کو توڑ سکتا ہے، جو اسے security کا خطرہ بنا دے گا۔ + +ہم یہ بھی تصدیق کرتے ہیں کہ اس username کا صارف موجود ہے، اور اگر نہیں، تو وہی exception raise کرتے ہیں جو ہم نے پہلے بنایا تھا۔ + +{* ../../docs_src/security/tutorial005_an_py310.py hl[47,117:129] *} + +## `scopes` کی تصدیق کریں { #verify-the-scopes } + +اب ہم تصدیق کرتے ہیں کہ اس dependency اور تمام dependants (بشمول *path operations*) کے لیے درکار تمام scopes، موصول ہونے والے token میں فراہم کیے گئے scopes میں شامل ہیں، بصورت دیگر `HTTPException` raise کرتے ہیں۔ + +اس کے لیے ہم `security_scopes.scopes` استعمال کرتے ہیں، جس میں ان تمام scopes کی `list` `str` کے طور پر ہوتی ہے۔ + +{* ../../docs_src/security/tutorial005_an_py310.py hl[130:136] *} + +## Dependency tree اور scopes { #dependency-tree-and-scopes } + +آئیے اس dependency tree اور scopes کا دوبارہ جائزہ لیتے ہیں۔ + +چونکہ `get_current_active_user` dependency کی `get_current_user` پر sub-dependency ہے، اس لیے `get_current_active_user` میں بیان کیا گیا scope `"me"` `get_current_user` کو دیے گئے `security_scopes.scopes` میں درکار scopes کی فہرست میں شامل ہوگا۔ + +*path operation* خود بھی ایک scope بیان کرتا ہے، `"items"`، تو یہ بھی `get_current_user` کو دیے گئے `security_scopes.scopes` کی فہرست میں ہوگا۔ + +یہاں dependencies اور scopes کا درجہ بندی کا نظارہ ہے: + +* *path operation* `read_own_items` میں ہے: + * درکار scopes `["items"]` dependency کے ساتھ: + * `get_current_active_user`: + * dependency function `get_current_active_user` میں ہے: + * درکار scopes `["me"]` dependency کے ساتھ: + * `get_current_user`: + * dependency function `get_current_user` میں ہے: + * خود کوئی scopes درکار نہیں۔ + * `oauth2_scheme` استعمال کرنے والی dependency۔ + * `SecurityScopes` قسم کا `security_scopes` parameter: + * اس `security_scopes` parameter میں `scopes` property ہے جس میں اوپر بیان کیے گئے تمام scopes کی `list` ہے، تو: + * `security_scopes.scopes` *path operation* `read_own_items` کے لیے `["me", "items"]` ہوگا۔ + * `security_scopes.scopes` *path operation* `read_users_me` کے لیے `["me"]` ہوگا، کیونکہ یہ dependency `get_current_active_user` میں بیان کیا گیا ہے۔ + * `security_scopes.scopes` *path operation* `read_system_status` کے لیے `[]` (خالی) ہوگا، کیونکہ اس نے `scopes` کے ساتھ کوئی `Security` بیان نہیں کیا، اور اس کی dependency `get_current_user` بھی کوئی `scopes` بیان نہیں کرتی۔ + +/// tip | مشورہ + +یہاں اہم اور "جادوئی" بات یہ ہے کہ `get_current_user` ہر *path operation* کے لیے چیک کرنے کے لیے scopes کی مختلف فہرست رکھے گا۔ + +سب کا انحصار ہر *path operation* میں اور اس مخصوص *path operation* کے لیے dependency tree میں ہر dependency میں بیان کیے گئے `scopes` پر ہے۔ + +/// + +## `SecurityScopes` کے بارے میں مزید تفصیلات { #more-details-about-securityscopes } + +آپ `SecurityScopes` کسی بھی مقام پر، اور متعدد جگہوں پر استعمال کر سکتے ہیں، یہ ضروری نہیں کہ "root" dependency پر ہو۔ + +اس میں ہمیشہ موجودہ `Security` dependencies اور **اس مخصوص** *path operation* اور **اس مخصوص** dependency tree کے تمام dependants میں بیان کیے گئے security scopes ہوں گے۔ + +چونکہ `SecurityScopes` میں dependants کی طرف سے بیان کیے گئے تمام scopes ہوں گے، آپ اسے ایک مرکزی dependency function میں استعمال کر سکتے ہیں تاکہ تصدیق کی جا سکے کہ token میں درکار scopes موجود ہیں، اور پھر مختلف *path operations* میں مختلف scope کی ضروریات بیان کریں۔ + +ہر *path operation* کے لیے آزادانہ طور پر چیک کیے جائیں گے۔ + +## اسے چیک کریں { #check-it } + +اگر آپ API docs کھولیں، تو آپ authenticate کر سکتے ہیں اور بتا سکتے ہیں کہ آپ کون سے scopes authorize کرنا چاہتے ہیں۔ + + + +اگر آپ کوئی scope منتخب نہیں کرتے، تو آپ "authenticated" ہوں گے، لیکن جب آپ `/users/me/` یا `/users/me/items/` تک رسائی حاصل کرنے کی کوشش کریں گے تو آپ کو ایک error ملے گا کہ آپ کے پاس کافی اجازتیں نہیں ہیں۔ آپ پھر بھی `/status/` تک رسائی حاصل کر سکیں گے۔ + +اور اگر آپ scope `me` منتخب کرتے ہیں لیکن scope `items` نہیں، تو آپ `/users/me/` تک رسائی حاصل کر سکیں گے لیکن `/users/me/items/` تک نہیں۔ + +یہ وہی ہوگا جو کسی تیسرے فریق کی ایپلیکیشن کے ساتھ ہوتا جو صارف کی طرف سے فراہم کیے گئے token کے ساتھ ان *path operations* میں سے کسی تک رسائی حاصل کرنے کی کوشش کرتی، اس پر منحصر کہ صارف نے ایپلیکیشن کو کتنی اجازتیں دیں۔ + +## تیسرے فریق کی integrations کے بارے میں { #about-third-party-integrations } + +اس مثال میں ہم OAuth2 "password" flow استعمال کر رہے ہیں۔ + +یہ اس وقت مناسب ہے جب ہم اپنی خود کی ایپلیکیشن میں login کر رہے ہوں، شاید اپنے خود کے frontend کے ساتھ۔ + +کیونکہ ہم `username` اور `password` وصول کرنے پر اعتماد کر سکتے ہیں، کیونکہ ہم اسے کنٹرول کرتے ہیں۔ + +لیکن اگر آپ ایسی OAuth2 ایپلیکیشن بنا رہے ہیں جس سے دوسرے جڑیں گے (یعنی اگر آپ Facebook، Google، GitHub وغیرہ کے مساوی authentication فراہم کنندہ بنا رہے ہیں) تو آپ کو دوسرے flows میں سے کوئی استعمال کرنا چاہیے۔ + +سب سے عام implicit flow ہے۔ + +سب سے محفوظ code flow ہے، لیکن اسے عمل میں لانا زیادہ پیچیدہ ہے کیونکہ اس میں مزید مراحل درکار ہیں۔ چونکہ یہ زیادہ پیچیدہ ہے، بہت سے فراہم کنندگان implicit flow تجویز کرتے ہیں۔ + +/// note | نوٹ + +یہ عام ہے کہ ہر authentication فراہم کنندہ اپنے flows کو مختلف ناموں سے پکارتا ہے، تاکہ اسے اپنے برانڈ کا حصہ بنا سکے۔ + +لیکن آخر میں، وہ وہی OAuth2 معیار نافذ کر رہے ہیں۔ + +/// + +**FastAPI** ان تمام OAuth2 authentication flows کے لیے `fastapi.security.oauth2` میں utilities شامل کرتا ہے۔ + +## Decorator `dependencies` میں `Security` { #security-in-decorator-dependencies } + +جس طرح آپ decorator کے `dependencies` parameter میں `Depends` کی `list` بیان کر سکتے ہیں (جیسا کہ [Dependencies in path operation decorators](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md) میں سمجھایا گیا ہے)، اسی طرح آپ وہاں `scopes` کے ساتھ `Security` بھی استعمال کر سکتے ہیں۔ diff --git a/docs/ur/docs/advanced/settings.md b/docs/ur/docs/advanced/settings.md new file mode 100644 index 000000000..72e472def --- /dev/null +++ b/docs/ur/docs/advanced/settings.md @@ -0,0 +1,302 @@ +# Settings اور Environment Variables { #settings-and-environment-variables } + +بہت سے معاملات میں آپ کی ایپلیکیشن کو کچھ بیرونی settings یا configurations کی ضرورت ہو سکتی ہے، مثال کے طور پر خفیہ کلیدیں، database credentials، ای میل سروسز کے credentials وغیرہ۔ + +ان میں سے زیادہ تر settings متغیر ہیں (تبدیل ہو سکتی ہیں)، جیسے database URLs۔ اور بہت سی حساس ہو سکتی ہیں، جیسے خفیہ معلومات۔ + +اسی لیے انہیں environment variables میں فراہم کرنا عام ہے جنہیں ایپلیکیشن پڑھتی ہے۔ + +/// tip | مشورہ + +Environment variables کو سمجھنے کے لیے آپ [Environment Variables](../environment-variables.md) پڑھ سکتے ہیں۔ + +/// + +## اقسام اور validation { #types-and-validation } + +یہ environment variables صرف text strings ہینڈل کر سکتے ہیں، کیونکہ یہ Python سے باہر ہیں اور دوسرے پروگراموں اور باقی سسٹم (اور مختلف آپریٹنگ سسٹمز، جیسے Linux، Windows، macOS) کے ساتھ مطابقت رکھنی ہوتی ہے۔ + +اس کا مطلب ہے کہ Python میں environment variable سے پڑھی گئی ہر قدر `str` ہوگی، اور کسی مختلف قسم میں تبدیلی یا کوئی validation کوڈ میں کرنی ہوگی۔ + +## Pydantic `Settings` { #pydantic-settings } + +خوش قسمتی سے، Pydantic environment variables سے آنے والی ان settings کو ہینڈل کرنے کے لیے ایک بہترین utility فراہم کرتا ہے [Pydantic: Settings management](https://docs.pydantic.dev/latest/concepts/pydantic_settings/) کے ساتھ۔ + +### `pydantic-settings` انسٹال کریں { #install-pydantic-settings } + +سب سے پہلے، یقینی بنائیں کہ آپ اپنا [virtual environment](../virtual-environments.md) بنائیں، اسے فعال کریں، اور پھر `pydantic-settings` پیکیج انسٹال کریں: + +
+ +```console +$ pip install pydantic-settings +---> 100% +``` + +
+ +یہ `all` extras انسٹال کرنے پر بھی شامل ہوتا ہے: + +
+ +```console +$ pip install "fastapi[all]" +---> 100% +``` + +
+ +### `Settings` آبجیکٹ بنائیں { #create-the-settings-object } + +Pydantic سے `BaseSettings` import کریں اور ایک sub-class بنائیں، بالکل Pydantic model کی طرح۔ + +Pydantic models کی طرح ہی، آپ type annotations اور ممکنہ ڈیفالٹ اقدار کے ساتھ class attributes بیان کرتے ہیں۔ + +آپ وہ تمام validation خصوصیات اور ٹولز استعمال کر سکتے ہیں جو آپ Pydantic models کے لیے استعمال کرتے ہیں، جیسے مختلف data اقسام اور `Field()` کے ساتھ اضافی validations۔ + +{* ../../docs_src/settings/tutorial001_py310.py hl[2,5:8,11] *} + +/// tip | مشورہ + +اگر آپ کاپی اور پیسٹ کے لیے کچھ فوری چاہتے ہیں تو یہ مثال استعمال نہ کریں، نیچے آخری مثال استعمال کریں۔ + +/// + +پھر، جب آپ اس `Settings` class کی instance بنائیں گے (اس صورت میں، `settings` آبجیکٹ میں)، Pydantic environment variables کو case-insensitive طریقے سے پڑھے گا، تو بڑے حروف والا variable `APP_NAME` بھی attribute `app_name` کے لیے پڑھا جائے گا۔ + +اس کے بعد یہ ڈیٹا تبدیل اور validate کرے گا۔ تو، جب آپ وہ `settings` آبجیکٹ استعمال کریں گے، آپ کو بیان کردہ اقسام کا ڈیٹا ملے گا (مثلاً `items_per_user` ایک `int` ہوگا)۔ + +### `settings` استعمال کریں { #use-the-settings } + +پھر آپ نیا `settings` آبجیکٹ اپنی ایپلیکیشن میں استعمال کر سکتے ہیں: + +{* ../../docs_src/settings/tutorial001_py310.py hl[18:20] *} + +### Server چلائیں { #run-the-server } + +اس کے بعد، آپ configurations کو environment variables کے طور پر پاس کرتے ہوئے server چلائیں گے، مثال کے طور پر آپ `ADMIN_EMAIL` اور `APP_NAME` اس طرح سیٹ کر سکتے ہیں: + +
+ +```console +$ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.py + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +/// tip | مشورہ + +ایک کمانڈ کے لیے متعدد env vars سیٹ کرنے کے لیے انہیں space سے الگ کریں، اور سب کو کمانڈ سے پہلے رکھیں۔ + +/// + +اور پھر `admin_email` setting `"deadpool@example.com"` پر سیٹ ہو جائے گی۔ + +`app_name` `"ChimichangApp"` ہوگا۔ + +اور `items_per_user` اپنی ڈیفالٹ قدر `50` پر رہے گا۔ + +## دوسرے module میں Settings { #settings-in-another-module } + +آپ ان settings کو دوسری module فائل میں رکھ سکتے ہیں جیسا کہ آپ نے [بڑی ایپلیکیشنز - متعدد فائلیں](../tutorial/bigger-applications.md) میں دیکھا۔ + +مثال کے طور پر، آپ کے پاس `config.py` فائل ہو سکتی ہے: + +{* ../../docs_src/settings/app01_py310/config.py *} + +اور پھر اسے `main.py` فائل میں استعمال کریں: + +{* ../../docs_src/settings/app01_py310/main.py hl[3,11:13] *} + +/// tip | مشورہ + +آپ کو `__init__.py` فائل بھی چاہیے ہوگی جیسا کہ آپ نے [بڑی ایپلیکیشنز - متعدد فائلیں](../tutorial/bigger-applications.md) میں دیکھا۔ + +/// + +## Dependency میں Settings { #settings-in-a-dependency } + +بعض اوقات ہر جگہ `settings` کا global آبجیکٹ رکھنے کی بجائے، dependency سے settings فراہم کرنا مفید ہو سکتا ہے۔ + +یہ خاص طور پر testing کے دوران مفید ہو سکتا ہے، کیونکہ dependency کو اپنی حسب ضرورت settings کے ساتھ override کرنا بہت آسان ہے۔ + +### Config فائل { #the-config-file } + +پچھلی مثال سے آتے ہوئے، آپ کی `config.py` فائل اس طرح ہو سکتی ہے: + +{* ../../docs_src/settings/app02_an_py310/config.py hl[10] *} + +غور کریں کہ اب ہم `settings = Settings()` کی ڈیفالٹ instance نہیں بناتے۔ + +### مرکزی ایپ فائل { #the-main-app-file } + +اب ہم ایک dependency بناتے ہیں جو نئی `config.Settings()` واپس کرے۔ + +{* ../../docs_src/settings/app02_an_py310/main.py hl[6,12:13] *} + +/// tip | مشورہ + +ہم `@lru_cache` کے بارے میں تھوڑی دیر میں بات کریں گے۔ + +ابھی کے لیے آپ فرض کر سکتے ہیں کہ `get_settings()` ایک عام function ہے۔ + +/// + +اور پھر ہم اسے *path operation function* سے dependency کے طور پر طلب کر سکتے ہیں اور جہاں ضرورت ہو استعمال کر سکتے ہیں۔ + +{* ../../docs_src/settings/app02_an_py310/main.py hl[17,19:21] *} + +### Settings اور testing { #settings-and-testing } + +پھر testing کے دوران `get_settings` کے لیے dependency override بنا کر مختلف settings آبجیکٹ فراہم کرنا بہت آسان ہوگا: + +{* ../../docs_src/settings/app02_an_py310/test_main.py hl[9:10,13,21] *} + +dependency override میں ہم نئی `Settings` آبجیکٹ بناتے وقت `admin_email` کے لیے نئی قدر سیٹ کرتے ہیں، اور پھر وہ نیا آبجیکٹ واپس کرتے ہیں۔ + +پھر ہم ٹیسٹ کر سکتے ہیں کہ یہ استعمال ہو رہا ہے۔ + +## `.env` فائل پڑھنا { #reading-a-env-file } + +اگر آپ کے پاس بہت سی settings ہیں جو ممکنہ طور پر بہت بدلتی ہیں، شاید مختلف ماحول میں، تو انہیں ایک فائل میں رکھنا اور پھر اسے ایسے پڑھنا مفید ہو سکتا ہے جیسے وہ environment variables ہوں۔ + +یہ رواج کافی عام ہے اور اس کا نام ہے، یہ environment variables عام طور پر `.env` فائل میں رکھے جاتے ہیں، اور فائل کو "dotenv" کہا جاتا ہے۔ + +/// tip | مشورہ + +نقطے (`.`) سے شروع ہونے والی فائل Unix جیسے سسٹمز، جیسے Linux اور macOS میں ایک پوشیدہ فائل ہوتی ہے۔ + +لیکن dotenv فائل کا واقعی وہی نام ہونا ضروری نہیں ہے۔ + +/// + +Pydantic ایک بیرونی لائبریری استعمال کرتے ہوئے ان قسم کی فائلوں سے پڑھنے کی سپورٹ رکھتا ہے۔ آپ مزید [Pydantic Settings: Dotenv (.env) support](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support) میں پڑھ سکتے ہیں۔ + +/// tip | مشورہ + +اس کے کام کرنے کے لیے، آپ کو `pip install python-dotenv` کرنا ہوگا۔ + +/// + +### `.env` فائل { #the-env-file } + +آپ کے پاس `.env` فائل ہو سکتی ہے جس میں: + +```bash +ADMIN_EMAIL="deadpool@example.com" +APP_NAME="ChimichangApp" +``` + +### `.env` سے settings پڑھیں { #read-settings-from-env } + +اور پھر اپنی `config.py` اس طرح اپ ڈیٹ کریں: + +{* ../../docs_src/settings/app03_an_py310/config.py hl[9] *} + +/// tip | مشورہ + +`model_config` attribute صرف Pydantic ترتیب کے لیے استعمال ہوتا ہے۔ آپ مزید [Pydantic: Concepts: Configuration](https://docs.pydantic.dev/latest/concepts/config/) میں پڑھ سکتے ہیں۔ + +/// + +یہاں ہم Pydantic `Settings` class کے اندر config `env_file` بیان کرتے ہیں، اور اس dotenv فائل کے filename پر ویلیو سیٹ کرتے ہیں جو ہم استعمال کرنا چاہتے ہیں۔ + +### `lru_cache` کے ساتھ Settings صرف ایک بار بنائیں { #creating-the-settings-only-once-with-lru-cache } + +ڈسک سے فائل پڑھنا عام طور پر مہنگا (سست) عمل ہے، تو آپ شاید یہ صرف ایک بار کرنا چاہیں گے اور پھر وہی settings آبجیکٹ دوبارہ استعمال کریں، ہر request کے لیے پڑھنے کی بجائے۔ + +لیکن ہر بار جب ہم یہ کریں: + +```Python +Settings() +``` + +نیا `Settings` آبجیکٹ بنے گا، اور بنتے وقت `.env` فائل دوبارہ پڑھے گا۔ + +اگر dependency function صرف اس طرح ہوتا: + +```Python +def get_settings(): + return Settings() +``` + +ہم ہر request کے لیے وہ آبجیکٹ بنائیں گے، اور ہر request کے لیے `.env` فائل پڑھیں گے۔ + +لیکن چونکہ ہم اوپر `@lru_cache` decorator استعمال کر رہے ہیں، `Settings` آبجیکٹ صرف ایک بار بنے گا، پہلی بار جب اسے بلایا جائے۔ + +{* ../../docs_src/settings/app03_an_py310/main.py hl[1,11] *} + +پھر `get_settings()` کی اگلی requests کے لیے dependencies میں ہونے والی کسی بھی بعد کی کال کے لیے، `get_settings()` کا اندرونی کوڈ عمل میں لانے اور نیا `Settings` آبجیکٹ بنانے کی بجائے، یہ وہی آبجیکٹ واپس کرے گا جو پہلی بار واپس کیا گیا تھا، بار بار۔ + +#### `lru_cache` تکنیکی تفصیلات { #lru-cache-technical-details } + +`@lru_cache` اس function کو modify کرتا ہے جسے decorate کرتا ہے تاکہ وہی قدر واپس کرے جو پہلی بار واپس کی گئی تھی، function کا کوڈ ہر بار دوبارہ عمل میں لانے کی بجائے۔ + +تو، اس کے نیچے والا function arguments کے ہر مجموعے کے لیے ایک بار عمل میں آئے گا۔ اور پھر ان مجموعوں سے واپس آنے والی اقدار بار بار استعمال ہوں گی جب بھی function کو بالکل وہی مجموعہ arguments کے ساتھ بلایا جائے۔ + +مثال کے طور پر، اگر آپ کے پاس یہ function ہو: + +```Python +@lru_cache +def say_hi(name: str, salutation: str = "Ms."): + return f"Hello {salutation} {name}" +``` + +آپ کا پروگرام اس طرح عمل کر سکتا ہے: + +```mermaid +sequenceDiagram + +participant code as Code +participant function as say_hi() +participant execute as Execute function + + rect rgba(0, 255, 0, .1) + code ->> function: say_hi(name="Camila") + function ->> execute: execute function code + execute ->> code: return the result + end + + rect rgba(0, 255, 255, .1) + code ->> function: say_hi(name="Camila") + function ->> code: return stored result + end + + rect rgba(0, 255, 0, .1) + code ->> function: say_hi(name="Rick") + function ->> execute: execute function code + execute ->> code: return the result + end + + rect rgba(0, 255, 0, .1) + code ->> function: say_hi(name="Rick", salutation="Mr.") + function ->> execute: execute function code + execute ->> code: return the result + end + + rect rgba(0, 255, 255, .1) + code ->> function: say_hi(name="Rick") + function ->> code: return stored result + end + + rect rgba(0, 255, 255, .1) + code ->> function: say_hi(name="Camila") + function ->> code: return stored result + end +``` + +ہماری dependency `get_settings()` کی صورت میں، function کوئی arguments بھی نہیں لیتا، تو یہ ہمیشہ وہی قدر واپس کرتا ہے۔ + +اس طریقے سے، یہ تقریباً ایسے ہی برتاؤ کرتا ہے جیسے یہ صرف ایک global variable ہو۔ لیکن چونکہ یہ dependency function استعمال کرتا ہے، تو ہم اسے testing کے لیے آسانی سے override کر سکتے ہیں۔ + +`@lru_cache` Python کے standard library کے `functools` کا حصہ ہے، آپ اس کے بارے میں مزید [`@lru_cache` کی Python دستاویزات](https://docs.python.org/3/library/functools.html#functools.lru_cache) میں پڑھ سکتے ہیں۔ + +## خلاصہ { #recap } + +آپ Pydantic Settings استعمال کر کے اپنی ایپلیکیشن کی settings یا configurations کو ہینڈل کر سکتے ہیں، Pydantic models کی تمام طاقت کے ساتھ۔ + +* Dependency استعمال کر کے آپ testing آسان بنا سکتے ہیں۔ +* آپ اس کے ساتھ `.env` فائلیں استعمال کر سکتے ہیں۔ +* `@lru_cache` استعمال کر کے آپ dotenv فائل کو ہر request کے لیے بار بار پڑھنے سے بچ سکتے ہیں، جبکہ testing کے دوران اسے override کرنے کی سہولت بھی رہتی ہے۔ diff --git a/docs/ur/docs/advanced/stream-data.md b/docs/ur/docs/advanced/stream-data.md new file mode 100644 index 000000000..0326e01e5 --- /dev/null +++ b/docs/ur/docs/advanced/stream-data.md @@ -0,0 +1,117 @@ +# ڈیٹا Stream کرنا { #stream-data } + +اگر آپ ایسا ڈیٹا stream کرنا چاہتے ہیں جو JSON کے طور پر ترتیب دیا جا سکے، تو آپ کو [Stream JSON Lines](../tutorial/stream-json-lines.md) استعمال کرنا چاہیے۔ + +لیکن اگر آپ **خالص binary ڈیٹا** یا strings stream کرنا چاہتے ہیں، تو یہ طریقہ ہے۔ + +/// info | معلومات + +FastAPI 0.134.0 میں شامل کیا گیا۔ + +/// + +## استعمال کی صورتیں { #use-cases } + +آپ اسے استعمال کر سکتے ہیں اگر آپ خالص strings stream کرنا چاہیں، مثلاً براہ راست **AI LLM** سروس کے آؤٹ پٹ سے۔ + +آپ اسے **بڑی binary فائلیں** stream کرنے کے لیے بھی استعمال کر سکتے ہیں، جہاں آپ ڈیٹا کا ہر ٹکڑا پڑھتے ہوئے stream کرتے ہیں، بغیر اسے ایک ساتھ پوری memory میں پڑھے۔ + +آپ اس طریقے سے **ویڈیو** یا **آڈیو** بھی stream کر سکتے ہیں، یہ بھی بنایا جا سکتا ہے جب آپ پروسیس اور بھیج رہے ہوں۔ + +## `yield` کے ساتھ `StreamingResponse` { #a-streamingresponse-with-yield } + +اگر آپ اپنے *path operation function* میں `response_class=StreamingResponse` بیان کریں تو آپ `yield` استعمال کر کے ڈیٹا کا ہر ٹکڑا باری باری بھیج سکتے ہیں۔ + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *} + +FastAPI ڈیٹا کا ہر ٹکڑا `StreamingResponse` کو جوں کا توں دے گا، یہ اسے JSON میں تبدیل کرنے یا ایسی کوئی چیز نہیں کرے گا۔ + +### غیر async *path operation functions* { #non-async-path-operation-functions } + +آپ عام `def` functions (بغیر `async`) بھی استعمال کر سکتے ہیں، اور `yield` اسی طرح استعمال کر سکتے ہیں۔ + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[26:29] hl[27] *} + +### بغیر Annotation { #no-annotation } + +Streaming binary ڈیٹا کے لیے آپ کو واقعی return type annotation بیان کرنے کی ضرورت نہیں ہے۔ + +چونکہ FastAPI Pydantic کے ساتھ ڈیٹا کو JSON میں تبدیل کرنے یا کسی طرح serialize کرنے کی کوشش نہیں کرے گا، اس صورت میں type annotation صرف آپ کے editor اور tools کے استعمال کے لیے ہے، FastAPI اسے استعمال نہیں کرے گا۔ + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *} + +اس کا مطلب یہ بھی ہے کہ `StreamingResponse` کے ساتھ آپ کو ڈیٹا bytes بالکل اسی طرح بنانے اور encode کرنے کی **آزادی** اور **ذمہ داری** ہے جیسے آپ انہیں بھیجنا چاہتے ہیں، type annotations سے آزاد۔ + +### Bytes Stream کریں { #stream-bytes } + +اہم استعمال کی صورتوں میں سے ایک strings کی بجائے `bytes` stream کرنا ہے، آپ یقیناً ایسا کر سکتے ہیں۔ + +{* ../../docs_src/stream_data/tutorial001_py310.py ln[44:47] hl[47] *} + +## حسب ضرورت `PNGStreamingResponse` { #a-custom-pngstreamingresponse } + +اوپر کی مثالوں میں، ڈیٹا bytes stream کیے گئے لیکن response میں `Content-Type` header نہیں تھا، اس لیے client نہیں جانتا تھا کہ وہ کس قسم کا ڈیٹا وصول کر رہا ہے۔ + +آپ `StreamingResponse` کی حسب ضرورت sub-class بنا سکتے ہیں جو `Content-Type` header کو آپ کے stream کیے جانے والے ڈیٹا کی قسم پر سیٹ کرے۔ + +مثال کے طور پر، آپ `PNGStreamingResponse` بنا سکتے ہیں جو `media_type` attribute استعمال کرتے ہوئے `Content-Type` header کو `image/png` پر سیٹ کرے: + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *} + +پھر آپ اس نئی class کو اپنے *path operation function* میں `response_class=PNGStreamingResponse` میں استعمال کر سکتے ہیں: + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *} + +### فائل کی نقل { #simulate-a-file } + +اس مثال میں، ہم `io.BytesIO` کے ساتھ فائل کی نقل کر رہے ہیں، جو صرف memory میں رہنے والا file-like آبجیکٹ ہے، لیکن وہی interface استعمال کرنے دیتا ہے۔ + +مثال کے طور پر، ہم اس کا مواد حاصل کرنے کے لیے اس پر iterate کر سکتے ہیں، جیسا کہ ہم فائل کے ساتھ کر سکتے ہیں۔ + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[1:27] hl[3,12:13,25] *} + +/// note | تکنیکی تفصیلات + +دوسرے دو variables، `image_base64` اور `binary_image`، Base64 میں encoded تصویر ہیں، اور پھر bytes میں تبدیل کی گئی ہیں، تاکہ `io.BytesIO` کو پاس کی جا سکیں۔ + +صرف اس لیے کہ یہ اسی فائل میں رہ سکے اس مثال کے لیے اور آپ اسے کاپی کر کے جوں کا توں چلا سکیں۔ + +/// + +`with` بلاک استعمال کر کے، ہم یقینی بناتے ہیں کہ generator function (`yield` والا function) مکمل ہونے کے بعد file-like آبجیکٹ بند ہو جائے۔ تو، response بھیجنے کے بعد۔ + +اس مخصوص مثال میں یہ اتنا اہم نہیں ہوگا کیونکہ یہ memory میں جعلی فائل ہے (`io.BytesIO` کے ساتھ)، لیکن اصلی فائل کے ساتھ یہ اہم ہوگا کہ کام مکمل ہونے کے بعد فائل بند ہو۔ + +### فائلیں اور Async { #files-and-async } + +زیادہ تر صورتوں میں، file-like آبجیکٹ بطور ڈیفالٹ async اور await کے ساتھ مطابقت نہیں رکھتے۔ + +مثلاً، ان کے پاس `await file.read()` نہیں ہوتا، یا `async for chunk in file`۔ + +اور بہت سی صورتوں میں، انہیں پڑھنا blocking عمل ہوگا (جو event loop کو بلاک کر سکتا ہے)، کیونکہ وہ ڈسک یا نیٹ ورک سے پڑھے جاتے ہیں۔ + +/// info | معلومات + +اوپر والی مثال دراصل ایک استثناء ہے، کیونکہ `io.BytesIO` آبجیکٹ پہلے سے memory میں ہے، تو اسے پڑھنا کچھ بلاک نہیں کرے گا۔ + +لیکن بہت سی صورتوں میں فائل یا file-like آبجیکٹ پڑھنا بلاک کرے گا۔ + +/// + +event loop کو بلاک ہونے سے بچانے کے لیے، آپ *path operation function* کو `async def` کی بجائے عام `def` کے ساتھ بیان کر سکتے ہیں، اس طرح FastAPI اسے threadpool worker پر چلائے گا، مرکزی loop کو بلاک ہونے سے بچاتے ہوئے۔ + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *} + +/// tip | مشورہ + +اگر آپ کو async function کے اندر سے blocking کوڈ بلانے کی ضرورت ہو، یا blocking function کے اندر سے async function بلانی ہو، تو آپ [Asyncer](https://asyncer.tiangolo.com) استعمال کر سکتے ہیں، جو FastAPI کی ایک ہم خواہر لائبریری ہے۔ + +/// + +### `yield from` { #yield-from } + +جب آپ کسی چیز پر iterate کر رہے ہوں، جیسے file-like آبجیکٹ، اور پھر ہر آئٹم کے لیے `yield` کر رہے ہوں، تو آپ `yield from` بھی استعمال کر سکتے ہیں تاکہ ہر آئٹم کو براہ راست yield کریں اور `for` loop سے بچیں۔ + +یہ FastAPI کے لیے مخصوص نہیں ہے، بس Python ہے، لیکن جاننے کے لیے ایک اچھی تدبیر ہے۔ + +{* ../../docs_src/stream_data/tutorial002_py310.py ln[37:40] hl[40] *} diff --git a/docs/ur/docs/advanced/strict-content-type.md b/docs/ur/docs/advanced/strict-content-type.md new file mode 100644 index 000000000..9d69e6d98 --- /dev/null +++ b/docs/ur/docs/advanced/strict-content-type.md @@ -0,0 +1,88 @@ +# سخت Content-Type جانچ { #strict-content-type-checking } + +بطور ڈیفالٹ، **FastAPI** JSON request bodies کے لیے `Content-Type` header کی سخت جانچ کرتا ہے، اس کا مطلب ہے کہ JSON requests میں body کو JSON کے طور پر parse کرنے کے لیے درست `Content-Type` header (مثلاً `application/json`) **لازمی** شامل ہونا چاہیے۔ + +## CSRF خطرہ { #csrf-risk } + +یہ ڈیفالٹ رویہ ایک بہت مخصوص صورت میں **Cross-Site Request Forgery (CSRF)** حملوں کی ایک قسم سے تحفظ فراہم کرتا ہے۔ + +یہ حملے اس حقیقت کا فائدہ اٹھاتے ہیں کہ browsers scripts کو بغیر کسی CORS preflight جانچ کے requests بھیجنے دیتے ہیں جب وہ: + +* `Content-Type` header نہ رکھتی ہوں (مثلاً `fetch()` کو `Blob` body کے ساتھ استعمال کرنا) +* اور کوئی authentication credentials نہ بھیجتی ہوں۔ + +اس قسم کا حملہ بنیادی طور پر اس وقت متعلق ہوتا ہے جب: + +* ایپلیکیشن مقامی طور پر (مثلاً `localhost` پر) یا اندرونی نیٹ ورک میں چل رہی ہو +* اور ایپلیکیشن میں کوئی authentication نہ ہو، یہ توقع رکھتی ہو کہ اسی نیٹ ورک سے کوئی بھی request قابل اعتماد ہے۔ + +## حملے کی مثال { #example-attack } + +فرض کریں آپ مقامی AI agent چلانے کا ایک طریقہ بناتے ہیں۔ + +یہ اس پر API فراہم کرتا ہے: + +``` +http://localhost:8000/v1/agents/multivac +``` + +اس پر frontend بھی ہے: + +``` +http://localhost:8000 +``` + +/// tip | مشورہ + +غور کریں کہ دونوں کا host ایک ہی ہے۔ + +/// + +پھر frontend استعمال کر کے آپ AI agent سے اپنی طرف سے کام کروا سکتے ہیں۔ + +چونکہ یہ **مقامی طور پر** چل رہا ہے، اور کھلے انٹرنیٹ پر نہیں، آپ فیصلہ کرتے ہیں کہ **کوئی authentication** نہ رکھیں، صرف مقامی نیٹ ورک تک رسائی پر بھروسہ کرتے ہوئے۔ + +پھر آپ کے صارفین میں سے کوئی اسے انسٹال اور مقامی طور پر چلا سکتا ہے۔ + +پھر وہ کوئی نقصان دہ ویب سائٹ کھول سکتا ہے، مثلاً: + +``` +https://evilhackers.example.com +``` + +اور وہ نقصان دہ ویب سائٹ `fetch()` سے `Blob` body کے ساتھ مقامی API کو requests بھیجتی ہے: + +``` +http://localhost:8000/v1/agents/multivac +``` + +حالانکہ نقصان دہ ویب سائٹ اور مقامی ایپ کا host مختلف ہے، browser CORS preflight request شروع نہیں کرے گا کیونکہ: + +* یہ بغیر کسی authentication کے چل رہا ہے، اسے کوئی credentials بھیجنے کی ضرورت نہیں۔ +* Browser سمجھتا ہے کہ یہ JSON نہیں بھیج رہا (غائب `Content-Type` header کی وجہ سے)۔ + +پھر نقصان دہ ویب سائٹ مقامی AI agent سے صارف کے سابق باس کو ناراض پیغامات بھیجوا سکتی ہے... یا اس سے بھی بدتر۔ + +## کھلا انٹرنیٹ { #open-internet } + +اگر آپ کی ایپ کھلے انٹرنیٹ پر ہے تو آپ "نیٹ ورک پر بھروسہ" نہیں کریں گے اور بغیر authentication کے کسی کو بھی مراعات یافتہ requests بھیجنے دیں گے۔ + +حملہ آور آسانی سے آپ کے API کو requests بھیجنے کے لیے script چلا سکتے ہیں، browser کی بات چیت کی ضرورت نہیں، تو آپ شاید پہلے سے کسی بھی مراعات یافتہ endpoint کو محفوظ کر رہے ہیں۔ + +اس صورت میں **یہ حملہ/خطرہ آپ پر لاگو نہیں ہوتا**۔ + +یہ خطرہ اور حملہ بنیادی طور پر اس وقت متعلق ہے جب ایپ **مقامی نیٹ ورک** پر چلتی ہے اور یہی **واحد فرض کردہ تحفظ** ہے۔ + +## Content-Type کے بغیر Requests کی اجازت { #allowing-requests-without-content-type } + +اگر آپ کو ایسے clients سپورٹ کرنے ہیں جو `Content-Type` header نہیں بھیجتے، تو آپ `strict_content_type=False` سیٹ کر کے سخت جانچ غیر فعال کر سکتے ہیں: + +{* ../../docs_src/strict_content_type/tutorial001_py310.py hl[4] *} + +اس setting کے ساتھ، بغیر `Content-Type` header والی requests کی body JSON کے طور پر parse ہوگی، جو FastAPI کے پرانے ورژنز کا وہی رویہ ہے۔ + +/// info | معلومات + +یہ رویہ اور ترتیب FastAPI 0.132.0 میں شامل کی گئی۔ + +/// diff --git a/docs/ur/docs/advanced/sub-applications.md b/docs/ur/docs/advanced/sub-applications.md new file mode 100644 index 000000000..5cf0bf56a --- /dev/null +++ b/docs/ur/docs/advanced/sub-applications.md @@ -0,0 +1,67 @@ +# Sub Applications - Mounts { #sub-applications-mounts } + +اگر آپ کو دو آزاد FastAPI ایپلیکیشنز رکھنی ہوں، جن کے اپنے آزاد OpenAPI اور اپنے docs UIs ہوں، تو آپ ایک مرکزی ایپ رکھ سکتے ہیں اور ایک (یا زیادہ) sub-application(s) "mount" کر سکتے ہیں۔ + +## **FastAPI** ایپلیکیشن mount کرنا { #mounting-a-fastapi-application } + +"Mounting" کا مطلب ہے ایک مکمل طور پر "آزاد" ایپلیکیشن کو کسی مخصوص path پر شامل کرنا، جو پھر اس path کے نیچے سب کچھ ہینڈل کرتی ہے، اس sub-application میں بیان کردہ _path operations_ کے ساتھ۔ + +### اعلیٰ سطح کی ایپلیکیشن { #top-level-application } + +سب سے پہلے، مرکزی، اعلیٰ سطح کی **FastAPI** ایپلیکیشن بنائیں، اور اس کی *path operations*: + +{* ../../docs_src/sub_applications/tutorial001_py310.py hl[3, 6:8] *} + +### Sub-application { #sub-application } + +پھر، اپنی sub-application بنائیں، اور اس کی *path operations*۔ + +یہ sub-application صرف ایک اور معیاری FastAPI ایپلیکیشن ہے، لیکن یہ وہ ہے جو "mount" ہوگی: + +{* ../../docs_src/sub_applications/tutorial001_py310.py hl[11, 14:16] *} + +### Sub-application mount کریں { #mount-the-sub-application } + +اپنی اعلیٰ سطح کی ایپلیکیشن `app` میں، sub-application `subapi` کو mount کریں۔ + +اس صورت میں، یہ path `/subapi` پر mount ہوگی: + +{* ../../docs_src/sub_applications/tutorial001_py310.py hl[11, 19] *} + +### خودکار API docs چیک کریں { #check-the-automatic-api-docs } + +اب، `fastapi` کمانڈ چلائیں: + +
+ +```console +$ fastapi dev + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +اور docs کو [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) پر کھولیں۔ + +آپ مرکزی ایپ کی خودکار API docs دیکھیں گے، جس میں صرف اس کی اپنی _path operations_ شامل ہوں گی: + + + +اور پھر، sub-application کی docs [http://127.0.0.1:8000/subapi/docs](http://127.0.0.1:8000/subapi/docs) پر کھولیں۔ + +آپ sub-application کی خودکار API docs دیکھیں گے، جس میں صرف اس کی اپنی _path operations_ شامل ہوں گی، سب درست sub-path prefix `/subapi` کے نیچے: + + + +اگر آپ دونوں user interfaces میں سے کسی کے ساتھ بات چیت کرنے کی کوشش کریں، تو وہ درست طریقے سے کام کریں گے، کیونکہ browser ہر مخصوص ایپ یا sub-app سے بات کر سکے گا۔ + +### تکنیکی تفصیلات: `root_path` { #technical-details-root-path } + +جب آپ اوپر بیان کردہ طریقے سے sub-application mount کرتے ہیں، FastAPI ASGI specification کے ایک مکینزم جسے `root_path` کہتے ہیں، استعمال کرکے sub-application کے mount path کو منتقل کرنے کا خیال رکھتا ہے۔ + +اس طریقے سے، sub-application کو docs UI کے لیے اس path prefix کو استعمال کرنے کا علم ہوگا۔ + +اور sub-application کی اپنی بھی mount شدہ sub-applications ہو سکتی ہیں اور سب کچھ درست طریقے سے کام کرے گا، کیونکہ FastAPI ان تمام `root_path`s کو خود بخود ہینڈل کرتا ہے۔ + +آپ `root_path` اور اسے واضح طور پر استعمال کرنے کے بارے میں مزید [Proxy کے پیچھے](behind-a-proxy.md) سیکشن میں جانیں گے۔ diff --git a/docs/ur/docs/advanced/templates.md b/docs/ur/docs/advanced/templates.md new file mode 100644 index 000000000..d0fba521c --- /dev/null +++ b/docs/ur/docs/advanced/templates.md @@ -0,0 +1,126 @@ +# Templates { #templates } + +آپ **FastAPI** کے ساتھ کوئی بھی template engine استعمال کر سکتے ہیں۔ + +ایک عام انتخاب Jinja2 ہے، وہی جو Flask اور دیگر ٹولز میں استعمال ہوتا ہے۔ + +اسے آسانی سے ترتیب دینے کے لیے utilities موجود ہیں جو آپ اپنی **FastAPI** ایپلیکیشن میں براہ راست استعمال کر سکتے ہیں (Starlette کی فراہم کردہ)۔ + +## Dependencies انسٹال کریں { #install-dependencies } + +یقینی بنائیں کہ آپ [virtual environment](../virtual-environments.md) بنائیں، اسے فعال کریں، اور `jinja2` انسٹال کریں: + +
+ +```console +$ pip install jinja2 + +---> 100% +``` + +
+ +## `Jinja2Templates` استعمال کرنا { #using-jinja2templates } + +* `Jinja2Templates` import کریں۔ +* ایک `templates` آبجیکٹ بنائیں جو آپ بعد میں دوبارہ استعمال کر سکیں۔ +* *path operation* میں `Request` parameter بیان کریں جو template واپس کرے گا۔ +* اپنے بنائے ہوئے `templates` کو render کرنے اور `TemplateResponse` واپس کرنے کے لیے استعمال کریں، template کا نام، request آبجیکٹ، اور Jinja2 template کے اندر استعمال ہونے والے key-value جوڑوں کے ساتھ ایک "context" dictionary پاس کریں۔ + +{* ../../docs_src/templates/tutorial001_py310.py hl[4,11,15:18] *} + +/// note | نوٹ + +FastAPI 0.108.0 اور Starlette 0.29.0 سے پہلے، `name` پہلا parameter تھا۔ + +نیز، اس سے پہلے، پچھلے ورژنز میں، `request` آبجیکٹ Jinja2 کے لیے context میں key-value جوڑوں کے حصے کے طور پر پاس کیا جاتا تھا۔ + +/// + +/// tip | مشورہ + +`response_class=HTMLResponse` بیان کرنے سے docs UI جان سکے گا کہ response HTML ہوگا۔ + +/// + +/// note | تکنیکی تفصیلات + +آپ `from starlette.templating import Jinja2Templates` بھی استعمال کر سکتے ہیں۔ + +**FastAPI** آپ کی سہولت کے لیے `starlette.templating` کو `fastapi.templating` کے طور پر فراہم کرتا ہے۔ لیکن زیادہ تر دستیاب responses براہ راست Starlette سے آتے ہیں۔ `Request` اور `StaticFiles` کے ساتھ بھی ایسا ہی ہے۔ + +/// + +## Templates لکھنا { #writing-templates } + +پھر آپ `templates/item.html` پر ایک template لکھ سکتے ہیں، مثال کے طور پر: + +```jinja hl_lines="7" +{!../../docs_src/templates/templates/item.html!} +``` + +### Template Context Values { #template-context-values } + +HTML میں جو یہ رکھتا ہے: + +{% raw %} + +```jinja +Item ID: {{ id }} +``` + +{% endraw %} + +...یہ آپ کی پاس کردہ "context" `dict` سے لیا گیا `id` دکھائے گا: + +```Python +{"id": id} +``` + +مثال کے طور پر، ID `42` کے ساتھ، یہ اس طرح render ہوگا: + +```html +Item ID: 42 +``` + +### Template `url_for` Arguments { #template-url-for-arguments } + +آپ template کے اندر `url_for()` بھی استعمال کر سکتے ہیں، یہ وہی arguments لیتا ہے جو آپ کے *path operation function* میں استعمال ہوتے۔ + +تو، یہ حصہ: + +{% raw %} + +```jinja + +``` + +{% endraw %} + +...اسی URL کا لنک بنائے گا جو *path operation function* `read_item(id=id)` کے ذریعے ہینڈل ہوگا۔ + +مثال کے طور پر، ID `42` کے ساتھ، یہ اس طرح render ہوگا: + +```html + +``` + +## Templates اور static فائلیں { #templates-and-static-files } + +آپ template کے اندر `url_for()` بھی استعمال کر سکتے ہیں، اور اسے مثال کے طور پر، `name="static"` کے ساتھ mount کی گئی `StaticFiles` کے ساتھ استعمال کر سکتے ہیں۔ + +```jinja hl_lines="4" +{!../../docs_src/templates/templates/item.html!} +``` + +اس مثال میں، یہ `static/styles.css` پر CSS فائل سے لنک کرے گا: + +```CSS hl_lines="4" +{!../../docs_src/templates/static/styles.css!} +``` + +اور چونکہ آپ `StaticFiles` استعمال کر رہے ہیں، وہ CSS فائل آپ کی **FastAPI** ایپلیکیشن کے ذریعے `/static/styles.css` URL پر خود بخود serve ہوگی۔ + +## مزید تفصیلات { #more-details } + +مزید تفصیلات کے لیے، بشمول templates کی جانچ کا طریقہ، [Starlette کی templates دستاویزات](https://www.starlette.dev/templates/) دیکھیں۔ diff --git a/docs/ur/docs/advanced/testing-dependencies.md b/docs/ur/docs/advanced/testing-dependencies.md new file mode 100644 index 000000000..e25f17f34 --- /dev/null +++ b/docs/ur/docs/advanced/testing-dependencies.md @@ -0,0 +1,53 @@ +# Overrides کے ساتھ Dependencies کی جانچ { #testing-dependencies-with-overrides } + +## جانچ کے دوران dependencies کو override کرنا { #overriding-dependencies-during-testing } + +کچھ ایسے منظرنامے ہیں جہاں آپ جانچ کے دوران کسی dependency کو override کرنا چاہیں گے۔ + +آپ نہیں چاہتے کہ اصل dependency چلے (اور نہ ہی اس کی sub-dependencies)۔ + +اس کی بجائے، آپ ایک مختلف dependency فراہم کرنا چاہتے ہیں جو صرف جانچ کے دوران استعمال ہو (ممکنہ طور پر صرف کچھ مخصوص ٹیسٹوں میں)، اور ایسی قدر فراہم کرے جو اصل dependency کی قدر کی جگہ استعمال ہو سکے۔ + +### استعمال کے مواقع: بیرونی سروس { #use-cases-external-service } + +ایک مثال یہ ہو سکتی ہے کہ آپ کے پاس ایک بیرونی authentication فراہم کنندہ ہے جسے آپ کو call کرنا ہے۔ + +آپ اسے ایک token بھیجتے ہیں اور وہ ایک authenticated صارف واپس کرتا ہے۔ + +یہ فراہم کنندہ شاید آپ سے فی request چارج کرتا ہو، اور اسے call کرنے میں ٹیسٹ کے لیے ایک مقررہ mock صارف رکھنے سے زیادہ وقت لگ سکتا ہے۔ + +آپ شاید بیرونی فراہم کنندہ کو ایک بار ٹیسٹ کرنا چاہتے ہیں، لیکن ہر ٹیسٹ کے لیے اسے call کرنا ضروری نہیں۔ + +اس صورت میں، آپ اس dependency کو override کر سکتے ہیں جو فراہم کنندہ کو call کرتی ہے، اور ایک حسب ضرورت dependency استعمال کر سکتے ہیں جو صرف آپ کے ٹیسٹوں کے لیے ایک mock صارف واپس کرتی ہے۔ + +### `app.dependency_overrides` attribute استعمال کریں { #use-the-app-dependency-overrides-attribute } + +ان صورتوں کے لیے، آپ کی **FastAPI** ایپلیکیشن میں ایک attribute `app.dependency_overrides` ہے، یہ ایک سادہ `dict` ہے۔ + +جانچ کے لیے dependency کو override کرنے کے لیے، آپ key کے طور پر اصل dependency (ایک function) رکھیں، اور value کے طور پر اپنی dependency override (ایک اور function)۔ + +اور پھر **FastAPI** اصل dependency کی بجائے اس override کو call کرے گا۔ + +{* ../../docs_src/dependency_testing/tutorial001_an_py310.py hl[26:27,30] *} + +/// tip | مشورہ + +آپ اپنی **FastAPI** ایپلیکیشن میں کہیں بھی استعمال ہونے والی dependency کے لیے dependency override سیٹ کر سکتے ہیں۔ + +اصل dependency *path operation function*، *path operation decorator* (جب آپ واپسی قدر استعمال نہیں کرتے)، `.include_router()` call وغیرہ میں استعمال ہو سکتی ہے۔ + +FastAPI پھر بھی اسے override کر سکے گا۔ + +/// + +پھر آپ `app.dependency_overrides` کو خالی `dict` بنا کر اپنے overrides کو ری سیٹ (ہٹا) سکتے ہیں: + +```Python +app.dependency_overrides = {} +``` + +/// tip | مشورہ + +اگر آپ صرف کچھ ٹیسٹوں کے دوران dependency override کرنا چاہتے ہیں، تو آپ ٹیسٹ کے شروع میں (test function کے اندر) override سیٹ کر سکتے ہیں اور آخر میں (test function کے آخر میں) اسے ری سیٹ کر سکتے ہیں۔ + +/// diff --git a/docs/ur/docs/advanced/testing-events.md b/docs/ur/docs/advanced/testing-events.md new file mode 100644 index 000000000..c2fb3e7d4 --- /dev/null +++ b/docs/ur/docs/advanced/testing-events.md @@ -0,0 +1,12 @@ +# Events کی جانچ: lifespan اور startup - shutdown { #testing-events-lifespan-and-startup-shutdown } + +جب آپ کو اپنے ٹیسٹوں میں `lifespan` چلانے کی ضرورت ہو، تو آپ `TestClient` کو `with` statement کے ساتھ استعمال کر سکتے ہیں: + +{* ../../docs_src/app_testing/tutorial004_py310.py hl[9:15,18,27:28,30:32,41:43] *} + + +آپ مزید تفصیلات ["Running lifespan in tests in the official Starlette documentation site."](https://www.starlette.dev/lifespan/#running-lifespan-in-tests) میں پڑھ سکتے ہیں۔ + +فرسودہ `startup` اور `shutdown` events کے لیے، آپ `TestClient` کو اس طرح استعمال کر سکتے ہیں: + +{* ../../docs_src/app_testing/tutorial003_py310.py hl[9:12,20:24] *} diff --git a/docs/ur/docs/advanced/testing-websockets.md b/docs/ur/docs/advanced/testing-websockets.md new file mode 100644 index 000000000..28385e8f3 --- /dev/null +++ b/docs/ur/docs/advanced/testing-websockets.md @@ -0,0 +1,13 @@ +# WebSockets کی جانچ { #testing-websockets } + +آپ WebSockets کی جانچ کے لیے وہی `TestClient` استعمال کر سکتے ہیں۔ + +اس کے لیے، آپ `TestClient` کو `with` statement میں استعمال کریں، WebSocket سے جڑتے ہوئے: + +{* ../../docs_src/app_testing/tutorial002_py310.py hl[27:31] *} + +/// note | نوٹ + +مزید تفصیلات کے لیے، [testing WebSockets](https://www.starlette.dev/testclient/#testing-websocket-sessions) کے بارے میں Starlette کی دستاویزات دیکھیں۔ + +/// diff --git a/docs/ur/docs/advanced/using-request-directly.md b/docs/ur/docs/advanced/using-request-directly.md new file mode 100644 index 000000000..d99312dc4 --- /dev/null +++ b/docs/ur/docs/advanced/using-request-directly.md @@ -0,0 +1,56 @@ +# Request کا براہ راست استعمال { #using-the-request-directly } + +اب تک، آپ request کے ان حصوں کو ان کی اقسام کے ساتھ بیان کرتے رہے ہیں جن کی آپ کو ضرورت ہے۔ + +ڈیٹا لے رہے ہیں: + +* Path سے بطور parameters۔ +* Headers سے۔ +* Cookies سے۔ +* وغیرہ۔ + +اور ایسا کرنے سے، **FastAPI** اس ڈیٹا کو validate کر رہا ہے، اسے تبدیل کر رہا ہے اور آپ کے API کے لیے خود بخود دستاویزات بنا رہا ہے۔ + +لیکن ایسے حالات ہیں جہاں آپ کو `Request` آبجیکٹ تک براہ راست رسائی کی ضرورت ہو سکتی ہے۔ + +## `Request` آبجیکٹ کی تفصیلات { #details-about-the-request-object } + +چونکہ **FastAPI** دراصل اوپر کئی ٹولز کی تہہ کے ساتھ **Starlette** ہے، آپ Starlette کے [`Request`](https://www.starlette.dev/requests/) آبجیکٹ کو ضرورت پڑنے پر براہ راست استعمال کر سکتے ہیں۔ + +اس کا مطلب یہ بھی ہوگا کہ اگر آپ `Request` آبجیکٹ سے براہ راست ڈیٹا حاصل کریں (مثلاً body پڑھیں) تو اسے FastAPI کے ذریعے validate، تبدیل یا دستاویز (OpenAPI کے ساتھ، خودکار API user interface کے لیے) نہیں کیا جائے گا۔ + +حالانکہ عام طور پر بیان کردہ کوئی بھی دوسرا parameter (مثلاً Pydantic model کے ساتھ body) پھر بھی validate، تبدیل، annotate وغیرہ ہوگا۔ + +لیکن مخصوص صورتیں ہیں جہاں `Request` آبجیکٹ حاصل کرنا مفید ہے۔ + +## `Request` آبجیکٹ کا براہ راست استعمال { #use-the-request-object-directly } + +فرض کریں آپ اپنے *path operation function* کے اندر client کا IP address/host حاصل کرنا چاہتے ہیں۔ + +اس کے لیے آپ کو request تک براہ راست رسائی درکار ہے۔ + +{* ../../docs_src/using_request_directly/tutorial001_py310.py hl[1,7:8] *} + +*path operation function* parameter کی قسم `Request` بیان کرنے سے **FastAPI** جان لے گا کہ اس parameter میں `Request` پاس کرنا ہے۔ + +/// tip | مشورہ + +غور کریں کہ اس صورت میں، ہم request parameter کے ساتھ ساتھ path parameter بھی بیان کر رہے ہیں۔ + +تو، path parameter نکالا جائے گا، validate ہوگا، مخصوص قسم میں تبدیل ہوگا اور OpenAPI کے ساتھ annotate ہوگا۔ + +اسی طرح، آپ عام طریقے سے کوئی بھی دوسرا parameter بیان کر سکتے ہیں، اور اس کے ساتھ `Request` بھی حاصل کر سکتے ہیں۔ + +/// + +## `Request` دستاویزات { #request-documentation } + +آپ [`Request` آبجیکٹ کے بارے میں مزید تفصیلات Starlette کی سرکاری دستاویزات سائٹ](https://www.starlette.dev/requests/) پر پڑھ سکتے ہیں۔ + +/// note | تکنیکی تفصیلات + +آپ `from starlette.requests import Request` بھی استعمال کر سکتے ہیں۔ + +**FastAPI** اسے آپ کی سہولت کے لیے براہ راست فراہم کرتا ہے۔ لیکن یہ براہ راست Starlette سے آتا ہے۔ + +/// diff --git a/docs/ur/docs/advanced/websockets.md b/docs/ur/docs/advanced/websockets.md new file mode 100644 index 000000000..5558fbd44 --- /dev/null +++ b/docs/ur/docs/advanced/websockets.md @@ -0,0 +1,186 @@ +# WebSockets { #websockets } + +آپ **FastAPI** کے ساتھ [WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) استعمال کر سکتے ہیں۔ + +## `websockets` انسٹال کریں { #install-websockets } + +یقینی بنائیں کہ آپ [virtual environment](../virtual-environments.md) بنائیں، اسے فعال کریں، اور `websockets` انسٹال کریں (ایک Python لائبریری جو "WebSocket" protocol کو آسانی سے استعمال کرنے کی سہولت دیتی ہے): + +
+ +```console +$ pip install websockets + +---> 100% +``` + +
+ +## WebSockets client { #websockets-client } + +### پروڈکشن میں { #in-production } + +آپ کے پروڈکشن سسٹم میں، شاید آپ کے پاس React، Vue.js یا Angular جیسے جدید framework سے بنایا گیا frontend ہوگا۔ + +اور اپنے backend کے ساتھ WebSockets سے رابطہ کرنے کے لیے آپ شاید اپنے frontend کی utilities استعمال کریں گے۔ + +یا آپ کے پاس کوئی native mobile ایپلیکیشن ہو سکتی ہے جو براہ راست native code میں آپ کے WebSocket backend سے رابطہ کرتی ہو۔ + +یا آپ کے پاس WebSocket endpoint سے رابطہ کرنے کا کوئی اور طریقہ ہو سکتا ہے۔ + +--- + +لیکن اس مثال کے لیے، ہم کچھ JavaScript کے ساتھ ایک بہت سادہ HTML document استعمال کریں گے، سب ایک لمبی string کے اندر۔ + +یہ یقیناً بہترین طریقہ نہیں ہے اور آپ اسے پروڈکشن میں استعمال نہیں کریں گے۔ + +پروڈکشن میں آپ کے پاس اوپر بتائے گئے آپشنز میں سے ایک ہوگا۔ + +لیکن WebSockets کی server-side پر توجہ مرکوز کرنے اور ایک کام کرنے والی مثال رکھنے کا یہ سب سے آسان طریقہ ہے: + +{* ../../docs_src/websockets_/tutorial001_py310.py hl[2,6:38,41:43] *} + +## `websocket` بنائیں { #create-a-websocket } + +اپنی **FastAPI** ایپلیکیشن میں، ایک `websocket` بنائیں: + +{* ../../docs_src/websockets_/tutorial001_py310.py hl[1,46:47] *} + +/// note | تکنیکی تفصیلات + +آپ `from starlette.websockets import WebSocket` بھی استعمال کر سکتے ہیں۔ + +**FastAPI** آپ کی سہولت کے لیے وہی `WebSocket` براہ راست فراہم کرتا ہے۔ لیکن یہ براہ راست Starlette سے آتا ہے۔ + +/// + +## پیغامات کا انتظار کریں اور پیغامات بھیجیں { #await-for-messages-and-send-messages } + +اپنے WebSocket route میں آپ پیغامات کا `await` کر سکتے ہیں اور پیغامات بھیج سکتے ہیں۔ + +{* ../../docs_src/websockets_/tutorial001_py310.py hl[48:52] *} + +آپ binary، text، اور JSON ڈیٹا وصول اور بھیج سکتے ہیں۔ + +## آزمائیں { #try-it } + +اپنا کوڈ `main.py` فائل میں رکھیں اور پھر اپنی ایپلیکیشن چلائیں: + +
+ +```console +$ fastapi dev + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +اپنا browser [http://127.0.0.1:8000](http://127.0.0.1:8000) پر کھولیں۔ + +آپ کو ایک سادہ صفحہ نظر آئے گا: + + + +آپ input باکس میں پیغامات ٹائپ کر کے بھیج سکتے ہیں: + + + +اور آپ کی WebSockets والی **FastAPI** ایپلیکیشن واپس جواب دے گی: + + + +آپ بہت سے پیغامات بھیج (اور وصول کر) سکتے ہیں: + + + +اور یہ سب ایک ہی WebSocket connection استعمال کریں گے۔ + +## `Depends` اور دیگر کا استعمال { #using-depends-and-others } + +WebSocket endpoints میں آپ `fastapi` سے import کر کے استعمال کر سکتے ہیں: + +* `Depends` +* `Security` +* `Cookie` +* `Header` +* `Path` +* `Query` + +یہ دوسرے FastAPI endpoints/*path operations* کی طرح ہی کام کرتے ہیں: + +{* ../../docs_src/websockets_/tutorial002_an_py310.py hl[68:69,82] *} + +/// info | معلومات + +چونکہ یہ WebSocket ہے تو `HTTPException` raise کرنا واقعی مناسب نہیں ہے، اس کی بجائے ہم `WebSocketException` raise کرتے ہیں۔ + +آپ [specification میں بیان کردہ درست codes](https://tools.ietf.org/html/rfc6455#section-7.4.1) سے closing code استعمال کر سکتے ہیں۔ + +/// + +### Dependencies کے ساتھ WebSockets آزمائیں { #try-the-websockets-with-dependencies } + +اپنی ایپلیکیشن چلائیں: + +
+ +```console +$ fastapi dev + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +اپنا browser [http://127.0.0.1:8000](http://127.0.0.1:8000) پر کھولیں۔ + +وہاں آپ سیٹ کر سکتے ہیں: + +* "Item ID"، جو path میں استعمال ہوتا ہے۔ +* "Token" جو query parameter کے طور پر استعمال ہوتا ہے۔ + +/// tip | مشورہ + +غور کریں کہ query `token` کو dependency کے ذریعے ہینڈل کیا جائے گا۔ + +/// + +اس کے ساتھ آپ WebSocket سے جڑ سکتے ہیں اور پھر پیغامات بھیج اور وصول کر سکتے ہیں: + + + +## منقطع ہونے اور متعدد clients کو سنبھالنا { #handling-disconnections-and-multiple-clients } + +جب WebSocket connection بند ہوتا ہے تو `await websocket.receive_text()` ایک `WebSocketDisconnect` exception raise کرتا ہے، جسے آپ اس مثال کی طرح پکڑ کر ہینڈل کر سکتے ہیں۔ + +{* ../../docs_src/websockets_/tutorial003_py310.py hl[79:81] *} + +آزمانے کے لیے: + +* ایپ کو کئی browser tabs میں کھولیں۔ +* ان سے پیغامات لکھیں۔ +* پھر ان میں سے ایک tab بند کریں۔ + +اس سے `WebSocketDisconnect` exception raise ہوگا، اور باقی تمام clients کو اس طرح کا پیغام ملے گا: + +``` +Client #1596980209979 left the chat +``` + +/// tip | مشورہ + +اوپر والی ایپ ایک کم سے کم اور سادہ مثال ہے جو یہ ظاہر کرتی ہے کہ کئی WebSocket connections پر پیغامات کیسے ہینڈل اور broadcast کیے جائیں۔ + +لیکن یاد رکھیں کہ، چونکہ سب کچھ memory میں ایک واحد فہرست میں ہینڈل ہو رہا ہے، یہ صرف اس وقت تک کام کرے گا جب تک process چل رہا ہے، اور صرف ایک واحد process کے ساتھ کام کرے گا۔ + +اگر آپ کو کچھ ایسا چاہیے جو FastAPI کے ساتھ آسانی سے integrate ہو لیکن زیادہ مضبوط ہو، Redis، PostgreSQL یا دیگر کی سپورٹ رکھتا ہو، تو [encode/broadcaster](https://github.com/encode/broadcaster) دیکھیں۔ + +/// + +## مزید معلومات { #more-info } + +آپشنز کے بارے میں مزید جاننے کے لیے، Starlette کی دستاویزات دیکھیں: + +* [`WebSocket` class](https://www.starlette.dev/websockets/) +* [Class پر مبنی WebSocket ہینڈلنگ](https://www.starlette.dev/endpoints/#websocketendpoint) diff --git a/docs/ur/docs/advanced/wsgi.md b/docs/ur/docs/advanced/wsgi.md new file mode 100644 index 000000000..6ab49f47f --- /dev/null +++ b/docs/ur/docs/advanced/wsgi.md @@ -0,0 +1,51 @@ +# WSGI شامل کرنا - Flask, Django, اور دیگر { #including-wsgi-flask-django-others } + +آپ WSGI ایپلیکیشنز کو mount کر سکتے ہیں جیسا کہ آپ نے [Sub Applications - Mounts](sub-applications.md) اور [Proxy کے پیچھے](behind-a-proxy.md) میں دیکھا۔ + +اس کے لیے، آپ `WSGIMiddleware` استعمال کر سکتے ہیں اور اسے اپنی WSGI ایپلیکیشن، مثلاً Flask، Django وغیرہ کو wrap کرنے کے لیے استعمال کر سکتے ہیں۔ + +## `WSGIMiddleware` استعمال کرنا { #using-wsgimiddleware } + +/// info | معلومات + +اس کے لیے `a2wsgi` انسٹال کرنا ضروری ہے، مثال کے طور پر `pip install a2wsgi` سے۔ + +/// + +آپ کو `a2wsgi` سے `WSGIMiddleware` import کرنا ہوگا۔ + +پھر WSGI (مثلاً Flask) ایپ کو middleware کے ساتھ wrap کریں۔ + +اور پھر اسے ایک path کے نیچے mount کریں۔ + +{* ../../docs_src/wsgi/tutorial001_py310.py hl[1,3,23] *} + +/// note | نوٹ + +پہلے، `fastapi.middleware.wsgi` سے `WSGIMiddleware` استعمال کرنے کی سفارش کی جاتی تھی، لیکن اب یہ deprecated ہے۔ + +اس کی بجائے `a2wsgi` پیکیج استعمال کرنے کی تجویز دی جاتی ہے۔ استعمال کا طریقہ وہی رہتا ہے۔ + +بس یقینی بنائیں کہ `a2wsgi` پیکیج انسٹال ہے اور `WSGIMiddleware` کو `a2wsgi` سے درست طریقے سے import کریں۔ + +/// + +## چیک کریں { #check-it } + +اب، `/v1/` path کے نیچے ہر request Flask ایپلیکیشن کے ذریعے ہینڈل ہوگی۔ + +اور باقی **FastAPI** کے ذریعے ہینڈل ہوں گی۔ + +اگر آپ اسے چلائیں اور [http://localhost:8000/v1/](http://localhost:8000/v1/) پر جائیں تو آپ کو Flask کا response نظر آئے گا: + +```txt +Hello, World from Flask! +``` + +اور اگر آپ [http://localhost:8000/v2](http://localhost:8000/v2) پر جائیں تو آپ کو FastAPI کا response نظر آئے گا: + +```JSON +{ + "message": "Hello World" +} +``` diff --git a/docs/ur/docs/alternatives.md b/docs/ur/docs/alternatives.md new file mode 100644 index 000000000..9af47c362 --- /dev/null +++ b/docs/ur/docs/alternatives.md @@ -0,0 +1,485 @@ +# متبادل، تحریک اور موازنے { #alternatives-inspiration-and-comparisons } + +**FastAPI** کو کس چیز نے تحریک دی، یہ متبادل سے کیسے موازنہ کرتا ہے اور اس نے ان سے کیا سیکھا۔ + +## تعارف { #intro } + +**FastAPI** موجود نہ ہوتا اگر دوسروں کا پچھلا کام نہ ہوتا۔ + +پہلے بہت سے tools بنائے گئے ہیں جنہوں نے اس کی تخلیق کی تحریک دی۔ + +میں کئی سالوں سے نیا framework بنانے سے گریز کرتا رہا۔ پہلے میں نے **FastAPI** کی تمام features کو بہت سے مختلف frameworks، plug-ins، اور tools استعمال کرکے حل کرنے کی کوشش کی۔ + +لیکن کسی وقت، کوئی اور راستہ نہیں تھا سوائے اس کے کہ کچھ ایسا بنایا جائے جو یہ تمام features فراہم کرے، پچھلے tools سے بہترین آئیڈیاز لے کر، اور انہیں بہترین ممکنہ طریقے سے ملا کر، زبان کی ان features کو استعمال کرتے ہوئے جو پہلے دستیاب نہیں تھیں (Python 3.6+ type hints)۔ + +## پچھلے tools { #previous-tools } + +### [Django](https://www.djangoproject.com/) { #django } + +یہ سب سے مقبول Python framework ہے اور وسیع پیمانے پر قابل اعتماد ہے۔ اسے Instagram جیسے systems بنانے کے لیے استعمال کیا جاتا ہے۔ + +یہ relational databases (جیسے MySQL یا PostgreSQL) کے ساتھ نسبتاً مضبوطی سے جڑا ہوا ہے، تو NoSQL database (جیسے Couchbase، MongoDB، Cassandra وغیرہ) کو بنیادی storage engine کے طور پر رکھنا بہت آسان نہیں ہے۔ + +یہ backend میں HTML بنانے کے لیے بنایا گیا تھا، نہ کہ جدید frontend (جیسے React، Vue.js اور Angular) یا دوسرے systems (جیسے IoT devices) کے ذریعے استعمال ہونے والی APIs بنانے کے لیے۔ + +### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework } + +Django REST framework اس لیے بنایا گیا تاکہ Django کے نیچے استعمال کرتے ہوئے Web APIs بنانے کا ایک لچکدار toolkit فراہم کیا جائے، تاکہ اس کی API صلاحیتوں کو بہتر بنایا جا سکے۔ + +اسے Mozilla، Red Hat اور Eventbrite سمیت بہت سی کمپنیاں استعمال کرتی ہیں۔ + +یہ **خودکار API documentation** کی پہلی مثالوں میں سے ایک تھا، اور یہ خاص طور پر ان پہلے آئیڈیاز میں سے ایک تھا جنہوں نے **FastAPI** کی "تلاش" کی تحریک دی۔ + +/// note | نوٹ + +Django REST Framework Tom Christie نے بنایا تھا۔ Starlette اور Uvicorn کے وہی بانی، جن پر **FastAPI** مبنی ہے۔ + +/// + +/// check | **FastAPI** کو تحریک دی + +خودکار API documentation web user interface رکھنے کی۔ + +/// + +### [Flask](https://flask.palletsprojects.com) { #flask } + +Flask ایک "microframework" ہے، اس میں database integrations یا وہ بہت سی چیزیں شامل نہیں ہیں جو Django میں بطور default آتی ہیں۔ + +اس سادگی اور لچک کی وجہ سے NoSQL databases کو بنیادی data storage system کے طور پر استعمال کرنا ممکن ہوتا ہے۔ + +چونکہ یہ بہت سادہ ہے، سیکھنا نسبتاً بدیہی ہے، حالانکہ documentation کچھ مقامات پر تکنیکی ہو جاتی ہے۔ + +اسے عام طور پر ان applications کے لیے بھی استعمال کیا جاتا ہے جن کو ضروری نہیں کہ database، user management، یا Django میں پہلے سے بنی بہت سی features کی ضرورت ہو۔ حالانکہ ان میں سے بہت سی features plug-ins کے ساتھ شامل کی جا سکتی ہیں۔ + +حصوں کی یہ علیحدگی، اور ایک "microframework" ہونا جسے بالکل ضرورت کے مطابق بڑھایا جا سکے، ایک اہم خصوصیت تھی جسے میں برقرار رکھنا چاہتا تھا۔ + +Flask کی سادگی کو دیکھتے ہوئے، یہ APIs بنانے کے لیے اچھا انتخاب لگا۔ اگلی چیز Flask کے لیے ایک "Django REST Framework" تلاش کرنا تھی۔ + +/// check | **FastAPI** کو تحریک دی + +ایک micro-framework ہونے کی۔ ضرورت کے مطابق tools اور حصوں کو ملانا آسان بنانے کی۔ + +سادہ اور استعمال میں آسان routing system رکھنے کی۔ + +/// + +### [Requests](https://requests.readthedocs.io) { #requests } + +**FastAPI** دراصل **Requests** کا متبادل نہیں ہے۔ ان کا دائرہ کار بہت مختلف ہے۔ + +درحقیقت FastAPI application کے *اندر* Requests استعمال کرنا عام ہوگا۔ + +لیکن پھر بھی، FastAPI نے Requests سے کافی تحریک لی۔ + +**Requests** APIs کے ساتھ *تعامل* کرنے (بطور client) کی library ہے، جبکہ **FastAPI** APIs *بنانے* (بطور server) کی library ہے۔ + +وہ کم و بیش مخالف سروں پر ہیں، ایک دوسرے کی تکمیل کرتے ہیں۔ + +Requests کا بہت سادہ اور بدیہی ڈیزائن ہے، یہ استعمال میں بہت آسان ہے، معقول defaults کے ساتھ۔ لیکن ساتھ ہی، یہ بہت طاقتور اور حسب ضرورت بنانے کے قابل ہے۔ + +اسی لیے، جیسا کہ سرکاری ویب سائٹ پر کہا گیا ہے: + +> Requests ہر وقت کے سب سے زیادہ download کیے جانے والے Python packages میں سے ایک ہے + +اسے استعمال کرنے کا طریقہ بہت سادہ ہے۔ مثال کے طور پر، `GET` request کرنے کے لیے، آپ یہ لکھیں گے: + +```Python +response = requests.get("http://example.com/some/url") +``` + +FastAPI کا مساوی API *path operation* اس طرح نظر آ سکتا ہے: + +```Python hl_lines="1" +@app.get("/some/url") +def read_url(): + return {"message": "Hello World"} +``` + +`requests.get(...)` اور `@app.get(...)` میں مماثلت دیکھیں۔ + +/// check | **FastAPI** کو تحریک دی + +* سادہ اور بدیہی API رکھنے کی۔ +* HTTP method names (operations) کو براہ راست، سیدھے اور بدیہی طریقے سے استعمال کرنے کی۔ +* معقول defaults رکھنے کی، لیکن طاقتور customizations کے ساتھ۔ + +/// + +### [Swagger](https://swagger.io/) / [OpenAPI](https://github.com/OAI/OpenAPI-Specification/) { #swagger-openapi } + +Django REST Framework سے مجھے جو بنیادی feature چاہیے تھا وہ خودکار API documentation تھا۔ + +پھر مجھے پتا چلا کہ JSON (یا YAML، JSON کی ایک extension) استعمال کرکے APIs کو document کرنے کا ایک standard ہے جسے Swagger کہتے ہیں۔ + +اور Swagger APIs کے لیے ایک web user interface پہلے سے بنایا گیا تھا۔ تو، کسی API کے لیے Swagger documentation بنا سکنے سے اس web user interface کو خودکار طور پر استعمال کرنا ممکن ہو جائے گا۔ + +کسی وقت، Swagger کو Linux Foundation کو دے دیا گیا، اور اس کا نام OpenAPI رکھا گیا۔ + +اسی لیے ورژن 2.0 کے بارے میں بات کرتے وقت عام طور پر "Swagger" کہا جاتا ہے، اور ورژن 3+ کے لیے "OpenAPI"۔ + +/// check | **FastAPI** کو تحریک دی + +API specifications کے لیے ایک کھلا standard اپنانے اور استعمال کرنے کی، حسب ضرورت schema کی بجائے۔ + +اور standards پر مبنی user interface tools کو مربوط کرنے کی: + +* [Swagger UI](https://github.com/swagger-api/swagger-ui) +* [ReDoc](https://github.com/Rebilly/ReDoc) + +یہ دونوں کافی مقبول اور مستحکم ہونے کی وجہ سے منتخب کیے گئے، لیکن تیز تلاش سے آپ OpenAPI کے لیے درجنوں متبادل user interfaces تلاش کر سکتے ہیں (جنہیں آپ **FastAPI** کے ساتھ استعمال کر سکتے ہیں)۔ + +/// + +### Flask REST frameworks { #flask-rest-frameworks } + +کئی Flask REST frameworks ہیں، لیکن ان کی تحقیق میں وقت اور محنت لگانے کے بعد، میں نے پایا کہ بہت سے بند یا ترک کر دیے گئے ہیں، کئی کھڑے مسائل کے ساتھ جو انہیں ناموزوں بناتے ہیں۔ + +### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow } + +API systems کی ایک بنیادی ضرورت data "serialization" ہے جو code (Python) سے data لے کر اسے network پر بھیجی جا سکنے والی چیز میں تبدیل کرتی ہے۔ مثلاً، database سے data رکھنے والے object کو JSON object میں تبدیل کرنا۔ `datetime` objects کو strings میں تبدیل کرنا، وغیرہ۔ + +APIs کی ایک اور بڑی ضرورت data validation ہے، یہ یقینی بنانا کہ data درست ہے مخصوص parameters کے مطابق۔ مثلاً، کوئی field `int` ہے نہ کہ کوئی random string۔ یہ آنے والے data کے لیے خاص طور پر مفید ہے۔ + +Data validation system کے بغیر، آپ کو code میں تمام checks خود کرنے ہوں گے۔ + +یہی features ہیں جو Marshmallow فراہم کرنے کے لیے بنایا گیا تھا۔ یہ ایک بہترین library ہے، اور میں نے اسے پہلے بہت استعمال کیا ہے۔ + +لیکن یہ Python type hints سے پہلے بنایا گیا تھا۔ تو ہر schema define کرنے کے لیے Marshmallow کی فراہم کردہ مخصوص utils اور classes استعمال کرنی ہوتی ہیں۔ + +/// check | **FastAPI** کو تحریک دی + +Data types اور validation فراہم کرنے والے "schemas" define کرنے کے لیے code استعمال کرنے کی، خودکار طور پر۔ + +/// + +### [Webargs](https://webargs.readthedocs.io/en/latest/) { #webargs } + +APIs کی ایک اور بڑی ضرورت آنے والی requests سے data parsing ہے۔ + +Webargs ایک tool ہے جو کئی frameworks بشمول Flask کے اوپر یہ سہولت فراہم کرنے کے لیے بنایا گیا تھا۔ + +یہ data validation کے لیے Marshmallow استعمال کرتا ہے۔ اور اسے انہی developers نے بنایا تھا۔ + +یہ ایک بہترین tool ہے اور میں نے اسے بھی **FastAPI** سے پہلے بہت استعمال کیا ہے۔ + +/// info | معلومات + +Webargs وہی Marshmallow developers نے بنایا تھا۔ + +/// + +/// check | **FastAPI** کو تحریک دی + +آنے والے request data کی خودکار validation رکھنے کی۔ + +/// + +### [APISpec](https://apispec.readthedocs.io/en/stable/) { #apispec } + +Marshmallow اور Webargs plug-ins کے طور پر validation، parsing اور serialization فراہم کرتے ہیں۔ + +لیکن documentation ابھی بھی نہیں تھی۔ پھر APISpec بنایا گیا۔ + +یہ بہت سے frameworks کے لیے plug-in ہے (اور Starlette کے لیے بھی ایک plug-in ہے)۔ + +یہ اس طرح کام کرتا ہے کہ آپ route handle کرنے والے ہر function کی docstring میں YAML فارمیٹ استعمال کرکے schema کی definition لکھتے ہیں۔ + +اور یہ OpenAPI schemas بناتا ہے۔ + +Flask، Starlette، Responder وغیرہ میں یہی طریقہ ہے۔ + +لیکن پھر، ہمارے پاس دوبارہ Python string (ایک بڑا YAML) کے اندر ایک micro-syntax کا مسئلہ ہے۔ + +Editor اس میں زیادہ مدد نہیں کر سکتا۔ اور اگر ہم parameters یا Marshmallow schemas تبدیل کریں اور وہ YAML docstring بھی اپڈیٹ کرنا بھول جائیں، تو بنایا گیا schema متروک ہو جائے گا۔ + +/// info | معلومات + +APISpec وہی Marshmallow developers نے بنایا تھا۔ + +/// + +/// check | **FastAPI** کو تحریک دی + +APIs کے لیے کھلے standard، OpenAPI، کی حمایت کرنے کی۔ + +/// + +### [Flask-apispec](https://flask-apispec.readthedocs.io/en/latest/) { #flask-apispec } + +یہ ایک Flask plug-in ہے، جو Webargs، Marshmallow اور APISpec کو جوڑتا ہے۔ + +یہ Webargs اور Marshmallow سے معلومات استعمال کرکے APISpec کے ذریعے خودکار OpenAPI schemas بناتا ہے۔ + +یہ ایک بہترین tool ہے، بہت کم قدردانی حاصل۔ اسے وہاں بہت سے Flask plug-ins سے زیادہ مقبول ہونا چاہیے۔ اس کی وجہ شاید اس کی documentation کا بہت مختصر اور تجریدی ہونا ہے۔ + +اس نے Python docstrings کے اندر YAML (ایک اور syntax) لکھنے کا مسئلہ حل کیا۔ + +Flask، Flask-apispec بمع Marshmallow اور Webargs کا یہ مجموعہ **FastAPI** بنانے تک میرا پسندیدہ backend stack تھا۔ + +اسے استعمال کرنے سے کئی Flask full-stack generators بنے۔ یہ وہ بنیادی stacks ہیں جو میں (اور کئی بیرونی ٹیمیں) اب تک استعمال کرتے رہے ہیں: + +* [https://github.com/tiangolo/full-stack](https://github.com/tiangolo/full-stack) +* [https://github.com/tiangolo/full-stack-flask-couchbase](https://github.com/tiangolo/full-stack-flask-couchbase) +* [https://github.com/tiangolo/full-stack-flask-couchdb](https://github.com/tiangolo/full-stack-flask-couchdb) + +اور یہی full-stack generators [**FastAPI** Project Generators](project-generation.md) کی بنیاد تھے۔ + +/// info | معلومات + +Flask-apispec وہی Marshmallow developers نے بنایا تھا۔ + +/// + +/// check | **FastAPI** کو تحریک دی + +اسی code سے جو serialization اور validation define کرتا ہے، خودکار طور پر OpenAPI schema بنانے کی۔ + +/// + +### [NestJS](https://nestjs.com/) (اور [Angular](https://angular.io/)) { #nestjs-and-angular } + +یہ Python بھی نہیں ہے، NestJS ایک JavaScript (TypeScript) NodeJS framework ہے جو Angular سے تحریک یافتہ ہے۔ + +یہ کچھ حد تک ایسا ہی حاصل کرتا ہے جو Flask-apispec سے کیا جا سکتا ہے۔ + +اس میں Angular 2 سے تحریک یافتہ ایک مربوط dependency injection system ہے۔ اسے "injectables" کو پہلے سے register کرنا ضروری ہے (جیسے میں جانتا ہوں تمام dependency injection systems)، تو یہ طوالت اور code کی تکرار میں اضافہ کرتا ہے۔ + +چونکہ parameters TypeScript types سے بیان کیے جاتے ہیں (Python type hints کی طرح)، editor support کافی اچھا ہے۔ + +لیکن چونکہ TypeScript data JavaScript میں compile ہونے کے بعد محفوظ نہیں رہتا، یہ validation، serialization اور documentation ایک ساتھ define کرنے کے لیے types پر انحصار نہیں کر سکتا۔ اس اور کچھ design فیصلوں کی وجہ سے، validation، serialization اور خودکار schema generation حاصل کرنے کے لیے بہت سی جگہوں پر decorators شامل کرنے ہوتے ہیں۔ تو یہ کافی طویل ہو جاتا ہے۔ + +یہ nested models کو بہت اچھی طرح سنبھال نہیں سکتا۔ تو اگر request میں JSON body ایک JSON object ہے جس میں اندر کے fields بدلے میں nested JSON objects ہیں، تو اسے ٹھیک سے document اور validate نہیں کیا جا سکتا۔ + +/// check | **FastAPI** کو تحریک دی + +بہترین editor support حاصل کرنے کے لیے Python types استعمال کرنے کی۔ + +طاقتور dependency injection system رکھنے کی۔ Code کی تکرار کم کرنے کا طریقہ ڈھونڈنے کی۔ + +/// + +### [Sanic](https://sanic.readthedocs.io/en/latest/) { #sanic } + +یہ `asyncio` پر مبنی انتہائی تیز Python frameworks میں سے پہلے تھا۔ اسے Flask سے بہت ملتا جلتا بنایا گیا تھا۔ + +/// note | تکنیکی تفصیلات + +اس نے default Python `asyncio` loop کی بجائے [`uvloop`](https://github.com/MagicStack/uvloop) استعمال کیا۔ یہی اسے اتنا تیز بنایا۔ + +اس نے واضح طور پر Uvicorn اور Starlette کو تحریک دی، جو فی الحال کھلے benchmarks میں Sanic سے تیز ہیں۔ + +/// + +/// check | **FastAPI** کو تحریک دی + +زبردست performance حاصل کرنے کا طریقہ ڈھونڈنے کی۔ + +اسی لیے **FastAPI** Starlette پر مبنی ہے، کیونکہ یہ دستیاب تیز ترین framework ہے (third-party benchmarks سے ٹیسٹ شدہ)۔ + +/// + +### [Falcon](https://falconframework.org/) { #falcon } + +Falcon ایک اور اعلیٰ performance Python framework ہے، اسے کم سے کم ہونے کے لیے ڈیزائن کیا گیا ہے، اور دوسرے frameworks جیسے Hug کی بنیاد کے طور پر کام کرنے کے لیے۔ + +اسے ایسے functions رکھنے کے لیے ڈیزائن کیا گیا ہے جو دو parameters وصول کرتے ہیں، ایک "request" اور ایک "response"۔ پھر آپ request سے حصے "پڑھتے" ہیں، اور response میں حصے "لکھتے" ہیں۔ اس ڈیزائن کی وجہ سے، function parameters کے طور پر standard Python type hints کے ساتھ request parameters اور bodies declare کرنا ممکن نہیں ہے۔ + +تو data validation، serialization، اور documentation code میں کرنی ہوتی ہے، خودکار طور پر نہیں۔ یا انہیں Falcon کے اوپر framework کے طور پر implement کرنا ہوتا ہے، جیسے Hug۔ یہی فرق ان دوسرے frameworks میں ہوتا ہے جو Falcon کے ڈیزائن سے تحریک یافتہ ہیں، ایک request object اور ایک response object بطور parameters رکھنے کا۔ + +/// check | **FastAPI** کو تحریک دی + +بہترین performance حاصل کرنے کے طریقے ڈھونڈنے کی۔ + +Hug کے ساتھ مل کر (چونکہ Hug، Falcon پر مبنی ہے) **FastAPI** کو functions میں `response` parameter declare کرنے کی تحریک دی۔ + +حالانکہ FastAPI میں یہ اختیاری ہے، اور بنیادی طور پر headers، cookies، اور متبادل status codes سیٹ کرنے کے لیے استعمال ہوتا ہے۔ + +/// + +### [Molten](https://moltenframework.com/) { #molten } + +میں نے **FastAPI** بنانے کے ابتدائی مراحل میں Molten دریافت کیا۔ اور اس کے کافی ملتے جلتے آئیڈیاز ہیں: + +* Python type hints پر مبنی۔ +* ان types سے validation اور documentation۔ +* Dependency Injection system۔ + +یہ Pydantic جیسی data validation، serialization اور documentation third-party library استعمال نہیں کرتا، بلکہ اس کی اپنی ہے۔ تو یہ data type definitions آسانی سے دوبارہ استعمال نہیں ہوتیں۔ + +اسے تھوڑی زیادہ verbose configurations کی ضرورت ہے۔ اور چونکہ یہ WSGI (ASGI کی بجائے) پر مبنی ہے، اسے Uvicorn، Starlette اور Sanic جیسے tools کی اعلیٰ performance کا فائدہ اٹھانے کے لیے ڈیزائن نہیں کیا گیا۔ + +Dependency injection system dependencies کو پہلے سے register کرنے اور declare کیے گئے types کی بنیاد پر resolve کرنے کی ضرورت ہے۔ تو ایک مخصوص type فراہم کرنے والے ایک سے زیادہ "component" declare کرنا ممکن نہیں ہے۔ + +Routes ایک ہی جگہ declare کیے جاتے ہیں، دوسری جگہوں پر declare کیے گئے functions کا استعمال کرتے ہوئے (endpoint handle کرنے والے function کے بالکل اوپر رکھے جا سکنے والے decorators استعمال کرنے کی بجائے)۔ یہ Django کے طریقے سے زیادہ قریب ہے بنسبت Flask (اور Starlette) کے۔ یہ code میں ان چیزوں کو الگ کرتا ہے جو نسبتاً مضبوطی سے جڑی ہوتی ہیں۔ + +/// check | **FastAPI** کو تحریک دی + +Model attributes کی "default" value استعمال کرکے data types کے لیے اضافی validations define کرنے کی۔ اس سے editor support بہتر ہوا، اور یہ پہلے Pydantic میں دستیاب نہیں تھا۔ + +اس نے دراصل Pydantic کے حصے اپڈیٹ کرنے کی تحریک دی، تاکہ وہی validation declaration style سہولت فراہم ہو (یہ ساری functionality اب پہلے سے Pydantic میں دستیاب ہے)۔ + +/// + +### [Hug](https://github.com/hugapi/hug) { #hug } + +Hug ان پہلے frameworks میں سے ایک تھا جنہوں نے Python type hints استعمال کرکے API parameter types declare کرنا implement کیا۔ یہ ایک زبردست آئیڈیا تھا جس نے دوسرے tools کو بھی ایسا کرنے کی تحریک دی۔ + +اس نے اپنی declarations میں standard Python types کی بجائے custom types استعمال کیے، لیکن یہ پھر بھی آگے کی طرف ایک بڑا قدم تھا۔ + +یہ JSON میں API کی پوری declaration کا ایک custom schema بنانے والے پہلے frameworks میں سے بھی تھا۔ + +یہ OpenAPI اور JSON Schema جیسے standard پر مبنی نہیں تھا۔ تو اسے Swagger UI جیسے دوسرے tools کے ساتھ مربوط کرنا سیدھا نہیں ہوتا۔ لیکن پھر بھی، یہ ایک بہت اختراعی آئیڈیا تھا۔ + +اس میں ایک دلچسپ، غیر معمولی feature ہے: ایک ہی framework استعمال کرکے APIs اور CLIs دونوں بنانا ممکن ہے۔ + +چونکہ یہ synchronous Python web frameworks کے پچھلے standard (WSGI) پر مبنی ہے، یہ Websockets اور دوسری چیزیں سنبھال نہیں سکتا، حالانکہ اس کی performance بھی اعلیٰ ہے۔ + +/// info | معلومات + +Hug Timothy Crosley نے بنایا تھا، [`isort`](https://github.com/timothycrosley/isort) کے وہی بانی، Python فائلوں میں imports کو خودکار ترتیب دینے کا ایک بہترین tool۔ + +/// + +/// check | **FastAPI** کو تحریک دینے والے آئیڈیاز + +Hug نے APIStar کے حصوں کی تحریک دی، اور وہ tools میں سے ایک تھا جو مجھے APIStar کے ساتھ سب سے زیادہ امید افزا لگا۔ + +Hug نے **FastAPI** کو Python type hints استعمال کرکے parameters declare کرنے، اور API define کرنے والا schema خودکار بنانے کی تحریک دی۔ + +Hug نے **FastAPI** کو functions میں `response` parameter declare کرنے کی تحریک دی تاکہ headers اور cookies سیٹ کیے جا سکیں۔ + +/// + +### [APIStar](https://github.com/encode/apistar) (<= 0.5) { #apistar-0-5 } + +**FastAPI** بنانے کا فیصلہ کرنے سے ٹھیک پہلے مجھے **APIStar** server ملا۔ اس میں تقریباً وہ سب کچھ تھا جو میں تلاش کر رہا تھا اور اس کا ایک بہترین ڈیزائن تھا۔ + +یہ parameters اور requests declare کرنے کے لیے Python type hints استعمال کرنے والے framework کے پہلے implementations میں سے ایک تھا جو میں نے کبھی دیکھا (NestJS اور Molten سے پہلے)۔ مجھے یہ تقریباً Hug کے ساتھ ہی ملا۔ لیکن APIStar نے OpenAPI standard استعمال کیا۔ + +اس میں کئی جگہوں پر ایک ہی type hints کی بنیاد پر خودکار data validation، data serialization اور OpenAPI schema generation تھی۔ + +Body schema definitions Pydantic کی طرح وہی Python type hints استعمال نہیں کرتی تھیں، یہ Marshmallow سے زیادہ ملتی جلتی تھیں، تو editor support اتنا اچھا نہ ہوتا، لیکن پھر بھی APIStar دستیاب بہترین آپشن تھا۔ + +اس وقت اس کے بہترین performance benchmarks تھے (صرف Starlette سے پیچھے)۔ + +شروع میں، اس کے پاس خودکار API documentation web UI نہیں تھا، لیکن مجھے معلوم تھا کہ میں اس میں Swagger UI شامل کر سکتا ہوں۔ + +اس کا dependency injection system تھا۔ اسے components کو پہلے سے register کرنا ضروری تھا، جیسے اوپر بیان کیے گئے دوسرے tools۔ لیکن پھر بھی، یہ ایک بہترین feature تھا۔ + +میں اسے کسی مکمل project میں استعمال نہیں کر سکا، کیونکہ اس میں security integration نہیں تھا، تو میں Flask-apispec پر مبنی full-stack generators کی تمام features کو replace نہیں کر سکتا تھا۔ میرے projects کے backlog میں وہ functionality شامل کرنے والی pull request بنانا تھا۔ + +لیکن پھر، project کی توجہ بدل گئی۔ + +یہ اب API web framework نہیں رہا، کیونکہ بانی کو Starlette پر توجہ مرکوز کرنی تھی۔ + +اب APIStar OpenAPI specifications کو validate کرنے والے tools کا مجموعہ ہے، web framework نہیں۔ + +/// info | معلومات + +APIStar Tom Christie نے بنایا تھا۔ وہی شخص جس نے بنایا: + +* Django REST Framework +* Starlette (جس پر **FastAPI** مبنی ہے) +* Uvicorn (جو Starlette اور **FastAPI** استعمال کرتے ہیں) + +/// + +/// check | **FastAPI** کو تحریک دی + +موجود ہونے کی۔ + +ایک ہی Python types کے ساتھ متعدد چیزیں (data validation، serialization اور documentation) declare کرنے کا آئیڈیا، جو ساتھ ہی بہترین editor support بھی فراہم کرے، ایک شاندار آئیڈیا تھا۔ + +اور لمبے عرصے تک ملتا جلتا framework تلاش کرنے اور بہت سے مختلف متبادل ٹیسٹ کرنے کے بعد، APIStar دستیاب بہترین آپشن تھا۔ + +پھر APIStar ایک server کے طور پر بند ہو گیا اور Starlette بنایا گیا، اور ایسے system کے لیے ایک نئی بہتر بنیاد تھا۔ یہ **FastAPI** بنانے کی حتمی تحریک تھی۔ + +میں **FastAPI** کو APIStar کا "روحانی جانشین" سمجھتا ہوں، جبکہ ان تمام پچھلے tools سے سیکھے گئے سبق کی بنیاد پر features، typing system، اور دوسرے حصوں کو بہتر اور بڑھاتے ہوئے۔ + +/// + +## **FastAPI** کے ذریعے استعمال شدہ { #used-by-fastapi } + +### [Pydantic](https://docs.pydantic.dev/) { #pydantic } + +Pydantic ایک library ہے جو Python type hints کی بنیاد پر data validation، serialization اور documentation (JSON Schema استعمال کرتے ہوئے) define کرتی ہے۔ + +یہ اسے انتہائی بدیہی بناتا ہے۔ + +یہ Marshmallow سے قابل موازنہ ہے۔ حالانکہ benchmarks میں یہ Marshmallow سے تیز ہے۔ اور چونکہ یہ وہی Python type hints پر مبنی ہے، editor support بہترین ہے۔ + +/// check | **FastAPI** اسے استعمال کرتا ہے + +تمام data validation، data serialization اور خودکار model documentation (JSON Schema پر مبنی) سنبھالنے کے لیے۔ + +**FastAPI** پھر وہ JSON Schema data لے کر OpenAPI میں ڈالتا ہے، اس کے علاوہ جو کچھ اور یہ کرتا ہے۔ + +/// + +### [Starlette](https://www.starlette.dev/) { #starlette } + +Starlette ایک ہلکا پھلکا ASGI framework/toolkit ہے، جو اعلیٰ performance asyncio services بنانے کے لیے مثالی ہے۔ + +یہ بہت سادہ اور بدیہی ہے۔ اسے آسانی سے قابل توسیع، اور ماڈیولر اجزاء کے ساتھ ڈیزائن کیا گیا ہے۔ + +اس کے پاس ہے: + +* سنجیدگی سے شاندار performance۔ +* WebSocket support۔ +* In-process background tasks۔ +* Startup اور shutdown events۔ +* HTTPX پر مبنی Test client۔ +* CORS، GZip، Static Files، Streaming responses۔ +* Session اور Cookie support۔ +* 100% test coverage۔ +* 100% type annotated codebase۔ +* بہت کم hard dependencies۔ + +Starlette فی الحال ٹیسٹ شدہ تیز ترین Python framework ہے۔ صرف Uvicorn سے پیچھے، جو framework نہیں بلکہ server ہے۔ + +Starlette تمام بنیادی web microframework functionality فراہم کرتا ہے۔ + +لیکن یہ خودکار data validation، serialization یا documentation فراہم نہیں کرتا۔ + +یہ ان بنیادی چیزوں میں سے ایک ہے جو **FastAPI** اوپر سے شامل کرتا ہے، سب Python type hints پر مبنی (Pydantic استعمال کرتے ہوئے)۔ یہ، اور dependency injection system، security utilities، OpenAPI schema generation وغیرہ۔ + +/// note | تکنیکی تفصیلات + +ASGI ایک نیا "standard" ہے جو Django core ٹیم کے ممبران develop کر رہے ہیں۔ یہ ابھی تک "Python standard" (PEP) نہیں ہے، حالانکہ وہ اس کے عمل میں ہیں۔ + +تاہم، یہ پہلے سے کئی tools کے ذریعے "standard" کے طور پر استعمال ہو رہا ہے۔ یہ interoperability کو بہت بہتر بناتا ہے، کیونکہ آپ Uvicorn کو کسی بھی دوسرے ASGI server (جیسے Daphne یا Hypercorn) سے بدل سکتے ہیں، یا ASGI compatible tools شامل کر سکتے ہیں، جیسے `python-socketio`۔ + +/// + +/// check | **FastAPI** اسے استعمال کرتا ہے + +تمام بنیادی web حصوں کو سنبھالنے کے لیے۔ اوپر features شامل کرتے ہوئے۔ + +`FastAPI` class خود براہ راست `Starlette` class سے inherit کرتی ہے۔ + +تو جو کچھ بھی آپ Starlette کے ساتھ کر سکتے ہیں، آپ براہ راست **FastAPI** کے ساتھ کر سکتے ہیں، کیونکہ یہ بنیادی طور پر Starlette ہے مگر طاقتور۔ + +/// + +### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn } + +Uvicorn ایک بجلی کی رفتار والا ASGI server ہے، uvloop اور httptools پر مبنی۔ + +یہ web framework نہیں بلکہ server ہے۔ مثلاً، یہ paths سے routing کے tools فراہم نہیں کرتا۔ یہ وہ چیز ہے جو Starlette (یا **FastAPI**) جیسا framework اوپر فراہم کرتا ہے۔ + +یہ Starlette اور **FastAPI** کے لیے تجویز کردہ server ہے۔ + +/// check | **FastAPI** اسے تجویز کرتا ہے بطور + +**FastAPI** applications چلانے کا بنیادی web server۔ + +آپ `--workers` command line option بھی استعمال کر سکتے ہیں تاکہ asynchronous multi-process server ہو۔ + +مزید تفصیلات [Deployment](deployment/index.md) سیکشن میں دیکھیں۔ + +/// + +## Benchmarks اور رفتار { #benchmarks-and-speed } + +Uvicorn، Starlette اور FastAPI کے درمیان فرق سمجھنے، موازنہ کرنے اور دیکھنے کے لیے [Benchmarks](benchmarks.md) کا سیکشن دیکھیں۔ diff --git a/docs/ur/docs/async.md b/docs/ur/docs/async.md new file mode 100644 index 000000000..3c1d04494 --- /dev/null +++ b/docs/ur/docs/async.md @@ -0,0 +1,444 @@ +# Concurrency اور async / await { #concurrency-and-async-await } + +*path operation functions* کے لیے `async def` syntax کے بارے میں تفصیلات اور asynchronous code، concurrency، اور parallelism کا پس منظر۔ + +## جلدی میں ہیں؟ { #in-a-hurry } + +TL;DR: + +اگر آپ third party libraries استعمال کر رہے ہیں جو آپ سے `await` کے ساتھ call کرنے کو کہتی ہیں، جیسے: + +```Python +results = await some_library() +``` + +تو اپنے *path operation functions* کو `async def` کے ساتھ declare کریں جیسے: + +```Python hl_lines="2" +@app.get('/') +async def read_results(): + results = await some_library() + return results +``` + +/// note | نوٹ + +آپ `await` صرف `async def` سے بنائے گئے functions کے اندر استعمال کر سکتے ہیں۔ + +/// + +--- + +اگر آپ کوئی third party library استعمال کر رہے ہیں جو کسی چیز سے communicate کرتی ہے (database، API، file system وغیرہ) اور `await` کے استعمال کی سہولت نہیں رکھتی (فی الحال زیادہ تر database libraries کے ساتھ یہی صورتحال ہے)، تو اپنے *path operation functions* کو عام طریقے سے صرف `def` کے ساتھ declare کریں، جیسے: + +```Python hl_lines="2" +@app.get('/') +def results(): + results = some_library() + return results +``` + +--- + +اگر آپ کی application کو (کسی بھی طرح) کسی اور چیز سے communicate کرکے اس کے جواب کا انتظار نہیں کرنا ہے، تو `async def` استعمال کریں، چاہے آپ کو اندر `await` استعمال کرنے کی ضرورت نہ ہو۔ + +--- + +اگر آپ کو نہیں معلوم، تو عام `def` استعمال کریں۔ + +--- + +**نوٹ**: آپ اپنے *path operation functions* میں `def` اور `async def` کو جتنا چاہیں ملا جلا کر استعمال کر سکتے ہیں اور ہر ایک کو اپنی بہترین ضرورت کے مطابق define کر سکتے ہیں۔ FastAPI ان کے ساتھ صحیح طریقے سے کام کرے گا۔ + +بہرحال، اوپر کے کسی بھی معاملے میں، FastAPI پھر بھی asynchronously کام کرے گا اور انتہائی تیز ہوگا۔ + +لیکن اوپر دیے گئے اقدامات پر عمل کرنے سے، یہ کچھ performance optimizations کر سکے گا۔ + +## تکنیکی تفصیلات { #technical-details } + +Python کے جدید ورژنز **"asynchronous code"** کی سہولت فراہم کرتے ہیں جسے **"coroutines"** کہتے ہیں، **`async` اور `await`** syntax کے ساتھ۔ + +آئیے اس جملے کو نیچے دیے گئے حصوں میں تفصیل سے دیکھتے ہیں: + +* **Asynchronous Code** +* **`async` اور `await`** +* **Coroutines** + +## Asynchronous Code { #asynchronous-code } + +Asynchronous code کا مطلب صرف یہ ہے کہ زبان 💬 کے پاس computer / program 🤖 کو یہ بتانے کا ایک طریقہ ہے کہ code میں کسی مقام پر، اسے 🤖 کسی اور جگہ *کچھ اور* مکمل ہونے کا انتظار کرنا ہوگا۔ فرض کریں کہ وہ *کچھ اور* "slow-file" 📝 کہلاتا ہے۔ + +تو اس وقت کے دوران، computer جا کر کوئی اور کام کر سکتا ہے، جب تک "slow-file" 📝 مکمل ہوتا ہے۔ + +پھر computer / program 🤖 ہر بار واپس آئے گا جب اسے موقع ملے کیونکہ وہ دوبارہ انتظار میں ہے، یا جب بھی اس 🤖 نے اس وقت تک کا سارا کام مکمل کر لیا ہو۔ اور یہ 🤖 دیکھے گا کہ جن tasks کا انتظار تھا ان میں سے کوئی مکمل ہو چکا ہے، اور جو کچھ اسے کرنا تھا وہ کرے گا۔ + +پھر، یہ 🤖 مکمل ہونے والا پہلا task لیتا ہے (فرض کریں ہمارا "slow-file" 📝) اور جو کچھ اسے اس کے ساتھ کرنا تھا وہ جاری رکھتا ہے۔ + +وہ "کسی اور چیز کا انتظار" عام طور پر I/O operations کی طرف اشارہ کرتا ہے جو نسبتاً "سست" ہوتے ہیں (processor اور RAM memory کی رفتار کے مقابلے میں)، جیسے انتظار کرنا: + +* client کے ذریعے network سے بھیجے جانے والے data کا +* آپ کے program کے ذریعے بھیجے گئے data کا client تک network سے پہنچنے کا +* disk پر فائل کے مواد کو system کے ذریعے پڑھ کر آپ کے program کو دینے کا +* آپ کے program نے system کو جو مواد دیا اسے disk پر لکھنے کا +* ایک remote API operation کا +* ایک database operation مکمل ہونے کا +* ایک database query کے نتائج واپس آنے کا +* وغیرہ۔ + +چونکہ execution time زیادہ تر I/O operations کے انتظار میں صرف ہوتا ہے، انہیں "I/O bound" operations کہتے ہیں۔ + +اسے "asynchronous" اس لیے کہتے ہیں کیونکہ computer / program کو سست task کے ساتھ "synchronized" نہیں رہنا پڑتا، task مکمل ہونے کے صحیح لمحے کا انتظار کرتے ہوئے کچھ نہ کرتے ہوئے، تاکہ task کا نتیجہ لے کر کام جاری رکھ سکے۔ + +اس کی بجائے، ایک "asynchronous" system ہونے کی وجہ سے، ایک بار مکمل ہونے کے بعد، task تھوڑی دیر (کچھ microseconds) قطار میں انتظار کر سکتا ہے جب تک computer / program جو بھی کام کر رہا تھا وہ مکمل کرے، اور پھر واپس آ کر نتائج لے اور ان کے ساتھ کام جاری رکھے۔ + +"Synchronous" ("asynchronous" کے برعکس) کے لیے عام طور پر "sequential" کی اصطلاح بھی استعمال ہوتی ہے، کیونکہ computer / program تمام مراحل کو ترتیب سے follow کرتا ہے کسی مختلف task پر جانے سے پہلے، چاہے ان مراحل میں انتظار شامل ہو۔ + +### Concurrency اور برگرز { #concurrency-and-burgers } + +اوپر بیان کردہ **asynchronous** code کے اس تصور کو بعض اوقات **"concurrency"** بھی کہا جاتا ہے۔ یہ **"parallelism"** سے مختلف ہے۔ + +**Concurrency** اور **parallelism** دونوں کا تعلق "مختلف چیزوں کا کم و بیش ایک ہی وقت میں ہونا" سے ہے۔ + +لیکن *concurrency* اور *parallelism* کے درمیان تفصیلات کافی مختلف ہیں۔ + +فرق سمجھنے کے لیے، برگرز کے بارے میں یہ کہانی تصور کریں: + +### Concurrent برگرز { #concurrent-burgers } + +آپ اپنے ساتھی کے ساتھ fast food لینے جاتے ہیں، آپ قطار میں کھڑے ہوتے ہیں جب کہ cashier آپ سے پہلے والے لوگوں کے آرڈرز لے رہا ہوتا ہے۔ 😍 + + + +پھر آپ کی باری آتی ہے، آپ اپنے ساتھی اور اپنے لیے 2 بہت عمدہ برگرز کا آرڈر دیتے ہیں۔ 🍔🍔 + + + +Cashier کچن میں باورچی کو کچھ کہتا ہے تاکہ انہیں معلوم ہو کہ آپ کے برگرز تیار کرنے ہیں (حالانکہ وہ ابھی پہلے والے گاہکوں کے برگرز تیار کر رہے ہیں)۔ + + + +آپ ادائیگی کرتے ہیں۔ 💸 + +Cashier آپ کو آپ کی باری کا نمبر دیتا ہے۔ + + + +جب آپ انتظار کر رہے ہوتے ہیں، آپ اپنے ساتھی کے ساتھ جا کر ایک میز چنتے ہیں، بیٹھتے ہیں اور کافی دیر تک بات کرتے ہیں (کیونکہ آپ کے برگرز بہت عمدہ ہیں اور تیار ہونے میں وقت لگتا ہے)۔ + +جب آپ اپنے ساتھی کے ساتھ میز پر بیٹھے برگرز کا انتظار کر رہے ہوتے ہیں، آپ اس وقت کو یہ دیکھنے میں صرف کر سکتے ہیں کہ آپ کا ساتھی کتنا زبردست، خوبصورت اور ذہین ہے ✨😍✨۔ + + + +انتظار کرتے ہوئے اور اپنے ساتھی سے بات کرتے ہوئے، وقتاً فوقتاً آپ کاؤنٹر پر دکھائے جانے والے نمبر کو چیک کرتے ہیں کہ کیا آپ کی باری آ گئی ہے۔ + +پھر کسی وقت، آخرکار آپ کی باری آتی ہے۔ آپ کاؤنٹر پر جاتے ہیں، اپنے برگرز لیتے ہیں اور واپس میز پر آتے ہیں۔ + + + +آپ اور آپ کا ساتھی برگرز کھاتے ہیں اور اچھا وقت گزارتے ہیں۔ ✨ + + + +/// info | معلومات + +خوبصورت تصاویر بنانے والی [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot)۔ 🎨 + +/// + +--- + +تصور کریں کہ آپ اس کہانی میں computer / program 🤖 ہیں۔ + +جب آپ قطار میں ہوتے ہیں، آپ بس خالی بیٹھے 😴 اپنی باری کا انتظار کر رہے ہوتے ہیں، کوئی خاص "productive" کام نہیں کر رہے۔ لیکن قطار تیز ہے کیونکہ cashier صرف آرڈرز لے رہا ہے (تیار نہیں کر رہا)، تو یہ ٹھیک ہے۔ + +پھر جب آپ کی باری آتی ہے، آپ حقیقی "productive" کام کرتے ہیں، مینو پر غور کرتے ہیں، فیصلہ کرتے ہیں کہ آپ کیا چاہتے ہیں، اپنے ساتھی کی پسند لیتے ہیں، ادائیگی کرتے ہیں، چیک کرتے ہیں کہ آپ نے صحیح بل یا کارڈ دیا ہے، چیک کرتے ہیں کہ آپ سے صحیح رقم لی گئی ہے، چیک کرتے ہیں کہ آرڈر میں صحیح آئٹمز ہیں، وغیرہ۔ + +لیکن پھر، حالانکہ آپ کے پاس ابھی تک برگرز نہیں ہیں، cashier کے ساتھ آپ کا کام "روک" ⏸ پر ہے، کیونکہ آپ کو اپنے برگرز تیار ہونے کا انتظار 🕙 کرنا ہے۔ + +لیکن جیسے ہی آپ کاؤنٹر سے ہٹ کر اپنی باری کے نمبر کے ساتھ میز پر بیٹھتے ہیں، آپ اپنی توجہ 🔀 اپنے ساتھی کی طرف کر سکتے ہیں، اور اس پر "کام" ⏯ 🤓 کر سکتے ہیں۔ پھر آپ دوبارہ کچھ بہت "productive" کر رہے ہیں جیسے اپنے ساتھی سے فلرٹ کرنا 😍۔ + +پھر cashier 💁 کہتا ہے "میں نے برگرز تیار کر دیے" آپ کا نمبر کاؤنٹر کی display پر لگا کر، لیکن آپ پاگلوں کی طرح فوراً نہیں کودتے جب display نمبر آپ کی باری کے نمبر پر بدلتا ہے۔ آپ جانتے ہیں کہ کوئی آپ کے برگرز نہیں چرائے گا کیونکہ آپ کے پاس آپ کی باری کا نمبر ہے، اور ان کے پاس ان کا۔ + +تو آپ اپنے ساتھی کی کہانی مکمل ہونے کا انتظار کرتے ہیں (موجودہ کام ⏯ / task مکمل ہونا 🤓)، نرمی سے مسکراتے ہیں اور کہتے ہیں کہ آپ برگرز لینے جا رہے ہیں ⏸۔ + +پھر آپ کاؤنٹر 🔀 پر جاتے ہیں، اس ابتدائی task کی طرف جو اب مکمل ہو چکا ہے ⏯، برگرز لیتے ہیں، شکریہ کہتے ہیں اور انہیں میز پر لے آتے ہیں۔ یہ کاؤنٹر کے ساتھ تعامل کا وہ مرحلہ / task ختم کرتا ہے ⏹۔ یہ بدلے میں ایک نیا task شروع کرتا ہے، "برگرز کھانا" 🔀 ⏯، لیکن پچھلا "برگرز لینا" مکمل ہو چکا ہے ⏹۔ + +### Parallel برگرز { #parallel-burgers } + +اب تصور کریں کہ یہ "Concurrent برگرز" نہیں بلکہ "Parallel برگرز" ہیں۔ + +آپ اپنے ساتھی کے ساتھ parallel fast food لینے جاتے ہیں۔ + +آپ قطار میں کھڑے ہوتے ہیں جب کہ کئی (فرض کریں 8) cashiers جو بیک وقت باورچی بھی ہیں، آپ سے پہلے والے لوگوں کے آرڈرز لے رہے ہیں۔ + +آپ سے پہلے ہر شخص کاؤنٹر چھوڑنے سے پہلے اپنے برگرز تیار ہونے کا انتظار کر رہا ہے کیونکہ 8 cashiers میں سے ہر ایک اگلا آرڈر لینے سے پہلے برگر فوراً تیار کرتا ہے۔ + + + +پھر آخرکار آپ کی باری آتی ہے، آپ اپنے ساتھی اور اپنے لیے 2 بہت عمدہ برگرز کا آرڈر دیتے ہیں۔ + +آپ ادائیگی کرتے ہیں 💸۔ + + + +Cashier کچن میں جاتا ہے۔ + +آپ کاؤنٹر کے سامنے کھڑے رہتے ہیں 🕙، تاکہ کوئی اور آپ سے پہلے آپ کے برگرز نہ لے لے، کیونکہ باری کے نمبر نہیں ہیں۔ + + + +چونکہ آپ اور آپ کا ساتھی کسی کو اپنے سامنے آنے اور جب بھی وہ آئیں آپ کے برگرز لینے سے روکنے میں مصروف ہیں، آپ اپنے ساتھی پر توجہ نہیں دے سکتے۔ 😞 + +یہ "synchronous" کام ہے، آپ cashier/باورچی 👨‍🍳 کے ساتھ "synchronized" ہیں۔ آپ کو انتظار 🕙 کرنا ہے اور بالکل اس لمحے وہاں موجود ہونا ہے جب cashier/باورچی 👨‍🍳 برگرز مکمل کرے اور آپ کو دے، ورنہ کوئی اور لے سکتا ہے۔ + + + +پھر آپ کا cashier/باورچی 👨‍🍳 آخرکار آپ کے برگرز لے کر واپس آتا ہے، کاؤنٹر کے سامنے لمبے انتظار 🕙 کے بعد۔ + + + +آپ اپنے برگرز لیتے ہیں اور اپنے ساتھی کے ساتھ میز پر جاتے ہیں۔ + +آپ بس انہیں کھاتے ہیں، اور ہو گیا۔ ⏹ + + + +زیادہ بات چیت یا فلرٹنگ نہیں ہوئی کیونکہ زیادہ تر وقت کاؤنٹر کے سامنے انتظار 🕙 میں صرف ہوا۔ 😞 + +/// info | معلومات + +خوبصورت تصاویر بنانے والی [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot)۔ 🎨 + +/// + +--- + +Parallel برگرز کے اس منظرنامے میں، آپ ایک computer / program 🤖 ہیں جس کے دو processors ہیں (آپ اور آپ کا ساتھی)، دونوں انتظار 🕙 کر رہے ہیں اور اپنی توجہ ⏯ "کاؤنٹر پر انتظار" 🕙 میں لمبے عرصے تک لگائے ہوئے ہیں۔ + +Fast food store کے 8 processors (cashiers/باورچی) ہیں۔ جبکہ concurrent برگرز والے store میں شاید صرف 2 ہوں (ایک cashier اور ایک باورچی)۔ + +لیکن پھر بھی، حتمی تجربہ بہترین نہیں ہے۔ 😞 + +--- + +یہ برگرز کی parallel مساوی کہانی ہوگی۔ 🍔 + +"حقیقی زندگی" کی مزید مثال کے لیے، ایک بینک تصور کریں۔ + +حال ہی تک، زیادہ تر بینکوں میں متعدد cashiers 👨‍💼👨‍💼👨‍💼👨‍💼 ہوتے تھے اور ایک بڑی قطار 🕙🕙🕙🕙🕙🕙🕙🕙۔ + +تمام cashiers ایک کے بعد ایک client کے ساتھ سارا کام کرتے 👨‍💼⏯۔ + +اور آپ کو قطار میں لمبا انتظار 🕙 کرنا ہوتا ہے ورنہ آپ اپنی باری کھو دیتے ہیں۔ + +آپ شاید اپنے ساتھی 😍 کو اپنے ساتھ بینک 🏦 میں کام کرانے نہیں لے جانا چاہیں گے۔ + +### برگرز کا نتیجہ { #burger-conclusion } + +"اپنے ساتھی کے ساتھ fast food برگرز" کے اس منظرنامے میں، چونکہ بہت زیادہ انتظار 🕙 ہے، concurrent system ⏸🔀⏯ رکھنا بہت زیادہ معنی رکھتا ہے۔ + +زیادہ تر web applications کے ساتھ یہی معاملہ ہے۔ + +بہت سارے، بہت سارے users، لیکن آپ کا server ان کے اتنے اچھے نہ ہونے والے connection سے requests بھیجنے کا انتظار 🕙 کر رہا ہے۔ + +اور پھر دوبارہ responses واپس آنے کا انتظار 🕙۔ + +یہ "انتظار" 🕙 microseconds میں ماپا جاتا ہے، لیکن پھر بھی، سب کو جمع کریں تو آخر میں بہت زیادہ انتظار ہوتا ہے۔ + +اسی لیے web APIs کے لیے asynchronous ⏸🔀⏯ code استعمال کرنا بہت معنی رکھتا ہے۔ + +اسی قسم کی asynchronicity نے NodeJS کو مقبول بنایا (حالانکہ NodeJS parallel نہیں ہے) اور یہی Go کی بطور programming language طاقت ہے۔ + +اور یہ وہی سطح کی performance ہے جو آپ کو **FastAPI** کے ساتھ ملتی ہے۔ + +اور چونکہ آپ parallelism اور asynchronicity دونوں بیک وقت حاصل کر سکتے ہیں، آپ کو زیادہ تر tested NodeJS frameworks سے زیادہ اور Go کے برابر performance ملتی ہے، جو C کے قریب ایک compiled language ہے [(یہ سب Starlette کی بدولت ہے)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1)۔ + +### کیا concurrency، parallelism سے بہتر ہے؟ { #is-concurrency-better-than-parallelism } + +نہیں! یہ کہانی کا سبق نہیں ہے۔ + +Concurrency، parallelism سے مختلف ہے۔ اور یہ ان **مخصوص** منظرناموں میں بہتر ہے جن میں بہت زیادہ انتظار شامل ہو۔ اس وجہ سے، یہ عام طور پر web application development کے لیے parallelism سے بہت بہتر ہے۔ لیکن ہر چیز کے لیے نہیں۔ + +تو اسے متوازن کرنے کے لیے، یہ مختصر کہانی تصور کریں: + +> آپ کو ایک بڑا، گندا گھر صاف کرنا ہے۔ + +*ہاں، یہی پوری کہانی ہے*۔ + +--- + +کہیں بھی انتظار 🕙 نہیں ہے، بس گھر کی مختلف جگہوں پر بہت سارا کام کرنا ہے۔ + +آپ برگرز کی مثال کی طرح باریاں لے سکتے ہیں، پہلے بیٹھک، پھر کچن، لیکن چونکہ آپ کسی چیز کا انتظار 🕙 نہیں کر رہے، بس صفائی اور صفائی، تو باریاں کسی چیز پر اثر نہیں ڈالیں گی۔ + +باریوں (concurrency) کے ساتھ یا بغیر مکمل ہونے میں اتنا ہی وقت لگے گا اور آپ نے اتنا ہی کام کیا ہوگا۔ + +لیکن اس صورت میں، اگر آپ 8 سابقہ cashier/باورچی/اب صفائی والے لا سکتے، اور ہر ایک (آپ سمیت) گھر کا ایک حصہ صاف کر سکتا، تو آپ سارا کام **parallel** میں، اضافی مدد سے، بہت جلد مکمل کر سکتے تھے۔ + +اس منظرنامے میں، ہر صفائی کرنے والا (آپ سمیت) ایک processor ہوگا، جو اپنے حصے کا کام کر رہا ہوگا۔ + +اور چونکہ زیادہ تر execution time حقیقی کام میں صرف ہوتا ہے (انتظار کی بجائے)، اور computer میں کام ایک CPU کے ذریعے ہوتا ہے، وہ ان مسائل کو "CPU bound" کہتے ہیں۔ + +--- + +CPU bound operations کی عام مثالیں وہ چیزیں ہیں جنہیں پیچیدہ ریاضیاتی processing کی ضرورت ہوتی ہے۔ + +مثال کے طور پر: + +* **Audio** یا **image processing**۔ +* **Computer vision**: ایک تصویر لاکھوں pixels پر مشتمل ہوتی ہے، ہر pixel میں 3 values / رنگ ہوتے ہیں، ان کی processing میں عام طور پر ان pixels پر بیک وقت کوئی حساب لگانا ہوتا ہے۔ +* **Machine Learning**: عام طور پر بہت سی "matrix" اور "vector" multiplications کی ضرورت ہوتی ہے۔ نمبروں سے بھری ایک بڑی spreadsheet کا تصور کریں اور ان سب کو بیک وقت ضرب دینا۔ +* **Deep Learning**: یہ Machine Learning کا ایک ذیلی شعبہ ہے، تو وہی اصول لاگو ہوتے ہیں۔ بس اتنا ہے کہ ضرب دینے کے لیے نمبروں کی ایک ہی spreadsheet نہیں بلکہ ایک بہت بڑا مجموعہ ہوتا ہے، اور بہت سے معاملات میں آپ ان models کو بنانے اور/یا استعمال کرنے کے لیے ایک خاص processor استعمال کرتے ہیں۔ + +### Concurrency + Parallelism: Web + Machine Learning { #concurrency-parallelism-web-machine-learning } + +**FastAPI** کے ساتھ آپ concurrency کا فائدہ اٹھا سکتے ہیں جو web development کے لیے بہت عام ہے (NodeJS کی وہی بنیادی کشش)۔ + +لیکن آپ parallelism اور multiprocessing (متعدد processes بیک وقت چلنا) کے فوائد کو بھی **CPU bound** workloads کے لیے استعمال کر سکتے ہیں جیسے Machine Learning systems۔ + +یہ، اور اس سادہ حقیقت کے ساتھ کہ Python **Data Science**، Machine Learning اور خاص طور پر Deep Learning کی بنیادی زبان ہے، FastAPI کو Data Science / Machine Learning web APIs اور applications کے لیے ایک بہت اچھا انتخاب بناتے ہیں (بہت سی دوسری چیزوں کے علاوہ)۔ + +production میں یہ parallelism کیسے حاصل کریں یہ جاننے کے لیے [Deployment](deployment/index.md) کا سیکشن دیکھیں۔ + +## `async` اور `await` { #async-and-await } + +Python کے جدید ورژنز میں asynchronous code define کرنے کا ایک بہت بدیہی طریقہ ہے۔ یہ اسے عام "sequential" code جیسا بناتا ہے اور صحیح لمحات پر آپ کے لیے "awaiting" کرتا ہے۔ + +جب کوئی operation ہو جو نتائج دینے سے پہلے انتظار کی ضرورت رکھتا ہو اور Python کی ان نئی features کی سہولت رکھتا ہو، آپ اسے اس طرح code کر سکتے ہیں: + +```Python +burgers = await get_burgers(2) +``` + +یہاں کلید `await` ہے۔ یہ Python کو بتاتا ہے کہ اسے `get_burgers(2)` کا اپنا کام 🕙 مکمل کرنے تک انتظار ⏸ کرنا ہے `burgers` میں نتائج محفوظ کرنے سے پہلے۔ اس کے ساتھ، Python جان لے گا کہ وہ اس دوران 🔀 ⏯ کچھ اور کام کر سکتا ہے (جیسے کوئی اور request وصول کرنا)۔ + +`await` کام کرنے کے لیے، اسے ایک ایسے function کے اندر ہونا ضروری ہے جو اس asynchronicity کی سہولت رکھتا ہو۔ ایسا کرنے کے لیے، بس اسے `async def` کے ساتھ declare کریں: + +```Python hl_lines="1" +async def get_burgers(number: int): + # Do some asynchronous stuff to create the burgers + return burgers +``` + +...`def` کی بجائے: + +```Python hl_lines="2" +# This is not asynchronous +def get_sequential_burgers(number: int): + # Do some sequential stuff to create the burgers + return burgers +``` + +`async def` کے ساتھ، Python جانتا ہے کہ اس function کے اندر اسے `await` expressions کا خیال رکھنا ہے، اور یہ کہ وہ اس function کی execution کو "روک" ⏸ کر واپس آنے سے پہلے 🔀 کچھ اور کام کر سکتا ہے۔ + +جب آپ کسی `async def` function کو call کرنا چاہیں، تو آپ کو اسے "await" کرنا ہوگا۔ تو یہ کام نہیں کرے گا: + +```Python +# This won't work, because get_burgers was defined with: async def +burgers = get_burgers(2) +``` + +--- + +تو اگر آپ کوئی library استعمال کر رہے ہیں جو آپ سے `await` کے ساتھ call کرنے کو کہتی ہے، تو آپ کو اسے استعمال کرنے والے *path operation functions* کو `async def` کے ساتھ بنانا ہوگا، جیسے: + +```Python hl_lines="2-3" +@app.get('/burgers') +async def read_burgers(): + burgers = await get_burgers(2) + return burgers +``` + +### مزید تکنیکی تفصیلات { #more-technical-details } + +آپ نے غور کیا ہوگا کہ `await` صرف `async def` سے define کیے گئے functions کے اندر استعمال ہو سکتا ہے۔ + +لیکن ساتھ ہی، `async def` سے define کیے گئے functions کو "await" کرنا ضروری ہے۔ تو `async def` والے functions صرف `async def` سے define کیے گئے functions کے اندر ہی call ہو سکتے ہیں۔ + +تو انڈے اور مرغی کے بارے میں، آپ پہلا `async` function کیسے call کریں؟ + +اگر آپ **FastAPI** کے ساتھ کام کر رہے ہیں تو آپ کو اس کی فکر نہیں کرنی، کیونکہ وہ "پہلا" function آپ کا *path operation function* ہوگا، اور FastAPI جانے گا کہ صحیح کام کیسے کرنا ہے۔ + +لیکن اگر آپ FastAPI کے بغیر `async` / `await` استعمال کرنا چاہیں، تو آپ ایسا بھی کر سکتے ہیں۔ + +### اپنا async code لکھیں { #write-your-own-async-code } + +Starlette (اور **FastAPI**) [AnyIO](https://anyio.readthedocs.io/en/stable/) پر مبنی ہیں، جو اسے Python کی standard library [asyncio](https://docs.python.org/3/library/asyncio-task.html) اور [Trio](https://trio.readthedocs.io/en/stable/) دونوں کے ساتھ compatible بناتا ہے۔ + +خاص طور پر، آپ اپنے advanced concurrency use cases کے لیے براہ راست [AnyIO](https://anyio.readthedocs.io/en/stable/) استعمال کر سکتے ہیں جنہیں آپ کے اپنے code میں مزید advanced patterns کی ضرورت ہو۔ + +اور اگر آپ FastAPI استعمال نہیں بھی کر رہے ہوتے، تو بھی آپ [AnyIO](https://anyio.readthedocs.io/en/stable/) کے ساتھ اپنی async applications لکھ سکتے تھے جو بہت compatible ہوں اور اس کے فوائد حاصل کریں (مثلاً *structured concurrency*)۔ + +میں نے AnyIO کے اوپر ایک اور library بنائی ہے، ایک پتلی layer کے طور پر، type annotations کو تھوڑا بہتر بنانے اور بہتر **autocompletion**، **inline errors** وغیرہ حاصل کرنے کے لیے۔ اس میں ایک دوستانہ تعارف اور tutorial بھی ہے جو آپ کو **سمجھنے** اور **اپنا async code** لکھنے میں مدد کرے: [Asyncer](https://asyncer.tiangolo.com/)۔ یہ خاص طور پر مفید ہوگا اگر آپ کو **async code کو regular** (blocking/synchronous) code کے ساتھ ملانے کی ضرورت ہو۔ + +### Asynchronous code کی دوسری شکلیں { #other-forms-of-asynchronous-code } + +`async` اور `await` استعمال کرنے کا یہ انداز زبان میں نسبتاً نیا ہے۔ + +لیکن یہ asynchronous code کے ساتھ کام کرنا بہت آسان بناتا ہے۔ + +یہی syntax (یا تقریباً ایک جیسا) حال ہی میں JavaScript کے جدید ورژنز (Browser اور NodeJS میں) میں بھی شامل کیا گیا۔ + +لیکن اس سے پہلے، asynchronous code کو سنبھالنا کافی زیادہ پیچیدہ اور مشکل تھا۔ + +Python کے پچھلے ورژنز میں، آپ threads یا [Gevent](https://www.gevent.org/) استعمال کر سکتے تھے۔ لیکن code سمجھنے، debug کرنے، اور سوچنے میں بہت زیادہ پیچیدہ ہوتا ہے۔ + +NodeJS / Browser JavaScript کے پچھلے ورژنز میں، آپ "callbacks" استعمال کرتے۔ جو "callback hell" کی طرف لے جاتا ہے۔ + +## Coroutines { #coroutines } + +**Coroutine** بس اس چیز کے لیے ایک بہت فینسی اصطلاح ہے جو `async def` function واپس کرتا ہے۔ Python جانتا ہے کہ یہ ایک function جیسی چیز ہے، جو شروع ہو سکتی ہے اور کسی وقت ختم ہوگی، لیکن یہ اندرونی طور پر بھی ⏸ روکی جا سکتی ہے، جب بھی اس کے اندر `await` ہو۔ + +لیکن `async` اور `await` کے ساتھ asynchronous code استعمال کرنے کی یہ ساری functionality اکثر "coroutines" استعمال کرنا کہہ کر خلاصہ کی جاتی ہے۔ یہ Go کی بنیادی خصوصیت "Goroutines" سے قابل موازنہ ہے۔ + +## نتیجہ { #conclusion } + +آئیے اوپر والا وہی جملہ دوبارہ دیکھتے ہیں: + +> Python کے جدید ورژنز **"asynchronous code"** کی سہولت فراہم کرتے ہیں جسے **"coroutines"** کہتے ہیں، **`async` اور `await`** syntax کے ساتھ۔ + +اب یہ زیادہ سمجھ آنا چاہیے۔ ✨ + +یہی سب **FastAPI** کو (Starlette کے ذریعے) طاقت دیتا ہے اور اسے اتنی شاندار performance دیتا ہے۔ + +## انتہائی تکنیکی تفصیلات { #very-technical-details } + +/// warning | انتباہ + +آپ شاید اسے چھوڑ سکتے ہیں۔ + +یہ بہت تکنیکی تفصیلات ہیں کہ **FastAPI** اندرونی طور پر کیسے کام کرتا ہے۔ + +اگر آپ کے پاس کافی تکنیکی علم ہے (coroutines، threads، blocking وغیرہ) اور آپ جاننا چاہتے ہیں کہ FastAPI `async def` بمقابلہ عام `def` کو کیسے سنبھالتا ہے، تو آگے بڑھیں۔ + +/// + +### Path operation functions { #path-operation-functions } + +جب آپ *path operation function* کو `async def` کی بجائے عام `def` کے ساتھ declare کرتے ہیں، تو اسے ایک بیرونی threadpool میں چلایا جاتا ہے جس کا پھر await کیا جاتا ہے، براہ راست call کرنے کی بجائے (کیونکہ یہ server کو block کر دے گا)۔ + +اگر آپ کسی اور async framework سے آ رہے ہیں جو اوپر بیان کردہ طریقے سے کام نہیں کرتا اور آپ عام `def` کے ساتھ معمولی compute-only *path operation functions* define کرنے کے عادی ہیں تھوڑی سی performance بہتری (تقریباً 100 nanoseconds) کے لیے، تو براہ کرم نوٹ کریں کہ **FastAPI** میں اثر بالکل الٹا ہوگا۔ ان صورتوں میں، `async def` استعمال کرنا بہتر ہے جب تک کہ آپ کے *path operation functions* ایسا code استعمال نہ کریں جو blocking I/O کرتا ہو۔ + +پھر بھی، دونوں صورتوں میں، امکان ہے کہ **FastAPI** آپ کے پچھلے framework سے [پھر بھی تیز](index.md#performance) ہوگا (یا کم از کم اس کے برابر)۔ + +### Dependencies { #dependencies } + +یہی [dependencies](tutorial/dependencies/index.md) پر بھی لاگو ہوتا ہے۔ اگر dependency ایک عام `def` function ہے `async def` کی بجائے، تو اسے بیرونی threadpool میں چلایا جاتا ہے۔ + +### Sub-dependencies { #sub-dependencies } + +آپ کے متعدد dependencies اور [sub-dependencies](tutorial/dependencies/sub-dependencies.md) ہو سکتے ہیں جو ایک دوسرے کی ضرورت رکھتے ہوں (function definitions کے parameters کے طور پر)، ان میں سے کچھ `async def` سے بنائے جا سکتے ہیں اور کچھ عام `def` سے۔ یہ پھر بھی کام کرے گا، اور عام `def` سے بنائے گئے ایک بیرونی thread (threadpool سے) پر call کیے جائیں گے "await" کیے جانے کی بجائے۔ + +### دوسرے utility functions { #other-utility-functions } + +کوئی بھی دوسرا utility function جسے آپ براہ راست call کرتے ہیں، عام `def` یا `async def` سے بنایا جا سکتا ہے اور FastAPI اس پر اثر نہیں ڈالے گا جس طرح آپ اسے call کرتے ہیں۔ + +یہ ان functions کے برعکس ہے جو FastAPI آپ کے لیے call کرتا ہے: *path operation functions* اور dependencies۔ + +اگر آپ کا utility function ایک عام `def` والا function ہے، تو اسے براہ راست call کیا جائے گا (جیسا کہ آپ اسے اپنے code میں لکھتے ہیں)، threadpool میں نہیں، اگر function `async def` سے بنایا گیا ہے تو آپ کو اس function کو اپنے code میں call کرتے وقت `await` کرنا چاہیے۔ + +--- + +دوبارہ، یہ بہت تکنیکی تفصیلات ہیں جو شاید مفید ہوں اگر آپ انہیں تلاش کرتے ہوئے آئے ہیں۔ + +ورنہ، آپ اوپر والے سیکشن کی ہدایات سے ٹھیک ہونے چاہئیں:
جلدی میں ہیں؟ diff --git a/docs/ur/docs/benchmarks.md b/docs/ur/docs/benchmarks.md new file mode 100644 index 000000000..279d55706 --- /dev/null +++ b/docs/ur/docs/benchmarks.md @@ -0,0 +1,34 @@ +# Benchmarks { #benchmarks } + +آزاد TechEmpower benchmarks ظاہر کرتے ہیں کہ Uvicorn کے تحت چلنے والی **FastAPI** applications [دستیاب تیز ترین Python frameworks میں سے ایک](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7) ہیں، صرف Starlette اور Uvicorn سے پیچھے (جو FastAPI اندرونی طور پر استعمال کرتا ہے)۔ + +لیکن benchmarks اور موازنے دیکھتے وقت آپ کو درج ذیل باتیں ذہن میں رکھنی چاہئیں۔ + +## Benchmarks اور رفتار { #benchmarks-and-speed } + +جب آپ benchmarks دیکھتے ہیں، تو عام طور پر مختلف اقسام کے کئی tools کو مساوی کے طور پر موازنہ کیا جاتا ہے۔ + +خاص طور پر، Uvicorn، Starlette اور FastAPI کو ایک ساتھ (بہت سے دوسرے tools کے درمیان) موازنے میں دیکھنا۔ + +tool جتنا آسان مسئلہ حل کرتا ہے، اتنی بہتر performance دیتا ہے۔ اور زیادہ تر benchmarks tool کی فراہم کردہ اضافی features کو ٹیسٹ نہیں کرتے۔ + +درجہ بندی اس طرح ہے: + +* **Uvicorn**: ایک ASGI server + * **Starlette**: (Uvicorn استعمال کرتا ہے) ایک web microframework + * **FastAPI**: (Starlette استعمال کرتا ہے) ایک API microframework جس میں APIs بنانے کے لیے کئی اضافی features ہیں، data validation وغیرہ کے ساتھ۔ + +* **Uvicorn**: + * سب سے بہترین performance ہوگی، کیونکہ server کے علاوہ اس میں زیادہ اضافی code نہیں ہے۔ + * آپ براہ راست Uvicorn میں application نہیں لکھیں گے۔ اس کا مطلب ہوگا کہ آپ کے code میں کم از کم وہ سارا code شامل ہو جو Starlette (یا **FastAPI**) فراہم کرتا ہے۔ اور اگر آپ ایسا کریں، تو آپ کی حتمی application میں بھی وہی overhead ہوگا جیسا framework استعمال کرنے اور app code اور bugs کو کم سے کم رکھنے میں ہوتا۔ + * اگر آپ Uvicorn کا موازنہ کر رہے ہیں، تو اسے Daphne، Hypercorn، uWSGI وغیرہ سے موازنہ کریں۔ Application servers۔ +* **Starlette**: + * Uvicorn کے بعد اگلی بہترین performance ہوگی۔ درحقیقت، Starlette چلنے کے لیے Uvicorn استعمال کرتا ہے۔ تو یہ شاید صرف مزید code execute کرنے کی وجہ سے Uvicorn سے "سست" ہو سکتا ہے۔ + * لیکن یہ آپ کو سادہ web applications بنانے کے tools فراہم کرتا ہے، paths پر مبنی routing وغیرہ کے ساتھ۔ + * اگر آپ Starlette کا موازنہ کر رہے ہیں، تو اسے Sanic، Flask، Django وغیرہ سے موازنہ کریں۔ Web frameworks (یا microframeworks)۔ +* **FastAPI**: + * جس طرح Starlette، Uvicorn استعمال کرتا ہے اور اس سے تیز نہیں ہو سکتا، **FastAPI** Starlette استعمال کرتا ہے، تو یہ اس سے تیز نہیں ہو سکتا۔ + * FastAPI، Starlette کے اوپر مزید features فراہم کرتا ہے۔ وہ features جن کی آپ کو APIs بناتے وقت تقریباً ہمیشہ ضرورت ہوتی ہے، جیسے data validation اور serialization۔ اور اسے استعمال کرنے سے آپ کو خودکار documentation مفت میں ملتی ہے (خودکار documentation چلتی applications میں overhead بھی نہیں ڈالتی، یہ startup پر generate ہوتی ہے)۔ + * اگر آپ نے FastAPI استعمال نہ کیا ہوتا اور براہ راست Starlette (یا کوئی اور tool جیسے Sanic، Flask، Responder وغیرہ) استعمال کیا ہوتا تو آپ کو ساری data validation اور serialization خود implement کرنی ہوتی۔ تو آپ کی حتمی application میں پھر بھی وہی overhead ہوتا جیسا FastAPI استعمال کرنے میں ہوتا۔ اور بہت سے معاملات میں، یہ data validation اور serialization applications میں لکھے جانے والے code کا سب سے بڑا حصہ ہوتی ہے۔ + * تو FastAPI استعمال کرکے آپ development time، bugs، code کی لائنیں بچا رہے ہیں، اور شاید آپ کو وہی performance (یا بہتر) ملے گی جو آپ کو اسے استعمال نہ کرنے پر ملتی (کیونکہ آپ کو یہ سب اپنے code میں implement کرنا ہوتا)۔ + * اگر آپ FastAPI کا موازنہ کر رہے ہیں، تو اسے کسی web application framework (یا tools کے مجموعے) سے موازنہ کریں جو data validation، serialization اور documentation فراہم کرتا ہو، جیسے Flask-apispec، NestJS، Molten وغیرہ۔ وہ frameworks جن میں مربوط خودکار data validation، serialization اور documentation شامل ہو۔ diff --git a/docs/ur/docs/contributing.md b/docs/ur/docs/contributing.md new file mode 100644 index 000000000..4a39c2daf --- /dev/null +++ b/docs/ur/docs/contributing.md @@ -0,0 +1,261 @@ +# ترقی - تعاون + +پہلے، آپ [FastAPI کی مدد کریں اور مدد حاصل کریں](help-fastapi.md) کے بنیادی طریقے دیکھنا چاہیں گے۔ + +## ترقی + +اگر آپ نے پہلے ہی [fastapi repository](https://github.com/fastapi/fastapi) clone کر لیا ہے اور code میں گہرائی سے جانا چاہتے ہیں، تو یہاں آپ کا ماحول ترتیب دینے کی کچھ ہدایات ہیں۔ + +### ضروریات install کریں + +Virtual environment بنائیں اور [`uv`](https://github.com/astral-sh/uv) کے ساتھ درکار packages install کریں: + +
+ +```console +$ uv sync --extra all + +---> 100% +``` + +
+ +یہ تمام dependencies اور آپ کا مقامی FastAPI آپ کے مقامی ماحول میں install کر دے گا۔ + +### اپنا مقامی FastAPI استعمال کریں + +اگر آپ ایک Python فائل بناتے ہیں جو FastAPI import اور استعمال کرتی ہے، اور اسے اپنے مقامی ماحول کے Python سے چلاتے ہیں، تو یہ آپ کا clone شدہ مقامی FastAPI source code استعمال کرے گا۔ + +اور اگر آپ اس مقامی FastAPI source code کو اپڈیٹ کرتے ہیں تو جب آپ وہ Python فائل دوبارہ چلائیں گے، یہ FastAPI کا وہ تازہ ورژن استعمال کرے گا جو آپ نے ابھی ترمیم کیا ہے۔ + +اس طرح، ہر تبدیلی ٹیسٹ کرنے کے لیے آپ کو اپنا مقامی ورژن "install" نہیں کرنا پڑتا۔ + +/// note | تکنیکی تفصیلات + +یہ صرف تب ہوتا ہے جب آپ `pip install fastapi` براہ راست چلانے کی بجائے `uv sync --extra all` استعمال کرکے install کرتے ہیں۔ + +اس کی وجہ یہ ہے کہ `uv sync --extra all` بطور default FastAPI کا مقامی ورژن "editable" mode میں install کرتا ہے۔ + +/// + +### Code فارمیٹ کریں + +ایک script ہے جسے آپ چلا سکتے ہیں جو آپ کا سارا code فارمیٹ اور صاف کر دے گی: + +
+ +```console +$ bash scripts/format.sh +``` + +
+ +یہ آپ کے تمام imports کو بھی خودکار طریقے سے ترتیب دے گی۔ + +## Tests + +ایک script ہے جسے آپ مقامی طور پر تمام code ٹیسٹ کرنے اور HTML میں coverage reports بنانے کے لیے چلا سکتے ہیں: + +
+ +```console +$ bash scripts/test-cov-html.sh +``` + +
+ +یہ command `./htmlcov/` directory بناتی ہے، اگر آپ `./htmlcov/index.html` فائل اپنے browser میں کھولیں، تو آپ انٹرایکٹو طریقے سے دیکھ سکتے ہیں کہ code کے کون سے حصے tests سے cover ہیں، اور کوئی حصہ رہ تو نہیں گیا۔ + +## Docs + +پہلے، یقینی بنائیں کہ آپ نے اوپر بیان کردہ طریقے سے اپنا ماحول ترتیب دیا ہے، جو تمام ضروریات install کر دے گا۔ + +### Docs لائیو + +مقامی ترقی کے دوران، ایک script ہے جو سائٹ بناتی ہے اور کسی بھی تبدیلی کو چیک کرتی ہے، لائیو ری لوڈنگ کے ساتھ: + +
+ +```console +$ python ./scripts/docs.py live + +[INFO] Serving on http://127.0.0.1:8008 +[INFO] Start watching changes +[INFO] Start detecting changes +``` + +
+ +یہ documentation کو `http://127.0.0.1:8008` پر serve کرے گا۔ + +اس طرح، آپ documentation/source فائلوں میں ترمیم کر سکتے ہیں اور تبدیلیاں لائیو دیکھ سکتے ہیں۔ + +/// tip | مشورہ + +متبادل طور پر، آپ وہی اقدامات خود دستی طور پر کر سکتے ہیں جو script کرتی ہے۔ + +زبان کی directory میں جائیں، بنیادی docs کے لیے انگریزی میں یہ `docs/en/` پر ہے: + +```console +$ cd docs/en/ +``` + +پھر اس directory میں `mkdocs` چلائیں: + +```console +$ mkdocs serve --dev-addr 127.0.0.1:8008 +``` + +/// + +#### Typer CLI (اختیاری) + +یہاں ہدایات آپ کو دکھاتی ہیں کہ `./scripts/docs.py` script کو `python` program کے ساتھ براہ راست کیسے استعمال کریں۔ + +لیکن آپ [Typer CLI](https://typer.tiangolo.com/typer-cli/) بھی استعمال کر سکتے ہیں، اور completion install کرنے کے بعد آپ کو اپنے terminal میں commands کے لیے autocompletion ملے گی۔ + +اگر آپ Typer CLI install کرتے ہیں، تو آپ اس کے ساتھ completion install کر سکتے ہیں: + +
+ +```console +$ typer --install-completion + +zsh completion installed in /home/user/.bashrc. +Completion will take effect once you restart the terminal. +``` + +
+ +### Docs کی ساخت + +Documentation [MkDocs](https://www.mkdocs.org/) استعمال کرتی ہے۔ + +اور `./scripts/docs.py` میں تراجم کو سنبھالنے کے لیے اضافی tools/scripts موجود ہیں۔ + +/// tip | مشورہ + +آپ کو `./scripts/docs.py` کا code دیکھنے کی ضرورت نہیں، آپ بس اسے command line میں استعمال کرتے ہیں۔ + +/// + +تمام documentation `./docs/en/` directory میں Markdown فارمیٹ میں ہے۔ + +بہت سے tutorials میں code blocks ہوتے ہیں۔ + +زیادہ تر معاملات میں، یہ code blocks مکمل applications ہیں جو جیسے ہیں ویسے چلائی جا سکتی ہیں۔ + +درحقیقت، وہ code blocks Markdown کے اندر نہیں لکھے جاتے، بلکہ `./docs_src/` directory میں Python فائلیں ہیں۔ + +اور وہ Python فائلیں سائٹ generate کرتے وقت documentation میں شامل/inject کی جاتی ہیں۔ + +### Tests کے لیے Docs + +زیادہ تر tests دراصل documentation میں موجود مثالی source فائلوں کے خلاف چلتے ہیں۔ + +اس سے یہ یقینی بنانے میں مدد ملتی ہے کہ: + +* Documentation تازہ ترین ہے۔ +* Documentation کی مثالیں جیسی ہیں ویسی چلائی جا سکتی ہیں۔ +* زیادہ تر features documentation سے cover ہیں، test coverage سے یقینی بنائی گئی ہیں۔ + +#### Apps اور docs بیک وقت + +اگر آپ مثالیں چلاتے ہیں، جیسے: + +
+ +```console +$ fastapi dev tutorial001.py + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +چونکہ Uvicorn بطور default port `8000` استعمال کرتا ہے، port `8008` پر documentation اس سے نہیں ٹکرائے گی۔ + +### تراجم + +تراجم میں مدد بہت زیادہ قدر کی جاتی ہے! اور یہ کمیونٹی کی مدد کے بغیر نہیں ہو سکتا۔ 🌎 🚀 + +ترجمے کی pull requests FastAPI ٹیم کی طرف سے ڈیزائن کردہ prompts سے رہنمائی حاصل کرنے والے LLMs اور ہر supported زبان کے لیے مقامی بولنے والوں کی کمیونٹی کے ساتھ مل کر بنائی جاتی ہیں۔ + +#### فی زبان LLM Prompt + +ہر زبان کی ایک directory ہے: [https://github.com/fastapi/fastapi/tree/master/docs](https://github.com/fastapi/fastapi/tree/master/docs)، اس میں آپ `llm-prompt.md` فائل دیکھ سکتے ہیں جس میں اس زبان کے لیے مخصوص prompt ہے۔ + +مثال کے طور پر، ہسپانوی کے لیے prompt یہاں ہے: [`docs/es/llm-prompt.md`](https://github.com/fastapi/fastapi/blob/master/docs/es/llm-prompt.md)۔ + +اگر آپ کو اپنی زبان میں غلطیاں نظر آئیں، تو آپ اپنی زبان کی فائل میں prompt کے لیے تجاویز دے سکتے ہیں، اور تبدیلیوں کے بعد ان مخصوص pages کی دوبارہ تخلیق کی درخواست کر سکتے ہیں۔ + +#### ترجمے کی PRs کا Review + +آپ اپنی زبان کے لیے موجودہ [pull requests](https://github.com/fastapi/fastapi/pulls) بھی چیک کر سکتے ہیں۔ آپ اپنی زبان کے label کے ساتھ pull requests فلٹر کر سکتے ہیں۔ مثال کے طور پر، ہسپانوی کے لیے label [`lang-es`](https://github.com/fastapi/fastapi/pulls?q=is%3Aopen+sort%3Aupdated-desc+label%3Alang-es+label%3Aawaiting-review) ہے۔ + +Pull request کا review کرتے وقت، بہتر ہے کہ اسی pull request میں تبدیلیاں تجویز نہ کریں، کیونکہ یہ LLM سے generate کیا گیا ہے، اور یہ یقینی بنانا ممکن نہیں ہوگا کہ چھوٹی انفرادی تبدیلیاں دوسرے ملتے جلتے حصوں میں نقل ہوں، یا وہی مواد دوبارہ ترجمہ کرتے وقت محفوظ رہیں۔ + +ترجمے کی PR میں تجاویز شامل کرنے کی بجائے، اس زبان کی LLM prompt فائل میں تجاویز دیں، ایک نئی PR میں۔ مثال کے طور پر، ہسپانوی کی LLM prompt فائل یہاں ہے: [`docs/es/llm-prompt.md`](https://github.com/fastapi/fastapi/blob/master/docs/es/llm-prompt.md)۔ + +/// tip | مشورہ + +[Pull request review شامل کرنے](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-request-reviews) کے بارے میں docs چیک کریں تاکہ اسے منظور یا تبدیلیوں کی درخواست کر سکیں۔ + +/// + +#### اپنی زبان کے لیے Notifications سبسکرائب کریں + +چیک کریں کہ آیا آپ کی زبان کے تراجم کی coordination کے لیے [GitHub Discussion](https://github.com/fastapi/fastapi/discussions/categories/translations) ہے۔ آپ اسے سبسکرائب کر سکتے ہیں، اور جب review کے لیے نئی pull request ہوگی، discussion میں خودکار تبصرہ شامل کیا جائے گا۔ + +آپ جس زبان کا ترجمہ کرنا چاہتے ہیں اس کا 2 حرفی code جاننے کے لیے [List of ISO 639-1 codes](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) کا جدول استعمال کر سکتے ہیں۔ + +#### نئی زبان کی درخواست + +فرض کریں کہ آپ ایسی زبان کے تراجم کی درخواست کرنا چاہتے ہیں جس کا ابھی تک ترجمہ نہیں ہوا، کوئی page بھی نہیں۔ مثال کے طور پر، لاطینی۔ + +* پہلا قدم یہ ہوگا کہ آپ 2 اور لوگ تلاش کریں جو آپ کے ساتھ اس زبان کے لیے ترجمے کی PRs کا review کرنے کو تیار ہوں۔ +* جب کم از کم 3 لوگ اس زبان کی دیکھ بھال میں مدد کا عہد کرنے کو تیار ہوں، تو آپ اگلے اقدامات جاری رکھ سکتے ہیں۔ +* Template کے مطابق نئی discussion بنائیں۔ +* اپنے ساتھ مدد کرنے والے 2 دوسرے لوگوں کو tag کریں، اور ان سے وہاں تصدیق کرنے کو کہیں کہ وہ مدد کریں گے۔ + +جب discussion میں کئی لوگ ہوں، FastAPI ٹیم اس کا جائزہ لے سکتی ہے اور اسے سرکاری ترجمہ بنا سکتی ہے۔ + +پھر docs خودکار طور پر LLMs کے ذریعے ترجمہ ہوں گے، اور مقامی بولنے والوں کی ٹیم ترجمے کا review کر سکتی ہے، اور LLM prompts کو بہتر بنانے میں مدد کر سکتی ہے۔ + +جب نیا ترجمہ ہوگا، مثال کے طور پر اگر docs اپڈیٹ ہوں یا نیا سیکشن ہو، تو اسی discussion میں review کے لیے نئے ترجمے کے link کے ساتھ تبصرہ آئے گا۔ + +## خودکار Code اور AI + +آپ کو ہر وہ tool استعمال کرنے کی ترغیب دی جاتی ہے جو آپ چاہیں تاکہ اپنا کام کریں اور جتنا ہو سکے مؤثر طریقے سے تعاون کریں، بشمول AI (LLM) tools وغیرہ۔ تاہم، تعاون میں بامعنی انسانی مداخلت، فیصلے، سیاق و سباق وغیرہ ہونا چاہیے۔ + +اگر PR میں لگائی گئی **انسانی محنت**، جیسے LLM prompts لکھنا، اس **محنت سے کم** ہے جو ہمیں اسے **review** کرنے میں لگانی ہوگی، تو براہ کرم PR **جمع نہ کریں**۔ + +اس طرح سوچیں: ہم خود LLM prompts لکھ سکتے ہیں یا خودکار tools چلا سکتے ہیں، اور یہ بیرونی PRs کا review کرنے سے تیز ہوگا۔ + +### خودکار اور AI PRs بند کرنا + +اگر ہمیں ایسی PRs نظر آئیں جو AI سے generate کی گئی یا اسی طرح خودکار لگتی ہیں، تو ہم انہیں flag کرکے بند کر دیں گے۔ + +یہی تبصروں اور تفصیلات پر بھی لاگو ہوتا ہے، براہ کرم LLM سے generate کیا گیا مواد copy paste نہ کریں۔ + +### انسانی محنت پر Denial of Service + +خودکار tools اور AI کا استعمال کرکے ایسی PRs یا تبصرے جمع کرنا جنہیں ہمیں احتیاط سے review اور سنبھالنا ہو، ہماری انسانی محنت پر [Denial-of-service attack](https://en.wikipedia.org/wiki/Denial-of-service_attack) کے مترادف ہوگا۔ + +PR جمع کرنے والے شخص کی طرف سے بہت کم محنت (ایک LLM prompt) ہماری طرف سے بڑی مقدار میں محنت (احتیاط سے code کا review) پیدا کرتی ہے۔ + +براہ کرم ایسا نہ کریں۔ + +ہمیں بار بار خودکار PRs یا تبصروں سے spam کرنے والے اکاؤنٹس کو block کرنا ہوگا۔ + +### Tools سمجھداری سے استعمال کریں + +جیسا کہ Uncle Ben نے کہا: + +
+بڑی طاقت tools کے ساتھ بڑی ذمہ داری آتی ہے۔ +
+ +نادانستہ طور پر نقصان پہنچانے سے بچیں۔ + +آپ کے پاس حیرت انگیز tools ہیں، انہیں سمجھداری سے مؤثر طریقے سے مدد کرنے کے لیے استعمال کریں۔ diff --git a/docs/ur/docs/deployment/cloud.md b/docs/ur/docs/deployment/cloud.md new file mode 100644 index 000000000..1f293c2d9 --- /dev/null +++ b/docs/ur/docs/deployment/cloud.md @@ -0,0 +1,24 @@ +# Cloud Providers پر FastAPI Deploy کریں { #deploy-fastapi-on-cloud-providers } + +آپ اپنی FastAPI ایپلیکیشن deploy کرنے کے لیے عملی طور پر **کوئی بھی cloud provider** استعمال کر سکتے ہیں۔ + +زیادہ تر معاملات میں، بڑے cloud providers کے پاس FastAPI کو ان کے ساتھ deploy کرنے کی رہنما دستاویزات موجود ہیں۔ + +## FastAPI Cloud { #fastapi-cloud } + +**[FastAPI Cloud](https://fastapicloud.com)** اسی مصنف اور ٹیم نے بنایا ہے جو **FastAPI** کے پیچھے ہے۔ + +یہ کم سے کم محنت کے ساتھ API **بنانے**، **deploy کرنے**، اور **رسائی حاصل کرنے** کے عمل کو آسان بناتا ہے۔ + +یہ FastAPI کے ساتھ apps بنانے کا وہی **developer experience** cloud پر **deploy** کرنے میں لاتا ہے۔ 🎉 + +FastAPI Cloud *FastAPI اور دوستوں* کے اوپن سورس منصوبوں کا بنیادی کفیل اور فنڈنگ فراہم کنندہ ہے۔ ✨ + +## Cloud Providers - کفیل { #cloud-providers-sponsors } + +کچھ اور cloud providers ✨ [**FastAPI کی کفالت**](../help-fastapi.md#sponsor-the-author) ✨ بھی کرتے ہیں۔ 🙇 + +آپ ان کی رہنما دستاویزات کی پیروی اور ان کی خدمات آزمانے پر بھی غور کر سکتے ہیں: + +* [Render](https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi) +* [Railway](https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi) diff --git a/docs/ur/docs/deployment/concepts.md b/docs/ur/docs/deployment/concepts.md new file mode 100644 index 000000000..1a87f1921 --- /dev/null +++ b/docs/ur/docs/deployment/concepts.md @@ -0,0 +1,321 @@ +# Deployment کے تصورات { #deployments-concepts } + +**FastAPI** ایپلیکیشن، یا درحقیقت کسی بھی قسم کی web API deploy کرتے وقت، کئی تصورات ہیں جن کی آپ کو فکر ہوتی ہے، اور ان کا استعمال کرتے ہوئے آپ اپنی **ایپلیکیشن deploy کرنے** کا **سب سے موزوں** طریقہ تلاش کر سکتے ہیں۔ + +کچھ اہم تصورات یہ ہیں: + +* سیکیورٹی - HTTPS +* شروع ہونے پر چلنا +* دوبارہ شروع ہونا +* نقل (چلنے والے processes کی تعداد) +* میموری +* شروع ہونے سے پہلے کے مراحل + +ہم دیکھیں گے کہ یہ **deployments** کو کیسے متاثر کرتے ہیں۔ + +آخر میں، حتمی مقصد یہ ہے کہ آپ اپنے **API صارفین کو** ایسے طریقے سے خدمت فراہم کر سکیں جو **محفوظ** ہو، **رکاوٹوں سے بچے**، اور **compute resources** (مثلاً remote servers/virtual machines) کو زیادہ سے زیادہ مؤثر طریقے سے استعمال کرے۔ 🚀 + +میں آپ کو یہاں ان **تصورات** کے بارے میں کچھ اور بتاؤں گا، اور اس سے امید ہے کہ آپ کو وہ **سمجھ** ملے گی جس کی آپ کو بہت مختلف ماحول میں اپنی API deploy کرنے کے فیصلے کے لیے ضرورت ہوگی، حتیٰ کہ ممکنہ طور پر **مستقبل** کے ایسے ماحول میں بھی جو ابھی موجود نہیں ہیں۔ + +ان تصورات پر غور کر کے، آپ اپنی **APIs** کو deploy کرنے کا بہترین طریقہ **جانچنے اور ڈیزائن** کرنے کے قابل ہوں گے۔ + +اگلے ابواب میں، میں آپ کو FastAPI ایپلیکیشنز deploy کرنے کی مزید **عملی ترکیبیں** دوں گا۔ + +لیکن ابھی کے لیے، آئیے ان اہم **تصوراتی خیالات** کو دیکھتے ہیں۔ یہ تصورات کسی بھی دوسری قسم کی web API پر بھی لاگو ہوتے ہیں۔ 💡 + +## سیکیورٹی - HTTPS { #security-https } + +[HTTPS کے بارے میں پچھلے باب](https.md) میں ہم نے سیکھا کہ HTTPS آپ کی API کے لیے کس طرح encryption فراہم کرتا ہے۔ + +ہم نے یہ بھی دیکھا کہ HTTPS عام طور پر آپ کے application server سے **بیرونی** جزو، ایک **TLS Termination Proxy** کے ذریعے فراہم کیا جاتا ہے۔ + +اور **HTTPS certificates کی تجدید** کے ذمہ دار کسی چیز کا ہونا ضروری ہے، یہ وہی جزو ہو سکتا ہے یا کوئی مختلف چیز ہو سکتی ہے۔ + +### HTTPS کے لیے ٹولز کی مثالیں { #example-tools-for-https } + +TLS Termination Proxy کے طور پر آپ جو ٹولز استعمال کر سکتے ہیں ان میں سے کچھ یہ ہیں: + +* Traefik + * خود بخود certificates کی تجدید سنبھالتا ہے ✨ +* Caddy + * خود بخود certificates کی تجدید سنبھالتا ہے ✨ +* Nginx + * certificate کی تجدید کے لیے Certbot جیسے بیرونی جزو کے ساتھ +* HAProxy + * certificate کی تجدید کے لیے Certbot جیسے بیرونی جزو کے ساتھ +* Kubernetes ایک Ingress Controller جیسے Nginx کے ساتھ + * certificate کی تجدید کے لیے cert-manager جیسے بیرونی جزو کے ساتھ +* cloud provider کے ذریعے ان کی خدمات کے حصے کے طور پر اندرونی طور پر سنبھالا جاتا ہے (نیچے پڑھیں 👇) + +ایک اور اختیار یہ ہے کہ آپ ایک **cloud service** استعمال کر سکتے ہیں جو HTTPS ترتیب دینے سمیت زیادہ کام کرے۔ اس میں کچھ پابندیاں ہو سکتی ہیں یا آپ سے زیادہ معاوضہ لیا جا سکتا ہے، وغیرہ۔ لیکن اس صورت میں، آپ کو خود TLS Termination Proxy ترتیب دینے کی ضرورت نہیں ہوگی۔ + +میں آپ کو اگلے ابواب میں کچھ ٹھوس مثالیں دکھاؤں گا۔ + +--- + +پھر غور کرنے والے اگلے تصورات سب آپ کی اصل API چلانے والے پروگرام (مثلاً Uvicorn) کے بارے میں ہیں۔ + +## پروگرام اور Process { #program-and-process } + +ہم چلنے والے "**process**" کے بارے میں بہت بات کریں گے، اس لیے اس بارے میں واضح ہونا مفید ہے کہ اس کا مطلب کیا ہے، اور "**program**" کے لفظ سے کیا فرق ہے۔ + +### پروگرام کیا ہے { #what-is-a-program } + +**پروگرام** کا لفظ عام طور پر بہت سی چیزوں کے لیے استعمال ہوتا ہے: + +* وہ **کوڈ** جو آپ لکھتے ہیں، **Python فائلیں**۔ +* وہ **فائل** جسے آپریٹنگ سسٹم **چلا** سکتا ہے، مثلاً: `python`، `python.exe` یا `uvicorn`۔ +* ایک مخصوص پروگرام جب یہ آپریٹنگ سسٹم پر **چل** رہا ہو، CPU استعمال کر رہا ہو، اور چیزیں میموری میں محفوظ کر رہا ہو۔ اسے **process** بھی کہتے ہیں۔ + +### Process کیا ہے { #what-is-a-process } + +**Process** کا لفظ عام طور پر زیادہ مخصوص انداز میں استعمال ہوتا ہے، صرف اس چیز کا حوالہ دیتے ہوئے جو آپریٹنگ سسٹم میں چل رہی ہے (جیسا کہ اوپر آخری نکتے میں بتایا گیا): + +* ایک مخصوص پروگرام جب یہ آپریٹنگ سسٹم پر **چل** رہا ہو۔ + * یہ فائل کا حوالہ نہیں دیتا، نہ ہی کوڈ کا، یہ **خاص طور پر** اس چیز کا حوالہ دیتا ہے جو آپریٹنگ سسٹم کے ذریعے **چلائی** اور منظم کی جا رہی ہے۔ +* کوئی بھی پروگرام، کوئی بھی کوڈ، **صرف تبھی کچھ کر سکتا ہے** جب یہ **چلایا** جا رہا ہو۔ تو، جب ایک **process چل** رہا ہو۔ +* process کو آپ یا آپریٹنگ سسٹم **ختم** (یا "kill") کر سکتا ہے۔ اس وقت، یہ چلنا/عمل درآمد ہونا بند ہو جاتا ہے، اور یہ **مزید کچھ نہیں کر سکتا**۔ +* آپ کے کمپیوٹر پر چلنے والی ہر ایپلیکیشن کے پیچھے کوئی process ہوتا ہے، ہر چلنے والا پروگرام، ہر ونڈو، وغیرہ۔ اور عام طور پر کمپیوٹر آن ہونے پر **ایک ہی وقت میں** بہت سے processes چل رہے ہوتے ہیں۔ +* **ایک ہی پروگرام** کے **متعدد processes** ایک ہی وقت میں چل سکتے ہیں۔ + +اگر آپ اپنے آپریٹنگ سسٹم میں "task manager" یا "system monitor" (یا اسی طرح کے ٹولز) دیکھیں، تو آپ ان میں سے بہت سے processes چلتے ہوئے دیکھ سکیں گے۔ + +اور، مثال کے طور پر، آپ شاید دیکھیں گے کہ ایک ہی browser پروگرام (Firefox، Chrome، Edge، وغیرہ) کے متعدد processes چل رہے ہیں۔ وہ عام طور پر ہر ٹیب کے لیے ایک process چلاتے ہیں، اس کے علاوہ کچھ اضافی processes بھی۔ + + + +--- + +اب جب ہم **process** اور **program** کی اصطلاحات کے درمیان فرق جان گئے ہیں، تو آئیے deployments کے بارے میں بات جاری رکھیں۔ + +## شروع ہونے پر چلنا { #running-on-startup } + +زیادہ تر معاملات میں، جب آپ web API بناتے ہیں، تو آپ چاہتے ہیں کہ یہ **ہمیشہ چلتی** رہے، بلا رکاوٹ، تاکہ آپ کے صارفین ہمیشہ اس تک رسائی حاصل کر سکیں۔ یہ یقیناً اس صورت میں ہے جب تک کہ آپ کے پاس کوئی خاص وجہ نہ ہو کہ آپ اسے صرف مخصوص حالات میں چلانا چاہتے ہیں، لیکن زیادہ تر وقت آپ چاہتے ہیں کہ یہ مسلسل چلتی رہے اور **دستیاب** ہو۔ + +### Remote Server میں { #in-a-remote-server } + +جب آپ remote server (cloud server، virtual machine وغیرہ) ترتیب دیتے ہیں تو سب سے آسان کام جو آپ کر سکتے ہیں وہ ہے `fastapi run` (جو Uvicorn استعمال کرتا ہے) یا کچھ ایسا ہی دستی طور پر استعمال کرنا، بالکل اسی طرح جیسے آپ مقامی طور پر development کے دوران کرتے ہیں۔ + +اور یہ کام کرے گا اور **development کے دوران** مفید ہوگا۔ + +لیکن اگر server سے آپ کا کنکشن ٹوٹ جائے، تو **چلنے والا process** شاید ختم ہو جائے گا۔ + +اور اگر server دوبارہ شروع ہوتا ہے (مثلاً updates یا cloud provider کی migrations کے بعد) تو آپ کو شاید **اس کا پتا بھی نہیں چلے گا**۔ اور اس وجہ سے، آپ کو یہ بھی معلوم نہیں ہوگا کہ آپ کو process دستی طور پر دوبارہ شروع کرنا ہے۔ تو، آپ کی API بس بند رہے گی۔ 😱 + +### شروع ہونے پر خود بخود چلنا { #run-automatically-on-startup } + +عام طور پر، آپ شاید چاہیں گے کہ server پروگرام (مثلاً Uvicorn) server شروع ہونے پر خود بخود شروع ہو جائے، اور بغیر کسی **انسانی مداخلت** کے، تاکہ آپ کی API کے ساتھ ہمیشہ ایک process چلتا رہے (مثلاً Uvicorn آپ کی FastAPI app چلا رہا ہو)۔ + +### الگ پروگرام { #separate-program } + +اسے حاصل کرنے کے لیے، آپ کے پاس عام طور پر ایک **الگ پروگرام** ہوگا جو اس بات کو یقینی بنائے گا کہ آپ کی ایپلیکیشن شروع ہونے پر چلے۔ اور بہت سے معاملات میں، یہ دوسرے اجزاء یا ایپلیکیشنز بھی چلانے کو یقینی بنائے گا، مثلاً ایک ڈیٹابیس۔ + +### شروع ہونے پر چلانے کے لیے ٹولز کی مثالیں { #example-tools-to-run-at-startup } + +یہ کام کرنے والے کچھ ٹولز کی مثالیں یہ ہیں: + +* Docker +* Kubernetes +* Docker Compose +* Docker in Swarm Mode +* Systemd +* Supervisor +* cloud provider کے ذریعے ان کی خدمات کے حصے کے طور پر اندرونی طور پر سنبھالا جاتا ہے +* دیگر... + +میں آپ کو اگلے ابواب میں مزید ٹھوس مثالیں دوں گا۔ + +## دوبارہ شروع ہونا { #restarts } + +شروع ہونے پر اپنی ایپلیکیشن چلنے کو یقینی بنانے کی طرح، آپ شاید یہ بھی یقینی بنانا چاہیں گے کہ ناکامیوں کے بعد یہ **دوبارہ شروع** ہو جائے۔ + +### ہم سے غلطیاں ہوتی ہیں { #we-make-mistakes } + +ہم، بحیثیت انسان، ہر وقت **غلطیاں** کرتے ہیں۔ سافٹ ویئر میں تقریباً *ہمیشہ* مختلف جگہوں پر **bugs** چھپے ہوتے ہیں۔ 🐛 + +اور ہم بحیثیت developers جب ان bugs تلاش کرتے ہیں اور نئے فیچرز شامل کرتے ہیں تو کوڈ کو بہتر بناتے رہتے ہیں (شاید نئے bugs بھی شامل کرتے ہوئے 😅)۔ + +### چھوٹی خرابیاں خود بخود سنبھالی جاتی ہیں { #small-errors-automatically-handled } + +FastAPI کے ساتھ web APIs بناتے وقت، اگر ہمارے کوڈ میں کوئی خرابی ہو، تو FastAPI عام طور پر اسے اس واحد request تک محدود رکھے گی جس نے خرابی کو متحرک کیا۔ 🛡 + +صارف کو اس request کے لیے **500 Internal Server Error** ملے گی، لیکن ایپلیکیشن مکمل طور پر بند ہونے کے بجائے اگلی requests کے لیے کام کرتی رہے گی۔ + +### بڑی خرابیاں - بند ہو جانا { #bigger-errors-crashes } + +تاہم، ایسے معاملات ہو سکتے ہیں جہاں ہم ایسا کوڈ لکھتے ہیں جو **پوری ایپلیکیشن کو بند کر دیتا ہے** جس سے Uvicorn اور Python بند ہو جاتے ہیں۔ 💥 + +اور پھر بھی، آپ شاید نہیں چاہیں گے کہ ایپلیکیشن اس لیے بند رہے کہ ایک جگہ خرابی تھی، آپ شاید چاہیں گے کہ یہ کم از کم ان *path operations* کے لیے **چلتی رہے** جو خراب نہیں ہیں۔ + +### بند ہونے کے بعد دوبارہ شروع { #restart-after-crash } + +لیکن ان معاملات میں جہاں واقعی بری خرابیاں چلتے ہوئے **process** کو بند کر دیتی ہیں، آپ ایک بیرونی جزو چاہیں گے جو process کو **دوبارہ شروع** کرنے کا ذمہ دار ہو، کم از کم چند بار... + +/// tip | مشورہ + +...اگرچہ اگر پوری ایپلیکیشن **فوری طور پر بند ہو رہی ہے** تو شاید اسے ہمیشہ کے لیے دوبارہ شروع کرتے رہنا معقول نہیں ہے۔ لیکن ان معاملات میں، آپ کو شاید development کے دوران، یا کم از کم deployment کے فوراً بعد اس کا پتا چل جائے گا۔ + +تو آئیے ان اصل معاملات پر توجہ مرکوز کریں، جہاں یہ **مستقبل میں** کچھ خاص معاملات میں مکمل طور پر بند ہو سکتا ہے، اور اسے دوبارہ شروع کرنا معقول ہے۔ + +/// + +آپ شاید اپنی ایپلیکیشن دوبارہ شروع کرنے کے ذمہ دار کو ایک **بیرونی جزو** کے طور پر رکھنا چاہیں گے، کیونکہ اس وقت، Uvicorn اور Python کے ساتھ وہی ایپلیکیشن پہلے ہی بند ہو چکی ہوتی ہے، تو اسی app کے اسی کوڈ میں کچھ بھی نہیں ہے جو اس کے بارے میں کچھ کر سکے۔ + +### خود بخود دوبارہ شروع کرنے کے لیے ٹولز کی مثالیں { #example-tools-to-restart-automatically } + +زیادہ تر معاملات میں، وہی ٹول جو **پروگرام کو شروع ہونے پر چلانے** کے لیے استعمال ہوتا ہے، خود بخود **دوبارہ شروع** کرنے کو سنبھالنے کے لیے بھی استعمال ہوتا ہے۔ + +مثال کے طور پر، یہ ان کے ذریعے سنبھالا جا سکتا ہے: + +* Docker +* Kubernetes +* Docker Compose +* Docker in Swarm Mode +* Systemd +* Supervisor +* cloud provider کے ذریعے ان کی خدمات کے حصے کے طور پر اندرونی طور پر سنبھالا جاتا ہے +* دیگر... + +## نقل - Processes اور میموری { #replication-processes-and-memory } + +FastAPI ایپلیکیشن کے ساتھ، `fastapi` command جیسے server پروگرام کا استعمال کرتے ہوئے جو Uvicorn چلاتا ہے، اسے ایک بار **ایک process** میں چلانے سے متعدد صارفین کو بیک وقت خدمت فراہم کی جا سکتی ہے۔ + +لیکن بہت سے معاملات میں، آپ ایک ہی وقت میں کئی worker processes چلانا چاہیں گے۔ + +### متعدد Processes - Workers { #multiple-processes-workers } + +اگر آپ کے پاس ایک process سے زیادہ صارفین ہیں (مثلاً اگر virtual machine بہت بڑی نہیں ہے) اور server کے CPU میں **متعدد cores** ہیں، تو آپ ایک ہی وقت میں ایک ہی ایپلیکیشن کے **متعدد processes** چلا سکتے ہیں، اور تمام requests ان میں تقسیم کر سکتے ہیں۔ + +جب آپ ایک ہی API پروگرام کے **متعدد processes** چلاتے ہیں، تو انہیں عام طور پر **workers** کہا جاتا ہے۔ + +### Worker Processes اور Ports { #worker-processes-and-ports } + +[HTTPS کے بارے میں](https.md) دستاویزات سے یاد ہے کہ server میں ایک port اور IP ایڈریس کے مجموعے پر صرف ایک process سن سکتا ہے؟ + +یہ ابھی بھی درست ہے۔ + +تو، ایک ہی وقت میں **متعدد processes** رکھنے کے لیے، ایک **واحد process کا port پر سننا** ضروری ہے جو پھر ہر worker process کو کسی طرح سے مواصلت منتقل کرے۔ + +### فی Process میموری { #memory-per-process } + +اب، جب پروگرام چیزیں میموری میں لوڈ کرتا ہے، مثلاً ایک machine learning ماڈل کسی variable میں، یا کسی بڑی فائل کا مواد کسی variable میں، تو یہ سب server کی **میموری (RAM) کا کچھ حصہ استعمال** کرتا ہے۔ + +اور متعدد processes عام طور پر **کوئی میموری شیئر نہیں کرتے**۔ اس کا مطلب ہے کہ ہر چلنے والے process کی اپنی چیزیں، variables اور میموری ہوتی ہے۔ اور اگر آپ اپنے کوڈ میں بڑی مقدار میں میموری استعمال کر رہے ہیں، تو **ہر process** اتنی ہی میموری استعمال کرے گا۔ + +### Server کی میموری { #server-memory } + +مثال کے طور پر، اگر آپ کا کوڈ **1 GB سائز** کا Machine Learning ماڈل لوڈ کرتا ہے، جب آپ اپنی API کے ساتھ ایک process چلاتے ہیں، تو یہ کم از کم 1 GB RAM استعمال کرے گا۔ اور اگر آپ **4 processes** (4 workers) شروع کرتے ہیں، تو ہر ایک 1 GB RAM استعمال کرے گا۔ تو مجموعی طور پر، آپ کی API **4 GB RAM** استعمال کرے گی۔ + +اور اگر آپ کے remote server یا virtual machine میں صرف 3 GB RAM ہے، تو 4 GB سے زیادہ RAM لوڈ کرنے کی کوشش مسائل پیدا کرے گی۔ 🚨 + +### متعدد Processes - ایک مثال { #multiple-processes-an-example } + +اس مثال میں، ایک **Manager Process** ہے جو دو **Worker Processes** کو شروع اور کنٹرول کرتا ہے۔ + +یہ Manager Process شاید وہ ہوگا جو IP میں **port** پر سن رہا ہو۔ اور یہ تمام مواصلت worker processes کو منتقل کرے گا۔ + +وہ worker processes وہ ہوں گے جو آپ کی ایپلیکیشن چلا رہے ہوں گے، وہ **request** وصول کرنے اور **response** واپس کرنے کے لیے اصل حسابات انجام دیں گے، اور وہ آپ کی variables میں ڈالی گئی کوئی بھی چیز RAM میں لوڈ کریں گے۔ + + + +اور یقیناً، اسی مشین پر آپ کی ایپلیکیشن کے علاوہ شاید **دوسرے processes** بھی چل رہے ہوں گے۔ + +ایک دلچسپ بات یہ ہے کہ ہر process کی **CPU استعمال** کی فیصد وقت کے ساتھ **بہت زیادہ تبدیل** ہو سکتی ہے، لیکن **میموری (RAM)** عام طور پر کم و بیش **مستحکم** رہتی ہے۔ + +اگر آپ کے پاس ایسی API ہے جو ہر بار تقریباً یکساں مقدار میں حسابات کرتی ہے اور آپ کے بہت سے صارفین ہیں، تو **CPU کا استعمال** شاید *بھی مستحکم* ہوگا (مسلسل اوپر نیچے جانے کے بجائے)۔ + +### نقل کے ٹولز اور حکمت عملیوں کی مثالیں { #examples-of-replication-tools-and-strategies } + +اسے حاصل کرنے کے کئی طریقے ہو سکتے ہیں، اور میں آپ کو اگلے ابواب میں مخصوص حکمت عملیوں کے بارے میں مزید بتاؤں گا، مثلاً Docker اور containers کے بارے میں بات کرتے وقت۔ + +غور کرنے کی بنیادی پابندی یہ ہے کہ **عوامی IP** میں **port** سنبھالنے والا ایک **واحد** جزو ہونا ضروری ہے۔ اور پھر اس کے پاس نقل شدہ **processes/workers** کو مواصلت **منتقل** کرنے کا کوئی طریقہ ہونا ضروری ہے۔ + +یہاں کچھ ممکنہ مجموعے اور حکمت عملیاں ہیں: + +* **Uvicorn** `--workers` کے ساتھ + * ایک Uvicorn **process manager** **IP** اور **port** پر سنے گا، اور یہ **متعدد Uvicorn worker processes** شروع کرے گا۔ +* **Kubernetes** اور دوسرے تقسیم شدہ **container systems** + * **Kubernetes** پرت میں کوئی چیز **IP** اور **port** پر سنے گی۔ نقل **متعدد containers** رکھ کر ہوگی، ہر ایک میں **ایک Uvicorn process** چل رہا ہوگا۔ +* **Cloud services** جو یہ آپ کے لیے سنبھالتی ہیں + * cloud service شاید **آپ کے لیے نقل سنبھالے گی**۔ یہ ممکنہ طور پر آپ کو **چلانے کے لیے ایک process** یا استعمال کرنے کے لیے ایک **container image** تعین کرنے دے گی، کسی بھی صورت میں، یہ شاید **ایک واحد Uvicorn process** ہوگا، اور cloud service اس کی نقل کی ذمہ دار ہوگی۔ + +/// tip | مشورہ + +اگر **containers**، Docker، یا Kubernetes کے بارے میں ان میں سے کچھ آئٹمز ابھی زیادہ واضح نہیں ہیں تو فکر نہ کریں۔ + +میں آپ کو container images، Docker، Kubernetes وغیرہ کے بارے میں ایک آئندہ باب میں مزید بتاؤں گا: [FastAPI in Containers - Docker](docker.md)۔ + +/// + +## شروع ہونے سے پہلے کے مراحل { #previous-steps-before-starting } + +بہت سے معاملات ہیں جہاں آپ اپنی ایپلیکیشن **شروع ہونے سے پہلے** کچھ مراحل انجام دینا چاہتے ہیں۔ + +مثال کے طور پر، آپ شاید **database migrations** چلانا چاہیں۔ + +لیکن زیادہ تر معاملات میں، آپ یہ مراحل صرف **ایک بار** انجام دینا چاہیں گے۔ + +تو، ایپلیکیشن شروع کرنے سے پہلے ان **پچھلے مراحل** کو انجام دینے کے لیے آپ ایک **واحد process** رکھنا چاہیں گے۔ + +اور آپ کو اس بات کو یقینی بنانا ہوگا کہ یہ واحد process ان پچھلے مراحل کو چلائے *چاہے* بعد میں آپ خود ایپلیکیشن کے لیے **متعدد processes** (متعدد workers) شروع کریں۔ اگر یہ مراحل **متعدد processes** کے ذریعے چلائے جائیں، تو وہ **متوازی** طور پر چلا کر کام کی **نقل** کریں گے، اور اگر مراحل کوئی نازک چیز ہوں جیسے database migration، تو وہ ایک دوسرے سے ٹکراؤ پیدا کر سکتے ہیں۔ + +یقیناً، کچھ معاملات ایسے ہیں جہاں پچھلے مراحل کو کئی بار چلانے میں کوئی مسئلہ نہیں ہے، اس صورت میں اسے سنبھالنا بہت آسان ہے۔ + +/// tip | مشورہ + +اس بات کو بھی ذہن میں رکھیں کہ آپ کے سیٹ اپ پر منحصر ہے، کچھ معاملات میں آپ کو اپنی ایپلیکیشن شروع کرنے سے پہلے **کسی پچھلے مرحلے کی ضرورت ہی نہ ہو**۔ + +اس صورت میں، آپ کو اس میں سے کسی کے بارے میں فکر کرنے کی ضرورت نہیں ہوگی۔ 🤷 + +/// + +### پچھلے مراحل کی حکمت عملیوں کی مثالیں { #examples-of-previous-steps-strategies } + +یہ بہت زیادہ اس بات پر **منحصر** ہوگا کہ آپ **اپنا سسٹم کیسے deploy** کرتے ہیں، اور یہ شاید پروگرامز شروع کرنے، دوبارہ شروع کرنے وغیرہ کے طریقے سے جڑا ہوگا۔ + +یہاں کچھ ممکنہ خیالات ہیں: + +* Kubernetes میں "Init Container" جو آپ کے app container سے پہلے چلے +* ایک bash script جو پچھلے مراحل چلائے اور پھر آپ کی ایپلیکیشن شروع کرے + * آپ کو پھر بھی *اس* bash script کو شروع/دوبارہ شروع کرنے، خرابیوں کا پتا لگانے وغیرہ کا طریقہ درکار ہوگا۔ + +/// tip | مشورہ + +میں آپ کو containers کے ساتھ ایسا کرنے کی مزید ٹھوس مثالیں ایک آئندہ باب میں دوں گا: [FastAPI in Containers - Docker](docker.md)۔ + +/// + +## وسائل کا استعمال { #resource-utilization } + +آپ کا/کے server(s) ایک **وسیلہ** ہے/ہیں، آپ اپنے پروگراموں سے استعمال کر سکتے ہیں، CPUs پر حساب کا وقت، اور دستیاب RAM میموری۔ + +آپ سسٹم کے کتنے وسائل استعمال کرنا چاہتے ہیں؟ یہ سوچنا آسان ہو سکتا ہے "زیادہ نہیں"، لیکن حقیقت میں، آپ شاید **بند ہوئے بغیر زیادہ سے زیادہ** استعمال کرنا چاہیں گے۔ + +اگر آپ 3 servers کے لیے ادائیگی کر رہے ہیں لیکن ان کی RAM اور CPU کا صرف تھوڑا سا استعمال کر رہے ہیں، تو آپ شاید **پیسے ضائع کر رہے ہیں** 💸، اور شاید **server کی بجلی بھی ضائع کر رہے ہیں** 🌎، وغیرہ۔ + +اس صورت میں، صرف 2 servers رکھنا اور ان کے وسائل (CPU، میموری، ڈسک، نیٹ ورک bandwidth وغیرہ) کا زیادہ فیصد استعمال کرنا بہتر ہو سکتا ہے۔ + +دوسری طرف، اگر آپ کے پاس 2 servers ہیں اور آپ ان کی **CPU اور RAM کا 100%** استعمال کر رہے ہیں، تو کسی وقت ایک process مزید میموری مانگے گا، اور server کو ڈسک کو "میموری" کے طور پر استعمال کرنا پڑے گا (جو ہزاروں گنا سست ہو سکتا ہے)، یا حتیٰ کہ **بند ہو سکتا ہے**۔ یا ایک process کو کچھ حساب کرنے کی ضرورت ہوگی اور اسے CPU دوبارہ خالی ہونے تک انتظار کرنا پڑے گا۔ + +اس صورت میں، **ایک اضافی server** لینا اور اس پر کچھ processes چلانا بہتر ہوگا تاکہ سب کے پاس **کافی RAM اور CPU وقت** ہو۔ + +یہ بھی ممکن ہے کہ کسی وجہ سے آپ کی API کے استعمال میں **اچانک اضافہ** ہو جائے۔ شاید یہ وائرل ہو گئی، یا شاید کچھ دوسری خدمات یا bots اسے استعمال کرنا شروع کر دیں۔ اور آپ ان حالات میں محفوظ رہنے کے لیے اضافی وسائل رکھنا چاہ سکتے ہیں۔ + +آپ ہدف کے لیے ایک **من مانی تعداد** مقرر کر سکتے ہیں، مثلاً وسائل کے استعمال کے **50% سے 90% کے درمیان** کچھ۔ بات یہ ہے کہ شاید یہ وہ اصل چیزیں ہیں جو آپ ناپنا اور اپنے deployments کو بہتر بنانے کے لیے استعمال کرنا چاہیں گے۔ + +آپ اپنے server میں CPU اور RAM کا استعمال یا ہر process کے ذریعے استعمال ہونے والی مقدار دیکھنے کے لیے `htop` جیسے آسان ٹولز استعمال کر سکتے ہیں۔ یا آپ زیادہ پیچیدہ مانیٹرنگ ٹولز استعمال کر سکتے ہیں، جو servers پر تقسیم شدہ ہو سکتے ہیں، وغیرہ۔ + +## خلاصہ { #recap } + +آپ نے یہاں ان اصل تصورات میں سے کچھ پڑھے ہیں جو آپ کو اپنی ایپلیکیشن deploy کرنے کا فیصلہ کرتے وقت ذہن میں رکھنے کی ضرورت ہوگی: + +* سیکیورٹی - HTTPS +* شروع ہونے پر چلنا +* دوبارہ شروع ہونا +* نقل (چلنے والے processes کی تعداد) +* میموری +* شروع ہونے سے پہلے کے مراحل + +ان خیالات کو سمجھنا اور انہیں لاگو کرنے کا طریقہ جاننا آپ کو deployments کو ترتیب اور بہتر بنانے کے فیصلے کرنے کے لیے ضروری سمجھ فراہم کرے۔ 🤓 + +اگلے حصوں میں، میں آپ کو ممکنہ حکمت عملیوں کی مزید ٹھوس مثالیں دوں گا۔ 🚀 diff --git a/docs/ur/docs/deployment/docker.md b/docs/ur/docs/deployment/docker.md new file mode 100644 index 000000000..5905f0459 --- /dev/null +++ b/docs/ur/docs/deployment/docker.md @@ -0,0 +1,618 @@ +# FastAPI in Containers - Docker { #fastapi-in-containers-docker } + +FastAPI ایپلیکیشنز deploy کرتے وقت ایک عام طریقہ **Linux container image** بنانا ہے۔ یہ عام طور پر [**Docker**](https://www.docker.com/) استعمال کرتے ہوئے کیا جاتا ہے۔ پھر آپ اس container image کو کئی ممکنہ طریقوں سے deploy کر سکتے ہیں۔ + +Linux containers استعمال کرنے کے کئی فوائد ہیں بشمول **سیکیورٹی**، **نقل پذیری**، **سادگی**، اور دیگر۔ + +/// tip | مشورہ + +جلدی میں ہیں اور یہ سب پہلے سے جانتے ہیں؟ نیچے [`Dockerfile` 👇](#build-a-docker-image-for-fastapi) پر جائیں۔ + +/// + +
+Dockerfile Preview 👀 + +```Dockerfile +FROM python:3.14 + +WORKDIR /code + +COPY ./requirements.txt /code/requirements.txt + +RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt + +COPY ./app /code/app + +CMD ["fastapi", "run", "app/main.py", "--port", "80"] + +# If running behind a proxy like Nginx or Traefik add --proxy-headers +# CMD ["fastapi", "run", "app/main.py", "--port", "80", "--proxy-headers"] +``` + +
+ +## Container کیا ہے { #what-is-a-container } + +Containers (بنیادی طور پر Linux containers) ایپلیکیشنز کو ان کی تمام dependencies اور ضروری فائلوں سمیت پیکیج کرنے کا ایک بہت **ہلکا** طریقہ ہے جبکہ انہیں اسی سسٹم میں دوسرے containers (دوسری ایپلیکیشنز یا اجزاء) سے الگ رکھتے ہیں۔ + +Linux containers host (مشین، virtual machine، cloud server وغیرہ) کے اسی Linux kernel کا استعمال کرتے ہوئے چلتے ہیں۔ اس کا مطلب ہے کہ وہ بہت ہلکے ہیں (مکمل virtual machines جو پورا آپریٹنگ سسٹم ایمولیٹ کرتی ہیں ان کے مقابلے میں)۔ + +اس طرح، containers **کم وسائل** استعمال کرتے ہیں، processes کو براہ راست چلانے کے مقابلے میں تقریباً اتنی ہی مقدار (virtual machine بہت زیادہ استعمال کرے گی)۔ + +Containers کے اپنے **الگ** چلنے والے processes (عام طور پر صرف ایک process)، فائل سسٹم، اور نیٹ ورک بھی ہوتے ہیں، جو deployment، سیکیورٹی، development وغیرہ کو آسان بناتے ہیں۔ + +## Container Image کیا ہے { #what-is-a-container-image } + +ایک **container** ایک **container image** سے چلایا جاتا ہے۔ + +Container image تمام فائلوں، environment variables، اور ڈیفالٹ command/پروگرام کا ایک **جامد** ورژن ہے جو container میں موجود ہونا چاہیے۔ **جامد** کا مطلب ہے کہ container **image** نہیں چل رہی، عمل درآمد نہیں ہو رہا، یہ صرف پیکیج شدہ فائلیں اور metadata ہے۔ + +"**container image**" جو محفوظ جامد مواد ہے اس کے برعکس، "**container**" عام طور پر چلنے والے instance، اس چیز کا حوالہ دیتا ہے جو **عمل درآمد** ہو رہی ہے۔ + +جب **container** شروع ہوتا ہے اور چل رہا ہوتا ہے (**container image** سے شروع ہوا) تو یہ فائلیں، environment variables وغیرہ بنا یا تبدیل کر سکتا ہے۔ وہ تبدیلیاں صرف اس container میں موجود ہوں گی، لیکن بنیادی container image میں برقرار نہیں رہیں گی (ڈسک پر محفوظ نہیں ہوں گی)۔ + +Container image **پروگرام** فائل اور مواد سے موازنہ کی جا سکتی ہے، مثلاً `python` اور کوئی فائل `main.py`۔ + +اور **container** خود (**container image** کے برعکس) image کا اصل چلنے والا instance ہے، ایک **process** سے موازنہ کیا جا سکتا ہے۔ درحقیقت، ایک container صرف تبھی چل رہا ہوتا ہے جب اس کا **process چل** رہا ہو (اور عام طور پر یہ صرف ایک واحد process ہوتا ہے)۔ جب اس میں کوئی process نہ چل رہا ہو تو container رک جاتا ہے۔ + +## Container Images { #container-images } + +Docker **container images** اور **containers** بنانے اور منظم کرنے کے اہم ٹولز میں سے ایک رہا ہے۔ + +اور ایک عوامی [Docker Hub](https://hub.docker.com/) ہے جس میں بہت سے ٹولز، ماحول، ڈیٹابیسز اور ایپلیکیشنز کے لیے پہلے سے بنی **سرکاری container images** ہیں۔ + +مثال کے طور پر، ایک سرکاری [Python Image](https://hub.docker.com/_/python) ہے۔ + +اور ڈیٹابیسز جیسی مختلف چیزوں کے لیے بہت سی اور images ہیں، مثلاً: + +* [PostgreSQL](https://hub.docker.com/_/postgres) +* [MySQL](https://hub.docker.com/_/mysql) +* [MongoDB](https://hub.docker.com/_/mongo) +* [Redis](https://hub.docker.com/_/redis) وغیرہ۔ + +پہلے سے بنی container image استعمال کرنے سے مختلف ٹولز کو **ملانا** اور استعمال کرنا بہت آسان ہے۔ مثال کے طور پر، نیا ڈیٹابیس آزمانے کے لیے۔ زیادہ تر معاملات میں، آپ **سرکاری images** استعمال کر سکتے ہیں، اور بس environment variables سے انہیں ترتیب دے سکتے ہیں۔ + +اس طرح، بہت سے معاملات میں آپ containers اور Docker کے بارے میں سیکھ سکتے ہیں اور اس علم کو بہت سے مختلف ٹولز اور اجزاء کے ساتھ دوبارہ استعمال کر سکتے ہیں۔ + +تو، آپ مختلف چیزوں کے ساتھ **متعدد containers** چلائیں گے، جیسے ڈیٹابیس، Python ایپلیکیشن، React frontend ایپلیکیشن والا web server، اور انہیں ان کے اندرونی نیٹ ورک کے ذریعے جوڑیں گے۔ + +تمام container management systems (جیسے Docker یا Kubernetes) میں یہ نیٹ ورکنگ خصوصیات شامل ہوتی ہیں۔ + +## Containers اور Processes { #containers-and-processes } + +ایک **container image** عام طور پر اپنے metadata میں ڈیفالٹ پروگرام یا command شامل کرتی ہے جو **container** شروع ہونے پر چلنی چاہیے اور اس پروگرام کو دیے جانے والے parameters۔ بالکل اسی طرح جیسے command line میں ہوتا۔ + +جب **container** شروع ہوتا ہے، تو یہ وہ command/پروگرام چلائے گا (اگرچہ آپ اسے override کر کے مختلف command/پروگرام چلا سکتے ہیں)۔ + +Container تب تک چل رہا ہوتا ہے جب تک **مرکزی process** (command یا پروگرام) چل رہا ہو۔ + +Container میں عام طور پر ایک **واحد process** ہوتا ہے، لیکن مرکزی process سے subprocesses شروع کرنا بھی ممکن ہے، اور اس طرح آپ کے پاس ایک ہی container میں **متعدد processes** ہوں گے۔ + +لیکن **کم از کم ایک چلنے والے process** کے بغیر چلنے والا container ممکن نہیں ہے۔ اگر مرکزی process رک جائے، تو container رک جاتا ہے۔ + +## FastAPI کے لیے Docker Image بنائیں { #build-a-docker-image-for-fastapi } + +ٹھیک ہے، آئیے اب کچھ بناتے ہیں! 🚀 + +میں آپ کو دکھاؤں گا کہ **سرکاری Python** image کی بنیاد پر، FastAPI کے لیے **شروع سے Docker image** کیسے بنائیں۔ + +یہی وہ ہے جو آپ **زیادہ تر معاملات** میں کرنا چاہیں گے، مثلاً: + +* **Kubernetes** یا اسی طرح کے ٹولز استعمال کرتے ہوئے +* **Raspberry Pi** پر چلاتے ہوئے +* کسی cloud service استعمال کرتے ہوئے جو آپ کے لیے container image چلائے، وغیرہ۔ + +### Package Requirements { #package-requirements } + +آپ کے پاس عام طور پر اپنی ایپلیکیشن کے لیے **package requirements** کسی فائل میں ہوں گی۔ + +یہ بنیادی طور پر اس ٹول پر منحصر ہوگا جو آپ ان requirements کو **انسٹال** کرنے کے لیے استعمال کرتے ہیں۔ + +سب سے عام طریقہ `requirements.txt` فائل رکھنا ہے جس میں package کے نام اور ان کے ورژن، ہر لائن میں ایک، ہوتے ہیں۔ + +آپ یقیناً ورژنز کی حدود مقرر کرنے کے لیے وہی خیالات استعمال کریں گے جو آپ نے [FastAPI ورژنز کے بارے میں](versions.md) میں پڑھے۔ + +مثال کے طور پر، آپ کی `requirements.txt` کچھ ایسی نظر آ سکتی ہے: + +``` +fastapi[standard]>=0.113.0,<0.114.0 +pydantic>=2.7.0,<3.0.0 +``` + +اور آپ عام طور پر ان package dependencies کو `pip` سے انسٹال کریں گے، مثلاً: + +
+ +```console +$ pip install -r requirements.txt +---> 100% +Successfully installed fastapi pydantic +``` + +
+ +/// info | معلومات + +package dependencies تعین اور انسٹال کرنے کے لیے دوسرے فارمیٹس اور ٹولز بھی ہیں۔ + +/// + +### **FastAPI** کوڈ بنائیں { #create-the-fastapi-code } + +* ایک `app` ڈائریکٹری بنائیں اور اس میں داخل ہوں۔ +* ایک خالی `__init__.py` فائل بنائیں۔ +* ایک `main.py` فائل بنائیں اس کے ساتھ: + +```Python +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: str | None = None): + return {"item_id": item_id, "q": q} +``` + +### Dockerfile { #dockerfile } + +اب اسی پراجیکٹ ڈائریکٹری میں ایک `Dockerfile` فائل بنائیں اس کے ساتھ: + +```{ .dockerfile .annotate } +# (1)! +FROM python:3.14 + +# (2)! +WORKDIR /code + +# (3)! +COPY ./requirements.txt /code/requirements.txt + +# (4)! +RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt + +# (5)! +COPY ./app /code/app + +# (6)! +CMD ["fastapi", "run", "app/main.py", "--port", "80"] +``` + +1. سرکاری Python base image سے شروع کریں۔ + +2. موجودہ ورکنگ ڈائریکٹری `/code` مقرر کریں۔ + + یہاں ہم `requirements.txt` فائل اور `app` ڈائریکٹری رکھیں گے۔ + +3. requirements والی فائل کو `/code` ڈائریکٹری میں کاپی کریں۔ + + **صرف** requirements والی فائل پہلے کاپی کریں، باقی کوڈ نہیں۔ + + چونکہ یہ فائل **اکثر تبدیل نہیں ہوتی**، Docker اسے پہچان لے گا اور اس مرحلے کے لیے **cache** استعمال کرے گا، اگلے مرحلے کے لیے بھی cache فعال رکھتے ہوئے۔ + +4. requirements فائل میں موجود package dependencies انسٹال کریں۔ + + `--no-cache-dir` اختیار `pip` کو بتاتا ہے کہ ڈاؤن لوڈ شدہ packages مقامی طور پر محفوظ نہ کرے، کیونکہ یہ صرف تبھی ہوتا جب `pip` انہی packages کو دوبارہ انسٹال کرنے کے لیے چلایا جاتا، لیکن containers کے ساتھ کام کرتے وقت ایسا نہیں ہوتا۔ + + /// note | نوٹ + + `--no-cache-dir` صرف `pip` سے متعلق ہے، اس کا Docker یا containers سے کوئی تعلق نہیں ہے۔ + + /// + + `--upgrade` اختیار `pip` کو بتاتا ہے کہ اگر packages پہلے سے انسٹال ہیں تو انہیں اپ گریڈ کرے۔ + + چونکہ فائل کاپی کرنے کا پچھلا مرحلہ **Docker cache** کے ذریعے پہچانا جا سکتا ہے، یہ مرحلہ بھی دستیاب ہونے پر **Docker cache استعمال کرے** گا۔ + + اس مرحلے میں cache استعمال کرنے سے development کے دوران بار بار image بناتے وقت آپ کا بہت سا **وقت بچے** گا، ہر بار تمام dependencies **ڈاؤن لوڈ اور انسٹال** کرنے کے بجائے۔ + +5. `./app` ڈائریکٹری کو `/code` ڈائریکٹری کے اندر کاپی کریں۔ + + چونکہ اس میں وہ تمام کوڈ ہے جو **سب سے زیادہ تبدیل ہوتا ہے** Docker **cache** آسانی سے اس یا اس کے بعد کے **مراحل** کے لیے استعمال نہیں ہو سکے گا۔ + + اس لیے، container image کے build time کو بہتر بنانے کے لیے اسے `Dockerfile` کے **آخر کے قریب** رکھنا ضروری ہے۔ + +6. `fastapi run` استعمال کرنے کے لیے **command** مقرر کریں، جو نیچے Uvicorn استعمال کرتا ہے۔ + + `CMD` strings کی ایک فہرست لیتا ہے، ان میں سے ہر string وہ ہے جو آپ command line میں spaces سے الگ کر کے ٹائپ کرتے۔ + + یہ command **موجودہ ورکنگ ڈائریکٹری** سے چلایا جائے گا، وہی `/code` ڈائریکٹری جو آپ نے اوپر `WORKDIR /code` سے مقرر کی۔ + +/// tip | مشورہ + +کوڈ میں ہر نمبر والے بلبلے پر کلک کر کے دیکھیں کہ ہر لائن کیا کرتی ہے۔ 👆 + +/// + +/// warning | انتباہ + +ہمیشہ `CMD` ہدایت کی **exec form** استعمال کرنا یقینی بنائیں، جیسا کہ نیچے بیان کیا گیا ہے۔ + +/// + +#### `CMD` - Exec Form استعمال کریں { #use-cmd-exec-form } + +[`CMD`](https://docs.docker.com/reference/dockerfile/#cmd) Docker ہدایت دو شکلوں میں لکھی جا سکتی ہے: + +✅ **Exec** form: + +```Dockerfile +# ✅ Do this +CMD ["fastapi", "run", "app/main.py", "--port", "80"] +``` + +⛔️ **Shell** form: + +```Dockerfile +# ⛔️ Don't do this +CMD fastapi run app/main.py --port 80 +``` + +ہمیشہ **exec** form استعمال کرنا یقینی بنائیں تاکہ FastAPI خوبصورتی سے shutdown ہو سکے اور [lifespan events](../advanced/events.md) فعال ہوں۔ + +آپ اس کے بارے میں مزید [Docker docs for shell and exec form](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form) میں پڑھ سکتے ہیں۔ + +`docker compose` استعمال کرتے وقت یہ کافی نمایاں ہو سکتا ہے۔ مزید تکنیکی تفصیلات کے لیے Docker Compose FAQ کا یہ حصہ دیکھیں: [Why do my services take 10 seconds to recreate or stop?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop)۔ + +#### ڈائریکٹری کا ڈھانچہ { #directory-structure } + +اب آپ کے پاس ایسا ڈائریکٹری ڈھانچہ ہونا چاہیے: + +``` +. +├── app +│ ├── __init__.py +│ └── main.py +├── Dockerfile +└── requirements.txt +``` + +#### TLS Termination Proxy کے پیچھے { #behind-a-tls-termination-proxy } + +اگر آپ اپنا container TLS Termination Proxy (load balancer) جیسے Nginx یا Traefik کے پیچھے چلا رہے ہیں، تو `--proxy-headers` اختیار شامل کریں، یہ Uvicorn کو (FastAPI CLI کے ذریعے) بتائے گا کہ اس proxy کی طرف سے بھیجے گئے headers پر اعتماد کرے جو بتاتے ہیں کہ ایپلیکیشن HTTPS وغیرہ کے پیچھے چل رہی ہے۔ + +```Dockerfile +CMD ["fastapi", "run", "app/main.py", "--proxy-headers", "--port", "80"] +``` + +#### Docker Cache { #docker-cache } + +اس `Dockerfile` میں ایک اہم چال ہے، ہم پہلے **صرف dependencies والی فائل** کاپی کرتے ہیں، باقی کوڈ نہیں۔ آئیے بتاتے ہیں کہ ایسا کیوں ہے۔ + +```Dockerfile +COPY ./requirements.txt /code/requirements.txt +``` + +Docker اور دوسرے ٹولز ان container images کو **بتدریج** بناتے ہیں، `Dockerfile` کے اوپر سے شروع کرتے ہوئے اور `Dockerfile` کی ہر ہدایت سے بنائی گئی فائلوں کو شامل کرتے ہوئے **ایک پرت دوسری کے اوپر** رکھتے ہیں۔ + +Docker اور اسی طرح کے ٹولز image بناتے وقت **اندرونی cache** بھی استعمال کرتے ہیں، اگر کوئی فائل آخری بار container image بنانے کے بعد سے تبدیل نہیں ہوئی، تو یہ فائل کو دوبارہ کاپی کرنے اور شروع سے نئی پرت بنانے کے بجائے آخری بار بنائی گئی **وہی پرت دوبارہ استعمال** کرے گا۔ + +صرف فائلوں کی کاپی سے بچنا ضروری نہیں کہ چیزوں کو بہت بہتر بنائے، لیکن چونکہ اس نے اس مرحلے کے لیے cache استعمال کیا، یہ **اگلے مرحلے کے لیے cache استعمال** کر سکتا ہے۔ مثلاً، یہ dependencies انسٹال کرنے والی ہدایت کے لیے cache استعمال کر سکتا ہے: + +```Dockerfile +RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt +``` + +Package requirements والی فائل **اکثر تبدیل نہیں ہوتی**۔ تو، صرف وہ فائل کاپی کرنے سے، Docker اس مرحلے کے لیے **cache استعمال** کر سکے گا۔ + +اور پھر، Docker اگلے مرحلے کے لیے بھی **cache استعمال** کر سکے گا جو ان dependencies کو ڈاؤن لوڈ اور انسٹال کرتا ہے۔ اور یہیں ہم **بہت سا وقت بچاتے** ہیں۔ ✨ ...اور اکتاہٹ سے بچتے ہیں۔ 😪😆 + +Package dependencies ڈاؤن لوڈ اور انسٹال کرنے میں **منٹ** لگ سکتے ہیں، لیکن **cache** استعمال کرنے میں زیادہ سے زیادہ **سیکنڈ** لگیں گے۔ + +اور چونکہ آپ development کے دوران بار بار container image بناتے رہیں گے تاکہ آپ کے کوڈ کی تبدیلیاں کام کر رہی ہیں، اس سے بہت زیادہ مجموعی وقت بچتا ہے۔ + +پھر، `Dockerfile` کے آخر کے قریب، ہم تمام کوڈ کاپی کرتے ہیں۔ چونکہ یہ وہ ہے جو **سب سے زیادہ تبدیل ہوتا ہے**، ہم اسے آخر کے قریب رکھتے ہیں، کیونکہ تقریباً ہمیشہ، اس مرحلے کے بعد کی کوئی بھی چیز cache استعمال نہیں کر سکے گی۔ + +```Dockerfile +COPY ./app /code/app +``` + +### Docker Image بنائیں { #build-the-docker-image } + +اب جب تمام فائلیں جگہ پر ہیں، آئیے container image بناتے ہیں۔ + +* پراجیکٹ ڈائریکٹری میں جائیں (جہاں آپ کی `Dockerfile` ہے، آپ کی `app` ڈائریکٹری پر مشتمل)۔ +* اپنی FastAPI image بنائیں: + +
+ +```console +$ docker build -t myimage . + +---> 100% +``` + +
+ +/// tip | مشورہ + +آخر میں `.` پر دھیان دیں، یہ `./` کے مساوی ہے، یہ Docker کو بتاتا ہے کہ container image بنانے کے لیے کون سی ڈائریکٹری استعمال کرنی ہے۔ + +اس معاملے میں، یہ وہی موجودہ ڈائریکٹری (`.`) ہے۔ + +/// + +### Docker Container شروع کریں { #start-the-docker-container } + +* اپنی image کی بنیاد پر container چلائیں: + +
+ +```console +$ docker run -d --name mycontainer -p 80:80 myimage +``` + +
+ +## اسے چیک کریں { #check-it } + +آپ اسے اپنے Docker container کے URL میں چیک کر سکتے ہیں، مثلاً: [http://192.168.99.100/items/5?q=somequery](http://192.168.99.100/items/5?q=somequery) یا [http://127.0.0.1/items/5?q=somequery](http://127.0.0.1/items/5?q=somequery) (یا مساوی، آپ کے Docker host کا استعمال کرتے ہوئے)۔ + +آپ کو کچھ ایسا نظر آئے گا: + +```JSON +{"item_id": 5, "q": "somequery"} +``` + +## انٹرایکٹو API دستاویزات { #interactive-api-docs } + +اب آپ [http://192.168.99.100/docs](http://192.168.99.100/docs) یا [http://127.0.0.1/docs](http://127.0.0.1/docs) (یا مساوی، آپ کے Docker host کا استعمال کرتے ہوئے) پر جا سکتے ہیں۔ + +آپ کو خودکار انٹرایکٹو API دستاویزات نظر آئیں گی ([Swagger UI](https://github.com/swagger-api/swagger-ui) کی فراہم کردہ): + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) + +## متبادل API دستاویزات { #alternative-api-docs } + +اور آپ [http://192.168.99.100/redoc](http://192.168.99.100/redoc) یا [http://127.0.0.1/redoc](http://127.0.0.1/redoc) (یا مساوی، آپ کے Docker host کا استعمال کرتے ہوئے) پر بھی جا سکتے ہیں۔ + +آپ کو متبادل خودکار دستاویزات نظر آئیں گی ([ReDoc](https://github.com/Rebilly/ReDoc) کی فراہم کردہ): + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) + +## واحد فائل FastAPI کے ساتھ Docker Image بنائیں { #build-a-docker-image-with-a-single-file-fastapi } + +اگر آپ کی FastAPI واحد فائل ہے، مثلاً `./app` ڈائریکٹری کے بغیر `main.py`، تو آپ کا فائل ڈھانچہ کچھ ایسا ہو سکتا ہے: + +``` +. +├── Dockerfile +├── main.py +└── requirements.txt +``` + +پھر آپ کو بس `Dockerfile` کے اندر فائل کاپی کرنے کے متعلقہ راستے تبدیل کرنے ہوں گے: + +```{ .dockerfile .annotate hl_lines="10 13" } +FROM python:3.14 + +WORKDIR /code + +COPY ./requirements.txt /code/requirements.txt + +RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt + +# (1)! +COPY ./main.py /code/ + +# (2)! +CMD ["fastapi", "run", "main.py", "--port", "80"] +``` + +1. `main.py` فائل کو `/code` ڈائریکٹری میں براہ راست کاپی کریں (بغیر `./app` ڈائریکٹری کے)۔ + +2. اپنی واحد فائل `main.py` میں ایپلیکیشن چلانے کے لیے `fastapi run` استعمال کریں۔ + +جب آپ `fastapi run` کو فائل دیتے ہیں تو یہ خود بخود پتا لگا لے گا کہ یہ واحد فائل ہے نہ کہ کسی package کا حصہ اور جانے گا کہ اسے کیسے import کرنا ہے اور آپ کی FastAPI app کو خدمت فراہم کرنی ہے۔ 😎 + +## Deployment کے تصورات { #deployment-concepts } + +آئیے containers کے حوالے سے انہی [Deployment تصورات](concepts.md) کے بارے میں دوبارہ بات کرتے ہیں۔ + +Containers بنیادی طور پر ایپلیکیشن **بنانے اور deploy کرنے** کے عمل کو آسان بنانے کا ایک ٹول ہیں، لیکن یہ ان **deployment تصورات** کو سنبھالنے کا کوئی خاص طریقہ نافذ نہیں کرتے، اور کئی ممکنہ حکمت عملیاں ہیں۔ + +**اچھی خبر** یہ ہے کہ ہر مختلف حکمت عملی کے ساتھ تمام deployment تصورات کا احاطہ کرنے کا ایک طریقہ موجود ہے۔ 🎉 + +آئیے containers کے حوالے سے ان **deployment تصورات** کا جائزہ لیتے ہیں: + +* HTTPS +* شروع ہونے پر چلنا +* دوبارہ شروع ہونا +* نقل (چلنے والے processes کی تعداد) +* میموری +* شروع ہونے سے پہلے کے مراحل + +## HTTPS { #https } + +اگر ہم صرف FastAPI ایپلیکیشن کے لیے **container image** (اور بعد میں چلنے والے **container**) پر توجہ مرکوز کریں، تو HTTPS عام طور پر ایک اور ٹول کے ذریعے **بیرونی طور پر** سنبھالا جائے گا۔ + +یہ ایک اور container ہو سکتا ہے، مثلاً [Traefik](https://traefik.io/) کے ساتھ، **HTTPS** اور **certificates** کے **خودکار** حصول کو سنبھالتے ہوئے۔ + +/// tip | مشورہ + +Traefik کے Docker، Kubernetes اور دوسروں کے ساتھ integrations ہیں، تو اس کے ساتھ اپنے containers کے لیے HTTPS ترتیب دینا بہت آسان ہے۔ + +/// + +متبادل کے طور پر، HTTPS ایک cloud provider کے ذریعے ان کی خدمات میں سے ایک کے طور پر سنبھالا جا سکتا ہے (جبکہ ابھی بھی ایپلیکیشن container میں چل رہی ہو)۔ + +## شروع ہونے پر چلنا اور دوبارہ شروع ہونا { #running-on-startup-and-restarts } + +عام طور پر آپ کے container کو **شروع اور چلانے** کا ذمہ دار ایک اور ٹول ہوتا ہے۔ + +یہ **Docker** براہ راست ہو سکتا ہے، **Docker Compose**، **Kubernetes**، کوئی **cloud service** وغیرہ۔ + +زیادہ تر (یا تمام) معاملات میں، شروع ہونے پر container چلانے اور ناکامیوں پر دوبارہ شروع کرنے کو فعال کرنے کا ایک آسان اختیار ہوتا ہے۔ مثلاً Docker میں، یہ command line اختیار `--restart` ہے۔ + +بغیر containers کے، ایپلیکیشنز کو شروع ہونے پر چلانا اور دوبارہ شروع کرنا مشکل اور پیچیدہ ہو سکتا ہے۔ لیکن جب **containers کے ساتھ** کام کر رہے ہوں تو زیادہ تر معاملات میں یہ فعالیت بطور ڈیفالٹ شامل ہوتی ہے۔ ✨ + +## نقل - Processes کی تعداد { #replication-number-of-processes } + +اگر آپ کے پاس **Kubernetes**، Docker Swarm Mode، Nomad، یا متعدد مشینوں پر تقسیم شدہ containers منظم کرنے کے لیے کوئی اور ملتا جلتا پیچیدہ نظام والی مشینوں کا cluster ہے، تو آپ شاید ہر container میں **process manager** (جیسے Uvicorn with workers) استعمال کرنے کے بجائے **cluster کی سطح** پر **نقل سنبھالنا** چاہیں گے۔ + +ان تقسیم شدہ container management systems جیسے Kubernetes میں عام طور پر آنے والی requests کے لیے **load balancing** کی حمایت کرتے ہوئے **containers کی نقل** سنبھالنے کا کوئی مربوط طریقہ ہوتا ہے۔ سب **cluster کی سطح** پر۔ + +ان معاملات میں، آپ شاید [اوپر بیان کیے گئے طریقے](#dockerfile) سے **شروع سے Docker image** بنانا چاہیں گے، اپنی dependencies انسٹال کرتے ہوئے، اور متعدد Uvicorn workers استعمال کرنے کے بجائے **ایک واحد Uvicorn process** چلاتے ہوئے۔ + +### Load Balancer { #load-balancer } + +Containers استعمال کرتے وقت، عام طور پر کوئی جزو **مرکزی port پر سن** رہا ہوتا ہے۔ یہ ممکنہ طور پر ایک اور container ہو سکتا ہے جو **HTTPS** سنبھالنے کے لیے **TLS Termination Proxy** بھی ہو یا کوئی ملتا جلتا ٹول۔ + +چونکہ یہ جزو requests کا **بوجھ** لیتا ہے اور اسے workers میں (امید ہے) **متوازن** طریقے سے تقسیم کرتا ہے، اسے عام طور پر **Load Balancer** بھی کہا جاتا ہے۔ + +/// tip | مشورہ + +HTTPS کے لیے استعمال ہونے والا وہی **TLS Termination Proxy** جزو شاید **Load Balancer** بھی ہوگا۔ + +/// + +اور containers کے ساتھ کام کرتے وقت، وہی نظام جو آپ انہیں شروع اور منظم کرنے کے لیے استعمال کرتے ہیں اس میں پہلے سے اندرونی ٹولز ہوں گے جو **نیٹ ورک مواصلت** (مثلاً HTTP requests) اس **load balancer** (جو **TLS Termination Proxy** بھی ہو سکتا ہے) سے آپ کی app والے container(s) تک منتقل کریں۔ + +### ایک Load Balancer - متعدد Worker Containers { #one-load-balancer-multiple-worker-containers } + +**Kubernetes** یا اسی طرح کے تقسیم شدہ container management systems کے ساتھ کام کرتے وقت، ان کے اندرونی نیٹ ورکنگ میکانزم کا استعمال واحد **load balancer** کو جو مرکزی **port** پر سن رہا ہے، مواصلت (requests) ممکنہ طور پر آپ کی app چلانے والے **متعدد containers** تک منتقل کرنے کی اجازت دے گا۔ + +آپ کی app چلانے والے ان میں سے ہر container میں عام طور پر **صرف ایک process** ہوگا (مثلاً آپ کی FastAPI ایپلیکیشن چلانے والا Uvicorn process)۔ وہ سب **ایک جیسے containers** ہوں گے، وہی چیز چلا رہے ہوں گے، لیکن ہر ایک اپنے process، میموری وغیرہ کے ساتھ۔ اس طرح آپ CPU کے **مختلف cores** میں، یا حتیٰ کہ **مختلف مشینوں** میں **متوازی عمل** سے فائدہ اٹھائیں گے۔ + +اور **load balancer** والا تقسیم شدہ container system آپ کی app والے ہر container کو **باری باری** requests **تقسیم کرے** گا۔ تو، ہر request آپ کی app چلانے والے متعدد **نقل شدہ containers** میں سے ایک کے ذریعے سنبھالی جا سکتی ہے۔ + +اور عام طور پر یہ **load balancer** آپ کے cluster میں *دوسری* apps (مثلاً مختلف domain، یا مختلف URL path prefix کے تحت) کی طرف جانے والی requests بھی سنبھال سکے گا، اور وہ مواصلت آپ کے cluster میں چلنے والی *اس دوسری* ایپلیکیشن کے صحیح containers تک منتقل کرے گا۔ + +### فی Container ایک Process { #one-process-per-container } + +اس قسم کے منظرنامے میں، آپ شاید **فی container ایک واحد (Uvicorn) process** رکھنا چاہیں گے، کیونکہ آپ پہلے ہی cluster کی سطح پر نقل سنبھال رہے ہوں گے۔ + +تو، اس صورت میں، آپ container میں متعدد workers **نہیں** رکھنا چاہیں گے، مثلاً `--workers` command line اختیار کے ساتھ۔ آپ فی container صرف ایک **واحد Uvicorn process** رکھنا چاہیں گے (لیکن شاید متعدد containers)۔ + +Container کے اندر ایک اور process manager رکھنا (جیسا کہ متعدد workers کے ساتھ ہوگا) صرف **غیر ضروری پیچیدگی** شامل کرے گا جو آپ شاید پہلے ہی اپنے cluster system سے سنبھال رہے ہیں۔ + +### متعدد Processes والے Containers اور خصوصی صورتیں { #containers-with-multiple-processes-and-special-cases } + +یقیناً، ایسی **خصوصی صورتیں** ہیں جہاں آپ ایک **container** میں اندر کئی **Uvicorn worker processes** رکھنا چاہ سکتے ہیں۔ + +ان معاملات میں، آپ workers کی تعداد مقرر کرنے کے لیے `--workers` command line اختیار استعمال کر سکتے ہیں: + +```{ .dockerfile .annotate } +FROM python:3.14 + +WORKDIR /code + +COPY ./requirements.txt /code/requirements.txt + +RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt + +COPY ./app /code/app + +# (1)! +CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"] +``` + +1. یہاں ہم workers کی تعداد 4 مقرر کرنے کے لیے `--workers` command line اختیار استعمال کرتے ہیں۔ + +یہاں کچھ مثالیں ہیں کہ یہ کب معنی خیز ہو سکتا ہے: + +#### ایک سادہ App { #a-simple-app } + +اگر آپ کی ایپلیکیشن **اتنی سادہ** ہے کہ اسے **ایک واحد server** پر چلایا جا سکتا ہے، cluster نہیں، تو آپ container میں process manager رکھنا چاہ سکتے ہیں۔ + +#### Docker Compose { #docker-compose } + +آپ **Docker Compose** کے ساتھ **ایک واحد server** (cluster نہیں) پر deploy کر رہے ہو سکتے ہیں، تو آپ کے پاس مشترکہ نیٹ ورک اور **load balancing** کو برقرار رکھتے ہوئے containers کی نقل منظم کرنے کا آسان طریقہ نہ ہو (Docker Compose کے ساتھ)۔ + +تب آپ **ایک واحد container** میں **process manager** کے ساتھ اندر **کئی worker processes** شروع کرنا چاہ سکتے ہیں۔ + +--- + +اصل بات یہ ہے کہ ان میں سے **کوئی بھی** ایسے **پتھر پر لکھے قوانین** نہیں ہیں جن کی آپ کو آنکھیں بند کر کے پیروی کرنی ہے۔ آپ ان خیالات کو **اپنے استعمال کے معاملے کا جائزہ لینے** اور اپنے نظام کے لیے بہترین طریقہ فیصلہ کرنے کے لیے استعمال کر سکتے ہیں، یہ دیکھتے ہوئے کہ ان تصورات کو کیسے منظم کریں: + +* سیکیورٹی - HTTPS +* شروع ہونے پر چلنا +* دوبارہ شروع ہونا +* نقل (چلنے والے processes کی تعداد) +* میموری +* شروع ہونے سے پہلے کے مراحل + +## میموری { #memory } + +اگر آپ **فی container ایک واحد process** چلاتے ہیں تو ان میں سے ہر container (اگر نقل شدہ ہیں تو ایک سے زیادہ) کے ذریعے استعمال ہونے والی میموری کم و بیش واضح، مستحکم اور محدود ہوگی۔ + +اور پھر آپ اپنے container management system (مثلاً **Kubernetes** میں) کی ترتیبات میں وہی میموری کی حدود اور ضروریات مقرر کر سکتے ہیں۔ اس طرح یہ ان کی ضرورت کی میموری کی مقدار اور cluster کی مشینوں میں دستیاب مقدار کو مدنظر رکھتے ہوئے **دستیاب مشینوں** میں **containers کی نقل** کر سکے گا۔ + +اگر آپ کی ایپلیکیشن **سادہ** ہے، تو یہ شاید **مسئلہ نہیں** ہوگا، اور آپ کو سخت میموری کی حدود مقرر کرنے کی ضرورت نہیں ہوگی۔ لیکن اگر آپ **بہت زیادہ میموری استعمال** کر رہے ہیں (مثلاً **machine learning** ماڈلز کے ساتھ)، تو آپ کو چیک کرنا چاہیے کہ آپ کتنی میموری استعمال کر رہے ہیں اور **ہر مشین** میں چلنے والے **containers کی تعداد** کو ایڈجسٹ کرنا چاہیے (اور شاید اپنے cluster میں مزید مشینیں شامل کریں)۔ + +اگر آپ **فی container متعدد processes** چلاتے ہیں تو آپ کو یقینی بنانا ہوگا کہ شروع ہونے والے processes کی تعداد دستیاب سے **زیادہ میموری استعمال** نہ کرے۔ + +## شروع ہونے سے پہلے کے مراحل اور Containers { #previous-steps-before-starting-and-containers } + +اگر آپ containers (مثلاً Docker، Kubernetes) استعمال کر رہے ہیں تو دو اصل طریقے ہیں جو آپ استعمال کر سکتے ہیں۔ + +### متعدد Containers { #multiple-containers } + +اگر آپ کے پاس **متعدد containers** ہیں، شاید ہر ایک **واحد process** چلا رہا ہے (مثلاً **Kubernetes** cluster میں)، تو آپ شاید نقل شدہ worker containers چلانے **سے پہلے** ایک **الگ container** میں **پچھلے مراحل** کا کام ایک واحد container میں، ایک واحد process چلاتے ہوئے کرنا چاہیں گے۔ + +/// info | معلومات + +اگر آپ Kubernetes استعمال کر رہے ہیں، تو یہ شاید ایک [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/) ہوگا۔ + +/// + +اگر آپ کے استعمال کے معاملے میں ان پچھلے مراحل کو **متعدد بار متوازی طور پر** چلانے میں کوئی مسئلہ نہیں ہے (مثلاً اگر آپ database migrations نہیں چلا رہے، بلکہ صرف چیک کر رہے ہیں کہ ڈیٹابیس تیار ہے یا نہیں)، تو آپ انہیں مرکزی process شروع کرنے سے پہلے ہر container میں بھی رکھ سکتے ہیں۔ + +### واحد Container { #single-container } + +اگر آپ کے پاس سادہ سیٹ اپ ہے، **واحد container** کے ساتھ جو پھر متعدد **worker processes** شروع کرتا ہے (یا صرف ایک process بھی)، تو آپ ان پچھلے مراحل کو اسی container میں، app کے ساتھ process شروع کرنے سے پہلے چلا سکتے ہیں۔ + +### بنیادی Docker Image { #base-docker-image } + +پہلے ایک سرکاری FastAPI Docker image ہوا کرتی تھی: [tiangolo/uvicorn-gunicorn-fastapi](https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker)۔ لیکن اب یہ متروک ہے۔ ⛔️ + +آپ کو شاید یہ بنیادی Docker image (یا کوئی اور ایسی ہی) استعمال **نہیں** کرنی چاہیے۔ + +اگر آپ **Kubernetes** (یا دوسرے) استعمال کر رہے ہیں اور پہلے سے متعدد **containers** کے ساتھ cluster کی سطح پر **نقل** ترتیب دے رہے ہیں۔ ان معاملات میں، آپ اوپر بیان کیے گئے طریقے سے **شروع سے image بنانا** بہتر ہے: [FastAPI کے لیے Docker Image بنائیں](#build-a-docker-image-for-fastapi)۔ + +اور اگر آپ کو متعدد workers کی ضرورت ہے تو آپ آسانی سے `--workers` command line اختیار استعمال کر سکتے ہیں۔ + +/// note | تکنیکی تفصیلات + +Docker image اس وقت بنائی گئی تھی جب Uvicorn مردہ workers کو منظم اور دوبارہ شروع کرنے کی حمایت نہیں کرتا تھا، تو Gunicorn کو Uvicorn کے ساتھ استعمال کرنا ضروری تھا، جس نے کافی پیچیدگی شامل کی، صرف اس لیے کہ Gunicorn Uvicorn worker processes کو منظم اور دوبارہ شروع کر سکے۔ + +لیکن اب جب Uvicorn (اور `fastapi` command) `--workers` استعمال کرنے کی حمایت کرتا ہے، اپنی خود کی بنانے کے بجائے بنیادی Docker image استعمال کرنے کی کوئی وجہ نہیں ہے (یہ تقریباً اتنا ہی کوڈ ہے 😅)۔ + +/// + +## Container Image Deploy کریں { #deploy-the-container-image } + +Container (Docker) Image ہونے کے بعد اسے deploy کرنے کے کئی طریقے ہیں۔ + +مثال کے طور پر: + +* واحد server پر **Docker Compose** کے ساتھ +* **Kubernetes** cluster کے ساتھ +* Docker Swarm Mode cluster کے ساتھ +* Nomad جیسے دوسرے ٹول کے ساتھ +* cloud service کے ساتھ جو آپ کی container image لے کر deploy کرے + +## `uv` کے ساتھ Docker Image { #docker-image-with-uv } + +اگر آپ اپنا پراجیکٹ انسٹال اور منظم کرنے کے لیے [uv](https://github.com/astral-sh/uv) استعمال کر رہے ہیں، تو آپ ان کی [uv Docker guide](https://docs.astral.sh/uv/guides/integration/docker/) کی پیروی کر سکتے ہیں۔ + +## خلاصہ { #recap } + +Container systems (مثلاً **Docker** اور **Kubernetes** کے ساتھ) استعمال کرنا تمام **deployment تصورات** کو سنبھالنا کافی سیدھا بنا دیتا ہے: + +* HTTPS +* شروع ہونے پر چلنا +* دوبارہ شروع ہونا +* نقل (چلنے والے processes کی تعداد) +* میموری +* شروع ہونے سے پہلے کے مراحل + +زیادہ تر معاملات میں، آپ شاید کوئی بنیادی image استعمال نہیں کرنا چاہیں گے، بلکہ سرکاری Python Docker image کی بنیاد پر **شروع سے container image بنائیں** گے۔ + +`Dockerfile` میں ہدایات کی **ترتیب** اور **Docker cache** کا خیال رکھ کر آپ اپنی پیداواریت بڑھانے (اور اکتاہٹ سے بچنے) کے لیے **build time کم** کر سکتے ہیں۔ 😎 diff --git a/docs/ur/docs/deployment/fastapicloud.md b/docs/ur/docs/deployment/fastapicloud.md new file mode 100644 index 000000000..cb4a0967a --- /dev/null +++ b/docs/ur/docs/deployment/fastapicloud.md @@ -0,0 +1,65 @@ +# FastAPI Cloud { #fastapi-cloud } + +آپ اپنی FastAPI app کو [FastAPI Cloud](https://fastapicloud.com) پر **ایک command** سے deploy کر سکتے ہیں، اگر آپ نے ابھی تک نہیں کیا تو ویٹنگ لسٹ میں شامل ہو جائیں۔ 🚀 + +## Login { #login } + +یقینی بنائیں کہ آپ کے پاس پہلے سے **FastAPI Cloud** اکاؤنٹ ہے (ہم نے آپ کو ویٹنگ لسٹ سے دعوت دی ہے 😉)۔ + +پھر لاگ ان کریں: + +
+ +```console +$ fastapi login + +You are logged in to FastAPI Cloud 🚀 +``` + +
+ +## Deploy { #deploy } + +اب اپنی app deploy کریں، **ایک command** سے: + +
+ +```console +$ fastapi deploy + +Deploying to FastAPI Cloud... + +✅ Deployment successful! + +🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev +``` + +
+ +بس! اب آپ اس URL پر اپنی app تک رسائی حاصل کر سکتے ہیں۔ ✨ + +## FastAPI Cloud کے بارے میں { #about-fastapi-cloud } + +**[FastAPI Cloud](https://fastapicloud.com)** اسی مصنف اور ٹیم نے بنایا ہے جو **FastAPI** کے پیچھے ہے۔ + +یہ کم سے کم محنت کے ساتھ API **بنانے**، **deploy کرنے**، اور **رسائی حاصل کرنے** کے عمل کو آسان بناتا ہے۔ + +یہ FastAPI کے ساتھ apps بنانے کا وہی **developer experience** cloud پر **deploy** کرنے میں لاتا ہے۔ 🎉 + +یہ ان زیادہ تر چیزوں کا بھی خیال رکھے گا جن کی آپ کو app deploy کرتے وقت ضرورت ہوتی ہے، جیسے: + +* HTTPS +* requests کی بنیاد پر autoscaling کے ساتھ نقل +* وغیرہ۔ + +FastAPI Cloud *FastAPI اور دوستوں* کے اوپن سورس منصوبوں کا بنیادی کفیل اور فنڈنگ فراہم کنندہ ہے۔ ✨ + +## دوسرے cloud providers پر deploy کریں { #deploy-to-other-cloud-providers } + +FastAPI اوپن سورس ہے اور معیارات پر مبنی ہے۔ آپ FastAPI apps کو اپنی پسند کے کسی بھی cloud provider پر deploy کر سکتے ہیں۔ + +اپنے cloud provider کی رہنما دستاویزات کی پیروی کریں تاکہ FastAPI apps کو ان کے ساتھ deploy کریں۔ 🤓 + +## اپنا خود کا server deploy کریں { #deploy-your-own-server } + +میں آپ کو بعد میں اس **Deployment** رہنما میں تمام تفصیلات سکھاؤں گا، تاکہ آپ سمجھ سکیں کہ کیا ہو رہا ہے، کیا ہونا چاہیے، یا FastAPI apps کو اپنے طور پر، اپنے servers کے ساتھ بھی کیسے deploy کریں۔ 🤓 diff --git a/docs/ur/docs/deployment/https.md b/docs/ur/docs/deployment/https.md new file mode 100644 index 000000000..06deac196 --- /dev/null +++ b/docs/ur/docs/deployment/https.md @@ -0,0 +1,231 @@ +# HTTPS کے بارے میں { #about-https } + +یہ سوچنا آسان ہے کہ HTTPS کوئی ایسی چیز ہے جو بس "فعال" ہوتی ہے یا نہیں ہوتی۔ + +لیکن یہ اس سے کہیں زیادہ پیچیدہ ہے۔ + +/// tip | مشورہ + +اگر آپ جلدی میں ہیں یا آپ کو پرواہ نہیں ہے، تو مختلف تکنیکوں کے ساتھ سب کچھ ترتیب دینے کی مرحلہ وار ہدایات کے لیے اگلے حصوں میں جائیں۔ + +/// + +**HTTPS کی بنیادی باتیں** جاننے کے لیے، ایک صارف کے نقطہ نظر سے، دیکھیں [https://howhttps.works/](https://howhttps.works/)۔ + +اب، ایک **developer کے نقطہ نظر** سے، HTTPS کے بارے میں سوچتے وقت ذہن میں رکھنے کی کئی چیزیں ہیں: + +* HTTPS کے لیے، **server** کو ایک **تیسری جماعت** کی طرف سے تیار کردہ **"certificates"** رکھنے کی ضرورت ہے۔ + * وہ certificates دراصل تیسری جماعت سے **حاصل** کیے جاتے ہیں، "تیار" نہیں کیے جاتے۔ +* Certificates کی ایک **مدت** ہوتی ہے۔ + * وہ **ختم** ہو جاتے ہیں۔ + * اور پھر انہیں **تجدید** کرنے، تیسری جماعت سے **دوبارہ حاصل** کرنے کی ضرورت ہوتی ہے۔ +* کنکشن کی encryption **TCP سطح** پر ہوتی ہے۔ + * یہ **HTTP سے نیچے** ایک پرت ہے۔ + * تو، **certificate اور encryption** کی سنبھال **HTTP سے پہلے** ہوتی ہے۔ +* **TCP کو "domains" کے بارے میں معلوم نہیں ہوتا**۔ صرف IP ایڈریسز کے بارے میں۔ + * درخواست کیے گئے **مخصوص domain** کی معلومات **HTTP ڈیٹا** میں جاتی ہے۔ +* **HTTPS certificates** ایک **مخصوص domain** کی **تصدیق** کرتے ہیں، لیکن protocol اور encryption TCP سطح پر ہوتی ہے، یہ **جاننے سے پہلے** کہ کس domain سے معاملہ ہو رہا ہے۔ +* **بطور ڈیفالٹ**، اس کا مطلب یہ ہوگا کہ آپ کے پاس **ہر IP ایڈریس پر صرف ایک HTTPS certificate** ہو سکتا ہے۔ + * اس سے قطع نظر کہ آپ کا server کتنا بڑا ہے یا اس پر موجود ہر ایپلیکیشن کتنی چھوٹی ہے۔ + * تاہم، اس کا ایک **حل** موجود ہے۔ +* **TLS** protocol (جو TCP سطح پر، HTTP سے پہلے encryption سنبھالتا ہے) کی ایک **توسیع** ہے جسے **[SNI](https://en.wikipedia.org/wiki/Server_Name_Indication)** کہتے ہیں۔ + * یہ SNI توسیع ایک واحد server (ایک **واحد IP ایڈریس** کے ساتھ) کو **کئی HTTPS certificates** رکھنے اور **متعدد HTTPS domains/ایپلیکیشنز** کو خدمت فراہم کرنے کی اجازت دیتی ہے۔ + * اس کے کام کرنے کے لیے، server پر چلنے والے ایک **واحد** جزو (پروگرام) کو، جو **عوامی IP ایڈریس** پر سن رہا ہو، server کے **تمام HTTPS certificates** رکھنے ہوں گے۔ +* محفوظ کنکشن حاصل کرنے **کے بعد**، مواصلاتی protocol **ابھی بھی HTTP** ہے۔ + * مواد **encrypted** ہوتے ہیں، اگرچہ وہ **HTTP protocol** کے ساتھ بھیجے جا رہے ہوتے ہیں۔ + +ایک عام طریقہ یہ ہے کہ server (مشین، host وغیرہ) پر **ایک پروگرام/HTTP server** چلایا جائے جو **تمام HTTPS حصوں کا انتظام** کرے: **encrypted HTTPS requests** وصول کرے، **decrypted HTTP requests** اسی server میں چلنے والی اصل HTTP ایپلیکیشن (اس معاملے میں **FastAPI** ایپلیکیشن) کو بھیجے، ایپلیکیشن سے **HTTP response** لے، مناسب **HTTPS certificate** استعمال کرتے ہوئے اسے **encrypt** کرے اور **HTTPS** استعمال کرتے ہوئے واپس صارف کو بھیجے۔ اس server کو اکثر **[TLS Termination Proxy](https://en.wikipedia.org/wiki/TLS_termination_proxy)** کہا جاتا ہے۔ + +TLS Termination Proxy کے طور پر آپ جو اختیارات استعمال کر سکتے ہیں ان میں سے کچھ یہ ہیں: + +* Traefik (جو certificate کی تجدید بھی سنبھال سکتا ہے) +* Caddy (جو certificate کی تجدید بھی سنبھال سکتا ہے) +* Nginx +* HAProxy + +## Let's Encrypt { #lets-encrypt } + +Let's Encrypt سے پہلے، یہ **HTTPS certificates** قابل اعتماد تیسری جماعتوں کی طرف سے فروخت کیے جاتے تھے۔ + +ان میں سے ایک certificate حاصل کرنے کا عمل مشکل ہوتا تھا، کافی کاغذی کارروائی درکار ہوتی تھی اور certificates کافی مہنگے ہوتے تھے۔ + +لیکن پھر **[Let's Encrypt](https://letsencrypt.org/)** بنایا گیا۔ + +یہ Linux Foundation کا ایک منصوبہ ہے۔ یہ خود بخود طریقے سے **مفت HTTPS certificates** فراہم کرتا ہے۔ یہ certificates تمام معیاری خفیہ سیکیورٹی استعمال کرتے ہیں، اور مختصر مدتی (تقریباً 3 ماہ) ہوتے ہیں، تو اپنی کم مدت کی وجہ سے **سیکیورٹی دراصل بہتر** ہے۔ + +Domains محفوظ طریقے سے تصدیق شدہ ہوتے ہیں اور certificates خود بخود تیار ہوتے ہیں۔ اس سے ان certificates کی تجدید کو بھی خودکار بنانے کی اجازت ملتی ہے۔ + +خیال یہ ہے کہ ان certificates کے حصول اور تجدید کو خودکار بنایا جائے تاکہ آپ **محفوظ HTTPS، مفت، ہمیشہ کے لیے** حاصل کر سکیں۔ + +## Developers کے لیے HTTPS { #https-for-developers } + +یہاں ایک مثال ہے کہ ایک HTTPS API کیسی نظر آ سکتی ہے، مرحلہ وار، بنیادی طور پر developers کے لیے اہم خیالات پر توجہ دیتے ہوئے۔ + +### Domain Name { #domain-name } + +یہ سب شاید آپ کے کوئی **domain name حاصل** کرنے سے شروع ہوگا۔ پھر، آپ اسے DNS server میں ترتیب دیں گے (ممکنہ طور پر آپ کا وہی cloud provider)۔ + +آپ کو شاید ایک cloud server (virtual machine) یا کچھ ایسا ہی ملے گا، اور اس کا ایک مقررہ **عوامی IP ایڈریس** ہوگا۔ + +DNS server(s) میں آپ ایک ریکارڈ (ایک "`A record`") ترتیب دیں گے تاکہ **آپ کا domain** آپ کے **server کے عوامی IP ایڈریس** کی طرف اشارہ کرے۔ + +آپ شاید یہ صرف ایک بار کریں گے، پہلی بار، جب سب کچھ ترتیب دے رہے ہوں۔ + +/// tip | مشورہ + +یہ Domain Name کا حصہ HTTPS سے بہت پہلے ہے، لیکن چونکہ سب کچھ domain اور IP ایڈریس پر منحصر ہے، اس لیے اس کا یہاں ذکر کرنا مناسب ہے۔ + +/// + +### DNS { #dns } + +اب آئیے تمام اصل HTTPS حصوں پر توجہ مرکوز کریں۔ + +سب سے پہلے، browser **DNS servers** سے چیک کرے گا کہ **domain کا IP** کیا ہے، اس معاملے میں، `someapp.example.com`۔ + +DNS servers browser کو کوئی مخصوص **IP ایڈریس** بتائیں گے۔ یہ آپ کے server کا وہ عوامی IP ایڈریس ہوگا جو آپ نے DNS servers میں ترتیب دیا تھا۔ + + + +### TLS Handshake کا آغاز { #tls-handshake-start } + +browser پھر اس IP ایڈریس سے **port 443** (HTTPS port) پر مواصلت کرے گا۔ + +مواصلت کا پہلا حصہ صرف client اور server کے درمیان کنکشن قائم کرنا اور خفیہ keys وغیرہ کا فیصلہ کرنا ہے۔ + + + +TLS کنکشن قائم کرنے کے لیے client اور server کے درمیان اس تعامل کو **TLS handshake** کہا جاتا ہے۔ + +### SNI توسیع کے ساتھ TLS { #tls-with-sni-extension } + +server میں ایک مخصوص **IP ایڈریس** کے مخصوص **port** پر صرف **ایک process** سن سکتا ہے۔ اسی IP ایڈریس پر دوسرے ports پر دوسرے processes سن سکتے ہیں، لیکن ہر IP ایڈریس اور port کے مجموعے کے لیے صرف ایک۔ + +TLS (HTTPS) بطور ڈیفالٹ مخصوص port `443` استعمال کرتا ہے۔ تو ہمیں اسی port کی ضرورت ہوگی۔ + +چونکہ اس port پر صرف ایک process سن سکتا ہے، وہ process جو یہ کرے گا وہ **TLS Termination Proxy** ہوگا۔ + +TLS Termination Proxy کے پاس ایک یا زیادہ **TLS certificates** (HTTPS certificates) تک رسائی ہوگی۔ + +اوپر بحث کی گئی **SNI توسیع** کا استعمال کرتے ہوئے، TLS Termination Proxy چیک کرے گا کہ دستیاب TLS (HTTPS) certificates میں سے اسے اس کنکشن کے لیے کون سا استعمال کرنا چاہیے، وہ جو client کی متوقع domain سے مماثل ہو۔ + +اس معاملے میں، یہ `someapp.example.com` کا certificate استعمال کرے گا۔ + + + +client پہلے سے اس ادارے پر **اعتماد** کرتا ہے جس نے وہ TLS certificate تیار کیا (اس معاملے میں Let's Encrypt، لیکن ہم اس کے بارے میں بعد میں بات کریں گے)، تو یہ **تصدیق** کر سکتا ہے کہ certificate درست ہے۔ + +پھر، certificate کا استعمال کرتے ہوئے، client اور TLS Termination Proxy باقی **TCP مواصلت کو encrypt کرنے کا طریقہ فیصلہ** کرتے ہیں۔ اس سے **TLS Handshake** کا حصہ مکمل ہو جاتا ہے۔ + +اس کے بعد، client اور server کے پاس ایک **encrypted TCP کنکشن** ہوتا ہے، یہی وہ چیز ہے جو TLS فراہم کرتا ہے۔ اور پھر وہ اس کنکشن کو اصل **HTTP مواصلت** شروع کرنے کے لیے استعمال کر سکتے ہیں۔ + +اور **HTTPS** یہی ہے، یہ بس سادہ **HTTP** ایک **محفوظ TLS کنکشن** کے اندر ہے خالص (غیر encrypted) TCP کنکشن کے بجائے۔ + +/// tip | مشورہ + +غور کریں کہ مواصلت کی encryption **TCP سطح** پر ہوتی ہے، HTTP سطح پر نہیں۔ + +/// + +### HTTPS Request { #https-request } + +اب جب client اور server (خاص طور پر browser اور TLS Termination Proxy) کے پاس ایک **encrypted TCP کنکشن** ہے، تو وہ **HTTP مواصلت** شروع کر سکتے ہیں۔ + +تو، client ایک **HTTPS request** بھیجتا ہے۔ یہ بس ایک encrypted TLS کنکشن کے ذریعے HTTP request ہے۔ + + + +### Request کو Decrypt کرنا { #decrypt-the-request } + +TLS Termination Proxy طے شدہ encryption کا استعمال کرتے ہوئے **request کو decrypt** کرے گا، اور **سادہ (decrypted) HTTP request** ایپلیکیشن چلانے والے process (مثلاً FastAPI ایپلیکیشن چلانے والے Uvicorn کے ساتھ ایک process) کو منتقل کرے گا۔ + + + +### HTTP Response { #http-response } + +ایپلیکیشن request پر عمل کرے گی اور TLS Termination Proxy کو ایک **سادہ (غیر encrypted) HTTP response** بھیجے گی۔ + + + +### HTTPS Response { #https-response } + +TLS Termination Proxy پھر پہلے سے طے شدہ خفیہ نگاری (جو `someapp.example.com` کے certificate سے شروع ہوئی تھی) کا استعمال کرتے ہوئے **response کو encrypt** کرے گا، اور اسے واپس browser کو بھیجے گا۔ + +اس کے بعد، browser تصدیق کرے گا کہ response درست ہے اور صحیح خفیہ key سے encrypted ہے، وغیرہ۔ پھر یہ **response کو decrypt** کرے گا اور اس پر عمل کرے گا۔ + + + +client (browser) جانے گا کہ response صحیح server سے آیا ہے کیونکہ یہ وہ خفیہ نگاری استعمال کر رہا ہے جس پر انہوں نے پہلے **HTTPS certificate** استعمال کرتے ہوئے اتفاق کیا تھا۔ + +### متعدد ایپلیکیشنز { #multiple-applications } + +اسی server (یا servers) میں، **متعدد ایپلیکیشنز** ہو سکتی ہیں، مثلاً دوسرے API پروگرامز یا ڈیٹابیس۔ + +مخصوص IP اور port (ہماری مثال میں TLS Termination Proxy) صرف ایک process سنبھال سکتا ہے لیکن دوسری ایپلیکیشنز/processes بھی server(s) پر چل سکتی ہیں، جب تک کہ وہ **عوامی IP اور port کا وہی مجموعہ** استعمال کرنے کی کوشش نہ کریں۔ + + + +اس طرح، TLS Termination Proxy **متعدد domains** کے لیے، متعدد ایپلیکیشنز کے لیے HTTPS اور certificates سنبھال سکتا ہے، اور پھر ہر معاملے میں requests صحیح ایپلیکیشن کو منتقل کر سکتا ہے۔ + +### Certificate کی تجدید { #certificate-renewal } + +مستقبل میں کسی وقت، ہر certificate **ختم** ہو جائے گا (حاصل کرنے کے تقریباً 3 ماہ بعد)۔ + +اور پھر، ایک اور پروگرام ہوگا (بعض اوقات یہ ایک اور پروگرام ہوتا ہے، بعض اوقات یہ وہی TLS Termination Proxy ہو سکتا ہے) جو Let's Encrypt سے بات کرے گا، اور certificate(s) کی تجدید کرے گا۔ + + + +**TLS certificates** ایک **domain name سے منسلک** ہوتے ہیں، IP ایڈریس سے نہیں۔ + +تو، certificates کی تجدید کے لیے، تجدیدی پروگرام کو اتھارٹی (Let's Encrypt) کو **ثابت** کرنا ہوگا کہ یہ واقعی اس domain کا **"مالک" ہے اور اسے کنٹرول** کرتا ہے۔ + +ایسا کرنے کے لیے، اور مختلف ایپلیکیشن کی ضروریات کو پورا کرنے کے لیے، یہ کئی طریقوں سے کر سکتا ہے۔ کچھ مقبول طریقے یہ ہیں: + +* **کچھ DNS records میں ترمیم**۔ + * اس کے لیے، تجدیدی پروگرام کو DNS provider کی APIs کی حمایت کرنی ہوگی، تو، آپ جو DNS provider استعمال کر رہے ہیں اس پر منحصر ہے، یہ اختیار ہو بھی سکتا ہے اور نہیں بھی۔ +* domain سے منسلک عوامی IP ایڈریس پر **server کے طور پر چلنا** (کم از کم certificate حصول کے عمل کے دوران)۔ + * جیسا کہ ہم نے اوپر کہا، مخصوص IP اور port پر صرف ایک process سن سکتا ہے۔ + * یہ ان وجوہات میں سے ایک ہے جس کی وجہ سے یہ بہت مفید ہے جب وہی TLS Termination Proxy certificate کی تجدید کے عمل کا بھی خیال رکھے۔ + * ورنہ، آپ کو TLS Termination Proxy کو عارضی طور پر بند کرنا پڑ سکتا ہے، certificates حاصل کرنے کے لیے تجدیدی پروگرام شروع کرنا، پھر انہیں TLS Termination Proxy کے ساتھ ترتیب دینا، اور پھر TLS Termination Proxy کو دوبارہ شروع کرنا۔ یہ مثالی نہیں ہے، کیونکہ TLS Termination Proxy بند ہونے کے دوران آپ کی app(s) دستیاب نہیں ہوں گی۔ + +یہ سارا تجدید کا عمل، جبکہ ابھی بھی app کو خدمت فراہم کر رہے ہوں، ان اصل وجوہات میں سے ایک ہے جس کی وجہ سے آپ HTTPS سنبھالنے کے لیے TLS Termination Proxy کے ساتھ **الگ نظام** رکھنا چاہیں گے بجائے اس کے کہ TLS certificates کو براہ راست application server (مثلاً Uvicorn) کے ساتھ استعمال کریں۔ + +## Proxy Forwarded Headers { #proxy-forwarded-headers } + +HTTPS سنبھالنے کے لیے proxy استعمال کرتے وقت، آپ کا **application server** (مثلاً FastAPI CLI کے ذریعے Uvicorn) HTTPS کے عمل کے بارے میں کچھ نہیں جانتا، یہ **TLS Termination Proxy** کے ساتھ سادہ HTTP میں مواصلت کرتا ہے۔ + +یہ **proxy** عام طور پر request کو **application server** کو منتقل کرنے سے پہلے فوری طور پر کچھ HTTP headers مقرر کرتا ہے، تاکہ application server کو بتائے کہ request proxy کے ذریعے **آگے بھیجی** جا رہی ہے۔ + +/// note | تکنیکی تفصیلات + +proxy headers یہ ہیں: + +* [X-Forwarded-For](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For) +* [X-Forwarded-Proto](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Proto) +* [X-Forwarded-Host](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-Host) + +/// + +تاہم، چونکہ **application server** نہیں جانتا کہ یہ ایک قابل اعتماد **proxy** کے پیچھے ہے، بطور ڈیفالٹ، یہ ان headers پر اعتماد نہیں کرے گا۔ + +لیکن آپ **application server** کو ترتیب دے سکتے ہیں کہ وہ **proxy** کی طرف سے بھیجے گئے *forwarded* headers پر اعتماد کرے۔ اگر آپ FastAPI CLI استعمال کر رہے ہیں، تو آپ *CLI Option* `--forwarded-allow-ips` استعمال کر سکتے ہیں تاکہ اسے بتائیں کہ کن IPs سے آنے والے *forwarded* headers پر اعتماد کرنا ہے۔ + +مثال کے طور پر، اگر **application server** صرف قابل اعتماد **proxy** سے مواصلت وصول کر رہا ہے، تو آپ اسے `--forwarded-allow-ips="*"` پر سیٹ کر سکتے ہیں تاکہ یہ تمام آنے والی IPs پر اعتماد کرے، کیونکہ اسے صرف **proxy** کے IP سے requests ملیں گی۔ + +اس طرح ایپلیکیشن جان سکے گی کہ اس کا اپنا عوامی URL کیا ہے، آیا یہ HTTPS استعمال کر رہی ہے، domain، وغیرہ۔ + +یہ مثال کے طور پر redirects کو صحیح طریقے سے سنبھالنے کے لیے مفید ہوگا۔ + +/// tip | مشورہ + +آپ اس کے بارے میں مزید [Behind a Proxy - Enable Proxy Forwarded Headers](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers) کی دستاویزات میں جان سکتے ہیں + +/// + +## خلاصہ { #recap } + +**HTTPS** ہونا بہت اہم ہے، اور زیادہ تر معاملات میں کافی **ضروری** ہے۔ بحیثیت developer HTTPS کے حوالے سے آپ کی زیادہ تر محنت بس **ان تصورات کو سمجھنے** اور یہ جاننے میں لگتی ہے کہ یہ کیسے کام کرتے ہیں۔ + +لیکن ایک بار جب آپ **developers کے لیے HTTPS** کی بنیادی معلومات جان لیں تو آپ آسانی سے مختلف ٹولز کو ملا اور ترتیب دے سکتے ہیں تاکہ سب کچھ آسان طریقے سے منظم ہو سکے۔ + +اگلے چند ابواب میں، میں آپ کو **FastAPI** ایپلیکیشنز کے لیے **HTTPS** ترتیب دینے کی کئی ٹھوس مثالیں دکھاؤں گا۔ 🔒 diff --git a/docs/ur/docs/deployment/index.md b/docs/ur/docs/deployment/index.md new file mode 100644 index 000000000..11a7e1629 --- /dev/null +++ b/docs/ur/docs/deployment/index.md @@ -0,0 +1,23 @@ +# Deployment { #deployment } + +**FastAPI** ایپلیکیشن کو deploy کرنا نسبتاً آسان ہے۔ + +## Deployment کا مطلب کیا ہے { #what-does-deployment-mean } + +کسی ایپلیکیشن کو **deploy** کرنے کا مطلب ہے وہ ضروری اقدامات کرنا جن سے یہ **صارفین کے لیے دستیاب** ہو جائے۔ + +**web API** کے لیے، اس کا عام طور پر مطلب ہے اسے ایک **remote machine** پر رکھنا، ایک ایسے **server program** کے ساتھ جو اچھی کارکردگی، استحکام وغیرہ فراہم کرے، تاکہ آپ کے **صارفین** ایپلیکیشن تک مؤثر طریقے سے اور بغیر کسی رکاوٹ یا مسائل کے **رسائی** حاصل کر سکیں۔ + +یہ **development** کے مراحل سے مختلف ہے، جہاں آپ مسلسل کوڈ تبدیل کرتے رہتے ہیں، اسے توڑتے اور ٹھیک کرتے ہیں، development server کو بند اور دوبارہ شروع کرتے ہیں، وغیرہ۔ + +## Deployment کی حکمت عملیاں { #deployment-strategies } + +آپ کے مخصوص استعمال کے معاملے اور آپ جو ٹولز استعمال کرتے ہیں ان کے لحاظ سے اسے کرنے کے کئی طریقے ہیں۔ + +آپ خود ٹولز کے مجموعے سے **server deploy** کر سکتے ہیں، آپ **cloud service** استعمال کر سکتے ہیں جو آپ کے لیے کچھ کام کرے، یا دوسرے ممکنہ اختیارات۔ + +مثال کے طور پر، ہم نے، FastAPI کے پیچھے کی ٹیم نے، [**FastAPI Cloud**](https://fastapicloud.com) بنایا ہے تاکہ FastAPI ایپس کو cloud پر deploy کرنا ممکنہ حد تک آسان ہو، FastAPI کے ساتھ کام کرنے جیسے developer experience کے ساتھ۔ + +میں آپ کو کچھ اہم تصورات دکھاؤں گا جو آپ کو **FastAPI** ایپلیکیشن deploy کرتے وقت ذہن میں رکھنے چاہئیں (اگرچہ ان میں سے زیادہ تر کسی بھی دوسری قسم کی web ایپلیکیشن پر لاگو ہوتے ہیں)۔ + +آپ اگلے حصوں میں ذہن میں رکھنے کے لیے مزید تفصیلات اور کچھ تکنیکیں دیکھیں گے۔ ✨ diff --git a/docs/ur/docs/deployment/manually.md b/docs/ur/docs/deployment/manually.md new file mode 100644 index 000000000..cf0822c13 --- /dev/null +++ b/docs/ur/docs/deployment/manually.md @@ -0,0 +1,157 @@ +# Server کو دستی طور پر چلائیں { #run-a-server-manually } + +## `fastapi run` Command استعمال کریں { #use-the-fastapi-run-command } + +مختصراً، اپنی FastAPI ایپلیکیشن کو چلانے کے لیے `fastapi run` استعمال کریں: + +
+ +```console +$ fastapi run main.py + + FastAPI Starting production server 🚀 + + Searching for package file structure from directories + with __init__.py files + Importing from /home/user/code/awesomeapp + + module 🐍 main.py + + code Importing the FastAPI app object from the module with + the following code: + + from main import app + + app Using import string: main:app + + server Server started at http://0.0.0.0:8000 + server Documentation at http://0.0.0.0:8000/docs + + Logs: + + INFO Started server process [2306215] + INFO Waiting for application startup. + INFO Application startup complete. + INFO Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C + to quit) +``` + +
+ +یہ زیادہ تر معاملات میں کام کرے گا۔ 😎 + +آپ اس command کو مثلاً اپنی **FastAPI** app کو container میں، server میں وغیرہ شروع کرنے کے لیے استعمال کر سکتے ہیں۔ + +## ASGI Servers { #asgi-servers } + +آئیے تفصیلات میں تھوڑا گہرائی میں جائیں۔ + +FastAPI ایک معیار استعمال کرتا ہے جو Python web frameworks اور servers بنانے کے لیے ہے جسے ASGI کہتے ہیں۔ FastAPI ایک ASGI web framework ہے۔ + +remote server machine پر **FastAPI** ایپلیکیشن (یا کوئی بھی ASGI ایپلیکیشن) چلانے کے لیے آپ کو بنیادی طور پر ایک ASGI server پروگرام جیسے **Uvicorn** کی ضرورت ہے، یہ وہ ہے جو `fastapi` command میں بطور ڈیفالٹ آتا ہے۔ + +کئی متبادل ہیں، بشمول: + +* [Uvicorn](https://www.uvicorn.dev/): ایک اعلیٰ کارکردگی والا ASGI server۔ +* [Hypercorn](https://hypercorn.readthedocs.io/): HTTP/2 اور Trio کے ساتھ ہم آہنگ ایک ASGI server اور دیگر خصوصیات۔ +* [Daphne](https://github.com/django/daphne): Django Channels کے لیے بنایا گیا ASGI server۔ +* [Granian](https://github.com/emmett-framework/granian): Python ایپلیکیشنز کے لیے ایک Rust HTTP server۔ +* [NGINX Unit](https://unit.nginx.org/howto/fastapi/): NGINX Unit ایک ہلکا اور ورسٹائل web application runtime ہے۔ + +## Server Machine اور Server Program { #server-machine-and-server-program } + +ناموں کے بارے میں ایک چھوٹی سی بات ذہن میں رکھنے کی ہے۔ 💡 + +"**server**" کا لفظ عام طور پر remote/cloud کمپیوٹر (فزیکل یا virtual machine) اور اس مشین پر چلنے والے پروگرام (مثلاً Uvicorn) دونوں کے لیے استعمال ہوتا ہے۔ + +بس ذہن میں رکھیں کہ جب آپ عمومی طور پر "server" پڑھیں تو اس سے ان دو چیزوں میں سے کوئی ایک مراد ہو سکتی ہے۔ + +remote machine کا حوالہ دیتے وقت، اسے عام طور پر **server** کہا جاتا ہے، لیکن **machine**، **VM** (virtual machine)، **node** بھی کہتے ہیں۔ یہ سب کسی قسم کی remote machine کا حوالہ دیتے ہیں، عام طور پر Linux چلاتی ہوئی، جہاں آپ پروگرامز چلاتے ہیں۔ + +## Server Program انسٹال کریں { #install-the-server-program } + +جب آپ FastAPI انسٹال کرتے ہیں، تو یہ ایک production server، Uvicorn، کے ساتھ آتا ہے، اور آپ اسے `fastapi run` command سے شروع کر سکتے ہیں۔ + +لیکن آپ ASGI server کو دستی طور پر بھی انسٹال کر سکتے ہیں۔ + +اس بات کو یقینی بنائیں کہ آپ [virtual environment](../virtual-environments.md) بنائیں، اسے فعال کریں، اور پھر آپ server ایپلیکیشن انسٹال کر سکتے ہیں۔ + +مثال کے طور پر، Uvicorn انسٹال کرنے کے لیے: + +
+ +```console +$ pip install "uvicorn[standard]" + +---> 100% +``` + +
+ +کسی بھی دوسرے ASGI server پروگرام پر بھی اسی طرح کا عمل لاگو ہوگا۔ + +/// tip | مشورہ + +`standard` شامل کرنے سے، Uvicorn کچھ تجویز کردہ اضافی dependencies انسٹال اور استعمال کرے گا۔ + +اس میں `uvloop` شامل ہے، `asyncio` کا اعلیٰ کارکردگی والا متبادل، جو بڑی concurrency کارکردگی میں اضافہ فراہم کرتا ہے۔ + +جب آپ FastAPI کو `pip install "fastapi[standard]"` جیسی کسی چیز سے انسٹال کرتے ہیں تو آپ کو `uvicorn[standard]` بھی مل جاتا ہے۔ + +/// + +## Server Program چلائیں { #run-the-server-program } + +اگر آپ نے ASGI server دستی طور پر انسٹال کیا ہے، تو آپ کو عام طور پر اپنی FastAPI ایپلیکیشن import کرنے کے لیے ایک خاص فارمیٹ میں import string دینی ہوگی: + +
+ +```console +$ uvicorn main:app --host 0.0.0.0 --port 80 + +INFO: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit) +``` + +
+ +/// note | نوٹ + +`uvicorn main:app` command کا مطلب ہے: + +* `main`: فائل `main.py` (Python "module")۔ +* `app`: وہ آبجیکٹ جو `main.py` کے اندر `app = FastAPI()` لائن سے بنایا گیا۔ + +یہ اس کے مساوی ہے: + +```Python +from main import app +``` + +/// + +ہر متبادل ASGI server پروگرام کی ایک مماثل command ہوگی، آپ ان کی متعلقہ دستاویزات میں مزید پڑھ سکتے ہیں۔ + +/// warning | انتباہ + +Uvicorn اور دوسرے servers ایک `--reload` اختیار فراہم کرتے ہیں جو development کے دوران مفید ہے۔ + +`--reload` اختیار بہت زیادہ وسائل استعمال کرتا ہے، زیادہ غیر مستحکم ہے، وغیرہ۔ + +یہ **development** کے دوران بہت مدد کرتا ہے، لیکن آپ کو **production** میں اسے استعمال **نہیں کرنا** چاہیے۔ + +/// + +## Deployment کے تصورات { #deployment-concepts } + +یہ مثالیں server پروگرام (مثلاً Uvicorn) کو **ایک واحد process** شروع کرتے ہوئے چلاتی ہیں، تمام IPs (`0.0.0.0`) پر ایک پہلے سے طے شدہ port (مثلاً `80`) پر سنتے ہوئے۔ + +یہ بنیادی خیال ہے۔ لیکن آپ شاید کچھ اضافی چیزوں کا خیال رکھنا چاہیں گے، جیسے: + +* سیکیورٹی - HTTPS +* شروع ہونے پر چلنا +* دوبارہ شروع ہونا +* نقل (چلنے والے processes کی تعداد) +* میموری +* شروع ہونے سے پہلے کے مراحل + +میں آپ کو اگلے ابواب میں ان میں سے ہر تصور کے بارے میں مزید بتاؤں گا، ان کے بارے میں سوچنے کا طریقہ، اور انہیں سنبھالنے کی حکمت عملیوں کی کچھ ٹھوس مثالیں۔ 🚀 diff --git a/docs/ur/docs/deployment/server-workers.md b/docs/ur/docs/deployment/server-workers.md new file mode 100644 index 000000000..9ff0095dd --- /dev/null +++ b/docs/ur/docs/deployment/server-workers.md @@ -0,0 +1,139 @@ +# Server Workers - Uvicorn with Workers { #server-workers-uvicorn-with-workers } + +آئیے پہلے سے ان deployment تصورات کو دوبارہ دیکھتے ہیں: + +* سیکیورٹی - HTTPS +* شروع ہونے پر چلنا +* دوبارہ شروع ہونا +* **نقل (چلنے والے processes کی تعداد)** +* میموری +* شروع ہونے سے پہلے کے مراحل + +اب تک، دستاویزات کے تمام ٹیوٹوریلز کے ساتھ، آپ شاید ایک **server پروگرام** چلا رہے تھے، مثلاً `fastapi` command استعمال کرتے ہوئے جو Uvicorn چلاتا ہے، ایک **واحد process** میں۔ + +ایپلیکیشنز deploy کرتے وقت آپ شاید **متعدد cores** سے فائدہ اٹھانے اور زیادہ requests سنبھالنے کے لیے **processes کی نقل** رکھنا چاہیں گے۔ + +جیسا کہ آپ نے [Deployment تصورات](concepts.md) کے پچھلے باب میں دیکھا، اس کے لیے متعدد حکمت عملیاں ہیں۔ + +یہاں میں آپ کو دکھاؤں گا کہ `fastapi` command یا `uvicorn` command براہ راست استعمال کرتے ہوئے **worker processes** کے ساتھ **Uvicorn** کیسے استعمال کریں۔ + +/// info | معلومات + +اگر آپ containers استعمال کر رہے ہیں، مثلاً Docker یا Kubernetes کے ساتھ، تو میں اگلے باب میں اس کے بارے میں مزید بتاؤں گا: [FastAPI in Containers - Docker](docker.md)۔ + +خاص طور پر، **Kubernetes** پر چلاتے وقت آپ شاید workers استعمال **نہیں** کرنا چاہیں گے بلکہ **ہر container میں ایک واحد Uvicorn process** چلائیں گے، لیکن میں اس کے بارے میں اس باب میں بعد میں بتاؤں گا۔ + +/// + +## متعدد Workers { #multiple-workers } + +آپ `--workers` command line اختیار کے ساتھ متعدد workers شروع کر سکتے ہیں: + +//// tab | `fastapi` + +اگر آپ `fastapi` command استعمال کرتے ہیں: + +
+ +```console +$ fastapi run --workers 4 main.py + + FastAPI Starting production server 🚀 + + Searching for package file structure from directories with + __init__.py files + Importing from /home/user/code/awesomeapp + + module 🐍 main.py + + code Importing the FastAPI app object from the module with the + following code: + + from main import app + + app Using import string: main:app + + server Server started at http://0.0.0.0:8000 + server Documentation at http://0.0.0.0:8000/docs + + Logs: + + INFO Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to + quit) + INFO Started parent process [27365] + INFO Started server process [27368] + INFO Started server process [27369] + INFO Started server process [27370] + INFO Started server process [27367] + INFO Waiting for application startup. + INFO Waiting for application startup. + INFO Waiting for application startup. + INFO Waiting for application startup. + INFO Application startup complete. + INFO Application startup complete. + INFO Application startup complete. + INFO Application startup complete. +``` + +
+ +//// + +//// tab | `uvicorn` + +اگر آپ `uvicorn` command براہ راست استعمال کرنا چاہیں: + +
+ +```console +$ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4 +INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit) +INFO: Started parent process [27365] +INFO: Started server process [27368] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Started server process [27369] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Started server process [27370] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Started server process [27367] +INFO: Waiting for application startup. +INFO: Application startup complete. +``` + +
+ +//// + +یہاں واحد نیا اختیار `--workers` ہے جو Uvicorn کو 4 worker processes شروع کرنے کو کہتا ہے۔ + +آپ یہ بھی دیکھ سکتے ہیں کہ یہ ہر process کا **PID** دکھاتا ہے، parent process (یہ **process manager** ہے) کے لیے `27365` اور ہر worker process کے لیے ایک: `27368`، `27369`، `27370`، اور `27367`۔ + +## Deployment کے تصورات { #deployment-concepts } + +یہاں آپ نے دیکھا کہ ایپلیکیشن کے عمل کو **متوازی** بنانے، CPU میں **متعدد cores** سے فائدہ اٹھانے، اور **زیادہ requests** فراہم کرنے کے قابل ہونے کے لیے متعدد **workers** کیسے استعمال کریں۔ + +اوپر کی deployment تصورات کی فہرست سے، workers استعمال کرنا بنیادی طور پر **نقل** کے حصے میں مدد کرے گا، اور تھوڑا سا **دوبارہ شروع ہونے** میں، لیکن آپ کو ابھی بھی باقیوں کا خیال رکھنا ہوگا: + +* **سیکیورٹی - HTTPS** +* **شروع ہونے پر چلنا** +* ***دوبارہ شروع ہونا*** +* نقل (چلنے والے processes کی تعداد) +* **میموری** +* **شروع ہونے سے پہلے کے مراحل** + +## Containers اور Docker { #containers-and-docker } + +[FastAPI in Containers - Docker](docker.md) کے بارے میں اگلے باب میں میں آپ کو کچھ حکمت عملیاں بتاؤں گا جو آپ دوسرے **deployment تصورات** سنبھالنے کے لیے استعمال کر سکتے ہیں۔ + +میں آپ کو دکھاؤں گا کہ ایک واحد Uvicorn process چلانے کے لیے **شروع سے اپنی خود کی image کیسے بنائیں**۔ یہ ایک آسان عمل ہے اور شاید یہی وہ چیز ہے جو آپ **Kubernetes** جیسے تقسیم شدہ container management system استعمال کرتے وقت کرنا چاہیں گے۔ + +## خلاصہ { #recap } + +آپ **multi-core CPUs** سے فائدہ اٹھانے اور **متوازی طور پر متعدد processes** چلانے کے لیے `fastapi` یا `uvicorn` commands کے ساتھ `--workers` CLI اختیار استعمال کر سکتے ہیں۔ + +آپ ان ٹولز اور خیالات کو استعمال کر سکتے ہیں اگر آپ خود deployment تصورات کا خیال رکھتے ہوئے **اپنا خود کا deployment system** ترتیب دے رہے ہیں۔ + +containers (مثلاً Docker اور Kubernetes) کے ساتھ **FastAPI** کے بارے میں جاننے کے لیے اگلا باب دیکھیں۔ آپ دیکھیں گے کہ ان ٹولز میں دوسرے **deployment تصورات** کو بھی حل کرنے کے آسان طریقے ہیں۔ ✨ diff --git a/docs/ur/docs/deployment/versions.md b/docs/ur/docs/deployment/versions.md new file mode 100644 index 000000000..2e31b66e8 --- /dev/null +++ b/docs/ur/docs/deployment/versions.md @@ -0,0 +1,93 @@ +# FastAPI ورژنز کے بارے میں { #about-fastapi-versions } + +**FastAPI** پہلے سے بہت سی ایپلیکیشنز اور سسٹمز میں production میں استعمال ہو رہا ہے۔ اور ٹیسٹ کوریج 100% پر رکھی جاتی ہے۔ لیکن اس کی ترقی ابھی بھی تیزی سے جاری ہے۔ + +نئے فیچرز اکثر شامل کیے جاتے ہیں، bugs باقاعدگی سے ٹھیک کیے جاتے ہیں، اور کوڈ مسلسل بہتر ہو رہا ہے۔ + +اسی لیے موجودہ ورژن ابھی بھی `0.x.x` ہیں، یہ ظاہر کرتا ہے کہ ہر ورژن میں ممکنہ طور پر ٹوٹنے والی تبدیلیاں ہو سکتی ہیں۔ یہ [Semantic Versioning](https://semver.org/) کے ضوابط کی پیروی کرتا ہے۔ + +آپ ابھی **FastAPI** کے ساتھ production ایپلیکیشنز بنا سکتے ہیں (اور شاید کچھ عرصے سے بنا رہے ہیں)، آپ کو بس یقینی بنانا ہے کہ آپ ایسا ورژن استعمال کریں جو آپ کے باقی کوڈ کے ساتھ درست طریقے سے کام کرے۔ + +## اپنا `fastapi` ورژن مقرر کریں { #pin-your-fastapi-version } + +سب سے پہلے آپ کو **FastAPI** کا وہ ورژن "pin" کرنا چاہیے جو مخصوص تازہ ترین ورژن ہو جو آپ جانتے ہیں کہ آپ کی ایپلیکیشن کے ساتھ درست طریقے سے کام کرتا ہے۔ + +مثال کے طور پر، فرض کریں کہ آپ اپنی app میں ورژن `0.112.0` استعمال کر رہے ہیں۔ + +اگر آپ `requirements.txt` فائل استعمال کرتے ہیں تو آپ ورژن اس طرح مقرر کر سکتے ہیں: + +```txt +fastapi[standard]==0.112.0 +``` + +اس کا مطلب ہوگا کہ آپ بالکل ورژن `0.112.0` استعمال کریں گے۔ + +یا آپ اسے اس طرح بھی pin کر سکتے ہیں: + +```txt +fastapi[standard]>=0.112.0,<0.113.0 +``` + +اس کا مطلب ہوگا کہ آپ `0.112.0` یا اس سے اوپر کے ورژن استعمال کریں گے، لیکن `0.113.0` سے کم، مثلاً ورژن `0.112.2` بھی قبول ہوگا۔ + +اگر آپ اپنی تنصیبات منظم کرنے کے لیے کوئی اور ٹول استعمال کرتے ہیں، جیسے `uv`، Poetry، Pipenv، یا دوسرے، ان سب کے پاس ایسا طریقہ ہے جو آپ اپنے packages کے لیے مخصوص ورژنز تعین کرنے کے لیے استعمال کر سکتے ہیں۔ + +## دستیاب ورژنز { #available-versions } + +آپ دستیاب ورژنز دیکھ سکتے ہیں (مثلاً یہ چیک کرنے کے لیے کہ موجودہ تازہ ترین کون سا ہے) [Release Notes](../release-notes.md) میں۔ + +## ورژنز کے بارے میں { #about-versions } + +Semantic Versioning ضوابط کی پیروی کرتے ہوئے، `1.0.0` سے نیچے کوئی بھی ورژن ممکنہ طور پر ٹوٹنے والی تبدیلیاں شامل کر سکتا ہے۔ + +FastAPI اس ضابطے کی بھی پیروی کرتا ہے کہ کوئی بھی "PATCH" ورژن تبدیلی bug fixes اور غیر ٹوٹنے والی تبدیلیوں کے لیے ہے۔ + +/// tip | مشورہ + +"PATCH" آخری نمبر ہے، مثلاً `0.2.3` میں PATCH ورژن `3` ہے۔ + +/// + +تو، آپ کو اس طرح کے ورژن پر pin کرنے کے قابل ہونا چاہیے: + +```txt +fastapi>=0.45.0,<0.46.0 +``` + +ٹوٹنے والی تبدیلیاں اور نئے فیچرز "MINOR" ورژنز میں شامل کیے جاتے ہیں۔ + +/// tip | مشورہ + +"MINOR" درمیان کا نمبر ہے، مثلاً `0.2.3` میں MINOR ورژن `2` ہے۔ + +/// + +## FastAPI ورژنز اپ گریڈ کرنا { #upgrading-the-fastapi-versions } + +آپ کو اپنی app کے لیے ٹیسٹس شامل کرنے چاہئیں۔ + +**FastAPI** کے ساتھ یہ بہت آسان ہے (Starlette کی بدولت)، دستاویزات دیکھیں: [Testing](../tutorial/testing.md) + +ٹیسٹس ہونے کے بعد، آپ **FastAPI** ورژن کو زیادہ حالیہ میں اپ گریڈ کر سکتے ہیں، اور اپنے ٹیسٹس چلا کر یقینی بنا سکتے ہیں کہ آپ کا تمام کوڈ درست طریقے سے کام کر رہا ہے۔ + +اگر سب کچھ کام کر رہا ہے، یا ضروری تبدیلیاں کرنے کے بعد، اور آپ کے تمام ٹیسٹس پاس ہو رہے ہیں، تو آپ اپنا `fastapi` اس نئے حالیہ ورژن پر pin کر سکتے ہیں۔ + +## Starlette کے بارے میں { #about-starlette } + +آپ کو `starlette` کا ورژن pin نہیں کرنا چاہیے۔ + +**FastAPI** کے مختلف ورژنز Starlette کا ایک مخصوص نیا ورژن استعمال کریں گے۔ + +تو، آپ بس **FastAPI** کو صحیح Starlette ورژن استعمال کرنے دیں۔ + +## Pydantic کے بارے میں { #about-pydantic } + +Pydantic **FastAPI** کے ٹیسٹس کو اپنے ٹیسٹس میں شامل کرتا ہے، تو Pydantic کے نئے ورژنز (`1.0.0` سے اوپر) ہمیشہ FastAPI کے ساتھ ہم آہنگ ہوتے ہیں۔ + +آپ Pydantic کو `1.0.0` سے اوپر کسی بھی ایسے ورژن پر pin کر سکتے ہیں جو آپ کے لیے کام کرے۔ + +مثال کے طور پر: + +```txt +pydantic>=2.7.0,<3.0.0 +``` diff --git a/docs/ur/docs/editor-support.md b/docs/ur/docs/editor-support.md new file mode 100644 index 000000000..ae763c304 --- /dev/null +++ b/docs/ur/docs/editor-support.md @@ -0,0 +1,23 @@ +# Editor Support { #editor-support } + +سرکاری [FastAPI Extension](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) آپ کے FastAPI development workflow کو *path operation* کی دریافت، navigation، نیز FastAPI Cloud deployment، اور لائیو log streaming کے ساتھ بہتر بناتا ہے۔ + +Extension کے بارے میں مزید تفصیلات کے لیے، [GitHub repository](https://github.com/fastapi/fastapi-vscode) پر README دیکھیں۔ + +## سیٹ اپ اور Installation { #setup-and-installation } + +**FastAPI Extension** [VS Code](https://code.visualstudio.com/) اور [Cursor](https://www.cursor.com/) دونوں کے لیے دستیاب ہے۔ اسے ہر editor میں Extensions پینل سے "FastAPI" تلاش کرکے اور **FastAPI Labs** کی شائع کردہ extension منتخب کرکے براہ راست install کیا جا سکتا ہے۔ یہ extension browser پر مبنی editors جیسے [vscode.dev](https://vscode.dev) اور [github.dev](https://github.dev) میں بھی کام کرتا ہے۔ + +### Application Discovery { #application-discovery } + +بطور default، extension آپ کے workspace میں `FastAPI()` instantiate کرنے والی فائلوں کو scan کرکے خودکار طور پر FastAPI applications دریافت کرے گا۔ اگر auto-detection آپ کے project structure کے لیے کام نہ کرے، تو آپ `pyproject.toml` میں `[tool.fastapi]` کے ذریعے یا `fastapi.entryPoint` VS Code setting میں module notation (مثلاً `myapp.main:app`) استعمال کرکے entrypoint بتا سکتے ہیں۔ + +## Features { #features } + +- **Path Operation Explorer** - آپ کی application میں تمام *path operations* کا ایک sidebar tree view۔ کسی بھی route یا router definition تک جانے کے لیے کلک کریں۔ +- **Route Search** - Ctrl + Shift + E (macOS پر: Cmd + Shift + E) سے path، method، یا name سے تلاش کریں۔ +- **CodeLens Navigation** - Test client calls (مثلاً `client.get('/items')`) کے اوپر کلک کرنے والے links جو مماثل *path operation* تک لے جاتے ہیں تاکہ tests اور implementation کے درمیان تیز navigation ہو۔ +- **Deploy to FastAPI Cloud** - ایک کلک سے اپنی app کو [FastAPI Cloud](https://fastapicloud.com/) پر deploy کریں۔ +- **Stream Application Logs** - اپنی FastAPI Cloud پر deploy شدہ application سے level filtering اور text search کے ساتھ real-time log streaming۔ + +اگر آپ extension کی features سے واقف ہونا چاہتے ہیں، تو Command Palette (Ctrl + Shift + P یا macOS پر: Cmd + Shift + P) کھول کر "Welcome: Open walkthrough..." منتخب کریں اور پھر "Get started with FastAPI" walkthrough چنیں۔ diff --git a/docs/ur/docs/environment-variables.md b/docs/ur/docs/environment-variables.md new file mode 100644 index 000000000..638566101 --- /dev/null +++ b/docs/ur/docs/environment-variables.md @@ -0,0 +1,298 @@ +# Environment Variables { #environment-variables } + +/// tip | مشورہ + +اگر آپ پہلے سے جانتے ہیں کہ "environment variables" کیا ہیں اور انہیں کیسے استعمال کرتے ہیں، تو آزادانہ طور پر اسے چھوڑ دیں۔ + +/// + +ایک environment variable (جسے "**env var**" بھی کہا جاتا ہے) ایک ایسا variable ہے جو Python code سے **باہر**، **operating system** میں رہتا ہے، اور آپ کا Python code (یا دوسرے programs بھی) اسے پڑھ سکتے ہیں۔ + +Environment variables application **settings** کو سنبھالنے، Python کی **installation** کے حصے کے طور پر وغیرہ کے لیے مفید ہو سکتے ہیں۔ + +## Env Vars بنائیں اور استعمال کریں { #create-and-use-env-vars } + +آپ **shell (terminal)** میں environment variables **بنا** سکتے ہیں اور استعمال کر سکتے ہیں، Python کی ضرورت کے بغیر: + +//// tab | Linux, macOS, Windows Bash + +
+ +```console +// You could create an env var MY_NAME with +$ export MY_NAME="Wade Wilson" + +// Then you could use it with other programs, like +$ echo "Hello $MY_NAME" + +Hello Wade Wilson +``` + +
+ +//// + +//// tab | Windows PowerShell + +
+ +```console +// Create an env var MY_NAME +$ $Env:MY_NAME = "Wade Wilson" + +// Use it with other programs, like +$ echo "Hello $Env:MY_NAME" + +Hello Wade Wilson +``` + +
+ +//// + +## Python میں env vars پڑھیں { #read-env-vars-in-python } + +آپ Python سے **باہر**، terminal میں (یا کسی اور طریقے سے) بھی environment variables بنا سکتے ہیں، اور پھر **Python میں انہیں پڑھ** سکتے ہیں۔ + +مثال کے طور پر آپ کے پاس `main.py` فائل ہو سکتی ہے: + +```Python hl_lines="3" +import os + +name = os.getenv("MY_NAME", "World") +print(f"Hello {name} from Python") +``` + +/// tip | مشورہ + +[`os.getenv()`](https://docs.python.org/3.8/library/os.html#os.getenv) کا دوسرا argument واپس کرنے کے لیے default value ہے۔ + +اگر فراہم نہ کیا جائے تو بطور default یہ `None` ہے، یہاں ہم استعمال کرنے کے لیے default value `"World"` فراہم کر رہے ہیں۔ + +/// + +پھر آپ اس Python program کو call کر سکتے ہیں: + +//// tab | Linux, macOS, Windows Bash + +
+ +```console +// Here we don't set the env var yet +$ python main.py + +// As we didn't set the env var, we get the default value + +Hello World from Python + +// But if we create an environment variable first +$ export MY_NAME="Wade Wilson" + +// And then call the program again +$ python main.py + +// Now it can read the environment variable + +Hello Wade Wilson from Python +``` + +
+ +//// + +//// tab | Windows PowerShell + +
+ +```console +// Here we don't set the env var yet +$ python main.py + +// As we didn't set the env var, we get the default value + +Hello World from Python + +// But if we create an environment variable first +$ $Env:MY_NAME = "Wade Wilson" + +// And then call the program again +$ python main.py + +// Now it can read the environment variable + +Hello Wade Wilson from Python +``` + +
+ +//// + +چونکہ environment variables code سے باہر سیٹ ہو سکتے ہیں، لیکن code کے ذریعے پڑھے جا سکتے ہیں، اور باقی فائلوں کے ساتھ (`git` میں commit) محفوظ نہیں ہونے چاہئیں، ان کو configurations یا **settings** کے لیے استعمال کرنا عام ہے۔ + +آپ ایک environment variable صرف کسی **خاص program invocation** کے لیے بھی بنا سکتے ہیں، جو صرف اس program کے لیے دستیاب ہو، اور صرف اس کے دورانیے کے لیے۔ + +ایسا کرنے کے لیے، اسے program سے ٹھیک پہلے، اسی لائن پر بنائیں: + +
+ +```console +// Create an env var MY_NAME in line for this program call +$ MY_NAME="Wade Wilson" python main.py + +// Now it can read the environment variable + +Hello Wade Wilson from Python + +// The env var no longer exists afterwards +$ python main.py + +Hello World from Python +``` + +
+ +/// tip | مشورہ + +آپ اس کے بارے میں مزید [The Twelve-Factor App: Config](https://12factor.net/config) پر پڑھ سکتے ہیں۔ + +/// + +## Types اور Validation { #types-and-validation } + +یہ environment variables صرف **text strings** کو ہی سنبھال سکتے ہیں، کیونکہ وہ Python سے باہر ہیں اور دوسرے programs اور باقی system (اور مختلف operating systems جیسے Linux، Windows، macOS) کے ساتھ compatible ہونی چاہئیں۔ + +اس کا مطلب ہے کہ Python میں environment variable سے پڑھی جانے والی **کوئی بھی value** ایک **`str`** ہوگی، اور کسی مختلف type میں تبدیلی یا کوئی validation code میں کرنا ہوگا۔ + +آپ application **settings** سنبھالنے کے لیے environment variables استعمال کرنے کے بارے میں مزید [Advanced User Guide - Settings and Environment Variables](./advanced/settings.md) میں سیکھیں گے۔ + +## `PATH` Environment Variable { #path-environment-variable } + +ایک **خاص** environment variable ہے جسے **`PATH`** کہتے ہیں جو operating systems (Linux، macOS، Windows) چلانے کے لیے programs تلاش کرنے میں استعمال کرتا ہے۔ + +Variable `PATH` کی value ایک لمبی string ہے جو directories پر مشتمل ہے جو Linux اور macOS پر colon `:` سے اور Windows پر semicolon `;` سے الگ ہوتی ہیں۔ + +مثال کے طور پر، `PATH` environment variable اس طرح نظر آ سکتا ہے: + +//// tab | Linux, macOS + +```plaintext +/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin +``` + +اس کا مطلب ہے کہ system کو ان directories میں programs تلاش کرنے چاہئیں: + +* `/usr/local/bin` +* `/usr/bin` +* `/bin` +* `/usr/sbin` +* `/sbin` + +//// + +//// tab | Windows + +```plaintext +C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32 +``` + +اس کا مطلب ہے کہ system کو ان directories میں programs تلاش کرنے چاہئیں: + +* `C:\Program Files\Python312\Scripts` +* `C:\Program Files\Python312` +* `C:\Windows\System32` + +//// + +جب آپ terminal میں کوئی **command** ٹائپ کرتے ہیں، تو operating system `PATH` environment variable میں درج **ہر directory** میں program **تلاش کرتا ہے**۔ + +مثال کے طور پر، جب آپ terminal میں `python` ٹائپ کرتے ہیں، تو operating system اس فہرست کی **پہلی directory** میں `python` نامی program تلاش کرتا ہے۔ + +اگر مل جائے تو وہ اسے **استعمال کرے گا**۔ ورنہ **دوسری directories** میں تلاش جاری رکھتا ہے۔ + +### Python install کرنا اور `PATH` کو اپڈیٹ کرنا { #installing-python-and-updating-the-path } + +جب آپ Python install کرتے ہیں، تو آپ سے پوچھا جا سکتا ہے کہ کیا آپ `PATH` environment variable کو اپڈیٹ کرنا چاہتے ہیں۔ + +//// tab | Linux, macOS + +فرض کریں آپ Python install کرتے ہیں اور یہ `/opt/custompython/bin` directory میں آتا ہے۔ + +اگر آپ `PATH` environment variable اپڈیٹ کرنے پر ہاں کہیں، تو installer `/opt/custompython/bin` کو `PATH` environment variable میں شامل کر دے گا۔ + +یہ اس طرح نظر آ سکتا ہے: + +```plaintext +/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/custompython/bin +``` + +اس طرح، جب آپ terminal میں `python` ٹائپ کریں گے، تو system `/opt/custompython/bin` (آخری directory) میں Python program تلاش کرے گا اور اسے استعمال کرے گا۔ + +//// + +//// tab | Windows + +فرض کریں آپ Python install کرتے ہیں اور یہ `C:\opt\custompython\bin` directory میں آتا ہے۔ + +اگر آپ `PATH` environment variable اپڈیٹ کرنے پر ہاں کہیں، تو installer `C:\opt\custompython\bin` کو `PATH` environment variable میں شامل کر دے گا۔ + +```plaintext +C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32;C:\opt\custompython\bin +``` + +اس طرح، جب آپ terminal میں `python` ٹائپ کریں گے، تو system `C:\opt\custompython\bin` (آخری directory) میں Python program تلاش کرے گا اور اسے استعمال کرے گا۔ + +//// + +تو اگر آپ ٹائپ کریں: + +
+ +```console +$ python +``` + +
+ +//// tab | Linux, macOS + +System `/opt/custompython/bin` میں `python` program **تلاش** کرے گا اور اسے چلائے گا۔ + +یہ تقریباً اس کے مساوی ہوگا: + +
+ +```console +$ /opt/custompython/bin/python +``` + +
+ +//// + +//// tab | Windows + +System `C:\opt\custompython\bin\python` میں `python` program **تلاش** کرے گا اور اسے چلائے گا۔ + +یہ تقریباً اس کے مساوی ہوگا: + +
+ +```console +$ C:\opt\custompython\bin\python +``` + +
+ +//// + +یہ معلومات [Virtual Environments](virtual-environments.md) کے بارے میں سیکھتے وقت مفید ہوں گی۔ + +## نتیجہ { #conclusion } + +اس کے ساتھ آپ کو اس بات کی بنیادی سمجھ ہونی چاہیے کہ **environment variables** کیا ہیں اور Python میں انہیں کیسے استعمال کرنا ہے۔ + +آپ ان کے بارے میں مزید [Wikipedia for Environment Variable](https://en.wikipedia.org/wiki/Environment_variable) پر بھی پڑھ سکتے ہیں۔ + +بہت سے معاملات میں یہ فوری طور پر واضح نہیں ہوتا کہ environment variables کیسے مفید اور قابل اطلاق ہوں گے۔ لیکن جب آپ development کر رہے ہوتے ہیں تو یہ بہت سے مختلف منظرناموں میں سامنے آتے رہتے ہیں، تو ان کے بارے میں جاننا اچھا ہے۔ + +مثال کے طور پر، اگلے سیکشن [Virtual Environments](virtual-environments.md) میں آپ کو یہ معلومات کی ضرورت ہوگی۔ diff --git a/docs/ur/docs/external-links.md b/docs/ur/docs/external-links.md new file mode 100644 index 000000000..7027d88c3 --- /dev/null +++ b/docs/ur/docs/external-links.md @@ -0,0 +1,25 @@ +# بیرونی لنکس + +**FastAPI** کی ایک شاندار کمیونٹی ہے جو مسلسل بڑھ رہی ہے۔ + +**FastAPI** سے متعلق بہت سے مضامین، مقالات، tools، اور projects ہیں۔ + +آپ آسانی سے search engine یا video platform استعمال کرکے FastAPI سے متعلق بہت سے وسائل تلاش کر سکتے ہیں۔ + +/// info | معلومات + +پہلے، اس صفحے پر بیرونی مضامین کے لنکس درج کیے جاتے تھے۔ + +لیکن اب جب FastAPI تمام زبانوں میں سب سے زیادہ GitHub stars والا backend framework ہے، اور Python میں سب سے زیادہ starred اور استعمال ہونے والا framework ہے، تو اس کے بارے میں لکھے گئے تمام مضامین درج کرنے کی کوشش کرنا اب مناسب نہیں رہا۔ + +/// + +## GitHub Repositories + +سب سے زیادہ starred [`fastapi` topic والی GitHub repositories](https://github.com/topics/fastapi): + +{% for repo in topic_repos %} + +★ {{repo.stars}} - {{repo.name}} by @{{repo.owner_login}}. + +{% endfor %} diff --git a/docs/ur/docs/fastapi-cli.md b/docs/ur/docs/fastapi-cli.md new file mode 100644 index 000000000..94c3d377a --- /dev/null +++ b/docs/ur/docs/fastapi-cli.md @@ -0,0 +1,128 @@ +# FastAPI CLI { #fastapi-cli } + +**FastAPI CLI** ایک command line program ہے جسے آپ اپنی FastAPI app serve کرنے، اپنا FastAPI project منظم کرنے، اور مزید کاموں کے لیے استعمال کر سکتے ہیں۔ + +جب آپ FastAPI install کرتے ہیں (مثلاً `pip install "fastapi[standard]"` سے)، تو یہ ایک command line program کے ساتھ آتا ہے جسے آپ terminal میں چلا سکتے ہیں۔ + +اپنی FastAPI app کو development کے لیے چلانے کے لیے، آپ `fastapi dev` command استعمال کر سکتے ہیں: + +
+ +```console +$ fastapi dev + + FastAPI Starting development server 🚀 + + Searching for package file structure from directories with + __init__.py files + Importing from /home/user/code/awesomeapp + + module 🐍 main.py + + code Importing the FastAPI app object from the module with the + following code: + + from main import app + + app Using import string: main:app + + server Server started at http://127.0.0.1:8000 + server Documentation at http://127.0.0.1:8000/docs + + tip Running in development mode, for production use: + fastapi run + + Logs: + + INFO Will watch for changes in these directories: + ['/home/user/code/awesomeapp'] + INFO Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to + quit) + INFO Started reloader process [383138] using WatchFiles + INFO Started server process [383153] + INFO Waiting for application startup. + INFO Application startup complete. +``` + +
+ +/// tip | مشورہ + +Production کے لیے آپ `fastapi dev` کی بجائے `fastapi run` استعمال کریں گے۔ 🚀 + +/// + +اندرونی طور پر، **FastAPI CLI** [Uvicorn](https://www.uvicorn.dev) استعمال کرتا ہے، ایک اعلیٰ performance والا، production-ready، ASGI server۔ 😎 + +`fastapi` CLI خودکار طور پر چلانے والی FastAPI app کو detect کرنے کی کوشش کرے گا، یہ فرض کرتے ہوئے کہ یہ `main.py` فائل میں `app` نامی object ہے (یا کچھ دوسرے متبادل)۔ + +لیکن آپ واضح طور پر استعمال کرنے والی app configure کر سکتے ہیں۔ + +## `pyproject.toml` میں app کا `entrypoint` configure کریں { #configure-the-app-entrypoint-in-pyproject-toml } + +آپ `pyproject.toml` فائل میں اپنی app کی جگہ configure کر سکتے ہیں جیسے: + +```toml +[tool.fastapi] +entrypoint = "main:app" +``` + +یہ `entrypoint`، `fastapi` command کو بتائے گا کہ اسے app اس طرح import کرنی چاہیے: + +```python +from main import app +``` + +اگر آپ کا code اس طرح ترتیب دیا گیا ہے: + +``` +. +├── backend +│ ├── main.py +│ ├── __init__.py +``` + +تو آپ `entrypoint` اس طرح سیٹ کریں گے: + +```toml +[tool.fastapi] +entrypoint = "backend.main:app" +``` + +جو اس کے مساوی ہوگا: + +```python +from backend.main import app +``` + +### path کے ساتھ `fastapi dev` { #fastapi-dev-with-path } + +آپ `fastapi dev` command کو فائل کا path بھی دے سکتے ہیں، اور یہ استعمال کرنے والی FastAPI app object کا اندازہ لگائے گا: + +```console +$ fastapi dev main.py +``` + +لیکن آپ کو ہر بار `fastapi` command call کرتے وقت صحیح path یاد رکھنا ہوگا۔ + +اس کے علاوہ، دوسرے tools شاید اسے تلاش نہ کر سکیں، مثلاً [VS Code Extension](editor-support.md) یا [FastAPI Cloud](https://fastapicloud.com)، تو `pyproject.toml` میں `entrypoint` استعمال کرنا تجویز کیا جاتا ہے۔ + +## `fastapi dev` { #fastapi-dev } + +`fastapi dev` چلانے سے development mode شروع ہوتا ہے۔ + +بطور default، **auto-reload** فعال ہوتا ہے، جب آپ اپنے code میں تبدیلیاں کرتے ہیں تو server خودکار طور پر دوبارہ لوڈ ہوتا ہے۔ یہ وسائل کا زیادہ استعمال کرتا ہے اور غیر فعال ہونے کی نسبت کم مستحکم ہو سکتا ہے۔ آپ کو اسے صرف development کے لیے استعمال کرنا چاہیے۔ یہ IP address `127.0.0.1` پر بھی سنتا ہے، جو آپ کی مشین کا خود سے بات چیت کرنے کا IP ہے (`localhost`)۔ + +## `fastapi run` { #fastapi-run } + +`fastapi run` چلانے سے FastAPI production mode میں شروع ہوتا ہے۔ + +بطور default، **auto-reload** غیر فعال ہوتا ہے۔ یہ IP address `0.0.0.0` پر سنتا ہے، یعنی تمام دستیاب IP addresses، اس طرح یہ ہر اس شخص کے لیے عوامی طور پر قابل رسائی ہوگا جو مشین سے بات چیت کر سکتا ہے۔ عام طور پر آپ اسے production میں اسی طرح چلائیں گے، مثلاً container میں۔ + +زیادہ تر معاملات میں آپ کے پاس ایک "termination proxy" ہوگا جو آپ کے لیے HTTPS سنبھالتا ہے، یہ آپ کی application کو deploy کرنے کے طریقے پر منحصر ہے، آپ کا provider شاید یہ آپ کے لیے کرے، یا آپ کو خود سیٹ اپ کرنا ہوگا۔ + +/// tip | مشورہ + +آپ اس کے بارے میں مزید [deployment documentation](deployment/index.md) میں سیکھ سکتے ہیں۔ + +/// diff --git a/docs/ur/docs/fastapi-people.md b/docs/ur/docs/fastapi-people.md new file mode 100644 index 000000000..02c33ef6e --- /dev/null +++ b/docs/ur/docs/fastapi-people.md @@ -0,0 +1,285 @@ +--- +hide: + - navigation +--- + +# FastAPI کے لوگ + +FastAPI کی ایک حیرت انگیز کمیونٹی ہے جو ہر پس منظر سے لوگوں کا خیرمقدم کرتی ہے۔ + +## بانی + +ارے! 👋 + +یہ میں ہوں: + +
+{% for user in people.maintainers %} + +
@{{ contributors.tiangolo.login }}
Answers: {{ user.answers }}
Pull Requests: {{ contributors.tiangolo.count }}
+{% endfor %} + +
+ +میں **FastAPI** کا بانی ہوں۔ آپ اس کے بارے میں مزید [FastAPI کی مدد کریں - مدد حاصل کریں - مصنف سے جڑیں](help-fastapi.md#connect-with-the-author) میں پڑھ سکتے ہیں۔ + +...لیکن یہاں میں آپ کو کمیونٹی دکھانا چاہتا ہوں۔ + +--- + +**FastAPI** کو کمیونٹی سے بہت زیادہ حمایت ملتی ہے۔ اور میں ان کے تعاون کو نمایاں کرنا چاہتا ہوں۔ + +یہ وہ لوگ ہیں جو: + +* [GitHub میں سوالات کے ساتھ دوسروں کی مدد کرتے ہیں](help-fastapi.md#help-others-with-questions-in-github)۔ +* [Pull Requests بناتے ہیں](help-fastapi.md#create-a-pull-request)۔ +* Pull Requests کا Review کرتے ہیں، [خاص طور پر تراجم کے لیے اہم](contributing.md#translations)۔ +* [Repository منظم](management-tasks.md) کرنے میں مدد کرتے ہیں (ٹیم ممبران)۔ + +یہ سب کام repository کو برقرار رکھنے میں مدد کرتے ہیں۔ + +ان کے لیے تالیاں۔ 👏 🙇 + +## ٹیم + +یہ موجودہ ٹیم ممبران کی فہرست ہے۔ 😎 + +ان کی شمولیت اور اجازتوں کی مختلف سطحیں ہیں، وہ [repository management tasks](./management-tasks.md) انجام دے سکتے ہیں اور مل کر ہم [FastAPI repository کو منظم کرتے ہیں](./management.md)۔ + +
+ +{% for user in members["members"] %} + +
@{{ user.login }}
+ +{% endfor %} + +
+ +حالانکہ ٹیم ممبران کے پاس خصوصی کام انجام دینے کی اجازتیں ہیں، [FastAPI کو برقرار رکھنے میں دوسروں کی ہر مدد](./help-fastapi.md#help-maintain-fastapi) کی بہت قدر کی جاتی ہے! 🙇‍♂️ + +## FastAPI Experts + +یہ وہ صارفین ہیں جو [GitHub میں سوالات کے ساتھ سب سے زیادہ دوسروں کی مدد](help-fastapi.md#help-others-with-questions-in-github) کرتے رہے ہیں۔ 🙇 + +انہوں نے بہت سے دوسروں کی مدد کرکے ثابت کیا ہے کہ وہ **FastAPI Experts** ہیں۔ ✨ + +/// tip | مشورہ + +آپ بھی سرکاری FastAPI Expert بن سکتے ہیں! + +بس [GitHub میں سوالات کے ساتھ دوسروں کی مدد کریں](help-fastapi.md#help-others-with-questions-in-github)۔ 🤓 + +/// + +آپ **FastAPI Experts** یہاں دیکھ سکتے ہیں: + +* [پچھلا مہینہ](#fastapi-experts-last-month) 🤓 +* [3 مہینے](#fastapi-experts-3-months) 😎 +* [6 مہینے](#fastapi-experts-6-months) 🧐 +* [1 سال](#fastapi-experts-1-year) 🧑‍🔬 +* [**ہمیشہ**](#fastapi-experts-all-time) 🧙 + +### FastAPI Experts - پچھلا مہینہ + +یہ وہ صارفین ہیں جو پچھلے مہینے [GitHub میں سوالات کے ساتھ سب سے زیادہ دوسروں کی مدد](help-fastapi.md#help-others-with-questions-in-github) کرتے رہے ہیں۔ 🤓 + +
+ +{% for user in people.last_month_experts[:10] %} + +{% if user.login not in skip_users %} + +
@{{ user.login }}
Questions replied: {{ user.count }}
+ +{% endif %} + +{% endfor %} + +
+ +### FastAPI Experts - 3 مہینے + +یہ وہ صارفین ہیں جو پچھلے 3 مہینوں میں [GitHub میں سوالات کے ساتھ سب سے زیادہ دوسروں کی مدد](help-fastapi.md#help-others-with-questions-in-github) کرتے رہے ہیں۔ 😎 + +
+ +{% for user in people.three_months_experts[:10] %} + +{% if user.login not in skip_users %} + +
@{{ user.login }}
Questions replied: {{ user.count }}
+ +{% endif %} + +{% endfor %} + +
+ +### FastAPI Experts - 6 مہینے + +یہ وہ صارفین ہیں جو پچھلے 6 مہینوں میں [GitHub میں سوالات کے ساتھ سب سے زیادہ دوسروں کی مدد](help-fastapi.md#help-others-with-questions-in-github) کرتے رہے ہیں۔ 🧐 + +
+ +{% for user in people.six_months_experts[:10] %} + +{% if user.login not in skip_users %} + +
@{{ user.login }}
Questions replied: {{ user.count }}
+ +{% endif %} + +{% endfor %} + +
+ +### FastAPI Experts - 1 سال + +یہ وہ صارفین ہیں جو پچھلے سال [GitHub میں سوالات کے ساتھ سب سے زیادہ دوسروں کی مدد](help-fastapi.md#help-others-with-questions-in-github) کرتے رہے ہیں۔ 🧑‍🔬 + +
+ +{% for user in people.one_year_experts[:20] %} + +{% if user.login not in skip_users %} + +
@{{ user.login }}
Questions replied: {{ user.count }}
+ +{% endif %} + +{% endfor %} + +
+ +### FastAPI Experts - ہمیشہ + +یہ ہیں ہمیشہ کے **FastAPI Experts**۔ 🤓🤯 + +یہ وہ صارفین ہیں جنہوں نے *ہمیشہ سے* [GitHub میں سوالات کے ساتھ سب سے زیادہ دوسروں کی مدد](help-fastapi.md#help-others-with-questions-in-github) کی ہے۔ 🧙 + +
+ +{% for user in people.experts[:50] %} + +{% if user.login not in skip_users %} + +
@{{ user.login }}
Questions replied: {{ user.count }}
+ +{% endif %} + +{% endfor %} + +
+ +## اعلیٰ شراکت دار + +یہ ہیں **اعلیٰ شراکت دار**۔ 👷 + +ان صارفین نے سب سے زیادہ [Pull Requests بنائی ہیں](help-fastapi.md#create-a-pull-request) جو *merge* ہو چکی ہیں۔ + +انہوں نے source code، documentation وغیرہ میں تعاون کیا ہے۔ 📦 + +
+ +{% for user in (contributors.values() | list)[:50] %} + +{% if user.login not in skip_users %} + +
@{{ user.login }}
Pull Requests: {{ user.count }}
+ +{% endif %} + +{% endfor %} + +
+ +سینکڑوں دوسرے شراکت دار بھی ہیں، آپ انہیں [FastAPI GitHub Contributors page](https://github.com/fastapi/fastapi/graphs/contributors) پر دیکھ سکتے ہیں۔ 👷 + +## اعلیٰ ترجمہ جائزہ کار + +یہ صارفین **اعلیٰ ترجمہ جائزہ کار** ہیں۔ 🕵️ + +ترجمہ جائزہ کاروں کے پاس documentation کے [**تراجم کی منظوری**](contributing.md#translations) دینے کا اختیار ہے۔ ان کے بغیر، کئی دوسری زبانوں میں documentation نہ ہوتی۔ + +
+{% for user in (translation_reviewers.values() | list)[:50] %} + +{% if user.login not in skip_users %} + +
@{{ user.login }}
Reviews: {{ user.count }}
+ +{% endif %} + +{% endfor %} + +
+ +## سرپرست + +یہ ہیں **سرپرست**۔ 😎 + +وہ **FastAPI** (اور دوسرے) کے ساتھ میرے کام کی حمایت کر رہے ہیں، بنیادی طور پر [GitHub Sponsors](https://github.com/sponsors/tiangolo) کے ذریعے۔ + +{% if sponsors %} + +{% if sponsors.gold %} + +### گولڈ سرپرست + +{% for sponsor in sponsors.gold -%} + +{% endfor %} +{% endif %} + +{% if sponsors.silver %} + +### سلور سرپرست + +{% for sponsor in sponsors.silver -%} + +{% endfor %} +{% endif %} + +{% if sponsors.bronze %} + +### برانز سرپرست + +{% for sponsor in sponsors.bronze -%} + +{% endfor %} +{% endif %} + +{% endif %} + +### انفرادی سرپرست + +{% if github_sponsors %} +{% for group in github_sponsors.sponsors %} + +
+ +{% for user in group %} +{% if user.login not in sponsors_badge.logins %} + +
@{{ user.login }}
+ +{% endif %} +{% endfor %} + +
+ +{% endfor %} +{% endif %} + +## ڈیٹا کے بارے میں - تکنیکی تفصیلات + +اس صفحے کا بنیادی مقصد کمیونٹی کی دوسروں کی مدد کرنے کی کوششوں کو نمایاں کرنا ہے۔ + +خاص طور پر ایسی کوششوں کو شامل کرتے ہوئے جو عام طور پر کم نظر آتی ہیں، اور بہت سے معاملات میں زیادہ محنت طلب ہوتی ہیں، جیسے سوالات میں دوسروں کی مدد کرنا اور تراجم کے ساتھ Pull Requests کا review کرنا۔ + +ڈیٹا ہر مہینے حساب کیا جاتا ہے، آپ [source code یہاں](https://github.com/fastapi/fastapi/blob/master/scripts/) پڑھ سکتے ہیں۔ + +یہاں میں سرپرستوں کے تعاون کو بھی نمایاں کر رہا ہوں۔ + +میں algorithm، سیکشنز، thresholds وغیرہ کو اپڈیٹ کرنے کا حق بھی محفوظ رکھتا ہوں (احتیاطاً 🤷)۔ diff --git a/docs/ur/docs/features.md b/docs/ur/docs/features.md new file mode 100644 index 000000000..879c374a1 --- /dev/null +++ b/docs/ur/docs/features.md @@ -0,0 +1,201 @@ +# خصوصیات { #features } + +## FastAPI کی خصوصیات { #fastapi-features } + +**FastAPI** آپ کو درج ذیل فراہم کرتا ہے: + +### کھلے معیارات پر مبنی { #based-on-open-standards } + +* API بنانے کے لیے [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification)، جس میں path operations، parameters، request bodies، security وغیرہ کے اعلانات شامل ہیں۔ +* [**JSON Schema**](https://json-schema.org/) کے ساتھ خودکار data model دستاویزات (کیونکہ OpenAPI خود JSON Schema پر مبنی ہے)۔ +* ان معیارات کے گرد ڈیزائن کیا گیا، بغور مطالعے کے بعد۔ بعد میں شامل کی گئی تہہ کے بجائے۔ +* یہ کئی زبانوں میں خودکار **client code generation** کا استعمال بھی ممکن بناتا ہے۔ + +### خودکار دستاویزات { #automatic-docs } + +تعاملی API دستاویزات اور ایکسپلوریشن ویب یوزر انٹرفیسز۔ چونکہ framework OpenAPI پر مبنی ہے، اس لیے کئی اختیارات موجود ہیں، جن میں سے 2 بطور ڈیفالٹ شامل ہیں۔ + +* [**Swagger UI**](https://github.com/swagger-api/swagger-ui)، تعاملی ایکسپلوریشن کے ساتھ، براؤزر سے براہ راست اپنی API کو کال اور ٹیسٹ کریں۔ + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) + +* [**ReDoc**](https://github.com/Rebilly/ReDoc) کے ساتھ متبادل API دستاویزات۔ + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) + +### صرف جدید Python { #just-modern-python } + +یہ سب معیاری **Python type** اعلانات پر مبنی ہے (Pydantic کی بدولت)۔ کوئی نئی syntax سیکھنے کی ضرورت نہیں۔ بس معیاری جدید Python۔ + +اگر آپ کو Python types استعمال کرنے کا 2 منٹ کا جائزہ چاہیے (چاہے آپ FastAPI استعمال نہ کریں)، تو مختصر tutorial دیکھیں: [Python Types](python-types.md)۔ + +آپ types کے ساتھ معیاری Python لکھتے ہیں: + +```Python +from datetime import date + +from pydantic import BaseModel + +# Declare a variable as a str +# and get editor support inside the function +def main(user_id: str): + return user_id + + +# A Pydantic model +class User(BaseModel): + id: int + name: str + joined: date +``` + +جسے پھر اس طرح استعمال کیا جا سکتا ہے: + +```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` کا مطلب ہے: + +`second_user_data` dict کی keys اور values کو براہ راست key-value arguments کے طور پر پاس کریں، جو اس کے برابر ہے: `User(id=4, name="Mary", joined="2018-11-30")` + +/// + +### ایڈیٹر سپورٹ { #editor-support } + +پورا framework آسان اور بدیہی استعمال کے لیے ڈیزائن کیا گیا ہے، تمام فیصلے ترقی شروع کرنے سے پہلے ہی متعدد ایڈیٹرز پر آزمائے گئے تھے، تاکہ بہترین ترقیاتی تجربہ یقینی بنایا جا سکے۔ + +Python ڈویلپر سروے میں، یہ واضح ہے [کہ سب سے زیادہ استعمال ہونے والی خصوصیات میں سے ایک "autocompletion" ہے](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features)۔ + +پورا **FastAPI** framework اسی کو پورا کرنے کے لیے بنایا گیا ہے۔ Autocompletion ہر جگہ کام کرتی ہے۔ + +آپ کو شاذ و نادر ہی دستاویزات کی طرف واپس آنا پڑے گا۔ + +یہاں آپ کا ایڈیٹر آپ کی مدد کیسے کر سکتا ہے: + +* [Visual Studio Code](https://code.visualstudio.com/) میں: + +![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) + +* [PyCharm](https://www.jetbrains.com/pycharm/) میں: + +![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png) + +آپ کو ایسے code میں بھی completion ملے گی جو آپ پہلے ناممکن سمجھتے تھے۔ مثال کے طور پر، request سے آنے والے JSON body (جو nested ہو سکتا تھا) کے اندر `price` key۔ + +غلط key نام ٹائپ کرنا، دستاویزات میں آگے پیچھے جانا، یا اوپر نیچے سکرول کرنا کہ آخرکار آپ نے `username` استعمال کیا یا `user_name`، اب ایسا نہیں ہوگا۔ + +### مختصر { #short } + +ہر چیز کے لیے سمجھدار **defaults** ہیں، ہر جگہ اختیاری ترتیبات کے ساتھ۔ تمام parameters کو آپ کی ضرورت کے مطابق ایڈجسٹ کیا جا سکتا ہے اور آپ جو API چاہیں اس کی تعریف کر سکتے ہیں۔ + +لیکن بطور ڈیفالٹ، سب کچھ **"بس کام کرتا ہے"**۔ + +### توثیق { #validation } + +* زیادہ تر (یا تمام؟) Python **data types** کے لیے توثیق، بشمول: + * JSON objects (`dict`)۔ + * JSON array (`list`) آئٹم types کی تعریف کے ساتھ۔ + * String (`str`) فیلڈز، کم از کم اور زیادہ سے زیادہ طوالت کی تعریف کے ساتھ۔ + * Numbers (`int`, `float`) کم از کم اور زیادہ سے زیادہ اقدار کے ساتھ، وغیرہ۔ + +* مزید غیر معمولی types کے لیے توثیق، جیسے: + * URL۔ + * Email۔ + * UUID۔ + * ...اور دیگر۔ + +تمام توثیق معروف اور مضبوط **Pydantic** کے ذریعے ہینڈل ہوتی ہے۔ + +### سیکیورٹی اور تصدیق { #security-and-authentication } + +سیکیورٹی اور تصدیق مربوط ہے۔ ڈیٹابیسز یا data models کے ساتھ کسی سمجھوتے کے بغیر۔ + +OpenAPI میں بیان کردہ تمام security schemes، بشمول: + +* HTTP Basic۔ +* **OAuth2** (بشمول **JWT tokens**)۔ [OAuth2 with JWT](tutorial/security/oauth2-jwt.md) کا tutorial دیکھیں۔ +* API keys بذریعہ: + * Headers۔ + * Query parameters۔ + * Cookies، وغیرہ۔ + +نیز Starlette کی تمام security خصوصیات (بشمول **session cookies**)۔ + +سب کچھ دوبارہ قابل استعمال ٹولز اور اجزاء کے طور پر بنایا گیا ہے جو آپ کے سسٹمز، data stores، relational اور NoSQL ڈیٹابیسز وغیرہ کے ساتھ آسانی سے مربوط ہو سکتے ہیں۔ + +### Dependency Injection { #dependency-injection } + +FastAPI میں انتہائی آسان لیکن انتہائی طاقتور Dependency Injection سسٹم شامل ہے۔ + +* Dependencies کی بھی dependencies ہو سکتی ہیں، جو ایک درجہ بندی یا **dependencies کا "graph"** بناتی ہیں۔ +* سب کچھ framework کے ذریعے **خودکار طور پر ہینڈل** ہوتا ہے۔ +* تمام dependencies requests سے ڈیٹا مانگ سکتی ہیں اور **path operation** کی حدود اور خودکار دستاویزات کو **بہتر** بنا سکتی ہیں۔ +* dependencies میں بیان کردہ *path operation* parameters کے لیے بھی **خودکار توثیق**۔ +* پیچیدہ user authentication سسٹمز، **database connections** وغیرہ کی سپورٹ۔ +* ڈیٹابیسز، frontends وغیرہ کے ساتھ **کوئی سمجھوتا نہیں**۔ لیکن ان سب کے ساتھ آسان انضمام۔ + +### لامحدود "plug-ins" { #unlimited-plug-ins } + +یا دوسرے لفظوں میں، ان کی کوئی ضرورت نہیں، جو code چاہیے import کریں اور استعمال کریں۔ + +کوئی بھی انضمام اتنا سادہ بنایا گیا ہے (dependencies کے ساتھ) کہ آپ اپنی ایپلیکیشن کے لیے 2 لائنوں کے code میں ایک "plug-in" بنا سکتے ہیں، وہی ساخت اور syntax استعمال کرتے ہوئے جو آپ کی *path operations* کے لیے استعمال ہوتی ہے۔ + +### آزمایا ہوا { #tested } + +* 100% test coverage۔ +* 100% type annotated code base۔ +* پروڈکشن ایپلیکیشنز میں استعمال ہو رہا ہے۔ + +## Starlette کی خصوصیات { #starlette-features } + +**FastAPI** مکمل طور پر [**Starlette**](https://www.starlette.dev/) کے ساتھ ہم آہنگ (اور اس پر مبنی) ہے۔ لہٰذا، آپ کا کوئی بھی اضافی Starlette code بھی کام کرے گا۔ + +`FastAPI` دراصل `Starlette` کی ایک sub-class ہے۔ لہٰذا، اگر آپ پہلے سے Starlette جانتے ہیں یا استعمال کرتے ہیں، تو زیادہ تر فعالیت اسی طرح کام کرے گی۔ + +**FastAPI** کے ساتھ آپ کو **Starlette** کی تمام خصوصیات ملتی ہیں (کیونکہ FastAPI بنیادی طور پر Starlette کا بہتر ورژن ہے): + +* سنجیدگی سے متاثر کن کارکردگی۔ یہ [دستیاب تیز ترین Python frameworks میں سے ایک ہے، **NodeJS** اور **Go** کے برابر](https://github.com/encode/starlette#performance)۔ +* **WebSocket** سپورٹ۔ +* In-process background tasks۔ +* Startup اور shutdown events۔ +* HTTPX پر مبنی test client۔ +* **CORS**، GZip، Static Files، Streaming responses۔ +* **Session اور Cookie** سپورٹ۔ +* 100% test coverage۔ +* 100% type annotated codebase۔ + +## Pydantic کی خصوصیات { #pydantic-features } + +**FastAPI** مکمل طور پر [**Pydantic**](https://docs.pydantic.dev/) کے ساتھ ہم آہنگ (اور اس پر مبنی) ہے۔ لہٰذا، آپ کا کوئی بھی اضافی Pydantic code بھی کام کرے گا۔ + +بشمول Pydantic پر مبنی بیرونی لائبریریاں، جیسے ڈیٹابیسز کے لیے ORMODMs۔ + +اس کا مطلب یہ بھی ہے کہ بہت سے معاملات میں آپ request سے ملنے والی وہی object **براہ راست ڈیٹابیس کو** بھیج سکتے ہیں، کیونکہ ہر چیز خودکار طور پر توثیق شدہ ہوتی ہے۔ + +یہی بات دوسری طرف بھی لاگو ہوتی ہے، بہت سے معاملات میں آپ ڈیٹابیس سے ملنے والی object **براہ راست client کو** بھیج سکتے ہیں۔ + +**FastAPI** کے ساتھ آپ کو **Pydantic** کی تمام خصوصیات ملتی ہیں (کیونکہ FastAPI تمام data handling کے لیے Pydantic پر مبنی ہے): + +* **کوئی الجھن نہیں**: + * سیکھنے کے لیے کوئی نئی schema definition مائیکرو زبان نہیں۔ + * اگر آپ Python types جانتے ہیں تو آپ Pydantic استعمال کرنا جانتے ہیں۔ +* آپ کے **IDE/linter/دماغ** کے ساتھ اچھی طرح کام کرتا ہے: + * کیونکہ pydantic data structures صرف آپ کی بیان کردہ classes کی instances ہیں؛ auto-completion، linting، mypy اور آپ کی بصیرت سب آپ کے توثیق شدہ ڈیٹا کے ساتھ صحیح طریقے سے کام کریں گے۔ +* **پیچیدہ ساختوں** کی توثیق کریں: + * درجہ بند Pydantic models، Python `typing` کی `List` اور `Dict` وغیرہ کا استعمال۔ + * اور validators پیچیدہ data schemas کو واضح اور آسانی سے بیان، جانچ اور JSON Schema کے طور پر دستاویز کرنے کی اجازت دیتے ہیں۔ + * آپ کے پاس گہرائی سے **nested JSON** objects ہو سکتے ہیں اور ان سب کی توثیق اور تشریح ہو سکتی ہے۔ +* **قابل توسیع**: + * Pydantic حسب ضرورت data types بیان کرنے کی اجازت دیتا ہے یا آپ validator decorator سے مزین model پر methods کے ساتھ توثیق بڑھا سکتے ہیں۔ +* 100% test coverage۔ diff --git a/docs/ur/docs/help-fastapi.md b/docs/ur/docs/help-fastapi.md new file mode 100644 index 000000000..d32b9a60c --- /dev/null +++ b/docs/ur/docs/help-fastapi.md @@ -0,0 +1,256 @@ +# FastAPI کی مدد کریں - مدد حاصل کریں { #help-fastapi-get-help } + +کیا آپ **FastAPI** پسند کرتے ہیں؟ + +کیا آپ FastAPI، دوسرے صارفین، اور مصنف کی مدد کرنا چاہیں گے؟ + +یا کیا آپ **FastAPI** کے ساتھ مدد حاصل کرنا چاہیں گے؟ + +مدد کرنے کے بہت آسان طریقے ہیں (کئی میں صرف ایک یا دو کلکس شامل ہیں)۔ + +اور مدد حاصل کرنے کے بھی کئی طریقے ہیں۔ + +## Newsletter سبسکرائب کریں { #subscribe-to-the-newsletter } + +آپ (کبھی کبھار آنے والے) [**FastAPI and friends** newsletter](newsletter.md) کو سبسکرائب کر سکتے ہیں تاکہ ان چیزوں سے باخبر رہیں: + +* FastAPI اور دوستوں کے بارے میں خبریں 🚀 +* گائیڈز 📝 +* Features ✨ +* Breaking changes 🚨 +* مشورے اور ٹرکس ✅ + +## X (Twitter) پر FastAPI کو follow کریں { #follow-fastapi-on-x-twitter } + +[**X (Twitter)** پر @fastapi کو follow کریں](https://x.com/fastapi) تاکہ **FastAPI** کے بارے میں تازہ ترین خبریں حاصل کریں۔ 🐦 + +## GitHub پر **FastAPI** کو Star دیں { #star-fastapi-in-github } + +آپ GitHub پر FastAPI کو "star" دے سکتے ہیں (اوپر دائیں جانب star بٹن پر کلک کرکے): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi)۔ ⭐️ + +Star دینے سے، دوسرے صارفین اسے آسانی سے تلاش کر سکیں گے اور دیکھ سکیں گے کہ یہ پہلے سے دوسروں کے لیے مفید رہا ہے۔ + +## GitHub repository کو releases کے لیے watch کریں { #watch-the-github-repository-for-releases } + +آپ GitHub پر FastAPI کو "watch" کر سکتے ہیں (اوپر دائیں جانب "watch" بٹن پر کلک کرکے): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi)۔ 👀 + +وہاں آپ "Releases only" منتخب کر سکتے ہیں۔ + +ایسا کرنے سے، جب بھی **FastAPI** کی نئی release (نیا ورژن) آئے گی bug fixes اور نئی features کے ساتھ، آپ کو (اپنی email میں) notifications ملیں گی۔ + +## مصنف سے جڑیں { #connect-with-the-author } + +آپ [مجھ سے (Sebastián Ramírez / `tiangolo`)](https://tiangolo.com)، مصنف، سے رابطہ کر سکتے ہیں۔ + +آپ یہ کر سکتے ہیں: + +* [**GitHub** پر مجھے follow کریں](https://github.com/tiangolo)۔ + * میرے بنائے ہوئے دوسرے Open Source projects دیکھیں جو آپ کی مدد کر سکتے ہیں۔ + * مجھے follow کریں تاکہ جب میں نیا Open Source project بناؤں تو آپ کو معلوم ہو۔ +* [**X (Twitter)** پر مجھے follow کریں](https://x.com/tiangolo) یا [Mastodon](https://fosstodon.org/@tiangolo) پر۔ + * مجھے بتائیں کہ آپ FastAPI کیسے استعمال کرتے ہیں (مجھے یہ سن کر خوشی ہوتی ہے)۔ + * جب میں اعلانات کروں یا نئے tools جاری کروں تو سنیں۔ + * آپ [X (Twitter) پر @fastapi کو بھی follow](https://x.com/fastapi) کر سکتے ہیں (ایک الگ اکاؤنٹ)۔ +* [**LinkedIn** پر مجھے follow کریں](https://www.linkedin.com/in/tiangolo/)۔ + * جب میں اعلانات کروں یا نئے tools جاری کروں تو سنیں (حالانکہ میں X (Twitter) زیادہ استعمال کرتا ہوں 🤷‍♂)۔ +* [**Dev.to**](https://dev.to/tiangolo) یا [**Medium**](https://medium.com/@tiangolo) پر میری تحریریں پڑھیں (یا مجھے follow کریں)۔ + * دوسرے آئیڈیاز، مضامین پڑھیں، اور میرے بنائے ہوئے tools کے بارے میں پڑھیں۔ + * مجھے follow کریں تاکہ جب میں کچھ نیا شائع کروں تو پڑھ سکیں۔ + +## **FastAPI** کے بارے میں Tweet کریں { #tweet-about-fastapi } + +[**FastAPI** کے بارے میں Tweet کریں](https://x.com/compose/tweet?text=I'm loving @fastapi because... https://github.com/fastapi/fastapi) اور مجھے اور دوسروں کو بتائیں کہ آپ اسے کیوں پسند کرتے ہیں۔ 🎉 + +مجھے یہ سننا پسند ہے کہ **FastAPI** کیسے استعمال ہو رہا ہے، آپ نے اس میں کیا پسند کیا ہے، کس project/company میں آپ اسے استعمال کر رہے ہیں، وغیرہ۔ + +## FastAPI کے لیے ووٹ دیں { #vote-for-fastapi } + +* [Slant پر **FastAPI** کے لیے ووٹ دیں](https://www.slant.co/options/34241/~fastapi-review)۔ +* [AlternativeTo پر **FastAPI** کے لیے ووٹ دیں](https://alternativeto.net/software/fastapi/about/)۔ +* [StackShare پر کہیں کہ آپ **FastAPI** استعمال کرتے ہیں](https://stackshare.io/pypi-fastapi)۔ + +## GitHub میں سوالات کے ساتھ دوسروں کی مدد کریں { #help-others-with-questions-in-github } + +آپ دوسروں کے سوالات میں مدد کرنے کی کوشش کر سکتے ہیں: + +* [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/categories/questions?discussions_q=category%3AQuestions+is%3Aunanswered) +* [GitHub Issues](https://github.com/fastapi/fastapi/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Aquestion+-label%3Aanswered+) + +بہت سے معاملات میں آپ شاید پہلے سے ان سوالات کا جواب جانتے ہوں۔ 🤓 + +اگر آپ بہت سے لوگوں کے سوالات میں مدد کر رہے ہیں، تو آپ ایک سرکاری [FastAPI Expert](fastapi-people.md#fastapi-experts) بن جائیں گے۔ 🎉 + +بس یاد رکھیں، سب سے اہم بات یہ ہے: مہربان ہونے کی کوشش کریں۔ لوگ اپنی پریشانیوں کے ساتھ آتے ہیں اور بہت سے معاملات میں بہترین طریقے سے نہیں پوچھتے، لیکن پوری کوشش کریں کہ مہربان رہیں۔ 🤗 + +**FastAPI** کمیونٹی کا مقصد مہربان اور خوش آمدید ہونا ہے۔ ساتھ ہی، دوسروں کے ساتھ غنڈہ گردی یا بے ادبی برداشت نہ کریں۔ ہمیں ایک دوسرے کا خیال رکھنا ہے۔ + +--- + +یہاں دوسروں کے سوالات میں مدد کرنے کا طریقہ ہے (discussions یا issues میں): + +### سوال سمجھیں { #understand-the-question } + +* چیک کریں کہ کیا آپ سمجھ سکتے ہیں کہ پوچھنے والے شخص کا **مقصد** اور use case کیا ہے۔ + +* پھر چیک کریں کہ کیا سوال (اکثریت سوالات ہوتے ہیں) **واضح** ہے۔ + +* بہت سے معاملات میں پوچھا گیا سوال صارف کے تصور کردہ حل کے بارے میں ہوتا ہے، لیکن اس کا **بہتر** حل ہو سکتا ہے۔ اگر آپ مسئلہ اور use case بہتر سمجھ سکیں، تو آپ بہتر **متبادل حل** تجویز کر سکتے ہیں۔ + +* اگر آپ سوال نہیں سمجھ سکتے، تو مزید **تفصیلات** مانگیں۔ + +### مسئلے کو دوبارہ پیدا کریں { #reproduce-the-problem } + +زیادہ تر معاملات اور سوالات میں شخص کے **اصل code** سے متعلق کوئی بات ہوتی ہے۔ + +بہت سے معاملات میں وہ صرف code کا ایک ٹکڑا کاپی کریں گے، لیکن **مسئلہ دوبارہ پیدا** کرنے کے لیے یہ کافی نہیں ہوتا۔ + +* آپ ان سے [کم سے کم، دوبارہ پیدا کرنے والی مثال](https://stackoverflow.com/help/minimal-reproducible-example) فراہم کرنے کو کہہ سکتے ہیں، جسے آپ **copy-paste** کرکے مقامی طور پر چلا سکیں تاکہ وہی error یا رویہ دیکھ سکیں جو وہ دیکھ رہے ہیں، یا ان کا use case بہتر سمجھ سکیں۔ + +* اگر آپ بہت سخی محسوس کر رہے ہیں، تو آپ مسئلے کی تفصیل کی بنیاد پر خود ایسی **مثال بنانے** کی کوشش کر سکتے ہیں۔ بس یاد رکھیں کہ اس میں بہت وقت لگ سکتا ہے اور بہتر ہو سکتا ہے کہ پہلے انہیں مسئلہ واضح کرنے کو کہیں۔ + +### حل تجویز کریں { #suggest-solutions } + +* سوال سمجھنے کے بعد، آپ انہیں ممکنہ **جواب** دے سکتے ہیں۔ + +* بہت سے معاملات میں، ان کے **بنیادی مسئلے یا use case** کو سمجھنا بہتر ہے، کیونکہ اسے حل کرنے کا ان کی کوشش سے بہتر طریقہ ہو سکتا ہے۔ + +### بند کرنے کو کہیں { #ask-to-close } + +اگر وہ جواب دیں، تو اچھا امکان ہے کہ آپ نے ان کا مسئلہ حل کر دیا ہے، مبارک ہو، **آپ ہیرو ہیں**! 🦸 + +* اب، اگر اس سے ان کا مسئلہ حل ہو گیا، تو آپ ان سے کہہ سکتے ہیں: + + * GitHub Discussions میں: تبصرے کو **جواب** کے طور پر نشان زد کریں۔ + * GitHub Issues میں: issue **بند** کریں۔ + +## GitHub repository کو Watch کریں { #watch-the-github-repository } + +آپ GitHub پر FastAPI کو "watch" کر سکتے ہیں (اوپر دائیں جانب "watch" بٹن پر کلک کرکے): [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi)۔ 👀 + +اگر آپ "Releases only" کی بجائے "Watching" منتخب کرتے ہیں تو جب کوئی نیا issue یا سوال بنائے تو آپ کو notifications ملیں گی۔ آپ یہ بھی بتا سکتے ہیں کہ آپ صرف نئے issues، یا discussions، یا PRs وغیرہ کے بارے میں مطلع ہونا چاہتے ہیں۔ + +پھر آپ ان سوالات کو حل کرنے میں مدد کرنے کی کوشش کر سکتے ہیں۔ + +## سوالات پوچھیں { #ask-questions } + +آپ GitHub repository میں [نیا سوال بنا سکتے ہیں](https://github.com/fastapi/fastapi/discussions/new?category=questions)، مثال کے طور پر: + +* کوئی **سوال** پوچھنے یا **مسئلے** کے بارے میں پوچھنے کے لیے۔ +* نئی **feature** تجویز کرنے کے لیے۔ + +**نوٹ**: اگر آپ ایسا کریں، تو میں آپ سے یہ بھی کہوں گا کہ دوسروں کی بھی مدد کریں۔ 😉 + +## Pull Requests کا Review کریں { #review-pull-requests } + +آپ دوسروں کی pull requests کا review کرنے میں میری مدد کر سکتے ہیں۔ + +دوبارہ، براہ کرم مہربان ہونے کی پوری کوشش کریں۔ 🤗 + +--- + +Pull request کا review کرتے وقت ان باتوں کا خیال رکھیں: + +### مسئلہ سمجھیں { #understand-the-problem } + +* پہلے، یقینی بنائیں کہ آپ وہ **مسئلہ سمجھتے ہیں** جسے pull request حل کرنے کی کوشش کر رہا ہے۔ اس پر GitHub Discussion یا issue میں طویل بحث ہو سکتی ہے۔ + +* اس بات کا بھی اچھا امکان ہے کہ pull request دراصل ضروری نہ ہو کیونکہ مسئلہ **مختلف طریقے** سے حل ہو سکتا ہے۔ پھر آپ اس کے بارے میں تجویز یا سوال کر سکتے ہیں۔ + +### اسلوب کی فکر نہ کریں { #dont-worry-about-style } + +* Commit message styles جیسی چیزوں کی زیادہ فکر نہ کریں، میں squash اور merge کروں گا commit کو دستی طور پر customize کرتے ہوئے۔ + +* اسلوب کے قوانین کی بھی فکر نہ کریں، اسے چیک کرنے والے خودکار tools پہلے سے موجود ہیں۔ + +اور اگر کوئی اور اسلوب یا مطابقت کی ضرورت ہو، تو میں براہ راست مانگوں گا، یا ضروری تبدیلیوں کے ساتھ اوپر commits شامل کروں گا۔ + +### Code چیک کریں { #check-the-code } + +* Code چیک کریں اور پڑھیں، دیکھیں کہ کیا یہ سمجھ آتا ہے، **مقامی طور پر چلائیں** اور دیکھیں کہ کیا یہ واقعی مسئلہ حل کرتا ہے۔ + +* پھر **تبصرہ** کریں کہ آپ نے ایسا کیا، اس طرح مجھے معلوم ہوگا کہ آپ نے واقعی چیک کیا ہے۔ + +/// info | معلومات + +بدقسمتی سے، میں صرف ان PRs پر بھروسہ نہیں کر سکتا جن میں صرف کئی approvals ہوں۔ + +کئی بار ایسا ہوا ہے کہ 3، 5 یا زیادہ approvals والے PRs ہوتے ہیں، شاید اس لیے کہ تفصیل دلکش ہوتی ہے، لیکن جب میں PRs چیک کرتا ہوں تو وہ دراصل ٹوٹے ہوئے ہوتے ہیں، ان میں bug ہوتا ہے، یا وہ اس مسئلے کو حل نہیں کرتے جس کا دعویٰ کرتے ہیں۔ 😅 + +تو واقعی یہ اہم ہے کہ آپ دراصل code پڑھیں اور چلائیں، اور تبصروں میں بتائیں کہ آپ نے ایسا کیا۔ 🤓 + +/// + +* اگر PR کو آسان بنایا جا سکے، تو آپ اس کے لیے کہہ سکتے ہیں، لیکن زیادہ باریک بین ہونے کی ضرورت نہیں، بہت سے ذاتی نقطہ نظر ہو سکتے ہیں (اور میرا اپنا بھی ہوگا 🙈)، تو بنیادی چیزوں پر توجہ مرکوز کرنا بہتر ہے۔ + +### Tests { #tests } + +* مجھے چیک کرنے میں مدد کریں کہ PR میں **tests** ہیں۔ + +* چیک کریں کہ PR سے **پہلے** tests **fail** ہوتے ہیں۔ 🚨 + +* پھر چیک کریں کہ PR کے **بعد** tests **pass** ہوتے ہیں۔ ✅ + +* بہت سے PRs میں tests نہیں ہوتے، آپ انہیں tests شامل کرنے کی **یاد دہانی** کرا سکتے ہیں، یا خود کچھ tests **تجویز** بھی کر سکتے ہیں۔ یہ ان چیزوں میں سے ایک ہے جو سب سے زیادہ وقت لیتی ہے اور آپ اس میں بہت مدد کر سکتے ہیں۔ + +* پھر تبصرہ کریں کہ آپ نے کیا ٹیسٹ کیا، اس طرح مجھے معلوم ہوگا کہ آپ نے چیک کیا۔ 🤓 + +## Pull Request بنائیں { #create-a-pull-request } + +آپ Pull Requests کے ذریعے source code میں [تعاون](contributing.md) کر سکتے ہیں، مثال کے طور پر: + +* documentation میں ملنے والی غلطی درست کرنے کے لیے۔ +* اپنا بنایا یا پایا ہوا FastAPI سے متعلق مضمون، ویڈیو، یا podcast شیئر کرنے کے لیے [اس فائل میں ترمیم کرکے](https://github.com/fastapi/fastapi/edit/master/docs/en/data/external_links.yml)۔ + * یقینی بنائیں کہ آپ اپنا link متعلقہ سیکشن کے شروع میں شامل کریں۔ +* اپنی زبان میں [documentation کا ترجمہ](contributing.md#translations) کرنے میں مدد کے لیے۔ + * آپ دوسروں کے بنائے ہوئے تراجم کا review کرنے میں بھی مدد کر سکتے ہیں۔ +* Documentation کے نئے سیکشنز تجویز کرنے کے لیے۔ +* کسی موجودہ issue/bug کو ٹھیک کرنے کے لیے۔ + * Tests شامل کرنا یقینی بنائیں۔ +* نئی feature شامل کرنے کے لیے۔ + * Tests شامل کرنا یقینی بنائیں۔ + * اگر متعلقہ ہو تو documentation شامل کرنا یقینی بنائیں۔ + +## FastAPI کو برقرار رکھنے میں مدد کریں { #help-maintain-fastapi } + +**FastAPI** کو برقرار رکھنے میں میری مدد کریں! 🤓 + +بہت سارا کام ہے، اور اس میں سے زیادہ تر **آپ** کر سکتے ہیں۔ + +بنیادی کام جو آپ ابھی کر سکتے ہیں: + +* [GitHub میں سوالات کے ساتھ دوسروں کی مدد کریں](#help-others-with-questions-in-github) (اوپر سیکشن دیکھیں)۔ +* [Pull Requests کا Review کریں](#review-pull-requests) (اوپر سیکشن دیکھیں)۔ + +یہ دو کام وہ ہیں جو **سب سے زیادہ وقت لیتے ہیں**۔ یہ FastAPI کو برقرار رکھنے کا بنیادی کام ہے۔ + +اگر آپ اس میں میری مدد کر سکتے ہیں، تو **آپ FastAPI کو برقرار رکھنے میں میری مدد کر رہے ہیں** اور یقینی بنا رہے ہیں کہ یہ **تیزی سے اور بہتر طریقے سے آگے بڑھتا رہے**۔ 🚀 + +## چیٹ میں شامل ہوں { #join-the-chat } + +👥 [Discord چیٹ server](https://discord.gg/VQjSZaeJmf) 👥 میں شامل ہوں اور FastAPI کمیونٹی میں دوسروں کے ساتھ بات چیت کریں۔ + +/// tip | مشورہ + +سوالات کے لیے، انہیں [GitHub Discussions](https://github.com/fastapi/fastapi/discussions/new?category=questions) میں پوچھیں، وہاں [FastAPI Experts](fastapi-people.md#fastapi-experts) سے مدد ملنے کا بہت بہتر امکان ہے۔ + +چیٹ صرف دوسری عمومی بات چیت کے لیے استعمال کریں۔ + +/// + +### سوالات کے لیے چیٹ استعمال نہ کریں { #dont-use-the-chat-for-questions } + +یاد رکھیں کہ چونکہ چیٹ زیادہ "آزاد بات چیت" کی اجازت دیتا ہے، بہت عمومی سوالات پوچھنا آسان ہے جن کا جواب دینا مشکل ہوتا ہے، تو آپ کو جوابات نہ ملیں۔ + +GitHub میں، template آپ کو صحیح سوال لکھنے میں رہنمائی کرے گا تاکہ آپ آسانی سے اچھا جواب حاصل کر سکیں، یا پوچھنے سے پہلے ہی مسئلہ خود حل کر لیں۔ اور GitHub میں، میں یقینی بنا سکتا ہوں کہ میں ہمیشہ سب کا جواب دوں، چاہے کچھ وقت لگے۔ میں چیٹ systems کے ساتھ ذاتی طور پر ایسا نہیں کر سکتا۔ 😅 + +چیٹ systems میں بات چیت GitHub کی طرح آسانی سے تلاش کے قابل بھی نہیں ہوتی، تو سوالات اور جوابات بات چیت میں گم ہو سکتے ہیں۔ اور صرف GitHub والے [FastAPI Expert](fastapi-people.md#fastapi-experts) بننے میں شمار ہوتے ہیں، تو آپ کو GitHub میں زیادہ توجہ ملے گی۔ + +دوسری طرف، چیٹ systems میں ہزاروں صارفین ہیں، تو اس بات کا اچھا امکان ہے کہ آپ کو تقریباً ہر وقت وہاں کوئی بات کرنے والا مل جائے۔ 😄 + +## مصنف کی سرپرستی کریں { #sponsor-the-author } + +اگر آپ کا **product/company** **FastAPI** پر منحصر ہے یا اس سے متعلق ہے اور آپ اس کے صارفین تک پہنچنا چاہتے ہیں، تو آپ [GitHub sponsors](https://github.com/sponsors/tiangolo) کے ذریعے مصنف (مجھے) کی سرپرستی کر سکتے ہیں۔ tier کے لحاظ سے، آپ کو کچھ اضافی فوائد مل سکتے ہیں، جیسے docs میں badge۔ 🎁 + +--- + +شکریہ! 🚀 diff --git a/docs/ur/docs/history-design-future.md b/docs/ur/docs/history-design-future.md new file mode 100644 index 000000000..c8b0243ab --- /dev/null +++ b/docs/ur/docs/history-design-future.md @@ -0,0 +1,79 @@ +# تاریخ، ڈیزائن اور مستقبل { #history-design-and-future } + +کچھ عرصہ پہلے، [ایک **FastAPI** صارف نے پوچھا](https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920): + +> اس project کی تاریخ کیا ہے؟ ایسا لگتا ہے جیسے یہ چند ہفتوں میں کہیں سے نکل کر شاندار ہو گیا [...] + +یہاں اس تاریخ کا تھوڑا سا حصہ ہے۔ + +## متبادل { #alternatives } + +میں کئی سالوں سے پیچیدہ ضروریات کے ساتھ APIs بنا رہا تھا (Machine Learning، distributed systems، asynchronous jobs، NoSQL databases وغیرہ)، developers کی کئی ٹیموں کی قیادت کرتے ہوئے۔ + +اس کے حصے کے طور پر، مجھے بہت سے متبادل کی تحقیق، جانچ اور استعمال کرنے کی ضرورت پڑی۔ + +**FastAPI** کی تاریخ بہت حد تک اس کے پیش رو ٹولز کی تاریخ ہے۔ + +جیسا کہ [متبادل](alternatives.md) کے سیکشن میں کہا گیا ہے: + +
+ +**FastAPI** موجود نہ ہوتا اگر دوسروں کا پچھلا کام نہ ہوتا۔ + +پہلے بہت سے tools بنائے گئے ہیں جنہوں نے اس کی تخلیق کی تحریک دی۔ + +میں کئی سالوں سے نیا framework بنانے سے گریز کرتا رہا۔ پہلے میں نے **FastAPI** کی تمام features کو بہت سے مختلف frameworks، plug-ins، اور tools استعمال کرکے حل کرنے کی کوشش کی۔ + +لیکن کسی وقت، کوئی اور راستہ نہیں تھا سوائے اس کے کہ کچھ ایسا بنایا جائے جو یہ تمام features فراہم کرے، پچھلے tools سے بہترین آئیڈیاز لے کر، اور انہیں بہترین ممکنہ طریقے سے ملا کر، زبان کی ان features کو استعمال کرتے ہوئے جو پہلے دستیاب نہیں تھیں (Python 3.6+ type hints)۔ + +
+ +## تحقیق { #investigation } + +تمام پچھلے متبادل استعمال کرکے مجھے ان سب سے سیکھنے، آئیڈیاز لینے، اور انہیں بہترین طریقے سے ملانے کا موقع ملا جو میں اپنے اور اپنی ٹیموں کے لیے ڈھونڈ سکتا تھا۔ + +مثال کے طور پر، یہ واضح تھا کہ مثالی طور پر اسے standard Python type hints پر مبنی ہونا چاہیے۔ + +نیز، بہترین طریقہ یہ تھا کہ پہلے سے موجود standards استعمال کیے جائیں۔ + +تو **FastAPI** کو code کرنا شروع کرنے سے پہلے بھی، میں نے کئی مہینے OpenAPI، JSON Schema، OAuth2 وغیرہ کی specifications کا مطالعہ کرنے میں صرف کیے۔ ان کے تعلق، اوورلیپ، اور فرق کو سمجھتے ہوئے۔ + +## ڈیزائن { #design } + +پھر میں نے کچھ وقت developer "API" کو ڈیزائن کرنے میں لگایا جو میں ایک صارف (FastAPI استعمال کرنے والے developer) کے طور پر چاہتا تھا۔ + +میں نے سب سے مقبول Python editors میں کئی آئیڈیاز ٹیسٹ کیے: PyCharm، VS Code، Jedi پر مبنی editors۔ + +آخری [Python Developer Survey](https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools) کے مطابق، جو تقریباً 80% صارفین کا احاطہ کرتا ہے۔ + +اس کا مطلب ہے کہ **FastAPI** خاص طور پر 80% Python developers کے استعمال کردہ editors کے ساتھ ٹیسٹ کیا گیا۔ اور چونکہ زیادہ تر دوسرے editors ملتے جلتے کام کرتے ہیں، اس کے تمام فوائد عملی طور پر تمام editors کے لیے کام کریں گے۔ + +اس طرح مجھے code duplication کو زیادہ سے زیادہ کم کرنے، ہر جگہ completion حاصل کرنے، type اور error checks وغیرہ کے بہترین طریقے مل سکے۔ + +یہ سب اس طرح جو تمام developers کو بہترین development experience فراہم کرے۔ + +## ضروریات { #requirements } + +کئی متبادل ٹیسٹ کرنے کے بعد، میں نے فیصلہ کیا کہ میں اس کے فوائد کی وجہ سے [**Pydantic**](https://docs.pydantic.dev/) استعمال کروں گا۔ + +پھر میں نے اس میں تعاون کیا، اسے JSON Schema کے ساتھ مکمل طور پر مطابق بنانے، constraint declarations define کرنے کے مختلف طریقوں کی سہولت دینے، اور کئی editors میں ٹیسٹوں کی بنیاد پر editor support (type checks، autocompletion) بہتر بنانے کے لیے۔ + +development کے دوران، میں نے [**Starlette**](https://www.starlette.dev/) میں بھی تعاون کیا، جو دوسری اہم ضرورت تھی۔ + +## ترقی { #development } + +جب میں نے **FastAPI** خود بنانا شروع کیا، زیادہ تر حصے پہلے سے اپنی جگہ تھے، ڈیزائن مقرر تھا، ضروریات اور tools تیار تھے، اور standards اور specifications کا علم واضح اور تازہ تھا۔ + +## مستقبل { #future } + +اس مقام تک، یہ پہلے سے واضح ہے کہ **FastAPI** اپنے آئیڈیاز کے ساتھ بہت سے لوگوں کے لیے مفید ہے۔ + +بہت سے use cases کے لیے اسے پچھلے متبادل پر ترجیح دی جا رہی ہے۔ + +بہت سے developers اور ٹیمیں پہلے سے اپنے projects کے لیے **FastAPI** پر انحصار کرتی ہیں (بشمول میں اور میری ٹیم)۔ + +لیکن پھر بھی، بہت سی بہتری اور features آنے والی ہیں۔ + +**FastAPI** کا مستقبل بہت روشن ہے۔ + +اور [آپ کی مدد](help-fastapi.md) کی بہت قدر کی جاتی ہے۔ diff --git a/docs/ur/docs/how-to/authentication-error-status-code.md b/docs/ur/docs/how-to/authentication-error-status-code.md new file mode 100644 index 000000000..ec9517fd0 --- /dev/null +++ b/docs/ur/docs/how-to/authentication-error-status-code.md @@ -0,0 +1,17 @@ +# پرانے 403 Authentication Error Status Codes استعمال کریں { #use-old-403-authentication-error-status-codes } + +FastAPI ورژن `0.122.0` سے پہلے، جب integrated security utilities authentication ناکام ہونے پر client کو error واپس کرتی تھیں، تو وہ HTTP status code `403 Forbidden` استعمال کرتی تھیں۔ + +FastAPI ورژن `0.122.0` سے شروع کرتے ہوئے، وہ زیادہ مناسب HTTP status code `401 Unauthorized` استعمال کرتی ہیں، اور HTTP specifications کی پیروی کرتے ہوئے response میں ایک معقول `WWW-Authenticate` header واپس کرتی ہیں، [RFC 7235](https://datatracker.ietf.org/doc/html/rfc7235#section-3.1)، [RFC 9110](https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized)۔ + +لیکن اگر کسی وجہ سے آپ کے clients پرانے رویے پر منحصر ہیں، تو آپ اپنی security classes میں `make_not_authenticated_error` method کو override کر کے واپس پرانے رویے پر جا سکتے ہیں۔ + +مثال کے طور پر، آپ `HTTPBearer` کی ایک subclass بنا سکتے ہیں جو default `401 Unauthorized` error کی بجائے `403 Forbidden` error واپس کرے: + +{* ../../docs_src/authentication_error_status_code/tutorial001_an_py310.py hl[9:13] *} + +/// tip | مشورہ + +نوٹ کریں کہ function exception instance واپس کرتا ہے، اسے raise نہیں کرتا۔ Raise کرنا باقی اندرونی کوڈ میں ہوتا ہے۔ + +/// diff --git a/docs/ur/docs/how-to/conditional-openapi.md b/docs/ur/docs/how-to/conditional-openapi.md new file mode 100644 index 000000000..71fa659b4 --- /dev/null +++ b/docs/ur/docs/how-to/conditional-openapi.md @@ -0,0 +1,56 @@ +# مشروط OpenAPI { #conditional-openapi } + +اگر آپ کو ضرورت ہو، تو آپ settings اور environment variables استعمال کر کے ماحول کے مطابق OpenAPI کو مشروط طور پر ترتیب دے سکتے ہیں، اور یہاں تک کہ اسے مکمل طور پر غیر فعال بھی کر سکتے ہیں۔ + +## سیکیورٹی، APIs، اور docs کے بارے میں { #about-security-apis-and-docs } + +اپنے documentation user interfaces کو production میں چھپانا آپ کی API کو محفوظ کرنے کا *صحیح طریقہ نہیں* ہونا چاہیے۔ + +یہ آپ کی API میں کوئی اضافی سیکیورٹی نہیں جوڑتا، *path operations* اب بھی وہیں دستیاب رہیں گی جہاں وہ ہیں۔ + +اگر آپ کے کوڈ میں کوئی سیکیورٹی خامی ہے، تو وہ پھر بھی موجود رہے گی۔ + +Documentation چھپانا صرف آپ کی API کے ساتھ تعامل کو سمجھنا مشکل بنا دیتا ہے، اور production میں اسے debug کرنا بھی مشکل ہو سکتا ہے۔ اسے سادہ طور پر [Security through obscurity](https://en.wikipedia.org/wiki/Security_through_obscurity) کی ایک شکل سمجھا جا سکتا ہے۔ + +اگر آپ اپنی API کو محفوظ کرنا چاہتے ہیں، تو کئی بہتر چیزیں ہیں جو آپ کر سکتے ہیں، مثال کے طور پر: + +* یقینی بنائیں کہ آپ کے request bodies اور responses کے لیے اچھی طرح سے defined Pydantic models ہیں۔ +* Dependencies استعمال کر کے تمام مطلوبہ permissions اور roles ترتیب دیں۔ +* کبھی بھی سادہ متن میں passwords ذخیرہ نہ کریں، صرف password hashes ذخیرہ کریں۔ +* معروف cryptographic ٹولز استعمال کریں اور لاگو کریں، جیسے pwdlib اور JWT tokens وغیرہ۔ +* جہاں ضرورت ہو OAuth2 scopes کے ساتھ مزید تفصیلی permission controls شامل کریں۔ +* ...وغیرہ۔ + +بہرحال، آپ کا کوئی بہت مخصوص استعمال کا معاملہ ہو سکتا ہے جہاں آپ کو واقعی کسی ماحول (مثلاً production) کے لیے یا environment variables کی ترتیبات کے مطابق API docs کو غیر فعال کرنا ہو۔ + +## Settings اور env vars سے مشروط OpenAPI { #conditional-openapi-from-settings-and-env-vars } + +آپ آسانی سے وہی Pydantic settings استعمال کر سکتے ہیں اپنے تیار کردہ OpenAPI اور docs UIs کو ترتیب دینے کے لیے۔ + +مثال کے طور پر: + +{* ../../docs_src/conditional_openapi/tutorial001_py310.py hl[6,11] *} + +یہاں ہم `openapi_url` setting کو `"/openapi.json"` کی اسی default قدر کے ساتھ declare کرتے ہیں۔ + +اور پھر ہم اسے `FastAPI` app بناتے وقت استعمال کرتے ہیں۔ + +پھر آپ `OPENAPI_URL` environment variable کو خالی string پر سیٹ کر کے OpenAPI (بشمول UI docs) کو غیر فعال کر سکتے ہیں، اس طرح: + +
+ +```console +$ OPENAPI_URL= uvicorn main:app + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +پھر اگر آپ `/openapi.json`، `/docs`، یا `/redoc` کے URLs پر جائیں تو آپ کو صرف `404 Not Found` error ملے گا جیسے: + +```JSON +{ + "detail": "Not Found" +} +``` diff --git a/docs/ur/docs/how-to/configure-swagger-ui.md b/docs/ur/docs/how-to/configure-swagger-ui.md new file mode 100644 index 000000000..3742dd89b --- /dev/null +++ b/docs/ur/docs/how-to/configure-swagger-ui.md @@ -0,0 +1,70 @@ +# Swagger UI کی ترتیب { #configure-swagger-ui } + +آپ کچھ اضافی [Swagger UI parameters](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/) ترتیب دے سکتے ہیں۔ + +انہیں ترتیب دینے کے لیے، `FastAPI()` app object بناتے وقت یا `get_swagger_ui_html()` function میں `swagger_ui_parameters` argument پاس کریں۔ + +`swagger_ui_parameters` ایک dictionary قبول کرتا ہے جس میں ترتیبات براہ راست Swagger UI کو بھیجی جاتی ہیں۔ + +FastAPI ترتیبات کو **JSON** میں تبدیل کرتا ہے تاکہ وہ JavaScript کے ساتھ ہم آہنگ ہوں، کیونکہ Swagger UI کو اسی کی ضرورت ہوتی ہے۔ + +## Syntax Highlighting غیر فعال کریں { #disable-syntax-highlighting } + +مثال کے طور پر، آپ Swagger UI میں syntax highlighting غیر فعال کر سکتے ہیں۔ + +Settings تبدیل کیے بغیر، syntax highlighting بطور default فعال ہوتی ہے: + + + +لیکن آپ `syntaxHighlight` کو `False` سیٹ کر کے اسے غیر فعال کر سکتے ہیں: + +{* ../../docs_src/configure_swagger_ui/tutorial001_py310.py hl[3] *} + +...اور پھر Swagger UI مزید syntax highlighting نہیں دکھائے گا: + + + +## Theme تبدیل کریں { #change-the-theme } + +اسی طرح آپ `"syntaxHighlight.theme"` key کے ساتھ syntax highlighting theme سیٹ کر سکتے ہیں (نوٹ کریں کہ اس میں درمیان میں ایک dot ہے): + +{* ../../docs_src/configure_swagger_ui/tutorial002_py310.py hl[3] *} + +یہ ترتیب syntax highlighting کی رنگ theme تبدیل کرے گی: + + + +## Default Swagger UI Parameters تبدیل کریں { #change-default-swagger-ui-parameters } + +FastAPI میں زیادہ تر استعمال کے معاملات کے لیے کچھ default ترتیبی parameters شامل ہیں۔ + +اس میں یہ default ترتیبات شامل ہیں: + +{* ../../fastapi/openapi/docs.py ln[9:24] hl[18:24] *} + +آپ `swagger_ui_parameters` argument میں مختلف قدر سیٹ کر کے ان میں سے کسی کو بھی override کر سکتے ہیں۔ + +مثال کے طور پر، `deepLinking` کو غیر فعال کرنے کے لیے آپ یہ settings `swagger_ui_parameters` میں پاس کر سکتے ہیں: + +{* ../../docs_src/configure_swagger_ui/tutorial003_py310.py hl[3] *} + +## دیگر Swagger UI Parameters { #other-swagger-ui-parameters } + +تمام ممکنہ ترتیبات دیکھنے کے لیے جو آپ استعمال کر سکتے ہیں، سرکاری [Swagger UI parameters کی دستاویزات](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/) پڑھیں۔ + +## صرف JavaScript والی settings { #javascript-only-settings } + +Swagger UI دیگر ترتیبات کی بھی اجازت دیتا ہے جو **صرف JavaScript** objects ہیں (مثال کے طور پر، JavaScript functions)۔ + +FastAPI میں یہ صرف JavaScript والی `presets` settings بھی شامل ہیں: + +```JavaScript +presets: [ + SwaggerUIBundle.presets.apis, + SwaggerUIBundle.SwaggerUIStandalonePreset +] +``` + +یہ **JavaScript** objects ہیں، strings نہیں، اس لیے آپ انہیں Python کوڈ سے براہ راست پاس نہیں کر سکتے۔ + +اگر آپ کو اس طرح کی صرف JavaScript والی ترتیبات استعمال کرنے کی ضرورت ہے، تو آپ اوپر بیان کردہ طریقوں میں سے کوئی ایک استعمال کر سکتے ہیں۔ تمام Swagger UI *path operation* کو override کریں اور جو بھی JavaScript آپ کو چاہیے دستی طور پر لکھیں۔ diff --git a/docs/ur/docs/how-to/custom-docs-ui-assets.md b/docs/ur/docs/how-to/custom-docs-ui-assets.md new file mode 100644 index 000000000..104c529c0 --- /dev/null +++ b/docs/ur/docs/how-to/custom-docs-ui-assets.md @@ -0,0 +1,185 @@ +# حسب ضرورت Docs UI Static Assets (Self-Hosting) { #custom-docs-ui-static-assets-self-hosting } + +API docs **Swagger UI** اور **ReDoc** استعمال کرتے ہیں، اور ان میں سے ہر ایک کو کچھ JavaScript اور CSS فائلوں کی ضرورت ہوتی ہے۔ + +بطور default، وہ فائلیں ایک CDN سے فراہم کی جاتی ہیں۔ + +لیکن اسے اپنی مرضی کے مطابق بنانا ممکن ہے، آپ کوئی مخصوص CDN سیٹ کر سکتے ہیں، یا فائلیں خود فراہم کر سکتے ہیں۔ + +## JavaScript اور CSS کے لیے حسب ضرورت CDN { #custom-cdn-for-javascript-and-css } + +فرض کریں کہ آپ ایک مختلف CDN استعمال کرنا چاہتے ہیں، مثال کے طور پر آپ `https://unpkg.com/` استعمال کرنا چاہتے ہیں۔ + +یہ مفید ہو سکتا ہے اگر مثلاً آپ کسی ایسے ملک میں رہتے ہیں جو کچھ URLs پر پابندی لگاتا ہے۔ + +### خود کار docs غیر فعال کریں { #disable-the-automatic-docs } + +پہلا مرحلہ خود کار docs کو غیر فعال کرنا ہے، کیونکہ بطور default، وہ default CDN استعمال کرتے ہیں۔ + +انہیں غیر فعال کرنے کے لیے، اپنی `FastAPI` app بناتے وقت ان کے URLs کو `None` پر سیٹ کریں: + +{* ../../docs_src/custom_docs_ui/tutorial001_py310.py hl[8] *} + +### حسب ضرورت docs شامل کریں { #include-the-custom-docs } + +اب آپ حسب ضرورت docs کے لیے *path operations* بنا سکتے ہیں۔ + +آپ docs کے لیے HTML صفحات بنانے کے لیے FastAPI کے اندرونی functions دوبارہ استعمال کر سکتے ہیں، اور انہیں مطلوبہ arguments پاس کر سکتے ہیں: + +* `openapi_url`: وہ URL جہاں سے docs کا HTML صفحہ آپ کی API کا OpenAPI schema حاصل کر سکتا ہے۔ آپ یہاں `app.openapi_url` attribute استعمال کر سکتے ہیں۔ +* `title`: آپ کی API کا عنوان۔ +* `oauth2_redirect_url`: آپ default استعمال کرنے کے لیے یہاں `app.swagger_ui_oauth2_redirect_url` استعمال کر سکتے ہیں۔ +* `swagger_js_url`: وہ URL جہاں سے آپ کے Swagger UI docs کا HTML **JavaScript** فائل حاصل کر سکتا ہے۔ یہ حسب ضرورت CDN URL ہے۔ +* `swagger_css_url`: وہ URL جہاں سے آپ کے Swagger UI docs کا HTML **CSS** فائل حاصل کر سکتا ہے۔ یہ حسب ضرورت CDN URL ہے۔ + +اور اسی طرح ReDoc کے لیے... + +{* ../../docs_src/custom_docs_ui/tutorial001_py310.py hl[2:6,11:19,22:24,27:33] *} + +/// tip | مشورہ + +`swagger_ui_redirect` کے لیے *path operation* اس وقت کام آتا ہے جب آپ OAuth2 استعمال کرتے ہیں۔ + +اگر آپ اپنی API کو کسی OAuth2 provider کے ساتھ integrate کرتے ہیں، تو آپ authenticate ہو کر حاصل کردہ credentials کے ساتھ API docs پر واپس آ سکیں گے۔ اور حقیقی OAuth2 authentication کا استعمال کرتے ہوئے اس کے ساتھ تعامل کر سکیں گے۔ + +Swagger UI پردے کے پیچھے آپ کے لیے اسے سنبھالے گا، لیکن اسے اس "redirect" helper کی ضرورت ہے۔ + +/// + +### جانچ کے لیے *path operation* بنائیں { #create-a-path-operation-to-test-it } + +اب، سب کچھ کام کر رہا ہے یہ جانچنے کے لیے، ایک *path operation* بنائیں: + +{* ../../docs_src/custom_docs_ui/tutorial001_py310.py hl[36:38] *} + +### جانچ کریں { #test-it } + +اب، آپ اپنے docs پر [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) جا کر صفحہ دوبارہ load کر سکتے ہیں، یہ نئے CDN سے assets load کرے گا۔ + +## Docs کے لیے JavaScript اور CSS خود host کریں { #self-hosting-javascript-and-css-for-docs } + +JavaScript اور CSS خود host کرنا مفید ہو سکتا ہے اگر، مثال کے طور پر، آپ کو اپنی app کو آف لائن بھی کام کرتے رہنے کی ضرورت ہے، بغیر کسی Internet رسائی کے، یا مقامی network میں۔ + +یہاں آپ دیکھیں گے کہ ان فائلوں کو اسی FastAPI app میں خود کیسے فراہم کیا جائے، اور docs کو ان کا استعمال کرنے کے لیے کیسے ترتیب دیا جائے۔ + +### پروجیکٹ کی فائل ساخت { #project-file-structure } + +فرض کریں آپ کے پروجیکٹ کی فائل ساخت اس طرح نظر آتی ہے: + +``` +. +├── app +│ ├── __init__.py +│ ├── main.py +``` + +اب ان static فائلوں کو ذخیرہ کرنے کے لیے ایک directory بنائیں۔ + +آپ کی نئی فائل ساخت اس طرح نظر آ سکتی ہے: + +``` +. +├── app +│ ├── __init__.py +│ ├── main.py +└── static/ +``` + +### فائلیں ڈاؤن لوڈ کریں { #download-the-files } + +Docs کے لیے ضروری static فائلیں ڈاؤن لوڈ کریں اور انہیں اس `static/` directory میں رکھیں۔ + +آپ غالباً ہر لنک پر right-click کر کے "Save link as..." جیسا آپشن منتخب کر سکتے ہیں۔ + +**Swagger UI** یہ فائلیں استعمال کرتا ہے: + +* [`swagger-ui-bundle.js`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js) +* [`swagger-ui.css`](https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css) + +اور **ReDoc** یہ فائل استعمال کرتا ہے: + +* [`redoc.standalone.js`](https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js) + +اس کے بعد، آپ کی فائل ساخت اس طرح نظر آ سکتی ہے: + +``` +. +├── app +│ ├── __init__.py +│ ├── main.py +└── static + ├── redoc.standalone.js + ├── swagger-ui-bundle.js + └── swagger-ui.css +``` + +### Static فائلیں فراہم کریں { #serve-the-static-files } + +* `StaticFiles` import کریں۔ +* ایک مخصوص path پر `StaticFiles()` instance "Mount" کریں۔ + +{* ../../docs_src/custom_docs_ui/tutorial002_py310.py hl[7,11] *} + +### Static فائلوں کی جانچ کریں { #test-the-static-files } + +اپنی application شروع کریں اور [http://127.0.0.1:8000/static/redoc.standalone.js](http://127.0.0.1:8000/static/redoc.standalone.js) پر جائیں۔ + +آپ کو **ReDoc** کے لیے ایک بہت لمبی JavaScript فائل نظر آنی چاہیے۔ + +یہ کچھ اس طرح شروع ہو سکتی ہے: + +```JavaScript +/*! For license information please see redoc.standalone.js.LICENSE.txt */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("null")): +... +``` + +یہ تصدیق کرتا ہے کہ آپ اپنی app سے static فائلیں فراہم کر سکتے ہیں، اور آپ نے docs کی static فائلیں صحیح جگہ رکھی ہیں۔ + +اب ہم app کو ان static فائلوں کو docs کے لیے استعمال کرنے کے لیے ترتیب دے سکتے ہیں۔ + +### Static فائلوں کے لیے خود کار docs غیر فعال کریں { #disable-the-automatic-docs-for-static-files } + +حسب ضرورت CDN استعمال کرنے کی طرح، پہلا مرحلہ خود کار docs کو غیر فعال کرنا ہے، کیونکہ وہ بطور default CDN استعمال کرتے ہیں۔ + +انہیں غیر فعال کرنے کے لیے، اپنی `FastAPI` app بناتے وقت ان کے URLs کو `None` پر سیٹ کریں: + +{* ../../docs_src/custom_docs_ui/tutorial002_py310.py hl[9] *} + +### Static فائلوں کے لیے حسب ضرورت docs شامل کریں { #include-the-custom-docs-for-static-files } + +اور حسب ضرورت CDN کی طرح، اب آپ حسب ضرورت docs کے لیے *path operations* بنا سکتے ہیں۔ + +دوبارہ، آپ docs کے لیے HTML صفحات بنانے کے لیے FastAPI کے اندرونی functions دوبارہ استعمال کر سکتے ہیں، اور انہیں مطلوبہ arguments پاس کر سکتے ہیں: + +* `openapi_url`: وہ URL جہاں سے docs کا HTML صفحہ آپ کی API کا OpenAPI schema حاصل کر سکتا ہے۔ آپ یہاں `app.openapi_url` attribute استعمال کر سکتے ہیں۔ +* `title`: آپ کی API کا عنوان۔ +* `oauth2_redirect_url`: آپ default استعمال کرنے کے لیے یہاں `app.swagger_ui_oauth2_redirect_url` استعمال کر سکتے ہیں۔ +* `swagger_js_url`: وہ URL جہاں سے آپ کے Swagger UI docs کا HTML **JavaScript** فائل حاصل کر سکتا ہے۔ **یہ وہی ہے جو آپ کی اپنی app اب فراہم کر رہی ہے**۔ +* `swagger_css_url`: وہ URL جہاں سے آپ کے Swagger UI docs کا HTML **CSS** فائل حاصل کر سکتا ہے۔ **یہ وہی ہے جو آپ کی اپنی app اب فراہم کر رہی ہے**۔ + +اور اسی طرح ReDoc کے لیے... + +{* ../../docs_src/custom_docs_ui/tutorial002_py310.py hl[2:6,14:22,25:27,30:36] *} + +/// tip | مشورہ + +`swagger_ui_redirect` کے لیے *path operation* اس وقت کام آتا ہے جب آپ OAuth2 استعمال کرتے ہیں۔ + +اگر آپ اپنی API کو کسی OAuth2 provider کے ساتھ integrate کرتے ہیں، تو آپ authenticate ہو کر حاصل کردہ credentials کے ساتھ API docs پر واپس آ سکیں گے۔ اور حقیقی OAuth2 authentication کا استعمال کرتے ہوئے اس کے ساتھ تعامل کر سکیں گے۔ + +Swagger UI پردے کے پیچھے آپ کے لیے اسے سنبھالے گا، لیکن اسے اس "redirect" helper کی ضرورت ہے۔ + +/// + +### Static فائلوں کی جانچ کے لیے *path operation* بنائیں { #create-a-path-operation-to-test-static-files } + +اب، سب کچھ کام کر رہا ہے یہ جانچنے کے لیے، ایک *path operation* بنائیں: + +{* ../../docs_src/custom_docs_ui/tutorial002_py310.py hl[39:41] *} + +### Static فائلوں کے UI کی جانچ { #test-static-files-ui } + +اب، آپ اپنا WiFi بند کر کے اپنے docs پر [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) جا سکتے ہیں اور صفحہ دوبارہ load کر سکتے ہیں۔ + +اور Internet کے بغیر بھی، آپ اپنی API کے docs دیکھ سکیں گے اور اس کے ساتھ تعامل کر سکیں گے۔ diff --git a/docs/ur/docs/how-to/custom-request-and-route.md b/docs/ur/docs/how-to/custom-request-and-route.md new file mode 100644 index 000000000..accf5b585 --- /dev/null +++ b/docs/ur/docs/how-to/custom-request-and-route.md @@ -0,0 +1,109 @@ +# حسب ضرورت Request اور APIRoute class { #custom-request-and-apiroute-class } + +بعض صورتوں میں، آپ `Request` اور `APIRoute` classes کی منطق کو override کرنا چاہ سکتے ہیں۔ + +خاص طور پر، یہ middleware میں منطق رکھنے کا ایک اچھا متبادل ہو سکتا ہے۔ + +مثال کے طور پر، اگر آپ request body کو آپ کی application کی طرف سے process ہونے سے پہلے پڑھنا یا تبدیل کرنا چاہتے ہیں۔ + +/// danger + +یہ ایک "advanced" خصوصیت ہے۔ + +اگر آپ ابھی **FastAPI** شروع کر رہے ہیں تو شاید آپ اس حصے کو چھوڑنا چاہیں گے۔ + +/// + +## استعمال کے معاملات { #use-cases } + +کچھ استعمال کے معاملات میں شامل ہیں: + +* غیر JSON request bodies کو JSON میں تبدیل کرنا (مثلاً [`msgpack`](https://msgpack.org/index.html))۔ +* gzip سے compress شدہ request bodies کو decompress کرنا۔ +* تمام request bodies کو خود کار طریقے سے log کرنا۔ + +## حسب ضرورت request body encodings کو سنبھالنا { #handling-custom-request-body-encodings } + +آئیے دیکھتے ہیں کہ gzip requests کو decompress کرنے کے لیے حسب ضرورت `Request` subclass کیسے استعمال کی جائے۔ + +اور اس حسب ضرورت request class کو استعمال کرنے کے لیے `APIRoute` subclass کیسے بنائی جائے۔ + +### حسب ضرورت `GzipRequest` class بنائیں { #create-a-custom-gziprequest-class } + +/// tip | مشورہ + +یہ ایک مثال ہے جو دکھاتی ہے کہ یہ کیسے کام کرتا ہے، اگر آپ کو Gzip سپورٹ کی ضرورت ہے، تو آپ فراہم کردہ [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware) استعمال کر سکتے ہیں۔ + +/// + +سب سے پہلے، ہم ایک `GzipRequest` class بناتے ہیں، جو مناسب header کی موجودگی میں body کو decompress کرنے کے لیے `Request.body()` method کو overwrite کرے گی۔ + +اگر header میں `gzip` نہیں ہے، تو یہ body کو decompress کرنے کی کوشش نہیں کرے گی۔ + +اس طرح، ایک ہی route class gzip سے compress شدہ یا بغیر compress شدہ requests کو سنبھال سکتی ہے۔ + +{* ../../docs_src/custom_request_and_route/tutorial001_an_py310.py hl[9:16] *} + +### حسب ضرورت `GzipRoute` class بنائیں { #create-a-custom-gziproute-class } + +اس کے بعد، ہم `fastapi.routing.APIRoute` کی ایک حسب ضرورت subclass بناتے ہیں جو `GzipRequest` استعمال کرے گی۔ + +اس بار، یہ `APIRoute.get_route_handler()` method کو overwrite کرے گی۔ + +یہ method ایک function واپس کرتا ہے۔ اور وہ function ہی ہے جو request وصول کرے گا اور response واپس کرے گا۔ + +یہاں ہم اسے اصل request سے `GzipRequest` بنانے کے لیے استعمال کرتے ہیں۔ + +{* ../../docs_src/custom_request_and_route/tutorial001_an_py310.py hl[19:27] *} + +/// note | تکنیکی تفصیلات + +ایک `Request` میں `request.scope` attribute ہوتا ہے، جو صرف ایک Python `dict` ہے جس میں request سے متعلق metadata ہوتا ہے۔ + +ایک `Request` میں `request.receive` بھی ہوتا ہے، جو request کی body کو "وصول" کرنے کا function ہے۔ + +`scope` `dict` اور `receive` function دونوں ASGI specification کا حصہ ہیں۔ + +اور یہ دو چیزیں، `scope` اور `receive`، نئی `Request` instance بنانے کے لیے درکار ہیں۔ + +`Request` کے بارے میں مزید جاننے کے لیے [Starlette کی Requests کے بارے میں دستاویزات](https://www.starlette.dev/requests/) دیکھیں۔ + +/// + +`GzipRequest.get_route_handler` کی واپس کردہ function صرف اتنا مختلف کام کرتی ہے کہ `Request` کو `GzipRequest` میں تبدیل کرتی ہے۔ + +ایسا کرنے سے، ہماری `GzipRequest` ہماری *path operations* کو بھیجنے سے پہلے ڈیٹا کو decompress (اگر ضروری ہو) کا خیال رکھے گی۔ + +اس کے بعد، تمام processing کی منطق ایک جیسی ہی ہے۔ + +لیکن ہماری `GzipRequest.body` میں تبدیلیوں کی وجہ سے، request body خود بخود decompress ہو جائے گی جب **FastAPI** اسے ضرورت کے وقت load کرے گا۔ + +## Exception handler میں request body تک رسائی { #accessing-the-request-body-in-an-exception-handler } + +/// tip | مشورہ + +اسی مسئلے کو حل کرنے کے لیے، `RequestValidationError` کے لیے حسب ضرورت handler میں `body` استعمال کرنا شاید بہت آسان ہے ([Handling Errors](../tutorial/handling-errors.md#use-the-requestvalidationerror-body))۔ + +لیکن یہ مثال اب بھی درست ہے اور یہ دکھاتی ہے کہ اندرونی اجزاء کے ساتھ کیسے تعامل کیا جائے۔ + +/// + +ہم اسی طریقے کو exception handler میں request body تک رسائی کے لیے بھی استعمال کر سکتے ہیں۔ + +ہمیں بس request کو `try`/`except` block کے اندر سنبھالنا ہے: + +{* ../../docs_src/custom_request_and_route/tutorial002_an_py310.py hl[14,16] *} + +اگر کوئی exception واقع ہو، تو `Request` instance ابھی بھی scope میں ہوگی، تو ہم error کو سنبھالتے وقت request body کو پڑھ اور استعمال کر سکتے ہیں: + +{* ../../docs_src/custom_request_and_route/tutorial002_an_py310.py hl[17:19] *} + +## Router میں حسب ضرورت `APIRoute` class { #custom-apiroute-class-in-a-router } + +آپ `APIRouter` کا `route_class` parameter بھی سیٹ کر سکتے ہیں: + +{* ../../docs_src/custom_request_and_route/tutorial003_py310.py hl[26] *} + +اس مثال میں، `router` کے تحت *path operations* حسب ضرورت `TimedRoute` class استعمال کریں گی، اور response میں ایک اضافی `X-Response-Time` header ہوگا جس میں response تیار کرنے میں لگنے والا وقت ہوگا: + +{* ../../docs_src/custom_request_and_route/tutorial003_py310.py hl[13:20] *} diff --git a/docs/ur/docs/how-to/extending-openapi.md b/docs/ur/docs/how-to/extending-openapi.md new file mode 100644 index 000000000..998b55d55 --- /dev/null +++ b/docs/ur/docs/how-to/extending-openapi.md @@ -0,0 +1,80 @@ +# OpenAPI کی توسیع { #extending-openapi } + +کچھ ایسے معاملات ہیں جہاں آپ کو تیار کردہ OpenAPI schema میں ترمیم کرنے کی ضرورت ہو سکتی ہے۔ + +اس حصے میں آپ دیکھیں گے کہ یہ کیسے کریں۔ + +## عام عمل { #the-normal-process } + +عام (default) عمل درج ذیل ہے۔ + +ایک `FastAPI` application (instance) میں `.openapi()` method ہوتا ہے جس سے OpenAPI schema واپس آنے کی توقع ہوتی ہے۔ + +Application object بنانے کے حصے کے طور پر، `/openapi.json` (یا جو بھی آپ نے اپنا `openapi_url` سیٹ کیا ہو) کے لیے ایک *path operation* رجسٹر ہوتی ہے۔ + +یہ صرف application کے `.openapi()` method کے نتیجے کے ساتھ JSON response واپس کرتی ہے۔ + +بطور default، `.openapi()` method `.openapi_schema` property کو چیک کرتی ہے کہ آیا اس میں مواد ہے اور اسے واپس کرتی ہے۔ + +اگر نہیں ہے، تو یہ `fastapi.openapi.utils.get_openapi` پر موجود utility function کا استعمال کرتے ہوئے انہیں تیار کرتی ہے۔ + +اور وہ `get_openapi()` function بطور parameters یہ وصول کرتا ہے: + +* `title`: OpenAPI کا عنوان، docs میں دکھایا جاتا ہے۔ +* `version`: آپ کی API کا ورژن، مثلاً `2.5.0`۔ +* `openapi_version`: استعمال شدہ OpenAPI specification کا ورژن۔ بطور default، تازہ ترین: `3.1.0`۔ +* `summary`: API کا مختصر خلاصہ۔ +* `description`: آپ کی API کی تفصیل، اس میں markdown شامل ہو سکتا ہے اور docs میں دکھایا جائے گا۔ +* `routes`: Routes کی فہرست، یہ ہر ایک رجسٹر شدہ *path operations* ہیں۔ یہ `app.routes` سے لیے جاتے ہیں۔ + +/// info | معلومات + +`summary` parameter OpenAPI 3.1.0 اور اس سے اوپر میں دستیاب ہے، جسے FastAPI 0.99.0 اور اس سے اوپر سپورٹ کرتا ہے۔ + +/// + +## Defaults کو override کرنا { #overriding-the-defaults } + +اوپر دی گئی معلومات کا استعمال کرتے ہوئے، آپ اسی utility function کو OpenAPI schema تیار کرنے کے لیے استعمال کر سکتے ہیں اور ہر اس حصے کو override کر سکتے ہیں جس کی آپ کو ضرورت ہے۔ + +مثال کے طور پر، آئیے [ReDoc کی OpenAPI extension شامل کریں تاکہ حسب ضرورت logo شامل ہو](https://github.com/Rebilly/ReDoc/blob/master/docs/redoc-vendor-extensions.md#x-logo)۔ + +### عام **FastAPI** { #normal-fastapi } + +سب سے پہلے، اپنی تمام **FastAPI** application معمول کے مطابق لکھیں: + +{* ../../docs_src/extending_openapi/tutorial001_py310.py hl[1,4,7:9] *} + +### OpenAPI schema تیار کریں { #generate-the-openapi-schema } + +پھر، `custom_openapi()` function کے اندر OpenAPI schema تیار کرنے کے لیے وہی utility function استعمال کریں: + +{* ../../docs_src/extending_openapi/tutorial001_py310.py hl[2,15:21] *} + +### OpenAPI schema میں ترمیم کریں { #modify-the-openapi-schema } + +اب آپ ReDoc extension شامل کر سکتے ہیں، OpenAPI schema میں `info` "object" میں حسب ضرورت `x-logo` شامل کر کے: + +{* ../../docs_src/extending_openapi/tutorial001_py310.py hl[22:24] *} + +### OpenAPI schema کو cache کریں { #cache-the-openapi-schema } + +آپ `.openapi_schema` property کو "cache" کے طور پر استعمال کر سکتے ہیں، اپنا تیار کردہ schema ذخیرہ کرنے کے لیے۔ + +اس طرح، آپ کی application کو ہر بار جب کوئی صارف آپ کے API docs کھولے schema دوبارہ تیار نہیں کرنا پڑے گا۔ + +یہ صرف ایک بار تیار ہوگا، اور پھر اگلی requests کے لیے وہی cached schema استعمال ہوگا۔ + +{* ../../docs_src/extending_openapi/tutorial001_py310.py hl[13:14,25:26] *} + +### Method کو override کریں { #override-the-method } + +اب آپ `.openapi()` method کو اپنے نئے function سے تبدیل کر سکتے ہیں۔ + +{* ../../docs_src/extending_openapi/tutorial001_py310.py hl[29] *} + +### جانچ کریں { #check-it } + +جب آپ [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) پر جائیں گے تو آپ دیکھیں گے کہ آپ اپنا حسب ضرورت logo استعمال کر رہے ہیں (اس مثال میں، **FastAPI** کا logo): + + diff --git a/docs/ur/docs/how-to/general.md b/docs/ur/docs/how-to/general.md new file mode 100644 index 000000000..2d5079fc0 --- /dev/null +++ b/docs/ur/docs/how-to/general.md @@ -0,0 +1,43 @@ +# عمومی - طریقہ کار - ترکیبیں { #general-how-to-recipes } + +یہاں عمومی یا اکثر پوچھے جانے والے سوالات کے لیے دستاویزات میں دیگر مقامات کی طرف کئی اشارے ہیں۔ + +## ڈیٹا فلٹر کریں - Security { #filter-data-security } + +اس بات کو یقینی بنانے کے لیے کہ آپ ضرورت سے زیادہ ڈیٹا واپس نہ کریں، [Tutorial - Response Model - Return Type](../tutorial/response-model.md) کی دستاویزات پڑھیں۔ + +## Response کی کارکردگی بہتر بنائیں - Response Model - Return Type { #optimize-response-performance-response-model-return-type } + +JSON ڈیٹا واپس کرتے وقت کارکردگی بہتر بنانے کے لیے، return type یا response model استعمال کریں، اس طرح Pydantic بغیر Python سے گزرے Rust کی طرف سے JSON میں serialization سنبھالے گا۔ مزید معلومات کے لیے [Tutorial - Response Model - Return Type](../tutorial/response-model.md) کی دستاویزات پڑھیں۔ + +## دستاویزات کے Tags - OpenAPI { #documentation-tags-openapi } + +اپنی *path operations* میں tags شامل کرنے اور انہیں docs UI میں گروپ کرنے کے لیے، [Tutorial - Path Operation Configurations - Tags](../tutorial/path-operation-configuration.md#tags) کی دستاویزات پڑھیں۔ + +## دستاویزات کا خلاصہ اور تفصیل - OpenAPI { #documentation-summary-and-description-openapi } + +اپنی *path operations* میں summary اور description شامل کرنے اور انہیں docs UI میں دکھانے کے لیے، [Tutorial - Path Operation Configurations - Summary and Description](../tutorial/path-operation-configuration.md#summary-and-description) کی دستاویزات پڑھیں۔ + +## دستاویزات Response description - OpenAPI { #documentation-response-description-openapi } + +Response کی تفصیل جو docs UI میں دکھائی جاتی ہے اس کی وضاحت کرنے کے لیے، [Tutorial - Path Operation Configurations - Response description](../tutorial/path-operation-configuration.md#response-description) کی دستاویزات پڑھیں۔ + +## دستاویزات میں *Path Operation* کو Deprecate کریں - OpenAPI { #documentation-deprecate-a-path-operation-openapi } + +کسی *path operation* کو deprecate کرنے اور اسے docs UI میں دکھانے کے لیے، [Tutorial - Path Operation Configurations - Deprecation](../tutorial/path-operation-configuration.md#deprecate-a-path-operation) کی دستاویزات پڑھیں۔ + +## کسی بھی ڈیٹا کو JSON-compatible میں تبدیل کریں { #convert-any-data-to-json-compatible } + +کسی بھی ڈیٹا کو JSON-compatible میں تبدیل کرنے کے لیے، [Tutorial - JSON Compatible Encoder](../tutorial/encoder.md) کی دستاویزات پڑھیں۔ + +## OpenAPI Metadata - Docs { #openapi-metadata-docs } + +اپنے OpenAPI schema میں metadata شامل کرنے کے لیے، بشمول license، version، contact وغیرہ، [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md) کی دستاویزات پڑھیں۔ + +## OpenAPI Custom URL { #openapi-custom-url } + +OpenAPI URL کو اپنی مرضی کے مطابق بنانے (یا ہٹانے) کے لیے، [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md#openapi-url) کی دستاویزات پڑھیں۔ + +## OpenAPI Docs URLs { #openapi-docs-urls } + +خود کار طریقے سے تیار کردہ docs user interfaces کے لیے استعمال ہونے والے URLs کو اپ ڈیٹ کرنے کے لیے، [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md#docs-urls) کی دستاویزات پڑھیں۔ diff --git a/docs/ur/docs/how-to/graphql.md b/docs/ur/docs/how-to/graphql.md new file mode 100644 index 000000000..3d8c45535 --- /dev/null +++ b/docs/ur/docs/how-to/graphql.md @@ -0,0 +1,60 @@ +# GraphQL { #graphql } + +چونکہ **FastAPI** کی بنیاد **ASGI** standard پر ہے، اس لیے ASGI کے ساتھ ہم آہنگ کسی بھی **GraphQL** لائبریری کو آسانی سے شامل کیا جا سکتا ہے۔ + +آپ ایک ہی application میں عام FastAPI *path operations* کو GraphQL کے ساتھ ملا سکتے ہیں۔ + +/// tip | مشورہ + +**GraphQL** کچھ بہت مخصوص استعمال کے معاملات حل کرتا ہے۔ + +عام **web APIs** کے مقابلے میں اس کے **فوائد** اور **نقصانات** ہیں۔ + +یقینی بنائیں کہ آپ کے استعمال کے معاملے کے لیے **فوائد** کیا **نقصانات** کی تلافی کرتے ہیں۔ 🤓 + +/// + +## GraphQL لائبریریاں { #graphql-libraries } + +یہاں کچھ **GraphQL** لائبریریاں ہیں جن میں **ASGI** سپورٹ موجود ہے۔ آپ انہیں **FastAPI** کے ساتھ استعمال کر سکتے ہیں: + +* [Strawberry](https://strawberry.rocks/) 🍓 + * [FastAPI کے لیے دستاویزات](https://strawberry.rocks/docs/integrations/fastapi) کے ساتھ +* [Ariadne](https://ariadnegraphql.org/) + * [FastAPI کے لیے دستاویزات](https://ariadnegraphql.org/docs/fastapi-integration) کے ساتھ +* [Tartiflette](https://tartiflette.io/) + * ASGI integration فراہم کرنے کے لیے [Tartiflette ASGI](https://tartiflette.github.io/tartiflette-asgi/) کے ساتھ +* [Graphene](https://graphene-python.org/) + * [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3) کے ساتھ + +## Strawberry کے ساتھ GraphQL { #graphql-with-strawberry } + +اگر آپ کو **GraphQL** کے ساتھ کام کرنے کی ضرورت ہے یا آپ چاہتے ہیں، تو [**Strawberry**](https://strawberry.rocks/) **تجویز کردہ** لائبریری ہے کیونکہ اس کا ڈیزائن **FastAPI** کے ڈیزائن سے سب سے قریب ہے، یہ سب **type annotations** پر مبنی ہے۔ + +آپ کے استعمال کے معاملے کے مطابق، آپ کسی مختلف لائبریری کو ترجیح دے سکتے ہیں، لیکن اگر آپ مجھ سے پوچھیں، تو میں غالباً **Strawberry** آزمانے کا مشورہ دوں گا۔ + +یہاں ایک مختصر جائزہ ہے کہ آپ Strawberry کو FastAPI کے ساتھ کیسے شامل کر سکتے ہیں: + +{* ../../docs_src/graphql_/tutorial001_py310.py hl[3,22,25] *} + +آپ Strawberry کے بارے میں مزید [Strawberry دستاویزات](https://strawberry.rocks/) میں جان سکتے ہیں۔ + +اور [Strawberry with FastAPI](https://strawberry.rocks/docs/integrations/fastapi) کی دستاویزات بھی دیکھیں۔ + +## Starlette سے پرانا `GraphQLApp` { #older-graphqlapp-from-starlette } + +Starlette کے پچھلے ورژنز میں [Graphene](https://graphene-python.org/) کے ساتھ integration کے لیے `GraphQLApp` class شامل تھی۔ + +اسے Starlette سے deprecated کر دیا گیا تھا، لیکن اگر آپ کے پاس ایسا کوڈ ہے جو اسے استعمال کرتا تھا، تو آپ آسانی سے [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3) پر **منتقل** ہو سکتے ہیں، جو وہی استعمال کے معاملے کا احاطہ کرتا ہے اور **تقریباً ایک جیسا interface** رکھتا ہے۔ + +/// tip | مشورہ + +اگر آپ کو GraphQL کی ضرورت ہے، تو میں پھر بھی تجویز کروں گا کہ آپ [Strawberry](https://strawberry.rocks/) دیکھیں، کیونکہ یہ custom classes اور types کی بجائے type annotations پر مبنی ہے۔ + +/// + +## مزید جانیں { #learn-more } + +آپ **GraphQL** کے بارے میں مزید [GraphQL کی سرکاری دستاویزات](https://graphql.org/) میں جان سکتے ہیں۔ + +آپ اوپر بیان کردہ ہر لائبریری کے بارے میں ان کے لنکس میں مزید پڑھ سکتے ہیں۔ diff --git a/docs/ur/docs/how-to/index.md b/docs/ur/docs/how-to/index.md new file mode 100644 index 000000000..5fd1295eb --- /dev/null +++ b/docs/ur/docs/how-to/index.md @@ -0,0 +1,13 @@ +# طریقہ کار - ترکیبیں { #how-to-recipes } + +یہاں آپ کو **مختلف موضوعات** کے لیے مختلف ترکیبیں یا "طریقہ کار" کی رہنمائیاں ملیں گی۔ + +ان میں سے زیادہ تر خیالات کم و بیش **آزادانہ** ہیں، اور زیادہ تر صورتوں میں آپ کو صرف انہی کا مطالعہ کرنا چاہیے جو براہ راست **آپ کے پروجیکٹ** پر لاگو ہوں۔ + +اگر کوئی چیز آپ کے پروجیکٹ کے لیے دلچسپ اور مفید لگے، تو آگے بڑھیں اور اسے دیکھیں، ورنہ آپ شاید انہیں چھوڑ سکتے ہیں۔ + +/// tip | مشورہ + +اگر آپ **FastAPI** کو منظم طریقے سے سیکھنا چاہتے ہیں (تجویز کردہ)، تو اس کی بجائے [Tutorial - User Guide](../tutorial/index.md) باب بہ باب پڑھیں۔ + +/// diff --git a/docs/ur/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md b/docs/ur/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md new file mode 100644 index 000000000..e25a3d510 --- /dev/null +++ b/docs/ur/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md @@ -0,0 +1,135 @@ +# Pydantic v1 سے Pydantic v2 میں منتقلی { #migrate-from-pydantic-v1-to-pydantic-v2 } + +اگر آپ کے پاس پرانی FastAPI app ہے، تو آپ شاید Pydantic ورژن 1 استعمال کر رہے ہوں۔ + +FastAPI ورژن 0.100.0 میں Pydantic v1 یا v2 دونوں کی سپورٹ تھی۔ یہ جو بھی آپ نے install کیا ہوتا اسے استعمال کرتا۔ + +FastAPI ورژن 0.119.0 نے Pydantic v2 کے اندر سے Pydantic v1 کی جزوی سپورٹ (`pydantic.v1` کے طور پر) متعارف کرائی، تاکہ v2 میں منتقلی آسان ہو۔ + +FastAPI 0.126.0 نے Pydantic v1 کی سپورٹ ختم کر دی، جبکہ تھوڑی دیر کے لیے `pydantic.v1` کی سپورٹ جاری رکھی۔ + +/// warning | انتباہ + +Pydantic ٹیم نے Python کے تازہ ترین ورژنز کے لیے Pydantic v1 کی سپورٹ بند کر دی ہے، **Python 3.14** سے شروع کرتے ہوئے۔ + +اس میں `pydantic.v1` بھی شامل ہے، جو Python 3.14 اور اس سے اوپر میں مزید سپورٹ نہیں ہے۔ + +اگر آپ Python کی تازہ ترین خصوصیات استعمال کرنا چاہتے ہیں، تو آپ کو یقینی بنانا ہوگا کہ آپ Pydantic v2 استعمال کریں۔ + +/// + +اگر آپ کے پاس Pydantic v1 والی پرانی FastAPI app ہے، تو یہاں میں آپ کو دکھاؤں گا کہ اسے Pydantic v2 میں کیسے منتقل کیا جائے، اور **FastAPI 0.119.0 کی خصوصیات** جو بتدریج منتقلی میں مدد کرتی ہیں۔ + +## سرکاری رہنما { #official-guide } + +Pydantic کے پاس v1 سے v2 میں منتقلی کی سرکاری [Migration Guide](https://docs.pydantic.dev/latest/migration/) ہے۔ + +اس میں یہ بھی شامل ہے کہ کیا تبدیل ہوا ہے، validations اب کیسے زیادہ درست اور سخت ہیں، ممکنہ خدشات وغیرہ۔ + +آپ اسے پڑھ کر بہتر سمجھ سکتے ہیں کہ کیا تبدیل ہوا ہے۔ + +## Tests { #tests } + +یقینی بنائیں کہ آپ کی app کے لیے [tests](../tutorial/testing.md) ہیں اور آپ انہیں continuous integration (CI) پر چلاتے ہیں۔ + +اس طرح، آپ اپ گریڈ کر سکتے ہیں اور یقینی بنا سکتے ہیں کہ سب کچھ توقع کے مطابق کام کر رہا ہے۔ + +## `bump-pydantic` { #bump-pydantic } + +بہت سی صورتوں میں، جب آپ بغیر customizations کے عام Pydantic models استعمال کرتے ہیں، تو آپ Pydantic v1 سے Pydantic v2 میں منتقلی کے زیادہ تر عمل کو خودکار بنا سکتے ہیں۔ + +آپ Pydantic ٹیم کا [`bump-pydantic`](https://github.com/pydantic/bump-pydantic) استعمال کر سکتے ہیں۔ + +یہ ٹول زیادہ تر کوڈ کو خود بخود تبدیل کرنے میں مدد کرے گا جسے تبدیل کرنے کی ضرورت ہے۔ + +اس کے بعد، آپ tests چلا سکتے ہیں اور جانچ سکتے ہیں کہ سب کچھ کام کرتا ہے۔ اگر کرتا ہے، تو آپ کا کام ہو گیا۔ 😎 + +## Pydantic v2 میں Pydantic v1 { #pydantic-v1-in-v2 } + +Pydantic v2 میں Pydantic v1 کی ہر چیز بطور submodule `pydantic.v1` شامل ہے۔ لیکن یہ Python 3.13 سے اوپر کے ورژنز میں مزید سپورٹ نہیں ہے۔ + +اس کا مطلب ہے کہ آپ Pydantic v2 کا تازہ ترین ورژن install کر سکتے ہیں اور اس submodule سے پرانے Pydantic v1 کے اجزاء import اور استعمال کر سکتے ہیں، جیسے کہ آپ کے پاس پرانا Pydantic v1 install ہو۔ + +{* ../../docs_src/pydantic_v1_in_v2/tutorial001_an_py310.py hl[1,4] *} + +### Pydantic v2 میں Pydantic v1 کے لیے FastAPI سپورٹ { #fastapi-support-for-pydantic-v1-in-v2 } + +FastAPI 0.119.0 سے، Pydantic v2 کے اندر سے Pydantic v1 کی جزوی سپورٹ بھی ہے، تاکہ v2 میں منتقلی آسان ہو۔ + +لہذا، آپ Pydantic کو تازہ ترین ورژن 2 میں اپ گریڈ کر سکتے ہیں، اور `pydantic.v1` submodule استعمال کرنے کے لیے imports تبدیل کر سکتے ہیں، اور بہت سی صورتوں میں یہ بس کام کر جائے گا۔ + +{* ../../docs_src/pydantic_v1_in_v2/tutorial002_an_py310.py hl[2,5,15] *} + +/// warning | انتباہ + +ذہن میں رکھیں کہ چونکہ Pydantic ٹیم Python کے حالیہ ورژنز میں Pydantic v1 کو مزید سپورٹ نہیں کرتی، Python 3.14 سے شروع کرتے ہوئے، `pydantic.v1` کا استعمال بھی Python 3.14 اور اس سے اوپر میں سپورٹ نہیں ہے۔ + +/// + +### ایک ہی app میں Pydantic v1 اور v2 { #pydantic-v1-and-v2-on-the-same-app } + +Pydantic کی طرف سے یہ **سپورٹ نہیں** ہے کہ Pydantic v2 کے model کے اپنے fields بطور Pydantic v1 models defined ہوں یا اس کے برعکس۔ + +```mermaid +graph TB + subgraph "❌ Not Supported" + direction TB + subgraph V2["Pydantic v2 Model"] + V1Field["Pydantic v1 Model"] + end + subgraph V1["Pydantic v1 Model"] + V2Field["Pydantic v2 Model"] + end + end + + style V2 fill:#f9fff3 + style V1 fill:#fff6f0 + style V1Field fill:#fff6f0 + style V2Field fill:#f9fff3 +``` + +...لیکن، آپ ایک ہی app میں الگ الگ models میں Pydantic v1 اور v2 استعمال کر سکتے ہیں۔ + +```mermaid +graph TB + subgraph "✅ Supported" + direction TB + subgraph V2["Pydantic v2 Model"] + V2Field["Pydantic v2 Model"] + end + subgraph V1["Pydantic v1 Model"] + V1Field["Pydantic v1 Model"] + end + end + + style V2 fill:#f9fff3 + style V1 fill:#fff6f0 + style V1Field fill:#fff6f0 + style V2Field fill:#f9fff3 +``` + +بعض صورتوں میں، آپ کی FastAPI app میں ایک ہی **path operation** میں Pydantic v1 اور v2 دونوں models رکھنا بھی ممکن ہے: + +{* ../../docs_src/pydantic_v1_in_v2/tutorial003_an_py310.py hl[2:3,6,12,21:22] *} + +اوپر دی گئی اس مثال میں، input model ایک Pydantic v1 model ہے، اور output model (`response_model=ItemV2` میں defined) ایک Pydantic v2 model ہے۔ + +### Pydantic v1 parameters { #pydantic-v1-parameters } + +اگر آپ کو Pydantic v1 models کے ساتھ FastAPI کے مخصوص ٹولز جیسے `Body`، `Query`، `Form` وغیرہ استعمال کرنے کی ضرورت ہے، تو آپ Pydantic v2 میں منتقلی مکمل ہونے تک انہیں `fastapi.temp_pydantic_v1_params` سے import کر سکتے ہیں: + +{* ../../docs_src/pydantic_v1_in_v2/tutorial004_an_py310.py hl[4,18] *} + +### مراحل میں منتقلی { #migrate-in-steps } + +/// tip | مشورہ + +پہلے `bump-pydantic` آزمائیں، اگر آپ کے tests پاس ہو جائیں اور یہ کام کر جائے، تو آپ کا کام ایک command میں ہو گیا۔ ✨ + +/// + +اگر `bump-pydantic` آپ کے استعمال کے لیے کام نہیں کرتا، تو آپ ایک ہی app میں Pydantic v1 اور v2 دونوں models کی سپورٹ استعمال کر کے بتدریج Pydantic v2 میں منتقلی کر سکتے ہیں۔ + +آپ پہلے Pydantic کو تازہ ترین ورژن 2 میں اپ گریڈ کر سکتے ہیں، اور اپنے تمام models کے لیے `pydantic.v1` استعمال کرنے کے لیے imports تبدیل کر سکتے ہیں۔ + +پھر، آپ اپنے models کو بتدریج گروپس میں Pydantic v1 سے v2 میں منتقل کرنا شروع کر سکتے ہیں۔ 🚶 diff --git a/docs/ur/docs/how-to/separate-openapi-schemas.md b/docs/ur/docs/how-to/separate-openapi-schemas.md new file mode 100644 index 000000000..067eb86d1 --- /dev/null +++ b/docs/ur/docs/how-to/separate-openapi-schemas.md @@ -0,0 +1,102 @@ +# Input اور Output کے لیے الگ OpenAPI Schemas یا نہیں { #separate-openapi-schemas-for-input-and-output-or-not } + +**Pydantic v2** کی ریلیز کے بعد سے، تیار کردہ OpenAPI پہلے سے کچھ زیادہ درست اور **صحیح** ہے۔ 😎 + +درحقیقت، بعض صورتوں میں، ایک ہی Pydantic model کے لیے OpenAPI میں **دو JSON Schemas** ہوں گے، input اور output کے لیے، اس بات پر منحصر ہے کہ آیا ان میں **default values** ہیں۔ + +آئیے دیکھتے ہیں کہ یہ کیسے کام کرتا ہے اور اگر آپ کو ضرورت ہو تو اسے کیسے تبدیل کیا جائے۔ + +## Input اور Output کے لیے Pydantic Models { #pydantic-models-for-input-and-output } + +فرض کریں کہ آپ کے پاس default values کے ساتھ ایک Pydantic model ہے، جیسے یہ: + +{* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py ln[1:7] hl[7] *} + +### Input کے لیے Model { #model-for-input } + +اگر آپ اس model کو اس طرح input کے طور پر استعمال کرتے ہیں: + +{* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py ln[1:15] hl[14] *} + +...تو `description` field **ضروری نہیں** ہوگا۔ کیونکہ اس کی default value `None` ہے۔ + +### Docs میں Input Model { #input-model-in-docs } + +آپ docs میں تصدیق کر سکتے ہیں، `description` field پر **سرخ ستارہ** نہیں ہے، اسے ضروری نشان زد نہیں کیا گیا: + +
+ +
+ +### Output کے لیے Model { #model-for-output } + +لیکن اگر آپ وہی model output کے طور پر استعمال کرتے ہیں، جیسے یہاں: + +{* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py hl[19] *} + +...تو چونکہ `description` کی default value ہے، اگر آپ اس field کے لیے **کچھ واپس نہیں کرتے**، تو اس میں پھر بھی وہ **default value** ہوگی۔ + +### Output Response ڈیٹا کے لیے Model { #model-for-output-response-data } + +اگر آپ docs کے ساتھ تعامل کریں اور response چیک کریں، حالانکہ کوڈ نے `description` fields میں سے کسی ایک میں کچھ نہیں ڈالا، JSON response میں default value (`null`) موجود ہے: + +
+ +
+ +اس کا مطلب ہے کہ اس میں **ہمیشہ ایک قدر** ہوگی، بس بعض اوقات قدر `None` (یا JSON میں `null`) ہو سکتی ہے۔ + +اس کا مطلب ہے کہ، آپ کی API استعمال کرنے والے clients کو یہ جانچنے کی ضرورت نہیں کہ قدر موجود ہے یا نہیں، وہ **فرض کر سکتے ہیں کہ field ہمیشہ موجود رہے گا**، بس بعض صورتوں میں اس کی default value `None` ہوگی۔ + +OpenAPI میں اس کی وضاحت کا طریقہ یہ ہے کہ اس field کو **ضروری** نشان زد کیا جائے، کیونکہ یہ ہمیشہ موجود رہے گا۔ + +اس وجہ سے، کسی model کا JSON Schema اس بات پر منحصر ہو کر مختلف ہو سکتا ہے کہ یہ **input یا output** کے لیے استعمال ہو رہا ہے: + +* **input** کے لیے `description` **ضروری نہیں** ہوگا +* **output** کے لیے یہ **ضروری** ہوگا (اور ممکنہ طور پر `None` ہو، یا JSON کی اصطلاح میں `null`) + +### Docs میں Output کے لیے Model { #model-for-output-in-docs } + +آپ docs میں output model بھی چیک کر سکتے ہیں، `name` اور `description` **دونوں** **سرخ ستارے** کے ساتھ **ضروری** نشان زد ہیں: + +
+ +
+ +### Docs میں Input اور Output کے لیے Model { #model-for-input-and-output-in-docs } + +اور اگر آپ OpenAPI میں تمام دستیاب Schemas (JSON Schemas) چیک کریں، تو آپ دیکھیں گے کہ دو ہیں، ایک `Item-Input` اور ایک `Item-Output`۔ + +`Item-Input` کے لیے، `description` **ضروری نہیں** ہے، اس پر سرخ ستارہ نہیں ہے۔ + +لیکن `Item-Output` کے لیے، `description` **ضروری** ہے، اس پر سرخ ستارہ ہے۔ + +
+ +
+ +**Pydantic v2** کی اس خصوصیت کے ساتھ، آپ کی API documentation زیادہ **درست** ہے، اور اگر آپ کے پاس خود کار طریقے سے تیار کردہ clients اور SDKs ہیں، تو وہ بھی زیادہ درست ہوں گے، بہتر **developer experience** اور consistency کے ساتھ۔ 🎉 + +## Schemas کو الگ نہ کریں { #do-not-separate-schemas } + +اب، کچھ ایسے معاملات ہیں جہاں آپ input اور output کے لیے **ایک ہی schema** رکھنا چاہ سکتے ہیں۔ + +شاید اس کا سب سے اہم استعمال یہ ہے کہ اگر آپ کے پاس پہلے سے کچھ خود کار طریقے سے تیار کردہ client کوڈ/SDKs ہیں اور آپ ابھی تمام خود کار تیار کردہ client کوڈ/SDKs کو اپ ڈیٹ نہیں کرنا چاہتے، آپ شاید کسی وقت یہ کرنا چاہیں گے، لیکن شاید ابھی نہیں۔ + +اس صورت میں، آپ **FastAPI** میں یہ خصوصیت `separate_input_output_schemas=False` parameter کے ساتھ غیر فعال کر سکتے ہیں۔ + +/// info | معلومات + +`separate_input_output_schemas` کی سپورٹ FastAPI `0.102.0` میں شامل کی گئی تھی۔ 🤓 + +/// + +{* ../../docs_src/separate_openapi_schemas/tutorial002_py310.py hl[10] *} + +### Docs میں Input اور Output Models کے لیے ایک ہی Schema { #same-schema-for-input-and-output-models-in-docs } + +اور اب input اور output کے لیے model کا ایک ہی schema ہوگا، صرف `Item`، اور اس میں `description` **ضروری نہیں** ہوگا: + +
+ +
diff --git a/docs/ur/docs/how-to/testing-database.md b/docs/ur/docs/how-to/testing-database.md new file mode 100644 index 000000000..b2327c42d --- /dev/null +++ b/docs/ur/docs/how-to/testing-database.md @@ -0,0 +1,7 @@ +# Database کی جانچ { #testing-a-database } + +آپ databases، SQL، اور SQLModel کے بارے میں [SQLModel دستاویزات](https://sqlmodel.tiangolo.com/) میں پڑھ سکتے ہیں۔ 🤓 + +FastAPI کے ساتھ [SQLModel استعمال کرنے کا ایک مختصر tutorial](https://sqlmodel.tiangolo.com/tutorial/fastapi/) موجود ہے۔ ✨ + +اس tutorial میں [SQL databases کی جانچ](https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/) کا ایک حصہ بھی شامل ہے۔ 😎 diff --git a/docs/ur/docs/index.md b/docs/ur/docs/index.md new file mode 100644 index 000000000..e1d7d84f5 --- /dev/null +++ b/docs/ur/docs/index.md @@ -0,0 +1,545 @@ +# FastAPI { #fastapi } + + + +

+ FastAPI +

+

+ FastAPI framework، اعلیٰ کارکردگی، سیکھنے میں آسان، تیز کوڈنگ، پروڈکشن کے لیے تیار +

+

+ + Test + + + Coverage + + + Package version + + + Supported Python versions + +

+ +--- + +**دستاویزات**: [https://fastapi.tiangolo.com](https://fastapi.tiangolo.com) + +**سورس کوڈ**: [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi) + +--- + +FastAPI ایک جدید، تیز رفتار (اعلیٰ کارکردگی والا) web framework ہے جو معیاری Python type hints کی بنیاد پر Python کے ساتھ APIs بنانے کے لیے بنایا گیا ہے۔ + +اہم خصوصیات یہ ہیں: + +* **تیز**: بہت اعلیٰ کارکردگی، **NodeJS** اور **Go** کے برابر (Starlette اور Pydantic کی بدولت)۔ [دستیاب تیز ترین Python frameworks میں سے ایک](#performance)۔ +* **تیز کوڈنگ**: فیچرز بنانے کی رفتار تقریباً 200% سے 300% بڑھائیں۔ * +* **کم غلطیاں**: انسانی (ڈویلپر) غلطیوں میں تقریباً 40% کمی۔ * +* **بدیہی**: بہترین ایڈیٹر سپورٹ۔ ہر جگہ Completion۔ debugging میں کم وقت۔ +* **آسان**: استعمال اور سیکھنے میں آسان بنایا گیا ہے۔ دستاویزات پڑھنے میں کم وقت۔ +* **مختصر**: code کی تکرار کم سے کم۔ ہر parameter کے اعلان سے متعدد خصوصیات۔ کم غلطیاں۔ +* **مضبوط**: پروڈکشن کے لیے تیار code حاصل کریں۔ خودکار تعاملی دستاویزات کے ساتھ۔ +* **معیارات پر مبنی**: APIs کے کھلے معیارات پر مبنی (اور مکمل طور پر ہم آہنگ): [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (پہلے Swagger کے نام سے جانا جاتا تھا) اور [JSON Schema](https://json-schema.org/)۔ + +* اندرونی ترقیاتی ٹیم کے ذریعے پروڈکشن ایپلیکیشنز بناتے ہوئے کیے گئے ٹیسٹس پر مبنی تخمینہ۔ + +## سپانسرز { #sponsors } + + + +### کلیدی سپانسر { #keystone-sponsor } + +{% for sponsor in sponsors.keystone -%} + +{% endfor -%} + +### گولڈ اور سلور سپانسرز { #gold-and-silver-sponsors } + +{% for sponsor in sponsors.gold -%} + +{% endfor -%} +{%- for sponsor in sponsors.silver -%} + +{% endfor %} + + + +[دیگر سپانسرز](https://fastapi.tiangolo.com/fastapi-people/#sponsors) + +## آراء { #opinions } + +"_[...] میں ان دنوں **FastAPI** بہت زیادہ استعمال کر رہا ہوں۔ [...] میں دراصل اسے اپنی ٹیم کی **Microsoft میں تمام ML services** کے لیے استعمال کرنے کا ارادہ رکھتا ہوں۔ ان میں سے کچھ بنیادی **Windows** پروڈکٹ اور کچھ **Office** پروڈکٹس میں شامل ہو رہی ہیں۔_" + +
Kabir Khan - Microsoft (ref)
+ +--- + +"_ہم نے **FastAPI** لائبریری اپنائی تاکہ ایک **REST** server بنایا جا سکے جس سے **predictions** حاصل کی جا سکیں۔ [Ludwig کے لیے]_" + +
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
+ +--- + +"_**Netflix** اپنے **بحران کے انتظام** کے آرکیسٹریشن framework: **Dispatch** کی اوپن سورس ریلیز کا اعلان کرتے ہوئے خوش ہے! [**FastAPI** سے بنایا گیا]_" + +
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
+ +--- + +"_میں **FastAPI** سے بے حد خوش ہوں۔ یہ بہت مزے کا ہے!_" + +
Brian Okken - Python Bytes podcast host (ref)
+ +--- + +"_سچ میں، جو آپ نے بنایا ہے وہ بہت مضبوط اور چمکدار لگتا ہے۔ کئی طرح سے، یہ وہی ہے جو میں **Hug** کو بنانا چاہتا تھا - کسی کو یہ بناتے دیکھنا واقعی حوصلہ افزا ہے۔_" + +
Timothy Crosley - Hug کے خالق (ref)
+ +--- + +"_اگر آپ REST APIs بنانے کے لیے ایک **جدید framework** سیکھنا چاہتے ہیں، تو **FastAPI** دیکھیں [...] یہ تیز، استعمال میں آسان اور سیکھنے میں آسان ہے [...]_" + +"_ہم نے اپنی **APIs** کے لیے **FastAPI** اپنا لیا ہے [...] مجھے لگتا ہے آپ کو یہ پسند آئے گا [...]_" + +
Ines Montani - Matthew Honnibal - Explosion AI بانی - spaCy تخلیق کار (ref) - (ref)
+ +--- + +"_اگر کوئی پروڈکشن Python API بنانا چاہتا ہے، تو میں **FastAPI** کی بہت سفارش کروں گا۔ یہ **خوبصورتی سے ڈیزائن کیا گیا** ہے، **استعمال میں آسان** اور **انتہائی قابل توسیع** ہے، یہ ہماری API first ترقیاتی حکمت عملی کا **اہم جزو** بن گیا ہے اور بہت سی automations اور services جیسے ہمارا Virtual TAC Engineer چلا رہا ہے۔_" + +
Deon Pillsbury - Cisco (ref)
+ +--- + +## FastAPI مختصر دستاویزی فلم { #fastapi-mini-documentary } + +2025 کے آخر میں ریلیز ہونے والی [FastAPI مختصر دستاویزی فلم](https://www.youtube.com/watch?v=mpR8ngthqiE) ہے، آپ اسے آن لائن دیکھ سکتے ہیں: + +FastAPI Mini Documentary + +## **Typer**، CLIs کا FastAPI { #typer-the-fastapi-of-clis } + + + +اگر آپ web API کے بجائے ٹرمینل میں استعمال ہونے والی CLI ایپ بنا رہے ہیں، تو [**Typer**](https://typer.tiangolo.com/) دیکھیں۔ + +**Typer** FastAPI کا چھوٹا بھائی ہے۔ اور اس کا مقصد **CLIs کا FastAPI** بننا ہے۔ ⌨️ 🚀 + +## تقاضے { #requirements } + +FastAPI دیو ہیکل ہستیوں کے کندھوں پر کھڑا ہے: + +* ویب حصوں کے لیے [Starlette](https://www.starlette.dev/)۔ +* ڈیٹا حصوں کے لیے [Pydantic](https://docs.pydantic.dev/)۔ + +## انسٹالیشن { #installation } + +ایک [virtual environment](https://fastapi.tiangolo.com/virtual-environments/) بنائیں اور فعال کریں اور پھر FastAPI انسٹال کریں: + +
+ +```console +$ pip install "fastapi[standard]" + +---> 100% +``` + +
+ +**نوٹ**: یقینی بنائیں کہ آپ `"fastapi[standard]"` کو quotes میں لکھیں تاکہ یہ تمام ٹرمینلز میں کام کرے۔ + +## مثال { #example } + +### بنائیں { #create-it } + +ایک فائل `main.py` بنائیں: + +```Python +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: str | None = None): + return {"item_id": item_id, "q": q} +``` + +
+یا async def استعمال کریں... + +اگر آپ کا code `async` / `await` استعمال کرتا ہے، تو `async def` استعمال کریں: + +```Python hl_lines="7 12" +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +async def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +async def read_item(item_id: int, q: str | None = None): + return {"item_id": item_id, "q": q} +``` + +**نوٹ**: + +اگر آپ نہیں جانتے، تو دستاویزات میں [`async` اور `await`](https://fastapi.tiangolo.com/async/#in-a-hurry) کے بارے میں _"جلدی میں ہیں؟"_ سیکشن دیکھیں۔ + +
+ +### چلائیں { #run-it } + +server کو اس کمانڈ سے چلائیں: + +
+ +```console +$ fastapi dev + + ╭────────── FastAPI CLI - Development mode ───────────╮ + │ │ + │ Serving at: http://127.0.0.1:8000 │ + │ │ + │ API docs: http://127.0.0.1:8000/docs │ + │ │ + │ Running in development mode, for production use: │ + │ │ + │ fastapi run │ + │ │ + ╰─────────────────────────────────────────────────────╯ + +INFO: Will watch for changes in these directories: ['/home/user/code/awesomeapp'] +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +INFO: Started reloader process [2248755] using WatchFiles +INFO: Started server process [2248757] +INFO: Waiting for application startup. +INFO: Application startup complete. +``` + +
+ +
+fastapi dev کمانڈ کے بارے میں... + +`fastapi dev` کمانڈ خودکار طور پر آپ کی `main.py` فائل پڑھتی ہے، اس میں **FastAPI** ایپ تلاش کرتی ہے، اور [Uvicorn](https://www.uvicorn.dev) استعمال کر کے server شروع کرتی ہے۔ + +بطور ڈیفالٹ، `fastapi dev` مقامی ترقی کے لیے auto-reload فعال کر کے شروع ہوگا۔ + +آپ اس کے بارے میں [FastAPI CLI دستاویزات](https://fastapi.tiangolo.com/fastapi-cli/) میں مزید پڑھ سکتے ہیں۔ + +
+ +### دیکھیں { #check-it } + +اپنا براؤزر [http://127.0.0.1:8000/items/5?q=somequery](http://127.0.0.1:8000/items/5?q=somequery) پر کھولیں۔ + +آپ کو JSON response اس طرح نظر آئے گا: + +```JSON +{"item_id": 5, "q": "somequery"} +``` + +آپ نے پہلے ہی ایک API بنا لیا ہے جو: + +* _paths_ `/` اور `/items/{item_id}` پر HTTP requests وصول کرتا ہے۔ +* دونوں _paths_ `GET` operations (جنہیں HTTP _methods_ بھی کہا جاتا ہے) لیتے ہیں۔ +* _path_ `/items/{item_id}` میں ایک _path parameter_ `item_id` ہے جو `int` ہونا چاہیے۔ +* _path_ `/items/{item_id}` میں ایک اختیاری `str` _query parameter_ `q` ہے۔ + +### تعاملی API دستاویزات { #interactive-api-docs } + +اب [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) پر جائیں۔ + +آپ کو خودکار تعاملی API دستاویزات نظر آئیں گی ([Swagger UI](https://github.com/swagger-api/swagger-ui) کی فراہم کردہ): + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) + +### متبادل API دستاویزات { #alternative-api-docs } + +اور اب، [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) پر جائیں۔ + +آپ کو متبادل خودکار دستاویزات نظر آئیں گی ([ReDoc](https://github.com/Rebilly/ReDoc) کی فراہم کردہ): + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) + +## مثال کی اپ گریڈ { #example-upgrade } + +اب فائل `main.py` میں ترمیم کریں تاکہ `PUT` request سے body وصول کیا جا سکے۔ + +Pydantic کی بدولت معیاری Python types استعمال کر کے body بیان کریں۔ + +```Python hl_lines="2 7-10 23-25" +from fastapi import FastAPI +from pydantic import BaseModel + +app = FastAPI() + + +class Item(BaseModel): + name: str + price: float + is_offer: bool | None = None + + +@app.get("/") +def read_root(): + return {"Hello": "World"} + + +@app.get("/items/{item_id}") +def read_item(item_id: int, q: 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} +``` + +`fastapi dev` server خودکار طور پر reload ہو جائے گا۔ + +### تعاملی API دستاویزات کی اپ گریڈ { #interactive-api-docs-upgrade } + +اب [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) پر جائیں۔ + +* تعاملی API دستاویزات خودکار طور پر اپ ڈیٹ ہو جائیں گی، نئی body سمیت: + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) + +* "Try it out" بٹن پر کلک کریں، یہ آپ کو parameters بھرنے اور API کے ساتھ براہ راست تعامل کرنے کی اجازت دیتا ہے: + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) + +* پھر "Execute" بٹن پر کلک کریں، یوزر انٹرفیس آپ کی API سے بات کرے گا، parameters بھیجے گا، نتائج حاصل کرے گا اور انہیں اسکرین پر دکھائے گا: + +![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) + +### متبادل API دستاویزات کی اپ گریڈ { #alternative-api-docs-upgrade } + +اور اب، [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) پر جائیں۔ + +* متبادل دستاویزات بھی نئے query parameter اور body کی عکاسی کریں گی: + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) + +### خلاصہ { #recap } + +خلاصہ یہ کہ، آپ parameters، body وغیرہ کی types **ایک بار** function parameters کے طور پر بیان کرتے ہیں۔ + +آپ یہ معیاری جدید Python types کے ساتھ کرتے ہیں۔ + +آپ کو کوئی نئی syntax، کسی مخصوص لائبریری کے methods یا classes سیکھنے کی ضرورت نہیں۔ + +بس معیاری **Python**۔ + +مثال کے طور پر، ایک `int` کے لیے: + +```Python +item_id: int +``` + +یا ایک زیادہ پیچیدہ `Item` model کے لیے: + +```Python +item: Item +``` + +...اور اس ایک اعلان کے ساتھ آپ کو ملتا ہے: + +* ایڈیٹر سپورٹ، بشمول: + * Completion۔ + * Type checks۔ +* ڈیٹا کی توثیق: + * ڈیٹا غلط ہونے پر خودکار اور واضح غلطیاں۔ + * گہرائی سے nested JSON objects کی بھی توثیق۔ +* ان پٹ ڈیٹا کی تبدیلی: نیٹ ورک سے Python ڈیٹا اور types میں۔ پڑھنا: + * JSON۔ + * Path parameters۔ + * Query parameters۔ + * Cookies۔ + * Headers۔ + * Forms۔ + * Files۔ +* آؤٹ پٹ ڈیٹا کی تبدیلی: Python ڈیٹا اور types سے نیٹ ورک ڈیٹا (بطور JSON) میں: + * Python types تبدیل کریں (`str`, `int`, `float`, `bool`, `list`, وغیرہ)۔ + * `datetime` objects۔ + * `UUID` objects۔ + * Database models۔ + * ...اور بہت کچھ۔ +* خودکار تعاملی API دستاویزات، بشمول 2 متبادل یوزر انٹرفیسز: + * Swagger UI۔ + * ReDoc۔ + +--- + +پچھلی code مثال کی طرف واپس آتے ہوئے، **FastAPI** یہ کرے گا: + +* `GET` اور `PUT` requests کے لیے path میں `item_id` ہونے کی توثیق کرے گا۔ +* `GET` اور `PUT` requests کے لیے `item_id` کی type `int` ہونے کی توثیق کرے گا۔ + * اگر نہیں ہے، تو client کو ایک مفید، واضح غلطی نظر آئے گی۔ +* `GET` requests کے لیے چیک کرے گا کہ کوئی اختیاری query parameter بنام `q` ہے (جیسا کہ `http://127.0.0.1:8000/items/foo?q=somequery`)۔ + * چونکہ `q` parameter کو `= None` کے ساتھ بیان کیا گیا ہے، اس لیے یہ اختیاری ہے۔ + * `None` کے بغیر یہ لازمی ہوتا (جیسا کہ `PUT` کے معاملے میں body ہے)۔ +* `/items/{item_id}` کے لیے `PUT` requests میں، body کو بطور JSON پڑھے گا: + * چیک کرے گا کہ اس میں لازمی attribute `name` ہے جو `str` ہونا چاہیے۔ + * چیک کرے گا کہ اس میں لازمی attribute `price` ہے جو `float` ہونا ضروری ہے۔ + * چیک کرے گا کہ اس میں اختیاری attribute `is_offer` ہے، جو اگر موجود ہو تو `bool` ہونا چاہیے۔ + * یہ سب گہرائی سے nested JSON objects کے لیے بھی کام کرے گا۔ +* خودکار طور پر JSON سے اور JSON میں تبدیل کرے گا۔ +* OpenAPI کے ساتھ ہر چیز کی دستاویز بنائے گا، جو استعمال ہو سکتی ہے: + * تعاملی دستاویزاتی نظاموں سے۔ + * کئی زبانوں کے لیے خودکار client code generation نظاموں سے۔ +* 2 تعاملی دستاویزاتی ویب انٹرفیسز براہ راست فراہم کرے گا۔ + +--- + +ہم نے ابھی صرف سطح کو چھوا ہے، لیکن آپ کو پہلے سے اندازہ ہو گیا ہے کہ یہ سب کیسے کام کرتا ہے۔ + +اس لائن کو تبدیل کر کے دیکھیں: + +```Python + return {"item_name": item.name, "item_id": item_id} +``` + +...اس سے: + +```Python + ... "item_name": item.name ... +``` + +...اس میں: + +```Python + ... "item_price": item.price ... +``` + +...اور دیکھیں کہ آپ کا ایڈیٹر attributes کو خود مکمل کرے گا اور ان کی types جانے گا: + +![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) + +مزید خصوصیات سمیت ایک زیادہ مکمل مثال کے لیے، Tutorial - User Guide دیکھیں۔ + +**اسپائلر الرٹ**: tutorial - user guide میں شامل ہے: + +* مختلف جگہوں سے **parameters** کا اعلان جیسے: **headers**، **cookies**، **form fields** اور **files**۔ +* `maximum_length` یا `regex` جیسی **توثیقی حدود** مقرر کرنے کا طریقہ۔ +* ایک بہت طاقتور اور استعمال میں آسان **Dependency Injection** سسٹم۔ +* سیکیورٹی اور تصدیق، بشمول **OAuth2** بمع **JWT tokens** اور **HTTP Basic** auth کی سپورٹ۔ +* **گہرائی سے nested JSON models** بیان کرنے کی مزید ایڈوانسڈ (لیکن اتنی ہی آسان) تکنیکیں (Pydantic کی بدولت)۔ +* [Strawberry](https://strawberry.rocks) اور دیگر لائبریریز کے ساتھ **GraphQL** انضمام۔ +* (Starlette کی بدولت) بہت سی اضافی خصوصیات جیسے: + * **WebSockets** + * HTTPX اور `pytest` پر مبنی انتہائی آسان ٹیسٹس + * **CORS** + * **Cookie Sessions** + * ...اور مزید۔ + +### اپنی ایپ deploy کریں (اختیاری) { #deploy-your-app-optional } + +آپ اختیاری طور پر اپنی FastAPI ایپ کو [FastAPI Cloud](https://fastapicloud.com) پر deploy کر سکتے ہیں، اگر ابھی تک نہیں کیا تو ویٹنگ لسٹ میں شامل ہو جائیں۔ 🚀 + +اگر آپ کے پاس پہلے سے **FastAPI Cloud** اکاؤنٹ ہے (ہم نے آپ کو ویٹنگ لسٹ سے مدعو کیا تھا 😉)، تو آپ ایک کمانڈ سے اپنی ایپلیکیشن deploy کر سکتے ہیں۔ + +
+ +```console +$ fastapi deploy + +Deploying to FastAPI Cloud... + +✅ Deployment successful! + +🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev +``` + +
+ +بس! اب آپ اس URL پر اپنی ایپ تک رسائی حاصل کر سکتے ہیں۔ ✨ + +#### FastAPI Cloud کے بارے میں { #about-fastapi-cloud } + +**[FastAPI Cloud](https://fastapicloud.com)** وہی مصنف اور ٹیم بنا رہی ہے جو **FastAPI** کے پیچھے ہے۔ + +یہ کم سے کم محنت کے ساتھ API **بنانے**، **deploy کرنے**، اور **تک رسائی** حاصل کرنے کے عمل کو آسان بناتا ہے۔ + +یہ FastAPI کے ساتھ ایپس بنانے کا وہی **ڈویلپر تجربہ** انہیں کلاؤڈ پر **deploy** کرنے میں لاتا ہے۔ 🎉 + +FastAPI Cloud *FastAPI اور دوستوں* کے اوپن سورس پراجیکٹس کا بنیادی سپانسر اور فنڈنگ فراہم کنندہ ہے۔ ✨ + +#### دوسرے کلاؤڈ فراہم کنندگان پر Deploy کریں { #deploy-to-other-cloud-providers } + +FastAPI اوپن سورس ہے اور معیارات پر مبنی ہے۔ آپ FastAPI ایپس کسی بھی کلاؤڈ فراہم کنندہ پر deploy کر سکتے ہیں جو آپ چاہیں۔ + +اپنے کلاؤڈ فراہم کنندہ کی رہنمائی کے مطابق FastAPI ایپس deploy کریں۔ 🤓 + +## کارکردگی { #performance } + +آزاد TechEmpower بینچ مارکس دکھاتے ہیں کہ Uvicorn کے تحت چلنے والی **FastAPI** ایپلیکیشنز [دستیاب تیز ترین Python frameworks میں سے ایک](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7) ہیں، صرف Starlette اور خود Uvicorn سے پیچھے ہیں (جو FastAPI اندرونی طور پر استعمال کرتا ہے)۔ (*) + +اس کے بارے میں مزید سمجھنے کے لیے، [بینچ مارکس](https://fastapi.tiangolo.com/benchmarks/) سیکشن دیکھیں۔ + +## Dependencies { #dependencies } + +FastAPI کا انحصار Pydantic اور Starlette پر ہے۔ + +### `standard` Dependencies { #standard-dependencies } + +جب آپ `pip install "fastapi[standard]"` سے FastAPI انسٹال کرتے ہیں تو یہ اختیاری dependencies کے `standard` گروپ کے ساتھ آتا ہے: + +Pydantic کے استعمال کردہ: + +* [`email-validator`](https://github.com/JoshData/python-email-validator) - email کی توثیق کے لیے۔ + +Starlette کے استعمال کردہ: + +* [`httpx`](https://www.python-httpx.org) - اگر آپ `TestClient` استعمال کرنا چاہتے ہیں تو ضروری ہے۔ +* [`jinja2`](https://jinja.palletsprojects.com) - اگر آپ ڈیفالٹ template ترتیب استعمال کرنا چاہتے ہیں تو ضروری ہے۔ +* [`python-multipart`](https://github.com/Kludex/python-multipart) - اگر آپ `request.form()` کے ساتھ form "parsing" کی سپورٹ چاہتے ہیں تو ضروری ہے۔ + +FastAPI کے استعمال کردہ: + +* [`uvicorn`](https://www.uvicorn.dev) - اس server کے لیے جو آپ کی ایپلیکیشن لوڈ اور سرو کرتا ہے۔ اس میں `uvicorn[standard]` شامل ہے، جس میں اعلیٰ کارکردگی سرونگ کے لیے ضروری کچھ dependencies (مثلاً `uvloop`) شامل ہیں۔ +* `fastapi-cli[standard]` - `fastapi` کمانڈ فراہم کرنے کے لیے۔ + * اس میں `fastapi-cloud-cli` شامل ہے، جو آپ کو اپنی FastAPI ایپلیکیشن [FastAPI Cloud](https://fastapicloud.com) پر deploy کرنے کی اجازت دیتا ہے۔ + +### `standard` Dependencies کے بغیر { #without-standard-dependencies } + +اگر آپ `standard` اختیاری dependencies شامل نہیں کرنا چاہتے، تو `pip install "fastapi[standard]"` کے بجائے `pip install fastapi` سے انسٹال کریں۔ + +### `fastapi-cloud-cli` کے بغیر { #without-fastapi-cloud-cli } + +اگر آپ FastAPI معیاری dependencies کے ساتھ انسٹال کرنا چاہتے ہیں لیکن `fastapi-cloud-cli` کے بغیر، تو `pip install "fastapi[standard-no-fastapi-cloud-cli]"` سے انسٹال کریں۔ + +### اضافی اختیاری Dependencies { #additional-optional-dependencies } + +کچھ اضافی dependencies ہیں جو آپ شاید انسٹال کرنا چاہیں۔ + +اضافی اختیاری Pydantic dependencies: + +* [`pydantic-settings`](https://docs.pydantic.dev/latest/usage/pydantic_settings/) - settings management کے لیے۔ +* [`pydantic-extra-types`](https://docs.pydantic.dev/latest/usage/types/extra_types/extra_types/) - Pydantic کے ساتھ استعمال کے لیے اضافی types۔ + +اضافی اختیاری FastAPI dependencies: + +* [`orjson`](https://github.com/ijl/orjson) - اگر آپ `ORJSONResponse` استعمال کرنا چاہتے ہیں تو ضروری ہے۔ +* [`ujson`](https://github.com/esnme/ultrajson) - اگر آپ `UJSONResponse` استعمال کرنا چاہتے ہیں تو ضروری ہے۔ + +## لائسنس { #license } + +یہ پراجیکٹ MIT لائسنس کی شرائط کے تحت لائسنس یافتہ ہے۔ diff --git a/docs/ur/docs/learn/index.md b/docs/ur/docs/learn/index.md new file mode 100644 index 000000000..7ee8e9101 --- /dev/null +++ b/docs/ur/docs/learn/index.md @@ -0,0 +1,5 @@ +# سیکھیں { #learn } + +یہاں **FastAPI** سیکھنے کے لیے تعارفی حصے اور tutorials موجود ہیں۔ + +آپ اسے ایک **کتاب**، ایک **کورس**، FastAPI سیکھنے کا **سرکاری** اور تجویز کردہ طریقہ سمجھ سکتے ہیں۔ 😎 diff --git a/docs/ur/docs/management-tasks.md b/docs/ur/docs/management-tasks.md new file mode 100644 index 000000000..6bbaf0399 --- /dev/null +++ b/docs/ur/docs/management-tasks.md @@ -0,0 +1,157 @@ +# Repository Management Tasks + +یہ وہ کام ہیں جو FastAPI repository کو manage کرنے کے لیے [ٹیم ممبران](./fastapi-people.md#team) انجام دے سکتے ہیں۔ + +/// tip | مشورہ + +یہ سیکشن صرف مٹھی بھر لوگوں کے لیے مفید ہے، وہ ٹیم ممبران جن کے پاس repository manage کرنے کی اجازتیں ہیں۔ آپ شاید اسے چھوڑ سکتے ہیں۔ 😉 + +/// + +...تو آپ [FastAPI کی ٹیم کے ممبر](./fastapi-people.md#team) ہیں؟ واہ، آپ بہت زبردست ہیں! 😎 + +آپ [FastAPI کی مدد کریں - مدد حاصل کریں](./help-fastapi.md) میں سب کچھ بیرونی شراکت داروں کی طرح مدد کر سکتے ہیں۔ لیکن اس کے علاوہ، کچھ کام ایسے ہیں جو صرف آپ (ٹیم کے حصے کے طور پر) انجام دے سکتے ہیں۔ + +یہاں ان کاموں کی عمومی ہدایات ہیں جو آپ انجام دے سکتے ہیں۔ + +آپ کی مدد کے لیے بہت شکریہ۔ 🙇 + +## مہربان رہیں + +سب سے پہلے، مہربان رہیں۔ 😊 + +اگر آپ ٹیم میں شامل کیے گئے تو شاید آپ بہت مہربان ہیں، لیکن یہ ذکر کرنا ضروری ہے۔ 🤓 + +### جب چیزیں مشکل ہوں + +جب چیزیں اچھی ہوں تو سب کچھ آسان ہوتا ہے، تو اس کے لیے زیادہ ہدایات کی ضرورت نہیں۔ لیکن جب چیزیں مشکل ہوں، یہاں کچھ رہنمائی ہے۔ + +اچھی بات تلاش کرنے کی کوشش کریں۔ عام طور پر، اگر لوگ غیر دوستانہ نہیں ہو رہے، تو ان کی محنت اور دلچسپی کا شکریہ ادا کرنے کی کوشش کریں، چاہے آپ بنیادی موضوع (بحث، PR) سے متفق نہ ہوں، بس project میں دلچسپی لینے، یا کچھ کرنے کی کوشش میں وقت لگانے کا شکریہ ادا کریں۔ + +متن میں جذبات ظاہر کرنا مشکل ہوتا ہے، مدد کے لیے emojis استعمال کریں۔ 😅 + +Discussions اور PRs میں، بہت سے معاملات میں لوگ اپنی پریشانی لاتے ہیں اور بغیر فلٹر کے دکھاتے ہیں، بہت سے معاملات میں مبالغہ آرائی، شکایت، حق جتانا وغیرہ۔ یہ واقعی اچھا نہیں ہے، اور جب ایسا ہوتا ہے تو ان کے مسائل حل کرنے کی ہماری ترجیح کم ہو جاتی ہے۔ لیکن پھر بھی، سانس لینے کی کوشش کریں، اور اپنے جوابات میں نرم رہیں۔ + +تلخ طنز یا ممکنہ طور پر passive-aggressive تبصروں سے بچنے کی کوشش کریں۔ اگر کچھ غلط ہے، تو طنزیہ ہونے سے بہتر ہے کہ براہ راست (نرمی سے) بات کریں۔ + +جتنا ہو سکے مخصوص اور معروضی ہونے کی کوشش کریں، عمومی باتوں سے بچیں۔ + +ان گفتگو کے لیے جو زیادہ مشکل ہوں، مثلاً PR مسترد کرنا، آپ مجھ سے (@tiangolo) براہ راست سنبھالنے کو کہہ سکتے ہیں۔ + +## PR Titles ترمیم کریں + +* PR title ترمیم کریں تاکہ یہ [gitmoji](https://gitmoji.dev/) سے emoji کے ساتھ شروع ہو۔ + * Emoji character استعمال کریں، GitHub code نہیں۔ تو `🐛` استعمال کریں `:bug:` کی بجائے۔ تاکہ GitHub سے باہر بھی صحیح دکھائی دے، مثلاً release notes میں۔ + * تراجم کے لیے `🌐` emoji ("globe with meridians") استعمال کریں۔ +* Title فعل سے شروع کریں۔ مثلاً `Add`، `Refactor`، `Fix` وغیرہ۔ اس طرح title بتائے گا کہ PR کیا کرتا ہے۔ جیسے `Add support for teleporting`، بجائے `Teleporting wasn't working, so this PR fixes it`۔ +* PR title کا متن "امری" انداز میں ترمیم کریں، جیسے حکم دے رہے ہوں۔ تو `Adding support for teleporting` کی بجائے `Add support for teleporting` استعمال کریں۔ +* Title وضاحتی ہو کہ یہ کیا حاصل کرتا ہے۔ اگر feature ہے تو اسے بیان کرنے کی کوشش کریں، مثلاً `Add support for teleporting` بجائے `Create TeleportAdapter class`۔ +* Title نقطے (`.`) سے ختم نہ کریں۔ +* جب PR ترجمے کے لیے ہو، `🌐` سے شروع کریں اور پھر `Add {language} translation for` اور پھر ترجمہ شدہ فائل کا path۔ مثال کے طور پر: + +```Markdown +🌐 Add Spanish translation for `docs/es/docs/teleporting.md` +``` + +PR merge ہونے کے بعد، ایک GitHub Action ([latest-changes](https://github.com/tiangolo/latest-changes)) خودکار طور پر تازہ ترین تبدیلیاں اپڈیٹ کرنے کے لیے PR title استعمال کرے گی۔ + +تو اچھا PR title ہونا نہ صرف GitHub میں اچھا دکھائے گا، بلکہ release notes میں بھی۔ 📝 + +## PRs میں Labels شامل کریں + +وہی GitHub Action [latest-changes](https://github.com/tiangolo/latest-changes) release notes میں اس PR کو کس سیکشن میں رکھنا ہے یہ فیصلہ کرنے کے لیے PR میں ایک label استعمال کرتی ہے۔ + +یقینی بنائیں کہ آپ [latest-changes labels کی فہرست](https://github.com/tiangolo/latest-changes#using-labels) سے supported label استعمال کریں: + +* `breaking`: Breaking Changes + * موجودہ code ٹوٹ جائے گا اگر وہ اپنا code تبدیل کیے بغیر ورژن اپڈیٹ کریں۔ یہ شاذ و نادر ہوتا ہے، تو یہ label کم استعمال ہوتا ہے۔ +* `security`: Security Fixes + * یہ security fixes کے لیے ہے، جیسے vulnerabilities۔ یہ تقریباً کبھی استعمال نہیں ہوگا۔ +* `feature`: Features + * نئی features، ایسی چیزوں کی سہولت شامل کرنا جو پہلے موجود نہیں تھیں۔ +* `bug`: Fixes + * کوئی چیز جو supported تھی وہ کام نہیں کر رہی تھی، اور یہ اسے ٹھیک کرتا ہے۔ +* `refactor`: Refactors + * یہ عام طور پر اندرونی code میں تبدیلیوں کے لیے ہے جو رویے کو نہیں بدلتیں۔ +* `upgrade`: Upgrades + * یہ project سے براہ راست dependencies کے upgrades کے لیے ہے۔ +* `docs`: Docs + * Docs میں تبدیلیاں۔ اس میں تراجم کی تبدیلیاں شامل نہیں ہیں۔ +* `lang-all`: Translations + * تراجم کے لیے استعمال کریں۔ +* `internal`: Internal + * ایسی تبدیلیوں کے لیے استعمال کریں جو صرف repo management کو متاثر کرتی ہیں۔ + +/// tip | مشورہ + +Dependabot جیسے tools کچھ labels شامل کریں گے، جیسے `dependencies`، لیکن یاد رکھیں کہ یہ label `latest-changes` GitHub Action استعمال نہیں کرتی، تو release notes میں استعمال نہیں ہوگا۔ براہ کرم یقینی بنائیں کہ اوپر والے labels میں سے ایک شامل ہو۔ + +/// + +## ترجمے کی PRs میں Labels شامل کریں + +جب ترجمے کی PR ہو، `lang-all` label کے علاوہ، زبان کے لیے بھی label شامل کریں۔ + +ہر زبان کے لیے زبان code کا استعمال کرتے ہوئے ایک label ہوگا، جیسے `lang-{lang code}`، مثلاً ہسپانوی کے لیے `lang-es`، فرانسیسی کے لیے `lang-fr` وغیرہ۔ + +* مخصوص زبان کا label شامل کریں۔ +* `awaiting-review` label شامل کریں۔ + +`awaiting-review` label خاص ہے، صرف تراجم کے لیے۔ ایک GitHub Action اسے detect کرے گا، پھر زبان کا label پڑھے گا، اور اس زبان کے تراجم manage کرنے والی GitHub Discussions کو اپڈیٹ کرے گا تاکہ لوگوں کو بتایا جائے کہ review کے لیے نیا ترجمہ ہے۔ + +جب کوئی مقامی بولنے والا آئے، PR کا review کرے، اور اسے منظور کرے، GitHub Action آ کر `awaiting-review` label ہٹائے گا، اور `approved-1` label شامل کرے گا۔ + +اس طرح، ہم نوٹ کر سکتے ہیں جب نئے تراجم تیار ہوں، کیونکہ ان کے پاس `approved-1` label ہوتا ہے۔ + +## ترجمے کی PRs Merge کریں + +تراجم LLMs اور scripts سے خودکار طور پر generate کیے جاتے ہیں۔ + +ایک GitHub Action ہے جو کسی زبان کے تراجم شامل یا اپڈیٹ کرنے کے لیے دستی طور پر چلایا جا سکتا ہے: [`translate.yml`](https://github.com/fastapi/fastapi/actions/workflows/translate.yml)۔ + +ان زبان کے ترجمے کی PRs کے لیے، تصدیق کریں کہ: + +* PR خودکار تھا (@tiangolo کی طرف سے)، کسی اور صارف نے نہیں بنایا۔ +* اس میں `lang-all` اور `lang-{lang code}` labels ہیں۔ +* اگر PR کم از کم ایک مقامی بولنے والے نے منظور کیا ہو، آپ اسے merge کر سکتے ہیں۔ + +## PRs کا Review کریں + +* اگر PR نہیں بتاتی کہ یہ کیا کرتی ہے یا کیوں، اگر ایسا لگے کہ مفید ہو سکتی ہے، مزید معلومات مانگیں۔ ورنہ، آزادانہ طور پر اسے بند کر دیں۔ + +* اگر PR spam لگے، بے معنی لگے، صرف اعداد و شمار تبدیل کرنے کے لیے ("contributor" ظاہر ہونے کے لیے) یا اسی طرح، آپ اسے `invalid` نشان زد کر سکتے ہیں، اور یہ خودکار طور پر بند ہو جائے گی۔ + +* اگر PR AI سے generate شدہ لگتی ہے، اور ایسا لگے کہ اس کا review کرنا prompt لکھنے سے زیادہ وقت لے گا، اسے `maybe-ai` نشان زد کریں، اور یہ خودکار طور پر بند ہو جائے گی۔ + +* PR کا کوئی مخصوص use case ہونا چاہیے جو یہ حل کر رہی ہو۔ + +* اگر PR feature کے لیے ہے تو اس میں docs ہونے چاہئیں۔ + * جب تک یہ ایسی feature نہ ہو جسے ہم حوصلہ شکنی کرنا چاہتے ہیں۔ +* Docs میں source مثالی فائل شامل ہونی چاہیے، براہ راست Markdown میں Python نہیں لکھنا چاہیے۔ +* اگر source مثال فائل(فائلوں) کے مختلف Python ورژنز کے لیے مختلف syntax ہو سکتے ہیں، تو فائل کے مختلف ورژنز ہونے چاہئیں، اور docs میں tabs میں دکھائے جانے چاہئیں۔ +* Source مثال ٹیسٹ کرنے والے tests ہونے چاہئیں۔ +* PR لاگو کرنے سے پہلے، نئے tests fail ہونے چاہئیں۔ +* PR لاگو کرنے کے بعد، نئے tests pass ہونے چاہئیں۔ +* Coverage 100% رہنا چاہیے۔ +* اگر آپ دیکھیں کہ PR درست ہے، یا ہم نے بحث کی اور فیصلہ کیا کہ اسے قبول کیا جائے، آپ PR کے اوپر commits شامل کر سکتے ہیں اسے بہتر بنانے، docs شامل کرنے، tests، فارمیٹ کرنے، refactor کرنے، اضافی فائلیں ہٹانے وغیرہ کے لیے۔ +* PR میں تبصرہ کرنے کے لیے آزاد محسوس کریں مزید معلومات مانگنے، تبدیلیاں تجویز کرنے وغیرہ کے لیے۔ +* جب آپ سمجھیں کہ PR تیار ہے، اسے اندرونی GitHub project میں میرے review کے لیے منتقل کریں۔ + +## FastAPI People PRs + +ہر مہینے، ایک GitHub Action FastAPI People data اپڈیٹ کرتی ہے۔ وہ PRs اس طرح نظر آتی ہیں: [👥 Update FastAPI People](https://github.com/fastapi/fastapi/pull/11669)۔ + +اگر tests pass ہو رہے ہوں، آپ اسے فوراً merge کر سکتے ہیں۔ + +## Dependabot PRs + +Dependabot مختلف چیزوں کے لیے dependencies اپڈیٹ کرنے کی PRs بنائے گا، اور وہ PRs ملتی جلتی نظر آتی ہیں، لیکن کچھ دوسروں سے بہت زیادہ نازک ہوتی ہیں۔ + +* اگر PR براہ راست dependency کے لیے ہو، تو Dependabot بنیادی dependencies میں `pyproject.toml` تبدیل کر رہا ہے، **اسے merge نہ کریں**۔ 😱 مجھے پہلے چیک کرنے دیں۔ +* اگر PR اندرونی dependencies میں سے کسی کو اپڈیٹ کرتی ہے، مثلاً `pyproject.toml` میں `dev` group، یا GitHub Action ورژنز، اگر tests pass ہو رہے ہیں، release notes (PR میں خلاصے میں دکھائی جاتی ہیں) میں کوئی واضح ممکنہ breaking change نظر نہیں آتی، آپ اسے merge کر سکتے ہیں۔ 😎 + +## GitHub Discussions جوابات نشان زد کریں + +جب GitHub Discussions میں کسی سوال کا جواب دیا گیا ہو، "Mark as answer" پر کلک کرکے جواب نشان زد کریں۔ + +آپ discussions کو [`Questions` جو `Unanswered` ہیں](https://github.com/tiangolo/fastapi/discussions/categories/questions?discussions_q=category:Questions+is:open+is:unanswered) سے فلٹر کر سکتے ہیں۔ diff --git a/docs/ur/docs/management.md b/docs/ur/docs/management.md new file mode 100644 index 000000000..e1272ea96 --- /dev/null +++ b/docs/ur/docs/management.md @@ -0,0 +1,39 @@ +# Repository Management + +یہاں FastAPI repository کی انتظامیہ اور دیکھ بھال کی مختصر تفصیل ہے۔ + +## مالک + +میں، [@tiangolo](https://github.com/tiangolo)، FastAPI repository کا بانی اور مالک ہوں۔ 🤓 + +میں عام طور پر ہر PR کو merge کرنے سے پہلے حتمی review دیتا ہوں۔ میں project کے حتمی فیصلے کرتا ہوں، میں [BDFL](https://en.wikipedia.org/wiki/Benevolent_dictator_for_life) ہوں۔ 😅 + +## ٹیم + +لوگوں کی ایک ٹیم ہے جو project کو manage اور برقرار رکھنے میں مدد کرتی ہے۔ 😎 + +ان کی اجازتوں اور [مخصوص ہدایات](./management-tasks.md) کی مختلف سطحیں ہیں۔ + +وہ جو کام انجام دے سکتے ہیں ان میں سے کچھ یہ ہیں: + +* PRs میں labels شامل کرنا۔ +* PR titles ترمیم کرنا۔ +* PRs کے اوپر commits شامل کرنا تاکہ انہیں بہتر بنایا جا سکے۔ +* GitHub Discussions سوالات میں جوابات نشان زد کرنا، وغیرہ۔ +* PRs کی مخصوص اقسام merge کرنا۔ + +آپ موجودہ ٹیم ممبران [FastAPI کے لوگ - ٹیم](./fastapi-people.md#team) میں دیکھ سکتے ہیں۔ + +ٹیم میں شمولیت صرف دعوت نامے سے ہے، اور میں اجازتیں، ہدایات، یا رکنیت اپڈیٹ یا ہٹا سکتا ہوں۔ + +## FastAPI Experts + +وہ لوگ جو GitHub Discussions میں سب سے زیادہ دوسروں کی مدد کرتے ہیں [**FastAPI Experts**](./fastapi-people.md#fastapi-experts) بن سکتے ہیں۔ + +یہ عام طور پر project میں تعاون کا بہترین طریقہ ہے۔ + +## بیرونی تعاون + +بیرونی تعاون کا بہت خیرمقدم ہے اور اس کی قدر کی جاتی ہے، بشمول سوالات کے جوابات دینا، PRs جمع کرنا وغیرہ۔ 🙇‍♂️ + +[FastAPI کو برقرار رکھنے میں مدد](./help-fastapi.md#help-maintain-fastapi) کرنے کے بہت سے طریقے ہیں۔ diff --git a/docs/ur/docs/newsletter.md b/docs/ur/docs/newsletter.md new file mode 100644 index 000000000..5e03d177d --- /dev/null +++ b/docs/ur/docs/newsletter.md @@ -0,0 +1,5 @@ +# FastAPI اور دوستوں کا newsletter + + + + diff --git a/docs/ur/docs/project-generation.md b/docs/ur/docs/project-generation.md new file mode 100644 index 000000000..cda678160 --- /dev/null +++ b/docs/ur/docs/project-generation.md @@ -0,0 +1,28 @@ +# Full Stack FastAPI Template { #full-stack-fastapi-template } + +Templates عام طور پر ایک مخصوص setup کے ساتھ آتے ہیں، لیکن یہ لچکدار اور حسب ضرورت بنانے کے قابل ہونے کے لیے ڈیزائن کیے گئے ہیں۔ اس سے آپ انہیں اپنے project کی ضروریات کے مطابق تبدیل اور ڈھال سکتے ہیں، جو انہیں ایک بہترین نقطہ آغاز بناتا ہے۔ 🏁 + +آپ شروع کرنے کے لیے یہ template استعمال کر سکتے ہیں، کیونکہ اس میں ابتدائی setup، security، database اور کچھ API endpoints پہلے سے آپ کے لیے بنے ہوئے ہیں۔ + +GitHub Repository: [Full Stack FastAPI Template](https://github.com/tiangolo/full-stack-fastapi-template) + +## Full Stack FastAPI Template - Technology Stack اور Features { #full-stack-fastapi-template-technology-stack-and-features } + +- ⚡ [**FastAPI**](https://fastapi.tiangolo.com) Python backend API کے لیے۔ + - 🧰 [SQLModel](https://sqlmodel.tiangolo.com) Python SQL database interactions (ORM) کے لیے۔ + - 🔍 [Pydantic](https://docs.pydantic.dev)، FastAPI کے ذریعے استعمال شدہ، data validation اور settings management کے لیے۔ + - 💾 [PostgreSQL](https://www.postgresql.org) بطور SQL database۔ +- 🚀 [React](https://react.dev) frontend کے لیے۔ + - 💃 TypeScript، hooks، Vite، اور جدید frontend stack کے دوسرے حصے استعمال کرتے ہوئے۔ + - 🎨 [Tailwind CSS](https://tailwindcss.com) اور [shadcn/ui](https://ui.shadcn.com) frontend components کے لیے۔ + - 🤖 خودکار طور پر generate شدہ frontend client۔ + - 🧪 [Playwright](https://playwright.dev) End-to-End testing کے لیے۔ + - 🦇 Dark mode support۔ +- 🐋 [Docker Compose](https://www.docker.com) development اور production کے لیے۔ +- 🔒 بطور default محفوظ password hashing۔ +- 🔑 JWT (JSON Web Token) authentication۔ +- 📫 Email پر مبنی password recovery۔ +- ✅ [Pytest](https://pytest.org) کے ساتھ Tests۔ +- 📞 [Traefik](https://traefik.io) بطور reverse proxy / load balancer۔ +- 🚢 Docker Compose استعمال کرتے ہوئے deployment ہدایات، بشمول خودکار HTTPS certificates سنبھالنے کے لیے frontend Traefik proxy سیٹ اپ کرنے کا طریقہ۔ +- 🏭 GitHub Actions پر مبنی CI (continuous integration) اور CD (continuous deployment)۔ diff --git a/docs/ur/docs/python-types.md b/docs/ur/docs/python-types.md new file mode 100644 index 000000000..c4927585c --- /dev/null +++ b/docs/ur/docs/python-types.md @@ -0,0 +1,348 @@ +# Python Types کا تعارف { #python-types-intro } + +Python میں اختیاری "type hints" (جنہیں "type annotations" بھی کہا جاتا ہے) کی سپورٹ موجود ہے۔ + +یہ **"type hints"** یا annotations ایک خاص syntax ہیں جو کسی variable کی type بیان کرنے کی اجازت دیتے ہیں۔ + +اپنے variables کے لیے types بیان کر کے، ایڈیٹرز اور ٹولز آپ کو بہتر سپورٹ فراہم کر سکتے ہیں۔ + +یہ صرف Python type hints کے بارے میں ایک **فوری tutorial / جائزہ** ہے۔ یہ صرف اتنا کم سے کم احاطہ کرتا ہے جتنا **FastAPI** کے ساتھ استعمال کے لیے ضروری ہے... جو دراصل بہت تھوڑا ہے۔ + +**FastAPI** مکمل طور پر ان type hints پر مبنی ہے، یہ اسے بہت سے فوائد اور فائدے دیتے ہیں۔ + +لیکن اگر آپ کبھی بھی **FastAPI** استعمال نہ کریں، تب بھی ان کے بارے میں تھوڑا سیکھنا آپ کے لیے فائدہ مند ہوگا۔ + +/// note | نوٹ + +اگر آپ Python کے ماہر ہیں، اور آپ type hints کے بارے میں پہلے سے سب کچھ جانتے ہیں، تو اگلے باب پر جائیں۔ + +/// + +## مقصد { #motivation } + +آئیے ایک سادہ مثال سے شروع کرتے ہیں: + +{* ../../docs_src/python_types/tutorial001_py310.py *} + +اس پروگرام کو چلانے سے یہ نتیجہ آتا ہے: + +``` +John Doe +``` + +function یہ کرتا ہے: + +* ایک `first_name` اور `last_name` لیتا ہے۔ +* ہر ایک کے پہلے حرف کو `title()` کے ساتھ بڑے حرف میں تبدیل کرتا ہے۔ +* درمیان میں خالی جگہ کے ساتھ انہیں جوڑتا ہے۔ + +{* ../../docs_src/python_types/tutorial001_py310.py hl[2] *} + +### اس میں ترمیم کریں { #edit-it } + +یہ ایک بہت سادہ پروگرام ہے۔ + +لیکن اب تصور کریں کہ آپ اسے شروع سے لکھ رہے تھے۔ + +کسی وقت آپ نے function کی تعریف شروع کی ہوگی، parameters تیار تھے... + +لیکن پھر آپ کو "وہ method کال کرنا ہے جو پہلے حرف کو بڑے حرف میں تبدیل کرتا ہے"۔ + +کیا وہ `upper` تھا؟ `uppercase`؟ `first_uppercase`؟ `capitalize`؟ + +پھر، آپ پرانے پروگرامر کے دوست، ایڈیٹر autocompletion سے مدد لیتے ہیں۔ + +آپ function کا پہلا parameter `first_name` ٹائپ کرتے ہیں، پھر ایک ڈاٹ (`.`) اور پھر `Ctrl+Space` دبا کر completion شروع کرتے ہیں۔ + +لیکن، افسوس، آپ کو کچھ مفید نہیں ملتا: + + + +### Types شامل کریں { #add-types } + +آئیے پچھلے ورژن کی ایک لائن تبدیل کرتے ہیں۔ + +ہم بالکل یہ حصہ تبدیل کریں گے، function کے parameters، اس سے: + +```Python + first_name, last_name +``` + +اس میں: + +```Python + first_name: str, last_name: str +``` + +بس اتنا ہی۔ + +یہ ہیں "type hints": + +{* ../../docs_src/python_types/tutorial002_py310.py hl[1] *} + +یہ وہی نہیں ہے جو default values بیان کرنا ہوتا جیسے: + +```Python + first_name="john", last_name="doe" +``` + +یہ ایک الگ چیز ہے۔ + +ہم colons (`:`) استعمال کر رہے ہیں، نہ کہ equals (`=`)۔ + +اور type hints شامل کرنے سے عام طور پر وہ نہیں بدلتا جو ان کے بغیر ہوتا۔ + +لیکن اب، تصور کریں کہ آپ پھر سے وہ function بنا رہے ہیں، لیکن type hints کے ساتھ۔ + +اسی مقام پر، آپ `Ctrl+Space` سے autocomplete شروع کرتے ہیں اور آپ دیکھتے ہیں: + + + +اس کے ساتھ، آپ سکرول کر سکتے ہیں، اختیارات دیکھتے ہوئے، جب تک وہ نہ ملے جو "یاد آتا ہے": + + + +## مزید مقصد { #more-motivation } + +یہ function دیکھیں، اس میں پہلے سے type hints ہیں: + +{* ../../docs_src/python_types/tutorial003_py310.py hl[1] *} + +کیونکہ ایڈیٹر variables کی types جانتا ہے، آپ کو صرف completion ہی نہیں ملتی، بلکہ error checks بھی ملتی ہیں: + + + +اب آپ جانتے ہیں کہ آپ کو اسے ٹھیک کرنا ہے، `age` کو `str(age)` سے string میں تبدیل کرنا ہے: + +{* ../../docs_src/python_types/tutorial004_py310.py hl[2] *} + +## Types بیان کرنا { #declaring-types } + +آپ نے ابھی type hints بیان کرنے کی اصل جگہ دیکھی۔ Function parameters کے طور پر۔ + +یہ وہ اصل جگہ بھی ہے جہاں آپ انہیں **FastAPI** کے ساتھ استعمال کریں گے۔ + +### سادہ types { #simple-types } + +آپ تمام معیاری Python types بیان کر سکتے ہیں، نہ صرف `str`۔ + +آپ استعمال کر سکتے ہیں، مثال کے طور پر: + +* `int` +* `float` +* `bool` +* `bytes` + +{* ../../docs_src/python_types/tutorial005_py310.py hl[1] *} + +### `typing` module { #typing-module } + +کچھ اضافی استعمال کے معاملات کے لیے، آپ کو معیاری لائبریری `typing` module سے کچھ چیزیں import کرنی پڑ سکتی ہیں، مثال کے طور پر جب آپ بیان کرنا چاہیں کہ کسی چیز کی "کوئی بھی type" ہے، تو آپ `typing` سے `Any` استعمال کر سکتے ہیں: + +```python +from typing import Any + + +def some_function(data: Any): + print(data) +``` + +### Generic types { #generic-types } + +کچھ types اپنے اندرونی types بیان کرنے کے لیے مربع بریکٹس میں "type parameters" لے سکتی ہیں، مثال کے طور پر "strings کی list" کو `list[str]` لکھا جائے گا۔ + +وہ types جو type parameters لے سکتی ہیں، انہیں **Generic types** یا **Generics** کہا جاتا ہے۔ + +آپ وہی بلٹ ان types بطور generics استعمال کر سکتے ہیں (مربع بریکٹس اور اندر types کے ساتھ): + +* `list` +* `tuple` +* `set` +* `dict` + +#### List { #list } + +مثال کے طور پر، آئیے ایک variable کو `str` کی `list` کے طور پر بیان کرتے ہیں۔ + +اسی colon (`:`) syntax کے ساتھ variable بیان کریں۔ + +Type کے طور پر `list` رکھیں۔ + +چونکہ list ایک ایسی type ہے جس میں کچھ اندرونی types ہیں، آپ انہیں مربع بریکٹس میں رکھتے ہیں: + +{* ../../docs_src/python_types/tutorial006_py310.py hl[1] *} + +/// info | معلومات + +مربع بریکٹس میں وہ اندرونی types "type parameters" کہلاتی ہیں۔ + +اس صورت میں، `str` وہ type parameter ہے جو `list` کو دیا گیا ہے۔ + +/// + +اس کا مطلب ہے: "variable `items` ایک `list` ہے، اور اس list کا ہر آئٹم ایک `str` ہے"۔ + +ایسا کرنے سے، آپ کا ایڈیٹر list سے آئٹمز پر عمل کرتے ہوئے بھی سپورٹ فراہم کر سکتا ہے: + + + +Types کے بغیر، یہ تقریباً ناممکن ہے۔ + +غور کریں کہ variable `item` list `items` کے عناصر میں سے ایک ہے۔ + +اور پھر بھی، ایڈیٹر جانتا ہے کہ یہ ایک `str` ہے، اور اس کے لیے سپورٹ فراہم کرتا ہے۔ + +#### Tuple اور Set { #tuple-and-set } + +`tuple` اور `set` بیان کرنے کے لیے بھی آپ ایسا ہی کریں گے: + +{* ../../docs_src/python_types/tutorial007_py310.py hl[1] *} + +اس کا مطلب ہے: + +* Variable `items_t` ایک `tuple` ہے جس میں 3 آئٹمز ہیں، ایک `int`، ایک اور `int`، اور ایک `str`۔ +* Variable `items_s` ایک `set` ہے، اور اس کا ہر آئٹم `bytes` type کا ہے۔ + +#### Dict { #dict } + +`dict` بیان کرنے کے لیے، آپ کوما سے الگ کر کے 2 type parameters دیتے ہیں۔ + +پہلا type parameter `dict` کی keys کے لیے ہے۔ + +دوسرا type parameter `dict` کی values کے لیے ہے: + +{* ../../docs_src/python_types/tutorial008_py310.py hl[1] *} + +اس کا مطلب ہے: + +* Variable `prices` ایک `dict` ہے: + * اس `dict` کی keys `str` type کی ہیں (فرض کریں، ہر آئٹم کا نام)۔ + * اس `dict` کی values `float` type کی ہیں (فرض کریں، ہر آئٹم کی قیمت)۔ + +#### Union { #union } + +آپ بیان کر سکتے ہیں کہ ایک variable **کئی types** میں سے کوئی بھی ہو سکتا ہے، مثال کے طور پر، ایک `int` یا ایک `str`۔ + +اسے بیان کرنے کے لیے آپ دونوں types کو الگ کرنے کے لیے عمودی بار (`|`) استعمال کرتے ہیں۔ + +اسے "union" کہا جاتا ہے، کیونکہ variable ان دو types کے مجموعے میں سے کچھ بھی ہو سکتا ہے۔ + +```Python hl_lines="1" +{!> ../../docs_src/python_types/tutorial008b_py310.py!} +``` + +اس کا مطلب ہے کہ `item` ایک `int` یا ایک `str` ہو سکتا ہے۔ + +#### ممکنہ طور پر `None` { #possibly-none } + +آپ بیان کر سکتے ہیں کہ کسی value کی type ہو سکتی ہے، جیسے `str`، لیکن یہ `None` بھی ہو سکتی ہے۔ + +//// tab | Python 3.10+ + +```Python hl_lines="1" +{!> ../../docs_src/python_types/tutorial009_py310.py!} +``` + +//// + +صرف `str` کے بجائے `str | None` استعمال کرنے سے ایڈیٹر آپ کو ان غلطیوں کا پتہ لگانے میں مدد کر سکے گا جہاں آپ فرض کر رہے ہوں کہ کوئی value ہمیشہ `str` ہے، جبکہ یہ دراصل `None` بھی ہو سکتی ہے۔ + +### بطور types Classes { #classes-as-types } + +آپ کسی class کو بھی variable کی type کے طور پر بیان کر سکتے ہیں۔ + +فرض کریں آپ کے پاس ایک `Person` class ہے، جس میں ایک name ہے: + +{* ../../docs_src/python_types/tutorial010_py310.py hl[1:3] *} + +پھر آپ ایک variable کو `Person` type کا بیان کر سکتے ہیں: + +{* ../../docs_src/python_types/tutorial010_py310.py hl[6] *} + +اور پھر، آپ کو دوبارہ تمام ایڈیٹر سپورٹ ملتی ہے: + + + +غور کریں کہ اس کا مطلب ہے "`one_person` class `Person` کی ایک **instance** ہے"۔ + +اس کا مطلب یہ نہیں کہ "`one_person` وہ **class** ہے جو `Person` کہلاتی ہے"۔ + +## Pydantic models { #pydantic-models } + +[Pydantic](https://docs.pydantic.dev/) data validation کے لیے ایک Python لائبریری ہے۔ + +آپ ڈیٹا کی "شکل" attributes والی classes کے طور پر بیان کرتے ہیں۔ + +اور ہر attribute کی ایک type ہوتی ہے۔ + +پھر آپ کچھ values کے ساتھ اس class کی ایک instance بناتے ہیں اور یہ values کی توثیق کرے گا، انہیں مناسب type میں تبدیل کرے گا (اگر ایسا ہو) اور آپ کو تمام ڈیٹا کے ساتھ ایک object دے گا۔ + +اور آپ کو اس نتیجے میں ملنے والی object کے ساتھ تمام ایڈیٹر سپورٹ ملتی ہے۔ + +سرکاری Pydantic دستاویزات سے ایک مثال: + +{* ../../docs_src/python_types/tutorial011_py310.py *} + +/// info | معلومات + +[Pydantic کے بارے میں مزید جاننے کے لیے، اس کی دستاویزات دیکھیں](https://docs.pydantic.dev/)۔ + +/// + +**FastAPI** مکمل طور پر Pydantic پر مبنی ہے۔ + +آپ [Tutorial - User Guide](tutorial/index.md) میں عملی طور پر یہ سب بہت زیادہ دیکھیں گے۔ + +## Metadata Annotations کے ساتھ Type Hints { #type-hints-with-metadata-annotations } + +Python میں ایک خصوصیت بھی ہے جو `Annotated` استعمال کر کے ان type hints میں **اضافی metadata** رکھنے کی اجازت دیتی ہے۔ + +آپ `typing` سے `Annotated` import کر سکتے ہیں۔ + +{* ../../docs_src/python_types/tutorial013_py310.py hl[1,4] *} + +Python خود اس `Annotated` کے ساتھ کچھ نہیں کرتا۔ اور ایڈیٹرز اور دیگر ٹولز کے لیے، type ابھی بھی `str` ہے۔ + +لیکن آپ `Annotated` میں اس جگہ کو **FastAPI** کو اضافی metadata فراہم کرنے کے لیے استعمال کر سکتے ہیں کہ آپ اپنی ایپلیکیشن کو کیسے چلانا چاہتے ہیں۔ + +یاد رکھنے کی اہم بات یہ ہے کہ `Annotated` کو دیا جانے والا **پہلا *type parameter*** ہی **اصل type** ہے۔ باقی سب دوسرے ٹولز کے لیے صرف metadata ہے۔ + +ابھی کے لیے، آپ کو بس یہ جاننا ہے کہ `Annotated` موجود ہے، اور یہ معیاری Python ہے۔ 😎 + +بعد میں آپ دیکھیں گے کہ یہ کتنا **طاقتور** ہو سکتا ہے۔ + +/// tip | مشورہ + +یہ حقیقت کہ یہ **معیاری Python** ہے اس کا مطلب ہے کہ آپ کو اپنے ایڈیٹر میں ابھی بھی **بہترین ممکنہ ڈویلپر تجربہ** ملے گا، ان ٹولز کے ساتھ جو آپ code کا تجزیہ اور refactor کرنے کے لیے استعمال کرتے ہیں، وغیرہ۔ ✨ + +اور یہ بھی کہ آپ کا code بہت سے دیگر Python ٹولز اور لائبریریز کے ساتھ بہت ہم آہنگ ہوگا۔ 🚀 + +/// + +## **FastAPI** میں Type hints { #type-hints-in-fastapi } + +**FastAPI** ان type hints کا فائدہ اٹھاتا ہے کئی کام کرنے کے لیے۔ + +**FastAPI** کے ساتھ آپ type hints کے ساتھ parameters بیان کرتے ہیں اور آپ کو ملتا ہے: + +* **ایڈیٹر سپورٹ**۔ +* **Type checks**۔ + +...اور **FastAPI** انہی اعلانات کو استعمال کرتا ہے: + +* **ضروریات بیان کرنے** کے لیے: request path parameters، query parameters، headers، bodies، dependencies وغیرہ سے۔ +* **ڈیٹا تبدیل کرنے** کے لیے: request سے مطلوبہ type میں۔ +* **ڈیٹا کی توثیق** کے لیے: ہر request سے آنے والے: + * ڈیٹا غلط ہونے پر client کو واپس بھیجی جانے والی **خودکار غلطیاں** بنانا۔ +* OpenAPI استعمال کرتے ہوئے API کی **دستاویزات** بنانا: + * جو پھر خودکار تعاملی دستاویزات کے یوزر انٹرفیسز استعمال کرتی ہیں۔ + +یہ سب خلاصہ لگ سکتا ہے۔ فکر نہ کریں۔ آپ [Tutorial - User Guide](tutorial/index.md) میں یہ سب عمل میں دیکھیں گے۔ + +اہم بات یہ ہے کہ معیاری Python types استعمال کر کے، ایک ہی جگہ پر (مزید classes، decorators وغیرہ شامل کرنے کے بجائے)، **FastAPI** آپ کا بہت سا کام خود کر لے گا۔ + +/// info | معلومات + +اگر آپ پورا tutorial پڑھ چکے ہیں اور types کے بارے میں مزید جاننے واپس آئے ہیں، تو ایک اچھا ذریعہ [`mypy` کی "cheat sheet"](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html) ہے۔ + +/// diff --git a/docs/ur/docs/reference/apirouter.md b/docs/ur/docs/reference/apirouter.md new file mode 100644 index 000000000..4911830a9 --- /dev/null +++ b/docs/ur/docs/reference/apirouter.md @@ -0,0 +1,24 @@ +# `APIRouter` class + +یہاں `APIRouter` class کی حوالہ جاتی معلومات ہیں، اس کے تمام parameters، attributes اور methods کے ساتھ۔ + +آپ `APIRouter` class کو براہ راست `fastapi` سے import کر سکتے ہیں: + +```python +from fastapi import APIRouter +``` + +::: fastapi.APIRouter + options: + members: + - websocket + - include_router + - get + - put + - post + - delete + - options + - head + - patch + - trace + - on_event diff --git a/docs/ur/docs/reference/background.md b/docs/ur/docs/reference/background.md new file mode 100644 index 000000000..9700e7505 --- /dev/null +++ b/docs/ur/docs/reference/background.md @@ -0,0 +1,11 @@ +# Background Tasks - `BackgroundTasks` + +آپ *path operation function* یا dependency function میں `BackgroundTasks` type کا parameter declare کر سکتے ہیں، اور پھر اسے response بھیجنے کے بعد background tasks کے عمل کو schedule کرنے کے لیے استعمال کر سکتے ہیں۔ + +آپ اسے براہ راست `fastapi` سے import کر سکتے ہیں: + +```python +from fastapi import BackgroundTasks +``` + +::: fastapi.BackgroundTasks diff --git a/docs/ur/docs/reference/dependencies.md b/docs/ur/docs/reference/dependencies.md new file mode 100644 index 000000000..55eeefd5b --- /dev/null +++ b/docs/ur/docs/reference/dependencies.md @@ -0,0 +1,29 @@ +# Dependencies - `Depends()` اور `Security()` + +## `Depends()` + +Dependencies کو بنیادی طور پر خاص function `Depends()` کے ذریعے سنبھالا جاتا ہے جو ایک callable لیتا ہے۔ + +یہاں اس کی اور اس کے parameters کی حوالہ جاتی معلومات ہیں۔ + +آپ اسے براہ راست `fastapi` سے import کر سکتے ہیں: + +```python +from fastapi import Depends +``` + +::: fastapi.Depends + +## `Security()` + +بہت سے منظرناموں میں، آپ `Depends()` استعمال کر کے dependencies کے ذریعے security (authorization، authentication، وغیرہ) کو سنبھال سکتے ہیں۔ + +لیکن جب آپ OAuth2 scopes بھی declare کرنا چاہیں، تو آپ `Depends()` کی بجائے `Security()` استعمال کر سکتے ہیں۔ + +آپ `Security()` کو براہ راست `fastapi` سے import کر سکتے ہیں: + +```python +from fastapi import Security +``` + +::: fastapi.Security diff --git a/docs/ur/docs/reference/encoders.md b/docs/ur/docs/reference/encoders.md new file mode 100644 index 000000000..28df2e43a --- /dev/null +++ b/docs/ur/docs/reference/encoders.md @@ -0,0 +1,3 @@ +# Encoders - `jsonable_encoder` + +::: fastapi.encoders.jsonable_encoder diff --git a/docs/ur/docs/reference/exceptions.md b/docs/ur/docs/reference/exceptions.md new file mode 100644 index 000000000..afa153d64 --- /dev/null +++ b/docs/ur/docs/reference/exceptions.md @@ -0,0 +1,20 @@ +# Exceptions - `HTTPException` اور `WebSocketException` + +یہ وہ exceptions ہیں جو آپ client کو غلطیاں دکھانے کے لیے raise کر سکتے ہیں۔ + +جب آپ کوئی exception raise کرتے ہیں، جیسا کہ عام Python میں ہوتا ہے، باقی کا عمل روک دیا جاتا ہے۔ اس طرح آپ code میں کہیں سے بھی یہ exceptions raise کر کے request کو روک سکتے ہیں اور client کو غلطی دکھا سکتے ہیں۔ + +آپ یہ استعمال کر سکتے ہیں: + +* `HTTPException` +* `WebSocketException` + +یہ exceptions براہ راست `fastapi` سے import کی جا سکتی ہیں: + +```python +from fastapi import HTTPException, WebSocketException +``` + +::: fastapi.HTTPException + +::: fastapi.WebSocketException diff --git a/docs/ur/docs/reference/fastapi.md b/docs/ur/docs/reference/fastapi.md new file mode 100644 index 000000000..63a7c1a8a --- /dev/null +++ b/docs/ur/docs/reference/fastapi.md @@ -0,0 +1,31 @@ +# `FastAPI` class + +یہاں `FastAPI` class کی حوالہ جاتی معلومات ہیں، اس کے تمام parameters، attributes اور methods کے ساتھ۔ + +آپ `FastAPI` class کو براہ راست `fastapi` سے import کر سکتے ہیں: + +```python +from fastapi import FastAPI +``` + +::: fastapi.FastAPI + options: + members: + - openapi_version + - webhooks + - state + - dependency_overrides + - openapi + - websocket + - include_router + - get + - put + - post + - delete + - options + - head + - patch + - trace + - on_event + - middleware + - exception_handler diff --git a/docs/ur/docs/reference/httpconnection.md b/docs/ur/docs/reference/httpconnection.md new file mode 100644 index 000000000..17bf6db4e --- /dev/null +++ b/docs/ur/docs/reference/httpconnection.md @@ -0,0 +1,11 @@ +# `HTTPConnection` class + +جب آپ ایسی dependencies define کرنا چاہیں جو HTTP اور WebSockets دونوں کے ساتھ مطابقت رکھتی ہوں، تو آپ `Request` یا `WebSocket` کی بجائے `HTTPConnection` لینے والا parameter define کر سکتے ہیں۔ + +آپ اسے `fastapi.requests` سے import کر سکتے ہیں: + +```python +from fastapi.requests import HTTPConnection +``` + +::: fastapi.requests.HTTPConnection diff --git a/docs/ur/docs/reference/index.md b/docs/ur/docs/reference/index.md new file mode 100644 index 000000000..76f455183 --- /dev/null +++ b/docs/ur/docs/reference/index.md @@ -0,0 +1,6 @@ +# حوالہ جات + +یہاں حوالہ جات یا code API موجود ہے، جس میں classes، functions، parameters، attributes، اور FastAPI کے تمام وہ حصے شامل ہیں جو آپ اپنی applications میں استعمال کر سکتے ہیں۔ + +اگر آپ **FastAPI سیکھنا** چاہتے ہیں تو آپ کے لیے +[FastAPI ٹیوٹوریل](https://fastapi.tiangolo.com/tutorial/) پڑھنا زیادہ بہتر ہوگا۔ diff --git a/docs/ur/docs/reference/middleware.md b/docs/ur/docs/reference/middleware.md new file mode 100644 index 000000000..9d8a703e9 --- /dev/null +++ b/docs/ur/docs/reference/middleware.md @@ -0,0 +1,37 @@ +# Middleware + +Starlette کی طرف سے براہ راست فراہم کردہ کئی middlewares دستیاب ہیں۔ + +ان کے بارے میں مزید پڑھیں [FastAPI دستاویزات میں Middleware](https://fastapi.tiangolo.com/advanced/middleware/)۔ + +::: fastapi.middleware.cors.CORSMiddleware + +اسے `fastapi` سے import کیا جا سکتا ہے: + +```python +from fastapi.middleware.cors import CORSMiddleware +``` + +::: fastapi.middleware.gzip.GZipMiddleware + +اسے `fastapi` سے import کیا جا سکتا ہے: + +```python +from fastapi.middleware.gzip import GZipMiddleware +``` + +::: fastapi.middleware.httpsredirect.HTTPSRedirectMiddleware + +اسے `fastapi` سے import کیا جا سکتا ہے: + +```python +from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware +``` + +::: fastapi.middleware.trustedhost.TrustedHostMiddleware + +اسے `fastapi` سے import کیا جا سکتا ہے: + +```python +from fastapi.middleware.trustedhost import TrustedHostMiddleware +``` diff --git a/docs/ur/docs/reference/openapi/docs.md b/docs/ur/docs/reference/openapi/docs.md new file mode 100644 index 000000000..7adf91912 --- /dev/null +++ b/docs/ur/docs/reference/openapi/docs.md @@ -0,0 +1,11 @@ +# OpenAPI `docs` + +OpenAPI خودکار UI دستاویزات کو سنبھالنے کے لیے utilities، بشمول Swagger UI (بطور ڈیفالٹ `/docs` پر) اور ReDoc (بطور ڈیفالٹ `/redoc` پر)۔ + +::: fastapi.openapi.docs.get_swagger_ui_html + +::: fastapi.openapi.docs.get_redoc_html + +::: fastapi.openapi.docs.get_swagger_ui_oauth2_redirect_html + +::: fastapi.openapi.docs.swagger_ui_default_parameters diff --git a/docs/ur/docs/reference/openapi/index.md b/docs/ur/docs/reference/openapi/index.md new file mode 100644 index 000000000..bde19f41d --- /dev/null +++ b/docs/ur/docs/reference/openapi/index.md @@ -0,0 +1,5 @@ +# OpenAPI + +OpenAPI کو سنبھالنے کے لیے کئی utilities دستیاب ہیں۔ + +عام طور پر آپ کو انہیں استعمال کرنے کی ضرورت نہیں ہوتی جب تک کہ آپ کے پاس کوئی مخصوص جدید استعمال کا معاملہ نہ ہو جس کے لیے ان کی ضرورت ہو۔ diff --git a/docs/ur/docs/reference/openapi/models.md b/docs/ur/docs/reference/openapi/models.md new file mode 100644 index 000000000..a8f3072aa --- /dev/null +++ b/docs/ur/docs/reference/openapi/models.md @@ -0,0 +1,5 @@ +# OpenAPI `models` + +OpenAPI Pydantic models جو تیار کردہ OpenAPI کو generate اور validate کرنے کے لیے استعمال ہوتے ہیں۔ + +::: fastapi.openapi.models diff --git a/docs/ur/docs/reference/parameters.md b/docs/ur/docs/reference/parameters.md new file mode 100644 index 000000000..e95c774bc --- /dev/null +++ b/docs/ur/docs/reference/parameters.md @@ -0,0 +1,35 @@ +# Request Parameters + +یہاں request parameters کی حوالہ جاتی معلومات ہیں۔ + +یہ وہ خاص functions ہیں جو آپ *path operation function* کے parameters یا dependency functions میں `Annotated` کے ساتھ استعمال کر کے request سے ڈیٹا حاصل کر سکتے ہیں۔ + +اس میں شامل ہیں: + +* `Query()` +* `Path()` +* `Body()` +* `Cookie()` +* `Header()` +* `Form()` +* `File()` + +آپ ان سب کو براہ راست `fastapi` سے import کر سکتے ہیں: + +```python +from fastapi import Body, Cookie, File, Form, Header, Path, Query +``` + +::: fastapi.Query + +::: fastapi.Path + +::: fastapi.Body + +::: fastapi.Cookie + +::: fastapi.Header + +::: fastapi.Form + +::: fastapi.File diff --git a/docs/ur/docs/reference/request.md b/docs/ur/docs/reference/request.md new file mode 100644 index 000000000..6174dce86 --- /dev/null +++ b/docs/ur/docs/reference/request.md @@ -0,0 +1,19 @@ +# `Request` class + +آپ *path operation function* یا dependency میں `Request` type کا parameter declare کر سکتے ہیں اور پھر بغیر کسی validation وغیرہ کے خام request object تک براہ راست رسائی حاصل کر سکتے ہیں۔ + +اس کے بارے میں مزید پڑھیں [FastAPI دستاویزات میں Request کو براہ راست استعمال کرنا](https://fastapi.tiangolo.com/advanced/using-request-directly/) + +آپ اسے براہ راست `fastapi` سے import کر سکتے ہیں: + +```python +from fastapi import Request +``` + +/// tip | مشورہ + +جب آپ ایسی dependencies define کرنا چاہیں جو HTTP اور WebSockets دونوں کے ساتھ مطابقت رکھتی ہوں، تو آپ `Request` یا `WebSocket` کی بجائے `HTTPConnection` لینے والا parameter define کر سکتے ہیں۔ + +/// + +::: fastapi.Request diff --git a/docs/ur/docs/reference/response.md b/docs/ur/docs/reference/response.md new file mode 100644 index 000000000..a3153ee8d --- /dev/null +++ b/docs/ur/docs/reference/response.md @@ -0,0 +1,15 @@ +# `Response` class + +آپ *path operation function* یا dependency میں `Response` type کا parameter declare کر سکتے ہیں اور پھر response کے لیے ڈیٹا جیسے headers یا cookies سیٹ کر سکتے ہیں۔ + +آپ اسے براہ راست ایک instance بنانے اور اپنی *path operations* سے واپس کرنے کے لیے بھی استعمال کر سکتے ہیں۔ + +اس کے بارے میں مزید پڑھیں [FastAPI دستاویزات میں حسب ضرورت Response واپس کرنا](https://fastapi.tiangolo.com/advanced/response-directly/#returning-a-custom-response) + +آپ اسے براہ راست `fastapi` سے import کر سکتے ہیں: + +```python +from fastapi import Response +``` + +::: fastapi.Response diff --git a/docs/ur/docs/reference/responses.md b/docs/ur/docs/reference/responses.md new file mode 100644 index 000000000..1507bfe12 --- /dev/null +++ b/docs/ur/docs/reference/responses.md @@ -0,0 +1,172 @@ +# حسب ضرورت Response Classes - File، HTML، Redirect، Streaming، وغیرہ + +کئی حسب ضرورت response classes دستیاب ہیں جنہیں آپ ایک instance بنا کر اپنی *path operations* سے براہ راست واپس کر سکتے ہیں۔ + +اس کے بارے میں مزید پڑھیں [FastAPI دستاویزات میں حسب ضرورت Response - HTML، Stream، File، اور دیگر](https://fastapi.tiangolo.com/advanced/custom-response/)۔ + +آپ انہیں براہ راست `fastapi.responses` سے import کر سکتے ہیں: + +```python +from fastapi.responses import ( + FileResponse, + HTMLResponse, + JSONResponse, + ORJSONResponse, + PlainTextResponse, + RedirectResponse, + Response, + StreamingResponse, + UJSONResponse, +) +``` + +## FastAPI Responses + +کچھ حسب ضرورت FastAPI response classes تھیں جو JSON کی کارکردگی کو بہتر بنانے کے لیے بنائی گئی تھیں۔ + +تاہم، اب یہ deprecated ہو چکی ہیں کیونکہ اب آپ [Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/) استعمال کر کے بہتر کارکردگی حاصل کر سکتے ہیں۔ + +اس طرح، Pydantic ڈیٹا کو Rust کی طرف JSON bytes میں serialize کرے گا، جو ان حسب ضرورت JSON responses سے بہتر کارکردگی فراہم کرے گا۔ + +اس کے بارے میں مزید پڑھیں [حسب ضرورت Response - HTML، Stream، File، اور دیگر - `orjson` یا Response Model](https://fastapi.tiangolo.com/advanced/custom-response/#orjson-or-response-model)۔ + +::: fastapi.responses.UJSONResponse + options: + members: + - charset + - status_code + - media_type + - body + - background + - raw_headers + - render + - init_headers + - headers + - set_cookie + - delete_cookie + +::: fastapi.responses.ORJSONResponse + options: + members: + - charset + - status_code + - media_type + - body + - background + - raw_headers + - render + - init_headers + - headers + - set_cookie + - delete_cookie + +## Starlette Responses + +آپ ان سب کے بارے میں مزید پڑھ سکتے ہیں [FastAPI دستاویزات میں حسب ضرورت Response](https://fastapi.tiangolo.com/advanced/custom-response/) اور [Starlette دستاویزات میں Responses](https://starlette.dev/responses/)۔ + +::: fastapi.responses.FileResponse + options: + members: + - chunk_size + - charset + - status_code + - media_type + - body + - background + - raw_headers + - render + - init_headers + - headers + - set_cookie + - delete_cookie + +::: fastapi.responses.HTMLResponse + options: + members: + - charset + - status_code + - media_type + - body + - background + - raw_headers + - render + - init_headers + - headers + - set_cookie + - delete_cookie + +::: fastapi.responses.JSONResponse + options: + members: + - charset + - status_code + - media_type + - body + - background + - raw_headers + - render + - init_headers + - headers + - set_cookie + - delete_cookie + +::: fastapi.responses.PlainTextResponse + options: + members: + - charset + - status_code + - media_type + - body + - background + - raw_headers + - render + - init_headers + - headers + - set_cookie + - delete_cookie + +::: fastapi.responses.RedirectResponse + options: + members: + - charset + - status_code + - media_type + - body + - background + - raw_headers + - render + - init_headers + - headers + - set_cookie + - delete_cookie + +::: fastapi.responses.Response + options: + members: + - charset + - status_code + - media_type + - body + - background + - raw_headers + - render + - init_headers + - headers + - set_cookie + - delete_cookie + +::: fastapi.responses.StreamingResponse + options: + members: + - body_iterator + - charset + - status_code + - media_type + - body + - background + - raw_headers + - render + - init_headers + - headers + - set_cookie + - delete_cookie diff --git a/docs/ur/docs/reference/security/index.md b/docs/ur/docs/reference/security/index.md new file mode 100644 index 000000000..534c0f7fa --- /dev/null +++ b/docs/ur/docs/reference/security/index.md @@ -0,0 +1,75 @@ +# Security ٹولز + +جب آپ کو OAuth2 scopes کے ساتھ dependencies declare کرنی ہوں تو آپ `Security()` استعمال کرتے ہیں۔ + +لیکن آپ کو پھر بھی یہ define کرنا ہوگا کہ dependable کیا ہے، یعنی وہ callable جو آپ `Depends()` یا `Security()` کو parameter کے طور پر دیتے ہیں۔ + +ایسے dependables بنانے کے لیے کئی ٹولز دستیاب ہیں، اور یہ OpenAPI میں ضم ہو جاتے ہیں تاکہ یہ خودکار docs UI میں دکھائے جائیں، خودکار طور پر بنائے گئے clients اور SDKs کے ذریعے استعمال ہو سکیں، وغیرہ۔ + +آپ انہیں `fastapi.security` سے import کر سکتے ہیں: + +```python +from fastapi.security import ( + APIKeyCookie, + APIKeyHeader, + APIKeyQuery, + HTTPAuthorizationCredentials, + HTTPBasic, + HTTPBasicCredentials, + HTTPBearer, + HTTPDigest, + OAuth2, + OAuth2AuthorizationCodeBearer, + OAuth2PasswordBearer, + OAuth2PasswordRequestForm, + OAuth2PasswordRequestFormStrict, + OpenIdConnect, + SecurityScopes, +) +``` + +ان کے بارے میں مزید پڑھیں [FastAPI دستاویزات میں Security](https://fastapi.tiangolo.com/tutorial/security/)۔ + +## API Key Security Schemes + +::: fastapi.security.APIKeyCookie + +::: fastapi.security.APIKeyHeader + +::: fastapi.security.APIKeyQuery + +## HTTP Authentication Schemes + +::: fastapi.security.HTTPBasic + +::: fastapi.security.HTTPBearer + +::: fastapi.security.HTTPDigest + +## HTTP Credentials + +::: fastapi.security.HTTPAuthorizationCredentials + +::: fastapi.security.HTTPBasicCredentials + +## OAuth2 Authentication + +::: fastapi.security.OAuth2 + +::: fastapi.security.OAuth2AuthorizationCodeBearer + +::: fastapi.security.OAuth2PasswordBearer + +## OAuth2 Password Form + +::: fastapi.security.OAuth2PasswordRequestForm + +::: fastapi.security.OAuth2PasswordRequestFormStrict + +## OAuth2 Security Scopes میں Dependencies + +::: fastapi.security.SecurityScopes + +## OpenID Connect + +::: fastapi.security.OpenIdConnect diff --git a/docs/ur/docs/reference/staticfiles.md b/docs/ur/docs/reference/staticfiles.md new file mode 100644 index 000000000..204995389 --- /dev/null +++ b/docs/ur/docs/reference/staticfiles.md @@ -0,0 +1,13 @@ +# Static Files - `StaticFiles` + +آپ `StaticFiles` class کو static files فراہم کرنے کے لیے استعمال کر سکتے ہیں، جیسے JavaScript، CSS، تصاویر، وغیرہ۔ + +اس کے بارے میں مزید پڑھیں [FastAPI دستاویزات میں Static Files](https://fastapi.tiangolo.com/tutorial/static-files/)۔ + +آپ اسے براہ راست `fastapi.staticfiles` سے import کر سکتے ہیں: + +```python +from fastapi.staticfiles import StaticFiles +``` + +::: fastapi.staticfiles.StaticFiles diff --git a/docs/ur/docs/reference/status.md b/docs/ur/docs/reference/status.md new file mode 100644 index 000000000..ba04f7f53 --- /dev/null +++ b/docs/ur/docs/reference/status.md @@ -0,0 +1,36 @@ +# Status Codes + +آپ `status` module کو `fastapi` سے import کر سکتے ہیں: + +```python +from fastapi import status +``` + +`status` براہ راست Starlette کی طرف سے فراہم کیا گیا ہے۔ + +اس میں نامزد constants (variables) کا ایک گروپ ہے جن کی قدریں integer status codes ہیں۔ + +مثال کے طور پر: + +* 200: `status.HTTP_200_OK` +* 403: `status.HTTP_403_FORBIDDEN` +* وغیرہ۔ + +یہ آپ کی app میں HTTP (اور WebSocket) status codes تک فوری رسائی کے لیے آسان ہو سکتا ہے، نام کے لیے autocompletion استعمال کرتے ہوئے بغیر integer status codes یاد رکھنے کی ضرورت کے۔ + +اس کے بارے میں مزید پڑھیں [FastAPI دستاویزات میں Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/)۔ + +## مثال + +```python +from fastapi import FastAPI, status + +app = FastAPI() + + +@app.get("/items/", status_code=status.HTTP_418_IM_A_TEAPOT) +def read_items(): + return [{"name": "Plumbus"}, {"name": "Portal Gun"}] +``` + +::: fastapi.status diff --git a/docs/ur/docs/reference/templating.md b/docs/ur/docs/reference/templating.md new file mode 100644 index 000000000..4b8255259 --- /dev/null +++ b/docs/ur/docs/reference/templating.md @@ -0,0 +1,13 @@ +# Templating - `Jinja2Templates` + +آپ `Jinja2Templates` class کو Jinja templates render کرنے کے لیے استعمال کر سکتے ہیں۔ + +اس کے بارے میں مزید پڑھیں [FastAPI دستاویزات میں Templates](https://fastapi.tiangolo.com/advanced/templates/)۔ + +آپ اسے براہ راست `fastapi.templating` سے import کر سکتے ہیں: + +```python +from fastapi.templating import Jinja2Templates +``` + +::: fastapi.templating.Jinja2Templates diff --git a/docs/ur/docs/reference/testclient.md b/docs/ur/docs/reference/testclient.md new file mode 100644 index 000000000..dfecf5aab --- /dev/null +++ b/docs/ur/docs/reference/testclient.md @@ -0,0 +1,13 @@ +# Test Client - `TestClient` + +آپ `TestClient` class کو FastAPI applications کی جانچ کرنے کے لیے استعمال کر سکتے ہیں بغیر کوئی حقیقی HTTP اور socket connection بنائے، بس FastAPI code کے ساتھ براہ راست بات چیت کر کے۔ + +اس کے بارے میں مزید پڑھیں [FastAPI دستاویزات میں Testing](https://fastapi.tiangolo.com/tutorial/testing/)۔ + +آپ اسے براہ راست `fastapi.testclient` سے import کر سکتے ہیں: + +```python +from fastapi.testclient import TestClient +``` + +::: fastapi.testclient.TestClient diff --git a/docs/ur/docs/reference/uploadfile.md b/docs/ur/docs/reference/uploadfile.md new file mode 100644 index 000000000..2d7458281 --- /dev/null +++ b/docs/ur/docs/reference/uploadfile.md @@ -0,0 +1,22 @@ +# `UploadFile` class + +آپ *path operation function* کے parameters کو `UploadFile` type کا define کر سکتے ہیں تاکہ request سے files وصول کی جا سکیں۔ + +آپ اسے براہ راست `fastapi` سے import کر سکتے ہیں: + +```python +from fastapi import UploadFile +``` + +::: fastapi.UploadFile + options: + members: + - file + - filename + - size + - headers + - content_type + - read + - write + - seek + - close diff --git a/docs/ur/docs/reference/websockets.md b/docs/ur/docs/reference/websockets.md new file mode 100644 index 000000000..fd2028b97 --- /dev/null +++ b/docs/ur/docs/reference/websockets.md @@ -0,0 +1,73 @@ +# WebSockets + +WebSockets define کرتے وقت، آپ عام طور پر `WebSocket` type کا parameter declare کرتے ہیں اور اس کے ذریعے client سے ڈیٹا پڑھ سکتے ہیں اور اسے ڈیٹا بھیج سکتے ہیں۔ + +اس کے بارے میں مزید پڑھیں [FastAPI دستاویزات میں WebSockets](https://fastapi.tiangolo.com/advanced/websockets/) + +یہ Starlette کی طرف سے براہ راست فراہم کیا گیا ہے، لیکن آپ اسے `fastapi` سے import کر سکتے ہیں: + +```python +from fastapi import WebSocket +``` + +/// tip | مشورہ + +جب آپ ایسی dependencies define کرنا چاہیں جو HTTP اور WebSockets دونوں کے ساتھ مطابقت رکھتی ہوں، تو آپ `Request` یا `WebSocket` کی بجائے `HTTPConnection` لینے والا parameter define کر سکتے ہیں۔ + +/// + +::: fastapi.WebSocket + options: + members: + - scope + - app + - url + - base_url + - headers + - query_params + - path_params + - cookies + - client + - state + - url_for + - client_state + - application_state + - receive + - send + - accept + - receive_text + - receive_bytes + - receive_json + - iter_text + - iter_bytes + - iter_json + - send_text + - send_bytes + - send_json + - close + +## WebSockets - اضافی classes + +WebSockets کو سنبھالنے کے لیے اضافی classes۔ + +Starlette کی طرف سے براہ راست فراہم کی گئی ہیں، لیکن آپ انہیں `fastapi` سے import کر سکتے ہیں: + +```python +from fastapi.websockets import WebSocketDisconnect, WebSocketState +``` + +::: fastapi.websockets.WebSocketDisconnect + +جب کوئی client منقطع ہوتا ہے تو `WebSocketDisconnect` exception raise ہوتا ہے، آپ اسے catch کر سکتے ہیں۔ + +آپ اسے براہ راست `fastapi` سے import کر سکتے ہیں: + +```python +from fastapi import WebSocketDisconnect +``` + +اس کے بارے میں مزید پڑھیں [FastAPI دستاویزات میں WebSockets](https://fastapi.tiangolo.com/advanced/websockets/#handling-disconnections-and-multiple-clients) + +::: fastapi.websockets.WebSocketState + +`WebSocketState` ایک enumeration ہے جو WebSocket connection کی ممکنہ حالتوں کو ظاہر کرتا ہے۔ diff --git a/docs/ur/docs/release-notes.md b/docs/ur/docs/release-notes.md new file mode 100644 index 000000000..96f8498f2 --- /dev/null +++ b/docs/ur/docs/release-notes.md @@ -0,0 +1,6 @@ +--- +hide: + - navigation +--- + +# ریلیز نوٹس diff --git a/docs/ur/docs/resources/index.md b/docs/ur/docs/resources/index.md new file mode 100644 index 000000000..ed5e643a3 --- /dev/null +++ b/docs/ur/docs/resources/index.md @@ -0,0 +1,3 @@ +# وسائل { #resources } + +اضافی وسائل، بیرونی لنکس، اور مزید۔ ✈️ diff --git a/docs/ur/docs/translation-banner.md b/docs/ur/docs/translation-banner.md new file mode 100644 index 000000000..991e46fda --- /dev/null +++ b/docs/ur/docs/translation-banner.md @@ -0,0 +1,11 @@ +/// details | 🌐 مصنوعی ذہانت اور انسانوں کی مدد سے ترجمہ + +یہ ترجمہ انسانوں کی رہنمائی میں مصنوعی ذہانت کے ذریعے تیار کیا گیا ہے۔ 🤝 + +اس میں اصل معنی کی غلط تشریح یا غیر فطری زبان جیسی خامیاں ہو سکتی ہیں۔ 🤖 + +آپ [مصنوعی ذہانت LLM کو بہتر رہنمائی دینے میں ہماری مدد کر کے](https://fastapi.tiangolo.com/contributing/#translations) اس ترجمے کو بہتر بنا سکتے ہیں۔ + +[انگریزی نسخہ](ENGLISH_VERSION_URL) + +/// diff --git a/docs/ur/docs/tutorial/background-tasks.md b/docs/ur/docs/tutorial/background-tasks.md new file mode 100644 index 000000000..fcc309730 --- /dev/null +++ b/docs/ur/docs/tutorial/background-tasks.md @@ -0,0 +1,84 @@ +# Background Tasks { #background-tasks } + +آپ background tasks define کر سکتے ہیں جو response واپس بھیجنے کے *بعد* چلائے جائیں۔ + +یہ ان operations کے لیے مفید ہے جو request کے بعد ہونے چاہئیں، لیکن client کو response وصول کرنے سے پہلے ان کے مکمل ہونے کا انتظار کرنے کی ضرورت نہیں ہے۔ + +اس میں مثال کے طور پر شامل ہیں: + +* کوئی عمل انجام دینے کے بعد بھیجی جانے والی email notifications: + * چونکہ email server سے connect ہونا اور email بھیجنا "سست" ہوتا ہے (کئی سیکنڈز)، آپ فوری طور پر response واپس بھیج سکتے ہیں اور email notification background میں بھیج سکتے ہیں۔ +* Data کی processing: + * مثال کے طور پر، فرض کریں آپ کو ایک فائل ملتی ہے جسے سست process سے گزرنا ہے، آپ "Accepted" (HTTP 202) کا response واپس بھیج سکتے ہیں اور فائل کو background میں process کر سکتے ہیں۔ + +## `BackgroundTasks` استعمال کرنا { #using-backgroundtasks } + +سب سے پہلے، `BackgroundTasks` import کریں اور اپنے *path operation function* میں `BackgroundTasks` کی type declaration کے ساتھ ایک parameter define کریں: + +{* ../../docs_src/background_tasks/tutorial001_py310.py hl[1,13] *} + +**FastAPI** آپ کے لیے `BackgroundTasks` قسم کا object بنائے گا اور اسے اس parameter کے طور پر منتقل کرے گا۔ + +## ایک task function بنائیں { #create-a-task-function } + +background task کے طور پر چلایا جانے والا function بنائیں۔ + +یہ ایک عام function ہے جو parameters وصول کر سکتا ہے۔ + +یہ `async def` یا عام `def` function ہو سکتا ہے، **FastAPI** اسے درست طریقے سے handle کرنا جانتا ہے۔ + +اس صورت میں، task function ایک فائل میں لکھے گا (email بھیجنے کی نقل)۔ + +اور چونکہ write operation `async` اور `await` استعمال نہیں کرتا، ہم function کو عام `def` سے define کرتے ہیں: + +{* ../../docs_src/background_tasks/tutorial001_py310.py hl[6:9] *} + +## Background task شامل کریں { #add-the-background-task } + +اپنے *path operation function* کے اندر، اپنا task function `.add_task()` method کے ذریعے *background tasks* object کو دیں: + +{* ../../docs_src/background_tasks/tutorial001_py310.py hl[14] *} + +`.add_task()` arguments کے طور پر وصول کرتا ہے: + +* background میں چلایا جانے والا task function (`write_notification`)۔ +* task function کو ترتیب سے منتقل کیے جانے والے arguments کی کوئی بھی sequence (`email`)۔ +* task function کو منتقل کیے جانے والے کوئی بھی keyword arguments (`message="some notification"`)۔ + +## Dependency Injection { #dependency-injection } + +`BackgroundTasks` کا استعمال dependency injection system کے ساتھ بھی کام کرتا ہے، آپ متعدد سطحوں پر `BackgroundTasks` قسم کا parameter declare کر سکتے ہیں: *path operation function* میں، dependency (dependable) میں، sub-dependency میں، وغیرہ۔ + +**FastAPI** جانتا ہے کہ ہر صورت میں کیا کرنا ہے اور ایک ہی object کو دوبارہ استعمال کرنا ہے، تاکہ تمام background tasks آپس میں مل جائیں اور بعد میں background میں چلائے جائیں: + +{* ../../docs_src/background_tasks/tutorial002_an_py310.py hl[13,15,22,25] *} + +اس مثال میں، پیغامات `log.txt` فائل میں response بھیجنے کے *بعد* لکھے جائیں گے۔ + +اگر request میں کوئی query تھی، تو اسے background task میں log میں لکھا جائے گا۔ + +اور پھر *path operation function* میں بنایا گیا ایک اور background task `email` path parameter استعمال کرتے ہوئے ایک پیغام لکھے گا۔ + +## تکنیکی تفصیلات { #technical-details } + +`BackgroundTasks` class براہ راست [`starlette.background`](https://www.starlette.dev/background/) سے آتی ہے۔ + +اسے FastAPI میں براہ راست import/شامل کیا گیا ہے تاکہ آپ اسے `fastapi` سے import کر سکیں اور غلطی سے `starlette.background` سے متبادل `BackgroundTask` (آخر میں `s` کے بغیر) import کرنے سے بچ سکیں۔ + +صرف `BackgroundTasks` (نہ کہ `BackgroundTask`) استعمال کر کے، اسے *path operation function* parameter کے طور پر استعمال کرنا ممکن ہو جاتا ہے اور **FastAPI** باقی کام خود سنبھال لیتا ہے، بالکل اسی طرح جیسے `Request` object کو براہ راست استعمال کرتے وقت۔ + +FastAPI میں اکیلے `BackgroundTask` استعمال کرنا بھی ممکن ہے، لیکن آپ کو اپنے code میں object بنانا ہوگا اور اسے شامل کرتے ہوئے Starlette `Response` واپس کرنا ہوگا۔ + +آپ [Starlette کی Background Tasks کی سرکاری دستاویزات](https://www.starlette.dev/background/) میں مزید تفصیلات دیکھ سکتے ہیں۔ + +## احتیاط { #caveat } + +اگر آپ کو بھاری background computation کرنے کی ضرورت ہے اور آپ کو لازمی طور پر اسی process سے چلانے کی ضرورت نہیں ہے (مثلاً، آپ کو memory، variables وغیرہ share کرنے کی ضرورت نہیں)، تو آپ کو [Celery](https://docs.celeryq.dev) جیسے بڑے tools استعمال کرنے سے فائدہ ہو سکتا ہے۔ + +ان میں عام طور پر زیادہ پیچیدہ configurations، message/job queue manager، جیسے RabbitMQ یا Redis کی ضرورت ہوتی ہے، لیکن یہ آپ کو background tasks کو متعدد processes میں، اور خاص طور پر، متعدد servers میں چلانے کی اجازت دیتے ہیں۔ + +لیکن اگر آپ کو اسی **FastAPI** app سے variables اور objects تک رسائی حاصل کرنے کی ضرورت ہے، یا آپ کو چھوٹے background tasks (جیسے email notification بھیجنا) انجام دینے کی ضرورت ہے، تو آپ آسانی سے `BackgroundTasks` استعمال کر سکتے ہیں۔ + +## خلاصہ { #recap } + +Background tasks شامل کرنے کے لیے *path operation functions* اور dependencies میں parameters کے ساتھ `BackgroundTasks` import اور استعمال کریں۔ diff --git a/docs/ur/docs/tutorial/bigger-applications.md b/docs/ur/docs/tutorial/bigger-applications.md new file mode 100644 index 000000000..ad0b0d615 --- /dev/null +++ b/docs/ur/docs/tutorial/bigger-applications.md @@ -0,0 +1,535 @@ +# بڑی Applications - متعدد فائلیں { #bigger-applications-multiple-files } + +اگر آپ کوئی application یا web API بنا رہے ہیں، تو شاذ و نادر ہی ایسا ہوتا ہے کہ آپ سب کچھ ایک واحد فائل میں رکھ سکیں۔ + +**FastAPI** آپ کی application کی ساخت بنانے کے لیے ایک آسان tool فراہم کرتا ہے جبکہ تمام لچک برقرار رکھتا ہے۔ + +/// info | معلومات + +اگر آپ Flask سے آئے ہیں، تو یہ Flask کے Blueprints کے مساوی ہوگا۔ + +/// + +## فائل کی ساخت کی مثال { #an-example-file-structure } + +فرض کریں آپ کے پاس اس طرح کی فائل ساخت ہے: + +``` +. +├── app +│ ├── __init__.py +│ ├── main.py +│ ├── dependencies.py +│ └── routers +│ │ ├── __init__.py +│ │ ├── items.py +│ │ └── users.py +│ └── internal +│ ├── __init__.py +│ └── admin.py +``` + +/// tip | مشورہ + +کئی `__init__.py` فائلیں ہیں: ہر directory یا subdirectory میں ایک۔ + +یہی وہ چیز ہے جو ایک فائل سے دوسری میں code import کرنے کی اجازت دیتی ہے۔ + +مثال کے طور پر، `app/main.py` میں آپ کے پاس ایسی لائن ہو سکتی ہے: + +``` +from app.routers import items +``` + +/// + +* `app` directory میں سب کچھ ہے۔ اور اس میں ایک خالی فائل `app/__init__.py` ہے، تو یہ ایک "Python package" ہے (Python "modules" کا مجموعہ): `app`۔ +* اس میں ایک `app/main.py` فائل ہے۔ چونکہ یہ ایک Python package (ایسی directory جس میں `__init__.py` فائل ہو) کے اندر ہے، یہ اس package کا ایک "module" ہے: `app.main`۔ +* ایک `app/dependencies.py` فائل بھی ہے، بالکل `app/main.py` کی طرح، یہ ایک "module" ہے: `app.dependencies`۔ +* ایک subdirectory `app/routers/` ہے جس میں ایک اور `__init__.py` فائل ہے، تو یہ ایک "Python subpackage" ہے: `app.routers`۔ +* فائل `app/routers/items.py` ایک package `app/routers/` کے اندر ہے، تو یہ ایک submodule ہے: `app.routers.items`۔ +* `app/routers/users.py` کے ساتھ بھی یہی ہے، یہ ایک اور submodule ہے: `app.routers.users`۔ +* ایک subdirectory `app/internal/` بھی ہے جس میں ایک اور `__init__.py` فائل ہے، تو یہ ایک اور "Python subpackage" ہے: `app.internal`۔ +* اور فائل `app/internal/admin.py` ایک اور submodule ہے: `app.internal.admin`۔ + + + +تبصروں کے ساتھ وہی فائل ساخت: + +```bash +. +├── app # "app" is a Python package +│ ├── __init__.py # this file makes "app" a "Python package" +│ ├── main.py # "main" module, e.g. import app.main +│ ├── dependencies.py # "dependencies" module, e.g. import app.dependencies +│ └── routers # "routers" is a "Python subpackage" +│ │ ├── __init__.py # makes "routers" a "Python subpackage" +│ │ ├── items.py # "items" submodule, e.g. import app.routers.items +│ │ └── users.py # "users" submodule, e.g. import app.routers.users +│ └── internal # "internal" is a "Python subpackage" +│ ├── __init__.py # makes "internal" a "Python subpackage" +│ └── admin.py # "admin" submodule, e.g. import app.internal.admin +``` + +## `APIRouter` { #apirouter } + +فرض کریں صرف users کو handle کرنے کے لیے وقف فائل submodule `/app/routers/users.py` میں ہے۔ + +آپ اپنے users سے متعلق *path operations* کو باقی code سے الگ رکھنا چاہتے ہیں، تاکہ اسے منظم رکھا جا سکے۔ + +لیکن یہ اب بھی اسی **FastAPI** application/web API کا حصہ ہے (یہ اسی "Python Package" کا حصہ ہے)۔ + +آپ `APIRouter` استعمال کر کے اس module کے لیے *path operations* بنا سکتے ہیں۔ + +### `APIRouter` import کریں { #import-apirouter } + +آپ اسے import کریں اور بالکل اسی طرح ایک "instance" بنائیں جیسے آپ `FastAPI` class کے ساتھ بناتے: + +{* ../../docs_src/bigger_applications/app_an_py310/routers/users.py hl[1,3] title["app/routers/users.py"] *} + +### `APIRouter` کے ساتھ *Path operations* { #path-operations-with-apirouter } + +اور پھر آپ اسے اپنے *path operations* declare کرنے کے لیے استعمال کریں۔ + +اسے بالکل اسی طرح استعمال کریں جیسے آپ `FastAPI` class استعمال کرتے: + +{* ../../docs_src/bigger_applications/app_an_py310/routers/users.py hl[6,11,16] title["app/routers/users.py"] *} + +آپ `APIRouter` کو ایک "چھوٹا `FastAPI`" class سمجھ سکتے ہیں۔ + +تمام اختیارات حمایت یافتہ ہیں۔ + +تمام وہی `parameters`، `responses`، `dependencies`، `tags`، وغیرہ۔ + +/// tip | مشورہ + +اس مثال میں، variable کا نام `router` ہے، لیکن آپ اسے جو چاہیں نام دے سکتے ہیں۔ + +/// + +ہم اس `APIRouter` کو مرکزی `FastAPI` app میں شامل کریں گے، لیکن پہلے، آئیں dependencies اور ایک اور `APIRouter` دیکھتے ہیں۔ + +## Dependencies { #dependencies } + +ہم دیکھتے ہیں کہ ہمیں application کے کئی مقامات پر استعمال ہونے والی کچھ dependencies کی ضرورت ہوگی۔ + +تو ہم انہیں ان کے اپنے `dependencies` module (`app/dependencies.py`) میں رکھتے ہیں۔ + +ہم اب ایک سادہ dependency استعمال کریں گے تاکہ ایک custom `X-Token` header پڑھا جا سکے: + +{* ../../docs_src/bigger_applications/app_an_py310/dependencies.py hl[3,6:8] title["app/dependencies.py"] *} + +/// tip | مشورہ + +ہم اس مثال کو آسان بنانے کے لیے ایک فرضی header استعمال کر رہے ہیں۔ + +لیکن حقیقی صورتوں میں آپ کو مربوط [Security utilities](security/index.md) استعمال کرنے سے بہتر نتائج ملیں گے۔ + +/// + +## `APIRouter` کے ساتھ ایک اور module { #another-module-with-apirouter } + +فرض کریں آپ کے پاس `app/routers/items.py` module میں "items" کو handle کرنے کے لیے وقف endpoints بھی ہیں۔ + +آپ کے پاس ان کے لیے *path operations* ہیں: + +* `/items/` +* `/items/{item_id}` + +یہ سب `app/routers/users.py` جیسی ہی ساخت ہے۔ + +لیکن ہم زیادہ ہوشیار بننا چاہتے ہیں اور code کو تھوڑا آسان بنانا چاہتے ہیں۔ + +ہم جانتے ہیں کہ اس module کے تمام *path operations* میں ایک جیسا ہے: + +* Path `prefix`: `/items`۔ +* `tags`: (صرف ایک tag: `items`)۔ +* اضافی `responses`۔ +* `dependencies`: ان سب کو وہ `X-Token` dependency چاہیے جو ہم نے بنائی۔ + +تو، ہر *path operation* میں یہ سب شامل کرنے کی بجائے، ہم اسے `APIRouter` میں شامل کر سکتے ہیں۔ + +{* ../../docs_src/bigger_applications/app_an_py310/routers/items.py hl[5:10,16,21] title["app/routers/items.py"] *} + +چونکہ ہر *path operation* کا path `/` سے شروع ہونا ضروری ہے، جیسے: + +```Python hl_lines="1" +@router.get("/{item_id}") +async def read_item(item_id: str): + ... +``` + +...prefix میں آخری `/` شامل نہیں ہونا چاہیے۔ + +تو، اس صورت میں prefix `/items` ہے۔ + +ہم `tags` اور اضافی `responses` کی فہرست بھی شامل کر سکتے ہیں جو اس router میں شامل تمام *path operations* پر لاگو ہوں گے۔ + +اور ہم `dependencies` کی فہرست شامل کر سکتے ہیں جو router کے تمام *path operations* میں شامل ہوں گی اور ان کی ہر request کے لیے execute/solve ہوں گی۔ + +/// tip | مشورہ + +یاد رکھیں، بالکل [dependencies in *path operation decorators*](dependencies/dependencies-in-path-operation-decorators.md) کی طرح، آپ کے *path operation function* کو کوئی قدر منتقل نہیں کی جائے گی۔ + +/// + +آخری نتیجہ یہ ہے کہ item paths اب ہیں: + +* `/items/` +* `/items/{item_id}` + +...جیسا کہ ہم چاہتے تھے۔ + +* انہیں ایک واحد string `"items"` پر مشتمل tags کی فہرست سے نشان زد کیا جائے گا۔ + * یہ "tags" خاص طور پر خودکار interactive documentation systems (OpenAPI استعمال کرتے ہوئے) کے لیے مفید ہیں۔ +* ان سب میں پہلے سے define شدہ `responses` شامل ہوں گے۔ +* ان تمام *path operations* سے پہلے `dependencies` کی فہرست evaluate/execute ہوگی۔ + * اگر آپ کسی مخصوص *path operation* میں بھی dependencies declare کرتے ہیں، **تو وہ بھی execute ہوں گی**۔ + * Router dependencies پہلے execute ہوتی ہیں، پھر [decorator میں `dependencies`](dependencies/dependencies-in-path-operation-decorators.md)، اور پھر عام parameter dependencies۔ + * آپ [`Security` dependencies بمع `scopes`](../advanced/security/oauth2-scopes.md) بھی شامل کر سکتے ہیں۔ + +/// tip | مشورہ + +`APIRouter` میں `dependencies` رکھنا استعمال کیا جا سکتا ہے، مثال کے طور پر، *path operations* کے پورے گروپ کے لیے authentication لازمی بنانے کے لیے۔ چاہے dependencies انفرادی طور پر ہر ایک میں شامل نہ کی گئی ہوں۔ + +/// + +/// check + +`prefix`، `tags`، `responses`، اور `dependencies` parameters (جیسا کہ بہت سی دوسری صورتوں میں) code کی تکرار سے بچنے میں **FastAPI** کی طرف سے ایک آسانی ہے۔ + +/// + +### Dependencies import کریں { #import-the-dependencies } + +یہ code module `app.routers.items` میں ہے، فائل `app/routers/items.py`۔ + +اور ہمیں module `app.dependencies` سے dependency function حاصل کرنی ہے، فائل `app/dependencies.py`۔ + +تو ہم dependencies کے لیے `..` کے ساتھ relative import استعمال کرتے ہیں: + +{* ../../docs_src/bigger_applications/app_an_py310/routers/items.py hl[3] title["app/routers/items.py"] *} + +#### Relative imports کیسے کام کرتے ہیں { #how-relative-imports-work } + +/// tip | مشورہ + +اگر آپ imports کے کام کرنے کے طریقے کو بخوبی جانتے ہیں، تو نیچے اگلے سیکشن پر جائیں۔ + +/// + +ایک واحد ڈاٹ `.`، جیسے: + +```Python +from .dependencies import get_token_header +``` + +کا مطلب ہوگا: + +* اسی package سے شروع کریں جس میں یہ module (فائل `app/routers/items.py`) موجود ہے (directory `app/routers/`)... +* `dependencies` module تلاش کریں (ایک فرضی فائل `app/routers/dependencies.py` پر)... +* اور اس سے function `get_token_header` import کریں۔ + +لیکن وہ فائل موجود نہیں ہے، ہماری dependencies `app/dependencies.py` پر ایک فائل میں ہیں۔ + +یاد رکھیں ہماری app/فائل کی ساخت کیسی ہے: + + + +--- + +دو ڈاٹ `..`، جیسے: + +```Python +from ..dependencies import get_token_header +``` + +کا مطلب ہے: + +* اسی package سے شروع کریں جس میں یہ module (فائل `app/routers/items.py`) موجود ہے (directory `app/routers/`)... +* parent package (directory `app/`) پر جائیں... +* اور وہاں، `dependencies` module تلاش کریں (فائل `app/dependencies.py`)... +* اور اس سے function `get_token_header` import کریں۔ + +یہ درست طریقے سے کام کرتا ہے! 🎉 + +--- + +اسی طرح، اگر ہم تین ڈاٹ `...` استعمال کرتے، جیسے: + +```Python +from ...dependencies import get_token_header +``` + +تو اس کا مطلب ہوتا: + +* اسی package سے شروع کریں جس میں یہ module (فائل `app/routers/items.py`) موجود ہے (directory `app/routers/`)... +* parent package (directory `app/`) پر جائیں... +* پھر اس package کے parent پر جائیں (کوئی parent package نہیں ہے، `app` سب سے اوپر کی سطح ہے 😱)... +* اور وہاں، `dependencies` module تلاش کریں (فائل `app/dependencies.py`)... +* اور اس سے function `get_token_header` import کریں۔ + +یہ `app/` سے اوپر کسی package سے مراد ہوگا، جس کی اپنی `__init__.py` فائل ہو، وغیرہ۔ لیکن ہمارے پاس ایسا نہیں ہے۔ تو، یہ ہماری مثال میں error دے گا۔ 🚨 + +لیکن اب آپ جانتے ہیں کہ یہ کیسے کام کرتا ہے، تو آپ اپنی apps میں relative imports استعمال کر سکتے ہیں چاہے وہ کتنی بھی پیچیدہ ہوں۔ 🤓 + +### کچھ custom `tags`، `responses`، اور `dependencies` شامل کریں { #add-some-custom-tags-responses-and-dependencies } + +ہم ہر *path operation* میں `/items` prefix یا `tags=["items"]` شامل نہیں کر رہے ہیں کیونکہ ہم نے انہیں `APIRouter` میں شامل کر دیا ہے۔ + +لیکن ہم پھر بھی _مزید_ `tags` شامل کر سکتے ہیں جو کسی مخصوص *path operation* پر لاگو ہوں گے، اور اس *path operation* کے لیے مخصوص کچھ اضافی `responses` بھی: + +{* ../../docs_src/bigger_applications/app_an_py310/routers/items.py hl[30:31] title["app/routers/items.py"] *} + +/// tip | مشورہ + +اس آخری path operation میں tags کا مجموعہ ہوگا: `["items", "custom"]`۔ + +اور documentation میں اس کے دونوں responses ہوں گے، ایک `404` کے لیے اور ایک `403` کے لیے۔ + +/// + +## مرکزی `FastAPI` { #the-main-fastapi } + +اب، آئیں `app/main.py` module دیکھتے ہیں۔ + +یہاں آپ `FastAPI` class import اور استعمال کرتے ہیں۔ + +یہ آپ کی application کی مرکزی فائل ہوگی جو سب کچھ جوڑتی ہے۔ + +اور چونکہ آپ کی زیادہ تر logic اب اپنے مخصوص module میں ہوگی، مرکزی فائل کافی سادہ ہوگی۔ + +### `FastAPI` import کریں { #import-fastapi } + +آپ `FastAPI` class کو عام طریقے سے import اور بنائیں۔ + +اور ہم [global dependencies](dependencies/global-dependencies.md) بھی declare کر سکتے ہیں جو ہر `APIRouter` کی dependencies کے ساتھ مل جائیں گی: + +{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[1,3,7] title["app/main.py"] *} + +### `APIRouter` import کریں { #import-the-apirouter } + +اب ہم دوسرے submodules import کرتے ہیں جن میں `APIRouter`s ہیں: + +{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[4:5] title["app/main.py"] *} + +چونکہ فائلیں `app/routers/users.py` اور `app/routers/items.py` submodules ہیں جو اسی Python package `app` کا حصہ ہیں، ہم ایک واحد ڈاٹ `.` سے "relative imports" استعمال کرتے ہوئے انہیں import کر سکتے ہیں۔ + +### Import کیسے کام کرتا ہے { #how-the-importing-works } + +یہ سیکشن: + +```Python +from .routers import items, users +``` + +کا مطلب ہے: + +* اسی package سے شروع کریں جس میں یہ module (فائل `app/main.py`) موجود ہے (directory `app/`)... +* subpackage `routers` تلاش کریں (directory `app/routers/`)... +* اور اس سے submodule `items` (فائل `app/routers/items.py`) اور `users` (فائل `app/routers/users.py`) import کریں... + +Module `items` میں ایک variable `router` ہوگا (`items.router`)۔ یہ وہی ہے جو ہم نے فائل `app/routers/items.py` میں بنایا تھا، یہ ایک `APIRouter` object ہے۔ + +اور پھر ہم module `users` کے لیے بھی ایسا ہی کرتے ہیں۔ + +ہم انہیں اس طرح بھی import کر سکتے تھے: + +```Python +from app.routers import items, users +``` + +/// info | معلومات + +پہلا ورژن "relative import" ہے: + +```Python +from .routers import items, users +``` + +دوسرا ورژن "absolute import" ہے: + +```Python +from app.routers import items, users +``` + +Python Packages اور Modules کے بارے میں مزید جاننے کے لیے [Modules کے بارے میں سرکاری Python دستاویزات](https://docs.python.org/3/tutorial/modules.html) پڑھیں۔ + +/// + +### نام کے ٹکراؤ سے بچیں { #avoid-name-collisions } + +ہم صرف اس کا variable `router` import کرنے کی بجائے submodule `items` کو براہ راست import کر رہے ہیں۔ + +اس کی وجہ یہ ہے کہ ہمارے پاس submodule `users` میں بھی `router` نام کا ایک اور variable ہے۔ + +اگر ہم ایک کے بعد دوسرا import کرتے، جیسے: + +```Python +from .routers.items import router +from .routers.users import router +``` + +تو `users` کا `router` `items` والے کو overwrite کر دیتا اور ہم دونوں کو ایک ساتھ استعمال نہ کر پاتے۔ + +تو، دونوں کو ایک ہی فائل میں استعمال کرنے کے لیے، ہم submodules کو براہ راست import کرتے ہیں: + +{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[5] title["app/main.py"] *} + +### `users` اور `items` کے `APIRouter`s شامل کریں { #include-the-apirouters-for-users-and-items } + +اب، آئیں submodules `users` اور `items` سے `router`s شامل کرتے ہیں: + +{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[10:11] title["app/main.py"] *} + +/// info | معلومات + +`users.router` فائل `app/routers/users.py` کے اندر `APIRouter` پر مشتمل ہے۔ + +اور `items.router` فائل `app/routers/items.py` کے اندر `APIRouter` پر مشتمل ہے۔ + +/// + +`app.include_router()` کے ذریعے ہم ہر `APIRouter` کو مرکزی `FastAPI` application میں شامل کر سکتے ہیں۔ + +یہ اس router کے تمام routes کو اس کے حصے کے طور پر شامل کرے گا۔ + +/// note | تکنیکی تفصیلات + +یہ دراصل اندرونی طور پر `APIRouter` میں declare کیے گئے ہر *path operation* کے لیے ایک *path operation* بنائے گا۔ + +تو، پردے کے پیچھے، یہ دراصل ایسے کام کرے گا جیسے سب کچھ ایک ہی واحد app ہو۔ + +/// + +/// check + +آپ کو routers شامل کرتے وقت performance کی فکر کرنے کی ضرورت نہیں۔ + +اس میں microseconds لگیں گے اور یہ صرف startup پر ہوگا۔ + +تو اس سے performance متاثر نہیں ہوگی۔ ⚡ + +/// + +### Custom `prefix`، `tags`، `responses`، اور `dependencies` کے ساتھ `APIRouter` شامل کریں { #include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies } + +اب، تصور کریں آپ کی تنظیم نے آپ کو `app/internal/admin.py` فائل دی ہے۔ + +اس میں کچھ admin *path operations* والا ایک `APIRouter` ہے جو آپ کی تنظیم کئی projects میں share کرتی ہے۔ + +اس مثال کے لیے یہ بہت سادہ ہوگا۔ لیکن فرض کریں کہ چونکہ یہ تنظیم کے دوسرے projects کے ساتھ share ہوتا ہے، ہم اسے تبدیل نہیں کر سکتے اور براہ راست `APIRouter` میں `prefix`، `dependencies`، `tags` وغیرہ شامل نہیں کر سکتے: + +{* ../../docs_src/bigger_applications/app_an_py310/internal/admin.py hl[3] title["app/internal/admin.py"] *} + +لیکن ہم پھر بھی `APIRouter` شامل کرتے وقت custom `prefix` سیٹ کرنا چاہتے ہیں تاکہ اس کے تمام *path operations* `/admin` سے شروع ہوں، ہم اسے اس project کے لیے پہلے سے موجود `dependencies` سے محفوظ بنانا چاہتے ہیں، اور ہم `tags` اور `responses` شامل کرنا چاہتے ہیں۔ + +ہم اصل `APIRouter` کو تبدیل کیے بغیر یہ سب declare کر سکتے ہیں ان parameters کو `app.include_router()` میں منتقل کر کے: + +{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[14:17] title["app/main.py"] *} + +اس طرح، اصل `APIRouter` غیر تبدیل شدہ رہے گا، تو ہم اب بھی وہی `app/internal/admin.py` فائل تنظیم کے دوسرے projects کے ساتھ share کر سکتے ہیں۔ + +نتیجہ یہ ہے کہ ہماری app میں، `admin` module کے ہر *path operation* میں ہوگا: + +* `/admin` prefix۔ +* `admin` tag۔ +* `get_token_header` dependency۔ +* `418` response۔ 🍵 + +لیکن یہ صرف ہماری app میں اس `APIRouter` پر اثر ڈالے گا، کسی دوسرے code پر نہیں جو اسے استعمال کرتا ہو۔ + +تو، مثال کے طور پر، دوسرے projects اسی `APIRouter` کو مختلف authentication method کے ساتھ استعمال کر سکتے ہیں۔ + +### ایک *path operation* شامل کریں { #include-a-path-operation } + +ہم براہ راست `FastAPI` app میں بھی *path operations* شامل کر سکتے ہیں۔ + +یہاں ہم ایسا کرتے ہیں... صرف یہ دکھانے کے لیے کہ ہم کر سکتے ہیں 🤷: + +{* ../../docs_src/bigger_applications/app_an_py310/main.py hl[21:23] title["app/main.py"] *} + +اور یہ درست طریقے سے کام کرے گا، `app.include_router()` کے ذریعے شامل کیے گئے تمام دوسرے *path operations* کے ساتھ مل کر۔ + +/// info | انتہائی تکنیکی تفصیلات + +**نوٹ**: یہ ایک انتہائی تکنیکی تفصیل ہے جسے آپ شاید **چھوڑ سکتے ہیں**۔ + +--- + +`APIRouter`s "mount" نہیں ہوتے، وہ باقی application سے الگ نہیں ہوتے۔ + +اس کی وجہ یہ ہے کہ ہم ان کے *path operations* کو OpenAPI schema اور user interfaces میں شامل کرنا چاہتے ہیں۔ + +چونکہ ہم انہیں صرف الگ کر کے باقی سے آزادانہ طور پر "mount" نہیں کر سکتے، *path operations* "clone" کیے جاتے ہیں (دوبارہ بنائے جاتے ہیں)، براہ راست شامل نہیں کیے جاتے۔ + +/// + +## `pyproject.toml` میں `entrypoint` configure کریں { #configure-the-entrypoint-in-pyproject-toml } + +چونکہ آپ کا FastAPI `app` object `app/main.py` میں ہے، آپ اپنی `pyproject.toml` فائل میں `entrypoint` اس طرح configure کر سکتے ہیں: + +```toml +[tool.fastapi] +entrypoint = "app.main:app" +``` + +جو اس طرح import کرنے کے مساوی ہے: + +```python +from app.main import app +``` + +اس طرح `fastapi` command کو پتہ چلے گا کہ آپ کی app کہاں ملے گی۔ + +/// Note + +آپ command میں path بھی دے سکتے ہیں، جیسے: + +```console +$ fastapi dev app/main.py +``` + +لیکن آپ کو ہر بار `fastapi` command چلاتے وقت درست path یاد رکھنا ہوگا۔ + +اس کے علاوہ، دوسرے tools شاید اسے نہ ڈھونڈ سکیں، مثلاً [VS Code Extension](../editor-support.md) یا [FastAPI Cloud](https://fastapicloud.com)، تو `pyproject.toml` میں `entrypoint` استعمال کرنا تجویز کیا جاتا ہے۔ + +/// + +## خودکار API docs چیک کریں { #check-the-automatic-api-docs } + +اب، اپنی app چلائیں: + +
+ +```console +$ fastapi dev + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +اور [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) پر docs کھولیں۔ + +آپ خودکار API docs دیکھیں گے، جن میں تمام submodules کے paths شامل ہیں، درست paths (اور prefixes) اور درست tags کے ساتھ: + + + +## مختلف `prefix` کے ساتھ وہی router کئی بار شامل کریں { #include-the-same-router-multiple-times-with-different-prefix } + +آپ مختلف prefixes استعمال کرتے ہوئے *ایک ہی* router کے ساتھ `.include_router()` کئی بار بھی استعمال کر سکتے ہیں۔ + +یہ مفید ہو سکتا ہے، مثلاً، ایک ہی API کو مختلف prefixes پر expose کرنے کے لیے، جیسے `/api/v1` اور `/api/latest`۔ + +یہ ایک جدید استعمال ہے جس کی آپ کو شاید واقعی ضرورت نہ ہو، لیکن ضرورت پڑنے پر یہ موجود ہے۔ + +## ایک `APIRouter` کو دوسرے میں شامل کریں { #include-an-apirouter-in-another } + +بالکل اسی طرح جیسے آپ `FastAPI` application میں ایک `APIRouter` شامل کر سکتے ہیں، آپ ایک `APIRouter` کو دوسرے `APIRouter` میں شامل کر سکتے ہیں: + +```Python +router.include_router(other_router) +``` + +یقینی بنائیں کہ آپ یہ `router` کو `FastAPI` app میں شامل کرنے سے پہلے کریں، تاکہ `other_router` کے *path operations* بھی شامل ہوں۔ diff --git a/docs/ur/docs/tutorial/body-fields.md b/docs/ur/docs/tutorial/body-fields.md new file mode 100644 index 000000000..7d2b62929 --- /dev/null +++ b/docs/ur/docs/tutorial/body-fields.md @@ -0,0 +1,61 @@ +# Body - Fields { #body-fields } + +اسی طرح جیسے آپ `Query`، `Path` اور `Body` کے ساتھ *path operation function* parameters میں اضافی توثیق اور metadata اعلان کر سکتے ہیں، آپ Pydantic کے `Field` استعمال کر کے Pydantic models کے اندر بھی توثیق اور metadata اعلان کر سکتے ہیں۔ + +## `Field` import کریں { #import-field } + +سب سے پہلے، آپ کو اسے import کرنا ہوگا: + +{* ../../docs_src/body_fields/tutorial001_an_py310.py hl[4] *} + + +/// warning | انتباہ + +غور کریں کہ `Field` براہ راست `pydantic` سے import کیا جاتا ہے، نہ کہ `fastapi` سے جیسے باقی سب (`Query`، `Path`، `Body` وغیرہ)۔ + +/// + +## Model attributes اعلان کریں { #declare-model-attributes } + +پھر آپ model attributes کے ساتھ `Field` استعمال کر سکتے ہیں: + +{* ../../docs_src/body_fields/tutorial001_an_py310.py hl[11:14] *} + +`Field` بالکل `Query`، `Path` اور `Body` کی طرح کام کرتا ہے، اس کے وہی تمام parameters وغیرہ ہیں۔ + +/// note | تکنیکی تفصیلات + +دراصل، `Query`، `Path` اور دوسرے جو آپ آگے دیکھیں گے ایک مشترک `Param` class کی ذیلی classes کے objects بناتے ہیں، جو خود Pydantic کی `FieldInfo` class کی ذیلی class ہے۔ + +اور Pydantic کا `Field` بھی `FieldInfo` کا ایک instance واپس کرتا ہے۔ + +`Body` بھی براہ راست `FieldInfo` کی ذیلی class کے objects واپس کرتا ہے۔ اور دوسرے بھی ہیں جو آپ بعد میں دیکھیں گے جو `Body` class کی ذیلی classes ہیں۔ + +یاد رکھیں جب آپ `fastapi` سے `Query`، `Path` اور دوسرے import کرتے ہیں، وہ دراصل functions ہیں جو خاص classes واپس کرتے ہیں۔ + +/// + +/// tip | مشورہ + +غور کریں کہ type، طے شدہ قدر اور `Field` کے ساتھ ہر model کی attribute کی ساخت ویسی ہی ہے جیسی *path operation function* کے parameter کی ہوتی ہے، `Path`، `Query` اور `Body` کی بجائے `Field` کے ساتھ۔ + +/// + +## اضافی معلومات شامل کریں { #add-extra-information } + +آپ `Field`، `Query`، `Body` وغیرہ میں اضافی معلومات اعلان کر سکتے ہیں۔ اور یہ تیار کردہ JSON Schema میں شامل ہوں گی۔ + +آپ مثالیں اعلان کرنا سیکھتے وقت docs میں بعد میں اضافی معلومات شامل کرنے کے بارے میں مزید جانیں گے۔ + +/// warning | انتباہ + +`Field` کو دیے گئے اضافی keys آپ کی ایپلیکیشن کے نتیجے میں بننے والے OpenAPI schema میں بھی موجود ہوں گے۔ +چونکہ یہ keys ضروری نہیں کہ OpenAPI تصریح کا حصہ ہوں، کچھ OpenAPI ٹولز، مثال کے طور پر [OpenAPI validator](https://validator.swagger.io/)، شاید آپ کے تیار کردہ schema کے ساتھ کام نہ کریں۔ + +/// + +## خلاصہ { #recap } + +آپ Pydantic کا `Field` استعمال کر کے model attributes کے لیے اضافی validations اور metadata اعلان کر سکتے ہیں۔ + +آپ اضافی JSON Schema metadata دینے کے لیے اضافی keyword arguments بھی استعمال کر سکتے ہیں۔ diff --git a/docs/ur/docs/tutorial/body-multiple-params.md b/docs/ur/docs/tutorial/body-multiple-params.md new file mode 100644 index 000000000..be3624dae --- /dev/null +++ b/docs/ur/docs/tutorial/body-multiple-params.md @@ -0,0 +1,169 @@ +# Body - متعدد Parameters { #body-multiple-parameters } + +اب جب ہم `Path` اور `Query` استعمال کرنا دیکھ چکے ہیں، آئیے request body اعلانات کے مزید جدید استعمال دیکھتے ہیں۔ + +## `Path`، `Query` اور body parameters کو ملائیں { #mix-path-query-and-body-parameters } + +سب سے پہلے، یقیناً، آپ `Path`، `Query` اور request body parameter اعلانات کو آزادانہ طور پر ملا سکتے ہیں اور **FastAPI** جانے گا کیا کرنا ہے۔ + +اور آپ body parameters کو اختیاری بھی اعلان کر سکتے ہیں، طے شدہ قدر `None` سیٹ کر کے: + +{* ../../docs_src/body_multiple_params/tutorial001_an_py310.py hl[18:20] *} + +/// note | نوٹ + +غور کریں کہ، اس صورت میں، `item` جو body سے لیا جائے گا اختیاری ہے۔ کیونکہ اس کی `None` طے شدہ قدر ہے۔ + +/// + +## متعدد body parameters { #multiple-body-parameters } + +پچھلی مثال میں، *path operations* ایک JSON body کی توقع کرتی تھیں جس میں `Item` کی attributes ہوں، جیسے: + +```JSON +{ + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 +} +``` + +لیکن آپ متعدد body parameters بھی اعلان کر سکتے ہیں، مثلاً `item` اور `user`: + +{* ../../docs_src/body_multiple_params/tutorial002_py310.py hl[20] *} + + +اس صورت میں، **FastAPI** نوٹ کرے گا کہ function میں ایک سے زیادہ body parameter ہیں (دو parameters ہیں جو Pydantic models ہیں)۔ + +تو، یہ parameter کے ناموں کو body میں keys (فیلڈ ناموں) کے طور پر استعمال کرے گا، اور اس طرح کی body کی توقع کرے گا: + +```JSON +{ + "item": { + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 + }, + "user": { + "username": "dave", + "full_name": "Dave Grohl" + } +} +``` + +/// note | نوٹ + +غور کریں کہ اگرچہ `item` پہلے کی طرح ہی اعلان کیا گیا تھا، اب اس کی توقع body کے اندر key `item` کے ساتھ ہے۔ + +/// + +**FastAPI** request سے خودکار تبدیلی کرے گا، تاکہ parameter `item` کو اس کا مخصوص مواد ملے اور `user` کو بھی وہی۔ + +یہ مرکب ڈیٹا کی توثیق کرے گا، اور اسے OpenAPI schema اور خودکار docs کے لیے اسی طرح دستاویز کرے گا۔ + +## Body میں واحد اقدار { #singular-values-in-body } + +اسی طرح جیسے query اور path parameters کے لیے اضافی ڈیٹا بیان کرنے کے لیے `Query` اور `Path` ہیں، **FastAPI** ایک مساوی `Body` فراہم کرتا ہے۔ + +مثال کے طور پر، پچھلے model کو بڑھاتے ہوئے، آپ فیصلہ کر سکتے ہیں کہ `item` اور `user` کے علاوہ اسی body میں ایک اور key `importance` چاہتے ہیں۔ + +اگر آپ اسے جیسا ہے اعلان کریں، چونکہ یہ واحد قدر ہے، **FastAPI** فرض کرے گا کہ یہ query parameter ہے۔ + +لیکن آپ **FastAPI** کو ہدایت دے سکتے ہیں کہ اسے `Body` استعمال کر کے ایک اور body key کے طور پر سمجھے: + +{* ../../docs_src/body_multiple_params/tutorial003_an_py310.py hl[23] *} + + +اس صورت میں، **FastAPI** اس طرح کی body کی توقع کرے گا: + +```JSON +{ + "item": { + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 + }, + "user": { + "username": "dave", + "full_name": "Dave Grohl" + }, + "importance": 5 +} +``` + +ایک بار پھر، یہ data types تبدیل کرے گا، توثیق کرے گا، دستاویز بنائے گا وغیرہ۔ + +## متعدد body params اور query { #multiple-body-params-and-query } + +یقیناً، آپ کسی بھی body parameters کے علاوہ جب بھی ضرورت ہو اضافی query parameters بھی اعلان کر سکتے ہیں۔ + +چونکہ، پہلے سے، واحد اقدار query parameters کے طور پر سمجھی جاتی ہیں، آپ کو واضح طور پر `Query` شامل کرنے کی ضرورت نہیں، آپ بس یہ کر سکتے ہیں: + +```Python +q: str | None = None +``` + +مثال کے طور پر: + +{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *} + + +/// info | معلومات + +`Body` میں بھی وہی تمام اضافی توثیق اور metadata parameters ہیں جو `Query`، `Path` اور دوسروں میں ہیں جو آپ بعد میں دیکھیں گے۔ + +/// + +## واحد body parameter کو embed کریں { #embed-a-single-body-parameter } + +فرض کریں آپ کے پاس Pydantic model `Item` سے صرف ایک `item` body parameter ہے۔ + +پہلے سے، **FastAPI** اس کی body براہ راست توقع کرے گا۔ + +لیکن اگر آپ چاہتے ہیں کہ یہ ایک JSON کی توقع کرے جس میں key `item` ہو اور اس کے اندر model کا مواد، جیسا کہ اضافی body parameters اعلان کرنے پر ہوتا ہے، تو آپ خاص `Body` parameter `embed` استعمال کر سکتے ہیں: + +```Python +item: Item = Body(embed=True) +``` + +جیسے: + +{* ../../docs_src/body_multiple_params/tutorial005_an_py310.py hl[17] *} + + +اس صورت میں **FastAPI** اس طرح کی body کی توقع کرے گا: + +```JSON hl_lines="2" +{ + "item": { + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 + } +} +``` + +اس کی بجائے: + +```JSON +{ + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2 +} +``` + +## خلاصہ { #recap } + +آپ اپنے *path operation function* میں متعدد body parameters شامل کر سکتے ہیں، اگرچہ ایک request میں صرف ایک body ہو سکتی ہے۔ + +لیکن **FastAPI** اسے سنبھالے گا، آپ کو آپ کے function میں صحیح ڈیٹا دے گا، اور *path operation* میں صحیح schema کی توثیق اور دستاویز بنائے گا۔ + +آپ واحد اقدار کو body کے حصے کے طور پر وصول کرنے کا بھی اعلان کر سکتے ہیں۔ + +اور آپ **FastAPI** کو ہدایت دے سکتے ہیں کہ body کو ایک key میں embed کرے چاہے صرف ایک parameter اعلان کیا گیا ہو۔ diff --git a/docs/ur/docs/tutorial/body-nested-models.md b/docs/ur/docs/tutorial/body-nested-models.md new file mode 100644 index 000000000..b49fd7c69 --- /dev/null +++ b/docs/ur/docs/tutorial/body-nested-models.md @@ -0,0 +1,221 @@ +# Body - Nested Models { #body-nested-models } + +**FastAPI** کے ساتھ، آپ من مانی گہرائی سے nested models بنا سکتے، توثیق کر سکتے، دستاویز بنا سکتے اور استعمال کر سکتے ہیں (Pydantic کی بدولت)۔ + +## List fields { #list-fields } + +آپ کسی attribute کو ذیلی قسم کے طور پر بنا سکتے ہیں۔ مثال کے طور پر، Python `list`: + +{* ../../docs_src/body_nested_models/tutorial001_py310.py hl[12] *} + +یہ `tags` کو list بنائے گا، اگرچہ یہ list کے عناصر کی قسم اعلان نہیں کرتا۔ + +## Type parameter کے ساتھ List fields { #list-fields-with-type-parameter } + +لیکن Python میں اندرونی اقسام، یا "type parameters" کے ساتھ lists اعلان کرنے کا ایک مخصوص طریقہ ہے: + +### Type parameter کے ساتھ `list` اعلان کریں { #declare-a-list-with-a-type-parameter } + +ایسی اقسام اعلان کرنے کے لیے جن میں type parameters (اندرونی اقسام) ہوں، جیسے `list`، `dict`، `tuple`، +اندرونی قسم(قسمیں) "type parameters" کے طور پر مربع بریکٹ استعمال کر کے دیں: `[` اور `]` + +```Python +my_list: list[str] +``` + +یہ سب معیاری Python syntax ہے type declarations کے لیے۔ + +اندرونی اقسام کے ساتھ model attributes کے لیے وہی معیاری syntax استعمال کریں۔ + +تو، ہماری مثال میں، ہم `tags` کو خاص طور پر "strings کی list" بنا سکتے ہیں: + +{* ../../docs_src/body_nested_models/tutorial002_py310.py hl[12] *} + +## Set types { #set-types } + +لیکن پھر ہم سوچتے ہیں اور محسوس کرتے ہیں کہ tags دہرائے نہیں جانے چاہییں، وہ شاید منفرد strings ہوں گے۔ + +اور Python میں منفرد آئٹمز کے sets کے لیے ایک خاص data type ہے، `set`۔ + +پھر ہم `tags` کو strings کے set کے طور پر اعلان کر سکتے ہیں: + +{* ../../docs_src/body_nested_models/tutorial003_py310.py hl[12] *} + +اس کے ساتھ، چاہے آپ کو نقل شدہ ڈیٹا کے ساتھ request ملے، اسے منفرد آئٹمز کے set میں تبدیل کر دیا جائے گا۔ + +اور جب بھی آپ وہ ڈیٹا نکالیں گے، چاہے ماخذ میں نقل ہو، اسے منفرد آئٹمز کے set کے طور پر نکالا جائے گا۔ + +اور اس کے مطابق تشریح / دستاویز بھی بنائی جائے گی۔ + +## Nested Models { #nested-models } + +Pydantic model کی ہر attribute کی ایک قسم ہوتی ہے۔ + +لیکن وہ قسم خود بھی ایک اور Pydantic model ہو سکتی ہے۔ + +تو، آپ مخصوص attribute ناموں، اقسام اور validations کے ساتھ گہرے nested JSON "objects" اعلان کر سکتے ہیں۔ + +یہ سب، من مانی گہرائی سے nested۔ + +### ذیلی model بنائیں { #define-a-submodel } + +مثال کے طور پر، ہم ایک `Image` model بنا سکتے ہیں: + +{* ../../docs_src/body_nested_models/tutorial004_py310.py hl[7:9] *} + +### ذیلی model کو بطور قسم استعمال کریں { #use-the-submodel-as-a-type } + +اور پھر ہم اسے کسی attribute کی قسم کے طور پر استعمال کر سکتے ہیں: + +{* ../../docs_src/body_nested_models/tutorial004_py310.py hl[18] *} + +اس کا مطلب ہوگا کہ **FastAPI** اس طرح کی body کی توقع کرے گا: + +```JSON +{ + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2, + "tags": ["rock", "metal", "bar"], + "image": { + "url": "http://example.com/baz.jpg", + "name": "The Foo live" + } +} +``` + +ایک بار پھر، صرف وہ اعلان کر کے، **FastAPI** کے ساتھ آپ کو ملتا ہے: + +* Nested models کے لیے بھی ایڈیٹر سپورٹ (completion وغیرہ) +* ڈیٹا کی تبدیلی +* ڈیٹا کی توثیق +* خودکار دستاویزات + +## خاص اقسام اور توثیق { #special-types-and-validation } + +عام واحد اقسام جیسے `str`، `int`، `float` وغیرہ کے علاوہ آپ مزید پیچیدہ واحد اقسام استعمال کر سکتے ہیں جو `str` سے وراثت حاصل کرتی ہیں۔ + +تمام دستیاب آپشنز دیکھنے کے لیے، [Pydantic کا Type Overview](https://docs.pydantic.dev/latest/concepts/types/) دیکھیں۔ آپ اگلے باب میں کچھ مثالیں دیکھیں گے۔ + +مثال کے طور پر، جیسے `Image` model میں ہمارے پاس `url` فیلڈ ہے، ہم `str` کی بجائے Pydantic کے `HttpUrl` کا اعلان کر سکتے ہیں: + +{* ../../docs_src/body_nested_models/tutorial005_py310.py hl[2,8] *} + +String کو درست URL ہونے کے لیے جانچا جائے گا، اور JSON Schema / OpenAPI میں اسی طرح دستاویز بنائی جائے گی۔ + +## ذیلی models کی lists والی Attributes { #attributes-with-lists-of-submodels } + +آپ Pydantic models کو `list`، `set` وغیرہ کی ذیلی اقسام کے طور پر بھی استعمال کر سکتے ہیں: + +{* ../../docs_src/body_nested_models/tutorial006_py310.py hl[18] *} + +یہ اس طرح کی JSON body کی توقع کرے گا (تبدیل، توثیق، دستاویز وغیرہ): + +```JSON hl_lines="11" +{ + "name": "Foo", + "description": "The pretender", + "price": 42.0, + "tax": 3.2, + "tags": [ + "rock", + "metal", + "bar" + ], + "images": [ + { + "url": "http://example.com/baz.jpg", + "name": "The Foo live" + }, + { + "url": "http://example.com/dave.jpg", + "name": "The Baz" + } + ] +} +``` + +/// info | معلومات + +غور کریں کہ `images` key میں اب image objects کی list ہے۔ + +/// + +## گہرے nested models { #deeply-nested-models } + +آپ من مانی گہرائی سے nested models بنا سکتے ہیں: + +{* ../../docs_src/body_nested_models/tutorial007_py310.py hl[7,12,18,21,25] *} + +/// info | معلومات + +غور کریں کہ `Offer` میں `Item`s کی list ہے، جن میں بدلے میں اختیاری `Image`s کی list ہے۔ + +/// + +## خالص lists کی Bodies { #bodies-of-pure-lists } + +اگر آپ جس JSON body کی توقع کر رہے ہیں اس کی اعلیٰ ترین قدر JSON `array` (Python `list`) ہے، تو آپ function کے parameter میں قسم کا اعلان کر سکتے ہیں، بالکل Pydantic models کی طرح: + +```Python +images: list[Image] +``` + +جیسے: + +{* ../../docs_src/body_nested_models/tutorial008_py310.py hl[13] *} + +## ہر جگہ ایڈیٹر سپورٹ { #editor-support-everywhere } + +اور آپ کو ہر جگہ ایڈیٹر سپورٹ ملتی ہے۔ + +یہاں تک کہ lists کے اندر آئٹمز کے لیے بھی: + + + +اگر آپ Pydantic models کی بجائے براہ راست `dict` کے ساتھ کام کر رہے ہوتے تو آپ کو اس طرح کی ایڈیٹر سپورٹ نہیں ملتی۔ + +لیکن آپ کو ان کی فکر کرنے کی ضرورت نہیں، آنے والے dicts خودکار طور پر تبدیل ہو جاتے ہیں اور آپ کا آؤٹ پٹ بھی خودکار طور پر JSON میں تبدیل ہو جاتا ہے۔ + +## من مانی `dict`s کی Bodies { #bodies-of-arbitrary-dicts } + +آپ body کو ایسے `dict` کے طور پر بھی اعلان کر سکتے ہیں جس کی keys کسی قسم کی ہوں اور values کسی اور قسم کی۔ + +اس طرح، آپ کو پہلے سے معلوم ہونے کی ضرورت نہیں کہ درست فیلڈ/attribute نام کیا ہیں (جیسا کہ Pydantic models کی صورت میں ہوتا)۔ + +یہ مفید ہوگا اگر آپ ایسی keys وصول کرنا چاہتے ہیں جو آپ پہلے سے نہیں جانتے۔ + +--- + +ایک اور مفید صورت یہ ہے جب آپ کسی اور قسم (مثلاً `int`) کی keys رکھنا چاہیں۔ + +یہی ہم یہاں دیکھنے والے ہیں۔ + +اس صورت میں، آپ کوئی بھی `dict` قبول کریں گے بشرطیکہ اس میں `int` keys ہوں اور `float` values ہوں: + +{* ../../docs_src/body_nested_models/tutorial009_py310.py hl[7] *} + +/// tip | مشورہ + +یاد رکھیں کہ JSON صرف `str` کو keys کے طور پر تعاون کرتا ہے۔ + +لیکن Pydantic میں خودکار ڈیٹا تبدیلی ہے۔ + +اس کا مطلب ہے کہ، اگرچہ آپ کے API clients صرف strings بطور keys بھیج سکتے ہیں، جب تک وہ strings خالص integers رکھتی ہیں، Pydantic انہیں تبدیل اور توثیق کرے گا۔ + +اور جو `dict` آپ `weights` کے طور پر وصول کریں گے اس میں دراصل `int` keys اور `float` values ہوں گی۔ + +/// + +## خلاصہ { #recap } + +**FastAPI** کے ساتھ آپ کو Pydantic models کی فراہم کردہ زیادہ سے زیادہ لچک ملتی ہے، جبکہ آپ کا کوڈ سادہ، مختصر اور خوبصورت رہتا ہے۔ + +تمام فوائد کے ساتھ: + +* ایڈیٹر سپورٹ (ہر جگہ completion!) +* ڈیٹا کی تبدیلی (جسے parsing / serialization بھی کہتے ہیں) +* ڈیٹا کی توثیق +* Schema دستاویزات +* خودکار docs diff --git a/docs/ur/docs/tutorial/body-updates.md b/docs/ur/docs/tutorial/body-updates.md new file mode 100644 index 000000000..b6771bbd3 --- /dev/null +++ b/docs/ur/docs/tutorial/body-updates.md @@ -0,0 +1,100 @@ +# Body - اپ ڈیٹس { #body-updates } + +## `PUT` کے ساتھ مکمل تبدیلی { #update-replacing-with-put } + +کسی آئٹم کو اپ ڈیٹ کرنے کے لیے آپ [HTTP `PUT`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT) operation استعمال کر سکتے ہیں۔ + +آپ `jsonable_encoder` استعمال کر سکتے ہیں تاکہ ان پٹ ڈیٹا کو اس ڈیٹا میں تبدیل کریں جو JSON کے طور پر محفوظ کیا جا سکے (مثلاً NoSQL ڈیٹابیس کے ساتھ)۔ مثال کے طور پر، `datetime` کو `str` میں تبدیل کرنا۔ + +{* ../../docs_src/body_updates/tutorial001_py310.py hl[28:33] *} + +`PUT` ایسا ڈیٹا وصول کرنے کے لیے استعمال ہوتا ہے جو موجودہ ڈیٹا کی جگہ لے۔ + +### تبدیلی کے بارے میں انتباہ { #warning-about-replacing } + +اس کا مطلب ہے کہ اگر آپ آئٹم `bar` کو `PUT` استعمال کر کے اس body کے ساتھ اپ ڈیٹ کرنا چاہتے ہیں: + +```Python +{ + "name": "Barz", + "price": 3, + "description": None, +} +``` + +چونکہ اس میں پہلے سے محفوظ attribute `"tax": 20.2` شامل نہیں ہے، ان پٹ model طے شدہ قدر `"tax": 10.5` لے گا۔ + +اور ڈیٹا اس "نئے" `tax` یعنی `10.5` کے ساتھ محفوظ ہوگا۔ + +## `PATCH` کے ساتھ جزوی اپ ڈیٹس { #partial-updates-with-patch } + +آپ ڈیٹا کو *جزوی طور پر* اپ ڈیٹ کرنے کے لیے [HTTP `PATCH`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) operation بھی استعمال کر سکتے ہیں۔ + +اس کا مطلب ہے کہ آپ صرف وہ ڈیٹا بھیج سکتے ہیں جو آپ اپ ڈیٹ کرنا چاہتے ہیں، باقی کو جوں کا توں چھوڑ کر۔ + +/// note | نوٹ + +`PATCH` `PUT` کے مقابلے میں کم استعمال ہوتا اور جانا جاتا ہے۔ + +اور بہت سی ٹیمیں صرف `PUT` استعمال کرتی ہیں، جزوی اپ ڈیٹس کے لیے بھی۔ + +آپ انہیں جیسے چاہیں استعمال کرنے کے لیے **آزاد** ہیں، **FastAPI** کوئی پابندی نہیں لگاتا۔ + +لیکن یہ گائیڈ آپ کو کم و بیش دکھاتا ہے کہ ان کا مقصد کیا ہے۔ + +/// + +### Pydantic کا `exclude_unset` parameter استعمال کرنا { #using-pydantics-exclude-unset-parameter } + +اگر آپ جزوی اپ ڈیٹس وصول کرنا چاہتے ہیں، تو Pydantic کے model کے `.model_dump()` میں `exclude_unset` parameter بہت مفید ہے۔ + +جیسے `item.model_dump(exclude_unset=True)`۔ + +یہ صرف اس ڈیٹا کے ساتھ `dict` بنائے گا جو `item` model بناتے وقت سیٹ کیا گیا تھا، طے شدہ اقدار کو خارج کر کے۔ + +پھر آپ اسے استعمال کر سکتے ہیں تاکہ صرف اس ڈیٹا کے ساتھ `dict` بنائیں جو سیٹ کیا گیا تھا (request میں بھیجا گیا)، طے شدہ اقدار کو چھوڑ کر: + +{* ../../docs_src/body_updates/tutorial002_py310.py hl[32] *} + +### Pydantic کا `update` parameter استعمال کرنا { #using-pydantics-update-parameter } + +اب، آپ `.model_copy()` استعمال کر کے موجودہ model کی نقل بنا سکتے ہیں، اور `update` parameter میں اپ ڈیٹ کرنے والے ڈیٹا کے ساتھ `dict` دے سکتے ہیں۔ + +جیسے `stored_item_model.model_copy(update=update_data)`: + +{* ../../docs_src/body_updates/tutorial002_py310.py hl[33] *} + +### جزوی اپ ڈیٹس کا خلاصہ { #partial-updates-recap } + +خلاصہ یہ ہے کہ جزوی اپ ڈیٹس لاگو کرنے کے لیے آپ: + +* (اختیاری طور پر) `PUT` کی بجائے `PATCH` استعمال کریں۔ +* محفوظ شدہ ڈیٹا حاصل کریں۔ +* وہ ڈیٹا Pydantic model میں رکھیں۔ +* ان پٹ model سے طے شدہ اقدار کے بغیر `dict` بنائیں (`exclude_unset` استعمال کر کے)۔ + * اس طرح آپ صرف وہ اقدار اپ ڈیٹ کر سکتے ہیں جو صارف نے واقعی سیٹ کی ہیں، پہلے سے محفوظ اقدار کو اپنے model کی طے شدہ اقدار سے اوور رائیڈ کرنے کی بجائے۔ +* محفوظ model کی نقل بنائیں، وصول شدہ جزوی اپ ڈیٹس کے ساتھ اس کی attributes اپ ڈیٹ کر کے (`update` parameter استعمال کر کے)۔ +* نقل شدہ model کو کسی ایسی چیز میں تبدیل کریں جو آپ کے DB میں محفوظ ہو سکے (مثال کے طور پر، `jsonable_encoder` استعمال کر کے)۔ + * یہ model کا `.model_dump()` method دوبارہ استعمال کرنے کے مشابہ ہے، لیکن یہ یقینی بناتا ہے (اور تبدیل کرتا ہے) اقدار کو ایسی data types میں جو JSON میں تبدیل ہو سکیں، مثلاً `datetime` کو `str` میں۔ +* ڈیٹا اپنے DB میں محفوظ کریں۔ +* اپ ڈیٹ شدہ model واپس کریں۔ + +{* ../../docs_src/body_updates/tutorial002_py310.py hl[28:35] *} + +/// tip | مشورہ + +آپ دراصل HTTP `PUT` operation کے ساتھ بھی یہی تکنیک استعمال کر سکتے ہیں۔ + +لیکن یہاں مثال `PATCH` استعمال کرتی ہے کیونکہ یہ انہی استعمال کے معاملات کے لیے بنائی گئی تھی۔ + +/// + +/// note | نوٹ + +غور کریں کہ ان پٹ model کی پھر بھی توثیق ہوتی ہے۔ + +تو، اگر آپ جزوی اپ ڈیٹس وصول کرنا چاہتے ہیں جو تمام attributes کو چھوڑ سکیں، تو آپ کو ایسا model رکھنا ہوگا جس کی تمام attributes اختیاری ہوں (طے شدہ اقدار یا `None` کے ساتھ)۔ + +**اپ ڈیٹس** کے لیے تمام اختیاری اقدار والے models اور **تخلیق** کے لیے لازمی اقدار والے models میں فرق کرنے کے لیے، آپ [اضافی Models](extra-models.md) میں بیان کردہ خیالات استعمال کر سکتے ہیں۔ + +/// diff --git a/docs/ur/docs/tutorial/body.md b/docs/ur/docs/tutorial/body.md new file mode 100644 index 000000000..e7a988b3f --- /dev/null +++ b/docs/ur/docs/tutorial/body.md @@ -0,0 +1,166 @@ +# Request Body { #request-body } + +جب آپ کو client (مثلاً براؤزر) سے اپنی API کو ڈیٹا بھیجنا ہو، تو آپ اسے **request body** کے طور پر بھیجتے ہیں۔ + +**Request** body وہ ڈیٹا ہے جو client آپ کی API کو بھیجتا ہے۔ **Response** body وہ ڈیٹا ہے جو آپ کی API client کو بھیجتی ہے۔ + +آپ کی API کو تقریباً ہمیشہ **response** body بھیجنا ہوتا ہے۔ لیکن clients کو ہمیشہ **request bodies** بھیجنے کی ضرورت نہیں ہوتی، بعض اوقات وہ صرف ایک path request کرتے ہیں، شاید کچھ query parameters کے ساتھ، لیکن body نہیں بھیجتے۔ + +**Request** body کا اعلان کرنے کے لیے، آپ [Pydantic](https://docs.pydantic.dev/) models استعمال کرتے ہیں ان کی تمام طاقت اور فوائد کے ساتھ۔ + +/// info | معلومات + +ڈیٹا بھیجنے کے لیے، آپ کو ان میں سے ایک استعمال کرنا چاہیے: `POST` (سب سے عام)، `PUT`، `DELETE` یا `PATCH`۔ + +`GET` request کے ساتھ body بھیجنا تصریحات میں غیر متعین رویہ رکھتا ہے، بہرحال، FastAPI اسے صرف بہت پیچیدہ/انتہائی استعمال کے معاملات کے لیے تعاون کرتا ہے۔ + +چونکہ اس کی حوصلہ شکنی کی جاتی ہے، Swagger UI کے ساتھ انٹرایکٹو docs `GET` استعمال کرتے وقت body کی دستاویزات نہیں دکھائیں گے، اور درمیان میں proxies شاید اسے تعاون نہ کریں۔ + +/// + +## Pydantic کا `BaseModel` import کریں { #import-pydantics-basemodel } + +سب سے پہلے، آپ کو `pydantic` سے `BaseModel` import کرنا ہوگا: + +{* ../../docs_src/body/tutorial001_py310.py hl[2] *} + +## اپنا ڈیٹا model بنائیں { #create-your-data-model } + +پھر آپ اپنا ڈیٹا model ایک class کے طور پر اعلان کریں جو `BaseModel` سے وراثت حاصل کرے۔ + +تمام attributes کے لیے معیاری Python types استعمال کریں: + +{* ../../docs_src/body/tutorial001_py310.py hl[5:9] *} + + +Query parameters کا اعلان کرتے وقت جیسا ہوتا ہے، ویسے ہی جب model attribute کی طے شدہ قدر ہو، یہ لازمی نہیں ہوتا۔ ورنہ، یہ لازمی ہے۔ اسے محض اختیاری بنانے کے لیے `None` استعمال کریں۔ + +مثال کے طور پر، اوپر والا model ایک JSON "`object`" (یا Python `dict`) کا اعلان کرتا ہے جیسے: + +```JSON +{ + "name": "Foo", + "description": "An optional description", + "price": 45.2, + "tax": 3.5 +} +``` + +...چونکہ `description` اور `tax` اختیاری ہیں (`None` کی طے شدہ قدر کے ساتھ)، یہ JSON "`object`" بھی درست ہوگا: + +```JSON +{ + "name": "Foo", + "price": 45.2 +} +``` + +## اسے parameter کے طور پر اعلان کریں { #declare-it-as-a-parameter } + +اسے اپنے *path operation* میں شامل کرنے کے لیے، اسے اسی طرح اعلان کریں جیسے آپ نے path اور query parameters کا اعلان کیا: + +{* ../../docs_src/body/tutorial001_py310.py hl[16] *} + +...اور اس کی قسم آپ کے بنائے ہوئے model، `Item` کے طور پر اعلان کریں۔ + +## نتائج { #results } + +صرف اس Python type declaration کے ساتھ، **FastAPI** یہ کرے گا: + +* Request کی body کو JSON کے طور پر پڑھے گا۔ +* متعلقہ اقسام کو تبدیل کرے گا (اگر ضرورت ہو)۔ +* ڈیٹا کی توثیق کرے گا۔ + * اگر ڈیٹا غلط ہے، تو یہ ایک اچھی اور واضح error واپس کرے گا، بالکل بتاتے ہوئے کہ غلط ڈیٹا کہاں اور کیا تھا۔ +* آپ کو وصول شدہ ڈیٹا parameter `item` میں دے گا۔ + * چونکہ آپ نے function میں اسے `Item` قسم کا اعلان کیا ہے، آپ کو تمام attributes اور ان کی اقسام کے لیے ایڈیٹر سپورٹ (completion وغیرہ) بھی ملے گی۔ +* آپ کے model کے لیے [JSON Schema](https://json-schema.org) تعریفات تیار کرے گا، آپ انہیں کہیں بھی استعمال کر سکتے ہیں اگر یہ آپ کے پراجیکٹ کے لیے مناسب ہو۔ +* وہ schemas تیار کردہ OpenAPI schema کا حصہ ہوں گے، اور خودکار دستاویزاتی UIs کے ذریعے استعمال ہوں گے۔ + +## خودکار دستاویزات { #automatic-docs } + +آپ کے models کے JSON Schemas آپ کے OpenAPI تیار کردہ schema کا حصہ ہوں گے، اور انٹرایکٹو API docs میں دکھائے جائیں گے: + + + +اور ہر *path operation* کے اندر API docs میں بھی استعمال ہوں گے جنہیں ان کی ضرورت ہو: + + + +## ایڈیٹر سپورٹ { #editor-support } + +آپ کے ایڈیٹر میں، آپ کے function کے اندر آپ کو ہر جگہ type hints اور completion ملے گی (یہ نہیں ہوتا اگر آپ Pydantic model کی بجائے `dict` وصول کرتے): + + + +آپ کو غلط type operations کے لیے error checks بھی ملتے ہیں: + + + +یہ اتفاق سے نہیں ہے، پورا framework اسی ڈیزائن کے گرد بنایا گیا تھا۔ + +اور کسی بھی عملدرآمد سے پہلے، ڈیزائن مرحلے میں ہی اس کی مکمل جانچ کی گئی تھی، تاکہ یقینی بنایا جا سکے کہ یہ تمام ایڈیٹرز کے ساتھ کام کرے گا۔ + +یہاں تک کہ اس کی تعاون کے لیے خود Pydantic میں بھی کچھ تبدیلیاں کی گئیں۔ + +پچھلے screenshots [Visual Studio Code](https://code.visualstudio.com) سے لیے گئے تھے۔ + +لیکن آپ کو [PyCharm](https://www.jetbrains.com/pycharm/) اور زیادہ تر دوسرے Python ایڈیٹرز کے ساتھ بھی وہی ایڈیٹر سپورٹ ملے گی: + + + +/// tip | مشورہ + +اگر آپ [PyCharm](https://www.jetbrains.com/pycharm/) کو اپنے ایڈیٹر کے طور پر استعمال کرتے ہیں، تو آپ [Pydantic PyCharm Plugin](https://github.com/koxudaxi/pydantic-pycharm-plugin/) استعمال کر سکتے ہیں۔ + +یہ Pydantic models کے لیے ایڈیٹر سپورٹ بہتر کرتا ہے، اس کے ساتھ: + +* auto-completion +* type checks +* refactoring +* تلاش +* inspections + +/// + +## Model استعمال کریں { #use-the-model } + +Function کے اندر، آپ model object کے تمام attributes تک براہ راست رسائی حاصل کر سکتے ہیں: + +{* ../../docs_src/body/tutorial002_py310.py *} + +## Request body + path parameters { #request-body-path-parameters } + +آپ path parameters اور request body ایک ساتھ اعلان کر سکتے ہیں۔ + +**FastAPI** پہچان لے گا کہ وہ function parameters جو path parameters سے مماثل ہیں **path سے لیے جائیں**، اور وہ function parameters جو Pydantic models کے طور پر اعلان کیے گئے ہیں **request body سے لیے جائیں**۔ + +{* ../../docs_src/body/tutorial003_py310.py hl[15:16] *} + + +## Request body + path + query parameters { #request-body-path-query-parameters } + +آپ **body**، **path** اور **query** parameters سب ایک ساتھ بھی اعلان کر سکتے ہیں۔ + +**FastAPI** ہر ایک کو پہچان لے گا اور صحیح جگہ سے ڈیٹا لے گا۔ + +{* ../../docs_src/body/tutorial004_py310.py hl[16] *} + +Function parameters کو اس طرح پہچانا جائے گا: + +* اگر parameter **path** میں بھی اعلان کیا گیا ہے، تو اسے path parameter کے طور پر استعمال کیا جائے گا۔ +* اگر parameter **واحد قسم** (جیسے `int`، `float`، `str`، `bool` وغیرہ) کا ہے تو اسے **query** parameter سمجھا جائے گا۔ +* اگر parameter **Pydantic model** کی قسم کا اعلان کیا گیا ہے، تو اسے request **body** سمجھا جائے گا۔ + +/// note | نوٹ + +FastAPI جان لے گا کہ `q` کی قدر لازمی نہیں ہے کیونکہ اس کی طے شدہ قدر `= None` ہے۔ + +`str | None` FastAPI کے ذریعے یہ تعین کرنے کے لیے استعمال نہیں ہوتا کہ قدر لازمی نہیں ہے، یہ جانتا ہے کہ لازمی نہیں ہے کیونکہ اس کی طے شدہ قدر `= None` ہے۔ + +لیکن type annotations شامل کرنے سے آپ کا ایڈیٹر آپ کو بہتر سپورٹ دے سکے گا اور errors کا پتہ لگا سکے گا۔ + +/// + +## Pydantic کے بغیر { #without-pydantic } + +اگر آپ Pydantic models استعمال نہیں کرنا چاہتے، تو آپ **Body** parameters بھی استعمال کر سکتے ہیں۔ دستاویزات دیکھیں [Body - Multiple Parameters: Body میں واحد اقدار](body-multiple-params.md#singular-values-in-body)۔ diff --git a/docs/ur/docs/tutorial/cookie-param-models.md b/docs/ur/docs/tutorial/cookie-param-models.md new file mode 100644 index 000000000..9613c20ac --- /dev/null +++ b/docs/ur/docs/tutorial/cookie-param-models.md @@ -0,0 +1,76 @@ +# Cookie Parameter Models { #cookie-parameter-models } + +اگر آپ کے پاس ایک دوسرے سے متعلقہ **cookies** کا گروپ ہے، تو آپ انہیں declare کرنے کے لیے ایک **Pydantic model** بنا سکتے ہیں۔ 🍪 + +اس سے آپ کو **model کو کئی جگہوں پر دوبارہ استعمال** کرنے اور تمام parameters کے لیے validations اور metadata ایک ساتھ declare کرنے کی سہولت ملے گی۔ 😎 + +/// note | نوٹ + +یہ FastAPI version `0.115.0` سے supported ہے۔ 🤓 + +/// + +/// tip | مشورہ + +یہی تکنیک `Query`، `Cookie`، اور `Header` پر بھی لاگو ہوتی ہے۔ 😎 + +/// + +## Pydantic Model کے ساتھ Cookies { #cookies-with-a-pydantic-model } + +وہ **cookie** parameters جو آپ کو درکار ہیں انہیں ایک **Pydantic model** میں declare کریں، اور پھر parameter کو `Cookie` کے طور پر declare کریں: + +{* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *} + +**FastAPI** request میں موصول ہونے والی **cookies** سے **ہر field** کا ڈیٹا **extract** کرے گا اور آپ کو وہ Pydantic model دے گا جو آپ نے define کیا ہے۔ + +## Docs چیک کریں { #check-the-docs } + +آپ `/docs` پر docs UI میں defined cookies دیکھ سکتے ہیں: + +
+ +
+ +/// info | معلومات + +یہ بات ذہن میں رکھیں کہ **browsers cookies** کو خاص طریقے سے اور پردے کے پیچھے handle کرتے ہیں، اور وہ **JavaScript** کو آسانی سے انہیں چھونے **نہیں** دیتے۔ + +اگر آپ `/docs` پر **API docs UI** میں جائیں تو آپ اپنی *path operations* کے لیے cookies کی **documentation** دیکھ سکیں گے۔ + +لیکن اگر آپ **ڈیٹا بھریں** اور "Execute" پر کلک کریں، تو چونکہ docs UI **JavaScript** کے ساتھ کام کرتا ہے، cookies بھیجی نہیں جائیں گی، اور آپ کو ایک **error** پیغام نظر آئے گا جیسے آپ نے کوئی قدر نہیں لکھی۔ + +/// + +## اضافی Cookies پر پابندی { #forbid-extra-cookies } + +بعض خاص استعمال کے معاملات میں (شاید بہت عام نہیں)، آپ ان cookies کو **محدود** کرنا چاہ سکتے ہیں جو آپ وصول کرنا چاہتے ہیں۔ + +آپ کی API کے پاس اب اپنی cookie consent کو کنٹرول کرنے کی طاقت ہے۔ 🤪🍪 + +آپ Pydantic کی model configuration استعمال کر کے کسی بھی `extra` fields کو `forbid` کر سکتے ہیں: + +{* ../../docs_src/cookie_param_models/tutorial002_an_py310.py hl[10] *} + +اگر کوئی client کچھ **اضافی cookies** بھیجنے کی کوشش کرے، تو اسے ایک **error** response ملے گا۔ + +بیچارے cookie banners جنہوں نے آپ کی رضامندی حاصل کرنے کی اتنی محنت کی تاکہ API اسے رد کر دے۔ 🍪 + +مثال کے طور پر، اگر client `santa_tracker` cookie کو `good-list-please` کی قدر کے ساتھ بھیجنے کی کوشش کرے، تو client کو ایک **error** response ملے گا جو بتائے گا کہ `santa_tracker` cookie کی اجازت نہیں ہے: + +```json +{ + "detail": [ + { + "type": "extra_forbidden", + "loc": ["cookie", "santa_tracker"], + "msg": "Extra inputs are not permitted", + "input": "good-list-please", + } + ] +} +``` + +## خلاصہ { #summary } + +آپ **Pydantic models** استعمال کر کے **FastAPI** میں **cookies** declare کر سکتے ہیں۔ 😎 diff --git a/docs/ur/docs/tutorial/cookie-params.md b/docs/ur/docs/tutorial/cookie-params.md new file mode 100644 index 000000000..8531dc60f --- /dev/null +++ b/docs/ur/docs/tutorial/cookie-params.md @@ -0,0 +1,45 @@ +# Cookie Parameters { #cookie-parameters } + +آپ Cookie parameters کو اسی طرح define کر سکتے ہیں جیسے آپ `Query` اور `Path` parameters define کرتے ہیں۔ + +## `Cookie` Import کریں { #import-cookie } + +سب سے پہلے `Cookie` import کریں: + +{* ../../docs_src/cookie_params/tutorial001_an_py310.py hl[3] *} + +## `Cookie` parameters declare کریں { #declare-cookie-parameters } + +پھر cookie parameters کو اسی طریقے سے declare کریں جیسے `Path` اور `Query` کے ساتھ کرتے ہیں۔ + +آپ default value کے ساتھ ساتھ تمام اضافی validation یا annotation parameters بھی define کر سکتے ہیں: + +{* ../../docs_src/cookie_params/tutorial001_an_py310.py hl[9] *} + +/// note | تکنیکی تفصیلات + +`Cookie` ایک "بہن" class ہے `Path` اور `Query` کی۔ یہ بھی اسی مشترکہ `Param` class سے inherit کرتی ہے۔ + +لیکن یاد رکھیں کہ جب آپ `fastapi` سے `Query`، `Path`، `Cookie` اور دیگر import کرتے ہیں، تو یہ دراصل ایسے functions ہیں جو خاص classes واپس کرتے ہیں۔ + +/// + +/// info | معلومات + +Cookies declare کرنے کے لیے آپ کو `Cookie` استعمال کرنا ضروری ہے، ورنہ parameters کو query parameters سمجھا جائے گا۔ + +/// + +/// info | معلومات + +یہ بات ذہن میں رکھیں کہ **browsers cookies** کو خاص طریقے سے اور پردے کے پیچھے handle کرتے ہیں، اور وہ **JavaScript** کو آسانی سے انہیں چھونے **نہیں** دیتے۔ + +اگر آپ `/docs` پر **API docs UI** میں جائیں تو آپ اپنی *path operations* کے لیے cookies کی **documentation** دیکھ سکیں گے۔ + +لیکن اگر آپ **ڈیٹا بھریں** اور "Execute" پر کلک کریں، تو چونکہ docs UI **JavaScript** کے ساتھ کام کرتا ہے، cookies بھیجی نہیں جائیں گی، اور آپ کو ایک **error** پیغام نظر آئے گا جیسے آپ نے کوئی قدر نہیں لکھی۔ + +/// + +## خلاصہ { #recap } + +Cookies کو `Cookie` کے ساتھ declare کریں، اسی عام pattern کو استعمال کرتے ہوئے جو `Query` اور `Path` کے لیے ہے۔ diff --git a/docs/ur/docs/tutorial/cors.md b/docs/ur/docs/tutorial/cors.md new file mode 100644 index 000000000..7f00f4112 --- /dev/null +++ b/docs/ur/docs/tutorial/cors.md @@ -0,0 +1,89 @@ +# CORS (Cross-Origin Resource Sharing) { #cors-cross-origin-resource-sharing } + +[CORS یا "Cross-Origin Resource Sharing"](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) ان صورتحال سے مراد ہے جب browser میں چلنے والا frontend JavaScript code کے ذریعے backend سے بات چیت کرتا ہے، اور backend frontend سے مختلف "origin" پر ہوتا ہے۔ + +## Origin { #origin } + +ایک origin protocol (`http`, `https`)، domain (`myapp.com`, `localhost`, `localhost.tiangolo.com`)، اور port (`80`, `443`, `8080`) کا مجموعہ ہے۔ + +تو، یہ سب مختلف origins ہیں: + +* `http://localhost` +* `https://localhost` +* `http://localhost:8080` + +اگرچہ یہ سب `localhost` پر ہیں، لیکن یہ مختلف protocols یا ports استعمال کرتے ہیں، اس لیے یہ مختلف "origins" ہیں۔ + +## مراحل { #steps } + +تو، فرض کریں آپ کا frontend browser میں `http://localhost:8080` پر چل رہا ہے، اور اس کا JavaScript ایک backend سے بات چیت کرنے کی کوشش کر رہا ہے جو `http://localhost` پر چل رہا ہے (چونکہ ہم نے port نہیں بتایا، browser ڈیفالٹ port `80` فرض کرے گا)۔ + +پھر، browser `:80`-backend کو ایک HTTP `OPTIONS` request بھیجے گا، اور اگر backend مناسب headers بھیجتا ہے جو اس مختلف origin (`http://localhost:8080`) سے بات چیت کی اجازت دیتے ہیں تو `:8080`-browser frontend میں موجود JavaScript کو `:80`-backend کو اپنی request بھیجنے دے گا۔ + +اس کے لیے، `:80`-backend کے پاس "اجازت یافتہ origins" کی فہرست ہونی چاہیے۔ + +اس صورت میں، فہرست میں `http://localhost:8080` شامل ہونا ضروری ہے تاکہ `:8080`-frontend درست طریقے سے کام کرے۔ + +## Wildcards { #wildcards } + +فہرست کو `"*"` (ایک "wildcard") قرار دینا بھی ممکن ہے تاکہ تمام origins کو اجازت دی جائے۔ + +لیکن یہ صرف مخصوص قسم کی بات چیت کی اجازت دے گا، credentials سے متعلق ہر چیز کو چھوڑ کر: Cookies، Authorization headers جیسے Bearer Tokens کے ساتھ استعمال ہونے والے، وغیرہ۔ + +تو، سب کچھ درست طریقے سے کام کرنے کے لیے، اجازت یافتہ origins کو واضح طور پر بیان کرنا بہتر ہے۔ + +## `CORSMiddleware` استعمال کریں { #use-corsmiddleware } + +آپ اسے اپنی **FastAPI** application میں `CORSMiddleware` استعمال کرتے ہوئے configure کر سکتے ہیں۔ + +* `CORSMiddleware` import کریں۔ +* اجازت یافتہ origins کی فہرست بنائیں (strings کے طور پر)۔ +* اسے اپنی **FastAPI** application میں بطور "middleware" شامل کریں۔ + +آپ یہ بھی بتا سکتے ہیں کہ آپ کا backend اجازت دیتا ہے: + +* Credentials (Authorization headers، Cookies، وغیرہ)۔ +* مخصوص HTTP methods (`POST`, `PUT`) یا wildcard `"*"` سے سب۔ +* مخصوص HTTP headers یا wildcard `"*"` سے سب۔ + +{* ../../docs_src/cors/tutorial001_py310.py hl[2,6:11,13:19] *} + + +`CORSMiddleware` implementation کے ذریعے استعمال ہونے والے ڈیفالٹ parameters پہلے سے پابندی والے ہیں، لہذا آپ کو واضح طور پر مخصوص origins، methods، یا headers کو فعال کرنا ہوگا تاکہ browsers کو Cross-Domain context میں انہیں استعمال کرنے کی اجازت ملے۔ + +درج ذیل arguments کی حمایت کی جاتی ہے: + +* `allow_origins` - origins کی فہرست جنہیں cross-origin requests کرنے کی اجازت ہونی چاہیے۔ مثلاً `['https://example.org', 'https://www.example.org']`۔ آپ `['*']` استعمال کر سکتے ہیں کسی بھی origin کو اجازت دینے کے لیے۔ +* `allow_origin_regex` - ایک regex string جو ان origins سے match کرے جنہیں cross-origin requests کرنے کی اجازت ہونی چاہیے۔ مثلاً `'https://.*\.example\.org'`۔ +* `allow_methods` - HTTP methods کی فہرست جنہیں cross-origin requests کے لیے اجازت ہونی چاہیے۔ ڈیفالٹ `['GET']` ہے۔ آپ `['*']` استعمال کر سکتے ہیں تمام معیاری methods کی اجازت دینے کے لیے۔ +* `allow_headers` - HTTP request headers کی فہرست جنہیں cross-origin requests کے لیے حمایت ملنی چاہیے۔ ڈیفالٹ `[]` ہے۔ آپ `['*']` استعمال کر سکتے ہیں تمام headers کی اجازت دینے کے لیے۔ `Accept`، `Accept-Language`، `Content-Language` اور `Content-Type` headers [سادہ CORS requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests) کے لیے ہمیشہ اجازت یافتہ ہیں۔ +* `allow_credentials` - بتائیں کہ cross-origin requests کے لیے cookies کی حمایت ہونی چاہیے۔ ڈیفالٹ `False` ہے۔ + + اگر `allow_credentials` کو `True` پر سیٹ کیا گیا ہے تو `allow_origins`، `allow_methods` اور `allow_headers` میں سے کسی کو بھی `['*']` پر سیٹ نہیں کیا جا سکتا۔ ان سب کو [واضح طور پر بیان](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards) کیا جانا چاہیے۔ + +* `expose_headers` - ان response headers کو بتائیں جو browser کے لیے قابل رسائی ہونے چاہئیں۔ ڈیفالٹ `[]` ہے۔ +* `max_age` - browsers کے لیے CORS responses کو cache کرنے کا زیادہ سے زیادہ وقت سیکنڈز میں سیٹ کرتا ہے۔ ڈیفالٹ `600` ہے۔ + +middleware دو خاص قسم کی HTTP requests کا جواب دیتا ہے... + +### CORS preflight requests { #cors-preflight-requests } + +یہ کوئی بھی `OPTIONS` request ہے جس میں `Origin` اور `Access-Control-Request-Method` headers ہوں۔ + +اس صورت میں middleware آنے والی request کو روکے گا اور مناسب CORS headers کے ساتھ جواب دے گا، نیز معلوماتی مقاصد کے لیے `200` یا `400` response دے گا۔ + +### سادہ requests { #simple-requests } + +کوئی بھی request جس میں `Origin` header ہو۔ اس صورت میں middleware request کو عام طریقے سے آگے بھیجے گا، لیکن response میں مناسب CORS headers شامل کرے گا۔ + +## مزید معلومات { #more-info } + +CORS کے بارے میں مزید معلومات کے لیے، [Mozilla CORS دستاویزات](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) دیکھیں۔ + +/// note | تکنیکی تفصیلات + +آپ `from starlette.middleware.cors import CORSMiddleware` بھی استعمال کر سکتے ہیں۔ + +**FastAPI** آپ کی سہولت کے لیے `fastapi.middleware` میں کئی middlewares فراہم کرتا ہے۔ لیکن دستیاب middlewares میں سے زیادہ تر براہ راست Starlette سے آتے ہیں۔ + +/// diff --git a/docs/ur/docs/tutorial/debugging.md b/docs/ur/docs/tutorial/debugging.md new file mode 100644 index 000000000..288a220f2 --- /dev/null +++ b/docs/ur/docs/tutorial/debugging.md @@ -0,0 +1,113 @@ +# Debugging { #debugging } + +آپ اپنے editor میں debugger سے connect کر سکتے ہیں، مثال کے طور پر Visual Studio Code یا PyCharm کے ساتھ۔ + +## `uvicorn` کو call کریں { #call-uvicorn } + +اپنی FastAPI application میں، `uvicorn` کو import اور براہ راست چلائیں: + +{* ../../docs_src/debugging/tutorial001_py310.py hl[1,15] *} + +### `__name__ == "__main__"` کے بارے میں { #about-name-main } + +`__name__ == "__main__"` کا بنیادی مقصد یہ ہے کہ کچھ code ہو جو اس وقت execute ہو جب آپ کی فائل اس طرح call کی جائے: + +
+ +```console +$ python myapp.py +``` + +
+ +لیکن اس وقت call نہ ہو جب دوسری فائل اسے import کرے، جیسے: + +```Python +from myapp import app +``` + +#### مزید تفصیلات { #more-details } + +فرض کریں آپ کی فائل کا نام `myapp.py` ہے۔ + +اگر آپ اسے اس طرح چلائیں: + +
+ +```console +$ python myapp.py +``` + +
+ +تو Python کی طرف سے خودکار طور پر بنایا گیا اندرونی variable `__name__` آپ کی فائل میں، بطور قدر string `"__main__"` رکھے گا۔ + +تو، یہ سیکشن: + +```Python + uvicorn.run(app, host="0.0.0.0", port=8000) +``` + +چلے گا۔ + +--- + +اگر آپ اس module (فائل) کو import کریں تو ایسا نہیں ہوگا۔ + +تو، اگر آپ کے پاس ایک اور فائل `importer.py` ہے: + +```Python +from myapp import app + +# Some more code +``` + +اس صورت میں، `myapp.py` کے اندر خودکار طور پر بنایا گیا variable `__name__` قدر `"__main__"` نہیں رکھے گا۔ + +تو، یہ لائن: + +```Python + uvicorn.run(app, host="0.0.0.0", port=8000) +``` + +execute نہیں ہوگی۔ + +/// info | معلومات + +مزید معلومات کے لیے، [سرکاری Python دستاویزات](https://docs.python.org/3/library/__main__.html) دیکھیں۔ + +/// + +## اپنا code debugger کے ساتھ چلائیں { #run-your-code-with-your-debugger } + +چونکہ آپ Uvicorn server کو اپنے code سے براہ راست چلا رہے ہیں، آپ اپنے Python program (آپ کی FastAPI application) کو debugger سے براہ راست call کر سکتے ہیں۔ + +--- + +مثال کے طور پر، Visual Studio Code میں، آپ: + +* "Debug" panel پر جائیں۔ +* "Add configuration..." پر کلک کریں۔ +* "Python" منتخب کریں۔ +* "`Python: Current File (Integrated Terminal)`" اختیار کے ساتھ debugger چلائیں۔ + +یہ آپ کے **FastAPI** code کے ساتھ server شروع کرے گا، آپ کے breakpoints پر رکے گا، وغیرہ۔ + +یہ اس طرح نظر آ سکتا ہے: + + + +--- + +اگر آپ Pycharm استعمال کرتے ہیں، تو آپ: + +* "Run" مینو کھولیں۔ +* "Debug..." اختیار منتخب کریں۔ +* پھر ایک context مینو ظاہر ہوگا۔ +* Debug کرنے کے لیے فائل منتخب کریں (اس صورت میں، `main.py`)۔ + +یہ آپ کے **FastAPI** code کے ساتھ server شروع کرے گا، آپ کے breakpoints پر رکے گا، وغیرہ۔ + +یہ اس طرح نظر آ سکتا ہے: + + diff --git a/docs/ur/docs/tutorial/dependencies/classes-as-dependencies.md b/docs/ur/docs/tutorial/dependencies/classes-as-dependencies.md new file mode 100644 index 000000000..ba1869686 --- /dev/null +++ b/docs/ur/docs/tutorial/dependencies/classes-as-dependencies.md @@ -0,0 +1,288 @@ +# Classes بطور Dependencies { #classes-as-dependencies } + +**Dependency Injection** نظام میں مزید گہرائی میں جانے سے پہلے، آئیے پچھلی مثال کو بہتر بناتے ہیں۔ + +## پچھلی مثال سے ایک `dict` { #a-dict-from-the-previous-example } + +پچھلی مثال میں، ہم اپنی dependency ("dependable") سے ایک `dict` واپس کر رہے تھے: + +{* ../../docs_src/dependencies/tutorial001_an_py310.py hl[9] *} + +لیکن پھر ہمیں *path operation function* کے parameter `commons` میں ایک `dict` ملتا ہے۔ + +اور ہم جانتے ہیں کہ editors `dict` کے لیے زیادہ مدد (جیسے completion) فراہم نہیں کر سکتے، کیونکہ وہ ان کی keys اور value types نہیں جان سکتے۔ + +ہم بہتر کر سکتے ہیں... + +## Dependency کس چیز سے بنتی ہے { #what-makes-a-dependency } + +اب تک آپ نے dependencies کو functions کے طور پر declare ہوتے دیکھا ہے۔ + +لیکن dependencies declare کرنے کا یہ واحد طریقہ نہیں ہے (حالانکہ یہ غالباً سب سے عام طریقہ ہوگا)۔ + +اہم بات یہ ہے کہ dependency ایک "callable" ہونی چاہیے۔ + +Python میں **"callable"** وہ چیز ہے جسے Python ایک function کی طرح "call" کر سکے۔ + +تو، اگر آپ کے پاس ایک object `something` ہے (جو شاید function _نہ_ ہو) اور آپ اسے اس طرح "call" (execute) کر سکتے ہیں: + +```Python +something() +``` + +یا + +```Python +something(some_argument, some_keyword_argument="foo") +``` + +تو یہ "callable" ہے۔ + +## Classes بطور dependencies { #classes-as-dependencies_1 } + +آپ نے شاید محسوس کیا ہوگا کہ Python class کا instance بنانے کے لیے بھی وہی syntax استعمال ہوتا ہے۔ + +مثال کے طور پر: + +```Python +class Cat: + def __init__(self, name: str): + self.name = name + + +fluffy = Cat(name="Mr Fluffy") +``` + +اس صورت میں، `fluffy` class `Cat` کا ایک instance ہے۔ + +اور `fluffy` بنانے کے لیے، آپ `Cat` کو "call" کر رہے ہیں۔ + +تو، Python class بھی ایک **callable** ہے۔ + +پھر، **FastAPI** میں، آپ Python class کو dependency کے طور پر استعمال کر سکتے ہیں۔ + +FastAPI دراصل یہ چیک کرتا ہے کہ یہ "callable" ہے (function، class یا کوئی بھی اور چیز) اور اس میں define کیے گئے parameters۔ + +اگر آپ **FastAPI** میں dependency کے طور پر "callable" پاس کرتے ہیں، تو یہ اس "callable" کے parameters کا تجزیہ کرے گا، اور انہیں اسی طرح process کرے گا جیسے *path operation function* کے parameters کو۔ بشمول sub-dependencies۔ + +یہ بغیر کسی parameter والے callables پر بھی لاگو ہوتا ہے۔ بالکل ویسے ہی جیسے بغیر parameters والے *path operation functions* کے ساتھ ہوتا ہے۔ + +پھر، ہم dependency "dependable" `common_parameters` کو اوپر سے class `CommonQueryParams` میں تبدیل کر سکتے ہیں: + +{* ../../docs_src/dependencies/tutorial002_an_py310.py hl[11:15] *} + +`__init__` method پر توجہ دیں جو class کا instance بنانے کے لیے استعمال ہوتا ہے: + +{* ../../docs_src/dependencies/tutorial002_an_py310.py hl[12] *} + +...اس میں ہمارے پچھلے `common_parameters` جیسے ہی parameters ہیں: + +{* ../../docs_src/dependencies/tutorial001_an_py310.py hl[8] *} + +یہ parameters وہ ہیں جو **FastAPI** dependency کو "حل" کرنے کے لیے استعمال کرے گا۔ + +دونوں صورتوں میں، اس میں ہوگا: + +* ایک اختیاری `q` query parameter جو `str` ہے۔ +* ایک `skip` query parameter جو `int` ہے، جس کی default value `0` ہے۔ +* ایک `limit` query parameter جو `int` ہے، جس کی default value `100` ہے۔ + +دونوں صورتوں میں data convert، validate، OpenAPI schema پر document ہوگا، وغیرہ۔ + +## اسے استعمال کریں { #use-it } + +اب آپ اس class کا استعمال کرتے ہوئے اپنی dependency declare کر سکتے ہیں۔ + +{* ../../docs_src/dependencies/tutorial002_an_py310.py hl[19] *} + +**FastAPI** `CommonQueryParams` class کو call کرتا ہے۔ اس سے اس class کا ایک "instance" بنتا ہے اور وہ instance آپ کے function میں parameter `commons` کے طور پر پاس ہوتا ہے۔ + +## Type annotation بمقابلہ `Depends` { #type-annotation-vs-depends } + +دھیان دیں کہ اوپر کے code میں ہم `CommonQueryParams` دو بار لکھ رہے ہیں: + +//// tab | Python 3.10+ + +```Python +commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)] +``` + +//// + +//// tab | Python 3.10+ non-Annotated + +/// tip | مشورہ + +ممکن ہو تو `Annotated` version استعمال کریں۔ + +/// + +```Python +commons: CommonQueryParams = Depends(CommonQueryParams) +``` + +//// + +آخری `CommonQueryParams`، اس میں: + +```Python +... Depends(CommonQueryParams) +``` + +...یہ وہ ہے جسے **FastAPI** دراصل dependency جاننے کے لیے استعمال کرے گا۔ + +اسی سے FastAPI declare کیے گئے parameters نکالے گا اور اسی کو FastAPI دراصل call کرے گا۔ + +--- + +اس صورت میں، پہلا `CommonQueryParams`، اس میں: + +//// tab | Python 3.10+ + +```Python +commons: Annotated[CommonQueryParams, ... +``` + +//// + +//// tab | Python 3.10+ non-Annotated + +/// tip | مشورہ + +ممکن ہو تو `Annotated` version استعمال کریں۔ + +/// + +```Python +commons: CommonQueryParams ... +``` + +//// + +...**FastAPI** کے لیے کوئی خاص معنی نہیں رکھتا۔ FastAPI اسے data conversion، validation، وغیرہ کے لیے استعمال نہیں کرے گا (کیونکہ یہ اس کے لیے `Depends(CommonQueryParams)` استعمال کر رہا ہے)۔ + +آپ دراصل صرف یہ بھی لکھ سکتے ہیں: + +//// tab | Python 3.10+ + +```Python +commons: Annotated[Any, Depends(CommonQueryParams)] +``` + +//// + +//// tab | Python 3.10+ non-Annotated + +/// tip | مشورہ + +ممکن ہو تو `Annotated` version استعمال کریں۔ + +/// + +```Python +commons = Depends(CommonQueryParams) +``` + +//// + +...جیسے: + +{* ../../docs_src/dependencies/tutorial003_an_py310.py hl[19] *} + +لیکن type declare کرنے کی حوصلہ افزائی کی جاتی ہے کیونکہ اس طرح آپ کا editor جانے گا کہ parameter `commons` کے طور پر کیا پاس ہوگا، اور پھر یہ code completion، type checks، وغیرہ میں آپ کی مدد کر سکتا ہے: + + + +## شارٹ کٹ { #shortcut } + +لیکن آپ دیکھتے ہیں کہ یہاں کچھ code تکرار ہو رہی ہے، `CommonQueryParams` دو بار لکھنا: + +//// tab | Python 3.10+ + +```Python +commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)] +``` + +//// + +//// tab | Python 3.10+ non-Annotated + +/// tip | مشورہ + +ممکن ہو تو `Annotated` version استعمال کریں۔ + +/// + +```Python +commons: CommonQueryParams = Depends(CommonQueryParams) +``` + +//// + +**FastAPI** ان صورتوں کے لیے ایک شارٹ کٹ فراہم کرتا ہے، جہاں dependency *خاص طور پر* ایک class ہے جسے **FastAPI** خود class کا instance بنانے کے لیے "call" کرے گا۔ + +ان مخصوص صورتوں کے لیے، آپ یہ کر سکتے ہیں: + +یہ لکھنے کے بجائے: + +//// tab | Python 3.10+ + +```Python +commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)] +``` + +//// + +//// tab | Python 3.10+ non-Annotated + +/// tip | مشورہ + +ممکن ہو تو `Annotated` version استعمال کریں۔ + +/// + +```Python +commons: CommonQueryParams = Depends(CommonQueryParams) +``` + +//// + +...آپ یہ لکھیں: + +//// tab | Python 3.10+ + +```Python +commons: Annotated[CommonQueryParams, Depends()] +``` + +//// + +//// tab | Python 3.10+ non-Annotated + +/// tip | مشورہ + +ممکن ہو تو `Annotated` version استعمال کریں۔ + +/// + +```Python +commons: CommonQueryParams = Depends() +``` + +//// + +آپ dependency کو parameter کی type کے طور پر declare کرتے ہیں، اور `Depends()` کو بغیر کسی parameter کے استعمال کرتے ہیں، `Depends(CommonQueryParams)` کے اندر پوری class *دوبارہ* لکھنے کے بجائے۔ + +وہی مثال پھر اس طرح نظر آئے گی: + +{* ../../docs_src/dependencies/tutorial004_an_py310.py hl[19] *} + +...اور **FastAPI** جانے گا کہ کیا کرنا ہے۔ + +/// tip | مشورہ + +اگر یہ مدد سے زیادہ الجھن لگے، تو اسے نظرانداز کریں، آپ کو اس کی *ضرورت* نہیں ہے۔ + +یہ صرف ایک شارٹ کٹ ہے۔ کیونکہ **FastAPI** code کی تکرار کم کرنے میں آپ کی مدد کرنے کا خیال رکھتا ہے۔ + +/// diff --git a/docs/ur/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/ur/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md new file mode 100644 index 000000000..77c4e8318 --- /dev/null +++ b/docs/ur/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md @@ -0,0 +1,69 @@ +# Path operation decorators میں Dependencies { #dependencies-in-path-operation-decorators } + +بعض اوقات آپ کو واقعی اپنے *path operation function* کے اندر dependency کی واپسی value کی ضرورت نہیں ہوتی۔ + +یا dependency کوئی value واپس نہیں کرتی۔ + +لیکن پھر بھی آپ کو اسے execute/حل ہونے کی ضرورت ہے۔ + +ان صورتوں میں، `Depends` کے ساتھ *path operation function* parameter declare کرنے کے بجائے، آپ *path operation decorator* میں `dependencies` کی `list` شامل کر سکتے ہیں۔ + +## *path operation decorator* میں `dependencies` شامل کریں { #add-dependencies-to-the-path-operation-decorator } + +*path operation decorator* ایک اختیاری argument `dependencies` وصول کرتا ہے۔ + +یہ `Depends()` کی ایک `list` ہونی چاہیے: + +{* ../../docs_src/dependencies/tutorial006_an_py310.py hl[19] *} + +یہ dependencies عام dependencies کی طرح ہی execute/حل ہوں گی۔ لیکن ان کی value (اگر وہ کوئی واپس کریں) آپ کے *path operation function* میں پاس نہیں ہوگی۔ + +/// tip | مشورہ + +کچھ editors غیر استعمال شدہ function parameters کی جانچ کرتے ہیں اور انہیں errors کے طور پر دکھاتے ہیں۔ + +*path operation decorator* میں ان `dependencies` کو استعمال کر کے آپ یقینی بنا سکتے ہیں کہ وہ execute ہوں جبکہ editor/tooling errors سے بچا جائے۔ + +یہ نئے developers کے لیے الجھن سے بچنے میں بھی مدد کر سکتا ہے جو آپ کے code میں غیر استعمال شدہ parameter دیکھ کر سوچ سکتے ہیں کہ یہ غیر ضروری ہے۔ + +/// + +/// info | معلومات + +اس مثال میں ہم من گھڑت custom headers `X-Key` اور `X-Token` استعمال کر رہے ہیں۔ + +لیکن حقیقی صورتوں میں، security implement کرتے وقت، آپ کو مربوط [Security utilities (اگلا باب)](../security/index.md) استعمال کرنے سے زیادہ فائدہ ہوگا۔ + +/// + +## Dependencies کی errors اور واپسی values { #dependencies-errors-and-return-values } + +آپ وہی dependency *functions* استعمال کر سکتے ہیں جو آپ عام طور پر استعمال کرتے ہیں۔ + +### Dependency کے تقاضے { #dependency-requirements } + +یہ request کے تقاضے (جیسے headers) یا دیگر sub-dependencies declare کر سکتی ہیں: + +{* ../../docs_src/dependencies/tutorial006_an_py310.py hl[8,13] *} + +### Exceptions raise کریں { #raise-exceptions } + +یہ dependencies عام dependencies کی طرح exceptions `raise` کر سکتی ہیں: + +{* ../../docs_src/dependencies/tutorial006_an_py310.py hl[10,15] *} + +### واپسی values { #return-values } + +اور یہ values واپس کر سکتی ہیں یا نہیں، values استعمال نہیں ہوں گی۔ + +تو، آپ ایک عام dependency (جو value واپس کرتی ہے) جو آپ پہلے سے کہیں اور استعمال کر رہے ہیں، دوبارہ استعمال کر سکتے ہیں، اور اگرچہ value استعمال نہیں ہوگی، dependency execute ضرور ہوگی: + +{* ../../docs_src/dependencies/tutorial006_an_py310.py hl[11,16] *} + +## *path operations* کے گروپ کے لیے Dependencies { #dependencies-for-a-group-of-path-operations } + +بعد میں، جب آپ بڑی ایپلیکیشنز کی ساخت کے بارے میں پڑھیں گے ([بڑی ایپلیکیشنز - متعدد فائلیں](../../tutorial/bigger-applications.md))، ممکنہ طور پر متعدد فائلوں کے ساتھ، آپ سیکھیں گے کہ *path operations* کے گروپ کے لیے ایک `dependencies` parameter کیسے declare کیا جائے۔ + +## Global Dependencies { #global-dependencies } + +اگلے مرحلے میں ہم دیکھیں گے کہ پوری `FastAPI` ایپلیکیشن میں dependencies کیسے شامل کی جائیں، تاکہ وہ ہر *path operation* پر لاگو ہوں۔ diff --git a/docs/ur/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/ur/docs/tutorial/dependencies/dependencies-with-yield.md new file mode 100644 index 000000000..7e1962ac7 --- /dev/null +++ b/docs/ur/docs/tutorial/dependencies/dependencies-with-yield.md @@ -0,0 +1,288 @@ +# `yield` والی Dependencies { #dependencies-with-yield } + +FastAPI ایسی dependencies کو سپورٹ کرتا ہے جو مکمل ہونے کے بعد کچھ اضافی اقدامات کرتی ہیں۔ + +ایسا کرنے کے لیے، `return` کی بجائے `yield` استعمال کریں، اور اس کے بعد اضافی اقدامات (code) لکھیں۔ + +/// tip | مشورہ + +یقینی بنائیں کہ ہر dependency میں `yield` صرف ایک بار استعمال ہو۔ + +/// + +/// note | تکنیکی تفصیلات + +کوئی بھی function جو ان کے ساتھ استعمال کے لیے درست ہو: + +* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) یا +* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager) + +وہ **FastAPI** dependency کے طور پر استعمال کے لیے درست ہوگا۔ + +دراصل، FastAPI اندرونی طور پر انہی دو decorators کو استعمال کرتا ہے۔ + +/// + +## `yield` کے ساتھ Database dependency { #a-database-dependency-with-yield } + +مثال کے طور پر، آپ اسے database session بنانے اور مکمل ہونے کے بعد بند کرنے کے لیے استعمال کر سکتے ہیں۔ + +Response بنانے سے پہلے صرف `yield` statement تک کا code execute ہوتا ہے: + +{* ../../docs_src/dependencies/tutorial007_py310.py hl[2:4] *} + +yield کی گئی value وہ ہے جو *path operations* اور دیگر dependencies میں inject ہوتی ہے: + +{* ../../docs_src/dependencies/tutorial007_py310.py hl[4] *} + +`yield` statement کے بعد کا code response کے بعد execute ہوتا ہے: + +{* ../../docs_src/dependencies/tutorial007_py310.py hl[5:6] *} + +/// tip | مشورہ + +آپ `async` یا عام functions استعمال کر سکتے ہیں۔ + +**FastAPI** ہر ایک کے ساتھ صحیح کام کرے گا، بالکل جیسے عام dependencies کے ساتھ۔ + +/// + +## `yield` اور `try` والی dependency { #a-dependency-with-yield-and-try } + +اگر آپ `yield` والی dependency میں `try` block استعمال کرتے ہیں، تو dependency استعمال کرتے وقت پھینکی گئی کوئی بھی exception آپ کو ملے گی۔ + +مثال کے طور پر، اگر درمیان میں کسی مقام پر، کسی دوسری dependency میں یا *path operation* میں، کسی code نے database transaction "rollback" کیا یا کوئی اور exception پیدا کی، تو آپ کو اپنی dependency میں وہ exception ملے گی۔ + +تو، آپ `except SomeException` کے ذریعے dependency کے اندر اس مخصوص exception کو تلاش کر سکتے ہیں۔ + +اسی طرح، آپ `finally` استعمال کر سکتے ہیں تاکہ exit کے اقدامات ضرور execute ہوں، چاہے exception ہو یا نہ ہو۔ + +{* ../../docs_src/dependencies/tutorial007_py310.py hl[3,5] *} + +## `yield` والی Sub-dependencies { #sub-dependencies-with-yield } + +آپ کے پاس کسی بھی سائز اور شکل کی sub-dependencies اور sub-dependencies کے "درخت" ہو سکتے ہیں، اور ان میں سے کوئی بھی یا سب `yield` استعمال کر سکتی ہیں۔ + +**FastAPI** یقینی بنائے گا کہ `yield` والی ہر dependency میں "exit code" صحیح ترتیب سے چلے۔ + +مثال کے طور پر، `dependency_c` کی dependency `dependency_b` پر ہو سکتی ہے، اور `dependency_b` کی `dependency_a` پر: + +{* ../../docs_src/dependencies/tutorial008_an_py310.py hl[6,14,22] *} + +اور یہ سب `yield` استعمال کر سکتی ہیں۔ + +اس صورت میں `dependency_c` کو، اپنا exit code execute کرنے کے لیے، `dependency_b` کی value (یہاں `dep_b` نام سے) ابھی بھی دستیاب ہونی چاہیے۔ + +اور، بالکل اسی طرح، `dependency_b` کو اپنے exit code کے لیے `dependency_a` کی value (یہاں `dep_a` نام سے) دستیاب ہونی چاہیے۔ + +{* ../../docs_src/dependencies/tutorial008_an_py310.py hl[18:19,26:27] *} + +اسی طرح، آپ کے پاس کچھ dependencies `yield` کے ساتھ اور کچھ `return` کے ساتھ ہو سکتی ہیں، اور ان میں سے کچھ دوسروں پر منحصر ہو سکتی ہیں۔ + +اور آپ کے پاس ایک dependency ہو سکتی ہے جس کو کئی دوسری `yield` والی dependencies کی ضرورت ہو، وغیرہ۔ + +آپ dependencies کے جو بھی مجموعے چاہیں رکھ سکتے ہیں۔ + +**FastAPI** یقینی بنائے گا کہ سب کچھ صحیح ترتیب سے چلے۔ + +/// note | تکنیکی تفصیلات + +یہ Python کے [Context Managers](https://docs.python.org/3/library/contextlib.html) کی بدولت کام کرتا ہے۔ + +**FastAPI** اسے حاصل کرنے کے لیے اندرونی طور پر انہیں استعمال کرتا ہے۔ + +/// + +## `yield` اور `HTTPException` والی Dependencies { #dependencies-with-yield-and-httpexception } + +آپ نے دیکھا کہ آپ `yield` والی dependencies استعمال کر سکتے ہیں اور `try` blocks رکھ سکتے ہیں جو کچھ code execute کرنے کی کوشش کرتے ہیں اور پھر `finally` کے بعد کچھ exit code چلاتے ہیں۔ + +آپ `except` بھی استعمال کر سکتے ہیں تاکہ raise ہونے والی exception کو پکڑ سکیں اور اس کے ساتھ کچھ کر سکیں۔ + +مثال کے طور پر، آپ ایک مختلف exception raise کر سکتے ہیں، جیسے `HTTPException`۔ + +/// tip | مشورہ + +یہ ایک حد تک ایڈوانسڈ تکنیک ہے، اور زیادہ تر صورتوں میں آپ کو واقعی اس کی ضرورت نہیں ہوگی، کیونکہ آپ اپنی باقی ایپلیکیشن code کے اندر سے exceptions (بشمول `HTTPException`) raise کر سکتے ہیں، مثال کے طور پر، *path operation function* میں۔ + +لیکن اگر آپ کو ضرورت ہو تو یہ آپ کے لیے موجود ہے۔ + +/// + +{* ../../docs_src/dependencies/tutorial008b_an_py310.py hl[18:22,31] *} + +اگر آپ exceptions پکڑنا چاہتے ہیں اور اس کی بنیاد پر ایک custom response بنانا چاہتے ہیں، تو ایک [Custom Exception Handler](../handling-errors.md#install-custom-exception-handlers) بنائیں۔ + +## `yield` اور `except` والی Dependencies { #dependencies-with-yield-and-except } + +اگر آپ `yield` والی dependency میں `except` استعمال کر کے exception پکڑتے ہیں اور اسے دوبارہ raise نہیں کرتے (یا نئی exception raise نہیں کرتے)، تو FastAPI کو پتا نہیں چلے گا کہ کوئی exception تھی، بالکل ویسے ہی جیسے عام Python میں ہوتا ہے: + +{* ../../docs_src/dependencies/tutorial008c_an_py310.py hl[15:16] *} + +اس صورت میں، client کو *HTTP 500 Internal Server Error* response نظر آئے گا جیسا کہ ہونا چاہیے، کیونکہ ہم `HTTPException` یا اس جیسی کوئی چیز raise نہیں کر رہے، لیکن server کے پاس **کوئی logs نہیں ہوں گے** یا error کی کوئی اور نشاندہی نہیں ہوگی۔ + +### `yield` اور `except` والی Dependencies میں ہمیشہ `raise` کریں { #always-raise-in-dependencies-with-yield-and-except } + +اگر آپ `yield` والی dependency میں exception پکڑتے ہیں، تو جب تک آپ کوئی اور `HTTPException` یا اس جیسی چیز raise نہیں کر رہے، **آپ کو اصل exception دوبارہ raise کرنی چاہیے**۔ + +آپ `raise` استعمال کر کے وہی exception دوبارہ raise کر سکتے ہیں: + +{* ../../docs_src/dependencies/tutorial008d_an_py310.py hl[17] *} + +اب client کو وہی *HTTP 500 Internal Server Error* response ملے گا، لیکن server کے logs میں ہماری custom `InternalError` ہوگی۔ + +## `yield` والی Dependencies کا عمل { #execution-of-dependencies-with-yield } + +عمل کی ترتیب تقریباً اس diagram کی طرح ہے۔ وقت اوپر سے نیچے کی طرف بہتا ہے۔ اور ہر column ان حصوں میں سے ایک ہے جو آپس میں تعامل کر رہے ہیں یا code execute کر رہے ہیں۔ + +```mermaid +sequenceDiagram + +participant client as Client +participant handler as Exception handler +participant dep as Dep with yield +participant operation as Path Operation +participant tasks as Background tasks + + Note over client,operation: Can raise exceptions, including HTTPException + client ->> dep: Start request + Note over dep: Run code up to yield + opt raise Exception + dep -->> handler: Raise Exception + handler -->> client: HTTP error response + end + dep ->> operation: Run dependency, e.g. DB session + opt raise + operation -->> dep: Raise Exception (e.g. HTTPException) + opt handle + dep -->> dep: Can catch exception, raise a new HTTPException, raise other exception + end + handler -->> client: HTTP error response + end + + operation ->> client: Return response to client + Note over client,operation: Response is already sent, can't change it anymore + opt Tasks + operation -->> tasks: Send background tasks + end + opt Raise other exception + tasks -->> tasks: Handle exceptions in the background task code + end +``` + +/// info | معلومات + +Client کو صرف **ایک response** بھیجا جائے گا۔ یہ error responses میں سے ایک ہو سکتا ہے یا *path operation* سے آنے والا response ہو سکتا ہے۔ + +ان میں سے ایک response بھیجے جانے کے بعد، کوئی اور response نہیں بھیجا جا سکتا۔ + +/// + +/// tip | مشورہ + +اگر آپ *path operation function* کے code میں کوئی exception raise کرتے ہیں، تو یہ `yield` والی dependencies کو پاس ہوگی، بشمول `HTTPException`۔ زیادہ تر صورتوں میں آپ وہی exception یا ایک نئی exception `yield` والی dependency سے دوبارہ raise کرنا چاہیں گے تاکہ یقینی ہو کہ اسے صحیح طریقے سے ہینڈل کیا جائے۔ + +/// + +## جلد بند ہونا اور `scope` { #early-exit-and-scope } + +عام طور پر `yield` والی dependencies کا exit code client کو **response بھیجے جانے کے بعد** execute ہوتا ہے۔ + +لیکن اگر آپ جانتے ہیں کہ *path operation function* سے واپس آنے کے بعد آپ کو dependency استعمال کرنے کی ضرورت نہیں ہوگی، تو آپ `Depends(scope="function")` استعمال کر سکتے ہیں تاکہ FastAPI کو بتا سکیں کہ *path operation function* واپس آنے کے بعد dependency بند کر دے، لیکن response بھیجنے سے **پہلے**۔ + +{* ../../docs_src/dependencies/tutorial008e_an_py310.py hl[12,16] *} + +`Depends()` ایک `scope` parameter وصول کرتا ہے جو ہو سکتا ہے: + +* `"function"`: request handle کرنے والے *path operation function* سے پہلے dependency شروع کریں، *path operation function* ختم ہونے کے بعد dependency ختم کریں، لیکن client کو response واپس بھیجنے سے **پہلے**۔ تو، dependency function *path operation **function*** کے **ارد گرد** execute ہوگا۔ +* `"request"`: request handle کرنے والے *path operation function* سے پہلے dependency شروع کریں (`"function"` جیسا ہی)، لیکن client کو response واپس بھیجنے کے **بعد** ختم کریں۔ تو، dependency function **request** اور response cycle کے **ارد گرد** execute ہوگا۔ + +اگر مخصوص نہ کیا جائے اور dependency میں `yield` ہو، تو بطور default `scope` `"request"` ہوگا۔ + +### Sub-dependencies کے لیے `scope` { #scope-for-sub-dependencies } + +جب آپ `scope="request"` (default) کے ساتھ dependency declare کرتے ہیں، تو کسی بھی sub-dependency کا `scope` بھی `"request"` ہونا ضروری ہے۔ + +لیکن `"function"` `scope` والی dependency کے پاس `"function"` اور `"request"` دونوں `scope` والی dependencies ہو سکتی ہیں۔ + +اس کی وجہ یہ ہے کہ ہر dependency کو sub-dependencies سے پہلے اپنا exit code چلانے کے قابل ہونا ضروری ہے، کیونکہ اسے اپنے exit code کے دوران انہیں ابھی بھی استعمال کرنے کی ضرورت ہو سکتی ہے۔ + +```mermaid +sequenceDiagram + +participant client as Client +participant dep_req as Dep scope="request" +participant dep_func as Dep scope="function" +participant operation as Path Operation + + client ->> dep_req: Start request + Note over dep_req: Run code up to yield + dep_req ->> dep_func: Pass dependency + Note over dep_func: Run code up to yield + dep_func ->> operation: Run path operation with dependency + operation ->> dep_func: Return from path operation + Note over dep_func: Run code after yield + Note over dep_func: ✅ Dependency closed + dep_func ->> client: Send response to client + Note over client: Response sent + Note over dep_req: Run code after yield + Note over dep_req: ✅ Dependency closed +``` + +## `yield`، `HTTPException`، `except` اور Background Tasks والی Dependencies { #dependencies-with-yield-httpexception-except-and-background-tasks } + +`yield` والی Dependencies وقت کے ساتھ مختلف استعمال کے معاملات کو پورا کرنے اور کچھ مسائل حل کرنے کے لیے ترقی پذیر ہوئی ہیں۔ + +اگر آپ دیکھنا چاہتے ہیں کہ FastAPI کے مختلف versions میں کیا تبدیل ہوا ہے، تو آپ اس کے بارے میں ایڈوانسڈ گائیڈ میں مزید پڑھ سکتے ہیں، [Advanced Dependencies - `yield`، `HTTPException`، `except` اور Background Tasks والی Dependencies](../../advanced/advanced-dependencies.md#dependencies-with-yield-httpexception-except-and-background-tasks)۔ +## Context Managers { #context-managers } + +### "Context Managers" کیا ہیں { #what-are-context-managers } + +"Context Managers" وہ Python objects ہیں جنہیں آپ `with` statement میں استعمال کر سکتے ہیں۔ + +مثال کے طور پر، [آپ `with` کو فائل پڑھنے کے لیے استعمال کر سکتے ہیں](https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files): + +```Python +with open("./somefile.txt") as f: + contents = f.read() + print(contents) +``` + +اندرونی طور پر، `open("./somefile.txt")` ایک object بناتا ہے جسے "Context Manager" کہتے ہیں۔ + +جب `with` block ختم ہوتا ہے، تو یہ فائل بند کرنے کو یقینی بناتا ہے، چاہے exceptions ہوں۔ + +جب آپ `yield` کے ساتھ dependency بناتے ہیں، تو **FastAPI** اندرونی طور پر اس کے لیے ایک context manager بنائے گا، اور اسے دیگر متعلقہ ٹولز کے ساتھ جوڑے گا۔ + +### `yield` والی dependencies میں context managers استعمال کرنا { #using-context-managers-in-dependencies-with-yield } + +/// warning | انتباہ + +یہ کم و بیش ایک "ایڈوانسڈ" خیال ہے۔ + +اگر آپ ابھی **FastAPI** سے شروعات کر رہے ہیں تو آپ فی الحال اسے چھوڑنا چاہ سکتے ہیں۔ + +/// + +Python میں، آپ [دو methods والی class بنا کر Context Managers بنا سکتے ہیں: `__enter__()` اور `__exit__()`](https://docs.python.org/3/reference/datamodel.html#context-managers)۔ + +آپ انہیں **FastAPI** dependencies کے اندر بھی `yield` کے ساتھ استعمال کر سکتے ہیں، dependency function کے اندر `with` یا `async with` statements استعمال کر کے: + +{* ../../docs_src/dependencies/tutorial010_py310.py hl[1:9,13] *} + +/// tip | مشورہ + +Context manager بنانے کا ایک اور طریقہ یہ ہے: + +* [`@contextlib.contextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager) یا +* [`@contextlib.asynccontextmanager`](https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager) + +ایک واحد `yield` والے function کو decorate کرنے کے لیے استعمال کریں۔ + +یہی وہ چیز ہے جو **FastAPI** اندرونی طور پر `yield` والی dependencies کے لیے استعمال کرتا ہے۔ + +لیکن آپ کو FastAPI dependencies کے لیے یہ decorators استعمال کرنے کی ضرورت نہیں ہے (اور نہیں کرنی چاہیے)۔ + +FastAPI آپ کے لیے یہ اندرونی طور پر کرے گا۔ + +/// diff --git a/docs/ur/docs/tutorial/dependencies/global-dependencies.md b/docs/ur/docs/tutorial/dependencies/global-dependencies.md new file mode 100644 index 000000000..3e10b132e --- /dev/null +++ b/docs/ur/docs/tutorial/dependencies/global-dependencies.md @@ -0,0 +1,16 @@ +# Global Dependencies { #global-dependencies } + +بعض قسم کی ایپلیکیشنز کے لیے آپ پوری ایپلیکیشن میں dependencies شامل کرنا چاہ سکتے ہیں۔ + +جس طرح آپ [*path operation decorators* میں `dependencies` شامل](dependencies-in-path-operation-decorators.md) کر سکتے ہیں، اسی طرح آپ انہیں `FastAPI` ایپلیکیشن میں شامل کر سکتے ہیں۔ + +اس صورت میں، یہ ایپلیکیشن کے تمام *path operations* پر لاگو ہوں گی: + +{* ../../docs_src/dependencies/tutorial012_an_py310.py hl[17] *} + + +اور [*path operation decorators* میں `dependencies` شامل کرنے](dependencies-in-path-operation-decorators.md) کے سیکشن کے تمام تصورات ابھی بھی لاگو ہوتے ہیں، لیکن اس صورت میں، ایپ کے تمام *path operations* پر۔ + +## *path operations* کے گروپوں کے لیے Dependencies { #dependencies-for-groups-of-path-operations } + +بعد میں، جب آپ بڑی ایپلیکیشنز کی ساخت کے بارے میں پڑھیں گے ([بڑی ایپلیکیشنز - متعدد فائلیں](../../tutorial/bigger-applications.md))، ممکنہ طور پر متعدد فائلوں کے ساتھ، آپ سیکھیں گے کہ *path operations* کے گروپ کے لیے ایک `dependencies` parameter کیسے declare کیا جائے۔ diff --git a/docs/ur/docs/tutorial/dependencies/index.md b/docs/ur/docs/tutorial/dependencies/index.md new file mode 100644 index 000000000..8680b7ff0 --- /dev/null +++ b/docs/ur/docs/tutorial/dependencies/index.md @@ -0,0 +1,250 @@ +# Dependencies { #dependencies } + +**FastAPI** میں ایک بہت طاقتور لیکن آسان **Dependency Injection** نظام موجود ہے۔ + +یہ استعمال میں بہت آسان ہونے کے لیے بنایا گیا ہے، اور کسی بھی developer کے لیے دوسرے components کو **FastAPI** کے ساتھ جوڑنا انتہائی سہل بناتا ہے۔ + +## "Dependency Injection" کیا ہے { #what-is-dependency-injection } + +**"Dependency Injection"** کا مطلب، programming میں، یہ ہے کہ آپ کے code (اس صورت میں، آپ کے *path operation functions*) کے پاس یہ اعلان کرنے کا ایک طریقہ ہو کہ اسے کام کرنے کے لیے کن چیزوں کی ضرورت ہے: "dependencies"۔ + +اور پھر، وہ نظام (اس صورت میں **FastAPI**) آپ کے code کو ان ضروری dependencies فراہم کرنے کا خیال رکھے گا ("inject" کرے گا)۔ + +یہ بہت مفید ہے جب آپ کو ضرورت ہو: + +* مشترکہ logic رکھنا (ایک ہی code logic بار بار)۔ +* Database connections شیئر کرنا۔ +* Security، authentication، role کے تقاضے نافذ کرنا، وغیرہ۔ +* اور بہت سی دوسری چیزیں... + +یہ سب کچھ، code کی تکرار کو کم سے کم کرتے ہوئے۔ + +## پہلے قدم { #first-steps } + +آئیے ایک بہت سادی مثال دیکھتے ہیں۔ یہ اتنی سادی ہوگی کہ ابھی بہت مفید نہیں ہوگی۔ + +لیکن اس طرح ہم اس بات پر توجہ مرکوز کر سکتے ہیں کہ **Dependency Injection** نظام کیسے کام کرتا ہے۔ + +### ایک dependency، یا "dependable" بنائیں { #create-a-dependency-or-dependable } + +آئیے پہلے dependency پر توجہ مرکوز کرتے ہیں۔ + +یہ صرف ایک function ہے جو وہ تمام parameters لے سکتا ہے جو ایک *path operation function* لے سکتا ہے: + +{* ../../docs_src/dependencies/tutorial001_an_py310.py hl[8:9] *} + +بس اتنا ہی۔ + +**2 سطریں**۔ + +اور اس کی شکل اور ساخت وہی ہے جو آپ کے تمام *path operation functions* کی ہوتی ہے۔ + +آپ اسے ایک *path operation function* کے طور پر سوچ سکتے ہیں بغیر "decorator" کے (بغیر `@app.get("/some-path")` کے)۔ + +اور یہ جو بھی آپ چاہیں واپس کر سکتا ہے۔ + +اس صورت میں، یہ dependency توقع رکھتی ہے: + +* ایک اختیاری query parameter `q` جو `str` ہے۔ +* ایک اختیاری query parameter `skip` جو `int` ہے، اور بطور default `0` ہے۔ +* ایک اختیاری query parameter `limit` جو `int` ہے، اور بطور default `100` ہے۔ + +اور پھر یہ صرف ان اقدار پر مشتمل ایک `dict` واپس کرتا ہے۔ + +/// info + +FastAPI نے `Annotated` کے لیے سپورٹ version 0.95.0 میں شامل کی (اور اس کی سفارش شروع کی)۔ + +اگر آپ کے پاس پرانا version ہے، تو `Annotated` استعمال کرتے وقت آپ کو errors آئیں گے۔ + +`Annotated` استعمال کرنے سے پہلے یقینی بنائیں کہ آپ [FastAPI version کو اپ گریڈ کریں](../../deployment/versions.md#upgrading-the-fastapi-versions) کم از کم 0.95.1 تک۔ + +/// + +### `Depends` import کریں { #import-depends } + +{* ../../docs_src/dependencies/tutorial001_an_py310.py hl[3] *} + +### Dependency کا اعلان کریں، "dependant" میں { #declare-the-dependency-in-the-dependant } + +جس طرح آپ اپنے *path operation function* parameters کے ساتھ `Body`، `Query`، وغیرہ استعمال کرتے ہیں، اسی طرح ایک نئے parameter کے ساتھ `Depends` استعمال کریں: + +{* ../../docs_src/dependencies/tutorial001_an_py310.py hl[13,18] *} + +اگرچہ آپ اپنے function کے parameters میں `Depends` کو اسی طرح استعمال کرتے ہیں جیسے `Body`، `Query`، وغیرہ، `Depends` تھوڑا مختلف طریقے سے کام کرتا ہے۔ + +آپ `Depends` کو صرف ایک parameter دیتے ہیں۔ + +یہ parameter کچھ ایسا ہونا چاہیے جیسے function۔ + +آپ اسے **براہ راست call نہیں کرتے** (آخر میں قوسین نہیں لگاتے)، بلکہ اسے `Depends()` میں بطور parameter پاس کرتے ہیں۔ + +اور وہ function اسی طرح parameters لیتا ہے جیسے *path operation functions* لیتے ہیں۔ + +/// tip | مشورہ + +آپ اگلے باب میں دیکھیں گے کہ functions کے علاوہ اور کون سی "چیزیں" dependencies کے طور پر استعمال ہو سکتی ہیں۔ + +/// + +جب بھی نئی request آتی ہے، **FastAPI** اس کا خیال رکھے گا: + +* آپ کے dependency ("dependable") function کو صحیح parameters کے ساتھ call کرنا۔ +* آپ کے function سے نتیجہ حاصل کرنا۔ +* اس نتیجے کو آپ کے *path operation function* میں parameter کو assign کرنا۔ + +```mermaid +graph TB + +common_parameters(["common_parameters"]) +read_items["/items/"] +read_users["/users/"] + +common_parameters --> read_items +common_parameters --> read_users +``` + +اس طرح آپ مشترکہ code ایک بار لکھتے ہیں اور **FastAPI** اسے آپ کے *path operations* کے لیے call کرنے کا خیال رکھتا ہے۔ + +/// check + +دھیان دیں کہ آپ کو کوئی خاص class بنانے اور اسے **FastAPI** میں کہیں "register" کرنے یا اس جیسا کچھ کرنے کی ضرورت نہیں ہے۔ + +آپ بس اسے `Depends` میں پاس کریں اور **FastAPI** باقی سب کرنا جانتا ہے۔ + +/// + +## `Annotated` dependencies شیئر کریں { #share-annotated-dependencies } + +اوپر کی مثالوں میں، آپ دیکھ سکتے ہیں کہ تھوڑی سی **code تکرار** ہے۔ + +جب آپ کو `common_parameters()` dependency استعمال کرنی ہو، تو آپ کو type annotation اور `Depends()` کے ساتھ پورا parameter لکھنا پڑتا ہے: + +```Python +commons: Annotated[dict, Depends(common_parameters)] +``` + +لیکن چونکہ ہم `Annotated` استعمال کر رہے ہیں، ہم اس `Annotated` value کو ایک variable میں محفوظ کر سکتے ہیں اور اسے کئی جگہوں پر استعمال کر سکتے ہیں: + +{* ../../docs_src/dependencies/tutorial001_02_an_py310.py hl[12,16,21] *} + +/// tip | مشورہ + +یہ صرف معیاری Python ہے، اسے "type alias" کہتے ہیں، یہ دراصل **FastAPI** کے لیے مخصوص نہیں ہے۔ + +لیکن چونکہ **FastAPI** Python کے معیارات پر مبنی ہے، بشمول `Annotated`، آپ اپنے code میں یہ ترکیب استعمال کر سکتے ہیں۔ + +/// + +Dependencies حسب توقع کام کرتی رہیں گی، اور **سب سے اچھی بات** یہ ہے کہ **type کی معلومات محفوظ رہیں گی**، جس کا مطلب ہے کہ آپ کا editor آپ کو **autocompletion**، **inline errors**، وغیرہ فراہم کرتا رہے گا۔ دوسرے ٹولز جیسے `mypy` کے لیے بھی یہی بات ہے۔ + +یہ خاص طور پر اس وقت مفید ہوگا جب آپ اسے ایک **بڑے code base** میں استعمال کریں جہاں آپ **ایک ہی dependencies** کو **کئی *path operations*** میں بار بار استعمال کرتے ہیں۔ + +## `async` یا نہ `async` { #to-async-or-not-to-async } + +چونکہ dependencies کو بھی **FastAPI** call کرے گا (بالکل جیسے آپ کے *path operation functions*)، اس لیے اپنے functions define کرتے وقت وہی قواعد لاگو ہوتے ہیں۔ + +آپ `async def` یا عام `def` استعمال کر سکتے ہیں۔ + +اور آپ عام `def` *path operation functions* کے اندر `async def` dependencies کا اعلان کر سکتے ہیں، یا `async def` *path operation functions* کے اندر `def` dependencies کا، وغیرہ۔ + +اس سے کوئی فرق نہیں پڑتا۔ **FastAPI** جانتا ہے کہ کیا کرنا ہے۔ + +/// note | نوٹ + +اگر آپ نہیں جانتے، تو docs میں [Async: *"جلدی میں ہیں؟"*](../../async.md#in-a-hurry) سیکشن میں `async` اور `await` کے بارے میں دیکھیں۔ + +/// + +## OpenAPI کے ساتھ مربوط { #integrated-with-openapi } + +آپ کی dependencies (اور sub-dependencies) کے تمام request اعلانات، validations اور تقاضے اسی OpenAPI schema میں شامل ہوں گے۔ + +تو، interactive docs میں ان dependencies سے بھی تمام معلومات ہوں گی: + + + +## آسان استعمال { #simple-usage } + +اگر آپ غور کریں، تو *path operation functions* اس لیے declare کیے جاتے ہیں تاکہ جب بھی کوئی *path* اور *operation* ملے تو استعمال ہوں، اور پھر **FastAPI** صحیح parameters کے ساتھ function کو call کرنے اور request سے data نکالنے کا خیال رکھتا ہے۔ + +دراصل، تمام (یا زیادہ تر) web frameworks اسی طرح کام کرتے ہیں۔ + +آپ ان functions کو کبھی براہ راست call نہیں کرتے۔ انہیں آپ کا framework (اس صورت میں، **FastAPI**) call کرتا ہے۔ + +Dependency Injection نظام کے ساتھ، آپ **FastAPI** کو یہ بھی بتا سکتے ہیں کہ آپ کا *path operation function* بھی کسی اور چیز پر "منحصر" ہے جو آپ کے *path operation function* سے پہلے execute ہونی چاہیے، اور **FastAPI** اسے execute کرنے اور نتائج "inject" کرنے کا خیال رکھے گا۔ + +"dependency injection" کے اسی خیال کے دوسرے عام نام یہ ہیں: + +* resources +* providers +* services +* injectables +* components + +## **FastAPI** plug-ins { #fastapi-plug-ins } + +**Dependency Injection** نظام کا استعمال کرتے ہوئے integrations اور "plug-ins" بنائے جا سکتے ہیں۔ لیکن دراصل، **"plug-ins" بنانے کی ضرورت نہیں ہے**، کیونکہ dependencies استعمال کر کے لامحدود تعداد میں integrations اور interactions declare کرنا ممکن ہے جو آپ کے *path operation functions* کے لیے دستیاب ہو جاتے ہیں۔ + +اور dependencies بہت آسان اور بدیہی طریقے سے بنائی جا سکتی ہیں جو آپ کو صرف ضروری Python packages import کرنے اور انہیں اپنے API functions کے ساتھ code کی چند سطروں میں جوڑنے دیتی ہیں، *لفظی طور پر*۔ + +آپ اگلے ابواب میں اس کی مثالیں دیکھیں گے، relational اور NoSQL databases، security، وغیرہ کے بارے میں۔ + +## **FastAPI** مطابقت { #fastapi-compatibility } + +Dependency injection نظام کی سادگی **FastAPI** کو ان سب کے ساتھ مطابق بناتی ہے: + +* تمام relational databases +* NoSQL databases +* بیرونی packages +* بیرونی APIs +* Authentication اور authorization نظام +* API استعمال کی نگرانی کے نظام +* Response data injection نظام +* وغیرہ۔ + +## سادہ اور طاقتور { #simple-and-powerful } + +اگرچہ درجہ بندی والا dependency injection نظام define اور استعمال کرنے میں بہت آسان ہے، پھر بھی یہ بہت طاقتور ہے۔ + +آپ ایسی dependencies define کر سکتے ہیں جو خود بھی dependencies define کر سکتی ہیں۔ + +آخر میں، dependencies کا ایک درجہ بندی والا درخت بنتا ہے، اور **Dependency Injection** نظام ان تمام dependencies (اور ان کی sub-dependencies) کو حل کرنے اور ہر قدم پر نتائج فراہم (inject) کرنے کا خیال رکھتا ہے۔ + +مثال کے طور پر، فرض کریں آپ کے پاس 4 API endpoints (*path operations*) ہیں: + +* `/items/public/` +* `/items/private/` +* `/users/{user_id}/activate` +* `/items/pro/` + +تو آپ صرف dependencies اور sub-dependencies کے ذریعے ہر ایک کے لیے مختلف permission کے تقاضے شامل کر سکتے ہیں: + +```mermaid +graph TB + +current_user(["current_user"]) +active_user(["active_user"]) +admin_user(["admin_user"]) +paying_user(["paying_user"]) + +public["/items/public/"] +private["/items/private/"] +activate_user["/users/{user_id}/activate"] +pro_items["/items/pro/"] + +current_user --> active_user +active_user --> admin_user +active_user --> paying_user + +current_user --> public +active_user --> private +admin_user --> activate_user +paying_user --> pro_items +``` + +## **OpenAPI** کے ساتھ مربوط { #integrated-with-openapi_1 } + +یہ تمام dependencies، اپنے تقاضوں کا اعلان کرتے ہوئے، آپ کے *path operations* میں parameters، validations، وغیرہ بھی شامل کرتی ہیں۔ + +**FastAPI** ان سب کو OpenAPI schema میں شامل کرنے کا خیال رکھے گا، تاکہ یہ interactive documentation نظاموں میں دکھایا جائے۔ diff --git a/docs/ur/docs/tutorial/dependencies/sub-dependencies.md b/docs/ur/docs/tutorial/dependencies/sub-dependencies.md new file mode 100644 index 000000000..ee3fae123 --- /dev/null +++ b/docs/ur/docs/tutorial/dependencies/sub-dependencies.md @@ -0,0 +1,105 @@ +# Sub-dependencies { #sub-dependencies } + +آپ ایسی dependencies بنا سکتے ہیں جن میں **sub-dependencies** ہوں۔ + +یہ جتنی **گہری** بھی ہوں، آپ کی ضرورت کے مطابق ہو سکتی ہیں۔ + +**FastAPI** انہیں حل کرنے کا خیال رکھے گا۔ + +## پہلی dependency "dependable" { #first-dependency-dependable } + +آپ اس طرح پہلی dependency ("dependable") بنا سکتے ہیں: + +{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[8:9] *} + +یہ ایک اختیاری query parameter `q` کو `str` کے طور پر declare کرتی ہے، اور پھر بس اسے واپس کر دیتی ہے۔ + +یہ کافی سادہ ہے (زیادہ مفید نہیں)، لیکن ہمیں sub-dependencies کے کام کرنے کے طریقے پر توجہ مرکوز کرنے میں مدد کرے گی۔ + +## دوسری dependency، "dependable" اور "dependant" { #second-dependency-dependable-and-dependant } + +پھر آپ ایک اور dependency function ("dependable") بنا سکتے ہیں جو بیک وقت اپنی خود کی dependency بھی declare کرتی ہے (یعنی یہ "dependant" بھی ہے): + +{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[13] *} + +آئیے declare کیے گئے parameters پر توجہ دیتے ہیں: + +* اگرچہ یہ function خود ایک dependency ("dependable") ہے، یہ ایک اور dependency بھی declare کرتا ہے (یہ کسی اور چیز پر "منحصر" ہے)۔ + * یہ `query_extractor` پر منحصر ہے، اور اس سے واپس آنے والی value کو parameter `q` میں assign کرتا ہے۔ +* یہ ایک اختیاری `last_query` cookie بھی declare کرتا ہے، بطور `str`۔ + * اگر صارف نے کوئی query `q` فراہم نہیں کی، تو ہم آخری استعمال شدہ query استعمال کرتے ہیں، جو ہم نے پہلے ایک cookie میں محفوظ کی تھی۔ + +## Dependency استعمال کریں { #use-the-dependency } + +پھر ہم dependency کو اس طرح استعمال کر سکتے ہیں: + +{* ../../docs_src/dependencies/tutorial005_an_py310.py hl[23] *} + +/// info | معلومات + +دھیان دیں کہ ہم *path operation function* میں صرف ایک dependency declare کر رہے ہیں، `query_or_cookie_extractor`۔ + +لیکن **FastAPI** جانے گا کہ اسے پہلے `query_extractor` کو حل کرنا ہوگا، تاکہ اس کے نتائج `query_or_cookie_extractor` کو call کرتے وقت پاس کر سکے۔ + +/// + +```mermaid +graph TB + +query_extractor(["query_extractor"]) +query_or_cookie_extractor(["query_or_cookie_extractor"]) + +read_query["/items/"] + +query_extractor --> query_or_cookie_extractor --> read_query +``` + +## ایک ہی dependency کو کئی بار استعمال کرنا { #using-the-same-dependency-multiple-times } + +اگر آپ کی ایک dependency ایک ہی *path operation* کے لیے کئی بار declare ہو، مثال کے طور پر، کئی dependencies کی ایک مشترکہ sub-dependency ہو، تو **FastAPI** جانے گا کہ اس sub-dependency کو ہر request میں صرف ایک بار call کرنا ہے۔ + +اور یہ واپس آنے والی value کو ایک "cache" میں محفوظ کر لے گا اور اسے اس مخصوص request میں ضرورت مند تمام "dependants" کو پاس کر دے گا، بجائے اس کے کہ ایک ہی request کے لیے dependency کو کئی بار call کرے۔ + +ایک ایڈوانسڈ صورت میں جہاں آپ جانتے ہیں کہ dependency کو ایک ہی request میں ہر قدم پر (ممکنہ طور پر کئی بار) call ہونا ضروری ہے بجائے "cached" value استعمال کرنے کے، آپ `Depends` استعمال کرتے وقت `use_cache=False` parameter سیٹ کر سکتے ہیں: + +//// tab | Python 3.10+ + +```Python hl_lines="1" +async def needy_dependency(fresh_value: Annotated[str, Depends(get_value, use_cache=False)]): + return {"fresh_value": fresh_value} +``` + +//// + +//// tab | Python 3.10+ non-Annotated + +/// tip | مشورہ + +ممکن ہو تو `Annotated` version استعمال کریں۔ + +/// + +```Python hl_lines="1" +async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False)): + return {"fresh_value": fresh_value} +``` + +//// + +## خلاصہ { #recap } + +یہاں استعمال ہونے والے تمام فینسی الفاظ سے ہٹ کر، **Dependency Injection** نظام کافی سادہ ہے۔ + +بس وہی functions جو *path operation functions* جیسے نظر آتے ہیں۔ + +لیکن پھر بھی، یہ بہت طاقتور ہے، اور آپ کو من مانی گہرائی تک nested dependency "graphs" (درخت) declare کرنے دیتا ہے۔ + +/// tip | مشورہ + +ان سادہ مثالوں سے شاید یہ سب اتنا مفید نہ لگے۔ + +لیکن آپ **security** کے ابواب میں دیکھیں گے کہ یہ کتنا مفید ہے۔ + +اور آپ یہ بھی دیکھیں گے کہ یہ آپ کا کتنا code بچائے گا۔ + +/// diff --git a/docs/ur/docs/tutorial/encoder.md b/docs/ur/docs/tutorial/encoder.md new file mode 100644 index 000000000..94a055f37 --- /dev/null +++ b/docs/ur/docs/tutorial/encoder.md @@ -0,0 +1,35 @@ +# JSON Compatible Encoder { #json-compatible-encoder } + +کچھ ایسے معاملات ہیں جن میں آپ کو کسی data type (جیسے Pydantic model) کو JSON کے ساتھ مطابقت رکھنے والی چیز (جیسے `dict`، `list` وغیرہ) میں تبدیل کرنے کی ضرورت ہو سکتی ہے۔ + +مثال کے طور پر، اگر آپ کو اسے database میں محفوظ کرنا ہو۔ + +اس کے لیے **FastAPI** ایک `jsonable_encoder()` function فراہم کرتا ہے۔ + +## `jsonable_encoder` کا استعمال { #using-the-jsonable-encoder } + +آئیے تصور کریں کہ آپ کے پاس ایک database `fake_db` ہے جو صرف JSON کے ساتھ مطابقت رکھنے والا data وصول کرتا ہے۔ + +مثال کے طور پر، یہ `datetime` objects وصول نہیں کرتا، کیونکہ وہ JSON کے ساتھ مطابقت نہیں رکھتے۔ + +تو ایک `datetime` object کو [ISO format](https://en.wikipedia.org/wiki/ISO_8601) میں data رکھنے والی `str` میں تبدیل کرنا ہوگا۔ + +اسی طرح، یہ database کوئی Pydantic model (attributes والا object) وصول نہیں کرے گا، صرف ایک `dict`۔ + +آپ اس کے لیے `jsonable_encoder` استعمال کر سکتے ہیں۔ + +یہ ایک object وصول کرتا ہے، جیسے Pydantic model، اور اس کا JSON کے ساتھ مطابقت رکھنے والا version واپس کرتا ہے: + +{* ../../docs_src/encoder/tutorial001_py310.py hl[4,21] *} + +اس مثال میں، یہ Pydantic model کو `dict` میں، اور `datetime` کو `str` میں تبدیل کرے گا۔ + +اسے call کرنے کا نتیجہ ایسی چیز ہے جسے Python کے معیاری [`json.dumps()`](https://docs.python.org/3/library/json.html#json.dumps) کے ساتھ encode کیا جا سکتا ہے۔ + +یہ JSON format میں data رکھنے والی کوئی بڑی `str` واپس نہیں کرتا (بطور string)۔ یہ Python کا معیاری data structure (مثلاً ایک `dict`) واپس کرتا ہے جس کی values اور ذیلی values سب JSON کے ساتھ مطابقت رکھتی ہیں۔ + +/// note | نوٹ + +`jsonable_encoder` دراصل **FastAPI** اندرونی طور پر data تبدیل کرنے کے لیے استعمال کرتا ہے۔ لیکن یہ بہت سے دوسرے منظرناموں میں بھی مفید ہے۔ + +/// diff --git a/docs/ur/docs/tutorial/extra-data-types.md b/docs/ur/docs/tutorial/extra-data-types.md new file mode 100644 index 000000000..5ec869e8a --- /dev/null +++ b/docs/ur/docs/tutorial/extra-data-types.md @@ -0,0 +1,62 @@ +# اضافی ڈیٹا Types { #extra-data-types } + +اب تک آپ عام ڈیٹا types استعمال کر رہے ہیں، جیسے: + +* `int` +* `float` +* `str` +* `bool` + +لیکن آپ مزید پیچیدہ ڈیٹا types بھی استعمال کر سکتے ہیں۔ + +اور آپ کو پھر بھی وہی خصوصیات ملیں گی جو اب تک دیکھی ہیں: + +* بہترین editor سپورٹ۔ +* آنے والی requests سے ڈیٹا کی تبدیلی۔ +* response ڈیٹا کی تبدیلی۔ +* ڈیٹا validation۔ +* خودکار annotation اور documentation۔ + +## دیگر ڈیٹا types { #other-data-types } + +یہاں کچھ اضافی ڈیٹا types ہیں جو آپ استعمال کر سکتے ہیں: + +* `UUID`: + * ایک معیاری "Universally Unique Identifier"، جو بہت سے databases اور systems میں ID کے طور پر عام ہے۔ + * Requests اور responses میں یہ `str` کے طور پر ظاہر ہوگا۔ +* `datetime.datetime`: + * Python کا `datetime.datetime`۔ + * Requests اور responses میں یہ ISO 8601 format میں `str` کے طور پر ظاہر ہوگا، جیسے: `2008-09-15T15:53:00+05:00`۔ +* `datetime.date`: + * Python کا `datetime.date`۔ + * Requests اور responses میں یہ ISO 8601 format میں `str` کے طور پر ظاہر ہوگا، جیسے: `2008-09-15`۔ +* `datetime.time`: + * Python کا `datetime.time`۔ + * Requests اور responses میں یہ ISO 8601 format میں `str` کے طور پر ظاہر ہوگا، جیسے: `14:23:55.003`۔ +* `datetime.timedelta`: + * Python کا `datetime.timedelta`۔ + * Requests اور responses میں یہ کل سیکنڈز کے `float` کے طور پر ظاہر ہوگا۔ + * Pydantic اسے "ISO 8601 time diff encoding" کے طور پر بھی ظاہر کرنے کی اجازت دیتا ہے، [مزید معلومات کے لیے docs دیکھیں](https://docs.pydantic.dev/latest/concepts/serialization/#custom-serializers)۔ +* `frozenset`: + * Requests اور responses میں، `set` کی طرح برتاؤ ہوگا: + * Requests میں، ایک list پڑھی جائے گی، ڈپلیکیٹس ہٹائے جائیں گے اور اسے `set` میں تبدیل کیا جائے گا۔ + * Responses میں، `set` کو `list` میں تبدیل کیا جائے گا۔ + * تیار کردہ schema بتائے گا کہ `set` کی قدریں منفرد ہیں (JSON Schema کا `uniqueItems` استعمال کر کے)۔ +* `bytes`: + * معیاری Python `bytes`۔ + * Requests اور responses میں `str` کے طور پر برتاؤ ہوگا۔ + * تیار کردہ schema بتائے گا کہ یہ `binary` "format" کا `str` ہے۔ +* `Decimal`: + * معیاری Python `Decimal`۔ + * Requests اور responses میں، `float` کی طرح handle ہوگا۔ +* آپ تمام درست Pydantic ڈیٹا types یہاں چیک کر سکتے ہیں: [Pydantic data types](https://docs.pydantic.dev/latest/usage/types/types/)۔ + +## مثال { #example } + +یہاں ایک مثال *path operation* ہے جس کے parameters اوپر بیان کردہ کچھ types استعمال کرتے ہیں۔ + +{* ../../docs_src/extra_data_types/tutorial001_an_py310.py hl[1,3,12:16] *} + +نوٹ کریں کہ function کے اندر parameters کی اپنی فطری ڈیٹا type ہوتی ہے، اور آپ مثلاً عام تاریخ کی کارروائیاں کر سکتے ہیں، جیسے: + +{* ../../docs_src/extra_data_types/tutorial001_an_py310.py hl[18:19] *} diff --git a/docs/ur/docs/tutorial/extra-models.md b/docs/ur/docs/tutorial/extra-models.md new file mode 100644 index 000000000..2e093491c --- /dev/null +++ b/docs/ur/docs/tutorial/extra-models.md @@ -0,0 +1,211 @@ +# اضافی Models { #extra-models } + +پچھلی مثال سے آگے بڑھتے ہوئے، ایک سے زیادہ متعلقہ models کا ہونا عام ہوگا۔ + +یہ خاص طور پر user models کے معاملے میں ہوتا ہے، کیونکہ: + +* **input model** میں password ہونا ضروری ہے۔ +* **output model** میں password نہیں ہونا چاہیے۔ +* **database model** میں شاید hashed password ہونا ضروری ہو۔ + +/// danger + +user کے سادہ متن کے passwords کبھی ذخیرہ نہ کریں۔ ہمیشہ ایک "محفوظ hash" ذخیرہ کریں جس کی آپ بعد میں تصدیق کر سکیں۔ + +اگر آپ نہیں جانتے، تو آپ [سیکیورٹی ابواب](security/simple-oauth2.md#password-hashing) میں سیکھیں گے کہ "password hash" کیا ہے۔ + +/// + +## متعدد models { #multiple-models } + +یہاں ایک عام خیال ہے کہ models ان کے password fields کے ساتھ کیسے نظر آ سکتے ہیں اور وہ کہاں استعمال ہوتے ہیں: + +{* ../../docs_src/extra_models/tutorial001_py310.py hl[7,9,14,20,22,27:28,31:33,38:39] *} + +### `**user_in.model_dump()` کے بارے میں { #about-user-in-model-dump } + +#### Pydantic کا `.model_dump()` { #pydantics-model-dump } + +`user_in` ایک Pydantic model ہے جس کی class `UserIn` ہے۔ + +Pydantic models میں `.model_dump()` method ہوتا ہے جو model کے ڈیٹا کے ساتھ ایک `dict` واپس کرتا ہے۔ + +تو اگر ہم ایک Pydantic object `user_in` اس طرح بنائیں: + +```Python +user_in = UserIn(username="john", password="secret", email="john.doe@example.com") +``` + +اور پھر کال کریں: + +```Python +user_dict = user_in.model_dump() +``` + +تو اب ہمارے پاس variable `user_dict` میں ڈیٹا کے ساتھ ایک `dict` ہے (یہ Pydantic model object کی بجائے `dict` ہے)۔ + +اور اگر ہم کال کریں: + +```Python +print(user_dict) +``` + +تو ہمیں یہ Python `dict` ملے گا: + +```Python +{ + 'username': 'john', + 'password': 'secret', + 'email': 'john.doe@example.com', + 'full_name': None, +} +``` + +#### `dict` کو Unpack کرنا { #unpacking-a-dict } + +اگر ہم `user_dict` جیسا `dict` لیں اور اسے کسی function (یا class) میں `**user_dict` کے ساتھ پاس کریں، تو Python اسے "unpack" کرے گا۔ یہ `user_dict` کی keys اور values کو براہ راست key-value arguments کے طور پر پاس کرے گا۔ + +تو اوپر والے `user_dict` سے آگے بڑھتے ہوئے، لکھنا: + +```Python +UserInDB(**user_dict) +``` + +اس کے برابر ہوگا: + +```Python +UserInDB( + username="john", + password="secret", + email="john.doe@example.com", + full_name=None, +) +``` + +یا مزید درست طور پر، `user_dict` کو براہ راست استعمال کرتے ہوئے، جو بھی مواد اس میں مستقبل میں ہو: + +```Python +UserInDB( + username = user_dict["username"], + password = user_dict["password"], + email = user_dict["email"], + full_name = user_dict["full_name"], +) +``` + +#### ایک Pydantic model دوسرے کے مواد سے { #a-pydantic-model-from-the-contents-of-another } + +جیسا کہ اوپر کی مثال میں ہم نے `user_in.model_dump()` سے `user_dict` حاصل کیا، یہ code: + +```Python +user_dict = user_in.model_dump() +UserInDB(**user_dict) +``` + +اس کے برابر ہوگا: + +```Python +UserInDB(**user_in.model_dump()) +``` + +...کیونکہ `user_in.model_dump()` ایک `dict` ہے، اور پھر ہم Python سے اسے `**` لگا کر `UserInDB` میں پاس کر کے "unpack" کراتے ہیں۔ + +تو ہمیں ایک Pydantic model دوسرے Pydantic model کے ڈیٹا سے ملتا ہے۔ + +#### `dict` Unpack کرنا اور اضافی keywords { #unpacking-a-dict-and-extra-keywords } + +اور پھر اضافی keyword argument `hashed_password=hashed_password` شامل کرنا، جیسے: + +```Python +UserInDB(**user_in.model_dump(), hashed_password=hashed_password) +``` + +...یہ اس طرح بنتا ہے: + +```Python +UserInDB( + username = user_dict["username"], + password = user_dict["password"], + email = user_dict["email"], + full_name = user_dict["full_name"], + hashed_password = hashed_password, +) +``` + +/// warning | انتباہ + +معاون اضافی functions `fake_password_hasher` اور `fake_save_user` صرف ڈیٹا کے ممکنہ بہاؤ کا مظاہرہ کرنے کے لیے ہیں، لیکن یقیناً یہ کوئی حقیقی سیکیورٹی فراہم نہیں کرتے۔ + +/// + +## تکرار کم کریں { #reduce-duplication } + +Code کی تکرار کم کرنا **FastAPI** کے بنیادی خیالات میں سے ایک ہے۔ + +کیونکہ code کی تکرار سے bugs، سیکیورٹی مسائل، code desynchronization مسائل (جب آپ ایک جگہ اپ ڈیٹ کریں لیکن دوسری جگہوں پر نہ کریں) وغیرہ کے امکانات بڑھ جاتے ہیں۔ + +اور یہ models سب بہت سا ڈیٹا شیئر کر رہے ہیں اور attribute نام اور types کی تکرار کر رہے ہیں۔ + +ہم بہتر کر سکتے ہیں۔ + +ہم ایک `UserBase` model declare کر سکتے ہیں جو ہمارے دوسرے models کے لیے base کا کام کرے۔ اور پھر ہم اس model کی subclasses بنا سکتے ہیں جو اس کے attributes (type declarations، validation، وغیرہ) inherit کرتی ہیں۔ + +تمام ڈیٹا تبدیلی، validation، documentation وغیرہ پھر بھی عام طور پر کام کریں گے۔ + +اس طرح، ہم صرف models کے درمیان فرق declare کر سکتے ہیں (سادہ متن `password` کے ساتھ، `hashed_password` کے ساتھ اور بغیر password کے): + +{* ../../docs_src/extra_models/tutorial002_py310.py hl[7,13:14,17:18,21:22] *} + +## `Union` یا `anyOf` { #union-or-anyof } + +آپ ایک response کو دو یا زیادہ types کا `Union` declare کر سکتے ہیں، جس کا مطلب ہے کہ response ان میں سے کوئی بھی ہو سکتا ہے۔ + +یہ OpenAPI میں `anyOf` کے ساتھ define ہوگا۔ + +اس کے لیے، معیاری Python type hint [`typing.Union`](https://docs.python.org/3/library/typing.html#typing.Union) استعمال کریں: + +/// note | نوٹ + +[`Union`](https://docs.pydantic.dev/latest/concepts/types/#unions) define کرتے وقت، سب سے مخصوص type پہلے رکھیں، اس کے بعد کم مخصوص type۔ نیچے کی مثال میں، زیادہ مخصوص `PlaneItem` `Union[PlaneItem, CarItem]` میں `CarItem` سے پہلے آتا ہے۔ + +/// + +{* ../../docs_src/extra_models/tutorial003_py310.py hl[1,14:15,18:20,33] *} + +### Python 3.10 میں `Union` { #union-in-python-3-10 } + +اس مثال میں ہم `Union[PlaneItem, CarItem]` کو argument `response_model` کی قدر کے طور پر پاس کر رہے ہیں۔ + +چونکہ ہم اسے **type annotation** میں رکھنے کی بجائے **argument کی قدر** کے طور پر پاس کر رہے ہیں، ہمیں Python 3.10 میں بھی `Union` استعمال کرنا ہوگا۔ + +اگر یہ type annotation میں ہوتا تو ہم عمودی بار استعمال کر سکتے تھے، جیسے: + +```Python +some_variable: PlaneItem | CarItem +``` + +لیکن اگر ہم اسے assignment `response_model=PlaneItem | CarItem` میں رکھیں تو ہمیں error ملے گا، کیونکہ Python `PlaneItem` اور `CarItem` کے درمیان ایک **غلط عمل** کرنے کی کوشش کرے گا بجائے اس کے کہ اسے type annotation سمجھے۔ + +## Models کی List { #list-of-models } + +اسی طرح، آپ objects کی lists کے responses declare کر سکتے ہیں۔ + +اس کے لیے، معیاری Python `list` استعمال کریں: + +{* ../../docs_src/extra_models/tutorial004_py310.py hl[18] *} + +## اختیاری `dict` کے ساتھ Response { #response-with-arbitrary-dict } + +آپ Pydantic model استعمال کیے بغیر، صرف keys اور values کی types declare کر کے، ایک سادہ اختیاری `dict` سے بھی response declare کر سکتے ہیں۔ + +یہ اس وقت مفید ہے جب آپ کو پیشگی درست field/attribute نام (جو Pydantic model کے لیے ضروری ہوتے ہیں) معلوم نہ ہوں۔ + +اس صورت میں، آپ `dict` استعمال کر سکتے ہیں: + +{* ../../docs_src/extra_models/tutorial005_py310.py hl[6] *} + +## خلاصہ { #recap } + +متعدد Pydantic models استعمال کریں اور ہر معاملے کے لیے آزادانہ طور پر inherit کریں۔ + +آپ کو ہر entity کے لیے ایک واحد ڈیٹا model رکھنے کی ضرورت نہیں ہے اگر اس entity کی مختلف "حالتیں" ہونی ہوں۔ جیسا کہ user "entity" کا معاملہ ہے جس کی حالت `password`، `password_hash` اور بغیر password کے شامل ہے۔ diff --git a/docs/ur/docs/tutorial/first-steps.md b/docs/ur/docs/tutorial/first-steps.md new file mode 100644 index 000000000..15760a7ea --- /dev/null +++ b/docs/ur/docs/tutorial/first-steps.md @@ -0,0 +1,429 @@ +# پہلے قدم { #first-steps } + +سب سے سادہ FastAPI فائل کچھ ایسی ہو سکتی ہے: + +{* ../../docs_src/first_steps/tutorial001_py310.py *} + +اسے `main.py` فائل میں کاپی کریں۔ + +لائیو سرور چلائیں: + +
+ +```console +$ fastapi dev + + FastAPI Starting development server 🚀 + + Searching for package file structure from directories + with __init__.py files + Importing from /home/user/code/awesomeapp + + module 🐍 main.py + + code Importing the FastAPI app object from the module with + the following code: + + from main import app + + app Using import string: main:app + + server Server started at http://127.0.0.1:8000 + server Documentation at http://127.0.0.1:8000/docs + + tip Running in development mode, for production use: + fastapi run + + Logs: + + INFO Will watch for changes in these directories: + ['/home/user/code/awesomeapp'] + INFO Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C + to quit) + INFO Started reloader process [383138] using WatchFiles + INFO Started server process [383153] + INFO Waiting for application startup. + INFO Application startup complete. +``` + +
+ +آؤٹ پٹ میں، ایک لائن کچھ ایسی ہوگی: + +```hl_lines="4" +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +یہ لائن وہ URL دکھاتی ہے جہاں آپ کی ایپ آپ کی مقامی مشین پر چل رہی ہے۔ + +### اسے چیک کریں { #check-it } + +اپنا براؤزر [http://127.0.0.1:8000](http://127.0.0.1:8000) پر کھولیں۔ + +آپ JSON response اس طرح دیکھیں گے: + +```JSON +{"message": "Hello World"} +``` + +### انٹرایکٹو API دستاویزات { #interactive-api-docs } + +اب [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) پر جائیں۔ + +آپ خودکار انٹرایکٹو API دستاویزات دیکھیں گے (جو [Swagger UI](https://github.com/swagger-api/swagger-ui) کی طرف سے فراہم کی گئی ہیں): + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) + +### متبادل API دستاویزات { #alternative-api-docs } + +اور اب، [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) پر جائیں۔ + +آپ متبادل خودکار دستاویزات دیکھیں گے (جو [ReDoc](https://github.com/Rebilly/ReDoc) کی طرف سے فراہم کی گئی ہیں): + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) + +### OpenAPI { #openapi } + +**FastAPI** آپ کی تمام API کا ایک "schema" تیار کرتا ہے، APIs کی تعریف کے لیے **OpenAPI** معیار استعمال کرتے ہوئے۔ + +#### "Schema" { #schema } + +"Schema" کسی چیز کی تعریف یا وضاحت ہے۔ وہ کوڈ نہیں جو اسے نافذ کرتا ہے، بلکہ صرف ایک تجریدی وضاحت۔ + +#### API "Schema" { #api-schema } + +اس صورت میں، [OpenAPI](https://github.com/OAI/OpenAPI-Specification) ایک تصریح ہے جو بتاتی ہے کہ آپ کی API کا schema کیسے بنایا جائے۔ + +اس schema کی تعریف میں آپ کی API کے paths، ممکنہ parameters جو وہ لیتے ہیں، وغیرہ شامل ہیں۔ + +#### ڈیٹا "Schema" { #data-schema } + +اصطلاح "schema" کسی ڈیٹا کی شکل کا بھی حوالہ دے سکتی ہے، جیسے JSON مواد۔ + +اس صورت میں، اس کا مطلب ہوگا JSON attributes، اور ان کی data types وغیرہ۔ + +#### OpenAPI اور JSON Schema { #openapi-and-json-schema } + +OpenAPI آپ کی API کے لیے ایک API schema بناتا ہے۔ اور اس schema میں آپ کی API کے ذریعے بھیجے اور وصول کیے جانے والے ڈیٹا کی تعریفات (یا "schemas") شامل ہیں جو **JSON Schema** استعمال کرتی ہیں، جو JSON ڈیٹا schemas کا معیار ہے۔ + +#### `openapi.json` چیک کریں { #check-the-openapi-json } + +اگر آپ جاننا چاہتے ہیں کہ خام OpenAPI schema کیسا دکھتا ہے، تو FastAPI خودکار طور پر آپ کی تمام API کی وضاحتوں کے ساتھ ایک JSON (schema) تیار کرتا ہے۔ + +آپ اسے براہ راست یہاں دیکھ سکتے ہیں: [http://127.0.0.1:8000/openapi.json](http://127.0.0.1:8000/openapi.json)۔ + +یہ ایک JSON دکھائے گا جو کچھ ایسے شروع ہوگا: + +```JSON +{ + "openapi": "3.1.0", + "info": { + "title": "FastAPI", + "version": "0.1.0" + }, + "paths": { + "/items/": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + + + +... +``` + +#### OpenAPI کس لیے ہے { #what-is-openapi-for } + +OpenAPI schema وہ ہے جو شامل دو انٹرایکٹو دستاویزاتی نظاموں کو طاقت دیتا ہے۔ + +اور OpenAPI پر مبنی درجنوں متبادل موجود ہیں۔ آپ آسانی سے ان میں سے کوئی بھی متبادل اپنی **FastAPI** سے بنائی گئی ایپلیکیشن میں شامل کر سکتے ہیں۔ + +آپ اسے خودکار طور پر کوڈ بنانے کے لیے بھی استعمال کر سکتے ہیں، ان clients کے لیے جو آپ کی API سے بات چیت کرتے ہیں۔ مثال کے طور پر، frontend، موبائل یا IoT ایپلیکیشنز۔ + +### `pyproject.toml` میں ایپ `entrypoint` ترتیب دیں { #configure-the-app-entrypoint-in-pyproject-toml } + +آپ `pyproject.toml` فائل میں ترتیب دے سکتے ہیں کہ آپ کی ایپ کہاں واقع ہے: + +```toml +[tool.fastapi] +entrypoint = "main:app" +``` + +یہ `entrypoint` `fastapi` کمانڈ کو بتائے گا کہ ایپ کو اس طرح import کرنا ہے: + +```python +from main import app +``` + +اگر آپ کے کوڈ کی ساخت ایسی ہو: + +``` +. +├── backend +│ ├── main.py +│ ├── __init__.py +``` + +تو آپ `entrypoint` اس طرح سیٹ کریں گے: + +```toml +[tool.fastapi] +entrypoint = "backend.main:app" +``` + +جو اس کے مساوی ہوگا: + +```python +from backend.main import app +``` + +### path کے ساتھ `fastapi dev` { #fastapi-dev-with-path } + +آپ `fastapi dev` کمانڈ کو فائل کا path بھی دے سکتے ہیں، اور یہ استعمال کرنے والے FastAPI app object کا اندازہ لگا لے گا: + +```console +$ fastapi dev main.py +``` + +لیکن آپ کو ہر بار `fastapi` کمانڈ کال کرتے وقت صحیح path یاد رکھنا ہوگا۔ + +اس کے علاوہ، دوسرے ٹولز شاید اسے تلاش نہ کر سکیں، مثال کے طور پر [VS Code ایکسٹینشن](../editor-support.md) یا [FastAPI Cloud](https://fastapicloud.com)، اس لیے `pyproject.toml` میں `entrypoint` استعمال کرنا تجویز کیا جاتا ہے۔ + +### اپنی ایپ deploy کریں (اختیاری) { #deploy-your-app-optional } + +آپ اختیاری طور پر اپنی FastAPI ایپ کو [FastAPI Cloud](https://fastapicloud.com) پر deploy کر سکتے ہیں، اگر آپ نے ابھی تک نہیں کیا تو ویٹنگ لسٹ میں شامل ہو جائیں۔ + +اگر آپ کے پاس پہلے سے **FastAPI Cloud** اکاؤنٹ ہے (ہم نے آپ کو ویٹنگ لسٹ سے دعوت دی ہے)، تو آپ ایک کمانڈ سے اپنی ایپلیکیشن deploy کر سکتے ہیں۔ + +deploy کرنے سے پہلے، یقینی بنائیں کہ آپ لاگ ان ہیں: + +
+ +```console +$ fastapi login + +You are logged in to FastAPI Cloud 🚀 +``` + +
+ +پھر اپنی ایپ deploy کریں: + +
+ +```console +$ fastapi deploy + +Deploying to FastAPI Cloud... + +✅ Deployment successful! + +🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev +``` + +
+ +بس! اب آپ اس URL پر اپنی ایپ تک رسائی حاصل کر سکتے ہیں۔ + +## خلاصہ، قدم بہ قدم { #recap-step-by-step } + +### قدم 1: `FastAPI` import کریں { #step-1-import-fastapi } + +{* ../../docs_src/first_steps/tutorial001_py310.py hl[1] *} + +`FastAPI` ایک Python class ہے جو آپ کی API کے لیے تمام فعالیت فراہم کرتی ہے۔ + +/// note | تکنیکی تفصیلات + +`FastAPI` ایک class ہے جو براہ راست `Starlette` سے وراثت حاصل کرتی ہے۔ + +آپ **FastAPI** کے ساتھ [Starlette](https://www.starlette.dev/) کی تمام فعالیت بھی استعمال کر سکتے ہیں۔ + +/// + +### قدم 2: `FastAPI` کا "instance" بنائیں { #step-2-create-a-fastapi-instance } + +{* ../../docs_src/first_steps/tutorial001_py310.py hl[3] *} + +یہاں `app` متغیر `FastAPI` class کا ایک "instance" ہوگا۔ + +یہ آپ کی تمام API بنانے کے لیے تعامل کا بنیادی مقام ہوگا۔ + +### قدم 3: ایک *path operation* بنائیں { #step-3-create-a-path-operation } + +#### Path { #path } + +یہاں "Path" URL کے آخری حصے کا حوالہ دیتا ہے جو پہلے `/` سے شروع ہوتا ہے۔ + +تو، ایک URL جیسے: + +``` +https://example.com/items/foo +``` + +...میں path ہوگا: + +``` +/items/foo +``` + +/// info | معلومات + +"Path" کو عام طور پر "endpoint" یا "route" بھی کہا جاتا ہے۔ + +/// + +API بناتے وقت، "path" "خدشات" اور "وسائل" کو الگ کرنے کا بنیادی طریقہ ہے۔ + +#### Operation { #operation } + +یہاں "Operation" HTTP "methods" میں سے ایک کا حوالہ دیتا ہے۔ + +ان میں سے ایک: + +* `POST` +* `GET` +* `PUT` +* `DELETE` + +...اور مزید غیر معمولی: + +* `OPTIONS` +* `HEAD` +* `PATCH` +* `TRACE` + +HTTP پروٹوکول میں، آپ ان "methods" میں سے ایک (یا زیادہ) استعمال کر کے ہر path سے بات چیت کر سکتے ہیں۔ + +--- + +APIs بناتے وقت، آپ عام طور پر ایک مخصوص عمل انجام دینے کے لیے مخصوص HTTP methods استعمال کرتے ہیں۔ + +عام طور پر آپ استعمال کرتے ہیں: + +* `POST`: ڈیٹا بنانے کے لیے۔ +* `GET`: ڈیٹا پڑھنے کے لیے۔ +* `PUT`: ڈیٹا اپ ڈیٹ کرنے کے لیے۔ +* `DELETE`: ڈیٹا حذف کرنے کے لیے۔ + +تو، OpenAPI میں، ہر HTTP method کو "operation" کہا جاتا ہے۔ + +ہم بھی انہیں "**operations**" کہیں گے۔ + +#### ایک *path operation decorator* بنائیں { #define-a-path-operation-decorator } + +{* ../../docs_src/first_steps/tutorial001_py310.py hl[6] *} + +`@app.get("/")` **FastAPI** کو بتاتا ہے کہ نیچے والا function ان requests کو سنبھالنے کا ذمہ دار ہے جو یہاں آتی ہیں: + +* path `/` +* get operation استعمال کرتے ہوئے + +/// info | `@decorator` معلومات + +Python میں `@something` syntax کو "decorator" کہا جاتا ہے۔ + +آپ اسے function کے اوپر رکھتے ہیں۔ جیسے ایک خوبصورت آرائشی ٹوپی (مجھے لگتا ہے یہ اصطلاح وہیں سے آئی ہے)۔ + +"Decorator" نیچے والے function کو لیتا ہے اور اس کے ساتھ کچھ کرتا ہے۔ + +ہماری صورت میں، یہ decorator **FastAPI** کو بتاتا ہے کہ نیچے والا function **path** `/` کے ساتھ **operation** `get` سے مطابقت رکھتا ہے۔ + +یہ "**path operation decorator**" ہے۔ + +/// + +آپ دوسری operations بھی استعمال کر سکتے ہیں: + +* `@app.post()` +* `@app.put()` +* `@app.delete()` + +اور مزید غیر معمولی: + +* `@app.options()` +* `@app.head()` +* `@app.patch()` +* `@app.trace()` + +/// tip | مشورہ + +آپ ہر operation (HTTP method) کو جیسے چاہیں استعمال کرنے کے لیے آزاد ہیں۔ + +**FastAPI** کوئی مخصوص معنی نافذ نہیں کرتا۔ + +یہاں دی گئی معلومات ایک رہنمائی ہے، ضرورت نہیں۔ + +مثال کے طور پر، GraphQL استعمال کرتے وقت آپ عام طور پر تمام عمل صرف `POST` operations استعمال کر کے انجام دیتے ہیں۔ + +/// + +### قدم 4: **path operation function** بنائیں { #step-4-define-the-path-operation-function } + +یہ ہمارا "**path operation function**" ہے: + +* **path**: `/` ہے۔ +* **operation**: `get` ہے۔ +* **function**: "decorator" کے نیچے والا function ہے (`@app.get("/")` کے نیچے)۔ + +{* ../../docs_src/first_steps/tutorial001_py310.py hl[7] *} + +یہ ایک Python function ہے۔ + +جب بھی **FastAPI** کو URL "`/`" پر `GET` operation استعمال کرتے ہوئے کوئی request ملے گی تو یہ اسے کال کرے گا۔ + +اس صورت میں، یہ ایک `async` function ہے۔ + +--- + +آپ اسے `async def` کی بجائے عام function کے طور پر بھی بنا سکتے ہیں: + +{* ../../docs_src/first_steps/tutorial003_py310.py hl[7] *} + +/// note | نوٹ + +اگر آپ فرق نہیں جانتے، تو [Async: *"جلدی میں ہیں؟"*](../async.md#in-a-hurry) دیکھیں۔ + +/// + +### قدم 5: مواد واپس کریں { #step-5-return-the-content } + +{* ../../docs_src/first_steps/tutorial001_py310.py hl[8] *} + +آپ `dict`، `list`، واحد اقدار جیسے `str`، `int` وغیرہ واپس کر سکتے ہیں۔ + +آپ Pydantic models بھی واپس کر سکتے ہیں (آپ اس کے بارے میں بعد میں مزید دیکھیں گے)۔ + +بہت سی دوسری اشیاء اور models ہیں جو خودکار طور پر JSON میں تبدیل ہو جائیں گے (بشمول ORMs وغیرہ)۔ اپنے پسندیدہ استعمال کرنے کی کوشش کریں، بہت زیادہ امکان ہے کہ وہ پہلے سے تعاون یافتہ ہیں۔ + +### قدم 6: اسے Deploy کریں { #step-6-deploy-it } + +اپنی ایپ کو **[FastAPI Cloud](https://fastapicloud.com)** پر ایک کمانڈ سے deploy کریں: `fastapi deploy`۔ + +#### FastAPI Cloud کے بارے میں { #about-fastapi-cloud } + +**[FastAPI Cloud](https://fastapicloud.com)** اسی مصنف اور ٹیم نے بنایا ہے جو **FastAPI** کے پیچھے ہے۔ + +یہ کم سے کم کوشش کے ساتھ API کو **بنانے**، **deploy کرنے**، اور **رسائی حاصل کرنے** کے عمل کو آسان بناتا ہے۔ + +یہ FastAPI کے ساتھ ایپس بنانے کا وہی **ڈیولپر تجربہ** انہیں کلاؤڈ پر **deploy کرنے** میں لاتا ہے۔ + +FastAPI Cloud *FastAPI اور دوستوں* کے اوپن سورس پراجیکٹس کا بنیادی اسپانسر اور فنڈنگ فراہم کنندہ ہے۔ + +#### دوسرے کلاؤڈ فراہم کنندگان پر deploy کریں { #deploy-to-other-cloud-providers } + +FastAPI اوپن سورس ہے اور معیارات پر مبنی ہے۔ آپ FastAPI ایپس کو اپنی پسند کے کسی بھی کلاؤڈ فراہم کنندہ پر deploy کر سکتے ہیں۔ + +اپنے کلاؤڈ فراہم کنندہ کی گائیڈز کی پیروی کریں تاکہ ان کے ساتھ FastAPI ایپس deploy کر سکیں۔ + +## خلاصہ { #recap } + +* `FastAPI` import کریں۔ +* ایک `app` instance بنائیں۔ +* ایک **path operation decorator** لکھیں جیسے `@app.get("/")`۔ +* ایک **path operation function** بنائیں؛ مثال کے طور پر، `def root(): ...`۔ +* `fastapi dev` کمانڈ استعمال کر کے ڈیولپمنٹ سرور چلائیں۔ +* اختیاری طور پر اپنی ایپ `fastapi deploy` سے deploy کریں۔ diff --git a/docs/ur/docs/tutorial/handling-errors.md b/docs/ur/docs/tutorial/handling-errors.md new file mode 100644 index 000000000..1e58fbbba --- /dev/null +++ b/docs/ur/docs/tutorial/handling-errors.md @@ -0,0 +1,244 @@ +# Errors کو سنبھالنا { #handling-errors } + +بہت سے حالات ایسے ہوتے ہیں جن میں آپ کو اپنی API استعمال کرنے والے client کو error کی اطلاع دینی ہوتی ہے۔ + +یہ client ایک browser ہو سکتا ہے جس میں frontend ہو، کسی اور کا code ہو سکتا ہے، کوئی IoT device ہو سکتی ہے، وغیرہ۔ + +آپ کو client کو بتانا پڑ سکتا ہے کہ: + +* Client کے پاس اس عمل کے لیے کافی اختیارات نہیں ہیں۔ +* Client کو اس resource تک رسائی نہیں ہے۔ +* جس item تک client رسائی حاصل کرنا چاہتا تھا وہ موجود نہیں ہے۔ +* وغیرہ۔ + +ان صورتوں میں، آپ عام طور پر **400** کی حد میں (400 سے 499 تک) ایک **HTTP status code** واپس کریں گے۔ + +یہ 200 HTTP status codes (200 سے 299 تک) کی طرح ہے۔ وہ "200" status codes یہ ظاہر کرتے ہیں کہ request میں کسی نہ کسی طرح "کامیابی" ہوئی۔ + +400 کی حد میں status codes یہ ظاہر کرتے ہیں کہ client کی جانب سے کوئی error ہوا۔ + +وہ تمام **"404 Not Found"** errors (اور لطیفے) یاد ہیں؟ + +## `HTTPException` استعمال کریں { #use-httpexception } + +Client کو errors کے ساتھ HTTP responses واپس کرنے کے لیے آپ `HTTPException` استعمال کرتے ہیں۔ + +### `HTTPException` کو Import کریں { #import-httpexception } + +{* ../../docs_src/handling_errors/tutorial001_py310.py hl[1] *} + +### اپنے code میں `HTTPException` raise کریں { #raise-an-httpexception-in-your-code } + +`HTTPException` ایک عام Python exception ہے جس میں APIs سے متعلق اضافی data شامل ہوتا ہے۔ + +چونکہ یہ ایک Python exception ہے، آپ اسے `return` نہیں کرتے، بلکہ `raise` کرتے ہیں۔ + +اس کا یہ بھی مطلب ہے کہ اگر آپ کسی utility function کے اندر ہیں جسے آپ اپنے *path operation function* کے اندر سے call کر رہے ہیں، اور آپ اس utility function کے اندر سے `HTTPException` raise کرتے ہیں، تو یہ *path operation function* کا باقی code نہیں چلائے گا، بلکہ فوری طور پر اس request کو ختم کر دے گا اور `HTTPException` سے HTTP error client کو بھیج دے گا۔ + +Exception raise کرنے کا value واپس کرنے پر فائدہ Dependencies اور Security کے سیکشن میں مزید واضح ہوگا۔ + +اس مثال میں، جب client ایسے ID کے ذریعے کوئی item طلب کرتا ہے جو موجود نہیں ہے تو `404` status code کے ساتھ exception raise کریں: + +{* ../../docs_src/handling_errors/tutorial001_py310.py hl[11] *} + +### نتیجے میں ملنے والا response { #the-resulting-response } + +اگر client `http://example.com/items/foo` کی درخواست کرتا ہے (ایک `item_id` `"foo"`) تو اس client کو HTTP status code 200 ملے گا، اور ایک JSON response: + +```JSON +{ + "item": "The Foo Wrestlers" +} +``` + +لیکن اگر client `http://example.com/items/bar` کی درخواست کرتا ہے (ایک غیر موجود `item_id` `"bar"`) تو اس client کو HTTP status code 404 ("not found" error) ملے گا، اور ایک JSON response: + +```JSON +{ + "detail": "Item not found" +} +``` + +/// tip | مشورہ + +`HTTPException` raise کرتے وقت، آپ `detail` parameter کے طور پر کوئی بھی value دے سکتے ہیں جو JSON میں تبدیل ہو سکے، صرف `str` نہیں۔ + +آپ ایک `dict`، ایک `list` وغیرہ دے سکتے ہیں۔ + +یہ **FastAPI** کے ذریعے خودکار طور پر سنبھالے جاتے ہیں اور JSON میں تبدیل کیے جاتے ہیں۔ + +/// + +## حسب ضرورت headers شامل کریں { #add-custom-headers } + +کچھ حالات ایسے ہیں جن میں HTTP error میں حسب ضرورت headers شامل کرنا مفید ہوتا ہے۔ مثال کے طور پر، کچھ قسم کی security کے لیے۔ + +آپ کو شاید اپنے code میں اسے براہ راست استعمال کرنے کی ضرورت نہیں پڑے گی۔ + +لیکن اگر آپ کو کسی پیچیدہ منظرنامے کے لیے اس کی ضرورت ہو تو آپ حسب ضرورت headers شامل کر سکتے ہیں: + +{* ../../docs_src/handling_errors/tutorial002_py310.py hl[14] *} + +## حسب ضرورت exception handlers انسٹال کریں { #install-custom-exception-handlers } + +آپ [Starlette سے ملتی جلتی exception utilities](https://www.starlette.dev/exceptions/) کے ساتھ حسب ضرورت exception handlers شامل کر سکتے ہیں۔ + +فرض کریں کہ آپ کے پاس ایک حسب ضرورت exception `UnicornException` ہے جسے آپ (یا آپ کی استعمال کردہ library) `raise` کر سکتی ہے۔ + +اور آپ اس exception کو FastAPI کے ساتھ عالمی سطح پر سنبھالنا چاہتے ہیں۔ + +آپ `@app.exception_handler()` کے ساتھ ایک حسب ضرورت exception handler شامل کر سکتے ہیں: + +{* ../../docs_src/handling_errors/tutorial003_py310.py hl[5:7,13:18,24] *} + +یہاں، اگر آپ `/unicorns/yolo` کی درخواست کرتے ہیں تو *path operation* ایک `UnicornException` `raise` کرے گی۔ + +لیکن اسے `unicorn_exception_handler` سنبھالے گا۔ + +تو آپ کو ایک صاف error ملے گا، HTTP status code `418` کے ساتھ اور ایک JSON مواد: + +```JSON +{"message": "Oops! yolo did something. There goes a rainbow..."} +``` + +/// note | تکنیکی تفصیلات + +آپ `from starlette.requests import Request` اور `from starlette.responses import JSONResponse` بھی استعمال کر سکتے ہیں۔ + +**FastAPI** آپ کی سہولت کے لیے وہی `starlette.responses` بطور `fastapi.responses` فراہم کرتا ہے۔ لیکن زیادہ تر دستیاب responses براہ راست Starlette سے آتے ہیں۔ `Request` کے ساتھ بھی یہی معاملہ ہے۔ + +/// + +## پہلے سے طے شدہ exception handlers کو تبدیل کریں { #override-the-default-exception-handlers } + +**FastAPI** کے کچھ پہلے سے طے شدہ exception handlers ہیں۔ + +یہ handlers جب آپ `HTTPException` `raise` کرتے ہیں اور جب request میں غلط data ہوتا ہے تو پہلے سے طے شدہ JSON responses واپس کرنے کے ذمہ دار ہوتے ہیں۔ + +آپ ان exception handlers کو اپنے handlers سے تبدیل کر سکتے ہیں۔ + +### Request validation exceptions کو تبدیل کریں { #override-request-validation-exceptions } + +جب کسی request میں غلط data ہوتا ہے تو **FastAPI** اندرونی طور پر ایک `RequestValidationError` raise کرتا ہے۔ + +اور اس کے لیے ایک پہلے سے طے شدہ exception handler بھی شامل ہے۔ + +اسے تبدیل کرنے کے لیے `RequestValidationError` کو import کریں اور اسے `@app.exception_handler(RequestValidationError)` کے ساتھ exception handler کو decorate کرنے کے لیے استعمال کریں۔ + +Exception handler ایک `Request` اور exception وصول کرے گا۔ + +{* ../../docs_src/handling_errors/tutorial004_py310.py hl[2,14:19] *} + +اب اگر آپ `/items/foo` پر جائیں تو پہلے سے طے شدہ JSON error کی بجائے: + +```JSON +{ + "detail": [ + { + "loc": [ + "path", + "item_id" + ], + "msg": "value is not a valid integer", + "type": "type_error.integer" + } + ] +} +``` + +آپ کو ایک text version ملے گا: + +``` +Validation errors: +Field: ('path', 'item_id'), Error: Input should be a valid integer, unable to parse string as an integer +``` + +### `HTTPException` error handler کو تبدیل کریں { #override-the-httpexception-error-handler } + +اسی طرح، آپ `HTTPException` handler کو بھی تبدیل کر سکتے ہیں۔ + +مثال کے طور پر، آپ ان errors کے لیے JSON کی بجائے سادہ text response واپس کرنا چاہ سکتے ہیں: + +{* ../../docs_src/handling_errors/tutorial004_py310.py hl[3:4,9:11,25] *} + +/// note | تکنیکی تفصیلات + +آپ `from starlette.responses import PlainTextResponse` بھی استعمال کر سکتے ہیں۔ + +**FastAPI** آپ کی سہولت کے لیے وہی `starlette.responses` بطور `fastapi.responses` فراہم کرتا ہے۔ لیکن زیادہ تر دستیاب responses براہ راست Starlette سے آتے ہیں۔ + +/// + +/// warning | انتباہ + +ذہن میں رکھیں کہ `RequestValidationError` میں اس file کا نام اور لائن کی معلومات شامل ہوتی ہیں جہاں validation error ہوا تاکہ آپ چاہیں تو اپنے logs میں متعلقہ معلومات کے ساتھ اسے دکھا سکیں۔ + +لیکن اس کا مطلب ہے کہ اگر آپ اسے صرف string میں تبدیل کر کے وہ معلومات براہ راست واپس کریں تو آپ اپنے سسٹم کے بارے میں کچھ معلومات ظاہر کر سکتے ہیں، اسی لیے یہاں code ہر error کو الگ سے نکال کر دکھاتا ہے۔ + +/// + +### `RequestValidationError` کا body استعمال کریں { #use-the-requestvalidationerror-body } + +`RequestValidationError` میں وہ `body` شامل ہوتا ہے جو غلط data کے ساتھ موصول ہوا تھا۔ + +آپ اسے اپنی app بناتے وقت body کو log کرنے اور debug کرنے، user کو واپس کرنے وغیرہ کے لیے استعمال کر سکتے ہیں۔ + +{* ../../docs_src/handling_errors/tutorial005_py310.py hl[14] *} + +اب ایک غلط item بھیجنے کی کوشش کریں جیسے: + +```JSON +{ + "title": "towel", + "size": "XL" +} +``` + +آپ کو ایک response ملے گا جو بتائے گا کہ data غلط ہے اور اس میں موصول شدہ body شامل ہوگا: + +```JSON hl_lines="12-15" +{ + "detail": [ + { + "loc": [ + "body", + "size" + ], + "msg": "value is not a valid integer", + "type": "type_error.integer" + } + ], + "body": { + "title": "towel", + "size": "XL" + } +} +``` + +#### FastAPI کا `HTTPException` بمقابلہ Starlette کا `HTTPException` { #fastapis-httpexception-vs-starlettes-httpexception } + +**FastAPI** کا اپنا `HTTPException` ہے۔ + +اور **FastAPI** کی `HTTPException` error class، Starlette کی `HTTPException` error class سے inherit ہوتی ہے۔ + +فرق صرف یہ ہے کہ **FastAPI** کا `HTTPException`، `detail` field کے لیے کوئی بھی JSON میں قابل تبدیل data قبول کرتا ہے، جبکہ Starlette کا `HTTPException` صرف strings قبول کرتا ہے۔ + +تو آپ **FastAPI** کا `HTTPException` عام طریقے سے اپنے code میں raise کرتے رہ سکتے ہیں۔ + +لیکن جب آپ exception handler رجسٹر کریں تو اسے Starlette کے `HTTPException` کے لیے رجسٹر کریں۔ + +اس طرح، اگر Starlette کے اندرونی code کا کوئی حصہ، یا کوئی Starlette extension یا plug-in، Starlette کا `HTTPException` raise کرے تو آپ کا handler اسے پکڑ کر سنبھال سکے گا۔ + +اس مثال میں، ایک ہی code میں دونوں `HTTPException` رکھنے کے لیے، Starlette کے exception کا نام `StarletteHTTPException` رکھا گیا ہے: + +```Python +from starlette.exceptions import HTTPException as StarletteHTTPException +``` + +### **FastAPI** کے exception handlers دوبارہ استعمال کریں { #reuse-fastapis-exception-handlers } + +اگر آپ exception کو **FastAPI** کے پہلے سے طے شدہ exception handlers کے ساتھ استعمال کرنا چاہتے ہیں تو آپ `fastapi.exception_handlers` سے پہلے سے طے شدہ exception handlers import اور دوبارہ استعمال کر سکتے ہیں: + +{* ../../docs_src/handling_errors/tutorial006_py310.py hl[2:5,15,21] *} + +اس مثال میں آپ بہت واضح پیغام کے ساتھ error print کر رہے ہیں، لیکن آپ کو خیال آ گیا ہوگا۔ آپ exception استعمال کر سکتے ہیں اور پھر صرف پہلے سے طے شدہ exception handlers کو دوبارہ استعمال کر سکتے ہیں۔ diff --git a/docs/ur/docs/tutorial/header-param-models.md b/docs/ur/docs/tutorial/header-param-models.md new file mode 100644 index 000000000..1359ce7a8 --- /dev/null +++ b/docs/ur/docs/tutorial/header-param-models.md @@ -0,0 +1,72 @@ +# Header Parameter Models { #header-parameter-models } + +اگر آپ کے پاس ایک دوسرے سے متعلقہ **header parameters** کا گروپ ہے، تو آپ انہیں declare کرنے کے لیے ایک **Pydantic model** بنا سکتے ہیں۔ + +اس سے آپ کو **model کو کئی جگہوں پر دوبارہ استعمال** کرنے اور تمام parameters کے لیے validations اور metadata ایک ساتھ declare کرنے کی سہولت ملے گی۔ 😎 + +/// note | نوٹ + +یہ FastAPI version `0.115.0` سے supported ہے۔ 🤓 + +/// + +## Pydantic Model کے ساتھ Header Parameters { #header-parameters-with-a-pydantic-model } + +وہ **header parameters** جو آپ کو درکار ہیں انہیں ایک **Pydantic model** میں declare کریں، اور پھر parameter کو `Header` کے طور پر declare کریں: + +{* ../../docs_src/header_param_models/tutorial001_an_py310.py hl[9:14,18] *} + +**FastAPI** request میں موجود **headers** سے **ہر field** کا ڈیٹا **extract** کرے گا اور آپ کو وہ Pydantic model دے گا جو آپ نے define کیا ہے۔ + +## Docs چیک کریں { #check-the-docs } + +آپ `/docs` پر docs UI میں مطلوبہ headers دیکھ سکتے ہیں: + +
+ +
+ +## اضافی Headers پر پابندی { #forbid-extra-headers } + +بعض خاص استعمال کے معاملات میں (شاید بہت عام نہیں)، آپ ان headers کو **محدود** کرنا چاہ سکتے ہیں جو آپ وصول کرنا چاہتے ہیں۔ + +آپ Pydantic کی model configuration استعمال کر کے کسی بھی `extra` fields کو `forbid` کر سکتے ہیں: + +{* ../../docs_src/header_param_models/tutorial002_an_py310.py hl[10] *} + +اگر کوئی client کچھ **اضافی headers** بھیجنے کی کوشش کرے، تو اسے ایک **error** response ملے گا۔ + +مثال کے طور پر، اگر client `tool` header کو `plumbus` کی قدر کے ساتھ بھیجنے کی کوشش کرے، تو اسے ایک **error** response ملے گا جو بتائے گا کہ header parameter `tool` کی اجازت نہیں ہے: + +```json +{ + "detail": [ + { + "type": "extra_forbidden", + "loc": ["header", "tool"], + "msg": "Extra inputs are not permitted", + "input": "plumbus", + } + ] +} +``` + +## Underscores کی تبدیلی بند کریں { #disable-convert-underscores } + +عام header parameters کی طرح، جب آپ کے parameter ناموں میں underscore حروف ہوتے ہیں، تو وہ **خودکار طور پر hyphens میں تبدیل** ہو جاتے ہیں۔ + +مثال کے طور پر، اگر آپ کے code میں `save_data` نام کا header parameter ہے، تو متوقع HTTP header `save-data` ہوگا، اور docs میں بھی اسی طرح دکھایا جائے گا۔ + +اگر کسی وجہ سے آپ کو یہ خودکار تبدیلی بند کرنی ہو، تو آپ header parameters کے Pydantic models کے لیے بھی ایسا کر سکتے ہیں۔ + +{* ../../docs_src/header_param_models/tutorial003_an_py310.py hl[19] *} + +/// warning | انتباہ + +`convert_underscores` کو `False` پر سیٹ کرنے سے پہلے، یہ ذہن میں رکھیں کہ بعض HTTP proxies اور servers underscores والے headers کے استعمال کی اجازت نہیں دیتے۔ + +/// + +## خلاصہ { #summary } + +آپ **Pydantic models** استعمال کر کے **FastAPI** میں **headers** declare کر سکتے ہیں۔ 😎 diff --git a/docs/ur/docs/tutorial/header-params.md b/docs/ur/docs/tutorial/header-params.md new file mode 100644 index 000000000..9cb94c427 --- /dev/null +++ b/docs/ur/docs/tutorial/header-params.md @@ -0,0 +1,91 @@ +# Header Parameters { #header-parameters } + +آپ Header parameters کو اسی طرح define کر سکتے ہیں جیسے آپ `Query`، `Path` اور `Cookie` parameters define کرتے ہیں۔ + +## `Header` Import کریں { #import-header } + +سب سے پہلے `Header` import کریں: + +{* ../../docs_src/header_params/tutorial001_an_py310.py hl[3] *} + +## `Header` parameters declare کریں { #declare-header-parameters } + +پھر header parameters کو اسی طریقے سے declare کریں جیسے `Path`، `Query` اور `Cookie` کے ساتھ کرتے ہیں۔ + +آپ default value کے ساتھ ساتھ تمام اضافی validation یا annotation parameters بھی define کر سکتے ہیں: + +{* ../../docs_src/header_params/tutorial001_an_py310.py hl[9] *} + +/// note | تکنیکی تفصیلات + +`Header` ایک "بہن" class ہے `Path`، `Query` اور `Cookie` کی۔ یہ بھی اسی مشترکہ `Param` class سے inherit کرتی ہے۔ + +لیکن یاد رکھیں کہ جب آپ `fastapi` سے `Query`، `Path`، `Header` اور دیگر import کرتے ہیں، تو یہ دراصل ایسے functions ہیں جو خاص classes واپس کرتے ہیں۔ + +/// + +/// info | معلومات + +Headers declare کرنے کے لیے آپ کو `Header` استعمال کرنا ضروری ہے، ورنہ parameters کو query parameters سمجھا جائے گا۔ + +/// + +## خودکار تبدیلی { #automatic-conversion } + +`Header` میں `Path`، `Query` اور `Cookie` کے مقابلے میں تھوڑی اضافی فعالیت ہے۔ + +زیادہ تر معیاری headers "ہائفن" حرف سے الگ ہوتے ہیں، جسے "مائنس علامت" (`-`) بھی کہتے ہیں۔ + +لیکن `user-agent` جیسا variable Python میں غلط ہے۔ + +لہذا، بطور ڈیفالٹ، `Header` parameter ناموں کے حروف کو underscore (`_`) سے hyphen (`-`) میں تبدیل کرے گا تاکہ headers کو extract اور document کیا جا سکے۔ + +نیز، HTTP headers حروف کے بڑے چھوٹے ہونے سے بے پرواہ (case-insensitive) ہوتے ہیں، لہذا آپ انہیں معیاری Python طرز (جسے "snake_case" بھی کہتے ہیں) میں declare کر سکتے ہیں۔ + +تو آپ `user_agent` کو ویسے ہی استعمال کر سکتے ہیں جیسے آپ عام طور پر Python code میں کرتے ہیں، بجائے اس کے کہ پہلے حروف کو بڑا لکھیں جیسے `User_Agent` یا کچھ ایسا۔ + +اگر کسی وجہ سے آپ کو underscores سے hyphens میں خودکار تبدیلی بند کرنی ہو، تو `Header` کا parameter `convert_underscores` کو `False` پر سیٹ کریں: + +{* ../../docs_src/header_params/tutorial002_an_py310.py hl[10] *} + +/// warning | انتباہ + +`convert_underscores` کو `False` پر سیٹ کرنے سے پہلے، یہ ذہن میں رکھیں کہ بعض HTTP proxies اور servers underscores والے headers کے استعمال کی اجازت نہیں دیتے۔ + +/// + +## ڈپلیکیٹ headers { #duplicate-headers } + +ڈپلیکیٹ headers وصول کرنا ممکن ہے۔ یعنی، ایک ہی header متعدد قدروں کے ساتھ۔ + +آپ ان معاملات کو type declaration میں list استعمال کر کے define کر سکتے ہیں۔ + +آپ کو ڈپلیکیٹ header کی تمام قدریں Python `list` کے طور پر ملیں گی۔ + +مثال کے طور پر، `X-Token` کا header declare کرنے کے لیے جو ایک سے زیادہ بار آ سکتا ہے، آپ اس طرح لکھ سکتے ہیں: + +{* ../../docs_src/header_params/tutorial003_an_py310.py hl[9] *} + +اگر آپ اس *path operation* کے ساتھ دو HTTP headers بھیج کر بات کریں جیسے: + +``` +X-Token: foo +X-Token: bar +``` + +تو response اس طرح ہوگا: + +```JSON +{ + "X-Token values": [ + "bar", + "foo" + ] +} +``` + +## خلاصہ { #recap } + +Headers کو `Header` کے ساتھ declare کریں، اسی عام pattern کو استعمال کرتے ہوئے جو `Query`، `Path` اور `Cookie` کے لیے ہے۔ + +اور اپنے variables میں underscores کی فکر نہ کریں، **FastAPI** انہیں تبدیل کرنے کا خیال رکھے گا۔ diff --git a/docs/ur/docs/tutorial/index.md b/docs/ur/docs/tutorial/index.md new file mode 100644 index 000000000..ea25d5b8c --- /dev/null +++ b/docs/ur/docs/tutorial/index.md @@ -0,0 +1,101 @@ +# ٹیوٹوریل - صارف گائیڈ { #tutorial-user-guide } + +یہ ٹیوٹوریل آپ کو **FastAPI** کی زیادہ تر خصوصیات کے ساتھ قدم بہ قدم استعمال کرنا سکھاتا ہے۔ + +ہر حصہ پچھلے حصوں پر بتدریج بنتا ہے، لیکن یہ موضوعات کے لحاظ سے الگ الگ ترتیب دیا گیا ہے، تاکہ آپ اپنی مخصوص API ضروریات کو پورا کرنے کے لیے براہ راست کسی بھی مخصوص حصے پر جا سکیں۔ + +یہ مستقبل کے حوالے کے طور پر بھی کام کرنے کے لیے بنایا گیا ہے تاکہ آپ واپس آ کر بالکل وہی دیکھ سکیں جو آپ کو چاہیے۔ + +## کوڈ چلائیں { #run-the-code } + +تمام کوڈ بلاکس کو کاپی کر کے براہ راست استعمال کیا جا سکتا ہے (یہ دراصل ٹیسٹ شدہ Python فائلیں ہیں)۔ + +کوئی بھی مثال چلانے کے لیے، کوڈ کو `main.py` فائل میں کاپی کریں، اور `fastapi dev` شروع کریں: + +
+ +```console +$ fastapi dev + + FastAPI Starting development server 🚀 + + Searching for package file structure from directories + with __init__.py files + Importing from /home/user/code/awesomeapp + + module 🐍 main.py + + code Importing the FastAPI app object from the module with + the following code: + + from main import app + + app Using import string: main:app + + server Server started at http://127.0.0.1:8000 + server Documentation at http://127.0.0.1:8000/docs + + tip Running in development mode, for production use: + fastapi run + + Logs: + + INFO Will watch for changes in these directories: + ['/home/user/code/awesomeapp'] + INFO Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C + to quit) + INFO Started reloader process [383138] using WatchFiles + INFO Started server process [383153] + INFO Waiting for application startup. + INFO Application startup complete. +``` + +
+ +آپ سے **انتہائی گزارش** ہے کہ کوڈ لکھیں یا کاپی کریں، اسے ایڈٹ کریں اور مقامی طور پر چلائیں۔ + +اسے اپنے ایڈیٹر میں استعمال کرنے سے آپ کو FastAPI کے فوائد واقعی نظر آئیں گے، جیسے کہ کتنا کم کوڈ لکھنا پڑتا ہے، تمام type checks، autocompletion وغیرہ۔ + +--- + +## FastAPI انسٹال کریں { #install-fastapi } + +پہلا قدم FastAPI انسٹال کرنا ہے۔ + +یقینی بنائیں کہ آپ ایک [virtual environment](../virtual-environments.md) بنائیں، اسے فعال کریں، اور پھر **FastAPI انسٹال کریں**: + +
+ +```console +$ pip install "fastapi[standard]" + +---> 100% +``` + +
+ +/// note | نوٹ + +جب آپ `pip install "fastapi[standard]"` کے ساتھ انسٹال کرتے ہیں تو یہ کچھ پہلے سے طے شدہ اختیاری معیاری dependencies کے ساتھ آتا ہے، بشمول `fastapi-cloud-cli`، جو آپ کو [FastAPI Cloud](https://fastapicloud.com) پر deploy کرنے کی اجازت دیتا ہے۔ + +اگر آپ وہ اختیاری dependencies نہیں چاہتے، تو آپ اس کی بجائے `pip install fastapi` انسٹال کر سکتے ہیں۔ + +اگر آپ معیاری dependencies چاہتے ہیں لیکن `fastapi-cloud-cli` کے بغیر، تو آپ `pip install "fastapi[standard-no-fastapi-cloud-cli]"` کے ساتھ انسٹال کر سکتے ہیں۔ + +/// + +/// tip | مشورہ + +FastAPI کی [VS Code کے لیے سرکاری ایکسٹینشن](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) (اور Cursor) موجود ہے، جو بہت سی خصوصیات فراہم کرتی ہے، بشمول path operation ایکسپلورر، path operation تلاش، ٹیسٹس میں CodeLens نیویگیشن (ٹیسٹس سے ڈیفینیشن پر جائیں)، اور FastAPI Cloud deployment اور لاگز، سب کچھ آپ کے ایڈیٹر سے۔ + +/// + +## ایڈوانسڈ صارف گائیڈ { #advanced-user-guide } + +ایک **ایڈوانسڈ صارف گائیڈ** بھی ہے جسے آپ اس **ٹیوٹوریل - صارف گائیڈ** کے بعد پڑھ سکتے ہیں۔ + +**ایڈوانسڈ صارف گائیڈ** اسی پر بنتا ہے، انہی تصورات کو استعمال کرتا ہے، اور آپ کو کچھ اضافی خصوصیات سکھاتا ہے۔ + +لیکن آپ کو پہلے **ٹیوٹوریل - صارف گائیڈ** (جو آپ ابھی پڑھ رہے ہیں) پڑھنا چاہیے۔ + +یہ اس طرح ڈیزائن کیا گیا ہے کہ آپ صرف **ٹیوٹوریل - صارف گائیڈ** سے ایک مکمل ایپلیکیشن بنا سکتے ہیں، اور پھر اسے مختلف طریقوں سے بڑھا سکتے ہیں، اپنی ضروریات کے مطابق، **ایڈوانسڈ صارف گائیڈ** سے کچھ اضافی خیالات استعمال کر کے۔ diff --git a/docs/ur/docs/tutorial/metadata.md b/docs/ur/docs/tutorial/metadata.md new file mode 100644 index 000000000..350daef0d --- /dev/null +++ b/docs/ur/docs/tutorial/metadata.md @@ -0,0 +1,120 @@ +# Metadata اور Docs URLs { #metadata-and-docs-urls } + +آپ اپنی **FastAPI** application میں کئی metadata configurations کو حسب ضرورت بنا سکتے ہیں۔ + +## API کے لیے Metadata { #metadata-for-api } + +آپ درج ذیل fields سیٹ کر سکتے ہیں جو OpenAPI specification اور خودکار API docs UIs میں استعمال ہوتے ہیں: + +| Parameter | Type | تفصیل | +|------------|------|-------------| +| `title` | `str` | API کا عنوان۔ | +| `summary` | `str` | API کا مختصر خلاصہ۔ OpenAPI 3.1.0 سے دستیاب، FastAPI 0.99.0۔ | +| `description` | `str` | API کی مختصر تفصیل۔ یہ Markdown استعمال کر سکتی ہے۔ | +| `version` | `string` | API کا ورژن۔ یہ آپ کی اپنی application کا ورژن ہے، OpenAPI کا نہیں۔ مثلاً `2.5.0`۔ | +| `terms_of_service` | `str` | API کی Terms of Service کا URL۔ اگر فراہم کیا جائے تو یہ URL ہونا ضروری ہے۔ | +| `contact` | `dict` | API کی رابطہ معلومات۔ اس میں کئی fields ہو سکتے ہیں۔
contact fields
ParameterTypeتفصیل
namestrرابطہ شخص/تنظیم کا شناختی نام۔
urlstrرابطہ معلومات کی طرف اشارہ کرنے والا URL۔ URL کی شکل میں ہونا ضروری ہے۔
emailstrرابطہ شخص/تنظیم کا email پتہ۔ email پتے کی شکل میں ہونا ضروری ہے۔
| +| `license_info` | `dict` | API کی license معلومات۔ اس میں کئی fields ہو سکتے ہیں۔
license_info fields
ParameterTypeتفصیل
namestrضروری (اگر license_info سیٹ ہو)۔ API کے لیے استعمال شدہ license کا نام۔
identifierstrAPI کے لیے ایک [SPDX](https://spdx.org/licenses/) license expression۔ identifier field url field سے باہمی طور پر خارج ہے۔ OpenAPI 3.1.0 سے دستیاب، FastAPI 0.99.0۔
urlstrAPI کے لیے استعمال شدہ license کا URL۔ URL کی شکل میں ہونا ضروری ہے۔
| + +آپ انہیں اس طرح سیٹ کر سکتے ہیں: + +{* ../../docs_src/metadata/tutorial001_py310.py hl[3:16, 19:32] *} + +/// tip | مشورہ + +آپ `description` field میں Markdown لکھ سکتے ہیں اور یہ output میں render ہوگا۔ + +/// + +اس configuration کے ساتھ، خودکار API docs اس طرح نظر آئیں گے: + + + +## License identifier { #license-identifier } + +OpenAPI 3.1.0 اور FastAPI 0.99.0 سے، آپ `license_info` کو `url` کی بجائے `identifier` کے ساتھ بھی سیٹ کر سکتے ہیں۔ + +مثال کے طور پر: + +{* ../../docs_src/metadata/tutorial001_1_py310.py hl[31] *} + +## Tags کے لیے Metadata { #metadata-for-tags } + +آپ `openapi_tags` parameter کے ذریعے اپنے path operations کو گروپ کرنے کے لیے استعمال ہونے والے مختلف tags کے لیے اضافی metadata بھی شامل کر سکتے ہیں۔ + +یہ ایک فہرست لیتا ہے جس میں ہر tag کے لیے ایک dictionary ہوتی ہے۔ + +ہر dictionary میں یہ ہو سکتا ہے: + +* `name` (**ضروری**): ایک `str` جس میں وہی tag نام ہو جو آپ اپنے *path operations* اور `APIRouter`s میں `tags` parameter میں استعمال کرتے ہیں۔ +* `description`: ایک `str` جس میں tag کی مختصر تفصیل ہو۔ اس میں Markdown ہو سکتا ہے اور docs UI میں دکھایا جائے گا۔ +* `externalDocs`: ایک `dict` جو بیرونی دستاویزات بیان کرے: + * `description`: ایک `str` جس میں بیرونی docs کی مختصر تفصیل ہو۔ + * `url` (**ضروری**): ایک `str` جس میں بیرونی دستاویزات کا URL ہو۔ + +### Tags کے لیے metadata بنائیں { #create-metadata-for-tags } + +آئیں اسے `users` اور `items` کے tags کی مثال میں آزمائیں۔ + +اپنے tags کے لیے metadata بنائیں اور اسے `openapi_tags` parameter کو دیں: + +{* ../../docs_src/metadata/tutorial004_py310.py hl[3:16,18] *} + +دیکھیں کہ آپ descriptions کے اندر Markdown استعمال کر سکتے ہیں، مثلاً "login" بولڈ میں دکھایا جائے گا (**login**) اور "fancy" اٹالک میں (_fancy_)۔ + +/// tip | مشورہ + +آپ کو ہر اس tag کے لیے metadata شامل کرنے کی ضرورت نہیں جو آپ استعمال کرتے ہیں۔ + +/// + +### اپنے tags استعمال کریں { #use-your-tags } + +اپنے *path operations* (اور `APIRouter`s) کے ساتھ `tags` parameter استعمال کریں تاکہ انہیں مختلف tags میں تقسیم کریں: + +{* ../../docs_src/metadata/tutorial004_py310.py hl[21,26] *} + +/// info | معلومات + +Tags کے بارے میں مزید [Path Operation Configuration](path-operation-configuration.md#tags) میں پڑھیں۔ + +/// + +### Docs چیک کریں { #check-the-docs } + +اب، اگر آپ docs چیک کریں، تو وہ تمام اضافی metadata دکھائیں گے: + + + +### Tags کی ترتیب { #order-of-tags } + +ہر tag metadata dictionary کی ترتیب docs UI میں دکھائی جانے والی ترتیب کو بھی define کرتی ہے۔ + +مثال کے طور پر، اگرچہ `users` حروف تہجی کی ترتیب میں `items` کے بعد آتا ہے، یہ ان سے پہلے دکھایا جاتا ہے، کیونکہ ہم نے ان کا metadata فہرست میں پہلی dictionary کے طور پر شامل کیا ہے۔ + +## OpenAPI URL { #openapi-url } + +بطور ڈیفالٹ، OpenAPI schema `/openapi.json` پر serve ہوتا ہے۔ + +لیکن آپ اسے `openapi_url` parameter سے configure کر سکتے ہیں۔ + +مثال کے طور پر، اسے `/api/v1/openapi.json` پر serve کرنے کے لیے: + +{* ../../docs_src/metadata/tutorial002_py310.py hl[3] *} + +اگر آپ OpenAPI schema کو مکمل طور پر غیر فعال کرنا چاہتے ہیں تو آپ `openapi_url=None` سیٹ کر سکتے ہیں، اس سے وہ documentation user interfaces بھی غیر فعال ہو جائیں گی جو اسے استعمال کرتے ہیں۔ + +## Docs URLs { #docs-urls } + +آپ شامل کیے گئے دو documentation user interfaces کو configure کر سکتے ہیں: + +* **Swagger UI**: `/docs` پر serve ہوتا ہے۔ + * آپ `docs_url` parameter سے اس کا URL سیٹ کر سکتے ہیں۔ + * آپ `docs_url=None` سیٹ کر کے اسے غیر فعال کر سکتے ہیں۔ +* **ReDoc**: `/redoc` پر serve ہوتا ہے۔ + * آپ `redoc_url` parameter سے اس کا URL سیٹ کر سکتے ہیں۔ + * آپ `redoc_url=None` سیٹ کر کے اسے غیر فعال کر سکتے ہیں۔ + +مثال کے طور پر، Swagger UI کو `/documentation` پر serve کرنے اور ReDoc کو غیر فعال کرنے کے لیے: + +{* ../../docs_src/metadata/tutorial003_py310.py hl[3] *} diff --git a/docs/ur/docs/tutorial/middleware.md b/docs/ur/docs/tutorial/middleware.md new file mode 100644 index 000000000..6cb0c3d03 --- /dev/null +++ b/docs/ur/docs/tutorial/middleware.md @@ -0,0 +1,95 @@ +# Middleware { #middleware } + +آپ **FastAPI** applications میں middleware شامل کر سکتے ہیں۔ + +"middleware" ایک function ہے جو ہر **request** کے ساتھ کام کرتا ہے اس سے پہلے کہ اسے کسی مخصوص *path operation* سے process کیا جائے۔ اور ساتھ ہی ہر **response** کے ساتھ بھی اسے واپس بھیجنے سے پہلے کام کرتا ہے۔ + +* یہ آپ کی application پر آنے والی ہر **request** کو لیتا ہے۔ +* پھر یہ اس **request** کے ساتھ کچھ کر سکتا ہے یا کوئی ضروری code چلا سکتا ہے۔ +* پھر یہ **request** کو باقی application (کسی *path operation*) کو process کرنے کے لیے آگے بھیجتا ہے۔ +* پھر یہ application (کسی *path operation*) کی طرف سے بنایا گیا **response** لیتا ہے۔ +* یہ اس **response** کے ساتھ کچھ کر سکتا ہے یا کوئی ضروری code چلا سکتا ہے۔ +* پھر یہ **response** واپس بھیجتا ہے۔ + +/// note | تکنیکی تفصیلات + +اگر آپ کے پاس `yield` والی dependencies ہیں، تو exit code middleware کے *بعد* چلے گا۔ + +اگر کوئی background tasks تھے (جن کا ذکر [Background Tasks](background-tasks.md) سیکشن میں ہے، آپ اسے بعد میں دیکھیں گے)، تو وہ تمام middleware کے *بعد* چلیں گے۔ + +/// + +## ایک middleware بنائیں { #create-a-middleware } + +middleware بنانے کے لیے آپ ایک function کے اوپر `@app.middleware("http")` decorator استعمال کریں۔ + +middleware function یہ وصول کرتا ہے: + +* `request`۔ +* ایک function `call_next` جو `request` کو parameter کے طور پر وصول کرے گا۔ + * یہ function `request` کو متعلقہ *path operation* تک پہنچائے گا۔ + * پھر یہ متعلقہ *path operation* کی طرف سے بنایا گیا `response` واپس کرے گا۔ +* پھر آپ `response` کو واپس بھیجنے سے پہلے مزید تبدیل کر سکتے ہیں۔ + +{* ../../docs_src/middleware/tutorial001_py310.py hl[8:9,11,14] *} + +/// tip | مشورہ + +یاد رکھیں کہ custom proprietary headers ["`X-` prefix" استعمال کرتے ہوئے](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers) شامل کیے جا سکتے ہیں۔ + +لیکن اگر آپ کے پاس ایسے custom headers ہیں جو آپ چاہتے ہیں کہ browser میں موجود client دیکھ سکے، تو آپ کو انہیں اپنی CORS configurations ([CORS (Cross-Origin Resource Sharing)](cors.md)) میں `expose_headers` parameter استعمال کرتے ہوئے شامل کرنا ہوگا جیسا کہ [Starlette کی CORS دستاویزات](https://www.starlette.dev/middleware/#corsmiddleware) میں بیان کیا گیا ہے۔ + +/// + +/// note | تکنیکی تفصیلات + +آپ `from starlette.requests import Request` بھی استعمال کر سکتے ہیں۔ + +**FastAPI** اسے آپ کی سہولت کے لیے فراہم کرتا ہے۔ لیکن یہ براہ راست Starlette سے آتا ہے۔ + +/// + +### `response` سے پہلے اور بعد { #before-and-after-the-response } + +آپ `request` کے ساتھ چلنے کے لیے code شامل کر سکتے ہیں، کسی بھی *path operation* کو وصول کرنے سے پہلے۔ + +اور ساتھ ہی `response` بننے کے بعد، اسے واپس بھیجنے سے پہلے بھی۔ + +مثال کے طور پر، آپ ایک custom header `X-Process-Time` شامل کر سکتے ہیں جس میں request کو process کرنے اور response بنانے میں لگنے والا وقت سیکنڈز میں ہو: + +{* ../../docs_src/middleware/tutorial001_py310.py hl[10,12:13] *} + +/// tip | مشورہ + +یہاں ہم `time.time()` کی بجائے [`time.perf_counter()`](https://docs.python.org/3/library/time.html#time.perf_counter) استعمال کر رہے ہیں کیونکہ یہ ان استعمالات کے لیے زیادہ درست ہو سکتا ہے۔ 🤓 + +/// + +## متعدد middleware کی عمل درآمد ترتیب { #multiple-middleware-execution-order } + +جب آپ `@app.middleware()` decorator یا `app.add_middleware()` method استعمال کرتے ہوئے متعدد middlewares شامل کرتے ہیں، تو ہر نیا middleware application کو wrap کرتا ہے اور ایک stack بناتا ہے۔ آخری شامل کیا گیا middleware *سب سے باہر* ہوتا ہے، اور پہلا *سب سے اندر*۔ + +Request کے راستے پر، *سب سے باہر والا* middleware پہلے چلتا ہے۔ + +Response کے راستے پر، یہ آخر میں چلتا ہے۔ + +مثال کے طور پر: + +```Python +app.add_middleware(MiddlewareA) +app.add_middleware(MiddlewareB) +``` + +اس کا نتیجہ یہ عمل درآمد ترتیب ہے: + +* **Request**: MiddlewareB → MiddlewareA → route + +* **Response**: route → MiddlewareA → MiddlewareB + +یہ stacking رویہ اس بات کو یقینی بناتا ہے کہ middlewares ایک قابل پیشگوئی اور قابل کنٹرول ترتیب میں چلیں۔ + +## دیگر middlewares { #other-middlewares } + +آپ دیگر middlewares کے بارے میں بعد میں [Advanced User Guide: Advanced Middleware](../advanced/middleware.md) میں مزید پڑھ سکتے ہیں۔ + +آپ اگلے سیکشن میں پڑھیں گے کہ middleware کے ذریعے CORS کو کیسے handle کیا جائے۔ diff --git a/docs/ur/docs/tutorial/path-operation-configuration.md b/docs/ur/docs/tutorial/path-operation-configuration.md new file mode 100644 index 000000000..87cc1658f --- /dev/null +++ b/docs/ur/docs/tutorial/path-operation-configuration.md @@ -0,0 +1,107 @@ +# Path Operation Configuration { #path-operation-configuration } + +آپ اپنے *path operation decorator* کو configure کرنے کے لیے اس میں کئی parameters دے سکتے ہیں۔ + +/// warning | انتباہ + +نوٹ کریں کہ یہ parameters براہ راست *path operation decorator* کو دیے جاتے ہیں، آپ کے *path operation function* کو نہیں۔ + +/// + +## Response Status Code { #response-status-code } + +آپ اپنے *path operation* کے response میں استعمال ہونے والا (HTTP) `status_code` بیان کر سکتے ہیں۔ + +آپ براہ راست `int` code دے سکتے ہیں، جیسے `404`۔ + +لیکن اگر آپ کو یاد نہیں کہ ہر نمبر code کس لیے ہے تو آپ `status` میں شارٹ کٹ constants استعمال کر سکتے ہیں: + +{* ../../docs_src/path_operation_configuration/tutorial001_py310.py hl[1,15] *} + +وہ status code response میں استعمال ہوگا اور OpenAPI schema میں شامل کیا جائے گا۔ + +/// note | تکنیکی تفصیلات + +آپ `from starlette import status` بھی استعمال کر سکتے ہیں۔ + +**FastAPI** آپ کی سہولت کے لیے وہی `starlette.status` بطور `fastapi.status` فراہم کرتا ہے۔ لیکن یہ براہ راست Starlette سے آتا ہے۔ + +/// + +## Tags { #tags } + +آپ اپنے *path operation* میں tags شامل کر سکتے ہیں، `tags` parameter میں `str` کی ایک `list` دیں (عام طور پر صرف ایک `str`): + +{* ../../docs_src/path_operation_configuration/tutorial002_py310.py hl[15,20,25] *} + +یہ OpenAPI schema میں شامل کیے جائیں گے اور خودکار documentation interfaces میں استعمال ہوں گے: + + + +### Enums کے ساتھ Tags { #tags-with-enums } + +اگر آپ کی ایک بڑی application ہے تو آپ کے پاس **کئی tags** جمع ہو سکتے ہیں، اور آپ یقینی بنانا چاہیں گے کہ متعلقہ *path operations* کے لیے ہمیشہ **وہی tag** استعمال کریں۔ + +ان صورتوں میں، tags کو ایک `Enum` میں محفوظ کرنا مناسب ہو سکتا ہے۔ + +**FastAPI** اسے سادہ strings کی طرح ہی تعاون کرتا ہے: + +{* ../../docs_src/path_operation_configuration/tutorial002b_py310.py hl[1,8:10,13,18] *} + +## Summary اور description { #summary-and-description } + +آپ `summary` اور `description` شامل کر سکتے ہیں: + +{* ../../docs_src/path_operation_configuration/tutorial003_py310.py hl[17:18] *} + +## Docstring سے Description { #description-from-docstring } + +چونکہ descriptions طویل ہوتی ہیں اور متعدد سطروں پر پھیلی ہوتی ہیں، آپ *path operation* کی description function کے docstring میں بیان کر سکتے ہیں اور **FastAPI** اسے وہاں سے پڑھے گا۔ + +آپ docstring میں [Markdown](https://en.wikipedia.org/wiki/Markdown) لکھ سکتے ہیں، اسے صحیح طریقے سے سمجھا اور دکھایا جائے گا (docstring indentation کو مدنظر رکھتے ہوئے)۔ + +{* ../../docs_src/path_operation_configuration/tutorial004_py310.py hl[17:25] *} + +یہ interactive docs میں استعمال ہوگا: + + + +## Response description { #response-description } + +آپ `response_description` parameter کے ساتھ response کی description بیان کر سکتے ہیں: + +{* ../../docs_src/path_operation_configuration/tutorial005_py310.py hl[18] *} + +/// info | معلومات + +نوٹ کریں کہ `response_description` خاص طور پر response سے متعلق ہے، `description` عمومی طور پر *path operation* سے متعلق ہے۔ + +/// + +/// check + +OpenAPI بتاتا ہے کہ ہر *path operation* کے لیے response description ضروری ہے۔ + +تو اگر آپ کوئی فراہم نہیں کرتے تو **FastAPI** خودکار طور پر "Successful response" بنا دے گا۔ + +/// + + + +## *path operation* کو Deprecate کریں { #deprecate-a-path-operation } + +اگر آپ کو کسی *path operation* کو deprecated نشان زد کرنا ہو، لیکن اسے ہٹائے بغیر، تو `deprecated` parameter دیں: + +{* ../../docs_src/path_operation_configuration/tutorial006_py310.py hl[16] *} + +یہ interactive docs میں واضح طور پر deprecated نشان زد ہوگا: + + + +دیکھیں کہ deprecated اور غیر deprecated *path operations* کیسے نظر آتے ہیں: + + + +## خلاصہ { #recap } + +آپ *path operation decorators* میں parameters دے کر آسانی سے اپنے *path operations* کے لیے metadata configure اور شامل کر سکتے ہیں۔ diff --git a/docs/ur/docs/tutorial/path-params-numeric-validations.md b/docs/ur/docs/tutorial/path-params-numeric-validations.md new file mode 100644 index 000000000..afc05c7b4 --- /dev/null +++ b/docs/ur/docs/tutorial/path-params-numeric-validations.md @@ -0,0 +1,154 @@ +# Path Parameters اور عددی Validations { #path-parameters-and-numeric-validations } + +اسی طرح جیسے آپ `Query` کے ساتھ query parameters کے لیے مزید validations اور metadata کا اعلان کر سکتے ہیں، آپ `Path` کے ساتھ path parameters کے لیے بھی اسی قسم کی validations اور metadata کا اعلان کر سکتے ہیں۔ + +## `Path` import کریں { #import-path } + +سب سے پہلے، `fastapi` سے `Path` import کریں، اور `Annotated` import کریں: + +{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[1,3] *} + +/// info | معلومات + +FastAPI نے ورژن 0.95.0 میں `Annotated` کی تعاون شامل کی (اور اسے تجویز کرنا شروع کیا)۔ + +اگر آپ کے پاس پرانا ورژن ہے، تو `Annotated` استعمال کرنے کی کوشش کرنے پر errors آئیں گی۔ + +`Annotated` استعمال کرنے سے پہلے یقینی بنائیں کہ آپ [FastAPI ورژن اپ گریڈ کریں](../deployment/versions.md#upgrading-the-fastapi-versions) کم از کم 0.95.1 تک۔ + +/// + +## Metadata اعلان کریں { #declare-metadata } + +آپ `Query` کی طرح تمام وہی parameters اعلان کر سکتے ہیں۔ + +مثال کے طور پر، path parameter `item_id` کے لیے `title` metadata قدر اعلان کرنے کے لیے آپ لکھ سکتے ہیں: + +{* ../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py hl[10] *} + +/// note | نوٹ + +Path parameter ہمیشہ لازمی ہوتا ہے کیونکہ یہ path کا حصہ ہونا ضروری ہے۔ چاہے آپ اسے `None` کے ساتھ اعلان کریں یا طے شدہ قدر سیٹ کریں، یہ کسی چیز پر اثر نہیں ڈالے گا، یہ پھر بھی ہمیشہ لازمی ہوگا۔ + +/// + +## Parameters کو اپنی ضرورت کے مطابق ترتیب دیں { #order-the-parameters-as-you-need } + +/// tip | مشورہ + +اگر آپ `Annotated` استعمال کرتے ہیں تو شاید یہ اتنا اہم یا ضروری نہیں ہے۔ + +/// + +فرض کریں کہ آپ query parameter `q` کو لازمی `str` کے طور پر اعلان کرنا چاہتے ہیں۔ + +اور آپ کو اس parameter کے لیے کچھ اور اعلان کرنے کی ضرورت نہیں، تو آپ کو واقعی `Query` استعمال کرنے کی ضرورت نہیں۔ + +لیکن آپ کو ابھی بھی `item_id` path parameter کے لیے `Path` استعمال کرنا ہے۔ اور آپ کسی وجہ سے `Annotated` استعمال نہیں کرنا چاہتے۔ + +Python شکایت کرے گا اگر آپ "طے شدہ" والی قدر کو بغیر "طے شدہ" والی قدر سے پہلے رکھیں۔ + +لیکن آپ انہیں دوبارہ ترتیب دے سکتے ہیں، اور بغیر طے شدہ والی قدر (query parameter `q`) کو پہلے رکھ سکتے ہیں۔ + +**FastAPI** کے لیے اس سے فرق نہیں پڑتا۔ یہ parameters کو ان کے ناموں، اقسام اور طے شدہ اعلانات (`Query`، `Path` وغیرہ) سے پہچانے گا، ترتیب سے کوئی فرق نہیں پڑتا۔ + +تو، آپ اپنا function اس طرح اعلان کر سکتے ہیں: + +{* ../../docs_src/path_params_numeric_validations/tutorial002_py310.py hl[7] *} + +لیکن یاد رکھیں کہ اگر آپ `Annotated` استعمال کرتے ہیں، تو آپ کو یہ مسئلہ نہیں ہوگا، کوئی فرق نہیں پڑتا کیونکہ آپ `Query()` یا `Path()` کے لیے function parameter طے شدہ اقدار استعمال نہیں کر رہے۔ + +{* ../../docs_src/path_params_numeric_validations/tutorial002_an_py310.py *} + +## Parameters کو اپنی ضرورت کے مطابق ترتیب دیں، ترکیبیں { #order-the-parameters-as-you-need-tricks } + +/// tip | مشورہ + +اگر آپ `Annotated` استعمال کرتے ہیں تو شاید یہ اتنا اہم یا ضروری نہیں ہے۔ + +/// + +یہاں ایک **چھوٹی ترکیب** ہے جو کام آ سکتی ہے، لیکن آپ کو اکثر اس کی ضرورت نہیں ہوگی۔ + +اگر آپ چاہتے ہیں: + +* `q` query parameter کو `Query` یا کسی طے شدہ قدر کے بغیر اعلان کرنا +* `item_id` path parameter کو `Path` استعمال کر کے اعلان کرنا +* انہیں مختلف ترتیب میں رکھنا +* `Annotated` استعمال نہ کرنا + +...Python میں اس کے لیے ایک خاص syntax ہے۔ + +Function کے پہلے parameter کے طور پر `*` دیں۔ + +Python اس `*` کے ساتھ کچھ نہیں کرے گا، لیکن یہ جان لے گا کہ تمام اگلے parameters کو keyword arguments (key-value جوڑوں) کے طور پر کال کیا جانا چاہیے، جنہیں kwargs بھی کہتے ہیں۔ چاہے ان کی طے شدہ قدر نہ ہو۔ + +{* ../../docs_src/path_params_numeric_validations/tutorial003_py310.py hl[7] *} + +### `Annotated` کے ساتھ بہتر { #better-with-annotated } + +یاد رکھیں کہ اگر آپ `Annotated` استعمال کرتے ہیں، چونکہ آپ function parameter طے شدہ اقدار استعمال نہیں کر رہے، تو آپ کو یہ مسئلہ نہیں ہوگا، اور شاید آپ کو `*` استعمال کرنے کی ضرورت نہیں ہوگی۔ + +{* ../../docs_src/path_params_numeric_validations/tutorial003_an_py310.py hl[10] *} + +## عددی validations: اس سے بڑا یا مساوی { #number-validations-greater-than-or-equal } + +`Query` اور `Path` (اور دوسرے جو آپ بعد میں دیکھیں گے) کے ساتھ آپ عددی حدود کا اعلان کر سکتے ہیں۔ + +یہاں، `ge=1` کے ساتھ، `item_id` کو ایک integer نمبر ہونا ہوگا جو `1` سے "`g`reater than or `e`qual" ہو۔ + +{* ../../docs_src/path_params_numeric_validations/tutorial004_an_py310.py hl[10] *} + +## عددی validations: اس سے بڑا اور اس سے چھوٹا یا مساوی { #number-validations-greater-than-and-less-than-or-equal } + +یہی لاگو ہوتا ہے: + +* `gt`: `g`reater `t`han (اس سے بڑا) +* `le`: `l`ess than or `e`qual (اس سے چھوٹا یا مساوی) + +{* ../../docs_src/path_params_numeric_validations/tutorial005_an_py310.py hl[10] *} + +## عددی validations: floats، اس سے بڑا اور اس سے چھوٹا { #number-validations-floats-greater-than-and-less-than } + +عددی validations `float` اقدار کے لیے بھی کام کرتی ہیں۔ + +یہاں جہاں یہ اہم ہو جاتا ہے کہ gt اعلان کر سکیں نہ کہ صرف ge۔ اس کے ساتھ آپ مثال کے طور پر تقاضا کر سکتے ہیں کہ قدر `0` سے بڑی ہونی چاہیے، چاہے یہ `1` سے کم ہو۔ + +تو، `0.5` ایک درست قدر ہوگی۔ لیکن `0.0` یا `0` نہیں ہوگی۔ + +اور lt کے لیے بھی یہی ہے۔ + +{* ../../docs_src/path_params_numeric_validations/tutorial006_an_py310.py hl[13] *} + +## خلاصہ { #recap } + +`Query`، `Path` (اور دوسرے جو آپ نے ابھی نہیں دیکھے) کے ساتھ آپ [Query Parameters اور String Validations](query-params-str-validations.md) کی طرح ہی metadata اور string validations اعلان کر سکتے ہیں۔ + +اور آپ عددی validations بھی اعلان کر سکتے ہیں: + +* `gt`: `g`reater `t`han (اس سے بڑا) +* `ge`: `g`reater than or `e`qual (اس سے بڑا یا مساوی) +* `lt`: `l`ess `t`han (اس سے چھوٹا) +* `le`: `l`ess than or `e`qual (اس سے چھوٹا یا مساوی) + +/// info | معلومات + +`Query`، `Path`، اور دوسری classes جو آپ بعد میں دیکھیں گے ایک مشترک `Param` class کی ذیلی classes ہیں۔ + +یہ سب اضافی توثیق اور metadata کے لیے وہی parameters شیئر کرتی ہیں جو آپ نے دیکھے ہیں۔ + +/// + +/// note | تکنیکی تفصیلات + +جب آپ `fastapi` سے `Query`، `Path` اور دوسرے import کرتے ہیں، تو وہ دراصل functions ہیں۔ + +جب کال کیے جاتے ہیں، تو وہ اسی نام کی classes کے instances واپس کرتے ہیں۔ + +تو، آپ `Query` import کرتے ہیں، جو ایک function ہے۔ اور جب آپ اسے کال کرتے ہیں، تو یہ `Query` نامی class کا بھی ایک instance واپس کرتا ہے۔ + +یہ functions اس لیے ہیں (classes کو براہ راست استعمال کرنے کی بجائے) تاکہ آپ کا ایڈیٹر ان کی اقسام کے بارے میں errors نہ دکھائے۔ + +اس طرح آپ ان errors کو نظرانداز کرنے کے لیے حسب ضرورت ترتیبات شامل کیے بغیر اپنا عام ایڈیٹر اور کوڈنگ ٹولز استعمال کر سکتے ہیں۔ + +/// diff --git a/docs/ur/docs/tutorial/path-params.md b/docs/ur/docs/tutorial/path-params.md new file mode 100644 index 000000000..82f9d88b9 --- /dev/null +++ b/docs/ur/docs/tutorial/path-params.md @@ -0,0 +1,251 @@ +# Path Parameters { #path-parameters } + +آپ Python format strings کی طرح syntax استعمال کر کے path "parameters" یا "variables" کا اعلان کر سکتے ہیں: + +{* ../../docs_src/path_params/tutorial001_py310.py hl[6:7] *} + +Path parameter `item_id` کی قدر آپ کے function میں argument `item_id` کے طور پر دی جائے گی۔ + +تو، اگر آپ یہ مثال چلائیں اور [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo) پر جائیں، آپ کو یہ response نظر آئے گا: + +```JSON +{"item_id":"foo"} +``` + +## اقسام کے ساتھ Path parameters { #path-parameters-with-types } + +آپ معیاری Python type annotations استعمال کر کے function میں path parameter کی قسم کا اعلان کر سکتے ہیں: + +{* ../../docs_src/path_params/tutorial002_py310.py hl[7] *} + +اس صورت میں، `item_id` کو `int` ہونے کا اعلان کیا گیا ہے۔ + +/// check + +یہ آپ کو function کے اندر ایڈیٹر سپورٹ دے گا، error checks، completion وغیرہ کے ساتھ۔ + +/// + +## ڈیٹا تبدیلی { #data-conversion } + +اگر آپ یہ مثال چلائیں اور اپنا براؤزر [http://127.0.0.1:8000/items/3](http://127.0.0.1:8000/items/3) پر کھولیں، آپ کو یہ response نظر آئے گا: + +```JSON +{"item_id":3} +``` + +/// check + +غور کریں کہ آپ کے function نے جو قدر وصول کی (اور واپس کی) وہ `3` ہے، بطور Python `int`، نہ کہ string `"3"`۔ + +تو، اس type declaration کے ساتھ، **FastAPI** آپ کو خودکار request "parsing" دیتا ہے۔ + +/// + +## ڈیٹا کی توثیق { #data-validation } + +لیکن اگر آپ براؤزر میں [http://127.0.0.1:8000/items/foo](http://127.0.0.1:8000/items/foo) پر جائیں، تو آپ کو ایک اچھی HTTP error نظر آئے گی: + +```JSON +{ + "detail": [ + { + "type": "int_parsing", + "loc": [ + "path", + "item_id" + ], + "msg": "Input should be a valid integer, unable to parse string as an integer", + "input": "foo" + } + ] +} +``` + +کیونکہ path parameter `item_id` کی قدر `"foo"` تھی، جو `int` نہیں ہے۔ + +وہی error ظاہر ہوگی اگر آپ `int` کی بجائے `float` فراہم کریں، جیسے: [http://127.0.0.1:8000/items/4.2](http://127.0.0.1:8000/items/4.2) + +/// check + +تو، اسی Python type declaration کے ساتھ، **FastAPI** آپ کو ڈیٹا کی توثیق فراہم کرتا ہے۔ + +غور کریں کہ error واضح طور پر بتاتی ہے کہ توثیق بالکل کس مقام پر ناکام ہوئی۔ + +یہ آپ کی API کے ساتھ تعامل کرنے والے کوڈ کو تیار کرتے اور debug کرتے وقت ناقابل یقین حد تک مددگار ہے۔ + +/// + +## دستاویزات { #documentation } + +اور جب آپ اپنا براؤزر [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) پر کھولیں، آپ کو ایک خودکار، انٹرایکٹو API دستاویز نظر آئے گی جیسے: + + + +/// check + +ایک بار پھر، صرف اسی Python type declaration کے ساتھ، **FastAPI** آپ کو خودکار، انٹرایکٹو دستاویزات فراہم کرتا ہے (Swagger UI کو مربوط کرتے ہوئے)۔ + +غور کریں کہ path parameter کو integer ہونے کا اعلان کیا گیا ہے۔ + +/// + +## معیارات پر مبنی فوائد، متبادل دستاویزات { #standards-based-benefits-alternative-documentation } + +اور چونکہ تیار کردہ schema [OpenAPI](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md) معیار سے ہے، بہت سے مطابق ٹولز موجود ہیں۔ + +اسی وجہ سے، **FastAPI** خود ایک متبادل API دستاویز فراہم کرتا ہے (ReDoc استعمال کرتے ہوئے)، جسے آپ [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) پر دیکھ سکتے ہیں: + + + +اسی طرح، بہت سے مطابق ٹولز ہیں۔ بشمول بہت سی زبانوں کے لیے کوڈ جنریشن ٹولز۔ + +## Pydantic { #pydantic } + +تمام ڈیٹا کی توثیق پردے کے پیچھے [Pydantic](https://docs.pydantic.dev/) کے ذریعے کی جاتی ہے، لہذا آپ کو اس سے تمام فوائد ملتے ہیں۔ اور آپ جانتے ہیں کہ آپ اچھے ہاتھوں میں ہیں۔ + +آپ `str`، `float`، `bool` اور بہت سی دیگر پیچیدہ data types کے ساتھ وہی type declarations استعمال کر سکتے ہیں۔ + +ان میں سے کئی ٹیوٹوریل کے اگلے ابواب میں دریافت کیے گئے ہیں۔ + +## ترتیب اہم ہے { #order-matters } + +*Path operations* بناتے وقت، آپ کو ایسے حالات مل سکتے ہیں جہاں آپ کا ایک مقررہ path ہے۔ + +جیسے `/users/me`، فرض کریں کہ یہ موجودہ صارف کا ڈیٹا حاصل کرنے کے لیے ہے۔ + +اور پھر آپ کے پاس `/users/{user_id}` path بھی ہو سکتا ہے جو کسی مخصوص صارف کا ڈیٹا کسی user ID سے حاصل کرے۔ + +چونکہ *path operations* ترتیب سے جانچے جاتے ہیں، آپ کو یقینی بنانا ہوگا کہ `/users/me` کا path `/users/{user_id}` سے پہلے اعلان کیا گیا ہے: + +{* ../../docs_src/path_params/tutorial003_py310.py hl[6,11] *} + +ورنہ، `/users/{user_id}` کا path `/users/me` کے لیے بھی مماثل ہوگا، یہ "سوچتے" ہوئے کہ اسے `"me"` قدر کے ساتھ parameter `user_id` مل رہا ہے۔ + +اسی طرح، آپ path operation کو دوبارہ بیان نہیں کر سکتے: + +{* ../../docs_src/path_params/tutorial003b_py310.py hl[6,11] *} + +پہلا ہمیشہ استعمال ہوگا کیونکہ path پہلے مماثل ہوتا ہے۔ + +## پہلے سے طے شدہ اقدار { #predefined-values } + +اگر آپ کے پاس ایک *path operation* ہے جو *path parameter* وصول کرتا ہے، لیکن آپ چاہتے ہیں کہ ممکنہ درست *path parameter* اقدار پہلے سے طے شدہ ہوں، تو آپ معیاری Python `Enum` استعمال کر سکتے ہیں۔ + +### ایک `Enum` class بنائیں { #create-an-enum-class } + +`Enum` import کریں اور ایک ذیلی class بنائیں جو `str` اور `Enum` سے وراثت حاصل کرے۔ + +`str` سے وراثت حاصل کرنے سے API docs جان سکیں گے کہ اقدار `string` قسم کی ہونی چاہییں اور صحیح طریقے سے ظاہر ہو سکیں گی۔ + +پھر مقررہ اقدار کے ساتھ class attributes بنائیں، جو دستیاب درست اقدار ہوں گی: + +{* ../../docs_src/path_params/tutorial005_py310.py hl[1,6:9] *} + +/// tip | مشورہ + +اگر آپ سوچ رہے ہیں، "AlexNet"، "ResNet"، اور "LeNet" بس Machine Learning models کے نام ہیں۔ + +/// + +### ایک *path parameter* کا اعلان کریں { #declare-a-path-parameter } + +پھر آپ نے بنائی ہوئی enum class (`ModelName`) کو type annotation کے طور پر استعمال کرتے ہوئے ایک *path parameter* بنائیں: + +{* ../../docs_src/path_params/tutorial005_py310.py hl[16] *} + +### دستاویزات چیک کریں { #check-the-docs } + +چونکہ *path parameter* کے لیے دستیاب اقدار پہلے سے طے شدہ ہیں، انٹرایکٹو docs انہیں اچھے طریقے سے دکھا سکتے ہیں: + + + +### Python *enumerations* کے ساتھ کام کرنا { #working-with-python-enumerations } + +*Path parameter* کی قدر ایک *enumeration member* ہوگی۔ + +#### *Enumeration members* کا موازنہ کریں { #compare-enumeration-members } + +آپ اس کا موازنہ اپنی بنائی ہوئی enum `ModelName` میں *enumeration member* سے کر سکتے ہیں: + +{* ../../docs_src/path_params/tutorial005_py310.py hl[17] *} + +#### *Enumeration value* حاصل کریں { #get-the-enumeration-value } + +آپ `model_name.value` استعمال کر کے اصل قدر (اس صورت میں `str`) حاصل کر سکتے ہیں، یا عمومی طور پر، `your_enum_member.value`: + +{* ../../docs_src/path_params/tutorial005_py310.py hl[20] *} + +/// tip | مشورہ + +آپ `"lenet"` قدر تک `ModelName.lenet.value` سے بھی رسائی حاصل کر سکتے ہیں۔ + +/// + +#### *Enumeration members* واپس کریں { #return-enumeration-members } + +آپ اپنے *path operation* سے *enum members* واپس کر سکتے ہیں، یہاں تک کہ JSON body میں nested (مثلاً ایک `dict`)۔ + +انہیں client کو واپس کرنے سے پہلے ان کی متعلقہ اقدار (اس صورت میں strings) میں تبدیل کیا جائے گا: + +{* ../../docs_src/path_params/tutorial005_py310.py hl[18,21,23] *} + +آپ کے client کو JSON response کچھ ایسا ملے گا: + +```JSON +{ + "model_name": "alexnet", + "message": "Deep Learning FTW!" +} +``` + +## Path parameters جن میں paths ہوں { #path-parameters-containing-paths } + +فرض کریں آپ کے پاس ایک *path operation* ہے جس کا path `/files/{file_path}` ہے۔ + +لیکن آپ چاہتے ہیں کہ `file_path` میں خود ایک *path* ہو، جیسے `home/johndoe/myfile.txt`۔ + +تو، اس فائل کا URL کچھ ایسا ہوگا: `/files/home/johndoe/myfile.txt`۔ + +### OpenAPI سپورٹ { #openapi-support } + +OpenAPI میں *path parameter* کے اندر *path* رکھنے کا اعلان کرنے کا کوئی طریقہ نہیں ہے، کیونکہ اس سے ایسے منظرنامے پیدا ہو سکتے ہیں جنہیں ٹیسٹ اور بیان کرنا مشکل ہو۔ + +بہرحال، آپ اسے **FastAPI** میں پھر بھی کر سکتے ہیں، Starlette کے اندرونی ٹولز میں سے ایک استعمال کر کے۔ + +اور docs پھر بھی کام کریں گے، اگرچہ کوئی دستاویز شامل نہیں ہوگی جو بتائے کہ parameter میں path ہونا چاہیے۔ + +### Path convertor { #path-convertor } + +Starlette سے براہ راست ایک آپشن استعمال کرتے ہوئے آپ *path parameter* کا اعلان کر سکتے ہیں جس میں *path* ہو، اس طرح کے URL کے ساتھ: + +``` +/files/{file_path:path} +``` + +اس صورت میں، parameter کا نام `file_path` ہے، اور آخری حصہ، `:path`، بتاتا ہے کہ parameter کو کسی بھی *path* سے مماثل ہونا چاہیے۔ + +تو، آپ اسے اس طرح استعمال کر سکتے ہیں: + +{* ../../docs_src/path_params/tutorial004_py310.py hl[6] *} + +/// tip | مشورہ + +آپ کو parameter میں `/home/johndoe/myfile.txt` رکھنے کی ضرورت ہو سکتی ہے، ابتدائی سلیش (`/`) کے ساتھ۔ + +اس صورت میں، URL ہوگا: `/files//home/johndoe/myfile.txt`، `files` اور `home` کے درمیان ڈبل سلیش (`//`) کے ساتھ۔ + +/// + +## خلاصہ { #recap } + +**FastAPI** کے ساتھ، مختصر، بدیہی اور معیاری Python type declarations استعمال کر کے، آپ کو ملتا ہے: + +* ایڈیٹر سپورٹ: error checks، autocompletion وغیرہ۔ +* ڈیٹا "parsing" +* ڈیٹا کی توثیق +* API تشریح اور خودکار دستاویزات + +اور آپ کو انہیں صرف ایک بار اعلان کرنا ہوتا ہے۔ + +یہ شاید متبادل frameworks کے مقابلے میں **FastAPI** کا سب سے نمایاں فائدہ ہے (خام کارکردگی کے علاوہ)۔ diff --git a/docs/ur/docs/tutorial/query-param-models.md b/docs/ur/docs/tutorial/query-param-models.md new file mode 100644 index 000000000..776f3c629 --- /dev/null +++ b/docs/ur/docs/tutorial/query-param-models.md @@ -0,0 +1,68 @@ +# Query Parameter Models { #query-parameter-models } + +اگر آپ کے پاس ایک دوسرے سے متعلقہ **query parameters** کا گروپ ہے، تو آپ انہیں declare کرنے کے لیے ایک **Pydantic model** بنا سکتے ہیں۔ + +اس سے آپ کو **model کو کئی جگہوں پر دوبارہ استعمال** کرنے اور تمام parameters کے لیے validations اور metadata ایک ساتھ declare کرنے کی سہولت ملے گی۔ 😎 + +/// note | نوٹ + +یہ FastAPI version `0.115.0` سے supported ہے۔ 🤓 + +/// + +## Pydantic Model کے ساتھ Query Parameters { #query-parameters-with-a-pydantic-model } + +وہ **query parameters** جو آپ کو درکار ہیں انہیں ایک **Pydantic model** میں declare کریں، اور پھر parameter کو `Query` کے طور پر declare کریں: + +{* ../../docs_src/query_param_models/tutorial001_an_py310.py hl[9:13,17] *} + +**FastAPI** request میں موجود **query parameters** سے **ہر field** کا ڈیٹا **extract** کرے گا اور آپ کو وہ Pydantic model دے گا جو آپ نے define کیا ہے۔ + +## Docs چیک کریں { #check-the-docs } + +آپ `/docs` پر docs UI میں query parameters دیکھ سکتے ہیں: + +
+ +
+ +## اضافی Query Parameters پر پابندی { #forbid-extra-query-parameters } + +بعض خاص استعمال کے معاملات میں (شاید بہت عام نہیں)، آپ ان query parameters کو **محدود** کرنا چاہ سکتے ہیں جو آپ وصول کرنا چاہتے ہیں۔ + +آپ Pydantic کی model configuration استعمال کر کے کسی بھی `extra` fields کو `forbid` کر سکتے ہیں: + +{* ../../docs_src/query_param_models/tutorial002_an_py310.py hl[10] *} + +اگر کوئی client **query parameters** میں کچھ **اضافی** ڈیٹا بھیجنے کی کوشش کرے، تو اسے ایک **error** response ملے گا۔ + +مثال کے طور پر، اگر client `tool` query parameter کو `plumbus` کی قدر کے ساتھ بھیجنے کی کوشش کرے، جیسے: + +```http +https://example.com/items/?limit=10&tool=plumbus +``` + +تو اسے ایک **error** response ملے گا جو بتائے گا کہ query parameter `tool` کی اجازت نہیں ہے: + +```json +{ + "detail": [ + { + "type": "extra_forbidden", + "loc": ["query", "tool"], + "msg": "Extra inputs are not permitted", + "input": "plumbus" + } + ] +} +``` + +## خلاصہ { #summary } + +آپ **Pydantic models** استعمال کر کے **FastAPI** میں **query parameters** declare کر سکتے ہیں۔ 😎 + +/// tip | مشورہ + +اسپائلر الرٹ: آپ Pydantic models کو cookies اور headers declare کرنے کے لیے بھی استعمال کر سکتے ہیں، لیکن اس کے بارے میں آپ tutorial میں آگے پڑھیں گے۔ 🤫 + +/// diff --git a/docs/ur/docs/tutorial/query-params-str-validations.md b/docs/ur/docs/tutorial/query-params-str-validations.md new file mode 100644 index 000000000..fc7f4f4f6 --- /dev/null +++ b/docs/ur/docs/tutorial/query-params-str-validations.md @@ -0,0 +1,449 @@ +# Query Parameters اور String Validations { #query-parameters-and-string-validations } + +**FastAPI** آپ کو اپنے parameters کے لیے اضافی معلومات اور توثیق کا اعلان کرنے کی اجازت دیتا ہے۔ + +آئیے اس ایپلیکیشن کو بطور مثال لیتے ہیں: + +{* ../../docs_src/query_params_str_validations/tutorial001_py310.py hl[7] *} + +Query parameter `q` کی قسم `str | None` ہے، جس کا مطلب ہے کہ یہ `str` قسم کا ہے لیکن `None` بھی ہو سکتا ہے، اور درحقیقت، طے شدہ قدر `None` ہے، تو FastAPI جان لے گا کہ یہ لازمی نہیں ہے۔ + +/// note | نوٹ + +FastAPI جان لے گا کہ `q` کی قدر لازمی نہیں ہے کیونکہ طے شدہ قدر `= None` ہے۔ + +`str | None` رکھنے سے آپ کے ایڈیٹر کو بہتر سپورٹ فراہم ہوگی اور errors کا پتہ لگانے میں مدد ملے گی۔ + +/// + +## اضافی توثیق { #additional-validation } + +ہم یہ نافذ کرنے والے ہیں کہ اگرچہ `q` اختیاری ہے، جب بھی یہ فراہم کیا جائے، **اس کی لمبائی 50 حروف سے زیادہ نہ ہو**۔ + +### `Query` اور `Annotated` import کریں { #import-query-and-annotated } + +اس کے لیے، پہلے import کریں: + +* `fastapi` سے `Query` +* `typing` سے `Annotated` + +{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[1,3] *} + +/// info | معلومات + +FastAPI نے ورژن 0.95.0 میں `Annotated` کی تعاون شامل کی (اور اسے تجویز کرنا شروع کیا)۔ + +اگر آپ کے پاس پرانا ورژن ہے، تو `Annotated` استعمال کرنے کی کوشش کرنے پر errors آئیں گی۔ + +`Annotated` استعمال کرنے سے پہلے یقینی بنائیں کہ آپ [FastAPI ورژن اپ گریڈ کریں](../deployment/versions.md#upgrading-the-fastapi-versions) کم از کم 0.95.1 تک۔ + +/// + +## `q` parameter کی type میں `Annotated` استعمال کریں { #use-annotated-in-the-type-for-the-q-parameter } + +یاد کریں میں نے آپ کو پہلے بتایا تھا کہ `Annotated` کو [Python Types تعارف](../python-types.md#type-hints-with-metadata-annotations) میں آپ کے parameters میں metadata شامل کرنے کے لیے استعمال کیا جا سکتا ہے؟ + +اب اسے FastAPI کے ساتھ استعمال کرنے کا وقت ہے۔ + +ہمارے پاس یہ type annotation تھی: + +```Python +q: str | None = None +``` + +ہم اسے `Annotated` میں لپیٹیں گے، تو یہ بن جائے گا: + +```Python +q: Annotated[str | None] = None +``` + +دونوں ورژنز کا مطلب ایک ہی ہے، `q` ایک parameter ہے جو `str` یا `None` ہو سکتا ہے، اور پہلے سے، یہ `None` ہے۔ + +اب آئیے دلچسپ حصے کی طرف چلتے ہیں۔ + +## `q` parameter میں `Annotated` میں `Query` شامل کریں { #add-query-to-annotated-in-the-q-parameter } + +اب جب ہمارے پاس `Annotated` ہے جہاں ہم مزید معلومات رکھ سکتے ہیں (اس صورت میں کچھ اضافی توثیق)، `Annotated` کے اندر `Query` شامل کریں، اور parameter `max_length` کو `50` سیٹ کریں: + +{* ../../docs_src/query_params_str_validations/tutorial002_an_py310.py hl[9] *} + +غور کریں کہ طے شدہ قدر اب بھی `None` ہے، تو parameter اب بھی اختیاری ہے۔ + +لیکن اب، `Annotated` کے اندر `Query(max_length=50)` رکھ کر، ہم FastAPI کو بتا رہے ہیں کہ ہم چاہتے ہیں کہ اس قدر کی **اضافی توثیق** ہو، ہم چاہتے ہیں کہ اس میں زیادہ سے زیادہ 50 حروف ہوں۔ + +/// tip | مشورہ + +یہاں ہم `Query()` استعمال کر رہے ہیں کیونکہ یہ ایک **query parameter** ہے۔ بعد میں ہم دوسرے دیکھیں گے جیسے `Path()`، `Body()`، `Header()`، اور `Cookie()`، جو `Query()` جیسے ہی arguments قبول کرتے ہیں۔ + +/// + +FastAPI اب یہ کرے گا: + +* ڈیٹا کی **توثیق** کرے گا اور یقینی بنائے گا کہ زیادہ سے زیادہ لمبائی 50 حروف ہے +* جب ڈیٹا درست نہ ہو تو client کو **واضح error** دکھائے گا +* OpenAPI schema *path operation* میں parameter کی **دستاویز** بنائے گا (تو یہ **خودکار docs UI** میں ظاہر ہوگا) + +## متبادل (پرانا): `Query` بطور طے شدہ قدر { #alternative-old-query-as-the-default-value } + +FastAPI کے پرانے ورژنز (ورژن 0.95.0 سے پہلے) آپ سے `Query` کو `Annotated` میں رکھنے کی بجائے اپنے parameter کی طے شدہ قدر کے طور پر استعمال کرنے کا تقاضا کرتے تھے، اس بات کا بہت زیادہ امکان ہے کہ آپ کو اسے استعمال کرتا ہوا کوڈ نظر آئے، تو میں آپ کو اس کی وضاحت کرتا ہوں۔ + +/// tip | مشورہ + +نئے کوڈ اور جب بھی ممکن ہو، اوپر بتائے گئے `Annotated` استعمال کریں۔ اس کے متعدد فوائد ہیں (نیچے بتائے گئے ہیں) اور کوئی نقصان نہیں۔ + +/// + +اس طرح آپ `Query()` کو اپنے function parameter کی طے شدہ قدر کے طور پر استعمال کریں گے، parameter `max_length` کو `50` سیٹ کرتے ہوئے: + +{* ../../docs_src/query_params_str_validations/tutorial002_py310.py hl[7] *} + +چونکہ اس صورت میں (`Annotated` استعمال کیے بغیر) ہمیں function میں طے شدہ قدر `None` کو `Query()` سے بدلنا ہے، ہمیں اب `Query(default=None)` parameter سے طے شدہ قدر سیٹ کرنی ہوگی، یہ وہی مقصد پورا کرتا ہے جو اس طے شدہ قدر کی تعریف کا ہے (کم از کم FastAPI کے لیے)۔ + +تو: + +```Python +q: str | None = Query(default=None) +``` + +...parameter کو اختیاری بناتا ہے، `None` کی طے شدہ قدر کے ساتھ، جیسا کہ: + +```Python +q: str | None = None +``` + +لیکن `Query` ورژن واضح طور پر اسے query parameter ہونے کا اعلان کرتا ہے۔ + +پھر، ہم `Query` کو مزید parameters دے سکتے ہیں۔ اس صورت میں، `max_length` parameter جو strings پر لاگو ہوتا ہے: + +```Python +q: str | None = Query(default=None, max_length=50) +``` + +یہ ڈیٹا کی توثیق کرے گا، جب ڈیٹا درست نہ ہو تو واضح error دکھائے گا، اور OpenAPI schema *path operation* میں parameter کی دستاویز بنائے گا۔ + +### `Query` بطور طے شدہ قدر یا `Annotated` میں { #query-as-the-default-value-or-in-annotated } + +یاد رکھیں کہ `Annotated` کے اندر `Query` استعمال کرتے وقت آپ `Query` کے `default` parameter کو استعمال نہیں کر سکتے۔ + +اس کی بجائے، function parameter کی اصل طے شدہ قدر استعمال کریں۔ ورنہ، یہ متضاد ہوگا۔ + +مثال کے طور پر، یہ اجازت نہیں ہے: + +```Python +q: Annotated[str, Query(default="rick")] = "morty" +``` + +...کیونکہ یہ واضح نہیں ہے کہ طے شدہ قدر `"rick"` ہونی چاہیے یا `"morty"`۔ + +تو، آپ استعمال کریں گے (ترجیحاً): + +```Python +q: Annotated[str, Query()] = "rick" +``` + +...یا پرانے کوڈ میں آپ کو یہ ملے گا: + +```Python +q: str = Query(default="rick") +``` + +### `Annotated` کے فوائد { #advantages-of-annotated } + +**`Annotated` استعمال کرنا تجویز کیا جاتا ہے** function parameters میں طے شدہ قدر کی بجائے، یہ کئی وجوہات کی بنا پر **بہتر** ہے۔ + +**Function parameter** کی **طے شدہ** قدر **اصل طے شدہ** قدر ہے، جو عمومی طور پر Python کے ساتھ زیادہ بدیہی ہے۔ + +آپ وہی function **دوسری جگہوں** پر FastAPI کے بغیر **کال** کر سکتے ہیں، اور یہ **متوقع طور پر کام** کرے گا۔ اگر کوئی **لازمی** parameter ہے (بغیر طے شدہ قدر کے)، آپ کا **ایڈیٹر** آپ کو error سے آگاہ کرے گا، **Python** بھی شکایت کرے گا اگر آپ لازمی parameter دیے بغیر اسے چلائیں۔ + +جب آپ `Annotated` استعمال نہیں کرتے اور اس کی بجائے **(پرانی) طے شدہ قدر طرز** استعمال کرتے ہیں، اگر آپ اس function کو FastAPI کے بغیر **دوسری جگہوں** پر کال کرتے ہیں، تو آپ کو function کے لیے arguments صحیح طریقے سے دینا **یاد رکھنا** ہوگا تاکہ یہ صحیح کام کرے، ورنہ اقدار آپ کی توقع سے مختلف ہوں گی (مثلاً `str` کی بجائے `QueryInfo` یا کچھ ایسا)۔ اور آپ کا ایڈیٹر شکایت نہیں کرے گا، اور Python بھی وہ function چلاتے وقت شکایت نہیں کرے گا، صرف اس وقت جب اندر کے عمل error دیں۔ + +چونکہ `Annotated` میں ایک سے زیادہ metadata annotations ہو سکتے ہیں، آپ اب وہی function دوسرے ٹولز کے ساتھ بھی استعمال کر سکتے ہیں، جیسے [Typer](https://typer.tiangolo.com/)۔ + +## مزید validations شامل کریں { #add-more-validations } + +آپ ایک `min_length` parameter بھی شامل کر سکتے ہیں: + +{* ../../docs_src/query_params_str_validations/tutorial003_an_py310.py hl[10] *} + +## Regular expressions شامل کریں { #add-regular-expressions } + +آپ ایک regular expression `pattern` بنا سکتے ہیں جس سے parameter کو مماثل ہونا چاہیے: + +{* ../../docs_src/query_params_str_validations/tutorial004_an_py310.py hl[11] *} + +یہ مخصوص regular expression pattern جانچتا ہے کہ وصول شدہ parameter کی قدر: + +* `^`: مندرجہ ذیل حروف سے شروع ہوتی ہے، پہلے کوئی حروف نہیں ہیں۔ +* `fixedquery`: بالکل `fixedquery` قدر رکھتی ہے۔ +* `$`: یہاں ختم ہوتی ہے، `fixedquery` کے بعد مزید کوئی حروف نہیں ہیں۔ + +اگر آپ ان تمام **"regular expression"** تصورات سے پریشان محسوس کر رہے ہیں، تو فکر نہ کریں۔ یہ بہت سے لوگوں کے لیے مشکل موضوع ہے۔ آپ ابھی بھی regular expressions کی ضرورت کے بغیر بہت کچھ کر سکتے ہیں۔ + +اب آپ جانتے ہیں کہ جب بھی آپ کو ان کی ضرورت ہو آپ انہیں **FastAPI** میں استعمال کر سکتے ہیں۔ + +## طے شدہ اقدار { #default-values } + +آپ یقیناً `None` کے علاوہ طے شدہ اقدار استعمال کر سکتے ہیں۔ + +فرض کریں کہ آپ `q` query parameter کا `min_length` `3` رکھنا چاہتے ہیں، اور طے شدہ قدر `"fixedquery"` رکھنا چاہتے ہیں: + +{* ../../docs_src/query_params_str_validations/tutorial005_an_py310.py hl[9] *} + +/// note | نوٹ + +کسی بھی قسم کی طے شدہ قدر رکھنا، بشمول `None`، parameter کو اختیاری بناتا ہے (لازمی نہیں)۔ + +/// + +## لازمی parameters { #required-parameters } + +جب ہمیں مزید validations یا metadata اعلان کرنے کی ضرورت نہ ہو، ہم `q` query parameter کو صرف طے شدہ قدر اعلان نہ کر کے لازمی بنا سکتے ہیں، جیسے: + +```Python +q: str +``` + +اس کی بجائے: + +```Python +q: str | None = None +``` + +لیکن اب ہم اسے `Query` کے ساتھ اعلان کر رہے ہیں، مثال کے طور پر: + +```Python +q: Annotated[str | None, Query(min_length=3)] = None +``` + +تو، جب آپ کو `Query` استعمال کرتے ہوئے کسی قدر کو لازمی قرار دینا ہو، آپ بس طے شدہ قدر اعلان نہ کریں: + +{* ../../docs_src/query_params_str_validations/tutorial006_an_py310.py hl[9] *} + +### لازمی، `None` ہو سکتا ہے { #required-can-be-none } + +آپ اعلان کر سکتے ہیں کہ parameter `None` قبول کر سکتا ہے، لیکن یہ پھر بھی لازمی ہے۔ یہ clients کو مجبور کرے گا کہ وہ قدر بھیجیں، چاہے قدر `None` ہی ہو۔ + +ایسا کرنے کے لیے، آپ `None` کو درست قسم کے طور پر اعلان کر سکتے ہیں لیکن طے شدہ قدر اعلان نہ کریں: + +{* ../../docs_src/query_params_str_validations/tutorial006c_an_py310.py hl[9] *} + +## Query parameter list / متعدد اقدار { #query-parameter-list-multiple-values } + +جب آپ `Query` کے ساتھ واضح طور پر query parameter بناتے ہیں تو آپ اسے اقدار کی list وصول کرنے کا بھی اعلان کر سکتے ہیں، یا دوسرے الفاظ میں، متعدد اقدار وصول کرنے کا۔ + +مثال کے طور پر، query parameter `q` کا اعلان کرنے کے لیے جو URL میں متعدد بار ظاہر ہو سکتا ہے، آپ لکھ سکتے ہیں: + +{* ../../docs_src/query_params_str_validations/tutorial011_an_py310.py hl[9] *} + +پھر، اس طرح کے URL کے ساتھ: + +``` +http://localhost:8000/items/?q=foo&q=bar +``` + +آپ کو متعدد `q` *query parameters* کی اقدار (`foo` اور `bar`) Python `list` میں آپ کے *path operation function* کے *function parameter* `q` میں ملیں گی۔ + +تو، اس URL کا response ہوگا: + +```JSON +{ + "q": [ + "foo", + "bar" + ] +} +``` + +/// tip | مشورہ + +`list` قسم کے query parameter کا اعلان کرنے کے لیے، جیسا کہ اوپر کی مثال میں، آپ کو واضح طور پر `Query` استعمال کرنا ہوگا، ورنہ اسے request body سمجھا جائے گا۔ + +/// + +انٹرایکٹو API docs اس کے مطابق اپ ڈیٹ ہوں گے، متعدد اقدار کی اجازت دیتے ہوئے: + + + +### Query parameter list / طے شدہ اقدار کے ساتھ متعدد اقدار { #query-parameter-list-multiple-values-with-defaults } + +اگر کوئی فراہم نہ کی جائے تو آپ اقدار کی طے شدہ `list` بھی بنا سکتے ہیں: + +{* ../../docs_src/query_params_str_validations/tutorial012_an_py310.py hl[9] *} + +اگر آپ یہاں جائیں: + +``` +http://localhost:8000/items/ +``` + +`q` کی طے شدہ قدر ہوگی: `["foo", "bar"]` اور آپ کا response ہوگا: + +```JSON +{ + "q": [ + "foo", + "bar" + ] +} +``` + +#### صرف `list` استعمال کرنا { #using-just-list } + +آپ `list[str]` کی بجائے براہ راست `list` بھی استعمال کر سکتے ہیں: + +{* ../../docs_src/query_params_str_validations/tutorial013_an_py310.py hl[9] *} + +/// note | نوٹ + +یاد رکھیں کہ اس صورت میں، FastAPI list کے مندرجات کی جانچ نہیں کرے گا۔ + +مثال کے طور پر، `list[int]` جانچے گا (اور دستاویز بنائے گا) کہ list کے مندرجات integers ہیں۔ لیکن اکیلا `list` ایسا نہیں کرے گا۔ + +/// + +## مزید metadata اعلان کریں { #declare-more-metadata } + +آپ parameter کے بارے میں مزید معلومات شامل کر سکتے ہیں۔ + +وہ معلومات تیار کردہ OpenAPI میں شامل ہوں گی اور دستاویزاتی صارف انٹرفیسز اور بیرونی ٹولز کے ذریعے استعمال ہوں گی۔ + +/// note | نوٹ + +یاد رکھیں کہ مختلف ٹولز میں OpenAPI تعاون کی مختلف سطحیں ہو سکتی ہیں۔ + +ان میں سے کچھ شاید ابھی تک تمام اعلان کردہ اضافی معلومات نہ دکھائیں، اگرچہ زیادہ تر صورتوں میں، غائب خصوصیت پہلے سے ترقی کے لیے منصوبہ بند ہے۔ + +/// + +آپ `title` شامل کر سکتے ہیں: + +{* ../../docs_src/query_params_str_validations/tutorial007_an_py310.py hl[10] *} + +اور `description`: + +{* ../../docs_src/query_params_str_validations/tutorial008_an_py310.py hl[14] *} + +## Alias parameters { #alias-parameters } + +تصور کریں کہ آپ چاہتے ہیں کہ parameter `item-query` ہو۔ + +جیسے: + +``` +http://127.0.0.1:8000/items/?item-query=foobaritems +``` + +لیکن `item-query` ایک درست Python variable نام نہیں ہے۔ + +سب سے قریب ترین `item_query` ہوگا۔ + +لیکن آپ کو ابھی بھی اسے بالکل `item-query` ہونا چاہیے... + +تو آپ ایک `alias` اعلان کر سکتے ہیں، اور وہ alias parameter کی قدر تلاش کرنے کے لیے استعمال ہوگا: + +{* ../../docs_src/query_params_str_validations/tutorial009_an_py310.py hl[9] *} + +## Parameters کو deprecated کرنا { #deprecating-parameters } + +فرض کریں آپ کو یہ parameter اب پسند نہیں۔ + +آپ کو اسے کچھ وقت کے لیے رکھنا ہوگا کیونکہ clients اسے استعمال کر رہے ہیں، لیکن آپ چاہتے ہیں کہ docs واضح طور پر اسے deprecated دکھائیں۔ + +پھر `Query` کو `deprecated=True` parameter دیں: + +{* ../../docs_src/query_params_str_validations/tutorial010_an_py310.py hl[19] *} + +Docs اسے اس طرح دکھائیں گے: + + + +## OpenAPI سے parameters خارج کریں { #exclude-parameters-from-openapi } + +تیار کردہ OpenAPI schema سے query parameter کو خارج کرنے کے لیے (اور اس طرح، خودکار دستاویزاتی نظاموں سے)، `Query` کا `include_in_schema` parameter `False` سیٹ کریں: + +{* ../../docs_src/query_params_str_validations/tutorial014_an_py310.py hl[10] *} + +## حسب ضرورت Validation { #custom-validation } + +ایسے معاملات ہو سکتے ہیں جہاں آپ کو **حسب ضرورت توثیق** کی ضرورت ہو جو اوپر دکھائے گئے parameters سے نہیں ہو سکتی۔ + +ان صورتوں میں، آپ ایک **حسب ضرورت validator function** استعمال کر سکتے ہیں جو عام توثیق کے بعد لاگو ہوتا ہے (مثلاً یہ توثیق کرنے کے بعد کہ قدر `str` ہے)۔ + +آپ `Annotated` کے اندر [Pydantic کا `AfterValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-after-validator) استعمال کر کے یہ حاصل کر سکتے ہیں۔ + +/// tip | مشورہ + +Pydantic میں [`BeforeValidator`](https://docs.pydantic.dev/latest/concepts/validators/#field-before-validator) اور دوسرے بھی ہیں۔ + +/// + +مثال کے طور پر، یہ حسب ضرورت validator جانچتا ہے کہ item ID ISBN کتاب نمبر کے لیے `isbn-` سے یا IMDB فلم URL ID کے لیے `imdb-` سے شروع ہوتا ہے: + +{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py hl[5,16:19,24] *} + +/// info | معلومات + +یہ Pydantic ورژن 2 یا اس سے اوپر کے ساتھ دستیاب ہے۔ + +/// + +/// tip | مشورہ + +اگر آپ کو کسی ایسی توثیق کی ضرورت ہے جس کے لیے کسی **بیرونی جزو** سے بات چیت کرنی ہو، جیسے ڈیٹابیس یا کوئی اور API، تو آپ کو اس کی بجائے **FastAPI Dependencies** استعمال کرنی چاہییں، آپ ان کے بارے میں بعد میں سیکھیں گے۔ + +یہ حسب ضرورت validators ان چیزوں کے لیے ہیں جو **صرف** request میں فراہم کردہ **اسی ڈیٹا** سے جانچی جا سکتی ہیں۔ + +/// + +### اس کوڈ کو سمجھیں { #understand-that-code } + +اہم نکتہ بس **`Annotated` کے اندر function کے ساتھ `AfterValidator`** استعمال کرنا ہے۔ اس حصے کو چھوڑنے میں کوئی حرج نہیں۔ + +--- + +لیکن اگر آپ اس مخصوص کوڈ مثال کے بارے میں جاننا چاہتے ہیں، تو یہاں کچھ اضافی تفصیلات ہیں۔ + +#### `value.startswith()` کے ساتھ String { #string-with-value-startswith } + +کیا آپ نے غور کیا؟ `value.startswith()` استعمال کرنے والی string ایک tuple لے سکتی ہے، اور یہ tuple میں ہر قدر کو جانچے گی: + +{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[16:19] hl[17] *} + +#### ایک بے ترتیب آئٹم { #a-random-item } + +`data.items()` سے ہمیں ایک iterable object ملتا ہے جس میں ہر dictionary آئٹم کے لیے key اور value پر مشتمل tuples ہوتے ہیں۔ + +ہم اس iterable object کو `list(data.items())` سے صحیح `list` میں تبدیل کرتے ہیں۔ + +پھر `random.choice()` سے ہم list سے ایک **بے ترتیب قدر** حاصل کر سکتے ہیں، تو ہمیں `(id, name)` کے ساتھ ایک tuple ملتا ہے۔ یہ کچھ ایسا ہوگا جیسے `("imdb-tt0371724", "The Hitchhiker's Guide to the Galaxy")`۔ + +پھر ہم tuple کی وہ **دو اقدار** متغیرات `id` اور `name` کو **تفویض** کرتے ہیں۔ + +تو، اگر صارف نے item ID فراہم نہیں کی، تو انہیں پھر بھی ایک بے ترتیب تجویز ملے گی۔ + +...ہم یہ سب ایک **سادہ لائن** میں کرتے ہیں۔ کیا آپ کو Python پسند نہیں؟ + +{* ../../docs_src/query_params_str_validations/tutorial015_an_py310.py ln[22:30] hl[29] *} + +## خلاصہ { #recap } + +آپ اپنے parameters کے لیے اضافی validations اور metadata اعلان کر سکتے ہیں۔ + +عمومی validations اور metadata: + +* `alias` +* `title` +* `description` +* `deprecated` + +Strings کے لیے مخصوص validations: + +* `min_length` +* `max_length` +* `pattern` + +`AfterValidator` استعمال کر کے حسب ضرورت validations۔ + +ان مثالوں میں آپ نے دیکھا کہ `str` اقدار کے لیے validations کیسے اعلان کیے جائیں۔ + +اگلے ابواب دیکھیں تاکہ جانیں کہ دوسری اقسام، جیسے نمبروں کے لیے validations کیسے اعلان کیے جائیں۔ diff --git a/docs/ur/docs/tutorial/query-params.md b/docs/ur/docs/tutorial/query-params.md new file mode 100644 index 000000000..edb41e6f1 --- /dev/null +++ b/docs/ur/docs/tutorial/query-params.md @@ -0,0 +1,188 @@ +# Query Parameters { #query-parameters } + +جب آپ دوسرے function parameters کا اعلان کرتے ہیں جو path parameters کا حصہ نہیں ہیں، تو وہ خودکار طور پر "query" parameters کے طور پر سمجھے جاتے ہیں۔ + +{* ../../docs_src/query_params/tutorial001_py310.py hl[9] *} + +Query وہ key-value جوڑوں کا مجموعہ ہے جو URL میں `?` کے بعد آتے ہیں، `&` حروف سے الگ کیے گئے۔ + +مثال کے طور پر، اس URL میں: + +``` +http://127.0.0.1:8000/items/?skip=0&limit=10 +``` + +...query parameters یہ ہیں: + +* `skip`: قدر `0` کے ساتھ +* `limit`: قدر `10` کے ساتھ + +چونکہ یہ URL کا حصہ ہیں، یہ "قدرتی طور پر" strings ہیں۔ + +لیکن جب آپ انہیں Python types کے ساتھ اعلان کرتے ہیں (اوپر کی مثال میں، `int` کے طور پر)، تو وہ اس قسم میں تبدیل اور اس کے خلاف توثیق ہو جاتے ہیں۔ + +وہ تمام عمل جو path parameters پر لاگو ہوتا ہے query parameters پر بھی لاگو ہوتا ہے: + +* ایڈیٹر سپورٹ (ظاہر ہے) +* ڈیٹا "parsing" +* ڈیٹا کی توثیق +* خودکار دستاویزات + +## طے شدہ اقدار { #defaults } + +چونکہ query parameters path کا مقررہ حصہ نہیں ہیں، وہ اختیاری ہو سکتے ہیں اور طے شدہ اقدار رکھ سکتے ہیں۔ + +اوپر کی مثال میں ان کی طے شدہ اقدار `skip=0` اور `limit=10` ہیں۔ + +تو، اس URL پر جانا: + +``` +http://127.0.0.1:8000/items/ +``` + +ایسا ہی ہوگا جیسے اس پر جانا: + +``` +http://127.0.0.1:8000/items/?skip=0&limit=10 +``` + +لیکن اگر آپ مثال کے طور پر اس پر جائیں: + +``` +http://127.0.0.1:8000/items/?skip=20 +``` + +آپ کے function میں parameter اقدار ہوں گی: + +* `skip=20`: کیونکہ آپ نے URL میں یہ سیٹ کیا +* `limit=10`: کیونکہ یہ طے شدہ قدر تھی + +## اختیاری parameters { #optional-parameters } + +اسی طرح، آپ اختیاری query parameters کا اعلان کر سکتے ہیں، ان کی طے شدہ قدر `None` سیٹ کر کے: + +{* ../../docs_src/query_params/tutorial002_py310.py hl[7] *} + +اس صورت میں، function parameter `q` اختیاری ہوگا، اور پہلے سے `None` ہوگا۔ + +/// check + +یہ بھی نوٹ کریں کہ **FastAPI** اتنا ذہین ہے کہ وہ جان لے کہ path parameter `item_id` ایک path parameter ہے اور `q` نہیں ہے، لہذا یہ query parameter ہے۔ + +/// + +## Query parameter type کی تبدیلی { #query-parameter-type-conversion } + +آپ `bool` types کا بھی اعلان کر سکتے ہیں، اور وہ تبدیل ہو جائیں گے: + +{* ../../docs_src/query_params/tutorial003_py310.py hl[7] *} + +اس صورت میں، اگر آپ اس پر جائیں: + +``` +http://127.0.0.1:8000/items/foo?short=1 +``` + +یا + +``` +http://127.0.0.1:8000/items/foo?short=True +``` + +یا + +``` +http://127.0.0.1:8000/items/foo?short=true +``` + +یا + +``` +http://127.0.0.1:8000/items/foo?short=on +``` + +یا + +``` +http://127.0.0.1:8000/items/foo?short=yes +``` + +یا کوئی بھی دوسری حروف کی تبدیلی (بڑے حروف، پہلا حرف بڑا وغیرہ)، آپ کا function `short` parameter کو `bool` قدر `True` کے ساتھ دیکھے گا۔ ورنہ `False`۔ + + +## متعدد path اور query parameters { #multiple-path-and-query-parameters } + +آپ ایک ساتھ متعدد path parameters اور query parameters کا اعلان کر سکتے ہیں، **FastAPI** جانتا ہے کون سا کون سا ہے۔ + +اور آپ کو انہیں کسی مخصوص ترتیب میں اعلان کرنے کی ضرورت نہیں۔ + +وہ نام سے پہچانے جائیں گے: + +{* ../../docs_src/query_params/tutorial004_py310.py hl[6,8] *} + +## لازمی query parameters { #required-query-parameters } + +جب آپ غیر path parameters (ابھی تک ہم نے صرف query parameters دیکھے ہیں) کے لیے طے شدہ قدر کا اعلان کرتے ہیں، تو یہ لازمی نہیں ہوتا۔ + +اگر آپ کوئی مخصوص قدر شامل نہیں کرنا چاہتے لیکن اسے اختیاری بنانا چاہتے ہیں، تو طے شدہ قدر `None` سیٹ کریں۔ + +لیکن جب آپ query parameter کو لازمی بنانا چاہتے ہیں، تو آپ کوئی طے شدہ قدر اعلان نہ کریں: + +{* ../../docs_src/query_params/tutorial005_py310.py hl[6:7] *} + +یہاں query parameter `needy` ایک لازمی query parameter ہے جس کی قسم `str` ہے۔ + +اگر آپ اپنے براؤزر میں یہ URL کھولیں: + +``` +http://127.0.0.1:8000/items/foo-item +``` + +...لازمی parameter `needy` شامل کیے بغیر، آپ کو یہ error نظر آئے گی: + +```JSON +{ + "detail": [ + { + "type": "missing", + "loc": [ + "query", + "needy" + ], + "msg": "Field required", + "input": null + } + ] +} +``` + +چونکہ `needy` ایک لازمی parameter ہے، آپ کو اسے URL میں سیٹ کرنا ہوگا: + +``` +http://127.0.0.1:8000/items/foo-item?needy=sooooneedy +``` + +...یہ کام کرے گا: + +```JSON +{ + "item_id": "foo-item", + "needy": "sooooneedy" +} +``` + +اور یقیناً، آپ کچھ parameters کو لازمی، کچھ کو طے شدہ قدر کے ساتھ، اور کچھ کو مکمل طور پر اختیاری بنا سکتے ہیں: + +{* ../../docs_src/query_params/tutorial006_py310.py hl[8] *} + +اس صورت میں، 3 query parameters ہیں: + +* `needy`، ایک لازمی `str`۔ +* `skip`، ایک `int` جس کی طے شدہ قدر `0` ہے۔ +* `limit`، ایک اختیاری `int`۔ + +/// tip | مشورہ + +آپ `Enum`s بھی اسی طرح استعمال کر سکتے ہیں جیسے [Path Parameters](path-params.md#predefined-values) کے ساتھ۔ + +/// diff --git a/docs/ur/docs/tutorial/request-files.md b/docs/ur/docs/tutorial/request-files.md new file mode 100644 index 000000000..558aed1f0 --- /dev/null +++ b/docs/ur/docs/tutorial/request-files.md @@ -0,0 +1,176 @@ +# Request Files { #request-files } + +آپ `File` استعمال کر کے client کی جانب سے upload کی جانے والی files کی وضاحت کر سکتے ہیں۔ + +/// info + +Upload کی گئی files وصول کرنے کے لیے پہلے [`python-multipart`](https://github.com/Kludex/python-multipart) انسٹال کریں۔ + +یقینی بنائیں کہ آپ ایک [virtual environment](../virtual-environments.md) بنائیں، اسے فعال کریں، اور پھر اسے انسٹال کریں، مثال کے طور پر: + +```console +$ pip install python-multipart +``` + +یہ اس لیے ضروری ہے کیونکہ upload کی گئی files "form data" کے طور پر بھیجی جاتی ہیں۔ + +/// + +## `File` کو Import کریں { #import-file } + +`fastapi` سے `File` اور `UploadFile` کو import کریں: + +{* ../../docs_src/request_files/tutorial001_an_py310.py hl[3] *} + +## `File` کے Parameters کی وضاحت کریں { #define-file-parameters } + +File parameters بالکل اسی طرح بنائیں جیسے آپ `Body` یا `Form` کے لیے بناتے ہیں: + +{* ../../docs_src/request_files/tutorial001_an_py310.py hl[9] *} + +/// info + +`File` ایک class ہے جو براہ راست `Form` سے inherit ہوتی ہے۔ + +لیکن یاد رکھیں کہ جب آپ `fastapi` سے `Query`، `Path`، `File` اور دوسرے import کرتے ہیں تو یہ دراصل functions ہیں جو خاص classes واپس کرتے ہیں۔ + +/// + +/// tip | مشورہ + +File bodies بیان کرنے کے لیے آپ کو `File` استعمال کرنا ہوگا، کیونکہ ورنہ parameters کو query parameters یا body (JSON) parameters سمجھا جائے گا۔ + +/// + +Files "form data" کے طور پر upload ہوں گی۔ + +اگر آپ اپنے *path operation function* کے parameter کی type `bytes` بیان کرتے ہیں تو **FastAPI** آپ کے لیے file پڑھے گا اور آپ کو مواد `bytes` کے طور پر ملے گا۔ + +ذہن میں رکھیں کہ اس کا مطلب ہے کہ پورا مواد memory میں محفوظ ہوگا۔ یہ چھوٹی files کے لیے اچھا کام کرے گا۔ + +لیکن کئی ایسے معاملات ہیں جن میں آپ کو `UploadFile` استعمال کرنے سے فائدہ ہوگا۔ + +## `UploadFile` کے ساتھ File Parameters { #file-parameters-with-uploadfile } + +`UploadFile` کی type کے ساتھ ایک file parameter بیان کریں: + +{* ../../docs_src/request_files/tutorial001_an_py310.py hl[14] *} + +`UploadFile` استعمال کرنے کے `bytes` کے مقابلے میں کئی فوائد ہیں: + +* آپ کو parameter کی default value میں `File()` استعمال کرنے کی ضرورت نہیں۔ +* یہ ایک "spooled" file استعمال کرتا ہے: + * ایک مخصوص حد تک memory میں محفوظ ہونے والی file، اور اس حد سے گزرنے کے بعد یہ disk پر محفوظ ہو جائے گی۔ +* اس کا مطلب ہے کہ یہ بڑی files جیسے تصاویر، ویڈیوز، بڑی binaries وغیرہ کے لیے تمام memory استعمال کیے بغیر اچھا کام کرے گا۔ +* آپ upload کی گئی file سے metadata حاصل کر سکتے ہیں۔ +* اس کا ایک [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) `async` interface ہے۔ +* یہ ایک حقیقی Python [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) object فراہم کرتا ہے جسے آپ براہ راست ان دوسری libraries کو دے سکتے ہیں جو file-like object کی توقع رکھتی ہیں۔ + +### `UploadFile` { #uploadfile } + +`UploadFile` کے درج ذیل attributes ہیں: + +* `filename`: ایک `str` جس میں upload کی گئی اصل file کا نام ہوتا ہے (مثلاً `myimage.jpg`)۔ +* `content_type`: ایک `str` جس میں content type (MIME type / media type) ہوتا ہے (مثلاً `image/jpeg`)۔ +* `file`: ایک [`SpooledTemporaryFile`](https://docs.python.org/3/library/tempfile.html#tempfile.SpooledTemporaryFile) (ایک [file-like](https://docs.python.org/3/glossary.html#term-file-like-object) object)۔ یہ حقیقی Python file object ہے جسے آپ براہ راست دوسرے functions یا libraries کو دے سکتے ہیں جو "file-like" object کی توقع رکھتے ہیں۔ + +`UploadFile` کے درج ذیل `async` methods ہیں۔ یہ سب اندرونی `SpooledTemporaryFile` استعمال کرتے ہوئے متعلقہ file methods کو call کرتے ہیں۔ + +* `write(data)`: File میں `data` (`str` یا `bytes`) لکھتا ہے۔ +* `read(size)`: File کے `size` (`int`) bytes/characters پڑھتا ہے۔ +* `seek(offset)`: File میں byte position `offset` (`int`) پر جاتا ہے۔ + * مثلاً `await myfile.seek(0)` file کے شروع میں لے جائے گا۔ + * یہ خاص طور پر مفید ہے اگر آپ `await myfile.read()` ایک بار چلائیں اور پھر مواد دوبارہ پڑھنا چاہیں۔ +* `close()`: File کو بند کرتا ہے۔ + +چونکہ یہ سب `async` methods ہیں، آپ کو انہیں "await" کرنا ہوگا۔ + +مثال کے طور پر، ایک `async` *path operation function* کے اندر آپ مواد اس طرح حاصل کر سکتے ہیں: + +```Python +contents = await myfile.read() +``` + +اگر آپ ایک عام `def` *path operation function* کے اندر ہیں تو آپ `UploadFile.file` تک براہ راست رسائی حاصل کر سکتے ہیں، مثال کے طور پر: + +```Python +contents = myfile.file.read() +``` + +/// note | `async` تکنیکی تفصیلات + +جب آپ `async` methods استعمال کرتے ہیں تو **FastAPI** file methods کو ایک threadpool میں چلاتا ہے اور ان کا انتظار کرتا ہے۔ + +/// + +/// note | Starlette تکنیکی تفصیلات + +**FastAPI** کا `UploadFile` براہ راست **Starlette** کے `UploadFile` سے inherit ہوتا ہے، لیکن اسے **Pydantic** اور FastAPI کے دوسرے حصوں کے ساتھ مطابقت پذیر بنانے کے لیے کچھ ضروری حصے شامل کرتا ہے۔ + +/// + +## "Form Data" کیا ہے { #what-is-form-data } + +HTML forms (`
`) جس طرح سے server کو data بھیجتے ہیں وہ عام طور پر اس data کے لیے ایک "خاص" encoding استعمال کرتے ہیں، جو JSON سے مختلف ہوتی ہے۔ + +**FastAPI** اس data کو JSON کی بجائے صحیح جگہ سے پڑھنے کو یقینی بنائے گا۔ + +/// note | تکنیکی تفصیلات + +Forms سے آنے والا data عام طور پر "media type" `application/x-www-form-urlencoded` کے ساتھ encode ہوتا ہے جب اس میں files شامل نہ ہوں۔ + +لیکن جب form میں files شامل ہوں تو یہ `multipart/form-data` کے طور پر encode ہوتا ہے۔ اگر آپ `File` استعمال کرتے ہیں تو **FastAPI** جان لے گا کہ اسے body کے صحیح حصے سے files حاصل کرنی ہیں۔ + +اگر آپ ان encodings اور form fields کے بارے میں مزید پڑھنا چاہتے ہیں تو [MDN web docs for `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) دیکھیں۔ + +/// + +/// warning | انتباہ + +آپ ایک *path operation* میں متعدد `File` اور `Form` parameters بیان کر سکتے ہیں، لیکن آپ ساتھ میں `Body` fields بھی بیان نہیں کر سکتے جو آپ JSON کے طور پر وصول کرنا چاہتے ہیں، کیونکہ request کا body `application/json` کی بجائے `multipart/form-data` کے ساتھ encode ہوگا۔ + +یہ **FastAPI** کی کوئی حد نہیں ہے، یہ HTTP protocol کا حصہ ہے۔ + +/// + +## اختیاری File Upload { #optional-file-upload } + +آپ معیاری type annotations استعمال کر کے اور `None` کی default value مقرر کر کے file کو اختیاری بنا سکتے ہیں: + +{* ../../docs_src/request_files/tutorial001_02_an_py310.py hl[9,17] *} + +## اضافی Metadata کے ساتھ `UploadFile` { #uploadfile-with-additional-metadata } + +آپ `File()` کو `UploadFile` کے ساتھ بھی استعمال کر سکتے ہیں، مثال کے طور پر، اضافی metadata مقرر کرنے کے لیے: + +{* ../../docs_src/request_files/tutorial001_03_an_py310.py hl[9,15] *} + +## متعدد File Uploads { #multiple-file-uploads } + +ایک ہی وقت میں کئی files upload کرنا ممکن ہے۔ + +وہ "form data" استعمال کرتے ہوئے بھیجے گئے ایک ہی "form field" سے منسلک ہوں گی۔ + +اس کے لیے `bytes` یا `UploadFile` کی ایک list بیان کریں: + +{* ../../docs_src/request_files/tutorial002_an_py310.py hl[10,15] *} + +آپ کو، جیسا کہ بیان کیا گیا ہے، `bytes` یا `UploadFile` کی ایک `list` ملے گی۔ + +/// note | تکنیکی تفصیلات + +آپ `from starlette.responses import HTMLResponse` بھی استعمال کر سکتے ہیں۔ + +**FastAPI** آپ کی سہولت کے لیے وہی `starlette.responses` بطور `fastapi.responses` فراہم کرتا ہے۔ لیکن زیادہ تر دستیاب responses براہ راست Starlette سے آتے ہیں۔ + +/// + +### اضافی Metadata کے ساتھ متعدد File Uploads { #multiple-file-uploads-with-additional-metadata } + +اور پہلے کی طرح، آپ `File()` استعمال کر کے اضافی parameters مقرر کر سکتے ہیں، حتیٰ کہ `UploadFile` کے لیے بھی: + +{* ../../docs_src/request_files/tutorial003_an_py310.py hl[11,18:20] *} + +## خلاصہ { #recap } + +Request میں form data کے طور پر upload ہونے والی files بیان کرنے کے لیے `File`، `bytes`، اور `UploadFile` استعمال کریں۔ diff --git a/docs/ur/docs/tutorial/request-form-models.md b/docs/ur/docs/tutorial/request-form-models.md new file mode 100644 index 000000000..0d55ec620 --- /dev/null +++ b/docs/ur/docs/tutorial/request-form-models.md @@ -0,0 +1,78 @@ +# Form Models { #form-models } + +آپ FastAPI میں **form fields** بیان کرنے کے لیے **Pydantic models** استعمال کر سکتے ہیں۔ + +/// info + +Forms استعمال کرنے کے لیے پہلے [`python-multipart`](https://github.com/Kludex/python-multipart) انسٹال کریں۔ + +یقینی بنائیں کہ آپ ایک [virtual environment](../virtual-environments.md) بنائیں، اسے فعال کریں، اور پھر اسے انسٹال کریں، مثال کے طور پر: + +```console +$ pip install python-multipart +``` + +/// + +/// note | نوٹ + +یہ FastAPI version `0.113.0` سے تعاون یافتہ ہے۔ 🤓 + +/// + +## Forms کے لیے Pydantic Models { #pydantic-models-for-forms } + +آپ کو صرف ایک **Pydantic model** بنانا ہوگا جس میں وہ fields ہوں جو آپ **form fields** کے طور پر وصول کرنا چاہتے ہیں، اور پھر parameter کو `Form` کے طور پر بیان کریں: + +{* ../../docs_src/request_form_models/tutorial001_an_py310.py hl[9:11,15] *} + +**FastAPI** request میں موجود **form data** سے **ہر field** کا data **نکالے** گا اور آپ کو آپ کا بیان کردہ Pydantic model دے گا۔ + +## Docs چیک کریں { #check-the-docs } + +آپ `/docs` پر docs UI میں اس کی تصدیق کر سکتے ہیں: + +
+ +
+ +## اضافی Form Fields پر پابندی لگائیں { #forbid-extra-form-fields } + +کچھ خاص صورتوں میں (جو شاید عام نہیں ہیں)، آپ form fields کو صرف Pydantic model میں بیان کردہ fields تک **محدود** رکھنا چاہیں گے۔ اور کسی بھی **اضافی** fields کو **منع** کرنا چاہیں گے۔ + +/// note | نوٹ + +یہ FastAPI version `0.114.0` سے تعاون یافتہ ہے۔ 🤓 + +/// + +آپ Pydantic کی model configuration استعمال کر کے کسی بھی `extra` fields کو `forbid` کر سکتے ہیں: + +{* ../../docs_src/request_form_models/tutorial002_an_py310.py hl[12] *} + +اگر کوئی client اضافی data بھیجنے کی کوشش کرے تو اسے **error** response ملے گا۔ + +مثال کے طور پر، اگر client یہ form fields بھیجنے کی کوشش کرے: + +* `username`: `Rick` +* `password`: `Portal Gun` +* `extra`: `Mr. Poopybutthole` + +تو اسے ایک error response ملے گا جو بتائے گا کہ field `extra` کی اجازت نہیں ہے: + +```json +{ + "detail": [ + { + "type": "extra_forbidden", + "loc": ["body", "extra"], + "msg": "Extra inputs are not permitted", + "input": "Mr. Poopybutthole" + } + ] +} +``` + +## خلاصہ { #summary } + +آپ FastAPI میں form fields بیان کرنے کے لیے Pydantic models استعمال کر سکتے ہیں۔ 😎 diff --git a/docs/ur/docs/tutorial/request-forms-and-files.md b/docs/ur/docs/tutorial/request-forms-and-files.md new file mode 100644 index 000000000..62090447b --- /dev/null +++ b/docs/ur/docs/tutorial/request-forms-and-files.md @@ -0,0 +1,41 @@ +# Request Forms اور Files { #request-forms-and-files } + +آپ `File` اور `Form` استعمال کر کے ایک ہی وقت میں files اور form fields کی وضاحت کر سکتے ہیں۔ + +/// info + +Upload کی گئی files اور/یا form data وصول کرنے کے لیے پہلے [`python-multipart`](https://github.com/Kludex/python-multipart) انسٹال کریں۔ + +یقینی بنائیں کہ آپ ایک [virtual environment](../virtual-environments.md) بنائیں، اسے فعال کریں، اور پھر اسے انسٹال کریں، مثال کے طور پر: + +```console +$ pip install python-multipart +``` + +/// + +## `File` اور `Form` کو Import کریں { #import-file-and-form } + +{* ../../docs_src/request_forms_and_files/tutorial001_an_py310.py hl[3] *} + +## `File` اور `Form` کے parameters کی وضاحت کریں { #define-file-and-form-parameters } + +File اور form parameters بالکل اسی طرح بنائیں جیسے آپ `Body` یا `Query` کے لیے بناتے ہیں: + +{* ../../docs_src/request_forms_and_files/tutorial001_an_py310.py hl[10:12] *} + +Files اور form fields، form data کے طور پر upload ہوں گے اور آپ کو files اور form fields موصول ہوں گے۔ + +اور آپ کچھ files کو `bytes` اور کچھ کو `UploadFile` کے طور پر بیان کر سکتے ہیں۔ + +/// warning | انتباہ + +آپ ایک *path operation* میں متعدد `File` اور `Form` parameters بیان کر سکتے ہیں، لیکن آپ ساتھ میں `Body` fields بھی بیان نہیں کر سکتے جو آپ JSON کے طور پر وصول کرنا چاہتے ہیں، کیونکہ request کا body `application/json` کی بجائے `multipart/form-data` کے ساتھ encode ہوگا۔ + +یہ **FastAPI** کی کوئی حد نہیں ہے، یہ HTTP protocol کا حصہ ہے۔ + +/// + +## خلاصہ { #recap } + +جب آپ کو ایک ہی request میں data اور files دونوں وصول کرنے کی ضرورت ہو تو `File` اور `Form` کو ایک ساتھ استعمال کریں۔ diff --git a/docs/ur/docs/tutorial/request-forms.md b/docs/ur/docs/tutorial/request-forms.md new file mode 100644 index 000000000..b4bcb308b --- /dev/null +++ b/docs/ur/docs/tutorial/request-forms.md @@ -0,0 +1,73 @@ +# Form Data { #form-data } + +جب آپ کو JSON کی بجائے form fields وصول کرنے کی ضرورت ہو تو آپ `Form` استعمال کر سکتے ہیں۔ + +/// info + +Forms استعمال کرنے کے لیے پہلے [`python-multipart`](https://github.com/Kludex/python-multipart) انسٹال کریں۔ + +یقینی بنائیں کہ آپ ایک [virtual environment](../virtual-environments.md) بنائیں، اسے فعال کریں، اور پھر اسے انسٹال کریں، مثال کے طور پر: + +```console +$ pip install python-multipart +``` + +/// + +## `Form` کو Import کریں { #import-form } + +`fastapi` سے `Form` کو import کریں: + +{* ../../docs_src/request_forms/tutorial001_an_py310.py hl[3] *} + +## `Form` کے parameters کی وضاحت کریں { #define-form-parameters } + +Form parameters بالکل اسی طرح بنائیں جیسے آپ `Body` یا `Query` کے لیے بناتے ہیں: + +{* ../../docs_src/request_forms/tutorial001_an_py310.py hl[9] *} + +مثال کے طور پر، OAuth2 specification کے استعمال کے ایک طریقے میں (جسے "password flow" کہتے ہیں) `username` اور `password` کو form fields کے طور پر بھیجنا ضروری ہوتا ہے۔ + +spec کے مطابق ان fields کا نام بالکل `username` اور `password` ہونا چاہیے، اور انہیں JSON کی بجائے form fields کے طور پر بھیجا جانا چاہیے۔ + +`Form` کے ساتھ آپ وہی configurations بیان کر سکتے ہیں جو `Body` (اور `Query`، `Path`، `Cookie`) کے ساتھ کرتے ہیں، بشمول validation، examples، ایک alias (مثلاً `username` کی بجائے `user-name`)، وغیرہ۔ + +/// info + +`Form` ایک class ہے جو براہ راست `Body` سے inherit ہوتی ہے۔ + +/// + +/// tip | مشورہ + +Form bodies بیان کرنے کے لیے آپ کو واضح طور پر `Form` استعمال کرنا ہوگا، کیونکہ اس کے بغیر parameters کو query parameters یا body (JSON) parameters سمجھا جائے گا۔ + +/// + +## "Form Fields" کے بارے میں { #about-form-fields } + +HTML forms (`
`) جس طرح سے server کو data بھیجتے ہیں وہ عام طور پر اس data کے لیے ایک "خاص" encoding استعمال کرتے ہیں، جو JSON سے مختلف ہوتی ہے۔ + +**FastAPI** اس data کو JSON کی بجائے صحیح جگہ سے پڑھنے کو یقینی بنائے گا۔ + +/// note | تکنیکی تفصیلات + +Forms سے آنے والا data عام طور پر "media type" `application/x-www-form-urlencoded` کے ساتھ encode ہوتا ہے۔ + +لیکن جب form میں files شامل ہوں تو یہ `multipart/form-data` کے طور پر encode ہوتا ہے۔ آپ اگلے باب میں files کو سنبھالنے کے بارے میں پڑھیں گے۔ + +اگر آپ ان encodings اور form fields کے بارے میں مزید پڑھنا چاہتے ہیں تو [MDN web docs for `POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) دیکھیں۔ + +/// + +/// warning | انتباہ + +آپ ایک *path operation* میں متعدد `Form` parameters بیان کر سکتے ہیں، لیکن آپ ساتھ میں `Body` fields بھی بیان نہیں کر سکتے جو آپ JSON کے طور پر وصول کرنا چاہتے ہیں، کیونکہ request کا body `application/json` کی بجائے `application/x-www-form-urlencoded` کے ساتھ encode ہوگا۔ + +یہ **FastAPI** کی کوئی حد نہیں ہے، یہ HTTP protocol کا حصہ ہے۔ + +/// + +## خلاصہ { #recap } + +Form data کے input parameters بیان کرنے کے لیے `Form` استعمال کریں۔ diff --git a/docs/ur/docs/tutorial/response-model.md b/docs/ur/docs/tutorial/response-model.md new file mode 100644 index 000000000..701d5b87d --- /dev/null +++ b/docs/ur/docs/tutorial/response-model.md @@ -0,0 +1,344 @@ +# Response Model - Return Type { #response-model-return-type } + +آپ *path operation function* کے **return type** کی annotation لگا کر response کے لیے استعمال ہونے والی type declare کر سکتے ہیں۔ + +آپ **type annotations** کو اسی طرح استعمال کر سکتے ہیں جیسے آپ function **parameters** میں input data کے لیے کرتے ہیں، آپ Pydantic models، lists، dictionaries، scalar values جیسے integers، booleans، وغیرہ استعمال کر سکتے ہیں۔ + +{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *} + +FastAPI اس return type کو ان مقاصد کے لیے استعمال کرے گا: + +* واپس آنے والے ڈیٹا کی **تصدیق (Validate)** کرنا۔ + * اگر ڈیٹا غلط ہے (مثلاً کوئی field غائب ہے)، تو اس کا مطلب ہے کہ *آپ کے* ایپ کا code ٹوٹا ہوا ہے، جو واپس کرنا چاہیے وہ واپس نہیں کر رہا، اور غلط ڈیٹا واپس کرنے کی بجائے server error واپس کرے گا۔ اس طرح آپ اور آپ کے clients یقین رکھ سکتے ہیں کہ انہیں متوقع ڈیٹا اور ڈیٹا کی شکل ملے گی۔ +* OpenAPI *path operation* میں response کے لیے **JSON Schema** شامل کرنا۔ + * یہ **خودکار docs** کے لیے استعمال ہوگا۔ + * یہ خودکار client code generation ٹولز بھی استعمال کریں گے۔ +* Pydantic استعمال کر کے واپس آنے والے ڈیٹا کو JSON میں **Serialize** کرنا، جو **Rust** میں لکھا گیا ہے، اس لیے یہ **بہت تیز** ہوگا۔ + +لیکن سب سے اہم بات: + +* یہ آؤٹ پٹ ڈیٹا کو return type میں جو define ہے اس تک **محدود اور فلٹر** کرے گا۔ + * یہ خاص طور پر **سیکیورٹی** کے لیے اہم ہے، اس کے بارے میں ہم نیچے مزید دیکھیں گے۔ + +## `response_model` Parameter { #response-model-parameter } + +کچھ ایسے معاملات ہیں جہاں آپ کو ایسا ڈیٹا واپس کرنا ہوتا ہے جو بالکل وہی نہیں ہوتا جو type declare کرتی ہے۔ + +مثال کے طور پر، آپ ایک **dictionary** یا database object واپس کرنا چاہتے ہیں، لیکن **اسے Pydantic model کے طور پر declare** کرنا چاہتے ہیں۔ اس طرح Pydantic model آپ کے واپس کیے گئے object (مثلاً dictionary یا database object) کے لیے تمام ڈیٹا documentation، validation، وغیرہ کرے گا۔ + +اگر آپ نے return type annotation لگائی ہے، تو ٹولز اور editors ایک (درست) error کے ساتھ شکایت کریں گے کہ آپ کا function ایسی type واپس کر رہا ہے (مثلاً dict) جو آپ نے declare کی ہے (مثلاً Pydantic model) اس سے مختلف ہے۔ + +ان معاملات میں، آپ return type کی بجائے *path operation decorator* parameter `response_model` استعمال کر سکتے ہیں۔ + +آپ `response_model` parameter کو کسی بھی *path operation* میں استعمال کر سکتے ہیں: + +* `@app.get()` +* `@app.post()` +* `@app.put()` +* `@app.delete()` +* وغیرہ + +{* ../../docs_src/response_model/tutorial001_py310.py hl[17,22,24:27] *} + +/// note | نوٹ + +نوٹ کریں کہ `response_model` "decorator" method (`get`، `post`، وغیرہ) کا parameter ہے۔ آپ کے *path operation function* کا نہیں، جیسے تمام parameters اور body۔ + +/// + +`response_model` وہی type قبول کرتا ہے جو آپ Pydantic model field کے لیے declare کرتے ہیں، لہذا یہ ایک Pydantic model ہو سکتا ہے، لیکن یہ مثلاً Pydantic models کی `list` بھی ہو سکتی ہے، جیسے `List[Item]`۔ + +FastAPI اس `response_model` کو تمام ڈیٹا documentation، validation، وغیرہ کے لیے استعمال کرے گا اور ساتھ ہی آؤٹ پٹ ڈیٹا کو اس کی type declaration کے مطابق **تبدیل اور فلٹر** بھی کرے گا۔ + +/// tip | مشورہ + +اگر آپ کے editor، mypy، وغیرہ میں سخت type checks ہیں، تو آپ function return type کو `Any` declare کر سکتے ہیں۔ + +اس طرح آپ editor کو بتاتے ہیں کہ آپ جان بوجھ کر کچھ بھی واپس کر رہے ہیں۔ لیکن FastAPI پھر بھی `response_model` کے ساتھ ڈیٹا documentation، validation، filtering وغیرہ کرے گا۔ + +/// + +### `response_model` کی ترجیح { #response-model-priority } + +اگر آپ return type اور `response_model` دونوں declare کریں، تو `response_model` کو ترجیح ملے گی اور FastAPI اسے استعمال کرے گا۔ + +اس طرح آپ اپنے functions میں درست type annotations لگا سکتے ہیں چاہے آپ response model سے مختلف type واپس کر رہے ہوں، تاکہ editor اور mypy جیسے ٹولز استعمال ہو سکیں۔ اور پھر بھی FastAPI `response_model` استعمال کر کے ڈیٹا validation، documentation وغیرہ کرے گا۔ + +آپ `response_model=None` بھی استعمال کر سکتے ہیں تاکہ اس *path operation* کے لیے response model بنانا بند ہو، آپ کو ایسا کرنا پڑ سکتا ہے اگر آپ ایسی چیزوں کے لیے type annotations لگا رہے ہیں جو درست Pydantic fields نہیں ہیں، نیچے کسی حصے میں آپ اس کی مثال دیکھیں گے۔ + +## وہی input ڈیٹا واپس کریں { #return-the-same-input-data } + +یہاں ہم ایک `UserIn` model declare کر رہے ہیں، جس میں سادہ متن کا password ہوگا: + +{* ../../docs_src/response_model/tutorial002_py310.py hl[7,9] *} + +/// info | معلومات + +`EmailStr` استعمال کرنے کے لیے، پہلے [`email-validator`](https://github.com/JoshData/python-email-validator) install کریں۔ + +یقینی بنائیں کہ آپ ایک [virtual environment](../virtual-environments.md) بنائیں، اسے activate کریں، اور پھر اسے install کریں، مثال کے طور پر: + +```console +$ pip install email-validator +``` + +یا اس کے ساتھ: + +```console +$ pip install "pydantic[email]" +``` + +/// + +اور ہم اسی model کو اپنے input اور اسی model کو اپنے output declare کرنے کے لیے استعمال کر رہے ہیں: + +{* ../../docs_src/response_model/tutorial002_py310.py hl[16] *} + +اب، جب بھی کوئی browser password کے ساتھ user بنائے گا، API اسی password کو response میں واپس کرے گا۔ + +اس صورت میں، شاید یہ مسئلہ نہ ہو، کیونکہ وہی user password بھیج رہا ہے۔ + +لیکن اگر ہم کسی اور *path operation* کے لیے وہی model استعمال کریں، تو ہم اپنے user کے passwords ہر client کو بھیج سکتے ہیں۔ + +/// danger + +کبھی بھی user کا سادہ password ذخیرہ نہ کریں اور نہ ہی اسے اس طرح response میں بھیجیں، جب تک کہ آپ تمام خطرات سے واقف نہ ہوں اور جانتے ہوں کہ آپ کیا کر رہے ہیں۔ + +/// + +## آؤٹ پٹ model شامل کریں { #add-an-output-model } + +ہم اس کی بجائے ایک input model سادہ متن کے password کے ساتھ اور ایک output model بغیر password کے بنا سکتے ہیں: + +{* ../../docs_src/response_model/tutorial003_py310.py hl[9,11,16] *} + +یہاں، اگرچہ ہمارا *path operation function* وہی input user واپس کر رہا ہے جس میں password ہے: + +{* ../../docs_src/response_model/tutorial003_py310.py hl[24] *} + +...ہم نے `response_model` کو اپنے model `UserOut` کے طور پر declare کیا ہے، جس میں password شامل نہیں ہے: + +{* ../../docs_src/response_model/tutorial003_py310.py hl[22] *} + +تو، **FastAPI** آؤٹ پٹ model میں declare نہ کیے گئے تمام ڈیٹا کو فلٹر کر دے گا (Pydantic استعمال کر کے)۔ + +### `response_model` یا Return Type { #response-model-or-return-type } + +اس صورت میں، چونکہ دونوں models مختلف ہیں، اگر ہم function return type کو `UserOut` annotate کریں، تو editor اور ٹولز شکایت کریں گے کہ ہم غلط type واپس کر رہے ہیں، کیونکہ یہ مختلف classes ہیں۔ + +اسی لیے اس مثال میں ہمیں اسے `response_model` parameter میں declare کرنا پڑتا ہے۔ + +...لیکن نیچے پڑھتے رہیں تاکہ دیکھیں اس پر کیسے قابو پایا جائے۔ + +## Return Type اور ڈیٹا Filtering { #return-type-and-data-filtering } + +آئیے پچھلی مثال سے آگے بڑھتے ہیں۔ ہم **function کو ایک type سے annotate** کرنا چاہتے تھے، لیکن ہم function سے ایسی چیز واپس کرنا چاہتے تھے جس میں دراصل **مزید ڈیٹا** شامل ہو۔ + +ہم چاہتے ہیں کہ FastAPI response model استعمال کر کے ڈیٹا **فلٹر** کرتا رہے۔ تاکہ اگرچہ function مزید ڈیٹا واپس کرے، response میں صرف وہی fields شامل ہوں جو response model میں declare ہیں۔ + +پچھلی مثال میں، چونکہ classes مختلف تھیں، ہمیں `response_model` parameter استعمال کرنا پڑا۔ لیکن اس کا مطلب یہ بھی ہے کہ ہمیں function return type کی جانچ کے لیے editor اور ٹولز کی سہولت نہیں ملتی۔ + +لیکن زیادہ تر معاملات میں جہاں ہمیں ایسا کچھ کرنا ہوتا ہے، ہم چاہتے ہیں کہ model صرف اس مثال کی طرح کچھ ڈیٹا **فلٹر/ہٹا** دے۔ + +اور ان معاملات میں، ہم classes اور inheritance استعمال کر کے function **type annotations** کا فائدہ اٹھا سکتے ہیں تاکہ editor اور ٹولز میں بہتر سہولت ملے، اور ساتھ ہی FastAPI **ڈیٹا filtering** بھی ہو۔ + +{* ../../docs_src/response_model/tutorial003_01_py310.py hl[7:10,13:14,18] *} + +اس سے ہمیں editors اور mypy سے ٹولنگ سپورٹ ملتی ہے کیونکہ types کے لحاظ سے یہ code درست ہے، لیکن ہمیں FastAPI سے ڈیٹا filtering بھی ملتی ہے۔ + +یہ کیسے کام کرتا ہے؟ آئیے دیکھتے ہیں۔ 🤓 + +### Type Annotations اور ٹولنگ { #type-annotations-and-tooling } + +پہلے دیکھتے ہیں کہ editors، mypy اور دیگر ٹولز اسے کیسے دیکھیں گے۔ + +`BaseUser` میں بنیادی fields ہیں۔ پھر `UserIn` `BaseUser` سے inherit کرتی ہے اور `password` field شامل کرتی ہے، تو اس میں دونوں models کے تمام fields شامل ہوں گے۔ + +ہم function return type کو `BaseUser` annotate کرتے ہیں، لیکن دراصل ایک `UserIn` instance واپس کر رہے ہیں۔ + +Editor، mypy، اور دیگر ٹولز اس پر شکایت نہیں کریں گے کیونکہ، typing کے لحاظ سے، `UserIn` `BaseUser` کی subclass ہے، جس کا مطلب ہے کہ جہاں `BaseUser` متوقع ہو وہاں یہ ایک *درست* type ہے۔ + +### FastAPI ڈیٹا Filtering { #fastapi-data-filtering } + +اب، FastAPI return type دیکھے گا اور یقینی بنائے گا کہ آپ جو واپس کریں اس میں **صرف** وہ fields شامل ہوں جو type میں declare ہیں۔ + +FastAPI اندرونی طور پر Pydantic کے ساتھ کئی چیزیں کرتا ہے تاکہ یقینی بنایا جا سکے کہ class inheritance کے وہی قواعد واپس آنے والے ڈیٹا کی filtering کے لیے استعمال نہ ہوں، ورنہ آپ توقع سے بہت زیادہ ڈیٹا واپس کر سکتے ہیں۔ + +اس طرح، آپ کو دونوں جہانوں کا بہترین مل سکتا ہے: **ٹولنگ سپورٹ** کے ساتھ type annotations اور **ڈیٹا filtering**۔ + +## Docs میں دیکھیں { #see-it-in-the-docs } + +جب آپ خودکار docs دیکھیں، تو آپ چیک کر سکتے ہیں کہ input model اور output model دونوں کا اپنا JSON Schema ہوگا: + + + +اور دونوں models انٹرایکٹو API documentation میں استعمال ہوں گے: + + + +## دیگر Return Type Annotations { #other-return-type-annotations } + +ایسے معاملات ہو سکتے ہیں جہاں آپ کوئی ایسی چیز واپس کرتے ہیں جو درست Pydantic field نہیں ہے اور آپ اسے function میں صرف ٹولنگ (editor، mypy، وغیرہ) سے سہولت حاصل کرنے کے لیے annotate کرتے ہیں۔ + +### براہ راست Response واپس کریں { #return-a-response-directly } + +سب سے عام معاملہ [براہ راست Response واپس کرنا ہوگا جیسا کہ بعد میں ایڈوانسڈ docs میں بیان ہوا ہے](../advanced/response-directly.md)۔ + +{* ../../docs_src/response_model/tutorial003_02_py310.py hl[8,10:11] *} + +یہ سادہ معاملہ FastAPI خودکار طور پر handle کرتا ہے کیونکہ return type annotation وہ class (یا `Response` کی subclass) ہے۔ + +اور ٹولز بھی خوش ہوں گے کیونکہ `RedirectResponse` اور `JSONResponse` دونوں `Response` کی subclasses ہیں، تو type annotation درست ہے۔ + +### Response Subclass Annotate کریں { #annotate-a-response-subclass } + +آپ type annotation میں `Response` کی subclass بھی استعمال کر سکتے ہیں: + +{* ../../docs_src/response_model/tutorial003_03_py310.py hl[8:9] *} + +یہ بھی کام کرے گا کیونکہ `RedirectResponse` `Response` کی subclass ہے، اور FastAPI خودکار طور پر اس سادہ معاملے کو handle کرے گا۔ + +### غلط Return Type Annotations { #invalid-return-type-annotations } + +لیکن جب آپ کوئی اور اختیاری object واپس کرتے ہیں جو درست Pydantic type نہیں ہے (مثلاً database object) اور آپ اسے function میں اسی طرح annotate کرتے ہیں، تو FastAPI اس type annotation سے Pydantic response model بنانے کی کوشش کرے گا، اور ناکام ہو جائے گا۔ + +یہی ہوگا اگر آپ کے پاس مختلف types کے درمیان union ہو جہاں ایک یا زیادہ درست Pydantic types نہ ہوں، مثلاً یہ ناکام ہو جائے گا 💥: + +{* ../../docs_src/response_model/tutorial003_04_py310.py hl[8] *} + +...یہ اس لیے ناکام ہوتا ہے کیونکہ type annotation ایک Pydantic type نہیں ہے اور صرف ایک `Response` class یا subclass بھی نہیں ہے، یہ `Response` اور `dict` کے درمیان union (دونوں میں سے کوئی ایک) ہے۔ + +### Response Model غیر فعال کریں { #disable-response-model } + +اوپر کی مثال سے آگے بڑھتے ہوئے، شاید آپ وہ ڈیفالٹ ڈیٹا validation، documentation، filtering وغیرہ نہ چاہیں جو FastAPI کرتا ہے۔ + +لیکن آپ شاید function میں return type annotation رکھنا چاہیں تاکہ editors اور type checkers (مثلاً mypy) جیسے ٹولز سے سہولت ملتی رہے۔ + +اس صورت میں، آپ `response_model=None` سیٹ کر کے response model generation غیر فعال کر سکتے ہیں: + +{* ../../docs_src/response_model/tutorial003_05_py310.py hl[7] *} + +اس سے FastAPI response model generation چھوڑ دے گا اور اس طرح آپ جو بھی return type annotations چاہیں رکھ سکتے ہیں بغیر اس کے کہ آپ کی FastAPI application متاثر ہو۔ 🤓 + +## Response Model encoding parameters { #response-model-encoding-parameters } + +آپ کے response model میں default values ہو سکتی ہیں، جیسے: + +{* ../../docs_src/response_model/tutorial004_py310.py hl[9,11:12] *} + +* `description: Union[str, None] = None` (یا Python 3.10 میں `str | None = None`) کی default `None` ہے۔ +* `tax: float = 10.5` کی default `10.5` ہے۔ +* `tags: List[str] = []` کی default خالی list ہے: `[]`۔ + +لیکن آپ انہیں نتیجے سے خارج کرنا چاہ سکتے ہیں اگر وہ دراصل ذخیرہ نہیں کیے گئے تھے۔ + +مثال کے طور پر، اگر آپ کے پاس NoSQL database میں بہت سے optional attributes والے models ہیں، لیکن آپ default values سے بھرے بہت لمبے JSON responses نہیں بھیجنا چاہتے۔ + +### `response_model_exclude_unset` parameter استعمال کریں { #use-the-response-model-exclude-unset-parameter } + +آپ *path operation decorator* parameter `response_model_exclude_unset=True` سیٹ کر سکتے ہیں: + +{* ../../docs_src/response_model/tutorial004_py310.py hl[22] *} + +اور وہ default values response میں شامل نہیں ہوں گی، صرف وہ قدریں شامل ہوں گی جو واقعی سیٹ کی گئی تھیں۔ + +تو اگر آپ اس *path operation* کو ID `foo` والے item کے لیے request بھیجیں، تو response (default values شامل کیے بغیر) یہ ہوگا: + +```JSON +{ + "name": "Foo", + "price": 50.2 +} +``` + +/// info | معلومات + +آپ یہ بھی استعمال کر سکتے ہیں: + +* `response_model_exclude_defaults=True` +* `response_model_exclude_none=True` + +جیسا کہ [Pydantic docs](https://docs.pydantic.dev/1.10/usage/exporting_models/#modeldict) میں `exclude_defaults` اور `exclude_none` کے لیے بیان ہے۔ + +/// + +#### Default values والے fields کے لیے ڈیٹا { #data-with-values-for-fields-with-defaults } + +لیکن اگر آپ کے ڈیٹا میں model کے default values والے fields کے لیے قدریں ہیں، جیسے ID `bar` والا item: + +```Python hl_lines="3 5" +{ + "name": "Bar", + "description": "The bartenders", + "price": 62, + "tax": 20.2 +} +``` + +تو وہ response میں شامل ہوں گی۔ + +#### Defaults جیسی ہی قدروں والا ڈیٹا { #data-with-the-same-values-as-the-defaults } + +اگر ڈیٹا میں default values جیسی ہی قدریں ہیں، جیسے ID `baz` والا item: + +```Python hl_lines="3 5-6" +{ + "name": "Baz", + "description": None, + "price": 50.2, + "tax": 10.5, + "tags": [] +} +``` + +FastAPI اتنا ذہین ہے (دراصل Pydantic اتنا ذہین ہے) کہ سمجھ لے کہ، اگرچہ `description`، `tax`، اور `tags` کی قدریں defaults جیسی ہیں، وہ واضح طور پر سیٹ کی گئی تھیں (defaults سے نہیں لی گئیں)۔ + +تو، وہ JSON response میں شامل ہوں گی۔ + +/// tip | مشورہ + +نوٹ کریں کہ default values کچھ بھی ہو سکتی ہیں، صرف `None` نہیں۔ + +وہ ایک list (`[]`)، `10.5` کی `float`، وغیرہ ہو سکتی ہیں۔ + +/// + +### `response_model_include` اور `response_model_exclude` { #response-model-include-and-response-model-exclude } + +آپ *path operation decorator* parameters `response_model_include` اور `response_model_exclude` بھی استعمال کر سکتے ہیں۔ + +یہ `str` کا ایک `set` لیتے ہیں جن میں شامل کرنے (باقی چھوڑنے) یا خارج کرنے (باقی شامل کرنے) والے attributes کے نام ہوتے ہیں۔ + +اگر آپ کے پاس صرف ایک Pydantic model ہے اور آپ آؤٹ پٹ سے کچھ ڈیٹا ہٹانا چاہتے ہیں تو اسے فوری شارٹ کٹ کے طور پر استعمال کیا جا سکتا ہے۔ + +/// tip | مشورہ + +لیکن پھر بھی مشورہ یہ ہے کہ ان parameters کی بجائے اوپر بیان کیے گئے خیالات استعمال کریں، یعنی متعدد classes۔ + +اس کی وجہ یہ ہے کہ آپ کی ایپ کے OpenAPI میں تیار ہونے والا JSON Schema (اور docs) پھر بھی مکمل model کا ہوگا، چاہے آپ `response_model_include` یا `response_model_exclude` استعمال کر کے کچھ attributes ہٹا دیں۔ + +یہ `response_model_by_alias` پر بھی لاگو ہوتا ہے جو اسی طرح کام کرتا ہے۔ + +/// + +{* ../../docs_src/response_model/tutorial005_py310.py hl[29,35] *} + +/// tip | مشورہ + +`{"name", "description"}` کی ترکیب ان دو قدروں کے ساتھ ایک `set` بناتی ہے۔ + +یہ `set(["name", "description"])` کے برابر ہے۔ + +/// + +#### `set`s کی بجائے `list`s کا استعمال { #using-lists-instead-of-sets } + +اگر آپ `set` استعمال کرنا بھول جائیں اور `list` یا `tuple` استعمال کر لیں، تو FastAPI پھر بھی اسے `set` میں تبدیل کرے گا اور درست طریقے سے کام کرے گا: + +{* ../../docs_src/response_model/tutorial006_py310.py hl[29,35] *} + +## خلاصہ { #recap } + +*path operation decorator* کا parameter `response_model` استعمال کریں تاکہ response models define کریں اور خاص طور پر نجی ڈیٹا فلٹر ہونا یقینی بنائیں۔ + +صرف واضح طور پر سیٹ کی گئی قدریں واپس کرنے کے لیے `response_model_exclude_unset` استعمال کریں۔ diff --git a/docs/ur/docs/tutorial/response-status-code.md b/docs/ur/docs/tutorial/response-status-code.md new file mode 100644 index 000000000..64ff414b8 --- /dev/null +++ b/docs/ur/docs/tutorial/response-status-code.md @@ -0,0 +1,101 @@ +# Response Status Code { #response-status-code } + +جس طرح آپ response model بیان کر سکتے ہیں، اسی طرح آپ کسی بھی *path operation* میں `status_code` parameter کے ساتھ response کے لیے استعمال ہونے والا HTTP status code بھی بیان کر سکتے ہیں: + +* `@app.get()` +* `@app.post()` +* `@app.put()` +* `@app.delete()` +* وغیرہ۔ + +{* ../../docs_src/response_status_code/tutorial001_py310.py hl[6] *} + +/// note | نوٹ + +نوٹ کریں کہ `status_code` "decorator" method (`get`، `post` وغیرہ) کا parameter ہے۔ آپ کے *path operation function* کا نہیں، جیسے کہ تمام parameters اور body ہیں۔ + +/// + +`status_code` parameter ایک نمبر وصول کرتا ہے جس میں HTTP status code ہوتا ہے۔ + +/// info | معلومات + +`status_code` متبادل طور پر ایک `IntEnum` بھی قبول کر سکتا ہے، جیسے Python کا [`http.HTTPStatus`](https://docs.python.org/3/library/http.html#http.HTTPStatus)۔ + +/// + +یہ: + +* Response میں وہ status code واپس کرے گا۔ +* OpenAPI schema میں اسے اسی طرح document کرے گا (اور اس طرح، user interfaces میں بھی): + + + +/// note | نوٹ + +کچھ response codes (اگلا سیکشن دیکھیں) یہ ظاہر کرتے ہیں کہ response میں کوئی body نہیں ہے۔ + +FastAPI یہ جانتا ہے، اور OpenAPI docs تیار کرے گا جو بتائیں گے کہ response body نہیں ہے۔ + +/// + +## HTTP status codes کے بارے میں { #about-http-status-codes } + +/// note | نوٹ + +اگر آپ پہلے سے جانتے ہیں کہ HTTP status codes کیا ہیں تو اگلے سیکشن پر جائیں۔ + +/// + +HTTP میں، آپ response کے حصے کے طور پر 3 ہندسوں کا ایک عددی status code بھیجتے ہیں۔ + +ان status codes کا ایک نام ہوتا ہے جو انہیں پہچاننے کے لیے ہے، لیکن اہم حصہ نمبر ہے۔ + +مختصراً: + +* `100 - 199` "معلومات" کے لیے ہیں۔ آپ انہیں شاذ و نادر ہی براہ راست استعمال کرتے ہیں۔ ان status codes والے responses میں body نہیں ہو سکتا۔ +* **`200 - 299`** "کامیاب" responses کے لیے ہیں۔ آپ انہیں سب سے زیادہ استعمال کریں گے۔ + * `200` پہلے سے طے شدہ status code ہے، جس کا مطلب ہے سب کچھ "ٹھیک" تھا۔ + * ایک اور مثال `201`، "Created" ہے۔ یہ عام طور پر database میں نیا record بنانے کے بعد استعمال ہوتا ہے۔ + * ایک خاص صورت `204`، "No Content" ہے۔ یہ response تب استعمال ہوتا ہے جب client کو واپس کرنے کے لیے کوئی مواد نہ ہو، اس لیے response میں body نہیں ہونا چاہیے۔ +* **`300 - 399`** "Redirection" کے لیے ہیں۔ ان status codes والے responses میں body ہو بھی سکتا ہے اور نہیں بھی، سوائے `304`، "Not Modified" کے، جس میں body نہیں ہونا چاہیے۔ +* **`400 - 499`** "Client error" responses کے لیے ہیں۔ یہ دوسری قسم ہے جو آپ شاید سب سے زیادہ استعمال کریں گے۔ + * ایک مثال `404` ہے، "Not Found" response کے لیے۔ + * Client کی عمومی errors کے لیے آپ صرف `400` استعمال کر سکتے ہیں۔ +* `500 - 599` server errors کے لیے ہیں۔ آپ تقریباً کبھی انہیں براہ راست استعمال نہیں کرتے۔ جب آپ کے application code یا server میں کسی حصے میں کچھ غلط ہو جاتا ہے تو یہ خودکار طور پر ان میں سے ایک status code واپس کرے گا۔ + +/// tip | مشورہ + +ہر status code کے بارے میں مزید جاننے کے لیے اور کون سا code کس کے لیے ہے، [MDN documentation about HTTP status codes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status) دیکھیں۔ + +/// + +## نام یاد رکھنے کا آسان طریقہ { #shortcut-to-remember-the-names } + +آئیے پچھلی مثال دوبارہ دیکھتے ہیں: + +{* ../../docs_src/response_status_code/tutorial001_py310.py hl[6] *} + +`201` "Created" کا status code ہے۔ + +لیکن آپ کو ان میں سے ہر ایک code کا مطلب یاد رکھنے کی ضرورت نہیں۔ + +آپ `fastapi.status` سے آسان variables استعمال کر سکتے ہیں۔ + +{* ../../docs_src/response_status_code/tutorial002_py310.py hl[1,6] *} + +یہ صرف ایک سہولت ہے، ان میں وہی نمبر ہے، لیکن اس طرح آپ انہیں تلاش کرنے کے لیے editor کا autocomplete استعمال کر سکتے ہیں: + + + +/// note | تکنیکی تفصیلات + +آپ `from starlette import status` بھی استعمال کر سکتے ہیں۔ + +**FastAPI** آپ کی سہولت کے لیے وہی `starlette.status` بطور `fastapi.status` فراہم کرتا ہے۔ لیکن یہ براہ راست Starlette سے آتا ہے۔ + +/// + +## پہلے سے طے شدہ کو تبدیل کرنا { #changing-the-default } + +بعد میں، [Advanced User Guide](../advanced/response-change-status-code.md) میں، آپ دیکھیں گے کہ یہاں بیان کردہ پہلے سے طے شدہ status code سے مختلف status code کیسے واپس کیا جائے۔ diff --git a/docs/ur/docs/tutorial/schema-extra-example.md b/docs/ur/docs/tutorial/schema-extra-example.md new file mode 100644 index 000000000..b55e6c3e5 --- /dev/null +++ b/docs/ur/docs/tutorial/schema-extra-example.md @@ -0,0 +1,202 @@ +# Request Example Data Declare کریں { #declare-request-example-data } + +آپ اپنی ایپ کو موصول ہونے والے ڈیٹا کی مثالیں declare کر سکتے ہیں۔ + +یہاں ایسا کرنے کے کئی طریقے ہیں۔ + +## Pydantic models میں اضافی JSON Schema ڈیٹا { #extra-json-schema-data-in-pydantic-models } + +آپ Pydantic model کے لیے `examples` declare کر سکتے ہیں جو تیار کردہ JSON Schema میں شامل ہوں گی۔ + +{* ../../docs_src/schema_extra_example/tutorial001_py310.py hl[13:24] *} + +وہ اضافی معلومات جوں کی توں اس model کے آؤٹ پٹ **JSON Schema** میں شامل ہوں گی، اور API docs میں استعمال ہوں گی۔ + +آپ `model_config` attribute استعمال کر سکتے ہیں جو ایک `dict` لیتا ہے جیسا کہ [Pydantic کے docs: Configuration](https://docs.pydantic.dev/latest/api/config/) میں بیان ہے۔ + +آپ `"json_schema_extra"` کو ایک `dict` کے ساتھ سیٹ کر سکتے ہیں جس میں کوئی بھی اضافی ڈیٹا ہو جو آپ تیار کردہ JSON Schema میں دکھانا چاہتے ہیں، بشمول `examples`۔ + +/// tip | مشورہ + +آپ اسی تکنیک کو JSON Schema کو بڑھانے اور اپنی مرضی کی اضافی معلومات شامل کرنے کے لیے استعمال کر سکتے ہیں۔ + +مثال کے طور پر آپ اسے frontend user interface کے لیے metadata شامل کرنے وغیرہ کے لیے استعمال کر سکتے ہیں۔ + +/// + +/// info | معلومات + +OpenAPI 3.1.0 (جو FastAPI 0.99.0 سے استعمال ہو رہا ہے) نے `examples` کی سپورٹ شامل کی، جو **JSON Schema** معیار کا حصہ ہے۔ + +اس سے پہلے، یہ صرف `example` keyword کو ایک واحد مثال کے ساتھ سپورٹ کرتا تھا۔ یہ ابھی بھی OpenAPI 3.1.0 سے supported ہے، لیکن deprecated ہے اور JSON Schema معیار کا حصہ نہیں ہے۔ لہذا آپ کو `example` سے `examples` میں منتقل ہونے کی ترغیب دی جاتی ہے۔ 🤓 + +آپ اس صفحے کے آخر میں مزید پڑھ سکتے ہیں۔ + +/// + +## `Field` کے اضافی arguments { #field-additional-arguments } + +Pydantic models کے ساتھ `Field()` استعمال کرتے وقت، آپ اضافی `examples` بھی declare کر سکتے ہیں: + +{* ../../docs_src/schema_extra_example/tutorial002_py310.py hl[2,8:11] *} + +## JSON Schema - OpenAPI میں `examples` { #examples-in-json-schema-openapi } + +ان میں سے کوئی بھی استعمال کرتے وقت: + +* `Path()` +* `Query()` +* `Header()` +* `Cookie()` +* `Body()` +* `Form()` +* `File()` + +آپ اضافی معلومات کے ساتھ `examples` کا ایک گروپ بھی declare کر سکتے ہیں جو **OpenAPI** کے اندر ان کے **JSON Schemas** میں شامل ہوں گے۔ + +### `examples` کے ساتھ `Body` { #body-with-examples } + +یہاں ہم `Body()` میں متوقع ڈیٹا کی ایک مثال پر مشتمل `examples` پاس کر رہے ہیں: + +{* ../../docs_src/schema_extra_example/tutorial003_an_py310.py hl[22:29] *} + +### Docs UI میں مثال { #example-in-the-docs-ui } + +اوپر کے کسی بھی طریقے سے یہ `/docs` میں اس طرح نظر آئے گا: + + + +### متعدد `examples` کے ساتھ `Body` { #body-with-multiple-examples } + +آپ یقیناً متعدد `examples` بھی پاس کر سکتے ہیں: + +{* ../../docs_src/schema_extra_example/tutorial004_an_py310.py hl[23:38] *} + +جب آپ ایسا کریں، تو مثالیں اس body ڈیٹا کے اندرونی **JSON Schema** کا حصہ ہوں گی۔ + +تاہم، اس تحریر کے وقت، Swagger UI، جو docs UI دکھانے کا ذمہ دار ٹول ہے، **JSON Schema** میں ڈیٹا کی متعدد مثالیں دکھانے کی سپورٹ نہیں کرتا۔ لیکن ایک حل کے لیے نیچے پڑھیں۔ + +### OpenAPI-مخصوص `examples` { #openapi-specific-examples } + +**JSON Schema** نے `examples` کی سپورٹ سے پہلے ہی OpenAPI میں ایک مختلف field جس کا نام بھی `examples` تھا، کی سپورٹ موجود تھی۔ + +یہ **OpenAPI-مخصوص** `examples` OpenAPI specification کے ایک اور حصے میں جاتا ہے۔ یہ **ہر *path operation* کی تفصیلات** میں جاتا ہے، ہر JSON Schema کے اندر نہیں۔ + +اور Swagger UI نے اس مخصوص `examples` field کو کافی عرصے سے سپورٹ کیا ہے۔ تو آپ اسے docs UI میں مختلف **مثالیں دکھانے** کے لیے استعمال کر سکتے ہیں۔ + +اس OpenAPI-مخصوص field `examples` کی شکل ایک `dict` ہے جس میں **متعدد مثالیں** ہیں (`list` کی بجائے)، ہر ایک میں اضافی معلومات جو **OpenAPI** میں بھی شامل ہوں گی۔ + +یہ OpenAPI میں موجود ہر JSON Schema کے اندر نہیں جاتا، بلکہ *path operation* میں براہ راست باہر جاتا ہے۔ + +### `openapi_examples` Parameter کا استعمال { #using-the-openapi-examples-parameter } + +آپ FastAPI میں OpenAPI-مخصوص `examples` کو `openapi_examples` parameter کے ساتھ declare کر سکتے ہیں، ان کے لیے: + +* `Path()` +* `Query()` +* `Header()` +* `Cookie()` +* `Body()` +* `Form()` +* `File()` + +`dict` کی keys ہر مثال کی شناخت کرتی ہیں، اور ہر قدر ایک اور `dict` ہے۔ + +`examples` میں ہر مخصوص مثال `dict` میں یہ شامل ہو سکتا ہے: + +* `summary`: مثال کی مختصر وضاحت۔ +* `description`: ایک تفصیلی وضاحت جس میں Markdown متن ہو سکتا ہے۔ +* `value`: یہ اصل مثال ہے جو دکھائی جاتی ہے، مثلاً ایک `dict`۔ +* `externalValue`: `value` کا متبادل، مثال کی طرف اشارہ کرنے والا URL۔ اگرچہ یہ شاید اتنے ٹولز سے supported نہ ہو جتنا `value` ہے۔ + +آپ اسے اس طرح استعمال کر سکتے ہیں: + +{* ../../docs_src/schema_extra_example/tutorial005_an_py310.py hl[23:49] *} + +### Docs UI میں OpenAPI مثالیں { #openapi-examples-in-the-docs-ui } + +`Body()` میں `openapi_examples` شامل کرنے سے `/docs` اس طرح نظر آئے گا: + + + +## تکنیکی تفصیلات { #technical-details } + +/// tip | مشورہ + +اگر آپ پہلے سے **FastAPI** version **0.99.0 یا اس سے اوپر** استعمال کر رہے ہیں، تو شاید آپ ان تفصیلات کو **چھوڑ** سکتے ہیں۔ + +یہ پرانے versions کے لیے زیادہ متعلقہ ہیں، جب OpenAPI 3.1.0 دستیاب نہیں تھا۔ + +آپ اسے OpenAPI اور JSON Schema کی ایک مختصر **تاریخ کا سبق** سمجھ سکتے ہیں۔ 🤓 + +/// + +/// warning | انتباہ + +یہ **JSON Schema** اور **OpenAPI** معیارات کے بارے میں بہت تکنیکی تفصیلات ہیں۔ + +اگر اوپر بیان کیے گئے خیالات آپ کے لیے پہلے سے کام کر رہے ہیں، تو یہ کافی ہو سکتا ہے، اور شاید آپ کو ان تفصیلات کی ضرورت نہ ہو، بلا جھجک انہیں چھوڑ دیں۔ + +/// + +OpenAPI 3.1.0 سے پہلے، OpenAPI **JSON Schema** کا ایک پرانا اور ترمیم شدہ ورژن استعمال کرتا تھا۔ + +JSON Schema میں `examples` نہیں تھا، اس لیے OpenAPI نے اپنے ترمیم شدہ ورژن میں اپنا `example` field شامل کیا۔ + +OpenAPI نے specification کے دوسرے حصوں میں بھی `example` اور `examples` fields شامل کیے: + +* [`Parameter Object` (specification میں)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#parameter-object) جو FastAPI کے ان میں استعمال ہوتا تھا: + * `Path()` + * `Query()` + * `Header()` + * `Cookie()` +* [`Request Body Object`، `content` field میں، `Media Type Object` پر (specification میں)](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#media-type-object) جو FastAPI کے ان میں استعمال ہوتا تھا: + * `Body()` + * `File()` + * `Form()` + +/// info | معلومات + +یہ پرانا OpenAPI-مخصوص `examples` parameter اب FastAPI `0.103.0` سے `openapi_examples` ہے۔ + +/// + +### JSON Schema کا `examples` field { #json-schemas-examples-field } + +لیکن پھر JSON Schema نے specification کے ایک نئے ورژن میں [`examples`](https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.9.5) field شامل کیا۔ + +اور پھر نیا OpenAPI 3.1.0 تازہ ترین ورژن (JSON Schema 2020-12) پر مبنی تھا جس میں یہ نیا `examples` field شامل تھا۔ + +اور اب یہ نیا `examples` field پرانے واحد (اور حسب ضرورت) `example` field پر فوقیت رکھتا ہے، جو اب deprecated ہے۔ + +JSON Schema میں یہ نیا `examples` field **صرف ایک `list`** مثالوں کی ہے، نہ کہ اضافی metadata کے ساتھ dict جیسا OpenAPI کے دوسرے مقامات پر ہے (اوپر بیان کیا گیا)۔ + +/// info | معلومات + +OpenAPI 3.1.0 ریلیز ہونے کے بعد بھی JSON Schema کے ساتھ اس نئے آسان انضمام کے ساتھ، کچھ عرصے تک Swagger UI، جو خودکار docs فراہم کرنے والا ٹول ہے، OpenAPI 3.1.0 سپورٹ نہیں کرتا تھا (یہ version 5.0.0 سے سپورٹ کرتا ہے 🎉)۔ + +اسی وجہ سے، 0.99.0 سے پہلے کے FastAPI versions ابھی بھی 3.1.0 سے نچلے OpenAPI versions استعمال کرتے تھے۔ + +/// + +### Pydantic اور FastAPI `examples` { #pydantic-and-fastapi-examples } + +جب آپ Pydantic model کے اندر `examples` شامل کرتے ہیں، `schema_extra` یا `Field(examples=["something"])` استعمال کر کے، تو وہ مثال اس Pydantic model کے **JSON Schema** میں شامل ہو جاتی ہے۔ + +اور وہ Pydantic model کا **JSON Schema** آپ کی API کے **OpenAPI** میں شامل ہوتا ہے، اور پھر docs UI میں استعمال ہوتا ہے۔ + +0.99.0 سے پہلے کے FastAPI versions میں (0.99.0 اور اس سے اوپر نئے OpenAPI 3.1.0 استعمال کرتے ہیں) جب آپ کسی دوسری utilities (`Query()`، `Body()` وغیرہ) کے ساتھ `example` یا `examples` استعمال کرتے تھے تو وہ مثالیں JSON Schema میں شامل نہیں ہوتی تھیں جو اس ڈیٹا کو بیان کرتا ہے (نہ ہی OpenAPI کے اپنے JSON Schema ورژن میں)، بلکہ وہ OpenAPI میں *path operation* declaration میں براہ راست شامل ہوتی تھیں (JSON Schema استعمال کرنے والے OpenAPI حصوں سے باہر)۔ + +لیکن اب جب FastAPI 0.99.0 اور اس سے اوپر OpenAPI 3.1.0 استعمال کرتا ہے، جو JSON Schema 2020-12 استعمال کرتا ہے، اور Swagger UI 5.0.0 اور اس سے اوپر، سب کچھ زیادہ مستقل ہے اور مثالیں JSON Schema میں شامل ہیں۔ + +### Swagger UI اور OpenAPI-مخصوص `examples` { #swagger-ui-and-openapi-specific-examples } + +اب، چونکہ Swagger UI متعدد JSON Schema مثالیں سپورٹ نہیں کرتا تھا (2023-08-26 تک)، صارفین کے پاس docs میں متعدد مثالیں دکھانے کا کوئی طریقہ نہیں تھا۔ + +اسے حل کرنے کے لیے، FastAPI `0.103.0` نے نئے parameter `openapi_examples` کے ساتھ اسی پرانے **OpenAPI-مخصوص** `examples` field کو declare کرنے کی **سپورٹ شامل** کی۔ 🤓 + +### خلاصہ { #summary } + +میں کہا کرتا تھا کہ مجھے تاریخ زیادہ پسند نہیں... اور دیکھیں اب میں "ٹیک تاریخ" کے سبق دے رہا ہوں۔ 😅 + +مختصراً، **FastAPI 0.99.0 یا اس سے اوپر اپ گریڈ کریں**، اور چیزیں بہت **آسان، مستقل، اور بدیہی** ہیں، اور آپ کو یہ تمام تاریخی تفصیلات جاننے کی ضرورت نہیں ہے۔ 😎 diff --git a/docs/ur/docs/tutorial/security/first-steps.md b/docs/ur/docs/tutorial/security/first-steps.md new file mode 100644 index 000000000..2a64177a9 --- /dev/null +++ b/docs/ur/docs/tutorial/security/first-steps.md @@ -0,0 +1,203 @@ +# Security - پہلے قدم { #security-first-steps } + +آئیے تصور کریں کہ آپ کی **backend** API کسی domain پر ہے۔ + +اور آپ کا **frontend** کسی اور domain پر یا اسی domain کے کسی مختلف path پر ہے (یا کسی mobile application میں)۔ + +اور آپ چاہتے ہیں کہ frontend، backend کے ساتھ **username** اور **password** استعمال کرتے ہوئے authenticate کر سکے۔ + +ہم **FastAPI** کے ساتھ **OAuth2** استعمال کرکے یہ بنا سکتے ہیں۔ + +لیکن آئیے آپ کا وقت بچاتے ہیں کہ آپ کو پوری لمبی specification پڑھنے کی ضرورت نہ پڑے صرف ان چھوٹی سی معلومات کے لیے جو آپ کو چاہئیں۔ + +آئیے **FastAPI** کی طرف سے فراہم کردہ tools استعمال کرتے ہیں security کو سنبھالنے کے لیے۔ + +## یہ کیسا دکھتا ہے { #how-it-looks } + +آئیے پہلے صرف code استعمال کریں اور دیکھیں کہ یہ کیسے کام کرتا ہے، اور پھر ہم واپس آ کر سمجھیں گے کہ کیا ہو رہا ہے۔ + +## `main.py` بنائیں { #create-main-py } + +مثال کو ایک فائل `main.py` میں کاپی کریں: + +{* ../../docs_src/security/tutorial001_an_py310.py *} + +## اسے چلائیں { #run-it } + +/// info | معلومات + +[`python-multipart`](https://github.com/Kludex/python-multipart) package خودکار طور پر **FastAPI** کے ساتھ install ہو جاتا ہے جب آپ `pip install "fastapi[standard]"` command چلاتے ہیں۔ + +تاہم، اگر آپ `pip install fastapi` command استعمال کرتے ہیں، تو `python-multipart` package بطور default شامل نہیں ہوتا۔ + +اسے دستی طور پر install کرنے کے لیے، یقینی بنائیں کہ آپ ایک [virtual environment](../../virtual-environments.md) بنائیں، اسے activate کریں، اور پھر اسے install کریں: + +```console +$ pip install python-multipart +``` + +یہ اس لیے ہے کیونکہ **OAuth2** `username` اور `password` بھیجنے کے لیے "form data" استعمال کرتا ہے۔ + +/// + +مثال کو اس طرح چلائیں: + +
+ +```console +$ fastapi dev + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +## اسے چیک کریں { #check-it } + +Interactive docs پر جائیں: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)۔ + +آپ کو کچھ ایسا نظر آئے گا: + + + +/// check | Authorize بٹن! + +آپ کے پاس پہلے سے ایک چمکدار نیا "Authorize" بٹن ہے۔ + +اور آپ کے *path operation* میں اوپر دائیں کونے میں ایک چھوٹا سا تالے کا نشان ہے جس پر آپ کلک کر سکتے ہیں۔ + +/// + +اور اگر آپ اس پر کلک کریں، تو آپ کو ایک چھوٹا سا authorization فارم ملے گا جس میں `username` اور `password` (اور دیگر اختیاری فیلڈز) ٹائپ کر سکتے ہیں: + + + +/// note | نوٹ + +اس سے کوئی فرق نہیں پڑتا کہ آپ فارم میں کیا ٹائپ کریں، یہ ابھی کام نہیں کرے گا۔ لیکن ہم وہاں پہنچ جائیں گے۔ + +/// + +یہ یقیناً حتمی صارفین کے لیے frontend نہیں ہے، لیکن یہ آپ کی پوری API کو interactively document کرنے کے لیے ایک بہترین خودکار tool ہے۔ + +یہ frontend ٹیم استعمال کر سکتی ہے (جو آپ خود بھی ہو سکتے ہیں)۔ + +یہ third party applications اور systems استعمال کر سکتے ہیں۔ + +اور آپ خود بھی اسی application کو debug، check اور test کرنے کے لیے استعمال کر سکتے ہیں۔ + +## `password` flow { #the-password-flow } + +اب آئیے تھوڑا پیچھے جائیں اور سمجھیں کہ یہ سب کیا ہے۔ + +`password` "flow" OAuth2 میں بیان کردہ security اور authentication کو سنبھالنے کے طریقوں ("flows") میں سے ایک ہے۔ + +OAuth2 اس طرح ڈیزائن کیا گیا تھا کہ backend یا API اس server سے آزاد ہو سکے جو صارف کو authenticate کرتا ہے۔ + +لیکن اس معاملے میں، وہی **FastAPI** application API اور authentication دونوں کو سنبھالے گی۔ + +تو، آئیے اسے اس آسان نقطہ نظر سے دیکھتے ہیں: + +* صارف frontend میں `username` اور `password` ٹائپ کرتا ہے، اور `Enter` دباتا ہے۔ +* Frontend (صارف کے browser میں چل رہا) وہ `username` اور `password` ہماری API میں ایک مخصوص URL پر بھیجتا ہے (جو `tokenUrl="token"` کے ساتھ declare کیا گیا ہے)۔ +* API وہ `username` اور `password` چیک کرتی ہے، اور ایک "token" کے ساتھ جواب دیتی ہے (ہم نے ابھی تک اس میں سے کچھ بھی implement نہیں کیا)۔ + * ایک "token" بس ایک string ہے جس میں کچھ مواد ہوتا ہے جسے ہم بعد میں اس صارف کی تصدیق کے لیے استعمال کر سکتے ہیں۔ + * عام طور پر، ایک token کچھ وقت بعد expire ہونے کے لیے سیٹ کیا جاتا ہے۔ + * تو، صارف کو کسی وقت بعد دوبارہ login کرنا ہوگا۔ + * اور اگر token چوری ہو جائے، تو خطرہ کم ہے۔ یہ کسی مستقل key کی طرح نہیں جو ہمیشہ کام کرے (زیادہ تر معاملات میں)۔ +* Frontend وہ token عارضی طور پر کہیں محفوظ کرتا ہے۔ +* صارف frontend میں کلک کرتا ہے تاکہ frontend web app کے کسی اور سیکشن میں جائے۔ +* Frontend کو API سے مزید data لانا ہوتا ہے۔ + * لیکن اسے اس مخصوص endpoint کے لیے authentication کی ضرورت ہوتی ہے۔ + * تو، ہماری API کے ساتھ authenticate کرنے کے لیے، یہ ایک header `Authorization` بھیجتا ہے جس کی value `Bearer ` ہوتی ہے اور اس کے ساتھ token ہوتا ہے۔ + * اگر token میں `foobar` ہو، تو `Authorization` header کا مواد ہوگا: `Bearer foobar`۔ + +## **FastAPI** کا `OAuth2PasswordBearer` { #fastapis-oauth2passwordbearer } + +**FastAPI** مختلف سطحوں کی abstraction پر، ان security features کو implement کرنے کے لیے کئی tools فراہم کرتا ہے۔ + +اس مثال میں ہم **OAuth2** استعمال کریں گے، **Password** flow کے ساتھ، **Bearer** token استعمال کرتے ہوئے۔ ہم یہ `OAuth2PasswordBearer` class استعمال کرکے کرتے ہیں۔ + +/// info | معلومات + +"bearer" token واحد آپشن نہیں ہے۔ + +لیکن ہمارے استعمال کے لیے یہ بہترین ہے۔ + +اور زیادہ تر استعمال کے معاملات کے لیے یہ بہترین ہو سکتا ہے، جب تک کہ آپ OAuth2 ماہر نہ ہوں اور آپ کو بالکل معلوم نہ ہو کہ کوئی اور آپشن آپ کی ضروریات کے لیے بہتر ہے۔ + +اس صورت میں، **FastAPI** آپ کو اسے بنانے کے tools بھی فراہم کرتا ہے۔ + +/// + +جب ہم `OAuth2PasswordBearer` class کی ایک instance بناتے ہیں تو ہم `tokenUrl` parameter پاس کرتے ہیں۔ یہ parameter وہ URL رکھتا ہے جو client (صارف کے browser میں چل رہا frontend) token حاصل کرنے کے لیے `username` اور `password` بھیجنے کے لیے استعمال کرے گا۔ + +{* ../../docs_src/security/tutorial001_an_py310.py hl[8] *} + +/// tip | مشورہ + +یہاں `tokenUrl="token"` ایک relative URL `token` کی طرف اشارہ کرتا ہے جو ہم نے ابھی بنایا نہیں ہے۔ چونکہ یہ ایک relative URL ہے، یہ `./token` کے مساوی ہے۔ + +کیونکہ ہم relative URL استعمال کر رہے ہیں، اگر آپ کی API `https://example.com/` پر تھی، تو یہ `https://example.com/token` کی طرف اشارہ کرے گا۔ لیکن اگر آپ کی API `https://example.com/api/v1/` پر تھی، تو یہ `https://example.com/api/v1/token` کی طرف اشارہ کرے گا۔ + +Relative URL استعمال کرنا اہم ہے تاکہ آپ کی application ایک جدید استعمال کے معاملے جیسے [Behind a Proxy](../../advanced/behind-a-proxy.md) میں بھی کام کرتی رہے۔ + +/// + +یہ parameter وہ endpoint / *path operation* نہیں بناتا، بلکہ یہ declare کرتا ہے کہ URL `/token` وہ ہوگا جو client کو token حاصل کرنے کے لیے استعمال کرنا چاہیے۔ یہ معلومات OpenAPI میں، اور پھر interactive API documentation systems میں استعمال ہوتی ہیں۔ + +ہم جلد ہی اصل path operation بھی بنائیں گے۔ + +/// info | معلومات + +اگر آپ بہت سخت "Pythonista" ہیں تو آپ کو parameter کے نام `tokenUrl` کا انداز `token_url` کی بجائے ناپسند ہو سکتا ہے۔ + +یہ اس لیے ہے کیونکہ یہ وہی نام استعمال کر رہا ہے جو OpenAPI spec میں ہے۔ تاکہ اگر آپ کو ان میں سے کسی security scheme کے بارے میں مزید تحقیق کرنی ہو تو آپ اسے کاپی اور پیسٹ کرکے مزید معلومات حاصل کر سکیں۔ + +/// + +`oauth2_scheme` variable `OAuth2PasswordBearer` کی ایک instance ہے، لیکن یہ ایک "callable" بھی ہے۔ + +اسے اس طرح call کیا جا سکتا ہے: + +```Python +oauth2_scheme(some, parameters) +``` + +تو، اسے `Depends` کے ساتھ استعمال کیا جا سکتا ہے۔ + +### اسے استعمال کریں { #use-it } + +اب آپ اس `oauth2_scheme` کو `Depends` کے ساتھ ایک dependency میں پاس کر سکتے ہیں۔ + +{* ../../docs_src/security/tutorial001_an_py310.py hl[12] *} + +یہ dependency ایک `str` فراہم کرے گی جو *path operation function* کے parameter `token` کو assign ہوگی۔ + +**FastAPI** کو معلوم ہوگا کہ وہ اس dependency کو OpenAPI schema (اور خودکار API docs) میں ایک "security scheme" کی تعریف کے لیے استعمال کر سکتا ہے۔ + +/// info | تکنیکی تفصیلات + +**FastAPI** کو معلوم ہوگا کہ وہ class `OAuth2PasswordBearer` (جو ایک dependency میں declare کی گئی ہے) کو OpenAPI میں security scheme کی تعریف کے لیے استعمال کر سکتا ہے کیونکہ یہ `fastapi.security.oauth2.OAuth2` سے inherit ہوتی ہے، جو بدلے میں `fastapi.security.base.SecurityBase` سے inherit ہوتی ہے۔ + +تمام security utilities جو OpenAPI (اور خودکار API docs) کے ساتھ integrate ہوتی ہیں `SecurityBase` سے inherit ہوتی ہیں، اسی طرح **FastAPI** جانتا ہے کہ انہیں OpenAPI میں کیسے integrate کرنا ہے۔ + +/// + +## یہ کیا کرتا ہے { #what-it-does } + +یہ request میں `Authorization` header تلاش کرے گا، چیک کرے گا کہ value `Bearer ` ہے اور اس کے ساتھ کوئی token ہے، اور token کو `str` کے طور پر واپس کرے گا۔ + +اگر اسے `Authorization` header نظر نہیں آتا، یا value میں `Bearer ` token نہیں ہے، تو یہ براہ راست 401 status code error (`UNAUTHORIZED`) کے ساتھ جواب دے گا۔ + +آپ کو یہ بھی چیک کرنے کی ضرورت نہیں کہ token موجود ہے یا نہیں تاکہ error واپس کریں۔ آپ یقین رکھ سکتے ہیں کہ اگر آپ کی function execute ہوتی ہے، تو اس token میں ایک `str` ہوگی۔ + +آپ اسے interactive docs میں ابھی آزما سکتے ہیں: + + + +ہم ابھی تک token کی validity کی تصدیق نہیں کر رہے، لیکن یہ ایک شروعات ہے۔ + +## خلاصہ { #recap } + +تو، صرف 3 یا 4 اضافی لائنوں میں، آپ کے پاس پہلے سے security کی ایک بنیادی شکل موجود ہے۔ diff --git a/docs/ur/docs/tutorial/security/get-current-user.md b/docs/ur/docs/tutorial/security/get-current-user.md new file mode 100644 index 000000000..584215d2d --- /dev/null +++ b/docs/ur/docs/tutorial/security/get-current-user.md @@ -0,0 +1,105 @@ +# موجودہ صارف حاصل کریں { #get-current-user } + +پچھلے باب میں security system (جو dependency injection system پر مبنی ہے) *path operation function* کو `token` بطور `str` دے رہا تھا: + +{* ../../docs_src/security/tutorial001_an_py310.py hl[12] *} + +لیکن یہ ابھی تک اتنا کارآمد نہیں ہے۔ + +آئیے اسے ہمیں موجودہ صارف دینے کے قابل بنائیں۔ + +## ایک user model بنائیں { #create-a-user-model } + +پہلے، آئیے ایک Pydantic user model بناتے ہیں۔ + +جس طرح ہم Pydantic کو bodies declare کرنے کے لیے استعمال کرتے ہیں، ہم اسے کہیں بھی استعمال کر سکتے ہیں: + +{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:6] *} + +## ایک `get_current_user` dependency بنائیں { #create-a-get-current-user-dependency } + +آئیے ایک dependency `get_current_user` بناتے ہیں۔ + +یاد ہے کہ dependencies میں sub-dependencies ہو سکتی ہیں؟ + +`get_current_user` کے پاس وہی `oauth2_scheme` بطور dependency ہوگا جو ہم نے پہلے بنایا تھا۔ + +جس طرح ہم پہلے *path operation* میں براہ راست کر رہے تھے، ہماری نئی dependency `get_current_user` sub-dependency `oauth2_scheme` سے `token` بطور `str` وصول کرے گی: + +{* ../../docs_src/security/tutorial002_an_py310.py hl[25] *} + +## صارف حاصل کریں { #get-the-user } + +`get_current_user` ایک (جعلی) utility function استعمال کرے گا جو ہم نے بنایا ہے، جو token کو `str` کے طور پر لیتا ہے اور ہمارا Pydantic `User` model واپس کرتا ہے: + +{* ../../docs_src/security/tutorial002_an_py310.py hl[19:22,26:27] *} + +## موجودہ صارف inject کریں { #inject-the-current-user } + +تو اب ہم *path operation* میں `Depends` کے ساتھ اپنا `get_current_user` استعمال کر سکتے ہیں: + +{* ../../docs_src/security/tutorial002_an_py310.py hl[31] *} + +دھیان دیں کہ ہم نے `current_user` کی type Pydantic model `User` بیان کی ہے۔ + +یہ ہماری function کے اندر تمام completion اور type checks میں مدد کرے گا۔ + +/// tip | مشورہ + +آپ کو یاد ہوگا کہ request bodies بھی Pydantic models کے ساتھ declare کی جاتی ہیں۔ + +یہاں **FastAPI** الجھے گا نہیں کیونکہ آپ `Depends` استعمال کر رہے ہیں۔ + +/// + +/// check + +جس طرح یہ dependency system ڈیزائن کیا گیا ہے وہ ہمیں مختلف dependencies (مختلف "dependables") رکھنے کی اجازت دیتا ہے جو سب ایک `User` model واپس کرتی ہیں۔ + +ہم صرف ایک dependency تک محدود نہیں ہیں جو اس قسم کا data واپس کر سکے۔ + +/// + +## دوسرے models { #other-models } + +اب آپ موجودہ صارف کو براہ راست *path operation functions* میں حاصل کر سکتے ہیں اور security کے طریقہ کار کو **Dependency Injection** کی سطح پر، `Depends` استعمال کرتے ہوئے سنبھال سکتے ہیں۔ + +اور آپ security کی ضروریات کے لیے کوئی بھی model یا data استعمال کر سکتے ہیں (اس معاملے میں، ایک Pydantic model `User`)۔ + +لیکن آپ کسی مخصوص data model، class یا type استعمال کرنے تک محدود نہیں ہیں۔ + +کیا آپ اپنے model میں `id` اور `email` رکھنا چاہتے ہیں اور کوئی `username` نہیں چاہتے؟ ضرور۔ آپ یہی tools استعمال کر سکتے ہیں۔ + +کیا آپ صرف ایک `str` چاہتے ہیں؟ یا صرف ایک `dict`؟ یا براہ راست ایک database class model instance؟ یہ سب اسی طرح کام کرتا ہے۔ + +آپ کے پاس حقیقت میں ایسے صارف نہیں ہیں جو آپ کی application میں login کرتے ہوں بلکہ robots، bots، یا دوسرے systems ہیں، جن کے پاس صرف ایک access token ہے؟ پھر بھی، یہ سب اسی طرح کام کرتا ہے۔ + +بس اپنی application کے لیے جو بھی model، class، یا database آپ کو درکار ہو استعمال کریں۔ **FastAPI** dependency injection system کے ساتھ آپ کا ساتھ دیتا ہے۔ + +## Code کا سائز { #code-size } + +یہ مثال طویل لگ سکتی ہے۔ یاد رکھیں کہ ہم security، data models، utility functions اور *path operations* کو ایک ہی فائل میں ملا رہے ہیں۔ + +لیکن یہاں اہم نکتہ یہ ہے۔ + +Security اور dependency injection کا کام ایک بار لکھا جاتا ہے۔ + +اور آپ اسے جتنا پیچیدہ چاہیں بنا سکتے ہیں۔ اور پھر بھی، یہ صرف ایک بار، ایک ہی جگہ لکھا جاتا ہے۔ تمام لچک کے ساتھ۔ + +لیکن آپ کے پاس ہزاروں endpoints (*path operations*) ہو سکتے ہیں جو اسی security system کو استعمال کریں۔ + +اور ان سب (یا ان کا جو بھی حصہ آپ چاہیں) ان dependencies یا آپ کی بنائی ہوئی کسی بھی اور dependency کو دوبارہ استعمال کرنے کا فائدہ اٹھا سکتے ہیں۔ + +اور یہ سب ہزاروں *path operations* صرف 3 لائنوں جتنی چھوٹی ہو سکتی ہیں: + +{* ../../docs_src/security/tutorial002_an_py310.py hl[30:32] *} + +## خلاصہ { #recap } + +اب آپ موجودہ صارف کو براہ راست اپنی *path operation function* میں حاصل کر سکتے ہیں۔ + +ہم پہلے سے آدھے راستے پر ہیں۔ + +ہمیں بس ایک *path operation* شامل کرنے کی ضرورت ہے تاکہ صارف/client حقیقت میں `username` اور `password` بھیج سکے۔ + +یہ اگلے باب میں آتا ہے۔ diff --git a/docs/ur/docs/tutorial/security/index.md b/docs/ur/docs/tutorial/security/index.md new file mode 100644 index 000000000..594fe862c --- /dev/null +++ b/docs/ur/docs/tutorial/security/index.md @@ -0,0 +1,106 @@ +# Security { #security } + +Security، authentication اور authorization کو سنبھالنے کے بہت سے طریقے ہیں۔ + +اور یہ عام طور پر ایک پیچیدہ اور "مشکل" موضوع ہوتا ہے۔ + +بہت سے frameworks اور systems میں صرف security اور authentication کو سنبھالنے میں بہت زیادہ محنت اور code لگتا ہے (بہت سے معاملات میں یہ لکھے گئے کل code کا 50% یا اس سے زیادہ ہو سکتا ہے)۔ + +**FastAPI** آپ کو **Security** کو آسانی سے، تیزی سے، ایک معیاری طریقے سے سنبھالنے میں مدد کرنے کے لیے کئی tools فراہم کرتا ہے، بغیر اس کے کہ آپ کو تمام security specifications کا مطالعہ اور سیکھنا پڑے۔ + +لیکن پہلے، آئیے کچھ چھوٹے تصورات کو سمجھتے ہیں۔ + +## جلدی میں ہیں؟ { #in-a-hurry } + +اگر آپ کو ان میں سے کسی بھی اصطلاح سے کوئی سروکار نہیں اور آپ کو صرف username اور password پر مبنی authentication کے ساتھ security ابھی شامل کرنی ہے، تو اگلے ابواب پر چلے جائیں۔ + +## OAuth2 { #oauth2 } + +OAuth2 ایک specification ہے جو authentication اور authorization کو سنبھالنے کے کئی طریقے بیان کرتی ہے۔ + +یہ کافی وسیع specification ہے اور کئی پیچیدہ استعمال کے معاملات کا احاطہ کرتی ہے۔ + +اس میں "third party" کا استعمال کرتے ہوئے authenticate کرنے کے طریقے شامل ہیں۔ + +یہی وہ چیز ہے جو "Facebook، Google، X (Twitter)، GitHub سے login کریں" والے تمام systems اندرونی طور پر استعمال کرتے ہیں۔ + +### OAuth 1 { #oauth-1 } + +ایک OAuth 1 بھی تھا، جو OAuth2 سے بہت مختلف اور زیادہ پیچیدہ ہے، کیونکہ اس میں communication کو encrypt کرنے کے طریقے کی براہ راست specifications شامل تھیں۔ + +یہ آج کل زیادہ مقبول یا استعمال نہیں ہوتا۔ + +OAuth2 communication کو encrypt کرنے کا طریقہ متعین نہیں کرتا، یہ توقع کرتا ہے کہ آپ کی application HTTPS کے ساتھ سرو ہو رہی ہو۔ + +/// tip | مشورہ + +**deployment** کے سیکشن میں آپ دیکھیں گے کہ Traefik اور Let's Encrypt کا استعمال کرتے ہوئے مفت میں HTTPS کیسے سیٹ اپ کریں۔ + +/// + +## OpenID Connect { #openid-connect } + +OpenID Connect ایک اور specification ہے، جو **OAuth2** پر مبنی ہے۔ + +یہ OAuth2 کو بس اتنا بڑھاتی ہے کہ OAuth2 میں جو چیزیں نسبتاً مبہم ہیں انہیں متعین کرتی ہے، تاکہ اسے زیادہ interoperable بنایا جا سکے۔ + +مثال کے طور پر، Google login OpenID Connect استعمال کرتا ہے (جو اندرونی طور پر OAuth2 استعمال کرتا ہے)۔ + +لیکن Facebook login OpenID Connect کو سپورٹ نہیں کرتا۔ اس کا OAuth2 کا اپنا انداز ہے۔ + +### OpenID ("OpenID Connect" نہیں) { #openid-not-openid-connect } + +ایک "OpenID" specification بھی تھی۔ اس نے **OpenID Connect** جیسا ہی مسئلہ حل کرنے کی کوشش کی، لیکن OAuth2 پر مبنی نہیں تھی۔ + +لہذا، یہ ایک مکمل الگ system تھا۔ + +یہ آج کل زیادہ مقبول یا استعمال نہیں ہوتا۔ + +## OpenAPI { #openapi } + +OpenAPI (پہلے Swagger کے نام سے جانا جاتا تھا) APIs بنانے کے لیے ایک open specification ہے (اب Linux Foundation کا حصہ ہے)۔ + +**FastAPI** **OpenAPI** پر مبنی ہے۔ + +یہی وہ چیز ہے جو متعدد خودکار interactive documentation interfaces، code generation وغیرہ کو ممکن بناتی ہے۔ + +OpenAPI متعدد security "schemes" کی تعریف کرنے کا ایک طریقہ رکھتا ہے۔ + +انہیں استعمال کرکے، آپ ان تمام معیار پر مبنی tools کا فائدہ اٹھا سکتے ہیں، بشمول یہ interactive documentation systems۔ + +OpenAPI درج ذیل security schemes کی تعریف کرتا ہے: + +* `apiKey`: ایک application مخصوص key جو آ سکتی ہے: + * ایک query parameter سے۔ + * ایک header سے۔ + * ایک cookie سے۔ +* `http`: معیاری HTTP authentication systems، بشمول: + * `bearer`: ایک header `Authorization` جس کی value `Bearer ` ہو اور اس کے ساتھ ایک token ہو۔ یہ OAuth2 سے وراثت میں ملا ہے۔ + * HTTP Basic authentication۔ + * HTTP Digest، وغیرہ۔ +* `oauth2`: security کو سنبھالنے کے تمام OAuth2 طریقے (جنہیں "flows" کہتے ہیں)۔ + * ان میں سے کئی flows OAuth 2.0 authentication provider بنانے کے لیے موزوں ہیں (جیسے Google، Facebook، X (Twitter)، GitHub، وغیرہ): + * `implicit` + * `clientCredentials` + * `authorizationCode` + * لیکن ایک مخصوص "flow" ہے جو براہ راست اسی application میں authentication کو سنبھالنے کے لیے بالکل درست استعمال ہو سکتا ہے: + * `password`: آنے والے کچھ ابواب میں اس کی مثالیں دی جائیں گی۔ +* `openIdConnect`: OAuth2 authentication data کو خودکار طور پر دریافت کرنے کا طریقہ بیان کرتا ہے۔ + * یہ خودکار دریافت OpenID Connect specification میں متعین ہے۔ + + +/// tip | مشورہ + +Google، Facebook، X (Twitter)، GitHub وغیرہ جیسے دوسرے authentication/authorization providers کو integrate کرنا بھی ممکن اور نسبتاً آسان ہے۔ + +سب سے پیچیدہ مسئلہ ان جیسا authentication/authorization provider بنانا ہے، لیکن **FastAPI** آپ کو یہ آسانی سے کرنے کے tools دیتا ہے، جبکہ بھاری کام آپ کے لیے خود کرتا ہے۔ + +/// + +## **FastAPI** utilities { #fastapi-utilities } + +FastAPI ان میں سے ہر security scheme کے لیے `fastapi.security` module میں کئی tools فراہم کرتا ہے جو ان security mechanisms کو استعمال کرنا آسان بناتے ہیں۔ + +آنے والے ابواب میں آپ دیکھیں گے کہ **FastAPI** کی طرف سے فراہم کردہ ان tools کا استعمال کرتے ہوئے اپنی API میں security کیسے شامل کریں۔ + +اور آپ یہ بھی دیکھیں گے کہ یہ خودکار طور پر interactive documentation system میں کیسے شامل ہو جاتی ہے۔ diff --git a/docs/ur/docs/tutorial/security/oauth2-jwt.md b/docs/ur/docs/tutorial/security/oauth2-jwt.md new file mode 100644 index 000000000..50b86d49f --- /dev/null +++ b/docs/ur/docs/tutorial/security/oauth2-jwt.md @@ -0,0 +1,277 @@ +# Password (اور hashing) کے ساتھ OAuth2، JWT tokens کے ساتھ Bearer { #oauth2-with-password-and-hashing-bearer-with-jwt-tokens } + +اب جبکہ ہمارے پاس پورا security flow ہے، آئیے JWT tokens اور محفوظ password hashing استعمال کرکے application کو حقیقتاً محفوظ بنائیں۔ + +یہ code وہ ہے جو آپ حقیقت میں اپنی application میں استعمال کر سکتے ہیں، password hashes اپنے database میں محفوظ کر سکتے ہیں، وغیرہ۔ + +ہم وہاں سے شروع کریں گے جہاں ہم نے پچھلے باب میں چھوڑا تھا اور اسے بڑھائیں گے۔ + +## JWT کے بارے میں { #about-jwt } + +JWT کا مطلب ہے "JSON Web Tokens"۔ + +یہ ایک JSON object کو ایک لمبی گھنی string میں بغیر خالی جگہوں کے encode کرنے کا معیار ہے۔ یہ کچھ ایسا دکھتا ہے: + +``` +eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c +``` + +یہ encrypted نہیں ہے، تو کوئی بھی مواد سے معلومات حاصل کر سکتا ہے۔ + +لیکن یہ signed ہے۔ تو، جب آپ کو وہ token ملے جو آپ نے جاری کیا تھا، آپ تصدیق کر سکتے ہیں کہ آپ نے واقعی اسے جاری کیا تھا۔ + +اس طرح، آپ مثلاً 1 ہفتے کی expiration کے ساتھ token بنا سکتے ہیں۔ اور پھر جب صارف اگلے دن token کے ساتھ واپس آئے، تو آپ جانتے ہیں کہ وہ صارف ابھی بھی آپ کے system میں logged in ہے۔ + +ایک ہفتے کے بعد، token expire ہو جائے گا اور صارف authorized نہیں ہوگا اور اسے نیا token حاصل کرنے کے لیے دوبارہ sign in کرنا ہوگا۔ اور اگر صارف (یا کسی third party) نے expiration تبدیل کرنے کے لیے token میں ترمیم کرنے کی کوشش کی، تو آپ اسے دریافت کر سکیں گے، کیونکہ signatures میل نہیں کھائیں گے۔ + +اگر آپ JWT tokens کے ساتھ کھیلنا اور دیکھنا چاہتے ہیں کہ یہ کیسے کام کرتے ہیں، تو [https://jwt.io](https://jwt.io/) دیکھیں۔ + +## `PyJWT` install کریں { #install-pyjwt } + +ہمیں Python میں JWT tokens بنانے اور تصدیق کرنے کے لیے `PyJWT` install کرنا ہوگا۔ + +یقینی بنائیں کہ آپ ایک [virtual environment](../../virtual-environments.md) بنائیں، اسے activate کریں، اور پھر `pyjwt` install کریں: + +
+ +```console +$ pip install pyjwt + +---> 100% +``` + +
+ +/// info | معلومات + +اگر آپ RSA یا ECDSA جیسے digital signature algorithms استعمال کرنے کا ارادہ رکھتے ہیں، تو آپ کو cryptography library dependency `pyjwt[crypto]` install کرنی چاہیے۔ + +آپ اس کے بارے میں مزید [PyJWT Installation docs](https://pyjwt.readthedocs.io/en/latest/installation.html) میں پڑھ سکتے ہیں۔ + +/// + +## Password hashing { #password-hashing } + +"Hashing" کا مطلب ہے کسی مواد (اس معاملے میں password) کو bytes کی ایک ترتیب (بس ایک string) میں تبدیل کرنا جو بے معنی سی لگتی ہے۔ + +جب بھی آپ بالکل وہی مواد (بالکل وہی password) دیں گے، آپ کو بالکل وہی بے معنی نتیجہ ملے گا۔ + +لیکن آپ اس بے معنی نتیجے سے واپس password حاصل نہیں کر سکتے۔ + +### Password hashing کیوں استعمال کریں { #why-use-password-hashing } + +اگر آپ کا database چوری ہو جائے، تو چور کے پاس آپ کے صارفین کے سادہ متن کے passwords نہیں ہوں گے، صرف hashes ہوں گے۔ + +تو، چور اس password کو کسی اور system میں استعمال نہیں کر سکے گا (چونکہ بہت سے صارف ہر جگہ ایک ہی password استعمال کرتے ہیں، یہ خطرناک ہوتا)۔ + +## `pwdlib` install کریں { #install-pwdlib } + +pwdlib password hashes کو سنبھالنے کے لیے ایک بہترین Python package ہے۔ + +یہ بہت سے محفوظ hashing algorithms اور ان کے ساتھ کام کرنے کی utilities کو سپورٹ کرتا ہے۔ + +تجویز کردہ algorithm "Argon2" ہے۔ + +یقینی بنائیں کہ آپ ایک [virtual environment](../../virtual-environments.md) بنائیں، اسے activate کریں، اور پھر Argon2 کے ساتھ pwdlib install کریں: + +
+ +```console +$ pip install "pwdlib[argon2]" + +---> 100% +``` + +
+ +/// tip | مشورہ + +`pwdlib` کے ساتھ، آپ اسے **Django**، **Flask** security plug-in یا بہت سے دوسروں کی طرف سے بنائے گئے passwords پڑھنے کے قابل بھی بنا سکتے ہیں۔ + +تو، آپ مثال کے طور پر Django application سے database میں وہی data FastAPI application کے ساتھ شیئر کر سکتے ہیں۔ یا آسانی سے Django application کو اسی database کا استعمال کرتے ہوئے منتقل کر سکتے ہیں۔ + +اور آپ کے صارف آپ کی Django app یا آپ کی **FastAPI** app سے بیک وقت login کر سکیں گے۔ + +/// + +## Passwords کو hash اور verify کریں { #hash-and-verify-the-passwords } + +`pwdlib` سے درکار tools import کریں۔ + +تجویز کردہ settings کے ساتھ ایک PasswordHash instance بنائیں - یہ passwords کو hash اور verify کرنے کے لیے استعمال ہوگا۔ + +/// tip | مشورہ + +pwdlib bcrypt hashing algorithm کو بھی سپورٹ کرتا ہے لیکن legacy algorithms شامل نہیں کرتا - پرانے hashes کے ساتھ کام کرنے کے لیے passlib library استعمال کرنے کی سفارش کی جاتی ہے۔ + +مثال کے طور پر، آپ اسے کسی اور system (جیسے Django) کی طرف سے بنائے گئے passwords پڑھنے اور verify کرنے کے لیے استعمال کر سکتے ہیں لیکن نئے passwords کو Argon2 یا Bcrypt جیسے مختلف algorithm سے hash کر سکتے ہیں۔ + +اور ان سب کے ساتھ بیک وقت مطابقت پذیر رہ سکتے ہیں۔ + +/// + +صارف سے آنے والے password کو hash کرنے کے لیے ایک utility function بنائیں۔ + +اور ایک اور موصول ہونے والے password کی تصدیق کرنے کے لیے کہ آیا یہ محفوظ hash سے ملتا ہے۔ + +اور ایک اور صارف کو authenticate کرنے اور واپس کرنے کے لیے۔ + +{* ../../docs_src/security/tutorial004_an_py310.py hl[8,49,51,58:59,62:63,72:79] *} + +جب `authenticate_user` کو ایسے username کے ساتھ call کیا جاتا ہے جو database میں موجود نہیں ہے، تو ہم پھر بھی ایک dummy hash کے خلاف `verify_password` چلاتے ہیں۔ + +یہ اس بات کو یقینی بناتا ہے کہ endpoint کو جواب دینے میں تقریباً اتنا ہی وقت لگے چاہے username درست ہو یا نہ ہو، **timing attacks** کو روکتا ہے جو موجود usernames کی شناخت کے لیے استعمال ہو سکتے ہیں۔ + +/// note | نوٹ + +اگر آپ نیا (جعلی) database `fake_users_db` چیک کریں، تو آپ دیکھیں گے کہ hashed password اب کیسا دکھتا ہے: `"$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc"`۔ + +/// + +## JWT tokens کو سنبھالیں { #handle-jwt-tokens } + +Install شدہ modules import کریں۔ + +ایک random secret key بنائیں جو JWT tokens پر sign کرنے کے لیے استعمال ہوگی۔ + +محفوظ random secret key بنانے کے لیے یہ command استعمال کریں: + +
+ +```console +$ openssl rand -hex 32 + +09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7 +``` + +
+ +اور output کو variable `SECRET_KEY` میں کاپی کریں (مثال والی key استعمال نہ کریں)۔ + +ایک variable `ALGORITHM` بنائیں جس میں JWT token پر sign کرنے کے لیے استعمال ہونے والا algorithm ہو اور اسے `"HS256"` پر سیٹ کریں۔ + +Token کی expiration کے لیے ایک variable بنائیں۔ + +ایک Pydantic Model بیان کریں جو token endpoint میں response کے لیے استعمال ہوگا۔ + +نیا access token بنانے کے لیے ایک utility function بنائیں۔ + +{* ../../docs_src/security/tutorial004_an_py310.py hl[4,7,13:15,29:31,82:90] *} + +## Dependencies کو اپ ڈیٹ کریں { #update-the-dependencies } + +`get_current_user` کو اپ ڈیٹ کریں تاکہ پہلے کی طرح وہی token وصول کرے، لیکن اس بار JWT tokens استعمال کرتے ہوئے۔ + +موصول ہونے والے token کو decode کریں، اس کی تصدیق کریں، اور موجودہ صارف واپس کریں۔ + +اگر token غلط ہے، تو فوری طور پر HTTP error واپس کریں۔ + +{* ../../docs_src/security/tutorial004_an_py310.py hl[93:110] *} + +## `/token` *path operation* کو اپ ڈیٹ کریں { #update-the-token-path-operation } + +Token کی expiration وقت کے ساتھ ایک `timedelta` بنائیں۔ + +ایک حقیقی JWT access token بنائیں اور اسے واپس کریں۔ + +{* ../../docs_src/security/tutorial004_an_py310.py hl[121:136] *} + +### JWT "subject" `sub` کے بارے میں تکنیکی تفصیلات { #technical-details-about-the-jwt-subject-sub } + +JWT specification کہتی ہے کہ ایک key `sub` ہے، جس میں token کا subject ہوتا ہے۔ + +اسے استعمال کرنا اختیاری ہے، لیکن یہ وہ جگہ ہے جہاں آپ صارف کی شناخت رکھیں گے، اس لیے ہم اسے یہاں استعمال کر رہے ہیں۔ + +JWT صارف کی شناخت اور انہیں آپ کی API پر براہ راست operations انجام دینے کی اجازت دینے کے علاوہ دوسرے کاموں کے لیے بھی استعمال ہو سکتا ہے۔ + +مثال کے طور پر، آپ ایک "car" یا "blog post" کی شناخت کر سکتے ہیں۔ + +پھر آپ اس entity کے بارے میں permissions شامل کر سکتے ہیں، جیسے "drive" (car کے لیے) یا "edit" (blog post کے لیے)۔ + +اور پھر، آپ وہ JWT token کسی صارف (یا bot) کو دے سکتے ہیں، اور وہ ان actions کو انجام دینے کے لیے استعمال کر سکتے ہیں (car چلانا، یا blog post میں ترمیم کرنا) بغیر account رکھے، صرف اس JWT token کے ساتھ جو آپ کی API نے بنایا ہے۔ + +ان خیالات کا استعمال کرتے ہوئے، JWT بہت زیادہ نفیس منظرناموں کے لیے استعمال ہو سکتا ہے۔ + +ان معاملات میں، ان میں سے کئی entities کا ایک ہی ID ہو سکتا ہے، مثلاً `foo` (ایک صارف `foo`، ایک car `foo`، اور ایک blog post `foo`)۔ + +تو، ID کے ٹکراؤ سے بچنے کے لیے، JWT token بناتے وقت صارف کے لیے، آپ `sub` key کی value میں prefix لگا سکتے ہیں، مثلاً `username:` کے ساتھ۔ تو، اس مثال میں، `sub` کی value ہو سکتی تھی: `username:johndoe`۔ + +یاد رکھنے کی اہم بات یہ ہے کہ `sub` key کے پاس پوری application میں ایک منفرد شناخت کنندہ ہونا چاہیے، اور یہ ایک string ہونی چاہیے۔ + +## اسے چیک کریں { #check-it } + +Server چلائیں اور docs پر جائیں: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)۔ + +آپ کو اس طرح کا user interface نظر آئے گا: + + + +Application کو پہلے کی طرح authorize کریں۔ + +یہ credentials استعمال کریں: + +Username: `johndoe` +Password: `secret` + +/// check | اضافی معلومات + +دھیان دیں کہ code میں کہیں بھی سادہ متن کا password "`secret`" نہیں ہے، ہمارے پاس صرف hashed version ہے۔ + +/// + + + +Endpoint `/users/me/` call کریں، آپ کو یہ response ملے گا: + +```JSON +{ + "username": "johndoe", + "email": "johndoe@example.com", + "full_name": "John Doe", + "disabled": false +} +``` + + + +اگر آپ developer tools کھولیں، تو آپ دیکھ سکتے ہیں کہ بھیجا گیا data صرف token پر مشتمل ہے، password صرف پہلی request میں بھیجا جاتا ہے تاکہ صارف کو authenticate کیا جائے اور وہ access token حاصل کیا جائے، لیکن اس کے بعد نہیں: + + + +/// note | نوٹ + +`Authorization` header کو دیکھیں، جس کی value `Bearer ` سے شروع ہوتی ہے۔ + +/// + +## `scopes` کے ساتھ جدید استعمال { #advanced-usage-with-scopes } + +OAuth2 میں "scopes" کا تصور ہے۔ + +آپ انہیں JWT token میں permissions کا ایک مخصوص مجموعہ شامل کرنے کے لیے استعمال کر سکتے ہیں۔ + +پھر آپ یہ token کسی صارف کو براہ راست یا کسی third party کو دے سکتے ہیں، تاکہ وہ آپ کی API کے ساتھ پابندیوں کے ایک مجموعے کے ساتھ تعامل کر سکے۔ + +آپ **Advanced User Guide** میں بعد میں سیکھ سکتے ہیں کہ انہیں کیسے استعمال کریں اور یہ **FastAPI** میں کیسے integrated ہیں۔ + +## خلاصہ { #recap } + +جو آپ نے اب تک دیکھا ہے اس سے، آپ OAuth2 اور JWT جیسے معیارات کا استعمال کرتے ہوئے ایک محفوظ **FastAPI** application ترتیب دے سکتے ہیں۔ + +تقریباً ہر framework میں security کو سنبھالنا بہت جلد ایک پیچیدہ موضوع بن جاتا ہے۔ + +بہت سے packages جو اسے بہت آسان بناتے ہیں انہیں data model، database، اور دستیاب features کے ساتھ بہت سے سمجھوتے کرنے پڑتے ہیں۔ اور ان میں سے کچھ packages جو چیزوں کو بہت زیادہ آسان بنا دیتے ہیں ان میں حقیقت میں اندرونی طور پر security کی خامیاں ہوتی ہیں۔ + +--- + +**FastAPI** کسی بھی database، data model یا tool کے ساتھ کوئی سمجھوتا نہیں کرتا۔ + +یہ آپ کو پوری لچک دیتا ہے کہ آپ وہ چنیں جو آپ کے پروجیکٹ کے لیے بہترین ہوں۔ + +اور آپ بہت سے اچھی طرح سے برقرار رکھے جانے والے اور وسیع پیمانے پر استعمال ہونے والے packages جیسے `pwdlib` اور `PyJWT` براہ راست استعمال کر سکتے ہیں، کیونکہ **FastAPI** بیرونی packages کو integrate کرنے کے لیے کسی پیچیدہ طریقہ کار کی ضرورت نہیں رکھتا۔ + +لیکن یہ آپ کو لچک، مضبوطی، یا security سے سمجھوتہ کیے بغیر عمل کو زیادہ سے زیادہ آسان بنانے کے tools فراہم کرتا ہے۔ + +اور آپ OAuth2 جیسے محفوظ، معیاری protocols کو نسبتاً آسان طریقے سے استعمال اور implement کر سکتے ہیں۔ + +آپ **Advanced User Guide** میں مزید سیکھ سکتے ہیں کہ OAuth2 "scopes" کو کیسے استعمال کریں، مزید باریک بینی سے permissions کے نظام کے لیے، انہی معیارات کی پیروی کرتے ہوئے۔ OAuth2 with scopes وہ طریقہ کار ہے جو بہت سے بڑے authentication providers، جیسے Facebook، Google، GitHub، Microsoft، X (Twitter) وغیرہ، اپنے صارفین کی جانب سے third party applications کو اپنی APIs کے ساتھ تعامل کرنے کی اجازت دینے کے لیے استعمال کرتے ہیں۔ diff --git a/docs/ur/docs/tutorial/security/simple-oauth2.md b/docs/ur/docs/tutorial/security/simple-oauth2.md new file mode 100644 index 000000000..6aa4374c3 --- /dev/null +++ b/docs/ur/docs/tutorial/security/simple-oauth2.md @@ -0,0 +1,289 @@ +# Password اور Bearer کے ساتھ سادہ OAuth2 { #simple-oauth2-with-password-and-bearer } + +اب آئیے پچھلے باب سے آگے بڑھتے ہیں اور مکمل security flow کے لیے باقی حصے شامل کرتے ہیں۔ + +## `username` اور `password` حاصل کریں { #get-the-username-and-password } + +ہم `username` اور `password` حاصل کرنے کے لیے **FastAPI** security utilities استعمال کریں گے۔ + +OAuth2 متعین کرتا ہے کہ "password flow" (جو ہم استعمال کر رہے ہیں) استعمال کرتے وقت client/صارف کو `username` اور `password` فیلڈز بطور form data بھیجنے ہوں گے۔ + +اور spec کہتی ہے کہ فیلڈز کے نام بالکل ایسے ہی ہونے چاہئیں۔ تو `user-name` یا `email` کام نہیں کرے گا۔ + +لیکن فکر نہ کریں، آپ اسے frontend میں اپنے حتمی صارفین کو جیسے چاہیں دکھا سکتے ہیں۔ + +اور آپ کے database models جو بھی نام چاہیں استعمال کر سکتے ہیں۔ + +لیکن login *path operation* کے لیے، ہمیں spec کے مطابق ان ناموں کا استعمال کرنا ہوگا (اور مثال کے طور پر، integrated API documentation system استعمال کرنے کے قابل ہونا)۔ + +Spec یہ بھی کہتی ہے کہ `username` اور `password` بطور form data بھیجے جائیں (تو، یہاں JSON نہیں)۔ + +### `scope` { #scope } + +Spec یہ بھی کہتی ہے کہ client ایک اور form field "`scope`" بھیج سکتا ہے۔ + +Form field کا نام `scope` (واحد) ہے، لیکن یہ حقیقت میں ایک لمبی string ہے جس میں "scopes" خالی جگہوں سے الگ ہوتے ہیں۔ + +ہر "scope" بس ایک string ہے (بغیر خالی جگہوں کے)۔ + +یہ عام طور پر مخصوص security permissions declare کرنے کے لیے استعمال ہوتے ہیں، مثال کے طور پر: + +* `users:read` یا `users:write` عام مثالیں ہیں۔ +* `instagram_basic` Facebook / Instagram استعمال کرتا ہے۔ +* `https://www.googleapis.com/auth/drive` Google استعمال کرتا ہے۔ + +/// info | معلومات + +OAuth2 میں ایک "scope" بس ایک string ہے جو ایک مخصوص مطلوبہ permission declare کرتی ہے۔ + +اس سے کوئی فرق نہیں پڑتا کہ اس میں `:` جیسے دوسرے حروف ہوں یا یہ ایک URL ہو۔ + +یہ تفصیلات implementation پر منحصر ہیں۔ + +OAuth2 کے لیے یہ بس strings ہیں۔ + +/// + +## `username` اور `password` حاصل کرنے کا code { #code-to-get-the-username-and-password } + +اب آئیے **FastAPI** کی فراہم کردہ utilities استعمال کرتے ہیں۔ + +### `OAuth2PasswordRequestForm` { #oauth2passwordrequestform } + +پہلے، `OAuth2PasswordRequestForm` import کریں، اور اسے `/token` کے *path operation* میں `Depends` کے ساتھ بطور dependency استعمال کریں: + +{* ../../docs_src/security/tutorial003_an_py310.py hl[4,78] *} + +`OAuth2PasswordRequestForm` ایک class dependency ہے جو ایک form body declare کرتی ہے جس میں: + +* `username`۔ +* `password`۔ +* ایک اختیاری `scope` فیلڈ بطور ایک بڑی string، جو خالی جگہوں سے الگ strings پر مشتمل ہو۔ +* ایک اختیاری `grant_type`۔ + +/// tip | مشورہ + +OAuth2 spec دراصل ایک فیلڈ `grant_type` *مطلوب* کرتی ہے جس کی مقررہ value `password` ہو، لیکن `OAuth2PasswordRequestForm` اسے لازمی نہیں بناتا۔ + +اگر آپ کو اسے لازمی بنانا ہے تو `OAuth2PasswordRequestForm` کی بجائے `OAuth2PasswordRequestFormStrict` استعمال کریں۔ + +/// + +* ایک اختیاری `client_id` (ہماری مثال کے لیے اس کی ضرورت نہیں)۔ +* ایک اختیاری `client_secret` (ہماری مثال کے لیے اس کی ضرورت نہیں)۔ + +/// info | معلومات + +`OAuth2PasswordRequestForm` **FastAPI** کے لیے `OAuth2PasswordBearer` کی طرح کوئی خاص class نہیں ہے۔ + +`OAuth2PasswordBearer` **FastAPI** کو بتاتا ہے کہ یہ ایک security scheme ہے۔ اس لیے اسے اس طریقے سے OpenAPI میں شامل کیا جاتا ہے۔ + +لیکن `OAuth2PasswordRequestForm` بس ایک class dependency ہے جو آپ خود بھی لکھ سکتے تھے، یا آپ براہ راست `Form` parameters declare کر سکتے تھے۔ + +لیکن چونکہ یہ ایک عام استعمال کا معاملہ ہے، اسے آسان بنانے کے لیے **FastAPI** براہ راست فراہم کرتا ہے۔ + +/// + +### Form data استعمال کریں { #use-the-form-data } + +/// tip | مشورہ + +Dependency class `OAuth2PasswordRequestForm` کی instance میں `scope` attribute نہیں ہوگا جس میں خالی جگہوں سے الگ لمبی string ہو، بلکہ اس میں `scopes` attribute ہوگا جس میں بھیجے گئے ہر scope کے لیے strings کی اصل list ہوگی۔ + +ہم اس مثال میں `scopes` استعمال نہیں کر رہے، لیکن اگر آپ کو ضرورت ہو تو یہ فعالیت موجود ہے۔ + +/// + +اب، form field سے `username` استعمال کرتے ہوئے (جعلی) database سے صارف کا data حاصل کریں۔ + +اگر ایسا کوئی صارف نہیں ہے، تو ہم "Incorrect username or password" کی error واپس کرتے ہیں۔ + +Error کے لیے، ہم exception `HTTPException` استعمال کرتے ہیں: + +{* ../../docs_src/security/tutorial003_an_py310.py hl[3,79:81] *} + +### Password چیک کریں { #check-the-password } + +اس وقت ہمارے پاس اپنے database سے صارف کا data ہے، لیکن ہم نے password چیک نہیں کیا ہے۔ + +آئیے پہلے اس data کو Pydantic `UserInDB` model میں ڈالتے ہیں۔ + +آپ کو کبھی بھی سادہ متن کے passwords محفوظ نہیں کرنے چاہئیں، تو ہم (جعلی) password hashing system استعمال کریں گے۔ + +اگر passwords میل نہیں کھاتے، تو ہم وہی error واپس کرتے ہیں۔ + +#### Password hashing { #password-hashing } + +"Hashing" کا مطلب ہے: کسی مواد (اس معاملے میں password) کو bytes کی ایک ترتیب (بس ایک string) میں تبدیل کرنا جو بے معنی سی لگتی ہے۔ + +جب بھی آپ بالکل وہی مواد (بالکل وہی password) دیں گے، آپ کو بالکل وہی بے معنی نتیجہ ملے گا۔ + +لیکن آپ اس بے معنی نتیجے سے واپس password حاصل نہیں کر سکتے۔ + +##### Password hashing کیوں استعمال کریں { #why-use-password-hashing } + +اگر آپ کا database چوری ہو جائے، تو چور کے پاس آپ کے صارفین کے سادہ متن کے passwords نہیں ہوں گے، صرف hashes ہوں گے۔ + +تو، چور ان passwords کو کسی اور system میں استعمال نہیں کر سکے گا (چونکہ بہت سے صارف ہر جگہ ایک ہی password استعمال کرتے ہیں، یہ خطرناک ہوتا)۔ + +{* ../../docs_src/security/tutorial003_an_py310.py hl[82:85] *} + +#### `**user_dict` کے بارے میں { #about-user-dict } + +`UserInDB(**user_dict)` کا مطلب ہے: + +*`user_dict` کی keys اور values کو براہ راست key-value arguments کے طور پر پاس کریں، جو اس کے مساوی ہے:* + +```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"], +) +``` + +/// info | معلومات + +`**user_dict` کی مزید مکمل وضاحت کے لیے [**Extra Models** کی دستاویزات](../extra-models.md#about-user-in-dict) دیکھیں۔ + +/// + +## Token واپس کریں { #return-the-token } + +`token` endpoint کا response ایک JSON object ہونا چاہیے۔ + +اس میں ایک `token_type` ہونا چاہیے۔ ہمارے معاملے میں، چونکہ ہم "Bearer" tokens استعمال کر رہے ہیں، token type "`bearer`" ہونی چاہیے۔ + +اور اس میں ایک `access_token` ہونا چاہیے، ایک string جس میں ہمارا access token ہو۔ + +اس سادہ مثال کے لیے، ہم بالکل غیر محفوظ طریقے سے وہی `username` بطور token واپس کریں گے۔ + +/// tip | مشورہ + +اگلے باب میں، آپ password hashing اور JWT tokens کے ساتھ ایک حقیقی محفوظ implementation دیکھیں گے۔ + +لیکن ابھی کے لیے، آئیے ان مخصوص تفصیلات پر توجہ مرکوز کرتے ہیں جو ہمیں چاہئیں۔ + +/// + +{* ../../docs_src/security/tutorial003_an_py310.py hl[87] *} + +/// tip | مشورہ + +Spec کے مطابق، آپ کو ایک JSON واپس کرنا چاہیے جس میں `access_token` اور `token_type` ہو، بالکل اسی مثال کی طرح۔ + +یہ وہ چیز ہے جو آپ کو اپنے code میں خود کرنی ہوگی، اور یقینی بنائیں کہ آپ وہ JSON keys استعمال کریں۔ + +specifications کے مطابق رہنے کے لیے یہ تقریباً واحد چیز ہے جو آپ کو خود درست طریقے سے کرنا یاد رکھنا ہوگا۔ + +باقی سب کے لیے، **FastAPI** آپ کے لیے سنبھال لیتا ہے۔ + +/// + +## Dependencies کو اپ ڈیٹ کریں { #update-the-dependencies } + +اب ہم اپنی dependencies کو اپ ڈیٹ کریں گے۔ + +ہم `current_user` *صرف* اس وقت حاصل کرنا چاہتے ہیں جب یہ صارف active ہو۔ + +تو، ہم ایک اضافی dependency `get_current_active_user` بناتے ہیں جو بدلے میں `get_current_user` کو بطور dependency استعمال کرتی ہے۔ + +یہ دونوں dependencies HTTP error واپس کریں گی اگر صارف موجود نہ ہو، یا غیر فعال ہو۔ + +تو، ہمارے endpoint میں، ہمیں صارف صرف اسی صورت میں ملے گا جب صارف موجود ہو، درست طریقے سے authenticated ہو، اور active ہو: + +{* ../../docs_src/security/tutorial003_an_py310.py hl[58:66,69:74,94] *} + +/// info | معلومات + +اضافی header `WWW-Authenticate` جس کی value `Bearer` ہے جو ہم یہاں واپس کر رہے ہیں، وہ بھی spec کا حصہ ہے۔ + +کسی بھی HTTP (error) status code 401 "UNAUTHORIZED" کو بھی `WWW-Authenticate` header واپس کرنا چاہیے۔ + +Bearer tokens کے معاملے میں (ہمارا معاملہ)، اس header کی value `Bearer` ہونی چاہیے۔ + +آپ حقیقت میں اس اضافی header کو چھوڑ سکتے ہیں اور یہ پھر بھی کام کرے گا۔ + +لیکن یہ یہاں specifications کے مطابق رہنے کے لیے فراہم کیا گیا ہے۔ + +نیز، ایسے tools ہو سکتے ہیں جو اسے توقع رکھتے ہیں اور استعمال کرتے ہیں (ابھی یا مستقبل میں) اور یہ آپ یا آپ کے صارفین کے لیے مفید ہو سکتے ہیں، ابھی یا مستقبل میں۔ + +معیارات کا یہی فائدہ ہے... + +/// + +## اسے عمل میں دیکھیں { #see-it-in-action } + +Interactive docs کھولیں: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)۔ + +### Authenticate کریں { #authenticate } + +"Authorize" بٹن پر کلک کریں۔ + +یہ credentials استعمال کریں: + +User: `johndoe` + +Password: `secret` + + + +System میں authenticate ہونے کے بعد، آپ اسے اس طرح دیکھیں گے: + + + +### اپنا صارف data حاصل کریں { #get-your-own-user-data } + +اب operation `GET` path `/users/me` کے ساتھ استعمال کریں۔ + +آپ کو اپنے صارف کا data ملے گا، جیسے: + +```JSON +{ + "username": "johndoe", + "email": "johndoe@example.com", + "full_name": "John Doe", + "disabled": false, + "hashed_password": "fakehashedsecret" +} +``` + + + +اگر آپ lock آئیکن پر کلک کریں اور logout کریں، اور پھر وہی operation دوبارہ آزمائیں، تو آپ کو HTTP 401 error ملے گی: + +```JSON +{ + "detail": "Not authenticated" +} +``` + +### غیر فعال صارف { #inactive-user } + +اب ایک غیر فعال صارف کے ساتھ آزمائیں، اس سے authenticate کریں: + +User: `alice` + +Password: `secret2` + +اور operation `GET` path `/users/me` کے ساتھ استعمال کرنے کی کوشش کریں۔ + +آپ کو "Inactive user" error ملے گی، جیسے: + +```JSON +{ + "detail": "Inactive user" +} +``` + +## خلاصہ { #recap } + +اب آپ کے پاس اپنی API کے لیے `username` اور `password` پر مبنی مکمل security system بنانے کے tools ہیں۔ + +ان tools کا استعمال کرتے ہوئے، آپ security system کو کسی بھی database اور کسی بھی صارف یا data model کے ساتھ مطابقت پذیر بنا سکتے ہیں۔ + +بس ایک تفصیل باقی ہے کہ یہ حقیقت میں ابھی "محفوظ" نہیں ہے۔ + +اگلے باب میں آپ دیکھیں گے کہ ایک محفوظ password hashing library اور JWT tokens کیسے استعمال کریں۔ diff --git a/docs/ur/docs/tutorial/server-sent-events.md b/docs/ur/docs/tutorial/server-sent-events.md new file mode 100644 index 000000000..5d0411a55 --- /dev/null +++ b/docs/ur/docs/tutorial/server-sent-events.md @@ -0,0 +1,120 @@ +# Server-Sent Events (SSE) { #server-sent-events-sse } + +آپ **Server-Sent Events** (SSE) استعمال کرتے ہوئے client کو data stream کر سکتے ہیں۔ + +یہ [Stream JSON Lines](stream-json-lines.md) سے ملتا جلتا ہے، لیکن `text/event-stream` format استعمال کرتا ہے، جو browsers میں [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) کے ذریعے مقامی طور پر حمایت یافتہ ہے۔ + +/// info | معلومات + +FastAPI 0.135.0 میں شامل کیا گیا۔ + +/// + +## Server-Sent Events کیا ہیں؟ { #what-are-server-sent-events } + +SSE HTTP پر server سے client کو data stream کرنے کا ایک معیار ہے۔ + +ہر event ایک چھوٹا text block ہوتا ہے جس میں `data`، `event`، `id`، اور `retry` جیسے "fields" ہوتے ہیں، جو خالی لائنوں سے الگ ہوتے ہیں۔ + +یہ اس طرح نظر آتا ہے: + +``` +data: {"name": "Portal Gun", "price": 999.99} + +data: {"name": "Plumbus", "price": 32.99} + +``` + +SSE عام طور پر AI chat streaming، لائیو notifications، logs اور observability، اور دیگر صورتوں کے لیے استعمال ہوتا ہے جہاں server client کو updates بھیجتا ہے۔ + +/// tip | مشورہ + +اگر آپ binary data stream کرنا چاہتے ہیں، مثلاً video یا audio، تو advanced گائیڈ دیکھیں: [Stream Data](../advanced/stream-data.md)۔ + +/// + +## FastAPI کے ساتھ SSE Stream کریں { #stream-sse-with-fastapi } + +FastAPI کے ساتھ SSE stream کرنے کے لیے، اپنے *path operation function* میں `yield` استعمال کریں اور `response_class=EventSourceResponse` سیٹ کریں۔ + +`fastapi.sse` سے `EventSourceResponse` import کریں: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[4,22] *} + +ہر yield شدہ آئٹم JSON کے طور پر encode ہو کر SSE event کے `data:` field میں بھیجا جاتا ہے۔ + +اگر آپ return type کو `AsyncIterable[Item]` declare کرتے ہیں، تو FastAPI اسے Pydantic استعمال کرتے ہوئے data کو **validate**، **document**، اور **serialize** کرنے کے لیے استعمال کرے گا۔ + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[10:12,23] *} + +/// tip | مشورہ + +چونکہ Pydantic اسے **Rust** کی طرف سے serialize کرے گا، آپ کو return type declare نہ کرنے کی نسبت بہت زیادہ **performance** ملے گی۔ + +/// + +### غیر async *path operation functions* { #non-async-path-operation-functions } + +آپ عام `def` functions (بغیر `async`) بھی استعمال کر سکتے ہیں، اور اسی طرح `yield` استعمال کر سکتے ہیں۔ + +FastAPI یقینی بنائے گا کہ یہ درست طریقے سے چلے تاکہ event loop block نہ ہو۔ + +اس صورت میں چونکہ function async نہیں ہے، صحیح return type `Iterable[Item]` ہوگا: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[28:31] hl[29] *} + +### بغیر Return Type { #no-return-type } + +آپ return type بھی چھوڑ سکتے ہیں۔ FastAPI data کو تبدیل کرنے اور بھیجنے کے لیے [`jsonable_encoder`](./encoder.md) استعمال کرے گا۔ + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[34:37] hl[35] *} + +## `ServerSentEvent` { #serversentevent } + +اگر آپ کو SSE fields جیسے `event`، `id`، `retry`، یا `comment` سیٹ کرنے کی ضرورت ہے، تو آپ سادہ data کی بجائے `ServerSentEvent` objects yield کر سکتے ہیں۔ + +`fastapi.sse` سے `ServerSentEvent` import کریں: + +{* ../../docs_src/server_sent_events/tutorial002_py310.py hl[4,26] *} + +`data` field ہمیشہ JSON کے طور پر encode ہوتا ہے۔ آپ JSON کے طور پر serialize ہونے کے قابل کوئی بھی قدر دے سکتے ہیں، بشمول Pydantic models۔ + +## Raw Data { #raw-data } + +اگر آپ کو JSON encoding **کے بغیر** data بھیجنے کی ضرورت ہے، تو `data` کی بجائے `raw_data` استعمال کریں۔ + +یہ پہلے سے فارمیٹ شدہ text، log lines، یا خاص "sentinel" قدروں جیسے `[DONE]` بھیجنے کے لیے مفید ہے۔ + +{* ../../docs_src/server_sent_events/tutorial003_py310.py hl[17] *} + +/// note | نوٹ + +`data` اور `raw_data` باہمی طور پر خارج ہیں۔ آپ ہر `ServerSentEvent` میں ان میں سے صرف ایک سیٹ کر سکتے ہیں۔ + +/// + +## `Last-Event-ID` کے ساتھ دوبارہ شروع کرنا { #resuming-with-last-event-id } + +جب connection ٹوٹنے کے بعد browser دوبارہ connect ہوتا ہے، تو وہ آخری وصول شدہ `id` کو `Last-Event-ID` header میں بھیجتا ہے۔ + +آپ اسے ایک header parameter کے طور پر پڑھ سکتے ہیں اور اسے استعمال کر کے stream کو وہیں سے دوبارہ شروع کر سکتے ہیں جہاں client نے چھوڑا تھا: + +{* ../../docs_src/server_sent_events/tutorial004_py310.py hl[25,27,31] *} + +## POST کے ساتھ SSE { #sse-with-post } + +SSE **کسی بھی HTTP method** کے ساتھ کام کرتا ہے، صرف `GET` ہی نہیں۔ + +یہ [MCP](https://modelcontextprotocol.io) جیسے protocols کے لیے مفید ہے جو `POST` پر SSE stream کرتے ہیں: + +{* ../../docs_src/server_sent_events/tutorial005_py310.py hl[14] *} + +## تکنیکی تفصیلات { #technical-details } + +FastAPI کچھ SSE بہترین طریقے خود بخود لاگو کرتا ہے۔ + +* جب کوئی پیغام نہ ہو تو ہر 15 سیکنڈ بعد **"keep alive" `ping` comment** بھیجتا ہے، تاکہ بعض proxies کو connection بند کرنے سے روکا جا سکے، جیسا کہ [HTML specification: Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes) میں تجویز کیا گیا ہے۔ +* Stream کی **caching روکنے** کے لیے `Cache-Control: no-cache` header سیٹ کرتا ہے۔ +* Nginx جیسے بعض proxies میں **buffering روکنے** کے لیے ایک خاص header `X-Accel-Buffering: no` سیٹ کرتا ہے۔ + +آپ کو اس بارے میں کچھ نہیں کرنا، یہ خود بخود کام کرتا ہے۔ 🤓 diff --git a/docs/ur/docs/tutorial/sql-databases.md b/docs/ur/docs/tutorial/sql-databases.md new file mode 100644 index 000000000..4962f983d --- /dev/null +++ b/docs/ur/docs/tutorial/sql-databases.md @@ -0,0 +1,357 @@ +# SQL (Relational) Databases { #sql-relational-databases } + +**FastAPI** آپ سے SQL (relational) database استعمال کرنے کا تقاضا نہیں کرتا۔ لیکن آپ **کوئی بھی database** استعمال کر سکتے ہیں جو آپ چاہیں۔ + +یہاں ہم [SQLModel](https://sqlmodel.tiangolo.com/) استعمال کرنے کی ایک مثال دیکھیں گے۔ + +**SQLModel** [SQLAlchemy](https://www.sqlalchemy.org/) اور Pydantic کے اوپر بنایا گیا ہے۔ اسے **FastAPI** کے اسی مصنف نے بنایا تھا تاکہ یہ ان FastAPI applications کے لیے بہترین ہو جنہیں **SQL databases** استعمال کرنے کی ضرورت ہوتی ہے۔ + +/// tip | مشورہ + +آپ کوئی بھی دوسری SQL یا NoSQL database library استعمال کر سکتے ہیں (بعض صورتوں میں جنہیں "ORMs" کہا جاتا ہے)، FastAPI آپ کو کسی بھی چیز کے استعمال پر مجبور نہیں کرتا۔ 😎 + +/// + +چونکہ SQLModel SQLAlchemy پر مبنی ہے، آپ آسانی سے SQLAlchemy کی طرف سے **حمایت یافتہ کوئی بھی database** استعمال کر سکتے ہیں (جو انہیں SQLModel کی طرف سے بھی حمایت یافتہ بناتا ہے)، جیسے: + +* PostgreSQL +* MySQL +* SQLite +* Oracle +* Microsoft SQL Server، وغیرہ + +اس مثال میں، ہم **SQLite** استعمال کریں گے، کیونکہ یہ ایک واحد فائل استعمال کرتا ہے اور Python میں اس کی بلٹ ان حمایت موجود ہے۔ تو، آپ اس مثال کو کاپی کر کے جیسے ہے ویسے چلا سکتے ہیں۔ + +بعد میں، اپنی production application کے لیے، آپ **PostgreSQL** جیسا database server استعمال کرنا چاہ سکتے ہیں۔ + +/// tip | مشورہ + +**FastAPI** اور **PostgreSQL** کے ساتھ ایک سرکاری project generator موجود ہے جس میں frontend اور مزید tools شامل ہیں: [https://github.com/fastapi/full-stack-fastapi-template](https://github.com/fastapi/full-stack-fastapi-template) + +/// + +یہ ایک بہت سادہ اور مختصر tutorial ہے، اگر آپ databases کے بارے میں عمومی طور پر، SQL کے بارے میں، یا مزید جدید خصوصیات کے بارے میں سیکھنا چاہتے ہیں، تو [SQLModel دستاویزات](https://sqlmodel.tiangolo.com/) پر جائیں۔ + +## `SQLModel` انسٹال کریں { #install-sqlmodel } + +سب سے پہلے، یقینی بنائیں کہ آپ نے اپنا [virtual environment](../virtual-environments.md) بنایا ہے، اسے فعال کیا ہے، اور پھر `sqlmodel` انسٹال کریں: + +
+ +```console +$ pip install sqlmodel +---> 100% +``` + +
+ +## ایک واحد Model کے ساتھ App بنائیں { #create-the-app-with-a-single-model } + +ہم پہلے ایک واحد **SQLModel** model کے ساتھ app کا سب سے آسان ورژن بنائیں گے۔ + +بعد میں ہم اسے **متعدد models** کے ساتھ بہتر بنائیں گے تاکہ security اور versatility بڑھے۔ 🤓 + +### Models بنائیں { #create-models } + +`SQLModel` import کریں اور ایک database model بنائیں: + +{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[1:11] hl[7:11] *} + +`Hero` class ایک Pydantic model سے بہت ملتی جلتی ہے (حقیقت میں، اندرونی طور پر، یہ دراصل *ایک Pydantic model ہے*)۔ + +کچھ فرق ہیں: + +* `table=True` SQLModel کو بتاتا ہے کہ یہ ایک *table model* ہے، اسے SQL database میں ایک **table** کی نمائندگی کرنی چاہیے، یہ صرف ایک *data model* نہیں ہے (جیسا کہ کوئی بھی دوسری عام Pydantic class ہوگی)۔ + +* `Field(primary_key=True)` SQLModel کو بتاتا ہے کہ `id` SQL database میں **primary key** ہے (آپ SQLModel دستاویزات میں SQL primary keys کے بارے میں مزید سیکھ سکتے ہیں)۔ + + **نوٹ:** ہم primary key field کے لیے `int | None` استعمال کرتے ہیں تاکہ Python code میں ہم *`id` کے بغیر ایک object بنا سکیں* (`id=None`)، یہ فرض کرتے ہوئے کہ database *اسے محفوظ کرتے وقت خود بنائے گا*۔ SQLModel سمجھتا ہے کہ database `id` فراہم کرے گا اور database schema میں *column کو non-null `INTEGER` کے طور پر define کرتا ہے*۔ تفصیلات کے لیے [SQLModel دستاویزات primary keys کے بارے میں](https://sqlmodel.tiangolo.com/tutorial/create-db-and-table/#primary-key-id) دیکھیں۔ + +* `Field(index=True)` SQLModel کو بتاتا ہے کہ اس column کے لیے ایک **SQL index** بنایا جائے، جو database میں اس column سے فلٹر شدہ data پڑھتے وقت تیز تر lookups کی اجازت دے گا۔ + + SQLModel جانتا ہے کہ `str` کے طور پر declare کی گئی چیز `TEXT` (یا `VARCHAR`، database پر منحصر ہے) قسم کا SQL column ہوگا۔ + +### ایک Engine بنائیں { #create-an-engine } + +ایک SQLModel `engine` (اندرونی طور پر یہ دراصل SQLAlchemy `engine` ہے) وہ ہے جو database سے **connections رکھتا ہے**۔ + +آپ کے پاس اپنے تمام code کے لیے ایک ہی database سے connect ہونے کے لیے **ایک واحد `engine` object** ہوگا۔ + +{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[14:18] hl[14:15,17:18] *} + +`check_same_thread=False` استعمال کرنا FastAPI کو مختلف threads میں ایک ہی SQLite database استعمال کرنے کی اجازت دیتا ہے۔ یہ ضروری ہے کیونکہ **ایک واحد request** **ایک سے زیادہ threads** استعمال کر سکتی ہے (مثلاً dependencies میں)۔ + +فکر نہ کریں، code کی ساخت کے مطابق، ہم بعد میں یقینی بنائیں گے کہ ہم **فی request ایک واحد SQLModel *session*** استعمال کریں، یہ وہی ہے جو `check_same_thread` حاصل کرنے کی کوشش کر رہا ہے۔ + +### Tables بنائیں { #create-the-tables } + +پھر ہم ایک function شامل کرتے ہیں جو `SQLModel.metadata.create_all(engine)` استعمال کرتا ہے تاکہ تمام *table models* کے لیے **tables بنائے**۔ + +{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[21:22] hl[21:22] *} + +### ایک Session Dependency بنائیں { #create-a-session-dependency } + +ایک **`Session`** وہ ہے جو **memory میں objects** کو محفوظ رکھتا ہے اور data میں ضروری تبدیلیوں کا ریکارڈ رکھتا ہے، پھر یہ database سے بات چیت کے لیے **`engine` استعمال کرتا ہے**۔ + +ہم `yield` کے ساتھ ایک FastAPI **dependency** بنائیں گے جو ہر request کے لیے ایک نیا `Session` فراہم کرے گی۔ یہی وہ چیز ہے جو یقینی بناتی ہے کہ ہم فی request ایک واحد session استعمال کریں۔ 🤓 + +پھر ہم ایک `Annotated` dependency `SessionDep` بنائیں گے تاکہ باقی code جو اس dependency کو استعمال کرے گا وہ آسان ہو جائے۔ + +{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[25:30] hl[25:27,30] *} + +### Application شروع ہونے پر Database Tables بنائیں { #create-database-tables-on-startup } + +ہم application شروع ہونے پر database tables بنائیں گے۔ + +{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[32:37] hl[35:37] *} + +یہاں ہم application startup event پر tables بناتے ہیں۔ + +Production کے لیے آپ شاید ایک migration script استعمال کریں گے جو آپ کی app شروع ہونے سے پہلے چلتی ہے۔ 🤓 + +/// tip | مشورہ + +SQLModel میں Alembic کو wrap کرنے والی migration utilities آئیں گی، لیکن ابھی کے لیے، آپ براہ راست [Alembic](https://alembic.sqlalchemy.org/en/latest/) استعمال کر سکتے ہیں۔ + +/// + +### ایک Hero بنائیں { #create-a-hero } + +چونکہ ہر SQLModel model ایک Pydantic model بھی ہے، آپ اسے انہی **type annotations** میں استعمال کر سکتے ہیں جو آپ Pydantic models کے لیے استعمال کرتے۔ + +مثال کے طور پر، اگر آپ `Hero` قسم کا parameter declare کرتے ہیں، تو اسے **JSON body** سے پڑھا جائے گا۔ + +اسی طرح، آپ اسے function کی **return type** کے طور پر declare کر سکتے ہیں، اور پھر data کی شکل خودکار API docs UI میں نظر آئے گی۔ + +{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[40:45] hl[40:45] *} + +یہاں ہم `SessionDep` dependency (ایک `Session`) استعمال کرتے ہیں تاکہ نیا `Hero` `Session` instance میں شامل کیا جائے، database میں تبدیلیاں commit کی جائیں، `hero` میں data refresh کیا جائے، اور پھر اسے واپس کیا جائے۔ + +### Heroes پڑھیں { #read-heroes } + +ہم `select()` استعمال کرتے ہوئے database سے `Hero`s **پڑھ** سکتے ہیں۔ ہم نتائج کو paginate کرنے کے لیے `limit` اور `offset` شامل کر سکتے ہیں۔ + +{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[48:55] hl[51:52,54] *} + +### ایک Hero پڑھیں { #read-one-hero } + +ہم ایک واحد `Hero` **پڑھ** سکتے ہیں۔ + +{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[58:63] hl[60] *} + +### ایک Hero حذف کریں { #delete-a-hero } + +ہم ایک `Hero` کو **حذف** بھی کر سکتے ہیں۔ + +{* ../../docs_src/sql_databases/tutorial001_an_py310.py ln[66:73] hl[71] *} + +### App چلائیں { #run-the-app } + +آپ app چلا سکتے ہیں: + +
+ +```console +$ fastapi dev + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +پھر `/docs` UI پر جائیں، آپ دیکھیں گے کہ **FastAPI** ان **models** کو API **document** کرنے کے لیے استعمال کر رہا ہے، اور یہ data کو **serialize** اور **validate** کرنے کے لیے بھی انہیں استعمال کرے گا۔ + +
+ +
+ +## متعدد Models کے ساتھ App کو اپ ڈیٹ کریں { #update-the-app-with-multiple-models } + +اب آئیں اس app کو تھوڑا **refactor** کریں تاکہ **security** اور **versatility** بڑھے۔ + +اگر آپ پچھلی app دیکھیں، UI میں آپ دیکھ سکتے ہیں کہ، ابھی تک، یہ client کو `Hero` بناتے وقت `id` فیصلہ کرنے دیتی ہے۔ 😱 + +ہمیں ایسا نہیں ہونے دینا چاہیے، وہ ایسا `id` overwrite کر سکتے ہیں جو ہم نے پہلے سے DB میں assign کیا ہے۔ `id` کا فیصلہ **backend** یا **database** کو کرنا چاہیے، **client کو نہیں**۔ + +اس کے علاوہ، ہم hero کے لیے ایک `secret_name` بناتے ہیں، لیکن ابھی تک، ہم اسے ہر جگہ واپس بھیج رہے ہیں، یہ بہت **خفیہ** نہیں ہے... 😅 + +ہم ان چیزوں کو چند **اضافی models** شامل کر کے ٹھیک کریں گے۔ یہیں SQLModel چمکے گا۔ ✨ + +### متعدد Models بنائیں { #create-multiple-models } + +**SQLModel** میں، کوئی بھی model class جس میں `table=True` ہو وہ **table model** ہے۔ + +اور کوئی بھی model class جس میں `table=True` نہ ہو وہ **data model** ہے، یہ دراصل صرف Pydantic models ہیں (چند چھوٹی اضافی خصوصیات کے ساتھ)۔ 🤓 + +SQLModel کے ساتھ، ہم تمام صورتوں میں تمام fields کو **دہرانے سے بچنے** کے لیے **inheritance** استعمال کر سکتے ہیں۔ + +#### `HeroBase` - بنیادی class { #herobase-the-base-class } + +آئیں ایک `HeroBase` model سے شروع کریں جس میں وہ تمام **fields ہیں جو سب models میں مشترک ہیں**: + +* `name` +* `age` + +{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[7:9] hl[7:9] *} + +#### `Hero` - *table model* { #hero-the-table-model } + +پھر آئیں `Hero` بنائیں، اصل *table model*، جس میں وہ **اضافی fields** ہیں جو ہمیشہ دوسرے models میں نہیں ہوتیں: + +* `id` +* `secret_name` + +چونکہ `Hero` `HeroBase` سے inherit کرتا ہے، اس میں `HeroBase` میں declare شدہ **fields بھی** ہیں، تو `Hero` کے تمام fields ہیں: + +* `id` +* `name` +* `age` +* `secret_name` + +{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[7:14] hl[12:14] *} + +#### `HeroPublic` - عوامی *data model* { #heropublic-the-public-data-model } + +اس کے بعد، ہم ایک `HeroPublic` model بناتے ہیں، یہ وہ ہے جو API کے clients کو **واپس بھیجا** جائے گا۔ + +اس میں `HeroBase` جیسے ہی fields ہیں، تو اس میں `secret_name` شامل نہیں ہوگا۔ + +آخرکار، ہمارے heroes کی شناخت محفوظ ہے! 🥷 + +یہ `id: int` کو دوبارہ declare بھی کرتا ہے۔ ایسا کرنے سے، ہم API clients کے ساتھ ایک **contract** بنا رہے ہیں، تاکہ وہ ہمیشہ توقع کر سکیں کہ `id` موجود ہوگا اور ہمیشہ `int` ہوگا (کبھی `None` نہیں ہوگا)۔ + +/// tip | مشورہ + +return model میں اس بات کو یقینی بنانا کہ ایک قدر ہمیشہ دستیاب ہو اور ہمیشہ `int` ہو (`None` نہیں) API clients کے لیے بہت مفید ہے، وہ اس یقین کے ساتھ بہت آسان code لکھ سکتے ہیں۔ + +اس کے علاوہ، **خودکار طور پر بنائے گئے clients** کے سادہ تر interfaces ہوں گے، تاکہ آپ کی API کے ساتھ بات چیت کرنے والے developers کو آپ کی API کے ساتھ کام کرنے کا بہت بہتر تجربہ ہو۔ 😎 + +/// + +`HeroPublic` کے تمام fields `HeroBase` جیسے ہی ہیں، `id` کو `int` (نہ کہ `None`) کے طور پر declare کیا گیا ہے: + +* `id` +* `name` +* `age` + +{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[7:18] hl[17:18] *} + +#### `HeroCreate` - hero بنانے کے لیے *data model* { #herocreate-the-data-model-to-create-a-hero } + +اب ہم ایک `HeroCreate` model بناتے ہیں، یہ وہ ہے جو clients سے آنے والے data کو **validate** کرے گا۔ + +اس میں `HeroBase` جیسے ہی fields ہیں، اور اس میں `secret_name` بھی ہے۔ + +اب، جب clients **نیا hero بنائیں** گے، وہ `secret_name` بھیجیں گے، اسے database میں محفوظ کیا جائے گا، لیکن وہ خفیہ نام API میں clients کو واپس نہیں بھیجے جائیں گے۔ + +/// tip | مشورہ + +**passwords** کو آپ اسی طرح handle کریں گے۔ انہیں وصول کریں، لیکن API میں واپس نہ بھیجیں۔ + +آپ passwords کی قدروں کو محفوظ کرنے سے پہلے **hash** بھی کریں گے، **انہیں کبھی سادہ متن میں محفوظ نہ کریں**۔ + +/// + +`HeroCreate` کے fields ہیں: + +* `name` +* `age` +* `secret_name` + +{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[7:22] hl[21:22] *} + +#### `HeroUpdate` - hero کو اپ ڈیٹ کرنے کے لیے *data model* { #heroupdate-the-data-model-to-update-a-hero } + +ہمارے پاس پچھلے ورژن میں **hero کو اپ ڈیٹ** کرنے کا طریقہ نہیں تھا، لیکن اب **متعدد models** کے ساتھ، ہم ایسا کر سکتے ہیں۔ 🎉 + +`HeroUpdate` *data model* کچھ خاص ہے، اس میں وہ **تمام fields** ہیں جو نیا hero بنانے کے لیے درکار ہوں گے، لیکن تمام fields **optional** ہیں (سب کی ڈیفالٹ قدر ہے)۔ اس طرح، جب آپ hero کو اپ ڈیٹ کریں، تو آپ صرف وہی fields بھیج سکتے ہیں جنہیں آپ اپ ڈیٹ کرنا چاہتے ہیں۔ + +چونکہ تمام **fields دراصل تبدیل ہو جاتے ہیں** (قسم اب `None` شامل کرتی ہے اور اب ان کی ڈیفالٹ قدر `None` ہے)، ہمیں انہیں **دوبارہ declare** کرنا ہوگا۔ + +ہمیں واقعی `HeroBase` سے inherit کرنے کی ضرورت نہیں ہے کیونکہ ہم تمام fields دوبارہ declare کر رہے ہیں۔ میں نے اسے مستقل مزاجی کے لیے inherit کرتا چھوڑ دیا ہے، لیکن یہ ضروری نہیں ہے۔ یہ ذاتی پسند کا معاملہ ہے۔ 🤷 + +`HeroUpdate` کے fields ہیں: + +* `name` +* `age` +* `secret_name` + +{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[7:28] hl[25:28] *} + +### `HeroCreate` سے بنائیں اور `HeroPublic` واپس کریں { #create-with-herocreate-and-return-a-heropublic } + +اب جبکہ ہمارے پاس **متعدد models** ہیں، ہم app کے ان حصوں کو اپ ڈیٹ کر سکتے ہیں جو انہیں استعمال کرتے ہیں۔ + +ہم request میں ایک `HeroCreate` *data model* وصول کرتے ہیں، اور اس سے ایک `Hero` *table model* بناتے ہیں۔ + +یہ نیا *table model* `Hero` client کی بھیجی گئی fields رکھے گا، اور database کی طرف سے بنایا گیا `id` بھی ہوگا۔ + +پھر ہم function سے وہی *table model* `Hero` جیسے ہے ویسے واپس کرتے ہیں۔ لیکن چونکہ ہم `response_model` کو `HeroPublic` *data model* کے ساتھ declare کرتے ہیں، **FastAPI** data کو validate اور serialize کرنے کے لیے `HeroPublic` استعمال کرے گا۔ + +{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[56:62] hl[56:58] *} + +/// tip | مشورہ + +اب ہم **return type annotation** `-> HeroPublic` کی بجائے `response_model=HeroPublic` استعمال کرتے ہیں کیونکہ جو قدر ہم واپس کر رہے ہیں وہ دراصل `HeroPublic` *نہیں* ہے۔ + +اگر ہم `-> HeroPublic` declare کرتے، تو آپ کا editor اور linter (بجا طور پر) شکایت کرتا کہ آپ `HeroPublic` کی بجائے `Hero` واپس کر رہے ہیں۔ + +اسے `response_model` میں declare کر کے ہم **FastAPI** کو اپنا کام کرنے دے رہے ہیں، بغیر type annotations اور آپ کے editor اور دیگر tools کی مدد میں مداخلت کیے۔ + +/// + +### `HeroPublic` کے ساتھ Heroes پڑھیں { #read-heroes-with-heropublic } + +ہم پہلے کی طرح `Hero`s **پڑھ** سکتے ہیں، دوبارہ، ہم `response_model=list[HeroPublic]` استعمال کرتے ہیں تاکہ data درست طریقے سے validate اور serialize ہو۔ + +{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[65:72] hl[65] *} + +### `HeroPublic` کے ساتھ ایک Hero پڑھیں { #read-one-hero-with-heropublic } + +ہم ایک واحد hero **پڑھ** سکتے ہیں: + +{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[75:80] hl[77] *} + +### `HeroUpdate` کے ساتھ Hero کو اپ ڈیٹ کریں { #update-a-hero-with-heroupdate } + +ہم **hero کو اپ ڈیٹ** کر سکتے ہیں۔ اس کے لیے ہم HTTP `PATCH` operation استعمال کرتے ہیں۔ + +اور code میں، ہم client کی بھیجی گئی تمام data کے ساتھ ایک `dict` حاصل کرتے ہیں، **صرف client کی بھیجی گئی data**، ان قدروں کو چھوڑ کر جو صرف ڈیفالٹ قدروں کی وجہ سے وہاں ہوتیں۔ ایسا کرنے کے لیے ہم `exclude_unset=True` استعمال کرتے ہیں۔ یہ اصل چال ہے۔ 🪄 + +پھر ہم `hero_db.sqlmodel_update(hero_data)` استعمال کرتے ہیں تاکہ `hero_db` کو `hero_data` کے data سے اپ ڈیٹ کیا جائے۔ + +{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[83:93] hl[83:84,88:89] *} + +### Hero کو دوبارہ حذف کریں { #delete-a-hero-again } + +**Hero حذف کرنا** تقریباً وہی رہتا ہے۔ + +ہم اس بار ہر چیز کو refactor کرنے کی خواہش پوری نہیں کریں گے۔ 😅 + +{* ../../docs_src/sql_databases/tutorial002_an_py310.py ln[96:103] hl[101] *} + +### App دوبارہ چلائیں { #run-the-app-again } + +آپ app دوبارہ چلا سکتے ہیں: + +
+ +```console +$ fastapi dev + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +اگر آپ `/docs` API UI پر جائیں، تو آپ دیکھیں گے کہ اب یہ اپ ڈیٹ ہو چکا ہے، اور hero بناتے وقت client سے `id` کی توقع نہیں کرے گا، وغیرہ۔ + +
+ +
+ +## خلاصہ { #recap } + +آپ SQL database کے ساتھ تعامل کرنے اور *data models* اور *table models* کے ذریعے code کو آسان بنانے کے لیے [**SQLModel**](https://sqlmodel.tiangolo.com/) استعمال کر سکتے ہیں۔ + +آپ **SQLModel** دستاویزات میں بہت کچھ سیکھ سکتے ہیں، وہاں ایک طویل mini [tutorial **FastAPI** کے ساتھ SQLModel استعمال کرنے کا](https://sqlmodel.tiangolo.com/tutorial/fastapi/) موجود ہے۔ 🚀 diff --git a/docs/ur/docs/tutorial/static-files.md b/docs/ur/docs/tutorial/static-files.md new file mode 100644 index 000000000..1621285ed --- /dev/null +++ b/docs/ur/docs/tutorial/static-files.md @@ -0,0 +1,40 @@ +# Static Files { #static-files } + +آپ `StaticFiles` استعمال کر کے ایک directory سے static files خودکار طور پر serve کر سکتے ہیں۔ + +## `StaticFiles` استعمال کریں { #use-staticfiles } + +* `StaticFiles` import کریں۔ +* ایک مخصوص path پر `StaticFiles()` instance کو "Mount" کریں۔ + +{* ../../docs_src/static_files/tutorial001_py310.py hl[2,6] *} + +/// note | تکنیکی تفصیلات + +آپ `from starlette.staticfiles import StaticFiles` بھی استعمال کر سکتے ہیں۔ + +**FastAPI** آپ کی سہولت کے لیے وہی `starlette.staticfiles` بطور `fastapi.staticfiles` فراہم کرتا ہے۔ لیکن یہ دراصل براہ راست Starlette سے آتا ہے۔ + +/// + +### "Mounting" کیا ہے { #what-is-mounting } + +"Mounting" کا مطلب ہے ایک مکمل "آزاد" application کو کسی مخصوص path پر شامل کرنا، جو پھر تمام sub-paths کو handle کرنے کا ذمہ لے لیتی ہے۔ + +یہ `APIRouter` استعمال کرنے سے مختلف ہے کیونکہ mount شدہ application مکمل طور پر آزاد ہوتی ہے۔ آپ کی مرکزی application کا OpenAPI اور docs mount شدہ application سے کچھ بھی شامل نہیں کریں گے، وغیرہ۔ + +آپ اس کے بارے میں مزید [Advanced User Guide](../advanced/index.md) میں پڑھ سکتے ہیں۔ + +## تفصیلات { #details } + +پہلا `"/static"` اس sub-path سے مراد ہے جس پر یہ "sub-application" "mount" ہوگی۔ تو، کوئی بھی path جو `"/static"` سے شروع ہو اسے اس کے ذریعے handle کیا جائے گا۔ + +`directory="static"` آپ کی static files پر مشتمل directory کے نام سے مراد ہے۔ + +`name="static"` اسے ایک نام دیتا ہے جو **FastAPI** کی طرف سے اندرونی طور پر استعمال کیا جا سکتا ہے۔ + +یہ تمام parameters "`static`" سے مختلف ہو سکتے ہیں، انہیں اپنی application کی ضروریات اور مخصوص تفصیلات کے مطابق ایڈجسٹ کریں۔ + +## مزید معلومات { #more-info } + +مزید تفصیلات اور اختیارات کے لیے [Starlette کی Static Files کی دستاویزات](https://www.starlette.dev/staticfiles/) دیکھیں۔ diff --git a/docs/ur/docs/tutorial/stream-json-lines.md b/docs/ur/docs/tutorial/stream-json-lines.md new file mode 100644 index 000000000..9f737eefa --- /dev/null +++ b/docs/ur/docs/tutorial/stream-json-lines.md @@ -0,0 +1,111 @@ +# Stream JSON Lines { #stream-json-lines } + +آپ کے پاس data کی ایک ترتیب ہو سکتی ہے جسے آپ "**stream**" کی شکل میں بھیجنا چاہتے ہیں، آپ یہ **JSON Lines** کے ذریعے کر سکتے ہیں۔ + +/// info | معلومات + +FastAPI 0.134.0 میں شامل کیا گیا۔ + +/// + +## Stream کیا ہے؟ { #what-is-a-stream } + +"**Streaming**" data کا مطلب ہے کہ آپ کی app آئٹمز کی پوری ترتیب تیار ہونے کا انتظار کیے بغیر data آئٹمز client کو بھیجنا شروع کر دے گی۔ + +تو، یہ پہلا آئٹم بھیجے گی، client اسے وصول کر کے process کرنا شروع کرے گا، اور آپ ابھی بھی اگلا آئٹم تیار کر رہے ہوں گے۔ + +```mermaid +sequenceDiagram + participant App + participant Client + + App->>App: Produce Item 1 + App->>Client: Send Item 1 + App->>App: Produce Item 2 + Client->>Client: Process Item 1 + App->>Client: Send Item 2 + App->>App: Produce Item 3 + Client->>Client: Process Item 2 + App->>Client: Send Item 3 + Client->>Client: Process Item 3 + Note over App: Keeps producing... + Note over Client: Keeps consuming... +``` + +یہ ایک لامحدود stream بھی ہو سکتا ہے، جہاں آپ مسلسل data بھیجتے رہیں۔ + +## JSON Lines { #json-lines } + +ان صورتوں میں، "**JSON Lines**" بھیجنا عام ہے، جو ایک format ہے جہاں آپ فی لائن ایک JSON object بھیجتے ہیں۔ + +ایک response کا content type `application/jsonl` ہوگا (`application/json` کی بجائے) اور body کچھ اس طرح ہوگا: + +```json +{"name": "Plumbus", "description": "A multi-purpose household device."} +{"name": "Portal Gun", "description": "A portal opening device."} +{"name": "Meeseeks Box", "description": "A box that summons a Meeseeks."} +``` + +یہ JSON array (Python list کے مساوی) سے بہت ملتا جلتا ہے، لیکن `[]` میں wrap ہونے اور آئٹمز کے درمیان `,` ہونے کی بجائے، اس میں **فی لائن ایک JSON object** ہوتا ہے، جو نئی لائن کے حرف سے الگ ہوتے ہیں۔ + +/// info | معلومات + +اہم بات یہ ہے کہ آپ کی app ہر لائن باری باری تیار کر سکے گی، جبکہ client پچھلی لائنیں استعمال کرتا رہے گا۔ + +/// + +/// note | تکنیکی تفصیلات + +چونکہ ہر JSON object نئی لائن سے الگ ہوگا، وہ اپنے مواد میں حقیقی نئی لائن کے حروف نہیں رکھ سکتے، لیکن ان میں escaped نئی لائنیں (`\n`) ہو سکتی ہیں، جو JSON معیار کا حصہ ہے۔ + +لیکن عام طور پر آپ کو اس کی فکر نہیں کرنی پڑے گی، یہ خودکار طور پر ہوتا ہے، پڑھنا جاری رکھیں۔ 🤓 + +/// + +## استعمال کی صورتیں { #use-cases } + +آپ اسے **AI LLM** service، **logs** یا **telemetry**، یا دیگر اقسام کے data سے stream کرنے کے لیے استعمال کر سکتے ہیں جو **JSON** آئٹمز میں منظم ہو سکتے ہیں۔ + +/// tip | مشورہ + +اگر آپ binary data stream کرنا چاہتے ہیں، مثلاً video یا audio، تو advanced گائیڈ دیکھیں: [Stream Data](../advanced/stream-data.md)۔ + +/// + +## FastAPI کے ساتھ JSON Lines Stream کریں { #stream-json-lines-with-fastapi } + +FastAPI کے ساتھ JSON Lines stream کرنے کے لیے آپ اپنے *path operation function* میں `return` کی بجائے `yield` استعمال کر سکتے ہیں تاکہ ہر آئٹم باری باری تیار ہو۔ + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[24] *} + +اگر ہر JSON آئٹم جو آپ واپس بھیجنا چاہتے ہیں وہ `Item` قسم (ایک Pydantic model) کا ہے اور یہ ایک async function ہے، تو آپ return type کو `AsyncIterable[Item]` declare کر سکتے ہیں: + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[1:24] hl[9:11,22] *} + +اگر آپ return type declare کرتے ہیں، تو FastAPI اسے Pydantic استعمال کرتے ہوئے data کو **validate**، OpenAPI میں **document**، **filter**، اور **serialize** کرنے کے لیے استعمال کرے گا۔ + +/// tip | مشورہ + +چونکہ Pydantic اسے **Rust** کی طرف سے serialize کرے گا، آپ کو return type declare نہ کرنے کی نسبت بہت زیادہ **performance** ملے گی۔ + +/// + +### غیر async *path operation functions* { #non-async-path-operation-functions } + +آپ عام `def` functions (بغیر `async`) بھی استعمال کر سکتے ہیں، اور اسی طرح `yield` استعمال کر سکتے ہیں۔ + +FastAPI یقینی بنائے گا کہ یہ درست طریقے سے چلے تاکہ event loop block نہ ہو۔ + +اس صورت میں چونکہ function async نہیں ہے، صحیح return type `Iterable[Item]` ہوگا: + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[27:30] hl[28] *} + +### بغیر Return Type { #no-return-type } + +آپ return type بھی چھوڑ سکتے ہیں۔ FastAPI پھر data کو JSON میں serialize ہونے کے قابل کسی چیز میں تبدیل کرنے کے لیے [`jsonable_encoder`](./encoder.md) استعمال کرے گا اور پھر اسے JSON Lines کے طور پر بھیجے گا۔ + +{* ../../docs_src/stream_json_lines/tutorial001_py310.py ln[33:36] hl[34] *} + +## Server-Sent Events (SSE) { #server-sent-events-sse } + +FastAPI میں Server-Sent Events (SSE) کے لیے بھی فرسٹ کلاس حمایت موجود ہے، جو کافی ملتے جلتے ہیں لیکن چند اضافی تفصیلات کے ساتھ۔ آپ ان کے بارے میں اگلے باب میں سیکھ سکتے ہیں: [Server-Sent Events (SSE)](server-sent-events.md)۔ 🤓 diff --git a/docs/ur/docs/tutorial/testing.md b/docs/ur/docs/tutorial/testing.md new file mode 100644 index 000000000..20d277766 --- /dev/null +++ b/docs/ur/docs/tutorial/testing.md @@ -0,0 +1,190 @@ +# Testing { #testing } + +[Starlette](https://www.starlette.dev/testclient/) کی بدولت، **FastAPI** applications کی testing آسان اور خوشگوار ہے۔ + +یہ [HTTPX](https://www.python-httpx.org) پر مبنی ہے، جو بدلے میں Requests کی بنیاد پر ڈیزائن کیا گیا ہے، تو یہ بہت مانوس اور بدیہی ہے۔ + +اس کے ساتھ، آپ [pytest](https://docs.pytest.org/) کو براہ راست **FastAPI** کے ساتھ استعمال کر سکتے ہیں۔ + +## `TestClient` استعمال کرنا { #using-testclient } + +/// info | معلومات + +`TestClient` استعمال کرنے کے لیے، پہلے [`httpx`](https://www.python-httpx.org) انسٹال کریں۔ + +یقینی بنائیں کہ آپ نے [virtual environment](../virtual-environments.md) بنایا ہے، اسے فعال کیا ہے، اور پھر اسے انسٹال کریں، مثال کے طور پر: + +```console +$ pip install httpx +``` + +/// + +`TestClient` import کریں۔ + +اپنی **FastAPI** application کو اس میں منتقل کرتے ہوئے ایک `TestClient` بنائیں۔ + +`test_` سے شروع ہونے والے نام کے ساتھ functions بنائیں (یہ `pytest` کا معیاری طریقہ ہے)۔ + +`TestClient` object کو بالکل اسی طرح استعمال کریں جیسے آپ `httpx` استعمال کرتے ہیں۔ + +جن چیزوں کو چیک کرنا ہے ان کے لیے معیاری Python expressions کے ساتھ سادہ `assert` statements لکھیں (پھر سے، معیاری `pytest`)۔ + +{* ../../docs_src/app_testing/tutorial001_py310.py hl[2,12,15:18] *} + +/// tip | مشورہ + +دیکھیں کہ testing functions عام `def` ہیں، `async def` نہیں۔ + +اور client کی calls بھی عام calls ہیں، `await` استعمال نہیں کر رہیں۔ + +یہ آپ کو بغیر کسی پیچیدگی کے `pytest` براہ راست استعمال کرنے دیتا ہے۔ + +/// + +/// note | تکنیکی تفصیلات + +آپ `from starlette.testclient import TestClient` بھی استعمال کر سکتے ہیں۔ + +**FastAPI** آپ کی سہولت کے لیے وہی `starlette.testclient` بطور `fastapi.testclient` فراہم کرتا ہے۔ لیکن یہ براہ راست Starlette سے آتا ہے۔ + +/// + +/// tip | مشورہ + +اگر آپ اپنے tests میں FastAPI application کو requests بھیجنے کے علاوہ `async` functions call کرنا چاہتے ہیں (مثلاً asynchronous database functions)، تو advanced tutorial میں [Async Tests](../advanced/async-tests.md) دیکھیں۔ + +/// + +## Tests کو الگ کرنا { #separating-tests } + +حقیقی application میں، آپ شاید اپنے tests ایک مختلف فائل میں رکھیں گے۔ + +اور آپ کی **FastAPI** application بھی کئی فائلوں/modules وغیرہ پر مشتمل ہو سکتی ہے۔ + +### **FastAPI** app فائل { #fastapi-app-file } + +فرض کریں آپ کے پاس [Bigger Applications](bigger-applications.md) میں بیان کردہ فائل ساخت ہے: + +``` +. +├── app +│ ├── __init__.py +│ └── main.py +``` + +فائل `main.py` میں آپ کی **FastAPI** app ہے: + +{* ../../docs_src/app_testing/app_a_py310/main.py *} + +### Testing فائل { #testing-file } + +پھر آپ کے پاس اپنے tests کے ساتھ ایک `test_main.py` فائل ہو سکتی ہے۔ یہ اسی Python package میں رہ سکتی ہے (وہی directory جس میں `__init__.py` فائل ہو): + +``` hl_lines="5" +. +├── app +│ ├── __init__.py +│ ├── main.py +│ └── test_main.py +``` + +چونکہ یہ فائل اسی package میں ہے، آپ `main` module (`main.py`) سے object `app` import کرنے کے لیے relative imports استعمال کر سکتے ہیں: + +{* ../../docs_src/app_testing/app_a_py310/test_main.py hl[3] *} + +...اور tests کا code پہلے کی طرح ہی ہوگا۔ + +## Testing: توسیعی مثال { #testing-extended-example } + +اب آئیں اس مثال کو بڑھائیں اور مختلف حصوں کو test کرنے کا طریقہ دیکھنے کے لیے مزید تفصیلات شامل کریں۔ + +### توسیعی **FastAPI** app فائل { #extended-fastapi-app-file } + +آئیں پہلے جیسی فائل ساخت جاری رکھتے ہیں: + +``` +. +├── app +│ ├── __init__.py +│ ├── main.py +│ └── test_main.py +``` + +فرض کریں اب فائل `main.py` آپ کی **FastAPI** app کے ساتھ کچھ اور **path operations** رکھتی ہے۔ + +اس میں ایک `GET` operation ہے جو error واپس کر سکتا ہے۔ + +اس میں ایک `POST` operation ہے جو کئی errors واپس کر سکتا ہے۔ + +دونوں *path operations* کو ایک `X-Token` header درکار ہے۔ + +{* ../../docs_src/app_testing/app_b_an_py310/main.py *} + +### توسیعی testing فائل { #extended-testing-file } + +پھر آپ توسیعی tests کے ساتھ `test_main.py` اپ ڈیٹ کر سکتے ہیں: + +{* ../../docs_src/app_testing/app_b_an_py310/test_main.py *} + +جب بھی آپ کو client کی request میں معلومات منتقل کرنے کی ضرورت ہو اور آپ نہیں جانتے کہ کیسے، تو آپ (Google پر) تلاش کر سکتے ہیں کہ `httpx` میں یہ کیسے کیا جاتا ہے، یا `requests` میں بھی، کیونکہ HTTPX کا ڈیزائن Requests کے ڈیزائن پر مبنی ہے۔ + +پھر آپ اپنے tests میں بالکل وہی کریں۔ + +مثلاً: + +* *path* یا *query* parameter منتقل کرنے کے لیے، اسے خود URL میں شامل کریں۔ +* JSON body منتقل کرنے کے لیے، ایک Python object (مثلاً `dict`) `json` parameter میں دیں۔ +* JSON کی بجائے اگر آپ کو *Form Data* بھیجنا ہے تو `data` parameter استعمال کریں۔ +* *headers* منتقل کرنے کے لیے، `headers` parameter میں `dict` استعمال کریں۔ +* *cookies* کے لیے، `cookies` parameter میں `dict`۔ + +Backend کو data منتقل کرنے کے بارے میں مزید معلومات (`httpx` یا `TestClient` استعمال کرتے ہوئے) کے لیے [HTTPX دستاویزات](https://www.python-httpx.org) دیکھیں۔ + +/// info | معلومات + +نوٹ کریں کہ `TestClient` ایسا data وصول کرتا ہے جسے JSON میں تبدیل کیا جا سکے، Pydantic models نہیں۔ + +اگر آپ کے test میں Pydantic model ہے اور آپ testing کے دوران اس کا data application کو بھیجنا چاہتے ہیں، تو آپ [JSON Compatible Encoder](encoder.md) میں بیان کردہ `jsonable_encoder` استعمال کر سکتے ہیں۔ + +/// + +## اسے چلائیں { #run-it } + +اس کے بعد، آپ کو صرف `pytest` انسٹال کرنا ہے۔ + +یقینی بنائیں کہ آپ نے [virtual environment](../virtual-environments.md) بنایا ہے، اسے فعال کیا ہے، اور پھر اسے انسٹال کریں، مثال کے طور پر: + +
+ +```console +$ pip install pytest + +---> 100% +``` + +
+ +یہ خودکار طور پر فائلیں اور tests تلاش کرے گا، انہیں execute کرے گا، اور نتائج آپ کو بتائے گا۔ + +Tests اس طرح چلائیں: + +
+ +```console +$ pytest + +================ test session starts ================ +platform linux -- Python 3.6.9, pytest-5.3.5, py-1.8.1, pluggy-0.13.1 +rootdir: /home/user/code/superawesome-cli/app +plugins: forked-1.1.3, xdist-1.31.0, cov-2.8.1 +collected 6 items + +---> 100% + +test_main.py ...... [100%] + +================= 1 passed in 0.03s ================= +``` + +
diff --git a/docs/ur/docs/virtual-environments.md b/docs/ur/docs/virtual-environments.md new file mode 100644 index 000000000..536d1f5f7 --- /dev/null +++ b/docs/ur/docs/virtual-environments.md @@ -0,0 +1,864 @@ +# Virtual Environments { #virtual-environments } + +جب آپ Python projects میں کام کرتے ہیں تو آپ کو شاید **virtual environment** (یا اسی طرح کا کوئی طریقہ) استعمال کرنا چاہیے تاکہ ہر project کے لیے install کیے جانے والے packages الگ رہیں۔ + +/// info | معلومات + +اگر آپ پہلے سے virtual environments کے بارے میں جانتے ہیں، انہیں بنانا اور استعمال کرنا جانتے ہیں، تو آپ اس سیکشن کو چھوڑنا چاہیں گے۔ 🤓 + +/// + +/// tip | مشورہ + +**Virtual environment**، **environment variable** سے مختلف ہے۔ + +**Environment variable** system میں ایک variable ہے جو programs استعمال کر سکتے ہیں۔ + +**Virtual environment** کچھ فائلوں والی ایک directory ہے۔ + +/// + +/// info | معلومات + +یہ صفحہ آپ کو سکھائے گا کہ **virtual environments** کو کیسے استعمال کریں اور یہ کیسے کام کرتے ہیں۔ + +اگر آپ ایسا **tool اپنانے کے لیے تیار ہیں جو سب کچھ** آپ کے لیے manage کرے (بشمول Python install کرنا)، [uv](https://github.com/astral-sh/uv) آزمائیں۔ + +/// + +## Project بنائیں { #create-a-project } + +پہلے، اپنے project کے لیے ایک directory بنائیں۔ + +میں عام طور پر اپنی home/user directory کے اندر `code` نامی directory بناتا ہوں۔ + +اور اس کے اندر ہر project کے لیے ایک directory بناتا ہوں۔ + +
+ +```console +// Go to the home directory +$ cd +// Create a directory for all your code projects +$ mkdir code +// Enter into that code directory +$ cd code +// Create a directory for this project +$ mkdir awesome-project +// Enter into that project directory +$ cd awesome-project +``` + +
+ +## Virtual Environment بنائیں { #create-a-virtual-environment } + +جب آپ Python project پر **پہلی بار** کام شروع کرتے ہیں، اپنے project کے **اندر** ایک virtual environment بنائیں۔ + +/// tip | مشورہ + +یہ آپ کو صرف **ایک بار فی project** کرنا ہے، ہر بار کام کرتے وقت نہیں۔ + +/// + +//// tab | `venv` + +Virtual environment بنانے کے لیے، آپ `venv` module استعمال کر سکتے ہیں جو Python کے ساتھ آتا ہے۔ + +
+ +```console +$ python -m venv .venv +``` + +
+ +/// details | اس command کا مطلب + +* `python`: `python` نامی program استعمال کریں +* `-m`: ایک module کو script کے طور پر call کریں، ہم بتائیں گے کون سا module +* `venv`: `venv` نامی module استعمال کریں جو عام طور پر Python کے ساتھ install آتا ہے +* `.venv`: نئی directory `.venv` میں virtual environment بنائیں + +/// + +//// + +//// tab | `uv` + +اگر آپ کے پاس [`uv`](https://github.com/astral-sh/uv) install ہے، تو آپ اسے virtual environment بنانے کے لیے استعمال کر سکتے ہیں۔ + +
+ +```console +$ uv venv +``` + +
+ +/// tip | مشورہ + +بطور default، `uv` ایک `.venv` نامی directory میں virtual environment بنائے گا۔ + +لیکن آپ directory name کے ساتھ اضافی argument دے کر اسے customize کر سکتے ہیں۔ + +/// + +//// + +یہ command `.venv` نامی directory میں ایک نیا virtual environment بناتا ہے۔ + +/// details | `.venv` یا دوسرا نام + +آپ virtual environment کسی مختلف directory میں بنا سکتے ہیں، لیکن اسے `.venv` کہنے کا رواج ہے۔ + +/// + +## Virtual Environment فعال کریں { #activate-the-virtual-environment } + +نیا virtual environment فعال کریں تاکہ آپ جو بھی Python command چلائیں یا package install کریں وہ اسے استعمال کرے۔ + +/// tip | مشورہ + +یہ **ہر بار** کریں جب آپ project پر کام کرنے کے لیے **نیا terminal session** شروع کریں۔ + +/// + +//// tab | Linux, macOS + +
+ +```console +$ source .venv/bin/activate +``` + +
+ +//// + +//// tab | Windows PowerShell + +
+ +```console +$ .venv\Scripts\Activate.ps1 +``` + +
+ +//// + +//// tab | Windows Bash + +یا اگر آپ Windows کے لیے Bash استعمال کرتے ہیں (مثلاً [Git Bash](https://gitforwindows.org/)): + +
+ +```console +$ source .venv/Scripts/activate +``` + +
+ +//// + +/// tip | مشورہ + +ہر بار جب آپ اس ماحول میں **نیا package** install کریں، ماحول کو دوبارہ **فعال** کریں۔ + +یہ یقینی بناتا ہے کہ اگر آپ اس package کا install کیا ہوا **terminal (CLI) program** استعمال کرتے ہیں، تو آپ اپنے virtual environment والا استعمال کرتے ہیں نہ کہ کوئی اور جو عالمی سطح پر install ہو، ممکنہ طور پر آپ کی ضرورت سے مختلف ورژن کے ساتھ۔ + +/// + +## چیک کریں کہ Virtual Environment فعال ہے { #check-the-virtual-environment-is-active } + +چیک کریں کہ virtual environment فعال ہے (پچھلا command کام کیا)۔ + +/// tip | مشورہ + +یہ **اختیاری** ہے، لیکن یہ **چیک** کرنے کا اچھا طریقہ ہے کہ سب کچھ توقع کے مطابق کام کر رہا ہے اور آپ وہ virtual environment استعمال کر رہے ہیں جس کا آپ ارادہ رکھتے ہیں۔ + +/// + +//// tab | Linux, macOS, Windows Bash + +
+ +```console +$ which python + +/home/user/code/awesome-project/.venv/bin/python +``` + +
+ +اگر یہ `.venv/bin/python` پر `python` binary دکھاتا ہے، آپ کے project (اس صورت میں `awesome-project`) کے اندر، تو یہ کام کر گیا۔ 🎉 + +//// + +//// tab | Windows PowerShell + +
+ +```console +$ Get-Command python + +C:\Users\user\code\awesome-project\.venv\Scripts\python +``` + +
+ +اگر یہ `.venv\Scripts\python` پر `python` binary دکھاتا ہے، آپ کے project (اس صورت میں `awesome-project`) کے اندر، تو یہ کام کر گیا۔ 🎉 + +//// + +## `pip` اپگریڈ کریں { #upgrade-pip } + +/// tip | مشورہ + +اگر آپ [`uv`](https://github.com/astral-sh/uv) استعمال کرتے ہیں تو آپ `pip` کی بجائے اسے چیزیں install کرنے کے لیے استعمال کریں گے، تو آپ کو `pip` اپگریڈ کرنے کی ضرورت نہیں۔ 😎 + +/// + +اگر آپ packages install کرنے کے لیے `pip` استعمال کر رہے ہیں (یہ Python کے ساتھ بطور default آتا ہے)، تو آپ کو اسے تازہ ترین ورژن میں **اپگریڈ** کرنا چاہیے۔ + +Package install کرتے وقت بہت سی عجیب errors صرف `pip` کو پہلے اپگریڈ کرنے سے حل ہو جاتی ہیں۔ + +/// tip | مشورہ + +آپ عام طور پر یہ **ایک بار** کریں گے، virtual environment بنانے کے فوراً بعد۔ + +/// + +یقینی بنائیں کہ virtual environment فعال ہے (اوپر والے command سے) اور پھر چلائیں: + +
+ +```console +$ python -m pip install --upgrade pip + +---> 100% +``` + +
+ +/// tip | مشورہ + +بعض اوقات، pip اپگریڈ کرنے کی کوشش کرتے وقت آپ کو **`No module named pip`** error مل سکتی ہے۔ + +اگر ایسا ہو تو نیچے دیے گئے command سے pip install اور اپگریڈ کریں: + +
+ +```console +$ python -m ensurepip --upgrade + +---> 100% +``` + +
+ +یہ command pip install کرے گا اگر پہلے سے install نہیں ہے اور یقینی بناتا ہے کہ pip کا install شدہ ورژن کم از کم `ensurepip` میں دستیاب ورژن جتنا حالیہ ہو۔ + +/// + +## `.gitignore` شامل کریں { #add-gitignore } + +اگر آپ **Git** استعمال کر رہے ہیں (آپ کو کرنا چاہیے)، تو `.gitignore` فائل شامل کریں تاکہ `.venv` میں موجود ہر چیز Git سے باہر رہے۔ + +/// tip | مشورہ + +اگر آپ نے virtual environment بنانے کے لیے [`uv`](https://github.com/astral-sh/uv) استعمال کیا، تو اس نے پہلے سے یہ آپ کے لیے کر دیا ہے، آپ یہ مرحلہ چھوڑ سکتے ہیں۔ 😎 + +/// + +/// tip | مشورہ + +یہ **ایک بار** کریں، virtual environment بنانے کے فوراً بعد۔ + +/// + +
+ +```console +$ echo "*" > .venv/.gitignore +``` + +
+ +/// details | اس command کا مطلب + +* `echo "*"`: terminal میں `*` متن "print" کرے گا (اگلا حصہ اسے تھوڑا بدل دیتا ہے) +* `>`: `>` کے بائیں والے command سے terminal میں print ہونے والی ہر چیز print نہیں ہونی چاہیے بلکہ `>` کے دائیں والی فائل میں لکھی جانی چاہیے +* `.gitignore`: اس فائل کا نام جس میں متن لکھا جائے + +اور Git کے لیے `*` کا مطلب ہے "سب کچھ"۔ تو یہ `.venv` directory میں موجود ہر چیز کو نظرانداز کر دے گا۔ + +یہ command `.gitignore` فائل بنائے گا اس مواد کے ساتھ: + +```gitignore +* +``` + +/// + +## Packages Install کریں { #install-packages } + +ماحول فعال کرنے کے بعد، آپ اس میں packages install کر سکتے ہیں۔ + +/// tip | مشورہ + +یہ **ایک بار** کریں جب آپ کے project کی ضروری packages install یا اپگریڈ کر رہے ہوں۔ + +اگر آپ کو ورژن اپگریڈ کرنا ہو یا نیا package شامل کرنا ہو تو آپ **دوبارہ یہ کریں**۔ + +/// + +### Packages براہ راست Install کریں { #install-packages-directly } + +اگر آپ جلدی میں ہیں اور اپنے project کی package ضروریات declare کرنے کے لیے فائل استعمال نہیں کرنا چاہتے، تو آپ انہیں براہ راست install کر سکتے ہیں۔ + +/// tip | مشورہ + +Packages اور ورژنز جو آپ کے program کو ضرورت ہیں انہیں فائل میں (مثلاً `requirements.txt` یا `pyproject.toml`) رکھنا (بہت) اچھا خیال ہے۔ + +/// + +//// tab | `pip` + +
+ +```console +$ pip install "fastapi[standard]" + +---> 100% +``` + +
+ +//// + +//// tab | `uv` + +اگر آپ کے پاس [`uv`](https://github.com/astral-sh/uv) ہے: + +
+ +```console +$ uv pip install "fastapi[standard]" +---> 100% +``` + +
+ +//// + +### `requirements.txt` سے Install کریں { #install-from-requirements-txt } + +اگر آپ کے پاس `requirements.txt` ہے، تو آپ اب اسے استعمال کرکے packages install کر سکتے ہیں۔ + +//// tab | `pip` + +
+ +```console +$ pip install -r requirements.txt +---> 100% +``` + +
+ +//// + +//// tab | `uv` + +اگر آپ کے پاس [`uv`](https://github.com/astral-sh/uv) ہے: + +
+ +```console +$ uv pip install -r requirements.txt +---> 100% +``` + +
+ +//// + +/// details | `requirements.txt` + +کچھ packages والا `requirements.txt` اس طرح نظر آ سکتا ہے: + +```requirements.txt +fastapi[standard]==0.113.0 +pydantic==2.8.0 +``` + +/// + +## اپنا Program چلائیں { #run-your-program } + +Virtual environment فعال کرنے کے بعد، آپ اپنا program چلا سکتے ہیں، اور یہ آپ کے virtual environment کے اندر والا Python وہاں install کیے گئے packages کے ساتھ استعمال کرے گا۔ + +
+ +```console +$ python main.py + +Hello World +``` + +
+ +## اپنا Editor Configure کریں { #configure-your-editor } + +آپ شاید ایک editor استعمال کریں گے، یقینی بنائیں کہ آپ اسے وہی virtual environment استعمال کرنے کے لیے configure کریں جو آپ نے بنایا (یہ شاید خودکار طور پر detect ہو جائے) تاکہ آپ کو autocompletion اور inline errors ملیں۔ + +مثال کے طور پر: + +* [VS Code](https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment) +* [PyCharm](https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html) + +/// tip | مشورہ + +آپ کو عام طور پر یہ صرف **ایک بار** کرنا ہوگا، جب آپ virtual environment بناتے ہیں۔ + +/// + +## Virtual Environment غیر فعال کریں { #deactivate-the-virtual-environment } + +جب آپ اپنے project پر کام مکمل کر لیں تو آپ virtual environment **غیر فعال** کر سکتے ہیں۔ + +
+ +```console +$ deactivate +``` + +
+ +اس طرح، جب آپ `python` چلائیں گے تو یہ اس virtual environment سے وہاں install کیے گئے packages کے ساتھ چلانے کی کوشش نہیں کرے گا۔ + +## کام کے لیے تیار { #ready-to-work } + +اب آپ اپنے project پر کام شروع کرنے کے لیے تیار ہیں۔ + + + +/// tip | مشورہ + +کیا آپ سمجھنا چاہتے ہیں کہ اوپر والا سب کیا ہے؟ + +پڑھتے رہیں۔ 👇🤓 + +/// + +## Virtual Environments کیوں { #why-virtual-environments } + +FastAPI کے ساتھ کام کرنے کے لیے آپ کو [Python](https://www.python.org/) install کرنا ہوگا۔ + +اس کے بعد، آپ کو FastAPI اور جو بھی دوسرے **packages** چاہئیں وہ **install** کرنے ہوں گے۔ + +Packages install کرنے کے لیے آپ عام طور پر `pip` command استعمال کریں گے جو Python کے ساتھ آتا ہے (یا ملتے جلتے متبادل)۔ + +تاہم، اگر آپ صرف `pip` براہ راست استعمال کریں، تو packages آپ کے **عالمی Python ماحول** (Python کی عالمی installation) میں install ہوں گے۔ + +### مسئلہ { #the-problem } + +تو عالمی Python ماحول میں packages install کرنے میں کیا مسئلہ ہے؟ + +کسی وقت، آپ شاید بہت سے مختلف programs لکھیں گے جو **مختلف packages** پر منحصر ہیں۔ اور آپ کے کچھ projects ایک ہی package کے **مختلف ورژنز** پر منحصر ہوں گے۔ 😱 + +مثلاً، آپ `philosophers-stone` نامی project بنا سکتے ہیں، یہ program **`harry`، ورژن `1` استعمال کرنے والے** دوسرے package پر منحصر ہے۔ تو آپ کو `harry` install کرنا ہوگا۔ + +```mermaid +flowchart LR + stone(philosophers-stone) -->|requires| harry-1[harry v1] +``` + +پھر، کچھ عرصے بعد، آپ `prisoner-of-azkaban` نامی دوسرا project بناتے ہیں، اور یہ project بھی `harry` پر منحصر ہے، لیکن اس project کو **`harry` ورژن `3`** چاہیے۔ + +```mermaid +flowchart LR + azkaban(prisoner-of-azkaban) --> |requires| harry-3[harry v3] +``` + +لیکن اب مسئلہ یہ ہے کہ اگر آپ packages عالمی سطح پر (عالمی ماحول میں) install کریں تو مقامی **virtual environment** کی بجائے، آپ کو `harry` کا کون سا ورژن install کرنا ہے یہ فیصلہ کرنا ہوگا۔ + +اگر آپ `philosophers-stone` چلانا چاہیں تو پہلے `harry` ورژن `1` install کرنا ہوگا، مثلاً: + +
+ +```console +$ pip install "harry==1" +``` + +
+ +اور پھر آپ کے عالمی Python ماحول میں `harry` ورژن `1` install ہو جائے گا۔ + +```mermaid +flowchart LR + subgraph global[global env] + harry-1[harry v1] + end + subgraph stone-project[philosophers-stone project] + stone(philosophers-stone) -->|requires| harry-1 + end +``` + +لیکن پھر اگر آپ `prisoner-of-azkaban` چلانا چاہیں، تو آپ کو `harry` ورژن `1` uninstall کرنا ہوگا اور `harry` ورژن `3` install کرنا ہوگا (یا صرف ورژن `3` install کرنے سے خودکار طور پر ورژن `1` uninstall ہو جائے گا)۔ + +
+ +```console +$ pip install "harry==3" +``` + +
+ +اور پھر آپ کے عالمی Python ماحول میں `harry` ورژن `3` install ہو جائے گا۔ + +اور اگر آپ `philosophers-stone` دوبارہ چلانے کی کوشش کریں، تو اچھا امکان ہے کہ یہ **کام نہ کرے** کیونکہ اسے `harry` ورژن `1` چاہیے۔ + +```mermaid +flowchart LR + subgraph global[global env] + harry-1[harry v1] + style harry-1 fill:#ccc,stroke-dasharray: 5 5 + harry-3[harry v3] + end + subgraph stone-project[philosophers-stone project] + stone(philosophers-stone) -.-x|⛔️| harry-1 + end + subgraph azkaban-project[prisoner-of-azkaban project] + azkaban(prisoner-of-azkaban) --> |requires| harry-3 + end +``` + +/// tip | مشورہ + +Python packages میں **نئے ورژنز** میں **breaking changes** سے بچنے کی بہترین کوشش کی جاتی ہے، لیکن محفوظ رہنا بہتر ہے، اور نئے ورژنز جان بوجھ کر اور جب آپ tests چلا کر چیک کر سکیں کہ سب کچھ ٹھیک کام کر رہا ہے تب install کریں۔ + +/// + +اب تصور کریں یہ **بہت سے** دوسرے **packages** کے ساتھ جن پر آپ کے **تمام projects** منحصر ہوں۔ اسے manage کرنا بہت مشکل ہے۔ اور آپ شاید کچھ projects **ناموافق ورژنز** والے packages کے ساتھ چلا لیں، اور نہ جانیں کہ کچھ کیوں کام نہیں کر رہا۔ + +نیز، آپ کے operating system (مثلاً Linux، Windows، macOS) پر منحصر، یہ Python پہلے سے install آ سکتا ہے۔ اور اس صورت میں شاید کچھ packages مخصوص ورژنز کے ساتھ پہلے سے install ہوں جو **آپ کے system کو** ضرورت ہوں۔ اگر آپ عالمی Python ماحول میں packages install کریں، تو آپ اپنے operating system کے ساتھ آنے والے کچھ programs **توڑ** سکتے ہیں۔ + +## Packages کہاں Install ہوتے ہیں { #where-are-packages-installed } + +جب آپ Python install کرتے ہیں، یہ آپ کے computer میں کچھ فائلوں کے ساتھ کچھ directories بناتا ہے۔ + +ان میں سے کچھ directories آپ کے install کیے جانے والے تمام packages رکھنے کی ذمہ دار ہیں۔ + +جب آپ چلاتے ہیں: + +
+ +```console +// Don't run this now, it's just an example 🤓 +$ pip install "fastapi[standard]" +---> 100% +``` + +
+ +یہ FastAPI code کے ساتھ ایک compressed فائل download کرے گا، عام طور پر [PyPI](https://pypi.org/project/fastapi/) سے۔ + +یہ ان دوسرے packages کی فائلیں بھی **download** کرے گا جن پر FastAPI منحصر ہے۔ + +پھر یہ ان تمام فائلوں کو **extract** کرے گا اور آپ کے computer میں ایک directory میں ڈالے گا۔ + +بطور default، یہ ان download اور extract کی گئی فائلوں کو آپ کی Python installation کے ساتھ آنے والی directory میں ڈالے گا، یہ **عالمی ماحول** ہے۔ + +## Virtual Environments کیا ہیں { #what-are-virtual-environments } + +عالمی ماحول میں تمام packages رکھنے کے مسائل کا حل یہ ہے کہ ہر project کے لیے **virtual environment** استعمال کریں۔ + +Virtual environment ایک **directory** ہے، عالمی ماحول سے بہت ملتی جلتی، جہاں آپ project کے لیے packages install کر سکتے ہیں۔ + +اس طرح، ہر project کا اپنا virtual environment (`.venv` directory) اپنے packages کے ساتھ ہوگا۔ + +```mermaid +flowchart TB + subgraph stone-project[philosophers-stone project] + stone(philosophers-stone) --->|requires| harry-1 + subgraph venv1[.venv] + harry-1[harry v1] + end + end + subgraph azkaban-project[prisoner-of-azkaban project] + azkaban(prisoner-of-azkaban) --->|requires| harry-3 + subgraph venv2[.venv] + harry-3[harry v3] + end + end + stone-project ~~~ azkaban-project +``` + +## Virtual Environment فعال کرنے کا مطلب { #what-does-activating-a-virtual-environment-mean } + +جب آپ virtual environment فعال کرتے ہیں، مثلاً: + +//// tab | Linux, macOS + +
+ +```console +$ source .venv/bin/activate +``` + +
+ +//// + +//// tab | Windows PowerShell + +
+ +```console +$ .venv\Scripts\Activate.ps1 +``` + +
+ +//// + +//// tab | Windows Bash + +یا اگر آپ Windows کے لیے Bash استعمال کرتے ہیں (مثلاً [Git Bash](https://gitforwindows.org/)): + +
+ +```console +$ source .venv/Scripts/activate +``` + +
+ +//// + +یہ command کچھ [environment variables](environment-variables.md) بنائے یا تبدیل کرے گا جو اگلے commands کے لیے دستیاب ہوں گے۔ + +ان variables میں سے ایک `PATH` variable ہے۔ + +/// tip | مشورہ + +آپ `PATH` environment variable کے بارے میں مزید [Environment Variables](environment-variables.md#path-environment-variable) سیکشن میں سیکھ سکتے ہیں۔ + +/// + +Virtual environment فعال کرنا اس کا path `.venv/bin` (Linux اور macOS پر) یا `.venv\Scripts` (Windows پر) `PATH` environment variable میں شامل کرتا ہے۔ + +فرض کریں کہ ماحول فعال کرنے سے پہلے `PATH` variable اس طرح نظر آتا تھا: + +//// tab | Linux, macOS + +```plaintext +/usr/bin:/bin:/usr/sbin:/sbin +``` + +اس کا مطلب ہے کہ system ان directories میں programs تلاش کرے گا: + +* `/usr/bin` +* `/bin` +* `/usr/sbin` +* `/sbin` + +//// + +//// tab | Windows + +```plaintext +C:\Windows\System32 +``` + +اس کا مطلب ہے کہ system ان directories میں programs تلاش کرے گا: + +* `C:\Windows\System32` + +//// + +Virtual environment فعال کرنے کے بعد، `PATH` variable کچھ اس طرح نظر آئے گا: + +//// tab | Linux, macOS + +```plaintext +/home/user/code/awesome-project/.venv/bin:/usr/bin:/bin:/usr/sbin:/sbin +``` + +اس کا مطلب ہے کہ system اب پہلے ان programs کو تلاش کرے گا: + +```plaintext +/home/user/code/awesome-project/.venv/bin +``` + +دوسری directories میں دیکھنے سے پہلے۔ + +تو جب آپ terminal میں `python` ٹائپ کریں گے، system Python program یہاں تلاش کرے گا: + +```plaintext +/home/user/code/awesome-project/.venv/bin/python +``` + +اور اسے استعمال کرے گا۔ + +//// + +//// tab | Windows + +```plaintext +C:\Users\user\code\awesome-project\.venv\Scripts;C:\Windows\System32 +``` + +اس کا مطلب ہے کہ system اب پہلے ان programs کو تلاش کرے گا: + +```plaintext +C:\Users\user\code\awesome-project\.venv\Scripts +``` + +دوسری directories میں دیکھنے سے پہلے۔ + +تو جب آپ terminal میں `python` ٹائپ کریں گے، system Python program یہاں تلاش کرے گا: + +```plaintext +C:\Users\user\code\awesome-project\.venv\Scripts\python +``` + +اور اسے استعمال کرے گا۔ + +//// + +ایک اہم تفصیل یہ ہے کہ یہ virtual environment کا path `PATH` variable کی **شروعات** میں رکھے گا۔ System اسے کسی بھی دوسرے دستیاب Python سے **پہلے** تلاش کرے گا۔ اس طرح، جب آپ `python` چلائیں، یہ کسی بھی دوسرے `python` (مثلاً عالمی ماحول سے `python`) کی بجائے **virtual environment والا** Python استعمال کرے گا۔ + +Virtual environment فعال کرنا چند اور چیزیں بھی بدلتا ہے، لیکن یہ اس کے سب سے اہم کاموں میں سے ایک ہے۔ + +## Virtual Environment چیک کرنا { #checking-a-virtual-environment } + +جب آپ چیک کرتے ہیں کہ virtual environment فعال ہے، مثلاً: + +//// tab | Linux, macOS, Windows Bash + +
+ +```console +$ which python + +/home/user/code/awesome-project/.venv/bin/python +``` + +
+ +//// + +//// tab | Windows PowerShell + +
+ +```console +$ Get-Command python + +C:\Users\user\code\awesome-project\.venv\Scripts\python +``` + +
+ +//// + +اس کا مطلب ہے کہ جو `python` program استعمال ہوگا وہ **virtual environment** میں والا ہے۔ + +آپ Linux اور macOS پر `which` اور Windows PowerShell پر `Get-Command` استعمال کرتے ہیں۔ + +یہ command اس طرح کام کرتا ہے کہ `PATH` environment variable میں جا کر **ہر path کو ترتیب سے** دیکھتا ہے، `python` نامی program تلاش کرتا ہے۔ ملنے پر، آپ کو اس program کا **path دکھاتا ہے**۔ + +سب سے اہم بات یہ ہے کہ جب آپ `python` call کریں، بالکل یہی "`python`" execute ہوگا۔ + +تو آپ تصدیق کر سکتے ہیں کہ آپ صحیح virtual environment میں ہیں۔ + +/// tip | مشورہ + +ایک virtual environment فعال کرنا، ایک Python لینا، اور پھر **دوسرے project** میں جانا آسان ہے۔ + +اور دوسرا project **کام نہیں کرے گا** کیونکہ آپ **غلط Python** استعمال کر رہے ہیں، کسی اور project کے virtual environment سے۔ + +یہ جان سکنا مفید ہے کہ کون سا `python` استعمال ہو رہا ہے۔ 🤓 + +/// + +## Virtual Environment غیر فعال کیوں کریں { #why-deactivate-a-virtual-environment } + +مثلاً، آپ `philosophers-stone` project پر کام کر رہے ہو سکتے ہیں، **اس virtual environment کو فعال** کریں، packages install کریں اور اس ماحول کے ساتھ کام کریں۔ + +اور پھر آپ **دوسرے project** `prisoner-of-azkaban` پر کام کرنا چاہتے ہیں۔ + +آپ اس project میں جاتے ہیں: + +
+ +```console +$ cd ~/code/prisoner-of-azkaban +``` + +
+ +اگر آپ `philosophers-stone` کے virtual environment کو غیر فعال نہ کریں، جب آپ terminal میں `python` چلائیں گے، یہ `philosophers-stone` والا Python استعمال کرنے کی کوشش کرے گا۔ + +
+ +```console +$ cd ~/code/prisoner-of-azkaban + +$ python main.py + +// Error importing sirius, it's not installed 😱 +Traceback (most recent call last): + File "main.py", line 1, in + import sirius +``` + +
+ +لیکن اگر آپ virtual environment غیر فعال کریں اور `prisoner-of-azkaban` کے لیے نیا فعال کریں تو جب آپ `python` چلائیں گے یہ `prisoner-of-azkaban` کے virtual environment والا Python استعمال کرے گا۔ + +
+ +```console +$ cd ~/code/prisoner-of-azkaban + +// You don't need to be in the old directory to deactivate, you can do it wherever you are, even after going to the other project 😎 +$ deactivate + +// Activate the virtual environment in prisoner-of-azkaban/.venv 🚀 +$ source .venv/bin/activate + +// Now when you run python, it will find the package sirius installed in this virtual environment ✨ +$ python main.py + +I solemnly swear 🐺 +``` + +
+ +## متبادل { #alternatives } + +یہ ایک سادہ گائیڈ ہے تاکہ آپ شروع کر سکیں اور سیکھ سکیں کہ **اندرونی طور پر** سب کچھ کیسے کام کرتا ہے۔ + +Virtual environments، package dependencies (requirements)، projects manage کرنے کے بہت سے **متبادل** ہیں۔ + +جب آپ تیار ہوں اور **پورے project** کو manage کرنے کے لیے tool استعمال کرنا چاہیں، packages dependencies، virtual environments وغیرہ، تو میں تجویز کروں گا کہ آپ [uv](https://github.com/astral-sh/uv) آزمائیں۔ + +`uv` بہت سارے کام کر سکتا ہے، یہ: + +* آپ کے لیے **Python install** کر سکتا ہے، بشمول مختلف ورژنز +* آپ کے projects کے لیے **virtual environment** manage کر سکتا ہے +* **Packages** install کر سکتا ہے +* آپ کے project کے لیے package **dependencies اور ورژنز** manage کر سکتا ہے +* یقینی بنا سکتا ہے کہ آپ کے پاس packages اور ورژنز کا **صحیح** مجموعہ install ہو، بشمول ان کی dependencies، تاکہ آپ یقین کر سکیں کہ آپ اپنا project production میں بالکل ویسے ہی چلا سکتے ہیں جیسے اپنے computer پر development کرتے وقت، اسے **locking** کہتے ہیں +* اور بہت کچھ + +## نتیجہ { #conclusion } + +اگر آپ نے یہ سب پڑھ اور سمجھ لیا، تو اب **آپ** virtual environments کے بارے میں بہت سے developers سے **زیادہ جانتے ہیں**۔ 🤓 + +ان تفصیلات کو جاننا مستقبل میں کسی وقت ضرور مفید ثابت ہوگا جب آپ کچھ debug کر رہے ہوں جو پیچیدہ لگتا ہو، لیکن آپ جانیں گے **کہ اندرونی طور پر یہ سب کیسے کام کرتا ہے**۔ 😎 diff --git a/docs/ur/llm-prompt.md b/docs/ur/llm-prompt.md new file mode 100644 index 000000000..866fb0a33 --- /dev/null +++ b/docs/ur/llm-prompt.md @@ -0,0 +1,101 @@ +### Target language + +Translate to Urdu (اردو). + +Language code: ur. + +### Core principle + +Don't translate word-by-word. Rewrite naturally in Urdu as if writing the doc from scratch. Preserve meaning, but prioritize fluency over literal accuracy. Write in a way that feels natural to an Urdu-speaking developer. + +### Grammar and tone + +- Use instructional Urdu, consistent with technical documentation style. +- Use polite imperative/guide language (e.g. "استعمال کریں", "چلائیں", "دیکھیں", "کاپی کریں"). +- Avoid overly formal or literary Urdu — keep it accessible and modern. +- Ensure sentences make sense in Urdu context — adjust structure, conjunctions, and verb forms as needed for natural flow. +- Urdu is written right-to-left (RTL), ensure text flows naturally. +- Use simple and clear Urdu that a developer comfortable with both Urdu and English would understand. + +### Headings + +- Follow existing Urdu heading style (no trailing period). +- Keep headings concise and descriptive. + +### Quotes + +- Keep quote style consistent with existing Urdu docs (typically ASCII quotes in text). +- Never modify quotes inside inline code, code blocks, URLs, or file paths. + +### Ellipsis + +- Keep ellipsis style (`...`) consistent with existing docs. +- Never modify `...` in code, URLs, or CLI examples. + +### Consistency + +- Use the same translation for the same term throughout the document. +- If you translate a concept one way, keep it consistent across all occurrences. + +### Links and references + +- Never modify link syntax like `{.internal-link target=_blank}`. +- Keep markdown link structure intact: `[text](url){.internal-link}`. + +### Preferred translations / glossary + +Do not translate technical terms like path, route, request, response, query, body, cookie, header, endpoint, middleware, decorator, dependency, schema, model, type hint, async, await — keep them as is in English. + +- When adding Urdu postpositions or suffixes to English technical terms, use them naturally in the sentence flow. + +- Some common translations to use: + - "function" → "function" (keep in English) + - "parameter" → "parameter" (keep in English) + - "import" → "import" (keep in English) + - "install" → "انسٹال" + - "run" → "چلائیں" + - "create" → "بنائیں" + - "file" → "فائل" + - "code" → "کوڈ" + - "application" → "ایپلیکیشن" + - "documentation" → "دستاویزات" + - "example" → "مثال" + - "feature" → "خصوصیت" + - "performance" → "کارکردگی" + - "error" → "خرابی" or "ایرر" + - "warning" → "انتباہ" + - "note" → "نوٹ" + - "tip" → "مشورہ" + - "information" → "معلومات" + - "security" → "سیکیورٹی" + - "database" → "ڈیٹابیس" + - "server" → "سرور" + - "client" → "کلائنٹ" + - "browser" → "براؤزر" + - "developer" → "ڈویلپر" + - "framework" → "فریم ورک" + - "library" → "لائبریری" + - "package" → "پیکیج" + - "tutorial" → "ٹیوٹوریل" + - "chapter" → "باب" + - "section" → "سیکشن" + - "data" → "ڈیٹا" + - "value" → "ویلیو" + - "string" → "string" (keep in English) + - "integer" → "integer" (keep in English) + - "boolean" → "boolean" (keep in English) + - "default" → "ڈیفالٹ" + +- You can provide the Urdu meaning of a term in parentheses when it first appears, but keep the English term as primary. Do not overdo this — only for less obvious terms, and only the first time. + +### `///` admonitions + +- Keep the admonition keyword in English (do not translate `note`, `tip`, etc.). +- If a title is present, prefer these canonical titles: + +- `/// note | نوٹ` +- `/// note | تکنیکی تفصیلات` +- `/// tip | مشورہ` +- `/// warning | انتباہ` +- `/// info | معلومات` +- `/// check | اضافی معلومات` diff --git a/docs/ur/mkdocs.yml b/docs/ur/mkdocs.yml new file mode 100644 index 000000000..de18856f4 --- /dev/null +++ b/docs/ur/mkdocs.yml @@ -0,0 +1 @@ +INHERIT: ../en/mkdocs.yml