mirror of
https://github.com/fastapi/fastapi.git
synced 2026-06-20 05:19:20 -04:00
ЁЯМР Update translations for hi (add-missing)
This commit is contained in:
485
docs/hi/docs/alternatives.md
Normal file
485
docs/hi/docs/alternatives.md
Normal file
@@ -0,0 +1,485 @@
|
||||
# рд╡рд┐рдХрд▓реНрдк, рдкреНрд░реЗрд░рдгрд╛ рдФрд░ рддреБрд▓рдирд╛рдПрдБ { #alternatives-inspiration-and-comparisons }
|
||||
|
||||
**FastAPI** рдХреЛ рдХрд┐рд╕рд╕реЗ рдкреНрд░реЗрд░рдгрд╛ рдорд┐рд▓реА, рдпрд╣ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреИрд╕рд╛ рд╣реИ рдФрд░ рдЙрдирд╕реЗ рдЗрд╕рдиреЗ рдХреНрдпрд╛ рд╕реАрдЦрд╛ред
|
||||
|
||||
## рдкрд░рд┐рдЪрдп { #intro }
|
||||
|
||||
рджреВрд╕рд░реЛрдВ рдХреЗ рдкрд┐рдЫрд▓реЗ рдХрд╛рдо рдХреЗ рдмрд┐рдирд╛ **FastAPI** рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ред
|
||||
|
||||
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрдИ рдЯреВрд▓ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреАред
|
||||
|
||||
рдореИрдВ рдХрдИ рд╡рд░реНрд╖реЛрдВ рддрдХ рдПрдХ рдирдпрд╛ framework рдмрдирд╛рдиреЗ рд╕реЗ рдмрдЪрддрд╛ рд░рд╣рд╛ред рдкрд╣рд▓реЗ рдореИрдВрдиреЗ **FastAPI** рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХреА рдЧрдИ рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ frameworks, plug-ins рдФрд░ tools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдПрдХ рд╕рдордп рдРрд╕рд╛ рдЖрдпрд╛ рдЬрдм рдРрд╕рд╛ рдХреБрдЫ рдмрдирд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдерд╛ рдЬреЛ рдпреЗ рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░реЗ, рдкрд┐рдЫрд▓реЗ tools рд╕реЗ рд╕рд░реНрд╡реЛрддреНрддрдо рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд▓реЗрдХрд░, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ рдорд┐рд▓рд╛рдХрд░, рдЙрди language features рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЬреЛ рдкрд╣рд▓реЗ рдЙрдкрд▓рдмреНрдз рднреА рдирд╣реАрдВ рдереЗ (Python 3.6+ type hints)ред
|
||||
|
||||
## рдкрд┐рдЫрд▓реЗ tools { #previous-tools }
|
||||
|
||||
### [Django](https://www.djangoproject.com/) { #django }
|
||||
|
||||
рдпрд╣ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп Python framework рд╣реИ рдФрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рднрд░реЛрд╕реЗрдордВрдж рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ Instagram рдЬреИрд╕реЗ systems рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
|
||||
|
||||
рдпрд╣ relational databases (рдЬреИрд╕реЗ MySQL рдпрд╛ PostgreSQL) рдХреЗ рд╕рд╛рде рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд tightly coupled рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЦреНрдп store engine рдХреЗ рд░реВрдк рдореЗрдВ NoSQL database (рдЬреИрд╕реЗ Couchbase, MongoDB, Cassandra, рдЖрджрд┐) рд░рдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред
|
||||
|
||||
рдЗрд╕реЗ backend рдореЗрдВ HTML generate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рди рдХрд┐ рдХрд┐рд╕реА modern frontend (рдЬреИрд╕реЗ React, Vue.js рдФрд░ Angular) рдпрд╛ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп systems (рдЬреИрд╕реЗ <abbr title="Internet of Things - рдЗрдВрдЯрд░рдиреЗрдЯ рдСрдл рдерд┐рдВрдЧреНрд╕">IoT</abbr> devices) рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА APIs рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
|
||||
|
||||
### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework }
|
||||
|
||||
Django REST Framework рдХреЛ Django рдХреЗ рдКрдкрд░ Web APIs рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ flexible toolkit рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддрд╛рдХрд┐ рдЗрд╕рдХреА API рдХреНрд╖рдорддрд╛рдУрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛ рд╕рдХреЗред
|
||||
|
||||
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ Mozilla, Red Hat рдФрд░ Eventbrite рд╕рд╣рд┐рдд рдХрдИ рдХрдВрдкрдирд┐рдпрд╛рдБ рдХрд░рддреА рд╣реИрдВред
|
||||
|
||||
рдпрд╣ **automatic API documentation** рдХреЗ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛, рдФрд░ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрди рдкрд╣рд▓реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛ рдЬрд┐рд╕рдиреЗ **FastAPI** рдХреА "рдЦреЛрдЬ" рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред
|
||||
|
||||
/// note | рдиреЛрдЯ
|
||||
|
||||
Django REST Framework рдХреЛ Tom Christie рдиреЗ рдмрдирд╛рдпрд╛ рдерд╛ред рд╡рд╣реА Starlette рдФрд░ Uvicorn рдХреЗ creator рд╣реИрдВ, рдЬрд┐рди рдкрд░ **FastAPI** рдЖрдзрд╛рд░рд┐рдд рд╣реИред
|
||||
|
||||
///
|
||||
|
||||
/// tip | **FastAPI** рдХреЛ рдЗрд╕рд╕реЗ рдкреНрд░реЗрд░рдгрд╛ рдорд┐рд▓реА рдХрд┐
|
||||
|
||||
рдПрдХ automatic API documentation web user interface рд╣реЛред
|
||||
|
||||
///
|
||||
|
||||
### [Flask](https://flask.palletsprojects.com) { #flask }
|
||||
|
||||
Flask рдПрдХ "microframework" рд╣реИ, рдЗрд╕рдореЗрдВ database integrations рдпрд╛ Django рдореЗрдВ default рд░реВрдк рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реА рдХрдИ рдЪреАрдЬрд╝реЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВред
|
||||
|
||||
рдпрд╣ simplicity рдФрд░ flexibility рдореБрдЦреНрдп data storage system рдХреЗ рд░реВрдк рдореЗрдВ NoSQL databases рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬреИрд╕реА рдЪреАрдЬрд╝реЗрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред
|
||||
|
||||
рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЗрд╕реЗ рд╕реАрдЦрдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд╣рдЬ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ documentation рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдереЛрдбрд╝рд╛ technical рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
|
||||
|
||||
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдорддреМрд░ рдкрд░ рдЙрди рдЕрдиреНрдп applications рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ database, user management, рдпрд╛ Django рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ built-in рдЖрдиреЗ рд╡рд╛рд▓реА рдХрдИ features рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ features plug-ins рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
Parts рдХрд╛ рдпрд╣ decoupling, рдФрд░ рдПрдХ "microframework" рд╣реЛрдирд╛ рдЬрд┐рд╕реЗ рдареАрдХ рд╡рд╣реА рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП extend рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬрд┐рд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдПрдХ key feature рдерд╛ рдЬрд┐рд╕реЗ рдореИрдВ рдмрдирд╛рдП рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
|
||||
|
||||
Flask рдХреА simplicity рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ APIs рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ match рд▓рдЧрд╛ред рдЕрдЧрд▓реА рдЪреАрдЬрд╝ рдЬреЛ рдЦреЛрдЬрдиреА рдереА рд╡рд╣ Flask рдХреЗ рд▓рд┐рдП рдПрдХ "Django REST Framework" рдерд╛ред
|
||||
|
||||
/// tip | **FastAPI** рдХреЛ рдЗрд╕рд╕реЗ рдкреНрд░реЗрд░рдгрд╛ рдорд┐рд▓реА рдХрд┐
|
||||
|
||||
рдПрдХ micro-framework рд╣реЛред рдЖрд╡рд╢реНрдпрдХ tools рдФрд░ parts рдХреЛ mix and match рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдпрд╛ рдЬрд╛рдПред
|
||||
|
||||
рдПрдХ simple рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рди routing system рд╣реЛред
|
||||
|
||||
///
|
||||
|
||||
### [Requests](https://requests.readthedocs.io) { #requests }
|
||||
|
||||
**FastAPI** рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ **Requests** рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рдЙрдирдХрд╛ scope рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИред
|
||||
|
||||
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ FastAPI application рдХреЗ *рдЕрдВрджрд░* Requests рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдд рд╣реЛрдЧреАред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, FastAPI рдХреЛ Requests рд╕реЗ рдХрд╛рдлреА рдкреНрд░реЗрд░рдгрд╛ рдорд┐рд▓реАред
|
||||
|
||||
**Requests** APIs рдХреЗ рд╕рд╛рде *interact* рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (client рдХреЗ рд░реВрдк рдореЗрдВ) рдПрдХ library рд╣реИ, рдЬрдмрдХрд┐ **FastAPI** APIs *рдмрдирд╛рдиреЗ* рдХреЗ рд▓рд┐рдП (server рдХреЗ рд░реВрдк рдореЗрдВ) рдПрдХ library рд╣реИред
|
||||
|
||||
рд╡реЗ рдХрдореЛрдмреЗрд╢ рд╡рд┐рдкрд░реАрдд рд╕рд┐рд░реЛрдВ рдкрд░ рд╣реИрдВ, рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдкреВрд░рдХ рдХрд░рддреЗ рд╣реБрдПред
|
||||
|
||||
Requests рдХрд╛ design рдмрд╣реБрдд simple рдФрд░ intuitive рд╣реИ, sensible defaults рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА, рдпрд╣ рдмрд╣реБрдд powerful рдФрд░ customizable рд╣реИред
|
||||
|
||||
рдЗрд╕реАрд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ official website рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ:
|
||||
|
||||
> Requests рдЕрдм рддрдХ рдХреЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ downloaded Python packages рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ
|
||||
|
||||
рдЖрдк рдЗрд╕реЗ рдЬрд┐рд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, `GET` request рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд▓рд┐рдЦреЗрдВрдЧреЗ:
|
||||
|
||||
```Python
|
||||
response = requests.get("http://example.com/some/url")
|
||||
```
|
||||
|
||||
FastAPI рдореЗрдВ рдЗрд╕рдХреЗ рд╕рдордХрдХреНрд╖ API *path operation* рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
|
||||
|
||||
```Python hl_lines="1"
|
||||
@app.get("/some/url")
|
||||
def read_url():
|
||||
return {"message": "Hello World"}
|
||||
```
|
||||
|
||||
`requests.get(...)` рдФрд░ `@app.get(...)` рдореЗрдВ рд╕рдорд╛рдирддрд╛рдПрдБ рджреЗрдЦреЗрдВред
|
||||
|
||||
/// tip | **FastAPI** рдХреЛ рдЗрд╕рд╕реЗ рдкреНрд░реЗрд░рдгрд╛ рдорд┐рд▓реА рдХрд┐
|
||||
|
||||
* рдПрдХ simple рдФрд░ intuitive API рд╣реЛред
|
||||
* HTTP method names (operations) рдХреЛ рд╕реАрдзреЗ, straightforward рдФрд░ intuitive рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред
|
||||
* sensible defaults рд╣реЛрдВ, рд▓реЗрдХрд┐рди powerful customizations рднреА рд╣реЛрдВред
|
||||
|
||||
///
|
||||
|
||||
### [Swagger](https://swagger.io/) / [OpenAPI](https://github.com/OAI/OpenAPI-Specification/) { #swagger-openapi }
|
||||
|
||||
Django REST Framework рд╕реЗ рдЬреЛ рдореБрдЦреНрдп feature рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ рд╡рд╣ automatic API documentation рдерд╛ред
|
||||
|
||||
рдлрд┐рд░ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ APIs рдХреЛ document рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП JSON (рдпрд╛ YAML, JSON рдХрд╛ рдПрдХ extension) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ standard рдерд╛, рдЬрд┐рд╕реЗ Swagger рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред
|
||||
|
||||
рдФрд░ Swagger APIs рдХреЗ рд▓рд┐рдП рдПрдХ web user interface рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдХрд┐рд╕реА API рдХреЗ рд▓рд┐рдП Swagger documentation generate рдХрд░ рдкрд╛рдирд╛ рдЗрд╕ web user interface рдХрд╛ automatically рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ред
|
||||
|
||||
рдПрдХ рд╕рдордп рдкрд░, Swagger рдХреЛ Linux Foundation рдХреЛ рджреЗ рджрд┐рдпрд╛ рдЧрдпрд╛, рддрд╛рдХрд┐ рдЙрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ OpenAPI рд░рдЦрд╛ рдЬрд╛ рд╕рдХреЗред
|
||||
|
||||
рдЗрд╕реАрд▓рд┐рдП version 2.0 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╕рдордп "Swagger" рдХрд╣рдирд╛ рдЖрдо рд╣реИ, рдФрд░ version 3+ рдХреЗ рд▓рд┐рдП "OpenAPI"ред
|
||||
|
||||
/// tip | **FastAPI** рдХреЛ рдЗрд╕рд╕реЗ рдкреНрд░реЗрд░рдгрд╛ рдорд┐рд▓реА рдХрд┐
|
||||
|
||||
Custom schema рдХреЗ рдмрдЬрд╛рдп API specifications рдХреЗ рд▓рд┐рдП рдПрдХ open standard рдЕрдкрдирд╛рдпрд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред
|
||||
|
||||
рдФрд░ standards-based user interface tools рдХреЛ integrate рдХрд┐рдпрд╛ рдЬрд╛рдП:
|
||||
|
||||
* [Swagger UI](https://github.com/swagger-api/swagger-ui)
|
||||
* [ReDoc](https://github.com/Rebilly/ReDoc)
|
||||
|
||||
рдЗрди рджреЛрдиреЛрдВ рдХреЛ рдЗрд╕рд▓рд┐рдП рдЪреБрдирд╛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рдХрд╛рдлреА popular рдФрд░ stable рдереЗ, рд▓реЗрдХрд┐рди рдПрдХ quick search рдХрд░рдиреЗ рдкрд░, рдЖрдк OpenAPI рдХреЗ рд▓рд┐рдП рджрд░реНрдЬрдиреЛрдВ alternative user interfaces рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк **FastAPI** рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред
|
||||
|
||||
///
|
||||
|
||||
### Flask REST frameworks { #flask-rest-frameworks }
|
||||
|
||||
рдХрдИ Flask REST frameworks рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреА рдЬрд╛рдБрдЪ рдореЗрдВ рд╕рдордп рдФрд░ рдХрд╛рдо рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдХрдИ discontinue рдпрд╛ abandon рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рдХрдИ unresolved issues рд╣реИрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдЕрдиреБрдкрдпреБрдХреНрдд рдмрдирд╛ рджрд┐рдпрд╛ред
|
||||
|
||||
### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow }
|
||||
|
||||
API systems рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдореБрдЦреНрдп features рдореЗрдВ рд╕реЗ рдПрдХ data "<dfn title="рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ, рд░реВрдкрд╛рдВрддрд░рдг рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ">serialization</dfn>" рд╣реИ, рдЬрд┐рд╕рдореЗрдВ code (Python) рд╕реЗ data рд▓реЗрдХрд░ рдЙрд╕реЗ рдРрд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ network рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, database рд╕реЗ data рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ object рдХреЛ JSON object рдореЗрдВ рдмрджрд▓рдирд╛ред `datetime` objects рдХреЛ strings рдореЗрдВ рдмрджрд▓рдирд╛, рдЖрджрд┐ред
|
||||
|
||||
APIs рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдПрдХ рдФрд░ рдмрдбрд╝рд╛ feature data validation рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдХрд┐ data рдирд┐рд╢реНрдЪрд┐рдд parameters рдХреЗ рдЕрдиреБрд╕рд╛рд░ valid рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдИ field `int` рд╣реИ, рдХреЛрдИ random string рдирд╣реАрдВред рдпрд╣ incoming data рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИред
|
||||
|
||||
Data validation system рдХреЗ рдмрд┐рдирд╛, рдЖрдкрдХреЛ рд╕рднреА checks рд╣рд╛рде рд╕реЗ, code рдореЗрдВ рдХрд░рдиреЗ рдкрдбрд╝рддреЗред
|
||||
|
||||
рдпреЗ features рд╡рд╣реА рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Marshmallow рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдПрдХ рдмреЗрд╣рддрд░реАрди library рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЗрд╕рдХрд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдЗрд╕реЗ Python type hints рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдЖрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рд░ <dfn title="рдбреЗрдЯрд╛ рдХреИрд╕реЗ рдмрдирд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛">schema</dfn> рдХреЛ define рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ Marshmallow рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП specific utils рдФрд░ classes рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред
|
||||
|
||||
/// tip | **FastAPI** рдХреЛ рдЗрд╕рд╕реЗ рдкреНрд░реЗрд░рдгрд╛ рдорд┐рд▓реА рдХрд┐
|
||||
|
||||
"schemas" рдХреЛ define рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП code рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬреЛ data types рдФрд░ validation, automatically рдкреНрд░рджрд╛рди рдХрд░реЗред
|
||||
|
||||
///
|
||||
|
||||
### [Webargs](https://webargs.readthedocs.io/en/latest/) { #webargs }
|
||||
|
||||
APIs рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдПрдХ рдФрд░ рдмрдбрд╝рд╛ feature incoming requests рд╕реЗ data <dfn title="Python рдбреЗрдЯрд╛ рдореЗрдВ рдкрдврд╝рдирд╛ рдФрд░ рдмрджрд▓рдирд╛">parsing</dfn> рдХрд░рдирд╛ рд╣реИред
|
||||
|
||||
Webargs рдПрдХ tool рд╣реИ рдЬрд┐рд╕реЗ Flask рд╕рд╣рд┐рдд рдХрдИ frameworks рдХреЗ рдКрдкрд░ рдпрд╣ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
|
||||
|
||||
рдпрд╣ data validation рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ Marshmallow рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЗрд╕реЗ рдЙрдиреНрд╣реАрдВ developers рдиреЗ рдмрдирд╛рдпрд╛ рдерд╛ред
|
||||
|
||||
рдпрд╣ рдПрдХ рдмреЗрд╣рддрд░реАрди tool рд╣реИ рдФрд░ **FastAPI** рд╕реЗ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рднреА рдмрд╣реБрдд рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ред
|
||||
|
||||
/// note | рдиреЛрдЯ
|
||||
|
||||
Webargs рдХреЛ рдЙрдиреНрд╣реАрдВ Marshmallow developers рдиреЗ рдмрдирд╛рдпрд╛ рдерд╛ред
|
||||
|
||||
///
|
||||
|
||||
/// tip | **FastAPI** рдХреЛ рдЗрд╕рд╕реЗ рдкреНрд░реЗрд░рдгрд╛ рдорд┐рд▓реА рдХрд┐
|
||||
|
||||
Incoming request data рдХрд╛ automatic validation рд╣реЛред
|
||||
|
||||
///
|
||||
|
||||
### [APISpec](https://apispec.readthedocs.io/en/stable/) { #apispec }
|
||||
|
||||
Marshmallow рдФрд░ Webargs plug-ins рдХреЗ рд░реВрдк рдореЗрдВ validation, parsing рдФрд░ serialization рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
|
||||
|
||||
рд▓реЗрдХрд┐рди documentation рдЕрднреА рднреА missing рд╣реИред рдлрд┐рд░ APISpec рдмрдирд╛рдпрд╛ рдЧрдпрд╛ред
|
||||
|
||||
рдпрд╣ рдХрдИ frameworks рдХреЗ рд▓рд┐рдП рдПрдХ plug-in рд╣реИ (рдФрд░ Starlette рдХреЗ рд▓рд┐рдП рднреА рдПрдХ plug-in рд╣реИ)ред
|
||||
|
||||
рдпрд╣ рдЬрд┐рд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк route handle рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рддреНрдпреЗрдХ function рдХреА docstring рдХреЗ рдЕрдВрджрд░ YAML format рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ schema рдХреА definition рд▓рд┐рдЦрддреЗ рд╣реИрдВред
|
||||
|
||||
рдФрд░ рдпрд╣ OpenAPI schemas generate рдХрд░рддрд╛ рд╣реИред
|
||||
|
||||
Flask, Starlette, Responder, рдЖрджрд┐ рдореЗрдВ рдпрд╣ рдЗрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдлрд┐рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлрд┐рд░ рд╕реЗ Python string (рдПрдХ рдмрдбрд╝рд╛ YAML) рдХреЗ рдЕрдВрджрд░ micro-syntax рд╣реЛрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИред
|
||||
|
||||
Editor рдЗрд╕рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдФрд░ рдЕрдЧрд░ рд╣рдо parameters рдпрд╛ Marshmallow schemas modify рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ YAML docstring рдХреЛ рднреА modify рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ generated schema obsolete рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
|
||||
|
||||
/// note | рдиреЛрдЯ
|
||||
|
||||
APISpec рдХреЛ рдЙрдиреНрд╣реАрдВ Marshmallow developers рдиреЗ рдмрдирд╛рдпрд╛ рдерд╛ред
|
||||
|
||||
///
|
||||
|
||||
/// tip | **FastAPI** рдХреЛ рдЗрд╕рд╕реЗ рдкреНрд░реЗрд░рдгрд╛ рдорд┐рд▓реА рдХрд┐
|
||||
|
||||
APIs рдХреЗ рд▓рд┐рдП open standard, OpenAPI рдХреЛ support рдХрд┐рдпрд╛ рдЬрд╛рдПред
|
||||
|
||||
///
|
||||
|
||||
### [Flask-apispec](https://flask-apispec.readthedocs.io/en/latest/) { #flask-apispec }
|
||||
|
||||
рдпрд╣ рдПрдХ Flask plug-in рд╣реИ, рдЬреЛ Webargs, Marshmallow рдФрд░ APISpec рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИред
|
||||
|
||||
рдпрд╣ APISpec рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ OpenAPI schemas automatically generate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Webargs рдФрд░ Marshmallow рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
|
||||
|
||||
рдпрд╣ рдПрдХ рдмреЗрд╣рддрд░реАрди tool рд╣реИ, рдмрд╣реБрдд underratedред рдЗрд╕реЗ рд╡рд╣рд╛рдБ рдореМрдЬреВрдж рдХрдИ Flask plug-ins рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ popular рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕рдХреА documentation рдХреЗ рдмрд╣реБрдд concise рдФрд░ abstract рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
|
||||
|
||||
рдЗрд╕рдиреЗ Python docstrings рдХреЗ рдЕрдВрджрд░ YAML (рдПрдХ рдФрд░ syntax) рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рд▓ рдХрд░ рджрд┐рдпрд╛ред
|
||||
|
||||
Flask, Flask-apispec рдХреЛ Marshmallow рдФрд░ Webargs рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдХрд░ рдпрд╣ combination **FastAPI** рдмрдирд╛рдиреЗ рддрдХ рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ backend stack рдерд╛ред
|
||||
|
||||
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХрдИ Flask full-stack generators рдмрдиреЗред рдпреЗ рд╡реЗ main stacks рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ (рдФрд░ рдХрдИ external teams) рдЕрдм рддрдХ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
|
||||
|
||||
* [https://github.com/tiangolo/full-stack](https://github.com/tiangolo/full-stack)
|
||||
* [https://github.com/tiangolo/full-stack-flask-couchbase](https://github.com/tiangolo/full-stack-flask-couchbase)
|
||||
* [https://github.com/tiangolo/full-stack-flask-couchdb](https://github.com/tiangolo/full-stack-flask-couchdb)
|
||||
|
||||
рдФрд░ рдпрд╣реА full-stack generators [**FastAPI** Project Generators](project-generation.md) рдХрд╛ base рдереЗред
|
||||
|
||||
/// note | рдиреЛрдЯ
|
||||
|
||||
Flask-apispec рдХреЛ рдЙрдиреНрд╣реАрдВ Marshmallow developers рдиреЗ рдмрдирд╛рдпрд╛ рдерд╛ред
|
||||
|
||||
///
|
||||
|
||||
/// tip | **FastAPI** рдХреЛ рдЗрд╕рд╕реЗ рдкреНрд░реЗрд░рдгрд╛ рдорд┐рд▓реА рдХрд┐
|
||||
|
||||
OpenAPI schema рдХреЛ automatically generate рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЙрд╕реА code рд╕реЗ рдЬреЛ serialization рдФрд░ validation define рдХрд░рддрд╛ рд╣реИред
|
||||
|
||||
///
|
||||
|
||||
### [NestJS](https://nestjs.com/) (рдФрд░ [Angular](https://angular.io/)) { #nestjs-and-angular }
|
||||
|
||||
рдпрд╣ Python рднреА рдирд╣реАрдВ рд╣реИ, NestJS Angular рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдПрдХ JavaScript (TypeScript) NodeJS framework рд╣реИред
|
||||
|
||||
рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ Flask-apispec рдХреЗ рд╕рд╛рде рдХрд┐рдП рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рдо рдЬреИрд╕рд╛ рд╣реИред
|
||||
|
||||
рдЗрд╕рдореЗрдВ Angular 2 рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдПрдХ integrated dependency injection system рд╣реИред рдЗрд╕рдореЗрдВ "injectables" рдХреЛ pre-register рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдЬреИрд╕реЗ рдореБрдЭреЗ рдЬреНрдЮрд╛рдд рд╕рднреА рдЕрдиреНрдп dependency injection systems рдореЗрдВ), рдЗрд╕рд▓рд┐рдП, рдпрд╣ verbosity рдФрд░ code repetition рдмрдврд╝рд╛рддрд╛ рд╣реИред
|
||||
|
||||
рдХреНрдпреЛрдВрдХрд┐ parameters рдХреЛ TypeScript types (Python type hints рдХреЗ рд╕рдорд╛рди) рдХреЗ рд╕рд╛рде describe рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, editor support рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╣реИред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ TypeScript data compilation рдХреЗ рдмрд╛рдж JavaScript рдореЗрдВ preserve рдирд╣реАрдВ рд░рд╣рддрд╛, рдпрд╣ validation, serialization рдФрд░ documentation рдХреЛ рдПрдХ рд╣реА рд╕рдордп рдкрд░ define рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП types рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред рдЗрд╕рдХреЗ рдХрд╛рд░рдг рдФрд░ рдХреБрдЫ design decisions рдХреЗ рдХрд╛рд░рдг, validation, serialization рдФрд░ automatic schema generation рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдИ рдЬрдЧрд╣ decorators рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдХрд╛рдлреА verbose рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
|
||||
|
||||
рдпрд╣ nested models рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ handle рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд░ request рдореЗрдВ JSON body рдПрдХ JSON object рд╣реИ рдЬрд┐рд╕рдореЗрдВ inner fields рд╣реИрдВ рдЬреЛ рдЦреБрдж nested JSON objects рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдареАрдХ рд╕реЗ document рдФрд░ validate рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред
|
||||
|
||||
/// tip | **FastAPI** рдХреЛ рдЗрд╕рд╕реЗ рдкреНрд░реЗрд░рдгрд╛ рдорд┐рд▓реА рдХрд┐
|
||||
|
||||
рдмреЗрд╣рддрд░реАрди editor support рдХреЗ рд▓рд┐рдП Python types рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред
|
||||
|
||||
рдПрдХ powerful dependency injection system рд╣реЛред Code repetition рдХреЛ minimize рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЦреЛрдЬрд╛ рдЬрд╛рдПред
|
||||
|
||||
///
|
||||
|
||||
### [Sanic](https://sanic.readthedocs.io/en/latest/) { #sanic }
|
||||
|
||||
рдпрд╣ `asyncio` рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдкрд╣рд▓реЗ рдмреЗрд╣рдж рддреЗрдЬрд╝ Python frameworks рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛ред рдЗрд╕реЗ Flask рдХреЗ рдмрд╣реБрдд рд╕рдорд╛рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
|
||||
|
||||
/// note | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
|
||||
|
||||
рдЗрд╕рдиреЗ default Python `asyncio` loop рдХреЗ рдмрдЬрд╛рдп [`uvloop`](https://github.com/MagicStack/uvloop) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдпрд╣реА рдЗрд╕реЗ рдЗрддрдирд╛ рддреЗрдЬрд╝ рдмрдирд╛рддрд╛ рдерд╛ред
|
||||
|
||||
рдЗрд╕рдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ Uvicorn рдФрд░ Starlette рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ open benchmarks рдореЗрдВ Sanic рд╕реЗ рддреЗрдЬрд╝ рд╣реИрдВред
|
||||
|
||||
///
|
||||
|
||||
/// tip | **FastAPI** рдХреЛ рдЗрд╕рд╕реЗ рдкреНрд░реЗрд░рдгрд╛ рдорд┐рд▓реА рдХрд┐
|
||||
|
||||
рдмреЗрд╣рдж рддреЗрдЬрд╝ performance рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЦреЛрдЬрд╛ рдЬрд╛рдПред
|
||||
|
||||
рдЗрд╕реАрд▓рд┐рдП **FastAPI** Starlette рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдкрд▓рдмреНрдз рд╕рдмрд╕реЗ рддреЗрдЬрд╝ framework рд╣реИ (third-party benchmarks рджреНрд╡рд╛рд░рд╛ tested)ред
|
||||
|
||||
///
|
||||
|
||||
### [Falcon](https://falconframework.org/) { #falcon }
|
||||
|
||||
Falcon рдПрдХ рдФрд░ high performance Python framework рд╣реИ, рдЗрд╕реЗ minimal рд╣реЛрдиреЗ рдФрд░ Hug рдЬреИрд╕реЗ рдЕрдиреНрдп frameworks рдХреА foundation рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП design рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
|
||||
|
||||
рдЗрд╕реЗ рдРрд╕реА functions рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП design рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рджреЛ parameters receive рдХрд░рддреА рд╣реИрдВ, рдПрдХ "request" рдФрд░ рдПрдХ "response"ред рдлрд┐рд░ рдЖрдк request рд╕реЗ parts "read" рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ response рдореЗрдВ parts "write" рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ design рдХреЗ рдХрд╛рд░рдг, standard Python type hints рдХреЗ рд╕рд╛рде function parameters рдХреЗ рд░реВрдк рдореЗрдВ request parameters рдФрд░ bodies declare рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
|
||||
|
||||
рдЗрд╕рд▓рд┐рдП, data validation, serialization, рдФрд░ documentation рдХреЛ code рдореЗрдВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, automatically рдирд╣реАрдВред рдпрд╛ рдЙрдиреНрд╣реЗрдВ Falcon рдХреЗ рдКрдкрд░ рдПрдХ framework рдХреЗ рд░реВрдк рдореЗрдВ implement рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдЬреИрд╕реЗ Hugред рдпрд╣реА рдЕрдВрддрд░ рдЙрди рдЕрдиреНрдп frameworks рдореЗрдВ рднреА рд╣реЛрддрд╛ рд╣реИ рдЬреЛ Falcon рдХреЗ design рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИрдВ, рдЬрд╣рд╛рдБ parameters рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ request object рдФрд░ рдПрдХ response object рд╣реЛрддрд╛ рд╣реИред
|
||||
|
||||
/// tip | **FastAPI** рдХреЛ рдЗрд╕рд╕реЗ рдкреНрд░реЗрд░рдгрд╛ рдорд┐рд▓реА рдХрд┐
|
||||
|
||||
рдмреЗрд╣рддрд░реАрди performance рдкрд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдЦреЛрдЬреЗ рдЬрд╛рдПрдБред
|
||||
|
||||
Hug рдХреЗ рд╕рд╛рде (рдХреНрдпреЛрдВрдХрд┐ Hug Falcon рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ) рдЗрд╕рдиреЗ **FastAPI** рдХреЛ functions рдореЗрдВ `response` parameter declare рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред
|
||||
|
||||
рд╣рд╛рд▓рд╛рдВрдХрд┐ FastAPI рдореЗрдВ рдпрд╣ optional рд╣реИ, рдФрд░ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ headers, cookies, рдФрд░ alternative status codes set рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
|
||||
|
||||
///
|
||||
|
||||
### [Molten](https://moltenframework.com/) { #molten }
|
||||
|
||||
рдореИрдВрдиреЗ **FastAPI** рдмрдирд╛рдиреЗ рдХреЗ рд╢реБрд░реБрдЖрддреА рдЪрд░рдгреЛрдВ рдореЗрдВ Molten рдЦреЛрдЬрд╛ред рдФрд░ рдЗрд╕рдореЗрдВ рдХрд╛рдлреА рд╕рдорд╛рди рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ:
|
||||
|
||||
* Python type hints рдкрд░ рдЖрдзрд╛рд░рд┐рддред
|
||||
* рдЗрди types рд╕реЗ validation рдФрд░ documentationред
|
||||
* Dependency Injection systemред
|
||||
|
||||
рдпрд╣ Pydantic рдЬреИрд╕реА data validation, serialization рдФрд░ documentation third-party library рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛, рдЗрд╕рдХреА рдЕрдкрдиреА library рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпреЗ data type definitions рдЙрддрдиреА рдЖрд╕рд╛рдиреА рд╕реЗ reusable рдирд╣реАрдВ рд╣реЛрдВрдЧреАред
|
||||
|
||||
рдЗрд╕реЗ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ verbose configurations рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ WSGI (ASGI рдХреЗ рдмрдЬрд╛рдп) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЗрд╕реЗ Uvicorn, Starlette рдФрд░ Sanic рдЬреИрд╕реЗ tools рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП high performance рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП design рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
|
||||
|
||||
Dependency injection system рдХреЛ dependencies рдХреА pre-registration рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ dependencies declared types рдХреЗ рдЖрдзрд╛рд░ рдкрд░ solve рдХреА рдЬрд╛рддреА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдХрд┐рд╕реА рдирд┐рд╢реНрдЪрд┐рдд type рдХреЛ provide рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ "component" declare рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
|
||||
|
||||
Routes рдПрдХ рд╣реА рдЬрдЧрд╣ declare рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рджреВрд╕рд░реА рдЬрдЧрд╣реЛрдВ рдкрд░ declared functions рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ (decorators рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЬрд┐рдиреНрд╣реЗрдВ endpoint handle рдХрд░рдиреЗ рд╡рд╛рд▓реА function рдХреЗ рдареАрдХ рдКрдкрд░ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдпрд╣ Flask (рдФрд░ Starlette) рдХреЗ рддрд░реАрдХреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ Django рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдЕрдзрд┐рдХ рдХрд░реАрдм рд╣реИред рдпрд╣ code рдореЗрдВ рдЙрди рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд tightly coupled рд╣реИрдВред
|
||||
|
||||
/// tip | **FastAPI** рдХреЛ рдЗрд╕рд╕реЗ рдкреНрд░реЗрд░рдгрд╛ рдорд┐рд▓реА рдХрд┐
|
||||
|
||||
Model attributes рдХреЗ "default" value рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ data types рдХреЗ рд▓рд┐рдП extra validations define рдХрд┐рдП рдЬрд╛рдПрдБред рдпрд╣ editor support рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ Pydantic рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рдерд╛ред
|
||||
|
||||
рдЗрд╕рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ Pydantic рдХреЗ parts рдХреЛ update рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛, рддрд╛рдХрд┐ рд╡рд╣реА validation declaration style support рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ (рдпрд╣ рд╕рд╛рд░реА functionality рдЕрдм Pydantic рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ)ред
|
||||
|
||||
///
|
||||
|
||||
### [Hug](https://github.com/hugapi/hug) { #hug }
|
||||
|
||||
Hug рдЙрди рдкрд╣рд▓реЗ frameworks рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛ рдЬрд┐рд╕рдиреЗ Python type hints рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ API parameter types рдХреА declaration implement рдХреАред рдпрд╣ рдПрдХ рдмреЗрд╣рддрд░реАрди рд╡рд┐рдЪрд╛рд░ рдерд╛ рдЬрд┐рд╕рдиреЗ рдЕрдиреНрдп tools рдХреЛ рднреА рдРрд╕рд╛ рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред
|
||||
|
||||
рдЗрд╕рдиреЗ рдЕрдкрдиреА declarations рдореЗрдВ standard Python types рдХреЗ рдмрдЬрд╛рдп custom types рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдпрд╣ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдХрджрдо рдЖрдЧреЗ рдерд╛ред
|
||||
|
||||
рдпрд╣ рдкреВрд░реЗ API рдХреЛ JSON рдореЗрдВ declare рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ custom schema generate рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ frameworks рдореЗрдВ рд╕реЗ рднреА рдПрдХ рдерд╛ред
|
||||
|
||||
рдпрд╣ OpenAPI рдФрд░ JSON Schema рдЬреИрд╕реЗ standard рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдерд╛ред рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ Swagger UI рдЬреИрд╕реЗ рдЕрдиреНрдп tools рдХреЗ рд╕рд╛рде integrate рдХрд░рдирд╛ straightforward рдирд╣реАрдВ рд╣реЛрддрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдпрд╣ рдПрдХ рдмрд╣реБрдд innovative idea рдерд╛ред
|
||||
|
||||
рдЗрд╕рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк, uncommon feature рд╣реИ: рдЙрд╕реА framework рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ APIs рдФрд░ CLIs рднреА рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИред
|
||||
|
||||
рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ synchronous Python web frameworks (WSGI) рдХреЗ рдкрд┐рдЫрд▓реЗ standard рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдпрд╣ Websockets рдФрд░ рдЕрдиреНрдп рдЪреАрдЬрд╝реЛрдВ рдХреЛ handle рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХрд╛ performance рднреА high рд╣реИред
|
||||
|
||||
/// note | рдиреЛрдЯ
|
||||
|
||||
Hug рдХреЛ Timothy Crosley рдиреЗ рдмрдирд╛рдпрд╛ рдерд╛, рд╡рд╣реА [`isort`](https://github.com/timothycrosley/isort) рдХреЗ creator рд╣реИрдВ, рдЬреЛ Python files рдореЗрдВ imports рдХреЛ automatically sort рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░реАрди tool рд╣реИред
|
||||
|
||||
///
|
||||
|
||||
/// tip | **FastAPI** рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рдЪрд╛рд░
|
||||
|
||||
Hug рдиреЗ APIStar рдХреЗ parts рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛, рдФрд░ APIStar рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдпрд╣ рдЙрди tools рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛ рдЬреЛ рдореБрдЭреЗ рд╕рдмрд╕реЗ promising рд▓рдЧреЗред
|
||||
|
||||
Hug рдиреЗ **FastAPI** рдХреЛ parameters declare рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Python type hints рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ, рдФрд░ API рдХреЛ automatically define рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ schema generate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред
|
||||
|
||||
Hug рдиреЗ **FastAPI** рдХреЛ headers рдФрд░ cookies set рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП functions рдореЗрдВ `response` parameter declare рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред
|
||||
|
||||
///
|
||||
|
||||
### [APIStar](https://github.com/encode/apistar) (<= 0.5) { #apistar-0-5 }
|
||||
|
||||
**FastAPI** рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рд╕реЗ рдареАрдХ рдкрд╣рд▓реЗ рдореБрдЭреЗ **APIStar** server рдорд┐рд▓рд╛ред рдЗрд╕рдореЗрдВ рд▓рдЧрднрдЧ рд╡рд╣ рд╕рдм рдХреБрдЫ рдерд╛ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рддрд▓рд╛рд╢ рдереА рдФрд░ рдЗрд╕рдХрд╛ design рдмреЗрд╣рддрд░реАрди рдерд╛ред
|
||||
|
||||
рдпрд╣ рдЙрди рдкрд╣рд▓реЗ implementations рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛ рдЬреЛ рдореИрдВрдиреЗ рдХрднреА рджреЗрдЦреЗ, рдЬрд┐рд╕рдореЗрдВ parameters рдФрд░ requests declare рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Python type hints рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ framework рдерд╛ (NestJS рдФрд░ Molten рд╕реЗ рдкрд╣рд▓реЗ)ред рдореБрдЭреЗ рдпрд╣ Hug рдХреЗ рд▓рдЧрднрдЧ рдЙрд╕реА рд╕рдордп рдорд┐рд▓рд╛ред рд▓реЗрдХрд┐рди APIStar рдиреЗ OpenAPI standard рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
|
||||
|
||||
рдЗрд╕рдореЗрдВ рдХрдИ рдЬрдЧрд╣реЛрдВ рдкрд░ рдЙрдиреНрд╣реАрдВ type hints рдХреЗ рдЖрдзрд╛рд░ рдкрд░ automatic data validation, data serialization рдФрд░ OpenAPI schema generation рдерд╛ред
|
||||
|
||||
Body schema definitions Pydantic рдЬреИрд╕реЗ Python type hints рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреА рдереАрдВ, рдпрд╣ Marshmallow рдХреЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рдорд╛рди рдерд╛, рдЗрд╕рд▓рд┐рдП editor support рдЙрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, APIStar рдЙрдкрд▓рдмреНрдз рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдерд╛ред
|
||||
|
||||
рдЙрд╕ рд╕рдордп рдЗрд╕рдХреЗ performance benchmarks рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдереЗ (рд╕рд┐рд░реНрдл Starlette рдиреЗ surpass рдХрд┐рдпрд╛ рдерд╛)ред
|
||||
|
||||
рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЗрд╕рдореЗрдВ automatic API documentation web UI рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкрддрд╛ рдерд╛ рдХрд┐ рдореИрдВ рдЗрд╕рдореЗрдВ Swagger UI рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдБред
|
||||
|
||||
рдЗрд╕рдореЗрдВ dependency injection system рдерд╛ред рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдЕрдиреНрдп tools рдХреА рддрд░рд╣, рдЗрд╕рдореЗрдВ components рдХреА pre-registration рдЖрд╡рд╢реНрдпрдХ рдереАред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдпрд╣ рдПрдХ рдмреЗрд╣рддрд░реАрди feature рдерд╛ред
|
||||
|
||||
рдореИрдВ рдХрднреА рднреА рдЗрд╕реЗ full project рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рдкрд╛рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ security integration рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ Flask-apispec рдкрд░ рдЖрдзрд╛рд░рд┐рдд full-stack generators рдХреЗ рд╕рд╛рде рдореМрдЬреВрдж рд╕рднреА features рдХреЛ replace рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред рдореЗрд░реЗ projects backlog рдореЗрдВ рдЙрд╕ functionality рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ pull request рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛ред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдлрд┐рд░, project рдХрд╛ focus shift рд╣реЛ рдЧрдпрд╛ред
|
||||
|
||||
рдпрд╣ рдЕрдм API web framework рдирд╣реАрдВ рд░рд╣рд╛, рдХреНрдпреЛрдВрдХрд┐ creator рдХреЛ Starlette рдкрд░ focus рдХрд░рдирд╛ рдерд╛ред
|
||||
|
||||
рдЕрдм APIStar OpenAPI specifications validate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП tools рдХрд╛ рдПрдХ set рд╣реИ, web framework рдирд╣реАрдВред
|
||||
|
||||
/// note | рдиреЛрдЯ
|
||||
|
||||
APIStar рдХреЛ Tom Christie рдиреЗ рдмрдирд╛рдпрд╛ рдерд╛ред рд╡рд╣реА рд╡реНрдпрдХреНрддрд┐ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдмрдирд╛рдпрд╛:
|
||||
|
||||
* Django REST Framework
|
||||
* Starlette (рдЬрд┐рд╕ рдкрд░ **FastAPI** рдЖрдзрд╛рд░рд┐рдд рд╣реИ)
|
||||
* Uvicorn (Starlette рдФрд░ **FastAPI** рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)
|
||||
|
||||
///
|
||||
|
||||
/// tip | **FastAPI** рдХреЛ рдЗрд╕рд╕реЗ рдкреНрд░реЗрд░рдгрд╛ рдорд┐рд▓реА рдХрд┐
|
||||
|
||||
рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдЖрдПред
|
||||
|
||||
рдПрдХ рд╣реА Python types рдХреЗ рд╕рд╛рде рдХрдИ рдЪреАрдЬрд╝реЗрдВ (data validation, serialization рдФрд░ documentation) declare рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░, рдЬреЛ рд╕рд╛рде рд╣реА рдмреЗрд╣рддрд░реАрди editor support рднреА рджреЗрддрд╛ рдерд╛, рдореБрдЭреЗ рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╡рд┐рдЪрд╛рд░ рд▓рдЧрд╛ред
|
||||
|
||||
рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕рдорд╛рди framework рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдФрд░ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ alternatives рдХреЛ test рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, APIStar рдЙрдкрд▓рдмреНрдз рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдерд╛ред
|
||||
|
||||
рдлрд┐рд░ APIStar рдиреЗ server рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд░рд╣рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдФрд░ Starlette рдмрдирд╛рдпрд╛ рдЧрдпрд╛, рдФрд░ рдпрд╣ рдРрд╕реЗ system рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рдмреЗрд╣рддрд░ foundation рдерд╛ред рдпрд╣реА **FastAPI** рдмрдирд╛рдиреЗ рдХреА рдЕрдВрддрд┐рдо рдкреНрд░реЗрд░рдгрд╛ рдереАред
|
||||
|
||||
рдореИрдВ **FastAPI** рдХреЛ APIStar рдХрд╛ "spiritual successor" рдорд╛рдирддрд╛ рд╣реВрдБ, рдЬреЛ рдЗрди рд╕рднреА рдкрд┐рдЫрд▓реЗ tools рд╕реЗ рдорд┐рд▓реА рд╕реАрдЦ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ features, typing system, рдФрд░ рдЕрдиреНрдп parts рдХреЛ improve рдФрд░ increase рдХрд░рддрд╛ рд╣реИред
|
||||
|
||||
///
|
||||
|
||||
## **FastAPI** рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ { #used-by-fastapi }
|
||||
|
||||
### [Pydantic](https://docs.pydantic.dev/) { #pydantic }
|
||||
|
||||
Pydantic Python type hints рдХреЗ рдЖрдзрд╛рд░ рдкрд░ data validation, serialization рдФрд░ documentation (JSON Schema рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) define рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ library рд╣реИред
|
||||
|
||||
рдпрд╣ рдЗрд╕реЗ рдмреЗрд╣рдж intuitive рдмрдирд╛рддрд╛ рд╣реИред
|
||||
|
||||
рдпрд╣ Marshmallow рд╕реЗ comparable рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ benchmarks рдореЗрдВ рдпрд╣ Marshmallow рд╕реЗ рддреЗрдЬрд╝ рд╣реИред рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдиреНрд╣реАрдВ Python type hints рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, editor support рдмреЗрд╣рддрд░реАрди рд╣реИред
|
||||
|
||||
/// tip | **FastAPI** рдЗрд╕реЗ рдЗрди рдХрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
|
||||
|
||||
рд╕рднреА data validation, data serialization рдФрд░ automatic model documentation (JSON Schema рдкрд░ рдЖрдзрд╛рд░рд┐рдд) handle рдХрд░рдирд╛ред
|
||||
|
||||
рдлрд┐рд░ **FastAPI** рдЙрд╕ JSON Schema data рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ OpenAPI рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИ, рдЙрди рд╕рднреА рдЕрдиреНрдп рдЪреАрдЬрд╝реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЬреЛ рдпрд╣ рдХрд░рддрд╛ рд╣реИред
|
||||
|
||||
///
|
||||
|
||||
### [Starlette](https://www.starlette.dev/) { #starlette }
|
||||
|
||||
Starlette рдПрдХ lightweight <dfn title="рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ Python web applications рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдорд╛рдирдХ">ASGI</dfn> framework/toolkit рд╣реИ, рдЬреЛ high-performance asyncio services рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП ideal рд╣реИред
|
||||
|
||||
рдпрд╣ рдмрд╣реБрдд simple рдФрд░ intuitive рд╣реИред рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ extensible рд╣реЛрдиреЗ рдФрд░ modular components рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП design рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
|
||||
|
||||
рдЗрд╕рдореЗрдВ рд╣реИ:
|
||||
|
||||
* Seriously impressive performance.
|
||||
* WebSocket support.
|
||||
* In-process background tasks.
|
||||
* Startup рдФрд░ shutdown events.
|
||||
* HTTPX рдкрд░ built test client.
|
||||
* CORS, GZip, Static Files, Streaming responses.
|
||||
* Session рдФрд░ Cookie support.
|
||||
* 100% test coverage.
|
||||
* 100% type annotated codebase.
|
||||
* Few hard dependencies.
|
||||
|
||||
Starlette рд╡рд░реНрддрдорд╛рди рдореЗрдВ tested рд╕рдмрд╕реЗ рддреЗрдЬрд╝ Python framework рд╣реИред рдХреЗрд╡рд▓ Uvicorn рдиреЗ рдЗрд╕реЗ surpass рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ framework рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ server рд╣реИред
|
||||
|
||||
Starlette рд╕рднреА basic web microframework functionality рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдпрд╣ automatic data validation, serialization рдпрд╛ documentation рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ред
|
||||
|
||||
рдпрд╣ рдЙрди рдореБрдЦреНрдп рдЪреАрдЬрд╝реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ **FastAPI** рдКрдкрд░ рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рд╕рдм Python type hints (Pydantic рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдкрд░ рдЖрдзрд╛рд░рд┐рддред рдЗрд╕рдХреЗ рд╕рд╛рде dependency injection system, security utilities, OpenAPI schema generation, рдЖрджрд┐ред
|
||||
|
||||
/// note | рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг
|
||||
|
||||
ASGI рдПрдХ рдирдпрд╛ "standard" рд╣реИ рдЬрд┐рд╕реЗ Django core team members рджреНрд╡рд╛рд░рд╛ develop рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЕрднреА рднреА "Python standard" (рдПрдХ PEP) рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реИрдВред
|
||||
|
||||
рдлрд┐рд░ рднреА, рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ tools рджреНрд╡рд╛рд░рд╛ "standard" рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдпрд╣ interoperability рдХреЛ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рдмрдирд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк Uvicorn рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп ASGI server (рдЬреИрд╕реЗ Daphne рдпрд╛ Hypercorn) рд╕реЗ switch рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк ASGI compatible tools, рдЬреИрд╕реЗ `python-socketio`, рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
///
|
||||
|
||||
/// tip | **FastAPI** рдЗрд╕реЗ рдЗрди рдХрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
|
||||
|
||||
рд╕рднреА core web parts рдХреЛ handle рдХрд░рдирд╛ред рдКрдкрд░ рд╕реЗ features рдЬреЛрдбрд╝рдирд╛ред
|
||||
|
||||
Class `FastAPI` рдЦреБрдж рд╕реАрдзреЗ class `Starlette` рд╕реЗ inherit рдХрд░рддреА рд╣реИред
|
||||
|
||||
рдЗрд╕рд▓рд┐рдП, рдЬреЛ рдХреБрдЫ рднреА рдЖрдк Starlette рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдЖрдк рд╕реАрдзреЗ **FastAPI** рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ steroids рдкрд░ Starlette рд╣реИред
|
||||
|
||||
///
|
||||
|
||||
### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn }
|
||||
|
||||
Uvicorn рдПрдХ lightning-fast ASGI server рд╣реИ, рдЬреЛ uvloop рдФрд░ httptools рдкрд░ рдмрдирд╛ рд╣реИред
|
||||
|
||||
рдпрд╣ web framework рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ server рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ paths рджреНрд╡рд╛рд░рд╛ routing рдХреЗ рд▓рд┐рдП tools рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ред рдпрд╣ рдРрд╕реА рдЪреАрдЬрд╝ рд╣реИ рдЬреЛ Starlette (рдпрд╛ **FastAPI**) рдЬреИрд╕рд╛ framework рдКрдкрд░ рд╕реЗ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред
|
||||
|
||||
рдпрд╣ Starlette рдФрд░ **FastAPI** рдХреЗ рд▓рд┐рдП recommended server рд╣реИред
|
||||
|
||||
/// tip | **FastAPI** рдЗрд╕реЗ рдЗрд╕ рд░реВрдк рдореЗрдВ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдХрд░рддрд╛ рд╣реИ
|
||||
|
||||
**FastAPI** applications рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП main web serverред
|
||||
|
||||
рдЖрдк asynchronous multi-process server рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП `--workers` command line option рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг [Deployment](deployment/index.md) section рдореЗрдВ рджреЗрдЦреЗрдВред
|
||||
|
||||
///
|
||||
|
||||
## Benchmarks рдФрд░ speed { #benchmarks-and-speed }
|
||||
|
||||
Uvicorn, Starlette рдФрд░ FastAPI рдХреЗ рдмреАрдЪ рд╕рдордЭрдиреЗ, рддреБрд▓рдирд╛ рдХрд░рдиреЗ, рдФрд░ рдЕрдВрддрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, [Benchmarks](benchmarks.md) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ section рджреЗрдЦреЗрдВред
|
||||
444
docs/hi/docs/async.md
Normal file
444
docs/hi/docs/async.md
Normal file
@@ -0,0 +1,444 @@
|
||||
# Concurrency рдФрд░ async / await { #concurrency-and-async-await }
|
||||
|
||||
*path operation functions* рдХреЗ рд▓рд┐рдП `async def` syntax рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд░рдг рдФрд░ asynchronous code, concurrency, рдФрд░ parallelism рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдкреГрд╖реНрдарднреВрдорд┐ред
|
||||
|
||||
## рдЬрд▓реНрджреА рдореЗрдВ рд╣реИрдВ? { #in-a-hurry }
|
||||
|
||||
<abbr title="too long; didn't read - рдмрд╣реБрдд рд▓рдВрдмрд╛; рдирд╣реАрдВ рдкрдврд╝рд╛"><strong>TL;DR:</strong></abbr>
|
||||
|
||||
рдЕрдЧрд░ рдЖрдк third party libraries рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ `await` рдХреЗ рд╕рд╛рде call рдХрд░рдиреЗ рдХреЛ рдХрд╣рддреА рд╣реИрдВ, рдЬреИрд╕реЗ:
|
||||
|
||||
```Python
|
||||
results = await some_library()
|
||||
```
|
||||
|
||||
рддреЛ, рдЕрдкрдиреЗ *path operation functions* рдХреЛ `async def` рдХреЗ рд╕рд╛рде declare рдХрд░реЗрдВ, рдЬреИрд╕реЗ:
|
||||
|
||||
```Python hl_lines="2"
|
||||
@app.get('/')
|
||||
async def read_results():
|
||||
results = await some_library()
|
||||
return results
|
||||
```
|
||||
|
||||
/// note | рдиреЛрдЯ
|
||||
|
||||
рдЖрдк `await` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ `async def` рдХреЗ рд╕рд╛рде рдмрдирд╛рдП рдЧрдП functions рдХреЗ рдЕрдВрджрд░ рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
///
|
||||
|
||||
---
|
||||
|
||||
рдЕрдЧрд░ рдЖрдк рдРрд╕реА third party library рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ (database, API, file system, рдЖрджрд┐) рд╕реЗ communicate рдХрд░рддреА рд╣реИ рдФрд░ `await` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ support рдирд╣реАрдВ рд░рдЦрддреА, (рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ database libraries рдХреЗ рд╕рд╛рде рдпрд╣реА рд╕реНрдерд┐рддрд┐ рд╣реИ), рддреЛ рдЕрдкрдиреЗ *path operation functions* рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рдХреЗрд╡рд▓ `def` рдХреЗ рд╕рд╛рде declare рдХрд░реЗрдВ, рдЬреИрд╕реЗ:
|
||||
|
||||
```Python hl_lines="2"
|
||||
@app.get('/')
|
||||
def results():
|
||||
results = some_library()
|
||||
return results
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
рдЕрдЧрд░ рдЖрдкрдХреЗ application рдХреЛ (рдХрд┐рд╕реА рддрд░рд╣) рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рд╕реЗ communicate рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХреЗ response рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рддреЛ `async def` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рднрд▓реЗ рд╣реА рдЖрдкрдХреЛ рдЕрдВрджрд░ `await` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рди рд╣реЛред
|
||||
|
||||
---
|
||||
|
||||
рдЕрдЧрд░ рдЖрдкрдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕рд╛рдорд╛рдиреНрдп `def` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
|
||||
|
||||
---
|
||||
|
||||
**рдиреЛрдЯ**: рдЖрдк рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдкрдиреЗ *path operation functions* рдореЗрдВ `def` рдФрд░ `async def` рдХреЛ mix рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рд░ рдПрдХ рдХреЛ рдЕрдкрдиреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ option рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ define рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред FastAPI рдЙрдирдХреЗ рд╕рд╛рде рд╕рд╣реА рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
|
||||
|
||||
рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдКрдкрд░ рджрд┐рдП рдЧрдП рдХрд┐рд╕реА рднреА case рдореЗрдВ, FastAPI рдлрд┐рд░ рднреА asynchronously рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдФрд░ рдмреЗрд╣рдж рддреЗрдЬрд╝ рд╣реЛрдЧрд╛ред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдКрдкрд░ рджрд┐рдП рдЧрдП steps рдХреЛ follow рдХрд░рдиреЗ рд╕реЗ, рдпрд╣ рдХреБрдЫ performance optimizations рдХрд░ рдкрд╛рдПрдЧрд╛ред
|
||||
|
||||
## рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг { #technical-details }
|
||||
|
||||
Python рдХреЗ рдЖрдзреБрдирд┐рдХ versions **"asynchronous code"** рдХрд╛ support рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ **"coroutines"** рдирд╛рдо рдХреА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, **`async` рдФрд░ `await`** syntax рдХреЗ рд╕рд╛рдеред
|
||||
|
||||
рдЖрдЗрдП рдиреАрдЪреЗ рдХреЗ sections рдореЗрдВ рдЗрд╕ phrase рдХреЛ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ:
|
||||
|
||||
* **Asynchronous Code**
|
||||
* **`async` рдФрд░ `await`**
|
||||
* **Coroutines**
|
||||
|
||||
## Asynchronous Code { #asynchronous-code }
|
||||
|
||||
Asynchronous code рдХрд╛ рдорддрд▓рдм рдмрд╕ рдпрд╣ рд╣реИ рдХрд┐ language ЁЯТм рдХреЗ рдкрд╛рд╕ computer / program ЁЯдЦ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ code рдореЗрдВ рдХрд┐рд╕реА point рдкрд░, рдЙрд╕реЗ ЁЯдЦ рдХрд╣реАрдВ рдФрд░ *рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝* рдХреЗ finish рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЙрд╕ *рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝* рдХреЛ "slow-file" ЁЯУЭ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
|
||||
|
||||
рддреЛ, рдЙрд╕ рд╕рдордп рдХреЗ рджреМрд░рд╛рди, computer рдХреЛрдИ рдФрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ "slow-file" ЁЯУЭ finish рд╣реЛ рд░рд╣реА рд╣реЛрддреА рд╣реИред
|
||||
|
||||
рдлрд┐рд░ computer / program ЁЯдЦ рд╣рд░ рдмрд╛рд░ рд╡рд╛рдкрд╕ рдЖрдПрдЧрд╛ рдЬрдм рдЙрд╕реЗ рдореМрдХрд╛ рдорд┐рд▓реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдлрд┐рд░ рд╕реЗ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реЛрдЧрд╛, рдпрд╛ рдЬрдм рднреА рд╡рд╣ ЁЯдЦ рдЙрд╕ point рдкрд░ рдЕрдкрдирд╛ рд╕рд╛рд░рд╛ рдХрд╛рдо finish рдХрд░ рд▓реЗрдЧрд╛ред рдФрд░ рд╡рд╣ ЁЯдЦ рджреЗрдЦреЗрдЧрд╛ рдХрд┐ рдЬрд┐рди tasks рдХрд╛ рд╡рд╣ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛, рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рдкрд╣рд▓реЗ рд╣реА finish рд╣реЛ рдЪреБрдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдлрд┐рд░ рд╡рд╣ рдЬреЛ рднреА рдХрд░рдирд╛ рдерд╛ рдХрд░реЗрдЧрд╛ред
|
||||
|
||||
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╡рд╣ ЁЯдЦ finish рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ task рд▓реЗрддрд╛ рд╣реИ (рдорд╛рди рд▓реЗрдВ, рд╣рдорд╛рд░реА "slow-file" ЁЯУЭ) рдФрд░ рдЙрд╕рдХреЗ рд╕рд╛рде рдЬреЛ рднреА рдХрд░рдирд╛ рдерд╛ рдЙрд╕реЗ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред
|
||||
|
||||
рд╡рд╣ "рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░" рдЖрдо рддреМрд░ рдкрд░ <abbr title="Input and Output - рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ">I/O</abbr> operations рдХреЛ refer рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд "slow" рд╣реЛрддреЗ рд╣реИрдВ (processor рдФрд░ RAM memory рдХреА speed рдХреА рддреБрд▓рдирд╛ рдореЗрдВ), рдЬреИрд╕реЗ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рдирд╛:
|
||||
|
||||
* client рд╕реЗ data network рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рдХрд╛
|
||||
* рдЖрдкрдХреЗ program рджреНрд╡рд╛рд░рд╛ рднреЗрдЬрд╛ рдЧрдпрд╛ data client рджреНрд╡рд╛рд░рд╛ network рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ receive рдХрд┐рдП рдЬрд╛рдиреЗ рдХрд╛
|
||||
* disk рдкрд░ рдХрд┐рд╕реА file рдХреА contents system рджреНрд╡рд╛рд░рд╛ рдкрдврд╝реЗ рдЬрд╛рдиреЗ рдФрд░ рдЖрдкрдХреЗ program рдХреЛ рджрд┐рдП рдЬрд╛рдиреЗ рдХрд╛
|
||||
* рдЖрдкрдХреЗ program рджреНрд╡рд╛рд░рд╛ system рдХреЛ рджреА рдЧрдИ contents disk рдкрд░ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХрд╛
|
||||
* рдХрд┐рд╕реА remote API operation рдХрд╛
|
||||
* рдХрд┐рд╕реА database operation рдХреЗ finish рд╣реЛрдиреЗ рдХрд╛
|
||||
* рдХрд┐рд╕реА database query рджреНрд╡рд╛рд░рд╛ results return рдХрд┐рдП рдЬрд╛рдиреЗ рдХрд╛
|
||||
* рдЖрджрд┐ред
|
||||
|
||||
рдХреНрдпреЛрдВрдХрд┐ execution time рдЬрд╝реНрдпрд╛рджрд╛рддрд░ <abbr title="Input and Output - рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ">I/O</abbr> operations рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рдиреЗ рдореЗрдВ consume рд╣реЛрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ "I/O bound" operations рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
|
||||
|
||||
рдЗрд╕реЗ "asynchronous" рдЗрд╕рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ computer / program рдХреЛ slow task рдХреЗ рд╕рд╛рде "synchronized" рд╣реЛрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреА, task рдХреЗ finish рд╣реЛрдиреЗ рдХреЗ exact moment рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рдХреБрдЫ рднреА рди рдХрд░рддреЗ рд╣реБрдП, рддрд╛рдХрд┐ рд╡рд╣ task result рд▓реЗ рд╕рдХреЗ рдФрд░ рдХрд╛рдо рдЬрд╛рд░реА рд░рдЦ рд╕рдХреЗред
|
||||
|
||||
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, "asynchronous" system рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, task finish рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, computer / program рдХреЗ рд╡рд╛рдкрд╕ рдЖрдиреЗ рддрдХ рдереЛрдбрд╝рд╛ рд╕рд╛ line рдореЗрдВ wait рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдХреБрдЫ microseconds), рддрд╛рдХрд┐ computer / program рдЬреЛ рдХрд╛рдо рдХрд░рдиреЗ рдЧрдпрд╛ рдерд╛ рдЙрд╕реЗ finish рдХрд░реЗ, рдФрд░ рдлрд┐рд░ рд╡рд╛рдкрд╕ рдЖрдХрд░ results рд▓реЗ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдЬрд╛рд░реА рд░рдЦреЗред
|
||||
|
||||
"Synchronous" ("asynchronous" рдХреЗ рд╡рд┐рдкрд░реАрдд) рдХреЗ рд▓рд┐рдП рд╡реЗ рдЖрдорддреМрд░ рдкрд░ "sequential" term рднреА use рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ computer / program рдХрд┐рд╕реА рдЕрд▓рдЧ task рдкрд░ switch рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ sequence рдореЗрдВ рд╕рднреА steps follow рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЙрди steps рдореЗрдВ рдЗрдВрддрдЬрд╝рд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реЛред
|
||||
|
||||
### Concurrency рдФрд░ Burgers { #concurrency-and-burgers }
|
||||
|
||||
рдКрдкрд░ describe рдХрд┐рдП рдЧрдП **asynchronous** code рдХреЗ рдЗрд╕ idea рдХреЛ рдХрднреА-рдХрднреА **"concurrency"** рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ **"parallelism"** рд╕реЗ рдЕрд▓рдЧ рд╣реИред
|
||||
|
||||
**Concurrency** рдФрд░ **parallelism** рджреЛрдиреЛрдВ "рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬрд╝реЗрдВ рд▓рдЧрднрдЧ рдПрдХ рд╣реА рд╕рдордп рдкрд░ рд╣реЛ рд░рд╣реА рд╣реИрдВ" рд╕реЗ related рд╣реИрдВред
|
||||
|
||||
рд▓реЗрдХрд┐рди *concurrency* рдФрд░ *parallelism* рдХреЗ рдмреАрдЪ рдХреЗ details рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИрдВред
|
||||
|
||||
рдЕрдВрддрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, burgers рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рдореНрди story imagine рдХрд░реЗрдВ:
|
||||
|
||||
### Concurrent Burgers { #concurrent-burgers }
|
||||
|
||||
рдЖрдк рдЕрдкрдиреА crush рдХреЗ рд╕рд╛рде fast food рд▓реЗрдиреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЖрдк line рдореЗрдВ рдЦрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ cashier рдЖрдкрдХреЗ рдЖрдЧреЗ рдХреЗ рд▓реЛрдЧреЛрдВ рд╕реЗ orders рд▓реЗ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИред ЁЯШН
|
||||
|
||||
<img src="/img/async/concurrent-burgers/concurrent-burgers-01.png" class="illustration">
|
||||
|
||||
рдлрд┐рд░ рдЖрдкрдХреА рдмрд╛рд░реА рдЖрддреА рд╣реИ, рдЖрдк рдЕрдкрдиреА crush рдФрд░ рдЕрдкрдиреЗ рд▓рд┐рдП 2 рдмрд╣реБрдд fancy burgers рдХрд╛ order рджреЗрддреЗ рд╣реИрдВред ЁЯНФЁЯНФ
|
||||
|
||||
<img src="/img/async/concurrent-burgers/concurrent-burgers-02.png" class="illustration">
|
||||
|
||||
Cashier kitchen рдореЗрдВ cook рд╕реЗ рдХреБрдЫ рдХрд╣рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкрддрд╛ рд╣реЛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЖрдкрдХреЗ burgers prepare рдХрд░рдиреЗ рд╣реИрдВ (рднрд▓реЗ рд╣реА рд╡реЗ currently previous clients рдХреЗ burgers prepare рдХрд░ рд░рд╣реЗ рд╣реЛрдВ)ред
|
||||
|
||||
<img src="/img/async/concurrent-burgers/concurrent-burgers-03.png" class="illustration">
|
||||
|
||||
рдЖрдк pay рдХрд░рддреЗ рд╣реИрдВред ЁЯТ╕
|
||||
|
||||
Cashier рдЖрдкрдХреЛ рдЖрдкрдХреА turn рдХрд╛ number рджреЗрддрд╛ рд╣реИред
|
||||
|
||||
<img src="/img/async/concurrent-burgers/concurrent-burgers-04.png" class="illustration">
|
||||
|
||||
рдЬрдм рдЖрдк wait рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЖрдк рдЕрдкрдиреА crush рдХреЗ рд╕рд╛рде рдПрдХ table рдЪреБрдирддреЗ рд╣реИрдВ, рдмреИрдарддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреА crush рд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ burgers рдмрд╣реБрдд fancy рд╣реИрдВ рдФрд░ prepare рд╣реЛрдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓реЗрддреЗ рд╣реИрдВ)ред
|
||||
|
||||
рдЬрдм рдЖрдк рдЕрдкрдиреА crush рдХреЗ рд╕рд╛рде table рдкрд░ рдмреИрдареЗ рд╣реЛрддреЗ рд╣реИрдВ, burgers рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдЙрд╕ рд╕рдордп рдХреЛ рдпрд╣ admire рдХрд░рдиреЗ рдореЗрдВ spend рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреА crush рдХрд┐рддрдиреА awesome, cute рдФрд░ smart рд╣реИ тЬиЁЯШНтЬиред
|
||||
|
||||
<img src="/img/async/concurrent-burgers/concurrent-burgers-05.png" class="illustration">
|
||||
|
||||
Wait рдХрд░рддреЗ рд╣реБрдП рдФрд░ рдЕрдкрдиреА crush рд╕реЗ рдмрд╛рдд рдХрд░рддреЗ рд╣реБрдП, time to time, рдЖрдк counter рдкрд░ displayed number check рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреА turn рдЖ рдЧрдИ рд╣реИред
|
||||
|
||||
рдлрд┐рд░ рдХрд┐рд╕реА point рдкрд░, рдЖрдЦрд┐рд░рдХрд╛рд░ рдЖрдкрдХреА turn рдЖ рдЬрд╛рддреА рд╣реИред рдЖрдк counter рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрдкрдиреЗ burgers рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ table рдкрд░ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВред
|
||||
|
||||
<img src="/img/async/concurrent-burgers/concurrent-burgers-06.png" class="illustration">
|
||||
|
||||
рдЖрдк рдФрд░ рдЖрдкрдХреА crush burgers рдЦрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдЪреНрдЫрд╛ рд╕рдордп рдмрд┐рддрд╛рддреЗ рд╣реИрдВред тЬи
|
||||
|
||||
<img src="/img/async/concurrent-burgers/concurrent-burgers-07.png" class="illustration">
|
||||
|
||||
/// note | рдиреЛрдЯ
|
||||
|
||||
рд╕реБрдВрджрд░ illustrations [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot) рджреНрд╡рд╛рд░рд╛ред ЁЯОи
|
||||
|
||||
///
|
||||
|
||||
---
|
||||
|
||||
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЙрд╕ story рдореЗрдВ рдЖрдк computer / program ЁЯдЦ рд╣реИрдВред
|
||||
|
||||
рдЬрдм рдЖрдк line рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЖрдк рдмрд╕ idle ЁЯШ┤ рд╣реЛрддреЗ рд╣реИрдВ, рдЕрдкрдиреА turn рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рдХреБрдЫ рдмрд╣реБрдд "productive" рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗред рд▓реЗрдХрд┐рди line fast рд╣реИ рдХреНрдпреЛрдВрдХрд┐ cashier рдХреЗрд╡рд▓ orders рд▓реЗ рд░рд╣рд╛ рд╣реИ (рдЙрдиреНрд╣реЗрдВ prepare рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛), рдЗрд╕рд▓рд┐рдП рдпрд╣ рдареАрдХ рд╣реИред
|
||||
|
||||
рдлрд┐рд░, рдЬрдм рдЖрдкрдХреА turn рдЖрддреА рд╣реИ, рдЖрдк actual "productive" work рдХрд░рддреЗ рд╣реИрдВ, menu process рдХрд░рддреЗ рд╣реИрдВ, decide рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдкрдиреА crush рдХреА choice рд▓реЗрддреЗ рд╣реИрдВ, pay рдХрд░рддреЗ рд╣реИрдВ, check рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк correct bill рдпрд╛ card рджреЗ рд░рд╣реЗ рд╣реИрдВ, check рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрд╕реЗ рд╕рд╣реА charge рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, check рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ order рдореЗрдВ correct items рд╣реИрдВ, рдЖрджрд┐ред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдлрд┐рд░, рднрд▓реЗ рд╣реА рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА burgers рдирд╣реАрдВ рд╣реИрдВ, cashier рдХреЗ рд╕рд╛рде рдЖрдкрдХрд╛ work "on pause" тП╕ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ burgers ready рд╣реЛрдиреЗ рдХрд╛ wait ЁЯХЩ рдХрд░рдирд╛ рд╣реИред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк counter рд╕реЗ рджреВрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреА turn рдХреЗ number рдХреЗ рд╕рд╛рде table рдкрд░ рдмреИрдарддреЗ рд╣реИрдВ, рдЖрдк рдЕрдкрдирд╛ attention рдЕрдкрдиреА crush рдкрд░ switch ЁЯФА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕ рдкрд░ "work" тПп ЁЯдУ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рдЖрдк рджреЛрдмрд╛рд░рд╛ рдХреБрдЫ рдмрд╣реБрдд "productive" рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдЕрдкрдиреА crush ЁЯШН рдХреЗ рд╕рд╛рде flirtingред
|
||||
|
||||
рдлрд┐рд░ cashier ЁЯТБ counter рдХреЗ display рдкрд░ рдЖрдкрдХрд╛ number рдбрд╛рд▓рдХрд░ рдХрд╣рддрд╛ рд╣реИ "рдореИрдВрдиреЗ burgers рдмрдирд╛ рд▓рд┐рдП рд╣реИрдВ", рд▓реЗрдХрд┐рди displayed number рдЖрдкрдХреА turn number рдореЗрдВ рдмрджрд▓рддреЗ рд╣реА рдЖрдк рддреБрд░рдВрдд рдкрд╛рдЧрд▓реЛрдВ рдХреА рддрд░рд╣ jump рдирд╣реАрдВ рдХрд░рддреЗред рдЖрдкрдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдЖрдкрдХреЗ burgers рдирд╣реАрдВ рдЪреБрд░рд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрдкрдХреА turn рдХрд╛ number рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдЙрдирдХрд╛ред
|
||||
|
||||
рддреЛ рдЖрдк рдЕрдкрдиреА crush рдХреЗ story finish рдХрд░рдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ (current work тПп / process рд╣реЛ рд░рд╣рд╛ task ЁЯдУ finish рд╣реЛрдирд╛), gentle smile рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк burgers рд▓реЗрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ тП╕ред
|
||||
|
||||
рдлрд┐рд░ рдЖрдк counter ЁЯФА рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрд╕ initial task рдкрд░ рдЬреЛ рдЕрдм finish рд╣реЛ рдЪреБрдХрд╛ рд╣реИ тПп, burgers рдЙрдард╛рддреЗ рд╣реИрдВ, thanks рдХрд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ table рдкрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ counter рдХреЗ рд╕рд╛рде interaction рдХрд╛ рд╡рд╣ step / task finish рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ тП╣ред рдпрд╣ рдмрджрд▓реЗ рдореЗрдВ, "eating burgers" ЁЯФА тПп рдХрд╛ рдПрдХ рдирдпрд╛ task create рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди "getting burgers" рд╡рд╛рд▓рд╛ previous task finish рд╣реЛ рдЪреБрдХрд╛ рд╣реИ тП╣ред
|
||||
|
||||
### Parallel Burgers { #parallel-burgers }
|
||||
|
||||
рдЕрдм imagine рдХрд░реЗрдВ рдХрд┐ рдпреЗ "Concurrent Burgers" рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ "Parallel Burgers" рд╣реИрдВред
|
||||
|
||||
рдЖрдк рдЕрдкрдиреА crush рдХреЗ рд╕рд╛рде parallel fast food рд▓реЗрдиреЗ рдЬрд╛рддреЗ рд╣реИрдВред
|
||||
|
||||
рдЖрдк line рдореЗрдВ рдЦрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рдХрдИ (рдорд╛рди рд▓реЗрдВ 8) cashiers, рдЬреЛ рдЙрд╕реА рд╕рдордп cooks рднреА рд╣реИрдВ, рдЖрдкрдХреЗ рдЖрдЧреЗ рдХреЗ рд▓реЛрдЧреЛрдВ рд╕реЗ orders рд▓реЗ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВред
|
||||
|
||||
рдЖрдкрд╕реЗ рдкрд╣рд▓реЗ рд╣рд░ рдХреЛрдИ counter рдЫреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ burgers ready рд╣реЛрдиреЗ рдХрд╛ wait рдХрд░ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ 8 cashiers рдореЗрдВ рд╕реЗ рд╣рд░ рдПрдХ next order рд▓реЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рддреБрд░рдВрдд рдЬрд╛рдХрд░ burger prepare рдХрд░рддрд╛ рд╣реИред
|
||||
|
||||
<img src="/img/async/parallel-burgers/parallel-burgers-01.png" class="illustration">
|
||||
|
||||
рдлрд┐рд░ рдЖрдЦрд┐рд░рдХрд╛рд░ рдЖрдкрдХреА turn рдЖрддреА рд╣реИ, рдЖрдк рдЕрдкрдиреА crush рдФрд░ рдЕрдкрдиреЗ рд▓рд┐рдП 2 рдмрд╣реБрдд fancy burgers рдХрд╛ order рджреЗрддреЗ рд╣реИрдВред
|
||||
|
||||
рдЖрдк pay рдХрд░рддреЗ рд╣реИрдВ ЁЯТ╕ред
|
||||
|
||||
<img src="/img/async/parallel-burgers/parallel-burgers-02.png" class="illustration">
|
||||
|
||||
Cashier kitchen рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред
|
||||
|
||||
рдЖрдк counter ЁЯХЩ рдХреЗ рд╕рд╛рдордиреЗ рдЦрдбрд╝реЗ рд╣реЛрдХрд░ wait рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЖрдкрд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдИ рдФрд░ рдЖрдкрдХреЗ burgers рди рд▓реЗ рдЬрд╛рдП, рдХреНрдпреЛрдВрдХрд┐ turns рдХреЗ рд▓рд┐рдП рдХреЛрдИ numbers рдирд╣реАрдВ рд╣реИрдВред
|
||||
|
||||
<img src="/img/async/parallel-burgers/parallel-burgers-03.png" class="illustration">
|
||||
|
||||
рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдФрд░ рдЖрдкрдХреА crush рдЗрд╕ рдмрд╛рдд рдореЗрдВ busy рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдЖрдкрдХреЗ рдЖрдЧреЗ рди рдЖ рдЬрд╛рдП рдФрд░ рдЖрдкрдХреЗ burgers рдЖрддреЗ рд╣реА рдЙрдиреНрд╣реЗрдВ рди рд▓реЗ рдЬрд╛рдП, рдЖрдк рдЕрдкрдиреА crush рдкрд░ attention рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред ЁЯШЮ
|
||||
|
||||
рдпрд╣ "synchronous" work рд╣реИ, рдЖрдк cashier/cook ЁЯСитАНЁЯН│ рдХреЗ рд╕рд╛рде "synchronized" рд╣реИрдВред рдЖрдкрдХреЛ wait ЁЯХЩ рдХрд░рдирд╛ рд╣реИ рдФрд░ exact moment рдкрд░ рд╡рд╣рд╛рдБ рд╣реЛрдирд╛ рд╣реИ рдЬрдм cashier/cook ЁЯСитАНЁЯН│ burgers finish рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рджреЗрддрд╛ рд╣реИ, рдирд╣реАрдВ рддреЛ рдХреЛрдИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред
|
||||
|
||||
<img src="/img/async/parallel-burgers/parallel-burgers-04.png" class="illustration">
|
||||
|
||||
рдлрд┐рд░ рдЖрдкрдХрд╛ cashier/cook ЁЯСитАНЁЯН│ рд▓рдВрдмреЗ рд╕рдордп рддрдХ counter рдХреЗ рд╕рд╛рдордиреЗ wait ЁЯХЩ рдХрд░рд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдЦрд┐рд░рдХрд╛рд░ рдЖрдкрдХреЗ burgers рд▓реЗрдХрд░ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИред
|
||||
|
||||
<img src="/img/async/parallel-burgers/parallel-burgers-05.png" class="illustration">
|
||||
|
||||
рдЖрдк рдЕрдкрдиреЗ burgers рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреА crush рдХреЗ рд╕рд╛рде table рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред
|
||||
|
||||
рдЖрдк рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдЦрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХрд╛ рдХрд╛рдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред тП╣
|
||||
|
||||
<img src="/img/async/parallel-burgers/parallel-burgers-06.png" class="illustration">
|
||||
|
||||
рдЬрд╝реНрдпрд╛рджрд╛ рдмрд╛рдд рдпрд╛ flirting рдирд╣реАрдВ рд╣реБрдИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрддрд░ рд╕рдордп counter рдХреЗ рд╕рд╛рдордиреЗ wait ЁЯХЩ рдХрд░рдиреЗ рдореЗрдВ spend рд╣реБрдЖред ЁЯШЮ
|
||||
|
||||
/// note | рдиреЛрдЯ
|
||||
|
||||
рд╕реБрдВрджрд░ illustrations [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot) рджреНрд╡рд╛рд░рд╛ред ЁЯОи
|
||||
|
||||
///
|
||||
|
||||
---
|
||||
|
||||
Parallel burgers рдХреЗ рдЗрд╕ scenario рдореЗрдВ, рдЖрдк рдПрдХ computer / program ЁЯдЦ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рджреЛ processors рд╣реИрдВ (рдЖрдк рдФрд░ рдЖрдкрдХреА crush), рджреЛрдиреЛрдВ wait ЁЯХЩ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ "counter рдкрд░ waiting" ЁЯХЩ рдореЗрдВ рдЕрдкрдирд╛ attention тПп dedicate рдХрд░ рд░рд╣реЗ рд╣реИрдВред
|
||||
|
||||
Fast food store рдореЗрдВ 8 processors (cashiers/cooks) рд╣реИрдВред рдЬрдмрдХрд┐ concurrent burgers store рдореЗрдВ рд╢рд╛рдпрдж рдХреЗрд╡рд▓ 2 (рдПрдХ cashier рдФрд░ рдПрдХ cook) рд░рд╣реЗ рд╣реЛрдВрдЧреЗред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, final experience рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред ЁЯШЮ
|
||||
|
||||
---
|
||||
|
||||
рдпрд╣ burgers рдХреЗ рд▓рд┐рдП parallel equivalent story рд╣реЛрдЧреАред ЁЯНФ
|
||||
|
||||
рдЗрд╕рдХреЗ рдПрдХ рдФрд░ "real life" example рдХреЗ рд▓рд┐рдП, рдПрдХ bank imagine рдХрд░реЗрдВред
|
||||
|
||||
рд╣рд╛рд▓ рддрдХ, рдЕрдзрд┐рдХрд╛рдВрд╢ banks рдореЗрдВ multiple cashiers ЁЯСитАНЁЯТ╝ЁЯСитАНЁЯТ╝ЁЯСитАНЁЯТ╝ЁЯСитАНЁЯТ╝ рдФрд░ рдПрдХ рдмрдбрд╝реА line ЁЯХЩЁЯХЩЁЯХЩЁЯХЩЁЯХЩЁЯХЩЁЯХЩЁЯХЩ рд╣реЛрддреА рдереАред
|
||||
|
||||
рд╕рднреА cashiers рдПрдХ client рдХреЗ рдмрд╛рдж рджреВрд╕рд░реЗ client рдХреЗ рд╕рд╛рде рд╕рд╛рд░рд╛ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рдереЗ ЁЯСитАНЁЯТ╝тПпред
|
||||
|
||||
рдФрд░ рдЖрдкрдХреЛ line рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ wait ЁЯХЩ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдпрд╛ рдЖрдк рдЕрдкрдиреА turn рдЦреЛ рджреЗрддреЗ рд╣реИрдВред
|
||||
|
||||
рдЖрдк рд╢рд╛рдпрдж рдЕрдкрдиреА crush ЁЯШН рдХреЛ bank ЁЯПж рдореЗрдВ errands рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕рд╛рде рдирд╣реАрдВ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред
|
||||
|
||||
### Burger рдирд┐рд╖реНрдХрд░реНрд╖ { #burger-conclusion }
|
||||
|
||||
"рдЕрдкрдиреА crush рдХреЗ рд╕рд╛рде fast food burgers" рдХреЗ рдЗрд╕ scenario рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд waiting ЁЯХЩ рд╣реИ, concurrent system тП╕ЁЯФАтПп рд░рдЦрдирд╛ рдХрд╣реАрдВ рдЕрдзрд┐рдХ sensible рд╣реИред
|
||||
|
||||
рдЕрдзрд┐рдХрд╛рдВрд╢ web applications рдХреЗ рд▓рд┐рдП рдпрд╣реА case рд╣реИред
|
||||
|
||||
рдмрд╣реБрдд, рдмрд╣реБрдд рд╕рд╛рд░реЗ users, рд▓реЗрдХрд┐рди рдЖрдкрдХрд╛ server рдЙрдирдХреА not-so-good connection рджреНрд╡рд╛рд░рд╛ рдЙрдирдХреА requests рднреЗрдЬрдиреЗ рдХрд╛ wait ЁЯХЩ рдХрд░ рд░рд╣рд╛ рд╣реИред
|
||||
|
||||
рдФрд░ рдлрд┐рд░ responses рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХрд╛ рдлрд┐рд░ рд╕реЗ wait ЁЯХЩ рдХрд░ рд░рд╣рд╛ рд╣реИред
|
||||
|
||||
рдпрд╣ "waiting" ЁЯХЩ microseconds рдореЗрдВ measure рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рд╕рдмрдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░, рдЕрдВрдд рдореЗрдВ рдХрд╛рдлреА waiting рд╣реЛ рдЬрд╛рддреА рд╣реИред
|
||||
|
||||
рдЗрд╕реАрд▓рд┐рдП web APIs рдХреЗ рд▓рд┐рдП asynchronous тП╕ЁЯФАтПп code use рдХрд░рдирд╛ рдмрд╣реБрдд sensible рд╣реИред
|
||||
|
||||
рдЗрд╕реА рддрд░рд╣ рдХреА asynchronicity рдиреЗ NodeJS рдХреЛ popular рдмрдирд╛рдпрд╛ (рднрд▓реЗ рд╣реА NodeJS parallel рдирд╣реАрдВ рд╣реИ) рдФрд░ рдпрд╣реА Go рдХреА programming language рдХреЗ рд░реВрдк рдореЗрдВ strength рд╣реИред
|
||||
|
||||
рдФрд░ рдпрд╣реА same level рдХреА performance рдЖрдкрдХреЛ **FastAPI** рдХреЗ рд╕рд╛рде рдорд┐рд▓рддреА рд╣реИред
|
||||
|
||||
рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ parallelism рдФрд░ asynchronicity рдПрдХ рд╣реА рд╕рдордп рдкрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ tested NodeJS frameworks рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реЗ higher performance рдорд┐рд▓рддреА рд╣реИ рдФрд░ Go рдХреЗ рдмрд░рд╛рдмрд░, рдЬреЛ C рдХреЗ рдХрд░реАрдм рдПрдХ compiled language рд╣реИ [(рдпрд╣ рд╕рдм Starlette рдХреЗ рдХрд╛рд░рдг)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1)ред
|
||||
|
||||
### рдХреНрдпрд╛ concurrency parallelism рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ? { #is-concurrency-better-than-parallelism }
|
||||
|
||||
рдирд╣реАрдВ! рдпрд╣ story рдХреА moral рдирд╣реАрдВ рд╣реИред
|
||||
|
||||
Concurrency, parallelism рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдФрд░ рдпрд╣ рдЙрди **specific** scenarios рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ рдЬрд┐рдирдореЗрдВ рдмрд╣реБрдд waiting рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИред рдЗрд╕реА рдХрд╛рд░рдг, web application development рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ parallelism рд╕реЗ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИред рд▓реЗрдХрд┐рди рд╣рд░ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред
|
||||
|
||||
рддреЛ, рдЗрд╕реЗ balance рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди short story imagine рдХрд░реЗрдВ:
|
||||
|
||||
> рдЖрдкрдХреЛ рдПрдХ рдмрдбрд╝рд╛, рдЧрдВрджрд╛ house clean рдХрд░рдирд╛ рд╣реИред
|
||||
|
||||
*рд╣рд╛рдБ, рдпрд╣реА рдкреВрд░реА story рд╣реИ*ред
|
||||
|
||||
---
|
||||
|
||||
рдХрд╣реАрдВ рднреА рдХреЛрдИ waiting ЁЯХЩ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдмрд╣реБрдд рд╕рд╛рд░рд╛ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ, house рдХреЗ multiple places рдореЗрдВред
|
||||
|
||||
рдЖрдк burgers example рдХреА рддрд░рд╣ turns рд░рдЦ рд╕рдХрддреЗ рдереЗ, рдкрд╣рд▓реЗ living room, рдлрд┐рд░ kitchen, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ wait ЁЯХЩ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ, рдмрд╕ cleaning and cleaning рдХрд░ рд░рд╣реЗ рд╣реИрдВ, turns рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ affect рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
|
||||
|
||||
Turns (concurrency) рдХреЗ рд╕рд╛рде рдпрд╛ рдмрд┐рдирд╛ finish рдХрд░рдиреЗ рдореЗрдВ рдЙрддрдирд╛ рд╣реА time рд▓рдЧреЗрдЧрд╛ рдФрд░ рдЖрдкрдиреЗ рдЙрддрдирд╛ рд╣реА рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛ред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдЗрд╕ case рдореЗрдВ, рдЕрдЧрд░ рдЖрдк 8 ex-cashier/cooks/now-cleaners рд▓рд╛ рд╕рдХреЗрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рд╣рд░ рдПрдХ (plus рдЖрдк) house рдХрд╛ рдПрдХ zone clean рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗ рд╕рдХреЗ, рддреЛ рдЖрдк extra help рдХреЗ рд╕рд╛рде рд╕рд╛рд░рд╛ рдХрд╛рдо **parallel** рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмрд╣реБрдд рдЬрд▓реНрджреА finish рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
рдЗрд╕ scenario рдореЗрдВ, cleaners рдореЗрдВ рд╕реЗ рд╣рд░ рдПрдХ (рдЖрдк рд╕рд╣рд┐рдд) рдПрдХ processor рд╣реЛрдЧрд╛, job рдХрд╛ рдЕрдкрдирд╛ part рдХрд░ рд░рд╣рд╛ рд╣реЛрдЧрд╛ред
|
||||
|
||||
рдФрд░ рдХреНрдпреЛрдВрдХрд┐ execution time рдХрд╛ рдЕрдзрд┐рдХрддрд░ рд╣рд┐рд╕реНрд╕рд╛ actual work (waiting рдХреЗ рдмрдЬрд╛рдп) рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ computer рдореЗрдВ work <abbr title="Central Processing Unit - рдХреЗрдВрджреНрд░реАрдп рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЗрдХрд╛рдИ">CPU</abbr> рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡реЗ рдЗрди problems рдХреЛ "CPU bound" рдХрд╣рддреЗ рд╣реИрдВред
|
||||
|
||||
---
|
||||
|
||||
CPU bound operations рдХреЗ common examples рдРрд╕реА рдЪреАрдЬрд╝реЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ complex math processing рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИред
|
||||
|
||||
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
|
||||
|
||||
* **Audio** рдпрд╛ **image processing**ред
|
||||
* **Computer vision**: рдПрдХ image millions of pixels рд╕реЗ composed рд╣реЛрддреА рд╣реИ, рд╣рд░ pixel рдореЗрдВ 3 values / colors рд╣реЛрддреЗ рд╣реИрдВ, рдЙрд╕реЗ process рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдо рддреМрд░ рдкрд░ рдЙрди pixels рдкрд░ рдХреБрдЫ compute рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рд╕рдм рдПрдХ рд╣реА рд╕рдордп рдкрд░ред
|
||||
* **Machine Learning**: рдЗрд╕рдореЗрдВ рдЖрдо рддреМрд░ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ "matrix" рдФрд░ "vector" multiplications рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИред Numbers рд╡рд╛рд▓реА рдПрдХ huge spreadsheet рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдФрд░ рдЙрди рд╕рднреА рдХреЛ рдПрдХ рд╣реА рд╕рдордп рдкрд░ multiply рдХрд░рдирд╛ред
|
||||
* **Deep Learning**: рдпрд╣ Machine Learning рдХрд╛ sub-field рд╣реИ, рдЗрд╕рд▓рд┐рдП, рд╡рд╣реА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдмрд╕ рдЗрддрдирд╛ рд╣реИ рдХрд┐ multiply рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП numbers рдХреА рдПрдХ single spreadsheet рдирд╣реАрдВ рд╣реЛрддреА, рдмрд▓реНрдХрд┐ рдЙрдирдХрд╛ huge set рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдХрдИ cases рдореЗрдВ, рдЖрдк рдЙрди models рдХреЛ build рдФрд░ / рдпрд╛ use рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ special processor рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
|
||||
|
||||
### Concurrency + Parallelism: Web + Machine Learning { #concurrency-parallelism-web-machine-learning }
|
||||
|
||||
**FastAPI** рдХреЗ рд╕рд╛рде рдЖрдк concurrency рдХрд╛ advantage рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ web development рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд common рд╣реИ (NodeJS рдХрд╛ рд╡рд╣реА main attraction)ред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдЖрдк Machine Learning systems рдЬреИрд╕реЗ **CPU bound** workloads рдХреЗ рд▓рд┐рдП parallelism рдФрд░ multiprocessing (multiple processes parallel рдореЗрдВ рдЪрд▓рд╛рдирд╛) рдХреЗ benefits рдХрд╛ рднреА exploit рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
рд╡рд╣, рд╕рд╛рде рд╣реА рдпрд╣ simple fact рдХрд┐ Python **Data Science**, Machine Learning рдФрд░ рдЦрд╛рд╕рдХрд░ Deep Learning рдХреА main language рд╣реИ, FastAPI рдХреЛ Data Science / Machine Learning web APIs рдФрд░ applications (рдХрдИ рдЕрдиреНрдп рдХреЗ рдмреАрдЪ) рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ match рдмрдирд╛рддрд╛ рд╣реИред
|
||||
|
||||
Production рдореЗрдВ рдЗрд╕ parallelism рдХреЛ рдХреИрд╕реЗ achieve рдХрд░реЗрдВ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП [Deployment](deployment/index.md) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ section рджреЗрдЦреЗрдВред
|
||||
|
||||
## `async` рдФрд░ `await` { #async-and-await }
|
||||
|
||||
Python рдХреЗ рдЖрдзреБрдирд┐рдХ versions рдореЗрдВ asynchronous code define рдХрд░рдиреЗ рдХрд╛ рдмрд╣реБрдд intuitive рддрд░реАрдХрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп "sequential" code рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рд╕рд╣реА moments рдкрд░ рдЖрдкрдХреЗ рд▓рд┐рдП "awaiting" рдХрд░рддрд╛ рд╣реИред
|
||||
|
||||
рдЬрдм рдХреЛрдИ operation results рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ waiting require рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрди рдирдП Python features рдХрд╛ support рд░рдЦрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЙрд╕реЗ рдРрд╕реЗ code рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
|
||||
|
||||
```Python
|
||||
burgers = await get_burgers(2)
|
||||
```
|
||||
|
||||
рдпрд╣рд╛рдБ key `await` рд╣реИред рдпрд╣ Python рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ `burgers` рдореЗрдВ results store рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрд╕реЗ `get_burgers(2)` рдХреЗ рдЕрдкрдирд╛ рдХрд╛рдо ЁЯХЩ finish рдХрд░рдиреЗ рдХрд╛ wait тП╕ рдХрд░рдирд╛ рд╣реИред рдЗрд╕рд╕реЗ, Python рдЬрд╛рди рдЬрд╛рдПрдЧрд╛ рдХрд┐ рд╡рд╣ meanwhile рдХреБрдЫ рдФрд░ ЁЯФА тПп рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЬреИрд╕реЗ рдХреЛрдИ рджреВрд╕рд░реА request receive рдХрд░рдирд╛)ред
|
||||
|
||||
`await` рдХреЗ work рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдРрд╕реЗ function рдХреЗ рдЕрдВрджрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрд╕ asynchronicity рдХреЛ support рдХрд░рддрд╛ рд╣реЛред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдмрд╕ рдЗрд╕реЗ `async def` рдХреЗ рд╕рд╛рде declare рдХрд░рддреЗ рд╣реИрдВ:
|
||||
|
||||
```Python hl_lines="1"
|
||||
async def get_burgers(number: int):
|
||||
# Burgers рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ asynchronous рдХрд╛рдо рдХрд░реЗрдВ
|
||||
return burgers
|
||||
```
|
||||
|
||||
...`def` рдХреЗ рдмрдЬрд╛рдп:
|
||||
|
||||
```Python hl_lines="2"
|
||||
# рдпрд╣ asynchronous рдирд╣реАрдВ рд╣реИ
|
||||
def get_sequential_burgers(number: int):
|
||||
# Burgers рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ sequential рдХрд╛рдо рдХрд░реЗрдВ
|
||||
return burgers
|
||||
```
|
||||
|
||||
`async def` рдХреЗ рд╕рд╛рде, Python рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЙрд╕ function рдХреЗ рдЕрдВрджрд░ рдЙрд╕реЗ `await` expressions рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ aware рд░рд╣рдирд╛ рд╣реИ, рдФрд░ рд╡рд╣ рдЙрд╕ function рдХреЗ execution рдХреЛ "pause" тП╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд╛рдкрд╕ рдЖрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреБрдЫ рдФрд░ ЁЯФА рдХрд░ рд╕рдХрддрд╛ рд╣реИред
|
||||
|
||||
рдЬрдм рдЖрдк рдХрд┐рд╕реА `async def` function рдХреЛ call рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрд╕реЗ "await" рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:
|
||||
|
||||
```Python
|
||||
# рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ get_burgers рдХреЛ async def рдХреЗ рд╕рд╛рде define рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
|
||||
burgers = get_burgers(2)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
рддреЛ, рдЕрдЧрд░ рдЖрдк рдХреЛрдИ library use рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рдЖрдк рдЙрд╕реЗ `await` рдХреЗ рд╕рд╛рде call рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ *path operation functions* рдХреЛ `async def` рдХреЗ рд╕рд╛рде create рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ:
|
||||
|
||||
```Python hl_lines="2-3"
|
||||
@app.get('/burgers')
|
||||
async def read_burgers():
|
||||
burgers = await get_burgers(2)
|
||||
return burgers
|
||||
```
|
||||
|
||||
### рдЕрдзрд┐рдХ рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг { #more-technical-details }
|
||||
|
||||
рдЖрдкрдиреЗ notice рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛ рдХрд┐ `await` рдХреЗрд╡рд▓ `async def` рдХреЗ рд╕рд╛рде defined functions рдХреЗ рдЕрдВрджрд░ рд╣реА use рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдЙрд╕реА рд╕рдордп, `async def` рдХреЗ рд╕рд╛рде defined functions рдХреЛ "awaited" рд╣реЛрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, `async def` рд╡рд╛рд▓реЗ functions рдХреЗрд╡рд▓ `async def` рдХреЗ рд╕рд╛рде defined functions рдХреЗ рдЕрдВрджрд░ рд╣реА call рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
рддреЛ, egg рдФрд░ chicken рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЖрдк first `async` function рдХреЛ рдХреИрд╕реЗ call рдХрд░рддреЗ рд╣реИрдВ?
|
||||
|
||||
рдЕрдЧрд░ рдЖрдк **FastAPI** рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ "first" function рдЖрдкрдХрд╛ *path operation function* рд╣реЛрдЧрд╛, рдФрд░ FastAPI рдЬрд╛рдирддрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рд╣реА рдХрд╛рдо рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк FastAPI рдХреЗ рдмрд┐рдирд╛ `async` / `await` use рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдРрд╕рд╛ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
### рдЕрдкрдирд╛ async code рд▓рд┐рдЦреЗрдВ { #write-your-own-async-code }
|
||||
|
||||
Starlette (рдФрд░ **FastAPI**) [AnyIO](https://anyio.readthedocs.io/en/stable/) рдкрд░ based рд╣реИрдВ, рдЬреЛ рдЗрд╕реЗ Python рдХреА standard library [asyncio](https://docs.python.org/3/library/asyncio-task.html) рдФрд░ [Trio](https://trio.readthedocs.io/en/stable/) рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде compatible рдмрдирд╛рддрд╛ рд╣реИред
|
||||
|
||||
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЖрдк рдЕрдкрдиреЗ advanced concurrency use cases рдХреЗ рд▓рд┐рдП рд╕реАрдзреЗ [AnyIO](https://anyio.readthedocs.io/en/stable/) use рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЗ рдЕрдкрдиреЗ code рдореЗрдВ рдЕрдзрд┐рдХ advanced patterns рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИред
|
||||
|
||||
рдФрд░ рднрд▓реЗ рд╣реА рдЖрдк FastAPI use рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ, рдЖрдк high compatibility рдФрд░ рдЗрд╕рдХреЗ benefits (рдЬреИрд╕реЗ *structured concurrency*) рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП [AnyIO](https://anyio.readthedocs.io/en/stable/) рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ async applications рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
рдореИрдВрдиреЗ AnyIO рдХреЗ рдКрдкрд░ рдПрдХ рдФрд░ library рдмрдирд╛рдИ, рдКрдкрд░ рдПрдХ thin layer рдХреЗ рд░реВрдк рдореЗрдВ, рддрд╛рдХрд┐ type annotations рдХреЛ рдереЛрдбрд╝рд╛ improve рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдмреЗрд╣рддрд░ **autocompletion**, **inline errors**, рдЖрджрд┐ рдорд┐рд▓ рд╕рдХреЗрдВред рдЗрд╕рдореЗрдВ рдПрдХ friendly introduction рдФрд░ tutorial рднреА рд╣реИ рддрд╛рдХрд┐ рдЖрдкрдХреЛ **рд╕рдордЭрдиреЗ** рдФрд░ **рдЕрдкрдирд╛ async code** рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗ: [Asyncer](https://asyncer.tiangolo.com/)ред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ useful рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЖрдкрдХреЛ **async code рдХреЛ regular** (blocking/synchronous) code рдХреЗ рд╕рд╛рде **combine** рдХрд░рдирд╛ рд╣реЛред
|
||||
|
||||
### Asynchronous code рдХреЗ рдЕрдиреНрдп forms { #other-forms-of-asynchronous-code }
|
||||
|
||||
`async` рдФрд░ `await` use рдХрд░рдиреЗ рдХреА рдпрд╣ style language рдореЗрдВ relatively new рд╣реИред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдпрд╣ asynchronous code рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддреА рд╣реИред
|
||||
|
||||
рдпрд╣реА same syntax (рдпрд╛ рд▓рдЧрднрдЧ identical) рд╣рд╛рд▓ рд╣реА рдореЗрдВ JavaScript рдХреЗ modern versions (Browser рдФрд░ NodeJS рдореЗрдВ) рдореЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдЙрд╕рд╕реЗ рдкрд╣рд▓реЗ, asynchronous code handle рдХрд░рдирд╛ рдХрд╣реАрдВ рдЕрдзрд┐рдХ complex рдФрд░ difficult рдерд╛ред
|
||||
|
||||
Python рдХреЗ previous versions рдореЗрдВ, рдЖрдк threads рдпрд╛ [Gevent](https://www.gevent.org/) use рдХрд░ рд╕рдХрддреЗ рдереЗред рд▓реЗрдХрд┐рди code рд╕рдордЭрдиреЗ, debug рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рдЕрдзрд┐рдХ complex рд╣реЛрддрд╛ рд╣реИред
|
||||
|
||||
NodeJS / Browser JavaScript рдХреЗ previous versions рдореЗрдВ, рдЖрдк "callbacks" use рдХрд░рддреЗред рдЬреЛ "callback hell" рддрдХ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред
|
||||
|
||||
## Coroutines { #coroutines }
|
||||
|
||||
**Coroutine** рдмрд╕ рдЙрд╕ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд fancy term рд╣реИ рдЬреЛ рдХрд┐рд╕реА `async def` function рджреНрд╡рд╛рд░рд╛ return рдХреА рдЬрд╛рддреА рд╣реИред Python рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдпрд╣ function рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬрд╝ рд╣реИ, рдЬрд┐рд╕реЗ рд╡рд╣ start рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЬреЛ рдХрд┐рд╕реА point рдкрд░ end рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ internally pause тП╕ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬрдм рднреА рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ `await` рд╣реЛред
|
||||
|
||||
рд▓реЗрдХрд┐рди asynchronous code рдХреЛ `async` рдФрд░ `await` рдХреЗ рд╕рд╛рде use рдХрд░рдиреЗ рдХреА рдпрд╣ рд╕рд╛рд░реА functionality рдХрдИ рдмрд╛рд░ "coroutines" use рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ summarize рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ Go рдХреА main key feature, "Goroutines" рд╕реЗ comparable рд╣реИред
|
||||
|
||||
## рдирд┐рд╖реНрдХрд░реНрд╖ { #conclusion }
|
||||
|
||||
рдЖрдЗрдП рдКрдкрд░ рд╡рд╛рд▓рд╛ рд╡рд╣реА phrase рджреЗрдЦреЗрдВ:
|
||||
|
||||
> Python рдХреЗ рдЖрдзреБрдирд┐рдХ versions **"asynchronous code"** рдХрд╛ support рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ **"coroutines"** рдирд╛рдо рдХреА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, **`async` рдФрд░ `await`** syntax рдХреЗ рд╕рд╛рдеред
|
||||
|
||||
рдЕрдм рдпрд╣ рдЕрдзрд┐рдХ sense рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред тЬи
|
||||
|
||||
рдпрд╣ рд╕рдм FastAPI (Starlette рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдХреЛ power рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЗрддрдиреА impressive performance рджреЗрддрд╛ рд╣реИред
|
||||
|
||||
## рдмрд╣реБрдд рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг { #very-technical-details }
|
||||
|
||||
/// warning | рдЪреЗрддрд╛рд╡рдиреА
|
||||
|
||||
рдЖрдк рд╢рд╛рдпрдж рдЗрд╕реЗ skip рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
рдпреЗ **FastAPI** рдЕрдВрджрд░ рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╣реБрдд technical details рд╣реИрдВред
|
||||
|
||||
рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд╛рдлреА technical knowledge (coroutines, threads, blocking, рдЖрджрд┐) рд╣реИ рдФрд░ рдЖрдк curious рд╣реИрдВ рдХрд┐ FastAPI `async def` рдмрдирд╛рдо normal `def` рдХреЛ рдХреИрд╕реЗ handle рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдЧреЗ рдмрдврд╝реЗрдВред
|
||||
|
||||
///
|
||||
|
||||
### Path operation functions { #path-operation-functions }
|
||||
|
||||
рдЬрдм рдЖрдк рдХрд┐рд╕реА *path operation function* рдХреЛ `async def` рдХреЗ рдмрдЬрд╛рдп normal `def` рдХреЗ рд╕рд╛рде declare рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ directly call рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ server рдХреЛ block рдХрд░реЗрдЧрд╛), рдПрдХ external threadpool рдореЗрдВ run рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдлрд┐рд░ awaited рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
|
||||
|
||||
рдЕрдЧрд░ рдЖрдк рдХрд┐рд╕реА рджреВрд╕рд░реЗ async framework рд╕реЗ рдЖ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдКрдкрд░ described рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдФрд░ рдЖрдк tiny performance gain (рд▓рдЧрднрдЧ 100 nanoseconds) рдХреЗ рд▓рд┐рдП trivial compute-only *path operation functions* рдХреЛ plain `def` рдХреЗ рд╕рд╛рде define рдХрд░рдиреЗ рдХреЗ рдЖрджреА рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ **FastAPI** рдореЗрдВ effect рдмрд┐рд▓реНрдХреБрд▓ рдЙрд▓реНрдЯрд╛ рд╣реЛрдЧрд╛ред рдЗрди cases рдореЗрдВ, `async def` use рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреЗ *path operation functions* рдРрд╕рд╛ code use рди рдХрд░реЗрдВ рдЬреЛ blocking <abbr title="Input/Output - рдЗрдирдкреБрдЯ/рдЖрдЙрдЯрдкреБрдЯ: рдбрд┐рд╕реНрдХ рдкрдврд╝рдирд╛ рдпрд╛ рд▓рд┐рдЦрдирд╛, network communications.">I/O</abbr> perform рдХрд░рддрд╛ рд╣реЛред
|
||||
|
||||
рдлрд┐рд░ рднреА, рджреЛрдиреЛрдВ situations рдореЗрдВ, рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ **FastAPI** рдЖрдкрдХреЗ previous framework рд╕реЗ [рдлрд┐рд░ рднреА рддреЗрдЬрд╝ рд╣реЛрдЧрд╛](index.md#performance) (рдпрд╛ рдХрдо рд╕реЗ рдХрдо comparable рд╣реЛрдЧрд╛)ред
|
||||
|
||||
### Dependencies { #dependencies }
|
||||
|
||||
[Dependencies](tutorial/dependencies/index.md) рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдЕрдЧрд░ рдХреЛрдИ dependency `async def` рдХреЗ рдмрдЬрд╛рдп standard `def` function рд╣реИ, рддреЛ рдЙрд╕реЗ external threadpool рдореЗрдВ run рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
|
||||
|
||||
### Sub-dependencies { #sub-dependencies }
|
||||
|
||||
рдЖрдкрдХреЗ рдкрд╛рд╕ multiple dependencies рдФрд░ [sub-dependencies](tutorial/dependencies/sub-dependencies.md) рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ require рдХрд░рддреА рд╣реИрдВ (function definitions рдХреЗ parameters рдХреЗ рд░реВрдк рдореЗрдВ), рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ `async def` рдХреЗ рд╕рд╛рде created рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдФрд░ рдХреБрдЫ normal `def` рдХреЗ рд╕рд╛рдеред рдпрд╣ рдлрд┐рд░ рднреА work рдХрд░реЗрдЧрд╛, рдФрд░ normal `def` рдХреЗ рд╕рд╛рде created ones рдХреЛ "awaited" рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп external thread (threadpool рд╕реЗ) рдкрд░ call рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
|
||||
|
||||
### рдЕрдиреНрдп utility functions { #other-utility-functions }
|
||||
|
||||
рдХреЛрдИ рднреА рдЕрдиреНрдп utility function рдЬрд┐рд╕реЗ рдЖрдк directly call рдХрд░рддреЗ рд╣реИрдВ, normal `def` рдпрд╛ `async def` рдХреЗ рд╕рд╛рде created рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ FastAPI рдЖрдкрдХреЗ рдЙрд╕реЗ call рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ affect рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
|
||||
|
||||
рдпрд╣ рдЙрди functions рдХреЗ contrast рдореЗрдВ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ FastAPI рдЖрдкрдХреЗ рд▓рд┐рдП call рдХрд░рддрд╛ рд╣реИ: *path operation functions* рдФрд░ dependenciesред
|
||||
|
||||
рдЕрдЧрд░ рдЖрдкрдХрд╛ utility function `def` рд╡рд╛рд▓рд╛ normal function рд╣реИ, рддреЛ рдЙрд╕реЗ directly call рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЬреИрд╕рд╛ рдЖрдк рдЕрдкрдиреЗ code рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ), threadpool рдореЗрдВ рдирд╣реАрдВ; рдЕрдЧрд░ function `async def` рдХреЗ рд╕рд╛рде created рд╣реИ рддреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ code рдореЗрдВ рдЙрд╕реЗ call рдХрд░рддреЗ рд╕рдордп рдЙрд╕ function рдХреЛ `await` рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
|
||||
|
||||
---
|
||||
|
||||
рдлрд┐рд░ рд╕реЗ, рдпреЗ рдмрд╣реБрдд technical details рд╣реИрдВ рдЬреЛ рд╢рд╛рдпрдж useful рд╣реЛрдВрдЧреЗ рдЕрдЧрд░ рдЖрдк рдЗрдиреНрд╣реЗрдВ search рдХрд░рддреЗ рд╣реБрдП рдЖрдП рд╣реИрдВред
|
||||
|
||||
рдЕрдиреНрдпрдерд╛, рдЖрдкрдХреЛ рдКрдкрд░ рдХреЗ section рдХреА guidelines рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: <a href="#in-a-hurry">рдЬрд▓реНрджреА рдореЗрдВ рд╣реИрдВ?</a>ред
|
||||
34
docs/hi/docs/benchmarks.md
Normal file
34
docs/hi/docs/benchmarks.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Benchmarks { #benchmarks }
|
||||
|
||||
рд╕реНрд╡рддрдВрддреНрд░ TechEmpower benchmarks рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ Uvicorn рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ **FastAPI** applications [рдЙрдкрд▓рдмреНрдз рд╕рдмрд╕реЗ рддреЗрдЬрд╝ Python frameworks рдореЗрдВ рд╕реЗ рдПрдХ](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7) рд╣реИрдВ, рдХреЗрд╡рд▓ Starlette рдФрд░ Uvicorn рд╕реНрд╡рдпрдВ рд╕реЗ рдиреАрдЪреЗ (рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ FastAPI рджреНрд╡рд╛рд░рд╛ internally рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
|
||||
|
||||
рд▓реЗрдХрд┐рди benchmarks рдФрд░ comparisons рджреЗрдЦрддреЗ рд╕рдордп рдЖрдкрдХреЛ рдирд┐рдореНрди рдмрд╛рддреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
|
||||
|
||||
## Benchmarks рдФрд░ speed { #benchmarks-and-speed }
|
||||
|
||||
рдЬрдм рдЖрдк benchmarks рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдИ tools рдХреЛ equivalent рдорд╛рдирдХрд░ compare рд╣реЛрддреЗ рджреЗрдЦрдирд╛ рдЖрдо рдмрд╛рдд рд╣реИред
|
||||
|
||||
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, Uvicorn, Starlette рдФрд░ FastAPI рдХреЛ рдПрдХ рд╕рд╛рде compare рд╣реЛрддреЗ рджреЗрдЦрдирд╛ (рдХрдИ рдЕрдиреНрдп tools рдХреЗ рд╕рд╛рде)ред
|
||||
|
||||
Tool рдЬрд┐рддрдиреА рд╕рд░рд▓ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ рдЙрддрдиреА рд╣реА рдмреЗрд╣рддрд░ performance рдорд┐рд▓реЗрдЧреАред рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ benchmarks, tool рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЕрддрд┐рд░рд┐рдХреНрдд features рдХреЛ test рдирд╣реАрдВ рдХрд░рддреЗред
|
||||
|
||||
Hierarchy рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
|
||||
|
||||
* **Uvicorn**: рдПрдХ ASGI server
|
||||
* **Starlette**: (Uvicorn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ) рдПрдХ web microframework
|
||||
* **FastAPI**: (Starlette рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ) APIs рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрддрд┐рд░рд┐рдХреНрдд features рд╡рд╛рд▓рд╛ рдПрдХ API microframework, рдЬрд┐рд╕рдореЗрдВ data validation рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
|
||||
|
||||
* **Uvicorn**:
|
||||
* рдЗрд╕рдХреА performance рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ server рд╕реНрд╡рдпрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ extra code рдирд╣реАрдВ рд╣реЛрддрд╛ред
|
||||
* рдЖрдк рд╕реАрдзреЗ Uvicorn рдореЗрдВ application рдирд╣реАрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдкрдХреЗ code рдореЗрдВ рдХрдореЛрдмреЗрд╢, рдХрдо рд╕реЗ рдХрдо, Starlette (рдпрд╛ **FastAPI**) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕рд╛рд░рд╛ code рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛ред рдФрд░ рдпрджрд┐ рдЖрдкрдиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛, рддреЛ рдЖрдкрдХреЗ final application рдореЗрдВ framework рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреЗ app code рддрдерд╛ bugs рдХреЛ рдХрдо рдХрд░рдиреЗ рдЬрд┐рддрдирд╛ рд╣реА overhead рд╣реЛрдЧрд╛ред
|
||||
* рдпрджрд┐ рдЖрдк Uvicorn рдХреА рддреБрд▓рдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреА рддреБрд▓рдирд╛ Daphne, Hypercorn, uWSGI рдЖрджрд┐ рд╕реЗ рдХрд░реЗрдВред Application servers рд╕реЗред
|
||||
* **Starlette**:
|
||||
* Uvicorn рдХреЗ рдмрд╛рдж рдЗрд╕рдХреА performance рдЕрдЧрд▓реА рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╣реЛрдЧреАред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, Starlette рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП Uvicorn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕рдВрднрд╡рддрдГ рдпрд╣ рдХреЗрд╡рд▓ рдЕрдзрд┐рдХ code execute рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг Uvicorn рд╕реЗ "рдзреАрдорд╛" рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
|
||||
* рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХреЛ simple web applications рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП tools рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ paths рдкрд░ рдЖрдзрд╛рд░рд┐рдд routing рдЖрджрд┐ред
|
||||
* рдпрджрд┐ рдЖрдк Starlette рдХреА рддреБрд▓рдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреА рддреБрд▓рдирд╛ Sanic, Flask, Django рдЖрджрд┐ рд╕реЗ рдХрд░реЗрдВред Web frameworks (рдпрд╛ microframeworks) рд╕реЗред
|
||||
* **FastAPI**:
|
||||
* рдЬреИрд╕реЗ Starlette, Uvicorn рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕рд╕реЗ рддреЗрдЬрд╝ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛, рд╡реИрд╕реЗ рд╣реА **FastAPI**, Starlette рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЙрд╕рд╕реЗ рддреЗрдЬрд╝ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред
|
||||
* FastAPI, Starlette рдХреЗ рдКрдкрд░ рдФрд░ features рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдРрд╕реЗ features рдЬрд┐рдирдХреА рдЖрдкрдХреЛ APIs рдмрдирд╛рддреЗ рд╕рдордп рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ data validation рдФрд░ serializationред рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдкрдХреЛ automatic documentation рдореБрдлреНрдд рдореЗрдВ рдорд┐рд▓рддреА рд╣реИ (automatic documentation running applications рдореЗрдВ overhead рднреА рдирд╣реАрдВ рдЬреЛрдбрд╝рддреА, рдпрд╣ startup рдкрд░ generate рд╣реЛрддреА рд╣реИ)ред
|
||||
* рдпрджрд┐ рдЖрдкрдиреЗ FastAPI рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рд╕реАрдзреЗ Starlette (рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп tool, рдЬреИрд╕реЗ Sanic, Flask, Responder рдЖрджрд┐) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рддреЛ рдЖрдкрдХреЛ рд╕рднреА data validation рдФрд░ serialization рд╕реНрд╡рдпрдВ implement рдХрд░рдиреЗ рдкрдбрд╝реЗрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЗ final application рдореЗрдВ рдлрд┐рд░ рднреА рдЙрддрдирд╛ рд╣реА overhead рд╣реЛрдЧрд╛ рдЬрд┐рддрдирд╛ FastAPI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЬрд╛рдиреЗ рдкрд░ рд╣реЛрддрд╛ред рдФрд░ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ data validation рдФрд░ serialization applications рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП code рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрддрд╛ рд╣реИред
|
||||
* рдЗрд╕рд▓рд┐рдП, FastAPI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк development time, bugs рдФрд░ lines of code рдмрдЪрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЛ рд╡рд╣реА performance (рдпрд╛ рдмреЗрд╣рддрд░) рдорд┐рд▓реЗрдЧреА рдЬреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдкрд░ рдорд┐рд▓рддреА (рдХреНрдпреЛрдВрдХрд┐ рддрдм рдЖрдкрдХреЛ рдпрд╣ рд╕рдм рдЕрдкрдиреЗ code рдореЗрдВ implement рдХрд░рдирд╛ рдкрдбрд╝рддрд╛)ред
|
||||
* рдпрджрд┐ рдЖрдк FastAPI рдХреА рддреБрд▓рдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдРрд╕реЗ web application framework (рдпрд╛ tools рдХреЗ set) рд╕реЗ рдХрд░реЗрдВ рдЬреЛ data validation, serialization рдФрд░ documentation рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реЛ, рдЬреИрд╕реЗ Flask-apispec, NestJS, Molten рдЖрджрд┐ред рдРрд╕реЗ frameworks рдЬрд┐рдирдореЗрдВ integrated automatic data validation, serialization рдФрд░ documentation рд╣реЛред
|
||||
23
docs/hi/docs/editor-support.md
Normal file
23
docs/hi/docs/editor-support.md
Normal file
@@ -0,0 +1,23 @@
|
||||
# рдПрдбрд┐рдЯрд░ рд╕рдкреЛрд░реНрдЯ { #editor-support }
|
||||
|
||||
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ [FastAPI Extension](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) рдЖрдкрдХреЗ FastAPI development workflow рдХреЛ *рдкрд╛рде рдСрдкрд░реЗрд╢рди* discovery, navigation, рд╕рд╛рде рд╣реА FastAPI Cloud deployment рдФрд░ live log streaming рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рдмрдирд╛рддрд╛ рд╣реИред
|
||||
|
||||
Extension рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, [GitHub repository](https://github.com/fastapi/fastapi-vscode) рдкрд░ README рджреЗрдЦреЗрдВред
|
||||
|
||||
## рд╕реЗрдЯрдЕрдк рдФрд░ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди { #setup-and-installation }
|
||||
|
||||
**FastAPI Extension** [VS Code](https://code.visualstudio.com/) рдФрд░ [Cursor](https://www.cursor.com/) рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред рдЗрд╕реЗ рд╣рд░ editor рдХреЗ Extensions panel рд╕реЗ рд╕реАрдзреЗ "FastAPI" рдЦреЛрдЬрдХрд░ рдФрд░ **FastAPI Labs** рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд extension рдЪреБрдирдХрд░ install рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ extension browser-based editors рдЬреИрд╕реЗ [vscode.dev](https://vscode.dev) рдФрд░ [github.dev](https://github.dev) рдореЗрдВ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
|
||||
|
||||
### рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд┐рд╕реНрдХрд╡рд░реА { #application-discovery }
|
||||
|
||||
Default рд░реВрдк рд╕реЗ, extension рдЖрдкрдХреЗ workspace рдореЗрдВ `FastAPI()` instantiate рдХрд░рдиреЗ рд╡рд╛рд▓реА files рдХреЛ scan рдХрд░рдХреЗ FastAPI applications рдХреЛ рдЕрдкрдиреЗ-рдЖрдк discover рдХрд░реЗрдЧрд╛ред рдпрджрд┐ auto-detection рдЖрдкрдХреЗ project structure рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛, рддреЛ рдЖрдк `pyproject.toml` рдореЗрдВ `[tool.fastapi]` рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛ module notation (рдЬреИрд╕реЗ `myapp.main:app`) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ `fastapi.entryPoint` VS Code setting рдореЗрдВ entrypoint specify рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
## рдлреАрдЪрд░реНрд╕ { #features }
|
||||
|
||||
- **Path Operation Explorer** - рдЖрдкрдХреЗ application рдореЗрдВ рд╕рднреА <dfn title="рд░реВрдЯреНрд╕, рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕">*рдкрд╛рде рдСрдкрд░реЗрд╢рдиреНрд╕*</dfn> рдХрд╛ sidebar tree viewред рдХрд┐рд╕реА рднреА route рдпрд╛ router definition рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП click рдХрд░реЗрдВред
|
||||
- **Route Search** - <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>E</kbd> (macOS рдкрд░: <kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>E</kbd>) рдХреЗ рд╕рд╛рде path, method, рдпрд╛ name рдХреЗ рдЖрдзрд╛рд░ рдкрд░ search рдХрд░реЗрдВред
|
||||
- **CodeLens Navigation** - test client calls (рдЬреИрд╕реЗ `client.get('/items')`) рдХреЗ рдКрдкрд░ clickable links, рдЬреЛ tests рдФрд░ implementation рдХреЗ рдмреАрдЪ quick navigation рдХреЗ рд▓рд┐рдП matching *рдкрд╛рде рдСрдкрд░реЗрд╢рди* рдкрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред
|
||||
- **Deploy to FastAPI Cloud** - рдЖрдкрдХреА app рдХреЛ [FastAPI Cloud](https://fastapicloud.com/) рдкрд░ one-click deploymentред
|
||||
- **Stream Application Logs** - level filtering рдФрд░ text search рдХреЗ рд╕рд╛рде рдЖрдкрдХреЗ FastAPI Cloud-deployed application рд╕реЗ real-time log streamingред
|
||||
|
||||
рдпрджрд┐ рдЖрдк extension рдХреЗ features рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ Command Palette (<kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd> рдпрд╛ macOS рдкрд░: <kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd>) рдЦреЛрд▓рдХрд░ рдФрд░ "Welcome: Open walkthrough..." рдЪреБрдирдХрд░, рдлрд┐рд░ "Get started with FastAPI" walkthrough рдЪреБрдирдХрд░ extension walkthrough рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
134
docs/hi/docs/fastapi-cli.md
Normal file
134
docs/hi/docs/fastapi-cli.md
Normal file
@@ -0,0 +1,134 @@
|
||||
# FastAPI CLI { #fastapi-cli }
|
||||
|
||||
**FastAPI <abbr title="command line interface - рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕">CLI</abbr>** рдПрдХ command line рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рдЕрдкрдиреЗ FastAPI рдРрдк рдХреЛ serve рдХрд░рдиреЗ, рдЕрдкрдиреЗ FastAPI рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ manage рдХрд░рдиреЗ, рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
рдЬрдм рдЖрдк FastAPI рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ `pip install "fastapi[standard]"` рдХреЗ рд╕рд╛рде), рддреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ command line рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЖрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк terminal рдореЗрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ FastAPI рдРрдк рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк `fastapi dev` command рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ <font color="#4E9A06">fastapi</font> dev
|
||||
|
||||
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development 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://127.0.0.1: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://127.0.0.1:8000/docs</u></font>
|
||||
|
||||
<span style="background-color:#007166"><font color="#D3D7CF"> tip </font></span> Running in development mode, for production use:
|
||||
<b>fastapi run</b>
|
||||
|
||||
Logs:
|
||||
|
||||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Will watch for changes in these directories:
|
||||
<b>[</b><font color="#4E9A06">'/home/user/code/awesomeapp'</font><b>]</b>
|
||||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font> <b>(</b>Press CTRL+C to
|
||||
quit<b>)</b>
|
||||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started reloader process <b>[</b><font color="#34E2E2"><b>383138</b></font><b>]</b> using WatchFiles
|
||||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>383153</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.
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдкреНрд░реЛрдбрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрдк `fastapi dev` рдХреА рдЬрдЧрд╣ `fastapi run` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред ЁЯЪА
|
||||
|
||||
///
|
||||
|
||||
рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, **FastAPI CLI** [Uvicorn](https://www.uvicorn.dev) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ high-performance, production-ready, ASGI server рд╣реИред ЁЯШО
|
||||
|
||||
`fastapi` CLI рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП FastAPI рдРрдк рдХреЛ рдЕрдкрдиреЗ-рдЖрдк detect рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ `main.py` рдлрд╝рд╛рдЗрд▓ рдореЗрдВ `app` рдирд╛рдо рдХрд╛ object рд╣реИ (рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп variants рдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ)ред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдРрдк рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ configure рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
## рдРрдк `entrypoint` рдХреЛ `pyproject.toml` рдореЗрдВ configure рдХрд░реЗрдВ { #configure-the-app-entrypoint-in-pyproject-toml }
|
||||
|
||||
рдЖрдк `pyproject.toml` рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдпрд╣ configure рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рдРрдк рдХрд╣рд╛рдБ рд╕реНрдерд┐рдд рд╣реИ, рдЬреИрд╕реЗ:
|
||||
|
||||
```toml
|
||||
[tool.fastapi]
|
||||
entrypoint = "main:app"
|
||||
```
|
||||
|
||||
рд╡рд╣ `entrypoint` `fastapi` command рдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдЙрд╕реЗ рдРрдк рдХреЛ рдЗрд╕ рддрд░рд╣ import рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
|
||||
|
||||
```python
|
||||
from main import app
|
||||
```
|
||||
|
||||
рдЕрдЧрд░ рдЖрдкрдХрд╛ code рдЗрд╕ рддрд░рд╣ structured рдерд╛:
|
||||
|
||||
```
|
||||
.
|
||||
тФЬтФАтФА backend
|
||||
тФВ┬а┬а тФЬтФАтФА main.py
|
||||
тФВ┬а┬а тФЬтФАтФА __init__.py
|
||||
```
|
||||
|
||||
рддреЛ рдЖрдк `entrypoint` рдХреЛ рдЗрд╕ рддрд░рд╣ set рдХрд░реЗрдВрдЧреЗ:
|
||||
|
||||
```toml
|
||||
[tool.fastapi]
|
||||
entrypoint = "backend.main:app"
|
||||
```
|
||||
|
||||
рдЬреЛ рдЗрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛:
|
||||
|
||||
```python
|
||||
from backend.main import app
|
||||
```
|
||||
|
||||
### path рдХреЗ рд╕рд╛рде рдпрд╛ `--entrypoint` CLI option рдХреЗ рд╕рд╛рде `fastapi dev` { #fastapi-dev-with-path-or-with-entrypoint-cli-option }
|
||||
|
||||
рдЖрдк `fastapi dev` command рдХреЛ file path рднреА pass рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ FastAPI app object рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд▓реЗрдЧрд╛:
|
||||
|
||||
```console
|
||||
$ fastapi dev main.py
|
||||
```
|
||||
|
||||
рдпрд╛, рдЖрдк `fastapi dev` command рдХреЛ `--entrypoint` option рднреА pass рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
|
||||
|
||||
```console
|
||||
$ fastapi dev --entrypoint main:app
|
||||
```
|
||||
|
||||
рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╣рд░ рдмрд╛рд░ `fastapi` command call рдХрд░рддреЗ рд╕рдордп рд╕рд╣реА path\entrypoint pass рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред
|
||||
|
||||
рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЕрдиреНрдп tools рдЗрд╕реЗ рдвреВрдБрдврдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП [VS Code рдПрдХреНрд╕рдЯреЗрдВрд╢рди](editor-support.md) рдпрд╛ [FastAPI Cloud](https://fastapicloud.com), рдЗрд╕рд▓рд┐рдП `pyproject.toml` рдореЗрдВ `entrypoint` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред
|
||||
|
||||
## `fastapi dev` { #fastapi-dev }
|
||||
|
||||
`fastapi dev` рдЪрд▓рд╛рдиреЗ рд╕реЗ development mode рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
|
||||
|
||||
Default рд░реВрдк рд╕реЗ, **auto-reload** enabled рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ code рдореЗрдВ changes рдХрд░рдиреЗ рдкрд░ server рдХреЛ рдЕрдкрдиреЗ-рдЖрдк reload рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрд╣ resource-intensive рд╣реИ рдФрд░ disabled рд╣реЛрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо stable рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреЗрд╡рд▓ development рдХреЗ рд▓рд┐рдП рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ IP address `127.0.0.1` рдкрд░ рднреА listen рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреА machine рдХрд╛ рдЦреБрдж рд╕реЗ рд╣реА communicate рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ IP рд╣реИ (`localhost`)ред
|
||||
|
||||
## `fastapi run` { #fastapi-run }
|
||||
|
||||
`fastapi run` execute рдХрд░рдиреЗ рд╕реЗ FastAPI production mode рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
|
||||
|
||||
Default рд░реВрдк рд╕реЗ, **auto-reload** disabled рд╣реЛрддрд╛ рд╣реИред рдпрд╣ IP address `0.0.0.0` рдкрд░ рднреА listen рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рд╕рднреА available IP addresses рд╣реИ, рдЗрд╕ рддрд░рд╣ рдпрд╣ рдЙрд╕ machine рд╕реЗ communicate рдХрд░ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП publicly accessible рд╣реЛрдЧрд╛ред рдЖрдо рддреМрд░ рдкрд░ рдЖрдк production рдореЗрдВ рдЗрд╕реЗ рдЗрд╕реА рддрд░рд╣ рдЪрд▓рд╛рдПрдБрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ container рдореЗрдВред
|
||||
|
||||
рдЕрдзрд┐рдХрддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдКрдкрд░ рд╕реЗ HTTPS handle рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ "termination proxy" рд╣реЛрдЧрд╛ (рдФрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП), рдпрд╣ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ рдХрд┐ рдЖрдк рдЕрдкрдирд╛ application рдХреИрд╕реЗ deploy рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХрд╛ provider рдЖрдкрдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЦреБрдж set up рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛ рд╕рдХрддреА рд╣реИред
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ [deployment documentation](deployment/index.md) рдореЗрдВ рдФрд░ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
///
|
||||
201
docs/hi/docs/features.md
Normal file
201
docs/hi/docs/features.md
Normal file
@@ -0,0 +1,201 @@
|
||||
# рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ { #features }
|
||||
|
||||
## FastAPI рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ { #fastapi-features }
|
||||
|
||||
**FastAPI** рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрддрд╛ рд╣реИ:
|
||||
|
||||
### рдЦреБрд▓реЗ рдорд╛рдирдХреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд { #based-on-open-standards }
|
||||
|
||||
* API рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification), рдЬрд┐рд╕рдореЗрдВ <dfn title="рдЗрдиреНрд╣реЗрдВ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ: endpoints, routes">рдкрд╛рде</dfn> <dfn title="рдЗрдиреНрд╣реЗрдВ HTTP methods рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ POST, GET, PUT, DELETE">рдСрдкрд░реЗрд╢рдиреНрд╕</dfn>, parameters, request bodies, security, рдЖрджрд┐ рдХреА рдШреЛрд╖рдгрд╛рдПрдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
|
||||
* [**JSON Schema**](https://json-schema.org/) рдХреЗ рд╕рд╛рде automatic data model documentation (рдХреНрдпреЛрдВрдХрд┐ OpenAPI рд╕реНрд╡рдпрдВ JSON Schema рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ)ред
|
||||
* рдЗрди рдорд╛рдирдХреЛрдВ рдХреЗ рдЗрд░реНрдж-рдЧрд┐рд░реНрдж рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛, рдПрдХ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЕрдзреНрдпрдпрди рдХреЗ рдмрд╛рджред рдКрдкрд░ рд╕реЗ рдмрд╛рдж рдореЗрдВ рдЬреЛрдбрд╝реА рдЧрдИ рдкрд░рдд рдХреА рддрд░рд╣ рдирд╣реАрдВред
|
||||
* рдпрд╣ рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ automatic **client code generation** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
|
||||
|
||||
### Automatic docs { #automatic-docs }
|
||||
|
||||
Interactive API documentation рдФрд░ exploration web user interfacesред рдХреНрдпреЛрдВрдХрд┐ framework OpenAPI рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ 2 default рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
|
||||
|
||||
* [**Swagger UI**](https://github.com/swagger-api/swagger-ui), interactive exploration рдХреЗ рд╕рд╛рде, рдЕрдкрдиреЗ API рдХреЛ рд╕реАрдзреЗ browser рд╕реЗ call рдФрд░ test рдХрд░реЗрдВред
|
||||
|
||||

|
||||
|
||||
* [**ReDoc**](https://github.com/Rebilly/ReDoc) рдХреЗ рд╕рд╛рде рд╡реИрдХрд▓реНрдкрд┐рдХ API documentationред
|
||||
|
||||

|
||||
|
||||
### рд╕рд┐рд░реНрдлрд╝ рдЖрдзреБрдирд┐рдХ Python { #just-modern-python }
|
||||
|
||||
рдпрд╣ рд╕рдм standard **Python type** declarations рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ (Pydantic рдХреА рдмрджреМрд▓рдд)ред рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирдпрд╛ syntax рдирд╣реАрдВред рд╕рд┐рд░реНрдлрд╝ standard modern Pythonред
|
||||
|
||||
рдЕрдЧрд░ рдЖрдкрдХреЛ Python types рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдЗрд╕рдХрд╛ 2 рдорд┐рдирдЯ рдХрд╛ рдЫреЛрдЯрд╛ refresher рдЪрд╛рд╣рд┐рдП (рднрд▓реЗ рд╣реА рдЖрдк FastAPI рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рддреЗ рд╣реЛрдВ), рддреЛ рдЫреЛрдЯрд╛ tutorial рджреЗрдЦреЗрдВ: [Python Types](python-types.md)ред
|
||||
|
||||
рдЖрдк types рдХреЗ рд╕рд╛рде standard Python рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
|
||||
|
||||
```Python
|
||||
from datetime import date
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
# рдХрд┐рд╕реА рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ str рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ
|
||||
# рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдПрдбрд┐рдЯрд░ рд╕рдкреЛрд░реНрдЯ рдкрд╛рдПрдБ
|
||||
def main(user_id: str):
|
||||
return user_id
|
||||
|
||||
|
||||
# рдПрдХ Pydantic рдореЙрдбрд▓
|
||||
class User(BaseModel):
|
||||
id: int
|
||||
name: str
|
||||
joined: date
|
||||
```
|
||||
|
||||
рдлрд┐рд░ рдЙрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
|
||||
|
||||
```Python
|
||||
my_user: User = User(id=3, name="John Doe", joined="2018-07-19")
|
||||
|
||||
second_user_data = {
|
||||
"id": 4,
|
||||
"name": "Mary",
|
||||
"joined": "2018-11-30",
|
||||
}
|
||||
|
||||
my_second_user: User = User(**second_user_data)
|
||||
```
|
||||
|
||||
/// note | рдиреЛрдЯ
|
||||
|
||||
`**second_user_data` рдХрд╛ рдорддрд▓рдм рд╣реИ:
|
||||
|
||||
`second_user_data` dict рдХреА keys рдФрд░ values рдХреЛ рд╕реАрдзреЗ key-value arguments рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ, рдЬреЛ рдЗрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ: `User(id=4, name="Mary", joined="2018-11-30")`
|
||||
|
||||
///
|
||||
|
||||
### рдПрдбрд┐рдЯрд░ рд╕рдкреЛрд░реНрдЯ { #editor-support }
|
||||
|
||||
рдкреВрд░реЗ framework рдХреЛ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рди рдФрд░ рд╕рд╣рдЬ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рд╕рднреА рдирд┐рд░реНрдгрдпреЛрдВ рдХреЛ рдХрдИ editors рдкрд░ test рдХрд┐рдпрд╛ рдЧрдпрд╛, рддрд╛рдХрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ development experience рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
|
||||
|
||||
Python developer surveys рдореЗрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ [рдХрд┐ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ "autocompletion" рд╣реИ](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features)ред
|
||||
|
||||
рдкреВрд░рд╛ **FastAPI** framework рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред Autocompletion рд╣рд░ рдЬрдЧрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
|
||||
|
||||
рдЖрдкрдХреЛ рд╢рд╛рдпрдж рд╣реА рдХрднреА docs рдкрд░ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
|
||||
|
||||
рдпрд╣рд╛рдБ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ editor рдЖрдкрдХреА рдХреИрд╕реЗ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
|
||||
|
||||
* [Visual Studio Code](https://code.visualstudio.com/) рдореЗрдВ:
|
||||
|
||||

|
||||
|
||||
* [PyCharm](https://www.jetbrains.com/pycharm/) рдореЗрдВ:
|
||||
|
||||

|
||||
|
||||
рдЖрдкрдХреЛ рдРрд╕реЗ code рдореЗрдВ completion рдорд┐рд▓реЗрдЧрд╛ рдЬрд┐рд╕реЗ рдЖрдк рдкрд╣рд▓реЗ рдЕрд╕рдВрднрд╡ рднреА рдорд╛рди рд╕рдХрддреЗ рдереЗред рдЬреИрд╕реЗ, рдХрд┐рд╕реА request рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ JSON body (рдЬреЛ nested рднреА рд╣реЛ рд╕рдХрддрд╛ рдерд╛) рдХреЗ рдЕрдВрджрд░ `price` keyред
|
||||
|
||||
рдЕрдм рдЧрд▓рдд key names рдЯрд╛рдЗрдк рдХрд░рдиреЗ, docs рдХреЗ рдмреАрдЪ рдЖрдЧреЗ-рдкреАрдЫреЗ рдЬрд╛рдиреЗ, рдпрд╛ рдпрд╣ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдКрдкрд░-рдиреАрдЪреЗ scroll рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рдХрд┐ рдЖрдкрдиреЗ рдЖрдЦрд┐рд░ `username` рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ рдпрд╛ `user_name`ред
|
||||
|
||||
### рд╕рдВрдХреНрд╖рд┐рдкреНрдд { #short }
|
||||
|
||||
рд╣рд░ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд╕рдордЭрджрд╛рд░ **defaults** рд╣реИрдВ, рдФрд░ рд╣рд░ рдЬрдЧрд╣ optional configurations рд╣реИрдВред рд╕рднреА parameters рдХреЛ рдЖрдкрдХреА рдЬрд╝рд░реВрд░рдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдФрд░ рдЖрдкрдХреА рдЬрд╝рд░реВрд░рдд рдХреА API define рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП fine-tune рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
|
||||
|
||||
рд▓реЗрдХрд┐рди default рд░реВрдк рд╕реЗ, рд╕рдм рдХреБрдЫ **"рдмрд╕ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ"**ред
|
||||
|
||||
### Validation { #validation }
|
||||
|
||||
* рдЕрдзрд┐рдХрд╛рдВрд╢ (рдпрд╛ рд╕рднреА?) Python **data types** рдХреЗ рд▓рд┐рдП validation, рдЬрд┐рдирдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
|
||||
* JSON objects (`dict`)ред
|
||||
* JSON array (`list`) рдЬреЛ item types define рдХрд░рддрд╛ рд╣реИред
|
||||
* String (`str`) fields, рдЬрд┐рдирдореЗрдВ min рдФрд░ max lengths define рд╣реЛрддреА рд╣реИрдВред
|
||||
* Numbers (`int`, `float`) рдЬрд┐рдирдореЗрдВ min рдФрд░ max values, рдЖрджрд┐ред
|
||||
|
||||
* рдЕрдзрд┐рдХ рдЕрд╕рд╛рдорд╛рдиреНрдп types рдХреЗ рд▓рд┐рдП validation, рдЬреИрд╕реЗ:
|
||||
* URLред
|
||||
* Emailред
|
||||
* UUIDред
|
||||
* ...рдФрд░ рдЕрдиреНрдпред
|
||||
|
||||
рд╕рд╛рд░реА validation well-established рдФрд░ robust **Pydantic** рджреНрд╡рд╛рд░рд╛ handle рдХреА рдЬрд╛рддреА рд╣реИред
|
||||
|
||||
### Security рдФрд░ authentication { #security-and-authentication }
|
||||
|
||||
Security рдФрд░ authentication integrated рд╣реИрдВред Databases рдпрд╛ data models рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА compromise рдХреЗ рдмрд┐рдирд╛ред
|
||||
|
||||
OpenAPI рдореЗрдВ define рдХреА рдЧрдИ рд╕рднреА security schemes, рдЬрд┐рдирдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
|
||||
|
||||
* HTTP Basicред
|
||||
* **OAuth2** (**JWT tokens** рдХреЗ рд╕рд╛рде рднреА)ред [OAuth2 with JWT](tutorial/security/oauth2-jwt.md) рдкрд░ tutorial рджреЗрдЦреЗрдВред
|
||||
* API keys:
|
||||
* Headers рдореЗрдВред
|
||||
* Query parameters рдореЗрдВред
|
||||
* Cookies рдореЗрдВ, рдЖрджрд┐ред
|
||||
|
||||
рд╕рд╛рде рд╣реА Starlette рдХреА рд╕рднреА security features (рдЬрд┐рд╕рдореЗрдВ **session cookies** рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ)ред
|
||||
|
||||
рд╕рдм reusable tools рдФрд░ components рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЗ systems, data stores, relational рдФрд░ NoSQL databases, рдЖрджрд┐ рдХреЗ рд╕рд╛рде integrate рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
|
||||
|
||||
### Dependency Injection { #dependency-injection }
|
||||
|
||||
FastAPI рдореЗрдВ рдПрдХ рдмреЗрд╣рдж рдЖрд╕рд╛рди, рд▓реЗрдХрд┐рди рдмреЗрд╣рдж рд╢рдХреНрддрд┐рд╢рд╛рд▓реА <dfn title='рдЗрдиреНрд╣реЗрдВ "components", "resources", "services", "providers" рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ'><strong>Dependency Injection</strong></dfn> system рд╢рд╛рдорд┐рд▓ рд╣реИред
|
||||
|
||||
* Dependencies рдХреА рднреА dependencies рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ dependencies рдХреА hierarchy рдпрд╛ **"graph"** рдмрдирддрд╛ рд╣реИред
|
||||
* рд╕рдм рдХреБрдЫ framework рджреНрд╡рд╛рд░рд╛ **automatically handled** рд╣реЛрддрд╛ рд╣реИред
|
||||
* рд╕рднреА dependencies requests рд╕реЗ data рдорд╛рдВрдЧ рд╕рдХрддреА рд╣реИрдВ рдФрд░ **path operation** constraints рддрдерд╛ automatic documentation рдХреЛ рдмрдврд╝рд╛ рд╕рдХрддреА рд╣реИрдВред
|
||||
* Dependencies рдореЗрдВ define рдХрд┐рдП рдЧрдП *path operation* parameters рдХреЗ рд▓рд┐рдП рднреА **automatic validation**ред
|
||||
* рдЬрдЯрд┐рд▓ user authentication systems, **database connections**, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП supportред
|
||||
* Databases, frontends, рдЖрджрд┐ рдХреЗ рд╕рд╛рде **рдХреЛрдИ compromise рдирд╣реАрдВ**ред рд▓реЗрдХрд┐рди рдЙрди рд╕рднреА рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рди integrationред
|
||||
|
||||
### рдЕрд╕реАрдорд┐рдд "plug-ins" { #unlimited-plug-ins }
|
||||
|
||||
рдпрд╛ рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХрд╛ code import рдХрд░реЗрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
|
||||
|
||||
рдХрд┐рд╕реА рднреА integration рдХреЛ (dependencies рдХреЗ рд╕рд╛рде) рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЗрддрдирд╛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреА application рдХреЗ рд▓рд┐рдП рдЙрд╕реА structure рдФрд░ syntax рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 2 lines of code рдореЗрдВ рдПрдХ "plug-in" рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЗ *path operations* рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред
|
||||
|
||||
### Tested { #tested }
|
||||
|
||||
* 100% <dfn title="code рдХреА рд╡рд╣ рдорд╛рддреНрд░рд╛ рдЬреЛ automatically test рдХреА рдЬрд╛рддреА рд╣реИ">test coverage</dfn>ред
|
||||
* 100% <dfn title="Python type annotations, рдЬрд┐рдирд╕реЗ рдЖрдкрдХрд╛ editor рдФрд░ external tools рдЖрдкрдХреЛ рдмреЗрд╣рддрд░ support рджреЗ рд╕рдХрддреЗ рд╣реИрдВ">type annotated</dfn> code baseред
|
||||
* Production applications рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
|
||||
|
||||
## Starlette рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ { #starlette-features }
|
||||
|
||||
**FastAPI** [**Starlette**](https://www.starlette.dev/) рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ compatible рд╣реИ (рдФрд░ рдЙрд╕реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬреЛ рднреА рдЕрддрд┐рд░рд┐рдХреНрдд Starlette code рд╣реИ, рд╡рд╣ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
|
||||
|
||||
`FastAPI` рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ `Starlette` рдХрд╛ рдПрдХ sub-class рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд░ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ Starlette рдЬрд╛рдирддреЗ рд╣реИрдВ рдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ functionality рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░реЗрдЧреАред
|
||||
|
||||
**FastAPI** рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ **Starlette** рдХреА рд╕рднреА features рдорд┐рд▓рддреА рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ FastAPI рдореВрд▓рддрдГ steroids рдкрд░ Starlette рд╣реИ):
|
||||
|
||||
* рд╕рдЪрдореБрдЪ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА performanceред рдпрд╣ [рдЙрдкрд▓рдмреНрдз рд╕рдмрд╕реЗ рддреЗрдЬрд╝ Python frameworks рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, **NodeJS** рдФрд░ **Go** рдХреЗ рдмрд░рд╛рдмрд░](https://github.com/encode/starlette#performance)ред
|
||||
* **WebSocket** supportред
|
||||
* In-process background tasksред
|
||||
* Startup рдФрд░ shutdown eventsред
|
||||
* HTTPX рдкрд░ рдмрдирд╛ test clientред
|
||||
* **CORS**, GZip, Static Files, Streaming responsesред
|
||||
* **Session рдФрд░ Cookie** supportред
|
||||
* 100% test coverageред
|
||||
* 100% type annotated codebaseред
|
||||
|
||||
## Pydantic рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ { #pydantic-features }
|
||||
|
||||
**FastAPI** [**Pydantic**](https://docs.pydantic.dev/) рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ compatible рд╣реИ (рдФрд░ рдЙрд╕реА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬреЛ рднреА рдЕрддрд┐рд░рд┐рдХреНрдд Pydantic code рд╣реИ, рд╡рд╣ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
|
||||
|
||||
рдЗрд╕рдореЗрдВ Pydantic рдкрд░ рдЖрдзрд╛рд░рд┐рдд external libraries рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреИрд╕реЗ databases рдХреЗ рд▓рд┐рдП <abbr title="Object-Relational Mapper - рдСрдмреНрдЬреЗрдХреНрдЯ-рд░рд┐рд▓реЗрд╢рдирд▓ рдореИрдкрд░">ORM</abbr>s рдФрд░ <abbr title="Object-Document Mapper - рдСрдмреНрдЬреЗрдХреНрдЯ-рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдореИрдкрд░">ODM</abbr>sред
|
||||
|
||||
рдЗрд╕рдХрд╛ рдпрд╣ рднреА рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк request рд╕реЗ рдорд┐рд▓рдиреЗ рд╡рд╛рд▓реЗ рдЙрд╕реА object рдХреЛ **рд╕реАрдзреЗ database рдореЗрдВ** рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдм рдХреБрдЫ automatically validated рд╣реЛрддрд╛ рд╣реИред
|
||||
|
||||
рдЙрд╕реА рддрд░рд╣ рдЙрд▓реНрдЯрд╛ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк database рд╕реЗ рдорд┐рд▓рдиреЗ рд╡рд╛рд▓реЗ object рдХреЛ **рд╕реАрдзреЗ client рдХреЛ** рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
**FastAPI** рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ **Pydantic** рдХреА рд╕рднреА features рдорд┐рд▓рддреА рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ FastAPI рд╕рднреА data handling рдХреЗ рд▓рд┐рдП Pydantic рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ):
|
||||
|
||||
* **рдХреЛрдИ brainfuck рдирд╣реАрдВ**:
|
||||
* рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирдИ schema definition micro-language рдирд╣реАрдВред
|
||||
* рдЕрдЧрд░ рдЖрдк Python types рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ Pydantic рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред
|
||||
* рдЖрдкрдХреЗ **<abbr title="Integrated Development Environment - рдЗрдВрдЯреАрдЧреНрд░реЗрдЯреЗрдб рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ: code editor рдЬреИрд╕рд╛">IDE</abbr>/<dfn title="рдПрдХ program рдЬреЛ code errors рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ">рд▓рд┐рдВрдЯрд░</dfn>/brain** рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
|
||||
* рдХреНрдпреЛрдВрдХрд┐ pydantic data structures рдХреЗрд╡рд▓ рдЙрди classes рдХреЗ instances рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк define рдХрд░рддреЗ рд╣реИрдВ; auto-completion, linting, mypy рдФрд░ рдЖрдкрдХреА intuition, рд╕рднреА рдЖрдкрдХреЗ validated data рдХреЗ рд╕рд╛рде рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдЪрд╛рд╣рд┐рдПред
|
||||
* **Complex structures** validate рдХрд░реЗрдВ:
|
||||
* Hierarchical Pydantic models, Python `typing` рдХреЗ `List` рдФрд░ `Dict`, рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧред
|
||||
* рдФрд░ validators complex data schemas рдХреЛ JSON Schema рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ define, check рдФрд░ document рдХрд░рдиреЗ рджреЗрддреЗ рд╣реИрдВред
|
||||
* рдЖрдкрдХреЗ рдкрд╛рд╕ deeply **nested JSON** objects рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ рд╕рднреА validated рдФрд░ annotated рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
* **Extensible**:
|
||||
* Pydantic custom data types рдХреЛ define рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ рдпрд╛ рдЖрдк validator decorator рд╕реЗ decorated model рдкрд░ methods рдХреЗ рд╕рд╛рде validation extend рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
* 100% test coverageред
|
||||
79
docs/hi/docs/history-design-future.md
Normal file
79
docs/hi/docs/history-design-future.md
Normal file
@@ -0,0 +1,79 @@
|
||||
# рдЗрддрд┐рд╣рд╛рд╕, рдбрд┐рдЬрд╝рд╛рдЗрди рдФрд░ рднрд╡рд┐рд╖реНрдп { #history-design-and-future }
|
||||
|
||||
рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, [рдПрдХ **FastAPI** рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдкреВрдЫрд╛](https://github.com/fastapi/fastapi/issues/3#issuecomment-454956920):
|
||||
|
||||
> рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рдХреНрдпрд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рд╣реА рд╣рдлреНрддреЛрдВ рдореЗрдВ рдХрд╣реАрдВ рд╕реЗ рднреА рд╕реАрдзреЗ рд╢рд╛рдирджрд╛рд░ рдмрди рдЧрдпрд╛ [...]
|
||||
|
||||
рдпрд╣рд╛рдБ рдЙрд╕ рдЗрддрд┐рд╣рд╛рд╕ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред
|
||||
|
||||
## рд╡рд┐рдХрд▓реНрдк { #alternatives }
|
||||
|
||||
рдореИрдВ рдХрдИ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдЬрдЯрд┐рд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рд╡рд╛рд▓реА APIs рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдБ (Machine Learning, distributed systems, asynchronous jobs, NoSQL databases, рдЖрджрд┐), рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рдХрдИ рдЯреАрдореЛрдВ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░ рдЪреБрдХрд╛ рд╣реВрдБред
|
||||
|
||||
рдЗрд╕рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдЬрд╛рдБрдЪ, рдкрд░реАрдХреНрд╖рдг рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
|
||||
|
||||
**FastAPI** рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рдХрд╛рдлреА рд╣рдж рддрдХ рдЗрд╕рдХреЗ рдкреВрд░реНрд╡рд╡рд░реНрддрд┐рдпреЛрдВ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рд╣реИред
|
||||
|
||||
рдЬреИрд╕рд╛ рдХрд┐ [рд╡рд┐рдХрд▓реНрдк](alternatives.md) рд╕реЗрдХреНрд╢рди рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ:
|
||||
|
||||
<blockquote markdown="1">
|
||||
|
||||
рджреВрд╕рд░реЛрдВ рдХреЗ рдкрд┐рдЫрд▓реЗ рдХрд╛рдо рдХреЗ рдмрд┐рдирд╛ **FastAPI** рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрддрд╛ред
|
||||
|
||||
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрдИ рдЯреВрд▓ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреА рд╣реИред
|
||||
|
||||
рдореИрдВ рдХрдИ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдПрдХ рдирдпрд╛ framework рдмрдирд╛рдиреЗ рд╕реЗ рдмрдЪрддрд╛ рд░рд╣рд╛ред рдкрд╣рд▓реЗ рдореИрдВрдиреЗ **FastAPI** рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдП рдЧрдП рд╕рднреА features рдХреЛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ frameworks, plug-ins рдФрд░ tools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░, рдРрд╕рд╛ рдХреБрдЫ рдмрдирд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдмрдЪрд╛ рдерд╛ рдЬреЛ рдпреЗ рд╕рднреА features рдкреНрд░рджрд╛рди рдХрд░реЗ, рдкрд┐рдЫрд▓реЗ tools рд╕реЗ рд╕рд░реНрд╡реЛрддреНрддрдо ideas рд▓реЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рдВрднрд╡ рддрд░реАрдХреЗ рд╕реЗ рдЬреЛрдбрд╝реЗ, рд╕рд╛рде рд╣реА рдРрд╕реА language features рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗ рдЬреЛ рдкрд╣рд▓реЗ рдЙрдкрд▓рдмреНрдз рднреА рдирд╣реАрдВ рдереАрдВ (Python 3.6+ type hints)ред
|
||||
|
||||
</blockquote>
|
||||
|
||||
## рдЬрд╛рдБрдЪ-рдкрдбрд╝рддрд╛рд▓ { #investigation }
|
||||
|
||||
рд╕рднреА рдкрд┐рдЫрд▓реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореБрдЭреЗ рдЙрди рд╕рднреА рд╕реЗ рд╕реАрдЦрдиреЗ, ideas рд▓реЗрдиреЗ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рддрдерд╛ рдЬрд┐рди рдбреЗрд╡рд▓рдкрд░ рдЯреАрдореЛрдВ рдХреЗ рд╕рд╛рде рдореИрдВрдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ рдорд┐рд▓рд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛ред
|
||||
|
||||
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдерд╛ рдХрд┐ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЗрд╕реЗ standard Python type hints рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
|
||||
|
||||
рд╕рд╛рде рд╣реА, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж standards рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛ред
|
||||
|
||||
рдЗрд╕рд▓рд┐рдП, **FastAPI** рдХреА coding рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА, рдореИрдВрдиреЗ OpenAPI, JSON Schema, OAuth2 рдЖрджрд┐ рдХреЗ specs рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдореЗрдВ рдХрдИ рдорд╣реАрдиреЗ рдмрд┐рддрд╛рдПред рдЙрдирдХреЗ рд╕рдВрдмрдВрдз, overlap рдФрд░ differences рдХреЛ рд╕рдордЭрд╛ред
|
||||
|
||||
## рдбрд┐рдЬрд╝рд╛рдЗрди { #design }
|
||||
|
||||
рдлрд┐рд░ рдореИрдВрдиреЗ рдЙрд╕ developer "API" рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧрд╛рдпрд╛ рдЬрд┐рд╕реЗ рдореИрдВ рдПрдХ user рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ (FastAPI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ developer рдХреЗ рд░реВрдк рдореЗрдВ)ред
|
||||
|
||||
рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп Python editors рдореЗрдВ рдХрдИ ideas рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛: PyCharm, VS Code, Jedi рдЖрдзрд╛рд░рд┐рдд editorsред
|
||||
|
||||
рдкрд┐рдЫрд▓реЗ [Python Developer Survey](https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools) рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рд▓рдЧрднрдЧ 80% users рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред
|
||||
|
||||
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ **FastAPI** рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрди editors рдХреЗ рд╕рд╛рде test рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ 80% Python developers рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЪреВрдБрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп editors рднреА рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд╕рднреА рд▓рд╛рдн рд▓рдЧрднрдЧ рд╕рднреА editors рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдЪрд╛рд╣рд┐рдПред
|
||||
|
||||
рдЗрд╕ рддрд░рд╣ рдореИрдВ code duplication рдХреЛ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХрдо рдХрд░рдиреЗ, рд╣рд░ рдЬрдЧрд╣ completion рдкрд╛рдиреЗ, type рдФрд░ error checks рдЖрджрд┐ рдХреЗ рд╕рд░реНрд╡реЛрддреНрддрдо рддрд░реАрдХреЗ рдЦреЛрдЬ рд╕рдХрд╛ред
|
||||
|
||||
рд╕рдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХрд┐ рд╕рднреА developers рдХреЛ рд╕рд░реНрд╡реЛрддреНрддрдо development experience рдорд┐рд▓ рд╕рдХреЗред
|
||||
|
||||
## рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ { #requirements }
|
||||
|
||||
рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд╛рднреЛрдВ рдХреЗ рд▓рд┐рдП [**Pydantic**](https://docs.pydantic.dev/) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдБрдЧрд╛ред
|
||||
|
||||
рдлрд┐рд░ рдореИрдВрдиреЗ рдЗрд╕рдореЗрдВ рдпреЛрдЧрджрд╛рди рджрд┐рдпрд╛, рддрд╛рдХрд┐ рдЗрд╕реЗ JSON Schema рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ compliant рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ, constraint declarations рдХреЛ define рдХрд░рдиреЗ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдФрд░ рдХрдИ editors рдореЗрдВ tests рдХреЗ рдЖрдзрд╛рд░ рдкрд░ editor support (type checks, autocompletion) рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред
|
||||
|
||||
Development рдХреЗ рджреМрд░рд╛рди, рдореИрдВрдиреЗ [**Starlette**](https://www.starlette.dev/) рдореЗрдВ рднреА рдпреЛрдЧрджрд╛рди рджрд┐рдпрд╛, рдЬреЛ рджреВрд╕рд░реА рдореБрдЦреНрдп рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред
|
||||
|
||||
## Development { #development }
|
||||
|
||||
рдЬрдм рддрдХ рдореИрдВрдиреЗ **FastAPI** рдЦреБрдж рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддрдм рддрдХ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╣рд┐рд╕реНрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рдереЗ, design рддрдп рд╣реЛ рдЪреБрдХрд╛ рдерд╛, requirements рдФрд░ tools рддреИрдпрд╛рд░ рдереЗ, рдФрд░ standards рддрдерд╛ specifications рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдЮрд╛рди рд╕реНрдкрд╖реНрдЯ рдФрд░ рддрд╛рдЬрд╝рд╛ рдерд╛ред
|
||||
|
||||
## рднрд╡рд┐рд╖реНрдп { #future }
|
||||
|
||||
рдЗрд╕ рдмрд┐рдВрджреБ рддрдХ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ **FastAPI** рдЕрдкрдиреЗ ideas рдХреЗ рд╕рд╛рде рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╕рд╛рдмрд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИред
|
||||
|
||||
рдЗрд╕реЗ рдХрдИ use cases рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдЙрдкрдпреБрдХреНрдд рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдкрд┐рдЫрд▓реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдЪреБрдирд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
|
||||
|
||||
рдХрдИ developers рдФрд░ teams рдЕрдкрдиреЗ projects рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА **FastAPI** рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВ (рдореЗрд░реЗ рдФрд░ рдореЗрд░реА team рд╕рд╣рд┐рдд)ред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдЕрднреА рдХрдИ improvements рдФрд░ features рдЖрдиреЗ рдмрд╛рдХреА рд╣реИрдВред
|
||||
|
||||
**FastAPI** рдХрд╛ рднрд╡рд┐рд╖реНрдп рдмрд╣реБрдд рдЙрдЬреНрдЬреНрд╡рд▓ рд╣реИред
|
||||
|
||||
рдФрд░ [рдЖрдкрдХреА рдорджрдж](help-fastapi.md) рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред
|
||||
28
docs/hi/docs/project-generation.md
Normal file
28
docs/hi/docs/project-generation.md
Normal file
@@ -0,0 +1,28 @@
|
||||
# Full Stack FastAPI Template { #full-stack-fastapi-template }
|
||||
|
||||
Templates рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ setup рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ flexible рдФрд░ customizable рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ project рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ modify рдФрд░ adapt рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╡реЗ рдПрдХ рдмреЗрд╣рддрд░реАрди starting point рдмрди рдЬрд╛рддреЗ рд╣реИрдВред ЁЯПБ
|
||||
|
||||
рдЖрдк рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ template рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛ initial setup, security, database рдФрд░ рдХреБрдЫ API endpoints рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рд╣реИрдВред
|
||||
|
||||
GitHub Repository: [Full Stack FastAPI Template](https://github.com/tiangolo/full-stack-fastapi-template)
|
||||
|
||||
## Full Stack FastAPI Template - Technology Stack рдФрд░ Features { #full-stack-fastapi-template-technology-stack-and-features }
|
||||
|
||||
- тЪб Python backend API рдХреЗ рд▓рд┐рдП [**FastAPI**](https://fastapi.tiangolo.com/hi)ред
|
||||
- ЁЯз░ Python SQL database interactions (ORM) рдХреЗ рд▓рд┐рдП [SQLModel](https://sqlmodel.tiangolo.com)ред
|
||||
- ЁЯФН data validation рдФрд░ settings management рдХреЗ рд▓рд┐рдП [Pydantic](https://docs.pydantic.dev), рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ FastAPI рдХрд░рддрд╛ рд╣реИред
|
||||
- ЁЯТ╛ SQL database рдХреЗ рд░реВрдк рдореЗрдВ [PostgreSQL](https://www.postgresql.org)ред
|
||||
- ЁЯЪА frontend рдХреЗ рд▓рд┐рдП [React](https://react.dev)ред
|
||||
- ЁЯТГ TypeScript, hooks, Vite, рдФрд░ modern frontend stack рдХреЗ рдЕрдиреНрдп parts рдХрд╛ рдЙрдкрдпреЛрдЧред
|
||||
- ЁЯОи frontend components рдХреЗ рд▓рд┐рдП [Tailwind CSS](https://tailwindcss.com) рдФрд░ [shadcn/ui](https://ui.shadcn.com)ред
|
||||
- ЁЯдЦ рдПрдХ automatically generated frontend clientред
|
||||
- ЁЯзк End-to-End testing рдХреЗ рд▓рд┐рдП [Playwright](https://playwright.dev)ред
|
||||
- ЁЯжЗ Dark mode supportред
|
||||
- ЁЯРЛ development рдФрд░ production рдХреЗ рд▓рд┐рдП [Docker Compose](https://www.docker.com)ред
|
||||
- ЁЯФТ default рд░реВрдк рд╕реЗ secure password hashingред
|
||||
- ЁЯФС JWT (JSON Web Token) authenticationред
|
||||
- ЁЯУл Email рдЖрдзрд╛рд░рд┐рдд password recoveryред
|
||||
- тЬЕ [Pytest](https://pytest.org) рдХреЗ рд╕рд╛рде testsред
|
||||
- ЁЯУЮ reverse proxy / load balancer рдХреЗ рд░реВрдк рдореЗрдВ [Traefik](https://traefik.io)ред
|
||||
- ЁЯЪв Docker Compose рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ deployment instructions, рдЬрд┐рд╕рдореЗрдВ automatic HTTPS certificates handle рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП frontend Traefik proxy setup рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред
|
||||
- ЁЯПн GitHub Actions рдкрд░ рдЖрдзрд╛рд░рд┐рдд CI (continuous integration) рдФрд░ CD (continuous deployment)ред
|
||||
348
docs/hi/docs/python-types.md
Normal file
348
docs/hi/docs/python-types.md
Normal file
@@ -0,0 +1,348 @@
|
||||
# Python Types рдкрд░рд┐рдЪрдп { #python-types-intro }
|
||||
|
||||
Python рдореЗрдВ рд╡реИрдХрд▓реНрдкрд┐рдХ "type hints" (рдЬрд┐рдиреНрд╣реЗрдВ "type annotations" рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХрд╛ рд╕рдорд░реНрдерди рд╣реИред
|
||||
|
||||
рдпреЗ **"type hints"** рдпрд╛ annotations рдПрдХ рд╡рд┐рд╢реЗрд╖ syntax рд╣реИрдВ, рдЬреЛ рдХрд┐рд╕реА variable рдХрд╛ <dfn title="рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: str, int, float, bool">type</dfn> рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
|
||||
|
||||
рдЕрдкрдиреЗ variables рдХреЗ рд▓рд┐рдП types рдШреЛрд╖рд┐рдд рдХрд░рдХреЗ, editors рдФрд░ tools рдЖрдкрдХреЛ рдмреЗрд╣рддрд░ support рджреЗ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
рдпрд╣ Python type hints рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╕ рдПрдХ **рддреНрд╡рд░рд┐рдд tutorial / refresher** рд╣реИред рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдЙрддрдирд╛ рд╣реА рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬрд┐рддрдирд╛ рдЙрдиреНрд╣реЗрдВ **FastAPI** рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИ... рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╣реИред
|
||||
|
||||
**FastAPI** рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрдиреНрд╣реАрдВ type hints рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдпреЗ рдЗрд╕реЗ рдХрдИ рдлрд╛рдпрджреЗ рдФрд░ рд▓рд╛рдн рджреЗрддреЗ рд╣реИрдВред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдХрднреА **FastAPI** рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рднреА рдХрд░рддреЗ, рддрдм рднреА рдЗрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕реАрдЦрдиреЗ рд╕реЗ рдЖрдкрдХреЛ рд▓рд╛рдн рд╣реЛрдЧрд╛ред
|
||||
|
||||
/// note | рдиреЛрдЯ
|
||||
|
||||
рдЕрдЧрд░ рдЖрдк Python expert рд╣реИрдВ, рдФрд░ type hints рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╕рдм рдХреБрдЫ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЕрдЧрд▓реЗ chapter рдкрд░ рдЬрд╛рдПрдБред
|
||||
|
||||
///
|
||||
|
||||
## рдкреНрд░реЗрд░рдгрд╛ { #motivation }
|
||||
|
||||
рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ:
|
||||
|
||||
{* ../../docs_src/python_types/tutorial001_py310.py *}
|
||||
|
||||
рдЗрд╕ program рдХреЛ call рдХрд░рдиреЗ рдкрд░ output рдЖрддрд╛ рд╣реИ:
|
||||
|
||||
```
|
||||
John Doe
|
||||
```
|
||||
|
||||
Function рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ:
|
||||
|
||||
* рдПрдХ `first_name` рдФрд░ `last_name` рд▓реЗрддрд╛ рд╣реИред
|
||||
* рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдкрд╣рд▓реЗ рдЕрдХреНрд╖рд░ рдХреЛ `title()` рдХреЗ рд╕рд╛рде upper case рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИред
|
||||
* рдЙрдиреНрд╣реЗрдВ рдмреАрдЪ рдореЗрдВ рдПрдХ space рдХреЗ рд╕рд╛рде <dfn title="рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рд░рдЦрддрд╛ рд╣реИ, рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВред рдПрдХ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрд╛рдж рджреВрд╕рд░реЗ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рдеред">Concatenate</dfn> рдХрд░рддрд╛ рд╣реИред
|
||||
|
||||
{* ../../docs_src/python_types/tutorial001_py310.py hl[2] *}
|
||||
|
||||
### рдЗрд╕реЗ edit рдХрд░реЗрдВ { #edit-it }
|
||||
|
||||
рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╕рд░рд▓ program рд╣реИред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдЕрдм рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЗрд╕реЗ scratch рд╕реЗ рд▓рд┐рдЦ рд░рд╣реЗ рдереЗред
|
||||
|
||||
рдХрд┐рд╕реА point рдкрд░ рдЖрдк function define рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЗ parameters рддреИрдпрд╛рд░ рд╣реИрдВ...
|
||||
|
||||
рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдкрдХреЛ "рд╡рд╣ method рдЬреЛ рдкрд╣рд▓реЗ рдЕрдХреНрд╖рд░ рдХреЛ upper case рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ" call рдХрд░рдирд╛ рд╣реИред
|
||||
|
||||
рдХреНрдпрд╛ рд╡рд╣ `upper` рдерд╛? рдХреНрдпрд╛ рд╡рд╣ `uppercase` рдерд╛? `first_uppercase`? `capitalize`?
|
||||
|
||||
рдлрд┐рд░, рдЖрдк programmer рдХреЗ рдкреБрд░рд╛рдиреЗ рджреЛрд╕реНрдд, editor autocompletion рдХреЗ рд╕рд╛рде рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред
|
||||
|
||||
рдЖрдк function рдХрд╛ рдкрд╣рд▓рд╛ parameter, `first_name`, рдлрд┐рд░ рдПрдХ dot (`.`) type рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ completion trigger рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `Ctrl+Space` рджрдмрд╛рддреЗ рд╣реИрдВред
|
||||
|
||||
рд▓реЗрдХрд┐рди, рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ, рдЖрдкрдХреЛ рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рдорд┐рд▓рддрд╛:
|
||||
|
||||
<img src="/img/python-types/image01.png">
|
||||
|
||||
### Types рдЬреЛрдбрд╝реЗрдВ { #add-types }
|
||||
|
||||
рдЖрдЗрдП рдкрд┐рдЫрд▓реЗ version рдХреА рдПрдХ single line рдмрджрд▓рддреЗ рд╣реИрдВред
|
||||
|
||||
рд╣рдо рдареАрдХ рдЗрд╕ fragment рдХреЛ, function рдХреЗ parameters рдХреЛ, рдЗрд╕рд╕реЗ рдмрджрд▓реЗрдВрдЧреЗ:
|
||||
|
||||
```Python
|
||||
first_name, last_name
|
||||
```
|
||||
|
||||
рдЗрд╕рдореЗрдВ:
|
||||
|
||||
```Python
|
||||
first_name: str, last_name: str
|
||||
```
|
||||
|
||||
рдмрд╕ рдЗрддрдирд╛ рд╣реАред
|
||||
|
||||
рдпрд╣реА "type hints" рд╣реИрдВ:
|
||||
|
||||
{* ../../docs_src/python_types/tutorial002_py310.py hl[1] *}
|
||||
|
||||
рдпрд╣ default values declare рдХрд░рдиреЗ рдЬреИрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рд╣реЛрддрд╛:
|
||||
|
||||
```Python
|
||||
first_name="john", last_name="doe"
|
||||
```
|
||||
|
||||
рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдЪреАрдЬрд╝ рд╣реИред
|
||||
|
||||
рд╣рдо colons (`:`) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, equals (`=`) рдХрд╛ рдирд╣реАрдВред
|
||||
|
||||
рдФрд░ type hints рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдпрд╣ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рдХрд┐ рдмрд┐рдирд╛ рдЙрдирдХреЗ рдЬреЛ рд╣реЛрддрд╛, рд╡рд╣ рдХреИрд╕реЗ рд╣реЛрддрд╛ред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдЕрдм, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдлрд┐рд░ рд╕реЗ рдЙрд╕ function рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдмреАрдЪ рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди type hints рдХреЗ рд╕рд╛рдеред
|
||||
|
||||
рдЙрд╕реА point рдкрд░, рдЖрдк `Ctrl+Space` рдХреЗ рд╕рд╛рде autocomplete trigger рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ:
|
||||
|
||||
<img src="/img/python-types/image02.png">
|
||||
|
||||
рдЗрд╕рдХреЗ рд╕рд╛рде, рдЖрдк options рджреЗрдЦрддреЗ рд╣реБрдП scroll рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдЖрдкрдХреЛ рд╡рд╣ рди рдорд┐рд▓ рдЬрд╛рдП рдЬреЛ "рдкрд╣рдЪрд╛рдирд╛ рд╣реБрдЖ рд▓рдЧреЗ":
|
||||
|
||||
<img src="/img/python-types/image03.png">
|
||||
|
||||
## рдФрд░ рдкреНрд░реЗрд░рдгрд╛ { #more-motivation }
|
||||
|
||||
рдЗрд╕ function рдХреЛ рджреЗрдЦреЗрдВ, рдЗрд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ type hints рд╣реИрдВ:
|
||||
|
||||
{* ../../docs_src/python_types/tutorial003_py310.py hl[1] *}
|
||||
|
||||
рдХреНрдпреЛрдВрдХрд┐ editor variables рдХреЗ types рдЬрд╛рдирддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ completion рд╣реА рдирд╣реАрдВ рдорд┐рд▓рддрд╛, рдЖрдкрдХреЛ error checks рднреА рдорд┐рд▓рддреЗ рд╣реИрдВ:
|
||||
|
||||
<img src="/img/python-types/image04.png">
|
||||
|
||||
рдЕрдм рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдареАрдХ рдХрд░рдирд╛ рд╣реИ, `age` рдХреЛ `str(age)` рдХреЗ рд╕рд╛рде string рдореЗрдВ convert рдХрд░рдирд╛ рд╣реИ:
|
||||
|
||||
{* ../../docs_src/python_types/tutorial004_py310.py hl[2] *}
|
||||
|
||||
## Types declare рдХрд░рдирд╛ { #declaring-types }
|
||||
|
||||
рдЖрдкрдиреЗ рдЕрднреА type hints declare рдХрд░рдиреЗ рдХреА рдореБрдЦреНрдп рдЬрдЧрд╣ рджреЗрдЦреАред Function parameters рдХреЗ рд░реВрдк рдореЗрдВред
|
||||
|
||||
рдпрд╣реА рд╡рд╣ рдореБрдЦреНрдп рдЬрдЧрд╣ рднреА рд╣реИ рдЬрд╣рд╛рдБ рдЖрдк рдЙрдиреНрд╣реЗрдВ **FastAPI** рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
|
||||
|
||||
### Simple types { #simple-types }
|
||||
|
||||
рдЖрдк рд╕рднреА standard Python types declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ `str` рд╣реА рдирд╣реАрдВред
|
||||
|
||||
рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
|
||||
|
||||
* `int`
|
||||
* `float`
|
||||
* `bool`
|
||||
* `bytes`
|
||||
|
||||
{* ../../docs_src/python_types/tutorial005_py310.py hl[1] *}
|
||||
|
||||
### `typing` module { #typing-module }
|
||||
|
||||
рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд use cases рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ standard library рдХреЗ `typing` module рд╕реЗ рдХреБрдЫ рдЪреАрдЬрд╝реЗрдВ import рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬрдм рдЖрдк declare рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ "рдХреЛрдИ рднреА type" рд╣реИ, рддреЛ рдЖрдк `typing` рд╕реЗ `Any` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
|
||||
|
||||
```python
|
||||
from typing import Any
|
||||
|
||||
|
||||
def some_function(data: Any):
|
||||
print(data)
|
||||
```
|
||||
|
||||
### Generic types { #generic-types }
|
||||
|
||||
рдХреБрдЫ types square brackets рдореЗрдВ "type parameters" рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЙрдирдХреЗ internal types define рдХрд┐рдП рдЬрд╛ рд╕рдХреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "strings рдХреА list" рдХреЛ `list[str]` declare рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
|
||||
|
||||
рдЬреЛ types type parameters рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ **Generic types** рдпрд╛ **Generics** рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
|
||||
|
||||
рдЖрдк рдЙрдиреНрд╣реАрдВ builtin types рдХреЛ generics рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (square brackets рдФрд░ рдЕрдВрджрд░ types рдХреЗ рд╕рд╛рде):
|
||||
|
||||
* `list`
|
||||
* `tuple`
|
||||
* `set`
|
||||
* `dict`
|
||||
|
||||
#### List { #list }
|
||||
|
||||
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдПрдХ variable рдХреЛ `str` рдХреА `list` рдХреЗ рд░реВрдк рдореЗрдВ define рдХрд░рддреЗ рд╣реИрдВред
|
||||
|
||||
Variable рдХреЛ рдЙрд╕реА colon (`:`) syntax рдХреЗ рд╕рд╛рде declare рдХрд░реЗрдВред
|
||||
|
||||
Type рдХреЗ рд░реВрдк рдореЗрдВ, `list` рд░рдЦреЗрдВред
|
||||
|
||||
рдХреНрдпреЛрдВрдХрд┐ list рдПрдХ рдРрд╕рд╛ type рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ internal types рд╣реЛрддреЗ рд╣реИрдВ, рдЖрдк рдЙрдиреНрд╣реЗрдВ square brackets рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ:
|
||||
|
||||
{* ../../docs_src/python_types/tutorial006_py310.py hl[1] *}
|
||||
|
||||
/// note | рдиреЛрдЯ
|
||||
|
||||
Square brackets рдореЗрдВ рдореМрдЬреВрдж рдЙрди internal types рдХреЛ "type parameters" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
|
||||
|
||||
рдЗрд╕ case рдореЗрдВ, `str` рд╡рд╣ type parameter рд╣реИ рдЬреЛ `list` рдХреЛ pass рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
|
||||
|
||||
///
|
||||
|
||||
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ: "variable `items` рдПрдХ `list` рд╣реИ, рдФрд░ рдЗрд╕ list рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ item рдПрдХ `str` рд╣реИ"ред
|
||||
|
||||
рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ, рдЖрдкрдХрд╛ editor list рд╕реЗ items process рдХрд░рддреЗ рд╕рдордп рднреА support рджреЗ рд╕рдХрддрд╛ рд╣реИ:
|
||||
|
||||
<img src="/img/python-types/image05.png">
|
||||
|
||||
Types рдХреЗ рдмрд┐рдирд╛, рдЗрд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИред
|
||||
|
||||
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ variable `item`, list `items` рдХреЗ elements рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред
|
||||
|
||||
рдФрд░ рдлрд┐рд░ рднреА, editor рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ `str` рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рд▓рд┐рдП support рджреЗрддрд╛ рд╣реИред
|
||||
|
||||
#### Tuple рдФрд░ Set { #tuple-and-set }
|
||||
|
||||
рдЖрдк `tuple`s рдФрд░ `set`s declare рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗ:
|
||||
|
||||
{* ../../docs_src/python_types/tutorial007_py310.py hl[1] *}
|
||||
|
||||
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ:
|
||||
|
||||
* Variable `items_t` 3 items рд╡рд╛рд▓рд╛ рдПрдХ `tuple` рд╣реИ, рдПрдХ `int`, рджреВрд╕рд░рд╛ `int`, рдФрд░ рдПрдХ `str`ред
|
||||
* Variable `items_s` рдПрдХ `set` рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рддреНрдпреЗрдХ item рдХрд╛ type `bytes` рд╣реИред
|
||||
|
||||
#### Dict { #dict }
|
||||
|
||||
`dict` define рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк 2 type parameters pass рдХрд░рддреЗ рд╣реИрдВ, commas рд╕реЗ separatedред
|
||||
|
||||
рдкрд╣рд▓рд╛ type parameter `dict` рдХреА keys рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИред
|
||||
|
||||
рджреВрд╕рд░рд╛ type parameter `dict` рдХреА values рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ:
|
||||
|
||||
{* ../../docs_src/python_types/tutorial008_py310.py hl[1] *}
|
||||
|
||||
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ:
|
||||
|
||||
* Variable `prices` рдПрдХ `dict` рд╣реИ:
|
||||
* рдЗрд╕ `dict` рдХреА keys `str` type рдХреА рд╣реИрдВ (рдорд╛рди рд▓реЗрдВ, рдкреНрд░рддреНрдпреЗрдХ item рдХрд╛ рдирд╛рдо)ред
|
||||
* рдЗрд╕ `dict` рдХреА values `float` type рдХреА рд╣реИрдВ (рдорд╛рди рд▓реЗрдВ, рдкреНрд░рддреНрдпреЗрдХ item рдХреА price)ред
|
||||
|
||||
#### Union { #union }
|
||||
|
||||
рдЖрдк declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ variable **рдХрдИ types** рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ `int` рдпрд╛ рдПрдХ `str`ред
|
||||
|
||||
рдЗрд╕реЗ define рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рджреЛрдиреЛрдВ types рдХреЛ separate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП <dfn title='рдЗрд╕реЗ "bitwise or operator" рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╣ рдЕрд░реНрде рдпрд╣рд╛рдБ relevant рдирд╣реАрдВ рд╣реИ'>vertical bar (`|`)</dfn> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
|
||||
|
||||
рдЗрд╕реЗ "union" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ variable рдЙрди рджреЛ type sets рдХреЗ union рдореЗрдВ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
|
||||
|
||||
```Python hl_lines="1"
|
||||
{!> ../../docs_src/python_types/tutorial008b_py310.py!}
|
||||
```
|
||||
|
||||
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ `item` рдПрдХ `int` рдпрд╛ рдПрдХ `str` рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
|
||||
|
||||
#### рд╕рдВрднрд╡рддрдГ `None` { #possibly-none }
|
||||
|
||||
рдЖрдк declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА value рдХрд╛ type, рдЬреИрд╕реЗ `str`, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╣ `None` рднреА рд╣реЛ рд╕рдХрддреА рд╣реИред
|
||||
|
||||
//// tab | Python 3.10+
|
||||
|
||||
```Python hl_lines="1"
|
||||
{!> ../../docs_src/python_types/tutorial009_py310.py!}
|
||||
```
|
||||
|
||||
////
|
||||
|
||||
рд╕рд┐рд░реНрдл `str` рдХреЗ рдмрдЬрд╛рдп `str | None` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ editor рдЖрдкрдХреЛ рдЙрди errors рдХреЛ detect рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдБ рдЖрдк рдпрд╣ рдорд╛рди рд░рд╣реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ value рд╣рдореЗрд╢рд╛ `str` рд╣реИ, рдЬрдмрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣ `None` рднреА рд╣реЛ рд╕рдХрддреА рд╣реИред
|
||||
|
||||
### Classes рдХреЛ types рдХреЗ рд░реВрдк рдореЗрдВ { #classes-as-types }
|
||||
|
||||
рдЖрдк рдХрд┐рд╕реА class рдХреЛ рднреА variable рдХреЗ type рдХреЗ рд░реВрдк рдореЗрдВ declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
рдорд╛рди рд▓реЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ class `Person` рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ name рд╣реИ:
|
||||
|
||||
{* ../../docs_src/python_types/tutorial010_py310.py hl[1:3] *}
|
||||
|
||||
рдлрд┐рд░ рдЖрдк рдХрд┐рд╕реА variable рдХреЛ `Person` type рдХрд╛ declare рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
|
||||
|
||||
{* ../../docs_src/python_types/tutorial010_py310.py hl[6] *}
|
||||
|
||||
рдФрд░ рдлрд┐рд░, рдлрд┐рд░ рд╕реЗ, рдЖрдкрдХреЛ рдкреВрд░рд╛ editor support рдорд┐рд▓рддрд╛ рд╣реИ:
|
||||
|
||||
<img src="/img/python-types/image06.png">
|
||||
|
||||
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ "`one_person`, class `Person` рдХрд╛ рдПрдХ **instance** рд╣реИ"ред
|
||||
|
||||
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ "`one_person`, `Person` рдирд╛рдо рдХреА **class** рд╣реИ"ред
|
||||
|
||||
## Pydantic models { #pydantic-models }
|
||||
|
||||
[Pydantic](https://docs.pydantic.dev/) data validation рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ Python library рд╣реИред
|
||||
|
||||
рдЖрдк data рдХреА "shape" рдХреЛ attributes рд╡рд╛рд▓реА classes рдХреЗ рд░реВрдк рдореЗрдВ declare рдХрд░рддреЗ рд╣реИрдВред
|
||||
|
||||
рдФрд░ рдкреНрд░рддреНрдпреЗрдХ attribute рдХрд╛ рдПрдХ type рд╣реЛрддрд╛ рд╣реИред
|
||||
|
||||
рдлрд┐рд░ рдЖрдк рдХреБрдЫ values рдХреЗ рд╕рд╛рде рдЙрд╕ class рдХрд╛ рдПрдХ instance create рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ values рдХреЛ validate рдХрд░реЗрдЧрд╛, рдЙрдиреНрд╣реЗрдВ appropriate type рдореЗрдВ convert рдХрд░реЗрдЧрд╛ (рдЕрдЧрд░ рдРрд╕рд╛ case рд╣реИ) рдФрд░ рдЖрдкрдХреЛ рдкреВрд░реЗ data рд╡рд╛рд▓рд╛ рдПрдХ object рджреЗрдЧрд╛ред
|
||||
|
||||
рдФрд░ рдЙрд╕ resulting object рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдкреВрд░рд╛ editor support рдорд┐рд▓рддрд╛ рд╣реИред
|
||||
|
||||
Official Pydantic docs рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
|
||||
|
||||
{* ../../docs_src/python_types/tutorial011_py310.py *}
|
||||
|
||||
/// note | рдиреЛрдЯ
|
||||
|
||||
[Pydantic рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ docs рджреЗрдЦреЗрдВ](https://docs.pydantic.dev/)ред
|
||||
|
||||
///
|
||||
|
||||
**FastAPI** рдкреВрд░реА рддрд░рд╣ рд╕реЗ Pydantic рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред
|
||||
|
||||
рдЖрдк рдпрд╣ рд╕рдм practice рдореЗрдВ [Tutorial - User Guide](tutorial/index.md) рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рджреЗрдЦреЗрдВрдЧреЗред
|
||||
|
||||
## Metadata Annotations рдХреЗ рд╕рд╛рде Type Hints { #type-hints-with-metadata-annotations }
|
||||
|
||||
Python рдореЗрдВ рдПрдХ feature рднреА рд╣реИ рдЬреЛ `Annotated` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрди type hints рдореЗрдВ **рдЕрддрд┐рд░рд┐рдХреНрдд <dfn title="Data рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ data, рдЗрд╕ case рдореЗрдВ, type рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА, рдЬреИрд╕реЗ descriptionред">metadata</dfn>** рдбрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
|
||||
|
||||
рдЖрдк `typing` рд╕реЗ `Annotated` import рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
{* ../../docs_src/python_types/tutorial013_py310.py hl[1,4] *}
|
||||
|
||||
Python рдЦреБрдж рдЗрд╕ `Annotated` рдХреЗ рд╕рд╛рде рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ред рдФрд░ editors рдФрд░ рдЕрдиреНрдп tools рдХреЗ рд▓рд┐рдП, type рдЕрднреА рднреА `str` рд╣реИред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдЖрдк `Annotated` рдореЗрдВ рдЗрд╕ рдЬрдЧрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ **FastAPI** рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд metadata рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреА application рдХреЛ рдХреИрд╕реЗ behave рдХрд░рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
|
||||
|
||||
рдпрд╛рдж рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ `Annotated` рдХреЛ pass рдХрд┐рдпрд╛ рдЧрдпрд╛ **рдкрд╣рд▓рд╛ *type parameter*** рд╣реА **actual type** рд╣реЛрддрд╛ рд╣реИред рдмрд╛рдХреА рд╕рдм, рдЕрдиреНрдп tools рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ metadata рд╣реИред
|
||||
|
||||
рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реИ рдХрд┐ `Annotated` рдореМрдЬреВрдж рд╣реИ, рдФрд░ рдпрд╣ standard Python рд╣реИред ЁЯШО
|
||||
|
||||
рдмрд╛рдж рдореЗрдВ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ **powerful** рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдпрд╣ рддрдереНрдп рдХрд┐ рдпрд╣ **standard Python** рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ editor рдореЗрдВ, рдЕрдкрдиреЗ code рдХреЛ analyze рдФрд░ refactor рдХрд░рдиреЗ рд╡рд╛рд▓реЗ tools рдХреЗ рд╕рд╛рде, рдЖрджрд┐, рдЕрднреА рднреА **рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ possible developer experience** рдорд┐рд▓реЗрдЧрд╛ред тЬи
|
||||
|
||||
рдФрд░ рдпрд╣ рднреА рдХрд┐ рдЖрдкрдХрд╛ code рдХрдИ рдЕрдиреНрдп Python tools рдФрд░ libraries рдХреЗ рд╕рд╛рде рдмрд╣реБрдд compatible рд╣реЛрдЧрд╛ред ЁЯЪА
|
||||
|
||||
///
|
||||
|
||||
## **FastAPI** рдореЗрдВ Type hints { #type-hints-in-fastapi }
|
||||
|
||||
**FastAPI** рдЗрди type hints рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдХрд░ рдХрдИ рдЪреАрдЬрд╝реЗрдВ рдХрд░рддрд╛ рд╣реИред
|
||||
|
||||
**FastAPI** рдХреЗ рд╕рд╛рде рдЖрдк type hints рдХреЗ рд╕рд╛рде parameters declare рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдорд┐рд▓рддрд╛ рд╣реИ:
|
||||
|
||||
* **Editor support**ред
|
||||
* **Type checks**ред
|
||||
|
||||
...рдФрд░ **FastAPI** рдЙрдиреНрд╣реАрдВ declarations рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
|
||||
|
||||
* **Requirements define** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: request path parameters, query parameters, headers, bodies, dependencies, рдЖрджрд┐ рд╕реЗред
|
||||
* **Data convert** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: request рд╕реЗ required type рдореЗрдВред
|
||||
* **Data validate** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рдкреНрд░рддреНрдпреЗрдХ request рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ data рдХреЛ:
|
||||
* Data invalid рд╣реЛрдиреЗ рдкрд░ client рдХреЛ рд▓реМрдЯрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ **automatic errors** generate рдХрд░рдирд╛ред
|
||||
* OpenAPI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ API рдХреЛ **document** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
|
||||
* рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд┐рд░ automatic interactive documentation user interfaces рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
|
||||
|
||||
рдпрд╣ рд╕рдм abstract рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВред рдЖрдк рдпрд╣ рд╕рдм action рдореЗрдВ [Tutorial - User Guide](tutorial/index.md) рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред
|
||||
|
||||
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ standard Python types рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдПрдХ рд╣реА рдЬрдЧрд╣ рдкрд░ (рдЕрдзрд┐рдХ classes, decorators, рдЖрджрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп), **FastAPI** рдЖрдкрдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░рд╛ рдХрд╛рдо рдХрд░ рджреЗрдЧрд╛ред
|
||||
|
||||
/// note | рдиреЛрдЯ
|
||||
|
||||
рдЕрдЧрд░ рдЖрдк рдкрд╣рд▓реЗ рд╣реА рдкреВрд░реЗ tutorial рд╕реЗ рдЧреБрдЬрд░ рдЪреБрдХреЗ рд╣реИрдВ рдФрд░ types рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдЖрдП рд╣реИрдВ, рддреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ resource [`mypy` рдХреА "cheat sheet"](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html) рд╣реИред
|
||||
|
||||
///
|
||||
862
docs/hi/docs/virtual-environments.md
Normal file
862
docs/hi/docs/virtual-environments.md
Normal file
@@ -0,0 +1,862 @@
|
||||
# рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ { #virtual-environments }
|
||||
|
||||
рдЬрдм рдЖрдк Python рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЛ рд╣рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдЕрд▓рдЧ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ **рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ** (рдпрд╛ рдХреЛрдИ рд╕рдорд╛рди рддрд░реАрдХрд╛) рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
|
||||
|
||||
/// note | рдиреЛрдЯ
|
||||
|
||||
рдЕрдЧрд░ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдмрдирд╛рдирд╛ рдФрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рд╣реИ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рд╕реЗрдХреНрд╢рди рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред ЁЯдУ
|
||||
|
||||
///
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдПрдХ **рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ**, рдПрдХ **рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рд╡реЗрд░рд┐рдПрдмрд▓** рд╕реЗ рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИред
|
||||
|
||||
рдПрдХ **рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рд╡реЗрд░рд┐рдПрдмрд▓** рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рд╡реЗрд░рд┐рдПрдмрд▓ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
рдПрдХ **рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ** рдПрдХ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВред
|
||||
|
||||
///
|
||||
|
||||
/// note | рдиреЛрдЯ
|
||||
|
||||
рдпрд╣ рдкреЗрдЬ рдЖрдкрдХреЛ **рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯреНрд╕** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд╕рд┐рдЦрд╛рдПрдЧрд╛ред
|
||||
|
||||
рдЕрдЧрд░ рдЖрдк рдЕрдкрдиреЗ рд▓рд┐рдП **рд╕рдм рдХреБрдЫ рдореИрдиреЗрдЬ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЯреВрд▓** рдЕрдкрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ (рдЬрд┐рд╕рдореЗрдВ Python рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ), рддреЛ [uv](https://github.com/astral-sh/uv) рдЖрдЬрд╝рдорд╛рдПрдБред
|
||||
|
||||
///
|
||||
|
||||
## рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдБ { #create-a-project }
|
||||
|
||||
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдмрдирд╛рдПрдБред
|
||||
|
||||
рдореИрдВ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЕрдкрдиреА home/user рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдХреЗ рдЕрдВрджрд░ `code` рдирд╛рдо рдХреА рдПрдХ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдмрдирд╛рддрд╛ рд╣реВрдБред
|
||||
|
||||
рдФрд░ рдЙрд╕рдХреЗ рдЕрдВрджрд░ рд╣рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдмрдирд╛рддрд╛ рд╣реВрдБред
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
// рд╣реЛрдо рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдЬрд╛рдПрдБ
|
||||
$ cd
|
||||
// рдЕрдкрдиреЗ рд╕рднреА рдХреЛрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдмрдирд╛рдПрдБ
|
||||
$ mkdir code
|
||||
// рдЙрд╕ рдХреЛрдб рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдЬрд╛рдПрдБ
|
||||
$ cd code
|
||||
// рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдмрдирд╛рдПрдБ
|
||||
$ mkdir awesome-project
|
||||
// рдЙрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдЬрд╛рдПрдБ
|
||||
$ cd awesome-project
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
## рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдмрдирд╛рдПрдБ { #create-a-virtual-environment }
|
||||
|
||||
рдЬрдм рдЖрдк рдХрд┐рд╕реА Python рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ **рдкрд╣рд▓реА рдмрд╛рд░** рдХрд╛рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ **<dfn title="рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рднреА рд╣реИрдВ, рдпрд╣ рдПрдХ рд╕рд░рд▓ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢ рд╣реИ">рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░</dfn>** рдмрдирд╛рдПрдБред
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдЖрдкрдХреЛ рдпрд╣ **рд╣рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░** рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рд╣рд░ рдмрд╛рд░ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдирд╣реАрдВред
|
||||
|
||||
///
|
||||
|
||||
//// tab | `venv`
|
||||
|
||||
рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк Python рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реЗ `venv` module рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ python -m venv .venv
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
/// details | рдЙрд╕ рдХрдорд╛рдВрдб рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ
|
||||
|
||||
* `python`: `python` рдирд╛рдо рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
|
||||
* `-m`: рдХрд┐рд╕реА module рдХреЛ script рдХреА рддрд░рд╣ call рдХрд░реЗрдВ, рдЕрдЧрд▓рд╛ рд╣рдо рдЙрд╕реЗ рдмрддрд╛рдПрдБрдЧреЗ рдХрд┐ рдХреМрди-рд╕рд╛ module
|
||||
* `venv`: `venv` рдирд╛рдо рдХреЗ module рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдпрддрдГ Python рдХреЗ рд╕рд╛рде рдЗрдВрд╕реНрдЯреЙрд▓ рдЖрддрд╛ рд╣реИ
|
||||
* `.venv`: рдирдИ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА `.venv` рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдмрдирд╛рдПрдБ
|
||||
|
||||
///
|
||||
|
||||
////
|
||||
|
||||
//// tab | `uv`
|
||||
|
||||
рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ [`uv`](https://github.com/astral-sh/uv) рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ uv venv
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, `uv` `.venv` рдирд╛рдо рдХреА рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдмрдирд╛рдПрдЧрд╛ред
|
||||
|
||||
рд▓реЗрдХрд┐рди рдЖрдк рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд argument рджреЗрдХрд░ рдЗрд╕реЗ customize рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
///
|
||||
|
||||
////
|
||||
|
||||
рд╡рд╣ рдХрдорд╛рдВрдб `.venv` рдирд╛рдо рдХреА рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдПрдХ рдирдпрд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдмрдирд╛рддрд╛ рд╣реИред
|
||||
|
||||
/// details | `.venv` рдпрд╛ рдХреЛрдИ рджреВрд╕рд░рд╛ рдирд╛рдо
|
||||
|
||||
рдЖрдк рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреЛ рдХрд┐рд╕реА рджреВрд╕рд░реА рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ `.venv` рдХрд╣рдиреЗ рдХреА рдПрдХ convention рд╣реИред
|
||||
|
||||
///
|
||||
|
||||
## рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рд╕рдХреНрд░рд┐рдп рдХрд░реЗрдВ { #activate-the-virtual-environment }
|
||||
|
||||
рдирдП рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреЛ activate рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдк рдЬреЛ рднреА Python command рдЪрд▓рд╛рдПрдБ рдпрд╛ рдЬреЛ package install рдХрд░реЗрдВ, рд╡рд╣ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗред
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП **рд╣рд░ рдмрд╛рд░** рдЬрдм рдЖрдк рдПрдХ **рдирдпрд╛ terminal session** рд╢реБрд░реВ рдХрд░реЗрдВ, рддреЛ рдпрд╣ рдХрд░реЗрдВред
|
||||
|
||||
///
|
||||
|
||||
//// tab | Linux, macOS
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ source .venv/bin/activate
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
////
|
||||
|
||||
//// tab | Windows PowerShell
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ .venv\Scripts\Activate.ps1
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
////
|
||||
|
||||
//// tab | Windows Bash
|
||||
|
||||
рдпрд╛ рдЕрдЧрд░ рдЖрдк Windows рдХреЗ рд▓рд┐рдП Bash рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ [Git Bash](https://gitforwindows.org/)):
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ source .venv/Scripts/activate
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
////
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдЙрд╕ environment рдореЗрдВ рдХреЛрдИ **рдирдпрд╛ package** install рдХрд░реЗрдВ, рддреЛ environment рдХреЛ рдлрд┐рд░ рд╕реЗ **activate** рдХрд░реЗрдВред
|
||||
|
||||
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдк рдЙрд╕ package рджреНрд╡рд╛рд░рд╛ install рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдИ **terminal (<abbr title="command line interface - рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕">CLI</abbr>) program** рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рд╡рд╛рд▓рд╛ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдХреЛрдИ рдФрд░ рдирд╣реАрдВ рдЬреЛ global рд░реВрдк рд╕реЗ install рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдЖрдкрдХреА рдЬрд╝рд░реВрд░рдд рд╕реЗ рдЕрд▓рдЧ version рдХреЗ рд╕рд╛рдеред
|
||||
|
||||
///
|
||||
|
||||
## рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рд╕рдХреНрд░рд┐рдп рд╣реИ { #check-the-virtual-environment-is-active }
|
||||
|
||||
рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ active рд╣реИ (рдкрд┐рдЫрд▓реА command рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛)ред
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдпрд╣ **рд╡реИрдХрд▓реНрдкрд┐рдХ** рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ **рдЬрд╛рдБрдЪрдиреЗ** рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЖрдк рд╡рд╣реА рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЖрдкрдиреЗ рдЗрд░рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛ред
|
||||
|
||||
///
|
||||
|
||||
//// tab | Linux, macOS, Windows Bash
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ which python
|
||||
|
||||
/home/user/code/awesome-project/.venv/bin/python
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
рдЕрдЧрд░ рдпрд╣ `.venv/bin/python` рдкрд░ `python` binary рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ `awesome-project`), рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░ рдЧрдпрд╛ред ЁЯОЙ
|
||||
|
||||
////
|
||||
|
||||
//// tab | Windows PowerShell
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ Get-Command python
|
||||
|
||||
C:\Users\user\code\awesome-project\.venv\Scripts\python
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
рдЕрдЧрд░ рдпрд╣ `.venv\Scripts\python` рдкрд░ `python` binary рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрджрд░ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ `awesome-project`), рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░ рдЧрдпрд╛ред ЁЯОЙ
|
||||
|
||||
////
|
||||
|
||||
## `pip` рдЕрдкрдЧреНрд░реЗрдб рдХрд░реЗрдВ { #upgrade-pip }
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдЕрдЧрд░ рдЖрдк [`uv`](https://github.com/astral-sh/uv) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЪреАрдЬреЗрдВ install рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `pip` рдХреА рдмрдЬрд╛рдп рдЙрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ `pip` upgrade рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред ЁЯШО
|
||||
|
||||
///
|
||||
|
||||
рдЕрдЧрд░ рдЖрдк packages install рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `pip` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдпрд╣ Python рдХреЗ рд╕рд╛рде default рд░реВрдк рд╕реЗ рдЖрддрд╛ рд╣реИ), рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ latest version рдореЗрдВ **upgrade** рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
|
||||
|
||||
рдХрд┐рд╕реА package рдХреЛ install рдХрд░рддреЗ рд╕рдордп рдХрдИ рдЕрдЬреАрдм errors рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ `pip` upgrade рдХрд░рдиреЗ рд╕реЗ рд╣рд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдЖрдк рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдпрд╣ **рдПрдХ рдмрд╛рд░** рдХрд░реЗрдВрдЧреЗ, рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдареАрдХ рдмрд╛рджред
|
||||
|
||||
///
|
||||
|
||||
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ active рд╣реИ (рдКрдкрд░ рд╡рд╛рд▓реА command рд╕реЗ) рдФрд░ рдлрд┐рд░ рдЪрд▓рд╛рдПрдБ:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ python -m pip install --upgrade pip
|
||||
|
||||
---> 100%
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдХрднреА-рдХрднреА, pip upgrade рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ **`No module named pip`** error рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред
|
||||
|
||||
рдЕрдЧрд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдиреАрдЪреЗ рджреА рдЧрдИ command рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ pip install рдФрд░ upgrade рдХрд░реЗрдВ:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ python -m ensurepip --upgrade
|
||||
|
||||
---> 100%
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
рдпрд╣ command pip рдХреЛ install рдХрд░реЗрдЧреА рдЕрдЧрд░ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ install рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдЧреА рдХрд┐ install рдХрд┐рдпрд╛ рдЧрдпрд╛ pip рдХрд╛ version рдХрдо рд╕реЗ рдХрдо `ensurepip` рдореЗрдВ рдЙрдкрд▓рдмреНрдз version рдЬрд┐рддрдирд╛ рдирдпрд╛ рд╣реЛред
|
||||
|
||||
///
|
||||
|
||||
## `.gitignore` рдЬреЛрдбрд╝реЗрдВ { #add-gitignore }
|
||||
|
||||
рдЕрдЧрд░ рдЖрдк **Git** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЖрдкрдХреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП), рддреЛ рдЕрдкрдиреА `.venv` рдХреА рд╣рд░ рдЪреАрдЬрд╝ рдХреЛ Git рд╕реЗ exclude рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ `.gitignore` file рдЬреЛрдбрд╝реЗрдВред
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдЕрдЧрд░ рдЖрдкрдиреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП [`uv`](https://github.com/astral-sh/uv) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╣реА рдХрд░ рдЪреБрдХрд╛ рд╣реИ, рдЖрдк рдпрд╣ step рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред ЁЯШО
|
||||
|
||||
///
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдпрд╣ **рдПрдХ рдмрд╛рд░** рдХрд░реЗрдВ, рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рдареАрдХ рдмрд╛рджред
|
||||
|
||||
///
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ echo "*" > .venv/.gitignore
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
/// details | рдЙрд╕ рдХрдорд╛рдВрдб рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ
|
||||
|
||||
* `echo "*"`: terminal рдореЗрдВ text `*` рдХреЛ "print" рдХрд░реЗрдЧрд╛ (рдЕрдЧрд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ)
|
||||
* `>`: `>` рдХреЗ рдмрд╛рдИрдВ рдУрд░ рд╡рд╛рд▓реА command рджреНрд╡рд╛рд░рд╛ terminal рдореЗрдВ print рдХреА рдЧрдИ рдХреЛрдИ рднреА рдЪреАрдЬрд╝ print рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдмрд▓реНрдХрд┐ `>` рдХреЗ рджрд╛рдИрдВ рдУрд░ рд╡рд╛рд▓реА file рдореЗрдВ рд▓рд┐рдЦреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП
|
||||
* `.gitignore`: рдЙрд╕ file рдХрд╛ рдирд╛рдо рдЬрд╣рд╛рдБ text рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
|
||||
|
||||
рдФрд░ Git рдХреЗ рд▓рд┐рдП `*` рдХрд╛ рдорддрд▓рдм "рд╕рдм рдХреБрдЫ" рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ `.venv` directory рдореЗрдВ рд╕рдм рдХреБрдЫ ignore рдХрд░реЗрдЧрд╛ред
|
||||
|
||||
рд╡рд╣ command `.gitignore` file рдмрдирд╛рдПрдЧреА, рдЗрд╕ content рдХреЗ рд╕рд╛рде:
|
||||
|
||||
```gitignore
|
||||
*
|
||||
```
|
||||
|
||||
///
|
||||
|
||||
## Packages рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ { #install-packages }
|
||||
|
||||
Environment activate рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЙрд╕рдореЗрдВ packages install рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдЬрдм рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ packages install рдпрд╛ upgrade рдХрд░ рд░рд╣реЗ рд╣реЛрдВ, рддреЛ рдпрд╣ **рдПрдХ рдмрд╛рд░** рдХрд░реЗрдВред
|
||||
|
||||
рдЕрдЧрд░ рдЖрдкрдХреЛ рдХрд┐рд╕реА version рдХреЛ upgrade рдХрд░рдирд╛ рд╣реЛ рдпрд╛ рдХреЛрдИ рдирдпрд╛ package рдЬреЛрдбрд╝рдирд╛ рд╣реЛ, рддреЛ рдЖрдк **рдпрд╣ рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВрдЧреЗ**ред
|
||||
|
||||
///
|
||||
|
||||
### рд╕реАрдзреЗ Packages рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ { #install-packages-directly }
|
||||
|
||||
рдЕрдЧрд░ рдЖрдк рдЬрд▓реНрджреА рдореЗрдВ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА package requirements declare рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ file рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕реАрдзреЗ install рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдЖрдкрдХреЗ program рдХреЛ рдЬрд┐рди packages рдФрд░ versions рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдПрдХ file рдореЗрдВ рд░рдЦрдирд╛ (рдмрд╣реБрдд) рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП `requirements.txt` рдпрд╛ `pyproject.toml`)ред
|
||||
|
||||
///
|
||||
|
||||
//// tab | `pip`
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ pip install "fastapi[standard]"
|
||||
|
||||
---> 100%
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
////
|
||||
|
||||
//// tab | `uv`
|
||||
|
||||
рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ [`uv`](https://github.com/astral-sh/uv) рд╣реИ:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ uv pip install "fastapi[standard]"
|
||||
---> 100%
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
////
|
||||
|
||||
### `requirements.txt` рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ { #install-from-requirements-txt }
|
||||
|
||||
рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ `requirements.txt` рд╣реИ, рддреЛ рдЕрдм рдЖрдк рдЗрд╕рдХреЗ packages install рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
//// tab | `pip`
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ pip install -r requirements.txt
|
||||
---> 100%
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
////
|
||||
|
||||
//// tab | `uv`
|
||||
|
||||
рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ [`uv`](https://github.com/astral-sh/uv) рд╣реИ:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ uv pip install -r requirements.txt
|
||||
---> 100%
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
////
|
||||
|
||||
/// details | `requirements.txt`
|
||||
|
||||
рдХреБрдЫ packages рд╡рд╛рд▓рд╛ `requirements.txt` рдРрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
|
||||
|
||||
```requirements.txt
|
||||
fastapi[standard]==0.113.0
|
||||
pydantic==2.8.0
|
||||
```
|
||||
|
||||
///
|
||||
|
||||
## рдЕрдкрдирд╛ Program рдЪрд▓рд╛рдПрдБ { #run-your-program }
|
||||
|
||||
рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ activate рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЕрдкрдирд╛ program рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреЗ рдЕрдВрджрд░ рдореМрдЬреВрдж Python рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдЙрди packages рдХреЗ рд╕рд╛рде рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдиреЗ рд╡рд╣рд╛рдБ install рдХрд┐рдпрд╛ рд╣реИред
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ python main.py
|
||||
|
||||
Hello World
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
## рдЕрдкрдирд╛ Editor рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ { #configure-your-editor }
|
||||
|
||||
рдЖрдк рд╢рд╛рдпрдж рдПрдХ editor рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЙрд╕реА рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП configure рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдмрдирд╛рдпрд╛ рд╣реИ (рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕реЗ autodetect рдХрд░ рд▓реЗрдЧрд╛), рддрд╛рдХрд┐ рдЖрдкрдХреЛ autocompletion рдФрд░ inline errors рдорд┐рд▓ рд╕рдХреЗрдВред
|
||||
|
||||
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
|
||||
|
||||
* [VS Code](https://code.visualstudio.com/docs/python/environments#_select-and-activate-an-environment)
|
||||
* [PyCharm](https://www.jetbrains.com/help/pycharm/creating-virtual-environment.html)
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдЖрдкрдХреЛ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдпрд╣ рдХреЗрд╡рд▓ **рдПрдХ рдмрд╛рд░** рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рдЖрдк рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред
|
||||
|
||||
///
|
||||
|
||||
## рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░реЗрдВ { #deactivate-the-virtual-environment }
|
||||
|
||||
рдЬрдм рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд░ рд▓реЗрдВ, рддреЛ рдЖрдк рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреЛ **deactivate** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ deactivate
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
рдЗрд╕ рддрд░рд╣, рдЬрдм рдЖрдк `python` рдЪрд▓рд╛рдПрдБрдЧреЗ, рддреЛ рдпрд╣ рд╡рд╣рд╛рдБ install packages рд╡рд╛рд▓реЗ рдЙрд╕ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рд╕реЗ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
|
||||
|
||||
## рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ { #ready-to-work }
|
||||
|
||||
рдЕрдм рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдХреНрдпрд╛ рдЖрдк рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдКрдкрд░ рдХреА рд╕рд╛рд░реА рдЪреАрдЬрд╝реЗрдВ рдХреНрдпрд╛ рд╣реИрдВ?
|
||||
|
||||
рдЖрдЧреЗ рдкрдврд╝рддреЗ рд░рд╣реЗрдВред ЁЯСЗЁЯдУ
|
||||
|
||||
///
|
||||
|
||||
## рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреНрдпреЛрдВ { #why-virtual-environments }
|
||||
|
||||
FastAPI рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ [Python](https://www.python.org/) install рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
|
||||
|
||||
рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ FastAPI рдФрд░ рдХреЛрдИ рднреА рдЕрдиреНрдп **packages** рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, **install** рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред
|
||||
|
||||
Packages install рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рд╛рдорд╛рдиреНрдпрддрдГ Python рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реА `pip` command (рдпрд╛ рд╕рдорд╛рди alternatives) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
|
||||
|
||||
рдлрд┐рд░ рднреА, рдЕрдЧрд░ рдЖрдк рд╕реАрдзреЗ `pip` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ packages рдЖрдкрдХреЗ **global Python environment** (Python рдХреА global installation) рдореЗрдВ install рд╣реЛ рдЬрд╛рдПрдБрдЧреЗред
|
||||
|
||||
### рд╕рдорд╕реНрдпрд╛ { #the-problem }
|
||||
|
||||
рддреЛ, global Python environment рдореЗрдВ packages install рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ?
|
||||
|
||||
рдХрд┐рд╕реА рд╕рдордп, рдЖрдк рд╢рд╛рдпрдж рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ programs рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ **рдЕрд▓рдЧ-рдЕрд▓рдЧ packages** рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЬрд┐рди projects рдкрд░ рдЖрдк рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдЙрд╕реА package рдХреЗ **рдЕрд▓рдЧ-рдЕрд▓рдЧ versions** рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдВрдЧреЗред ЁЯШ▒
|
||||
|
||||
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк `philosophers-stone` рдирд╛рдо рдХрд╛ рдПрдХ project рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ program **`harry`, version `1`** рдирд╛рдо рдХреЗ рдХрд┐рд╕реА рджреВрд╕рд░реЗ package рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ `harry` install рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
stone(philosophers-stone) -->|requires| harry-1[harry v1]
|
||||
```
|
||||
|
||||
рдлрд┐рд░, рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рдЖрдк `prisoner-of-azkaban` рдирд╛рдо рдХрд╛ рджреВрд╕рд░рд╛ project рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ project рднреА `harry` рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ project рдХреЛ **`harry` version `3`** рдЪрд╛рд╣рд┐рдПред
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
azkaban(prisoner-of-azkaban) --> |requires| harry-3[harry v3]
|
||||
```
|
||||
|
||||
рд▓реЗрдХрд┐рди рдЕрдм рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдк packages рдХреЛ local **рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ** рдореЗрдВ install рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп globally (global environment рдореЗрдВ) install рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ `harry` рдХрд╛ рдХреМрди-рд╕рд╛ version install рдХрд░рдирд╛ рд╣реИред
|
||||
|
||||
рдЕрдЧрд░ рдЖрдк `philosophers-stone` рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ `harry` version `1` install рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ pip install "harry==1"
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
рдФрд░ рдлрд┐рд░ рдЖрдкрдХреЗ global Python environment рдореЗрдВ `harry` version `1` install рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph global[global env]
|
||||
harry-1[harry v1]
|
||||
end
|
||||
subgraph stone-project[philosophers-stone project]
|
||||
stone(philosophers-stone) -->|requires| harry-1
|
||||
end
|
||||
```
|
||||
|
||||
рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЕрдЧрд░ рдЖрдк `prisoner-of-azkaban` рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ `harry` version `1` uninstall рдХрд░рдХреЗ `harry` version `3` install рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╛ рд╕рд┐рд░реНрдл version `3` install рдХрд░рдиреЗ рд╕реЗ version `1` automatically uninstall рд╣реЛ рдЬрд╛рдПрдЧрд╛)ред
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ pip install "harry==3"
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
рдФрд░ рдлрд┐рд░ рдЖрдкрдХреЗ global Python environment рдореЗрдВ `harry` version `3` install рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
|
||||
|
||||
рдФрд░ рдЕрдЧрд░ рдЖрдк `philosophers-stone` рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ **рдХрд╛рдо рди рдХрд░реЗ** рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ `harry` version `1` рдЪрд╛рд╣рд┐рдПред
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph global[global env]
|
||||
harry-1[<strike>harry v1</strike>]
|
||||
style harry-1 fill:#ccc,stroke-dasharray: 5 5
|
||||
harry-3[harry v3]
|
||||
end
|
||||
subgraph stone-project[philosophers-stone project]
|
||||
stone(philosophers-stone) -.-x|тЫФя╕П| harry-1
|
||||
end
|
||||
subgraph azkaban-project[prisoner-of-azkaban project]
|
||||
azkaban(prisoner-of-azkaban) --> |requires| harry-3
|
||||
end
|
||||
```
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
Python packages рдореЗрдВ **рдирдП versions** рдореЗрдВ **breaking changes рд╕реЗ рдмрдЪрдиреЗ** рдХреА рдкреВрд░реА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрдо рд╣реИ, рд▓реЗрдХрд┐рди рд╕реБрд░рдХреНрд╖рд┐рдд рд░рд╣рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдФрд░ рдирдП versions рдХреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рддрдерд╛ рддрдм install рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдЬрдм рдЖрдк tests рдЪрд▓рд╛рдХрд░ рдЬрд╛рдБрдЪ рд╕рдХреЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
|
||||
|
||||
///
|
||||
|
||||
рдЕрдм, рдпрд╣реА рдЪреАрдЬрд╝ рдЙрди **рдХрдИ** рдЕрдиреНрдп **packages** рдХреЗ рд╕рд╛рде рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬрд┐рди рдкрд░ рдЖрдкрдХреЗ рд╕рднреА **projects рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ**ред рдЗрд╕реЗ manage рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИред рдФрд░ рд╕рдВрднрд╡рддрдГ рдЖрдк рдХреБрдЫ projects рдХреЛ packages рдХреЗ рдХреБрдЫ **incompatible versions** рдХреЗ рд╕рд╛рде рдЪрд▓рд╛ рджреЗрдВрдЧреЗ, рдФрд░ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рдкрд╛рдПрдБрдЧреЗ рдХрд┐ рдХреБрдЫ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ред
|
||||
|
||||
рд╕рд╛рде рд╣реА, рдЖрдкрдХреЗ operating system (рдЬреИрд╕реЗ Linux, Windows, macOS) рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЙрд╕рдореЗрдВ Python рдкрд╣рд▓реЗ рд╕реЗ install рдЖрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрднрд╡рддрдГ рдХреБрдЫ packages рдХреБрдЫ specific versions рдХреЗ рд╕рд╛рде pre-installed рд╣реЛрдВрдЧреЗ рдЬреЛ **рдЖрдкрдХреЗ system рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ** рд╣реИрдВред рдЕрдЧрд░ рдЖрдк global Python environment рдореЗрдВ packages install рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ operating system рдХреЗ рд╕рд╛рде рдЖрдП рдХреБрдЫ programs рдХреЛ **break** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
## Packages рдХрд╣рд╛рдБ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛрддреЗ рд╣реИрдВ { #where-are-packages-installed }
|
||||
|
||||
рдЬрдм рдЖрдк Python install рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрдкрдХреЗ computer рдкрд░ рдХреБрдЫ files рд╡рд╛рд▓реА рдХреБрдЫ directories рдмрдирд╛рддрд╛ рд╣реИред
|
||||
|
||||
рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ directories рд╡реЗ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ install рдХрд┐рдП рдЧрдП рд╕рднреА packages рдХреЛ рд░рдЦрдиреЗ рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрддреА рд╣реИрдВред
|
||||
|
||||
рдЬрдм рдЖрдк рдЪрд▓рд╛рддреЗ рд╣реИрдВ:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
// рдЗрд╕реЗ рдЕрднреА рди рдЪрд▓рд╛рдПрдБ, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ ЁЯдУ
|
||||
$ pip install "fastapi[standard]"
|
||||
---> 100%
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
рддреЛ рдпрд╣ FastAPI code рд╡рд╛рд▓реА рдПрдХ compressed file download рдХрд░реЗрдЧрд╛, рд╕рд╛рдорд╛рдиреНрдпрддрдГ [PyPI](https://pypi.org/project/fastapi/) рд╕реЗред
|
||||
|
||||
рдпрд╣ рдЙрди рдЕрдиреНрдп packages рдХреА files рднреА **download** рдХрд░реЗрдЧрд╛ рдЬрд┐рди рдкрд░ FastAPI рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
|
||||
|
||||
рдлрд┐рд░ рдпрд╣ рдЙрди рд╕рднреА files рдХреЛ **extract** рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЖрдкрдХреЗ computer рдХреА рдПрдХ directory рдореЗрдВ рд░рдЦреЗрдЧрд╛ред
|
||||
|
||||
Default рд░реВрдк рд╕реЗ, рдпрд╣ рдЙрди downloaded рдФрд░ extracted files рдХреЛ рдЙрд╕ directory рдореЗрдВ рд░рдЦреЗрдЧрд╛ рдЬреЛ рдЖрдкрдХреА Python installation рдХреЗ рд╕рд╛рде рдЖрддреА рд╣реИ, рд╡рд╣реА **global environment** рд╣реИред
|
||||
|
||||
## рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯреНрд╕ рдХреНрдпрд╛ рд╣реИрдВ { #what-are-virtual-environments }
|
||||
|
||||
рд╕рднреА packages рдХреЛ global environment рдореЗрдВ рд░рдЦрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ рдХрд┐ рдЖрдк рдЬрд┐рд╕ рднреА project рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЙрд╕рдХреЗ рд▓рд┐рдП **рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ** рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
|
||||
|
||||
рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдПрдХ **directory** рд╣реИ, global рд╡рд╛рд▓реА рдХреЗ рдмрд╣реБрдд рд╕рдорд╛рди, рдЬрд╣рд╛рдБ рдЖрдк рдХрд┐рд╕реА project рдХреЗ рд▓рд┐рдП packages install рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
рдЗрд╕ рддрд░рд╣, рд╣рд░ project рдХрд╛ рдЕрдкрдирд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ (`.venv` directory) рд╣реЛрдЧрд╛, рдЕрдкрдиреЗ packages рдХреЗ рд╕рд╛рдеред
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
subgraph stone-project[philosophers-stone project]
|
||||
stone(philosophers-stone) --->|requires| harry-1
|
||||
subgraph venv1[.venv]
|
||||
harry-1[harry v1]
|
||||
end
|
||||
end
|
||||
subgraph azkaban-project[prisoner-of-azkaban project]
|
||||
azkaban(prisoner-of-azkaban) --->|requires| harry-3
|
||||
subgraph venv2[.venv]
|
||||
harry-3[harry v3]
|
||||
end
|
||||
end
|
||||
stone-project ~~~ azkaban-project
|
||||
```
|
||||
|
||||
## рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ activate рдХрд░рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ { #what-does-activating-a-virtual-environment-mean }
|
||||
|
||||
рдЬрдм рдЖрдк рдХрд┐рд╕реА рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреЛ activate рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
|
||||
|
||||
//// tab | Linux, macOS
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ source .venv/bin/activate
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
////
|
||||
|
||||
//// tab | Windows PowerShell
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ .venv\Scripts\Activate.ps1
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
////
|
||||
|
||||
//// tab | Windows Bash
|
||||
|
||||
рдпрд╛ рдЕрдЧрд░ рдЖрдк Windows рдХреЗ рд▓рд┐рдП Bash рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ [Git Bash](https://gitforwindows.org/)):
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ source .venv/Scripts/activate
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
////
|
||||
|
||||
рд╡рд╣ command рдХреБрдЫ [environment variables](environment-variables.md) рдмрдирд╛рдПрдЧреА рдпрд╛ modify рдХрд░реЗрдЧреА, рдЬреЛ рдЕрдЧрд▓реА commands рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗред
|
||||
|
||||
рдЙрди variables рдореЗрдВ рд╕реЗ рдПрдХ `PATH` variable рд╣реИред
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдЖрдк [Environment Variables](environment-variables.md#path-environment-variable) section рдореЗрдВ `PATH` environment variable рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред
|
||||
|
||||
///
|
||||
|
||||
рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ activate рдХрд░рдиреЗ рд╕реЗ рдЙрд╕рдХрд╛ path `.venv/bin` (Linux рдФрд░ macOS рдкрд░) рдпрд╛ `.venv\Scripts` (Windows рдкрд░) `PATH` environment variable рдореЗрдВ рдЬреБрдбрд╝ рдЬрд╛рддрд╛ рд╣реИред
|
||||
|
||||
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ environment activate рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, `PATH` variable рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рдерд╛:
|
||||
|
||||
//// tab | Linux, macOS
|
||||
|
||||
```plaintext
|
||||
/usr/bin:/bin:/usr/sbin:/sbin
|
||||
```
|
||||
|
||||
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ system programs рдХреЛ рдЗрдирдореЗрдВ рдЦреЛрдЬрддрд╛:
|
||||
|
||||
* `/usr/bin`
|
||||
* `/bin`
|
||||
* `/usr/sbin`
|
||||
* `/sbin`
|
||||
|
||||
////
|
||||
|
||||
//// tab | Windows
|
||||
|
||||
```plaintext
|
||||
C:\Windows\System32
|
||||
```
|
||||
|
||||
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ system programs рдХреЛ рдЗрд╕рдореЗрдВ рдЦреЛрдЬрддрд╛:
|
||||
|
||||
* `C:\Windows\System32`
|
||||
|
||||
////
|
||||
|
||||
рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ activate рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, `PATH` variable рдХреБрдЫ рдРрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:
|
||||
|
||||
//// tab | Linux, macOS
|
||||
|
||||
```plaintext
|
||||
/home/user/code/awesome-project/.venv/bin:/usr/bin:/bin:/usr/sbin:/sbin
|
||||
```
|
||||
|
||||
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ system рдЕрдм рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ programs рдХреЛ рдпрд╣рд╛рдБ рдЦреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдЧрд╛:
|
||||
|
||||
```plaintext
|
||||
/home/user/code/awesome-project/.venv/bin
|
||||
```
|
||||
|
||||
рдмрд╛рдХреА directories рдореЗрдВ рджреЗрдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗред
|
||||
|
||||
рддреЛ, рдЬрдм рдЖрдк terminal рдореЗрдВ `python` type рдХрд░рддреЗ рд╣реИрдВ, рддреЛ system Python program рдХреЛ рдпрд╣рд╛рдБ рдкрд╛рдПрдЧрд╛
|
||||
|
||||
```plaintext
|
||||
/home/user/code/awesome-project/.venv/bin/python
|
||||
```
|
||||
|
||||
рдФрд░ рдЙрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
|
||||
|
||||
////
|
||||
|
||||
//// tab | Windows
|
||||
|
||||
```plaintext
|
||||
C:\Users\user\code\awesome-project\.venv\Scripts;C:\Windows\System32
|
||||
```
|
||||
|
||||
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ system рдЕрдм рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ programs рдХреЛ рдпрд╣рд╛рдБ рдЦреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдЧрд╛:
|
||||
|
||||
```plaintext
|
||||
C:\Users\user\code\awesome-project\.venv\Scripts
|
||||
```
|
||||
|
||||
рдмрд╛рдХреА directories рдореЗрдВ рджреЗрдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗред
|
||||
|
||||
рддреЛ, рдЬрдм рдЖрдк terminal рдореЗрдВ `python` type рдХрд░рддреЗ рд╣реИрдВ, рддреЛ system Python program рдХреЛ рдпрд╣рд╛рдБ рдкрд╛рдПрдЧрд╛
|
||||
|
||||
```plaintext
|
||||
C:\Users\user\code\awesome-project\.venv\Scripts\python
|
||||
```
|
||||
|
||||
рдФрд░ рдЙрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
|
||||
|
||||
////
|
||||
|
||||
рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг detail рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ path рдХреЛ `PATH` variable рдХреА **рд╢реБрд░реБрдЖрдд** рдореЗрдВ рд░рдЦреЗрдЧрд╛ред System рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЙрдкрд▓рдмреНрдз Python рд╕реЗ **рдкрд╣рд▓реЗ** рдкрд╛рдПрдЧрд╛ред рдЗрд╕ рддрд░рд╣, рдЬрдм рдЖрдк `python` рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп `python` (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, global environment рд╡рд╛рд▓рд╛ `python`) рдХреЗ рдмрдЬрд╛рдп **рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рд╕реЗ** Python рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
|
||||
|
||||
рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ activate рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рдФрд░ рдЪреАрдЬреЗрдВ рднреА рдмрджрд▓рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬрд╝реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред
|
||||
|
||||
## рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ { #checking-a-virtual-environment }
|
||||
|
||||
рдЬрдм рдЖрдк рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ active рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
|
||||
|
||||
//// tab | Linux, macOS, Windows Bash
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ which python
|
||||
|
||||
/home/user/code/awesome-project/.venv/bin/python
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
////
|
||||
|
||||
//// tab | Windows PowerShell
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ Get-Command python
|
||||
|
||||
C:\Users\user\code\awesome-project\.venv\Scripts\python
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
////
|
||||
|
||||
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЬреЛ `python` program рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╡рд╣ **рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдореЗрдВ** рдореМрдЬреВрдж рд╣реИред
|
||||
|
||||
рдЖрдк Linux рдФрд░ macOS рдореЗрдВ `which` рдФрд░ Windows PowerShell рдореЗрдВ `Get-Command` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
|
||||
|
||||
рд╡рд╣ command рдЬрд┐рд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ `PATH` environment variable рдореЗрдВ рдЬрд╛рдХрд░ **рд╣рд░ path рдХреЛ рдХреНрд░рдо рд╕реЗ** check рдХрд░реЗрдЧреА, `python` рдирд╛рдо рдХреЗ program рдХреЛ рдЦреЛрдЬрддреЗ рд╣реБрдПред рдПрдХ рдмрд╛рд░ рдЬрдм рдпрд╣ рдЙрд╕реЗ рдвреВрдБрдв рд▓реЗрддреА рд╣реИ, рддреЛ рдпрд╣ рдЖрдкрдХреЛ рдЙрд╕ program рдХрд╛ **path рджрд┐рдЦрд╛рдПрдЧреА**ред
|
||||
|
||||
рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк `python` call рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╣реА exact "`python`" execute рд╣реЛрдЧрд╛ред
|
||||
|
||||
рддреЛ, рдЖрдк confirm рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рд╕рд╣реА рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдореЗрдВ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред
|
||||
|
||||
/// tip | рд╕реБрдЭрд╛рд╡
|
||||
|
||||
рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ activate рдХрд░рдирд╛, рдПрдХ Python рдкрд╛рдирд╛, рдФрд░ рдлрд┐рд░ **рджреВрд╕рд░реЗ project рдореЗрдВ рдЪрд▓реЗ рдЬрд╛рдирд╛** рдЖрд╕рд╛рди рд╣реИред
|
||||
|
||||
рдФрд░ рджреВрд╕рд░рд╛ project **рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛** рдХреНрдпреЛрдВрдХрд┐ рдЖрдк **рдЧрд▓рдд Python** рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдХрд┐рд╕реА рджреВрд╕рд░реЗ project рдХреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рд╕реЗ рд╣реИред
|
||||
|
||||
рдпрд╣ check рдХрд░ рдкрд╛рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рдХреМрди-рд╕рд╛ `python` рдЙрдкрдпреЛрдЧ рд╣реЛ рд░рд╣рд╛ рд╣реИред ЁЯдУ
|
||||
|
||||
///
|
||||
|
||||
## рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ deactivate рдХреНрдпреЛрдВ рдХрд░реЗрдВ { #why-deactivate-a-virtual-environment }
|
||||
|
||||
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк `philosophers-stone` project рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, **рдЙрд╕ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреЛ activate** рдХрд░рдХреЗ, packages install рдХрд░рдХреЗ рдФрд░ рдЙрд╕ environment рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдХреЗред
|
||||
|
||||
рдФрд░ рдлрд┐рд░ рдЖрдк **рдХрд┐рд╕реА рджреВрд╕рд░реЗ project** `prisoner-of-azkaban` рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
|
||||
|
||||
рдЖрдк рдЙрд╕ project рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ:
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ cd ~/code/prisoner-of-azkaban
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
рдЕрдЧрд░ рдЖрдк `philosophers-stone` рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреЛ deactivate рдирд╣реАрдВ рдХрд░рддреЗ, рддреЛ рдЬрдм рдЖрдк terminal рдореЗрдВ `python` рдЪрд▓рд╛рдПрдБрдЧреЗ, рдпрд╣ `philosophers-stone` рд╕реЗ Python рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ред
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ cd ~/code/prisoner-of-azkaban
|
||||
|
||||
$ python main.py
|
||||
|
||||
// sirius import рдХрд░рдиреЗ рдореЗрдВ error, рдпрд╣ install рдирд╣реАрдВ рд╣реИ ЁЯШ▒
|
||||
Traceback (most recent call last):
|
||||
File "main.py", line 1, in <module>
|
||||
import sirius
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ deactivate рдХрд░рдХреЗ `prisoner-of-azkaban` рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╡рд╛рд▓рд╛ activate рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЬрдм рдЖрдк `python` рдЪрд▓рд╛рдПрдБрдЧреЗ, рдпрд╣ `prisoner-of-azkaban` рдореЗрдВ рдореМрдЬреВрдж рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рд╕реЗ Python рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
|
||||
|
||||
<div class="termy">
|
||||
|
||||
```console
|
||||
$ cd ~/code/prisoner-of-azkaban
|
||||
|
||||
// deactivate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкреБрд░рд╛рдиреА directory рдореЗрдВ рд╣реЛрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЖрдк рдЬрд╣рд╛рдБ рднреА рд╣реЛрдВ рд╡рд╣рд╛рдБ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рджреВрд╕рд░реЗ project рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рднреА ЁЯШО
|
||||
$ deactivate
|
||||
|
||||
// prisoner-of-azkaban/.venv рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ activate рдХрд░реЗрдВ ЁЯЪА
|
||||
$ source .venv/bin/activate
|
||||
|
||||
// рдЕрдм рдЬрдм рдЖрдк python рдЪрд▓рд╛рдПрдБрдЧреЗ, рддреЛ рдпрд╣ рдЗрд╕ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдореЗрдВ install package sirius рдХреЛ рдкрд╛рдПрдЧрд╛ тЬи
|
||||
$ python main.py
|
||||
|
||||
I solemnly swear ЁЯР║
|
||||
```
|
||||
|
||||
</div>
|
||||
|
||||
## Alternatives { #alternatives }
|
||||
|
||||
рдпрд╣ рдЖрдкрдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдпрд╣ рд╕рд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ guide рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ **рдЕрдВрджрд░ рд╕реЗ** рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
|
||||
|
||||
Virtual environments, package dependencies (requirements), projects рдХреЛ manage рдХрд░рдиреЗ рдХреЗ рдХрдИ **alternatives** рд╣реИрдВред
|
||||
|
||||
рдЬрдм рдЖрдк рддреИрдпрд╛рд░ рд╣реЛрдВ рдФрд░ **рдкреВрд░реЗ project рдХреЛ manage** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ tool рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВ, package dependencies, virtual environments рдЖрджрд┐ рд╕рд╣рд┐рдд, рддреЛ рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреВрдБрдЧрд╛ рдХрд┐ рдЖрдк [uv](https://github.com/astral-sh/uv) рдЖрдЬрд╝рдорд╛рдПрдБред
|
||||
|
||||
`uv` рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреАрдЬрд╝реЗрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
|
||||
|
||||
* рдЖрдкрдХреЗ рд▓рд┐рдП **Python install** рдХрд░рдирд╛, рдЕрд▓рдЧ-рдЕрд▓рдЧ versions рд╕рд╣рд┐рдд
|
||||
* рдЖрдкрдХреЗ projects рдХреЗ рд▓рд┐рдП **рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ** manage рдХрд░рдирд╛
|
||||
* **Packages** install рдХрд░рдирд╛
|
||||
* рдЖрдкрдХреЗ project рдХреЗ рд▓рд┐рдП package **dependencies рдФрд░ versions** manage рдХрд░рдирд╛
|
||||
* рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ install рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП packages рдФрд░ versions рдХрд╛ **exact** set рд╣реЛ, рдЙрдирдХреА dependencies рд╕рд╣рд┐рдд, рддрд╛рдХрд┐ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ project рдХреЛ production рдореЗрдВ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ development рдХреЗ рджреМрд░рд╛рди рдЕрдкрдиреЗ computer рдкрд░ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ **locking** рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
|
||||
* рдФрд░ рдХрдИ рдЕрдиреНрдп рдЪреАрдЬрд╝реЗрдВ
|
||||
|
||||
## рдирд┐рд╖реНрдХрд░реНрд╖ { #conclusion }
|
||||
|
||||
рдЕрдЧрд░ рдЖрдкрдиреЗ рдпрд╣ рд╕рдм рдкрдврд╝рд╛ рдФрд░ рд╕рдордЭрд╛ рд╣реИ, рддреЛ рдЕрдм **рдЖрдк рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ** рд╡рд╣рд╛рдБ рдореМрдЬреВрдж рдХрдИ developers рд╕реЗ рдХрд╣реАрдВ рдЬрд╝реНрдпрд╛рджрд╛ рдЬрд╛рдирддреЗ рд╣реИрдВред ЁЯдУ
|
||||
|
||||
рдЗрди details рдХреЛ рдЬрд╛рдирдирд╛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрд╕ рд╕рдордп рдмрд╣реБрдд рд╕рдВрднрд╡рддрдГ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬрд╝ рдХреЛ debug рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдЬреЛ complex рд▓рдЧрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдкрддрд╛ рд╣реЛрдЧрд╛ рдХрд┐ **рдпрд╣ рд╕рдм рдЕрдВрджрд░ рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ**ред ЁЯШО
|
||||
Reference in New Issue
Block a user