Browse Source

ЁЯМР Update translations for hi (add-missing) (#15990)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
pull/15994/head
Sebasti├бn Ram├нrez 2 days ago
committed by GitHub
parent
commit
37ccca3e95
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 3
      docs/hi/docs/about/index.md
  2. 247
      docs/hi/docs/advanced/additional-responses.md
  3. 41
      docs/hi/docs/advanced/additional-status-codes.md
  4. 163
      docs/hi/docs/advanced/advanced-dependencies.md
  5. 61
      docs/hi/docs/advanced/advanced-python-types.md
  6. 99
      docs/hi/docs/advanced/async-tests.md
  7. 466
      docs/hi/docs/advanced/behind-a-proxy.md
  8. 273
      docs/hi/docs/advanced/custom-response.md
  9. 95
      docs/hi/docs/advanced/dataclasses.md
  10. 165
      docs/hi/docs/advanced/events.md
  11. 192
      docs/hi/docs/advanced/generate-clients.md
  12. 21
      docs/hi/docs/advanced/index.md
  13. 63
      docs/hi/docs/advanced/json-base64-bytes.md
  14. 97
      docs/hi/docs/advanced/middleware.md
  15. 186
      docs/hi/docs/advanced/openapi-callbacks.md
  16. 55
      docs/hi/docs/advanced/openapi-webhooks.md
  17. 166
      docs/hi/docs/advanced/path-operation-advanced-configuration.md
  18. 31
      docs/hi/docs/advanced/response-change-status-code.md
  19. 51
      docs/hi/docs/advanced/response-cookies.md
  20. 83
      docs/hi/docs/advanced/response-directly.md
  21. 41
      docs/hi/docs/advanced/response-headers.md
  22. 107
      docs/hi/docs/advanced/security/http-basic-auth.md
  23. 19
      docs/hi/docs/advanced/security/index.md
  24. 274
      docs/hi/docs/advanced/security/oauth2-scopes.md
  25. 302
      docs/hi/docs/advanced/settings.md
  26. 117
      docs/hi/docs/advanced/stream-data.md
  27. 88
      docs/hi/docs/advanced/strict-content-type.md
  28. 67
      docs/hi/docs/advanced/sub-applications.md
  29. 126
      docs/hi/docs/advanced/templates.md
  30. 53
      docs/hi/docs/advanced/testing-dependencies.md
  31. 12
      docs/hi/docs/advanced/testing-events.md
  32. 13
      docs/hi/docs/advanced/testing-websockets.md
  33. 56
      docs/hi/docs/advanced/using-request-directly.md
  34. 186
      docs/hi/docs/advanced/websockets.md
  35. 51
      docs/hi/docs/advanced/wsgi.md
  36. 24
      docs/hi/docs/deployment/cloud.md
  37. 321
      docs/hi/docs/deployment/concepts.md
  38. 618
      docs/hi/docs/deployment/docker.md
  39. 47
      docs/hi/docs/deployment/fastapicloud.md
  40. 231
      docs/hi/docs/deployment/https.md
  41. 23
      docs/hi/docs/deployment/index.md
  42. 156
      docs/hi/docs/deployment/manually.md
  43. 139
      docs/hi/docs/deployment/server-workers.md
  44. 93
      docs/hi/docs/deployment/versions.md
  45. 17
      docs/hi/docs/how-to/authentication-error-status-code.md
  46. 56
      docs/hi/docs/how-to/conditional-openapi.md
  47. 70
      docs/hi/docs/how-to/configure-swagger-ui.md
  48. 185
      docs/hi/docs/how-to/custom-docs-ui-assets.md
  49. 109
      docs/hi/docs/how-to/custom-request-and-route.md
  50. 88
      docs/hi/docs/how-to/extending-openapi.md
  51. 43
      docs/hi/docs/how-to/general.md
  52. 60
      docs/hi/docs/how-to/graphql.md
  53. 13
      docs/hi/docs/how-to/index.md
  54. 153
      docs/hi/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md
  55. 102
      docs/hi/docs/how-to/separate-openapi-schemas.md
  56. 7
      docs/hi/docs/how-to/testing-database.md
  57. 3
      docs/hi/docs/resources/index.md
  58. 203
      docs/hi/docs/tutorial/security/first-steps.md
  59. 105
      docs/hi/docs/tutorial/security/get-current-user.md
  60. 105
      docs/hi/docs/tutorial/security/index.md
  61. 277
      docs/hi/docs/tutorial/security/oauth2-jwt.md

3
docs/hi/docs/about/index.md

@ -0,0 +1,3 @@
# рдкрд░рд┐рдЪрдп { #about }
FastAPI, рдЗрд╕рдХреЗ design, рдкреНрд░реЗрд░рдгрд╛ рдФрд░ рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред ЁЯдУ

247
docs/hi/docs/advanced/additional-responses.md

@ -0,0 +1,247 @@
# OpenAPI рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд Responses { #additional-responses-in-openapi }
/// warning | рдЪреЗрддрд╛рд╡рдиреА
рдпрд╣ рдПрдХ рдХрд╛рдлрд╝реА advanced рд╡рд┐рд╖рдп рд╣реИред
рдЕрдЧрд░ рдЖрдк **FastAPI** рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЬрд╝рд░реВрд░рдд рди рдкрдбрд╝реЗред
///
рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд status codes, media types, descriptions рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд responses рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпреЗ рдЕрддрд┐рд░рд┐рдХреНрдд responses OpenAPI schema рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рдЬрд╛рдПрдБрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╡реЗ API docs рдореЗрдВ рднреА рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗред
рд▓реЗрдХрд┐рди рдЙрди рдЕрддрд┐рд░рд┐рдХреНрдд responses рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ status code рдФрд░ content рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ `JSONResponse` рдЬреИрд╕рд╛ рдХреЛрдИ `Response` return рдХрд░реЗрдВред
## `model` рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд Response { #additional-response-with-model }
рдЖрдк рдЕрдкрдиреЗ *path operation decorators* рдХреЛ `responses` parameter рджреЗ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдПрдХ `dict` рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ: keys рдкреНрд░рддреНрдпреЗрдХ response рдХреЗ status codes рд╣реЛрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ `200`), рдФрд░ values рдЕрдиреНрдп `dict`s рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред
рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ response `dict` рдореЗрдВ `model` key рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ `response_model` рдХреА рддрд░рд╣ рдПрдХ Pydantic model рд╣реЛрддрд╛ рд╣реИред
**FastAPI** рдЙрд╕ model рдХреЛ рд▓реЗрдЧрд╛, рдЙрд╕рдХрд╛ JSON Schema generate рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрд╕реЗ OpenAPI рдореЗрдВ рд╕рд╣реА рдЬрдЧрд╣ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, status code `404` рдФрд░ Pydantic model `Message` рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ response рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/additional_responses/tutorial001_py310.py hl[18,22] *}
/// note | рдиреЛрдЯ
рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рд╕реАрдзреЗ `JSONResponse` return рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
///
/// note | рдиреЛрдЯ
`model` key OpenAPI рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред
**FastAPI** рд╡рд╣рд╛рдБ рд╕реЗ Pydantic model рд▓реЗрдЧрд╛, JSON Schema generate рдХрд░реЗрдЧрд╛, рдФрд░ рдЙрд╕реЗ рд╕рд╣реА рдЬрдЧрд╣ рд░рдЦреЗрдЧрд╛ред
рд╕рд╣реА рдЬрдЧрд╣ рд╣реИ:
* `content` key рдореЗрдВ, рдЬрд┐рд╕рдХреА value рдПрдХ рдФрд░ JSON object (`dict`) рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ:
* media type рд╡рд╛рд▓реА рдПрдХ key, рдЬреИрд╕реЗ `application/json`, рдЬрд┐рд╕рдХреА value рдПрдХ рдФрд░ JSON object рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ:
* рдПрдХ key `schema`, рдЬрд┐рд╕рдХреА value model рд╕реЗ JSON Schema рд╣реЛрддреА рд╣реИ, рдпрд╣реА рд╕рд╣реА рдЬрдЧрд╣ рд╣реИред
* **FastAPI** рдЗрд╕реЗ рд╕реАрдзреЗ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЗ OpenAPI рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдЬрдЧрд╣ рдореМрдЬреВрдж global JSON Schemas рдХрд╛ reference рдпрд╣рд╛рдБ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, рдЕрдиреНрдп applications рдФрд░ clients рдЙрди JSON Schemas рдХреЛ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмреЗрд╣рддрд░ code generation tools рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрджрд┐ред
///
рдЗрд╕ *path operation* рдХреЗ рд▓рд┐рдП OpenAPI рдореЗрдВ generate рдХрд┐рдП рдЧрдП 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 рдХреЗ рдЕрдВрджрд░ рдХрд┐рд╕реА рджреВрд╕рд░реА рдЬрдЧрд╣ reference рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
```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 image return рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
{* ../../docs_src/additional_responses/tutorial002_py310.py hl[17:22,26] *}
/// note | рдиреЛрдЯ
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдкрдХреЛ image рдХреЛ рд╕реАрдзреЗ `FileResponse` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ return рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
///
/// note | рдиреЛрдЯ
рдЬрдм рддрдХ рдЖрдк рдЕрдкрдиреЗ `responses` parameter рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЛрдИ рдЕрд▓рдЧ media type specify рдирд╣реАрдВ рдХрд░рддреЗ, FastAPI рдорд╛рди рд▓реЗрдЧрд╛ рдХрд┐ response рдХрд╛ media type рдореБрдЦреНрдп response class (default `application/json`) рдЬреИрд╕рд╛ рд╣реА рд╣реИред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдиреЗ custom response class specify рдХреА рд╣реИ рдЬрд┐рд╕рдХрд╛ media type `None` рд╣реИ, рддреЛ FastAPI рдХрд┐рд╕реА рднреА рдРрд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд response рдХреЗ рд▓рд┐рдП `application/json` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдХреЛрдИ associated model рд╣реИред
///
## рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдорд┐рд▓рд╛рдирд╛ { #combining-information }
рдЖрдк рдХрдИ рдЬрдЧрд╣реЛрдВ рд╕реЗ response рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рднреА рдорд┐рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ `response_model`, `status_code`, рдФрд░ `responses` parameters рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдЖрдк default status code `200` (рдпрд╛ рдЬрд╝рд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ custom code) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ `response_model` рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрд╕реА response рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╕реАрдзреЗ OpenAPI schema рдореЗрдВ `responses` рдХреЗ рдЕрдВрджрд░ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
**FastAPI** `responses` рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдмрдирд╛рдП рд░рдЦреЗрдЧрд╛, рдФрд░ рдЙрд╕реЗ рдЖрдкрдХреЗ model рд╕реЗ JSON Schema рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛ рджреЗрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк status code `404` рд╡рд╛рд▓рд╛ рдПрдХ response рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ Pydantic model рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬрд┐рд╕рдореЗрдВ custom `description` рд╣реИред
рдФрд░ status code `200` рд╡рд╛рд▓рд╛ рдПрдХ response, рдЬреЛ рдЖрдкрдХреЗ `response_model` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд┐рд╕рдореЗрдВ custom `example` рд╢рд╛рдорд┐рд▓ рд╣реИ:
{* ../../docs_src/additional_responses/tutorial003_py310.py hl[20:31] *}
рдпрд╣ рд╕рдм рдорд┐рд▓рд╛рдХрд░ рдЖрдкрдХреЗ OpenAPI рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ API docs рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:
<img src="/img/tutorial/additional-responses/image01.png">
## рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд responses рдФрд░ custom responses рдХреЛ рдорд┐рд▓рд╛рдПрдБ { #combine-predefined-responses-and-custom-ones }
рдЖрдк рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд responses рд░рдЦрдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрдИ *path operations* рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддреНрдпреЗрдХ *path operation* рдХреЗ рд▓рд┐рдП рдЬрд╝рд░реВрд░реА custom responses рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк `**dict_to_unpack` рдХреЗ рд╕рд╛рде `dict` рдХреЛ "unpacking" рдХрд░рдиреЗ рдХреА Python technique рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
```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 pairs рдХреЗ рд╕рд╛рде рдирдпрд╛ key-value pair рднреА рд╣реЛрдЧрд╛:
```Python
{
"old key": "old value",
"second old key": "second old value",
"new key": "new value",
}
```
рдЖрдк рдЗрд╕ technique рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ *path operations* рдореЗрдВ рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд responses рдХреЛ reuse рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд custom responses рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
{* ../../docs_src/additional_responses/tutorial004_py310.py hl[11:15,24] *}
## OpenAPI responses рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА { #more-information-about-openapi-responses }
Responses рдореЗрдВ рдЖрдк рдареАрдХ-рдареАрдХ рдХреНрдпрд╛ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк OpenAPI specification рдореЗрдВ рдпреЗ sections рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
* [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` рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

41
docs/hi/docs/advanced/additional-status-codes.md

@ -0,0 +1,41 @@
# рдЕрддрд┐рд░рд┐рдХреНрдд Status Codes { #additional-status-codes }
default рд░реВрдк рд╕реЗ, **FastAPI** responses рдХреЛ `JSONResponse` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ return рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЗ *path operation* рд╕реЗ return рдХрд┐рдпрд╛ рдЧрдпрд╛ content рдЙрд╕ `JSONResponse` рдХреЗ рдЕрдВрджрд░ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрд╣ default status code рдпрд╛ рд╡рд╣ status code рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдЬреЛ рдЖрдкрдиреЗ рдЕрдкрдиреЗ *path operation* рдореЗрдВ set рдХрд┐рдпрд╛ рд╣реИред
## рдЕрддрд┐рд░рд┐рдХреНрдд status codes { #additional-status-codes_1 }
рдЕрдЧрд░ рдЖрдк рдореБрдЦреНрдп status code рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд status codes return рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕реАрдзреЗ `Response`, рдЬреИрд╕реЗ `JSONResponse`, return рдХрд░рдХреЗ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд status code рдХреЛ рд╕реАрдзреЗ set рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдПрдХ рдРрд╕рд╛ *path operation* рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ items рдХреЛ update рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░ HTTP status code 200 "OK" return рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЖрдк рдпрд╣ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдирдП items рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗред рдФрд░ рдЬрдм items рдкрд╣рд▓реЗ рдореМрдЬреВрдж рдирд╣реАрдВ рдереЗ, рддреЛ рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ HTTP status code 201 "Created" return рдХрд░рддрд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, `JSONResponse` import рдХрд░реЗрдВ, рдФрд░ рдЕрдкрдирд╛ content рд╡рд╣реАрдВ рд╕реАрдзреЗ return рдХрд░реЗрдВ, рд╕рд╛рде рдореЗрдВ рдЕрдкрдиреА рдкрд╕рдВрдж рдХрд╛ `status_code` set рдХрд░реЗрдВ:
{* ../../docs_src/additional_status_codes/tutorial001_an_py310.py hl[4,25] *}
/// warning | рдЪреЗрддрд╛рд╡рдиреА
рдЬрдм рдЖрдк рд╕реАрдзреЗ `Response` return рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рддреЛ рд╡рд╣ рд╕реАрдзреЗ return рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕реЗ рдХрд┐рд╕реА model рдЖрджрд┐ рдХреЗ рд╕рд╛рде serialize рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЗрд╕рдореЗрдВ рд╡рд╣реА data рд╣реИ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ values valid JSON рд╣реИрдВ (рдЕрдЧрд░ рдЖрдк `JSONResponse` рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ)ред
///
/// note | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
рдЖрдк `from starlette.responses import JSONResponse` рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
**FastAPI** рдЖрдкрдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, developer рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд╣реА `starlette.responses` `fastapi.responses` рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрдкрд▓рдмреНрдз рдЕрдзрд┐рдХрд╛рдВрд╢ responses рд╕реАрдзреЗ Starlette рд╕реЗ рдЖрддреЗ рд╣реИрдВред `status` рдХреЗ рд╕рд╛рде рднреА рдпрд╣реА рд╣реИред
///
## OpenAPI рдФрд░ API docs { #openapi-and-api-docs }
рдЕрдЧрд░ рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд status codes рдФрд░ responses рд╕реАрдзреЗ return рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ OpenAPI schema (API docs) рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ FastAPI рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ return рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ code рдореЗрдВ document рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ: [рдЕрддрд┐рд░рд┐рдХреНрдд Responses](additional-responses.md)ред

163
docs/hi/docs/advanced/advanced-dependencies.md

@ -0,0 +1,163 @@
# Advanced Dependencies { #advanced-dependencies }
## Parameterized dependencies { #parameterized-dependencies }
рдЕрдм рддрдХ рд╣рдордиреЗ рдЬреЛ рднреА dependencies рджреЗрдЦреА рд╣реИрдВ, рд╡реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд function рдпрд╛ class рд╣реИрдВред
рд▓реЗрдХрд┐рди рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдк dependency рдкрд░ parameters рд╕реЗрдЯ рдХрд░ рдкрд╛рдирд╛ рдЪрд╛рд╣реЗрдВ, рдмрд┐рдирд╛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ functions рдпрд╛ classes declare рдХрд┐рдПред
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдПрдХ рдРрд╕реА dependency рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЬрд╛рдБрдЪрддреА рд╣реИ рдХрд┐ query parameter `q` рдореЗрдВ рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд content рд╣реИ рдпрд╛ рдирд╣реАрдВред
рд▓реЗрдХрд┐рди рд╣рдо рдЙрд╕ рдирд┐рд╢реНрдЪрд┐рдд content рдХреЛ parameterize рдХрд░ рдкрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
## рдПрдХ "callable" instance { #a-callable-instance }
Python рдореЗрдВ рдХрд┐рд╕реА class рдХреЗ instance рдХреЛ "callable" рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред
рдЦреБрдж class рдХреЛ рдирд╣реАрдВ (рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА callable рд╣реЛрддреА рд╣реИ), рдмрд▓реНрдХрд┐ рдЙрд╕ class рдХреЗ рдПрдХ instance рдХреЛред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ method `__call__` declare рдХрд░рддреЗ рд╣реИрдВ:
{* ../../docs_src/dependencies/tutorial011_an_py310.py hl[12] *}
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣реА `__call__` рд╣реИ рдЬрд┐рд╕реЗ **FastAPI** рдЕрддрд┐рд░рд┐рдХреНрдд parameters рдФрд░ sub-dependencies рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдФрд░ рдмрд╛рдж рдореЗрдВ рдЖрдкрдХреА *path operation function* рдореЗрдВ parameter рдХреЛ value рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣реА call рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
## Instance рдХреЛ parameterize рдХрд░реЗрдВ { #parameterize-the-instance }
рдФрд░ рдЕрдм, рд╣рдо `__init__` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ instance рдХреЗ parameters declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо dependency рдХреЛ "parameterize" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/dependencies/tutorial011_an_py310.py hl[9] *}
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, **FastAPI** рдХрднреА рднреА `__init__` рдХреЛ рдЫреБрдПрдЧрд╛ рдпрд╛ рдЙрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд╣рдо рдЗрд╕реЗ рд╕реАрдзреЗ рдЕрдкрдиреЗ code рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
## рдПрдХ instance рдмрдирд╛рдПрдБ { #create-an-instance }
рд╣рдо рдЗрд╕ class рдХрд╛ рдПрдХ instance рдЗрд╕ рддрд░рд╣ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/dependencies/tutorial011_an_py310.py hl[18] *}
рдФрд░ рдЗрд╕ рддрд░рд╣ рд╣рдо рдЕрдкрдиреА dependency рдХреЛ "parameterize" рдХрд░ рдкрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЕрдм `"bar"` рдЙрд╕рдХреЗ рдЕрдВрджрд░ рд╣реИ, attribute `checker.fixed_content` рдХреЗ рд░реВрдк рдореЗрдВред
## Instance рдХреЛ dependency рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ { #use-the-instance-as-a-dependency }
рдлрд┐рд░, рд╣рдо `Depends(FixedContentQueryChecker)` рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ `checker` рдХреЛ `Depends(checker)` рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ dependency class рдЦреБрдж рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ instance `checker` рд╣реИред
рдФрд░ dependency рдХреЛ solve рдХрд░рддреЗ рд╕рдордп, **FastAPI** рдЗрд╕ `checker` рдХреЛ рдЗрд╕ рддрд░рд╣ call рдХрд░реЗрдЧрд╛:
```Python
checker(q="somequery")
```
...рдФрд░ рдЬреЛ рднреА рдпрд╣ return рдХрд░реЗрдЧрд╛ рдЙрд╕реЗ рд╣рдорд╛рд░реА *path operation function* рдореЗрдВ dependency рдХреА value рдХреЗ рд░реВрдк рдореЗрдВ parameter `fixed_content_included` рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛:
{* ../../docs_src/dependencies/tutorial011_an_py310.py hl[22] *}
/// tip | рд╕реБрдЭрд╛рд╡
рдпрд╣ рд╕рдм рдереЛрдбрд╝рд╛ рдмрдирд╛рд╡рдЯреА рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЕрднреА рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИред
рдпреЗ рдЙрджрд╛рд╣рд░рдг рдЬрд╛рдирдмреВрдЭрдХрд░ рд╕рд░рд▓ рд░рдЦреЗ рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
Security рд╡рд╛рд▓реЗ chapters рдореЗрдВ utility functions рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕реА рддрд░реАрдХреЗ рд╕реЗ implement рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрдЧрд░ рдЖрдкрдиреЗ рдпрд╣ рд╕рдм рд╕рдордЭ рд▓рд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ security рдХреЗ рд▓рд┐рдП рд╡реЗ utility tools рдЕрдВрджрд░ рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
///
## `yield`, `HTTPException`, `except` рдФрд░ Background Tasks рд╡рд╛рд▓реА Dependencies { #dependencies-with-yield-httpexception-except-and-background-tasks }
/// warning | рдЪреЗрддрд╛рд╡рдиреА
рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрди рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдпреЗ рд╡рд┐рд╡рд░рдг рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реИрдВ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ 0.121.0 рд╕реЗ рдкреБрд░рд╛рдиреА FastAPI application рдереА рдФрд░ рдЖрдкрдХреЛ `yield` рд╡рд╛рд▓реА dependencies рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдБ рдЖ рд░рд╣реА рд╣реИрдВред
///
`yield` рд╡рд╛рд▓реА dependencies рд╕рдордп рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ use cases рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдФрд░ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдБ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдИ рд╣реИрдВ, рдпрд╣рд╛рдБ рдмрджрд▓реЗ рд╣реБрдП рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рд╣реИред
### `yield` рдФрд░ `scope` рд╡рд╛рд▓реА Dependencies { #dependencies-with-yield-and-scope }
Version 0.121.0 рдореЗрдВ, FastAPI рдиреЗ `yield` рд╡рд╛рд▓реА dependencies рдХреЗ рд▓рд┐рдП `Depends(scope="function")` рдХрд╛ support рдЬреЛрдбрд╝рд╛ред
`Depends(scope="function")` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░, `yield` рдХреЗ рдмрд╛рдж рдХрд╛ exit code *path operation function* рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реА, response client рдХреЛ рд╡рд╛рдкрд╕ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ execute рд╣реЛрддрд╛ рд╣реИред
рдФрд░ `Depends(scope="request")` (default) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░, `yield` рдХреЗ рдмрд╛рдж рдХрд╛ exit code response рднреЗрдЬреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж execute рд╣реЛрддрд╛ рд╣реИред
рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ docs рдореЗрдВ [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 рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рдереЗ, рддреЛ рдпрд╣ *path operation function* рдХреЗ return рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд▓реЗрдХрд┐рди response рднреЗрдЬрдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ exit code run рдХрд░рддреА рдереАред
рдЗрд░рд╛рджрд╛ рдпрд╣ рдерд╛ рдХрд┐ рдЖрд╡рд╢реНрдпрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ resources рдХреЛ рдкрдХрдбрд╝реЗ рд░рдЦрдиреЗ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рдП, response рдХреЗ network рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реБрдПред
рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХрд╛ рдЕрд░реНрде рдпрд╣ рднреА рдерд╛ рдХрд┐ рдпрджрд┐ рдЖрдкрдиреЗ `StreamingResponse` return рдХрд┐рдпрд╛, рддреЛ `yield` рд╡рд╛рд▓реА dependency рдХрд╛ exit code рдкрд╣рд▓реЗ рд╣реА run рд╣реЛ рдЪреБрдХрд╛ рд╣реЛрддрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ `yield` рд╡рд╛рд▓реА dependency рдореЗрдВ database session рдерд╛, рддреЛ `StreamingResponse` data stream рдХрд░рддреЗ рд╕рдордп рдЙрд╕ session рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рдкрд╛рддрд╛ рдХреНрдпреЛрдВрдХрд┐ `yield` рдХреЗ рдмрд╛рдж рд╡рд╛рд▓реЗ exit code рдореЗрдВ session рдкрд╣рд▓реЗ рд╣реА рдмрдВрдж рд╣реЛ рдЪреБрдХрд╛ рд╣реЛрддрд╛ред
рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ 0.118.0 рдореЗрдВ revert рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛, рддрд╛рдХрд┐ `yield` рдХреЗ рдмрд╛рдж рдХрд╛ exit code response рднреЗрдЬреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж execute рд╣реЛред
/// note | рдзреНрдпрд╛рди рджреЗрдВ
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдиреАрдЪреЗ рджреЗрдЦреЗрдВрдЧреЗ, рдпрд╣ version 0.106.0 рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдмрд╣реБрдд рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рд╕реБрдзрд╛рд░реЛрдВ рдФрд░ corner cases рдХреЗ рд▓рд┐рдП bug fixes рдХреЗ рд╕рд╛рдеред
///
#### Early Exit Code рд╡рд╛рд▓реЗ Use Cases { #use-cases-with-early-exit-code }
рдХреБрдЫ specific conditions рд╡рд╛рд▓реЗ use cases рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ response рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ `yield` рд╡рд╛рд▓реА dependencies рдХрд╛ exit code run рдХрд░рдиреЗ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рд▓рд╛рдн рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ code рд╣реИ рдЬреЛ `yield` рд╡рд╛рд▓реА dependency рдореЗрдВ database session рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ user verify рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди database session рдлрд┐рд░ *path operation function* рдореЗрдВ рдХрднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реЛрддрд╛, рдХреЗрд╡рд▓ dependency рдореЗрдВ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ, **рдФрд░** response рднреЗрдЬреЗ рдЬрд╛рдиреЗ рдореЗрдВ рд▓рдВрдмрд╛ рд╕рдордп рд▓реЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ `StreamingResponse` рдЬреЛ data рдзреАрд░реЗ-рдзреАрд░реЗ рднреЗрдЬрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ database рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, database session рддрдм рддрдХ рдкрдХрдбрд╝рд╛ рд░рд╣реЗрдЧрд╛ рдЬрдм рддрдХ response рднреЗрдЬрдирд╛ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдкрдХрдбрд╝реЗ рд░рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
{* ../../docs_src/dependencies/tutorial013_an_py310.py *}
Exit code, рдпрд╛рдиреА `Session` рдХрд╛ automatic closing, рдпрд╣рд╛рдБ:
{* ../../docs_src/dependencies/tutorial013_an_py310.py ln[19:21] *}
...response рджреНрд╡рд╛рд░рд╛ slow data рднреЗрдЬрдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж run рд╣реЛрдЧрд╛:
{* ../../docs_src/dependencies/tutorial013_an_py310.py ln[30:38] hl[31:33] *}
рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ `generate_stream()` database session рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛, response рднреЗрдЬрддреЗ рд╕рдордп session рдХреЛ рдЦреБрд▓рд╛ рд░рдЦрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ SQLModel (рдпрд╛ SQLAlchemy) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдпрд╣ specific use case рд╣реИ, рддреЛ рдЖрдк session рдХреЛ рддрдм explicit рд░реВрдк рд╕реЗ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрдЧреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ:
{* ../../docs_src/dependencies/tutorial014_an_py310.py ln[24:28] hl[28] *}
рдЗрд╕ рддрд░рд╣ session database connection release рдХрд░ рджреЗрдЧрд╛, рддрд╛рдХрд┐ рдЕрдиреНрдп requests рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЕрд▓рдЧ use case рд╣реИ рдЬрд┐рд╕реЗ `yield` рд╡рд╛рд▓реА dependency рд╕реЗ early exit рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЕрдкрдиреЗ specific use case рдФрд░ dependencies with `yield` рдХреЗ рд▓рд┐рдП early closing рд╕реЗ рдЖрдкрдХреЛ рдХреНрдпреЛрдВ рд▓рд╛рдн рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ [GitHub Discussion Question](https://github.com/fastapi/fastapi/discussions/new?category=questions) рдмрдирд╛рдПрдБред
рдпрджрд┐ dependencies with `yield` рдореЗрдВ early closing рдХреЗ рд▓рд┐рдП compelling use cases рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ early closing рдореЗрдВ opt in рдХрд░рдиреЗ рдХрд╛ рдирдпрд╛ рддрд░реАрдХрд╛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдБрдЧрд╛ред
### `yield` рдФрд░ `except` рд╡рд╛рд▓реА Dependencies, рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг { #dependencies-with-yield-and-except-technical-details }
FastAPI 0.110.0 рд╕реЗ рдкрд╣рд▓реЗ, рдпрджрд┐ рдЖрдк `yield` рд╡рд╛рд▓реА dependency рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рдереЗ, рдФрд░ рдлрд┐рд░ рдЙрд╕ dependency рдореЗрдВ `except` рдХреЗ рд╕рд╛рде exception capture рдХрд░рддреЗ рдереЗ, рдФрд░ exception рдХреЛ рдлрд┐рд░ рд╕реЗ raise рдирд╣реАрдВ рдХрд░рддреЗ рдереЗ, рддреЛ exception automatic рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА exception handlers рдпрд╛ internal server error handler рдХреЛ raise/forward рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ред
рдпрд╣ version 0.110.0 рдореЗрдВ рдмрджрд▓рд╛ рдЧрдпрд╛ рддрд╛рдХрд┐ handler рдХреЗ рдмрд┐рдирд╛ forwarded exceptions (internal server errors) рд╕реЗ рд╣реЛрдиреЗ рд╡рд╛рд▓реА unhandled memory consumption рдареАрдХ рдХреА рдЬрд╛ рд╕рдХреЗ, рдФрд░ рдЗрд╕реЗ regular Python code рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде consistent рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред
### Background Tasks рдФрд░ `yield` рд╡рд╛рд▓реА Dependencies, рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг { #background-tasks-and-dependencies-with-yield-technical-details }
FastAPI 0.106.0 рд╕реЗ рдкрд╣рд▓реЗ, `yield` рдХреЗ рдмрд╛рдж exceptions raise рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛, `yield` рд╡рд╛рд▓реА dependencies рдореЗрдВ exit code response рднреЗрдЬреЗ рдЬрд╛рдиреЗ рдХреЗ *рдмрд╛рдж* execute рд╣реЛрддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП [Exception Handlers](../tutorial/handling-errors.md#install-custom-exception-handlers) рдкрд╣рд▓реЗ рд╣реА run рд╣реЛ рдЪреБрдХреЗ рд╣реЛрддреЗред
рдЗрд╕реЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ design рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ dependencies рджреНрд╡рд╛рд░рд╛ "yielded" рдХрд┐рдП рдЧрдП рдЙрдиреНрд╣реАрдВ objects рдХреЛ background tasks рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдХреНрдпреЛрдВрдХрд┐ exit code background tasks рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж execute рд╣реЛрддрд╛ рдерд╛ред
рдпрд╣ FastAPI 0.106.0 рдореЗрдВ рдмрджрд▓рд╛ рдЧрдпрд╛, рдЗрд╕ рдЗрд░рд╛рджреЗ рд╕реЗ рдХрд┐ response рдХреЗ network рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп resources рдХреЛ рдкрдХрдбрд╝реЗ рди рд░рдЦрд╛ рдЬрд╛рдПред
/// tip | рд╕реБрдЭрд╛рд╡
рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, background task рд╕рд╛рдорд╛рдиреНрдпрддрдГ logic рдХрд╛ рдПрдХ independent set рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЕрд▓рдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ resources рдХреЗ рд╕рд╛рде (рдЬреИрд╕реЗ рдЙрд╕рдХрд╛ рдЕрдкрдирд╛ database connection)ред
рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рд╕рд╛рдлрд╝ code рд╣реЛрдЧрд╛ред
///
рдпрджрд┐ рдЖрдк рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдереЗ, рддреЛ рдЕрдм рдЖрдкрдХреЛ background tasks рдХреЗ рд▓рд┐рдП resources background task рдХреЗ рдЕрдВрджрд░ рд╣реА рдмрдирд╛рдиреЗ рдЪрд╛рд╣рд┐рдП, рдФрд░ internally рдХреЗрд╡рд▓ рдРрд╕рд╛ data рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ `yield` рд╡рд╛рд▓реА dependencies рдХреЗ resources рдкрд░ рдирд┐рд░реНрднрд░ рди рд╣реЛред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрд╕реА database session рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк background task рдХреЗ рдЕрдВрджрд░ рдПрдХ рдирдпрд╛ database session рдмрдирд╛рдПрдБрдЧреЗ, рдФрд░ рдЗрд╕ рдирдП session рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ database рд╕реЗ objects рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдФрд░ рдлрд┐рд░ database рд╕реЗ object рдХреЛ background task function рдореЗрдВ parameter рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдЙрд╕ object рдХреА ID рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдлрд┐рд░ background task function рдХреЗ рдЕрдВрджрд░ object рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред

61
docs/hi/docs/advanced/advanced-python-types.md

@ -0,0 +1,61 @@
# рдЙрдиреНрдирдд Python Types { #advanced-python-types }
Python types рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдпрд╣рд╛рдБ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
## `Union` рдпрд╛ `Optional` рдХрд╛ рдЙрдкрдпреЛрдЧ { #using-union-or-optional }
рдЕрдЧрд░ рдЖрдкрдХрд╛ code рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ `|` рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдЧрд░ рдпрд╣ type annotation рдореЗрдВ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ `response_model=` рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рд╣реИ, рддреЛ vertical bar (`|`) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЖрдк `typing` рд╕реЗ `Union` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдЪреАрдЬрд╝ `str` рдпрд╛ `None` рд╣реЛ рд╕рдХрддреА рд╣реИ:
```python
from typing import Union
def say_hi(name: Union[str, None]):
print(f"Hi {name}!")
```
`typing` рдореЗрдВ `Optional` рдХреЗ рд╕рд╛рде рдпрд╣ declare рдХрд░рдиреЗ рдХрд╛ рдПрдХ shortcut рднреА рд╣реИ рдХрд┐ рдХреЛрдИ рдЪреАрдЬрд╝ `None` рд╣реЛ рд╕рдХрддреА рд╣реИред
рдореЗрд░реЗ рдмрд╣реБрдд **subjective** рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдПрдХ tip рдпрд╣рд╛рдБ рд╣реИ:
* ЁЯЪи `Optional[SomeType]` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВ
* рдЗрд╕рдХреЗ рдмрдЬрд╛рдп тЬи **`Union[SomeType, None]` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ** тЬиред
рджреЛрдиреЛрдВ equivalent рд╣реИрдВ рдФрд░ рдЕрдВрджрд░ рд╕реЗ рд╡реЗ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ `Optional` рдХреЗ рдмрдЬрд╛рдп `Union` рдХреА рд╕рд▓рд╛рд╣ рджреВрдБрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ "**optional**" рд╢рдмреНрдж рд╕реЗ рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ value optional рд╣реИ, рдЬрдмрдХрд┐ рдЗрд╕рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрд░реНрде рд╣реИ "рдпрд╣ `None` рд╣реЛ рд╕рдХрддрд╛ рд╣реИ", рднрд▓реЗ рд╣реА рдпрд╣ optional рди рд╣реЛ рдФрд░ рдЕрднреА рднреА required рд╣реЛред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ `Union[SomeType, None]` рдЕрдкрдиреЗ рдЕрд░реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ explicit рд╣реИред
рдпрд╣ рдмрд╕ рд╢рдмреНрджреЛрдВ рдФрд░ рдирд╛рдореЛрдВ рдХреА рдмрд╛рдд рд╣реИред рд▓реЗрдХрд┐рди рдпреЗ рд╢рдмреНрдж рдЗрд╕ рдмрд╛рдд рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдФрд░ рдЖрдкрдХреЗ teammates code рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рд╕реЛрдЪрддреЗ рд╣реИрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕ function рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ:
```python
from typing import Optional
def say_hi(name: Optional[str]):
print(f"Hey {name}!")
```
parameter `name` рдХреЛ `Optional[str]` рдХреЗ рд░реВрдк рдореЗрдВ define рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ **optional рдирд╣реАрдВ рд╣реИ**, рдЖрдк function рдХреЛ parameter рдХреЗ рдмрд┐рдирд╛ call рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ:
```Python
say_hi() # рдЕрд░реЗ рдирд╣реАрдВ, рдпрд╣ error throw рдХрд░рддрд╛ рд╣реИ! ЁЯШ▒
```
`name` parameter **рдЕрднреА рднреА required** рд╣реИ (*optional* рдирд╣реАрдВ) рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ default value рдирд╣реАрдВ рд╣реИред рдлрд┐рд░ рднреА, `name` value рдХреЗ рд░реВрдк рдореЗрдВ `None` рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:
```Python
say_hi(name=None) # рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, None valid рд╣реИ ЁЯОЙ
```
рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк types рдХреЗ unions рдХреЛ define рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ `|` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкрд╛рдПрдБрдЧреЗ:
```python
def say_hi(name: str | None):
print(f"Hey {name}!")
```
рдЗрд╕рд▓рд┐рдП, рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЖрдкрдХреЛ `Optional` рдФрд░ `Union` рдЬреИрд╕реЗ рдирд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреАред ЁЯШО

99
docs/hi/docs/advanced/async-tests.md

@ -0,0 +1,99 @@
# Async Tests { #async-tests }
рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рджрд┐рдП рдЧрдП `TestClient` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА **FastAPI** applications рдХреЛ рдХреИрд╕реЗ test рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рддрдХ, рдЖрдкрдиреЗ рдХреЗрд╡рд▓ synchronous tests рд▓рд┐рдЦрдирд╛ рджреЗрдЦрд╛ рд╣реИ, `async` functions рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ред
рдЕрдкрдиреЗ tests рдореЗрдВ asynchronous functions рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдкрд╛рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рдЕрдкрдиреЗ database рдХреЛ asynchronously query рдХрд░ рд░рд╣реЗ рд╣реЛрдВред рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреА FastAPI application рдХреЛ requests рднреЗрдЬрдирд╛ test рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ verify рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ backend рдиреЗ async database library рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП database рдореЗрдВ рд╕рд╣реА data рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓рд┐рдЦрд╛ рд╣реИред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рд╡рд╛ рд╕рдХрддреЗ рд╣реИрдВред
## pytest.mark.anyio { #pytest-mark-anyio }
рдЕрдЧрд░ рд╣рдо рдЕрдкрдиреЗ tests рдореЗрдВ asynchronous functions call рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ test functions asynchronous рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред AnyIO рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ plugin рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ specify рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ test functions рдХреЛ asynchronously call рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред
## HTTPX { #httpx }
рднрд▓реЗ рд╣реА рдЖрдкрдХреА **FastAPI** application `async def` рдХреЗ рдмрдЬрд╛рдп рд╕рд╛рдорд╛рдиреНрдп `def` functions рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реЛ, рдпрд╣ рдЕрдВрджрд░ рд╕реЗ рдлрд┐рд░ рднреА рдПрдХ `async` application рд╣реЛрддреА рд╣реИред
`TestClient` рдЕрдВрджрд░ рдХреБрдЫ magic рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ standard pytest рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЖрдкрдХреА рд╕рд╛рдорд╛рдиреНрдп `def` test functions рдореЗрдВ asynchronous FastAPI application рдХреЛ call рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рд▓реЗрдХрд┐рди рдЬрдм рд╣рдо рдЗрд╕реЗ asynchronous functions рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╣ magic рдЕрдм рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ред рдЕрдкрдиреЗ tests рдХреЛ asynchronously рдЪрд▓рд╛рдиреЗ рдкрд░, рд╣рдо рдЕрдкрдиреЗ test functions рдХреЗ рдЕрдВрджрд░ `TestClient` рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
`TestClient` [HTTPX](https://www.python-httpx.org) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдФрд░ рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдо API рдХреЛ test рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
## рдЙрджрд╛рд╣рд░рдг { #example }
рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП [рдмрдбрд╝реА Applications](../tutorial/bigger-applications.md) рдФрд░ [Testing](../tutorial/testing.md) рдореЗрдВ рд╡рд░реНрдгрд┐рдд file structure рдЬреИрд╕реА рдПрдХ structure рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
```
.
тФЬтФАтФА app
тФВ┬а┬а тФЬтФАтФА __init__.py
тФВ┬а┬а тФЬтФАтФА main.py
тФВ┬а┬а тФФтФАтФА test_main.py
```
file `main.py` рдореЗрдВ рдпрд╣ рд╣реЛрдЧрд╛:
{* ../../docs_src/async_tests/app_a_py310/main.py *}
file `test_main.py` рдореЗрдВ `main.py` рдХреЗ рд▓рд┐рдП tests рд╣реЛрдВрдЧреЗ, рдпрд╣ рдЕрдм рдХреБрдЫ рдРрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
{* ../../docs_src/async_tests/app_a_py310/test_main.py *}
## рдЗрд╕реЗ рдЪрд▓рд╛рдПрдБ { #run-it }
рдЖрдк рдЕрдкрдиреЗ tests рдХреЛ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдЗрд╕ рддрд░рд╣ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:
<div class="termy">
```console
$ pytest
---> 100%
```
</div>
## рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ { #in-detail }
marker `@pytest.mark.anyio` pytest рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ test function рдХреЛ asynchronously call рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
{* ../../docs_src/async_tests/app_a_py310/test_main.py hl[7] *}
/// tip | рд╕реБрдЭрд╛рд╡
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ test function рдЕрдм рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ `TestClient` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХреЗрд╡рд▓ `def` рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ `async def` рд╣реИред
///
рдлрд┐рд░ рд╣рдо 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 | рдЪреЗрддрд╛рд╡рдиреА
рдЕрдЧрд░ рдЖрдкрдХреА application 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 рд╣реИ, рдЖрдк рдЕрдм рдЕрдкрдиреЗ tests рдореЗрдВ рдЕрдкрдиреА FastAPI application рдХреЛ requests рднреЗрдЬрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп `async` functions рдХреЛ рднреА call (рдФрд░ `await`) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдЬреИрд╕реЗ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ code рдореЗрдВ рдХрд╣реАрдВ рдФрд░ call рдХрд░рддреЗ рд╣реИрдВред
/// tip | рд╕реБрдЭрд╛рд╡
рдЕрдЧрд░ рдЕрдкрдиреЗ tests рдореЗрдВ asynchronous function calls integrate рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ `RuntimeError: Task attached to a different loop` рдорд┐рд▓рддрд╛ рд╣реИ (рдЬреИрд╕реЗ [MongoDB's MotorClient](https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп), рддреЛ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЬрд┐рди objects рдХреЛ event loop рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ async functions рдХреЗ рднреАрддрд░ рд╣реА instantiate рдХрд░реЗрдВ, рдЬреИрд╕реЗ рдХрд┐ `@app.on_event("startup")` callbackред
///

466
docs/hi/docs/advanced/behind-a-proxy.md

@ -0,0 +1,466 @@
# Proxy рдХреЗ рдкреАрдЫреЗ { #behind-a-proxy }
рдХрдИ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдЖрдк рдЕрдкрдиреЗ FastAPI app рдХреЗ рд╕рд╛рдордиреЗ Traefik рдпрд╛ Nginx рдЬреИрд╕рд╛ **proxy** рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдпреЗ proxies HTTPS certificates рдФрд░ рджреВрд╕рд░реА рдЪреАрдЬрд╝реЗрдВ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
## Proxy Forwarded Headers { #proxy-forwarded-headers }
рдЖрдкрдХреА application рдХреЗ рд╕рд╛рдордиреЗ рдореМрдЬреВрдж **proxy** рдЖрдо рддреМрд░ рдкрд░ requests рдХреЛ рдЖрдкрдХреЗ **server** рддрдХ рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рддреБрд░рдВрдд рдХреБрдЫ headers рд╕реЗрдЯ рдХрд░реЗрдЧрд╛, рддрд╛рдХрд┐ server рдХреЛ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ рдХрд┐ request proxy рджреНрд╡рд╛рд░рд╛ **forwarded** рдХреА рдЧрдИ рдереА, рдЙрд╕реЗ рдореВрд▓ (public) URL рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ, рдЬрд┐рд╕рдореЗрдВ domain рд╢рд╛рдорд┐рд▓ рд╣реЛ, рдХрд┐ рд╡рд╣ HTTPS рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЖрджрд┐ред
**server** program (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП **FastAPI CLI** рдХреЗ рдЬрд░рд┐рдП **Uvicorn**) рдЗрди headers рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рдФрд░ рдлрд┐рд░ рд╡рд╣ рдЬрд╛рдирдХрд╛рд░реА рдЖрдкрдХреА application рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди security рдХреЗ рд▓рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ server рдХреЛ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╡рд╣ рдХрд┐рд╕реА trusted proxy рдХреЗ рдкреАрдЫреЗ рд╣реИ, рд╡рд╣ рдЙрди headers рдХреЛ interpret рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
/// 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="*"` рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рднреА incoming IPs рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░реЗрдЧрд╛ред
рдЕрдЧрд░ рдЖрдкрдХрд╛ **server** рдХрд┐рд╕реА trusted **proxy** рдХреЗ рдкреАрдЫреЗ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ proxy рд╣реА рдЙрд╕рд╕реЗ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рд╕реЗ рд╡рд╣ рдЙрд╕ **proxy** рдХрд╛ рдЬреЛ рднреА IP рд╣реИ, рдЙрд╕реЗ accept рдХрд░реЗрдЧрд╛ред
<div class="termy">
```console
$ fastapi run --forwarded-allow-ips="*"
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
</div>
### HTTPS рдХреЗ рд╕рд╛рде Redirects { #redirects-with-https }
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк рдПрдХ *path operation* `/items/` define рдХрд░рддреЗ рд╣реИрдВ:
{* ../../docs_src/behind_a_proxy/tutorial001_01_py310.py hl[6] *}
рдЕрдЧрд░ client `/items` рдкрд░ рдЬрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рддреЛ default рд░реВрдк рд╕реЗ, рдЙрд╕реЗ `/items/` рдкрд░ redirect рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд▓реЗрдХрд┐рди *CLI Option* `--forwarded-allow-ips` рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ `http://localhost:8000/items/` рдкрд░ redirect рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЖрдкрдХреА application `https://mysuperapp.com` рдкрд░ hosted рд╣реИ, рдФрд░ redirection `https://mysuperapp.com/items/` рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдм `--proxy-headers` рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ FastAPI рд╕рд╣реА location рдкрд░ redirect рдХрд░ рдкрд╛рдПрдЧрд╛ред ЁЯШО
```
https://mysuperapp.com/items/
```
/// tip | рд╕реБрдЭрд╛рд╡
рдЕрдЧрд░ рдЖрдк HTTPS рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ guide [HTTPS рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ](../deployment/https.md) рджреЗрдЦреЗрдВред
///
### Proxy Forwarded Headers рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ { #how-proxy-forwarded-headers-work }
рдпрд╣рд╛рдБ client рдФрд░ **application server** рдХреЗ рдмреАрдЪ **proxy** рджреНрд╡рд╛рд░рд╛ forwarded headers рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ visual representation рд╣реИ:
```mermaid
sequenceDiagram
participant Client
participant Proxy as Proxy/Load Balancer
participant Server as FastAPI Server
Client->>Proxy: HTTPS Request<br/>Host: mysuperapp.com<br/>Path: /items
Note over Proxy: Proxy adds forwarded headers
Proxy->>Server: HTTP Request<br/>X-Forwarded-For: [client IP]<br/>X-Forwarded-Proto: https<br/>X-Forwarded-Host: mysuperapp.com<br/>Path: /items
Note over Server: Server interprets headers<br/>(if --forwarded-allow-ips is set)
Server->>Proxy: HTTP Response<br/>with correct HTTPS URLs
Proxy->>Client: HTTPS Response
```
**proxy** рдореВрд▓ client request рдХреЛ intercept рдХрд░рддрд╛ рд╣реИ рдФрд░ request рдХреЛ **application server** рддрдХ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЦрд╛рд╕ *forwarded* headers (`X-Forwarded-*`) рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдпреЗ headers рдореВрд▓ request рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд╣ рдЬрд╛рдирдХрд╛рд░реА рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдиреНрдпрдерд╛ рдЦреЛ рдЬрд╛рддреА:
* **X-Forwarded-For**: рдореВрд▓ client рдХрд╛ IP address
* **X-Forwarded-Proto**: рдореВрд▓ protocol (`https`)
* **X-Forwarded-Host**: рдореВрд▓ host (`mysuperapp.com`)
рдЬрдм **FastAPI CLI** рдХреЛ `--forwarded-allow-ips` рдХреЗ рд╕рд╛рде configured рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрди headers рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП redirects рдореЗрдВ рд╕рд╣реА URLs generate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
## Stripped path prefix рд╡рд╛рд▓рд╛ Proxy { #proxy-with-a-stripped-path-prefix }
рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ proxy рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреА application рдореЗрдВ рдПрдХ path prefix рдЬреЛрдбрд╝рддрд╛ рд╣реЛред
рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк рдЕрдкрдиреА application configure рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `root_path` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
`root_path` ASGI specification рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ mechanism рд╣реИ (рдЬрд┐рд╕ рдкрд░ FastAPI, Starlette рдХреЗ рдЬрд░рд┐рдП, рдмрдирд╛ рд╣реИ)ред
`root_path` рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрди specific cases рдХреЛ handle рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ sub-applications mount рдХрд░рддреЗ рд╕рдордп internally рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ case рдореЗрдВ, stripped path prefix рд╡рд╛рд▓рд╛ proxy рд╣реЛрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ code рдореЗрдВ `/app` рдкрд░ рдПрдХ path declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдк рдКрдкрд░ рдПрдХ layer (proxy) рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреА **FastAPI** application рдХреЛ `/api/v1` рдЬреИрд╕реЗ path рдХреЗ рдиреАрдЪреЗ рд░рдЦреЗрдЧреАред
рдЗрд╕ case рдореЗрдВ, рдореВрд▓ path `/app` рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ `/api/v1/app` рдкрд░ serve рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЖрдкрдХрд╛ рд╕рд╛рд░рд╛ code рдпрд╣ рдорд╛рдирдХрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╕рд┐рд░реНрдл `/app` рд╣реИред
{* ../../docs_src/behind_a_proxy/tutorial001_py310.py hl[6] *}
рдФрд░ proxy app server (рд╢рд╛рдпрдж FastAPI CLI рдХреЗ рдЬрд░рд┐рдП Uvicorn) рддрдХ request рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рддреБрд░рдВрдд **path prefix** рдХреЛ **"strip"** рдХрд░ рджреЗрдЧрд╛, рдЖрдкрдХреА application рдХреЛ рдпрд╣ рднрд░реЛрд╕рд╛ рджрд┐рд▓рд╛рддреЗ рд╣реБрдП рдХрд┐ рд╡рд╣ `/app` рдкрд░ serve рд╣реЛ рд░рд╣реА рд╣реИ, рддрд╛рдХрд┐ рдЖрдкрдХреЛ prefix `/api/v1` рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕рд╛рд░рд╛ code update рди рдХрд░рдирд╛ рдкрдбрд╝реЗред
рдпрд╣рд╛рдБ рддрдХ, рд╕рдм рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рд▓реЗрдХрд┐рди рдлрд┐рд░, рдЬрдм рдЖрдк integrated docs UI (frontend) рдЦреЛрд▓реЗрдВрдЧреЗ, рддреЛ рд╡рд╣ OpenAPI schema рдХреЛ `/api/v1/openapi.json` рдХреЗ рдмрдЬрд╛рдп `/openapi.json` рдкрд░ рдкрд╛рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, frontend (рдЬреЛ browser рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ) `/openapi.json` рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ рдФрд░ OpenAPI schema рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдЧрд╛ред
рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ app рдХреЗ рд▓рд┐рдП `/api/v1` рдХрд╛ path prefix рд╡рд╛рд▓рд╛ proxy рд╣реИ, frontend рдХреЛ OpenAPI schema `/api/v1/openapi.json` рдкрд░ fetch рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
```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` рдЖрдо рддреМрд░ рдкрд░ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ program рдЙрд╕ machine/server рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╕рднреА IPs рдкрд░ listen рдХрд░рддрд╛ рд╣реИред
///
Docs UI рдХреЛ OpenAPI schema рдореЗрдВ рдпрд╣ declare рдХрд░рдиреЗ рдХреА рднреА рдЬрд╝рд░реВрд░рдд рд╣реЛрдЧреА рдХрд┐ рдпрд╣ API `server` `/api/v1` (proxy рдХреЗ рдкреАрдЫреЗ) рдкрд░ рд╕реНрдерд┐рдд рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
```JSON hl_lines="4-8"
{
"openapi": "3.1.0",
// рдпрд╣рд╛рдБ рдФрд░ рдЪреАрдЬрд╝реЗрдВ
"servers": [
{
"url": "/api/v1"
}
],
"paths": {
// рдпрд╣рд╛рдБ рдФрд░ рдЪреАрдЬрд╝реЗрдВ
}
}
```
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, "Proxy" рдХреБрдЫ **Traefik** рдЬреИрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ server **Uvicorn** рдХреЗ рд╕рд╛рде FastAPI CLI рдЬреИрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреА FastAPI application рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реИред
### `root_path` рдкреНрд░рджрд╛рди рдХрд░рдирд╛ { #providing-the-root-path }
рдЗрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк command line option `--root-path` рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
<div class="termy">
```console
$ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
</div>
рдЕрдЧрд░ рдЖрдк Hypercorn рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕рдореЗрдВ рднреА option `--root-path` рд╣реИред
/// note | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
ASGI specification рдЗрд╕ use case рдХреЗ рд▓рд┐рдП `root_path` define рдХрд░рддреА рд╣реИред
рдФрд░ `--root-path` command line option рд╡рд╣реА `root_path` рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
///
### рд╡рд░реНрддрдорд╛рди `root_path` рдЬрд╛рдБрдЪрдирд╛ { #checking-the-current-root-path }
рдЖрдк рдкреНрд░рддреНрдпреЗрдХ request рдХреЗ рд▓рд┐рдП рдЖрдкрдХреА application рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡рд░реНрддрдорд╛рди `root_path` рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ `scope` dictionary рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ (рдЬреЛ ASGI spec рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ)ред
рдпрд╣рд╛рдБ рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ demonstration purposes рдХреЗ рд▓рд┐рдП message рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
{* ../../docs_src/behind_a_proxy/tutorial001_py310.py hl[8] *}
рдлрд┐рд░, рдЕрдЧрд░ рдЖрдк Uvicorn рдХреЛ рдЗрд╕ рддрд░рд╣ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
<div class="termy">
```console
$ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
</div>
Response рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдЧрд╛:
```JSON
{
"message": "Hello World",
"root_path": "/api/v1"
}
```
### FastAPI app рдореЗрдВ `root_path` рд╕реЗрдЯ рдХрд░рдирд╛ { #setting-the-root-path-in-the-fastapi-app }
рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ `--root-path` рдпрд╛ equivalent рдЬреИрд╕рд╛ command line option рджреЗрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдЕрдкрдиреА FastAPI app рдмрдирд╛рддреЗ рд╕рдордп `root_path` parameter рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/behind_a_proxy/tutorial002_py310.py hl[3] *}
`root_path` рдХреЛ `FastAPI` рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛, Uvicorn рдпрд╛ Hypercorn рдХреЛ `--root-path` command line option рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ equivalent рд╣реЛрдЧрд╛ред
### `root_path` рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ { #about-root-path }
рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ server (Uvicorn) рдЙрд╕ `root_path` рдХрд╛ рдЙрдкрдпреЛрдЧ app рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЕрдкрдиреЗ browser рдореЗрдВ [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app) рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ normal response рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
```JSON
{
"message": "Hello World",
"root_path": "/api/v1"
}
```
рдЗрд╕рд▓рд┐рдП, рдпрд╣ `http://127.0.0.1:8000/api/v1/app` рдкрд░ access рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
Uvicorn рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛ рдХрд┐ proxy Uvicorn рдХреЛ `http://127.0.0.1:8000/app` рдкрд░ access рдХрд░реЗ, рдФрд░ рдлрд┐рд░ рдКрдкрд░ extra `/api/v1` prefix рдЬреЛрдбрд╝рдирд╛ proxy рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реЛрдЧреАред
## Stripped path prefix рд╡рд╛рд▓реЗ proxies рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ { #about-proxies-with-a-stripped-path-prefix }
рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ stripped path prefix рд╡рд╛рд▓рд╛ proxy рдЗрд╕реЗ configure рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реИред
рд╢рд╛рдпрдж рдХрдИ cases рдореЗрдВ default рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ proxy рдХреЗ рдкрд╛рд╕ stripped path prefix рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдРрд╕реЗ case рдореЗрдВ (рдмрд┐рдирд╛ stripped path prefix рдХреЗ), proxy рдХреБрдЫ `https://myawesomeapp.com` рдЬреИрд╕рд╛ listen рдХрд░реЗрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЕрдЧрд░ browser `https://myawesomeapp.com/api/v1/app` рдкрд░ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХрд╛ server (рдЬреИрд╕реЗ Uvicorn) `http://127.0.0.1:8000` рдкрд░ listen рдХрд░рддрд╛ рд╣реИ, рддреЛ proxy (рдмрд┐рдирд╛ stripped path prefix рдХреЗ) Uvicorn рдХреЛ рдЙрд╕реА path рдкрд░ access рдХрд░реЗрдЧрд╛: `http://127.0.0.1:8000/api/v1/app`ред
## Traefik рдХреЗ рд╕рд╛рде local testing { #testing-locally-with-traefik }
рдЖрдк [Traefik](https://docs.traefik.io/) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ stripped path prefix рдХреЗ рд╕рд╛рде experiment рдЖрд╕рд╛рдиреА рд╕реЗ locally рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред
[Traefik download рдХрд░реЗрдВ](https://github.com/containous/traefik/releases), рдпрд╣ рдПрдХ single binary рд╣реИ, рдЖрдк compressed file extract рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕реАрдзреЗ terminal рд╕реЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдлрд┐рд░ `traefik.toml` рдирд╛рдо рдХреА file рдмрдирд╛рдПрдБ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╣реЛ:
```TOML hl_lines="3"
[entryPoints]
[entryPoints.http]
address = ":9999"
[providers]
[providers.file]
filename = "routes.toml"
```
рдпрд╣ Traefik рдХреЛ port 9999 рдкрд░ listen рдХрд░рдиреЗ рдФрд░ рджреВрд╕рд░реА file `routes.toml` рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред
/// tip | рд╕реБрдЭрд╛рд╡
рд╣рдо standard HTTP port 80 рдХреЗ рдмрдЬрд╛рдп port 9999 рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ admin (`sudo`) privileges рдХреЗ рд╕рд╛рде рди рдЪрд▓рд╛рдирд╛ рдкрдбрд╝реЗред
///
рдЕрдм рд╡рд╣ рджреВрд╕рд░реА file `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"
```
рдпрд╣ file Traefik рдХреЛ path prefix `/api/v1` рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП configure рдХрд░рддреА рд╣реИред
рдФрд░ рдлрд┐рд░ Traefik рдЕрдкрдиреА requests рдХреЛ `http://127.0.0.1:8000` рдкрд░ рдЪрд▓ рд░рд╣реЗ рдЖрдкрдХреЗ Uvicorn рдкрд░ redirect рдХрд░реЗрдЧрд╛ред
рдЕрдм Traefik рд╢реБрд░реВ рдХрд░реЗрдВ:
<div class="termy">
```console
$ ./traefik --configFile=traefik.toml
INFO[0000] Configuration loaded from file: /home/user/awesomeapi/traefik.toml
```
</div>
рдФрд░ рдЕрдм `--root-path` option рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдирд╛ app рд╢реБрд░реВ рдХрд░реЗрдВ:
<div class="termy">
```console
$ fastapi run main.py --forwarded-allow-ips="*" --root-path /api/v1
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
</div>
### Responses рдЬрд╛рдБрдЪреЗрдВ { #check-the-responses }
рдЕрдм, рдЕрдЧрд░ рдЖрдк Uvicorn рдХреЗ port рд╡рд╛рд▓реЗ URL рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ: [http://127.0.0.1:8000/app](http://127.0.0.1:8000/app), рддреЛ рдЖрдкрдХреЛ normal response рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
```JSON
{
"message": "Hello World",
"root_path": "/api/v1"
}
```
/// tip | рд╕реБрдЭрд╛рд╡
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рднрд▓реЗ рд╣реА рдЖрдк рдЗрд╕реЗ `http://127.0.0.1:8000/app` рдкрд░ access рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ option `--root-path` рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ `/api/v1` рдХрд╛ `root_path` рджрд┐рдЦрд╛рддрд╛ рд╣реИред
///
рдФрд░ рдЕрдм Traefik рдХреЗ port рд╡рд╛рд▓реЗ URL рдХреЛ рдЦреЛрд▓реЗрдВ, рдЬрд┐рд╕рдореЗрдВ path prefix рд╢рд╛рдорд┐рд▓ рд╣реИ: [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`ред
рдмреЗрд╢рдХ, рдпрд╣рд╛рдБ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ app рдХреЛ proxy рдХреЗ рдЬрд░рд┐рдП access рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП path prefix `/api/v1` рд╡рд╛рд▓рд╛ version "correct" рд╣реИред
рдФрд░ рдмрд┐рдирд╛ path prefix рд╡рд╛рд▓рд╛ version (`http://127.0.0.1:8000/app`), рдЬреЛ рд╕реАрдзреЗ Uvicorn рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЗрд╡рд▓ _proxy_ (Traefik) рдХреЗ access рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ред
рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ Proxy (Traefik) path prefix рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИ рдФрд░ server (Uvicorn) option `--root-path` рд╕реЗ `root_path` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИред
### Docs UI рдЬрд╛рдБрдЪреЗрдВ { #check-the-docs-ui }
рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдордЬрд╝реЗрджрд╛рд░ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред тЬи
App рдХреЛ access рдХрд░рдиреЗ рдХрд╛ "official" рддрд░реАрдХрд╛ рдЙрд╕ path prefix рд╡рд╛рд▓реЗ proxy рдХреЗ рдЬрд░рд┐рдП рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рдордиреЗ define рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗ, рдЕрдЧрд░ рдЖрдк Uvicorn рджреНрд╡рд╛рд░рд╛ рд╕реАрдзреЗ serve рдХрд┐рдпрд╛ рдЧрдпрд╛ docs UI try рдХрд░рддреЗ рд╣реИрдВ, URL рдореЗрдВ path prefix рдХреЗ рдмрд┐рдирд╛, рддреЛ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ proxy рдХреЗ рдЬрд░рд┐рдП access рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред
рдЖрдк рдЗрд╕реЗ [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
<img src="/img/tutorial/behind-a-proxy/image01.png">
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо port `9999` рд╡рд╛рд▓реЗ proxy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "official" URL рдкрд░, `/api/v1/docs` рдкрд░ docs UI access рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! ЁЯОЙ
рдЖрдк рдЗрд╕реЗ [http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs) рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
<img src="/img/tutorial/behind-a-proxy/image02.png">
рдмрд┐рд▓реНрдХреБрд▓ рдЬреИрд╕рд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗред тЬФя╕П
рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ FastAPI рдЗрд╕ `root_path` рдХрд╛ рдЙрдкрдпреЛрдЧ OpenAPI рдореЗрдВ default `server` рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ `root_path` рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ URL рд╣реЛрддрд╛ рд╣реИред
## рдЕрддрд┐рд░рд┐рдХреНрдд servers { #additional-servers }
/// warning | рдЪреЗрддрд╛рд╡рдиреА
рдпрд╣ рдПрдХ рдЕрдзрд┐рдХ advanced use case рд╣реИред рдЪрд╛рд╣реЗрдВ рддреЛ рдЗрд╕реЗ skip рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
///
Default рд░реВрдк рд╕реЗ, **FastAPI** OpenAPI schema рдореЗрдВ `root_path` рдХреЗ URL рд╡рд╛рд▓рд╛ рдПрдХ `server` рдмрдирд╛рдПрдЧрд╛ред
рд▓реЗрдХрд┐рди рдЖрдк рдЕрдиреНрдп alternative `servers` рднреА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдЧрд░ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ *рд╡рд╣реА* docs UI staging рдФрд░ production environment рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде interact рдХрд░реЗред
рдЕрдЧрд░ рдЖрдк `servers` рдХреА custom list рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдИ `root_path` рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреА API proxy рдХреЗ рдкреАрдЫреЗ рд░рд╣рддреА рд╣реИ), рддреЛ **FastAPI** list рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЗрд╕ `root_path` рдХреЗ рд╕рд╛рде рдПрдХ "server" insert рдХрд░реЗрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
{* ../../docs_src/behind_a_proxy/tutorial003_py310.py hl[4:7] *}
рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХрд╛ OpenAPI schema generate рдХрд░реЗрдЧрд╛:
```JSON hl_lines="5-7"
{
"openapi": "3.1.0",
// рдпрд╣рд╛рдБ рдФрд░ рдЪреАрдЬрд╝реЗрдВ
"servers": [
{
"url": "/api/v1"
},
{
"url": "https://stag.example.com",
"description": "Staging environment"
},
{
"url": "https://prod.example.com",
"description": "Production environment"
}
],
"paths": {
// рдпрд╣рд╛рдБ рдФрд░ рдЪреАрдЬрд╝реЗрдВ
}
}
```
/// tip | рд╕реБрдЭрд╛рд╡
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ `/api/v1` рдХреЗ `url` value рд╡рд╛рд▓рд╛ auto-generated server `root_path` рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
///
[http://127.0.0.1:9999/api/v1/docs](http://127.0.0.1:9999/api/v1/docs) рдкрд░ docs UI рдореЗрдВ рдпрд╣ рдРрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:
<img src="/img/tutorial/behind-a-proxy/image03.png">
/// tip | рд╕реБрдЭрд╛рд╡
Docs UI рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП server рдХреЗ рд╕рд╛рде interact рдХрд░реЗрдЧрд╛ред
///
/// note | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
OpenAPI specification рдореЗрдВ `servers` property optional рд╣реИред
рдЕрдЧрд░ рдЖрдк `servers` parameter specify рдирд╣реАрдВ рдХрд░рддреЗ рдФрд░ `root_path` `/` рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ generated OpenAPI schema рдореЗрдВ `servers` property default рд░реВрдк рд╕реЗ рдкреВрд░реА рддрд░рд╣ omit рдХрд░ рджреА рдЬрд╛рдПрдЧреА, рдЬреЛ `/` рдХреЗ `url` value рд╡рд╛рд▓реЗ single server рдХреЗ equivalent рд╣реИред
///
### `root_path` рд╕реЗ automatic server disable рдХрд░реЗрдВ { #disable-automatic-server-from-root-path }
рдЕрдЧрд░ рдЖрдк рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ **FastAPI** `root_path` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ automatic server рд╢рд╛рдорд┐рд▓ рдХрд░реЗ, рддреЛ рдЖрдк parameter `root_path_in_servers=False` рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/behind_a_proxy/tutorial004_py310.py hl[9] *}
рдФрд░ рдлрд┐рд░ рдпрд╣ рдЙрд╕реЗ OpenAPI schema рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
## Sub-application mount рдХрд░рдирд╛ { #mounting-a-sub-application }
рдЕрдЧрд░ рдЖрдкрдХреЛ `root_path` рд╡рд╛рд▓реЗ proxy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рднреА sub-application mount рдХрд░рдиреА рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ [Sub Applications - Mounts](sub-applications.md) рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ), рддреЛ рдЖрдк рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗред
FastAPI internally `root_path` рдХрд╛ smart рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд╕ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред тЬи

273
docs/hi/docs/advanced/custom-response.md

@ -0,0 +1,273 @@
# рдХрд╕реНрдЯрдо Response - HTML, Stream, File, рдЕрдиреНрдп { #custom-response-html-stream-file-others }
Default рд░реВрдк рд╕реЗ, **FastAPI** JSON responses рд▓реМрдЯрд╛рдПрдЧрд╛ред
рдЖрдк [рд╕реАрдзреЗ Response рд▓реМрдЯрд╛рдПрдБ](response-directly.md) рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рд╕реАрдзреЗ `Response` рд▓реМрдЯрд╛рдХрд░ рдЗрд╕реЗ override рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд╕реАрдзреЗ `Response` рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ (рдпрд╛ рдХреЛрдИ subclass, рдЬреИрд╕реЗ `JSONResponse`), рддреЛ data рдЕрдкрдиреЗ рдЖрдк convert рдирд╣реАрдВ рд╣реЛрдЧрд╛ (рднрд▓реЗ рд╣реА рдЖрдк `response_model` declare рдХрд░реЗрдВ), рдФрд░ documentation рдЕрдкрдиреЗ рдЖрдк generate рдирд╣реАрдВ рд╣реЛрдЧреА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, generated OpenAPI рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ HTTP header `Content-Type` рдореЗрдВ specific "media type" рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛)ред
рд▓реЗрдХрд┐рди рдЖрдк *path operation decorator* рдореЗрдВ `response_class` parameter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╣ `Response` рднреА declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдХреЛрдИ рднреА `Response` subclass)ред
рдЖрдк рдЕрдкрдиреА *path operation function* рд╕реЗ рдЬреЛ contents рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЙрд╕ `Response` рдХреЗ рдЕрдВрджрд░ рд░рдЦ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
/// note | рдиреЛрдЯ
рдпрджрд┐ рдЖрдк рдмрд┐рдирд╛ media type рд╡рд╛рд▓реА response class рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ FastAPI рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛ рдХрд┐ рдЖрдкрдХреЗ response рдореЗрдВ рдХреЛрдИ content рди рд╣реЛ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдкрдиреЗ generated OpenAPI docs рдореЗрдВ response format рдХреЛ document рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
///
## JSON Responses { #json-responses }
Default рд░реВрдк рд╕реЗ FastAPI JSON responses рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк [Response Model](../tutorial/response-model.md) declare рдХрд░рддреЗ рд╣реИрдВ рддреЛ FastAPI Pydantic рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ data рдХреЛ JSON рдореЗрдВ serialize рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
рдпрджрд┐ рдЖрдк response model declare рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ FastAPI [JSON Compatible Encoder](../tutorial/encoder.md) рдореЗрдВ рд╕рдордЭрд╛рдП рдЧрдП `jsonable_encoder` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрд╕реЗ `JSONResponse` рдореЗрдВ рд░рдЦреЗрдЧрд╛ред
рдпрджрд┐ рдЖрдк JSON media type (`application/json`) рдХреЗ рд╕рд╛рде `response_class` declare рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ `JSONResponse` рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ data рдЖрдкрдХреА *path operation decorator* рдореЗрдВ declare рдХрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА Pydantic `response_model` рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЖрдк convert (рдФрд░ filter) рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди data Pydantic рдХреЗ рд╕рд╛рде JSON bytes рдореЗрдВ serialize рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ `jsonable_encoder` рдХреЗ рд╕рд╛рде convert рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдлрд┐рд░ `JSONResponse` class рдХреЛ pass рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ Python рдХреА standard JSON library рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ bytes рдореЗрдВ serialize рдХрд░реЗрдЧреАред
### JSON Performance { #json-performance }
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрджрд┐ рдЖрдк maximum performance рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ [Response Model](../tutorial/response-model.md) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ *path operation decorator* рдореЗрдВ `response_class` declare рди рдХрд░реЗрдВред
{* ../../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` pass рдХрд░реЗрдВред
{* ../../docs_src/custom_response/tutorial002_py310.py hl[2,7] *}
/// note | рдиреЛрдЯ
Parameter `response_class` рдХрд╛ рдЙрдкрдпреЛрдЧ response рдХреЗ "media type" рдХреЛ define рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, HTTP header `Content-Type` рдХреЛ `text/html` рдкрд░ set рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдФрд░ рдЗрд╕реЗ OpenAPI рдореЗрдВ рдЗрд╕реА рддрд░рд╣ document рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
///
### `Response` рд▓реМрдЯрд╛рдПрдБ { #return-a-response }
рдЬреИрд╕рд╛ рдХрд┐ [рд╕реАрдзреЗ Response рд▓реМрдЯрд╛рдПрдБ](response-directly.md) рдореЗрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рдЕрдкрдиреА *path operation* рдореЗрдВ response рдХреЛ рд╕реАрдзреЗ рд▓реМрдЯрд╛рдХрд░ рднреА override рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдКрдкрд░ рд╡рд╛рд▓рд╛ рд╡рд╣реА рдЙрджрд╛рд╣рд░рдг, рдЬреЛ `HTMLResponse` рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
{* ../../docs_src/custom_response/tutorial003_py310.py hl[2,7,19] *}
/// warning | рдЪреЗрддрд╛рд╡рдиреА
рдЖрдкрдХреА *path operation function* рджреНрд╡рд╛рд░рд╛ рд╕реАрдзреЗ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ `Response` OpenAPI рдореЗрдВ document рдирд╣реАрдВ рд╣реЛрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, `Content-Type` document рдирд╣реАрдВ рд╣реЛрдЧрд╛) рдФрд░ automatic interactive docs рдореЗрдВ visible рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
///
/// note | рдиреЛрдЯ
рдмреЗрд╢рдХ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ `Content-Type` header, status code, рдЖрджрд┐, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП `Response` object рд╕реЗ рдЖрдПрдБрдЧреЗред
///
### OpenAPI рдореЗрдВ document рдХрд░реЗрдВ рдФрд░ `Response` override рдХрд░реЗрдВ { #document-in-openapi-and-override-response }
рдпрджрд┐ рдЖрдк function рдХреЗ рдЕрдВрджрд░ рд╕реЗ response рдХреЛ override рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА OpenAPI рдореЗрдВ "media type" document рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк `response_class` parameter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ `Response` object рднреА рд▓реМрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рддрдм `response_class` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ OpenAPI *path operation* рдХреЛ document рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдкрдХрд╛ `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 рдХрд░рдХреЗ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
`generate_html_response()` рдХреЛ call рдХрд░рдиреЗ рдХрд╛ result рд▓реМрдЯрд╛рдХрд░, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ `Response` рд▓реМрдЯрд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ default **FastAPI** behavior рдХреЛ override рдХрд░реЗрдЧрд╛ред
рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ `response_class` рдореЗрдВ рднреА `HTMLResponse` pass рдХрд┐рдпрд╛ рд╣реИ, **FastAPI** рдХреЛ рдкрддрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕реЗ OpenAPI рдФрд░ interactive docs рдореЗрдВ `text/html` рдХреЗ рд╕рд╛рде HTML рдХреЗ рд░реВрдк рдореЗрдВ рдХреИрд╕реЗ document рдХрд░рдирд╛ рд╣реИ:
<img src="/img/tutorial/custom-response/image01.png">
## рдЙрдкрд▓рдмреНрдз responses { #available-responses }
рдпрд╣рд╛рдБ рдХреБрдЫ рдЙрдкрд▓рдмреНрдз responses рджрд┐рдП рдЧрдП рд╣реИрдВред
рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЖрдк рдХреБрдЫ рдФрд░ рд▓реМрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП `Response` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ custom sub-class рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
/// note | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
рдЖрдк `from starlette.responses import HTMLResponse` рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
**FastAPI** рдЖрдкрдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, developer рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд╣реА `starlette.responses` `fastapi.responses` рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрд▓рдмреНрдз responses рд╕реАрдзреЗ Starlette рд╕реЗ рдЖрддреЗ рд╣реИрдВред
///
### `Response` { #response }
рдореБрдЦреНрдп `Response` class, рдмрд╛рдХреА рд╕рднреА responses рдЗрд╕рд╕реЗ inherit рдХрд░рддреЗ рд╣реИрдВред
рдЖрдк рдЗрд╕реЗ рд╕реАрдзреЗ рд▓реМрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд parameters accept рдХрд░рддрд╛ рд╣реИ:
* `content` - рдПрдХ `str` рдпрд╛ `bytes`ред
* `status_code` - рдПрдХ `int` HTTP status codeред
* `headers` - strings рдХрд╛ рдПрдХ `dict`ред
* `media_type` - media type рдмрддрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ `str`ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП `"text/html"`ред
FastAPI (рдЕрд╕рд▓ рдореЗрдВ Starlette) рдЕрдкрдиреЗ рдЖрдк рдПрдХ Content-Length header рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдЧрд╛ред рдпрд╣ `media_type` рдХреЗ рдЖрдзрд╛рд░ рдкрд░ Content-Type header рднреА рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдЧрд╛ рдФрд░ text types рдХреЗ рд▓рд┐рдП charset append рдХрд░реЗрдЧрд╛ред
{* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *}
### `HTMLResponse` { #htmlresponse }
рдХреБрдЫ text рдпрд╛ bytes рд▓реЗрддрд╛ рд╣реИ рдФрд░ HTML response рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдЖрдкрдиреЗ рдКрдкрд░ рдкрдврд╝рд╛ред
### `PlainTextResponse` { #plaintextresponse }
рдХреБрдЫ text рдпрд╛ bytes рд▓реЗрддрд╛ рд╣реИ рдФрд░ plain text response рд▓реМрдЯрд╛рддрд╛ рд╣реИред
{* ../../docs_src/custom_response/tutorial005_py310.py hl[2,7,9] *}
### `JSONResponse` { #jsonresponse }
рдХреБрдЫ data рд▓реЗрддрд╛ рд╣реИ рдФрд░ `application/json` encoded response рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдЖрдкрдиреЗ рдКрдкрд░ рдкрдврд╝рд╛, рдпрд╣ **FastAPI** рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ default response рд╣реИред
/// note | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк response model рдпрд╛ return type declare рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реАрдзреЗ data рдХреЛ JSON рдореЗрдВ serialize рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ JSON рдХреЗ рд▓рд┐рдП рд╕рд╣реА media type рд╡рд╛рд▓рд╛ response рд╕реАрдзреЗ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, `JSONResponse` class рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ред
рдпрд╣ best performance рдкрд╛рдиреЗ рдХрд╛ ideal рддрд░реАрдХрд╛ рд╣реИред
///
### `RedirectResponse` { #redirectresponse }
HTTP redirect рд▓реМрдЯрд╛рддрд╛ рд╣реИред Default рд░реВрдк рд╕реЗ 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` рдХреЗ рд▓рд┐рдП default рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛, рдЬреЛ `307` рд╣реИред
---
рдЖрдк `status_code` parameter рдХреЛ `response_class` parameter рдХреЗ рд╕рд╛рде combine рдХрд░рдХреЗ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/custom_response/tutorial006c_py310.py hl[2,7,9] *}
### `StreamingResponse` { #streamingresponse }
рдПрдХ async generator рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп generator/iterator (`yield` рд╡рд╛рд▓реА function) рд▓реЗрддрд╛ рд╣реИ рдФрд░ response body рдХреЛ stream рдХрд░рддрд╛ рд╣реИред
{* ../../docs_src/custom_response/tutorial007_py310.py hl[3,16] *}
/// note | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
рдПрдХ `async` task рдХреЗрд╡рд▓ рддрдм cancel рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╡рд╣ рдХрд┐рд╕реА `await` рддрдХ рдкрд╣реБрдБрдЪрддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ `await` рдирд╣реАрдВ рд╣реИ, рддреЛ generator (`yield` рд╡рд╛рд▓реА function) рдареАрдХ рд╕реЗ cancel рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рдФрд░ cancellation request рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдЪрд▓рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддрд╛ рд╣реИред
рдЪреВрдБрдХрд┐ рдЗрд╕ рдЫреЛрдЯреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдХрд┐рд╕реА `await` statement рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рдо event loop рдХреЛ cancellation handle рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП `await anyio.sleep(0)` рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдпрд╣ рдмрдбрд╝реЗ рдпрд╛ infinite streams рдХреЗ рд╕рд╛рде рдФрд░ рднреА рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧрд╛ред
///
/// tip | рдЯрд┐рдк
рд╕реАрдзреЗ `StreamingResponse` рд▓реМрдЯрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдкрдХреЛ рд╢рд╛рдпрдж [Stream Data](./stream-data.md) рдореЗрдВ рджрд┐рдП рдЧрдП style рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ cancellation handle рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк JSON Lines stream рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ [Stream JSON Lines](../tutorial/stream-json-lines.md) tutorial рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред
///
### `FileResponse` { #fileresponse }
рдПрдХ file рдХреЛ response рдХреЗ рд░реВрдк рдореЗрдВ asynchronously stream рдХрд░рддрд╛ рд╣реИред
Instantiate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп response types рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрд▓рдЧ set of arguments рд▓реЗрддрд╛ рд╣реИ:
* `path` - stream рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА file рдХрд╛ file pathред
* `headers` - dictionary рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдИ рднреА custom headersред
* `media_type` - media type рдмрддрд╛рдиреЗ рд╡рд╛рд▓реА stringред рдпрджрд┐ unset рд╣реИ, рддреЛ media type infer рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП filename рдпрд╛ path рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
* `filename` - рдпрджрд┐ set рд╣реИ, рддреЛ рдЗрд╕реЗ 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 рд╕реЗ file path рд╕реАрдзреЗ рд▓реМрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред
## Custom response class { #custom-response-class }
рдЖрдк `Response` рд╕реЗ inherit рдХрд░рдХреЗ рдФрд░ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рдЦреБрдж рдХреА custom response class рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк рдХреБрдЫ settings рдХреЗ рд╕рд╛рде [`orjson`](https://github.com/ijl/orjson) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдорд╛рди рд▓реЗрдВ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ indented рдФрд░ formatted JSON рд▓реМрдЯрд╛рдП, рдЗрд╕рд▓рд┐рдП рдЖрдк orjson option `orjson.OPT_INDENT_2` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЖрдк `CustomORJSONResponse` рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ `Response.render(content)` method рдмрдирд╛рдирд╛ рд╣реИ рдЬреЛ content рдХреЛ `bytes` рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
{* ../../docs_src/custom_response/tutorial009c_py310.py hl[9:14,17] *}
рдЕрдм рдпрд╣ рд▓реМрдЯрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп:
```json
{"message": "Hello World"}
```
...рдпрд╣ response рд▓реМрдЯрд╛рдПрдЧрд╛:
```json
{
"message": "Hello World"
}
```
рдмреЗрд╢рдХ, JSON formatting рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдХрд╣реАрдВ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рдорд┐рд▓реЗрдВрдЧреЗред ЁЯШЙ
### `orjson` рдпрд╛ Response Model { #orjson-or-response-model }
рдпрджрд┐ рдЖрдк performance рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж `orjson` response рдХреА рддреБрд▓рдирд╛ рдореЗрдВ [Response Model](../tutorial/response-model.md) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред
Response model рдХреЗ рд╕рд╛рде, FastAPI data рдХреЛ JSON рдореЗрдВ serialize рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Pydantic рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, intermediate steps рдХреЗ рдмрд┐рдирд╛, рдЬреИрд╕реЗ `jsonable_encoder` рдХреЗ рд╕рд╛рде convert рдХрд░рдирд╛, рдЬреЛ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реЛрддрд╛ред
рдФрд░ рдЕрдВрджрд░ рд╕реЗ, Pydantic JSON рдореЗрдВ serialize рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `orjson` рдЬреИрд╕реЗ рд╣реА underlying Rust mechanisms рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП response model рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА best performance рдорд┐рд▓ рдЬрд╛рдПрдЧреАред
## Default response class { #default-response-class }
**FastAPI** class instance рдпрд╛ `APIRouter` рдмрдирд╛рддреЗ рд╕рдордп рдЖрдк specify рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ default рд░реВрдк рд╕реЗ рдХреМрди-рд╕реА response class рдЙрдкрдпреЛрдЧ рдХрд░рдиреА рд╣реИред
рдЗрд╕реЗ define рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ parameter `default_response_class` рд╣реИред
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, **FastAPI** рд╕рднреА *path operations* рдореЗрдВ JSON рдХреЗ рдмрдЬрд╛рдп default рд░реВрдк рд╕реЗ `HTMLResponse` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
{* ../../docs_src/custom_response/tutorial010_py310.py hl[2,4] *}
/// tip | рдЯрд┐рдк
рдЖрдк рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ *path operations* рдореЗрдВ рдЕрдм рднреА `response_class` override рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
///
## рдЕрддрд┐рд░рд┐рдХреНрдд documentation { #additional-documentation }
рдЖрдк `responses` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ OpenAPI рдореЗрдВ media type рдФрд░ рдХрдИ рдЕрдиреНрдп details рднреА declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: [OpenAPI рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд Responses](additional-responses.md)ред

95
docs/hi/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) рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА support рдХрд░рддрд╛ рд╣реИ:
{* ../../docs_src/dataclasses_/tutorial001_py310.py hl[1,6:11,18:19] *}
рдпрд╣ рдЕрднреА рднреА **Pydantic** рдХреА рд╡рдЬрд╣ рд╕реЗ support рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ [`dataclasses` рдХреЗ рд▓рд┐рдП internal support](https://docs.pydantic.dev/latest/concepts/dataclasses/#use-of-stdlib-dataclasses-with-basemodel) рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдКрдкрд░ рджрд┐рдП рдЧрдП code рдореЗрдВ рднреА, рдЬреЛ Pydantic рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛, FastAPI рдЙрди standard dataclasses рдХреЛ Pydantic рдХреА рдЕрдкрдиреА рддрд░рд╣ рдХреА dataclasses рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП Pydantic рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ рдЗрдиреНрд╣реЗрдВ рднреА support рдХрд░рддрд╛ рд╣реИ:
* data validation
* data serialization
* data documentation, рдЖрджрд┐ред
рдпрд╣ Pydantic models рдХреА рддрд░рд╣ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЕрдВрджрд░ рд╕реЗ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕реА рддрд░рд╣, Pydantic рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
/// note | рдиреЛрдЯ
рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ dataclasses рд╡рд╣ рд╕рдм рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреАрдВ рдЬреЛ Pydantic models рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрднреА рднреА Pydantic models рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реА dataclasses рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВ, рддреЛ FastAPI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ web API рдХреЛ power рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рддрд░рдХреАрдм рд╣реИред ЁЯдУ
///
## `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 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
<img src="/img/tutorial/dataclasses/image01.png">
## Nested Data Structures рдореЗрдВ Dataclasses { #dataclasses-in-nested-data-structures }
рдЖрдк nested data structures рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП `dataclasses` рдХреЛ рдЕрдиреНрдп type annotations рдХреЗ рд╕рд╛рде рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдЕрднреА рднреА Pydantic рдХреЗ `dataclasses` рд╡рд╛рд▓реЗ version рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ automatically generated API documentation рдореЗрдВ errors рд╣реЛрдВред
рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк standard `dataclasses` рдХреЛ рдмрд╕ `pydantic.dataclasses` рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ drop-in replacement рд╣реИ:
{* ../../docs_src/dataclasses_/tutorial003_py310.py hl[1,4,7:10,13:16,22:24,27] *}
1. рд╣рдо рдЕрднреА рднреА standard `dataclasses` рд╕реЗ `field` import рдХрд░рддреЗ рд╣реИрдВред
2. `pydantic.dataclasses`, `dataclasses` рдХреЗ рд▓рд┐рдП рдПрдХ drop-in replacement рд╣реИред
3. `Author` dataclass рдореЗрдВ `Item` dataclasses рдХреА рдПрдХ list рд╢рд╛рдорд┐рд▓ рд╣реИред
4. `Author` dataclass рдХреЛ `response_model` parameter рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
5. рдЖрдк request body рдХреЗ рд░реВрдк рдореЗрдВ dataclasses рдХреЗ рд╕рд╛рде рдЕрдиреНрдп standard type annotations рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ `Item` dataclasses рдХреА рдПрдХ list рд╣реИред
6. рдпрд╣рд╛рдБ рд╣рдо рдПрдХ dictionary return рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ `items` рд╣реИ, рдЬреЛ dataclasses рдХреА рдПрдХ list рд╣реИред
FastAPI рдЕрднреА рднреА data рдХреЛ JSON рдореЗрдВ <dfn title="data рдХреЛ рдРрд╕реЗ format рдореЗрдВ рдмрджрд▓рдирд╛ рдЬрд┐рд╕реЗ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХреЗ">serialize рдХрд░рдиреЗ</dfn> рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред
7. рдпрд╣рд╛рдБ `response_model`, `Author` dataclasses рдХреА list рдХреЗ type annotation рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдлрд┐рд░ рд╕реЗ, рдЖрдк `dataclasses` рдХреЛ standard type annotations рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
8. рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ *path operation function* `async def` рдХреА рдмрдЬрд╛рдп рд╕рд╛рдорд╛рдиреНрдп `def` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, FastAPI рдореЗрдВ рдЖрдк рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ `def` рдФрд░ `async def` рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рдпрд╛рдж рджрд┐рд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реЗ рдХрдм рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рддреЛ [`async` рдФрд░ `await`](../async.md#in-a-hurry) рдХреЗ docs рдореЗрдВ _"рдЬрд▓реНрджреА рдореЗрдВ рд╣реИрдВ?"_ section рджреЗрдЦреЗрдВред
9. рдпрд╣ *path operation function* dataclasses return рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдХрд░ рд╕рдХрддрд╛ рдерд╛), рдмрд▓реНрдХрд┐ internal data рд╡рд╛рд▓реА dictionaries рдХреА list return рдХрд░ рд░рд╣рд╛ рд╣реИред
FastAPI response рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП `response_model` parameter (рдЬрд┐рд╕рдореЗрдВ dataclasses рд╢рд╛рдорд┐рд▓ рд╣реИрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
рдЖрдк рдЬрдЯрд┐рд▓ data structures рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП `dataclasses` рдХреЛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ combinations рдореЗрдВ рдЕрдиреНрдп type annotations рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╡рд░рдг рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рджрд┐рдП рдЧрдП in-code annotation tips рджреЗрдЦреЗрдВред
## рдФрд░ рдЬрд╛рдиреЗрдВ { #learn-more }
рдЖрдк `dataclasses` рдХреЛ рдЕрдиреНрдп Pydantic models рдХреЗ рд╕рд╛рде рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирд╕реЗ inherit рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ models рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрджрд┐ред
рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, [dataclasses рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ Pydantic docs](https://docs.pydantic.dev/latest/concepts/dataclasses/) рджреЗрдЦреЗрдВред
## Version { #version }
рдпрд╣ FastAPI version `0.67.0` рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИред ЁЯФЦ

165
docs/hi/docs/advanced/events.md

@ -0,0 +1,165 @@
# Lifespan Events { #lifespan-events }
рдЖрдк рдРрд╕реА logic (code) define рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ application рдХреЗ **starts up** рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ execute рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ code application рдХреЗ **requests receive рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ**, **рдПрдХ рдмрд╛рд░** execute рд╣реЛрдЧрд╛ред
рдЙрд╕реА рддрд░рд╣, рдЖрдк рдРрд╕реА logic (code) define рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ application рдХреЗ **shutting down** рд╣реЛрдиреЗ рдкрд░ execute рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ code рд╕рдВрднрд╡рддрдГ **рдХрдИ requests** handle рдХрд░рдиреЗ рдХреЗ **рдмрд╛рдж**, **рдПрдХ рдмрд╛рд░** execute рд╣реЛрдЧрд╛ред
рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ code application рдХреЗ requests рд▓реЗрдирд╛ **рд╢реБрд░реВ** рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдФрд░ requests handle рдХрд░рдирд╛ **рдкреВрд░рд╛** рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж execute рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдкреВрд░реА application **lifespan** рдХреЛ cover рдХрд░рддрд╛ рд╣реИ (рд╢рдмреНрдж "lifespan" рдереЛрдбрд╝реА рджреЗрд░ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧрд╛ ЁЯШЙ)ред
рдпрд╣ рдЙрди **resources** рдХреЛ setup рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдирдХреА рдЖрдкрдХреЛ рдкреВрд░реА app рдореЗрдВ рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИ, рдФрд░ рдЬреЛ requests рдХреЗ рдмреАрдЪ **shared** рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░/рдпрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдмрд╛рдж рдореЗрдВ **clean up** рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, database connection pool, рдпрд╛ рдХреЛрдИ shared machine learning model load рдХрд░рдирд╛ред
## Use Case { #use-case }
рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг **use case** рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдЗрд╕рд╕реЗ рдХреИрд╕реЗ solve рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ **machine learning models** рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк requests handle рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП use рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред ЁЯдЦ
рд╡рд╣реА models requests рдХреЗ рдмреАрдЪ shared рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╣рд░ request рдХреЗ рд▓рд┐рдП рдПрдХ model, рдпрд╛ рд╣рд░ user рдХреЗ рд▓рд┐рдП рдПрдХ model рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ model load рдХрд░рдиреЗ рдореЗрдВ **рдХрд╛рдлреА рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ**, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕реЗ disk рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░рд╛ **data** read рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рд╣рд░ request рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗред
рдЖрдк рдЗрд╕реЗ module/file рдХреЗ top level рдкрд░ load рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реЛрдЧрд╛ рдХрд┐ рдЕрдЧрд░ рдЖрдк рд╕рд┐рд░реНрдл рдПрдХ simple automated test run рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддрдм рднреА рдпрд╣ **model load** рдХрд░реЗрдЧрд╛, рдФрд░ рдлрд┐рд░ рд╡рд╣ test **slow** рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ code рдХреЗ рдХрд┐рд╕реА independent part рдХреЛ run рдХрд░ рдкрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрд╕реЗ model load рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛ред
рдпрд╣реА рд╣рдо solve рдХрд░реЗрдВрдЧреЗ, рдЪрд▓рд┐рдП model рдХреЛ requests handle рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ load рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ application рдХреЗ requests receive рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ, code load рд╣реЛрддреЗ рд╕рдордп рдирд╣реАрдВред
## Lifespan { #lifespan }
рдЖрдк `FastAPI` app рдХреЗ `lifespan` parameter рдФрд░ рдПрдХ "context manager" (рдореИрдВ рдЕрднреА рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ) рдХрд╛ use рдХрд░рдХреЗ рдпрд╣ *startup* рдФрд░ *shutdown* logic define рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ detail рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред
рд╣рдо `yield` рдХреЗ рд╕рд╛рде рдПрдХ async function `lifespan()` рдЗрд╕ рддрд░рд╣ create рдХрд░рддреЗ рд╣реИрдВ:
{* ../../docs_src/events/tutorial003_py310.py hl[16,19] *}
рдпрд╣рд╛рдВ рд╣рдо `yield` рд╕реЗ рдкрд╣рд▓реЗ machine learning models рд╡рд╛рд▓реА dictionary рдореЗрдВ (fake) model function рд░рдЦрдХрд░ model load рдХрд░рдиреЗ рд╡рд╛рд▓реА рдорд╣рдВрдЧреА *startup* operation рдХреЛ simulate рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ code application рдХреЗ **requests рд▓реЗрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ**, *startup* рдХреЗ рджреМрд░рд╛рди execute рд╣реЛрдЧрд╛ред
рдФрд░ рдлрд┐рд░, `yield` рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рд╣рдо model unload рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ code application рдХреЗ **requests handle рдХрд░рдирд╛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж**, *shutdown* рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ execute рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ memory рдпрд╛ GPU рдЬреИрд╕реЗ resources release рдХрд░ рд╕рдХрддрд╛ рд╣реИред
/// tip | рд╕реБрдЭрд╛рд╡
`shutdown` рддрдм рд╣реЛрдЧрд╛ рдЬрдм рдЖрдк application рдХреЛ **stop** рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗред
рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдХреЛрдИ рдирдпрд╛ version start рдХрд░рдирд╛ рд╣реЛ, рдпрд╛ рдЖрдк рдЗрд╕реЗ рдЪрд▓рд╛рддреЗ-рдЪрд▓рд╛рддреЗ рдмрд╕ рдердХ рдЧрдП рд╣реЛрдВред ЁЯд╖
///
### Lifespan function { #lifespan-function }
рдзреНрдпрд╛рди рджреЗрдиреЗ рд╡рд╛рд▓реА рдкрд╣рд▓реА рдЪреАрдЬ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо `yield` рдХреЗ рд╕рд╛рде рдПрдХ async function define рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ `yield` рд╡рд╛рд▓реА Dependencies рд╕реЗ рдмрд╣реБрдд рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рд╣реИред
{* ../../docs_src/events/tutorial003_py310.py hl[14:19] *}
function рдХрд╛ рдкрд╣рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛, `yield` рд╕реЗ рдкрд╣рд▓реЗ рд╡рд╛рд▓рд╛, application start рд╣реЛрдиреЗ рд╕реЗ **рдкрд╣рд▓реЗ** execute рд╣реЛрдЧрд╛ред
рдФрд░ `yield` рдХреЗ рдмрд╛рдж рд╡рд╛рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛ application рдХреЗ finish рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ **рдмрд╛рдж** execute рд╣реЛрдЧрд╛ред
### Async Context Manager { #async-context-manager }
рдЕрдЧрд░ рдЖрдк check рдХрд░реЗрдВ, рддреЛ function рдХреЛ `@asynccontextmanager` рд╕реЗ decorate рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпрд╣ function рдХреЛ "**async context manager**" рдирд╛рдо рдХреА рдЪреАрдЬ рдореЗрдВ convert рдХрд░рддрд╛ рд╣реИред
{* ../../docs_src/events/tutorial003_py310.py hl[1,13] *}
Python рдореЗрдВ рдПрдХ **context manager** рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк `with` statement рдореЗрдВ use рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, `open()` рдХреЛ context manager рдХреА рддрд░рд╣ use рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
```Python
with open("file.txt") as file:
file.read()
```
Python рдХреЗ рдирдП versions рдореЗрдВ, рдПрдХ **async context manager** рднреА рд╣реИред рдЖрдк рдЗрд╕реЗ `async with` рдХреЗ рд╕рд╛рде use рдХрд░реЗрдВрдЧреЗ:
```Python
async with lifespan(app):
await do_stuff()
```
рдЬрдм рдЖрдк рдКрдкрд░ рдХреА рддрд░рд╣ рдХреЛрдИ context manager рдпрд╛ async context manager create рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ `with` block рдореЗрдВ enter рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ `yield` рд╕реЗ рдкрд╣рд▓реЗ рд╡рд╛рд▓рд╛ code execute рдХрд░реЗрдЧрд╛, рдФрд░ `with` block рд╕реЗ exit рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ `yield` рдХреЗ рдмрд╛рдж рд╡рд╛рд▓рд╛ code execute рдХрд░реЗрдЧрд╛ред
рдКрдкрд░ рд╣рдорд╛рд░реЗ code example рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рд╕реАрдзреЗ use рдирд╣реАрдВ рдХрд░рддреЗ, рдмрд▓реНрдХрд┐ FastAPI рдХреЛ pass рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡рд╣ рдЗрд╕реЗ use рдХрд░ рд╕рдХреЗред
`FastAPI` app рдХрд╛ `lifespan` parameter рдПрдХ **async context manager** рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдкрдирд╛ рдирдпрд╛ `lifespan` async context manager рдЙрд╕реЗ pass рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
{* ../../docs_src/events/tutorial003_py310.py hl[22] *}
## Alternative Events (deprecated) { #alternative-events-deprecated }
/// warning | рдЪреЗрддрд╛рд╡рдиреА
*startup* рдФрд░ *shutdown* рдХреЛ handle рдХрд░рдиреЗ рдХрд╛ recommended рддрд░реАрдХрд╛ рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ `FastAPI` app рдХреЗ `lifespan` parameter рдХрд╛ use рдХрд░рдирд╛ рд╣реИред рдЕрдЧрд░ рдЖрдк `lifespan` parameter provide рдХрд░рддреЗ рд╣реИрдВ, рддреЛ `startup` рдФрд░ `shutdown` event handlers рдЕрдм call рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдпрд╣ рдкреВрд░рд╛ `lifespan` рд╣реЛрдЧрд╛ рдпрд╛ рдкреВрд░реЗ events, рджреЛрдиреЛрдВ рдирд╣реАрдВред
рдЖрдк рд╢рд╛рдпрдж рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ skip рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
///
рдЗрд╕ logic рдХреЛ *startup* рдХреЗ рджреМрд░рд╛рди рдФрд░ *shutdown* рдХреЗ рджреМрд░рд╛рди execute рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП define рдХрд░рдиреЗ рдХрд╛ рдПрдХ alternative рддрд░реАрдХрд╛ рд╣реИред
рдЖрдк event handlers (functions) define рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ application рдХреЗ starts up рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╛ application рдХреЗ shutting down рд╣реЛрдиреЗ рдкрд░ execute рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрди functions рдХреЛ `async def` рдпрд╛ normal `def` рдХреЗ рд╕рд╛рде declare рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
### `startup` event { #startup-event }
application start рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ run рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ function add рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ event `"startup"` рдХреЗ рд╕рд╛рде declare рдХрд░реЗрдВ:
{* ../../docs_src/events/tutorial001_py310.py hl[8] *}
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, `startup` event handler function items "database" (рдмрд╕ рдПрдХ `dict`) рдХреЛ рдХреБрдЫ values рдХреЗ рд╕рд╛рде initialize рдХрд░реЗрдЧрд╛ред
рдЖрдк рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ event handler function add рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рдЖрдкрдХреА application requests receive рдХрд░рдирд╛ рддрдм рддрдХ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░реЗрдЧреА рдЬрдм рддрдХ рд╕рднреА `startup` event handlers complete рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗред
### `shutdown` event { #shutdown-event }
application рдХреЗ shutting down рд╣реЛрдиреЗ рдкрд░ run рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ function add рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ event `"shutdown"` рдХреЗ рд╕рд╛рде declare рдХрд░реЗрдВ:
{* ../../docs_src/events/tutorial002_py310.py hl[6] *}
рдпрд╣рд╛рдВ, `shutdown` event handler function рдПрдХ text line `"Application shutdown"` рдХреЛ `log.txt` file рдореЗрдВ write рдХрд░реЗрдЧрд╛ред
/// note | рдиреЛрдЯ
`open()` function рдореЗрдВ, `mode="a"` рдХрд╛ рдорддрд▓рдм "append" рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, line рдЙрд╕ file рдореЗрдВ рдЬреЛ рднреА рд╣реИ рдЙрд╕рдХреЗ рдмрд╛рдж add рдХреА рдЬрд╛рдПрдЧреА, рдкрд┐рдЫрд▓реЗ contents рдХреЛ overwrite рдХрд┐рдП рдмрд┐рдирд╛ред
///
/// tip | рд╕реБрдЭрд╛рд╡
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдПрдХ standard Python `open()` function use рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдПрдХ file рдХреЗ рд╕рд╛рде interact рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдореЗрдВ I/O (input/output) рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЪреАрдЬреЛрдВ рдХреЗ disk рдкрд░ write рд╣реЛрдиреЗ рдХрд╛ "waiting" рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди `open()` `async` рдФрд░ `await` use рдирд╣реАрдВ рдХрд░рддрд╛ред
рдЗрд╕рд▓рд┐рдП, рд╣рдо event handler function рдХреЛ `async def` рдХреЗ рдмрдЬрд╛рдп standard `def` рдХреЗ рд╕рд╛рде declare рдХрд░рддреЗ рд╣реИрдВред
///
### `startup` рдФрд░ `shutdown` рд╕рд╛рде рдореЗрдВ { #startup-and-shutdown-together }
рдЗрд╕ рдмрд╛рдд рдХреА рдХрд╛рдлреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ *startup* рдФрд░ *shutdown* рдХреА logic connected рд╣реЛ, рдЖрдк рд╢рд╛рдпрдж рдХреБрдЫ start рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ finish рдХрд░рдирд╛, рдХреЛрдИ resource acquire рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ release рдХрд░рдирд╛, рдЖрджрд┐ рдЪрд╛рд╣реЗрдВред
рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ functions рдореЗрдВ рдХрд░рдирд╛, рдЬреЛ logic рдпрд╛ variables рдХреЛ рд╕рд╛рде рдореЗрдВ share рдирд╣реАрдВ рдХрд░рддреЗ, рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ values рдХреЛ global variables рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХреА tricks рдореЗрдВ store рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛ред
рдЗрд╕реА рд╡рдЬрд╣ рд╕реЗ, рдЕрдм рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдКрдкрд░ explain рдХрд┐рдП рдЧрдП `lifespan` рдХреЛ use рдХрд░рдиреЗ рдХреА recommendation рд╣реИред
## Technical Details { #technical-details }
рдЬрд┐рдЬреНрдЮрд╛рд╕реБ nerds рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ technical detailред ЁЯдУ
рдЕрдВрджрд░ рд╕реЗ, ASGI technical specification рдореЗрдВ, рдпрд╣ [Lifespan Protocol](https://asgi.readthedocs.io/en/latest/specs/lifespan.html) рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдФрд░ рдпрд╣ `startup` рдФрд░ `shutdown` рдирд╛рдо рдХреЗ events define рдХрд░рддрд╛ рд╣реИред
/// note | рдиреЛрдЯ
рдЖрдк Starlette `lifespan` handlers рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ [Starlette рдХреА Lifespan docs](https://www.starlette.dev/lifespan/) рдореЗрдВ рдФрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдореЗрдВ рдпрд╣ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ рдХрд┐ lifespan state рдХреЛ рдХреИрд╕реЗ handle рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬрд┐рд╕реЗ рдЖрдкрдХреЗ code рдХреЗ рдЕрдиреНрдп areas рдореЗрдВ use рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
///
## Sub Applications { #sub-applications }
ЁЯЪи рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдпреЗ lifespan events (startup рдФрд░ shutdown) рдХреЗрд╡рд▓ main application рдХреЗ рд▓рд┐рдП execute рд╣реЛрдВрдЧреЗ, [Sub Applications - Mounts](sub-applications.md) рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

192
docs/hi/docs/advanced/generate-clients.md

@ -0,0 +1,192 @@
# SDKs рдЬреЗрдирд░реЗрдЯ рдХрд░рдирд╛ { #generating-sdks }
рдХреНрдпреЛрдВрдХрд┐ **FastAPI** **OpenAPI** specification рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЗрд╕рдХреА APIs рдХреЛ рдПрдХ standard format рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХрдИ tools рд╕рдордЭрддреЗ рд╣реИрдВред
рдЗрд╕рд╕реЗ up-to-date **documentation**, рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ client libraries (<abbr title="Software Development Kits - рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ Development Kits">**SDKs**</abbr>), рдФрд░ **testing** рдпрд╛ **automation workflows** рдЬреЗрдирд░реЗрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ code рдХреЗ рд╕рд╛рде sync рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВред
рдЗрд╕ guide рдореЗрдВ, рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдЕрдкрдиреЗ FastAPI backend рдХреЗ рд▓рд┐рдП **TypeScript SDK** рдХреИрд╕реЗ рдЬреЗрдирд░реЗрдЯ рдХрд░реЗрдВред
## Open Source SDK Generators { #open-source-sdk-generators }
рдПрдХ versatile рд╡рд┐рдХрд▓реНрдк [OpenAPI Generator](https://openapi-generator.tech/) рд╣реИ, рдЬреЛ **рдХрдИ programming languages** рдХреЛ support рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреА OpenAPI specification рд╕реЗ SDKs рдЬреЗрдирд░реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
**TypeScript clients** рдХреЗ рд▓рд┐рдП, [Hey API](https://heyapi.dev/) рдПрдХ purpose-built solution рд╣реИ, рдЬреЛ TypeScript ecosystem рдХреЗ рд▓рд┐рдП optimized experience рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдЖрдк [OpenAPI.Tools](https://openapi.tools/#sdk) рдкрд░ рдФрд░ SDK generators рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВред
/// tip | рд╕реБрдЭрд╛рд╡
FastAPI рдЕрдкрдиреЗ-рдЖрдк **OpenAPI 3.1** specifications рдЬреЗрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА tool рдЗрд╕ version рдХреЛ support рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
///
## TypeScript SDK рдмрдирд╛рдПрдБ { #create-a-typescript-sdk }
рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ FastAPI application рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ:
{* ../../docs_src/generate_clients/tutorial001_py310.py hl[7:9,12:13,16:17,21] *}
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ *path operations* рдЙрди models рдХреЛ define рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реЗ request payload рдФрд░ response payload рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ, `Item` рдФрд░ `ResponseMessage` models рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред
### API Docs { #api-docs }
рдпрджрд┐ рдЖрдк `/docs` рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрд╕рдореЗрдВ requests рдореЗрдВ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рдФрд░ responses рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ data рдХреЗ рд▓рд┐рдП **schemas** рд╣реИрдВ:
<img src="/img/tutorial/generate-clients/image01.png">
рдЖрдк рд╡реЗ schemas рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ app рдореЗрдВ models рдХреЗ рд╕рд╛рде declare рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╡рд╣ рдЬрд╛рдирдХрд╛рд░реА app рдХреЗ **OpenAPI schema** рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрддреА рд╣реИ, рдФрд░ рдлрд┐рд░ API docs рдореЗрдВ рджрд┐рдЦрд╛рдИ рдЬрд╛рддреА рд╣реИред
Models рд╕реЗ рд╡рд╣реА рдЬрд╛рдирдХрд╛рд░реА рдЬреЛ OpenAPI рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИ, **client code рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ** рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
### Hey API { #hey-api }
рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ models рдХреЗ рд╕рд╛рде рдПрдХ FastAPI app рд╣реЛ, рддреЛ рд╣рдо Hey API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ TypeScript client рдЬреЗрдирд░реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХрд╛ npx рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИред
```sh
npx @hey-api/openapi-ts -i http://localhost:8000/openapi.json -o src/client
```
рдпрд╣ `./src/client` рдореЗрдВ TypeScript SDK рдЬреЗрдирд░реЗрдЯ рдХрд░реЗрдЧрд╛ред
рдЖрдк рдЙрдирдХреА website рдкрд░ [`@hey-api/openapi-ts` install рдХрд░рдирд╛](https://heyapi.dev/openapi-ts/get-started) рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ [generated output](https://heyapi.dev/openapi-ts/output) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
### SDK рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ { #using-the-sdk }
рдЕрдм рдЖрдк client code рдХреЛ import рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдкрдХреЛ methods рдХреЗ рд▓рд┐рдП autocompletion рдорд┐рд▓рддрд╛ рд╣реИ:
<img src="/img/tutorial/generate-clients/image02.png">
рдЖрдкрдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП payload рдХреЗ рд▓рд┐рдП рднреА autocompletion рдорд┐рд▓реЗрдЧрд╛:
<img src="/img/tutorial/generate-clients/image03.png">
/// tip | рд╕реБрдЭрд╛рд╡
`name` рдФрд░ `price` рдХреЗ рд▓рд┐рдП autocompletion рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдЬрд┐рд╕реЗ FastAPI application рдореЗрдВ, `Item` model рдореЗрдВ define рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
///
рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ data рдХреЗ рд▓рд┐рдП inline errors рд╣реЛрдВрдЧреЗ:
<img src="/img/tutorial/generate-clients/image04.png">
Response object рдореЗрдВ рднреА autocompletion рд╣реЛрдЧрд╛:
<img src="/img/tutorial/generate-clients/image05.png">
## Tags рдХреЗ рд╕рд╛рде FastAPI App { #fastapi-app-with-tags }
рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХрд╛ FastAPI app рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЖрдк рд╢рд╛рдпрдж *path operations* рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ groups рдХреЛ separate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП tags рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ **items** рдХреЗ рд▓рд┐рдП рдПрдХ section рдФрд░ **users** рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ section рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ tags рджреНрд╡рд╛рд░рд╛ separate рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
{* ../../docs_src/generate_clients/tutorial002_py310.py hl[21,26,34] *}
### Tags рдХреЗ рд╕рд╛рде TypeScript Client рдЬреЗрдирд░реЗрдЯ рдХрд░реЗрдВ { #generate-a-typescript-client-with-tags }
рдпрджрд┐ рдЖрдк tags рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ FastAPI app рдХреЗ рд▓рд┐рдП client рдЬреЗрдирд░реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдпрддрдГ client code рдХреЛ рднреА tags рдХреЗ рдЖрдзрд╛рд░ рдкрд░ separate рдХрд░реЗрдЧрд╛ред
рдЗрд╕ рддрд░рд╣, рдЖрдк client code рдХреЗ рд▓рд┐рдП рдЪреАрдЬрд╝реЛрдВ рдХреЛ рд╕рд╣реА рддрд░рд╣ рд╕реЗ ordered рдФрд░ grouped рд░рдЦ рдкрд╛рдПрдБрдЧреЗ:
<img src="/img/tutorial/generate-clients/image06.png">
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИрдВ:
* `ItemsService`
* `UsersService`
### Client Method Names { #client-method-names }
рдЕрднреА, рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП method names рдЬреИрд╕реЗ `createItemItemsPost` рдмрд╣реБрдд рд╕рд╛рдлрд╝ рдирд╣реАрдВ рджрд┐рдЦрддреЗ:
```TypeScript
ItemsService.createItemItemsPost({name: "Plumbus", price: 5})
```
...рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ client generator рдкреНрд░рддреНрдпреЗрдХ *path operation* рдХреЗ рд▓рд┐рдП OpenAPI internal **operation ID** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
OpenAPI required рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ operation ID рд╕рднреА *path operations* рдореЗрдВ unique рд╣реЛ, рдЗрд╕рд▓рд┐рдП FastAPI рдЙрд╕ operation ID рдХреЛ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **function name**, **path**, рдФрд░ **HTTP method/operation** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ operation IDs unique рд╣реИрдВред
рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдЧреЗ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдБрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред ЁЯдУ
## Custom Operation IDs рдФрд░ рдмреЗрд╣рддрд░ Method Names { #custom-operation-ids-and-better-method-names }
рдЖрдк рдЗрди operation IDs рдХреЛ **рдЬреЗрдирд░реЗрдЯ** рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ **modify** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╡реЗ clients рдореЗрдВ рд╕рд░рд▓ рд╣реЛрдВ рдФрд░ **рд╕рд░рд▓ method names** рд╣реЛрдВред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдХрд┐рд╕реА рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ operation ID **unique** рд╣реЛред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ *path operation* рдореЗрдВ рдПрдХ tag рд╣реЛ, рдФрд░ рдлрд┐рд░ **tag** рдФрд░ *path operation* **name** (function name) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ operation ID рдЬреЗрдирд░реЗрдЯ рдХрд░реЗрдВред
### Custom Generate Unique ID Function { #custom-generate-unique-id-function }
FastAPI рдкреНрд░рддреНрдпреЗрдХ *path operation* рдХреЗ рд▓рд┐рдП рдПрдХ **unique ID** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ **operation ID** рдХреЗ рд▓рд┐рдП рдФрд░ requests рдпрд╛ responses рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд┐рд╕реА рднреА custom models рдХреЗ names рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдк рдЙрд╕ function рдХреЛ customize рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ `APIRoute` рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ string output рдХрд░рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рдпрд╣ рдкрд╣рд▓реЗ tag (рдЖрдкрдХреЗ рдкрд╛рд╕ рд╢рд╛рдпрдж рдХреЗрд╡рд▓ рдПрдХ tag рд╣реЛрдЧрд╛) рдФрд░ *path operation* name (function name) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдлрд┐рд░ рдЖрдк рдЙрд╕ custom function рдХреЛ `generate_unique_id_function` parameter рдХреЗ рд░реВрдк рдореЗрдВ **FastAPI** рдХреЛ pass рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/generate_clients/tutorial003_py310.py hl[6:7,10] *}
### Custom Operation IDs рдХреЗ рд╕рд╛рде TypeScript Client рдЬреЗрдирд░реЗрдЯ рдХрд░реЗрдВ { #generate-a-typescript-client-with-custom-operation-ids }
рдЕрдм, рдпрджрд┐ рдЖрдк client рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЗрдирд░реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрд╕рдореЗрдВ рдмреЗрд╣рддрд░ method names рд╣реИрдВ:
<img src="/img/tutorial/generate-clients/image07.png">
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ, method names рдореЗрдВ рдЕрдм tag рдФрд░ рдлрд┐рд░ function name рд╣реИ, рдЕрдм рд╡реЗ URL path рдФрд░ HTTP operation рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рддреЗред
### Client Generator рдХреЗ рд▓рд┐рдП OpenAPI Specification рдХреЛ Preprocess рдХрд░реЗрдВ { #preprocess-the-openapi-specification-for-the-client-generator }
рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП code рдореЗрдВ рдЕрднреА рднреА рдХреБрдЫ **duplicated information** рд╣реИред
рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ method **items** рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рд╢рдмреНрдж `ItemsService` (tag рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛) рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди method name рдореЗрдВ рднреА tag name prefixed рд╣реИред ЁЯШХ
рд╣рдо рд╢рд╛рдпрдж рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ OpenAPI рдХреЗ рд▓рд┐рдП рд░рдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ operation IDs **unique** рд╣реИрдВред
рд▓реЗрдХрд┐рди generated client рдХреЗ рд▓рд┐рдП, рд╣рдо clients рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ OpenAPI operation IDs рдХреЛ **modify** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЙрди method names рдХреЛ рдЕрдзрд┐рдХ рдЕрдЪреНрдЫреЗ рдФрд░ **cleaner** рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рд╣рдо OpenAPI JSON рдХреЛ `openapi.json` file рдореЗрдВ download рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕ рддрд░рд╣ рдХреЗ script рд╕реЗ **рдЙрд╕ prefixed tag рдХреЛ remove** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../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 names рдЬреЗрдирд░реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
### Preprocessed OpenAPI рдХреЗ рд╕рд╛рде TypeScript Client рдЬреЗрдирд░реЗрдЯ рдХрд░реЗрдВ { #generate-a-typescript-client-with-the-preprocessed-openapi }
рдХреНрдпреЛрдВрдХрд┐ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдЕрдм `openapi.json` file рдореЗрдВ рд╣реИ, рдЖрдкрдХреЛ рдЕрдкрдиреА input location update рдХрд░рдиреА рд╣реЛрдЧреА:
```sh
npx @hey-api/openapi-ts -i ./openapi.json -o src/client
```
рдирдпрд╛ client рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ **clean method names** рд╣реЛрдВрдЧреЗ, рд╕рднреА **autocompletion**, **inline errors**, рдЖрджрд┐ рдХреЗ рд╕рд╛рде:
<img src="/img/tutorial/generate-clients/image08.png">
## рд▓рд╛рдн { #benefits }
Automatically generated clients рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдЗрди рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд▓рд┐рдП **autocompletion** рдорд┐рд▓реЗрдЧрд╛:
* Methods.
* body рдореЗрдВ request payloads, query parameters, рдЖрджрд┐ред
* Response payloads.
рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣рд░ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП **inline errors** рднреА рд╣реЛрдВрдЧреЗред
рдФрд░ рдЬрдм рднреА рдЖрдк backend code update рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ frontend рдХреЛ **regenerate** рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдореЗрдВ methods рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдИ рднреА рдирдП *path operations* рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗ, рдкреБрд░рд╛рдиреЗ remove рд╣реЛ рдЬрд╛рдПрдБрдЧреЗ, рдФрд░ рдХреЛрдИ рднреА рдЕрдиреНрдп change generated code рдореЗрдВ reflect рд╣реЛрдЧрд╛ред ЁЯдУ
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реИ рдХрд┐ рдпрджрд┐ рдХреБрдЫ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ client code рдореЗрдВ рдЕрдкрдиреЗ-рдЖрдк **reflect** рд╣реЛрдЧрд╛ред рдФрд░ рдпрджрд┐ рдЖрдк client рдХреЛ **build** рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрджрд┐ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП data рдореЗрдВ рдХреЛрдИ **mismatch** рд╣реИ, рддреЛ рдпрд╣ error рджреЗрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, рдЖрдк development cycle рдореЗрдВ рдмрд╣реБрдд рдЬрд▓реНрджреА **рдХрдИ errors detect** рдХрд░ рд▓реЗрдВрдЧреЗ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ errors рдХреЗ production рдореЗрдВ рдЖрдкрдХреЗ рдЕрдВрддрд┐рдо users рдХреЛ рджрд┐рдЦрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝реЗ рдФрд░ рдлрд┐рд░ рдпрд╣ debug рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдкрдбрд╝реЗ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХрд╣рд╛рдБ рд╣реИред тЬи

21
docs/hi/docs/advanced/index.md

@ -0,0 +1,21 @@
# рдЙрдиреНрдирдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЧрд╛рдЗрдб { #advanced-user-guide }
## рдЕрддрд┐рд░рд┐рдХреНрдд feature { #additional-features }
рдореБрдЦреНрдп [рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЧрд╛рдЗрдб](../tutorial/index.md) рдЖрдкрдХреЛ **FastAPI** рдХреЗ рд╕рднреА рдореБрдЦреНрдп feature рдХрд╛ рдЕрд╡рд▓реЛрдХрди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдЧрд▓реЗ sections рдореЗрдВ рдЖрдк рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк, configurations, рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд feature рджреЗрдЦреЗрдВрдЧреЗред
/// tip | рд╕реБрдЭрд╛рд╡
рдЕрдЧрд▓реЗ sections **рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ рдХрд┐ "рдЙрдиреНрдирдд"** рд╣реЛрдВред
рдФрд░ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдореЗрдВ рд╣реЛред
///
## рдкрд╣рд▓реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдкрдврд╝реЗрдВ { #read-the-tutorial-first }
рдЖрдк рдореБрдЦреНрдп [рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЧрд╛рдЗрдб](../tutorial/index.md) рд╕реЗ рдорд┐рд▓реА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рднреА **FastAPI** рдХреЗ рдЬрд╝реНрдпрд╛рджрд╛рддрд░ feature рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рдЕрдЧрд▓реЗ sections рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдкрдврд╝ рд▓рд┐рдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рднреА рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЙрди рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВред

63
docs/hi/docs/advanced/json-base64-bytes.md

@ -0,0 +1,63 @@
# Base64 рдХреЗ рд░реВрдк рдореЗрдВ Bytes рд╡рд╛рд▓рд╛ JSON { #json-with-bytes-as-base64 }
рдЕрдЧрд░ рдЖрдкрдХреЗ app рдХреЛ JSON data receive рдФрд░ send рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЙрд╕рдореЗрдВ binary data рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрд╕реЗ base64 рдХреЗ рд░реВрдк рдореЗрдВ encode рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
## Base64 рдмрдирд╛рдо Files { #base64-vs-files }
рдкрд╣рд▓реЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк binary data upload рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП [Request Files](../tutorial/request-files.md) рдФрд░ binary data рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП [рдХрд╕реНрдЯрдо Response - FileResponse](./custom-response.md#fileresponse) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЙрд╕реЗ JSON рдореЗрдВ encode рдХрд┐рдпрд╛ рдЬрд╛рдПред
JSON рдореЗрдВ рдХреЗрд╡рд▓ UTF-8 encoded strings рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрд╕рдореЗрдВ raw bytes рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗред
Base64 binary data рдХреЛ strings рдореЗрдВ encode рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реЗ рдореВрд▓ binary data рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ characters рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп files рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдХрдо efficient рд╣реЛрдЧрд╛ред
Base64 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрднреА рдХрд░реЗрдВ рдЬрдм рдЖрдкрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ JSON рдореЗрдВ binary data рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛ, рдФрд░ рдЖрдк рдЙрд╕рдХреЗ рд▓рд┐рдП files рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
## Pydantic `bytes` { #pydantic-bytes }
рдЖрдк `bytes` fields рд╡рд╛рд▓рд╛ рдПрдХ Pydantic model declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ model config рдореЗрдВ `val_json_bytes` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ input JSON data рдХреЛ *validate* рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП base64 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗ; рдЙрд╕ validation рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ base64 string рдХреЛ bytes рдореЗрдВ decode рдХрд░реЗрдЧрд╛ред
{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *}
рдЕрдЧрд░ рдЖрдк `/docs` рджреЗрдЦреЗрдВ, рддреЛ рд╡реЗ рджрд┐рдЦрд╛рдПрдБрдЧреЗ рдХрд┐ field `data` base64 encoded bytes рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ:
<div class="screenshot">
<img src="/img/tutorial/json-base64-bytes/image01.png">
</div>
рдЖрдк рдЗрд╕ рддрд░рд╣ рдХрд╛ 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"
}
```
## Output Data рдХреЗ рд▓рд┐рдП Pydantic `bytes` { #pydantic-bytes-for-output-data }
рдЖрдк output data рдХреЗ рд▓рд┐рдП model config рдореЗрдВ `ser_json_bytes` рдХреЗ рд╕рд╛рде `bytes` fields рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ JSON response generate рдХрд░рддреЗ рд╕рдордп Pydantic bytes рдХреЛ base64 рдХреЗ рд░реВрдк рдореЗрдВ *serialize* рдХрд░реЗрдЧрд╛ред
{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *}
## Input рдФрд░ Output Data рдХреЗ рд▓рд┐рдП Pydantic `bytes` { #pydantic-bytes-for-input-and-output-data }
рдФрд░ рдмреЗрд╢рдХ, JSON data receive рдФрд░ send рдХрд░рддреЗ рд╕рдордп рдЖрдк рдЙрд╕реА model рдХреЛ base64 рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП configure рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ input (*validate*) рдХреЛ `val_json_bytes` рдХреЗ рд╕рд╛рде рдФрд░ output (*serialize*) рдХреЛ `ser_json_bytes` рдХреЗ рд╕рд╛рде handle рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *}

97
docs/hi/docs/advanced/middleware.md

@ -0,0 +1,97 @@
# рдЙрдиреНрдирдд Middleware { #advanced-middleware }
рдореБрдЦреНрдп tutorial рдореЗрдВ рдЖрдкрдиреЗ рдкрдврд╝рд╛ рдХрд┐ рдЕрдкрдиреА application рдореЗрдВ [Custom Middleware](../tutorial/middleware.md) рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВред
рдФрд░ рдлрд┐рд░ рдЖрдкрдиреЗ рдпрд╣ рднреА рдкрдврд╝рд╛ рдХрд┐ [`CORSMiddleware` рдХреЗ рд╕рд╛рде CORS](../tutorial/cors.md) рдХреЛ рдХреИрд╕реЗ handle рдХрд░реЗрдВред
рдЗрд╕ section рдореЗрдВ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЕрдиреНрдп middleware рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред
## ASGI middleware рдЬреЛрдбрд╝рдирд╛ { #adding-asgi-middlewares }
рдХреНрдпреЛрдВрдХрд┐ **FastAPI** Starlette рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ <abbr title="Asynchronous Server Gateway Interface - asynchronous рд╕рд░реНрд╡рд░ рдЧреЗрдЯрд╡реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕">ASGI</abbr> specification рдХреЛ implement рдХрд░рддрд╛ рд╣реИ, рдЖрдк рдХреЛрдИ рднреА ASGI middleware рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХрд┐рд╕реА middleware рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП FastAPI рдпрд╛ Starlette рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реЛрдирд╛ required рдирд╣реАрдВ рд╣реИ, рдЬрдм рддрдХ рд╡рд╣ ASGI spec рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдпрддрдГ, ASGI middleware рдРрд╕реА classes рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ argument рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ ASGI app рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреА рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, third-party ASGI middleware рдХреЗ documentation рдореЗрдВ рд╡реЗ рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВрдЧреЗ:
```Python
from unicorn import UnicornMiddleware
app = SomeASGIApp()
new_app = UnicornMiddleware(app, some_config="rainbow")
```
рд▓реЗрдХрд┐рди FastAPI (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Starlette) рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ internal middleware server errors рдХреЛ handle рдХрд░реЗрдВ рдФрд░ custom 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 рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ middleware рдХреЛ pass рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдИ рднреА рдЕрддрд┐рд░рд┐рдХреНрдд arguments рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
## рдПрдХреАрдХреГрдд middleware { #integrated-middlewares }
**FastAPI** common use cases рдХреЗ рд▓рд┐рдП рдХрдИ middleware рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ, рдЖрдЧреЗ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред
/// note | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
рдЕрдЧрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк `from starlette.middleware.something import SomethingMiddleware` рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
**FastAPI** `fastapi.middleware` рдореЗрдВ рдХрдИ middleware рд╕рд┐рд░реНрдл рдЖрдкрдХреА, developer рдХреА, рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрдкрд▓рдмреНрдз рдЕрдзрд┐рдХрд╛рдВрд╢ middleware рд╕реАрдзреЗ Starlette рд╕реЗ рдЖрддреЗ рд╣реИрдВред
///
## `HTTPSRedirectMiddleware` { #httpsredirectmiddleware }
рдпрд╣ enforce рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА incoming requests рдпрд╛ рддреЛ `https` рдпрд╛ `wss` рд╣реЛрдВред
`http` рдпрд╛ `ws` рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓реА рдХреЛрдИ рднреА incoming request рдЗрд╕рдХреЗ рдмрдЬрд╛рдп secure scheme рдкрд░ redirect рдХрд░ рджреА рдЬрд╛рдПрдЧреАред
{* ../../docs_src/advanced_middleware/tutorial001_py310.py hl[2,6] *}
## `TrustedHostMiddleware` { #trustedhostmiddleware }
рдпрд╣ enforce рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА incoming requests рдореЗрдВ `Host` header рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ set рд╣реЛ, рддрд╛рдХрд┐ HTTP Host Header attacks рд╕реЗ рдмрдЪрд╛рд╡ рд╣реЛ рд╕рдХреЗред
{* ../../docs_src/advanced_middleware/tutorial002_py310.py hl[2,6:8] *}
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд arguments supported рд╣реИрдВ:
* `allowed_hosts` - domain names рдХреА рдПрдХ рд╕реВрдЪреА рдЬрд┐рдиреНрд╣реЗрдВ hostnames рдХреЗ рд░реВрдк рдореЗрдВ allow рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред `*.example.com` рдЬреИрд╕реЗ Wildcard domains subdomains рдХреЛ match рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП supported рд╣реИрдВред рдХрд┐рд╕реА рднреА hostname рдХреЛ allow рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рддреЛ `allowed_hosts=["*"]` рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрд╛ middleware рдХреЛ omit рдХрд░реЗрдВред
* `www_redirect` - рдпрджрд┐ True рдкрд░ set рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ allowed hosts рдХреЗ non-www versions рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓реА requests рдЙрдирдХреЗ www counterparts рдкрд░ redirect рдХрд░ рджреА рдЬрд╛рдПрдБрдЧреАред Default `True` рд╣реИред
рдпрджрд┐ рдХреЛрдИ incoming request рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ validate рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рддреЛ `400` response рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред
## `GZipMiddleware` { #gzipmiddleware }
рдРрд╕реА рдХрд┐рд╕реА рднреА request рдХреЗ рд▓рд┐рдП GZip responses handle рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ `Accept-Encoding` header рдореЗрдВ `"gzip"` рд╢рд╛рдорд┐рд▓ рд╣реЛред
middleware standard рдФрд░ streaming рджреЛрдиреЛрдВ responses рдХреЛ handle рдХрд░реЗрдЧрд╛ред
{* ../../docs_src/advanced_middleware/tutorial003_py310.py hl[2,6] *}
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд arguments supported рд╣реИрдВ:
* `minimum_size` - рдЗрд╕ minimum size рд╕реЗ рдЫреЛрдЯреЗ responses рдХреЛ GZip рди рдХрд░реЗрдВ, size bytes рдореЗрдВ рд╣реИред Default `500` рд╣реИред
* `compresslevel` - GZip compression рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ 1 рд╕реЗ 9 рддрдХ рдХреА range рдореЗрдВ рдПрдХ integer рд╣реИред Default `9` рд╣реИред рдХрдо value рд╕реЗ compression рддреЗрдЬрд╝ рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди file sizes рдмрдбрд╝реА рд╣реЛрддреА рд╣реИрдВ, рдЬрдмрдХрд┐ рдЕрдзрд┐рдХ value рд╕реЗ compression рдзреАрдорд╛ рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди file sizes рдЫреЛрдЯреА рд╣реЛрддреА рд╣реИрдВред
## рдЕрдиреНрдп 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 docs](https://www.starlette.dev/middleware/) рдФрд░ [ASGI Awesome List](https://github.com/florimondmanca/awesome-asgi) рджреЗрдЦреЗрдВред

186
docs/hi/docs/advanced/openapi-callbacks.md

@ -0,0 +1,186 @@
# OpenAPI Callbacks { #openapi-callbacks }
рдЖрдк рдПрдХ рдРрд╕реА API рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ *path operation* рд╣реЛ рдЬреЛ рдХрд┐рд╕реА рдФрд░ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ *external API* рдХреЛ request trigger рдХрд░ рд╕рдХреЗ (рд╢рд╛рдпрдж рд╡рд╣реА developer рдЬреЛ рдЖрдкрдХреА API рдХрд╛ *рдЙрдкрдпреЛрдЧ* рдХрд░реЗрдЧрд╛)ред
рдЬрдм рдЖрдкрдХреА API app *external API* рдХреЛ call рдХрд░рддреА рд╣реИ, рдЙрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ "callback" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ external developer рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ software рдЖрдкрдХреА API рдХреЛ request рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЖрдкрдХреА API *call back* рдХрд░рддреА рд╣реИ, рдпрд╛рдиреА рдХрд┐рд╕реА *external API* рдХреЛ request рднреЗрдЬрддреА рд╣реИ (рдЬреЛ рд╢рд╛рдпрдж рдЙрд╕реА developer рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдереА)ред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк рдпрд╣ document рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ external API рдХреИрд╕реА *рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП*ред рдЙрд╕рдореЗрдВ рдХреМрди-рд╕рд╛ *path operation* рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрд╕реЗ рдХреМрди-рд╕рд╛ body expect рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрд╕реЗ рдХреМрди-рд╕рд╛ response рд▓реМрдЯрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрджрд┐ред
## Callbacks рд╡рд╛рд▓реА рдПрдХ app { #an-app-with-callbacks }
рдЖрдЗрдП рдЗрд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рджреЗрдЦрддреЗ рд╣реИрдВред
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдПрдХ рдРрд╕реА app develop рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ invoices рдмрдирд╛рдиреЗ рджреЗрддреА рд╣реИред
рдЗрди invoices рдореЗрдВ рдПрдХ `id`, `title` (optional), `customer`, рдФрд░ `total` рд╣реЛрдЧрд╛ред
рдЖрдкрдХреА API рдХрд╛ user (рдПрдХ external developer) рдЖрдкрдХреА API рдореЗрдВ POST request рдХреЗ рд╕рд╛рде рдПрдХ invoice рдмрдирд╛рдПрдЧрд╛ред
рдлрд┐рд░ рдЖрдкрдХреА API (рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ):
* invoice рдХреЛ external developer рдХреЗ рдХрд┐рд╕реА customer рдХреЛ рднреЗрдЬреЗрдЧреАред
* рдкреИрд╕реЗ collect рдХрд░реЗрдЧреАред
* API user (external developer) рдХреЛ рд╡рд╛рдкрд╕ рдПрдХ notification рднреЗрдЬреЗрдЧреАред
* рдпрд╣ (*рдЖрдкрдХреА API* рд╕реЗ) рдЙрд╕ external developer рджреНрд╡рд╛рд░рд╛ рджреА рдЧрдИ рдХрд┐рд╕реА *external API* рдХреЛ POST request рднреЗрдЬрдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдпрд╣реА "callback" рд╣реИ)ред
## рд╕рд╛рдорд╛рдиреНрдп **FastAPI** app { #the-normal-fastapi-app }
Callback рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдкрд╣рд▓реЗ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп API app рдХреИрд╕реА рджрд┐рдЦреЗрдЧреАред
рдЗрд╕рдореЗрдВ рдПрдХ *path operation* рд╣реЛрдЧрд╛ рдЬреЛ рдПрдХ `Invoice` body receive рдХрд░реЗрдЧрд╛, рдФрд░ рдПрдХ query parameter `callback_url` рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ callback рдХреЗ рд▓рд┐рдП URL рд╣реЛрдЧрд╛ред
рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рдХрд╛рдлрд╝реА рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдЕрдзрд┐рдХрддрд░ code рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдЧрд╛:
{* ../../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/) type рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
///
рдХреЗрд╡рд▓ рдирдИ рдЪреАрдЬрд╝ рд╣реИ *path operation decorator* рдХреЗ argument рдХреЗ рд░реВрдк рдореЗрдВ `callbacks=invoices_callback_router.routes`ред рдЖрдЧреЗ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИред
## Callback рдХреЛ document рдХрд░рдирд╛ { #documenting-the-callback }
рд╡рд╛рд╕реНрддрд╡рд┐рдХ callback code рдЖрдкрдХреА рдЕрдкрдиреА API app рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ред
рдФрд░ рдпрд╣ рдПрдХ app рд╕реЗ рджреВрд╕рд░реА app рдореЗрдВ рдХрд╛рдлрд╝реА рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ code рдХреА рд╕рд┐рд░реНрдлрд╝ рдПрдХ рдпрд╛ рджреЛ lines рднреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЬреИрд╕реЗ:
```Python
callback_url = "https://example.com/api/v1/invoices/events/"
httpx.post(callback_url, json={"description": "Invoice paid", "paid": True})
```
рд▓реЗрдХрд┐рди рд╕рдВрднрд╡рддрдГ callback рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ API user (external developer) *external API* рдХреЛ рд╕рд╣реА рддрд░рд╣ рд╕реЗ implement рдХрд░реЗ, рдЙрд╕ data рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЬрд┐рд╕реЗ *рдЖрдкрдХреА API* callback рдХреЗ request body рдореЗрдВ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реА рд╣реИ, рдЖрджрд┐ред
рддреЛ, рдЕрдм рд╣рдо рд╡рд╣ code рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдЬреЛ document рдХрд░реЗрдЧрд╛ рдХрд┐ *рдЖрдкрдХреА API* рд╕реЗ callback receive рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╣ *external API* рдХреИрд╕реА рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдПред
рдпрд╣ documentation рдЖрдкрдХреА API рдореЗрдВ `/docs` рдкрд░ Swagger UI рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА, рдФрд░ рдпрд╣ external developers рдХреЛ рдмрддрд╛рдПрдЧреА рдХрд┐ *external API* рдХреИрд╕реЗ рдмрдирд╛рдиреА рд╣реИред
рдпрд╣ рдЙрджрд╛рд╣рд░рдг callback рдХреЛ рд╕реНрд╡рдпрдВ implement рдирд╣реАрдВ рдХрд░рддрд╛ (рд╡рд╣ рдХреЗрд╡рд▓ code рдХреА рдПрдХ line рд╣реЛ рд╕рдХрддреА рд╣реИ), рдХреЗрд╡рд▓ documentation рд╡рд╛рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдХрд░рддрд╛ рд╣реИред
/// tip | рд╕реБрдЭрд╛рд╡
рд╡рд╛рд╕реНрддрд╡рд┐рдХ callback рд╕рд┐рд░реНрдлрд╝ рдПрдХ HTTP request рд╣реИред
Callback рдХреЛ рд╕реНрд╡рдпрдВ implement рдХрд░рддреЗ рд╕рдордп, рдЖрдк [HTTPX](https://www.python-httpx.org) рдпрд╛ [Requests](https://requests.readthedocs.io/) рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
///
## Callback documentation code рд▓рд┐рдЦреЗрдВ { #write-the-callback-documentation-code }
рдпрд╣ code рдЖрдкрдХреА app рдореЗрдВ execute рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗрд╡рд▓ рдпрд╣ *document* рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рд╡рд╣ *external API* рдХреИрд╕реА рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдПред
рд▓реЗрдХрд┐рди, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ **FastAPI** рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА API рдХреЗ рд▓рд┐рдП automatic documentation рдЖрд╕рд╛рдиреА рд╕реЗ рдХреИрд╕реЗ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред
рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрд╕реА рдЬреНрдЮрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ document рдХрд░реЗрдВрдЧреЗ рдХрд┐ *external API* рдХреИрд╕реА рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП... рдЙрди *path operation(s)* рдХреЛ рдмрдирд╛рдХрд░ рдЬрд┐рдиреНрд╣реЗрдВ external API рдХреЛ implement рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреА API call рдХрд░реЗрдЧреА)ред
/// tip | рд╕реБрдЭрд╛рд╡
Callback рдХреЛ document рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП code рд▓рд┐рдЦрддреЗ рд╕рдордп, рдпрд╣ рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╡рд╣реА *external developer* рд╣реИрдВред рдФрд░ рдЗрд╕ рд╕рдордп рдЖрдк *external API* implement рдХрд░ рд░рд╣реЗ рд╣реИрдВ, *рдЕрдкрдиреА API* рдирд╣реАрдВред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЕрдкрдирд╛рдирд╛ (*external developer* рдХрд╛) рдЖрдкрдХреЛ рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдорд╣рд╕реВрд╕ рдХрд░рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ *external API* рдХреЗ рд▓рд┐рдП parameters, body рдХреЗ рд▓рд┐рдП Pydantic model, response рдХреЗ рд▓рд┐рдП model, рдЖрджрд┐ рдХрд╣рд╛рдБ рд░рдЦрдиреЗ рд╣реИрдВред
///
### 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 рдХреА declaration рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рдЗрд╕реЗ receive рдХрд░рдирд╛ рд╣реИ, рдЬреИрд╕реЗ `body: InvoiceEvent`ред
* рдФрд░ рдЗрд╕рдореЗрдВ рдЙрд╕ response рдХреА declaration рднреА рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╕реЗ рд▓реМрдЯрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ `response_model=InvoiceEventReceived`ред
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[14:16,19:20,26:30] *}
рд╕рд╛рдорд╛рдиреНрдп *path operation* рд╕реЗ 2 рдореБрдЦреНрдп рдЕрдВрддрд░ рд╣реИрдВ:
* рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ code рд╣реЛрдирд╛ required рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреА app рдЗрд╕ code рдХреЛ рдХрднреА call рдирд╣реАрдВ рдХрд░реЗрдЧреАред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ *external API* рдХреЛ document рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, function рдореЗрдВ рдХреЗрд╡рд▓ `pass` рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
* *path* рдореЗрдВ рдПрдХ [OpenAPI 3 expression](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.1.0.md#key-expression) (рдиреАрдЪреЗ рдФрд░ рджреЗрдЦреЗрдВ) рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдпрд╣ *рдЖрдкрдХреА API* рдХреЛ рднреЗрдЬреА рдЧрдИ original request рдХреЗ parameters рдФрд░ parts рдХреЗ рд╕рд╛рде 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* рдХреЛ рднреЗрдЬреА рдЧрдИ original request рдХреЗ parts рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ case рдореЗрдВ, рдпрд╣ `str` рд╣реИ:
```Python
"{$callback_url}/invoices/{$request.body.id}"
```
рддреЛ, рдпрджрд┐ рдЖрдкрдХрд╛ API user (external developer) *рдЖрдкрдХреА 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 рдХреЛ process рдХрд░реЗрдЧреА, рдФрд░ рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рд╕рдордп, `callback_url` (*external API*) рдХреЛ callback request рднреЗрдЬреЗрдЧреА:
```
https://www.external.org/events/invoices/2expen51ve
```
рдРрд╕реЗ JSON body рдХреЗ рд╕рд╛рде рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:
```JSON
{
"description": "Payment celebration",
"paid": true
}
```
рдФрд░ рдпрд╣ рдЙрд╕ *external API* рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ JSON body рд╡рд╛рд▓реЗ response рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдЧреА:
```JSON
{
"ok": true
}
```
/// tip | рд╕реБрдЭрд╛рд╡
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП callback URL рдореЗрдВ `callback_url` (`https://www.external.org/events`) рдореЗрдВ query parameter рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд URL рдФрд░ JSON body рдХреЗ рдЕрдВрджрд░ рд╕реЗ invoice `id` (`2expen51ve`) рджреЛрдиреЛрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
///
### Callback router рдЬреЛрдбрд╝реЗрдВ { #add-the-callback-router }
рдЗрд╕ рд╕рдордп рдЖрдкрдХреЗ рдкрд╛рд╕ рдКрдкрд░ рдмрдирд╛рдП рдЧрдП callback router рдореЗрдВ required *callback path operation(s)* рд╣реИрдВ (рд╡реЗ operation рдЬрд┐рдиреНрд╣реЗрдВ *external developer* рдХреЛ *external API* рдореЗрдВ implement рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП)ред
рдЕрдм *рдЖрдкрдХреА API рдХреЗ path operation decorator* рдореЗрдВ parameter `callbacks` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕ callback router рд╕реЗ attribute `.routes` pass рдХрд░реЗрдВ:
{* ../../docs_src/openapi_callbacks/tutorial001_py310.py hl[33] *}
/// tip | рд╕реБрдЭрд╛рд╡
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк router рд╕реНрд╡рдпрдВ (`invoices_callback_router`) рдХреЛ `callbacks=` рдореЗрдВ pass рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЙрд╕рдХреА `.routes` рдХреЛ pass рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреИрд╕реЗ `invoices_callback_router.routes`ред FastAPI рдЙрди routes рдХрд╛ рдЙрдкрдпреЛрдЧ callback OpenAPI documentation generate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдЧрд╛ред
///
### Docs рджреЗрдЦреЗрдВ { #check-the-docs }
рдЕрдм рдЖрдк рдЕрдкрдиреА app start рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдкрдХреЛ рдЕрдкрдиреА docs рдореЗрдВ рдЕрдкрдиреЗ *path operation* рдХреЗ рд▓рд┐рдП рдПрдХ "Callbacks" section рджрд┐рдЦреЗрдЧрд╛, рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ *external API* рдХреИрд╕реА рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП:
<img src="/img/tutorial/openapi-callbacks/image01.png">

55
docs/hi/docs/advanced/openapi-webhooks.md

@ -0,0 +1,55 @@
# OpenAPI Webhooks { #openapi-webhooks }
рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдк рдЕрдкрдиреЗ API **users** рдХреЛ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреА app рдХреБрдЫ data рдХреЗ рд╕рд╛рде (рдПрдХ request рднреЗрдЬрддреЗ рд╣реБрдП) *рдЙрдирдХреА* app рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреА рд╣реИ, рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ **event** рдХреА **рд╕реВрдЪрдирд╛** рджреЗрдиреЗ рдХреЗ рд▓рд┐рдПред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЗ users рджреНрд╡рд╛рд░рд╛ рдЖрдкрдХреА API рдХреЛ requests рднреЗрдЬрдиреЗ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрдЬрд╛рдп, **рдЖрдкрдХреА API** (рдпрд╛ рдЖрдкрдХреА app) **рдЙрдирдХреЗ system рдХреЛ requests рднреЗрдЬ** рд╕рдХрддреА рд╣реИ (рдЙрдирдХреА API, рдЙрдирдХреА app рдХреЛ)ред
рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдпрддрдГ **webhook** рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
## Webhooks рдХреЗ рдЪрд░рдг { #webhooks-steps }
рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдпрд╣ рд╣реЛрддреА рд╣реИ рдХрд┐ **рдЖрдк рдЕрдкрдиреЗ code рдореЗрдВ define рдХрд░рддреЗ рд╣реИрдВ** рдХрд┐ рдЖрдк рдХреМрди-рд╕рд╛ message рднреЗрдЬреЗрдВрдЧреЗ, рдпрд╛рдиреА **request рдХрд╛ body**ред
рдЖрдк рдпрд╣ рднреА рдХрд┐рд╕реА рддрд░реАрдХреЗ рд╕реЗ define рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреА app рдХрд┐рди **рдХреНрд╖рдгреЛрдВ** рдкрд░ рд╡реЗ requests рдпрд╛ events рднреЗрдЬреЗрдЧреАред
рдФрд░ **рдЖрдкрдХреЗ users** рдХрд┐рд╕реА рддрд░реАрдХреЗ рд╕реЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рдХрд┐рд╕реА web dashboard рдореЗрдВ) рд╡рд╣ **URL** define рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдкрдХреА app рдХреЛ рд╡реЗ requests рднреЗрдЬрдиреА рдЪрд╛рд╣рд┐рдПред
Webhooks рдХреЗ рд▓рд┐рдП URLs рдХреЛ register рдХрд░рдиреЗ рдХреА рд╕рд╛рд░реА **logic** рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрди requests рдХреЛ рднреЗрдЬрдиреЗ рдХрд╛ code рдЖрдкрдХреЗ рдКрдкрд░ рд╣реИред рдЖрдк рдЗрд╕реЗ **рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ code** рдореЗрдВ рдЬреИрд╕реЗ рдЪрд╛рд╣реЗрдВ рд╡реИрд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
## **FastAPI** рдФрд░ OpenAPI рдХреЗ рд╕рд╛рде webhooks рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг { #documenting-webhooks-with-fastapi-and-openapi }
**FastAPI** рдХреЗ рд╕рд╛рде, OpenAPI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдЗрди webhooks рдХреЗ рдирд╛рдо, рдЖрдкрдХреА app рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ HTTP operations рдХреЗ рдкреНрд░рдХрд╛рд░ (рдЬреИрд╕реЗ `POST`, `PUT`, рдЖрджрд┐) рдФрд░ рдЖрдкрдХреА app рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ request **bodies** define рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ users рдХреЗ рд▓рд┐рдП рдЖрдкрдХреА **webhook** requests рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **рдЕрдкрдиреА APIs implement рдХрд░рдирд╛** рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╡реЗ рд╢рд╛рдпрдж рдЕрдкрдиреЗ рдХреБрдЫ API code рдХреЛ autogenerate рднреА рдХрд░ рд╕рдХреЗрдВред
/// note | рдиреЛрдЯ
Webhooks OpenAPI 3.1.0 рдФрд░ рдЙрд╕рд╕реЗ рдКрдкрд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдФрд░ FastAPI `0.99.0` рдФрд░ рдЙрд╕рд╕реЗ рдКрдкрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред
///
## Webhooks рд╡рд╛рд▓реА app { #an-app-with-webhooks }
рдЬрдм рдЖрдк рдПрдХ **FastAPI** application рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ `webhooks` attribute рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк *webhooks* define рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рдЖрдк *path operations* define рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП `@app.webhooks.post()` рдХреЗ рд╕рд╛рдеред
{* ../../docs_src/openapi_webhooks/tutorial001_py310.py hl[9:12,15:20] *}
рдЖрдк рдЬрд┐рди webhooks рдХреЛ define рдХрд░рддреЗ рд╣реИрдВ рд╡реЗ **OpenAPI** schema рдФрд░ automatic **docs UI** рдореЗрдВ рдЖ рдЬрд╛рдПрдБрдЧреЗред
/// note | рдиреЛрдЯ
`app.webhooks` object рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рд░реНрдлрд╝ рдПрдХ `APIRouter` рд╣реИ, рд╡рд╣реА type рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рдЕрдкрдиреА app рдХреЛ multiple files рдХреЗ рд╕рд╛рде structure рдХрд░рддреЗ рд╕рдордп рдХрд░реЗрдВрдЧреЗред
///
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ webhooks рдХреЗ рд╕рд╛рде рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ *path* declare рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЬреИрд╕реЗ `/items/`), рд╡рд╣рд╛рдБ рдЖрдк рдЬреЛ text pass рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдХреЗрд╡рд▓ webhook рдХрд╛ рдПрдХ **identifier** рд╣реИ (event рдХрд╛ рдирд╛рдо), рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП `@app.webhooks.post("new-subscription")` рдореЗрдВ, webhook рдХрд╛ рдирд╛рдо `new-subscription` рд╣реИред
рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдореНрдореАрдж рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ **рдЖрдкрдХреЗ users** рдЙрд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ **URL path** рдХреЛ рдХрд┐рд╕реА рдФрд░ рддрд░реАрдХреЗ рд╕реЗ define рдХрд░реЗрдВрдЧреЗ рдЬрд╣рд╛рдБ рд╡реЗ webhook request рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдХреЛрдИ web dashboard)ред
### Docs рджреЗрдЦреЗрдВ { #check-the-docs }
рдЕрдм рдЖрдк рдЕрдкрдиреА app start рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЖрдкрдХреЗ docs рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп *path operations* рд╣реИрдВ рдФрд░ рдЕрдм рдХреБрдЫ **webhooks** рднреА рд╣реИрдВ:
<img src="/img/tutorial/openapi-webhooks/image01.png">

166
docs/hi/docs/advanced/path-operation-advanced-configuration.md

@ -0,0 +1,166 @@
# Path Operation рдХреА рдЙрдиреНрдирдд Configuration { #path-operation-advanced-configuration }
## OpenAPI operationId { #openapi-operationid }
/// warning | рдЪреЗрддрд╛рд╡рдиреА
рдЕрдЧрд░ рдЖрдк OpenAPI рдореЗрдВ "expert" рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред
///
рдЖрдк рдЕрдкрдиреЗ *path operation* рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ OpenAPI `operationId` рдХреЛ parameter `operation_id` рдХреЗ рд╕рд╛рде рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ operation рдХреЗ рд▓рд┐рдП unique рд╣реЛред
{* ../../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`s рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк `FastAPI` рдХреЛ рдПрдХ custom `generate_unique_id_function` рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ function рдкреНрд░рддреНрдпреЗрдХ `APIRoute` рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ path operation рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ `operationId` return рдХрд░рддрд╛ рд╣реИред
{* ../../docs_src/path_operation_advanced_configuration/tutorial002_py310.py hl[2,5:6,9] *}
/// warning | рдЪреЗрддрд╛рд╡рдиреА
рдЕрдЧрд░ рдЖрдк рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдкрдХреЗ рдкреНрд░рддреНрдпреЗрдХ *path operation functions* рдХрд╛ рдирд╛рдо unique рд╣реЛред
рднрд▓реЗ рд╣реА рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ modules (Python files) рдореЗрдВ рд╣реЛрдВред
///
## OpenAPI рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрдирд╛ { #exclude-from-openapi }
рдХрд┐рд╕реА *path operation* рдХреЛ generated OpenAPI schema рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП (рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░, automatic documentation systems рд╕реЗ рднреА), parameter `include_in_schema` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ `False` рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ:
{* ../../docs_src/path_operation_advanced_configuration/tutorial003_py310.py hl[6] *}
## Docstring рд╕реЗ рдЙрдиреНрдирдд description { #advanced-description-from-docstring }
рдЖрдк OpenAPI рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА *path operation function* рдХреА docstring рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА lines рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ `\f` (рдПрдХ escaped "form feed" character) рдЬреЛрдбрд╝рдиреЗ рд╕реЗ **FastAPI** рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ OpenAPI рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ output рдХреЛ truncate рдХрд░ рджреЗрддрд╛ рд╣реИред
рдпрд╣ documentation рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдиреНрдп tools (рдЬреИрд╕реЗ Sphinx) рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВрдЧреЗред
{* ../../docs_src/path_operation_advanced_configuration/tutorial004_py310.py hl[17:27] *}
## рдЕрддрд┐рд░рд┐рдХреНрдд Responses { #additional-responses }
рдЖрдкрдиреЗ рд╢рд╛рдпрдж рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд┐рд╕реА *path operation* рдХреЗ рд▓рд┐рдП `response_model` рдФрд░ `status_code` рдХреИрд╕реЗ declare рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдпрд╣ рдХрд┐рд╕реА *path operation* рдХреЗ рдореБрдЦреНрдп response рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ metadata define рдХрд░рддрд╛ рд╣реИред
рдЖрдк рдЙрдирдХреЗ models, status codes рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд responses рднреА declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ documentation рдореЗрдВ рдпрд╣рд╛рдБ рдПрдХ рдкреВрд░рд╛ chapter рд╣реИ, рдЖрдк рдЗрд╕реЗ [OpenAPI рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд Responses](additional-responses.md) рдкрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
## OpenAPI Extra { #openapi-extra }
рдЬрдм рдЖрдк рдЕрдкрдиреЗ application рдореЗрдВ рдХреЛрдИ *path operation* declare рдХрд░рддреЗ рд╣реИрдВ, рддреЛ **FastAPI** рдЙрд╕ *path operation* рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ relevant metadata рдХреЛ automatically generate рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ OpenAPI schema рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
/// note | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
OpenAPI specification рдореЗрдВ рдЗрд╕реЗ [Operation Object](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#operation-object) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
///
рдЗрд╕рдореЗрдВ *path operation* рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ automatic documentation generate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рдореЗрдВ `tags`, `parameters`, `requestBody`, `responses` рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред
рдпрд╣ *path operation*-specific OpenAPI schema рд╕рд╛рдорд╛рдиреНрдпрддрдГ **FastAPI** рджреНрд╡рд╛рд░рд╛ automatically generate рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ extend рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
/// tip | рд╕реБрдЭрд╛рд╡
рдпрд╣ рдПрдХ low level extension point рд╣реИред
рдЕрдЧрд░ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЕрддрд┐рд░рд┐рдХреНрдд responses declare рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рддреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ [OpenAPI рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд Responses](additional-responses.md) рдХреЗ рд╕рд╛рде рд╣реИред
///
рдЖрдк parameter `openapi_extra` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА *path operation* рдХреЗ рд▓рд┐рдП OpenAPI schema рдХреЛ extend рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
### OpenAPI Extensions { #openapi-extensions }
рдпрд╣ `openapi_extra` рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, [OpenAPI Extensions](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions) declare рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
{* ../../docs_src/path_operation_advanced_configuration/tutorial005_py310.py hl[6] *}
рдЕрдЧрд░ рдЖрдк automatic API docs рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХрд╛ extension specific *path operation* рдХреЗ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред
<img src="/img/tutorial/path-operation-advanced-configuration/image01.png">
рдФрд░ рдЕрдЧрд░ рдЖрдк resulting OpenAPI (рдЖрдкрдХреА API рдореЗрдВ `/openapi.json` рдкрд░) рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЕрдкрдирд╛ extension specific *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"
}
}
}
}
```
### Custom OpenAPI *path operation* schema { #custom-openapi-path-operation-schema }
`openapi_extra` рдореЗрдВ рдореМрдЬреВрдж dictionary рдХреЛ *path operation* рдХреЗ рд▓рд┐рдП automatically generated OpenAPI schema рдХреЗ рд╕рд╛рде deeply merge рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рддреЛ, рдЖрдк automatically generated schema рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд data рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк FastAPI рдХреА Pydantic рдХреЗ рд╕рд╛рде automatic features рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛, рдЕрдкрдиреЗ code рд╕реЗ request рдХреЛ read рдФрд░ validate рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЖрдк OpenAPI schema рдореЗрдВ request рдХреЛ define рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк рдпрд╣ `openapi_extra` рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/path_operation_advanced_configuration/tutorial006_py310.py hl[19:36, 39:40] *}
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдХреЛрдИ Pydantic model declare рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, request body рдХреЛ JSON рдХреЗ рд░реВрдк рдореЗрдВ <dfn title="рдХрд┐рд╕реА plain format, рдЬреИрд╕реЗ bytes, рд╕реЗ Python objects рдореЗрдВ рдмрджрд▓рд╛ рдЧрдпрд╛">parsed</dfn> рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕реЗ рд╕реАрдзреЗ `bytes` рдХреЗ рд░реВрдк рдореЗрдВ read рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ function `magic_data_reader()` рдХрд┐рд╕реА рддрд░реАрдХреЗ рд╕реЗ рдЗрд╕реЗ parse рдХрд░рдиреЗ рдХрд╛ рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ред
рдлрд┐рд░ рднреА, рд╣рдо request body рдХреЗ рд▓рд┐рдП expected schema declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
### Custom OpenAPI content type { #custom-openapi-content-type }
рдЗрд╕реА trick рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк JSON Schema define рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Pydantic model рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдлрд┐рд░ *path operation* рдХреЗ рд▓рд┐рдП custom OpenAPI schema section рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдФрд░ рдЖрдк рдРрд╕рд╛ рддрдм рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм request рдореЗрдВ data type JSON рди рд╣реЛред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ application рдореЗрдВ рд╣рдо Pydantic models рд╕реЗ JSON Schema рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП FastAPI рдХреА integrated functionality рдпрд╛ JSON рдХреЗ рд▓рд┐рдП automatic validation рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо request content type рдХреЛ JSON рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ YAML рдХреЗ рд░реВрдк рдореЗрдВ declare рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
{* ../../docs_src/path_operation_advanced_configuration/tutorial007_py310.py hl[15:20, 22] *}
рдлрд┐рд░ рднреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо default integrated functionality рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рдЕрднреА рднреА рдЙрд╕ data рдХреЗ рд▓рд┐рдП JSON Schema manually generate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Pydantic model рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо YAML рдореЗрдВ receive рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдлрд┐рд░ рд╣рдо request рдХреЛ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ body рдХреЛ `bytes` рдХреЗ рд░реВрдк рдореЗрдВ extract рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ FastAPI request payload рдХреЛ JSON рдХреЗ рд░реВрдк рдореЗрдВ parse рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рднреА рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдФрд░ рдлрд┐рд░ рдЕрдкрдиреЗ code рдореЗрдВ, рд╣рдо рдЙрд╕ YAML content рдХреЛ рд╕реАрдзреЗ parse рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╣рдо YAML content рдХреЛ validate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдЙрд╕реА Pydantic model рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
{* ../../docs_src/path_operation_advanced_configuration/tutorial007_py310.py hl[24:31] *}
/// tip | рд╕реБрдЭрд╛рд╡
рдпрд╣рд╛рдБ рд╣рдо рдЙрд╕реА Pydantic model рдХреЛ reuse рдХрд░рддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЗрд╕реА рддрд░рд╣, рд╣рдо рдЗрд╕реЗ рдХрд┐рд╕реА рдФрд░ рддрд░реАрдХреЗ рд╕реЗ рднреА validate рдХрд░ рд╕рдХрддреЗ рдереЗред
///

31
docs/hi/docs/advanced/response-change-status-code.md

@ -0,0 +1,31 @@
# Response - Status Code рдмрджрд▓реЗрдВ { #response-change-status-code }
рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рдкрдврд╝рд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдПрдХ default [Response Status Code](../tutorial/response-status-code.md) рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдкрдХреЛ default рд╕реЗ рдЕрд▓рдЧ status code рд▓реМрдЯрд╛рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред
## рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ { #use-case }
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк default рд░реВрдк рд╕реЗ "OK" `200` рдХрд╛ HTTP status code рд▓реМрдЯрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ data рдореМрдЬреВрдж рдирд╣реАрдВ рдерд╛, рддреЛ рдЖрдк рдЙрд╕реЗ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ "CREATED" `201` рдХрд╛ HTTP status code рд▓реМрдЯрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЖрдк `response_model` рдХреЗ рд╕рд╛рде рд▓реМрдЯрд╛рдП рдЧрдП data рдХреЛ filter рдФрд░ convert рдХрд░ рдкрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд░рд╣рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк `Response` parameter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
## `Response` parameter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ { #use-a-response-parameter }
рдЖрдк рдЕрдкрдиреА *path operation function* рдореЗрдВ `Response` type рдХрд╛ parameter рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк cookies рдФрд░ headers рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред
рдФрд░ рдлрд┐рд░ рдЖрдк рдЙрд╕ *temporary* response object рдореЗрдВ `status_code` рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
{* ../../docs_src/response_change_status_code/tutorial001_py310.py hl[1,9,12] *}
рдФрд░ рдлрд┐рд░ рдЖрдк рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХрд╛ рдХреЛрдИ рднреА object рд▓реМрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ (рдПрдХ `dict`, рдПрдХ database model, рдЖрджрд┐)ред
рдФрд░ рдЕрдЧрд░ рдЖрдкрдиреЗ `response_model` рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрдкрдХреЗ рд▓реМрдЯрд╛рдП рдЧрдП object рдХреЛ filter рдФрд░ convert рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
**FastAPI** рдЙрд╕ *temporary* response рдХрд╛ рдЙрдкрдпреЛрдЧ status code (рд╕рд╛рде рд╣реА cookies рдФрд░ headers) рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдЧрд╛, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдВрддрд┐рдо response рдореЗрдВ рдбрд╛рд▓ рджреЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ value рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА `response_model` рджреНрд╡рд╛рд░рд╛ filter рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛрдЧрд╛ред
рдЖрдк dependencies рдореЗрдВ рднреА `Response` parameter рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ status code рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЖрдЦрд╝рд┐рд░реА рдмрд╛рд░ рдЬреЛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╡рд╣реА рдкреНрд░рднрд╛рд╡реА рд╣реЛрдЧрд╛ред

51
docs/hi/docs/advanced/response-cookies.md

@ -0,0 +1,51 @@
# Response Cookies { #response-cookies }
## `Response` parameter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ { #use-a-response-parameter }
рдЖрдк рдЕрдкрдиреЗ *path operation function* рдореЗрдВ `Response` рдкреНрд░рдХрд╛рд░ рдХрд╛ parameter рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рдлрд┐рд░ рдЖрдк рдЙрд╕ *temporary* response object рдореЗрдВ cookies set рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
{* ../../docs_src/response_cookies/tutorial002_py310.py hl[1, 8:9] *}
рдФрд░ рдлрд┐рд░ рдЖрдк рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХрд╛ рдХреЛрдИ рднреА object return рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ (рдПрдХ `dict`, database model, рдЖрджрд┐)ред
рдФрд░ рдЕрдЧрд░ рдЖрдкрдиреЗ `response_model` рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ return рдХрд┐рдП рдЧрдП object рдХреЛ filter рдФрд░ convert рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕рдХрд╛ рдЕрднреА рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
**FastAPI** рдЙрд╕ *temporary* response рдХрд╛ рдЙрдкрдпреЛрдЧ cookies (рд╕рд╛рде рд╣реА headers рдФрд░ status code) рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдЧрд╛, рдФрд░ рдЙрдиреНрд╣реЗрдВ final response рдореЗрдВ рдбрд╛рд▓ рджреЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ return рдХрд┐рдпрд╛ рдЧрдпрд╛ value рд╣реЛрдЧрд╛, рдХрд┐рд╕реА рднреА `response_model` рджреНрд╡рд╛рд░рд╛ filter рдХрд┐рдпрд╛ рд╣реБрдЖред
рдЖрдк dependencies рдореЗрдВ рднреА `Response` parameter рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ cookies (рдФрд░ headers) set рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
## рд╕реАрдзреЗ `Response` return рдХрд░реЗрдВ { #return-a-response-directly }
рдЖрдк рдЕрдкрдиреЗ code рдореЗрдВ рд╕реАрдзреЗ `Response` return рдХрд░рддреЗ рд╕рдордп рднреА cookies рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк [рд╕реАрдзреЗ Response Return рдХрд░реЗрдВ](response-directly.md) рдореЗрдВ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ рдПрдХ response рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдлрд┐рд░ рдЙрд╕рдореЗрдВ Cookies set рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ return рдХрд░реЗрдВ:
{* ../../docs_src/response_cookies/tutorial001_py310.py hl[10:12] *}
/// tip | рд╕реБрдЭрд╛рд╡
рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЕрдЧрд░ рдЖрдк `Response` parameter рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕реАрдзреЗ response return рдХрд░рддреЗ рд╣реИрдВ, рддреЛ FastAPI рдЙрд╕реЗ рд╕реАрдзреЗ return рдХрд░реЗрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдкрдХрд╛ data рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рдЖрдк `JSONResponse` return рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╡рд╣ JSON рдХреЗ рд╕рд╛рде compatible рд╣реЛред
рдФрд░ рдпрд╣ рднреА рдХрд┐ рдЖрдк рдХреЛрдИ рдРрд╕рд╛ data рдирд╣реАрдВ рднреЗрдЬ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕реЗ `response_model` рджреНрд╡рд╛рд░рд╛ filter рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред
///
### рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА { #more-info }
/// note | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
рдЖрдк `from starlette.responses import Response` рдпрд╛ `from starlette.responses import JSONResponse` рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
**FastAPI** рдЖрдкрдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, developer рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд╣реА `starlette.responses` `fastapi.responses` рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрдкрд▓рдмреНрдз рдЕрдзрд┐рдХрд╛рдВрд╢ responses рд╕реАрдзреЗ Starlette рд╕реЗ рдЖрддреЗ рд╣реИрдВред
рдФрд░ рдХреНрдпреЛрдВрдХрд┐ `Response` рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ headers рдФрд░ cookies set рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, **FastAPI** рдЗрд╕реЗ `fastapi.Response` рдкрд░ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
///
рд╕рднреА рдЙрдкрд▓рдмреНрдз parameters рдФрд░ options рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, [Starlette рдореЗрдВ documentation](https://www.starlette.dev/responses/#set-cookie) рджреЗрдЦреЗрдВред

83
docs/hi/docs/advanced/response-directly.md

@ -0,0 +1,83 @@
# рд╕реАрдзреЗ рдПрдХ Response рд▓реМрдЯрд╛рдПрдБ { #return-a-response-directly }
рдЬрдм рдЖрдк **FastAPI** *path operation* рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЖрдк рдЙрд╕рд╕реЗ рдХреЛрдИ рднреА data рд▓реМрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ `dict`, рдПрдХ `list`, рдПрдХ Pydantic model, рдПрдХ database model, рдЖрджрд┐ред
рдЕрдЧрд░ рдЖрдк [Response Model](../tutorial/response-model.md) declare рдХрд░рддреЗ рд╣реИрдВ, рддреЛ FastAPI Pydantic рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ data рдХреЛ JSON рдореЗрдВ serialize рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
рдЕрдЧрд░ рдЖрдк response model declare рдирд╣реАрдВ рдХрд░рддреЗ, рддреЛ FastAPI [JSON Compatible Encoder](../tutorial/encoder.md) рдореЗрдВ рд╕рдордЭрд╛рдП рдЧрдП `jsonable_encoder` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрд╕реЗ рдПрдХ `JSONResponse` рдореЗрдВ рд░рдЦреЗрдЧрд╛ред
рдЖрдк рд╕реАрдзреЗ рдПрдХ `JSONResponse` рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕реЗ рд▓реМрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред
/// tip | рд╕реБрдЭрд╛рд╡
рдЖрдо рддреМрд░ рдкрд░ рд╕реАрдзреЗ `JSONResponse` рд▓реМрдЯрд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ [Response Model](../tutorial/response-model.md) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ performance рдХрд╛рдлреА рдмреЗрд╣рддрд░ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ рддрд░реАрдХреЗ рд╕реЗ рдпрд╣ Rust рдореЗрдВ Pydantic рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ data serialize рдХрд░рддрд╛ рд╣реИред
///
## рдПрдХ `Response` рд▓реМрдЯрд╛рдПрдБ { #return-a-response }
рдЖрдк рдПрдХ `Response` рдпрд╛ рдЙрд╕рдХреА рдХреЛрдИ рднреА sub-class рд▓реМрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред
/// note | рдиреЛрдЯ
`JSONResponse` рдЦреБрдж `Response` рдХреА рдПрдХ sub-class рд╣реИред
///
рдФрд░ рдЬрдм рдЖрдк рдПрдХ `Response` рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ **FastAPI** рдЙрд╕реЗ рд╕реАрдзреЗ pass рдХрд░ рджреЗрдЧрд╛ред
рдпрд╣ Pydantic models рдХреЗ рд╕рд╛рде рдХреЛрдИ data conversion рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, contents рдХреЛ рдХрд┐рд╕реА рднреА type рдореЗрдВ convert рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЖрджрд┐ред
рдпрд╣ рдЖрдкрдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ **flexibility** рджреЗрддрд╛ рд╣реИред рдЖрдк рдХреЛрдИ рднреА data type рд▓реМрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рднреА data declaration рдпрд╛ validation рдХреЛ override рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрджрд┐ред
рдпрд╣ рдЖрдкрдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ **responsibility** рднреА рджреЗрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЬреЛ data рд▓реМрдЯрд╛ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╕рд╣реА рд╣реИ, рд╕рд╣реА format рдореЗрдВ рд╣реИ, рд╡рд╣ serialize рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрджрд┐ред
## `Response` рдореЗрдВ `jsonable_encoder` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ { #using-the-jsonable-encoder-in-a-response }
рдХреНрдпреЛрдВрдХрд┐ **FastAPI** рдЖрдкрдХреЗ рд▓реМрдЯрд╛рдП рдЧрдП `Response` рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рдХрд░рддрд╛, рдЖрдкрдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЙрд╕рдХреЗ contents рдЗрд╕рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрд┐рд╕реА Pydantic model рдХреЛ рдкрд╣рд▓реЗ `dict` рдореЗрдВ convert рдХрд┐рдП рдмрд┐рдирд╛ `JSONResponse` рдореЗрдВ рдирд╣реАрдВ рд░рдЦ рд╕рдХрддреЗ, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА data types (рдЬреИрд╕реЗ `datetime`, `UUID`, рдЖрджрд┐) JSON-compatible types рдореЗрдВ convert рдХрд┐рдП рдЧрдП рд╣реЛрдВред
рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, response рдХреЛ pass рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдк рдЕрдкрдиреЗ data рдХреЛ convert рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `jsonable_encoder` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/response_directly/tutorial001_py310.py hl[5:6,20:21] *}
/// note | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
рдЖрдк `from starlette.responses import JSONResponse` рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
**FastAPI** рдЖрдкрдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, developer рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд╣реА `starlette.responses` `fastapi.responses` рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрдкрд▓рдмреНрдз рдЕрдзрд┐рдХрд╛рдВрд╢ responses рд╕реАрдзреЗ Starlette рд╕реЗ рдЖрддреЗ рд╣реИрдВред
///
## custom `Response` рд▓реМрдЯрд╛рдирд╛ { #returning-a-custom-response }
рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рд╡реЗ рд╕рднреА рд╣рд┐рд╕реНрд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдЬрд┐рдирдХреА рдЖрдкрдХреЛ рдЬрд░реВрд░рдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╕реАрдзреЗ `item` рд▓реМрдЯрд╛ рд╕рдХрддреЗ рдереЗ, рдФрд░ **FastAPI** рдЙрд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП `JSONResponse` рдореЗрдВ рд░рдЦ рджреЗрддрд╛, рдЙрд╕реЗ `dict` рдореЗрдВ convert рдХрд░рддрд╛, рдЖрджрд┐ред рдпрд╣ рд╕рдм default рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИред
рдЕрдм, рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ custom response рд▓реМрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк рдПрдХ [XML](https://en.wikipedia.org/wiki/XML) response рд▓реМрдЯрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЖрдк рдЕрдкрдирд╛ XML content рдПрдХ 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) declare рдХрд░рддреЗ рд╣реИрдВ, рддреЛ **FastAPI** Pydantic рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ data рдХреЛ JSON рдореЗрдВ serialize рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *}
рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ Rust side рдкрд░ рд╣реЛрдЧрд╛, performance regular Python рдФрд░ `JSONResponse` class рдХреЗ рд╕рд╛рде рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдмреЗрд╣рддрд░ рд╣реЛрдЧреАред
`response_model` рдпрд╛ return type рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, FastAPI data рдХреЛ convert рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `jsonable_encoder` рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ (рдЬреЛ рдзреАрдорд╛ рд╣реЛрддрд╛), рдФрд░ рди рд╣реА `JSONResponse` class рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдпрд╣ response model (рдпрд╛ return type) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Pydantic рдХреЗ рд╕рд╛рде generate рдХрд┐рдП рдЧрдП JSON bytes рд▓реЗрддрд╛ рд╣реИ рдФрд░ JSON рдХреЗ рд▓рд┐рдП рд╕рд╣реА media type (`application/json`) рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдПрдХ `Response` рд▓реМрдЯрд╛рддрд╛ рд╣реИред
## рдиреЛрдЯреНрд╕ { #notes }
рдЬрдм рдЖрдк рд╕реАрдзреЗ рдПрдХ `Response` рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕рдХрд╛ data рдЕрдкрдиреЗ-рдЖрдк validate, convert (serialize), рдпрд╛ document рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ред
рд▓реЗрдХрд┐рди рдЖрдк рдлрд┐рд░ рднреА рдЙрд╕реЗ [OpenAPI рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд Responses](additional-responses.md) рдореЗрдВ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ document рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдмрд╛рдж рдХреЗ sections рдореЗрдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ automatic data conversion, documentation, рдЖрджрд┐ рд░рдЦрддреЗ рд╣реБрдП рдЗрди custom `Response`s рдХрд╛ рдЙрдкрдпреЛрдЧ/declare рдХреИрд╕реЗ рдХрд░реЗрдВред

41
docs/hi/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 object рдореЗрдВ headers рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
{* ../../docs_src/response_headers/tutorial002_py310.py hl[1, 7:8] *}
рдФрд░ рдлрд┐рд░ рдЖрдк рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХрд╛ рдХреЛрдИ рднреА object return рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ (рдПрдХ `dict`, database model, рдЖрджрд┐)ред
рдФрд░ рдЕрдЧрд░ рдЖрдкрдиреЗ `response_model` рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЕрдм рднреА рдЖрдкрдХреЗ return рдХрд┐рдП рдЧрдП object рдХреЛ filter рдФрд░ convert рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
**FastAPI** headers (рд╕рд╛рде рд╣реА cookies рдФрд░ status code) рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ *рдЕрд╕реНрдерд╛рдпреА* response рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдВрддрд┐рдо response рдореЗрдВ рдбрд╛рд▓ рджреЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ return рдХрд┐рдпрд╛ рдЧрдпрд╛ value рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рднреА `response_model` рджреНрд╡рд╛рд░рд╛ filter рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛрддрд╛ рд╣реИред
рдЖрдк dependencies рдореЗрдВ рднреА `Response` parameter рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ headers (рдФрд░ cookies) рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
## рд╕реАрдзреЗ `Response` return рдХрд░реЗрдВ { #return-a-response-directly }
рдЬрдм рдЖрдк рд╕реАрдзреЗ `Response` return рдХрд░рддреЗ рд╣реИрдВ, рддрдм рднреА рдЖрдк headers рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
[рд╕реАрдзреЗ Response Return рдХрд░реЗрдВ](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** рдЖрдкрдХреА, developer рдХреА, рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╡рд╣реА `starlette.responses` `fastapi.responses` рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрдкрд▓рдмреНрдз рдЕрдзрд┐рдХрд╛рдВрд╢ responses рд╕реАрдзреЗ Starlette рд╕реЗ рдЖрддреЗ рд╣реИрдВред
рдФрд░ рдХреНрдпреЛрдВрдХрд┐ `Response` рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ headers рдФрд░ cookies рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, **FastAPI** рдЗрд╕реЗ `fastapi.Response` рдкрд░ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
///
## Custom Headers { #custom-headers }
рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ 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)](../tutorial/cors.md) рдореЗрдВ рдФрд░ рдкрдврд╝реЗрдВ), рдЗрд╕рдХреЗ рд▓рд┐рдП [Starlette рдХреЗ CORS docs](https://www.starlette.dev/middleware/#corsmiddleware) рдореЗрдВ documented parameter `expose_headers` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

107
docs/hi/docs/advanced/security/http-basic-auth.md

@ -0,0 +1,107 @@
# HTTP Basic Auth { #http-basic-auth }
рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк HTTP Basic Auth рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
HTTP Basic Auth рдореЗрдВ, application рдПрдХ header рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ username рдФрд░ password рд╣реЛрддрд╛ рд╣реИред
рдЕрдЧрд░ рдЙрд╕реЗ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓рддрд╛, рддреЛ рдпрд╣ HTTP 401 "Unauthorized" error рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдФрд░ `WWW-Authenticate` header рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ value `Basic` рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдПрдХ optional `realm` parameter рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ browser рдХреЛ username рдФрд░ password рдХреЗ рд▓рд┐рдП integrated prompt рджрд┐рдЦрд╛рдиреЗ рдХреЛ рдХрд╣рддрд╛ рд╣реИред
рдлрд┐рд░, рдЬрдм рдЖрдк рд╡рд╣ username рдФрд░ password рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ, рддреЛ browser рдЙрдиреНрд╣реЗрдВ header рдореЗрдВ рдЕрдкрдиреЗ-рдЖрдк рднреЗрдЬ рджреЗрддрд╛ рд╣реИред
## Simple HTTP Basic Auth { #simple-http-basic-auth }
* `HTTPBasic` рдФрд░ `HTTPBasicCredentials` import рдХрд░реЗрдВред
* `HTTPBasic` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ "`security` scheme" рдмрдирд╛рдПрдБред
* рдЕрдкрдиреЗ *path operation* рдореЗрдВ dependency рдХреЗ рд╕рд╛рде рдЙрд╕ `security` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
* рдпрд╣ `HTTPBasicCredentials` type рдХрд╛ рдПрдХ object рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
* рдЗрд╕рдореЗрдВ рднреЗрдЬреЗ рдЧрдП `username` рдФрд░ `password` рд╣реЛрддреЗ рд╣реИрдВред
{* ../../docs_src/security/tutorial006_an_py310.py hl[4,8,12] *}
рдЬрдм рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ URL рдЦреЛрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╛ docs рдореЗрдВ "Execute" button рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ), рддреЛ browser рдЖрдкрд╕реЗ рдЖрдкрдХрд╛ username рдФрд░ password рдкреВрдЫреЗрдЧрд╛:
<img src="/img/tutorial/security/image12.png">
## Username рдЬрд╛рдБрдЪреЗрдВ { #check-the-username }
рдпрд╣рд╛рдБ рдПрдХ рдЕрдзрд┐рдХ complete example рд╣реИред
рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП dependency рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдХрд┐ username рдФрд░ password рд╕рд╣реА рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред
рдЗрд╕рдХреЗ рд▓рд┐рдП, username рдФрд░ password рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП Python standard module [`secrets`](https://docs.python.org/3/library/secrets.html) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
`secrets.compare_digest()` рдХреЛ `bytes` рдпрд╛ рдРрд╕рд╛ `str` рд▓реЗрдирд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ ASCII characters (English рд╡рд╛рд▓реЗ) рд╣реЛрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ `├б` рдЬреИрд╕реЗ characters рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЬреИрд╕реЗ `Sebasti├бn` рдореЗрдВред
рдЗрд╕реЗ handle рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ `username` рдФрд░ `password` рдХреЛ UTF-8 рд╕реЗ encode рдХрд░рдХреЗ `bytes` рдореЗрдВ convert рдХрд░рддреЗ рд╣реИрдВред
рдлрд┐рд░ рд╣рдо `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"):
# рдХреЛрдИ error рд▓реМрдЯрд╛рдПрдБ
...
```
рд▓реЗрдХрд┐рди `secrets.compare_digest()` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдпрд╣ "timing attacks" рдирд╛рдо рдХреЗ attacks рдХреЗ рдПрдХ type рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╕реБрд░рдХреНрд╖рд┐рдд рд░рд╣реЗрдЧрд╛ред
### Timing Attacks { #timing-attacks }
рд▓реЗрдХрд┐рди "timing attack" рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?
рдорд╛рди рд▓реАрдЬрд┐рдП рдХреБрдЫ attackers username рдФрд░ password рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдФрд░ рд╡реЗ username `johndoe` рдФрд░ password `love123` рдХреЗ рд╕рд╛рде рдПрдХ request рднреЗрдЬрддреЗ рд╣реИрдВред
рддрдм рдЖрдкрдХреА application рдореЗрдВ Python code рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛:
```Python
if "johndoe" == "stanleyjobson" and "love123" == "swordfish":
...
```
рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА Python `johndoe` рдореЗрдВ рдкрд╣рд▓реЗ `j` рдХреА рддреБрд▓рдирд╛ `stanleyjobson` рдореЗрдВ рдкрд╣рд▓реЗ `s` рд╕реЗ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ `False` рд▓реМрдЯрд╛ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рджреЛрдиреЛрдВ strings рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВ, рдпрд╣ рд╕реЛрдЪрддреЗ рд╣реБрдП рдХрд┐ "рдмрд╛рдХреА рдЕрдХреНрд╖рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдХреЗ рдФрд░ computation рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ"ред рдФрд░ рдЖрдкрдХреА application рдХрд╣реЗрдЧреА "Incorrect username or password"ред
рд▓реЗрдХрд┐рди рдлрд┐рд░ attackers username `stanleyjobsox` рдФрд░ password `love123` рдХреЗ рд╕рд╛рде рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред
рдФрд░ рдЖрдкрдХрд╛ application code рдХреБрдЫ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ:
```Python
if "stanleyjobsox" == "stanleyjobson" and "love123" == "swordfish":
...
```
Python рдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рджреЛрдиреЛрдВ strings рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВ, `stanleyjobsox` рдФрд░ `stanleyjobson` рджреЛрдиреЛрдВ рдореЗрдВ рдкреВрд░реЗ `stanleyjobso` рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреА рдкрдбрд╝реЗрдЧреАред рдЗрд╕рд▓рд┐рдП "Incorrect username or password" рдХрд╛ reply рд╡рд╛рдкрд╕ рджреЗрдиреЗ рдореЗрдВ рдХреБрдЫ extra microseconds рд▓рдЧреЗрдВрдЧреЗред
#### рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рд▓рдЧрд╛ рд╕рдордп attackers рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ { #the-time-to-answer-helps-the-attackers }
рдЙрд╕ рд╕рдордп, рдпрд╣ рджреЗрдЦрдХрд░ рдХрд┐ server рдиреЗ "Incorrect username or password" response рднреЗрдЬрдиреЗ рдореЗрдВ рдХреБрдЫ microseconds рдЬреНрдпрд╛рджрд╛ рд▓рд┐рдП, attackers рдЬрд╛рди рдЬрд╛рдПрдБрдЧреЗ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ _рдХреБрдЫ_ рд╕рд╣реА рдкрд╛рдпрд╛ рд╣реИ, рд╢реБрд░реБрдЖрддреА рдЕрдХреНрд╖рд░реЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рд╕рд╣реА рдереЗред
рдФрд░ рдлрд┐рд░ рд╡реЗ рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдлрд┐рд░ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж `johndoe` рдХреА рддреБрд▓рдирд╛ рдореЗрдВ `stanleyjobsox` рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рд╣реИред
#### рдПрдХ "professional" attack { #a-professional-attack }
рдмреЗрд╢рдХ, attackers рдпрд╣ рд╕рдм рд╣рд╛рде рд╕реЗ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд╡реЗ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ program рд▓рд┐рдЦреЗрдВрдЧреЗ, рд╕рдВрднрд╡рддрдГ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд╣рдЬрд╛рд░реЛрдВ рдпрд╛ рд▓рд╛рдЦреЛрдВ tests рдХреЗ рд╕рд╛рдеред рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рдордп рдореЗрдВ рдмрд╕ рдПрдХ extra рд╕рд╣реА рдЕрдХреНрд╖рд░ рдорд┐рд▓реЗрдЧрд╛ред
рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рддреЗ рд╣реБрдП, рдХреБрдЫ minutes рдпрд╛ hours рдореЗрдВ attackers рдиреЗ рд╣рдорд╛рд░реА application рдХреА "help" рд╕реЗ рд╕рд╣реА username рдФрд░ password рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд▓рд┐рдпрд╛ рд╣реЛрдЧрд╛, рд╕рд┐рд░реНрдл рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рд▓рдЧреЗ рд╕рдордп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред
#### рдЗрд╕реЗ `secrets.compare_digest()` рд╕реЗ рдареАрдХ рдХрд░реЗрдВ { #fix-it-with-secrets-compare-digest }
рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ code рдореЗрдВ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ `secrets.compare_digest()` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, `stanleyjobsox` рдХреА рддреБрд▓рдирд╛ `stanleyjobson` рд╕реЗ рдХрд░рдиреЗ рдореЗрдВ рдЙрддрдирд╛ рд╣реА рд╕рдордп рд▓рдЧреЗрдЧрд╛ рдЬрд┐рддрдирд╛ `johndoe` рдХреА рддреБрд▓рдирд╛ `stanleyjobson` рд╕реЗ рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИред рдФрд░ password рдХреЗ рд▓рд┐рдП рднреА рд╡рд╣реАред
рдЗрд╕ рддрд░рд╣, рдЕрдкрдиреЗ application code рдореЗрдВ `secrets.compare_digest()` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдпрд╣ security attacks рдХреА рдЗрд╕ рдкреВрд░реА range рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╕реБрд░рдХреНрд╖рд┐рдд рд░рд╣реЗрдЧрд╛ред
### Error рд▓реМрдЯрд╛рдПрдБ { #return-the-error }
рдпрд╣ detect рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ credentials incorrect рд╣реИрдВ, status code 401 (рд╡рд╣реА рдЬреЛ рддрдм рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ credentials provide рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ) рдХреЗ рд╕рд╛рде рдПрдХ `HTTPException` рд▓реМрдЯрд╛рдПрдБ рдФрд░ browser рдХреЛ login prompt рдлрд┐рд░ рд╕реЗ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП `WWW-Authenticate` header рдЬреЛрдбрд╝реЗрдВ:
{* ../../docs_src/security/tutorial007_an_py310.py hl[26:30] *}

19
docs/hi/docs/advanced/security/index.md

@ -0,0 +1,19 @@
# рдЙрдиреНрдирдд рд╕реБрд░рдХреНрд╖рд╛ { #advanced-security }
## рдЕрддрд┐рд░рд┐рдХреНрдд Features { #additional-features }
[Tutorial - User Guide: Security](../../tutorial/security/index.md) рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдЪреАрдЬрд╝реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд features рд╣реИрдВред
/// tip | рд╕реБрдЭрд╛рд╡
рдЕрдЧрд▓реЗ sections **рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ рдХрд┐ "рдЙрдиреНрдирдд" рд╣реА рд╣реЛрдВ**ред
рдФрд░ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ use case рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдореЗрдВ рд╣реЛред
///
## рдкрд╣рд▓реЗ Tutorial рдкрдврд╝реЗрдВ { #read-the-tutorial-first }
рдЕрдЧрд▓реЗ sections рдорд╛рдирдХрд░ рдЪрд▓рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдиреЗ рдореБрдЦреНрдп [Tutorial - User Guide: Security](../../tutorial/security/index.md) рдкрд╣рд▓реЗ рд╣реА рдкрдврд╝ рд▓рд┐рдпрд╛ рд╣реИред
рд╡реЗ рд╕рднреА рд╕рдорд╛рди concepts рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд functionalities рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

274
docs/hi/docs/advanced/security/oauth2-scopes.md

@ -0,0 +1,274 @@
# OAuth2 scopes { #oauth2-scopes }
рдЖрдк **FastAPI** рдХреЗ рд╕рд╛рде OAuth2 scopes рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рдирд┐рд░реНрдмрд╛рдз рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреАрдХреГрдд рд╣реИрдВред
рдпрд╣ рдЖрдкрдХреЛ OAuth2 standard рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП, рдЖрдкрдХреА OpenAPI application (рдФрд░ API docs) рдореЗрдВ рдПрдХ рдЕрдзрд┐рдХ fine-grained permission system рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
Scopes рдХреЗ рд╕рд╛рде OAuth2 рд╡рд╣ mechanism рд╣реИ рдЬрд┐рд╕реЗ рдХрдИ рдмрдбрд╝реЗ authentication providers, рдЬреИрд╕реЗ Facebook, Google, GitHub, Microsoft, X (Twitter), рдЖрджрд┐ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ users рдФрд░ applications рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ permissions рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред
рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк Facebook, Google, GitHub, Microsoft, X (Twitter) рдХреЗ рд╕рд╛рде "log in with" рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ application scopes рдХреЗ рд╕рд╛рде OAuth2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реА рд╣реЛрддреА рд╣реИред
рдЗрд╕ section рдореЗрдВ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЕрдкрдиреА **FastAPI** application рдореЗрдВ рдЙрд╕реА scopes рд╡рд╛рд▓реЗ OAuth2 рдХреЗ рд╕рд╛рде authentication рдФрд░ authorization рдХреЛ рдХреИрд╕реЗ manage рдХрд░реЗрдВред
/// warning | рдЪреЗрддрд╛рд╡рдиреА
рдпрд╣ рдереЛрдбрд╝рд╛-рдмрд╣реБрдд advanced section рд╣реИред рдпрджрд┐ рдЖрдк рдЕрднреА рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдкрдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ OAuth2 scopes рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЖрдк authentication рдФрд░ authorization рдХреЛ рдЬреИрд╕реЗ рдЪрд╛рд╣реЗрдВ handle рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди scopes рдХреЗ рд╕рд╛рде OAuth2 рдХреЛ рдЖрдкрдХреА API (OpenAPI рдХреЗ рд╕рд╛рде) рдФрд░ рдЖрдкрдХреА API docs рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ integrate рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдлрд┐рд░ рднреА, рдЖрдк рдЙрди scopes, рдпрд╛ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп security/authorization requirement рдХреЛ рдЕрдкрдиреЗ code рдореЗрдВ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ enforce рдХрд░рддреЗ рд╣реИрдВред
рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, scopes рдХреЗ рд╕рд╛рде OAuth2 overkill рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛ рдЖрдк curious рд╣реИрдВ, рддреЛ рдкрдврд╝рддреЗ рд░рд╣реЗрдВред
///
## OAuth2 scopes рдФрд░ OpenAPI { #oauth2-scopes-and-openapi }
OAuth2 specification "scopes" рдХреЛ spaces рд╕реЗ рдЕрд▓рдЧ рдХреА рдЧрдИ strings рдХреА list рдХреЗ рд░реВрдк рдореЗрдВ define рдХрд░рддреА рд╣реИред
рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ string рдХрд╛ content рдХрд┐рд╕реА рднреА format рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕рдореЗрдВ spaces рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
рдпреЗ scopes "permissions" рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред
OpenAPI рдореЗрдВ (рдЬреИрд╕реЗ API docs), рдЖрдк "security schemes" define рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЬрдм рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ security scheme OAuth2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рддреЛ рдЖрдк scopes declare рдФрд░ рдЙрдкрдпреЛрдЧ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рддреНрдпреЗрдХ "scope" рдмрд╕ рдПрдХ string рд╣реИ (spaces рдХреЗ рдмрд┐рдирд╛)ред
рд╡реЗ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рд╡рд┐рд╢рд┐рд╖реНрдЯ security permissions declare рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
* `users:read` рдпрд╛ `users:write` рдЖрдо examples рд╣реИрдВред
* `instagram_basic` Facebook / Instagram рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
* `https://www.googleapis.com/auth/drive` Google рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
/// note | рдиреЛрдЯ
OAuth2 рдореЗрдВ "scope" рдмрд╕ рдПрдХ string рд╣реИ рдЬреЛ required рд╡рд┐рд╢рд┐рд╖реНрдЯ permission declare рдХрд░рддреА рд╣реИред
рдЗрд╕рд╕реЗ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЗрд╕рдореЗрдВ `:` рдЬреИрд╕реЗ рдЕрдиреНрдп characters рд╣реИрдВ рдпрд╛ рдпрд╣ рдПрдХ URL рд╣реИред
рд╡реЗ details implementation specific рд╣реИрдВред
OAuth2 рдХреЗ рд▓рд┐рдП рд╡реЗ рдмрд╕ strings рд╣реИрдВред
///
## Global view { #global-view }
рдкрд╣рд▓реЗ, рдЖрдЗрдП рдЬрд▓реНрджреА рд╕реЗ рджреЗрдЦреЗрдВ рдХрд┐ рдореБрдЦреНрдп **Tutorial - User Guide** рдореЗрдВ [Password рдХреЗ рд╕рд╛рде OAuth2 (рдФрд░ hashing), JWT tokens рдХреЗ рд╕рд╛рде Bearer](../../tutorial/security/oauth2-jwt.md) рдХреЗ examples рд╕реЗ рдХреМрди рд╕реЗ parts рдмрджрд▓рддреЗ рд╣реИрдВред рдЕрдм OAuth2 scopes рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП:
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,9,13,47,65,106,108:116,122:126,130:136,141,157] *}
рдЕрдм рдЖрдЗрдП рдЙрди рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ step by step review рдХрд░реЗрдВред
## OAuth2 Security scheme { #oauth2-security-scheme }
рдкрд╣рд▓рд╛ рдмрджрд▓рд╛рд╡ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рд╣рдо OAuth2 security scheme рдХреЛ рджреЛ рдЙрдкрд▓рдмреНрдз scopes, `me` рдФрд░ `items`, рдХреЗ рд╕рд╛рде declare рдХрд░ рд░рд╣реЗ рд╣реИрдВред
`scopes` parameter рдПрдХ `dict` receive рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ scope key рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ description value рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддреА рд╣реИ:
{* ../../docs_src/security/tutorial005_an_py310.py hl[63:66] *}
рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдо рдЙрди scopes рдХреЛ declare рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡реЗ API docs рдореЗрдВ рддрдм рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ рдЬрдм рдЖрдк log-in/authorize рдХрд░реЗрдВрдЧреЗред
рдФрд░ рдЖрдк select рдХрд░ рд╕рдХреЗрдВрдЧреЗ рдХрд┐ рдЖрдк рдХрд┐рди scopes рдХреЛ access рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: `me` рдФрд░ `items`ред
рдпрд╣ рд╡рд╣реА mechanism рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк Facebook, Google, GitHub, рдЖрджрд┐ рдХреЗ рд╕рд╛рде log in рдХрд░рддреЗ рд╕рдордп permissions рджреЗрддреЗ рд╣реИрдВ:
<img src="/img/tutorial/security/image11.png">
## Scopes рдХреЗ рд╕рд╛рде JWT token { #jwt-token-with-scopes }
рдЕрдм, token *path operation* рдХреЛ modify рдХрд░реЗрдВ рддрд╛рдХрд┐ requested scopes return рд╣реЛрдВред
рд╣рдо рдЕрднреА рднреА рд╡рд╣реА `OAuth2PasswordRequestForm` рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ `scopes` property рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ `str` рдХреА `list` рд╣реЛрддреА рд╣реИ, рдФрд░ request рдореЗрдВ received рдкреНрд░рддреНрдпреЗрдХ scope рд╣реЛрддрд╛ рд╣реИред
рдФрд░ рд╣рдо scopes рдХреЛ JWT token рдХреЗ part рдХреЗ рд░реВрдк рдореЗрдВ return рдХрд░рддреЗ рд╣реИрдВред
/// danger | рдЦрддрд░рд╛
рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рд╣рдо received scopes рдХреЛ рд╕реАрдзреЗ token рдореЗрдВ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЖрдкрдХреА application рдореЗрдВ, security рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рд╡реЗ scopes рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ user рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░рдЦ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдиреЗ predefine рдХрд┐рдпрд╛ рд╣реИред
///
{* ../../docs_src/security/tutorial005_an_py310.py hl[157] *}
## *path operations* рдФрд░ dependencies рдореЗрдВ scopes declare рдХрд░реЗрдВ { #declare-scopes-in-path-operations-and-dependencies }
рдЕрдм рд╣рдо declare рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ `/users/me/items/` рдХреЗ рд▓рд┐рдП *path operation* рдХреЛ scope `items` required рд╣реИред
рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдо `fastapi` рд╕реЗ `Security` import рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЖрдк dependencies declare рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `Security` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдмрд┐рд▓реНрдХреБрд▓ `Depends` рдХреА рддрд░рд╣), рд▓реЗрдХрд┐рди `Security` рдПрдХ parameter `scopes` рднреА receive рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ scopes (strings) рдХреА list рд╣реЛрддреА рд╣реИред
рдЗрд╕ case рдореЗрдВ, рд╣рдо dependency function `get_current_active_user` рдХреЛ `Security` рдореЗрдВ pass рдХрд░рддреЗ рд╣реИрдВ (рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рд╣рдо `Depends` рдХреЗ рд╕рд╛рде рдХрд░рддреЗ)ред
рд▓реЗрдХрд┐рди рд╣рдо scopes рдХреА рдПрдХ `list` рднреА pass рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ case рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ scope рдХреЗ рд╕рд╛рде: `items` (рдЗрд╕рдореЗрдВ рдФрд░ рднреА рд╣реЛ рд╕рдХрддреЗ рдереЗ)ред
рдФрд░ dependency function `get_current_active_user` sub-dependencies рднреА declare рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рди рдХреЗрд╡рд▓ `Depends` рдХреЗ рд╕рд╛рде рдмрд▓реНрдХрд┐ `Security` рдХреЗ рд╕рд╛рде рднреАред рдЕрдкрдирд╛ sub-dependency function (`get_current_user`) рдФрд░ рдЕрдзрд┐рдХ scope requirements declare рдХрд░рддреЗ рд╣реБрдПред
рдЗрд╕ case рдореЗрдВ, рдЗрд╕реЗ scope `me` required рд╣реИ (рдЗрд╕реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ scope required рд╣реЛ рд╕рдХрддреЗ рдереЗ)ред
/// note | рдиреЛрдЯ
рдЖрдкрдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрдЧрд╣реЛрдВ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ scopes рдЬреЛрдбрд╝рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рдирд╣реАрдВ рд╣реИред
рд╣рдо рдпрд╣рд╛рдБ рдпрд╣ demonstrate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ **FastAPI** рдЕрд▓рдЧ-рдЕрд▓рдЧ levels рдкрд░ declared scopes рдХреЛ рдХреИрд╕реЗ handle рдХрд░рддрд╛ рд╣реИред
///
{* ../../docs_src/security/tutorial005_an_py310.py hl[5,141,172] *}
/// note | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
`Security` рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ `Depends` рдХрд╛ subclass рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ extra parameter рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред
рд▓реЗрдХрд┐рди `Depends` рдХреЗ рдмрдЬрд╛рдп `Security` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, **FastAPI** рдЬрд╛рди рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ security scopes declare рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ internally рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ API рдХреЛ OpenAPI рдХреЗ рд╕рд╛рде document рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк `fastapi` рд╕реЗ `Query`, `Path`, `Depends`, `Security` рдФрд░ рдЕрдиреНрдп import рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ functions рд╣реИрдВ рдЬреЛ special classes return рдХрд░рддреЗ рд╣реИрдВред
///
## `SecurityScopes` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ { #use-securityscopes }
рдЕрдм dependency `get_current_user` рдХреЛ update рдХрд░реЗрдВред
рдпрд╣ рд╡рд╣реА рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдКрдкрд░ рдХреА dependencies рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣реАрдВ рд╣рдо рдкрд╣рд▓реЗ рдмрдирд╛рдИ рдЧрдИ рдЙрд╕реА OAuth2 scheme рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕реЗ dependency рдХреЗ рд░реВрдк рдореЗрдВ declare рдХрд░рддреЗ рд╣реБрдП: `oauth2_scheme`ред
рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ dependency function рдХреА рдЕрдкрдиреА рдХреЛрдИ scope requirements рдирд╣реАрдВ рд╣реИрдВ, рд╣рдо `oauth2_scheme` рдХреЗ рд╕рд╛рде `Depends` рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм рд╣рдореЗрдВ security scopes specify рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рддреЛ рд╣рдореЗрдВ `Security` рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рд╣рдо `SecurityScopes` type рдХрд╛ рдПрдХ special parameter рднреА declare рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ `fastapi.security` рд╕реЗ import рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпрд╣ `SecurityScopes` class `Request` рдХреЗ рд╕рдорд╛рди рд╣реИ (`Request` рдХрд╛ рдЙрдкрдпреЛрдЧ request object рдХреЛ рд╕реАрдзреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред
{* ../../docs_src/security/tutorial005_an_py310.py hl[9,106] *}
## `scopes` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ { #use-the-scopes }
Parameter `security_scopes` рдХрд╛ type `SecurityScopes` рд╣реЛрдЧрд╛ред
рдЗрд╕рдореЗрдВ property `scopes` рд╣реЛрдЧреА рдЬрд┐рд╕рдореЗрдВ рдПрдХ list рд╣реЛрдЧреА, рдЬрд┐рд╕рдореЗрдВ рд╕реНрд╡рдпрдВ рдФрд░ рдЗрд╕реЗ sub-dependency рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рднреА dependencies рджреНрд╡рд╛рд░рд╛ required рд╕рднреА scopes рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ, рд╕рднреА "dependants"... рдпрд╣ confusing рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рдиреАрдЪреЗ рдлрд┐рд░ рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
`security_scopes` object (`SecurityScopes` class рдХрд╛) рдПрдХ `scope_str` attribute рднреА provide рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ single string рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡реЗ scopes spaces рд╕реЗ рдЕрд▓рдЧ рд╣реЛрддреЗ рд╣реИрдВ (рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ)ред
рд╣рдо рдПрдХ `HTTPException` рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рдХрдИ points рдкрд░ reuse (`raise`) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ exception рдореЗрдВ, рд╣рдо required scopes (рдпрджрд┐ рдХреЛрдИ рд╣реЛрдВ) рдХреЛ spaces рд╕реЗ рдЕрд▓рдЧ рдХреА рдЧрдИ string рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ (`scope_str` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред рд╣рдо scopes рд╡рд╛рд▓реА рдЙрд╕ string рдХреЛ `WWW-Authenticate` header рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ (рдпрд╣ spec рдХрд╛ part рд╣реИ)ред
{* ../../docs_src/security/tutorial005_an_py310.py hl[106,108:116] *}
## `username` рдФрд░ data shape verify рдХрд░реЗрдВ { #verify-the-username-and-data-shape }
рд╣рдо verify рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ `username` рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ scopes extract рдХрд░рддреЗ рд╣реИрдВред
рдФрд░ рдлрд┐рд░ рд╣рдо рдЙрд╕ data рдХреЛ Pydantic model рдХреЗ рд╕рд╛рде validate рдХрд░рддреЗ рд╣реИрдВ (`ValidationError` exception рдХреЛ catch рдХрд░рддреЗ рд╣реБрдП), рдФрд░ рдпрджрд┐ JWT token рдкрдврд╝рдиреЗ рдпрд╛ Pydantic рдХреЗ рд╕рд╛рде data validate рдХрд░рдиреЗ рдореЗрдВ error рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдкрд╣рд▓реЗ рдмрдирд╛рдпрд╛ рд╣реБрдЖ `HTTPException` raise рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдо Pydantic model `TokenData` рдХреЛ рдирдИ property `scopes` рдХреЗ рд╕рд╛рде update рдХрд░рддреЗ рд╣реИрдВред
Pydantic рдХреЗ рд╕рд╛рде data validate рдХрд░рдХреЗ рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, scopes рдХреЗ рд╕рд╛рде рдмрд┐рд▓реНрдХреБрд▓ `str` рдХреА `list` рдФрд░ `username` рдХреЗ рд╕рд╛рде `str` рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, `dict`, рдпрд╛ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА point рдкрд░ application рдХреЛ break рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ security risk рдмрди рд╕рдХрддрд╛ рд╣реИред
рд╣рдо рдпрд╣ рднреА verify рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрд╕ username рд╡рд╛рд▓рд╛ user рд╣реИ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдо рд╡рд╣реА exception raise рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдмрдирд╛рдпрд╛ рдерд╛ред
{* ../../docs_src/security/tutorial005_an_py310.py hl[47,117:129] *}
## `scopes` verify рдХрд░реЗрдВ { #verify-the-scopes }
рдЕрдм рд╣рдо verify рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ dependency рдФрд░ рд╕рднреА dependants (рдЬрд┐рд╕рдореЗрдВ *path operations* рд╢рд╛рдорд┐рд▓ рд╣реИрдВ) рджреНрд╡рд╛рд░рд╛ required рд╕рднреА scopes, received token рдореЗрдВ provided 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 рдХреЛ рдлрд┐рд░ рд╕реЗ review рдХрд░реЗрдВред
рдХреНрдпреЛрдВрдХрд┐ `get_current_active_user` dependency рдореЗрдВ `get_current_user` sub-dependency рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ, `get_current_active_user` рдкрд░ declared scope `"me"` required scopes рдХреА рдЙрд╕ list рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ рдЬреЛ `get_current_user` рдХреЛ pass рдХрд┐рдП рдЧрдП `security_scopes.scopes` рдореЗрдВ рд╣реЛрддреА рд╣реИред
*path operation* рд╕реНрд╡рдпрдВ рднреА рдПрдХ scope, `"items"`, declare рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рднреА `get_current_user` рдХреЛ pass рдХрд┐рдП рдЧрдП `security_scopes.scopes` рдХреА list рдореЗрдВ рд╣реЛрдЧрд╛ред
Dependencies рдФрд░ scopes рдХреА hierarchy рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:
* *path operation* `read_own_items` рдореЗрдВ рд╣реИ:
* Dependency рдХреЗ рд╕рд╛рде required scopes `["items"]`:
* `get_current_active_user`:
* Dependency function `get_current_active_user` рдореЗрдВ рд╣реИ:
* Dependency рдХреЗ рд╕рд╛рде required scopes `["me"]`:
* `get_current_user`:
* Dependency function `get_current_user` рдореЗрдВ рд╣реИ:
* рд╕реНрд╡рдпрдВ рджреНрд╡рд╛рд░рд╛ required рдХреЛрдИ scopes рдирд╣реАрдВред
* `oauth2_scheme` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА dependencyред
* `SecurityScopes` type рдХрд╛ рдПрдХ `security_scopes` parameter:
* рдЗрд╕ `security_scopes` parameter рдореЗрдВ property `scopes` рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдКрдкрд░ declared рдЗрди рд╕рднреА scopes рд╡рд╛рд▓реА `list` рд╣реИ, рдЗрд╕рд▓рд┐рдП:
* *path operation* `read_own_items` рдХреЗ рд▓рд┐рдП `security_scopes.scopes` рдореЗрдВ `["me", "items"]` рд╣реЛрдЧрд╛ред
* *path operation* `read_users_me` рдХреЗ рд▓рд┐рдП `security_scopes.scopes` рдореЗрдВ `["me"]` рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ dependency `get_current_active_user` рдореЗрдВ declared рд╣реИред
* *path operation* `read_system_status` рдХреЗ рд▓рд┐рдП `security_scopes.scopes` рдореЗрдВ `[]` (рдХреБрдЫ рдирд╣реАрдВ) рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕рдиреЗ `scopes` рдХреЗ рд╕рд╛рде рдХреЛрдИ `Security` declare рдирд╣реАрдВ рдХрд┐рдпрд╛, рдФрд░ рдЙрд╕рдХреА dependency, `get_current_user`, рднреА рдХреЛрдИ `scopes` declare рдирд╣реАрдВ рдХрд░рддреАред
/// tip | рд╕реБрдЭрд╛рд╡
рдпрд╣рд╛рдБ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдФрд░ "magic" рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ *path operation* рдХреЗ рд▓рд┐рдП `get_current_user` рдХреЗ рдкрд╛рд╕ check рдХрд░рдиреЗ рд╣реЗрддреБ `scopes` рдХреА рдЕрд▓рдЧ list рд╣реЛрдЧреАред
рдпрд╣ рд╕рдм рдЙрд╕ specific *path operation* рдХреЗ dependency tree рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ *path operation* рдФрд░ рдкреНрд░рддреНрдпреЗрдХ dependency рдореЗрдВ declared `scopes` рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
///
## `SecurityScopes` рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ details { #more-details-about-securityscopes }
рдЖрдк `SecurityScopes` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА point рдкрд░, рдФрд░ multiple рдЬрдЧрд╣реЛрдВ рдкрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ "root" dependency рдкрд░ рд╣реЛрдирд╛ рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ рд╣реИред
рдЗрд╕рдореЗрдВ рд╣рдореЗрд╢рд╛ current `Security` dependencies рдФрд░ **рдЙрд╕ specific** *path operation* рддрдерд╛ **рдЙрд╕ specific** dependency tree рдХреЗ рд╕рднреА dependants рдореЗрдВ declared security scopes рд╣реЛрдВрдЧреЗред
рдХреНрдпреЛрдВрдХрд┐ `SecurityScopes` рдореЗрдВ dependants рджреНрд╡рд╛рд░рд╛ declared рд╕рднреА scopes рд╣реЛрдВрдЧреЗ, рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ verify рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ token рдореЗрдВ required scopes рд╣реИрдВ, рдПрдХ central dependency function рдореЗрдВ, рдФрд░ рдлрд┐рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ *path operations* рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ scope requirements declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддреНрдпреЗрдХ *path operation* рдХреЗ рд▓рд┐рдП independently check рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
## рдЗрд╕реЗ check рдХрд░реЗрдВ { #check-it }
рдпрджрд┐ рдЖрдк API docs рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк authenticate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ specify рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХрд┐рди scopes рдХреЛ authorize рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
<img src="/img/tutorial/security/image11.png">
рдпрджрд┐ рдЖрдк рдХреЛрдИ scope select рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк "authenticated" рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк `/users/me/` рдпрд╛ `/users/me/items/` access рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ рддреЛ рдЖрдкрдХреЛ error рдорд┐рд▓реЗрдЧрд╛ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд░реНрдпрд╛рдкреНрдд permissions рдирд╣реАрдВ рд╣реИрдВред рдЖрдк рдлрд┐рд░ рднреА `/status/` access рдХрд░ рдкрд╛рдПрдВрдЧреЗред
рдФрд░ рдпрджрд┐ рдЖрдк scope `me` select рдХрд░рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди scope `items` рдирд╣реАрдВ, рддреЛ рдЖрдк `/users/me/` access рдХрд░ рдкрд╛рдПрдВрдЧреЗ рд▓реЗрдХрд┐рди `/users/me/items/` рдирд╣реАрдВред
рдРрд╕рд╛ рд╣реА рдХрд┐рд╕реА third party application рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ рдЬреЛ user рджреНрд╡рд╛рд░рд╛ provided token рдХреЗ рд╕рд╛рде рдЗрди *path operations* рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ access рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреА, рдпрд╣ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ user рдиреЗ application рдХреЛ рдХрд┐рддрдиреА permissions рджреАрдВред
## Third party integrations рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ { #about-third-party-integrations }
рдЗрд╕ example рдореЗрдВ рд╣рдо OAuth2 "password" flow рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдпрд╣ рддрдм appropriate рд╣реИ рдЬрдм рд╣рдо рдЕрдкрдиреА рд╣реА application рдореЗрдВ log in рдХрд░ рд░рд╣реЗ рд╣реЛрдВ, рд╢рд╛рдпрдж рдЕрдкрдиреЗ рд╣реА frontend рдХреЗ рд╕рд╛рдеред
рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ `username` рдФрд░ `password` receive рдХрд░реЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕реЗ control рдХрд░рддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдРрд╕реА OAuth2 application рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рджреВрд╕рд░реЗ connect рдХрд░реЗрдВрдЧреЗ (рдЕрд░реНрдерд╛рдд, рдпрджрд┐ рдЖрдк Facebook, Google, GitHub, рдЖрджрд┐ рдХреЗ рдмрд░рд╛рдмрд░ authentication provider рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ) рддреЛ рдЖрдкрдХреЛ рдЕрдиреНрдп flows рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдмрд╕реЗ common implicit flow рд╣реИред
рд╕рдмрд╕реЗ secure code flow рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ implement рдХрд░рдирд╛ рдЕрдзрд┐рдХ complex рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдЕрдзрд┐рдХ steps required рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ complex рд╣реИ, рдХрдИ providers рдЕрдВрддрддрдГ implicit flow suggest рдХрд░рддреЗ рд╣реИрдВред
/// note | рдиреЛрдЯ
рдпрд╣ common рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ authentication provider рдЕрдкрдиреЗ flows рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ name рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЗрд╕реЗ рдЕрдкрдиреЗ brand рдХрд╛ part рдмрдирд╛ рд╕рдХреЗред
рд▓реЗрдХрд┐рди рдЕрдВрддрддрдГ, рд╡реЗ рд╡рд╣реА OAuth2 standard implement рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВред
///
**FastAPI** рдореЗрдВ рдЗрди рд╕рднреА OAuth2 authentication flows рдХреЗ рд▓рд┐рдП utilities `fastapi.security.oauth2` рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
## Decorator `dependencies` рдореЗрдВ `Security` { #security-in-decorator-dependencies }
рдЬрд┐рд╕ рддрд░рд╣ рдЖрдк decorator рдХреЗ `dependencies` parameter рдореЗрдВ `Depends` рдХреА `list` define рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ [path operation decorators рдореЗрдВ Dependencies](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md) рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ), рдЖрдк рд╡рд╣рд╛рдБ `scopes` рдХреЗ рд╕рд╛рде `Security` рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

302
docs/hi/docs/advanced/settings.md

@ -0,0 +1,302 @@
# Settings рдФрд░ Environment Variables { #settings-and-environment-variables }
рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдкрдХреА application рдХреЛ рдХреБрдЫ рдмрд╛рд╣рд░реА settings рдпрд╛ configurations рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП secret keys, database credentials, email services рдХреЗ рд▓рд┐рдП credentials, рдЖрджрд┐ред
рдЗрдирдореЗрдВ рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛рддрд░ settings variable рд╣реЛрддреА рд╣реИрдВ (рдмрджрд▓ рд╕рдХрддреА рд╣реИрдВ), рдЬреИрд╕реЗ database URLsред рдФрд░ рдХрдИ sensitive рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЬреИрд╕реЗ secretsред
рдЗрд╕реА рдХрд╛рд░рдг рдЙрдиреНрд╣реЗрдВ рдЖрдо рддреМрд░ рдкрд░ environment variables рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ application рдкрдврд╝рддреА рд╣реИред
/// tip | рд╕реБрдЭрд╛рд╡
Environment variables рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк [Environment Variables](../environment-variables.md) рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
///
## Types рдФрд░ validation { #types-and-validation }
рдпреЗ environment variables рдХреЗрд╡рд▓ text strings рдХреЛ handle рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ Python рдХреЗ рдмрд╛рд╣рд░ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЗрдиреНрд╣реЗрдВ рджреВрд╕рд░реЗ programs рдФрд░ system рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд╕рд╛рде compatible рд╣реЛрдирд╛ рд╣реЛрддрд╛ рд╣реИ (рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ operating systems, рдЬреИрд╕реЗ Linux, Windows, рдФрд░ macOS рдХреЗ рд╕рд╛рде рднреА)ред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ Python рдореЗрдВ рдХрд┐рд╕реА environment variable рд╕реЗ рдкрдврд╝реА рдЧрдИ рдХреЛрдИ рднреА value рдПрдХ `str` рд╣реЛрдЧреА, рдФрд░ рдХрд┐рд╕реА рдЕрд▓рдЧ type рдореЗрдВ рдХреЛрдИ рднреА conversion рдпрд╛ рдХреЛрдИ рднреА validation code рдореЗрдВ рдХрд░рдиреА рд╣реЛрдЧреАред
## Pydantic `Settings` { #pydantic-settings }
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, Pydantic environment variables рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реА рдЗрди settings рдХреЛ handle рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░реАрди utility рджреЗрддрд╛ рд╣реИ: [Pydantic: Settings management](https://docs.pydantic.dev/latest/concepts/pydantic_settings/)ред
### `pydantic-settings` install рдХрд░реЗрдВ { #install-pydantic-settings }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЕрдкрдирд╛ [virtual environment](../virtual-environments.md) рдмрдирд╛рддреЗ рд╣реИрдВ, рдЙрд╕реЗ activate рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ `pydantic-settings` package install рдХрд░рддреЗ рд╣реИрдВ:
<div class="termy">
```console
$ pip install pydantic-settings
---> 100%
```
</div>
рдЬрдм рдЖрдк `all` extras рдХреЛ install рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рднреА рд╢рд╛рдорд┐рд▓ рдЖрддрд╛ рд╣реИ:
<div class="termy">
```console
$ pip install "fastapi[all]"
---> 100%
```
</div>
### `Settings` object рдмрдирд╛рдПрдБ { #create-the-settings-object }
Pydantic рд╕реЗ `BaseSettings` import рдХрд░реЗрдВ рдФрд░ рдПрдХ sub-class рдмрдирд╛рдПрдБ, рдмрд┐рд▓реНрдХреБрд▓ Pydantic model рдХреА рддрд░рд╣ред
Pydantic models рдХреА рддрд░рд╣ рд╣реА, рдЖрдк type annotations рдХреЗ рд╕рд╛рде class attributes рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдВрднрд╡рддрдГ default values рднреАред
рдЖрдк рд╡реЗ рд╕рднреА validation features рдФрд░ tools рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк Pydantic models рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ data types рдФрд░ `Field()` рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд validationsред
{* ../../docs_src/settings/tutorial001_py310.py hl[2,5:8,11] *}
/// tip | рд╕реБрдЭрд╛рд╡
рдЕрдЧрд░ рдЖрдк рдЬрд▓реНрджреА copy рдФрд░ paste рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ example рдЗрд╕реНрддреЗрдорд╛рд▓ рди рдХрд░реЗрдВ, рдиреАрдЪреЗ рд╡рд╛рд▓рд╛ рдЖрдЦрд┐рд░реА example рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВред
///
рдлрд┐рд░, рдЬрдм рдЖрдк рдЙрд╕ `Settings` class рдХрд╛ instance рдмрдирд╛рддреЗ рд╣реИрдВ (рдЗрд╕ case рдореЗрдВ, `settings` object рдореЗрдВ), Pydantic environment variables рдХреЛ case-insensitive рддрд░реАрдХреЗ рд╕реЗ рдкрдврд╝реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП upper-case variable `APP_NAME` рднреА attribute `app_name` рдХреЗ рд▓рд┐рдП рдкрдврд╝рд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕рдХреЗ рдмрд╛рдж рдпрд╣ data рдХреЛ convert рдФрд░ validate рдХрд░реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЖрдк рдЙрд╕ `settings` object рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрди types рдХрд╛ data рд╣реЛрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдиреЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдерд╛ (рдЬреИрд╕реЗ `items_per_user` рдПрдХ `int` рд╣реЛрдЧрд╛)ред
### `settings` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ { #use-the-settings }
рдлрд┐рд░ рдЖрдк рдЕрдкрдиреА application рдореЗрдВ рдирдП `settings` object рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/settings/tutorial001_py310.py hl[18:20] *}
### Server рдЪрд▓рд╛рдПрдБ { #run-the-server }
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдк configurations рдХреЛ environment variables рдХреЗ рд░реВрдк рдореЗрдВ pass рдХрд░рддреЗ рд╣реБрдП server рдЪрд▓рд╛рдПрдБрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдк `ADMIN_EMAIL` рдФрд░ `APP_NAME` set рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
<div class="termy">
```console
$ ADMIN_EMAIL="[email protected]" APP_NAME="ChimichangApp" fastapi run main.py
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
</div>
/// tip | рд╕реБрдЭрд╛рд╡
рдПрдХ рд╣реА command рдХреЗ рд▓рд┐рдП рдХрдИ env vars set рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЙрдиреНрд╣реЗрдВ space рд╕реЗ рдЕрд▓рдЧ рдХрд░реЗрдВ, рдФрд░ рдЙрди рд╕рднреА рдХреЛ command рд╕реЗ рдкрд╣рд▓реЗ рд░рдЦреЗрдВред
///
рдФрд░ рдлрд┐рд░ `admin_email` setting `"[email protected]"` рдкрд░ set рд╣реЛ рдЬрд╛рдПрдЧреАред
`app_name` `"ChimichangApp"` рд╣реЛрдЧрд╛ред
рдФрд░ `items_per_user` рдЕрдкрдиреА default value `50` рдмрдирд╛рдП рд░рдЦреЗрдЧрд╛ред
## рдХрд┐рд╕реА рджреВрд╕рд░реЗ module рдореЗрдВ Settings { #settings-in-another-module }
рдЖрдк рдЙрди settings рдХреЛ рдХрд┐рд╕реА рджреВрд╕рд░реЗ module file рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдЖрдкрдиреЗ [Bigger Applications - Multiple Files](../tutorial/bigger-applications.md) рдореЗрдВ рджреЗрдЦрд╛ рдерд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ `config.py` file рд╣реЛ рд╕рдХрддреА рд╣реИ:
{* ../../docs_src/settings/app01_py310/config.py *}
рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ `main.py` file рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
{* ../../docs_src/settings/app01_py310/main.py hl[3,11:13] *}
/// tip | рд╕реБрдЭрд╛рд╡
рдЖрдкрдХреЛ рдПрдХ `__init__.py` file рдХреА рднреА рдЬрд╝рд░реВрд░рдд рд╣реЛрдЧреА, рдЬреИрд╕рд╛ рдЖрдкрдиреЗ [Bigger Applications - Multiple Files](../tutorial/bigger-applications.md) рдореЗрдВ рджреЗрдЦрд╛ рдерд╛ред
///
## Dependency рдореЗрдВ Settings { #settings-in-a-dependency }
рдХреБрдЫ рдореМрдХреЛрдВ рдкрд░ settings рдХреЛ dependency рд╕реЗ рджреЗрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ `settings` рдХреЗ рд╕рд╛рде рдПрдХ global object рд╣реЛ рдЬрд┐рд╕реЗ рд╣рд░ рдЬрдЧрд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдпрд╣ testing рдХреЗ рджреМрд░рд╛рди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ dependency рдХреЛ рдЕрдкрдиреА custom settings рд╕реЗ override рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
### Config file { #the-config-file }
рдкрд┐рдЫрд▓реЗ example рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реБрдП, рдЖрдкрдХреА `config.py` file рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:
{* ../../docs_src/settings/app02_an_py310/config.py hl[10] *}
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрдм рд╣рдо default instance `settings = Settings()` рдирд╣реАрдВ рдмрдирд╛рддреЗред
### Main app file { #the-main-app-file }
рдЕрдм рд╣рдо рдПрдХ dependency рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдирдпрд╛ `config.Settings()` return рдХрд░рддреА рд╣реИред
{* ../../docs_src/settings/app02_an_py310/main.py hl[6,12:13] *}
/// tip | рд╕реБрдЭрд╛рд╡
рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдореЗрдВ `@lru_cache` рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред
рдЕрднреА рдХреЗ рд▓рд┐рдП рдЖрдк рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ `get_settings()` рдПрдХ normal function рд╣реИред
///
рдФрд░ рдлрд┐рд░ рд╣рдо рдЗрд╕реЗ *path operation function* рд╕реЗ dependency рдХреЗ рд░реВрдк рдореЗрдВ require рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд╣рд╛рдБ рднреА рдЬрд╝рд░реВрд░рдд рд╣реЛ рд╡рд╣рд╛рдБ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
{* ../../docs_src/settings/app02_an_py310/main.py hl[17,19:21] *}
### Settings рдФрд░ testing { #settings-and-testing }
рдлрд┐рд░ testing рдХреЗ рджреМрд░рд╛рди `get_settings` рдХреЗ рд▓рд┐рдП dependency override рдмрдирд╛рдХрд░ рдЕрд▓рдЧ settings object рджреЗрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдЧрд╛:
{* ../../docs_src/settings/app02_an_py310/test_main.py hl[9:10,13,21] *}
Dependency override рдореЗрдВ рд╣рдо рдирдпрд╛ `Settings` object рдмрдирд╛рддреЗ рд╕рдордп `admin_email` рдХреЗ рд▓рд┐рдП рдирдИ value set рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрд╕ рдирдП object рдХреЛ return рдХрд░рддреЗ рд╣реИрдВред
рдлрд┐рд░ рд╣рдо test рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реБрдЖ рд╣реИред
## `.env` file рдкрдврд╝рдирд╛ { #reading-a-env-file }
рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ settings рд╣реИрдВ рдЬреЛ рд╕рдВрднрд╡рддрдГ рдмрд╣реБрдд рдмрджрд▓рддреА рд╣реИрдВ, рд╢рд╛рдпрдж рдЕрд▓рдЧ-рдЕрд▓рдЧ environments рдореЗрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХ file рдореЗрдВ рд░рдЦрдирд╛ рдФрд░ рдлрд┐рд░ рд╡рд╣рд╛рдБ рд╕реЗ рдРрд╕реЗ рдкрдврд╝рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╡реЗ environment variables рд╣реЛрдВред
рдпрд╣ practice рдЗрддрдиреА рдЖрдо рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдПрдХ рдирд╛рдо рд╣реИ, рдпреЗ environment variables рдЖрдо рддреМрд░ рдкрд░ `.env` file рдореЗрдВ рд░рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ file рдХреЛ "dotenv" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
/// tip | рд╕реБрдЭрд╛рд╡
dot (`.`) рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА file Unix-like systems, рдЬреИрд╕реЗ Linux рдФрд░ macOS рдореЗрдВ hidden file рд╣реЛрддреА рд╣реИред
рд▓реЗрдХрд┐рди dotenv file рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣реА exact filename рд╣реЛрдирд╛ рдЬрд╝рд░реВрд░реА рдирд╣реАрдВ рд╣реИред
///
Pydantic рдХреЗ рдкрд╛рд╕ external library рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА files рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП support рд╣реИред рдЖрдк [Pydantic Settings: Dotenv (.env) support](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support) рдкрд░ рдФрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
/// tip | рд╕реБрдЭрд╛рд╡
рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ `pip install python-dotenv` рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
///
### `.env` file { #the-env-file }
рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреА `.env` file рд╣реЛ рд╕рдХрддреА рд╣реИ:
```bash
ADMIN_EMAIL="[email protected]"
APP_NAME="ChimichangApp"
```
### `.env` рд╕реЗ settings рдкрдврд╝реЗрдВ { #read-settings-from-env }
рдФрд░ рдлрд┐рд░ рдЕрдкрдиреА `config.py` рдХреЛ update рдХрд░реЗрдВ:
{* ../../docs_src/settings/app03_an_py310/config.py hl[9] *}
/// tip | рд╕реБрдЭрд╛рд╡
`model_config` attribute рдХреЗрд╡рд▓ Pydantic configuration рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк [Pydantic: Concepts: Configuration](https://docs.pydantic.dev/latest/concepts/config/) рдкрд░ рдФрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
///
рдпрд╣рд╛рдБ рд╣рдо рдЖрдкрдХреА Pydantic `Settings` class рдХреЗ рдЕрдВрджрд░ config `env_file` define рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ value рдХреЛ рдЙрд╕ dotenv file рдХреЗ filename рдкрд░ set рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
### `lru_cache` рдХреЗ рд╕рд╛рде `Settings` рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдмрдирд╛рдирд╛ { #creating-the-settings-only-once-with-lru-cache }
Disk рд╕реЗ file рдкрдврд╝рдирд╛ рд╕рд╛рдорд╛рдиреНрдпрддрдГ costly (slow) operation рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╢рд╛рдпрдж рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдФрд░ рдлрд┐рд░ рд╣рд░ request рдХреЗ рд▓рд┐рдП рдкрдврд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрд╕реА settings object рдХреЛ reuse рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
рд▓реЗрдХрд┐рди рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдХрд░рддреЗ рд╣реИрдВ:
```Python
Settings()
```
рддреЛ рдПрдХ рдирдпрд╛ `Settings` object рдмрдиреЗрдЧрд╛, рдФрд░ рдмрдирддреЗ рд╕рдордп рдпрд╣ `.env` file рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝реЗрдЧрд╛ред
рдЕрдЧрд░ dependency function рдмрд╕ рдРрд╕реА рд╣реЛрддреА:
```Python
def get_settings():
return Settings()
```
рддреЛ рд╣рдо рд╣рд░ request рдХреЗ рд▓рд┐рдП рд╡рд╣ object рдмрдирд╛рддреЗ, рдФрд░ рд╣рд░ request рдХреЗ рд▓рд┐рдП `.env` file рдкрдврд╝рддреЗред тЪая╕П
рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдКрдкрд░ `@lru_cache` decorator рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, `Settings` object рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдкрд╣рд▓реА рдмрд╛рд░ рдЬрдм рдЗрд╕реЗ call рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред тЬФя╕П
{* ../../docs_src/settings/app03_an_py310/main.py hl[1,11] *}
рдлрд┐рд░ рдЕрдЧрд▓реЗ requests рдХреЗ рд▓рд┐рдП dependencies рдореЗрдВ `get_settings()` рдХреА рдХрд┐рд╕реА рднреА рдмрд╛рдж рдХреА call рдкрд░, `get_settings()` рдХреЗ internal code рдХреЛ execute рдХрд░рдиреЗ рдФрд░ рдирдпрд╛ `Settings` object рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рд╡рд╣реА object return рдХрд░реЗрдЧрд╛ рдЬреЛ рдкрд╣рд▓реА call рдкрд░ return рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдмрд╛рд░-рдмрд╛рд░ред
#### `lru_cache` Technical Details { #lru-cache-technical-details }
`@lru_cache` рдЬрд┐рд╕ function рдХреЛ decorate рдХрд░рддрд╛ рд╣реИ рдЙрд╕реЗ modify рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡рд╣ рд╣рд░ рдмрд╛рд░ function рдХрд╛ code execute рдХрд░рдХреЗ рдлрд┐рд░ рд╕реЗ compute рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╡рд╣реА value return рдХрд░реЗ рдЬреЛ рдкрд╣рд▓реА рдмрд╛рд░ return рдХреА рдЧрдИ рдереАред
рдЗрд╕рд▓рд┐рдП, рдЙрд╕рдХреЗ рдиреАрдЪреЗ рд╡рд╛рд▓рд╛ function arguments рдХреЗ рдкреНрд░рддреНрдпреЗрдХ combination рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ execute рд╣реЛрдЧрд╛ред рдФрд░ рдлрд┐рд░ рдЙрди arguments рдХреЗ рдкреНрд░рддреНрдпреЗрдХ combination рджреНрд╡рд╛рд░рд╛ return рдХреА рдЧрдИ values рдмрд╛рд░-рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдПрдБрдЧреА, рдЬрдм рднреА function рдХреЛ рдареАрдХ рдЙрд╕реА arguments combination рдХреЗ рд╕рд╛рде call рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ function рд╣реИ:
```Python
@lru_cache
def say_hi(name: str, salutation: str = "Ms."):
return f"Hello {salutation} {name}"
```
рдЖрдкрдХрд╛ program рдЗрд╕ рддрд░рд╣ execute рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
```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()` рдХреЗ case рдореЗрдВ, function рдХреЛрдИ arguments рднреА рдирд╣реАрдВ рд▓реЗрддреА, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рдореЗрд╢рд╛ рд╡рд╣реА value return рдХрд░рддреА рд╣реИред
рдЗрд╕ рддрд░рд╣, рдпрд╣ рд▓рдЧрднрдЧ рдРрд╕реЗ behave рдХрд░рддреА рд╣реИ рдЬреИрд╕реЗ рдпрд╣ рдмрд╕ рдПрдХ global variable рд╣реЛред рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ dependency function рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо testing рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ override рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
`@lru_cache` `functools` рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬреЛ Python рдХреА standard library рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ [Python docs for `@lru_cache`](https://docs.python.org/3/library/functools.html#functools.lru_cache) рдореЗрдВ рдФрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
## Recap { #recap }
рдЖрдк рдЕрдкрдиреА application рдХреА settings рдпрд╛ configurations рдХреЛ handle рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Pydantic Settings рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, Pydantic models рдХреА рдкреВрд░реА power рдХреЗ рд╕рд╛рдеред
* Dependency рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк testing рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
* рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде `.env` files рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
* `@lru_cache` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рд╣рд░ request рдХреЗ рд▓рд┐рдП dotenv file рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдкрдврд╝рдиреЗ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА testing рдХреЗ рджреМрд░рд╛рди рдЗрд╕реЗ override рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рднреА рдорд┐рд▓рддреА рд╣реИред

117
docs/hi/docs/advanced/stream-data.md

@ -0,0 +1,117 @@
# Data Stream рдХрд░реЗрдВ { #stream-data }
рдЕрдЧрд░ рдЖрдк рдРрд╕рд╛ data stream рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ JSON рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рддреЛ рдЖрдкрдХреЛ [JSON Lines Stream рдХрд░реЗрдВ](../tutorial/stream-json-lines.md)ред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк **рд╢реБрджреНрдз binary data** рдпрд╛ strings stream рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрдк рдРрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
/// note | рдиреЛрдЯ
FastAPI 0.134.0 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред
///
## рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ { #use-cases }
рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдЖрдк рд╢реБрджреНрдз strings stream рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реЛрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ рдХрд┐рд╕реА **AI LLM** service рдХреЗ output рд╕реЗред
рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ **рдмрдбрд╝реА binary files** stream рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рдЖрдк data рдХреЗ рдкреНрд░рддреНрдпреЗрдХ chunk рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп stream рдХрд░рддреЗ рд╣реИрдВ, рдмрд┐рдирд╛ рдкреВрд░реЗ data рдХреЛ рдПрдХ рд╕рд╛рде memory рдореЗрдВ рдкрдврд╝реЗред
рдЖрдк рдЗрд╕реА рддрд░рд╣ **video** рдпрд╛ **audio** рднреА stream рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ process рдФрд░ send рдХрд░рддреЗ рд╕рдордп generate рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
## `yield` рдХреЗ рд╕рд╛рде рдПрдХ `StreamingResponse` { #a-streamingresponse-with-yield }
рдЕрдЧрд░ рдЖрдк рдЕрдкрдиреЗ *path operation function* рдореЗрдВ `response_class=StreamingResponse` declare рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк data рдХреЗ рдкреНрд░рддреНрдпреЗрдХ chunk рдХреЛ рдХреНрд░рдо рд╕реЗ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП `yield` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
{* ../../docs_src/stream_data/tutorial001_py310.py ln[1:23] hl[20,23] *}
FastAPI data рдХреЗ рдкреНрд░рддреНрдпреЗрдХ chunk рдХреЛ `StreamingResponse` рдХреЛ рдЬреИрд╕рд╛ рд╣реИ рд╡реИрд╕рд╛ рд╣реА рджреЗрдЧрд╛, рдпрд╣ рдЙрд╕реЗ JSON рдпрд╛ рдХрд┐рд╕реА рд╕рдорд╛рди рдЪреАрдЬрд╝ рдореЗрдВ convert рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
### Non-async *path operation functions* { #non-async-path-operation-functions }
рдЖрдк regular `def` functions (`async` рдХреЗ рдмрд┐рдирд╛) рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕реА рддрд░рд╣ `yield` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
{* ../../docs_src/stream_data/tutorial001_py310.py ln[26:29] hl[27] *}
### Annotation рдирд╣реАрдВ { #no-annotation }
Streaming binary data рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ return type annotation declare рдХрд░рдиреЗ рдХреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдХреНрдпреЛрдВрдХрд┐ FastAPI data рдХреЛ Pydantic рдХреЗ рд╕рд╛рде JSON рдореЗрдВ convert рдХрд░рдиреЗ рдпрд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ serialize рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ type annotation рдХреЗрд╡рд▓ рдЖрдкрдХреЗ editor рдФрд░ tools рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╣реИ, FastAPI рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
{* ../../docs_src/stream_data/tutorial001_py310.py ln[32:35] hl[33] *}
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реИ рдХрд┐ `StreamingResponse` рдХреЗ рд╕рд╛рде рдЖрдкрдХреЗ рдкрд╛рд╕ type annotations рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛрдХрд░ data bytes рдХреЛ рдареАрдХ рд╡реИрд╕реЗ produce рдФрд░ encode рдХрд░рдиреЗ рдХреА **рд╕реНрд╡рддрдВрддреНрд░рддрд╛** рдФрд░ **рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА** рд╣реИ, рдЬреИрд╕реЗ рдЙрдиреНрд╣реЗрдВ рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред ЁЯдУ
### Bytes Stream рдХрд░реЗрдВ { #stream-bytes }
рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ strings рдХреЗ рдмрдЬрд╛рдп `bytes` stream рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
{* ../../docs_src/stream_data/tutorial001_py310.py ln[44:47] hl[47] *}
## рдПрдХ Custom `PNGStreamingResponse` { #a-custom-pngstreamingresponse }
рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, data bytes stream рдХрд┐рдП рдЧрдП рдереЗ, рд▓реЗрдХрд┐рди response рдореЗрдВ `Content-Type` header рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП client рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдЙрд╕реЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ data рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред
рдЖрдк `StreamingResponse` рдХреА рдПрдХ custom sub-class рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ `Content-Type` header рдХреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ data рдкрд░ set рдХрд░рддреА рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк stream рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ `PNGStreamingResponse` рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ `media_type` attribute рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ `Content-Type` header рдХреЛ `image/png` рдкрд░ set рдХрд░рддрд╛ рд╣реИ:
{* ../../docs_src/stream_data/tutorial002_py310.py ln[6,19:20] hl[20] *}
рдлрд┐рд░ рдЖрдк рдЕрдкрдиреЗ *path operation function* рдореЗрдВ `response_class=PNGStreamingResponse` рдореЗрдВ рдЗрд╕ рдирдИ class рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/stream_data/tutorial002_py310.py ln[23:27] hl[23] *}
### рдПрдХ File рдХрд╛ Simulation рдХрд░реЗрдВ { #simulate-a-file }
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо `io.BytesIO` рдХреЗ рд╕рд╛рде рдПрдХ file simulate рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдПрдХ file-like object рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ memory рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╡рд╣реА interface рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕рдХреЗ contents consume рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрд░ iterate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рд╣рдо рдХрд┐рд╕реА file рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
{* ../../docs_src/stream_data/tutorial002_py310.py ln[1:27] hl[3,12:13,25] *}
/// note | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
рдЕрдиреНрдп рджреЛ variables, `image_base64` рдФрд░ `binary_image`, Base64 рдореЗрдВ encoded рдПрдХ image рд╣реИрдВ, рдФрд░ рдлрд┐рд░ bytes рдореЗрдВ convert рдХрд┐рдП рдЧрдП рд╣реИрдВ, рддрд╛рдХрд┐ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ `io.BytesIO` рдХреЛ pass рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рддрд╛рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрд╕реА file рдореЗрдВ рд░рд╣ рд╕рдХреЗ рдФрд░ рдЖрдк рдЗрд╕реЗ copy рдХрд░рдХреЗ рдЬреИрд╕рд╛ рд╣реИ рд╡реИрд╕рд╛ рд╣реА run рдХрд░ рд╕рдХреЗрдВред ЁЯеЪ
///
`with` block рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ generator function (`yield` рд╡рд╛рд▓рд╛ function) рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж file-like object рдмрдВрдж рд╣реЛ рдЬрд╛рдПред рдпрд╛рдиреА, response рднреЗрдЬрдирд╛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рджред
рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдпрд╣ рдЙрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ fake in-memory file рд╣реИ (`io.BytesIO` рдХреЗ рд╕рд╛рде), рд▓реЗрдХрд┐рди рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ file рдХреЗ рд╕рд╛рде, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж file рдмрдВрдж рд╣реЛ рдЬрд╛рдПред
### Files рдФрд░ Async { #files-and-async }
рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, file-like objects default рд░реВрдк рд╕реЗ async рдФрд░ await рдХреЗ рд╕рд╛рде compatible рдирд╣реАрдВ рд╣реЛрддреЗред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдирдХреЗ рдкрд╛рд╕ `await file.read()` рдпрд╛ `async for chunk in file` рдирд╣реАрдВ рд╣реЛрддрд╛ред
рдФрд░ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рдирд╛ рдПрдХ blocking operation рд╣реЛрдЧрд╛ (рдЬреЛ event loop рдХреЛ block рдХрд░ рд╕рдХрддрд╛ рд╣реИ), рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ disk рдпрд╛ network рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
/// note | рдиреЛрдЯ
рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ exception рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ `io.BytesIO` object рдкрд╣рд▓реЗ рд╕реЗ memory рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрд╕реЗ рдкрдврд╝рдирд╛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ block рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рд▓реЗрдХрд┐рди рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд┐рд╕реА file рдпрд╛ file-like object рдХреЛ рдкрдврд╝рдирд╛ block рдХрд░реЗрдЧрд╛ред
///
event loop рдХреЛ block рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдмрд╕ *path operation function* рдХреЛ `async def` рдХреЗ рдмрдЬрд╛рдп regular `def` рдХреЗ рд╕рд╛рде declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рддрд░рд╣ FastAPI рдЗрд╕реЗ main loop рдХреЛ block рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП threadpool worker рдкрд░ run рдХрд░реЗрдЧрд╛ред
{* ../../docs_src/stream_data/tutorial002_py310.py ln[30:34] hl[31] *}
/// tip | рд╕реБрдЭрд╛рд╡
рдЕрдЧрд░ рдЖрдкрдХреЛ рдХрд┐рд╕реА async function рдХреЗ рдЕрдВрджрд░ рд╕реЗ blocking code call рдХрд░рдирд╛ рд╣реЛ, рдпрд╛ рдХрд┐рд╕реА blocking function рдХреЗ рдЕрдВрджрд░ рд╕реЗ async function call рдХрд░рдирд╛ рд╣реЛ, рддреЛ рдЖрдк [Asyncer](https://asyncer.tiangolo.com) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ FastAPI рдХреА рдПрдХ sibling library рд╣реИред
///
### `yield from` { #yield-from }
рдЬрдм рдЖрдк рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдкрд░ iterate рдХрд░ рд░рд╣реЗ рд╣реЛрдВ, рдЬреИрд╕реЗ рдХрд┐рд╕реА file-like object рдкрд░, рдФрд░ рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ item рдХреЗ рд▓рд┐рдП `yield` рдХрд░ рд░рд╣реЗ рд╣реЛрдВ, рддреЛ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ item рдХреЛ рд╕реАрдзреЗ yield рдХрд░рдиреЗ рдФрд░ `for` loop рдХреЛ skip рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `yield from` рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ FastAPI рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл Python рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд╛рдирдиреЗ рд▓рд╛рдпрдХ рдПрдХ рдЕрдЪреНрдЫрд╛ trick рд╣реИред ЁЯШО
{* ../../docs_src/stream_data/tutorial002_py310.py ln[37:40] hl[40] *}

88
docs/hi/docs/advanced/strict-content-type.md

@ -0,0 +1,88 @@
# рд╕рдЦреНрдд Content-Type рдЬрд╛рдБрдЪ { #strict-content-type-checking }
default рд░реВрдк рд╕реЗ, **FastAPI** JSON request bodies рдХреЗ рд▓рд┐рдП рд╕рдЦреНрдд `Content-Type` header рдЬрд╛рдБрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ body рдХреЛ JSON рдХреЗ рд░реВрдк рдореЗрдВ parse рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП JSON requests рдореЗрдВ рд╡реИрдз `Content-Type` header (рдЬреИрд╕реЗ `application/json`) **рд╣реЛрдирд╛ рд╣реА рдЪрд╛рд╣рд┐рдП**ред
## CSRF рдЬреЛрдЦрд┐рдо { #csrf-risk }
рдпрд╣ default рд╡реНрдпрд╡рд╣рд╛рд░ рдПрдХ рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рд╕реНрдерд┐рддрд┐ рдореЗрдВ **Cross-Site Request Forgery (CSRF)** рд╣рдорд▓реЛрдВ рдХреЗ рдПрдХ рд╡рд░реНрдЧ рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдпреЗ рд╣рдорд▓реЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдлрд╛рдпрджрд╛ рдЙрдард╛рддреЗ рд╣реИрдВ рдХрд┐ browsers scripts рдХреЛ рдмрд┐рдирд╛ рдХреЛрдИ CORS preflight check рдХрд┐рдП requests рднреЗрдЬрдиреЗ рджреЗрддреЗ рд╣реИрдВ, рдЬрдм рд╡реЗ:
* `Content-Type` header рдирд╣реАрдВ рд░рдЦрддреЗ (рдЬреИрд╕реЗ `Blob` body рдХреЗ рд╕рд╛рде `fetch()` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛)
* рдФрд░ рдХреЛрдИ authentication credentials рдирд╣реАрдВ рднреЗрдЬрддреЗред
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣рдорд▓рд╛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рддрдм relevant рд╣реЛрддрд╛ рд╣реИ рдЬрдм:
* application рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЪрд▓ рд░рд╣реА рд╣реЛ (рдЬреИрд╕реЗ `localhost` рдкрд░) рдпрд╛ рдХрд┐рд╕реА internal network рдореЗрдВ
* рдФрд░ application рдореЗрдВ рдХреЛрдИ authentication рди рд╣реЛ, рд╡рд╣ рдпрд╣ рдорд╛рдирддреА рд╣реЛ рдХрд┐ рдЙрд╕реА network рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реА рдХреЛрдИ рднреА request рднрд░реЛрд╕реЗрдордВрдж рд╣реЛ рд╕рдХрддреА рд╣реИред
## рдЙрджрд╛рд╣рд░рдг рд╣рдорд▓рд╛ { #example-attack }
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдПрдХ local AI agent рдЪрд▓рд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрдирд╛рддреЗ рд╣реИрдВред
рдпрд╣ рдпрд╣рд╛рдБ рдПрдХ API рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ
```
http://localhost:8000/v1/agents/multivac
```
рдпрд╣рд╛рдБ рдПрдХ frontend рднреА рд╣реИ
```
http://localhost:8000
```
/// tip | рд╕реБрдЭрд╛рд╡
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рджреЛрдиреЛрдВ рдХрд╛ host рд╕рдорд╛рди рд╣реИред
///
рдлрд┐рд░ frontend рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк AI agent рд╕реЗ рдЕрдкрдиреА рдУрд░ рд╕реЗ рдХрд╛рдо рдХрд░рд╡рд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ **рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ** рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЦреБрд▓реЗ internet рдкрд░ рдирд╣реАрдВ рд╣реИ, рдЖрдк **рдХреЛрдИ authentication setup рди рдХрд░рдиреЗ** рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рдмрд╕ local network рддрдХ access рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реБрдПред
рдлрд┐рд░ рдЖрдкрдХреЗ users рдореЗрдВ рд╕реЗ рдХреЛрдИ рдЗрд╕реЗ install рдХрд░рдХреЗ locally рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИред
рдлрд┐рд░ рд╡реЗ рдХреЛрдИ malicious website рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣
```
https://evilhackers.example.com
```
рдФрд░ рд╡рд╣ malicious website `Blob` body рдХреЗ рд╕рд╛рде `fetch()` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ local API рдкрд░ requests рднреЗрдЬрддреА рд╣реИ
```
http://localhost:8000/v1/agents/multivac
```
рднрд▓реЗ рд╣реА malicious website рдФрд░ local app рдХрд╛ host рдЕрд▓рдЧ рд╣реЛ, browser CORS preflight request trigger рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐:
* рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА authentication рдХреЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЗрд╕реЗ рдХреЛрдИ credentials рднреЗрдЬрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред
* browser рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ JSON рдирд╣реАрдВ рднреЗрдЬ рд░рд╣рд╛ рд╣реИ (`Content-Type` header рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг)ред
рдлрд┐рд░ malicious website local AI agent рд╕реЗ user рдХреЗ ex-boss рдХреЛ рдЧреБрд╕реНрд╕реЗ рднрд░реЗ messages рднреЗрдЬрд╡рд╛ рд╕рдХрддреА рд╣реИ... рдпрд╛ рдЙрд╕рд╕реЗ рднреА рдмреБрд░рд╛ред ЁЯШЕ
## рдЦреБрд▓рд╛ Internet { #open-internet }
рдЕрдЧрд░ рдЖрдкрдХреА app рдЦреБрд▓реЗ internet рдкрд░ рд╣реИ, рддреЛ рдЖрдк "network рдкрд░ рднрд░реЛрд╕рд╛" рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдХрд┐рд╕реА рдХреЛ рднреА рдмрд┐рдирд╛ authentication рдХреЗ privileged requests рднреЗрдЬрдиреЗ рдирд╣реАрдВ рджреЗрдВрдЧреЗред
Attackers рд╕реАрдзреЗ рдЖрдкрдХреА API рдкрд░ requests рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП script рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, browser interaction рдХреА рдХреЛрдИ рдЬрд░реВрд░рдд рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рд╕реА рднреА privileged endpoints рдХреЛ secure рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗред
рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ **рдпрд╣ рд╣рдорд▓рд╛ / рдЬреЛрдЦрд┐рдо рдЖрдк рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛**ред
рдпрд╣ рдЬреЛрдЦрд┐рдо рдФрд░ рд╣рдорд▓рд╛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рддрдм relevant рд╣реЛрддрд╛ рд╣реИ рдЬрдм app **local network** рдкрд░ рдЪрд▓рддреА рд╣реИ рдФрд░ рд╡рд╣реА **рдПрдХрдорд╛рддреНрд░ рдорд╛рдиреА рдЧрдИ рд╕реБрд░рдХреНрд╖рд╛** рд╣реЛрддреА рд╣реИред
## Content-Type рдХреЗ рдмрд┐рдирд╛ Requests рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ { #allowing-requests-without-content-type }
рдЕрдЧрд░ рдЖрдкрдХреЛ рдРрд╕реЗ clients рдХреЛ support рдХрд░рдирд╛ рд╣реИ рдЬреЛ `Content-Type` header рдирд╣реАрдВ рднреЗрдЬрддреЗ, рддреЛ рдЖрдк `strict_content_type=False` set рдХрд░рдХреЗ strict checking disable рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/strict_content_type/tutorial001_py310.py hl[4] *}
рдЗрд╕ setting рдХреЗ рд╕рд╛рде, рдЬрд┐рди requests рдореЗрдВ `Content-Type` header рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЙрдирдХреА body JSON рдХреЗ рд░реВрдк рдореЗрдВ parse рдХреА рдЬрд╛рдПрдЧреА, рдЬреЛ FastAPI рдХреЗ рдкреБрд░рд╛рдиреЗ versions рдЬреИрд╕рд╛ рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред
/// note | рдиреЛрдЯ
рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ configuration FastAPI 0.132.0 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред
///

67
docs/hi/docs/advanced/sub-applications.md

@ -0,0 +1,67 @@
# Sub Applications - Mounts { #sub-applications-mounts }
рдЕрдЧрд░ рдЖрдкрдХреЛ рджреЛ рд╕реНрд╡рддрдВрддреНрд░ FastAPI applications рдЪрд╛рд╣рд┐рдП, рдЬрд┐рдирдХрд╛ рдЕрдкрдирд╛ рд╕реНрд╡рддрдВрддреНрд░ OpenAPI рдФрд░ рдЕрдкрдиреА docs UIs рд╣реЛрдВ, рддреЛ рдЖрдк рдПрдХ рдореБрдЦреНрдп app рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ (рдпрд╛ рдЕрдзрд┐рдХ) sub-application(s) рдХреЛ "mount" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
## **FastAPI** application рдХреЛ Mount рдХрд░рдирд╛ { #mounting-a-fastapi-application }
"Mounting" рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ path рдореЗрдВ рдкреВрд░реА рддрд░рд╣ "рд╕реНрд╡рддрдВрддреНрд░" application рдЬреЛрдбрд╝рдирд╛, рдЬреЛ рдлрд┐рд░ рдЙрд╕ path рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд╕рдм рдХреБрдЫ handle рдХрд░рдиреЗ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрддрд╛ рд╣реИ, рдЙрд╕ sub-application рдореЗрдВ рдШреЛрд╖рд┐рдд _path operations_ рдХреЗ рд╕рд╛рдеред
### Top-level application { #top-level-application }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореБрдЦреНрдп, top-level **FastAPI** application рдФрд░ рдЙрд╕рдХреЗ *path operations* рдмрдирд╛рдПрдБ:
{* ../../docs_src/sub_applications/tutorial001_py310.py hl[3, 6:8] *}
### Sub-application { #sub-application }
рдлрд┐рд░, рдЕрдкрдиреА sub-application рдФрд░ рдЙрд╕рдХреЗ *path operations* рдмрдирд╛рдПрдБред
рдпрд╣ sub-application рдмрд╕ рдПрдХ рдФрд░ standard FastAPI application рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣реА рд╡рд╣ рд╣реИ рдЬрд┐рд╕реЗ "mounted" рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
{* ../../docs_src/sub_applications/tutorial001_py310.py hl[11, 14:16] *}
### Sub-application рдХреЛ mount рдХрд░реЗрдВ { #mount-the-sub-application }
рдЕрдкрдиреЗ top-level application, `app`, рдореЗрдВ sub-application, `subapi`, рдХреЛ mount рдХрд░реЗрдВред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕реЗ path `/subapi` рдкрд░ mount рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
{* ../../docs_src/sub_applications/tutorial001_py310.py hl[11, 19] *}
### Automatic API docs рджреЗрдЦреЗрдВ { #check-the-automatic-api-docs }
рдЕрдм, `fastapi` command рдЪрд▓рд╛рдПрдБ:
<div class="termy">
```console
$ fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
</div>
рдФрд░ docs рдХреЛ [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) рдкрд░ рдЦреЛрд▓реЗрдВред
рдЖрдк рдореБрдЦреНрдп app рдХреЗ рд▓рд┐рдП automatic API docs рджреЗрдЦреЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдЙрд╕рдХреЗ рдЕрдкрдиреЗ _path operations_ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ:
<img src="/img/tutorial/sub-applications/image01.png">
рдФрд░ рдлрд┐рд░, sub-application рдХреЗ рд▓рд┐рдП docs рдХреЛ [http://127.0.0.1:8000/subapi/docs](http://127.0.0.1:8000/subapi/docs) рдкрд░ рдЦреЛрд▓реЗрдВред
рдЖрдк sub-application рдХреЗ рд▓рд┐рдП automatic API docs рджреЗрдЦреЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдЙрд╕рдХреЗ рдЕрдкрдиреЗ _path operations_ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ, рд╕рднреА рд╕рд╣реА sub-path prefix `/subapi` рдХреЗ рдЕрдВрддрд░реНрдЧрдд:
<img src="/img/tutorial/sub-applications/image02.png">
рдЕрдЧрд░ рдЖрдк рджреЛрдиреЛрдВ user interfaces рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рд╕рд╛рде interact рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рд╕рд╣реА рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ browser рд╣рд░ specific app рдпрд╛ sub-app рд╕реЗ рдмрд╛рдд рдХрд░ рдкрд╛рдПрдЧрд╛ред
### рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг: `root_path` { #technical-details-root-path }
рдЬрдм рдЖрдк рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рддрд░реАрдХреЗ рд╕реЗ рдХреЛрдИ sub-application mount рдХрд░рддреЗ рд╣реИрдВ, рддреЛ FastAPI sub-application рдХреЗ рд▓рд┐рдП mount path communicate рдХрд░рдиреЗ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдЧрд╛, ASGI specification рдХреЗ рдПрдХ mechanism рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд┐рд╕реЗ `root_path` рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рддрд░рд╣, sub-application рдХреЛ рдкрддрд╛ рд╣реЛрдЧрд╛ рдХрд┐ docs UI рдХреЗ рд▓рд┐рдП рдЙрд╕ path prefix рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
рдФрд░ sub-application рдХреА рдЕрдкрдиреА mounted sub-applications рднреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдФрд░ рд╕рдм рдХреБрдЫ рд╕рд╣реА рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ FastAPI рдЗрди рд╕рднреА `root_path`s рдХреЛ рдЕрдкрдиреЗ рдЖрдк handle рдХрд░рддрд╛ рд╣реИред
рдЖрдк `root_path` рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╣ [Behind a Proxy](behind-a-proxy.md) рд╡рд╛рд▓реЗ section рдореЗрдВ рдФрд░ рд╕реАрдЦреЗрдВрдЧреЗред

126
docs/hi/docs/advanced/templates.md

@ -0,0 +1,126 @@
# Templates { #templates }
рдЖрдк **FastAPI** рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рдкрд╕рдВрдж рдХрд╛ рдХреЛрдИ рднреА template engine рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдЖрдо рд╡рд┐рдХрд▓реНрдк Jinja2 рд╣реИ, рд╡рд╣реА рдЬрд┐рд╕реЗ Flask рдФрд░ рдЕрдиреНрдп tools рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ configure рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП utilities рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рд╕реАрдзреЗ рдЕрдкрдиреЗ **FastAPI** application рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (Starlette рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ)ред
## Dependencies install рдХрд░реЗрдВ { #install-dependencies }
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдПрдХ [virtual environment](../virtual-environments.md) рдмрдирд╛рдПрдБ, рдЙрд╕реЗ activate рдХрд░реЗрдВ, рдФрд░ `jinja2` install рдХрд░реЗрдВ:
<div class="termy">
```console
$ pip install jinja2
---> 100%
```
</div>
## `Jinja2Templates` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ { #using-jinja2templates }
* `Jinja2Templates` import рдХрд░реЗрдВред
* рдПрдХ `templates` object рдмрдирд╛рдПрдБ рдЬрд┐рд╕реЗ рдЖрдк рдмрд╛рдж рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВред
* рдЙрд╕ *path operation* рдореЗрдВ рдПрдХ `Request` parameter declare рдХрд░реЗрдВ рдЬреЛ рдПрдХ template return рдХрд░реЗрдЧрд╛ред
* рдЖрдкрдиреЗ рдЬреЛ `templates` рдмрдирд╛рдпрд╛ рд╣реИ, рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ `TemplateResponse` render рдФрд░ return рдХрд░реЗрдВ; template рдХрд╛ рдирд╛рдо, request object, рдФрд░ key-value pairs рд╡рд╛рд▓реА рдПрдХ "context" dictionary pass рдХрд░реЗрдВ, рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ Jinja2 template рдХреЗ рдЕрдВрджрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
{* ../../docs_src/templates/tutorial001_py310.py hl[4,11,15:18] *}
/// note | рдиреЛрдЯ
FastAPI 0.108.0, Starlette 0.29.0 рд╕реЗ рдкрд╣рд▓реЗ, `name` рдкрд╣рд▓рд╛ parameter рдерд╛ред
рд╕рд╛рде рд╣реА, рдЙрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ versions рдореЗрдВ, `request` object рдХреЛ Jinja2 рдХреЗ context рдореЗрдВ key-value pairs рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ pass рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ред
///
/// tip | рд╕реБрдЭрд╛рд╡
`response_class=HTMLResponse` declare рдХрд░рдиреЗ рд╕реЗ docs UI рдпрд╣ рдЬрд╛рди рдкрд╛рдПрдЧрд╛ рдХрд┐ response HTML рд╣реЛрдЧрд╛ред
///
/// note | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
рдЖрдк `from starlette.templating import Jinja2Templates` рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
**FastAPI** рдЖрдкрдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, developer рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд╣реА `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 %}
...рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ pass рдХрд┐рдП рдЧрдП "context" `dict` рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ `id` рджрд┐рдЦрд╛рдПрдЧрд╛:
```Python
{"id": id}
```
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, `42` рдХреА ID рдХреЗ рд╕рд╛рде, рдпрд╣ render рд╣реЛрдЧрд╛:
```html
Item ID: 42
```
### Template `url_for` Arguments { #template-url-for-arguments }
рдЖрдк template рдХреЗ рдЕрдВрджрд░ `url_for()` рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ arguments рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╣реА arguments рд▓реЗрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ *path operation function* рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗред
рдЗрд╕рд▓рд┐рдП, рдЗрд╕ section рдХреЗ рд╕рд╛рде:
{% raw %}
```jinja
<a href="{{ url_for('read_item', id=id) }}">
```
{% endraw %}
...рдпрд╣ рдЙрд╕реА URL рдХрд╛ link generate рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕реЗ *path operation function* `read_item(id=id)` handle рдХрд░реЗрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, `42` рдХреА ID рдХреЗ рд╕рд╛рде, рдпрд╣ render рд╣реЛрдЧрд╛:
```html
<a href="/items/42">
```
## Templates рдФрд░ static files { #templates-and-static-files }
рдЖрдк template рдХреЗ рдЕрдВрджрд░ `url_for()` рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрди `StaticFiles` рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдиреЗ `name="static"` рдХреЗ рд╕рд╛рде mount рдХрд┐рдпрд╛ рд╣реИред
```jinja hl_lines="4"
{!../../docs_src/templates/templates/item.html!}
```
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрд╣ `static/styles.css` рдкрд░ рдореМрдЬреВрдж CSS file рд╕реЗ link рдХрд░реЗрдЧрд╛:
```CSS hl_lines="4"
{!../../docs_src/templates/static/styles.css!}
```
рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк `StaticFiles` рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ CSS file рдЖрдкрдХреЗ **FastAPI** application рджреНрд╡рд╛рд░рд╛ URL `/static/styles.css` рдкрд░ automatic рд░реВрдк рд╕реЗ serve рдХреА рдЬрд╛рдПрдЧреАред
## рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг { #more-details }
рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдореЗрдВ templates рдХреЛ test рдХрд░рдирд╛ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, [templates рдкрд░ Starlette рдХреЗ docs](https://www.starlette.dev/templates/) рджреЗрдЦреЗрдВред

53
docs/hi/docs/advanced/testing-dependencies.md

@ -0,0 +1,53 @@
# Overrides рдХреЗ рд╕рд╛рде Dependencies рдХреА Testing { #testing-dependencies-with-overrides }
## Testing рдХреЗ рджреМрд░рд╛рди dependencies рдХреЛ override рдХрд░рдирд╛ { #overriding-dependencies-during-testing }
рдХреБрдЫ scenarios рд╣реЛрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдк testing рдХреЗ рджреМрд░рд╛рди рдХрд┐рд╕реА dependency рдХреЛ override рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ original dependency рдЪрд▓реЗ (рдФрд░ рди рд╣реА рдЙрд╕рдХреА рдХреЛрдИ sub-dependencies рдЪрд▓реЗрдВ)ред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдПрдХ рдЕрд▓рдЧ dependency рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ tests рдХреЗ рджреМрд░рд╛рди рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдЧреА (рд╕рдВрднрд╡рддрдГ рдХреЗрд╡рд▓ рдХреБрдЫ рдЦрд╛рд╕ tests рдореЗрдВ), рдФрд░ рд╡рд╣ рдПрдХ рдРрд╕рд╛ value рджреЗрдЧреА рдЬрд┐рд╕реЗ рд╡рд╣рд╛рдБ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬрд╣рд╛рдБ original dependency рдХрд╛ value рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ред
### Use cases: external service { #use-cases-external-service }
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ external authentication provider рд╣реЛ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ call рдХрд░рдирд╛ рд╣реЛред
рдЖрдк рдЙрд╕реЗ рдПрдХ token рднреЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣ рдПрдХ authenticated user рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдпрд╣ provider рдЖрдкрд╕реЗ рдкреНрд░рддрд┐ request рд╢реБрд▓реНрдХ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ call рдХрд░рдиреЗ рдореЗрдВ tests рдХреЗ рд▓рд┐рдП рдПрдХ fixed mock user рд░рдЦрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред
рдЖрдк рд╢рд╛рдпрдж external provider рдХреЛ рдПрдХ рдмрд╛рд░ test рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ test рдХреЗ рд▓рд┐рдП рдЙрд╕реЗ call рдХрд░рдирд╛ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдЙрд╕ dependency рдХреЛ override рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрд╕ provider рдХреЛ call рдХрд░рддреА рд╣реИ, рдФрд░ рдЕрдкрдиреА tests рдХреЗ рд▓рд┐рдП рдПрдХ custom dependency рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ mock user рд▓реМрдЯрд╛рддреА рд╣реИред
### `app.dependency_overrides` attribute рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ { #use-the-app-dependency-overrides-attribute }
рдЗрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреА **FastAPI** application рдореЗрдВ рдПрдХ attribute `app.dependency_overrides` рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдПрдХ simple `dict` рд╣реИред
Testing рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА dependency рдХреЛ override рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк key рдХреЗ рд░реВрдк рдореЗрдВ original dependency (рдПрдХ function) рд░рдЦрддреЗ рд╣реИрдВ, рдФрд░ value рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдирд╛ dependency override (рджреВрд╕рд░рд╛ function) рд░рдЦрддреЗ рд╣реИрдВред
рдФрд░ рдлрд┐рд░ **FastAPI** original dependency рдХреА рдмрдЬрд╛рдп рдЙрд╕ override рдХреЛ call рдХрд░реЗрдЧрд╛ред
{* ../../docs_src/dependency_testing/tutorial001_an_py310.py hl[26:27,30] *}
/// tip | рд╕реБрдЭрд╛рд╡
рдЖрдк рдЕрдкрдиреА **FastAPI** application рдореЗрдВ рдХрд╣реАрдВ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЧрдИ dependency рдХреЗ рд▓рд┐рдП dependency override set рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Original dependency рдХрд┐рд╕реА *path operation function*, рдХрд┐рд╕реА *path operation decorator* (рдЬрдм рдЖрдк return value рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ), рдХрд┐рд╕реА `.include_router()` call рдЖрджрд┐ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИред
FastAPI рдлрд┐рд░ рднреА рдЙрд╕реЗ override рдХрд░ рдкрд╛рдПрдЧрд╛ред
///
рдлрд┐рд░ рдЖрдк `app.dependency_overrides` рдХреЛ рдПрдХ рдЦрд╛рд▓реА `dict` рдкрд░ set рдХрд░рдХреЗ рдЕрдкрдиреЗ overrides reset рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ):
```Python
app.dependency_overrides = {}
```
/// tip | рд╕реБрдЭрд╛рд╡
рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА dependency рдХреЛ рдХреЗрд╡рд▓ рдХреБрдЫ tests рдХреЗ рджреМрд░рд╛рди override рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк test рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ (test function рдХреЗ рдЕрдВрджрд░) override set рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ (test function рдХреЗ рдЕрдВрдд рдореЗрдВ) рдЙрд╕реЗ reset рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
///

12
docs/hi/docs/advanced/testing-events.md

@ -0,0 +1,12 @@
# Testing Events: lifespan рдФрд░ startup - shutdown { #testing-events-lifespan-and-startup-shutdown }
рдЬрдм рдЖрдкрдХреЛ рдЕрдкрдиреЗ tests рдореЗрдВ `lifespan` рдЪрд▓рд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛ, рддреЛ рдЖрдк `with` statement рдХреЗ рд╕рд╛рде `TestClient` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/app_testing/tutorial004_py310.py hl[9:15,18,27:28,30:32,41:43] *}
рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг ["рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Starlette documentation site рдореЗрдВ tests рдореЗрдВ lifespan рдЪрд▓рд╛рдирд╛ред"](https://www.starlette.dev/lifespan/#running-lifespan-in-tests) рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
deprecated `startup` рдФрд░ `shutdown` event рдХреЗ рд▓рд┐рдП, рдЖрдк `TestClient` рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/app_testing/tutorial003_py310.py hl[9:12,20:24] *}

13
docs/hi/docs/advanced/testing-websockets.md

@ -0,0 +1,13 @@
# WebSockets рдХреА Testing { #testing-websockets }
рдЖрдк WebSockets рдХреЛ test рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА `TestClient` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЖрдк `TestClient` рдХреЛ рдПрдХ `with` statement рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, WebSocket рд╕реЗ connect рдХрд░рддреЗ рд╣реБрдП:
{* ../../docs_src/app_testing/tutorial002_py310.py hl[27:31] *}
/// note | рдиреЛрдЯ
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, Starlette рдХреА documentation рдореЗрдВ [WebSockets рдХреА testing](https://www.starlette.dev/testclient/#testing-websocket-sessions) рджреЗрдЦреЗрдВред
///

56
docs/hi/docs/advanced/using-request-directly.md

@ -0,0 +1,56 @@
# Request рдХреЛ рд╕реАрдзреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ { #using-the-request-directly }
рдЕрдм рддрдХ, рдЖрдк request рдХреЗ рдЬрд┐рди рд╣рд┐рд╕реНрд╕реЛрдВ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЙрдирдХреЗ types рдХреЗ рд╕рд╛рде declare рдХрд░рддреЗ рд░рд╣реЗ рд╣реИрдВред
Data рд▓реЗрдирд╛:
* path рд╕реЗ parameters рдХреЗ рд░реВрдк рдореЗрдВред
* Headersред
* Cookiesред
* рдЖрджрд┐ред
рдФрд░ рдРрд╕рд╛ рдХрд░рдХреЗ, **FastAPI** рдЙрд╕ data рдХреЛ validate рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЙрд╕реЗ convert рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЖрдкрдХреА API рдХреЗ рд▓рд┐рдП documentation рдЕрдкрдиреЗ-рдЖрдк generate рдХрд░ рд░рд╣рд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ `Request` object рдХреЛ рд╕реАрдзреЗ access рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛ рд╕рдХрддреА рд╣реИред
## `Request` object рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд░рдг { #details-about-the-request-object }
рдХреНрдпреЛрдВрдХрд┐ **FastAPI** рдЕрд╕рд▓ рдореЗрдВ рдиреАрдЪреЗ рд╕реЗ **Starlette** рд╣реИ, рдЬрд┐рд╕рдХреЗ рдКрдкрд░ рдХрдИ tools рдХреА рдПрдХ layer рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рдЬрд╝рд░реВрд░рдд рд╣реЛ, рдЖрдк Starlette рдХреЗ [`Request`](https://www.starlette.dev/requests/) object рдХреЛ рд╕реАрдзреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реЛрдЧрд╛ рдХрд┐ рдЕрдЧрд░ рдЖрдк `Request` object рд╕реЗ рд╕реАрдзреЗ data рд▓реЗрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, body рдкрдврд╝рддреЗ рд╣реИрдВ), рддреЛ FastAPI рдЙрд╕реЗ validate, convert рдпрд╛ document рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ (OpenAPI рдХреЗ рд╕рд╛рде, automatic API user interface рдХреЗ рд▓рд┐рдП)ред
рд╣рд╛рд▓рд╛рдБрдХрд┐ рдХреЛрдИ рднреА рдЕрдиреНрдп parameter рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ declare рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Pydantic model рдХреЗ рд╕рд╛рде body), рд╡рд╣ рдлрд┐рд░ рднреА validate, convert, annotate рдЖрджрд┐ рд╣реЛрдЧрд╛ред
рд▓реЗрдХрд┐рди рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдБ `Request` object рд▓реЗрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИред
## `Request` object рдХреЛ рд╕реАрдзреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ { #use-the-request-object-directly }
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдЕрдкрдиреА *path operation function* рдХреЗ рдЕрдВрджрд░ client рдХрд╛ IP address/host рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ request рдХреЛ рд╕реАрдзреЗ access рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
{* ../../docs_src/using_request_directly/tutorial001_py310.py hl[1,7:8] *}
`Request` type рд╡рд╛рд▓реЗ *path operation function* parameter рдХреЛ declare рдХрд░рдХреЗ, **FastAPI** рдЬрд╛рди рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдЙрд╕ parameter рдореЗрдВ `Request` pass рдХрд░рдирд╛ рд╣реИред
/// tip | рд╕реБрдЭрд╛рд╡
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо request parameter рдХреЗ рд╕рд╛рде рдПрдХ path parameter declare рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, path parameter extract рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, validate рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, specified type рдореЗрдВ convert рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ OpenAPI рдХреЗ рд╕рд╛рде annotate рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕реА рддрд░рд╣, рдЖрдк рдХрд┐рд╕реА рднреА рдЕрдиреНрдп parameter рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рд╛рде рд╣реА `Request` рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
///
## `Request` documentation { #request-documentation }
рдЖрдк [`Request` object рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ official Starlette documentation site](https://www.starlette.dev/requests/) рдкрд░ рдФрд░ рд╡рд┐рд╡рд░рдг рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
/// note | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
рдЖрдк `from starlette.requests import Request` рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
**FastAPI** рдЗрд╕реЗ рд╕реАрдзреЗ рд╕рд┐рд░реНрдл рдЖрдкрдХреА, developer рдХреА, рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕реАрдзреЗ Starlette рд╕реЗ рдЖрддрд╛ рд╣реИред
///

186
docs/hi/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 рдХрд░реЗрдВ { #install-websockets }
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдПрдХ [virtual environment](../virtual-environments.md) рдмрдирд╛рдПрдБ, рдЙрд╕реЗ activate рдХрд░реЗрдВ, рдФрд░ `websockets` install рдХрд░реЗрдВ (рдПрдХ Python library рдЬреЛ "WebSocket" protocol рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрд╕рд╛рди рдмрдирд╛рддреА рд╣реИ):
<div class="termy">
```console
$ pip install websockets
---> 100%
```
</div>
## WebSockets client { #websockets-client }
### production рдореЗрдВ { #in-production }
рдЖрдкрдХреЗ production system рдореЗрдВ, рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЗ рдкрд╛рд╕ React, Vue.js рдпрд╛ Angular рдЬреИрд╕реЗ рдЖрдзреБрдирд┐рдХ framework рд╕реЗ рдмрдирд╛ frontend рд╣реЛрдЧрд╛ред
рдФрд░ рдЕрдкрдиреЗ backend рдХреЗ рд╕рд╛рде WebSockets рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рдВрднрд╡рддрдГ рдЕрдкрдиреЗ frontend рдХреА utilities рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ native mobile application рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬреЛ рд╕реАрдзреЗ native code рдореЗрдВ рдЖрдкрдХреЗ WebSocket backend рд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░рддреА рд╣реЛред
рдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ WebSocket endpoint рд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдФрд░ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
---
рд▓реЗрдХрд┐рди рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреБрдЫ JavaScript рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╣реБрдд рд╕рд░рд▓ HTML document рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд╕рдм рдХреБрдЫ рдПрдХ рд▓рдВрдмреА string рдХреЗ рдЕрдВрджрд░ред
рдмреЗрд╢рдХ, рдпрд╣ optimal рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдк рдЗрд╕реЗ production рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
production рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдКрдкрд░ рджрд┐рдП рдЧрдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛрдЧрд╛ред
рд▓реЗрдХрд┐рди WebSockets рдХреЗ server-side рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рдПрдХ working рдЙрджрд╛рд╣рд░рдг рдкрд╛рдиреЗ рдХрд╛ рдпрд╣ рд╕рдмрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХрд╛ рд╣реИ:
{* ../../docs_src/websockets_/tutorial001_py310.py hl[2,6:38,41:43] *}
## рдПрдХ `websocket` рдмрдирд╛рдПрдБ { #create-a-websocket }
рдЕрдкрдиреЗ **FastAPI** application рдореЗрдВ, рдПрдХ `websocket` рдмрдирд╛рдПрдБ:
{* ../../docs_src/websockets_/tutorial001_py310.py hl[1,46:47] *}
/// note | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
рдЖрдк `from starlette.websockets import WebSocket` рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
**FastAPI** рд╡рд╣реА `WebSocket` рд╕реАрдзреЗ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддрд╛ рд╣реИ, рд╕рд┐рд░реНрдлрд╝ рдЖрдкрдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, developer рдХреЗ рд░реВрдк рдореЗрдВред рд▓реЗрдХрд┐рди рдпрд╣ рд╕реАрдзреЗ Starlette рд╕реЗ рдЖрддрд╛ рд╣реИред
///
## messages рдХрд╛ await рдХрд░реЗрдВ рдФрд░ messages рднреЗрдЬреЗрдВ { #await-for-messages-and-send-messages }
рдЕрдкрдиреЗ WebSocket route рдореЗрдВ рдЖрдк messages рдХреЗ рд▓рд┐рдП `await` рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ messages рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред
{* ../../docs_src/websockets_/tutorial001_py310.py hl[48:52] *}
рдЖрдк binary, text, рдФрд░ JSON data receive рдФрд░ send рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
## рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдБ { #try-it }
рдЕрдкрдирд╛ code `main.py` file рдореЗрдВ рд░рдЦреЗрдВ рдФрд░ рдлрд┐рд░ рдЕрдкрдирд╛ application рдЪрд▓рд╛рдПрдБ:
<div class="termy">
```console
$ fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
</div>
рдЕрдкрдиреЗ browser рдореЗрдВ [http://127.0.0.1:8000](http://127.0.0.1:8000) рдЦреЛрд▓реЗрдВред
рдЖрдкрдХреЛ рдРрд╕рд╛ рдПрдХ рд╕рд░рд▓ page рджрд┐рдЦреЗрдЧрд╛:
<img src="/img/tutorial/websockets/image01.png">
рдЖрдк input box рдореЗрдВ messages рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ:
<img src="/img/tutorial/websockets/image02.png">
рдФрд░ WebSockets рдХреЗ рд╕рд╛рде рдЖрдкрдХрд╛ **FastAPI** application рдЬрд╡рд╛рдм рджреЗрдЧрд╛:
<img src="/img/tutorial/websockets/image03.png">
рдЖрдк рдХрдИ messages рднреЗрдЬ (рдФрд░ receive рдХрд░) рд╕рдХрддреЗ рд╣реИрдВ:
<img src="/img/tutorial/websockets/image04.png">
рдФрд░ рд╡реЗ рд╕рднреА рдЙрд╕реА 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] *}
/// note | рдиреЛрдЯ
рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ WebSocket рд╣реИ, рдЗрд╕рд▓рд┐рдП `HTTPException` raise рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдо `WebSocketException` raise рдХрд░рддреЗ рд╣реИрдВред
рдЖрдк [specification рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд valid codes](https://tools.ietf.org/html/rfc6455#section-7.4.1) рдореЗрдВ рд╕реЗ рдПрдХ closing code рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
///
### dependencies рдХреЗ рд╕рд╛рде WebSockets рдЖрдЬрд╝рдорд╛рдПрдБ { #try-the-websockets-with-dependencies }
рдЕрдкрдирд╛ application рдЪрд▓рд╛рдПрдБ:
<div class="termy">
```console
$ fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
</div>
рдЕрдкрдиреЗ browser рдореЗрдВ [http://127.0.0.1:8000](http://127.0.0.1:8000) рдЦреЛрд▓реЗрдВред
рд╡рд╣рд╛рдБ рдЖрдк рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
* path рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ "Item ID"ред
* query parameter рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ "Token"ред
/// tip | рд╕реБрдЭрд╛рд╡
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ query `token` рдХреЛ рдПрдХ dependency рджреНрд╡рд╛рд░рд╛ handle рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
///
рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдк WebSocket connect рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ messages рднреЗрдЬ рдФрд░ receive рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
<img src="/img/tutorial/websockets/image05.png">
## disconnections рдФрд░ рдХрдИ clients рдХреЛ handle рдХрд░рдирд╛ { #handling-disconnections-and-multiple-clients }
рдЬрдм WebSocket connection рдмрдВрдж рд╣реЛрддрд╛ рд╣реИ, рддреЛ `await websocket.receive_text()` рдПрдХ `WebSocketDisconnect` exception raise рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕реЗ рдЖрдк рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреА рддрд░рд╣ catch рдФрд░ handle рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
{* ../../docs_src/websockets_/tutorial003_py310.py hl[79:81] *}
рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП:
* app рдХреЛ рдХрдИ browser tabs рдореЗрдВ рдЦреЛрд▓реЗрдВред
* рдЙрдирд╕реЗ messages рд▓рд┐рдЦреЗрдВред
* рдлрд┐рд░ tabs рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдмрдВрдж рдХрд░реЗрдВред
рдЗрд╕рд╕реЗ `WebSocketDisconnect` exception raise рд╣реЛрдЧрд╛, рдФрд░ рдмрд╛рдХреА рд╕рднреА clients рдХреЛ рдРрд╕рд╛ message рдорд┐рд▓реЗрдЧрд╛:
```
Client #1596980209979 left the chat
```
/// tip | рд╕реБрдЭрд╛рд╡
рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ app рдПрдХ minimal рдФрд░ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрдИ WebSocket connections рдХреЛ messages рдХреИрд╕реЗ handle рдФрд░ broadcast рдХрд┐рдП рдЬрд╛рдПрдБред
рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐, рдЪреВрдБрдХрд┐ рд╕рдм рдХреБрдЫ memory рдореЗрдВ, рдПрдХ рд╣реА list рдореЗрдВ handle рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рддрдм рддрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ process рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдПрдХ single process рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдЕрдЧрд░ рдЖрдкрдХреЛ рдХреБрдЫ рдРрд╕рд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ FastAPI рдХреЗ рд╕рд╛рде integrate рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд▓реЗрдХрд┐рди рдЬреЛ рдЕрдзрд┐рдХ robust рд╣реЛ, Redis, PostgreSQL рдпрд╛ рдЕрдиреНрдп рджреНрд╡рд╛рд░рд╛ supported рд╣реЛ, рддреЛ [encode/broadcaster](https://github.com/encode/broadcaster) рджреЗрдЦреЗрдВред
///
## рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА { #more-info }
рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрдирдХреЗ рд▓рд┐рдП Starlette рдХрд╛ documentation рджреЗрдЦреЗрдВ:
* [`WebSocket` class](https://www.starlette.dev/websockets/)ред
* [Class-based WebSocket handling](https://www.starlette.dev/endpoints/#websocketendpoint)ред

51
docs/hi/docs/advanced/wsgi.md

@ -0,0 +1,51 @@
# WSGI рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ - Flask, Django, рдЕрдиреНрдп { #including-wsgi-flask-django-others }
рдЖрдк WSGI applications рдХреЛ mount рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдЖрдкрдиреЗ [Sub Applications - Mounts](sub-applications.md), [Proxy рдХреЗ рдкреАрдЫреЗ](behind-a-proxy.md) рдореЗрдВ рджреЗрдЦрд╛ред
рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЖрдк `WSGIMiddleware` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреА WSGI application рдХреЛ wrap рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Flask, Django, рдЖрджрд┐ред
## `WSGIMiddleware` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ { #using-wsgimiddleware }
/// note | рдиреЛрдЯ
рдЗрд╕рдХреЗ рд▓рд┐рдП `a2wsgi` install рдХрд░рдирд╛ required рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП `pip install a2wsgi` рдХреЗ рд╕рд╛рдеред
///
рдЖрдкрдХреЛ `a2wsgi` рд╕реЗ `WSGIMiddleware` import рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдлрд┐рд░ WSGI (рдЬреИрд╕реЗ Flask) app рдХреЛ middleware рдХреЗ рд╕рд╛рде wrap рдХрд░реЗрдВред
рдФрд░ рдлрд┐рд░ рдЙрд╕реЗ рдХрд┐рд╕реА path рдХреЗ рдЕрдВрддрд░реНрдЧрдд mount рдХрд░реЗрдВред
{* ../../docs_src/wsgi/tutorial001_py310.py hl[1,3,23] *}
/// note | рдиреЛрдЯ
рдкрд╣рд▓реЗ, `fastapi.middleware.wsgi` рд╕реЗ `WSGIMiddleware` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рдереА, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ deprecated рд╣реИред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп `a2wsgi` package рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИред рдЙрдкрдпреЛрдЧ рд╡рд╣реА рд░рд╣рддрд╛ рд╣реИред
рдмрд╕ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ `a2wsgi` package install рд╣реИ рдФрд░ рдЖрдк `a2wsgi` рд╕реЗ `WSGIMiddleware` рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ import рдХрд░рддреЗ рд╣реИрдВред
///
## рдЗрд╕реЗ рдЬрд╛рдБрдЪреЗрдВ { #check-it }
рдЕрдм, path `/v1/` рдХреЗ рдЕрдВрддрд░реНрдЧрдд рд╣рд░ request рдХреЛ Flask application рджреНрд╡рд╛рд░рд╛ handle рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдФрд░ рдмрд╛рдХреА рдХреЛ **FastAPI** рджреНрд╡рд╛рд░рд╛ handle рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрджрд┐ рдЖрдк рдЗрд╕реЗ run рдХрд░рддреЗ рд╣реИрдВ рдФрд░ [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"
}
```

24
docs/hi/docs/deployment/cloud.md

@ -0,0 +1,24 @@
# Cloud Providers рдкрд░ FastAPI Deploy рдХрд░реЗрдВ { #deploy-fastapi-on-cloud-providers }
рдЖрдк рдЕрдкрдиреА FastAPI application deploy рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╕реНрддреБрддрдГ **рдХрд┐рд╕реА рднреА cloud provider** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореБрдЦреНрдп cloud providers рдХреЗ рдкрд╛рд╕ рдЙрдирдХреЗ рд╕рд╛рде FastAPI deploy рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП guides рд╣реЛрддреА рд╣реИрдВред
## FastAPI Cloud { #fastapi-cloud }
**[FastAPI Cloud](https://fastapicloud.com)** рдХреЛ **FastAPI** рдХреЗ рдкреАрдЫреЗ рдореМрдЬреВрдж рдЙрд╕реА author рдФрд░ team рдиреЗ рдмрдирд╛рдпрд╛ рд╣реИред
рдпрд╣ рдиреНрдпреВрдирддрдо рдкреНрд░рдпрд╛рд╕ рдХреЗ рд╕рд╛рде API рдХреЛ **build**, **deploy**, рдФрд░ **access** рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред
рдпрд╣ FastAPI рдХреЗ рд╕рд╛рде apps рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдЙрд╕реА **developer experience** рдХреЛ рдЙрдиреНрд╣реЗрдВ cloud рдкрд░ **deploy** рдХрд░рдиреЗ рдореЗрдВ рднреА рд▓рд╛рддрд╛ рд╣реИред ЁЯОЙ
FastAPI Cloud, *FastAPI and friends* open source projects рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ sponsor рдФрд░ funding provider рд╣реИред тЬи
## Cloud Providers - Sponsors { #cloud-providers-sponsors }
рдХреБрдЫ рдЕрдиреНрдп cloud providers рднреА тЬи [**FastAPI рдХреЛ sponsor рдХрд░рддреЗ рд╣реИрдВ**](https://github.com/sponsors/tiangolo) тЬиред ЁЯЩЗ
рдЖрдк рдЙрдирдХреА guides рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдФрд░ рдЙрдирдХреА services рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрди рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
* [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)

321
docs/hi/docs/deployment/concepts.md

@ -0,0 +1,321 @@
# Deployments рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ { #deployments-concepts }
рдЬрдм рдЖрдк рдПрдХ **FastAPI** application, рдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА web API, deploy рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдИ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВ рдЬрд┐рдирдХреА рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдкрд░рд╡рд╛рд╣ рд╣реЛрдЧреА, рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдЕрдкрдиреА application рдХреЛ **deploy рдХрд░рдиреЗ** рдХрд╛ **рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд** рддрд░реАрдХрд╛ рдвреВрдБрдв рд╕рдХрддреЗ рд╣реИрдВред
рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ рд╣реИрдВ:
* рд╕реБрд░рдХреНрд╖рд╛ - HTTPS
* startup рдкрд░ рдЪрд▓рдирд╛
* Restarts
* Replication (рдЪрд▓ рд░рд╣реЗ processes рдХреА рд╕рдВрдЦреНрдпрд╛)
* Memory
* рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рдкрд┐рдЫрд▓реЗ steps
рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпреЗ **deployments** рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдВрдЧреЗред
рдЕрдВрдд рдореЗрдВ, рдЕрдВрддрд┐рдо рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ **API clients рдХреЛ serve** рдХрд░ рд╕рдХреЗрдВ, рд╡рд╣ рднреА рдРрд╕реЗ рддрд░реАрдХреЗ рд╕реЗ рдЬреЛ **рд╕реБрд░рдХреНрд╖рд┐рдд** рд╣реЛ, **disruptions рд╕реЗ рдмрдЪрд╛рдП**, рдФрд░ **compute resources** (рдЬреИрд╕реЗ remote servers/virtual machines) рдХрд╛ рдпрдерд╛рд╕рдВрднрд╡ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗред ЁЯЪА
рдореИрдВ рдпрд╣рд╛рдБ рдЗрди **рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ** рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдмрддрд╛рдКрдБрдЧрд╛, рдФрд░ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рд╡рд╣ **intuition** рдорд┐рд▓реЗрдЧреА рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рдЕрдкрдиреА API рдХреЛ рдмрд╣реБрдд рдЕрд▓рдЧ-рдЕрд▓рдЧ environments рдореЗрдВ deploy рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд╕рдВрднрд╡рддрдГ рдРрд╕реЗ **future** environments рдореЗрдВ рднреА рдЬреЛ рдЕрднреА рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВред
рдЗрди рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдХреЗ, рдЖрдк **рдЕрдкрдиреА рдЦреБрдж рдХреА APIs** рдХреЛ deploy рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ **evaluate рдФрд░ design** рдХрд░ рдкрд╛рдПрдБрдЧреЗред
рдЕрдЧрд▓реЗ chapters рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ FastAPI applications deploy рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ **рдареЛрд╕ recipes** рджреВрдБрдЧрд╛ред
рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЗрди рдорд╣рддреНрд╡рдкреВрд░реНрдг **conceptual ideas** рдХреЛ рджреЗрдЦреЗрдВред рдпреЗ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА web API рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВред ЁЯТб
## рд╕реБрд░рдХреНрд╖рд╛ - HTTPS { #security-https }
[HTTPS рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд┐рдЫрд▓реЗ chapter](https.md) рдореЗрдВ рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ HTTPS рдЖрдкрдХреА API рдХреЗ рд▓рд┐рдП encryption рдХреИрд╕реЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рд╣рдордиреЗ рдпрд╣ рднреА рджреЗрдЦрд╛ рдХрд┐ HTTPS рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЖрдкрдХреЗ application server рд╕реЗ **external** рдПрдХ component, рдПрдХ **TLS Termination Proxy**, рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдФрд░ **HTTPS certificates renew** рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рднрд╛рд░реА рдХреБрдЫ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рд╡рд╣реА component рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдХреБрдЫ рдЕрд▓рдЧ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
### HTTPS рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг Tools { #example-tools-for-https }
TLS Termination Proxy рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдк рдЬрд┐рди tools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣реИрдВ:
* Traefik
* Certificate renewals рдХреЛ рдЕрдкрдиреЗ-рдЖрдк рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ тЬи
* Caddy
* Certificate renewals рдХреЛ рдЕрдкрдиреЗ-рдЖрдк рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ тЬи
* Nginx
* Certificate renewals рдХреЗ рд▓рд┐рдП Certbot рдЬреИрд╕реЗ external component рдХреЗ рд╕рд╛рде
* HAProxy
* Certificate renewals рдХреЗ рд▓рд┐рдП Certbot рдЬреИрд╕реЗ external component рдХреЗ рд╕рд╛рде
* Nginx рдЬреИрд╕реЗ Ingress Controller рдХреЗ рд╕рд╛рде Kubernetes
* Certificate renewals рдХреЗ рд▓рд┐рдП cert-manager рдЬреИрд╕реЗ external component рдХреЗ рд╕рд╛рде
* Cloud provider рджреНрд╡рд╛рд░рд╛ рдЙрдирдХреА services рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ internally рд╕рдВрднрд╛рд▓рд╛ рдЧрдпрд╛ (рдиреАрдЪреЗ рдкрдврд╝реЗрдВ ЁЯСЗ)
рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ **cloud service** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ HTTPS setup рдХрд░рдиреЗ рд╕рд╣рд┐рдд рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдЗрд╕рдореЗрдВ рдХреБрдЫ restrictions рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдпрд╛ рдЖрдкрд╕реЗ рдЕрдзрд┐рдХ charge рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрджрд┐ред рд▓реЗрдХрд┐рди рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рд╕реНрд╡рдпрдВ TLS Termination Proxy setup рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛ред
рдЕрдЧрд▓реЗ chapters рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдХреБрдЫ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдКрдБрдЧрд╛ред
---
рдлрд┐рд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реЗ concepts рдЙрд╕ program рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ API рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реИ (рдЬреИрд╕реЗ Uvicorn)ред
## Program рдФрд░ Process { #program-and-process }
рд╣рдо рдЪрд▓ рд░рд╣реЗ "**process**" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рдФрд░ "**program**" рд╢рдмреНрдж рд╕реЗ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИред
### Program рдХреНрдпрд╛ рд╣реИ { #what-is-a-program }
**Program** рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдо рддреМрд░ рдкрд░ рдХрдИ рдЪреАрдЬреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
* рд╡рд╣ **code** рдЬреЛ рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ, **Python files**ред
* рд╡рд╣ **file** рдЬрд┐рд╕реЗ operating system рджреНрд╡рд╛рд░рд╛ **execute** рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: `python`, `python.exe` рдпрд╛ `uvicorn`ред
* рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ program рдЬрдм рд╡рд╣ operating system рдкрд░ **рдЪрд▓ рд░рд╣рд╛** рд╣реЛ, CPU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реЛ, рдФрд░ memory рдореЗрдВ рдЪреАрдЬреЗрдВ store рдХрд░ рд░рд╣рд╛ рд╣реЛред рдЗрд╕реЗ **process** рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
### Process рдХреНрдпрд╛ рд╣реИ { #what-is-a-process }
**Process** рд╢рдмреНрдж рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЙрд╕ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЬреЛ operating system рдореЗрдВ рдЪрд▓ рд░рд╣реА рд╣реЛрддреА рд╣реИ (рдЬреИрд╕реЗ рдКрдкрд░ рдХреЗ рдЕрдВрддрд┐рдо point рдореЗрдВ):
* рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ program рдЬрдм рд╡рд╣ operating system рдкрд░ **рдЪрд▓ рд░рд╣рд╛** рд╣реЛред
* рдпрд╣ рди рддреЛ file рдХреЛ refer рдХрд░рддрд╛ рд╣реИ, рди code рдХреЛ, рдпрд╣ **рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ** рдЙрд╕ рдЪреАрдЬрд╝ рдХреЛ refer рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ operating system рджреНрд╡рд╛рд░рд╛ **execute** рдФрд░ manage рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
* рдХреЛрдИ рднреА program, рдХреЛрдИ рднреА code, **рдХреЗрд╡рд▓ рддрднреА рдХреБрдЫ рдХрд░ рд╕рдХрддрд╛ рд╣реИ** рдЬрдм рдЙрд╕реЗ **execute** рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реЛред рдпрд╛рдиреА, рдЬрдм рдХреЛрдИ **process рдЪрд▓ рд░рд╣рд╛** рд╣реЛред
* Process рдХреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛, рдпрд╛ operating system рджреНрд╡рд╛рд░рд╛ **terminate** (рдпрд╛ "kill") рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕ point рдкрд░, рд╡рд╣ рдЪрд▓рдирд╛/execute рд╣реЛрдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╡рд╣ **рдЕрдм рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛**ред
* рдЖрдкрдХреЗ computer рдкрд░ рдЪрд▓ рд░рд╣реА рдкреНрд░рддреНрдпреЗрдХ application рдХреЗ рдкреАрдЫреЗ рдХреЛрдИ process рд╣реЛрддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ running program, рдкреНрд░рддреНрдпреЗрдХ window, рдЖрджрд┐ред рдФрд░ computer рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рдкрд░ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдХрдИ processes **рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ** рдЪрд▓ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВред
* **рдПрдХ рд╣реА program** рдХреЗ **multiple processes** рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЪрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ operating system рдореЗрдВ "task manager" рдпрд╛ "system monitor" (рдпрд╛ рд╕рдорд╛рди tools) рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ processes рдЪрд▓рддреЗ рд╣реБрдП рджреЗрдЦ рдкрд╛рдПрдБрдЧреЗред
рдФрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рд╢рд╛рдпрдж рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдПрдХ рд╣реА browser program (Firefox, Chrome, Edge, рдЖрджрд┐) рдХреЛ рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ multiple processes рд╣реИрдВред рд╡реЗ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдкреНрд░рддрд┐ tab рдПрдХ process рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рд╕рд╛рде рдореЗрдВ рдХреБрдЫ рдЕрдиреНрдп extra processes рднреАред
<img class="shadow" src="/img/deployment/concepts/image01.png">
---
рдЕрдм рдЬрдм рд╣рдо **process** рдФрд░ **program** рд╢рдмреНрджреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ deployments рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВред
## startup рдкрд░ рдЪрд▓рдирд╛ { #running-on-startup }
рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬрдм рдЖрдк рдПрдХ web API рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ **рд╣рдореЗрд╢рд╛ рдЪрд▓рддреА рд░рд╣реЗ**, рдмрд┐рдирд╛ interruption рдХреЗ, рддрд╛рдХрд┐ рдЖрдкрдХреЗ clients рд╣рдореЗрд╢рд╛ рдЙрд╕реЗ access рдХрд░ рд╕рдХреЗрдВред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рддрдм рддрдХ рд╣реИ рдЬрдм рддрдХ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░рдг рди рд╣реЛ рдХрд┐ рдЖрдк рдЙрд╕реЗ рдХреЗрд╡рд▓ рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╣реА рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рд▓рдЧрд╛рддрд╛рд░ рдЪрд▓рддреА рд░рд╣реЗ рдФрд░ **available** рд░рд╣реЗред
### Remote Server рдореЗрдВ { #in-a-remote-server }
рдЬрдм рдЖрдк рдПрдХ remote server (рдПрдХ cloud server, рдПрдХ virtual machine, рдЖрджрд┐) setup рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЪреАрдЬрд╝ рдЬреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд╣ рд╣реИ `fastapi run` (рдЬреЛ Uvicorn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ) рдпрд╛ рдХреБрдЫ рд╕рдорд╛рди, manually, рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рдЖрдк local development рдХрд░рддреЗ рд╕рдордп рдХрд░рддреЗ рд╣реИрдВред
рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдФрд░ **development рдХреЗ рджреМрд░рд╛рди** рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
рд▓реЗрдХрд┐рди рдпрджрд┐ server рд╕реЗ рдЖрдкрдХрд╛ connection рдЦреЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ **running process** рд╢рд╛рдпрдж рдорд░ рдЬрд╛рдПрдЧрд╛ред
рдФрд░ рдпрджрд┐ server restart рд╣реЛрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП updates рдХреЗ рдмрд╛рдж, рдпрд╛ cloud provider рд╕реЗ migrations рдХреЗ рдмрд╛рдж) рддреЛ рдЖрдк рд╢рд╛рдпрдж **рдЗрд╕реЗ notice рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ**ред рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдЖрдкрдХреЛ рдпрд╣ рднреА рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдЖрдкрдХреЛ process рдХреЛ manually restart рдХрд░рдирд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреА API рдмрд╕ dead рд╣реА рд░рд╣реЗрдЧреАред ЁЯШ▒
### Startup рдкрд░ Automatically рдЪрд▓рд╛рдирд╛ { #run-automatically-on-startup }
рд╕рд╛рдорд╛рдиреНрдпрддрдГ, рдЖрдк рд╢рд╛рдпрдж рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ server program (рдЬреИрд╕реЗ Uvicorn) server startup рдкрд░ automatically start рд╣реЛ, рдФрд░ рдХрд┐рд╕реА **human intervention** рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛, рддрд╛рдХрд┐ рдЖрдкрдХреА API рдХреЗ рд╕рд╛рде рд╣рдореЗрд╢рд╛ рдПрдХ process рдЪрд▓ рд░рд╣рд╛ рд╣реЛ (рдЬреИрд╕реЗ Uvicorn рдЖрдкрдХреА FastAPI app рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реЛ)ред
### рдЕрд▓рдЧ Program { #separate-program }
рдЗрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдПрдХ **рдЕрд▓рдЧ program** рд╣реЛрдЧрд╛ рдЬреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдЖрдкрдХреА application startup рдкрд░ рдЪрд▓реЗред рдФрд░ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдЕрдиреНрдп components рдпрд╛ applications рднреА рдЪрд▓реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ databaseред
### Startup рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг Tools { #example-tools-to-run-at-startup }
рдЗрд╕ рдХрд╛рдо рдХреЛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ tools рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ:
* Docker
* Kubernetes
* Docker Compose
* Docker in Swarm Mode
* Systemd
* Supervisor
* Cloud provider рджреНрд╡рд╛рд░рд╛ рдЙрдирдХреА services рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ internally рд╕рдВрднрд╛рд▓рд╛ рдЧрдпрд╛
* рдЕрдиреНрдп...
рдЕрдЧрд▓реЗ chapters рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рджреВрдБрдЧрд╛ред
## Restarts { #restarts }
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреА application startup рдкрд░ рдЪрд▓реЗ, рдЖрдк рд╢рд╛рдпрдж рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ failures рдХреЗ рдмрд╛рдж рдЙрд╕реЗ **restart** рдХрд┐рдпрд╛ рдЬрд╛рдПред
### рд╣рдо рдЧрд▓рддрд┐рдпрд╛рдБ рдХрд░рддреЗ рд╣реИрдВ { #we-make-mistakes }
рд╣рдо, рдордиреБрд╖реНрдп рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рд░ рд╕рдордп **рдЧрд▓рддрд┐рдпрд╛рдБ** рдХрд░рддреЗ рд╣реИрдВред Software рдореЗрдВ рд▓рдЧрднрдЧ *рд╣рдореЗрд╢рд╛* рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрдЧрд╣реЛрдВ рдкрд░ **bugs** рдЫрд┐рдкреЗ рд╣реЛрддреЗ рд╣реИрдВред ЁЯРЫ
рдФрд░ рд╣рдо developers рдЙрди bugs рдХреЛ рдЦреЛрдЬрддреЗ рд╣реБрдП рдФрд░ рдирдИ features implement рдХрд░рддреЗ рд╣реБрдП code рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рддреЗ рд░рд╣рддреЗ рд╣реИрдВ (рд╕рдВрднрд╡рддрдГ рдирдП bugs рднреА рдЬреЛрдбрд╝рддреЗ рд╣реБрдП ЁЯШЕ)ред
### рдЫреЛрдЯреЗ Errors Automatically рд╕рдВрднрд╛рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ { #small-errors-automatically-handled }
FastAPI рдХреЗ рд╕рд╛рде web APIs рдмрдирд╛рддреЗ рд╕рдордп, рдпрджрд┐ рд╣рдорд╛рд░реЗ code рдореЗрдВ рдХреЛрдИ error рд╣реИ, рддреЛ FastAPI рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЙрд╕реЗ рдЙрд╕ single request рддрдХ рд╕реАрдорд┐рдд рд░рдЦреЗрдЧрд╛ рдЬрд┐рд╕рдиреЗ error trigger рдХрд┐рдпрд╛ред ЁЯЫб
Client рдХреЛ рдЙрд╕ request рдХреЗ рд▓рд┐рдП **500 Internal Server Error** рдорд┐рд▓реЗрдЧрд╛, рд▓реЗрдХрд┐рди application рдкреВрд░реА рддрд░рд╣ crash рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЕрдЧрд▓реА requests рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреА рд░рд╣реЗрдЧреАред
### рдмрдбрд╝реЗ Errors - Crashes { #bigger-errors-crashes }
рдлрд┐рд░ рднреА, рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рд╣рдо рдХреБрдЫ code рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ **рдкреВрд░реА application рдХреЛ crash** рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ Uvicorn рдФрд░ Python crash рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред ЁЯТе
рдФрд░ рдлрд┐рд░ рднреА, рдЖрдк рд╢рд╛рдпрдж рдирд╣реАрдВ рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ application рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП dead рд░рд╣реЗ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЬрдЧрд╣ error рдерд╛, рдЖрдк рд╢рд╛рдпрдж рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рд╡рд╣ рдХрдо рд╕реЗ рдХрдо рдЙрди *path operations* рдХреЗ рд▓рд┐рдП **рдЪрд▓рддреА рд░рд╣реЗ** рдЬреЛ broken рдирд╣реАрдВ рд╣реИрдВред
### Crash рдХреЗ рдмрд╛рдж Restart { #restart-after-crash }
рд▓реЗрдХрд┐рди рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдБ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦрд░рд╛рдм errors running **process** рдХреЛ crash рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдЖрдк рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рдПрдХ external component process рдХреЛ **restart** рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рднрд╛рд░реА рд╣реЛ, рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдмрд╛рд░...
/// tip | рд╕реБрдЭрд╛рд╡
...рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрджрд┐ рдкреВрд░реА application рдмрд╕ **рддреБрд░рдВрдд crash** рд╣реЛ рд░рд╣реА рд╣реИ рддреЛ рд╢рд╛рдпрдж рдЙрд╕реЗ рд╣рдореЗрд╢рд╛ restart рдХрд░рддреЗ рд░рд╣рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрд░реНрде рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк рд╢рд╛рдпрдж рдЗрд╕реЗ development рдХреЗ рджреМрд░рд╛рди, рдпрд╛ рдХрдо рд╕реЗ рдХрдо deployment рдХреЗ рдареАрдХ рдмрд╛рдж notice рдХрд░реЗрдВрдЧреЗред
рддреЛ рдЖрдЗрдП рдореБрдЦреНрдп рдорд╛рдорд▓реЛрдВ рдкрд░ focus рдХрд░реЗрдВ, рдЬрд╣рд╛рдБ рдпрд╣ **future** рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ crash рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рднреА рдЙрд╕реЗ restart рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
///
рдЖрдк рд╢рд╛рдпрдж рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рдЖрдкрдХреА application рдХреЛ restart рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рднрд╛рд░реА рдПрдХ **external component** рд╣реЛ, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ point рддрдХ, Uvicorn рдФрд░ Python рд╡рд╛рд▓реА рд╡рд╣реА application рдкрд╣рд▓реЗ рд╣реА crash рд╣реЛ рдЪреБрдХреА рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрд╕реА app рдХреЗ рдЙрд╕реА code рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрддрд╛ рдЬреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд░ рд╕рдХреЗред
### Automatically Restart рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг Tools { #example-tools-to-restart-automatically }
рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╡рд╣реА tool рдЬреЛ **startup рдкрд░ program рдЪрд▓рд╛рдиреЗ** рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ, automatic **restarts** рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдпреЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:
* Docker
* Kubernetes
* Docker Compose
* Docker in Swarm Mode
* Systemd
* Supervisor
* Cloud provider рджреНрд╡рд╛рд░рд╛ рдЙрдирдХреА services рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ internally рд╕рдВрднрд╛рд▓рд╛ рдЧрдпрд╛
* рдЕрдиреНрдп...
## Replication - Processes рдФрд░ Memory { #replication-processes-and-memory }
FastAPI application рдХреЗ рд╕рд╛рде, Uvicorn рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ `fastapi` command рдЬреИрд╕реЗ server program рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЙрд╕реЗ **рдПрдХ process** рдореЗрдВ рдПрдХ рдмрд╛рд░ рдЪрд▓рд╛рдирд╛ multiple clients рдХреЛ concurrently serve рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ worker processes рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
### Multiple Processes - Workers { #multiple-processes-workers }
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ single process рджреНрд╡рд╛рд░рд╛ handle рдХрд┐рдП рдЬрд╛ рд╕рдХрдиреЗ рд╕реЗ рдЕрдзрд┐рдХ clients рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ virtual machine рдмрд╣реБрдд рдмрдбрд╝реА рдирд╣реАрдВ рд╣реИ) рдФрд░ server рдХреЗ CPU рдореЗрдВ **multiple cores** рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рд╣реА application рдХреЗ рд╕рд╛рде **multiple processes** рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА requests рдХреЛ рдЙрдирдХреЗ рдмреАрдЪ distribute рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЬрдм рдЖрдк рдЙрд╕реА API program рдХреЗ **multiple processes** рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЖрдо рддреМрд░ рдкрд░ **workers** рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
### Worker Processes рдФрд░ Ports { #worker-processes-and-ports }
Docs [About HTTPS](https.md) рд╕реЗ рдпрд╛рдж рдХрд░реЗрдВ рдХрд┐ server рдореЗрдВ port рдФрд░ IP address рдХреЗ рдПрдХ combination рдкрд░ рдХреЗрд╡рд▓ рдПрдХ process listen рдХрд░ рд╕рдХрддрд╛ рд╣реИ?
рдпрд╣ рдЕрднреА рднреА рд╕рд╣реА рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ **multiple processes** рд░рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ **single process port рдкрд░ listening** рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдлрд┐рд░ communication рдХреЛ рдХрд┐рд╕реА рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ worker process рддрдХ transmit рдХрд░реЗред
### рдкреНрд░рддрд┐ Process Memory { #memory-per-process }
рдЕрдм, рдЬрдм program memory рдореЗрдВ рдЪреАрдЬреЗрдВ load рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА variable рдореЗрдВ machine learning model, рдпрд╛ рдХрд┐рд╕реА рдмрдбрд╝реЗ file рдХреА contents рдХрд┐рд╕реА variable рдореЗрдВ, рддреЛ рд╡рд╣ рд╕рдм server рдХреА **memory (RAM) рдХрд╛ рдереЛрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ consume** рдХрд░рддрд╛ рд╣реИред
рдФрд░ multiple processes рд╕рд╛рдорд╛рдиреНрдпрддрдГ **рдХреЛрдИ memory share рдирд╣реАрдВ рдХрд░рддреЗ**ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ running process рдХреА рдЕрдкрдиреА рдЪреАрдЬреЗрдВ, variables, рдФрд░ memory рд╣реЛрддреА рд╣реИред рдФрд░ рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ code рдореЗрдВ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ memory consume рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ **рдкреНрд░рддреНрдпреЗрдХ process** рдЙрддрдиреА рд╣реА memory consume рдХрд░реЗрдЧрд╛ред
### Server Memory { #server-memory }
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХрд╛ code **1 GB size** рд╡рд╛рд▓рд╛ Machine Learning model load рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЬрдм рдЖрдк рдЕрдкрдиреА API рдХреЗ рд╕рд╛рде рдПрдХ process рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╣ рдХрдо рд╕реЗ рдХрдо 1 GB RAM consume рдХрд░реЗрдЧрд╛ред рдФрд░ рдпрджрд┐ рдЖрдк **4 processes** (4 workers) start рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ 1 GB RAM consume рдХрд░реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдЖрдкрдХреА API **4 GB RAM** consume рдХрд░реЗрдЧреАред
рдФрд░ рдпрджрд┐ рдЖрдкрдХреЗ remote server рдпрд╛ virtual machine рдореЗрдВ рдХреЗрд╡рд▓ 3 GB RAM рд╣реИ, рддреЛ 4 GB рд╕реЗ рдЕрдзрд┐рдХ RAM load рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ problems рдкреИрджрд╛ рдХрд░реЗрдЧреАред ЁЯЪи
### Multiple Processes - рдПрдХ рдЙрджрд╛рд╣рд░рдг { #multiple-processes-an-example }
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ **Manager Process** рд╣реИ рдЬреЛ рджреЛ **Worker Processes** start рдФрд░ control рдХрд░рддрд╛ рд╣реИред
рдпрд╣ Manager Process рд╢рд╛рдпрдж IP рдореЗрдВ **port** рдкрд░ listen рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдпрд╣ рд╕рднреА communication рдХреЛ worker processes рддрдХ transmit рдХрд░реЗрдЧрд╛ред
рд╡реЗ worker processes рд╡реЗ рд╣реЛрдВрдЧреЗ рдЬреЛ рдЖрдкрдХреА application рдЪрд▓рд╛ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ, рд╡реЗ **request** рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ **response** return рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп computations рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╡реЗ RAM рдореЗрдВ variables рдореЗрдВ рдбрд╛рд▓реА рдЧрдИ рдХреЛрдИ рднреА рдЪреАрдЬрд╝ load рдХрд░реЗрдВрдЧреЗред
<img src="/img/deployment/concepts/process-ram.drawio.svg">
рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЙрд╕реА machine рдкрд░ рдЖрдкрдХреА application рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╢рд╛рдпрдж **рдЕрдиреНрдп processes** рднреА рдЪрд▓ рд░рд╣реЗ рд╣реЛрдВрдЧреЗред
рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк detail рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ process рджреНрд╡рд╛рд░рд╛ **рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП CPU** рдХрд╛ percentage рд╕рдордп рдХреЗ рд╕рд╛рде рдмрд╣реБрдд **рдмрджрд▓** рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди **memory (RAM)** рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ **stable** рд░рд╣рддреА рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ API рд╣реИ рдЬреЛ рд╣рд░ рдмрд╛рд░ comparable amount рдХреА computations рдХрд░рддреА рд╣реИ рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ clients рд╣реИрдВ, рддреЛ **CPU utilization** рд╢рд╛рдпрдж *stable рднреА рд░рд╣реЗрдЧрд╛* (рд▓рдЧрд╛рддрд╛рд░ рддреЗрдЬреА рд╕реЗ рдКрдкрд░-рдиреАрдЪреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп)ред
### Replication Tools рдФрд░ Strategies рдХреЗ рдЙрджрд╛рд╣рд░рдг { #examples-of-replication-tools-and-strategies }
рдЗрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рдХрдИ approaches рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдореИрдВ рдЕрдЧрд▓реЗ chapters рдореЗрдВ specific strategies рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрддрд╛рдКрдБрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Docker рдФрд░ containers рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╕рдордпред
рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдореБрдЦреНрдп constraint рдпрд╣ рд╣реИ рдХрд┐ **public IP** рдореЗрдВ **port** рдХреЛ handle рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ **single** component рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдлрд┐рд░ рдЙрд╕рдХреЗ рдкрд╛рд╕ replicated **processes/workers** рддрдХ communication **transmit** рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣рд╛рдБ рдХреБрдЫ рд╕рдВрднрд╛рд╡рд┐рдд combinations рдФрд░ strategies рд╣реИрдВ:
* **Uvicorn** `--workers` рдХреЗ рд╕рд╛рде
* рдПрдХ Uvicorn **process manager** **IP** рдФрд░ **port** рдкрд░ listen рдХрд░реЗрдЧрд╛, рдФрд░ рдпрд╣ **multiple Uvicorn worker processes** start рдХрд░реЗрдЧрд╛ред
* **Kubernetes** рдФрд░ рдЕрдиреНрдп distributed **container systems**
* **Kubernetes** layer рдореЗрдВ рдХреБрдЫ **IP** рдФрд░ **port** рдкрд░ listen рдХрд░реЗрдЧрд╛ред Replication **multiple containers** рд░рдЦрдиреЗ рд╕реЗ рд╣реЛрдЧреА, рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ **рдПрдХ Uvicorn process** рдЪрд▓ рд░рд╣рд╛ рд╣реЛрдЧрд╛ред
* **Cloud services** рдЬреЛ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд▓рддреА рд╣реИрдВ
* Cloud service рд╢рд╛рдпрдж **рдЖрдкрдХреЗ рд▓рд┐рдП replication handle** рдХрд░реЗрдЧреАред рдпрд╣ рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЛ **рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП process**, рдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **container image** define рдХрд░рдиреЗ рджреЗрдЧреА, рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╡рддрдГ **рдПрдХ single Uvicorn process** рд╣реЛрдЧрд╛, рдФрд░ cloud service рдЙрд╕реЗ replicate рдХрд░рдиреЗ рдХреА рдкреНрд░рднрд╛рд░реА рд╣реЛрдЧреАред
/// tip | рд╕реБрдЭрд╛рд╡
рдпрджрд┐ **containers**, Docker, рдпрд╛ Kubernetes рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ items рдЕрднреА рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ рддреЛ рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВред
рдореИрдВ future chapter рдореЗрдВ container images, Docker, Kubernetes, рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрддрд╛рдКрдБрдЧрд╛: [Containers рдореЗрдВ FastAPI - Docker](docker.md)ред
///
## рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рдкрд┐рдЫрд▓реЗ Steps { #previous-steps-before-starting }
рдХрдИ рдорд╛рдорд▓реЗ рдРрд╕реЗ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдк рдЕрдкрдиреА application **start рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ** рдХреБрдЫ steps perform рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк **database migrations** рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк рдЗрди steps рдХреЛ рдХреЗрд╡рд▓ **рдПрдХ рдмрд╛рд░** perform рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
рдЗрд╕рд▓рд┐рдП, рдЖрдк application start рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрди **previous steps** рдХреЛ perform рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ **single process** рд░рдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
рдФрд░ рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЙрди previous steps рдХреЛ рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╣реА process рд╣реЛ, *рднрд▓реЗ рд╣реА* рдмрд╛рдж рдореЗрдВ рдЖрдк application рдХреЗ рд▓рд┐рдП **multiple processes** (multiple workers) start рдХрд░реЗрдВред рдпрджрд┐ рд╡реЗ steps **multiple processes** рджреНрд╡рд╛рд░рд╛ рдЪрд▓рд╛рдП рдЧрдП, рддреЛ рд╡реЗ рдЙрдиреНрд╣реЗрдВ **parallel** рдореЗрдВ рдЪрд▓рд╛рдХрд░ рдХрд╛рдо рдХреЛ **duplicate** рдХрд░ рджреЗрдВрдЧреЗ, рдФрд░ рдпрджрд┐ steps database migration рдЬреИрд╕реА delicate рдЪреАрдЬрд╝ рд╣реИрдВ, рддреЛ рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде conflicts рдкреИрджрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдмреЗрд╢рдХ, рдХреБрдЫ рдорд╛рдорд▓реЗ рдРрд╕реЗ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ previous steps рдХреЛ multiple times рдЪрд▓рд╛рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрддреА, рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЗрд╕реЗ handle рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред
/// tip | рд╕реБрдЭрд╛рд╡
рд╕рд╛рде рд╣реА, рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЗ setup рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдкрдХреА application start рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ **рд╢рд╛рдпрдж рдХрд┐рд╕реА previous steps рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рднреА рди рд╣реЛ**ред
рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рдиреА рд╣реЛрдЧреАред ЁЯд╖
///
### Previous Steps Strategies рдХреЗ рдЙрджрд╛рд╣рд░рдг { #examples-of-previous-steps-strategies }
рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ **рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░** рдХрд░реЗрдЧрд╛ рдХрд┐ рдЖрдк **рдЕрдкрдирд╛ system рдХреИрд╕реЗ deploy** рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╢рд╛рдпрдж programs start рдХрд░рдиреЗ, restarts handle рдХрд░рдиреЗ, рдЖрджрд┐ рдХреЗ рддрд░реАрдХреЗ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрдЧрд╛ред
рдпрд╣рд╛рдБ рдХреБрдЫ рд╕рдВрднрд╛рд╡рд┐рдд ideas рд╣реИрдВ:
* Kubernetes рдореЗрдВ рдПрдХ "Init Container" рдЬреЛ рдЖрдкрдХреЗ app container рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рддрд╛ рд╣реИ
* рдПрдХ bash script рдЬреЛ previous steps рдЪрд▓рд╛рддреА рд╣реИ рдФрд░ рдлрд┐рд░ рдЖрдкрдХреА application start рдХрд░рддреА рд╣реИ
* рдЖрдкрдХреЛ рдлрд┐рд░ рднреА *рдЙрд╕* bash script рдХреЛ start/restart рдХрд░рдиреЗ, errors detect рдХрд░рдиреЗ, рдЖрджрд┐ рдХрд╛ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдП рд╣реЛрдЧрд╛ред
/// tip | рд╕реБрдЭрд╛рд╡
Containers рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ future chapter рдореЗрдВ рдЕрдзрд┐рдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рджреВрдБрдЧрд╛: [Containers рдореЗрдВ FastAPI - Docker](docker.md)ред
///
## Resource Utilization { #resource-utilization }
рдЖрдкрдХреЗ server(s) рдПрдХ **resource** рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЕрдкрдиреЗ programs рдХреЗ рд╕рд╛рде consume рдпрд╛ **utilize** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, CPUs рдкрд░ computation time рдФрд░ рдЙрдкрд▓рдмреНрдз RAM memory рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред
рдЖрдк system resources рдХрд╛ рдХрд┐рддрдирд╛ рд╣рд┐рд╕реНрд╕рд╛ consume/utilize рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? "рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ" рд╕реЛрдЪрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рд╢рд╛рдпрдж **crash рдХрд┐рдП рдмрд┐рдирд╛ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛** consume рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
рдпрджрд┐ рдЖрдк 3 servers рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЙрдирдХреА RAM рдФрд░ CPU рдХрд╛ рдХреЗрд╡рд▓ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╢рд╛рдпрдж **рдкреИрд╕рд╛ рдмрд░реНрдмрд╛рдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ** ЁЯТ╕, рдФрд░ рд╢рд╛рдпрдж **server рдХреА electric power рдмрд░реНрдмрд╛рдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ** ЁЯМО, рдЖрджрд┐ред
рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХреЗрд╡рд▓ 2 servers рд░рдЦрдирд╛ рдФрд░ рдЙрдирдХреЗ resources (CPU, memory, disk, network bandwidth, рдЖрджрд┐) рдХрд╛ рдЙрдЪреНрдЪ percentage рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ 2 servers рд╣реИрдВ рдФрд░ рдЖрдк рдЙрдирдХреЗ **CPU рдФрд░ RAM рдХрд╛ 100%** рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдХрд┐рд╕реА point рдкрд░ рдПрдХ process рдЕрдзрд┐рдХ memory рдорд╛рдБрдЧреЗрдЧрд╛, рдФрд░ server рдХреЛ disk рдХреЛ "memory" рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛ (рдЬреЛ рд╣рдЬрд╛рд░реЛрдВ рдЧреБрдирд╛ рдзреАрдорд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ), рдпрд╛ рд╡рд╣ **crash** рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╛ рдХрд┐рд╕реА process рдХреЛ рдХреБрдЫ computation рдХрд░рдиреА рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЙрд╕реЗ CPU рдХреЗ рдлрд┐рд░ рд╕реЗ free рд╣реЛрдиреЗ рддрдХ wait рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛ред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, **рдПрдХ extra server** рд▓реЗрдирд╛ рдФрд░ рдЙрд╕ рдкрд░ рдХреБрдЫ processes рдЪрд▓рд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдЙрди рд╕рднреА рдХреЗ рдкрд╛рд╕ **рдкрд░реНрдпрд╛рдкреНрдд RAM рдФрд░ CPU time** рд╣реЛред
рдпрд╣ рднреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдкрдХреА API рдХреЗ usage рдореЗрдВ **spike** рд╣реЛред рд╢рд╛рдпрдж рдпрд╣ viral рд╣реЛ рдЧрдИ, рдпрд╛ рд╢рд╛рдпрдж рдХреБрдЫ рдЕрдиреНрдп services рдпрд╛ bots рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░ рджреЗрдВред рдФрд░ рдЖрдк рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ safe рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП extra resources рд░рдЦрдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк target рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ **arbitrary number** рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, resource utilization рдХрд╛ **50% рд╕реЗ 90% рдХреЗ рдмреАрдЪ** рдХреБрдЫред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпреЗ рд╢рд╛рдпрдж рд╡реЗ рдореБрдЦреНрдп рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк measure рдХрд░рдирд╛ рдФрд░ рдЕрдкрдиреЗ deployments tweak рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
рдЖрдк рдЕрдкрдиреЗ server рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП CPU рдФрд░ RAM рдпрд╛ рдкреНрд░рддреНрдпреЗрдХ process рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдорд╛рддреНрд░рд╛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП `htop` рдЬреИрд╕реЗ simple tools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ рдЖрдк рдЕрдзрд┐рдХ complex monitoring tools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ servers рдореЗрдВ distributed рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрджрд┐ред
## Recap { #recap }
рдЖрдкрдиреЗ рдпрд╣рд╛рдБ рдХреБрдЫ рдореБрдЦреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ рдкрдврд╝реА рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдкрдиреА application рдХреЛ рдХреИрд╕реЗ deploy рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рддрдп рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛:
* рд╕реБрд░рдХреНрд╖рд╛ - HTTPS
* startup рдкрд░ рдЪрд▓рдирд╛
* Restarts
* Replication (рдЪрд▓ рд░рд╣реЗ processes рдХреА рд╕рдВрдЦреНрдпрд╛)
* Memory
* рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рдкрд┐рдЫрд▓реЗ steps
рдЗрди ideas рдХреЛ рд╕рдордЭрдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ apply рдХрд░рдирд╛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ deployments configure рдФрд░ tweak рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рднреА decisions рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ intuition рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред ЁЯдУ
рдЕрдЧрд▓реЗ sections рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдЙрди рд╕рдВрднрд╛рд╡рд┐рдд strategies рдХреЗ рдЕрдзрд┐рдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рджреВрдБрдЧрд╛ рдЬрд┐рдирдХрд╛ рдЖрдк рдкрд╛рд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ЁЯЪА

618
docs/hi/docs/deployment/docker.md

@ -0,0 +1,618 @@
# Containers рдореЗрдВ FastAPI - Docker { #fastapi-in-containers-docker }
FastAPI applications deploy рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЖрдо рддрд░реАрдХрд╛ **Linux container image** рдмрдирд╛рдирд╛ рд╣реИред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдпрддрдГ [**Docker**](https://www.docker.com/) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдЖрдк рдЙрд╕ container image рдХреЛ рдХреБрдЫ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдореЗрдВ deploy рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Linux containers рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрдИ рд▓рд╛рдн рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ **security**, **replicability**, **simplicity**, рдФрд░ рдЕрдиреНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
/// tip | рдЯрд┐рдк
рдЬрд▓реНрджреА рдореЗрдВ рд╣реИрдВ рдФрд░ рдпрд╣ рд╕рдм рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ? рдиреАрдЪреЗ рджрд┐рдП рдЧрдП [`Dockerfile` рдкрд░ рдЬрд╛рдПрдБ ЁЯСЗ](#build-a-docker-image-for-fastapi).
///
<details>
<summary>Dockerfile Preview ЁЯСА</summary>
```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"]
# рдпрджрд┐ Nginx рдпрд╛ Traefik рдЬреИрд╕реЗ proxy рдХреЗ рдкреАрдЫреЗ рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ рддреЛ --proxy-headers рдЬреЛрдбрд╝реЗрдВ
# CMD ["fastapi", "run", "app/main.py", "--port", "80", "--proxy-headers"]
```
</details>
## Container рдХреНрдпрд╛ рд╣реИ { #what-is-a-container }
Containers (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ Linux containers) applications рдХреЛ рдЙрдирдХреА рд╕рднреА dependencies рдФрд░ рдЖрд╡рд╢реНрдпрдХ files рд╕рд╣рд┐рдд package рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд **lightweight** рддрд░реАрдХрд╛ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЙрд╕реА system рдореЗрдВ рджреВрд╕рд░реЗ containers (рджреВрд╕рд░реА applications рдпрд╛ components) рд╕реЗ isolated рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
Linux containers host (machine, virtual machine, cloud server, рдЖрджрд┐) рдХреЗ рдЙрд╕реА Linux kernel рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд▓рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдмрд╕ рдЗрддрдирд╛ рд╣реИ рдХрд┐ рд╡реЗ рдмрд╣реБрдд lightweight рд╣реЛрддреЗ рд╣реИрдВ (рдкреВрд░реЗ operating system рдХреЛ emulate рдХрд░рдиреЗ рд╡рд╛рд▓реА full virtual machines рдХреА рддреБрд▓рдирд╛ рдореЗрдВ)ред
рдЗрд╕ рддрд░рд╣, containers **рдХрдо resources** consume рдХрд░рддреЗ рд╣реИрдВ, рд▓рдЧрднрдЧ рдЙрддрдиреЗ рд╣реА рдЬрд┐рддрдиреЗ processes рдХреЛ рд╕реАрдзреЗ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд▓рдЧрддреЗ рд╣реИрдВ (virtual machine рдмрд╣реБрдд рдЕрдзрд┐рдХ consume рдХрд░реЗрдЧреА)ред
Containers рдХреЗ рдЕрдкрдиреЗ **isolated** running processes (рдЖрдорддреМрд░ рдкрд░ рд╕рд┐рд░реНрдл рдПрдХ process), file system, рдФрд░ network рднреА рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ deployment, security, development, рдЖрджрд┐ рд╕рд░рд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
## Container Image рдХреНрдпрд╛ рд╣реИ { #what-is-a-container-image }
рдПрдХ **container** рдПрдХ **container image** рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
Container image рдЙрди рд╕рднреА files, environment variables, рдФрд░ default command/program рдХрд╛ **static** version рд╣реЛрддрд╛ рд╣реИ рдЬреЛ container рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдБ **Static** рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ container **image** рдЪрд▓ рдирд╣реАрдВ рд░рд╣реА рд╣реИ, execute рдирд╣реАрдВ рд╣реЛ рд░рд╣реА рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл packaged files рдФрд░ metadata рд╣реИред
"**container image**" рдЬреЛ stored static contents рд╣реИ, рдЙрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, "**container**" рд╕рд╛рдорд╛рдиреНрдпрддрдГ running instance рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдЪреАрдЬрд╝ рдЬреЛ **execute** рд╣реЛ рд░рд╣реА рд╣реИред
рдЬрдм **container** start рд╣реЛрдХрд░ running рд╣реЛрддрд╛ рд╣реИ (**container image** рд╕реЗ start рдХрд┐рдпрд╛ рдЧрдпрд╛), рддреЛ рдпрд╣ files, environment variables, рдЖрджрд┐ рдмрдирд╛ рдпрд╛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рд╡реЗ рдмрджрд▓рд╛рд╡ рдХреЗрд╡рд▓ рдЙрд╕ container рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди underlying container image рдореЗрдВ persist рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ (disk рдкрд░ save рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ)ред
Container image рдХреА рддреБрд▓рдирд╛ **program** file рдФрд░ contents рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬреИрд╕реЗ `python` рдФрд░ рдХреЛрдИ file `main.py`ред
рдФрд░ **container** рд╕реНрд╡рдпрдВ (**container image** рдХреЗ рд╡рд┐рдкрд░реАрдд) image рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ running instance рд╣реИ, рдЬрд┐рд╕рдХреА рддреБрд▓рдирд╛ **process** рд╕реЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, container рдХреЗрд╡рд▓ рддрдм running рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЙрд╕рдореЗрдВ **process running** рд╣реЛ (рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ single process рд╣реЛрддрд╛ рд╣реИ)ред рдЬрдм рдЙрд╕рдореЗрдВ рдХреЛрдИ process running рдирд╣реАрдВ рд░рд╣рддрд╛, рддреЛ container stop рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
## Container Images { #container-images }
Docker **container images** рдФрд░ **containers** рдмрдирд╛рдиреЗ рдФрд░ manage рдХрд░рдиреЗ рдХреЗ рдореБрдЦреНрдп tools рдореЗрдВ рд╕реЗ рдПрдХ рд░рд╣рд╛ рд╣реИред
рдФрд░ рдПрдХ public [Docker Hub](https://hub.docker.com/) рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдИ tools, environments, databases, рдФрд░ applications рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдмрдиреА **official container images** рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ official [Python Image](https://hub.docker.com/_/python) рд╣реИред
рдФрд░ databases рдЬреИрд╕реА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрдиреНрдп 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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ tools рдХреЛ **combine** рдФрд░ use рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирдпрд╛ database try рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЕрдзрд┐рдХрддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк **official images** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рд┐рд░реНрдл environment variables рд╕реЗ configure рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рддрд░рд╣, рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк containers рдФрд░ Docker рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ knowledge рдХреЛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ tools рдФрд░ components рдХреЗ рд╕рд╛рде reuse рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рддреЛ, рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд╕рд╛рде **multiple containers** рдЪрд▓рд╛рдПрдБрдЧреЗ, рдЬреИрд╕реЗ database, Python application, React frontend application рд╡рд╛рд▓рд╛ web server, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрдирдХреЗ internal network рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ connect рдХрд░реЗрдВрдЧреЗред
рд╕рднреА container management systems (рдЬреИрд╕реЗ Docker рдпрд╛ Kubernetes) рдореЗрдВ рдпреЗ networking features integrated рд╣реЛрддреЗ рд╣реИрдВред
## Containers рдФрд░ Processes { #containers-and-processes }
рдПрдХ **container image** рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЕрдкрдиреЗ metadata рдореЗрдВ default program рдпрд╛ command рд╢рд╛рдорд┐рд▓ рдХрд░рддреА рд╣реИ рдЬрд┐рд╕реЗ **container** start рд╣реЛрдиреЗ рдкрд░ run рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЙрд╕ program рдХреЛ pass рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ parametersред рдпрд╣ рдмрд╣реБрдд рд╣рдж рддрдХ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ command line рдореЗрдВ рд╣реЛрддрд╛ред
рдЬрдм рдХреЛрдИ **container** start рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЙрд╕ command/program рдХреЛ run рдХрд░реЗрдЧрд╛ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЖрдк рдЗрд╕реЗ override рдХрд░рдХреЗ рдХреЛрдИ рдЕрд▓рдЧ command/program run рдХрд░рд╡рд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред
Container рддрдм рддрдХ running рд░рд╣рддрд╛ рд╣реИ рдЬрдм рддрдХ **main process** (command рдпрд╛ program) running рд░рд╣рддрд╛ рд╣реИред
Container рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдпрддрдГ **single process** рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди main process рд╕реЗ subprocesses start рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдЙрд╕реА container рдореЗрдВ **multiple processes** рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди **рдХрдо рд╕реЗ рдХрдо рдПрдХ running process** рдХреЗ рдмрд┐рдирд╛ running container рд╣реЛрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ main process stop рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ container stop рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
## FastAPI рдХреЗ рд▓рд┐рдП Docker Image рдмрдирд╛рдПрдБ { #build-a-docker-image-for-fastapi }
рдареАрдХ рд╣реИ, рдЕрдм рдХреБрдЫ рдмрдирд╛рддреЗ рд╣реИрдВ! ЁЯЪА
рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдБрдЧрд╛ рдХрд┐ **official Python** image рдкрд░ рдЖрдзрд╛рд░рд┐рдд FastAPI рдХреЗ рд▓рд┐рдП **scratch рд╕реЗ** **Docker image** рдХреИрд╕реЗ рдмрдирд╛рдПрдБред
рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЖрдк **рдЕрдзрд┐рдХрддрд░ рдорд╛рдорд▓реЛрдВ** рдореЗрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
* **Kubernetes** рдпрд╛ рд╕рдорд╛рди tools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп
* **Raspberry Pi** рдкрд░ рдЪрд▓рд╛рддреЗ рд╕рдордп
* рдРрд╕рд╛ cloud service рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП container image run рдХрд░реЗрдЧрд╛, рдЖрджрд┐ред
### Package Requirements { #package-requirements }
рдЖрдкрдХреА application рдХреЗ рд▓рд┐рдП **package requirements** рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдХрд┐рд╕реА file рдореЗрдВ рд╣реЛрдВрдЧреЗред
рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЙрд╕ tool рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рдЙрди requirements рдХреЛ **install** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрдо рддрд░реАрдХрд╛ рд╣реИ `requirements.txt` file рд░рдЦрдирд╛, рдЬрд┐рд╕рдореЗрдВ package names рдФрд░ рдЙрдирдХреЗ versions рд╣реЛрдВ, рдкреНрд░рддрд┐ line рдПрдХред
рдЖрдк versions рдХреА ranges set рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд╣реА ideas рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЖрдкрдиреЗ [FastAPI versions рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ](versions.md) рдореЗрдВ рдкрдврд╝реЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХрд╛ `requirements.txt` рдРрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
```
fastapi[standard]>=0.113.0,<0.114.0
pydantic>=2.7.0,<3.0.0
```
рдФрд░ рдЖрдк рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЙрди package dependencies рдХреЛ `pip` рд╕реЗ install рдХрд░реЗрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
<div class="termy">
```console
$ pip install -r requirements.txt
---> 100%
Successfully installed fastapi pydantic
```
</div>
/// note | рдиреЛрдЯ
Package dependencies define рдФрд░ install рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп formats рдФрд░ tools рднреА рд╣реИрдВред
///
### **FastAPI** Code рдмрдирд╛рдПрдБ { #create-the-fastapi-code }
* рдПрдХ `app` directory рдмрдирд╛рдПрдБ рдФрд░ рдЙрд╕рдореЗрдВ enter рдХрд░реЗрдВред
* рдПрдХ рдЦрд╛рд▓реА file `__init__.py` рдмрдирд╛рдПрдБред
* рдПрдХ `main.py` file рдмрдирд╛рдПрдБ рдЬрд┐рд╕рдореЗрдВ рд╣реЛ:
```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 }
рдЕрдм рдЙрд╕реА project directory рдореЗрдВ рдПрдХ file `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. Official Python base image рд╕реЗ start рдХрд░реЗрдВред
2. Current working directory рдХреЛ `/code` рдкрд░ set рдХрд░реЗрдВред
рдпрд╣реА рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рд╣рдо `requirements.txt` file рдФрд░ `app` directory рд░рдЦреЗрдВрдЧреЗред
3. Requirements рд╡рд╛рд▓реА file рдХреЛ `/code` directory рдореЗрдВ copy рдХрд░реЗрдВред
рдкрд╣рд▓реЗ **рдХреЗрд╡рд▓** requirements рд╡рд╛рд▓реА file copy рдХрд░реЗрдВ, рдмрд╛рдХреА code рдирд╣реАрдВред
рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ file **рдЕрдХреНрд╕рд░ change рдирд╣реАрдВ рд╣реЛрддреА**, Docker рдЗрд╕реЗ detect рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕ step рдХреЗ рд▓рд┐рдП **cache** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдЕрдЧрд▓реЗ step рдХреЗ рд▓рд┐рдП рднреА cache enable рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
4. Requirements file рдореЗрдВ package dependencies install рдХрд░реЗрдВред
`--no-cache-dir` option `pip` рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ downloaded packages рдХреЛ locally save рди рдХрд░реЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рдЬрдм `pip` рдХреЛ рдЙрдиреНрд╣реАрдВ packages рдХреЛ install рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ run рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реЛ, рд▓реЗрдХрд┐рди containers рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИред
/// note | рдиреЛрдЯ
`--no-cache-dir` рдХреЗрд╡рд▓ `pip` рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЗрд╕рдХрд╛ Docker рдпрд╛ containers рд╕реЗ рдХреЛрдИ рд╕рдВрдмрдВрдз рдирд╣реАрдВ рд╣реИред
///
`--upgrade` option `pip` рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ packages рдкрд╣рд▓реЗ рд╕реЗ installed рд╣реИрдВ рддреЛ рдЙрдиреНрд╣реЗрдВ upgrade рдХрд░реЗред
рдХреНрдпреЛрдВрдХрд┐ рдкрд┐рдЫрд▓рд╛ step рдЬрд┐рд╕рдореЗрдВ file copy рдХреА рдЧрдИ рдереА **Docker cache** рджреНрд╡рд╛рд░рд╛ detect рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ step рднреА available рд╣реЛрдиреЗ рдкрд░ **Docker cache рдХрд╛ рдЙрдкрдпреЛрдЧ** рдХрд░реЗрдЧрд╛ред
рдЗрд╕ step рдореЗрдВ cache рдХрд╛ рдЙрдкрдпреЛрдЧ development рдХреЗ рджреМрд░рд╛рди image рдмрд╛рд░-рдмрд╛рд░ build рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХрд╛ рдмрд╣реБрдд **рд╕рдордп** **рдмрдЪрд╛рдПрдЧрд╛**, рд╣рд░ рдмрд╛рд░ рд╕рднреА dependencies рдХреЛ **download рдФрд░ install** рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдпред
5. `./app` directory рдХреЛ `/code` directory рдХреЗ рдЕрдВрджрд░ copy рдХрд░реЗрдВред
рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╕рд╛рд░рд╛ code рд╣реИ, рдФрд░ рдпрд╣реА рд╡рд╣ рдЪреАрдЬрд╝ рд╣реИ рдЬреЛ **рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ change рд╣реЛрддреА** рд╣реИ, Docker **cache** рдЗрд╕ рдпрд╛ рдХрд┐рд╕реА рднреА **рдЖрдЧреЗ рдХреЗ steps** рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, container image build times optimize рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ `Dockerfile` рдХреЗ **end рдХреЗ рдкрд╛рд╕** рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
6. **command** set рдХрд░реЗрдВ рддрд╛рдХрд┐ `fastapi run` рдЙрдкрдпреЛрдЧ рд╣реЛ, рдЬреЛ рдЕрдВрджрд░ рд╕реЗ Uvicorn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
`CMD` strings рдХреА list рд▓реЗрддрд╛ рд╣реИ, рдЗрди strings рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╣реА рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк command line рдореЗрдВ spaces рд╕реЗ рдЕрд▓рдЧ рдХрд░рдХреЗ type рдХрд░реЗрдВрдЧреЗред
рдпрд╣ command **current working directory** рд╕реЗ run рд╣реЛрдЧрд╛, рд╡рд╣реА `/code` directory рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдКрдкрд░ `WORKDIR /code` рд╕реЗ set рдХрд┐рдпрд╛ рд╣реИред
/// tip | рдЯрд┐рдк
Code рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ number bubble рдкрд░ click рдХрд░рдХреЗ review рдХрд░реЗрдВ рдХрд┐ рд╣рд░ line рдХреНрдпрд╛ рдХрд░рддреА рд╣реИред ЁЯСЖ
///
/// warning | рдЪреЗрддрд╛рд╡рдиреА
рдиреАрдЪреЗ рд╕рдордЭрд╛рдП рдЕрдиреБрд╕рд╛рд░, `CMD` instruction рдХрд╛ **exec form** **рд╣рдореЗрд╢рд╛** use рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред
///
#### `CMD` рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - Exec Form { #use-cmd-exec-form }
[`CMD`](https://docs.docker.com/reference/dockerfile/#cmd) Docker instruction рджреЛ forms рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
тЬЕ **Exec** form:
```Dockerfile
# тЬЕ рдпрд╣ рдХрд░реЗрдВ
CMD ["fastapi", "run", "app/main.py", "--port", "80"]
```
тЫФя╕П **Shell** form:
```Dockerfile
# тЫФя╕П рдпрд╣ рди рдХрд░реЗрдВ
CMD fastapi run app/main.py --port 80
```
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ FastAPI gracefully shutdown рдХрд░ рд╕рдХреЗ рдФрд░ [lifespan events](../advanced/events.md) trigger рд╣реЛрдВ, рд╣рдореЗрд╢рд╛ **exec** form use рдХрд░реЗрдВред
рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ [shell рдФрд░ exec form рдХреЗ рд▓рд┐рдП Docker docs](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form) рдореЗрдВ рдФрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
`docker compose` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдХрд╛рдлреА noticeable рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрдзрд┐рдХ technical details рдХреЗ рд▓рд┐рдП рдпрд╣ Docker Compose FAQ section рджреЗрдЦреЗрдВ: [рдореЗрд░реА services рдХреЛ recreate рдпрд╛ stop рд╣реЛрдиреЗ рдореЗрдВ 10 seconds рдХреНрдпреЛрдВ рд▓рдЧрддреЗ рд╣реИрдВ?](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop).
#### Directory Structure { #directory-structure }
рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕реА directory structure рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:
```
.
тФЬтФАтФА app
тФВ┬а┬а тФЬтФАтФА __init__.py
тФВ тФФтФАтФА main.py
тФЬтФАтФА Dockerfile
тФФтФАтФА requirements.txt
```
#### TLS Termination Proxy рдХреЗ рдкреАрдЫреЗ { #behind-a-tls-termination-proxy }
рдпрджрд┐ рдЖрдк рдЕрдкрдирд╛ container Nginx рдпрд╛ Traefik рдЬреИрд╕реЗ TLS Termination Proxy (load balancer) рдХреЗ рдкреАрдЫреЗ рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ option `--proxy-headers` рдЬреЛрдбрд╝реЗрдВ, рдпрд╣ Uvicorn (FastAPI CLI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдЙрд╕ proxy рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЧрдП headers рдкрд░ trust рдХрд░реЗ, рдЬреЛ рдЙрд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ application HTTPS рдХреЗ рдкреАрдЫреЗ рдЪрд▓ рд░рд╣реА рд╣реИ, рдЖрджрд┐ред
```Dockerfile
CMD ["fastapi", "run", "app/main.py", "--proxy-headers", "--port", "80"]
```
#### Docker Cache { #docker-cache }
рдЗрд╕ `Dockerfile` рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг trick рд╣реИ, рд╣рдо рдкрд╣рд▓реЗ **рдХреЗрд╡рд▓ dependencies рд╡рд╛рд▓реА file** copy рдХрд░рддреЗ рд╣реИрдВ, рдмрд╛рдХреА code рдирд╣реАрдВред рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдБ рдХреНрдпреЛрдВред
```Dockerfile
COPY ./requirements.txt /code/requirements.txt
```
Docker рдФрд░ рдЕрдиреНрдп tools рдЗрди container images рдХреЛ **incrementally build** рдХрд░рддреЗ рд╣реИрдВ, **рдПрдХ layer рдХреЗ рдКрдкрд░ рджреВрд╕рд░реА layer** рдЬреЛрдбрд╝рддреЗ рд╣реБрдП, `Dockerfile` рдХреЗ top рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ рдФрд░ `Dockerfile` рдХреЗ рдкреНрд░рддреНрдпреЗрдХ instruction рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдХреЛрдИ рднреА files рдЬреЛрдбрд╝рддреЗ рд╣реБрдПред
Docker рдФрд░ рд╕рдорд╛рди tools image build рдХрд░рддреЗ рд╕рдордп **internal cache** рднреА use рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рдХреЛрдИ file рдкрд┐рдЫрд▓реА рдмрд╛рд░ container image build рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ change рдирд╣реАрдВ рд╣реБрдИ рд╣реИ, рддреЛ рд╡рд╣ file рдХреЛ рдлрд┐рд░ рд╕реЗ copy рдХрд░рдиреЗ рдФрд░ scratch рд╕реЗ рдирдИ layer рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдмрдирд╛рдИ рдЧрдИ **рдЙрд╕реА layer рдХреЛ reuse** рдХрд░реЗрдЧрд╛ред
рд╕рд┐рд░реНрдл files copy рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рдХрд░ рджреЗ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕рдиреЗ рдЙрд╕ step рдХреЗ рд▓рд┐рдП cache use рдХрд┐рдпрд╛, рд╡рд╣ **рдЕрдЧрд▓реЗ step рдХреЗ рд▓рд┐рдП cache use** рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╣ рдЙрд╕ instruction рдХреЗ рд▓рд┐рдП cache use рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ dependencies install рдХрд░рддрд╛ рд╣реИ:
```Dockerfile
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
```
Package requirements рд╡рд╛рд▓реА file **рдЕрдХреНрд╕рд░ change рдирд╣реАрдВ рд╣реЛрдЧреА**ред рдЗрд╕рд▓рд┐рдП, рдХреЗрд╡рд▓ рдЙрд╕ file рдХреЛ copy рдХрд░рдХреЗ, Docker рдЙрд╕ step рдХреЗ рд▓рд┐рдП **cache use** рдХрд░ рдкрд╛рдПрдЧрд╛ред
рдФрд░ рдлрд┐рд░, Docker рдЙрди dependencies рдХреЛ download рдФрд░ install рдХрд░рдиреЗ рд╡рд╛рд▓реЗ **рдЕрдЧрд▓реЗ step рдХреЗ рд▓рд┐рдП cache use** рдХрд░ рдкрд╛рдПрдЧрд╛ред рдФрд░ рдпрд╣реАрдВ рд╣рдо **рдмрд╣реБрдд рд╕рдордп рдмрдЪрд╛рддреЗ рд╣реИрдВ**ред тЬи ...рдФрд░ рдЗрдВрддрдЬрд╝рд╛рд░ рдХреА рдмреЛрд░рд┐рдпрдд рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВред ЁЯШкЁЯШЖ
Package dependencies рдХреЛ download рдФрд░ install рдХрд░рдиреЗ рдореЗрдВ **minutes рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВ**, рд▓реЗрдХрд┐рди **cache** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХрддрдо **seconds** рд▓рдЧреЗрдВрдЧреЗред
рдФрд░ рдХреНрдпреЛрдВрдХрд┐ development рдХреЗ рджреМрд░рд╛рди рдЖрдк рдЕрдкрдиреЗ code changes рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рдпрд╣ check рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП container image рдмрд╛рд░-рдмрд╛рд░ build рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░рд╛ рдЬрдорд╛ рд╣реБрдЖ рд╕рдордп рдмрдЪреЗрдЧрд╛ред
рдлрд┐рд░, `Dockerfile` рдХреЗ end рдХреЗ рдкрд╛рд╕, рд╣рдо рд╕рд╛рд░рд╛ code copy рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣реА рд╡рд╣ рдЪреАрдЬрд╝ рд╣реИ рдЬреЛ **рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ change рд╣реЛрддреА** рд╣реИ, рд╣рдо рдЗрд╕реЗ end рдХреЗ рдкрд╛рд╕ рд░рдЦрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдЗрд╕ step рдХреЗ рдмрд╛рдж рдХреБрдЫ рднреА cache use рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдЧрд╛ред
```Dockerfile
COPY ./app /code/app
```
### Docker Image Build рдХрд░реЗрдВ { #build-the-docker-image }
рдЕрдм рдЬрдм рд╕рднреА files рдЕрдкрдиреА рдЬрдЧрд╣ рдкрд░ рд╣реИрдВ, рдЪрд▓рд┐рдП container image build рдХрд░рддреЗ рд╣реИрдВред
* Project directory рдореЗрдВ рдЬрд╛рдПрдБ (рдЬрд╣рд╛рдБ рдЖрдкрдХрд╛ `Dockerfile` рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреА `app` directory рд╣реИ)ред
* рдЕрдкрдиреА FastAPI image build рдХрд░реЗрдВ:
<div class="termy">
```console
$ docker build -t myimage .
---> 100%
```
</div>
/// tip | рдЯрд┐рдк
рдЕрдВрдд рдореЗрдВ `.` рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдпрд╣ `./` рдХреЗ equivalent рд╣реИ, рдпрд╣ Docker рдХреЛ container image build рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП use рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА directory рдмрддрд╛рддрд╛ рд╣реИред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╡рд╣реА current directory (`.`) рд╣реИред
///
### Docker Container Start рдХрд░реЗрдВ { #start-the-docker-container }
* рдЕрдкрдиреА image рдкрд░ рдЖрдзрд╛рд░рд┐рдд container run рдХрд░реЗрдВ:
<div class="termy">
```console
$ docker run -d --name mycontainer -p 80:80 myimage
```
</div>
## рдЗрд╕реЗ Check рдХрд░реЗрдВ { #check-it }
рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ Docker container рдХреЗ URL рдореЗрдВ check рдХрд░ рдкрд╛рдПрдБрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: [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) (рдпрд╛ equivalent, рдЕрдкрдиреЗ Docker host рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред
рдЖрдкрдХреЛ рдХреБрдЫ рдРрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:
```JSON
{"item_id": 5, "q": "somequery"}
```
## Interactive API docs { #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) (рдпрд╛ equivalent, рдЕрдкрдиреЗ Docker host рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк automatic interactive API documentation рджреЗрдЦреЗрдВрдЧреЗ ([Swagger UI](https://github.com/swagger-api/swagger-ui) рджреНрд╡рд╛рд░рд╛ provided):
![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png)
## Alternative API docs { #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) (рдпрд╛ equivalent, рдЕрдкрдиреЗ Docker host рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдкрд░ рднреА рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк alternative automatic documentation рджреЗрдЦреЗрдВрдЧреЗ ([ReDoc](https://github.com/Rebilly/ReDoc) рджреНрд╡рд╛рд░рд╛ provided):
![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)
## Single-File FastAPI рдХреЗ рд╕рд╛рде Docker Image рдмрдирд╛рдПрдБ { #build-a-docker-image-with-a-single-file-fastapi }
рдпрджрд┐ рдЖрдкрдХреА FastAPI рдПрдХ single file рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, `./app` directory рдХреЗ рдмрд┐рдирд╛ `main.py`, рддреЛ рдЖрдкрдХреА file structure рдРрд╕реА рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:
```
.
тФЬтФАтФА Dockerfile
тФЬтФАтФА main.py
тФФтФАтФА requirements.txt
```
рдлрд┐рд░ рдЖрдкрдХреЛ рдмрд╕ `Dockerfile` рдХреЗ рдЕрдВрджрд░ file copy рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд paths рдмрджрд▓рдиреЗ рд╣реЛрдВрдЧреЗ:
```{ .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` file рдХреЛ рд╕реАрдзреЗ `/code` directory рдореЗрдВ copy рдХрд░реЗрдВ (рдмрд┐рдирд╛ рдХрд┐рд╕реА `./app` directory рдХреЗ)ред
2. Single file `main.py` рдореЗрдВ рдЕрдкрдиреА application serve рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `fastapi run` use рдХрд░реЗрдВред
рдЬрдм рдЖрдк file рдХреЛ `fastapi run` рдореЗрдВ pass рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ automatically detect рдХрд░реЗрдЧрд╛ рдХрд┐ рдпрд╣ single file рд╣реИ рдФрд░ рдХрд┐рд╕реА package рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдЬрд╛рди рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ import рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЖрдкрдХреА FastAPI app рдХреЛ serve рдХрд░рдирд╛ рд╣реИред ЁЯШО
## Deployment Concepts { #deployment-concepts }
рдЖрдЗрдП containers рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЙрдиреНрд╣реАрдВ рдХреБрдЫ [Deployment Concepts](concepts.md) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВред
Containers рдореБрдЦреНрдп рд░реВрдк рд╕реЗ application рдХреЛ **build рдФрд░ deploy** рдХрд░рдиреЗ рдХреА process рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ tool рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЗрди **deployment concepts** рдХреЛ handle рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ particular approach enforce рдирд╣реАрдВ рдХрд░рддреЗ, рдФрд░ рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд strategies рд╣реИрдВред
**рдЕрдЪреНрдЫреА рдЦрдмрд░** рдпрд╣ рд╣реИ рдХрд┐ рд╣рд░ рдЕрд▓рдЧ strategy рдХреЗ рд╕рд╛рде рд╕рднреА deployment concepts рдХреЛ cover рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред ЁЯОЙ
рдЖрдЗрдП рдЗрди **deployment concepts** рдХреЛ containers рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ review рдХрд░реЗрдВ:
* HTTPS
* startup рдкрд░ Running
* Restarts
* Replication (running processes рдХреА рд╕рдВрдЦреНрдпрд╛)
* Memory
* Start рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ previous steps
## HTTPS { #https }
рдпрджрд┐ рд╣рдо FastAPI application рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл **container image** (рдФрд░ рдмрд╛рдж рдореЗрдВ running **container**) рдкрд░ focus рдХрд░реЗрдВ, рддреЛ HTTPS рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдХрд┐рд╕реА рдЕрдиреНрдп tool рджреНрд╡рд╛рд░рд╛ **externally** handle рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрд╣ рдХреЛрдИ рджреВрд╕рд░рд╛ container рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП [Traefik](https://traefik.io/) рдХреЗ рд╕рд╛рде, рдЬреЛ **HTTPS** рдФрд░ **certificates** рдХреА **automatic** acquisition handle рдХрд░рддрд╛ рд╣реИред
/// tip | рдЯрд┐рдк
Traefik рдХреЗ Docker, Kubernetes, рдФрд░ рдЕрдиреНрдп рдХреЗ рд╕рд╛рде integrations рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ containers рдХреЗ рд▓рд┐рдП HTTPS set up рдФрд░ configure рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
///
рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, HTTPS рдХреЛ рдХрд┐рд╕реА cloud provider рджреНрд╡рд╛рд░рд╛ рдЙрдирдХреА services рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ handle рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (application рдЕрднреА рднреА container рдореЗрдВ рдЪрд▓ рд░рд╣реА рд╣реЛ)ред
## Startup рдкрд░ Running рдФрд░ Restarts { #running-on-startup-and-restarts }
рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдХреЛрдИ рджреВрд╕рд░рд╛ tool рдЖрдкрдХреЗ container рдХреЛ **start рдФрд░ run** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП charge рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ рд╕реАрдзреЗ **Docker**, **Docker Compose**, **Kubernetes**, рдХреЛрдИ **cloud service**, рдЖрджрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдзрд┐рдХрддрд░ (рдпрд╛ рд╕рднреА) рдорд╛рдорд▓реЛрдВ рдореЗрдВ, startup рдкрд░ container run рдХрд░рдиреЗ рдФрд░ failures рдкрд░ restarts enable рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ simple option рд╣реЛрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Docker рдореЗрдВ рдпрд╣ command line option `--restart` рд╣реИред
Containers рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛, applications рдХреЛ startup рдкрд░ рдФрд░ restarts рдХреЗ рд╕рд╛рде run рдХрд░рд╛рдирд╛ cumbersome рдФрд░ difficult рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди **containers рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп** рдЕрдзрд┐рдХрддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ functionality default рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИред тЬи
## Replication - Processes рдХреА рд╕рдВрдЦреНрдпрд╛ { #replication-number-of-processes }
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ machines рдХрд╛ <dfn title="рдорд╢реАрдиреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдЬреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ connect рд╣реЛрдиреЗ рдФрд░ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП configured рд╣реИрдВред">cluster</dfn> рд╣реИ рдЬрд┐рд╕рдореЗрдВ **Kubernetes**, Docker Swarm Mode, Nomad, рдпрд╛ multiple machines рдкрд░ distributed containers manage рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреНрдп similar complex system рд╣реИ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдкреНрд░рддреНрдпреЗрдХ container рдореЗрдВ **process manager** (рдЬреИрд╕реЗ workers рдХреЗ рд╕рд╛рде Uvicorn) рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп **cluster level** рдкрд░ **replication handle** рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
Kubernetes рдЬреИрд╕реЗ distributed container management systems рдореЗрдВ incoming requests рдХреЗ рд▓рд┐рдП **load balancing** support рдХрд░рддреЗ рд╣реБрдП **containers рдХреА replication** handle рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ integrated рддрд░реАрдХрд╛ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рд╣реЛрддрд╛ рд╣реИред рд╕рдм **cluster level** рдкрд░ред
рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк рд╢рд╛рдпрдж рдКрдкрд░ [рд╕рдордЭрд╛рдП рдЕрдиреБрд╕рд╛рд░](#dockerfile) **scratch рд╕реЗ Docker image** build рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдЕрдкрдиреА dependencies install рдХрд░рдХреЗ, рдФрд░ multiple Uvicorn workers рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп **single Uvicorn process** run рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
### Load Balancer { #load-balancer }
Containers рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдХреЛрдИ component рд╣реЛрдЧрд╛ рдЬреЛ **main port рдкрд░ listening** рдХрд░ рд░рд╣рд╛ рд╣реЛрдЧрд╛ред рд╕рдВрднрд╡рддрдГ рдпрд╣ рдХреЛрдИ рджреВрд╕рд░рд╛ container рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ **HTTPS** handle рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **TLS Termination Proxy** рднреА рд╣реЛ, рдпрд╛ рдХреЛрдИ similar toolред
рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ component requests рдХрд╛ **load** рд▓реЗрдЧрд╛ рдФрд░ рдЙрд╕реЗ workers рдореЗрдВ (рдЙрдореНрдореАрдж рд╣реИ) **balanced** рддрд░реАрдХреЗ рд╕реЗ distribute рдХрд░реЗрдЧрд╛, рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдпрддрдГ **Load Balancer** рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
/// tip | рдЯрд┐рдк
HTTPS рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡рд╣реА **TLS Termination Proxy** component рд╢рд╛рдпрдж **Load Balancer** рднреА рд╣реЛрдЧрд╛ред
///
рдФрд░ containers рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЙрдиреНрд╣реЗрдВ start рдФрд░ manage рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдЬреЛ system use рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕рдореЗрдВ рдЙрд╕ **load balancer** (рдЬреЛ **TLS Termination Proxy** рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рд╕реЗ рдЖрдкрдХреА app рд╡рд╛рд▓реЗ container(s) рддрдХ **network communication** (рдЬреИрд╕реЗ HTTP requests) transmit рдХрд░рдиреЗ рдХреЗ internal tools рдкрд╣рд▓реЗ рд╕реЗ рд╣реЛрдВрдЧреЗред
### One Load Balancer - Multiple Worker Containers { #one-load-balancer-multiple-worker-containers }
**Kubernetes** рдпрд╛ similar distributed container management systems рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЙрдирдХреЗ internal networking mechanisms рдХрд╛ рдЙрдкрдпреЛрдЧ main **port** рдкрд░ listening рдХрд░рдиреЗ рд╡рд╛рд▓реЗ single **load balancer** рдХреЛ communication (requests) рдЖрдкрдХреА app рдЪрд▓рд╛ рд░рд╣реЗ рд╕рдВрднрд╡рддрдГ **multiple containers** рддрдХ transmit рдХрд░рдиреЗ рджреЗрдЧрд╛ред
рдЖрдкрдХреА app рдЪрд▓рд╛ рд░рд╣реЗ рдЗрди containers рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдпрддрдГ **рд╕рд┐рд░реНрдл рдПрдХ process** рд╣реЛрдЧрд╛ (рдЬреИрд╕реЗ рдЖрдкрдХреА FastAPI application рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓рд╛ Uvicorn process)ред рд╡реЗ рд╕рднреА **identical containers** рд╣реЛрдВрдЧреЗ, рд╡рд╣реА рдЪреАрдЬрд╝ рдЪрд▓рд╛ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрдкрдирд╛ process, memory, рдЖрджрд┐ рд╣реЛрдЧрд╛ред рдЗрд╕ рддрд░рд╣ рдЖрдк CPU рдХреЗ **different cores** рдореЗрдВ, рдпрд╛ рдпрд╣рд╛рдБ рддрдХ рдХрд┐ **different machines** рдореЗрдВ **parallelization** рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдПрдБрдЧреЗред
рдФрд░ **load balancer** рд╡рд╛рд▓рд╛ distributed container system requests рдХреЛ рдЖрдкрдХреА app рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ container рддрдХ **рдмрд╛рд░реА-рдмрд╛рд░реА рд╕реЗ distribute** рдХрд░реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ request рдЖрдкрдХреА app рдЪрд▓рд╛ рд░рд╣реЗ multiple **replicated containers** рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рджреНрд╡рд╛рд░рд╛ handle рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдФрд░ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдпрд╣ **load balancer** рдЖрдкрдХреЗ cluster рдореЗрдВ *other* apps рдкрд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА requests handle рдХрд░ рдкрд╛рдПрдЧрд╛ (рдЬреИрд╕реЗ рдЕрд▓рдЧ domain рдкрд░, рдпрд╛ рдЕрд▓рдЧ URL path prefix рдХреЗ рддрд╣рдд), рдФрд░ рдЙрд╕ communication рдХреЛ рдЖрдкрдХреЗ cluster рдореЗрдВ рдЪрд▓ рд░рд╣реА *рдЙрд╕ other* application рдХреЗ рд╕рд╣реА containers рддрдХ transmit рдХрд░реЗрдЧрд╛ред
### рдкреНрд░рддрд┐ Container рдПрдХ Process { #one-process-per-container }
рдЗрд╕ рддрд░рд╣ рдХреЗ scenario рдореЗрдВ, рдЖрдк рд╢рд╛рдпрдж **рдкреНрд░рддрд┐ container рдПрдХ single (Uvicorn) process** рд░рдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА cluster level рдкрд░ replication handle рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗред
рддреЛ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк container рдореЗрдВ multiple workers **рдирд╣реАрдВ** рд░рдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП `--workers` command line option рдХреЗ рд╕рд╛рдеред рдЖрдк рдкреНрд░рддрд┐ container рдмрд╕ **single Uvicorn process** рд░рдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ (рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж multiple containers)ред
Container рдХреЗ рдЕрдВрджрд░ рдПрдХ рдФрд░ process manager рд░рдЦрдирд╛ (рдЬреИрд╕рд╛ multiple workers рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛) рдХреЗрд╡рд▓ **unnecessary complexity** рдЬреЛрдбрд╝реЗрдЧрд╛, рдЬрд┐рд╕реЗ рдЖрдк рдмрд╣реБрдд рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЕрдкрдиреЗ cluster system рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рд╕рдВрднрд╛рд▓ рд░рд╣реЗ рд╣реИрдВред
### Multiple Processes рд╡рд╛рд▓реЗ Containers рдФрд░ Special Cases { #containers-with-multiple-processes-and-special-cases }
рдмреЗрд╢рдХ, рдРрд╕реЗ **special cases** рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдк рдЕрдВрджрд░ рдХрдИ **Uvicorn worker processes** рд╡рд╛рд▓рд╛ **container** рд░рдЦрдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк run рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ workers рдХреА рд╕рдВрдЦреНрдпрд╛ set рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `--workers` command line option рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
```{ .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 рдкрд░ set рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `--workers` command line option рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рдХреБрдЫ examples рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрдм meaningful рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
#### рдПрдХ Simple App { #a-simple-app }
рдпрджрд┐ рдЖрдкрдХреА application **рдЗрддрдиреА simple** рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ **single server** рдкрд░ run рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, cluster рдкрд░ рдирд╣реАрдВ, рддреЛ рдЖрдк container рдореЗрдВ process manager рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред
#### Docker Compose { #docker-compose }
рдЖрдк **Docker Compose** рдХреЗ рд╕рд╛рде **single server** (cluster рдирд╣реАрдВ) рдкрд░ deploy рдХрд░ рд░рд╣реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП shared network рдФрд░ **load balancing** preserve рдХрд░рддреЗ рд╣реБрдП containers рдХреА replication (Docker Compose рдХреЗ рд╕рд╛рде) manage рдХрд░рдиреЗ рдХрд╛ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдлрд┐рд░ рдЖрдк **single container** рд░рдЦрдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ **process manager** рдЕрдВрджрд░ **рдХрдИ worker processes** start рдХрд░реЗред
---
рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ **рдХреЛрдИ рднреА** рдРрд╕реА **рдкрддреНрдерд░ рдкрд░ рд▓рд┐рдЦреА rules** рдирд╣реАрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рдЖрдБрдЦ рдмрдВрдж рдХрд░рдХреЗ follow рдХрд░рдирд╛ рд╣реЛред рдЖрдк рдЗрди ideas рдХрд╛ рдЙрдкрдпреЛрдЧ **рдЕрдкрдиреЗ use case рдХрд╛ evaluate** рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреЗ system рдХреЗ рд▓рд┐рдП best approach рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ check рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдЗрди concepts рдХреЛ рдХреИрд╕реЗ manage рдХрд░рдирд╛ рд╣реИ:
* Security - HTTPS
* startup рдкрд░ Running
* Restarts
* Replication (running processes рдХреА рд╕рдВрдЦреНрдпрд╛)
* Memory
* Start рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ previous steps
## Memory { #memory }
рдпрджрд┐ рдЖрдк **рдкреНрд░рддрд┐ container single process** run рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрди containers рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ (рдпрджрд┐ replicated рд╣реИрдВ рддреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ) рджреНрд╡рд╛рд░рд╛ consumed memory рдХреА quantity рдХрдореЛрдмреЗрд╢ well-defined, stable, рдФрд░ limited рд╣реЛрдЧреАред
рдФрд░ рдлрд┐рд░ рдЖрдк рдЕрдкрдиреЗ container management system (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП **Kubernetes** рдореЗрдВ) рдХреА configurations рдореЗрдВ рд╡рд╣реА memory limits рдФрд░ requirements set рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рд╡рд╣ рдЙрди containers рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ memory рдХреА рдорд╛рддреНрд░рд╛, рдФрд░ cluster рдореЗрдВ machines рдореЗрдВ available рдорд╛рддреНрд░рд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП **available machines** рдореЗрдВ **containers replicate** рдХрд░ рдкрд╛рдПрдЧрд╛ред
рдпрджрд┐ рдЖрдкрдХреА application **simple** рд╣реИ, рддреЛ рдпрд╣ рд╢рд╛рдпрдж **problem рдирд╣реАрдВ рд╣реЛрдЧреА**, рдФрд░ рдЖрдкрдХреЛ hard memory limits specify рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреАред рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк **рдмрд╣реБрдд memory use** рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП **machine learning** models рдХреЗ рд╕рд╛рде), рддреЛ рдЖрдкрдХреЛ check рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдк рдХрд┐рддрдиреА memory consume рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ **рдкреНрд░рддреНрдпреЗрдХ machine** рдкрд░ run рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ **containers рдХреА рд╕рдВрдЦреНрдпрд╛** adjust рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП (рдФрд░ рд╢рд╛рдпрдж рдЕрдкрдиреЗ cluster рдореЗрдВ рдФрд░ machines add рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП)ред
рдпрджрд┐ рдЖрдк **рдкреНрд░рддрд┐ container multiple processes** run рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ start рдХрд┐рдП рдЧрдП processes рдХреА рд╕рдВрдЦреНрдпрд╛ available memory рд╕реЗ **рдЕрдзрд┐рдХ memory consume** рди рдХрд░реЗред
## Start рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ Previous Steps рдФрд░ Containers { #previous-steps-before-starting-and-containers }
рдпрджрд┐ рдЖрдк containers (рдЬреИрд╕реЗ Docker, Kubernetes) рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рджреЛ рдореБрдЦреНрдп approaches рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
### Multiple Containers { #multiple-containers }
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ **multiple containers** рд╣реИрдВ, рд╢рд╛рдпрдж рдкреНрд░рддреНрдпреЗрдХ **single process** run рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, **Kubernetes** cluster рдореЗрдВ), рддреЛ рдЖрдк replicated worker containers run рдХрд░рдиреЗ рд╕реЗ **рдкрд╣рд▓реЗ**, single container рдореЗрдВ, single process рдЪрд▓рд╛рддреЗ рд╣реБрдП, **previous steps** рдХрд╛ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ **separate container** рд░рдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
/// note | рдиреЛрдЯ
рдпрджрд┐ рдЖрдк Kubernetes рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╢рд╛рдпрдж [Init Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/) рд╣реЛрдЧрд╛ред
///
рдпрджрд┐ рдЖрдкрдХреЗ use case рдореЗрдВ рдЙрди previous steps рдХреЛ **parallel рдореЗрдВ multiple times** run рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ problem рдирд╣реАрдВ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдЖрдк database migrations рдирд╣реАрдВ рдЪрд▓рд╛ рд░рд╣реЗ, рдмрд▓реНрдХрд┐ рдмрд╕ check рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ database рдЕрднреА ready рд╣реИ рдпрд╛ рдирд╣реАрдВ), рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╣рд░ container рдореЗрдВ main process start рдХрд░рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рднреА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред
### Single Container { #single-container }
рдпрджрд┐ рдЖрдкрдХрд╛ setup simple рд╣реИ, рдЬрд┐рд╕рдореЗрдВ **single container** рд╣реИ рдЬреЛ рдлрд┐рд░ multiple **worker processes** start рдХрд░рддрд╛ рд╣реИ (рдпрд╛ рд╕рд┐рд░реНрдл рдПрдХ process), рддреЛ рдЖрдк app рдХреЗ рд╕рд╛рде process start рдХрд░рдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ, рдЙрди previous steps рдХреЛ рдЙрд╕реА container рдореЗрдВ run рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
### Base Docker Image { #base-docker-image }
рдПрдХ official FastAPI Docker image рд╣реБрдЖ рдХрд░рддреА рдереА: [tiangolo/uvicorn-gunicorn-fastapi](https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker)ред рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ deprecated рд╣реИред тЫФя╕П
рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдЗрд╕ base Docker image (рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп similar one) рдХрд╛ рдЙрдкрдпреЛрдЧ **рдирд╣реАрдВ** рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрджрд┐ рдЖрдк **Kubernetes** (рдпрд╛ рдЕрдиреНрдп) рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА cluster level рдкрд░, multiple **containers** рдХреЗ рд╕рд╛рде **replication** set рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдКрдкрд░ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ **scratch рд╕реЗ image build** рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ: [FastAPI рдХреЗ рд▓рд┐рдП Docker Image рдмрдирд╛рдПрдБ](#build-a-docker-image-for-fastapi).
рдФрд░ рдпрджрд┐ рдЖрдкрдХреЛ multiple workers рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдмрд╕ `--workers` command line option рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
/// note | Technical Details
Docker image рддрдм рдмрдирд╛рдИ рдЧрдИ рдереА рдЬрдм Uvicorn dead workers рдХреЛ manage рдФрд░ restart рдХрд░рдиреЗ рдХрд╛ support рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП Uvicorn рдХреЗ рд╕рд╛рде Gunicorn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ required рдерд╛, рдЬрд┐рд╕рд╕реЗ рдХрд╛рдлреА complexity рдЬреБрдбрд╝рддреА рдереА, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ Gunicorn Uvicorn worker processes рдХреЛ manage рдФрд░ restart рдХрд░ рд╕рдХреЗред
рд▓реЗрдХрд┐рди рдЕрдм рдЬрдм Uvicorn (рдФрд░ `fastapi` command) `--workers` use рдХрд░рдиреЗ рдХрд╛ support рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдкрдиреА рдЦреБрдж рдХреА build рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп base Docker image рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ (рдпрд╣ рд▓рдЧрднрдЧ рдЙрддрдиреА рд╣реА code рдХреА рдорд╛рддреНрд░рд╛ рд╣реИ ЁЯШЕ).
///
## Container Image Deploy рдХрд░реЗрдВ { #deploy-the-container-image }
Container (Docker) Image рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ deploy рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
* Single server рдореЗрдВ **Docker Compose** рдХреЗ рд╕рд╛рде
* **Kubernetes** cluster рдХреЗ рд╕рд╛рде
* Docker Swarm Mode cluster рдХреЗ рд╕рд╛рде
* Nomad рдЬреИрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп tool рдХреЗ рд╕рд╛рде
* рдХрд┐рд╕реА cloud service рдХреЗ рд╕рд╛рде рдЬреЛ рдЖрдкрдХреА container image рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ deploy рдХрд░рддрд╛ рд╣реИ
## `uv` рдХреЗ рд╕рд╛рде Docker Image { #docker-image-with-uv }
рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ project рдХреЛ install рдФрд░ manage рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП [uv](https://github.com/astral-sh/uv) рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдирдХреА [uv Docker guide](https://docs.astral.sh/uv/guides/integration/docker/) follow рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
## Recap { #recap }
Container systems (рдЬреИрд╕реЗ **Docker** рдФрд░ **Kubernetes** рдХреЗ рд╕рд╛рде) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╕рднреА **deployment concepts** handle рдХрд░рдирд╛ рдХрд╛рдлреА straightforward рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:
* HTTPS
* startup рдкрд░ Running
* Restarts
* Replication (running processes рдХреА рд╕рдВрдЦреНрдпрд╛)
* Memory
* Start рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ previous steps
рдЕрдзрд┐рдХрддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк рд╢рд╛рдпрдж рдХреЛрдИ base image use рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп official Python Docker image рдкрд░ рдЖрдзрд╛рд░рд┐рдд **scratch рд╕реЗ container image build** рдХрд░реЗрдВрдЧреЗред
`Dockerfile` рдореЗрдВ instructions рдХреЗ **order** рдФрд░ **Docker cache** рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдХрд░ рдЖрдк **build times minimize** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЖрдкрдХреА productivity maximize рд╣реЛ (рдФрд░ рдмреЛрд░рд┐рдпрдд рд╕реЗ рдмрдЪреЗрдВ)ред ЁЯШО

47
docs/hi/docs/deployment/fastapicloud.md

@ -0,0 +1,47 @@
# FastAPI Cloud { #fastapi-cloud }
рдЖрдк рдЕрдкрдиреА FastAPI app рдХреЛ рд╕рд┐рд░реНрдл **рдПрдХ command** рд╕реЗ [FastAPI Cloud](https://fastapicloud.com) рдкрд░ deploy рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ЁЯЪА
<div class="termy">
```console
$ fastapi deploy
Deploying to FastAPI Cloud...
тЬЕ Deployment successful!
ЁЯРФ Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev
```
</div>
CLI рдЕрдкрдиреЗ-рдЖрдк рдЖрдкрдХреА FastAPI application рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд▓реЗрдЧрд╛ рдФрд░ рдЙрд╕реЗ cloud рдкрд░ deploy рдХрд░ рджреЗрдЧрд╛ред рдЕрдЧрд░ рдЖрдк logged in рдирд╣реАрдВ рд╣реИрдВ, рддреЛ authentication рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ browser рдЦреБрд▓реЗрдЧрд╛ред
рдмрд╕ рдЗрддрдирд╛ рд╣реА! рдЕрдм рдЖрдк рдЙрд╕ URL рдкрд░ рдЕрдкрдиреА app access рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред тЬи
## FastAPI Cloud рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ { #about-fastapi-cloud }
**[FastAPI Cloud](https://fastapicloud.com)** рдЙрд╕реА author рдФрд░ team рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ **FastAPI** рдХреЗ рдкреАрдЫреЗ рд╣реИрдВред
рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рдпрд╛рд╕ рдореЗрдВ API рдХреЛ **build** рдХрд░рдиреЗ, **deploy** рдХрд░рдиреЗ, рдФрд░ **access** рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред
рдпрд╣ FastAPI рдХреЗ рд╕рд╛рде apps рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдЙрд╕реА **developer experience** рдХреЛ рдЙрдиреНрд╣реЗрдВ cloud рдкрд░ **deploy** рдХрд░рдиреЗ рдореЗрдВ рднреА рд▓рд╛рддрд╛ рд╣реИред ЁЯОЙ
рдпрд╣ app deploy рдХрд░рддреЗ рд╕рдордп рдЬрд╝рд░реВрд░реА рдЕрдзрд┐рдХрд╛рдВрд╢ рдЪреАрдЬрд╝реЛрдВ рдХрд╛ рднреА рдзреНрдпрд╛рди рд░рдЦреЗрдЧрд╛, рдЬреИрд╕реЗ:
* HTTPS
* Replication, requests рдХреЗ рдЖрдзрд╛рд░ рдкрд░ autoscaling рдХреЗ рд╕рд╛рде
* рдЖрджрд┐ред
FastAPI Cloud, *FastAPI and friends* open source projects рдХрд╛ рдореБрдЦреНрдп sponsor рдФрд░ funding provider рд╣реИред тЬи
## рджреВрд╕рд░реЗ cloud providers рдкрд░ deploy рдХрд░реЗрдВ { #deploy-to-other-cloud-providers }
FastAPI open source рд╣реИ рдФрд░ standards рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЖрдк FastAPI apps рдХреЛ рдЕрдкрдиреЗ рдЪреБрдиреЗ рд╣реБрдП рдХрд┐рд╕реА рднреА cloud provider рдкрд░ deploy рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрдирдХреЗ рд╕рд╛рде FastAPI apps deploy рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ cloud provider рдХреА guides follow рдХрд░реЗрдВред ЁЯдУ
## рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ server рдкрд░ deploy рдХрд░реЗрдВ { #deploy-your-own-server }
рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕ **Deployment** guide рдореЗрдВ рдЖрдЧреЗ рд╕рднреА details рднреА рд╕рд┐рдЦрд╛рдКрдБрдЧрд╛, рддрд╛рдХрд┐ рдЖрдк рд╕рдордЭ рд╕рдХреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ FastAPI apps рдХреЛ рдЕрдкрдиреЗ-рдЖрдк, рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ servers рдХреЗ рд╕рд╛рде рднреА рдХреИрд╕реЗ deploy рдХрд░рдирд╛ рд╣реИред ЁЯдУ

231
docs/hi/docs/deployment/https.md

@ -0,0 +1,231 @@
# HTTPS рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ { #about-https }
рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ HTTPS рдХреЛрдИ рдРрд╕реА рдЪреАрдЬрд╝ рд╣реИ рдЬрд┐рд╕реЗ рдмрд╕ "enabled" рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рд▓реЗрдХрд┐рди рдпрд╣ рдЙрд╕рд╕реЗ рдХрд╣реАрдВ рдЬрд╝реНрдпрд╛рджрд╛ рдЬрдЯрд┐рд▓ рд╣реИред
/// tip | рд╕реБрдЭрд╛рд╡
рдЕрдЧрд░ рдЖрдк рдЬрд▓реНрджреА рдореЗрдВ рд╣реИрдВ рдпрд╛ рдЖрдкрдХреЛ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрдХрдиреАрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ setup рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП step by step рдирд┐рд░реНрджреЗрд╢реЛрдВ рд╣реЗрддреБ рдЕрдЧрд▓реЗ sections рдкрд░ рдЬрд╛рдПрдБред
///
**HTTPS рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд╕реАрдЦрдиреЗ** рдХреЗ рд▓рд┐рдП, рдПрдХ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рджреЗрдЦреЗрдВ [https://howhttps.works/](https://howhttps.works/)ред
рдЕрдм, рдПрдХ **developer рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг** рд╕реЗ, HTTPS рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╕рдордп рдзреНрдпрд╛рди рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рдХрдИ рдмрд╛рддреЗрдВ рдпрд╣рд╛рдБ рд╣реИрдВ:
* HTTPS рдХреЗ рд▓рд┐рдП, **server** рдХреЗ рдкрд╛рд╕ **рддреАрд╕рд░реЗ рдкрдХреНрд╖** рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП "certificates" рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
* рд╡реЗ certificates рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рд╕реЗ **рдкреНрд░рд╛рдкреНрдд** рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, "generated" рдирд╣реАрдВред
* Certificates рдХреА рдПрдХ **lifespan** рд╣реЛрддреА рд╣реИред
* рд╡реЗ **expire** рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
* рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ **renew** рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рддреАрд╕рд░реЗ рдкрдХреНрд╖ рд╕реЗ **рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд** рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред
* connection рдХрд╛ encryption **TCP level** рдкрд░ рд╣реЛрддрд╛ рд╣реИред
* рдпрд╣ **HTTP рд╕реЗ рдПрдХ layer рдиреАрдЪреЗ** рд╣реИред
* рдЗрд╕рд▓рд┐рдП, **certificate рдФрд░ encryption** handling **HTTP рд╕реЗ рдкрд╣рд▓реЗ** рдХреА рдЬрд╛рддреА рд╣реИред
* **TCP рдХреЛ "domains" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛**ред рдХреЗрд╡рд▓ IP addresses рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред
* рдЬрд┐рд╕ **рд╡рд┐рд╢рд┐рд╖реНрдЯ domain** рдХрд╛ request рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрд╕рдХреА рдЬрд╛рдирдХрд╛рд░реА **HTTP data** рдореЗрдВ рдЬрд╛рддреА рд╣реИред
* **HTTPS certificates** рдХрд┐рд╕реА **рд╡рд┐рд╢рд┐рд╖реНрдЯ domain** рдХреЛ "certify" рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди protocol рдФрд░ encryption TCP level рдкрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕ domain рдХреЛ рдЬрд╛рдирдиреЗ рд╕реЗ **рдкрд╣рд▓реЗ** рдХрд┐ рдХрд┐рд╕ domain рд╕реЗ рдирд┐рдкрдЯрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
* **By default**, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ **рдкреНрд░рддрд┐ IP address рдХреЗрд╡рд▓ рдПрдХ HTTPS certificate** рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
* рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдкрдХрд╛ server рдХрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реИ рдпрд╛ рдЙрд╕ рдкрд░ рдореМрдЬреВрдж рд╣рд░ application рдХрд┐рддрдиреА рдЫреЛрдЯреА рд╣реЛ рд╕рдХрддреА рд╣реИред
* рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХрд╛ рдПрдХ **рд╕рдорд╛рдзрд╛рди** рд╣реИред
* **TLS** protocol (рдЬреЛ HTTP рд╕реЗ рдкрд╣рд▓реЗ, TCP level рдкрд░ encryption рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ) рдХреЗ рд▓рд┐рдП рдПрдХ **extension** рд╣реИ рдЬрд┐рд╕реЗ **[<abbr title="Server Name Indication - рд╕рд░реНрд╡рд░ рдирд╛рдо рд╕рдВрдХреЗрдд">SNI</abbr>](https://en.wikipedia.org/wiki/Server_Name_Indication)** рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
* рдпрд╣ SNI extension рдПрдХ рд╣реА server (рдПрдХ **single IP address** рдХреЗ рд╕рд╛рде) рдХреЛ **рдХрдИ HTTPS certificates** рд░рдЦрдиреЗ рдФрд░ **рдХрдИ HTTPS domains/applications** serve рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
* рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, server рдкрд░ рдЪрд▓ рд░рд╣реЗ, **public IP address** рдкрд░ listen рдХрд░ рд░рд╣реЗ, рдПрдХ **single** component (program) рдХреЗ рдкрд╛рд╕ server рдореЗрдВ **рд╕рднреА HTTPS certificates** рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
* рд╕реБрд░рдХреНрд╖рд┐рдд connection рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ **рдмрд╛рдж**, communication protocol **рдЕрднреА рднреА HTTP** рд░рд╣рддрд╛ рд╣реИред
* contents **encrypted** рд╣реЛрддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдЙрдиреНрд╣реЗрдВ **HTTP protocol** рдХреЗ рд╕рд╛рде рднреЗрдЬрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реЛред
Server (machine, host, рдЖрджрд┐) рдкрд░ **рдПрдХ program/HTTP server** рдЪрд▓рд╛рдирд╛ рдФрд░ **HTTPS рдХреЗ рд╕рднреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ manage** рдХрд░рдирд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп practice рд╣реИ: **encrypted HTTPS requests** рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдЙрд╕реА server рдореЗрдВ рдЪрд▓ рд░рд╣реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ HTTP application (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ **FastAPI** application) рдХреЛ **decrypted HTTP requests** рднреЗрдЬрдирд╛, application рд╕реЗ **HTTP response** рд▓реЗрдирд╛, рдЙрдкрдпреБрдХреНрдд **HTTPS certificate** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕реЗ **encrypt** рдХрд░рдирд╛ рдФрд░ **HTTPS** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ client рдХреЛ рд╡рд╛рдкрд╕ рднреЗрдЬрдирд╛ред рдЗрд╕ server рдХреЛ рдЕрдХреНрд╕рд░ **[TLS Termination Proxy](https://en.wikipedia.org/wiki/TLS_termination_proxy)** рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
TLS Termination Proxy рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдк рдЬрд┐рди options рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣реИрдВ:
* Traefik (рдЬреЛ certificate renewals рднреА handle рдХрд░ рд╕рдХрддрд╛ рд╣реИ)
* Caddy (рдЬреЛ certificate renewals рднреА handle рдХрд░ рд╕рдХрддрд╛ рд╣реИ)
* Nginx
* HAProxy
## Let's Encrypt { #lets-encrypt }
Let's Encrypt рд╕реЗ рдкрд╣рд▓реЗ, рдпреЗ **HTTPS certificates** trusted рддреАрд╕рд░реЗ рдкрдХреНрд╖реЛрдВ рджреНрд╡рд╛рд░рд╛ рдмреЗрдЪреЗ рдЬрд╛рддреЗ рдереЗред
рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА certificate рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрдард┐рди рд╣реЛрддреА рдереА, рдХрд╛рдлреА paperwork рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рдереА рдФрд░ certificates рдХрд╛рдлреА рдорд╣рдВрдЧреЗ рд╣реЛрддреЗ рдереЗред
рд▓реЗрдХрд┐рди рдлрд┐рд░ **[Let's Encrypt](https://letsencrypt.org/)** рдмрдирд╛рдпрд╛ рдЧрдпрд╛ред
рдпрд╣ Linux Foundation рдХрд╛ рдПрдХ project рд╣реИред рдпрд╣ automated рддрд░реАрдХреЗ рд╕реЗ **рдореБрдлреНрдд рдореЗрдВ HTTPS certificates** рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпреЗ certificates рд╕рднреА standard cryptographic security рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ short-lived рд╣реЛрддреЗ рд╣реИрдВ (рд▓рдЧрднрдЧ 3 рдорд╣реАрдиреЗ), рдЗрд╕рд▓рд┐рдП рдЙрдирдХреА рдХрдо lifespan рдХреЗ рдХрд╛рд░рдг **security рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЗрд╣рддрд░** рд╣реЛрддреА рд╣реИред
Domains рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ verify рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ certificates automatically generate рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдЗрди certificates рдХреЗ renewal рдХреЛ automate рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реЛрддрд╛ рд╣реИред
рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЗрди certificates рдХреА acquisition рдФрд░ renewal рдХреЛ automate рдХрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ **secure HTTPS, рдореБрдлреНрдд рдореЗрдВ, рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП** рд╣реЛ рд╕рдХреЗред
## Developers рдХреЗ рд▓рд┐рдП HTTPS { #https-for-developers }
рдпрд╣рд╛рдБ step by step рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ HTTPS API рдХреИрд╕реА рджрд┐рдЦ рд╕рдХрддреА рд╣реИ, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ developers рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реБрдПред
### Domain Name { #domain-name }
рд╕рдм рдХреБрдЫ рд╢рд╛рдпрдж рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХреЛрдИ **domain name** **рдкреНрд░рд╛рдкреНрдд** рдХрд░рдиреЗ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдЧрд╛ред рдлрд┐рд░, рдЖрдк рдЗрд╕реЗ DNS server рдореЗрдВ configure рдХрд░реЗрдВрдЧреЗ (рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЗ рдЙрд╕реА cloud provider рдореЗрдВ)ред
рдЖрдк рд╢рд╛рдпрдж рдПрдХ cloud server (рдПрдХ virtual machine) рдпрд╛ рдХреБрдЫ рд╕рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдПрдХ <dfn title="рд╕рдордп рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдмрджрд▓рддрд╛ред dynamic рдирд╣реАрдВред">рд╕реНрдерд┐рд░</dfn> **public IP address** рд╣реЛрдЧрд╛ред
DNS server(s) рдореЗрдВ рдЖрдк рдПрдХ record (рдПрдХ "`A record`") configure рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ **рдЖрдкрдХрд╛ domain** рдЖрдкрдХреЗ server рдХреЗ public **IP address** рдХреА рдУрд░ point рдХрд░реЗред
рдЖрдк рд╢рд╛рдпрдж рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдмрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдкрд╣рд▓реА рдмрд╛рд░, рдЬрдм рд╕рдм рдХреБрдЫ setup рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗред
/// tip | рд╕реБрдЭрд╛рд╡
рдпрд╣ Domain Name рд╡рд╛рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛ HTTPS рд╕реЗ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдБрдХрд┐ рд╕рдм рдХреБрдЫ domain рдФрд░ IP address рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдпрд╣рд╛рдБ mention рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред
///
### DNS { #dns }
рдЕрдм рдЖрдЗрдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ HTTPS parts рдкрд░ focus рдХрд░реЗрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, browser **DNS servers** рд╕реЗ check рдХрд░реЗрдЧрд╛ рдХрд┐ **domain рдХреЗ рд▓рд┐рдП IP** рдХреНрдпрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, `someapp.example.com`ред
DNS servers browser рдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ **IP address** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВрдЧреЗред рдпрд╣ рдЖрдкрдХреЗ server рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ public IP address рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ DNS servers рдореЗрдВ configure рдХрд┐рдпрд╛ рд╣реИред
<img src="/img/deployment/https/https01.drawio.svg">
### TLS Handshake Start { #tls-handshake-start }
Browser рдлрд┐рд░ рдЙрд╕ IP address рд╕реЗ **port 443** (HTTPS port) рдкрд░ communicate рдХрд░реЗрдЧрд╛ред
Communication рдХрд╛ рдкрд╣рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдХреЗрд╡рд▓ client рдФрд░ server рдХреЗ рдмреАрдЪ connection establish рдХрд░рдирд╛ рдФрд░ рд╡реЗ рдХреМрди-рд╕реА cryptographic keys рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЖрджрд┐ рддрдп рдХрд░рдирд╛ рд╣реИред
<img src="/img/deployment/https/https02.drawio.svg">
TLS connection establish рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП client рдФрд░ server рдХреЗ рдмреАрдЪ рдЗрд╕ interaction рдХреЛ **TLS handshake** рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
### SNI Extension рдХреЗ рд╕рд╛рде TLS { #tls-with-sni-extension }
Server рдореЗрдВ **рдХреЗрд╡рд▓ рдПрдХ process** рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ **IP address** рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ **port** рдкрд░ listen рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрд╕реА IP address рдореЗрдВ рджреВрд╕рд░реЗ ports рдкрд░ рдЕрдиреНрдп processes listen рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди IP address рдФрд░ port рдХреЗ рд╣рд░ combination рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХред
TLS (HTTPS) by default рд╡рд┐рд╢рд┐рд╖реНрдЯ port `443` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реА port рдХреА рдЬрд░реВрд░рдд рд╣реЛрдЧреАред
рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ port рдкрд░ рдХреЗрд╡рд▓ рдПрдХ process listen рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ process рдпрд╣ рдХрд░реЗрдЧрд╛ рд╡рд╣ **TLS Termination Proxy** рд╣реЛрдЧрд╛ред
TLS Termination Proxy рдХреЗ рдкрд╛рд╕ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ **TLS certificates** (HTTPS certificates) рддрдХ access рд╣реЛрдЧрд╛ред
рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП **SNI extension** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, TLS Termination Proxy check рдХрд░реЗрдЧрд╛ рдХрд┐ рдЗрд╕ connection рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз TLS (HTTPS) certificates рдореЗрдВ рд╕реЗ рдХрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, client рджреНрд╡рд╛рд░рд╛ expected domain рд╕реЗ match рдХрд░рдиреЗ рд╡рд╛рд▓реЗ certificate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ `someapp.example.com` рдХреЗ рд▓рд┐рдП certificate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
<img src="/img/deployment/https/https03.drawio.svg">
Client рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд╕ entity рдкрд░ **trust** рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рд╡рд╣ TLS certificate generate рдХрд┐рдпрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ Let's Encrypt, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗ), рдЗрд╕рд▓рд┐рдП рдпрд╣ **verify** рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ certificate valid рд╣реИред
рдлрд┐рд░, certificate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, client рдФрд░ TLS Termination Proxy **рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдмрд╛рдХреА TCP communication рдХреЛ рдХреИрд╕реЗ encrypt рдХрд░рдирд╛ рд╣реИ**ред рдЗрд╕рд╕реЗ **TLS Handshake** рд╡рд╛рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдмрд╛рдж, client рдФрд░ server рдХреЗ рдкрд╛рд╕ рдПрдХ **encrypted TCP connection** рд╣реЛрддрд╛ рд╣реИ, рдпрд╣реА TLS рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдФрд░ рдлрд┐рд░ рд╡реЗ рдЙрд╕ connection рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╛рд╕реНрддрд╡рд┐рдХ **HTTP communication** рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ **HTTPS** рдпрд╣реА рд╣реИ, рдпрд╣ pure (unencrypted) TCP connection рдХреЗ рдмрдЬрд╛рдп рдПрдХ **secure TLS connection** рдХреЗ рдЕрдВрджрд░ рд╕рд╛рдзрд╛рд░рдг **HTTP** рд╣реА рд╣реИред
/// tip | рд╕реБрдЭрд╛рд╡
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ communication рдХрд╛ encryption **TCP level** рдкрд░ рд╣реЛрддрд╛ рд╣реИ, HTTP level рдкрд░ рдирд╣реАрдВред
///
### HTTPS Request { #https-request }
рдЕрдм рдЬрдмрдХрд┐ client рдФрд░ server (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ browser рдФрд░ TLS Termination Proxy) рдХреЗ рдкрд╛рд╕ рдПрдХ **encrypted TCP connection** рд╣реИ, рд╡реЗ **HTTP communication** рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рддреЛ, client рдПрдХ **HTTPS request** рднреЗрдЬрддрд╛ рд╣реИред рдпрд╣ encrypted TLS connection рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╕ рдПрдХ HTTP request рд╣реИред
<img src="/img/deployment/https/https04.drawio.svg">
### Request рдХреЛ Decrypt рдХрд░реЗрдВ { #decrypt-the-request }
TLS Termination Proxy рд╕рд╣рдордд рдХрд┐рдП рдЧрдП encryption рдХрд╛ рдЙрдкрдпреЛрдЧ **request рдХреЛ decrypt** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдЧрд╛, рдФрд░ **рд╕рд╛рдзрд╛рд░рдг (decrypted) HTTP request** рдХреЛ application рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ process рддрдХ transmit рдХрд░реЗрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП FastAPI application рдЪрд▓рд╛рдиреЗ рд╡рд╛рд▓реЗ Uvicorn рдХреЗ рд╕рд╛рде рдПрдХ process)ред
<img src="/img/deployment/https/https05.drawio.svg">
### HTTP Response { #http-response }
Application request рдХреЛ process рдХрд░реЗрдЧреА рдФрд░ TLS Termination Proxy рдХреЛ рдПрдХ **рд╕рд╛рдзрд╛рд░рдг (unencrypted) HTTP response** рднреЗрдЬреЗрдЧреАред
<img src="/img/deployment/https/https06.drawio.svg">
### HTTPS Response { #https-response }
TLS Termination Proxy рдлрд┐рд░ рдкрд╣рд▓реЗ рд╕рд╣рдордд cryptography (рдЬреЛ `someapp.example.com` рдХреЗ рд▓рд┐рдП certificate рд╕реЗ рд╢реБрд░реВ рд╣реБрдИ рдереА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **response рдХреЛ encrypt** рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕реЗ browser рдХреЛ рд╡рд╛рдкрд╕ рднреЗрдЬреЗрдЧрд╛ред
рдЗрд╕рдХреЗ рдмрд╛рдж, browser verify рдХрд░реЗрдЧрд╛ рдХрд┐ response valid рд╣реИ рдФрд░ рд╕рд╣реА cryptographic key рдЖрджрд┐ рд╕реЗ encrypted рд╣реИред рдлрд┐рд░ рд╡рд╣ **response рдХреЛ decrypt** рдХрд░реЗрдЧрд╛ рдФрд░ process рдХрд░реЗрдЧрд╛ред
<img src="/img/deployment/https/https07.drawio.svg">
Client (browser) рдХреЛ рдкрддрд╛ рд╣реЛрдЧрд╛ рдХрд┐ response рд╕рд╣реА server рд╕реЗ рдЖрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрд╕ cryptography рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ **HTTPS certificate** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╣рдорддрд┐ рдХреА рдереАред
### Multiple Applications { #multiple-applications }
рдЙрд╕реА server (рдпрд╛ servers) рдореЗрдВ, **multiple applications** рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдиреНрдп API programs рдпрд╛ databaseред
рдХреЗрд╡рд▓ рдПрдХ process рд╡рд┐рд╢рд┐рд╖реНрдЯ IP рдФрд░ port handle рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ TLS Termination Proxy) рд▓реЗрдХрд┐рди рдЕрдиреНрдп applications/processes рднреА server(s) рдкрд░ рдЪрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рд╡реЗ **public IP рдФрд░ port рдХреЗ рдЙрд╕реА combination** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддреЗред
<img src="/img/deployment/https/https08.drawio.svg">
рдЗрд╕ рддрд░рд╣, TLS Termination Proxy **multiple domains** рдХреЗ рд▓рд┐рдП, multiple applications рдХреЗ рд▓рд┐рдП HTTPS рдФрд░ certificates handle рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рд░ рдорд╛рдорд▓реЗ рдореЗрдВ requests рдХреЛ рд╕рд╣реА application рддрдХ transmit рдХрд░ рд╕рдХрддрд╛ рд╣реИред
### Certificate Renewal { #certificate-renewal }
рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд┐рд╕реА рд╕рдордп, рдкреНрд░рддреНрдпреЗрдХ certificate **expire** рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рдЧрднрдЧ 3 рдорд╣реАрдиреЗ рдмрд╛рдж)ред
рдФрд░ рдлрд┐рд░, рдХреЛрдИ рджреВрд╕рд░рд╛ program рд╣реЛрдЧрд╛ (рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рджреВрд╕рд░рд╛ program рд╣реЛрддрд╛ рд╣реИ, рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рд╡рд╣реА TLS Termination Proxy рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдЬреЛ Let's Encrypt рд╕реЗ рдмрд╛рдд рдХрд░реЗрдЧрд╛, рдФрд░ certificate(s) рдХреЛ renew рдХрд░реЗрдЧрд╛ред
<img src="/img/deployment/https/https.drawio.svg">
**TLS certificates** рдХрд┐рд╕реА **domain name** рд╕реЗ **associated** рд╣реЛрддреЗ рд╣реИрдВ, IP address рд╕реЗ рдирд╣реАрдВред
рдЗрд╕рд▓рд┐рдП, certificates renew рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, renewal program рдХреЛ authority (Let's Encrypt) рдХреЛ **prove** рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ domain рдХреЛ **"own" рдФрд░ control** рдХрд░рддрд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ application needs рдХреЛ accommodate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдХреБрдЫ рд▓реЛрдХрдкреНрд░рд┐рдп рддрд░реАрдХреЗ рд╣реИрдВ:
* **рдХреБрдЫ DNS records modify рдХрд░реЗрдВ**ред
* рдЗрд╕рдХреЗ рд▓рд┐рдП, renewal program рдХреЛ DNS provider рдХреА APIs support рдХрд░рдиреА рд╣реЛрдВрдЧреА, рдЗрд╕рд▓рд┐рдП, рдЖрдк рдЬрд┐рд╕ DNS provider рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпрд╣ option рд╣реЛ рднреА рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ рднреАред
* Domain рд╕реЗ associated public IP address рдкрд░ (рдХрдо рд╕реЗ рдХрдо certificate acquisition process рдХреЗ рджреМрд░рд╛рди) **server рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓реЗрдВ**ред
* рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рдХрд╣рд╛, рдХреЗрд╡рд▓ рдПрдХ process рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ IP рдФрд░ port рдкрд░ listen рдХрд░ рд╕рдХрддрд╛ рд╣реИред
* рдпрд╣ рдЙрди рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдХрд┐ рдЬрдм рд╡рд╣реА TLS Termination Proxy certificate renewal process рдХрд╛ рднреА рдзреНрдпрд╛рди рд░рдЦрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИред
* рдЕрдиреНрдпрдерд╛, рдЖрдкрдХреЛ TLS Termination Proxy рдХреЛ momentarily stop рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, certificates рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП renewal program start рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ TLS Termination Proxy рдХреЗ рд╕рд╛рде configure рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ TLS Termination Proxy рдХреЛ restart рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ ideal рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрд┐рд╕ рд╕рдордп TLS Termination Proxy off рд╣реЛрдЧрд╛, рдЙрд╕ рджреМрд░рд╛рди рдЖрдкрдХреА app(s) available рдирд╣реАрдВ рд╣реЛрдВрдЧреАред
App рдХреЛ serve рдХрд░рддреЗ рд╣реБрдП рднреА рдпрд╣ рдкреВрд░рд╛ renewal process, рдЙрди рдореБрдЦреНрдп рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдХрд┐ рдЖрдк application server рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ TLS certificates (рдЬреИрд╕реЗ Uvicorn) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп TLS Termination Proxy рдХреЗ рд╕рд╛рде **HTTPS handle рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ system** рд░рдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
## Proxy Forwarded Headers { #proxy-forwarded-headers }
HTTPS handle рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП proxy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХрд╛ **application server** (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП FastAPI CLI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Uvicorn) HTTPS process рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рдпрд╣ **TLS Termination Proxy** рдХреЗ рд╕рд╛рде plain HTTP рдореЗрдВ communicate рдХрд░рддрд╛ рд╣реИред
рдпрд╣ **proxy** рд╕рд╛рдорд╛рдиреНрдпрддрдГ request рдХреЛ **application server** рддрдХ transmit рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреБрдЫ HTTP headers on the fly set рдХрд░реЗрдЧрд╛, рддрд╛рдХрд┐ application server рдХреЛ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ рдХрд┐ request proxy рджреНрд╡рд╛рд░рд╛ **forwarded** рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред
/// 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** рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рд╡рд╣ trusted **proxy** рдХреЗ рдкреАрдЫреЗ рд╣реИ, by default, рд╡рд╣ рдЙрди headers рдкрд░ trust рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рд▓реЗрдХрд┐рди рдЖрдк **application server** рдХреЛ **proxy** рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЧрдП *forwarded* headers рдкрд░ trust рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП configure рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд░ рдЖрдк FastAPI CLI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк *CLI Option* `--forwarded-allow-ips` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрд╕реЗ рдХрд┐рди IPs рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЙрди *forwarded* headers рдкрд░ trust рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ **application server** рдХреЗрд╡рд▓ trusted **proxy** рд╕реЗ communication receive рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ `--forwarded-allow-ips="*"` рдкрд░ set рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рд╕рднреА incoming IPs рдкрд░ trust рдХрд░реЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдЙрд╕реА IP рд╕реЗ requests receive рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ **proxy** рдХрд░ рд░рд╣рд╛ рд╣реИред
рдЗрд╕ рддрд░рд╣ application рдпрд╣ рдЬрд╛рди рдкрд╛рдПрдЧреА рдХрд┐ рдЙрд╕рдХрд╛ рдЕрдкрдирд╛ public URL рдХреНрдпрд╛ рд╣реИ, рдХреНрдпрд╛ рд╡рд╣ HTTPS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реА рд╣реИ, domain, рдЖрджрд┐ред
рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП redirects рдХреЛ рдареАрдХ рд╕реЗ handle рдХрд░рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
/// tip | рд╕реБрдЭрд╛рд╡
рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ documentation рдореЗрдВ рдФрд░ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ: [Proxy рдХреЗ рдкреАрдЫреЗ - Proxy Forwarded Headers рд╕рдХреНрд╖рдо рдХрд░реЗрдВ](../advanced/behind-a-proxy.md#enable-proxy-forwarded-headers)
///
## Recap { #recap }
**HTTPS** рд╣реЛрдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдлреА **critical** рд╣реИред HTTPS рдХреЗ рдЖрд╕рдкрд╛рд╕ рдПрдХ developer рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдкрдХреЛ рдЬреЛ рдЬрд╝реНрдпрд╛рджрд╛рддрд░ effort рд▓рдЧрд╛рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рд╡рд╣ рдмрд╕ **рдЗрди concepts рдХреЛ рд╕рдордЭрдиреЗ** рдФрд░ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред
рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк **developers рдХреЗ рд▓рд┐рдП HTTPS** рдХреА рдореВрд▓ рдЬрд╛рдирдХрд╛рд░реА рдЬрд╛рди рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ manage рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ tools рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ combine рдФрд░ configure рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдЧрд▓реЗ рдХреБрдЫ chapters рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ **FastAPI** applications рдХреЗ рд▓рд┐рдП **HTTPS** setup рдХрд░рдиреЗ рдХреЗ рдХрдИ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдКрдБрдЧрд╛ред ЁЯФТ

23
docs/hi/docs/deployment/index.md

@ -0,0 +1,23 @@
# Deployment { #deployment }
**FastAPI** application рдХреЛ deploy рдХрд░рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рди рд╣реИред
## Deployment рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ { #what-does-deployment-mean }
рдХрд┐рд╕реА application рдХреЛ **deploy** рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдЙрд╕реЗ **users рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз** рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЪрд░рдг рдкреВрд░реЗ рдХрд░рдирд╛ред
рдХрд┐рд╕реА **web API** рдХреЗ рд▓рд┐рдП, рдЗрд╕рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЙрд╕реЗ рдПрдХ **remote machine** рдореЗрдВ рд░рдЦрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдПрдХ **server program** рдХреЗ рд╕рд╛рде рдЬреЛ рдЕрдЪреНрдЫрд╛ performance, stability рдЖрджрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЖрдкрдХреЗ **users** application рдХреЛ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдФрд░ рдмрд┐рдирд╛ рд░реБрдХрд╛рд╡рдЯреЛрдВ рдпрд╛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ **access** рдХрд░ рд╕рдХреЗрдВред
рдпрд╣ **development** рдЪрд░рдгреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ, рдЬрд╣рд╛рдБ рдЖрдк рд▓рдЧрд╛рддрд╛рд░ code рдмрджрд▓ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрд╕реЗ рддреЛрдбрд╝рддреЗ рдФрд░ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ, development server рдХреЛ рд░реЛрдХрддреЗ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЖрджрд┐ред
## Deployment Strategies { #deployment-strategies }
рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ use case рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ tools рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред
рдЖрдк tools рдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдпрдВ **server deploy** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдХреЛрдИ **cloud service** рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд╛ рдХреБрдЫ рд╣рд┐рд╕реНрд╕рд╛ рдХрд░рддреА рд╣реИ, рдпрд╛ рдЕрдиреНрдп рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ, FastAPI рдХреЗ рдкреАрдЫреЗ рдХреА team рдиреЗ, [**FastAPI Cloud**](https://fastapicloud.com) рдмрдирд╛рдпрд╛, рддрд╛рдХрд┐ FastAPI apps рдХреЛ cloud рдкрд░ deploy рдХрд░рдирд╛ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ streamlined рд╣реЛ, FastAPI рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди developer experience рдХреЗ рд╕рд╛рдеред
рдореИрдВ рдЖрдкрдХреЛ рдХреБрдЫ рдореБрдЦреНрдп concepts рджрд┐рдЦрд╛рдКрдБрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ **FastAPI** application deploy рдХрд░рддреЗ рд╕рдордп рд╢рд╛рдпрдж рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрддрд░ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА web application рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ)ред
рдЕрдЧрд▓реЗ sections рдореЗрдВ рдЖрдкрдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ details рдФрд░ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреА рдХреБрдЫ techniques рджрд┐рдЦреЗрдВрдЧреАред тЬи

156
docs/hi/docs/deployment/manually.md

@ -0,0 +1,156 @@
# Server рдХреЛ рдореИрдиреНрдпреБрдЕрд▓реА рдЪрд▓рд╛рдПрдБ { #run-a-server-manually }
## `fastapi run` Command рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ { #use-the-fastapi-run-command }
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЕрдкрдиреА FastAPI application serve рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `fastapi run` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
<div class="termy">
```console
$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid">main.py</u>
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting production server ЁЯЪА
Searching for package file structure from directories
with <font color="#3465A4">__init__.py</font> files
Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
<span style="background-color:#007166"><font color="#D3D7CF"> module </font></span> ЁЯРН main.py
<span style="background-color:#007166"><font color="#D3D7CF"> code </font></span> Importing the FastAPI app object from the module with
the following code:
<u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u>
<span style="background-color:#007166"><font color="#D3D7CF"> app </font></span> Using import string: <font color="#3465A4">main:app</font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000/docs</u></font>
Logs:
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>2306215</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font> <b>(</b>Press CTRL+C
to quit<b>)</b>
```
</div>
рдпрд╣ рдЬрд╝реНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред ЁЯШО
рдЖрдк рдЙрд╕ command рдХрд╛ рдЙрдкрдпреЛрдЧ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреА **FastAPI** app рдХреЛ рдХрд┐рд╕реА container рдореЗрдВ, рдХрд┐рд╕реА server рдореЗрдВ, рдЖрджрд┐ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
## ASGI Servers { #asgi-servers }
рдЖрдЗрдП details рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЧрд╣рд░рд╛рдИ рд╕реЗ рджреЗрдЦреЗрдВред
FastAPI Python web frameworks рдФрд░ servers рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ standard рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ <abbr title="Asynchronous Server Gateway Interface - asynchronous server gateway interface">ASGI</abbr> рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред FastAPI рдПрдХ ASGI web framework рд╣реИред
рдХрд┐рд╕реА remote server machine рдореЗрдВ **FastAPI** application (рдпрд╛ рдХреЛрдИ рднреА рджреВрд╕рд░реА ASGI application) рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдПрдХ ASGI server program рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ **Uvicorn**; рдпрд╣реА `fastapi` command рдореЗрдВ default рд░реВрдк рд╕реЗ рдЖрддрд╛ рд╣реИред
рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
* [Uvicorn](https://www.uvicorn.dev/): рдПрдХ high performance ASGI serverред
* [Hypercorn](https://hypercorn.readthedocs.io/): рдПрдХ ASGI server рдЬреЛ рдЕрдиреНрдп features рдХреЗ рд╕рд╛рде HTTP/2 рдФрд░ Trio рдХреЗ рд╕рд╛рде compatible рд╣реИред
* [Daphne](https://github.com/django/daphne): Django Channels рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ ASGI serverред
* [Granian](https://github.com/emmett-framework/granian): Python applications рдХреЗ рд▓рд┐рдП рдПрдХ Rust HTTP serverред
## Server Machine рдФрд░ Server Program { #server-machine-and-server-program }
рдирд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдзреНрдпрд╛рди рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рдПрдХ рдЫреЛрдЯрд╛-рд╕рд╛ detail рд╣реИред ЁЯТб
рд╢рдмреНрдж "**server**" рдЖрдорддреМрд░ рдкрд░ remote/cloud computer (physical рдпрд╛ virtual machine) рдФрд░ рдЙрд╕ machine рдкрд░ рдЪрд▓ рд░рд╣реЗ program (рдЬреИрд╕реЗ Uvicorn), рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдмрд╕ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЬрдм рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ "server" рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрди рджреЛ рдЪреАрдЬрд╝реЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
Remote machine рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреЗ рд╕рдордп, рдЗрд╕реЗ **server** рдХрд╣рдирд╛ рдЖрдо рд╣реИ, рд▓реЗрдХрд┐рди **machine**, **VM** (virtual machine), **node** рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреЗ рд╕рднреА рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА remote machine рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдпрддрдГ Linux рдЪрд▓рд╛ рд░рд╣реА рд╣реЛрддреА рд╣реИ, рдЬрд╣рд╛рдБ рдЖрдк programs рдЪрд▓рд╛рддреЗ рд╣реИрдВред
## Server Program Install рдХрд░реЗрдВ { #install-the-server-program }
рдЬрдм рдЖрдк FastAPI install рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ production server, Uvicorn, рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рдФрд░ рдЖрдк рдЗрд╕реЗ `fastapi run` command рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЖрдк рдПрдХ ASGI server рдХреЛ рдореИрдиреНрдпреБрдЕрд▓реА рднреА install рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдПрдХ [virtual environment](../virtual-environments.md) рдмрдирд╛рдПрдБ, рдЙрд╕реЗ activate рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдЖрдк server application install рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Uvicorn install рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
<div class="termy">
```console
$ pip install "uvicorn[standard]"
---> 100%
```
</div>
рдХрд┐рд╕реА рднреА рдЕрдиреНрдп ASGI server program рдХреЗ рд▓рд┐рдП рднреА рдЗрд╕реА рддрд░рд╣ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓рд╛рдЧреВ рд╣реЛрдЧреАред
/// tip | рдЯрд┐рдк
`standard` рдЬреЛрдбрд╝рдиреЗ рдкрд░, Uvicorn рдХреБрдЫ recommended extra dependencies install рдФрд░ use рдХрд░реЗрдЧрд╛ред
рдЗрд╕рдореЗрдВ `uvloop` рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ `asyncio` рдХреЗ рд▓рд┐рдП high-performance drop-in replacement рд╣реИ, рдФрд░ рдмрдбрд╝рд╛ concurrency performance boost рджреЗрддрд╛ рд╣реИред
рдЬрдм рдЖрдк `pip install "fastapi[standard]"` рдЬреИрд╕реА рдХрд┐рд╕реА command рд╕реЗ FastAPI install рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ `uvicorn[standard]` рднреА рдорд┐рд▓ рдЬрд╛рддрд╛ рд╣реИред
///
## Server Program рдЪрд▓рд╛рдПрдБ { #run-the-server-program }
рдпрджрд┐ рдЖрдкрдиреЗ ASGI server рдореИрдиреНрдпреБрдЕрд▓реА install рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдорддреМрд░ рдкрд░ рдЖрдкрдХреЛ рдЕрдкрдиреА FastAPI application import рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд╛рд╕ format рдореЗрдВ import string рдкрд╛рд╕ рдХрд░рдиреА рд╣реЛрдЧреА:
<div class="termy">
```console
$ uvicorn main:app --host 0.0.0.0 --port 80
<span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
```
</div>
/// note | рдиреЛрдЯ
Command `uvicorn main:app` рдЗрдирдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддреА рд╣реИ:
* `main`: file `main.py` (Python "module")ред
* `app`: `main.py` рдХреЗ рдЕрдВрджрд░ `app = FastAPI()` line рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ objectред
рдпрд╣ рдЗрд╕рдХреЗ equivalent рд╣реИ:
```Python
from main import app
```
///
рд╣рд░ alternative ASGI server program рдХреА command рдорд┐рд▓рддреА-рдЬреБрд▓рддреА рд╣реЛрдЧреА, рдЖрдк рдЙрдирдХреЗ рд╕рдВрдмрдВрдзрд┐рдд documentation рдореЗрдВ рдФрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
/// warning | рдЪреЗрддрд╛рд╡рдиреА
Uvicorn рдФрд░ рдЕрдиреНрдп servers рдПрдХ `--reload` option support рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ development рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИред
`--reload` option рдмрд╣реБрдд рдЕрдзрд┐рдХ resources consume рдХрд░рддрд╛ рд╣реИ, рдЕрдзрд┐рдХ unstable рд╣реЛрддрд╛ рд╣реИ, рдЖрджрд┐ред
рдпрд╣ **development** рдХреЗ рджреМрд░рд╛рди рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕реЗ **production** рдореЗрдВ use **рдирд╣реАрдВ** рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
///
## Deployment Concepts { #deployment-concepts }
рдпреЗ examples server program (рдЬреИрд╕реЗ Uvicorn) рдЪрд▓рд╛рддреЗ рд╣реИрдВ, **рдПрдХ single process** рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ predefined port (рдЬреИрд╕реЗ `80`) рдкрд░ рд╕рднреА IPs (`0.0.0.0`) рдХреЛ listen рдХрд░рддрд╛ рд╣реИред
рдпрд╣ basic idea рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рд╢рд╛рдпрдж рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреАрдЬрд╝реЛрдВ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдЬреИрд╕реЗ:
* Security - HTTPS
* startup рдкрд░ рдЪрд▓рдирд╛
* Restarts
* Replication (рдЪрд▓ рд░рд╣реЗ processes рдХреА рд╕рдВрдЦреНрдпрд╛)
* Memory
* рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ previous steps
рдЕрдЧрд▓реЗ chapters рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдЗрди concepts рдореЗрдВ рд╕реЗ рд╣рд░ рдПрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рд╕реЛрдЪреЗрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ handle рдХрд░рдиреЗ рдХреА strategies рдХреЗ рд╕рд╛рде рдХреБрдЫ concrete examples рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдмрддрд╛рдКрдБрдЧрд╛ред ЁЯЪА

139
docs/hi/docs/deployment/server-workers.md

@ -0,0 +1,139 @@
# Server Workers - Workers рдХреЗ рд╕рд╛рде Uvicorn { #server-workers-uvicorn-with-workers }
рдЖрдЗрдП рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ deployment concepts рдХреЛ рдлрд┐рд░ рд╕реЗ рджреЗрдЦреЗрдВ:
* Security - HTTPS
* startup рдкрд░ рдЪрд▓рдирд╛
* Restarts
* **Replication (рдЪрд▓ рд░рд╣реЗ processes рдХреА рд╕рдВрдЦреНрдпрд╛)**
* Memory
* рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рдкрд┐рдЫрд▓реЗ steps
рдЗрд╕ рдмрд┐рдВрджреБ рддрдХ, docs рдХреЗ рд╕рднреА tutorials рдореЗрдВ, рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдПрдХ **server program** рдЪрд▓рд╛рдпрд╛ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, `fastapi` command рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЬреЛ Uvicorn рдЪрд▓рд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ **single process** рдЪрд▓рд╛рддрд╛ рд╣реИред
Applications deploy рдХрд░рддреЗ рд╕рдордп рдЖрдк рд╢рд╛рдпрдж **processes рдХреА рдХреБрдЫ replication** рд░рдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рддрд╛рдХрд┐ **multiple cores** рдХрд╛ рд▓рд╛рдн рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдЕрдзрд┐рдХ requests handle рдХреА рдЬрд╛ рд╕рдХреЗрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдкрд┐рдЫрд▓реЗ chapter рдореЗрдВ [Deployment Concepts](concepts.md) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреЗрдЦрд╛, рдХрдИ strategies рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдБрдЧрд╛ рдХрд┐ `fastapi` command рдпрд╛ рд╕реАрдзреЗ `uvicorn` command рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **worker processes** рдХреЗ рд╕рд╛рде **Uvicorn** рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
/// note | рдиреЛрдЯ
рдпрджрд┐ рдЖрдк containers рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Docker рдпрд╛ Kubernetes рдХреЗ рд╕рд╛рде, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЧрд▓реЗ chapter рдореЗрдВ рдФрд░ рдмрддрд╛рдКрдБрдЧрд╛: [Containers рдореЗрдВ FastAPI - Docker](docker.md)ред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, **Kubernetes** рдкрд░ рдЪрд▓рддреЗ рд╕рдордп рдЖрдк рд╢рд╛рдпрдж workers рдХрд╛ рдЙрдкрдпреЛрдЧ **рдирд╣реАрдВ** рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп **рдкреНрд░рддрд┐ container рдПрдХ single Uvicorn process** рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрд╕ chapter рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдмрддрд╛рдКрдБрдЧрд╛ред
///
## Multiple Workers { #multiple-workers }
рдЖрдк `--workers` command line option рдХреЗ рд╕рд╛рде multiple workers рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
//// tab | `fastapi`
рдпрджрд┐ рдЖрдк `fastapi` command рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
<div class="termy">
```console
$ <font color="#4E9A06">fastapi</font> run --workers 4 <u style="text-decoration-style:solid">main.py</u>
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting production server ЁЯЪА
Searching for package file structure from directories with
<font color="#3465A4">__init__.py</font> files
Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
<span style="background-color:#007166"><font color="#D3D7CF"> module </font></span> ЁЯРН main.py
<span style="background-color:#007166"><font color="#D3D7CF"> code </font></span> Importing the FastAPI app object from the module with the
following code:
<u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u>
<span style="background-color:#007166"><font color="#D3D7CF"> app </font></span> Using import string: <font color="#3465A4">main:app</font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000/docs</u></font>
Logs:
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font> <b>(</b>Press CTRL+C to
quit<b>)</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started parent process <b>[</b><font color="#34E2E2"><b>27365</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>27368</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>27369</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>27370</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>27367</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
```
</div>
////
//// tab | `uvicorn`
рдпрджрд┐ рдЖрдк рд╕реАрдзреЗ `uvicorn` command рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ:
<div class="termy">
```console
$ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
<font color="#A6E22E">INFO</font>: Uvicorn running on <b>http://0.0.0.0:8080</b> (Press CTRL+C to quit)
<font color="#A6E22E">INFO</font>: Started parent process [<font color="#A1EFE4"><b>27365</b></font>]
<font color="#A6E22E">INFO</font>: Started server process [<font color="#A1EFE4">27368</font>]
<font color="#A6E22E">INFO</font>: Waiting for application startup.
<font color="#A6E22E">INFO</font>: Application startup complete.
<font color="#A6E22E">INFO</font>: Started server process [<font color="#A1EFE4">27369</font>]
<font color="#A6E22E">INFO</font>: Waiting for application startup.
<font color="#A6E22E">INFO</font>: Application startup complete.
<font color="#A6E22E">INFO</font>: Started server process [<font color="#A1EFE4">27370</font>]
<font color="#A6E22E">INFO</font>: Waiting for application startup.
<font color="#A6E22E">INFO</font>: Application startup complete.
<font color="#A6E22E">INFO</font>: Started server process [<font color="#A1EFE4">27367</font>]
<font color="#A6E22E">INFO</font>: Waiting for application startup.
<font color="#A6E22E">INFO</font>: Application startup complete.
```
</div>
////
рдпрд╣рд╛рдБ рдПрдХрдорд╛рддреНрд░ рдирдпрд╛ option `--workers` рд╣реИ, рдЬреЛ Uvicorn рдХреЛ 4 worker processes рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред
рдЖрдк рдпрд╣ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ process рдХрд╛ **PID** рджрд┐рдЦрд╛рддрд╛ рд╣реИ, parent process рдХреЗ рд▓рд┐рдП `27365` (рдпрд╣ **process manager** рд╣реИ) рдФрд░ рдкреНрд░рддреНрдпреЗрдХ worker process рдХреЗ рд▓рд┐рдП рдПрдХ: `27368`, `27369`, `27370`, рдФрд░ `27367`ред
## Deployment Concepts { #deployment-concepts }
рдпрд╣рд╛рдБ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рдХрд┐ application рдХреЗ execution рдХреЛ **parallelize** рдХрд░рдиреЗ, CPU рдореЗрдВ **multiple cores** рдХрд╛ рд▓рд╛рдн рд▓реЗрдиреЗ, рдФрд░ **рдЕрдзрд┐рдХ requests** serve рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП multiple **workers** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдКрдкрд░ рджреА рдЧрдИ deployment concepts рдХреА рд╕реВрдЪреА рд╕реЗ, workers рдХрд╛ рдЙрдкрдпреЛрдЧ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ **replication** рд╡рд╛рд▓реЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рдФрд░ рдереЛрдбрд╝рд╛ рдмрд╣реБрдд **restarts** рдореЗрдВ рднреА, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЕрднреА рднреА рдмрд╛рдХреА рдЪреАрдЬрд╝реЛрдВ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реЛрдЧрд╛:
* **Security - HTTPS**
* **startup рдкрд░ рдЪрд▓рдирд╛**
* ***Restarts***
* Replication (рдЪрд▓ рд░рд╣реЗ processes рдХреА рд╕рдВрдЦреНрдпрд╛)
* **Memory**
* **рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рдкрд┐рдЫрд▓реЗ steps**
## Containers рдФрд░ Docker { #containers-and-docker }
рдЕрдЧрд▓реЗ chapter рдореЗрдВ [Containers рдореЗрдВ FastAPI - Docker](docker.md) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдХреБрдЫ strategies рд╕рдордЭрд╛рдКрдБрдЧрд╛ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рдмрд╛рдХреА **deployment concepts** рдХреЛ handle рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдБрдЧрд╛ рдХрд┐ single Uvicorn process рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП **рд╢реБрд░реВ рд╕реЗ рдЕрдкрдиреА рдЦреБрдж рдХреА image рдХреИрд╕реЗ build рдХрд░реЗрдВ**ред рдпрд╣ рдПрдХ рд╕рд░рд▓ process рд╣реИ рдФрд░ рд╢рд╛рдпрдж рдпрд╣реА рдЖрдк рддрдм рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬрдм рдЖрдк **Kubernetes** рдЬреИрд╕реЗ distributed container management system рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реЛрдВред
## Recap { #recap }
рдЖрдк `fastapi` рдпрд╛ `uvicorn` commands рдХреЗ рд╕рд╛рде `--workers` CLI option рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ multiple worker processes рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ **multi-core CPUs** рдХрд╛ рд▓рд╛рдн рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ **multiple processes parallel рдореЗрдВ** рдЪрд▓рд╛рдП рдЬрд╛ рд╕рдХреЗрдВред
рдпрджрд┐ рдЖрдк рдмрд╛рдХреА deployment concepts рдХрд╛ рдЦреБрдж рдзреНрдпрд╛рди рд░рдЦрддреЗ рд╣реБрдП **рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ deployment system** setup рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрди tools рдФрд░ ideas рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Containers (рдЬреИрд╕реЗ Docker рдФрд░ Kubernetes) рдХреЗ рд╕рд╛рде **FastAPI** рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓рд╛ chapter рджреЗрдЦреЗрдВред рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЙрди tools рдореЗрдВ рдмрд╛рдХреА **deployment concepts** рдХреЛ рднреА рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╣реИрдВред тЬи

93
docs/hi/docs/deployment/versions.md

@ -0,0 +1,93 @@
# FastAPI рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ { #about-fastapi-versions }
**FastAPI** рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ applications рдФрд░ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ production рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдФрд░ test coverage 100% рдкрд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ development рдЕрднреА рднреА рддреЗрдЬреА рд╕реЗ рдЖрдЧреЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реИред
рдирдИ features рдЕрдХреНрд╕рд░ рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИрдВ, bugs рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдареАрдХ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ code рдЕрднреА рднреА рд▓рдЧрд╛рддрд╛рд░ рдмреЗрд╣рддрд░ рд╣реЛ рд░рд╣рд╛ рд╣реИред
рдЗрд╕реАрд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдЕрднреА рднреА `0.x.x` рд╣реИрдВ, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ breaking changes рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ [Semantic Versioning](https://semver.org/) conventions рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред
рдЖрдк рдЕрднреА **FastAPI** рдХреЗ рд╕рд╛рде production applications рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдк рдХреБрдЫ рд╕рдордп рд╕реЗ рдРрд╕рд╛ рдХрд░ рднреА рд░рд╣реЗ рд╣реЛрдВ), рдЖрдкрдХреЛ рдмрд╕ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдРрд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЗ рдмрд╛рдХреА code рдХреЗ рд╕рд╛рде рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реЛред
## рдЕрдкрдиреЗ `fastapi` рд╕рдВрд╕реНрдХрд░рдг рдХреЛ pin рдХрд░реЗрдВ { #pin-your-fastapi-version }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ **FastAPI** рдХреЗ рдЬрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрд╕реЗ рдЙрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдкрд░ "pin" рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдЖрдкрдХреЗ application рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ app рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг `0.112.0` рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк `requirements.txt` file рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЗрд╕ рддрд░рд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
```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` рдЕрднреА рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрджрд┐ рдЖрдк рдЕрдкрдиреА installations рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреНрдп tool рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ `uv`, Poetry, Pipenv, рдпрд╛ рдЕрдиреНрдп, рддреЛ рдЙрди рд╕рднреА рдореЗрдВ рдРрд╕рд╛ рддрд░реАрдХрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдЕрдкрдиреЗ packages рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
## рдЙрдкрд▓рдмреНрдз рд╕рдВрд╕реНрдХрд░рдг { #available-versions }
рдЖрдк рдЙрдкрд▓рдмреНрдз рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ (рдЬреИрд╕реЗ рд╡рд░реНрддрдорд╛рди рдирд╡реАрдирддрдо рдХреНрдпрд╛ рд╣реИ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП) [Release Notes](../release-notes.md) рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
## рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ { #about-versions }
Semantic Versioning conventions рдХреЗ рдЕрдиреБрд╕рд╛рд░, `1.0.0` рд╕реЗ рдиреАрдЪреЗ рдХрд╛ рдХреЛрдИ рднреА рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ breaking changes рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред
FastAPI рдЗрд╕ convention рдХрд╛ рднреА рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА "PATCH" рд╕рдВрд╕реНрдХрд░рдг рдкрд░рд┐рд╡рд░реНрддрди bug fixes рдФрд░ non-breaking changes рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИред
/// tip | рд╕реБрдЭрд╛рд╡
"PATCH" рдЖрдЦрд┐рд░реА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, `0.2.3` рдореЗрдВ, PATCH рд╕рдВрд╕реНрдХрд░рдг `3` рд╣реИред
///
рддреЛ, рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ pin рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
```txt
fastapi>=0.45.0,<0.46.0
```
Breaking changes рдФрд░ рдирдИ features "MINOR" рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИрдВред
/// tip | рд╕реБрдЭрд╛рд╡
"MINOR" рдмреАрдЪ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, `0.2.3` рдореЗрдВ, MINOR рд╕рдВрд╕реНрдХрд░рдг `2` рд╣реИред
///
## FastAPI рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ upgrade рдХрд░рдирд╛ { #upgrading-the-fastapi-versions }
рдЖрдкрдХреЛ рдЕрдкрдиреЗ app рдХреЗ рд▓рд┐рдП tests рдЬреЛрдбрд╝рдиреЗ рдЪрд╛рд╣рд┐рдПред
**FastAPI** рдХреЗ рд╕рд╛рде рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ (Starlette рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж), docs рджреЗрдЦреЗрдВ: [Testing](../tutorial/testing.md)
Tests рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк **FastAPI** рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрдзрд┐рдХ рд╣рд╛рд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ upgrade рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдкрдиреЗ tests рдЪрд▓рд╛рдХрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рдкреВрд░рд╛ code рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
рдпрджрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдпрд╛ рдЖрд╡рд╢реНрдпрдХ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдФрд░ рдЖрдкрдХреЗ рд╕рднреА tests pass рд╣реЛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ `fastapi` рдХреЛ рдЙрд╕ рдирдП рд╣рд╛рд▓рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ pin рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
## Starlette рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ { #about-starlette }
рдЖрдкрдХреЛ `starlette` рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ pin рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
**FastAPI** рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрд╕реНрдХрд░рдг Starlette рдХреЗ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдЗрд╕рд▓рд┐рдП, рдЖрдк рдмрд╕ **FastAPI** рдХреЛ рд╕рд╣реА Starlette рд╕рдВрд╕реНрдХрд░рдг рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред
## Pydantic рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ { #about-pydantic }
Pydantic рдЕрдкрдиреЗ tests рдореЗрдВ **FastAPI** рдХреЗ tests рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП Pydantic рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг (`1.0.0` рд╕реЗ рдКрдкрд░) рд╣рдореЗрд╢рд╛ FastAPI рдХреЗ рд╕рд╛рде compatible рд╣реЛрддреЗ рд╣реИрдВред
рдЖрдк Pydantic рдХреЛ `1.0.0` рд╕реЗ рдКрдкрд░ рдХрд┐рд╕реА рднреА рдРрд╕реЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ pin рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реЛред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
```txt
pydantic>=2.7.0,<3.0.0
```

17
docs/hi/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 version `0.122.0` рд╕реЗ рдкрд╣рд▓реЗ, рдЬрдм integrated security utilities failed authentication рдХреЗ рдмрд╛рдж client рдХреЛ error рд▓реМрдЯрд╛рддреА рдереАрдВ, рддреЛ рд╡реЗ HTTP status code `403 Forbidden` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рдереАрдВред
FastAPI version `0.122.0` рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рд╡реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд HTTP status code `401 Unauthorized` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ, рдФрд░ HTTP specifications, [RFC 7235](https://datatracker.ietf.org/doc/html/rfc7235#section-3.1), [RFC 9110](https://datatracker.ietf.org/doc/html/rfc9110#name-401-unauthorized) рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП response рдореЗрдВ рдПрдХ рдЙрдЪрд┐рдд `WWW-Authenticate` header рд▓реМрдЯрд╛рддреА рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдкрдХреЗ clients рдкреБрд░рд╛рдиреЗ behavior рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреА security classes рдореЗрдВ method `make_not_authenticated_error` рдХреЛ 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 рдирд╣реАрдВ рдХрд░рддрд╛ред raising рдмрд╛рдХреА internal code рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
///

56
docs/hi/docs/how-to/conditional-openapi.md

@ -0,0 +1,56 @@
# рд╕рд╢рд░реНрдд OpenAPI { #conditional-openapi }
рдЕрдЧрд░ рдЖрдкрдХреЛ рдЬрд╝рд░реВрд░рдд рд╣реЛ, рддреЛ рдЖрдк environment рдХреЗ рдЖрдзрд╛рд░ рдкрд░ OpenAPI рдХреЛ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ configure рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП settings рдФрд░ environment variables рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ disable рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
## security, APIs, рдФрд░ docs рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ { #about-security-apis-and-docs }
production рдореЗрдВ рдЕрдкрдиреА documentation user interfaces рдХреЛ рдЫрд┐рдкрд╛рдирд╛ рдЖрдкрдХреА API рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ *рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП*ред
рдЗрд╕рд╕реЗ рдЖрдкрдХреА API рдореЗрдВ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд security рдирд╣реАрдВ рдЬреБрдбрд╝рддреА, *path operations* рдЕрднреА рднреА рд╡рд╣реАрдВ рдЙрдкрд▓рдмреНрдз рд░рд╣реЗрдВрдЧреА рдЬрд╣рд╛рдБ рд╡реЗ рд╣реИрдВред
рдЕрдЧрд░ рдЖрдкрдХреЗ code рдореЗрдВ рдХреЛрдИ security flaw рд╣реИ, рддреЛ рд╡рд╣ рдЕрднреА рднреА рдореМрдЬреВрдж рд░рд╣реЗрдЧрд╛ред
documentation рдХреЛ рдЫрд┐рдкрд╛рдирд╛ рдмрд╕ рдпрд╣ рд╕рдордЭрдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА API рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ interact рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ production рдореЗрдВ рдЗрд╕реЗ debug рдХрд░рдирд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдХрдард┐рди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдмрд╕ [Security through obscurity](https://en.wikipedia.org/wiki/Security_through_obscurity) рдХрд╛ рдПрдХ рд░реВрдк рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдЧрд░ рдЖрдк рдЕрдкрдиреА API рдХреЛ secure рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХрдИ рдмреЗрд╣рддрд░ рдЪреАрдЬрд╝реЗрдВ рд╣реИрдВ рдЬреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
* рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ request bodies рдФрд░ responses рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ defined Pydantic models рд╣реИрдВред
* dependencies рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдИ рднреА required permissions рдФрд░ roles configure рдХрд░реЗрдВред
* plaintext passwords рдХрднреА store рди рдХрд░реЗрдВ, рдХреЗрд╡рд▓ password hashes store рдХрд░реЗрдВред
* pwdlib рдФрд░ JWT tokens рдЖрджрд┐ рдЬреИрд╕реЗ рдЬрд╛рдиреЗ-рдорд╛рдиреЗ cryptographic tools implement рдФрд░ use рдХрд░реЗрдВред
* рдЬрд╣рд╛рдБ рдЬрд╝рд░реВрд░рдд рд╣реЛ, OAuth2 scopes рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ granular permission controls рдЬреЛрдбрд╝реЗрдВред
* ...рдЖрджрд┐ред
рдлрд┐рд░ рднреА, рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ use case рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдБ рдЖрдкрдХреЛ рд╕рдЪ рдореЗрдВ рдХрд┐рд╕реА environment (рдЬреИрд╕реЗ production) рдХреЗ рд▓рд┐рдП рдпрд╛ environment variables рд╕реЗ рдорд┐рд▓реА configurations рдХреЗ рдЖрдзрд╛рд░ рдкрд░ API docs рдХреЛ disable рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛред
## settings рдФрд░ env vars рд╕реЗ рд╕рд╢рд░реНрдд OpenAPI { #conditional-openapi-from-settings-and-env-vars }
рдЖрдк рдЕрдкрдиреА generated OpenAPI рдФрд░ docs UIs рдХреЛ configure рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд╣реА Pydantic settings use рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
{* ../../docs_src/conditional_openapi/tutorial001_py310.py hl[6,11] *}
рдпрд╣рд╛рдБ рд╣рдо setting `openapi_url` рдХреЛ рдЙрд╕реА default `"/openapi.json"` рдХреЗ рд╕рд╛рде declare рдХрд░рддреЗ рд╣реИрдВред
рдФрд░ рдлрд┐рд░ `FastAPI` app рдмрдирд╛рддреЗ рд╕рдордп рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдлрд┐рд░ рдЖрдк environment variable `OPENAPI_URL` рдХреЛ empty string рдкрд░ set рдХрд░рдХреЗ OpenAPI (UI docs рд╕рд╣рд┐рдд) рдХреЛ disable рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:
<div class="termy">
```console
$ OPENAPI_URL= uvicorn main:app
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
</div>
рдлрд┐рд░ рдЕрдЧрд░ рдЖрдк `/openapi.json`, `/docs`, рдпрд╛ `/redoc` URLs рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдмрд╕ рдЗрд╕ рддрд░рд╣ рдХрд╛ `404 Not Found` error рдорд┐рд▓реЗрдЧрд╛:
```JSON
{
"detail": "Not Found"
}
```

70
docs/hi/docs/how-to/configure-swagger-ui.md

@ -0,0 +1,70 @@
# Swagger UI configure рдХрд░реЗрдВ { #configure-swagger-ui }
рдЖрдк рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд [Swagger UI parameters](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/) configure рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрдиреНрд╣реЗрдВ configure рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, `FastAPI()` app object рдмрдирд╛рддреЗ рд╕рдордп рдпрд╛ `get_swagger_ui_html()` function рдореЗрдВ `swagger_ui_parameters` argument pass рдХрд░реЗрдВред
`swagger_ui_parameters` рдПрдХ dictionary рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ configurations рд╕реАрдзреЗ Swagger UI рдХреЛ pass рдХреА рдЬрд╛рддреА рд╣реИрдВред
FastAPI configurations рдХреЛ **JSON** рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ JavaScript рдХреЗ рд╕рд╛рде compatible рд╣реЛрдВ, рдХреНрдпреЛрдВрдХрд┐ Swagger UI рдХреЛ рдпрд╣реА рдЪрд╛рд╣рд┐рдПред
## Syntax Highlighting disable рдХрд░реЗрдВ { #disable-syntax-highlighting }
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк Swagger UI рдореЗрдВ syntax highlighting disable рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Settings рдмрджрд▓реЗ рдмрд┐рдирд╛, syntax highlighting default рд░реВрдк рд╕реЗ enabled рд░рд╣рддреА рд╣реИ:
<img src="/img/tutorial/extending-openapi/image02.png">
рд▓реЗрдХрд┐рди рдЖрдк `syntaxHighlight` рдХреЛ `False` рдкрд░ set рдХрд░рдХреЗ рдЗрд╕реЗ disable рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/configure_swagger_ui/tutorial001_py310.py hl[3] *}
...рдФрд░ рдлрд┐рд░ Swagger UI рдЕрдм syntax highlighting рдирд╣реАрдВ рджрд┐рдЦрд╛рдПрдЧрд╛:
<img src="/img/tutorial/extending-openapi/image03.png">
## Theme рдмрджрд▓реЗрдВ { #change-the-theme }
рдЗрд╕реА рддрд░рд╣ рдЖрдк key `"syntaxHighlight.theme"` рдХреЗ рд╕рд╛рде syntax highlighting theme set рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕рдХреЗ рдмреАрдЪ рдореЗрдВ рдПрдХ dot рд╣реИ):
{* ../../docs_src/configure_swagger_ui/tutorial002_py310.py hl[3] *}
рд╡рд╣ configuration syntax highlighting color theme рдмрджрд▓ рджреЗрдЧреА:
<img src="/img/tutorial/extending-openapi/image04.png">
## Default Swagger UI Parameters рдмрджрд▓реЗрдВ { #change-default-swagger-ui-parameters }
FastAPI рдореЗрдВ рдЬрд╝реНрдпрд╛рджрд╛рддрд░ use cases рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдХреБрдЫ default configuration parameters рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдЗрд╕рдореЗрдВ рдпреЗ default configurations рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
{* ../../fastapi/openapi/docs.py ln[9:24] hl[18:24] *}
рдЖрдк `swagger_ui_parameters` argument рдореЗрдВ рдЕрд▓рдЧ value set рдХрд░рдХреЗ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА override рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, `deepLinking` disable рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдпреЗ settings `swagger_ui_parameters` рдореЗрдВ pass рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/configure_swagger_ui/tutorial003_py310.py hl[3] *}
## рдЕрдиреНрдп Swagger UI Parameters { #other-swagger-ui-parameters }
рдЖрдк рдЬрд┐рди рдЕрдиреНрдп рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд configurations рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ [Swagger UI parameters рдХреЗ docs](https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/) рдкрдврд╝реЗрдВред
## рдХреЗрд╡рд▓ JavaScript settings { #javascript-only-settings }
Swagger UI рдЕрдиреНрдп configurations рдХреЛ **рдХреЗрд╡рд▓ JavaScript** objects (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, JavaScript functions) рд╣реЛрдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
FastAPI рдореЗрдВ рдпреЗ рдХреЗрд╡рд▓ JavaScript `presets` settings рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
```JavaScript
presets: [
SwaggerUIBundle.presets.apis,
SwaggerUIBundle.SwaggerUIStandalonePreset
]
```
рдпреЗ **JavaScript** objects рд╣реИрдВ, strings рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрдиреНрд╣реЗрдВ рд╕реАрдзреЗ Python code рд╕реЗ pass рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рдЕрдЧрд░ рдЖрдкрдХреЛ рдРрд╕реА рдХреЗрд╡рд▓ JavaScript configurations рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдЖрдк рдКрдкрд░ рджрд┐рдП рдЧрдП methods рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреВрд░реА Swagger UI *path operation* рдХреЛ override рдХрд░реЗрдВ рдФрд░ рдЖрдкрдХреЛ рдЬреЛ рднреА JavaScript рдЪрд╛рд╣рд┐рдП рдЙрд╕реЗ manually рд▓рд┐рдЦреЗрдВред

185
docs/hi/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 files рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИред
Default рд░реВрдк рд╕реЗ, рд╡реЗ files рдПрдХ <abbr title="Content Delivery Network - рд╕рд╛рдордЧреНрд░реА рд╡рд┐рддрд░рдг рдиреЗрдЯрд╡рд░реНрдХ: рдПрдХ рд╕реЗрд╡рд╛, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдХрдИ servers рд╕реЗ рдмрдиреА рд╣реЛрддреА рд╣реИ, рдЬреЛ JavaScript рдФрд░ CSS рдЬреИрд╕реА static files рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдЗрд╕рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдЙрди files рдХреЛ client рдХреЗ рдХрд░реАрдм рд╡рд╛рд▓реЗ server рд╕реЗ serve рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ performance рдмреЗрд╣рддрд░ рд╣реЛрддреА рд╣реИред">CDN</abbr> рд╕реЗ serve рдХреА рдЬрд╛рддреА рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЗрд╕реЗ customize рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЖрдк рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ CDN set рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ files рдХреЛ рд╕реНрд╡рдпрдВ serve рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
## JavaScript рдФрд░ CSS рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо CDN { #custom-cdn-for-javascript-and-css }
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк рдХреЛрдИ рдЕрд▓рдЧ <abbr title="Content Delivery Network - рд╕рд╛рдордЧреНрд░реА рд╡рд┐рддрд░рдг рдиреЗрдЯрд╡рд░реНрдХ">CDN</abbr> рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдк `https://unpkg.com/` рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдРрд╕реЗ рджреЗрд╢ рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдХреБрдЫ URLs рдХреЛ restrict рдХрд░рддрд╛ рд╣реИред
### Automatic docs рдХреЛ disable рдХрд░реЗрдВ { #disable-the-automatic-docs }
рдкрд╣рд▓рд╛ step automatic docs рдХреЛ disable рдХрд░рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ default рд░реВрдк рд╕реЗ, рд╡реЗ default CDN рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЙрдиреНрд╣реЗрдВ disable рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкрдирд╛ `FastAPI` app рдмрдирд╛рддреЗ рд╕рдордп рдЙрдирдХреЗ URLs рдХреЛ `None` рдкрд░ set рдХрд░реЗрдВ:
{* ../../docs_src/custom_docs_ui/tutorial001_py310.py hl[8] *}
### рдХрд╕реНрдЯрдо docs рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ { #include-the-custom-docs }
рдЕрдм рдЖрдк рдХрд╕реНрдЯрдо docs рдХреЗ рд▓рд┐рдП *path operations* рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк docs рдХреЗ рд▓рд┐рдП HTML pages рдмрдирд╛рдиреЗ рд╣реЗрддреБ FastAPI рдХреЗ internal functions рдХреЛ reuse рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЬрд░реВрд░реА arguments pass рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
* `openapi_url`: рд╡рд╣ URL рдЬрд╣рд╛рдВ docs рдХреЗ рд▓рд┐рдП HTML page рдЖрдкрдХреЗ API рдХреЗ рд▓рд┐рдП OpenAPI schema рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдпрд╣рд╛рдВ attribute `app.openapi_url` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
* `title`: рдЖрдкрдХреЗ API рдХрд╛ titleред
* `oauth2_redirect_url`: default рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдпрд╣рд╛рдВ `app.swagger_ui_oauth2_redirect_url` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
* `swagger_js_url`: рд╡рд╣ URL рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ Swagger UI docs рдХреЗ рд▓рд┐рдП HTML **JavaScript** file рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХрд╕реНрдЯрдо CDN URL рд╣реИред
* `swagger_css_url`: рд╡рд╣ URL рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ Swagger UI docs рдХреЗ рд▓рд┐рдП HTML **CSS** file рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХрд╕реНрдЯрдо 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* рддрдм рдПрдХ helper рд╣реИ рдЬрдм рдЖрдк OAuth2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ API рдХреЛ рдХрд┐рд╕реА OAuth2 provider рдХреЗ рд╕рд╛рде integrate рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк authenticate рдХрд░ рдкрд╛рдПрдВрдЧреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд credentials рдХреЗ рд╕рд╛рде API docs рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдкрд╛рдПрдВрдЧреЗред рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ OAuth2 authentication рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕рд╕реЗ interact рдХрд░ рдкрд╛рдПрдВрдЧреЗред
Swagger UI рдЖрдкрдХреЗ рд▓рд┐рдП рдЗрд╕реЗ behind the scenes handle рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрд╕ "redirect" helper рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИред
///
### рдЗрд╕реЗ test рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ *path operation* рдмрдирд╛рдПрдВ { #create-a-path-operation-to-test-it }
рдЕрдм, рдпрд╣ test рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдПрдХ *path operation* рдмрдирд╛рдПрдВ:
{* ../../docs_src/custom_docs_ui/tutorial001_py310.py hl[36:38] *}
### рдЗрд╕реЗ test рдХрд░реЗрдВ { #test-it }
рдЕрдм, рдЖрдк рдЕрдкрдиреЗ docs рдкрд░ [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) рдЬрд╛ рд╕рдХреЗрдВрдЧреЗ, рдФрд░ page reload рдХрд░рдиреЗ рдкрд░, рдпрд╣ рдЙрди assets рдХреЛ рдирдП CDN рд╕реЗ load рдХрд░реЗрдЧрд╛ред
## Docs рдХреЗ рд▓рд┐рдП JavaScript рдФрд░ CSS рдХреА Self-hosting { #self-hosting-javascript-and-css-for-docs }
JavaScript рдФрд░ CSS рдХреА self-hosting рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИ рдЕрдЧрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдкрдХрд╛ app offline рд░рд╣рдиреЗ рдкрд░ рднреА, рдЦреБрд▓реЗ Internet access рдХреЗ рдмрд┐рдирд╛, рдпрд╛ local network рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд░рд╣реЗред
рдпрд╣рд╛рдВ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЙрди files рдХреЛ рд╕реНрд╡рдпрдВ, рдЙрд╕реА FastAPI app рдореЗрдВ рдХреИрд╕реЗ serve рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ docs рдХреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ configure рдХрд┐рдпрд╛ рдЬрд╛рдПред
### Project file structure { #project-file-structure }
рдорд╛рди рд▓реЗрдВ рдЖрдкрдХреЗ project рдХреА file structure рдРрд╕реА рджрд┐рдЦрддреА рд╣реИ:
```
.
тФЬтФАтФА app
тФВ тФЬтФАтФА __init__.py
тФВ тФЬтФАтФА main.py
```
рдЕрдм рдЙрди static files рдХреЛ store рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ directory рдмрдирд╛рдПрдВред
рдЖрдкрдХреА рдирдИ file structure рдРрд╕реА рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:
```
.
тФЬтФАтФА app
тФВ┬а┬а тФЬтФАтФА __init__.py
тФВ┬а┬а тФЬтФАтФА main.py
тФФтФАтФА static/
```
### Files download рдХрд░реЗрдВ { #download-the-files }
Docs рдХреЗ рд▓рд┐рдП рдЬрд░реВрд░реА static files download рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрд╕ `static/` directory рдореЗрдВ рд░рдЦреЗрдВред
рдЖрдк рд╢рд╛рдпрдж рдкреНрд░рддреНрдпреЗрдХ link рдкрд░ right-click рдХрд░рдХреЗ "Save link as..." рдЬреИрд╕рд╛ рдХреЛрдИ option select рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
**Swagger UI** files рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
* [`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** file рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
* [`redoc.standalone.js`](https://cdn.jsdelivr.net/npm/redoc@2/bundles/redoc.standalone.js)
рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреА file structure рдРрд╕реА рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:
```
.
тФЬтФАтФА app
тФВ┬а┬а тФЬтФАтФА __init__.py
тФВ┬а┬а тФЬтФАтФА main.py
тФФтФАтФА static
тФЬтФАтФА redoc.standalone.js
тФЬтФАтФА swagger-ui-bundle.js
тФФтФАтФА swagger-ui.css
```
### Static files serve рдХрд░реЗрдВ { #serve-the-static-files }
* `StaticFiles` import рдХрд░реЗрдВред
* рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ path рдореЗрдВ `StaticFiles()` instance рдХреЛ "Mount" рдХрд░реЗрдВред
{* ../../docs_src/custom_docs_ui/tutorial002_py310.py hl[7,11] *}
### Static files рдХреЛ test рдХрд░реЗрдВ { #test-the-static-files }
рдЕрдкрдирд╛ application start рдХрд░реЗрдВ рдФрд░ [http://127.0.0.1:8000/static/redoc.standalone.js](http://127.0.0.1:8000/static/redoc.standalone.js) рдкрд░ рдЬрд╛рдПрдВред
рдЖрдкрдХреЛ **ReDoc** рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд▓рдВрдмреА JavaScript file рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╢реБрд░реВ рд╣реЛ рд╕рдХрддреА рд╣реИ:
```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")):
...
```
рдпрд╣ confirm рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ app рд╕реЗ static files serve рдХрд░ рдкрд╛ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдиреЗ docs рдХреЗ рд▓рд┐рдП static files рдХреЛ рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рд░рдЦрд╛ рд╣реИред
рдЕрдм рд╣рдо app рдХреЛ docs рдХреЗ рд▓рд┐рдП рдЙрди static files рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП configure рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
### Static files рдХреЗ рд▓рд┐рдП automatic docs рдХреЛ disable рдХрд░реЗрдВ { #disable-the-automatic-docs-for-static-files }
рдХрд╕реНрдЯрдо CDN рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реА, рдкрд╣рд▓рд╛ step automatic docs рдХреЛ disable рдХрд░рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ default рд░реВрдк рд╕реЗ CDN рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЙрдиреНрд╣реЗрдВ disable рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкрдирд╛ `FastAPI` app рдмрдирд╛рддреЗ рд╕рдордп рдЙрдирдХреЗ URLs рдХреЛ `None` рдкрд░ set рдХрд░реЗрдВ:
{* ../../docs_src/custom_docs_ui/tutorial002_py310.py hl[9] *}
### Static files рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо docs рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ { #include-the-custom-docs-for-static-files }
рдФрд░ рдХрд╕реНрдЯрдо CDN рдХреА рддрд░рд╣ рд╣реА, рдЕрдм рдЖрдк рдХрд╕реНрдЯрдо docs рдХреЗ рд▓рд┐рдП *path operations* рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдлрд┐рд░ рд╕реЗ, рдЖрдк docs рдХреЗ рд▓рд┐рдП HTML pages рдмрдирд╛рдиреЗ рд╣реЗрддреБ FastAPI рдХреЗ internal functions рдХреЛ reuse рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЬрд░реВрд░реА arguments pass рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
* `openapi_url`: рд╡рд╣ URL рдЬрд╣рд╛рдВ docs рдХреЗ рд▓рд┐рдП HTML page рдЖрдкрдХреЗ API рдХреЗ рд▓рд┐рдП OpenAPI schema рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдпрд╣рд╛рдВ attribute `app.openapi_url` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
* `title`: рдЖрдкрдХреЗ API рдХрд╛ titleред
* `oauth2_redirect_url`: default рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдпрд╣рд╛рдВ `app.swagger_ui_oauth2_redirect_url` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
* `swagger_js_url`: рд╡рд╣ URL рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ Swagger UI docs рдХреЗ рд▓рд┐рдП HTML **JavaScript** file рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред **рдпрд╣ рд╡рд╣реА рд╣реИ рдЬрд┐рд╕реЗ рдЕрдм рдЖрдкрдХрд╛ рдЕрдкрдирд╛ app serve рдХрд░ рд░рд╣рд╛ рд╣реИ**ред
* `swagger_css_url`: рд╡рд╣ URL рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ Swagger UI docs рдХреЗ рд▓рд┐рдП HTML **CSS** file рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред **рдпрд╣ рд╡рд╣реА рд╣реИ рдЬрд┐рд╕реЗ рдЕрдм рдЖрдкрдХрд╛ рдЕрдкрдирд╛ app serve рдХрд░ рд░рд╣рд╛ рд╣реИ**ред
рдФрд░ ReDoc рдХреЗ рд▓рд┐рдП рднреА рдЗрд╕реА рддрд░рд╣...
{* ../../docs_src/custom_docs_ui/tutorial002_py310.py hl[2:6,14:22,25:27,30:36] *}
/// tip | рд╕реБрдЭрд╛рд╡
`swagger_ui_redirect` рдХреЗ рд▓рд┐рдП *path operation* рддрдм рдПрдХ helper рд╣реИ рдЬрдм рдЖрдк OAuth2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ API рдХреЛ рдХрд┐рд╕реА OAuth2 provider рдХреЗ рд╕рд╛рде integrate рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк authenticate рдХрд░ рдкрд╛рдПрдВрдЧреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд credentials рдХреЗ рд╕рд╛рде API docs рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдкрд╛рдПрдВрдЧреЗред рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ OAuth2 authentication рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕рд╕реЗ interact рдХрд░ рдкрд╛рдПрдВрдЧреЗред
Swagger UI рдЖрдкрдХреЗ рд▓рд┐рдП рдЗрд╕реЗ behind the scenes handle рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрд╕ "redirect" helper рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИред
///
### Static files рдХреЛ test рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ *path operation* рдмрдирд╛рдПрдВ { #create-a-path-operation-to-test-static-files }
рдЕрдм, рдпрд╣ test рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдПрдХ *path operation* рдмрдирд╛рдПрдВ:
{* ../../docs_src/custom_docs_ui/tutorial002_py310.py hl[39:41] *}
### Static Files UI рдХреЛ test рдХрд░реЗрдВ { #test-static-files-ui }
рдЕрдм, рдЖрдк рдЕрдкрдирд╛ WiFi disconnect рдХрд░ рд╕рдХреЗрдВрдЧреЗ, рдЕрдкрдиреЗ docs рдкрд░ [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs) рдЬрд╛ рд╕рдХреЗрдВрдЧреЗ, рдФрд░ page reload рдХрд░ рд╕рдХреЗрдВрдЧреЗред
рдФрд░ Internet рдХреЗ рдмрд┐рдирд╛ рднреА, рдЖрдк рдЕрдкрдиреЗ API рдХреЗ docs рджреЗрдЦ рдкрд╛рдПрдВрдЧреЗ рдФрд░ рдЙрд╕рд╕реЗ interact рдХрд░ рдкрд╛рдПрдВрдЧреЗред

109
docs/hi/docs/how-to/custom-request-and-route.md

@ -0,0 +1,109 @@
# Custom Request рдФрд░ APIRoute class { #custom-request-and-apiroute-class }
рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк `Request` рдФрд░ `APIRoute` classes рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ logic рдХреЛ override рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ middleware рдореЗрдВ logic рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рдЖрдк request body рдХреЛ рдЖрдкрдХреЗ application рджреНрд╡рд╛рд░рд╛ process рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрдврд╝рдирд╛ рдпрд╛ manipulate рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
/// danger | рдЦрддрд░рд╛
рдпрд╣ рдПрдХ "advanced" feature рд╣реИред
рдЕрдЧрд░ рдЖрдк рдЕрднреА-рдЕрднреА **FastAPI** рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдЖрдк рдЗрд╕ section рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
///
## Use cases { #use-cases }
рдХреБрдЫ use cases рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
* non-JSON request bodies рдХреЛ JSON рдореЗрдВ convert рдХрд░рдирд╛ (рдЬреИрд╕реЗ [`msgpack`](https://msgpack.org/index.html)).
* gzip-compressed request bodies рдХреЛ decompress рдХрд░рдирд╛ред
* рд╕рднреА request bodies рдХреЛ automatically log рдХрд░рдирд╛ред
## Custom request body encodings рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ { #handling-custom-request-body-encodings }
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ gzip requests рдХреЛ decompress рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП custom `Request` subclass рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред
рдФрд░ рдЙрд╕ custom request class рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ `APIRoute` subclassред
### Custom `GzipRequest` class рдмрдирд╛рдПрдБ { #create-a-custom-gziprequest-class }
/// tip | рд╕реБрдЭрд╛рд╡
рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрдЧрд░ рдЖрдкрдХреЛ Gzip support рдЪрд╛рд╣рд┐рдП, рддреЛ рдЖрдк рджрд┐рдП рдЧрдП [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
///
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ `GzipRequest` class рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдкрдпреБрдХреНрдд header рдХреА рдореМрдЬреВрджрдЧреА рдореЗрдВ body рдХреЛ decompress рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `Request.body()` method рдХреЛ overwrite рдХрд░реЗрдЧреАред
рдЕрдЧрд░ header рдореЗрдВ `gzip` рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ body рдХреЛ decompress рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░реЗрдЧреАред
рдЗрд╕ рддрд░рд╣, рд╡рд╣реА route class gzip compressed рдпрд╛ uncompressed requests рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреА рд╣реИред
{* ../../docs_src/custom_request_and_route/tutorial001_an_py310.py hl[9:16] *}
### Custom `GzipRoute` class рдмрдирд╛рдПрдБ { #create-a-custom-gziproute-class }
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо `fastapi.routing.APIRoute` рдХреА рдПрдХ custom subclass рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ `GzipRequest` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧреАред
рдЗрд╕ рдмрд╛рд░, рдпрд╣ `APIRoute.get_route_handler()` method рдХреЛ overwrite рдХрд░реЗрдЧреАред
рдпрд╣ method рдПрдХ function return рдХрд░рддрд╛ рд╣реИред рдФрд░ рд╡рд╣реА function рдПрдХ request рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдФрд░ response return рдХрд░реЗрдЧрд╛ред
рдпрд╣рд╛рдБ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ original 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 рдХреЛ "receive" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ function рд╣реИред
`scope` `dict` рдФрд░ `receive` function рджреЛрдиреЛрдВ ASGI specification рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред
рдФрд░ рдпреЗ рджреЛ рдЪреАрдЬреЗрдВ, `scope` рдФрд░ `receive`, рдирдИ `Request` instance рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред
`Request` рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП [Requests рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ Starlette рдХреЗ docs](https://www.starlette.dev/requests/) рджреЗрдЦреЗрдВред
///
`GzipRequest.get_route_handler` рджреНрд╡рд╛рд░рд╛ return рдХрд┐рдП рдЧрдП function рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЕрд▓рдЧ рдХрд╛рдо рд╣реИ: `Request` рдХреЛ `GzipRequest` рдореЗрдВ convert рдХрд░рдирд╛ред
рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ, рд╣рдорд╛рд░рд╛ `GzipRequest` data рдХреЛ рд╣рдорд╛рд░реЗ *path operations* рддрдХ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ decompress рдХрд░рдиреЗ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдЧрд╛ (рдЕрдЧрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ)ред
рдЙрд╕рдХреЗ рдмрд╛рдж, processing logic рд╕рдм рд╡рд╣реА рд░рд╣рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди `GzipRequest.body` рдореЗрдВ рд╣рдорд╛рд░реЗ рдмрджрд▓рд╛рд╡реЛрдВ рдХреА рд╡рдЬрд╣ рд╕реЗ, request body рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ **FastAPI** рджреНрд╡рд╛рд░рд╛ load рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ automatically decompress рд╣реЛ рдЬрд╛рдПрдЧреАред
## Exception handler рдореЗрдВ request body рддрдХ рдкрд╣реБрдБрдЪрдирд╛ { #accessing-the-request-body-in-an-exception-handler }
/// tip | рд╕реБрдЭрд╛рд╡
рдЗрд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, `RequestValidationError` рдХреЗ custom handler рдореЗрдВ `body` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢рд╛рдпрдж рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ ([Errors рд╕рдВрднрд╛рд▓рдирд╛](../tutorial/handling-errors.md#use-the-requestvalidationerror-body))ред
рд▓реЗрдХрд┐рди рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдЕрднреА рднреА valid рд╣реИ рдФрд░ рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ internal components рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ interact рдХрд░реЗрдВред
///
рд╣рдо рдЗрд╕реА approach рдХрд╛ рдЙрдкрдпреЛрдЧ 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 рдореЗрдВ custom `APIRoute` class { #custom-apiroute-class-in-a-router }
рдЖрдк `APIRouter` рдХрд╛ `route_class` parameter рднреА set рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/custom_request_and_route/tutorial003_py310.py hl[26] *}
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, `router` рдХреЗ рдЕрдВрддрд░реНрдЧрдд *path operations* custom `TimedRoute` class рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдФрд░ response рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд `X-Response-Time` header рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ response generate рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрд╛ рд╕рдордп рд╣реЛрдЧрд╛:
{* ../../docs_src/custom_request_and_route/tutorial003_py310.py hl[13:20] *}

88
docs/hi/docs/how-to/extending-openapi.md

@ -0,0 +1,88 @@
# OpenAPI рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ { #extending-openapi }
рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдкрдХреЛ generated OpenAPI schema рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛ рд╕рдХрддреА рд╣реИред
рдЗрд╕ section рдореЗрдВ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗред
## рд╕рд╛рдорд╛рдиреНрдп process { #the-normal-process }
рд╕рд╛рдорд╛рдиреНрдп (default) process рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред
рдПрдХ `FastAPI` application (instance) рдореЗрдВ рдПрдХ `.openapi()` method рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ OpenAPI schema return рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреА рдЬрд╛рддреА рд╣реИред
application object рдмрдирд╛рдиреЗ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, `/openapi.json` рдХреЗ рд▓рд┐рдП (рдпрд╛ рдЖрдкрдиреЗ рдЕрдкрдиреЗ `openapi_url` рдореЗрдВ рдЬреЛ рднреА set рдХрд┐рдпрд╛ рд╣реИ рдЙрд╕рдХреЗ рд▓рд┐рдП) рдПрдХ *path operation* registered рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ рдмрд╕ application рдХреЗ `.openapi()` method рдХреЗ result рдХреЗ рд╕рд╛рде рдПрдХ JSON response return рдХрд░рддрд╛ рд╣реИред
Default рд░реВрдк рд╕реЗ, method `.openapi()` рдЬреЛ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ property `.openapi_schema` рдХреЛ check рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрд╕рдореЗрдВ contents рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ return рдХрд░рддрд╛ рд╣реИред
рдЕрдЧрд░ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрдиреНрд╣реЗрдВ `fastapi.openapi.utils.get_openapi` рдореЗрдВ utility function рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ generate рдХрд░рддрд╛ рд╣реИред
рдФрд░ рд╡рд╣ function `get_openapi()` parameters рдХреЗ рд░реВрдк рдореЗрдВ рдпреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ:
* `title`: OpenAPI title, рдЬреЛ docs рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
* `version`: рдЖрдкрдХреЗ API рдХрд╛ version, рдЬреИрд╕реЗ `2.5.0`ред
* `openapi_version`: рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ OpenAPI specification рдХрд╛ versionред Default рд░реВрдк рд╕реЗ, latest: `3.1.0`ред
* `summary`: API рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ summaryред
* `description`: рдЖрдкрдХреЗ API рдХрд╛ description, рдЗрд╕рдореЗрдВ markdown рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ docs рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
* `routes`: application рд╕реЗ routes, рдЬреЛ `app.routes` рд╕реЗ рд▓рд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред FastAPI рдЗрдиреНрд╣реЗрдВ registered *path operations* collect рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ included routers рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
/// tip | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
`app.routes` рдПрдХ lower-level route tree рд╣реИред рдЗрд╕рдореЗрдВ route candidates рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ FastAPI internally included routers рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ final `APIRoute` objects рд╣реА рдирд╣реАрдВред
рдЖрдк рдлрд┐рд░ рднреА `app.routes` рдХреЛ `get_openapi()` рдореЗрдВ pass рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред FastAPI effective path operations collect рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ route tree рдХреЛ traverse рдХрд░реЗрдЧрд╛ред
///
/// note | рдиреЛрдЯ
parameter `summary` OpenAPI 3.1.0 рдФрд░ рдЙрд╕рд╕реЗ рдКрдкрд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЬрд┐рд╕реЗ FastAPI 0.99.0 рдФрд░ рдЙрд╕рд╕реЗ рдКрдкрд░ support рдХрд░рддрд╛ рд╣реИред
///
## Defaults рдХреЛ override рдХрд░рдирд╛ { #overriding-the-defaults }
рдКрдкрд░ рджреА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк OpenAPI schema generate рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ override рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА utility function рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП [custom logo рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ReDoc рдХрд╛ OpenAPI extension](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 рдХрд░реЗрдВ { #generate-the-openapi-schema }
рдлрд┐рд░, `custom_openapi()` function рдХреЗ рдЕрдВрджрд░, OpenAPI schema generate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА utility function рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
{* ../../docs_src/extending_openapi/tutorial001_py310.py hl[2,15:21] *}
### OpenAPI schema рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ { #modify-the-openapi-schema }
рдЕрдм рдЖрдк OpenAPI schema рдореЗрдВ `info` "object" рдореЗрдВ custom `x-logo` рдЬреЛрдбрд╝рдХрд░ ReDoc extension рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/extending_openapi/tutorial001_py310.py hl[22:24] *}
### OpenAPI schema рдХреЛ cache рдХрд░реЗрдВ { #cache-the-openapi-schema }
рдЖрдк рдЕрдкрдиреА generated schema store рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП property `.openapi_schema` рдХреЛ "cache" рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рддрд░рд╣, рдЬрдм рднреА рдХреЛрдИ user рдЖрдкрдХреЗ API docs рдЦреЛрд▓реЗрдЧрд╛, рдЖрдкрдХреА application рдХреЛ рд╣рд░ рдмрд╛рд░ schema generate рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛ред
рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ generate рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЕрдЧрд▓реА requests рдХреЗ рд▓рд┐рдП рд╡рд╣реА cached schema рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
{* ../../docs_src/extending_openapi/tutorial001_py310.py hl[13:14,25:26] *}
### Method рдХреЛ override рдХрд░реЗрдВ { #override-the-method }
рдЕрдм рдЖрдк `.openapi()` method рдХреЛ рдЕрдкрдиреЗ рдирдП function рд╕реЗ replace рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
{* ../../docs_src/extending_openapi/tutorial001_py310.py hl[29] *}
### рдЗрд╕реЗ check рдХрд░реЗрдВ { #check-it }
рдЬрдм рдЖрдк [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc) рдкрд░ рдЬрд╛рдПрдВрдЧреЗ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЖрдк рдЕрдкрдирд╛ custom logo рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, **FastAPI** рдХрд╛ logo):
<img src="/img/tutorial/extending-openapi/image01.png">

43
docs/hi/docs/how-to/general.md

@ -0,0 +1,43 @@
# рд╕рд╛рдорд╛рдиреНрдп - How To - Recipes { #general-how-to-recipes }
рд╕рд╛рдорд╛рдиреНрдп рдпрд╛ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП, docs рдореЗрдВ рдЕрдиреНрдп рдЬрдЧрд╣реЛрдВ рдХреЗ рдХрдИ pointers рдпрд╣рд╛рдБ рджрд┐рдП рдЧрдП рд╣реИрдВред
## Data рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВ - рд╕реБрд░рдХреНрд╖рд╛ { #filter-data-security }
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдк рдЬрд┐рддрдирд╛ data рд▓реМрдЯрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рди рд▓реМрдЯрд╛рдПрдБ, [Tutorial - Response Model - Return Type](../tutorial/response-model.md) рдХреЗ docs рдкрдврд╝реЗрдВред
## Response Performance рдХреЛ optimize рдХрд░реЗрдВ - Response Model - Return Type { #optimize-response-performance-response-model-return-type }
JSON data рд▓реМрдЯрд╛рддреЗ рд╕рдордп performance рдХреЛ optimize рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, return type рдпрд╛ response model рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЗрд╕ рддрд░рд╣ Pydantic JSON рдореЗрдВ serialization рдХреЛ Rust side рдкрд░ рд╕рдВрднрд╛рд▓реЗрдЧрд╛, Python рд╕реЗ рдЧреБрдЬрд╝рд░реЗ рдмрд┐рдирд╛ред рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВ [Tutorial - Response Model - Return Type](../tutorial/response-model.md) рдХреЗ docs рдореЗрдВред
## Documentation Tags - OpenAPI { #documentation-tags-openapi }
рдЕрдкрдиреЗ *path operations* рдореЗрдВ tags рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ docs UI рдореЗрдВ group рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, [Tutorial - Path Operation Configurations - Tags](../tutorial/path-operation-configuration.md#tags) рдХреЗ docs рдкрдврд╝реЗрдВред
## Documentation Summary рдФрд░ Description - 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) рдХреЗ docs рдкрдврд╝реЗрдВред
## Documentation Response description - OpenAPI { #documentation-response-description-openapi }
response рдХрд╛ description define рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреЛ docs UI рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, [Tutorial - Path Operation Configurations - Response description](../tutorial/path-operation-configuration.md#response-description) рдХреЗ docs рдкрдврд╝реЗрдВред
## Documentation рдореЗрдВ *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) рдХреЗ docs рдкрдврд╝реЗрдВред
## рдХрд┐рд╕реА рднреА Data рдХреЛ JSON-compatible рдореЗрдВ convert рдХрд░реЗрдВ { #convert-any-data-to-json-compatible }
рдХрд┐рд╕реА рднреА data рдХреЛ JSON-compatible рдореЗрдВ convert рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, [Tutorial - JSON Compatible Encoder](../tutorial/encoder.md) рдХреЗ docs рдкрдврд╝реЗрдВред
## OpenAPI Metadata - Docs { #openapi-metadata-docs }
рдЕрдкрдиреЗ OpenAPI schema рдореЗрдВ metadata рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдореЗрдВ license, version, contact, рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md) рдХреЗ docs рдкрдврд╝реЗрдВред
## OpenAPI Custom URL { #openapi-custom-url }
OpenAPI URL рдХреЛ customize рдХрд░рдиреЗ (рдпрд╛ рд╣рдЯрд╛рдиреЗ) рдХреЗ рд▓рд┐рдП, [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md#openapi-url) рдХреЗ docs рдкрдврд╝реЗрдВред
## OpenAPI Docs URLs { #openapi-docs-urls }
рдЕрдкрдиреЗ-рдЖрдк generate рдХрд┐рдП рдЧрдП docs user interfaces рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ URLs рдХреЛ update рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md#docs-urls) рдХреЗ docs рдкрдврд╝реЗрдВред

60
docs/hi/docs/how-to/graphql.md

@ -0,0 +1,60 @@
# GraphQL { #graphql }
рдХреНрдпреЛрдВрдХрд┐ **FastAPI** **ASGI** standard рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП ASGI рдХреЗ рд╕рд╛рде compatible рдХрд┐рд╕реА рднреА **GraphQL** library рдХреЛ integrate рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред
рдЖрдк рдЙрд╕реА application рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп FastAPI *path operations* рдХреЛ GraphQL рдХреЗ рд╕рд╛рде combine рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
/// tip | рд╕реБрдЭрд╛рд╡
**GraphQL** рдХреБрдЫ рдмрд╣реБрдд specific use cases рдХреЛ solve рдХрд░рддрд╛ рд╣реИред
Common **web APIs** рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕рдХреЗ **advantages** рдФрд░ **disadvantages** рд╣реИрдВред
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк evaluate рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ use case рдХреЗ рд▓рд┐рдП **benefits**, **drawbacks** рдХреА рднрд░рдкрд╛рдИ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред ЁЯдУ
///
## GraphQL Libraries { #graphql-libraries }
рдпрд╣рд╛рдБ рдХреБрдЫ **GraphQL** libraries рд╣реИрдВ рдЬрд┐рдирдореЗрдВ **ASGI** support рд╣реИред рдЖрдк рдЙрдиреНрд╣реЗрдВ **FastAPI** рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
* [Strawberry](https://strawberry.rocks/) ЁЯНУ
* [FastAPI рдХреЗ рд▓рд┐рдП docs](https://strawberry.rocks/docs/integrations/fastapi) рдХреЗ рд╕рд╛рде
* [Ariadne](https://ariadnegraphql.org/)
* [FastAPI рдХреЗ рд▓рд┐рдП docs](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/) **recommended** library рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ design **FastAPI** рдХреЗ design рдХреЗ рд╕рдмрд╕реЗ рдХрд░реАрдм рд╣реИ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ **type annotations** рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред
рдЖрдкрдХреЗ use case рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдк рдХреЛрдИ рдЕрд▓рдЧ library рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдореБрдЭрд╕реЗ рдкреВрдЫреЗрдВ, рддреЛ рдореИрдВ рд╢рд╛рдпрдж рд╕реБрдЭрд╛рд╡ рджреВрдБрдЧрд╛ рдХрд┐ рдЖрдк **Strawberry** рдЖрдЬрд╝рдорд╛рдПрдБред
рдпрд╣рд╛рдБ рдПрдХ рдЫреЛрдЯрд╛ preview рд╣реИ рдХрд┐ рдЖрдк Strawberry рдХреЛ FastAPI рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ integrate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/graphql_/tutorial001_py310.py hl[3,22,25] *}
рдЖрдк [Strawberry documentation](https://strawberry.rocks/) рдореЗрдВ Strawberry рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ [FastAPI рдХреЗ рд╕рд╛рде Strawberry](https://strawberry.rocks/docs/integrations/fastapi) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ docs рднреАред
## Starlette рд╕реЗ рдкреБрд░рд╛рдирд╛ `GraphQLApp` { #older-graphqlapp-from-starlette }
Starlette рдХреЗ рдкрд┐рдЫрд▓реЗ versions рдореЗрдВ [Graphene](https://graphene-python.org/) рдХреЗ рд╕рд╛рде integrate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ `GraphQLApp` class рд╢рд╛рдорд┐рд▓ рдереАред
рдЗрд╕реЗ Starlette рд╕реЗ deprecated рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ code рд╣реИ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рдерд╛, рддреЛ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ [starlette-graphene3](https://github.com/ciscorn/starlette-graphene3) рдкрд░ **migrate** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд╣реА use case cover рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬрд┐рд╕рдХрд╛ **рд▓рдЧрднрдЧ identical interface** рд╣реИред
/// tip | рд╕реБрдЭрд╛рд╡
рдпрджрд┐ рдЖрдкрдХреЛ GraphQL рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рддреЛ рдореИрдВ рдлрд┐рд░ рднреА recommend рдХрд░реВрдБрдЧрд╛ рдХрд┐ рдЖрдк [Strawberry](https://strawberry.rocks/) рджреЗрдЦреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ custom classes рдФрд░ types рдХреА рдмрдЬрд╛рдп type annotations рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред
///
## рдФрд░ рдЬрд╛рдиреЗрдВ { #learn-more }
рдЖрдк [official GraphQL documentation](https://graphql.org/) рдореЗрдВ **GraphQL** рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЙрди libraries рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдирдХреЗ links рдореЗрдВ рдФрд░ рднреА рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

13
docs/hi/docs/how-to/index.md

@ -0,0 +1,13 @@
# рдХреИрд╕реЗ рдХрд░реЗрдВ - рд░реЗрд╕рд┐рдкреА { #how-to-recipes }
рдпрд╣рд╛рдБ рдЖрдк **рдХрдИ topics** рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ recipes рдпрд╛ "how to" guides рджреЗрдЦреЗрдВрдЧреЗред
рдЗрдирдореЗрдВ рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛рддрд░ ideas рдХрдореЛрдмреЗрд╢ **рд╕реНрд╡рддрдВрддреНрд░** рд╣реЛрдВрдЧреЗ, рдФрд░ рдЬрд╝реНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдкрдХреЛ рдЗрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рддрднреА рдкрдврд╝рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрдЧреА рдЬрдм рд╡реЗ рд╕реАрдзреЗ **рдЖрдкрдХреЗ project** рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реЛрдВред
рдЕрдЧрд░ рдХреБрдЫ рдЖрдкрдХреЗ project рдХреЗ рд▓рд┐рдП рд░реЛрдЪрдХ рдФрд░ рдЙрдкрдпреЛрдЧреА рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдЖрдЧреЗ рдмрдврд╝рдХрд░ рдЙрд╕реЗ рджреЗрдЦреЗрдВ, рд▓реЗрдХрд┐рди рдирд╣реАрдВ рддреЛ рдЖрдк рд╢рд╛рдпрдж рдЙрдиреНрд╣реЗрдВ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
/// tip | рд╕реБрдЭрд╛рд╡
рдЕрдЧрд░ рдЖрдк **FastAPI рд╕реАрдЦрдирд╛** structured рддрд░реАрдХреЗ рд╕реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (recommended), рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп [рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ - рдпреВрдЬрд╝рд░ рдЧрд╛рдЗрдб](../tutorial/index.md) рдХреЛ рдЕрдзреНрдпрд╛рдп-рджрд░-рдЕрдзреНрдпрд╛рдп рдкрдврд╝реЗрдВред
///

153
docs/hi/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md

@ -0,0 +1,153 @@
# Pydantic v1 рд╕реЗ Pydantic v2 рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░реЗрдВ { #migrate-from-pydantic-v1-to-pydantic-v2 }
рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдкреБрд░рд╛рдирд╛ FastAPI app рд╣реИ, рддреЛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк Pydantic version 1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реЛрдВред
FastAPI version 0.100.0 рдореЗрдВ Pydantic v1 рдпрд╛ v2, рджреЛрдиреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП support рдерд╛ред рдпрд╣ рд╡рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рдерд╛ рдЬреЛ рдЖрдкрдиреЗ install рдХрд┐рдпрд╛ рд╣реБрдЖ рдерд╛ред
FastAPI version 0.119.0 рдиреЗ Pydantic v2 рдХреЗ рдЕрдВрджрд░ рд╕реЗ Pydantic v1 рдХреЗ рд▓рд┐рдП рдЖрдВрд╢рд┐рдХ support рдкреЗрд╢ рдХрд┐рдпрд╛ (`pydantic.v1` рдХреЗ рд░реВрдк рдореЗрдВ), рддрд╛рдХрд┐ v2 рдореЗрдВ migration рдЖрд╕рд╛рди рд╣реЛ рд╕рдХреЗред
FastAPI 0.126.0 рдиреЗ Pydantic v1 рдХреЗ рд▓рд┐рдП support рд╣рдЯрд╛ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдереЛрдбрд╝реЗ рд╕рдордп рдХреЗ рд▓рд┐рдП `pydantic.v1` рдХреЛ support рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрд╛ред
FastAPI 0.128.0 рдиреЗ `pydantic.v1` рдХреЗ рд▓рд┐рдП support рднреА рд╣рдЯрд╛ рджрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП FastAPI рдХреЗ рдирд╡реАрдирддрдо versions рдХреЗ рд▓рд┐рдП Pydantic v2 required рд╣реИред
/// warning | рдЪреЗрддрд╛рд╡рдиреА
Pydantic team рдиреЗ **Python 3.14** рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реБрдП, Python рдХреЗ рдирд╡реАрдирддрдо versions рдХреЗ рд▓рд┐рдП Pydantic v1 рдХрд╛ support рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ред
рдЗрд╕рдореЗрдВ `pydantic.v1` рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдЕрдм Python 3.14 рдФрд░ рдЙрд╕рд╕реЗ рдКрдкрд░ рдореЗрдВ supported рдирд╣реАрдВ рд╣реИред
рдЕрдЧрд░ рдЖрдк Python рдХреА рдирд╡реАрдирддрдо features рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк Pydantic v2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
///
рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ Pydantic v1 рд╡рд╛рд▓рд╛ рдХреЛрдИ рдкреБрд░рд╛рдирд╛ FastAPI app рд╣реИ, рддреЛ рдпрд╣рд╛рдБ рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдБрдЧрд╛ рдХрд┐ рдЙрд╕реЗ Pydantic v2 рдореЗрдВ рдХреИрд╕реЗ migrate рдХрд░реЗрдВ, рдФрд░ gradual migration рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП **FastAPI 0.119.0 рдХреА features** рднреА рджрд┐рдЦрд╛рдКрдБрдЧрд╛ред
## рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЧрд╛рдЗрдб { #official-guide }
Pydantic рдХреЗ рдкрд╛рд╕ v1 рд╕реЗ v2 рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ [Migration Guide](https://docs.pydantic.dev/latest/migration/) рд╣реИред
рдЗрд╕рдореЗрдВ рдпрд╣ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдмрджрд▓рд╛ рд╣реИ, validations рдЕрдм рдХреИрд╕реЗ рдЕрдзрд┐рдХ рд╕рд╣реА рдФрд░ strict рд╣реИрдВ, рд╕рдВрднрд╛рд╡рд┐рдд caveats рдЖрджрд┐ред
рдХреНрдпрд╛ рдмрджрд▓рд╛ рд╣реИ рдЗрд╕реЗ рдмреЗрд╣рддрд░ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
## Tests { #tests }
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ app рдХреЗ рд▓рд┐рдП [tests](../tutorial/testing.md) рд╣реИрдВ рдФрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ continuous integration (CI) рдкрд░ рдЪрд▓рд╛рддреЗ рд╣реИрдВред
рдЗрд╕ рддрд░рд╣, рдЖрдк upgrade рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдЕрднреА рднреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
## `bump-pydantic` { #bump-pydantic }
рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬрдм рдЖрдк customizations рдХреЗ рдмрд┐рдирд╛ regular Pydantic models рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк Pydantic v1 рд╕реЗ Pydantic v2 рдореЗрдВ migration рдХреА рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рдХреНрд░рд┐рдпрд╛ automate рдХрд░ рдкрд╛рдПрдБрдЧреЗред
рдЖрдк рдЙрд╕реА Pydantic team рдХрд╛ [`bump-pydantic`](https://github.com/pydantic/bump-pydantic) рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ tool рдЖрдкрдХреЛ рдЙрд╕ рдЕрдзрд┐рдХрд╛рдВрд╢ code рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдмрджрд▓рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИред
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдк tests рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЕрдЧрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХрд╛ рдХрд╛рдо рд╣реЛ рдЧрдпрд╛ред ЁЯШО
## v2 рдореЗрдВ Pydantic v1 { #pydantic-v1-in-v2 }
Pydantic v2 рдореЗрдВ Pydantic v1 рдХреА рд╕рднреА рдЪреАрдЬрд╝реЗрдВ `pydantic.v1` submodule рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ Python 3.13 рд╕реЗ рдКрдкрд░ рдХреЗ versions рдореЗрдВ рдЕрдм supported рдирд╣реАрдВ рд╣реИред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк Pydantic v2 рдХрд╛ рдирд╡реАрдирддрдо version install рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ submodule рд╕реЗ рдкреБрд░рд╛рдиреЗ Pydantic v1 components рдХреЛ import рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреБрд░рд╛рдирд╛ Pydantic v1 install рд╣реЛред
{* ../../docs_src/pydantic_v1_in_v2/tutorial001_an_py310.py hl[1,4] *}
### v2 рдореЗрдВ Pydantic v1 рдХреЗ рд▓рд┐рдП FastAPI support { #fastapi-support-for-pydantic-v1-in-v2 }
/// warning | рдЪреЗрддрд╛рд╡рдиреА
`pydantic.v1` models рдХреЗ рд▓рд┐рдП рдпрд╣ FastAPI support **FastAPI 0.119.0** рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ **FastAPI 0.128.0** рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ред рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп Pydantic v2 рдореЗрдВ migration рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдерд╛рдпреА рд╕рд╣рд╛рдпрддрд╛ рд╣реЛрдирд╛ рдерд╛ред
FastAPI рдХреЗ рд╡рд░реНрддрдорд╛рди versions рдореЗрдВ, рдЕрдкрдиреЗ app рдореЗрдВ `pydantic.v1` model рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ error рдЖрдПрдЧрд╛ред
рдЗрд╕ section рдХрд╛ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕рд╛ рдХреЗрд╡рд▓ рдЙрди рдкреБрд░рд╛рдиреЗ versions рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдЕрд╕реНрдерд╛рдпреА support рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
///
FastAPI 0.119.0 рд╕реЗ, Pydantic v2 рдХреЗ рдЕрдВрджрд░ рд╕реЗ Pydantic v1 рдХреЗ рд▓рд┐рдП рдЖрдВрд╢рд┐рдХ support рднреА рд╣реИ, рддрд╛рдХрд┐ v2 рдореЗрдВ migration рдЖрд╕рд╛рди рд╣реЛ рд╕рдХреЗред
рдЗрд╕рд▓рд┐рдП, рдЖрдк Pydantic рдХреЛ рдирд╡реАрдирддрдо version 2 рдореЗрдВ upgrade рдХрд░ рд╕рдХрддреЗ рдереЗ, рдФрд░ imports рдХреЛ `pydantic.v1` submodule рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рд╕рдХрддреЗ рдереЗ, рдФрд░ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдмрд╕ рдХрд╛рдо рдХрд░ рдЬрд╛рддрд╛ред
{* ../../docs_src/pydantic_v1_in_v2/tutorial002_an_py310.py hl[2,5,15] *}
/// warning | рдЪреЗрддрд╛рд╡рдиреА
рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ Pydantic team рдЕрдм Python рдХреЗ рд╣рд╛рд▓ рдХреЗ versions рдореЗрдВ Pydantic v1 рдХреЛ support рдирд╣реАрдВ рдХрд░рддреА, Python 3.14 рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реБрдП, рдЗрд╕рд▓рд┐рдП `pydantic.v1` рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА Python 3.14 рдФрд░ рдЙрд╕рд╕реЗ рдКрдкрд░ рдореЗрдВ supported рдирд╣реАрдВ рд╣реИред
///
### рдПрдХ рд╣реА app рдореЗрдВ Pydantic v1 рдФрд░ v2 { #pydantic-v1-and-v2-on-the-same-app }
Pydantic рджреНрд╡рд╛рд░рд╛ рдпрд╣ **supported рдирд╣реАрдВ рд╣реИ** рдХрд┐ 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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдФрд░ рдХреБрдЫ Pydantic 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 рдХреЗ рд╕рд╛рде parameters рдХреЗ рд▓рд┐рдП FastAPI-specific tools рдЬреИрд╕реЗ `Body`, `Query`, `Form` рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рддреЛ Pydantic v2 рдореЗрдВ migration рдкреВрд░рд╛ рдХрд░рддреЗ рд╕рдордп рдЖрдк рдЙрдиреНрд╣реЗрдВ `fastapi.temp_pydantic_v1_params` рд╕реЗ import рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/pydantic_v1_in_v2/tutorial004_an_py310.py hl[4,18] *}
### рдЪрд░рдгреЛрдВ рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░реЗрдВ { #migrate-in-steps }
/// warning | рдЪреЗрддрд╛рд╡рдиреА
рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд, рдПрдХ рд╣реА app рдореЗрдВ Pydantic v1 рдФрд░ v2 рджреЛрдиреЛрдВ models рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ gradual migration рдХреЗрд╡рд▓ **FastAPI 0.119.0 рд╕реЗ 0.127.x** рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ **FastAPI 0.128.0** рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛, рдирд╡реАрдирддрдо versions рдХреЗ рд▓рд┐рдП **Pydantic v2** models required рд╣реИрдВред
///
/// tip | рд╕реБрдЭрд╛рд╡
рдкрд╣рд▓реЗ `bump-pydantic` рдХреЗ рд╕рд╛рде рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рдЕрдЧрд░ рдЖрдкрдХреЗ tests pass рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХрд╛ рдХрд╛рдо рдПрдХ command рдореЗрдВ рд╣реЛ рдЧрдпрд╛ред тЬи
///
рдЕрдЧрд░ `bump-pydantic` рдЖрдкрдХреЗ use case рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛, рддреЛ рдЖрдк Pydantic v2 рдореЗрдВ gradual migration рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА app рдореЗрдВ Pydantic v1 рдФрд░ v2 рджреЛрдиреЛрдВ models рдХреЗ support рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк рдкрд╣рд▓реЗ Pydantic рдХреЛ рдирд╡реАрдирддрдо version 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП upgrade рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдкрдиреЗ рд╕рднреА models рдХреЗ рд▓рд┐рдП `pydantic.v1` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП imports рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдлрд┐рд░, рдЖрдк gradual steps рдореЗрдВ, groups рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ models рдХреЛ Pydantic v1 рд╕реЗ v2 рдореЗрдВ migrate рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред ЁЯЪ╢

102
docs/hi/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** рд░рд┐рд▓реАрдЬрд╝ рд╣реБрдЖ рд╣реИ, generated 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 **required рдирд╣реАрдВ рд╣реЛрдЧрд╛**ред рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ default value `None` рд╣реИред
### Docs рдореЗрдВ Input Model { #input-model-in-docs }
рдЖрдк docs рдореЗрдВ рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, `description` field рдХреЗ рдкрд╛рд╕ **рд▓рд╛рд▓ asterisk** рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ required рдХреЗ рд░реВрдк рдореЗрдВ mark рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
<div class="screenshot">
<img src="/img/tutorial/separate-openapi-schemas/image01.png">
</div>
### Output рдХреЗ рд▓рд┐рдП Model { #model-for-output }
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЙрд╕реА model рдХреЛ output рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдпрд╣рд╛рдБ:
{* ../../docs_src/separate_openapi_schemas/tutorial001_py310.py hl[19] *}
...рддреЛ рдХреНрдпреЛрдВрдХрд┐ `description` рдХрд╛ default value рд╣реИ, рдЕрдЧрд░ рдЖрдк рдЙрд╕ field рдХреЗ рд▓рд┐рдП **рдХреБрдЫ рднреА return рдирд╣реАрдВ рдХрд░рддреЗ**, рддрдм рднреА рдЗрд╕рдХрд╛ рд╡рд╣реА **default value** рд░рд╣реЗрдЧрд╛ред
### Output Response Data рдХреЗ рд▓рд┐рдП Model { #model-for-output-response-data }
рдЕрдЧрд░ рдЖрдк docs рдХреЗ рд╕рд╛рде interact рдХрд░рддреЗ рд╣реИрдВ рдФрд░ response рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ, рддреЛ рднрд▓реЗ рд╣реА code рдиреЗ `description` fields рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдореЗрдВ рдХреБрдЫ рднреА add рдирд╣реАрдВ рдХрд┐рдпрд╛, JSON response рдореЗрдВ default value (`null`) рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ:
<div class="screenshot">
<img src="/img/tutorial/separate-openapi-schemas/image02.png">
</div>
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ **рд╣рдореЗрд╢рд╛ рдПрдХ value рд╣реЛрдЧрд╛**, рдмрд╕ рдХрднреА-рдХрднреА value `None` рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╛ JSON рдореЗрдВ `null`)ред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреА API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ clients рдХреЛ рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ value рдореМрдЬреВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд╡реЗ **рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ field рд╣рдореЗрд╢рд╛ рдореМрдЬреВрдж рд░рд╣реЗрдЧрд╛**, рдмрд╕ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ default value `None` рд╣реЛрдЧрд╛ред
OpenAPI рдореЗрдВ рдЗрд╕реЗ describe рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЙрд╕ field рдХреЛ **required** рдХреЗ рд░реВрдк рдореЗрдВ mark рдХрд┐рдпрд╛ рдЬрд╛рдП, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рд╣рдореЗрд╢рд╛ рдореМрдЬреВрдж рд░рд╣реЗрдЧрд╛ред
рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдХрд┐рд╕реА model рдХреЗ рд▓рд┐рдП JSON Schema рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ **input рдпрд╛ output** рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
* **input** рдХреЗ рд▓рд┐рдП `description` **required рдирд╣реАрдВ рд╣реЛрдЧрд╛**
* **output** рдХреЗ рд▓рд┐рдП рдпрд╣ **required** рд╣реЛрдЧрд╛ (рдФрд░ рд╕рдВрднрд╡рддрдГ `None`, рдпрд╛ JSON terms рдореЗрдВ, `null`)
### Docs рдореЗрдВ Output рдХреЗ рд▓рд┐рдП Model { #model-for-output-in-docs }
рдЖрдк docs рдореЗрдВ output model рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, **рджреЛрдиреЛрдВ** `name` рдФрд░ `description` рдХреЛ **рд▓рд╛рд▓ asterisk** рдХреЗ рд╕рд╛рде **required** рдХреЗ рд░реВрдк рдореЗрдВ mark рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
<div class="screenshot">
<img src="/img/tutorial/separate-openapi-schemas/image03.png">
</div>
### Docs рдореЗрдВ Input рдФрд░ Output рдХреЗ рд▓рд┐рдП Model { #model-for-input-and-output-in-docs }
рдФрд░ рдЕрдЧрд░ рдЖрдк OpenAPI рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╕рднреА Schemas (JSON Schemas) рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рджреЛ рд╣реИрдВ, рдПрдХ `Item-Input` рдФрд░ рдПрдХ `Item-Output`ред
`Item-Input` рдХреЗ рд▓рд┐рдП, `description` **required рдирд╣реАрдВ рд╣реИ**, рдЗрд╕рдореЗрдВ рд▓рд╛рд▓ asterisk рдирд╣реАрдВ рд╣реИред
рд▓реЗрдХрд┐рди `Item-Output` рдХреЗ рд▓рд┐рдП, `description` **required** рд╣реИ, рдЗрд╕рдореЗрдВ рд▓рд╛рд▓ asterisk рд╣реИред
<div class="screenshot">
<img src="/img/tutorial/separate-openapi-schemas/image04.png">
</div>
**Pydantic v2** рдХреА рдЗрд╕ feature рдХреЗ рд╕рд╛рде, рдЖрдкрдХреА API documentation рдЕрдзрд┐рдХ **precise** рд╣реЛрддреА рд╣реИ, рдФрд░ рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ autogenerated clients рдФрд░ SDKs рд╣реИрдВ, рддреЛ рд╡реЗ рднреА рдЕрдзрд┐рдХ precise рд╣реЛрдВрдЧреЗ, рдмреЗрд╣рддрд░ **developer experience** рдФрд░ consistency рдХреЗ рд╕рд╛рдеред ЁЯОЙ
## Schemas рдХреЛ рдЕрд▓рдЧ рди рдХрд░реЗрдВ { #do-not-separate-schemas }
рдЕрдм, рдХреБрдЫ рдорд╛рдорд▓реЗ рдРрд╕реЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдк **input рдФрд░ output рдХреЗ рд▓рд┐рдП same schema** рд░рдЦрдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред
рд╢рд╛рдпрдж рдЗрд╕рдХрд╛ рдореБрдЦреНрдп use case рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдХреБрдЫ autogenerated client code/SDKs рд╣реИрдВ рдФрд░ рдЖрдк рдЕрднреА рд╕рднреА autogenerated client code/SDKs рдХреЛ update рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ, рддреЛ рд╢рд╛рдпрдж рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА рд╕рдордп рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЕрднреА рдирд╣реАрдВред
рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк **FastAPI** рдореЗрдВ рдЗрд╕ feature рдХреЛ parameter `separate_input_output_schemas=False` рдХреЗ рд╕рд╛рде disable рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
/// note | рдиреЛрдЯ
`separate_input_output_schemas` рдХреЗ рд▓рд┐рдП support FastAPI `0.102.0` рдореЗрдВ add рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред ЁЯдУ
///
{* ../../docs_src/separate_openapi_schemas/tutorial002_py310.py hl[10] *}
### Docs рдореЗрдВ Input рдФрд░ Output Models рдХреЗ рд▓рд┐рдП Same Schema { #same-schema-for-input-and-output-models-in-docs }
рдФрд░ рдЕрдм model рдХреЗ рд▓рд┐рдП input рдФрд░ output рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ single schema рд╣реЛрдЧрд╛, рд╕рд┐рд░реНрдл `Item`, рдФрд░ рдЗрд╕рдореЗрдВ `description` **required рдирд╣реАрдВ** рд╣реЛрдЧрд╛:
<div class="screenshot">
<img src="/img/tutorial/separate-openapi-schemas/image05.png">
</div>

7
docs/hi/docs/how-to/testing-database.md

@ -0,0 +1,7 @@
# Database рдХреА Testing { #testing-a-database }
рдЖрдк databases, SQL, рдФрд░ SQLModel рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ [SQLModel docs](https://sqlmodel.tiangolo.com/) рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред ЁЯдУ
[FastAPI рдХреЗ рд╕рд╛рде SQLModel рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдкрд░ рдПрдХ рдЫреЛрдЯрд╛ tutorial](https://sqlmodel.tiangolo.com/tutorial/fastapi/) рд╣реИред тЬи
рдЙрд╕ tutorial рдореЗрдВ [SQL databases рдХреА testing](https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ section рд╢рд╛рдорд┐рд▓ рд╣реИред ЁЯШО

3
docs/hi/docs/resources/index.md

@ -0,0 +1,3 @@
# рд╕рдВрд╕рд╛рдзрди { #resources }
рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕рд╛рдзрди, external links, рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫред тЬИя╕П

203
docs/hi/docs/tutorial/security/first-steps.md

@ -0,0 +1,203 @@
# рд╕реБрд░рдХреНрд╖рд╛ - рдкрд╣рд▓реЗ рдХрджрдо { #security-first-steps }
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХрд╛ **backend** API рдХрд┐рд╕реА domain рдореЗрдВ рд╣реИред
рдФрд░ рдЖрдкрдХрд╛ **frontend** рдХрд┐рд╕реА рджреВрд╕рд░реЗ domain рдореЗрдВ рд╣реИ рдпрд╛ рдЙрд╕реА domain рдХреЗ рдХрд┐рд╕реА рдЕрд▓рдЧ path рдореЗрдВ рд╣реИ (рдпрд╛ рдХрд┐рд╕реА mobile application рдореЗрдВ)ред
рдФрд░ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ frontend, **username** рдФрд░ **password** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ backend рдХреЗ рд╕рд╛рде authenticate рдХрд░ рд╕рдХреЗред
рд╣рдо рдЗрд╕реЗ **FastAPI** рдХреЗ рд╕рд╛рде рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП **OAuth2** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╡реЗ рдЫреЛрдЯреА-рдЫреЛрдЯреА рдЬрд╛рдирдХрд╛рд░рд┐рдпрд╛рдБ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рд▓рдВрдмреА specification рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рдордп рди рд▓рдЧрд╛рдирд╛ рдкрдбрд╝реЗред
рдЖрдЗрдП рд╕реБрд░рдХреНрд╖рд╛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП **FastAPI** рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП tools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
## рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ { #how-it-looks }
рдЖрдЗрдП рдкрд╣рд▓реЗ рдмрд╕ code рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рдо рд╡рд╛рдкрд╕ рдЖрдХрд░ рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред
## `main.py` рдмрдирд╛рдПрдБ { #create-main-py }
рдЙрджрд╛рд╣рд░рдг рдХреЛ рдПрдХ file `main.py` рдореЗрдВ copy рдХрд░реЗрдВ:
{* ../../docs_src/security/tutorial001_an_py310.py *}
## рдЗрд╕реЗ рдЪрд▓рд╛рдПрдБ { #run-it }
/// note | рдиреЛрдЯ
[`python-multipart`](https://github.com/Kludex/python-multipart) package **FastAPI** рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ-рдЖрдк install рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрдк `pip install "fastapi[standard]"` command рдЪрд▓рд╛рддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдЧрд░ рдЖрдк `pip install fastapi` command рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ `python-multipart` package default рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ред
рдЗрд╕реЗ manually install рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдПрдХ [virtual environment](../../virtual-environments.md) рдмрдирд╛рдПрдБ, рдЙрд╕реЗ activate рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ install рдХрд░реЗрдВ:
```console
$ pip install python-multipart
```
рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ **OAuth2**, `username` рдФрд░ `password` рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП "form data" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
///
рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЗрд╕ рддрд░рд╣ рдЪрд▓рд╛рдПрдБ:
<div class="termy">
```console
$ fastapi dev
<span style="color: green;">INFO</span>: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
```
</div>
## рдЗрд╕реЗ рдЬрд╛рдБрдЪреЗрдВ { #check-it }
Interactive docs рдкрд░ рдЬрд╛рдПрдБ: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
рдЖрдкрдХреЛ рдХреБрдЫ рдРрд╕рд╛ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
<img src="/img/tutorial/security/image01.png">
/// tip | Authorize рдмрдЯрди!
рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЪрдордХрджрд╛рд░ рдирдпрд╛ "Authorize" рдмрдЯрди рд╣реИред
рдФрд░ рдЖрдкрдХреА *path operation* рдХреЗ рдКрдкрд░-рджрд╛рдПрдБ рдХреЛрдиреЗ рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛-рд╕рд╛ lock рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЖрдк click рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
///
рдФрд░ рдЕрдЧрд░ рдЖрдк рдЙрд╕ рдкрд░ click рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ `username` рдФрд░ `password` (рдФрд░ рдЕрдиреНрдп optional fields) type рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ authorization form рд╣реЛрдЧрд╛:
<img src="/img/tutorial/security/image02.png">
/// note | рдиреЛрдЯ
рдЖрдк form рдореЗрдВ рдХреНрдпрд╛ type рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рдпрд╣ рдЕрднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рд╣рдо рд╡рд╣рд╛рдБ рддрдХ рдкрд╣реБрдБрдЪреЗрдВрдЧреЗред
///
рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ final users рдХреЗ рд▓рд┐рдП frontend рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХреЗ рдкреВрд░реЗ API рдХреЛ interactively document рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдирджрд╛рд░ automatic tool рд╣реИред
рдЗрд╕реЗ frontend team рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬреЛ рдЖрдк рдЦреБрдж рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ)ред
рдЗрд╕реЗ third party applications рдФрд░ systems рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдФрд░ рдЗрд╕реЗ рдЖрдк рдЦреБрдж рднреА рдЙрд╕реА application рдХреЛ debug, check рдФрд░ test рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
## `password` flow { #the-password-flow }
рдЕрдм рдереЛрдбрд╝рд╛ рдкреАрдЫреЗ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдм рдХреНрдпрд╛ рд╣реИред
`password` "flow", OAuth2 рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЙрди рддрд░реАрдХреЛрдВ ("flows") рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ security рдФрд░ authentication рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
OAuth2 рдХреЛ рдЗрд╕ рддрд░рд╣ design рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ backend рдпрд╛ API рдЙрд╕ server рд╕реЗ independent рд╣реЛ рд╕рдХреЗ рдЬреЛ user рдХреЛ authenticate рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЗрд╕ case рдореЗрдВ, рд╡рд╣реА **FastAPI** application API рдФрд░ authentication рджреЛрдиреЛрдВ рд╕рдВрднрд╛рд▓реЗрдЧрд╛ред
рддреЛ, рдЖрдЗрдП рдЗрд╕реЗ рдЙрд╕ simplified рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ review рдХрд░реЗрдВ:
* User frontend рдореЗрдВ `username` рдФрд░ `password` type рдХрд░рддрд╛ рд╣реИ, рдФрд░ `Enter` рджрдмрд╛рддрд╛ рд╣реИред
* Frontend (рдЬреЛ user рдХреЗ browser рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ) рдЙрд╕ `username` рдФрд░ `password` рдХреЛ рд╣рдорд╛рд░реЗ API рдХреЗ рдПрдХ specific URL рдкрд░ рднреЗрдЬрддрд╛ рд╣реИ (`tokenUrl="token"` рдХреЗ рд╕рд╛рде declare рдХрд┐рдпрд╛ рдЧрдпрд╛)ред
* API рдЙрд╕ `username` рдФрд░ `password` рдХреЛ check рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ "token" рдХреЗ рд╕рд╛рде respond рдХрд░рддрд╛ рд╣реИ (рд╣рдордиреЗ рдЕрднреА рддрдХ рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рднреА implement рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ)ред
* рдПрдХ "token" рдмрд╕ рдХреБрдЫ content рд╡рд╛рд▓реА string рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕ user рдХреЛ verify рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
* рд╕рд╛рдорд╛рдиреНрдпрддрдГ, token рдХреЛ рдХреБрдЫ рд╕рдордп рдмрд╛рдж expire рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП set рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
* рдЗрд╕рд▓рд┐рдП, user рдХреЛ рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рд╕рдордп рдлрд┐рд░ рд╕реЗ log in рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
* рдФрд░ рдЕрдЧрд░ token рдЪреЛрд░реА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ risk рдХрдо рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХрд┐рд╕реА permanent key рдЬреИрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдХрд░реЗрдЧреА (рдЕрдзрд┐рдХрд╛рдВрд╢ cases рдореЗрдВ)ред
* Frontend рдЙрд╕ token рдХреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдХрд╣реАрдВ store рдХрд░рддрд╛ рд╣реИред
* User frontend web app рдХреЗ рдХрд┐рд╕реА рджреВрд╕рд░реЗ section рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП frontend рдореЗрдВ click рдХрд░рддрд╛ рд╣реИред
* Frontend рдХреЛ API рд╕реЗ рдХреБрдЫ рдФрд░ data fetch рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
* рд▓реЗрдХрд┐рди рдЙрд╕ specific endpoint рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ authentication рдЪрд╛рд╣рд┐рдПред
* рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ API рдХреЗ рд╕рд╛рде authenticate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ `Authorization` header рднреЗрдЬрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреА value `Bearer ` plus token рд╣реЛрддреА рд╣реИред
* рдЕрдЧрд░ token рдореЗрдВ `foobar` рд╣реИ, рддреЛ `Authorization` header рдХрд╛ content рд╣реЛрдЧрд╛: `Bearer foobar`.
## **FastAPI** рдХрд╛ `OAuth2PasswordBearer` { #fastapis-oauth2passwordbearer }
**FastAPI** рдЗрди security features рдХреЛ implement рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП abstraction рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ levels рдкрд░ рдХрдИ tools рджреЗрддрд╛ рд╣реИред
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдо **OAuth2** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, **Password** flow рдХреЗ рд╕рд╛рде, **Bearer** token рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред рд╣рдо рдпрд╣ `OAuth2PasswordBearer` class рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░рддреЗ рд╣реИрдВред
/// note | рдиреЛрдЯ
"bearer" token рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред
рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ use case рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред
рдФрд░ рдпрд╣ рдЕрдзрд┐рдХрд╛рдВрд╢ use cases рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк OAuth2 expert рди рд╣реЛрдВ рдФрд░ рдареАрдХ-рдареАрдХ рди рдЬрд╛рдирддреЗ рд╣реЛрдВ рдХрд┐ рдХреЛрдИ рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдХреНрдпреЛрдВ рд╣реИред
рдЙрд╕ case рдореЗрдВ, **FastAPI** рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП tools рднреА рджреЗрддрд╛ рд╣реИред
///
рдЬрдм рд╣рдо `OAuth2PasswordBearer` class рдХрд╛ instance рдмрдирд╛рддреЗ рд╣реИрдВ рддреЛ рд╣рдо `tokenUrl` parameter pass рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ parameter рдореЗрдВ рд╡рд╣ URL рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ client (user рдХреЗ browser рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ frontend) token рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП `username` рдФрд░ `password` рднреЗрдЬрдиреЗ рдореЗрдВ рдХрд░реЗрдЧрд╛ред
{* ../../docs_src/security/tutorial001_an_py310.py hl[8] *}
/// tip | рд╕реБрдЭрд╛рд╡
рдпрд╣рд╛рдБ `tokenUrl="token"` рдПрдХ relative URL `token` рдХреЛ refer рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЕрднреА рддрдХ рдмрдирд╛рдпрд╛ рдирд╣реАрдВ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ relative URL рд╣реИ, рдпрд╣ `./token` рдХреЗ equivalent рд╣реИред
рдХреНрдпреЛрдВрдХрд┐ рд╣рдо relative URL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЕрдЧрд░ рдЖрдкрдХрд╛ API `https://example.com/` рдкрд░ рд╕реНрдерд┐рдд рдерд╛, рддреЛ рдпрд╣ `https://example.com/token` рдХреЛ refer рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХрд╛ API `https://example.com/api/v1/` рдкрд░ рд╕реНрдерд┐рдд рдерд╛, рддреЛ рдпрд╣ `https://example.com/api/v1/token` рдХреЛ refer рдХрд░реЗрдЧрд╛ред
Relative URL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗ рдХрд┐ рдЖрдкрдХрд╛ application [Proxy рдХреЗ рдкреАрдЫреЗ](../../advanced/behind-a-proxy.md) рдЬреИрд╕реЗ advanced use case рдореЗрдВ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд░рд╣реЗред
///
рдпрд╣ parameter рдЙрд╕ endpoint / *path operation* рдХреЛ create рдирд╣реАрдВ рдХрд░рддрд╛, рдмрд▓реНрдХрд┐ declare рдХрд░рддрд╛ рд╣реИ рдХрд┐ URL `/token` рд╡рд╣реА рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ client рдХреЛ token рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ OpenAPI рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ interactive API documentation systems рдореЗрдВред
рд╣рдо рдЬрд▓реНрдж рд╣реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ path operation рднреА рдмрдирд╛рдПрдБрдЧреЗред
/// note | рдиреЛрдЯ
рдЕрдЧрд░ рдЖрдк рдмрд╣реБрдд strict "Pythonista" рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ parameter name `tokenUrl` рдХреА style `token_url` рдХреЗ рдмрдЬрд╛рдп рдкрд╕рдВрдж рди рдЖрдПред
рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ OpenAPI spec рдЬреИрд╕рд╛ рд╣реА name рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рддрд╛рдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреЛ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рднреА security scheme рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдЬрд╛рдБрдЪ рдХрд░рдиреА рд╣реЛ, рддреЛ рдЖрдк рдмрд╕ рдЗрд╕реЗ copy рдФрд░ paste рдХрд░рдХреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рдЦреЛрдЬ рд╕рдХреЗрдВред
///
`oauth2_scheme` variable `OAuth2PasswordBearer` рдХрд╛ instance рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ "callable" рднреА рд╣реИред
рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ call рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
```Python
oauth2_scheme(some, parameters)
```
рддреЛ, рдЗрд╕реЗ `Depends` рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
### рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ { #use-it }
рдЕрдм рдЖрдк рдЙрд╕ `oauth2_scheme` рдХреЛ `Depends` рдХреЗ рд╕рд╛рде dependency рдореЗрдВ pass рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
{* ../../docs_src/security/tutorial001_an_py310.py hl[12] *}
рдпрд╣ dependency рдПрдХ `str` рдкреНрд░рджрд╛рди рдХрд░реЗрдЧреА рдЬрд┐рд╕реЗ *path operation function* рдХреЗ parameter `token` рдХреЛ assign рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
**FastAPI** рдЬрд╛рди рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ OpenAPI schema (рдФрд░ automatic API docs) рдореЗрдВ "security scheme" define рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ dependency рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
/// note | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
**FastAPI** рдЬрд╛рди рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ OpenAPI рдореЗрдВ security scheme define рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `OAuth2PasswordBearer` class (рдЬреЛ dependency рдореЗрдВ declare рдХреА рдЧрдИ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ `fastapi.security.oauth2.OAuth2` рд╕реЗ inherit рдХрд░рддреА рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ `fastapi.security.base.SecurityBase` рд╕реЗ inherit рдХрд░рддреА рд╣реИред
OpenAPI (рдФрд░ automatic API docs) рдХреЗ рд╕рд╛рде integrate рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рднреА security utilities `SecurityBase` рд╕реЗ inherit рдХрд░рддреА рд╣реИрдВ, рдЗрд╕реА рддрд░рд╣ **FastAPI** рдЬрд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ OpenAPI рдореЗрдВ рдХреИрд╕реЗ integrate рдХрд░рдирд╛ рд╣реИред
///
## рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ { #what-it-does }
рдпрд╣ request рдореЗрдВ рдЙрд╕ `Authorization` header рдХреЛ рдЦреЛрдЬреЗрдЧрд╛, check рдХрд░реЗрдЧрд╛ рдХрд┐ value `Bearer ` plus рдХреЛрдИ token рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдФрд░ token рдХреЛ `str` рдХреЗ рд░реВрдк рдореЗрдВ return рдХрд░реЗрдЧрд╛ред
рдЕрдЧрд░ рдЗрд╕реЗ `Authorization` header рдирд╣реАрдВ рджрд┐рдЦрддрд╛, рдпрд╛ value рдореЗрдВ `Bearer ` token рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рд╕реАрдзреЗ 401 status code error (`UNAUTHORIZED`) рдХреЗ рд╕рд╛рде respond рдХрд░реЗрдЧрд╛ред
Error return рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣ рднреА check рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ token рдореМрдЬреВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЖрдк рдирд┐рд╢реНрдЪрд┐рдВрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреА function execute рд╣реЛрддреА рд╣реИ, рддреЛ рдЙрд╕ token рдореЗрдВ рдПрдХ `str` рд╣реЛрдЧрд╛ред
рдЖрдк рдЗрд╕реЗ рдЕрднреА interactive docs рдореЗрдВ рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ:
<img src="/img/tutorial/security/image03.png">
рд╣рдо рдЕрднреА token рдХреА validity verify рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╢реБрд░реБрдЖрдд рд╣реИред
## Recap { #recap }
рддреЛ, рдХреЗрд╡рд▓ 3 рдпрд╛ 4 рдЕрддрд┐рд░рд┐рдХреНрдд lines рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА security рдХрд╛ рдХреБрдЫ primitive form рд╣реИред

105
docs/hi/docs/tutorial/security/get-current-user.md

@ -0,0 +1,105 @@
# Current User рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ { #get-current-user }
рдкрд┐рдЫрд▓реЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ security system (рдЬреЛ dependency injection system рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ) *path operation function* рдХреЛ `str` рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ `token` рджреЗ рд░рд╣рд╛ рдерд╛:
{* ../../docs_src/security/tutorial001_an_py310.py hl[12] *}
рд▓реЗрдХрд┐рди рд╡рд╣ рдЕрднреА рднреА рдЗрддрдирд╛ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИред
рдЖрдЗрдП рдЗрд╕реЗ рд╣рдореЗрдВ current user рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рдмрдирд╛рддреЗ рд╣реИрдВред
## рдПрдХ user model рдмрдирд╛рдПрдБ { #create-a-user-model }
рдкрд╣рд▓реЗ, рдПрдХ Pydantic user model рдмрдирд╛рддреЗ рд╣реИрдВред
рдЬрд┐рд╕ рддрд░рд╣ рд╣рдо bodies declare рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Pydantic рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕реА рддрд░рд╣ рд╣рдо рдЗрд╕реЗ рдХрд╣реАрдВ рдФрд░ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/security/tutorial002_an_py310.py hl[5,12:16] *}
## рдПрдХ `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` рд╕реЗ `str` рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ `token` рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧреА:
{* ../../docs_src/security/tutorial002_an_py310.py hl[25] *}
## user рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ { #get-the-user }
`get_current_user` рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдПрдХ (fake) utility function рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧреА, рдЬреЛ token рдХреЛ `str` рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреА рд╣реИ рдФрд░ рд╣рдорд╛рд░рд╛ Pydantic `User` model рд▓реМрдЯрд╛рддреА рд╣реИ:
{* ../../docs_src/security/tutorial002_an_py310.py hl[19:22,26:27] *}
## current user inject рдХрд░реЗрдВ { #inject-the-current-user }
рддреЛ рдЕрдм рд╣рдо *path operation* рдореЗрдВ рдЕрдкрдиреЗ `get_current_user` рдХреЗ рд╕рд╛рде рд╡рд╣реА `Depends` рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/security/tutorial002_an_py310.py hl[31] *}
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо `current_user` рдХрд╛ type Pydantic model `User` рдХреЗ рд░реВрдк рдореЗрдВ declare рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ function рдХреЗ рдЕрдВрджрд░ completion рдФрд░ type checks рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛ред
/// tip | рдЯрд┐рдк
рдЖрдкрдХреЛ рдпрд╛рдж рд╣реЛрдЧрд╛ рдХрд┐ request bodies рднреА Pydantic models рдХреЗ рд╕рд╛рде declare рдХреА рдЬрд╛рддреА рд╣реИрдВред
рдпрд╣рд╛рдБ **FastAPI** confuse рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк `Depends` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
///
/// tip | рдЯрд┐рдк
рдЬрд┐рд╕ рддрд░рд╣ рдпрд╣ dependency system design рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд╣ рд╣рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ dependencies (рдЕрд▓рдЧ-рдЕрд▓рдЧ "dependables") рд░рдЦрдиреЗ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕рднреА рдПрдХ `User` model рд▓реМрдЯрд╛рддреА рд╣реИрдВред
рд╣рдо рдХреЗрд╡рд▓ рдПрдХ dependency рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рдЙрд╕ type рдХрд╛ data рд▓реМрдЯрд╛ рд╕рдХрддреА рд╣реИред
///
## рдЕрдиреНрдп models { #other-models }
рдЕрдм рдЖрдк *path operation functions* рдореЗрдВ рд╕реАрдзреЗ current user рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ `Depends` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ **Dependency Injection** рд╕реНрддрд░ рдкрд░ security mechanisms рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рдЖрдк security requirements рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА model рдпрд╛ data рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, Pydantic model `User`)ред
рд▓реЗрдХрд┐рди рдЖрдк рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ data model, class рдпрд╛ type рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВред
рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ model рдореЗрдВ `id` рдФрд░ `email` рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдИ `username` рдирд╣реАрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ? рдмрд┐рд▓реНрдХреБрд▓ред рдЖрдк рдЗрдиреНрд╣реАрдВ tools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ `str` рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдпрд╛ рдХреЗрд╡рд▓ рдПрдХ `dict`? рдпрд╛ рд╕реАрдзреЗ database class model instance? рд╕рдм рдХреБрдЫ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЕрд╕рд▓ рдореЗрдВ рдЖрдкрдХреЗ application рдореЗрдВ login рдХрд░рдиреЗ рд╡рд╛рд▓реЗ users рдирд╣реАрдВ рд╣реИрдВ, рдмрд▓реНрдХрд┐ robots, bots, рдпрд╛ рдЕрдиреНрдп systems рд╣реИрдВ, рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдмрд╕ рдПрдХ access token рд╣реИ? рдлрд┐рд░ рднреА, рд╕рдм рдХреБрдЫ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдмрд╕ рдЕрдкрдиреЗ application рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕ рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ model, рдЬрд┐рд╕ рднреА рдкреНрд░рдХрд╛рд░ рдХреА class, рдЬрд┐рд╕ рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ database рдЪрд╛рд╣рд┐рдП, рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред **FastAPI** dependency injection system рдХреЗ рд╕рд╛рде рдЖрдкрдХреА рдЬрд╝рд░реВрд░рддреЗрдВ рдкреВрд░реА рдХрд░рддрд╛ рд╣реИред
## Code size { #code-size }
рдпрд╣ example verbose рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рд╣рдо security, data models, utility functions рдФрд░ *path operations* рдХреЛ рдЙрд╕реА file рдореЗрдВ рдорд┐рд▓рд╛ рд░рд╣реЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдмрд╛рдд рд╣реИред
security рдФрд░ dependency injection рд╕реЗ рдЬреБрдбрд╝реА рдЪреАрдЬрд╝реЗрдВ рдПрдХ рдмрд╛рд░ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИрдВред
рдФрд░ рдЖрдк рдЗрд╕реЗ рдЬрд┐рддрдирд╛ рдЪрд╛рд╣реЗрдВ рдЙрддрдирд╛ complex рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рднреА, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░, рдПрдХ рд╣реА рдЬрдЧрд╣ рдкрд░, рдкреВрд░реА flexibility рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрд╕реА security system рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣рдЬрд╛рд░реЛрдВ endpoints (*path operations*) рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рд╡реЗ рд╕рднреА (рдпрд╛ рдЙрдирдХрд╛ рдХреЛрдИ рднреА рд╣рд┐рд╕реНрд╕рд╛ рдЬрд┐рд╕реЗ рдЖрдк рдЪрд╛рд╣реЗрдВ) рдЗрди dependencies рдпрд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп dependencies рдХреЛ рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рдпреЗ рд╕рднреА рд╣рдЬрд╛рд░реЛрдВ *path operations* рд╕рд┐рд░реНрдл 3 lines рдЬрд┐рддрдиреЗ рдЫреЛрдЯреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/security/tutorial002_an_py310.py hl[30:32] *}
## Recap { #recap }
рдЕрдм рдЖрдк рдЕрдкрдиреЗ *path operation function* рдореЗрдВ рд╕реАрдзреЗ current user рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдЖрдзреЗ рд░рд╛рд╕реНрддреЗ рддрдХ рдкрд╣реБрдБрдЪ рдЪреБрдХреЗ рд╣реИрдВред
рд╣рдореЗрдВ рдмрд╕ user/client рдХреЗ рд▓рд┐рдП рдПрдХ *path operation* рдЬреЛрдбрд╝рдирд╛ рд╣реИ рддрд╛рдХрд┐ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ `username` рдФрд░ `password` рднреЗрдЬ рд╕рдХреЗред
рд╡рд╣ рдЖрдЧреЗ рдЖрддрд╛ рд╣реИред

105
docs/hi/docs/tutorial/security/index.md

@ -0,0 +1,105 @@
# Security { #security }
security, authentication рдФрд░ authorization рдХреЛ handle рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред
рдФрд░ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдПрдХ рдЬрдЯрд┐рд▓ рдФрд░ "рдХрдард┐рди" рд╡рд┐рд╖рдп рд╣реЛрддрд╛ рд╣реИред
рдХрдИ frameworks рдФрд░ systems рдореЗрдВ рдХреЗрд╡рд▓ security рдФрд░ authentication рдХреЛ handle рдХрд░рдиреЗ рдореЗрдВ рд╣реА рдмрд╣реБрдд рдЕрдзрд┐рдХ effort рдФрд░ code рд▓рдЧ рдЬрд╛рддрд╛ рд╣реИ (рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рд▓рд┐рдЦреЗ рдЧрдП рдкреВрд░реЗ code рдХрд╛ 50% рдпрд╛ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред
**FastAPI** рдЖрдкрдХреЛ **Security** рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ, рддреЗрдЬрд╝реА рд╕реЗ, standard рддрд░реАрдХреЗ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ tools рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдмрд┐рдирд╛ рд╕рднреА security specifications рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд╕реАрдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдХреЗред
рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдЖрдЗрдП рдХреБрдЫ рдЫреЛрдЯреЗ concepts рджреЗрдЦрддреЗ рд╣реИрдВред
## рдЬрд▓реНрджреА рдореЗрдВ рд╣реИрдВ? { #in-a-hurry }
рдЕрдЧрд░ рдЖрдкрдХреЛ рдЗрди terms рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдмрд╕ username рдФрд░ password рдкрд░ рдЖрдзрд╛рд░рд┐рдд authentication рдХреЗ рд╕рд╛рде security *рдЕрднреА* рдЬреЛрдбрд╝рдиреА рд╣реИ, рддреЛ рдЕрдЧрд▓реЗ chapters рдкрд░ рдЬрд╛рдПрдБред
## OAuth2 { #oauth2 }
OAuth2 рдПрдХ specification рд╣реИ рдЬреЛ authentication рдФрд░ authorization рдХреЛ handle рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ define рдХрд░рддреА рд╣реИред
рдпрд╣ рдХрд╛рдлрд╝реА рд╡рд┐рд╕реНрддреГрдд specification рд╣реИ рдФрд░ рдХрдИ рдЬрдЯрд┐рд▓ use cases рдХреЛ cover рдХрд░рддреА рд╣реИред
рдЗрд╕рдореЗрдВ "third party" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ authenticate рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдпрд╣реА рдЪреАрдЬрд╝ рдЕрдВрджрд░ рд╕реЗ рдЙрди рд╕рднреА systems рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрддреА рд╣реИ рдЬрд┐рдирдореЗрдВ "login with Facebook, Google, X (Twitter), GitHub" рд╣реЛрддрд╛ рд╣реИред
### OAuth 1 { #oauth-1 }
OAuth 1 рднреА рдерд╛, рдЬреЛ OAuth2 рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ communication рдХреЛ encrypt рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ direct specifications рд╢рд╛рдорд┐рд▓ рдереАрдВред
рдЖрдЬрдХрд▓ рдпрд╣ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рдпрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдореЗрдВ рдирд╣реАрдВ рд╣реИред
OAuth2 рдпрд╣ specify рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ communication рдХреЛ рдХреИрд╕реЗ encrypt рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА application HTTPS рдХреЗ рд╕рд╛рде serve рдХреА рдЬрд╛ рд░рд╣реА рд╣реЛред
/// tip | рд╕реБрдЭрд╛рд╡
**deployment** рд╡рд╛рд▓реЗ section рдореЗрдВ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ Traefik рдФрд░ Let's Encrypt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ HTTPS рдХреЛ рдореБрдлреНрдд рдореЗрдВ рдХреИрд╕реЗ setup рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
///
## OpenID Connect { #openid-connect }
OpenID Connect рдПрдХ рдФрд░ specification рд╣реИ, рдЬреЛ **OAuth2** рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред
рдпрд╣ OAuth2 рдХреЛ рдмрд╕ extend рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдРрд╕реА рдЪреАрдЬрд╝реЗрдВ specify рдХрд░рддрд╛ рд╣реИ рдЬреЛ OAuth2 рдореЗрдВ рддреБрд▓рдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ ambiguous рд╣реИрдВ, рддрд╛рдХрд┐ рдЗрд╕реЗ рдЕрдзрд┐рдХ interoperable рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Google login OpenID Connect рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рдЕрдВрджрд░ рд╕реЗ OAuth2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)ред
рд▓реЗрдХрд┐рди Facebook login OpenID Connect рдХреЛ support рдирд╣реАрдВ рдХрд░рддрд╛ред рдЙрд╕рдХрд╛ рдЕрдкрдирд╛ OAuth2 flavor рд╣реИред
### OpenID ("OpenID Connect" рдирд╣реАрдВ) { #openid-not-openid-connect }
рдПрдХ "OpenID" specification рднреА рдереАред рдЙрд╕рдиреЗ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬреЛ **OpenID Connect** рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╣ OAuth2 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдереАред
рдЗрд╕рд▓рд┐рдП, рд╡рд╣ рдПрдХ рдкреВрд░рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд system рдерд╛ред
рдЖрдЬрдХрд▓ рдпрд╣ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рдпрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдореЗрдВ рдирд╣реАрдВ рд╣реИред
## OpenAPI { #openapi }
OpenAPI (рдкрд╣рд▓реЗ Swagger рдХреЗ рдирд╛рдо рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛) APIs рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП open specification рд╣реИ (рдЕрдм Linux Foundation рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛)ред
**FastAPI** **OpenAPI** рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред
рдЗрд╕реА рд╡рдЬрд╣ рд╕реЗ рдХрдИ automatic interactive documentation interfaces, code generation, рдЖрджрд┐ рд╣реЛрдирд╛ рд╕рдВрднрд╡ рд╣реЛрддрд╛ рд╣реИред
OpenAPI рдХрдИ security "schemes" define рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджреЗрддрд╛ рд╣реИред
рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЗрди рд╕рднреА standard-based tools рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рдпреЗ interactive documentation systems рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
OpenAPI рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд security schemes define рдХрд░рддрд╛ рд╣реИ:
* `apiKey`: рдПрдХ application-specific key рдЬреЛ рдпрд╣рд╛рдБ рд╕реЗ рдЖ рд╕рдХрддреА рд╣реИ:
* рдПрдХ query parameter.
* рдПрдХ header.
* рдПрдХ cookie.
* `http`: standard HTTP authentication systems, рдЬрд┐рдирдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
* `bearer`: рдПрдХ header `Authorization` рдЬрд┐рд╕рдореЗрдВ `Bearer ` plus рдПрдХ token рдХрд╛ value рд╣реЛрддрд╛ рд╣реИред рдпрд╣ OAuth2 рд╕реЗ inherited рд╣реИред
* HTTP Basic authentication.
* HTTP Digest, рдЖрджрд┐ред
* `oauth2`: security handle рдХрд░рдиреЗ рдХреЗ рд╕рднреА OAuth2 рддрд░реАрдХреЗ (рдЬрд┐рдиреНрд╣реЗрдВ "flows" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
* рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ flows OAuth 2.0 authentication provider рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ (рдЬреИрд╕реЗ Google, Facebook, X (Twitter), GitHub, рдЖрджрд┐):
* `implicit`
* `clientCredentials`
* `authorizationCode`
* рд▓реЗрдХрд┐рди рдПрдХ specific "flow" рд╣реИ рдЬрд┐рд╕реЗ рдЙрд╕реА application рдореЗрдВ рд╕реАрдзреЗ authentication handle рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
* `password`: рдХреБрдЫ рдЕрдЧрд▓реЗ chapters рдЗрд╕рдХреЗ examples cover рдХрд░реЗрдВрдЧреЗред
* `openIdConnect`: рдЗрд╕рдореЗрдВ OAuth2 authentication data рдХреЛ automatically discover рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реЛрддрд╛ рд╣реИред
* рдпрд╣ automatic discovery рд╡рд╣реА рд╣реИ рдЬреЛ OpenID Connect specification рдореЗрдВ define рдХреА рдЧрдИ рд╣реИред
/// tip | рд╕реБрдЭрд╛рд╡
Google, Facebook, X (Twitter), GitHub, рдЖрджрд┐ рдЬреИрд╕реЗ рдЕрдиреНрдп authentication/authorization providers рдХреЛ integrate рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рдФрд░ рддреБрд▓рдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЖрд╕рд╛рди рд╣реИред
рд╕рдмрд╕реЗ рдЬрдЯрд┐рд▓ рд╕рдорд╕реНрдпрд╛ рдЙрди рдЬреИрд╕реЗ authentication/authorization provider рдмрдирд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди **FastAPI** рдЖрдкрдХреЛ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП tools рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЗ рд▓рд┐рдП heavy lifting рдХрд░рддрд╛ рд╣реИред
///
## **FastAPI** utilities { #fastapi-utilities }
FastAPI рдЗрди security schemes рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП `fastapi.security` module рдореЗрдВ рдХрдИ tools рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрди security mechanisms рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВред
рдЕрдЧрд▓реЗ chapters рдореЗрдВ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ **FastAPI** рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЙрди tools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА API рдореЗрдВ security рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВред
рдФрд░ рдЖрдк рдпрд╣ рднреА рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ interactive documentation system рдореЗрдВ automatically рдХреИрд╕реЗ integrate рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

277
docs/hi/docs/tutorial/security/oauth2-jwt.md

@ -0,0 +1,277 @@
# Password рдХреЗ рд╕рд╛рде OAuth2 (рдФрд░ hashing), JWT tokens рдХреЗ рд╕рд╛рде Bearer { #oauth2-with-password-and-hashing-bearer-with-jwt-tokens }
рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░рд╛ security flow рд╣реИ, рддреЛ рдЖрдЗрдП <abbr title="JSON Web Tokens - JSON рд╡реЗрдм рдЯреЛрдХрди">JWT</abbr> tokens рдФрд░ secure password hashing рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ application рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ secure рдмрдирд╛рддреЗ рд╣реИрдВред
рдпрд╣ code рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЕрдкрдиреА application рдореЗрдВ рд╕рдЪ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, password hashes рдХреЛ рдЕрдкрдиреЗ database рдореЗрдВ save рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрджрд┐ред
рд╣рдо рдкрд┐рдЫрд▓реЗ chapter рдореЗрдВ рдЬрд╣рд╛рдБ рдЫреЛрдбрд╝рд╛ рдерд╛, рд╡рд╣реАрдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рдПрдБрдЧреЗред
## JWT рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ { #about-jwt }
JWT рдХрд╛ рдорддрд▓рдм рд╣реИ "JSON Web Tokens"ред
рдпрд╣ рдПрдХ JSON object рдХреЛ рдмрд┐рдирд╛ spaces рд╡рд╛рд▓реА рд▓рдВрдмреА dense string рдореЗрдВ codify рдХрд░рдиреЗ рдХрд╛ standard рд╣реИред рдпрд╣ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
```
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
```
рдпрд╣ encrypted рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рднреА contents рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рд╡рд╛рдкрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдпрд╣ signed рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЖрдкрдХреЛ рдХреЛрдИ token рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ issue рдХрд┐рдпрд╛ рдерд╛, рддреЛ рдЖрдк verify рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрд╕реЗ рдЖрдкрдиреЗ рд╣реА issue рдХрд┐рдпрд╛ рдерд╛ред
рдЗрд╕ рддрд░рд╣, рдЖрдк рдПрдХ token рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА expiration, рдорд╛рди рд▓реАрдЬрд┐рдП, 1 week рд╣реЛред рдФрд░ рдлрд┐рд░ рдЬрдм user рдЕрдЧрд▓реЗ рджрд┐рди token рдХреЗ рд╕рд╛рде рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ user рдЕрднреА рднреА рдЖрдкрдХреЗ system рдореЗрдВ logged in рд╣реИред
рдПрдХ week рдХреЗ рдмрд╛рдж, token expired рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ user authorized рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдирдпрд╛ token рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реЗ рдлрд┐рд░ рд╕реЗ sign in рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЕрдЧрд░ user (рдпрд╛ рдХреЛрдИ third party) expiration рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП token рдХреЛ modify рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗ, рддреЛ рдЖрдк рдЗрд╕реЗ рдкрддрд╛ рд▓рдЧрд╛ рдкрд╛рдПрдБрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ signatures match рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред
рдЕрдЧрд░ рдЖрдк JWT tokens рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ [https://jwt.io](https://jwt.io/) рджреЗрдЦреЗрдВред
## `PyJWT` install рдХрд░реЗрдВ { #install-pyjwt }
Python рдореЗрдВ JWT tokens generate рдФрд░ verify рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ `PyJWT` install рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдПрдХ [virtual environment](../../virtual-environments.md) рдмрдирд╛рдПрдБ, рдЙрд╕реЗ activate рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ `pyjwt` install рдХрд░реЗрдВ:
<div class="termy">
```console
$ pip install pyjwt
---> 100%
```
</div>
/// note | рдиреЛрдЯ
рдЕрдЧрд░ рдЖрдк 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" рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐рд╕реА content (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ password) рдХреЛ bytes рдХреЗ sequence (рдмрд╕ рдПрдХ string) рдореЗрдВ рдмрджрд▓рдирд╛, рдЬреЛ рдмреЗрдХрд╛рд░/рдЕрд╕рдордЭ text рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
рдЬрдм рднреА рдЖрдк рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА content (рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА password) pass рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА gibberish рдорд┐рд▓рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЖрдк рдЙрд╕ gibberish рд╕реЗ рд╡рд╛рдкрд╕ password рдореЗрдВ convert рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
### Password hashing рдХреНрдпреЛрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ { #why-use-password-hashing }
рдЕрдЧрд░ рдЖрдкрдХрд╛ database рдЪреЛрд░реА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЪреЛрд░ рдХреЗ рдкрд╛рд╕ рдЖрдкрдХреЗ users рдХреЗ plaintext passwords рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рдХреЗрд╡рд▓ hashes рд╣реЛрдВрдЧреЗред
рдЗрд╕рд▓рд┐рдП, рдЪреЛрд░ рдЙрд╕ password рдХреЛ рдХрд┐рд╕реА рджреВрд╕рд░реЗ system рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ рдХрдИ users рд╣рд░ рдЬрдЧрд╣ рд╡рд╣реА password рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдЦрддрд░рдирд╛рдХ рд╣реЛрдЧрд╛)ред
## `pwdlib` install рдХрд░реЗрдВ { #install-pwdlib }
pwdlib password hashes рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдирджрд╛рд░ Python package рд╣реИред
рдпрд╣ рдХрдИ secure hashing algorithms рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП utilities support рдХрд░рддрд╛ рд╣реИред
Recommended algorithm "Argon2" рд╣реИред
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдПрдХ [virtual environment](../../virtual-environments.md) рдмрдирд╛рдПрдБ, рдЙрд╕реЗ activate рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ Argon2 рдХреЗ рд╕рд╛рде pwdlib install рдХрд░реЗрдВ:
<div class="termy">
```console
$ pip install "pwdlib[argon2]"
---> 100%
```
</div>
/// tip | рд╕реБрдЭрд╛рд╡
`pwdlib` рдХреЗ рд╕рд╛рде, рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ configure рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ **Django**, **Flask** security plug-in рдпрд╛ рдХрдИ рдЕрдиреНрдп рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП passwords read рдХрд░ рд╕рдХреЗред
рддреЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ database рдореЗрдВ Django application рдХрд╛ рд╡рд╣реА data FastAPI application рдХреЗ рд╕рд╛рде share рдХрд░ рдкрд╛рдПрдБрдЧреЗред рдпрд╛ рдЙрд╕реА database рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдзреАрд░реЗ-рдзреАрд░реЗ Django application рдХреЛ migrate рдХрд░ рдкрд╛рдПрдБрдЧреЗред
рдФрд░ рдЖрдкрдХреЗ users рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЖрдкрдХреА Django app рдпрд╛ рдЖрдкрдХреА **FastAPI** app рд╕реЗ login рдХрд░ рдкрд╛рдПрдБрдЧреЗред
///
## Passwords рдХреЛ hash рдФрд░ verify рдХрд░реЗрдВ { #hash-and-verify-the-passwords }
`pwdlib` рд╕реЗ рд╡реЗ tools import рдХрд░реЗрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИред
Recommended settings рдХреЗ рд╕рд╛рде рдПрдХ PasswordHash instance рдмрдирд╛рдПрдБ - рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ passwords рдХреЛ hash рдФрд░ verify рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
/// tip | рд╕реБрдЭрд╛рд╡
pwdlib bcrypt hashing algorithm рдХреЛ рднреА support рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди legacy algorithms рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ - outdated hashes рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП passlib library рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ recommended рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рджреВрд╕рд░реЗ system (рдЬреИрд╕реЗ Django) рджреНрд╡рд╛рд░рд╛ generate рдХрд┐рдП рдЧрдП passwords read рдФрд░ verify рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдирдП passwords рдХреЛ Argon2 рдпрд╛ Bcrypt рдЬреИрд╕реЗ рдЕрд▓рдЧ algorithm рд╕реЗ hash рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЙрди рд╕рднреА рдХреЗ рд╕рд╛рде compatible рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВред
///
User рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ password рдХреЛ hash рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ utility function рдмрдирд╛рдПрдБред
рдФрд░ рдПрдХ рдФрд░ utility рдмрдирд╛рдПрдБ рдЬреЛ verify рдХрд░реЗ рдХрд┐ received password stored hash рд╕реЗ match рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдФрд░ рдПрдХ рдФрд░ utility рдмрдирд╛рдПрдБ рдЬреЛ authenticate рдХрд░реЗ рдФрд░ user return рдХрд░реЗред
{* ../../docs_src/security/tutorial004_an_py310.py hl[8,49,51,58:59,62:63,72:79] *}
рдЬрдм `authenticate_user` рдХреЛ рдРрд╕реЗ username рдХреЗ рд╕рд╛рде call рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ database рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рддрдм рднреА рд╣рдо dummy hash рдХреЗ against `verify_password` рдЪрд▓рд╛рддреЗ рд╣реИрдВред
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ username valid рд╣реЛ рдпрд╛ рди рд╣реЛ, endpoint response рджреЗрдиреЗ рдореЗрдВ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╕рдордп рд▓реЗ, рдЬрд┐рд╕рд╕реЗ **timing attacks** рд░реЛрдХреЗ рдЬрд╛ рд╕рдХреЗрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдореМрдЬреВрджрд╛ usernames enumerate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
/// note | рдиреЛрдЯ
рдЕрдЧрд░ рдЖрдк рдирдП (fake) database `fake_users_db` рдХреЛ check рдХрд░реЗрдВрдЧреЗ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ hashed password рдЕрдм рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ: `"$argon2id$v=19$m=65536,t=3,p=4$wagCPXjifgvUFBzq4hqe3w$CYaIb8sB+wtD+Vu/P4uod1+Qof8h+1g7bbDlBID48Rc"`ред
///
## JWT tokens рд╕рдВрднрд╛рд▓реЗрдВ { #handle-jwt-tokens }
Installed modules import рдХрд░реЗрдВред
рдПрдХ random secret key рдмрдирд╛рдПрдБ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ JWT tokens sign рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
Secure random secret key generate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП command рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
<div class="termy">
```console
$ openssl rand -hex 32
09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7
```
</div>
рдФрд░ output рдХреЛ variable `SECRET_KEY` рдореЗрдВ copy рдХрд░реЗрдВ (example рд╡рд╛рд▓рд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ)ред
JWT token sign рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП algorithm рдХреЗ рд╕рд╛рде рдПрдХ variable `ALGORITHM` рдмрдирд╛рдПрдБ рдФрд░ рдЗрд╕реЗ `"HS256"` рдкрд░ set рдХрд░реЗрдВред
Token рдХреА expiration рдХреЗ рд▓рд┐рдП рдПрдХ variable рдмрдирд╛рдПрдБред
рдПрдХ Pydantic Model define рдХрд░реЗрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ response рдХреЗ рд▓рд┐рдП token endpoint рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдирдпрд╛ access token generate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ utility function рдмрдирд╛рдПрдБред
{* ../../docs_src/security/tutorial004_an_py310.py hl[4,7,13:15,29:31,82:90] *}
## Dependencies update рдХрд░реЗрдВ { #update-the-dependencies }
`get_current_user` рдХреЛ update рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╡рд╣ рдкрд╣рд▓реЗ рдЬреИрд╕рд╛ рд╣реА token receive рдХрд░реЗ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ JWT tokens рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред
Received token рдХреЛ decode рдХрд░реЗрдВ, verify рдХрд░реЗрдВ, рдФрд░ current user return рдХрд░реЗрдВред
рдЕрдЧрд░ token invalid рд╣реИ, рддреЛ рддреБрд░рдВрдд HTTP error return рдХрд░реЗрдВред
{* ../../docs_src/security/tutorial004_an_py310.py hl[93:110] *}
## `/token` *path operation* update рдХрд░реЗрдВ { #update-the-token-path-operation }
Token рдХреА expiration time рдХреЗ рд╕рд╛рде рдПрдХ `timedelta` рдмрдирд╛рдПрдБред
рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ JWT access token рдмрдирд╛рдПрдБ рдФрд░ рдЙрд╕реЗ return рдХрд░реЗрдВред
{* ../../docs_src/security/tutorial004_an_py310.py hl[121:136] *}
### JWT "subject" `sub` рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ technical details { #technical-details-about-the-jwt-subject-sub }
JWT specification рдХрд╣рддрд╛ рд╣реИ рдХрд┐ token рдХреЗ subject рдХреЗ рд╕рд╛рде рдПрдХ key `sub` рд╣реЛрддреА рд╣реИред
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ optional рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣реА рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдЖрдк user рдХреА identification рд░рдЦреЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдпрд╣рд╛рдБ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
JWT рдХрд╛ рдЙрдкрдпреЛрдЧ user рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЖрдкрдХреА API рдкрд░ рд╕реАрдзреЗ operations perform рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ "car" рдпрд╛ рдПрдХ "blog post" рдХреА рдкрд╣рдЪрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдлрд┐рд░ рдЖрдк рдЙрд╕ entity рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ permissions рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ "drive" (car рдХреЗ рд▓рд┐рдП) рдпрд╛ "edit" (blog рдХреЗ рд▓рд┐рдП)ред
рдФрд░ рдлрд┐рд░, рдЖрдк рд╡рд╣ JWT token рдХрд┐рд╕реА user (рдпрд╛ bot) рдХреЛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рдЙрди actions рдХреЛ perform рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (car drive рдХрд░рдирд╛, рдпрд╛ blog post edit рдХрд░рдирд╛), рдмрд┐рдирд╛ account рдХреА рдЬрд╝рд░реВрд░рдд рдХреЗ, рдХреЗрд╡рд▓ рдЙрд╕ JWT token рдХреЗ рд╕рд╛рде рдЬрд┐рд╕реЗ рдЖрдкрдХреА API рдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП generate рдХрд┐рдпрд╛ рд╣реИред
рдЗрди ideas рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, JWT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣реАрдВ рдЕрдзрд┐рдХ sophisticated scenarios рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрди cases рдореЗрдВ, рдЙрди entities рдореЗрдВ рд╕реЗ рдХрдИ рдХреА same ID рд╣реЛ рд╕рдХрддреА рд╣реИ, рдорд╛рди рд▓реАрдЬрд┐рдП `foo` (рдПрдХ user `foo`, рдПрдХ car `foo`, рдФрд░ рдПрдХ blog post `foo`)ред
рдЗрд╕рд▓рд┐рдП, ID collisions рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, user рдХреЗ рд▓рд┐рдП JWT token рдмрдирд╛рддреЗ рд╕рдордп, рдЖрдк `sub` key рдХреЗ value рдХреЗ рдЖрдЧреЗ prefix рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ `username:`ред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ example рдореЗрдВ, `sub` рдХрд╛ value рд╣реЛ рд╕рдХрддрд╛ рдерд╛: `username:johndoe`ред
рдзреНрдпрд╛рди рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ `sub` key рдХреЗ рдкрд╛рд╕ рдкреВрд░реА application рдореЗрдВ unique identifier рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрд╣ рдПрдХ string рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
## рдЗрд╕реЗ check рдХрд░реЗрдВ { #check-it }
Server run рдХрд░реЗрдВ рдФрд░ docs рдкрд░ рдЬрд╛рдПрдБ: [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)ред
рдЖрдк user interface рдРрд╕рд╛ рджреЗрдЦреЗрдВрдЧреЗ:
<img src="/img/tutorial/security/image07.png">
Application рдХреЛ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд╣реА authorize рдХрд░реЗрдВред
Credentials рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП:
Username: `johndoe`
Password: `secret`
/// tip | рд╕реБрдЭрд╛рд╡
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ code рдореЗрдВ рдХрд╣реАрдВ рднреА plaintext password "`secret`" рдирд╣реАрдВ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ hashed version рд╣реИред
///
<img src="/img/tutorial/security/image08.png">
Endpoint `/users/me/` call рдХрд░реЗрдВ, рдЖрдкрдХреЛ response рдЗрд╕ рддрд░рд╣ рдорд┐рд▓реЗрдЧрд╛:
```JSON
{
"username": "johndoe",
"email": "[email protected]",
"full_name": "John Doe",
"disabled": false
}
```
<img src="/img/tutorial/security/image09.png">
рдЕрдЧрд░ рдЖрдк developer tools рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рднреЗрдЬреЗ рдЧрдП data рдореЗрдВ рдХреЗрд╡рд▓ token рд╢рд╛рдорд┐рд▓ рд╣реИ, password рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ request рдореЗрдВ user рдХреЛ authenticate рдХрд░рдиреЗ рдФрд░ рд╡рд╣ access token рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдмрд╛рдж рдирд╣реАрдВ:
<img src="/img/tutorial/security/image10.png">
/// note | рдиреЛрдЯ
`Authorization` header рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, рдЬрд┐рд╕рдХрд╛ value `Bearer ` рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
///
## `scopes` рдХреЗ рд╕рд╛рде advanced рдЙрдкрдпреЛрдЧ { #advanced-usage-with-scopes }
OAuth2 рдореЗрдВ "scopes" рдХреА рдзрд╛рд░рдгрд╛ рд╣реИред
рдЖрдк рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ JWT token рдореЗрдВ permissions рдХрд╛ specific set рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдлрд┐рд░ рдЖрдк рдпрд╣ token рд╕реАрдзреЗ рдХрд┐рд╕реА user рдпрд╛ third party рдХреЛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд╡реЗ restrictions рдХреЗ set рдХреЗ рд╕рд╛рде рдЖрдкрдХреА API рд╕реЗ interact рдХрд░ рд╕рдХреЗрдВред
рдЖрдк рдмрд╛рдж рдореЗрдВ **Advanced User Guide** рдореЗрдВ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рд╡реЗ **FastAPI** рдореЗрдВ рдХреИрд╕реЗ integrated рд╣реИрдВред
## Recap { #recap }
рдЕрдм рддрдХ рдЖрдкрдиреЗ рдЬреЛ рджреЗрдЦрд╛ рд╣реИ, рдЙрд╕рд╕реЗ рдЖрдк OAuth2 рдФрд░ JWT рдЬреИрд╕реЗ standards рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ secure **FastAPI** application setup рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА framework рдореЗрдВ security рд╕рдВрднрд╛рд▓рдирд╛ рдХрд╛рдлрд╝реА рдЬрд▓реНрджреА рдПрдХ рдЬрдЯрд┐рд▓ рд╡рд┐рд╖рдп рдмрди рдЬрд╛рддрд╛ рд╣реИред
рдХрдИ packages рдЬреЛ рдЗрд╕реЗ рдмрд╣реБрдд рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ data model, database, рдФрд░ available features рдХреЗ рд╕рд╛рде рдХрдИ compromises рдХрд░рдиреЗ рдкрдбрд╝рддреЗ рд╣реИрдВред рдФрд░ рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ packages рдЬреЛ рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рд░рд▓ рдмрдирд╛ рджреЗрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рдЕрдВрджрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ security flaws рд╣реЛрддреЗ рд╣реИрдВред
---
**FastAPI** рдХрд┐рд╕реА рднреА database, data model рдпрд╛ tool рдХреЗ рд╕рд╛рде рдХреЛрдИ compromise рдирд╣реАрдВ рдХрд░рддрд╛ред
рдпрд╣ рдЖрдкрдХреЛ рдЙрди рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдХреА рдкреВрд░реА flexibility рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ project рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╣реЛрдВред
рдФрд░ рдЖрдк рд╕реАрдзреЗ рдХрдИ well maintained рдФрд░ widely used packages рдЬреИрд╕реЗ `pwdlib` рдФрд░ `PyJWT` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ **FastAPI** external packages integrate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА complex mechanism рдХреА рдорд╛рдВрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ред
рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХреЛ process рдХреЛ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП tools рджреЗрддрд╛ рд╣реИ, рдмрд┐рдирд╛ flexibility, robustness, рдпрд╛ security рд╕реЗ compromise рдХрд┐рдПред
рдФрд░ рдЖрдк OAuth2 рдЬреИрд╕реЗ secure, standard protocols рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд simple рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдФрд░ implement рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк **Advanced User Guide** рдореЗрдВ рдФрд░ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдзрд┐рдХ fine-grained permission system рдХреЗ рд▓рд┐рдП OAuth2 "scopes" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдЗрдиреНрд╣реАрдВ standards рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдПред Scopes рдХреЗ рд╕рд╛рде OAuth2 рд╡рд╣ mechanism рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдмрдбрд╝реЗ authentication providers, рдЬреИрд╕реЗ Facebook, Google, GitHub, Microsoft, X (Twitter), рдЖрджрд┐ рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ third party applications рдХреЛ рдЕрдкрдиреЗ users рдХреА рдУрд░ рд╕реЗ рдЙрдирдХреА APIs рдХреЗ рд╕рд╛рде interact рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП authorize рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
LoadingтАж
Cancel
Save