Co-authored-by: pr-submit[bot] <pr-submit[bot]@users.noreply.github.com> Co-authored-by: Yurii Motov <109919500+YuriiMotov@users.noreply.github.com> Co-authored-by: pr-push[bot] <pr-push[bot]@users.noreply.github.com>
14 KiB
Path Parameters
рдЖрдк Python format strings рджреНрд╡рд╛рд░рд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд╛рди syntax рдХреЗ рд╕рд╛рде path "parameters" рдпрд╛ "variables" declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/path_params/tutorial001_py310.py hl[6:7] *}
path parameter item_id рдХреА value рдЖрдкрдХреЗ function рдХреЛ argument item_id рдХреЗ рд░реВрдк рдореЗрдВ pass рдХреА рдЬрд╛рдПрдЧреАред
рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд░ рдЖрдк рдпрд╣ example run рдХрд░рддреЗ рд╣реИрдВ рдФрд░ http://127.0.0.1:8000/items/foo рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдРрд╕рд╛ response рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
{"item_id":"foo"}
Types рдХреЗ рд╕рд╛рде Path parameters
рдЖрдк standard Python type annotations рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ function рдореЗрдВ рдХрд┐рд╕реА path parameter рдХрд╛ type declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/path_params/tutorial002_py310.py hl[7] *}
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, item_id рдХреЛ int declare рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
/// tip | рд╕реБрдЭрд╛рд╡
рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рдЕрдкрдиреЗ function рдХреЗ рдЕрдВрджрд░ editor support рдорд┐рд▓реЗрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ error checks, completion рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
///
Data conversion
рдЕрдЧрд░ рдЖрдк рдпрд╣ example run рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ browser рдореЗрдВ http://127.0.0.1:8000/items/3 рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдРрд╕рд╛ response рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
{"item_id":3}
/// tip | рд╕реБрдЭрд╛рд╡
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдкрдХреЗ function рдиреЗ рдЬреЛ value рдкреНрд░рд╛рдкреНрдд рдХреА (рдФрд░ return рдХреА) рд╡рд╣ 3 рд╣реИ, Python int рдХреЗ рд░реВрдк рдореЗрдВ, рди рдХрд┐ string "3"ред
рддреЛ, рдЙрд╕ type declaration рдХреЗ рд╕рд╛рде, FastAPI рдЖрдкрдХреЛ automatic request "parsing" рджреЗрддрд╛ рд╣реИред
///
Data validation
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк browser рдореЗрдВ http://127.0.0.1:8000/items/foo рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдРрд╕рд╛ рдЕрдЪреНрдЫрд╛ HTTP error рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
{
"detail": [
{
"type": "int_parsing",
"loc": [
"path",
"item_id"
],
"msg": "Input should be a valid integer, unable to parse string as an integer",
"input": "foo"
}
]
}
рдХреНрдпреЛрдВрдХрд┐ path parameter item_id рдХреА value "foo" рдереА, рдЬреЛ рдХрд┐ int рдирд╣реАрдВ рд╣реИред
рдЕрдЧрд░ рдЖрдкрдиреЗ int рдХреЗ рдмрдЬрд╛рдп float рджрд┐рдпрд╛, рддреЛ рднреА рд╡рд╣реА error рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдЬреИрд╕реЗ: http://127.0.0.1:8000/items/4.2
/// tip | рд╕реБрдЭрд╛рд╡
рддреЛ, рдЙрд╕реА Python type declaration рдХреЗ рд╕рд╛рде, FastAPI рдЖрдкрдХреЛ data validation рджреЗрддрд╛ рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ error рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ validation рдХрд┐рд╕ рдЬрдЧрд╣ pass рдирд╣реАрдВ рд╣реБрдЖред
рдпрд╣ рдЖрдкрдХреЗ API рдХреЗ рд╕рд╛рде interact рдХрд░рдиреЗ рд╡рд╛рд▓реЗ code рдХреЛ develop рдФрд░ debug рдХрд░рддреЗ рд╕рдордп рдмреЗрд╣рдж рдорджрджрдЧрд╛рд░ рд╣реЛрддрд╛ рд╣реИред
///
Documentation
рдФрд░ рдЬрдм рдЖрдк рдЕрдкрдиреЗ browser рдореЗрдВ http://127.0.0.1:8000/docs рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдРрд╕рд╛ automatic, interactive, API documentation рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
/// tip | рд╕реБрдЭрд╛рд╡
рдлрд┐рд░ рд╕реЗ, рдмрд╕ рдЙрд╕реА Python type declaration рдХреЗ рд╕рд╛рде, FastAPI рдЖрдкрдХреЛ automatic, interactive documentation рджреЗрддрд╛ рд╣реИ (Swagger UI рдХреЛ integrate рдХрд░рддреЗ рд╣реБрдП)ред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ path parameter рдХреЛ integer рдХреЗ рд░реВрдк рдореЗрдВ declare рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
///
Standard-рдЖрдзрд╛рд░рд┐рдд рд▓рд╛рдн, рд╡реИрдХрд▓реНрдкрд┐рдХ documentation
рдФрд░ рдХреНрдпреЛрдВрдХрд┐ generate рдХрд┐рдпрд╛ рдЧрдпрд╛ schema OpenAPI standard рд╕реЗ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрдИ compatible tools рд╣реИрдВред
рдЗрд╕реА рд╡рдЬрд╣ рд╕реЗ, FastAPI рд╕реНрд╡рдпрдВ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ API documentation рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (ReDoc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП), рдЬрд┐рд╕реЗ рдЖрдк http://127.0.0.1:8000/redoc рдкрд░ access рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдЗрд╕реА рддрд░рд╣, рдХрдИ compatible tools рд╣реИрдВред рдЗрдирдореЗрдВ рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП code generation tools рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
Pydantic
рд╕рд╛рд░рд╛ data validation рдЕрдВрджрд░реВрдиреА рддреМрд░ рдкрд░ Pydantic рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд╕рднреА рд▓рд╛рдн рдорд┐рд▓рддреЗ рд╣реИрдВред рдФрд░ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЕрдЪреНрдЫреЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рд╣реИрдВред
рдЖрдк str, float, bool рдФрд░ рдХрдИ рдЕрдиреНрдп рдЬрдЯрд┐рд▓ data types рдХреЗ рд╕рд╛рде рд╡рд╣реА type declarations рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рдХреЛ tutorial рдХреЗ рдЕрдЧрд▓реЗ chapters рдореЗрдВ explore рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдХреНрд░рдо рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ
path operations рдмрдирд╛рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рдорд┐рд▓ рд╕рдХрддреА рд╣реИрдВ рдЬрд╣рд╛рдБ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ fixed path рд╣реЛред
рдЬреИрд╕реЗ /users/me, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдпрд╣ current user рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ data рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред
рдФрд░ рдлрд┐рд░ рдЖрдкрдХреЗ рдкрд╛рд╕ /users/{user_id} path рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХрд┐рд╕реА specific user рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рд╕реА user ID рд╕реЗ data рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдХреНрдпреЛрдВрдХрд┐ path operations рдХрд╛ evaluation рдХреНрд░рдо рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ /users/me рдХреЗ рд▓рд┐рдП path, /users/{user_id} рд╡рд╛рд▓реЗ path рд╕реЗ рдкрд╣рд▓реЗ declare рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ:
{* ../../docs_src/path_params/tutorial003_py310.py hl[6,11] *}
рдЕрдиреНрдпрдерд╛, /users/{user_id} рдХреЗ рд▓рд┐рдП path /users/me рд╕реЗ рднреА match рдХрд░реЗрдЧрд╛, рдпрд╣ "рд╕реЛрдЪрддреЗ рд╣реБрдП" рдХрд┐ рдЙрд╕реЗ user_id parameter рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдХреА value "me" рд╣реИред
рдЗрд╕реА рддрд░рд╣, рдЖрдк рдХрд┐рд╕реА path operation рдХреЛ рдлрд┐рд░ рд╕реЗ define рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ:
{* ../../docs_src/path_params/tutorial003b_py310.py hl[6,11] *}
рдкрд╣рд▓рд╛ рд╡рд╛рд▓рд╛ рд╣рдореЗрд╢рд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ path рдкрд╣рд▓реЗ match рдХрд░рддрд╛ рд╣реИред
рдкрд╣рд▓реЗ рд╕реЗ рддрдп values
рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ path operation рд╣реИ рдЬреЛ рдПрдХ path parameter рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрднрд╡ valid path parameter values рдкрд╣рд▓реЗ рд╕реЗ рддрдп рд╣реЛрдВ, рддреЛ рдЖрдк standard Python Enum рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ Enum class рдмрдирд╛рдПрдВ
Enum import рдХрд░реЗрдВ рдФрд░ рдПрдХ sub-class рдмрдирд╛рдПрдВ рдЬреЛ str рдФрд░ Enum рд╕реЗ inherit рдХрд░рддреА рд╣реЛред
str рд╕реЗ inherit рдХрд░рдиреЗ рдкрд░ API docs рдпрд╣ рдЬрд╛рди рдкрд╛рдПрдВрдЧреЗ рдХрд┐ values рдХрд╛ type string рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рддрд░рд╣ рд╕реЗ render рдХрд░ рдкрд╛рдПрдВрдЧреЗред
рдлрд┐рд░ fixed values рдХреЗ рд╕рд╛рде class attributes рдмрдирд╛рдПрдВ, рдЬреЛ рдЙрдкрд▓рдмреНрдз valid values рд╣реЛрдВрдЧреА:
{* ../../docs_src/path_params/tutorial005_py310.py hl[1,6:9] *}
/// tip | рд╕реБрдЭрд╛рд╡
рдЕрдЧрд░ рдЖрдк рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ, "AlexNet", "ResNet", рдФрд░ "LeNet" рдмрд╕ Machine Learning models рдХреЗ рдирд╛рдо рд╣реИрдВред
///
рдПрдХ path parameter declare рдХрд░реЗрдВ
рдлрд┐рд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ enum class (ModelName) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ type annotation рдХреЗ рд╕рд╛рде рдПрдХ path parameter рдмрдирд╛рдПрдВ:
{* ../../docs_src/path_params/tutorial005_py310.py hl[16] *}
Docs рджреЗрдЦреЗрдВ
рдХреНрдпреЛрдВрдХрд┐ path parameter рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз values рдкрд╣рд▓реЗ рд╕реЗ рддрдп рд╣реИрдВ, interactive docs рдЙрдиреНрд╣реЗрдВ рдЕрдЪреНрдЫреЗ рд╕реЗ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
Python enumerations рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛
path parameter рдХреА value рдПрдХ enumeration member рд╣реЛрдЧреАред
Enumeration members рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ
рдЖрдк рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдЕрдкрдиреЗ рдмрдирд╛рдП рд╣реБрдП enum ModelName рдореЗрдВ рдореМрдЬреВрдж enumeration member рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/path_params/tutorial005_py310.py hl[17] *}
Enumeration value рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рдЖрдк model_name.value рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ actual value (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ str) рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, your_enum_member.value:
{* ../../docs_src/path_params/tutorial005_py310.py hl[20] *}
/// tip | рд╕реБрдЭрд╛рд╡
рдЖрдк ModelName.lenet.value рдХреЗ рд╕рд╛рде value "lenet" рднреА access рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
///
Enumeration members return рдХрд░реЗрдВ
рдЖрдк рдЕрдкрдиреЗ path operation рд╕реЗ enum members return рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдБ рддрдХ рдХрд┐ JSON body рдореЗрдВ nested рднреА (рдЬреИрд╕реЗ рдПрдХ dict)ред
Client рдХреЛ return рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рдЙрдирдХреА рд╕рдВрдмрдВрдзрд┐рдд values (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ strings) рдореЗрдВ convert рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
{* ../../docs_src/path_params/tutorial005_py310.py hl[18,21,23] *}
рдЕрдкрдиреЗ client рдореЗрдВ рдЖрдкрдХреЛ рдРрд╕рд╛ JSON response рдорд┐рд▓реЗрдЧрд╛:
{
"model_name": "alexnet",
"message": "Deep Learning FTW!"
}
Paths рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ Path parameters
рдорд╛рди рд▓реЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ path /files/{file_path} рдХреЗ рд╕рд╛рде рдПрдХ path operation рд╣реИред
рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ file_path рдореЗрдВ рд╕реНрд╡рдпрдВ рдПрдХ path рд░рдЦрдирд╛ рд╣реИ, рдЬреИрд╕реЗ home/johndoe/myfile.txtред
рддреЛ, рдЙрд╕ file рдХреЗ рд▓рд┐рдП URL рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдЧрд╛: /files/home/johndoe/myfile.txtред
OpenAPI support
OpenAPI рдХрд┐рд╕реА path parameter рдХреЛ рдЙрд╕рдХреЗ рдЕрдВрджрд░ рдПрдХ path рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП declare рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ support рдирд╣реАрдВ рдХрд░рддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдРрд╕реЗ scenarios рдмрди рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ test рдФрд░ define рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛред
рдлрд┐рд░ рднреА, рдЖрдк FastAPI рдореЗрдВ Starlette рдХреЗ internal tools рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ docs рдлрд┐рд░ рднреА рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдРрд╕рд╛ рдХреЛрдИ documentation рдирд╣реАрдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдЬреЛ рдмрддрд╛рдП рдХрд┐ parameter рдореЗрдВ path рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
Path convertor
Starlette рд╕реЗ рд╕реАрдзреЗ рдПрдХ option рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ URL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ path рд░рдЦрдиреЗ рд╡рд╛рд▓рд╛ path parameter declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
/files/{file_path:path}
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, parameter рдХрд╛ рдирд╛рдо file_path рд╣реИ, рдФрд░ рдЖрдЦрд┐рд░реА рд╣рд┐рд╕реНрд╕рд╛, :path, рдЗрд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ parameter рдХрд┐рд╕реА рднреА path рд╕реЗ match рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рддреЛ, рдЖрдк рдЗрд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
{* ../../docs_src/path_params/tutorial004_py310.py hl[6] *}
/// tip | рд╕реБрдЭрд╛рд╡
рдЖрдкрдХреЛ parameter рдореЗрдВ /home/johndoe/myfile.txt рд░рдЦрдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, leading slash (/) рдХреЗ рд╕рд╛рдеред
рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, URL рд╣реЛрдЧрд╛: /files//home/johndoe/myfile.txt, files рдФрд░ home рдХреЗ рдмреАрдЪ double slash (//) рдХреЗ рд╕рд╛рдеред
///
Recap
FastAPI рдХреЗ рд╕рд╛рде, рдЫреЛрдЯреЗ, рд╕рд╣рдЬ рдФрд░ standard Python type declarations рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдкрдХреЛ рдорд┐рд▓рддрд╛ рд╣реИ:
- Editor support: error checks, autocompletion рдЖрджрд┐ред
- Data "parsing"
- Data validation
- API annotation рдФрд░ automatic documentation
рдФрд░ рдЖрдкрдХреЛ рдЗрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ declare рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред
рд╡реИрдХрд▓реНрдкрд┐рдХ frameworks рдХреА рддреБрд▓рдирд╛ рдореЗрдВ FastAPI рдХрд╛ рд╢рд╛рдпрдж рдпрд╣реА рдореБрдЦреНрдп рджрд┐рдЦрдиреЗ рд╡рд╛рд▓рд╛ рд▓рд╛рдн рд╣реИ (raw performance рдХреЗ рдЕрд▓рд╛рд╡рд╛)ред