10 changed files with 2638 additions and 0 deletions
@ -0,0 +1,485 @@ |
|||
# рд╡рд┐рдХрд▓реНрдк, рдкреНрд░реЗрд░рдгрд╛ рдФрд░ рддреБрд▓рдирд╛рдПрдБ { #alternatives-inspiration-and-comparisons } |
|||
|
|||
**FastAPI** рдХреЛ рдХрд┐рд╕рдиреЗ рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛, рдпрд╣ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреИрд╕рд╛ рд╣реИ рдФрд░ рдЗрд╕рдиреЗ рдЙрдирд╕реЗ рдХреНрдпрд╛ рд╕реАрдЦрд╛ред |
|||
|
|||
## рдкрд░рд┐рдЪрдп { #intro } |
|||
|
|||
**FastAPI** рджреВрд╕рд░реЛрдВ рдХреЗ рдкрд┐рдЫрд▓реЗ рдХрд╛рдо рдХреЗ рдмрд┐рдирд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ред |
|||
|
|||
рдкрд╣рд▓реЗ рдХрдИ рдЯреВрд▓реНрд╕ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреАред |
|||
|
|||
рдореИрдВ рдХрдИ рд╡рд░реНрд╖реЛрдВ рддрдХ рдПрдХ рдирдпрд╛ framework рдмрдирд╛рдиреЗ рд╕реЗ рдмрдЪрддрд╛ рд░рд╣рд╛ред рдкрд╣рд▓реЗ рдореИрдВрдиреЗ **FastAPI** рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдП рдЧрдП рд╕рднреА features рдХреЛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ frameworks, plug-ins рдФрд░ tools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред |
|||
|
|||
рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░, рдРрд╕рд╛ рдХреБрдЫ рдмрдирд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдмрдЪрд╛ рдЬреЛ рдпреЗ рд╕рднреА features рдкреНрд░рджрд╛рди рдХрд░реЗ, рдкрд┐рдЫрд▓реЗ tools рд╕реЗ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда ideas рд▓реЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ рдЬреЛрдбрд╝реЗ, рдЙрди language features рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЬреЛ рдкрд╣рд▓реЗ рдЙрдкрд▓рдмреНрдз рднреА рдирд╣реАрдВ рдереЗ (Python 3.6+ type hints)ред |
|||
|
|||
## рдкрд┐рдЫрд▓реЗ рдЯреВрд▓реНрд╕ { #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) рдпрд╛ рдЗрд╕рдХреЗ рд╕рд╛рде communicate рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп 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 capabilities рдХреЛ рдмреЗрд╣рддрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред |
|||
|
|||
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ Mozilla, Red Hat рдФрд░ Eventbrite рд╕рд╣рд┐рдд рдХрдИ companies рдХрд░рддреА рд╣реИрдВред |
|||
|
|||
рдпрд╣ **automatic API documentation** рдХреЗ рд╢реБрд░реБрдЖрддреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛, рдФрд░ рдпрд╣реА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрди рдкрд╣рд▓реЗ ideas рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛ рдЬрд┐рд╕рдиреЗ **FastAPI** рдХреА "рдЦреЛрдЬ" рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред |
|||
|
|||
/// note | рдиреЛрдЯ |
|||
|
|||
Django REST Framework рдХреЛ Tom Christie рдиреЗ рдмрдирд╛рдпрд╛ рдерд╛ред рд╡рд╣реА creator рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ Starlette рдФрд░ Uvicorn рдмрдирд╛рдП, рдЬрд┐рди рдкрд░ **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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред |
|||
|
|||
рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдЗрд╕реЗ рд╕реАрдЦрдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд intuitive рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ documentation рдХреБрдЫ рдЬрдЧрд╣реЛрдВ рдкрд░ рдереЛрдбрд╝рд╛ technical рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред |
|||
|
|||
рдЗрд╕рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЙрди рдЕрдиреНрдп applications рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ database, user management, рдпрд╛ Django рдореЗрдВ pre-built рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдИ 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 *build* рдХрд░рдиреЗ (server рдХреЗ рд░реВрдк рдореЗрдВ) рдХреЗ рд▓рд┐рдП рдПрдХ library рд╣реИред |
|||
|
|||
рд╡реЗ рдХрдореЛрдмреЗрд╢ рд╡рд┐рдкрд░реАрдд рдЫреЛрд░реЛрдВ рдкрд░ рд╣реИрдВ, рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ complement рдХрд░рддреЗ рд╣реБрдПред |
|||
|
|||
Requests рдХрд╛ design рдмрд╣реБрдд simple рдФрд░ intuitive рд╣реИ, sensible defaults рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА, рдпрд╣ рдмрд╣реБрдд powerful рдФрд░ customizable рд╣реИред |
|||
|
|||
рдЗрд╕реАрд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ official website рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ: |
|||
|
|||
> Requests is one of the most downloaded Python packages of all time |
|||
|
|||
рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд┐рд╕ рддрд░рд╣ рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, `GET` request рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд▓рд┐рдЦреЗрдВрдЧреЗ: |
|||
|
|||
```Python |
|||
response = requests.get("http://example.com/some/url") |
|||
``` |
|||
|
|||
FastAPI counterpart 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) рдХреЛ рд╕реАрдзреЗ, рд╕рд░рд▓ рдФрд░ 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 рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ standard рдерд╛, JSON (рдпрд╛ YAML, рдЬреЛ JSON рдХрд╛ extension рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЬрд┐рд╕реЗ 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 рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ investigate рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рдФрд░ рдХрд╛рдо рд▓рдЧрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдХрдИ discontinued рдпрд╛ abandoned рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рдХрдИ pending issues рдереЗ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдЕрдиреБрдкрдпреБрдХреНрдд рдмрдирд╛рддреЗ рдереЗред |
|||
|
|||
### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow } |
|||
|
|||
API systems рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдореБрдЦреНрдп features рдореЗрдВ рд╕реЗ рдПрдХ data "<dfn title="рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ, рд░реВрдкрд╛рдВрддрд░рдг рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ">serialization</dfn>" рд╣реИ, рдЬреЛ code (Python) рд╕реЗ data рд▓реЗрдХрд░ рдЙрд╕реЗ рдРрд╕реА рдЪреАрдЬрд╝ рдореЗрдВ convert рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ network рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, database рд╕реЗ data рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ object рдХреЛ JSON object рдореЗрдВ convert рдХрд░рдирд╛ред `datetime` objects рдХреЛ strings рдореЗрдВ convert рдХрд░рдирд╛, рдЖрджрд┐ред |
|||
|
|||
APIs рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдПрдХ рдФрд░ рдмрдбрд╝рд╛ feature data validation рд╣реИ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдХрд┐ data рдХреБрдЫ parameters рдХреЗ рдЕрдиреБрд╕рд╛рд░ valid рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдИ field `int` рд╣реИ, рди рдХрд┐ рдХреЛрдИ random stringред рдпрд╣ incoming data рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИред |
|||
|
|||
Data validation system рдХреЗ рдмрд┐рдирд╛, рдЖрдкрдХреЛ code рдореЗрдВ рд╕рднреА checks рд╣рд╛рде рд╕реЗ рдХрд░рдиреЗ рдкрдбрд╝реЗрдВрдЧреЗред |
|||
|
|||
рдпреЗ 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 data рдореЗрдВ рдкрдврд╝рдирд╛ рдФрд░ convert рдХрд░рдирд╛">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 validation, parsing рдФрд░ serialization рдХреЛ plug-ins рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред |
|||
|
|||
рд▓реЗрдХрд┐рди 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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, Webargs рдФрд░ Marshmallow рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ automatically OpenAPI schemas generate рдХрд░рддрд╛ рд╣реИред |
|||
|
|||
рдпрд╣ рдПрдХ рдмреЗрд╣рддрд░реАрди tool рд╣реИ, рдмрд╣реБрдд underratedред рдпрд╣ рдореМрдЬреВрдж рдХрдИ Flask plug-ins рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ popular рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╢рд╛рдпрдж рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдЗрд╕рдХреА documentation рдХрд╛ рдмрд╣реБрдд concise рдФрд░ abstract рд╣реЛрдирд╛ рд╣реИред |
|||
|
|||
рдЗрд╕рдиреЗ Python docstrings рдХреЗ рдЕрдВрджрд░ YAML (рдПрдХ рдФрд░ syntax) рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рдХреЛ рд╣рд▓ рдХрд░ рджрд┐рдпрд╛ред |
|||
|
|||
Flask, Flask-apispec рдХреЗ рд╕рд╛рде Marshmallow рдФрд░ Webargs рдХрд╛ рдпрд╣ combination **FastAPI** рдмрдирд╛рдиреЗ рддрдХ рдореЗрд░рд╛ favorite backend stack рдерд╛ред |
|||
|
|||
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХрдИ Flask full-stack generators рдмрдиреЗред рдпреЗ рдореБрдЦреНрдп 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) рдХрд╛ рдЖрдзрд╛рд░ рдереЗред |
|||
|
|||
/// 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 рдПрдХ JavaScript (TypeScript) NodeJS framework рд╣реИ рдЬреЛ Angular рд╕реЗ inspired рд╣реИред |
|||
|
|||
рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рд╡рд╣реА рд╣рд╛рд╕рд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ Flask-apispec рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред |
|||
|
|||
рдЗрд╕рдореЗрдВ Angular 2 рд╕реЗ inspired рдПрдХ integrated dependency injection system рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП "injectables" (рдореЗрд░реА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рднреА рдЕрдиреНрдп dependency injection systems рдХреА рддрд░рд╣) рдХреЛ pre-register рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ verbosity рдФрд░ code repetition рдмрдврд╝рд╛рддрд╛ рд╣реИред |
|||
|
|||
рдХреНрдпреЛрдВрдХрд┐ parameters рдХреЛ TypeScript types (Python type hints рдХреЗ рд╕рдорд╛рди) рдХреЗ рд╕рд╛рде describe рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, editor support рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╣реИред |
|||
|
|||
рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ TypeScript data JavaScript рдореЗрдВ compilation рдХреЗ рдмрд╛рдж preserved рдирд╣реАрдВ рд░рд╣рддрд╛, рдпрд╣ 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 рд╣реИрдВ, рддреЛ рдЙрд╕реЗ properly documented рдФрд░ validated рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред |
|||
|
|||
/// 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 рдХреЗ рдКрдкрд░ Hug рдЬреИрд╕реЗ framework рдХреЗ рд░реВрдк рдореЗрдВ implement рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдпрд╣реА distinction Falcon рдХреЗ design рд╕реЗ inspired рдЕрдиреНрдп frameworks рдореЗрдВ рднреА рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ 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** рдмрдирд╛рдиреЗ рдХреЗ рд╢реБрд░реБрдЖрддреА stages рдореЗрдВ Molten рдЦреЛрдЬрд╛ред рдФрд░ рдЗрд╕рдореЗрдВ рдХрд╛рдлреА similar ideas рд╣реИрдВ: |
|||
|
|||
* Python type hints рдкрд░ рдЖрдзрд╛рд░рд┐рддред |
|||
* рдЗрди types рд╕реЗ validation рдФрд░ documentationред |
|||
* Dependency Injection systemред |
|||
|
|||
рдпрд╣ Pydantic рдЬреИрд╕реА data validation, serialization рдФрд░ documentation third-party 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 рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ "component" declare рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред |
|||
|
|||
Routes рдХреЛ рдПрдХ single place рдореЗрдВ declare рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрди functions рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЬреЛ рдЕрдиреНрдп places рдореЗрдВ declared рд╣реЛрддреА рд╣реИрдВ (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 рдХреАред рдпрд╣ рдПрдХ рдмреЗрд╣рддрд░реАрди idea рдерд╛ рдЬрд┐рд╕рдиреЗ рдЕрдиреНрдп tools рдХреЛ рднреА рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред |
|||
|
|||
рдЗрд╕рдиреЗ рдЕрдкрдиреА declarations рдореЗрдВ standard Python types рдХреЗ рдмрдЬрд╛рдп custom types рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдлрд┐рд░ рднреА рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдХрджрдо рдерд╛ред |
|||
|
|||
рдпрд╣ JSON рдореЗрдВ рдкреВрд░реА API declare рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ custom schema generate рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ frameworks рдореЗрдВ рд╕реЗ рднреА рдПрдХ рдерд╛ред |
|||
|
|||
рдпрд╣ OpenAPI рдФрд░ JSON Schema рдЬреИрд╕реЗ standard рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдерд╛ред рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ Swagger UI рдЬреИрд╕реЗ рдЕрдиреНрдп tools рдХреЗ рд╕рд╛рде integrate рдХрд░рдирд╛ straightforward рдирд╣реАрдВ рд╣реЛрддрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдпрд╣ рдПрдХ рдмрд╣реБрдд innovative idea рдерд╛ред |
|||
|
|||
рдЗрд╕рдореЗрдВ рдПрдХ interesting, 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** рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ ideas |
|||
|
|||
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 рдмреЗрд╣рддрд░реАрди рдерд╛ред |
|||
|
|||
рдпрд╣ рдЙрди рдкрд╣рд▓реЗ framework implementations рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдХрднреА рджреЗрдЦрд╛, рдЬрд┐рд╕рдореЗрдВ parameters рдФрд░ requests declare рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Python type hints рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (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 рд╕реЗ рдкреАрдЫреЗ)ред |
|||
|
|||
рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЗрд╕рдореЗрдВ 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 рдмрджрд▓ рдЧрдпрд╛ред |
|||
|
|||
рдпрд╣ рдЕрдм 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 рдХрд░рдиреЗ рдХрд╛ idea, рдЬреЛ рд╕рд╛рде рд╣реА рдмреЗрд╣рддрд░реАрди editor support рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рдерд╛, рдореБрдЭреЗ рдПрдХ рд╢рд╛рдирджрд╛рд░ idea рд▓рдЧрд╛ред |
|||
|
|||
рдФрд░ рдПрдХ similar framework рдХреА рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЦреЛрдЬ рдФрд░ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ alternatives test рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, APIStar рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрдкрд▓рдмреНрдз рд╡рд┐рдХрд▓реНрдк рдерд╛ред |
|||
|
|||
рдлрд┐рд░ APIStar server рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдирд╣реАрдВ рд░рд╣рд╛ рдФрд░ Starlette рдмрдирд╛рдпрд╛ рдЧрдпрд╛, рдФрд░ рдпрд╣ рдРрд╕реЗ system рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рдмреЗрд╣рддрд░ foundation рдерд╛ред рдпрд╣реА **FastAPI** рдмрдирд╛рдиреЗ рдХреА рдЕрдВрддрд┐рдо рдкреНрд░реЗрд░рдгрд╛ рдереАред |
|||
|
|||
рдореИрдВ **FastAPI** рдХреЛ APIStar рдХрд╛ "spiritual successor" рдорд╛рдирддрд╛ рд╣реВрдБ, рдЬрдмрдХрд┐ features, typing system рдФрд░ рдЕрдиреНрдп parts рдХреЛ рдмреЗрд╣рддрд░ рдФрд░ рд╡рд┐рд╕реНрддреГрдд рдХрд░рддрд╛ рд╣реВрдБ, рдЗрди рд╕рднреА рдкрд┐рдЫрд▓реЗ tools рд╕реЗ рдорд┐рд▓реА рд╕реАрдЦ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред |
|||
|
|||
/// |
|||
|
|||
## **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 рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирдпрд╛ standard">ASGI</dfn> framework/toolkit рд╣реИ, рдЬреЛ high-performance asyncio services рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИред |
|||
|
|||
рдпрд╣ рдмрд╣реБрдд simple рдФрд░ intuitive рд╣реИред рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ extensible рд╣реЛрдиреЗ рдФрд░ modular components рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП design рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред |
|||
|
|||
рдЗрд╕рдореЗрдВ рд╣реИ: |
|||
|
|||
* рд╕рдЪрдореБрдЪ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА 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ред |
|||
* рдХрдо hard dependenciesред |
|||
|
|||
Starlette рд╡рд░реНрддрдорд╛рди рдореЗрдВ tested рд╕рдмрд╕реЗ рддреЗрдЬрд╝ Python framework рд╣реИред рдХреЗрд╡рд▓ Uvicorn рдЗрд╕рд╕реЗ рдЖрдЧреЗ рд╣реИ, рдЬреЛ 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) рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк `python-socketio` рдЬреИрд╕реЗ ASGI compatible tools рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
/// |
|||
|
|||
/// 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 рдкрд░ built рд╣реИред |
|||
|
|||
рдпрд╣ web framework рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ server рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ paths рджреНрд╡рд╛рд░рд╛ routing рдХреЗ рд▓рд┐рдП tools рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ред рдпрд╣ рдРрд╕реА рдЪреАрдЬрд╝ рд╣реИ рдЬреЛ Starlette (рдпрд╛ **FastAPI**) рдЬреИрд╕рд╛ framework рдКрдкрд░ рд╕реЗ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред |
|||
|
|||
рдпрд╣ Starlette рдФрд░ **FastAPI** рдХреЗ рд▓рд┐рдП recommended server рд╣реИред |
|||
|
|||
/// tip | **FastAPI** рдЗрд╕реЗ рдЗрд╕ рд░реВрдк рдореЗрдВ recommend рдХрд░рддрд╛ рд╣реИ |
|||
|
|||
**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 рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рд╕рдордЭрдиреЗ, compare рдХрд░рдиреЗ рдФрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, [Benchmarks](benchmarks.md) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ section рджреЗрдЦреЗрдВред |
|||
@ -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 рдХреЗ modern versions рдореЗрдВ **"asynchronous code"** рдХреЗ рд▓рд┐рдП support рд╣реИ, рдЬрд┐рд╕рдореЗрдВ **`async` рдФрд░ `await`** syntax рдХреЗ рд╕рд╛рде **"coroutines"** рдирд╛рдо рдХреА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред |
|||
|
|||
рдЖрдЗрдП рдиреАрдЪреЗ рдХреЗ sections рдореЗрдВ рдЗрд╕ phrase рдХреЛ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рджреЗрдЦреЗрдВ: |
|||
|
|||
* **Asynchronous Code** |
|||
* **`async` рдФрд░ `await`** |
|||
* **Coroutines** |
|||
|
|||
## Asynchronous Code { #asynchronous-code } |
|||
|
|||
Asynchronous code рдХрд╛ рдорддрд▓рдм рдмрд╕ рдЗрддрдирд╛ рд╣реИ рдХрд┐ language ЁЯТм рдХреЗ рдкрд╛рд╕ computer / program ЁЯдЦ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ code рдореЗрдВ рдХрд┐рд╕реА point рдкрд░, рдЙрд╕реЗ ЁЯдЦ рдХрд┐рд╕реА рдФрд░ рдЬрдЧрд╣ рдкрд░ *рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝* рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╡рд╣ *рдХреЛрдИ рдФрд░ рдЪреАрдЬрд╝* "slow-file" ЁЯУЭ рдХрд╣рд▓рд╛рддреА рд╣реИред |
|||
|
|||
рддреЛ, рдЙрд╕ рд╕рдордп рдХреЗ рджреМрд░рд╛рди, computer рдХреЛрдИ рдФрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ "slow-file" ЁЯУЭ finish рд╣реЛрддреА рд╣реИред |
|||
|
|||
рдлрд┐рд░ computer / program ЁЯдЦ рд╣рд░ рдмрд╛рд░ рд╡рд╛рдкрд╕ рдЖрдПрдЧрд╛ рдЬрдм рдЙрд╕рдХреЗ рдкрд╛рд╕ рдореМрдХрд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдлрд┐рд░ рд╕реЗ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдпрд╛ рдЬрдм рднреА рд╡рд╣ ЁЯдЦ рдЙрд╕ point рдкрд░ рдЕрдкрдиреЗ рд╕рд╛рд░реЗ рдХрд╛рдо finish рдХрд░ рд▓реЗрдЧрд╛ред рдФрд░ рд╡рд╣ ЁЯдЦ рджреЗрдЦреЗрдЧрд╛ рдХрд┐ рдЬрд┐рди tasks рдХрд╛ рд╡рд╣ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рдкрд╣рд▓реЗ рд╣реА finish рд╣реЛ рдЪреБрдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдЬреЛ рднреА рдХрд░рдирд╛ рдерд╛ рд╡рд╣ рдХрд░реЗрдЧрд╛ред |
|||
|
|||
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╡рд╣ ЁЯдЦ finish рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ task рд▓реЗрддрд╛ рд╣реИ (рдорд╛рди рд▓реАрдЬрд┐рдП, рд╣рдорд╛рд░реА "slow-file" ЁЯУЭ) рдФрд░ рдЙрд╕рдХреЗ рд╕рд╛рде рдЬреЛ рднреА рдХрд░рдирд╛ рдерд╛ рдЙрд╕реЗ continue рдХрд░рддрд╛ рд╣реИред |
|||
|
|||
рд╡рд╣ "рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░" рдЖрдорддреМрд░ рдкрд░ <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 рджреНрд╡рд╛рд░рд╛ read рдХрд░рдХреЗ рдЖрдкрдХреЗ 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 рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдЦрд░реНрдЪ рд╣реЛрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ "I/O bound" operations рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред |
|||
|
|||
рдЗрд╕реЗ "asynchronous" рдЗрд╕рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ computer / program рдХреЛ slow task рдХреЗ рд╕рд╛рде "synchronized" рд╣реЛрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрддреА, рдпрд╛рдиреА task finish рд╣реЛрдиреЗ рдХреЗ exact moment рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдХреБрдЫ рди рдХрд░рдирд╛, рддрд╛рдХрд┐ task result рд▓реЗрдХрд░ рдХрд╛рдо continue рдХрд░ рд╕рдХреЗред |
|||
|
|||
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, "asynchronous" system рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, task finish рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдереЛрдбрд╝реА рджреЗрд░ (рдХреБрдЫ microseconds) line рдореЗрдВ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ computer / program рдЬреЛ рднреА рдХрд░рдиреЗ рдЧрдпрд╛ рдерд╛ рдЙрд╕реЗ finish рдХрд░реЗ, рдФрд░ рдлрд┐рд░ рд╡рд╛рдкрд╕ рдЖрдХрд░ results рд▓реЗ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо continue рдХрд░реЗред |
|||
|
|||
"synchronous" ("asynchronous" рдХреЗ рд╡рд┐рдкрд░реАрдд) рдХреЗ рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ "sequential" term рднреА use рдХреА рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ computer / program рдХрд┐рд╕реА рджреВрд╕рд░реЗ task рдкрд░ switch рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рднреА steps рдХреЛ sequence рдореЗрдВ follow рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЙрди steps рдореЗрдВ рдЗрдВрддрдЬрд╝рд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реЛред |
|||
|
|||
### Concurrency рдФрд░ Burgers { #concurrency-and-burgers } |
|||
|
|||
рдКрдкрд░ describe рдХрд┐рдП рдЧрдП **asynchronous** code рдХреЗ рдЗрд╕ idea рдХреЛ рдХрднреА-рдХрднреА **"concurrency"** рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ **"parallelism"** рд╕реЗ рдЕрд▓рдЧ рд╣реИред |
|||
|
|||
**Concurrency** рдФрд░ **parallelism** рджреЛрдиреЛрдВ "рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬрд╝реЗрдВ рд▓рдЧрднрдЧ рдПрдХ рд╣реА рд╕рдордп рдкрд░ рд╣реЛ рд░рд╣реА рд╣реИрдВ" рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред |
|||
|
|||
рд▓реЗрдХрд┐рди *concurrency* рдФрд░ *parallelism* рдХреЗ рдмреАрдЪ details рдХрд╛рдлрд╝реА рдЕрд▓рдЧ рд╣реИрдВред |
|||
|
|||
рдЕрдВрддрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, burgers рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рдХрд╣рд╛рдиреА 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 рдХрд░рдиреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╡реЗ рдЕрднреА previous clients рдХреЗ burgers prepare рдХрд░ рд░рд╣реЗ рд╣реИрдВ)ред |
|||
|
|||
<img src="/img/async/concurrent-burgers/concurrent-burgers-03.png" class="illustration"> |
|||
|
|||
рдЖрдк pay рдХрд░рддреЗ рд╣реИрдВред ЁЯТ╕ |
|||
|
|||
cashier рдЖрдкрдХреЛ рдЖрдкрдХреА рдмрд╛рд░реА рдХрд╛ number рджреЗрддрд╛ рд╣реИред |
|||
|
|||
<img src="/img/async/concurrent-burgers/concurrent-burgers-04.png" class="illustration"> |
|||
|
|||
рдЬрдм рдЖрдк рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЖрдк рдЕрдкрдиреЗ crush рдХреЗ рд╕рд╛рде рдПрдХ table рдЪреБрдирддреЗ рд╣реИрдВ, рдмреИрдарддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ crush рд╕реЗ рдХрд╛рдлрд╝реА рджреЗрд░ рддрдХ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ burgers рдмрд╣реБрдд fancy рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ prepare рд╣реЛрдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ)ред |
|||
|
|||
рдЬрдм рдЖрдк рдЕрдкрдиреЗ crush рдХреЗ рд╕рд╛рде table рдкрд░ рдмреИрдареЗ рд╣реИрдВ, burgers рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рд╡рд╣ рд╕рдордп рдпрд╣ admire рдХрд░рдиреЗ рдореЗрдВ рдмрд┐рддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ crush рдХрд┐рддрдирд╛ awesome, cute рдФрд░ smart рд╣реИ тЬиЁЯШНтЬиред |
|||
|
|||
<img src="/img/async/concurrent-burgers/concurrent-burgers-05.png" class="illustration"> |
|||
|
|||
рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдФрд░ рдЕрдкрдиреЗ crush рд╕реЗ рдмрд╛рдд рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рд╕рдордп-рд╕рдордп рдкрд░ counter рдкрд░ displayed number check рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдкрдХреА рдмрд╛рд░реА рдЖ рдЪреБрдХреА рд╣реИред |
|||
|
|||
рдлрд┐рд░ рдХрд┐рд╕реА point рдкрд░, рдЖрдЦрд┐рд░рдХрд╛рд░ рдЖрдкрдХреА рдмрд╛рд░реА рдЖ рдЬрд╛рддреА рд╣реИред рдЖрдк 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) рджреНрд╡рд╛рд░рд╛ред ЁЯОи |
|||
|
|||
/// |
|||
|
|||
--- |
|||
|
|||
Imagine рдХрд░реЗрдВ рдХрд┐ рдЙрд╕ рдХрд╣рд╛рдиреА рдореЗрдВ рдЖрдк computer / program ЁЯдЦ рд╣реИрдВред |
|||
|
|||
рдЬрдм рдЖрдк line рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЖрдк рдмрд╕ idle ЁЯШ┤ рд╣реЛрддреЗ рд╣реИрдВ, рдЕрдкрдиреА рдмрд╛рд░реА рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рдХреЛрдИ рдмрд╣реБрдд "productive" рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗред рд▓реЗрдХрд┐рди line рддреЗрдЬрд╝ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ cashier рд╕рд┐рд░реНрдлрд╝ orders рд▓реЗ рд░рд╣рд╛ рд╣реИ (рдЙрдиреНрд╣реЗрдВ prepare рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛), рдЗрд╕рд▓рд┐рдП рдпрд╣ рдареАрдХ рд╣реИред |
|||
|
|||
рдлрд┐рд░, рдЬрдм рдЖрдкрдХреА рдмрд╛рд░реА рдЖрддреА рд╣реИ, рдЖрдк actual "productive" рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, menu process рдХрд░рддреЗ рд╣реИрдВ, decide рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдкрдиреЗ crush рдХреА choice рд▓реЗрддреЗ рд╣реИрдВ, pay рдХрд░рддреЗ рд╣реИрдВ, check рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдиреЗ рд╕рд╣реА bill рдпрд╛ card рджрд┐рдпрд╛ рд╣реИ, check рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ correctly charge рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, check рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ order рдореЗрдВ рд╕рд╣реА items рд╣реИрдВ, рдЖрджрд┐ред |
|||
|
|||
рд▓реЗрдХрд┐рди рдлрд┐рд░, рднрд▓реЗ рд╣реА рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА burgers рдирд╣реАрдВ рд╣реИрдВ, cashier рдХреЗ рд╕рд╛рде рдЖрдкрдХрд╛ рдХрд╛рдо "on pause" тП╕ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ burgers ready рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ ЁЯХЩ рдХрд░рдирд╛ рд╣реИред |
|||
|
|||
рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк counter рд╕реЗ рджреВрд░ рдЬрд╛рдХрд░ рдЕрдкрдиреА рдмрд╛рд░реА рдХреЗ number рдХреЗ рд╕рд╛рде table рдкрд░ рдмреИрдарддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдирд╛ рдзреНрдпрд╛рди ЁЯФА рдЕрдкрдиреЗ crush рдкрд░ switch рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕ рдкрд░ "work" тПп ЁЯдУ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд░ рдЖрдк рдлрд┐рд░ рд╕реЗ рдХреБрдЫ рдмрд╣реБрдд "productive" рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдЕрдкрдиреЗ crush рдХреЗ рд╕рд╛рде flirting ЁЯШНред |
|||
|
|||
рдлрд┐рд░ cashier ЁЯТБ рдЖрдкрдХреЗ number рдХреЛ counter рдХреЗ display рдкрд░ рдбрд╛рд▓рдХрд░ рдХрд╣рддрд╛ рд╣реИ "рдореИрдВрдиреЗ burgers рдмрдирд╛ рджрд┐рдП рд╣реИрдВ", рд▓реЗрдХрд┐рди displayed number рдЖрдкрдХреА рдмрд╛рд░реА рдХреЗ number рдореЗрдВ рдмрджрд▓рддреЗ рд╣реА рдЖрдк рддреБрд░рдВрдд рдкрд╛рдЧрд▓реЛрдВ рдХреА рддрд░рд╣ jump рдирд╣реАрдВ рдХрд░рддреЗред рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдЖрдкрдХреЗ burgers steal рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрдкрдХреА рдмрд╛рд░реА рдХрд╛ number рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдЙрдирдХрд╛ред |
|||
|
|||
рддреЛ рдЖрдк рдЕрдкрдиреЗ crush рдХреЗ story finish рдХрд░рдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ (current work тПп / task being processed ЁЯдУ finish рдХрд░рдиреЗ рдХрд╛), рд╣рд▓реНрдХреЗ рд╕реЗ smile рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк burgers рд▓реЗрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ тП╕ред |
|||
|
|||
рдлрд┐рд░ рдЖрдк counter ЁЯФА рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрд╕ initial task рдкрд░ рдЬреЛ рдЕрдм finish рд╣реЛ рдЪреБрдХрд╛ рд╣реИ тПп, burgers рдЙрдард╛рддреЗ рд╣реИрдВ, thanks рдХрд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ table рдкрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ counter рдХреЗ рд╕рд╛рде interaction рдХрд╛ рд╡рд╣ step / task finish рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ тП╣ред рдмрджрд▓реЗ рдореЗрдВ, рдпрд╣ "burgers рдЦрд╛рдиреЗ" рдХрд╛ рдПрдХ рдирдпрд╛ task рдмрдирд╛рддрд╛ рд╣реИ ЁЯФА тПп, рд▓реЗрдХрд┐рди "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 рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ 8 cashiers рдореЗрдВ рд╕реЗ рд╣рд░ рдПрдХ next order рд▓реЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рддреБрд░рдВрдд рдЬрд╛рдХрд░ burger prepare рдХрд░рддрд╛ рд╣реИред |
|||
|
|||
<img src="/img/async/parallel-burgers/parallel-burgers-01.png" class="illustration"> |
|||
|
|||
рдлрд┐рд░ рдЖрдЦрд┐рд░рдХрд╛рд░ рдЖрдкрдХреА рдмрд╛рд░реА рдЖрддреА рд╣реИ, рдЖрдк рдЕрдкрдиреЗ crush рдФрд░ рдЕрдкрдиреЗ рд▓рд┐рдП 2 рдмрд╣реБрдд fancy burgers рдХрд╛ order рджреЗрддреЗ рд╣реИрдВред |
|||
|
|||
рдЖрдк pay рдХрд░рддреЗ рд╣реИрдВ ЁЯТ╕ред |
|||
|
|||
<img src="/img/async/parallel-burgers/parallel-burgers-02.png" class="illustration"> |
|||
|
|||
cashier kitchen рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред |
|||
|
|||
рдЖрдк counter рдХреЗ рд╕рд╛рдордиреЗ рдЦрдбрд╝реЗ рд╣реЛрдХрд░ рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ ЁЯХЩ, рддрд╛рдХрд┐ рдЖрдкрдХреЗ рд▓реЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдИ рдФрд░ рдЖрдкрдХреЗ burgers рди рд▓реЗ рдЬрд╛рдП, рдХреНрдпреЛрдВрдХрд┐ turns рдХреЗ рд▓рд┐рдП рдХреЛрдИ numbers рдирд╣реАрдВ рд╣реИрдВред |
|||
|
|||
<img src="/img/async/parallel-burgers/parallel-burgers-03.png" class="illustration"> |
|||
|
|||
рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдФрд░ рдЖрдкрдХрд╛ crush рдЗрд╕ рдмрд╛рдд рдореЗрдВ busy рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдЖрдкрдХреЗ рдЖрдЧреЗ рди рдЖ рдЬрд╛рдП рдФрд░ рдЖрдкрдХреЗ burgers рдЖрддреЗ рд╣реА рдЙрдиреНрд╣реЗрдВ рди рд▓реЗ рдЬрд╛рдП, рдЖрдк рдЕрдкрдиреЗ crush рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред ЁЯШЮ |
|||
|
|||
рдпрд╣ "synchronous" work рд╣реИ, рдЖрдк cashier/cook ЁЯСитАНЁЯН│ рдХреЗ рд╕рд╛рде "synchronized" рд╣реИрдВред рдЖрдкрдХреЛ рдЗрдВрддрдЬрд╝рд╛рд░ ЁЯХЩ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЙрд╕ exact moment рдкрд░ рд╡рд╣рд╛рдБ рд╣реЛрдирд╛ рд╣реИ рдЬрдм cashier/cook ЁЯСитАНЁЯН│ burgers finish рдХрд░рдХреЗ рдЖрдкрдХреЛ рджреЗрддрд╛ рд╣реИ, рдирд╣реАрдВ рддреЛ рдХреЛрдИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред |
|||
|
|||
<img src="/img/async/parallel-burgers/parallel-burgers-04.png" class="illustration"> |
|||
|
|||
рдлрд┐рд░ рдЖрдкрдХрд╛ cashier/cook ЁЯСитАНЁЯН│ рд▓рдВрдмреЗ рд╕рдордп рддрдХ counter рдХреЗ рд╕рд╛рдордиреЗ рдЗрдВрддрдЬрд╝рд╛рд░ ЁЯХЩ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдЦрд┐рд░рдХрд╛рд░ рдЖрдкрдХреЗ 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 рдХреЗ рд╕рд╛рдордиреЗ рдЗрдВрддрдЬрд╝рд╛рд░ ЁЯХЩ рдХрд░рдиреЗ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ред ЁЯШЮ |
|||
|
|||
/// note | рдиреЛрдЯ |
|||
|
|||
рд╕реБрдВрджрд░ illustrations [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot) рджреНрд╡рд╛рд░рд╛ред ЁЯОи |
|||
|
|||
/// |
|||
|
|||
--- |
|||
|
|||
parallel burgers рдХреЗ рдЗрд╕ scenario рдореЗрдВ, рдЖрдк рджреЛ processors (рдЖрдк рдФрд░ рдЖрдкрдХрд╛ crush) рд╡рд╛рд▓рд╛ computer / program ЁЯдЦ рд╣реИрдВ, рджреЛрдиреЛрдВ рдЗрдВрддрдЬрд╝рд╛рд░ ЁЯХЩ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЕрдкрдирд╛ рдзреНрдпрд╛рди тПп рд▓рдВрдмреЗ рд╕рдордп рддрдХ "counter рдкрд░ рдЗрдВрддрдЬрд╝рд╛рд░" ЁЯХЩ рдХрд░рдиреЗ рдореЗрдВ рд▓рдЧрд╛ рд░рд╣реЗ рд╣реИрдВред |
|||
|
|||
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 рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЗрдВрддрдЬрд╝рд╛рд░ ЁЯХЩ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рд╡рд░рдирд╛ рдЖрдкрдХреА рдмрд╛рд░реА рдЪрд▓реА рдЬрд╛рддреА рд╣реИред |
|||
|
|||
рдЖрдк рд╢рд╛рдпрдж рдЕрдкрдиреЗ crush ЁЯШН рдХреЛ bank ЁЯПж рдореЗрдВ errands рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕рд╛рде рдирд╣реАрдВ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред |
|||
|
|||
### Burger Conclusion { #burger-conclusion } |
|||
|
|||
"рдЕрдкрдиреЗ crush рдХреЗ рд╕рд╛рде fast food burgers" рдХреЗ рдЗрд╕ scenario рдореЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рдЗрдВрддрдЬрд╝рд╛рд░ ЁЯХЩ рд╣реИ, concurrent system тП╕ЁЯФАтПп рд░рдЦрдирд╛ рдХрд╣реАрдВ рдЬрд╝реНрдпрд╛рджрд╛ meaningful рд╣реИред |
|||
|
|||
рдЕрдзрд┐рдХрд╛рдВрд╢ web applications рдХреЗ рд▓рд┐рдП рдпрд╣реА case рд╣реИред |
|||
|
|||
рдмрд╣реБрдд рд╕рд╛рд░реЗ users, рд▓реЗрдХрд┐рди рдЖрдкрдХрд╛ server рдЙрдирдХреЗ not-so-good connection рд╕реЗ requests рднреЗрдЬрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ ЁЯХЩ рдХрд░ рд░рд╣рд╛ рд╣реИред |
|||
|
|||
рдФрд░ рдлрд┐рд░ responses рд╡рд╛рдкрд╕ рдЖрдиреЗ рдХрд╛ рдлрд┐рд░ рд╕реЗ рдЗрдВрддрдЬрд╝рд╛рд░ ЁЯХЩ рдХрд░ рд░рд╣рд╛ рд╣реИред |
|||
|
|||
рдпрд╣ "waiting" ЁЯХЩ microseconds рдореЗрдВ measure рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рд╕рдм рдорд┐рд▓рд╛рдХрд░ рдЕрдВрдд рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░рд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдмрди рдЬрд╛рддрд╛ рд╣реИред |
|||
|
|||
рдЗрд╕реАрд▓рд┐рдП web APIs рдХреЗ рд▓рд┐рдП asynchronous тП╕ЁЯФАтПп code use рдХрд░рдирд╛ рдмрд╣реБрдд meaningful рд╣реИред |
|||
|
|||
рдЗрд╕реА рддрд░рд╣ рдХреА asynchronicity рдиреЗ NodeJS рдХреЛ popular рдмрдирд╛рдпрд╛ (рд╣рд╛рд▓рд╛рдБрдХрд┐ NodeJS parallel рдирд╣реАрдВ рд╣реИ) рдФрд░ рдпрд╣реА Go рдХреА programming language рдХреЗ рд░реВрдк рдореЗрдВ рддрд╛рдХрдд рд╣реИред |
|||
|
|||
рдФрд░ рдпрд╣реА performance level рдЖрдкрдХреЛ **FastAPI** рдХреЗ рд╕рд╛рде рдорд┐рд▓рддрд╛ рд╣реИред |
|||
|
|||
рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ parallelism рдФрд░ asynchronicity рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ tested NodeJS frameworks рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реЗ higher performance рдФрд░ Go рдХреЗ рдмрд░рд╛рдмрд░ performance рдорд┐рд▓рддреА рд╣реИ, рдЬреЛ C рдХреЗ рдХрд░реАрдм рдПрдХ compiled language рд╣реИ [(рд╕рдм Starlette рдХреА рдмрджреМрд▓рдд)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1)ред |
|||
|
|||
### рдХреНрдпрд╛ concurrency parallelism рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ? { #is-concurrency-better-than-parallelism } |
|||
|
|||
рдирд╣реАрдВ! рдпрд╣ рдХрд╣рд╛рдиреА рдХреА рд╕реАрдЦ рдирд╣реАрдВ рд╣реИред |
|||
|
|||
Concurrency, parallelism рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдФрд░ рдпрд╣ **specific** scenarios рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ рдЬрд┐рдирдореЗрдВ рдмрд╣реБрдд рдЗрдВрддрдЬрд╝рд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реА рдХрд╛рд░рдг, рдпрд╣ web application development рдХреЗ рд▓рд┐рдП рдЖрдо рддреМрд░ рдкрд░ parallelism рд╕реЗ рдХрд╛рдлрд╝реА рдмреЗрд╣рддрд░ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рд╣рд░ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред |
|||
|
|||
рддреЛ, рдЗрд╕реЗ balance рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЫреЛрдЯреА рдХрд╣рд╛рдиреА imagine рдХрд░реЗрдВ: |
|||
|
|||
> рдЖрдкрдХреЛ рдПрдХ рдмрдбрд╝рд╛, рдЧрдВрджрд╛ рдШрд░ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рд╣реИред |
|||
|
|||
*рд╣рд╛рдБ, рдпрд╣реА рдкреВрд░реА рдХрд╣рд╛рдиреА рд╣реИ*ред |
|||
|
|||
--- |
|||
|
|||
рдХрд╣реАрдВ рднреА рдХреЛрдИ рдЗрдВрддрдЬрд╝рд╛рд░ ЁЯХЩ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдШрд░ рдХреЗ рдХрдИ places рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░рд╛ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред |
|||
|
|||
рдЖрдк burgers example рдХреА рддрд░рд╣ turns рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ living room, рдлрд┐рд░ kitchen, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ ЁЯХЩ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ, рдмрд╕ рд╕рдлрд╝рд╛рдИ рдкрд░ рд╕рдлрд╝рд╛рдИ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, turns рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ affect рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред |
|||
|
|||
Turns (concurrency) рдХреЗ рд╕рд╛рде рдпрд╛ рдмрд┐рдирд╛ finish рдХрд░рдиреЗ рдореЗрдВ рдЙрддрдирд╛ рд╣реА time рд▓рдЧреЗрдЧрд╛ рдФрд░ рдЖрдкрдиреЗ рдЙрддрдирд╛ рд╣реА work рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛ред |
|||
|
|||
рд▓реЗрдХрд┐рди рдЗрд╕ case рдореЗрдВ, рдЕрдЧрд░ рдЖрдк рдЙрди 8 ex-cashier/cooks/now-cleaners рдХреЛ рд▓рд╛ рд╕рдХреЗрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рд╣рд░ рдПрдХ (рдЖрдкрдХреЗ рд╕рд╛рде) рдШрд░ рдХрд╛ рдПрдХ zone clean рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЗ рд╕рдХреЗ, рддреЛ рдЖрдк extra help рдХреЗ рд╕рд╛рде рд╕рд╛рд░рд╛ рдХрд╛рдо **parallel** рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмрд╣реБрдд рдЬрд▓реНрджреА finish рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
рдЗрд╕ scenario рдореЗрдВ, cleaners рдореЗрдВ рд╕реЗ рд╣рд░ рдПрдХ (рдЖрдк рд╕рд╣рд┐рдд) рдПрдХ processor рд╣реЛрдЧрд╛, рдЕрдкрдиреЗ рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ job рдХрд░ рд░рд╣рд╛ рд╣реЛрдЧрд╛ред |
|||
|
|||
рдФрд░ рдХреНрдпреЛрдВрдХрд┐ execution time рдХрд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╣рд┐рд╕реНрд╕рд╛ actual work рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ (рдЗрдВрддрдЬрд╝рд╛рд░ рдХреЗ рдмрдЬрд╛рдп), рдФрд░ 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 рд╕реЗ рдмрдиреА рд╣реЛрддреА рд╣реИ, рд╣рд░ 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 use рдХрд░рддреЗ рд╣реИрдВред |
|||
|
|||
### 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 (parallel рдореЗрдВ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ multiple processes) рдХреЗ benefits рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
рдпрд╣, рдФрд░ рд╕рд╛рде рдореЗрдВ рдпрд╣ 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 рдХреЗ modern versions рдореЗрдВ asynchronous code define рдХрд░рдиреЗ рдХрд╛ рдмрд╣реБрдд intuitive рддрд░реАрдХрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ normal "sequential" code рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рд╕рд╣реА moments рдкрд░ рдЖрдкрдХреЗ рд▓рд┐рдП "awaiting" рдХрд░рддрд╛ рд╣реИред |
|||
|
|||
рдЬрдм рдХреЛрдИ operation results рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрдВрддрдЬрд╝рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдЗрди рдирдП Python features рдХреЗ рд▓рд┐рдП support рд░рдЦрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ code рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: |
|||
|
|||
```Python |
|||
burgers = await get_burgers(2) |
|||
``` |
|||
|
|||
рдпрд╣рд╛рдБ key `await` рд╣реИред рдпрд╣ Python рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ `burgers` рдореЗрдВ results store рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ `get_burgers(2)` рдХреЗ рдЕрдкрдирд╛ рдХрд╛рдо ЁЯХЩ finish рдХрд░рдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ тП╕ рдХрд░рдирд╛ рд╣реИред рдЗрд╕рд╕реЗ, Python рдЬрд╛рди рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдЗрд╕ рдмреАрдЪ рд╡рд╣ рдХреБрдЫ рдФрд░ ЁЯФА тПп рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЬреИрд╕реЗ рдХреЛрдИ рдФрд░ request receive рдХрд░рдирд╛)ред |
|||
|
|||
`await` рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрд╕реЗ рдРрд╕реЗ function рдХреЗ рдЕрдВрджрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрд╕ asynchronicity рдХреЛ support рдХрд░рддрд╛ рд╣реЛред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдмрд╕ рдЙрд╕реЗ `async def` рдХреЗ рд╕рд╛рде declare рдХрд░рддреЗ рд╣реИрдВ: |
|||
|
|||
```Python hl_lines="1" |
|||
async def get_burgers(number: int): |
|||
# рдмрд░реНрдЧрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ asynchronous рдХрд╛рдо рдХрд░реЗрдВ |
|||
return burgers |
|||
``` |
|||
|
|||
...`def` рдХреЗ рдмрдЬрд╛рдп: |
|||
|
|||
```Python hl_lines="2" |
|||
# рдпрд╣ asynchronous рдирд╣реАрдВ рд╣реИ |
|||
def get_sequential_burgers(number: int): |
|||
# рдмрд░реНрдЧрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ 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 рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрд╕реЗ use рдХрд░рдиреЗ рд╡рд╛рд▓реА *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` рдХреЗ рд╕рд╛рде define рдХрд┐рдП рдЧрдП functions рдХреЗ рдЕрдВрджрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред |
|||
|
|||
рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА, `async def` рдХреЗ рд╕рд╛рде define рдХрд┐рдП рдЧрдП functions рдХреЛ "awaited" рд╣реЛрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, `async def` рд╡рд╛рд▓реЗ functions рдХреЛ рднреА рдХреЗрд╡рд▓ `async def` рдХреЗ рд╕рд╛рде define рдХрд┐рдП рдЧрдП functions рдХреЗ рдЕрдВрджрд░ call рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред |
|||
|
|||
рддреЛ, egg рдФрд░ chicken рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЖрдк рдкрд╣рд▓реЗ `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 рдирд╣реАрдВ рднреА рдХрд░ рд░рд╣реЗ рдереЗ, рддреЛ рднреА рдЖрдк [AnyIO](https://anyio.readthedocs.io/en/stable/) рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ async applications рд▓рд┐рдЦ рд╕рдХрддреЗ рдереЗ рддрд╛рдХрд┐ рд╡реЗ highly compatible рд╣реЛрдВ рдФрд░ рдЙрд╕рдХреЗ benefits (рдЬреИрд╕реЗ *structured concurrency*) рдорд┐рд▓реЗрдВред |
|||
|
|||
рдореИрдВрдиреЗ 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 рдХреЗ рдЕрдиреНрдп рд░реВрдк { #other-forms-of-asynchronous-code } |
|||
|
|||
`async` рдФрд░ `await` use рдХрд░рдиреЗ рдХреА рдпрд╣ style language рдореЗрдВ relatively new рд╣реИред |
|||
|
|||
рд▓реЗрдХрд┐рди рдпрд╣ asynchronous code рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрддреА рд╣реИред |
|||
|
|||
рдпрд╣реА syntax (рдпрд╛ рд▓рдЧрднрдЧ identical) рд╣рд╛рд▓ рд╣реА рдореЗрдВ JavaScript рдХреЗ modern versions (Browser рдФрд░ NodeJS рдореЗрдВ) рдореЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред |
|||
|
|||
рд▓реЗрдХрд┐рди рдЙрд╕рд╕реЗ рдкрд╣рд▓реЗ, asynchronous code handle рдХрд░рдирд╛ рдХрд╛рдлрд╝реА рдЕрдзрд┐рдХ complex рдФрд░ difficult рдерд╛ред |
|||
|
|||
Python рдХреЗ previous versions рдореЗрдВ, рдЖрдк threads рдпрд╛ [Gevent](https://www.gevent.org/) use рдХрд░ рд╕рдХрддреЗ рдереЗред рд▓реЗрдХрд┐рди code рдХреЛ understand, debug, рдФрд░ reason about рдХрд░рдирд╛ рдХрд╣реАрдВ рдЬрд╝реНрдпрд╛рджрд╛ complex рд╣реИред |
|||
|
|||
NodeJS / Browser JavaScript рдХреЗ previous versions рдореЗрдВ, рдЖрдк "callbacks" use рдХрд░рддреЗред рдЬреЛ "callback hell" рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред |
|||
|
|||
## Coroutines { #coroutines } |
|||
|
|||
**Coroutine** рдмрд╕ рдЙрд╕ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд fancy term рд╣реИ рдЬреЛ `async def` function return рдХрд░рддрд╛ рд╣реИред Python рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдпрд╣ function рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬрд╝ рд╣реИ, рдЬрд┐рд╕реЗ рд╡рд╣ start рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЬреЛ рдХрд┐рд╕реА point рдкрд░ end рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЬрдм рднреА рдЙрд╕рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ `await` рд╣реЛрдЧрд╛ рддреЛ рд╡рд╣ internally pause тП╕ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИред |
|||
|
|||
рд▓реЗрдХрд┐рди `async` рдФрд░ `await` рдХреЗ рд╕рд╛рде asynchronous code use рдХрд░рдиреЗ рдХреА рдпрд╣ рд╕рд╛рд░реА functionality рдХрдИ рдмрд╛рд░ "coroutines" use рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ summarize рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ Go рдХреА main key feature, "Goroutines", рд╕реЗ comparable рд╣реИред |
|||
|
|||
## рдирд┐рд╖реНрдХрд░реНрд╖ { #conclusion } |
|||
|
|||
рдЖрдЗрдП рдКрдкрд░ рд╡рд╛рд▓реА рд╡рд╣реА phrase рджреЗрдЦреЗрдВ: |
|||
|
|||
> Python рдХреЗ modern versions рдореЗрдВ **"asynchronous code"** рдХреЗ рд▓рд┐рдП support рд╣реИ, рдЬрд┐рд╕рдореЗрдВ **`async` рдФрд░ `await`** syntax рдХреЗ рд╕рд╛рде **"coroutines"** рдирд╛рдо рдХреА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред |
|||
|
|||
рдЕрдм рдпрд╣ рдЕрдзрд┐рдХ meaningful рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред тЬи |
|||
|
|||
рдпрд╣реА рд╕рдм FastAPI рдХреЛ power рджреЗрддрд╛ рд╣реИ (Starlette рдХреЗ through) рдФрд░ рдЗрд╕реЗ рдЗрддрдиреА impressive performance рджреЗрддрд╛ рд╣реИред |
|||
|
|||
## рдмрд╣реБрдд рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг { #very-technical-details } |
|||
|
|||
/// warning | рдЪреЗрддрд╛рд╡рдиреА |
|||
|
|||
рдЖрдк рд╢рд╛рдпрдж рдЗрд╕реЗ skip рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
рдпреЗ **FastAPI** рдХреЗ рдЕрдВрджрд░реВрдиреА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╣реБрдд technical details рд╣реИрдВред |
|||
|
|||
рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрд╛рдлрд╝реА technical knowledge рд╣реИ (coroutines, threads, blocking, рдЖрджрд┐) рдФрд░ рдЖрдк curious рд╣реИрдВ рдХрд┐ FastAPI `async def` vs normal `def` рдХреЛ рдХреИрд╕реЗ handle рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдЧреЗ рдмрдврд╝реЗрдВред |
|||
|
|||
/// |
|||
|
|||
### Path operation functions { #path-operation-functions } |
|||
|
|||
рдЬрдм рдЖрдк *path operation function* рдХреЛ `async def` рдХреЗ рдмрдЬрд╛рдп normal `def` рдХреЗ рд╕рд╛рде declare рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕реЗ directly call рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп (рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ server рдХреЛ block рдХрд░ рджреЗрдЧрд╛), рдПрдХ external threadpool рдореЗрдВ run рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдлрд┐рд░ await рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред |
|||
|
|||
рдЕрдЧрд░ рдЖрдк рдХрд┐рд╕реА рджреВрд╕рд░реЗ async framework рд╕реЗ рдЖ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдКрдкрд░ рдмрддрд╛рдП рдЧрдП рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдФрд░ рдЖрдк trivial compute-only *path operation functions* рдХреЛ plain `def` рдХреЗ рд╕рд╛рде define рдХрд░рдиреЗ рдХреЗ рдЖрджреА рд╣реИрдВ рддрд╛рдХрд┐ рдереЛрдбрд╝рд╛ performance gain (рд▓рдЧрднрдЧ 100 nanoseconds) рдорд┐рд▓реЗ, рддреЛ рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ **FastAPI** рдореЗрдВ effect рдХрд╛рдлрд╝реА рдЙрд▓реНрдЯрд╛ рд╣реЛрдЧрд╛ред рдЗрди cases рдореЗрдВ, `async def` use рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреА *path operation functions* рдРрд╕рд╛ code use рди рдХрд░реЗрдВ рдЬреЛ blocking <abbr title="Input/Output - рдЗрдирдкреБрдЯ/рдЖрдЙрдЯрдкреБрдЯ: disk reading рдпрд╛ writing, 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) рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рдПрдХ-рджреВрд╕рд░реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд░рдЦрддреА рд╣реИрдВ (function definitions рдХреЗ parameters рдХреЗ рд░реВрдк рдореЗрдВ), рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ `async def` рдХреЗ рд╕рд╛рде рдмрдирд╛рдИ рдЧрдИ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдФрд░ рдХреБрдЫ normal `def` рдХреЗ рд╕рд╛рдеред рдпрд╣ рдлрд┐рд░ рднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдФрд░ normal `def` рдХреЗ рд╕рд╛рде рдмрдирд╛рдИ рдЧрдИ ones рдХреЛ "awaited" рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп external thread (threadpool рд╕реЗ) рдкрд░ call рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред |
|||
|
|||
### рдЕрдиреНрдп utility functions { #other-utility-functions } |
|||
|
|||
рдХреЛрдИ рднреА рдЕрдиреНрдп utility function рдЬрд┐рд╕реЗ рдЖрдк directly call рдХрд░рддреЗ рд╣реИрдВ, normal `def` рдпрд╛ `async def` рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ FastAPI рдЗрд╕ рдмрд╛рдд рдХреЛ affect рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХрд┐ рдЖрдк рдЙрд╕реЗ рдХреИрд╕реЗ call рдХрд░рддреЗ рд╣реИрдВред |
|||
|
|||
рдпрд╣ рдЙрди functions рдХреЗ contrast рдореЗрдВ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ FastAPI рдЖрдкрдХреЗ рд▓рд┐рдП call рдХрд░рддрд╛ рд╣реИ: *path operation functions* рдФрд░ dependenciesред |
|||
|
|||
рдЕрдЧрд░ рдЖрдкрдХрд╛ utility function `def` рд╡рд╛рд▓рд╛ normal function рд╣реИ, рддреЛ рд╡рд╣ directly call рд╣реЛрдЧрд╛ (рдЬреИрд╕реЗ рдЖрдк рдЕрдкрдиреЗ code рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ), threadpool рдореЗрдВ рдирд╣реАрдВ; рдЕрдЧрд░ function `async def` рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ code рдореЗрдВ рдЙрд╕реЗ call рдХрд░рддреЗ рд╕рдордп рдЙрд╕ function рдХреЛ `await` рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред |
|||
|
|||
--- |
|||
|
|||
рдлрд┐рд░ рд╕реЗ, рдпреЗ рдмрд╣реБрдд technical details рд╣реИрдВ рдЬреЛ рд╢рд╛рдпрдж useful рд╣реЛрдВ рдЕрдЧрд░ рдЖрдк рдЗрдиреНрд╣реЗрдВ рдЦреЛрдЬрддреЗ рд╣реБрдП рдЖрдП рд╣реЛрдВред |
|||
|
|||
рдЕрдиреНрдпрдерд╛, рдКрдкрд░ рдХреЗ section рдХреА guidelines рдЖрдкрдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП: <a href="#in-a-hurry">рдЬрд▓реНрджреА рдореЗрдВ рд╣реИрдВ?</a>ред |
|||
@ -0,0 +1,34 @@ |
|||
# рдмреЗрдВрдЪрдорд╛рд░реНрдХ { #benchmarks } |
|||
|
|||
рд╕реНрд╡рддрдВрддреНрд░ TechEmpower рдмреЗрдВрдЪрдорд╛рд░реНрдХ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ Uvicorn рдХреЗ рддрд╣рдд рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ **FastAPI** applications [рдЙрдкрд▓рдмреНрдз рд╕рдмрд╕реЗ рддреЗрдЬрд╝ Python frameworks рдореЗрдВ рд╕реЗ рдПрдХ](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7) рд╣реИрдВ, рдХреЗрд╡рд▓ Starlette рдФрд░ Uvicorn рд╕реЗ рдиреАрдЪреЗ (рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ FastAPI рджреНрд╡рд╛рд░рд╛ рдЕрдВрджрд░реВрдиреА рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред |
|||
|
|||
рд▓реЗрдХрд┐рди рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдФрд░ рддреБрд▓рдирд╛рдПрдБ рджреЗрдЦрддреЗ рд╕рдордп рдЖрдкрдХреЛ рдирд┐рдореНрди рдмрд╛рддреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред |
|||
|
|||
## рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдФрд░ рдЧрддрд┐ { #benchmarks-and-speed } |
|||
|
|||
рдЬрдм рдЖрдк рдмреЗрдВрдЪрдорд╛рд░реНрдХ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдИ tools рдХреЛ рд╕рдорд╛рди рдорд╛рдирдХрд░ рддреБрд▓рдирд╛ рд╣реЛрддреЗ рджреЗрдЦрдирд╛ рдЖрдо рд╣реИред |
|||
|
|||
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, Uvicorn, Starlette рдФрд░ FastAPI рдХреЛ рд╕рд╛рде рдореЗрдВ рддреБрд▓рдирд╛ рд╣реЛрддреЗ рджреЗрдЦрдирд╛ (рдХрдИ рдЕрдиреНрдп tools рдХреЗ рд╕рд╛рде)ред |
|||
|
|||
tool рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЬрд┐рддрдирд╛ рд╕рд░рд▓ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ рдЙрддрдирд╛ рд╣реА рдмреЗрд╣рддрд░ performance рдорд┐рд▓реЗрдЧрд╛ред рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдмреЗрдВрдЪрдорд╛рд░реНрдХ 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 рдореЗрдВ рдХрдореЛрдмреЗрд╢ рдХрдо рд╕реЗ рдХрдо рд╡рд╣ рд╕рд╛рд░рд╛ code рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛ рдЬреЛ Starlette (рдпрд╛ **FastAPI**) рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдФрд░ рдпрджрд┐ рдЖрдкрдиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛, рддреЛ рдЖрдкрдХреЗ рдЕрдВрддрд┐рдо 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 рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЗ рдЕрдВрддрд┐рдо application рдореЗрдВ рдлрд┐рд░ рднреА рдЙрддрдирд╛ рд╣реА overhead рд╣реЛрдЧрд╛ рдЬрд┐рддрдирд╛ FastAPI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЬрд╛рдиреЗ рдкрд░ рд╣реЛрддрд╛ред рдФрд░ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ data validation рдФрд░ serialization applications рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП code рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрддрд╛ рд╣реИред |
|||
* рдЗрд╕рд▓рд┐рдП, FastAPI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк development time, bugs, code рдХреА lines рдмрдЪрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЛ рд╡рд╣реА performance (рдпрд╛ рдмреЗрд╣рддрд░) рдорд┐рд▓реЗрдЧрд╛ рдЬреЛ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдкрд░ рдорд┐рд▓рддрд╛ (рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рд╕рдм рдЕрдкрдиреЗ code рдореЗрдВ implement рдХрд░рдирд╛ рдкрдбрд╝рддрд╛)ред |
|||
* рдпрджрд┐ рдЖрдк FastAPI рдХреА рддреБрд▓рдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдРрд╕реЗ web application framework (рдпрд╛ tools рдХреЗ set) рд╕реЗ рдХрд░реЗрдВ рдЬреЛ data validation, serialization рдФрд░ documentation рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реЛ, рдЬреИрд╕реЗ Flask-apispec, NestJS, Molten рдЖрджрд┐ред Integrated automatic data validation, serialization рдФрд░ documentation рд╡рд╛рд▓реЗ frameworks рд╕реЗред |
|||
@ -0,0 +1,23 @@ |
|||
# рдПрдбрд┐рдЯрд░ рд╕рдорд░реНрдерди { #editor-support } |
|||
|
|||
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ [FastAPI Extension](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) рдЖрдкрдХреЗ FastAPI рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ workflow рдХреЛ *path operation* 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/) рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдбрд┐рдЯрд░ рдХреЗ Extensions panel рд╕реЗ рд╕реАрдзреЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, "FastAPI" рдЦреЛрдЬрдХрд░ рдФрд░ **FastAPI Labs** рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд extension рдЪреБрдирдХрд░ред рдпрд╣ extension browser-based editors рдЬреИрд╕реЗ [vscode.dev](https://vscode.dev) рдФрд░ [github.dev](https://github.dev) рдореЗрдВ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред |
|||
|
|||
### рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд┐рд╕реНрдХрд╡рд░реА { #application-discovery } |
|||
|
|||
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, 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 рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
## рд╕реБрд╡рд┐рдзрд╛рдПрдБ { #features } |
|||
|
|||
- **Path Operation Explorer** - рдЖрдкрдХреЗ application рдореЗрдВ рд╕рднреА <dfn title="рд░реВрдЯреНрд╕, рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕">*path operations*</dfn> рдХрд╛ sidebar tree viewред рдХрд┐рд╕реА рднреА route рдпрд╛ router definition рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред |
|||
- **Route Search** - path, method, рдпрд╛ name рдХреЗ рдЖрдзрд╛рд░ рдкрд░ <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>E</kbd> (macOS рдкрд░: <kbd>Cmd</kbd> + <kbd>Shift</kbd> + <kbd>E</kbd>) рд╕реЗ search рдХрд░реЗрдВред |
|||
- **CodeLens Navigation** - test client calls (рдЬреИрд╕реЗ `client.get('/items')`) рдХреЗ рдКрдкрд░ clickable links, рдЬреЛ tests рдФрд░ implementation рдХреЗ рдмреАрдЪ рддреЗрдЬрд╝ navigation рдХреЗ рд▓рд┐рдП matching *path operation* рдкрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред |
|||
- **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 рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ 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 рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред |
|||
@ -0,0 +1,134 @@ |
|||
# FastAPI CLI { #fastapi-cli } |
|||
|
|||
**FastAPI <abbr title="command line interface - рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕">CLI</abbr>** рдПрдХ command line program рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рдЕрдкрдиреА FastAPI app рдХреЛ serve рдХрд░рдиреЗ, рдЕрдкрдиреЗ FastAPI project рдХреЛ manage рдХрд░рдиреЗ, рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
рдЬрдм рдЖрдк FastAPI install рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ `pip install "fastapi[standard]"` рдХреЗ рд╕рд╛рде), рддреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ command line program рдЖрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк terminal рдореЗрдВ run рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
Development рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА FastAPI app run рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк `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 | рд╕реБрдЭрд╛рд╡ |
|||
|
|||
Production рдХреЗ рд▓рд┐рдП рдЖрдк `fastapi dev` рдХреЗ рдмрдЬрд╛рдп `fastapi run` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред ЁЯЪА |
|||
|
|||
/// |
|||
|
|||
Internally, **FastAPI CLI** [Uvicorn](https://www.uvicorn.dev), рдПрдХ high-performance, production-ready, ASGI server рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред ЁЯШО |
|||
|
|||
`fastapi` CLI run рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП FastAPI app рдХреЛ automatically detect рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ `main.py` file рдореЗрдВ `app` рдирд╛рдо рдХрд╛ object рд╣реИ (рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп variants рдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ)ред |
|||
|
|||
рд▓реЗрдХрд┐рди рдЖрдк рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА app рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ configure рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
## `pyproject.toml` рдореЗрдВ app `entrypoint` configure рдХрд░реЗрдВ { #configure-the-app-entrypoint-in-pyproject-toml } |
|||
|
|||
рдЖрдк `pyproject.toml` file рдореЗрдВ рдЕрдкрдиреА app рдХрд╣рд╛рдБ рд╕реНрдерд┐рдд рд╣реИ, рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ configure рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: |
|||
|
|||
```toml |
|||
[tool.fastapi] |
|||
entrypoint = "main:app" |
|||
``` |
|||
|
|||
рд╡рд╣ `entrypoint` `fastapi` command рдХреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдЙрд╕реЗ app рдХреЛ рдЗрд╕ рддрд░рд╣ import рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: |
|||
|
|||
```python |
|||
from main import app |
|||
``` |
|||
|
|||
рдпрджрд┐ рдЖрдкрдХрд╛ code рдЗрд╕ рддрд░рд╣ structured рдерд╛: |
|||
|
|||
``` |
|||
. |
|||
тФЬтФАтФА backend |
|||
тФВ┬а┬а тФЬтФАтФА main.py |
|||
тФВ┬а┬а тФЬтФАтФА __init__.py |
|||
``` |
|||
|
|||
рддреЛ рдЖрдк `entrypoint` рдХреЛ рдЗрд╕ рддрд░рд╣ set рдХрд░реЗрдВрдЧреЗ: |
|||
|
|||
```toml |
|||
[tool.fastapi] |
|||
entrypoint = "backend.main:app" |
|||
``` |
|||
|
|||
рдЬреЛ рдЗрд╕рдХреЗ equivalent рд╣реЛрдЧрд╛: |
|||
|
|||
```python |
|||
from backend.main import app |
|||
``` |
|||
|
|||
### Path рдХреЗ рд╕рд╛рде рдпрд╛ `--entrypoint` CLI option рдХреЗ рд╕рд╛рде `fastapi dev` { #fastapi-dev-with-path-or-with-entrypoint-cli-option } |
|||
|
|||
рдЖрдк file path рдХреЛ `fastapi dev` command рдореЗрдВ рднреА pass рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП FastAPI app object рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд▓реЗрдЧрд╛: |
|||
|
|||
```console |
|||
$ fastapi dev main.py |
|||
``` |
|||
|
|||
рдпрд╛, рдЖрдк `--entrypoint` option рдХреЛ `fastapi dev` command рдореЗрдВ рднреА pass рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: |
|||
|
|||
```console |
|||
$ fastapi dev --entrypoint main:app |
|||
``` |
|||
|
|||
рд▓реЗрдХрд┐рди рдЬрдм рднреА рдЖрдк `fastapi` command call рдХрд░реЗрдВ, рддреЛ рдЖрдкрдХреЛ рд╣рд░ рдмрд╛рд░ рд╕рд╣реА path\entrypoint pass рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред |
|||
|
|||
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдиреНрдп tools рд╢рд╛рдпрдж рдЗрд╕реЗ find рди рдХрд░ рдкрд╛рдПрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП [VS Code Extension](editor-support.md) рдпрд╛ [FastAPI Cloud](https://fastapicloud.com), рдЗрд╕рд▓рд┐рдП `pyproject.toml` рдореЗрдВ `entrypoint` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИред |
|||
|
|||
## `fastapi dev` { #fastapi-dev } |
|||
|
|||
`fastapi dev` run рдХрд░рдиреЗ рд╕реЗ development mode рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред |
|||
|
|||
Default рд░реВрдк рд╕реЗ, **auto-reload** enabled рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рдЖрдк рдЕрдкрдиреЗ code рдореЗрдВ changes рдХрд░рддреЗ рд╣реИрдВ рддреЛ server automatically reload рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ resource-intensive рд╣реИ рдФрд░ disabled рд╣реЛрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо stable рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреЗрд╡рд▓ development рдХреЗ рд▓рд┐рдП use рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ IP address `127.0.0.1` рдкрд░ рднреА listen рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреА machine рдХреЗ рдЦреБрдж рд╕реЗ рд╣реА (`localhost`) communicate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IP рд╣реИред |
|||
|
|||
## `fastapi run` { #fastapi-run } |
|||
|
|||
`fastapi run` execute рдХрд░рдиреЗ рд╕реЗ FastAPI production mode рдореЗрдВ start рд╣реЛрддрд╛ рд╣реИред |
|||
|
|||
Default рд░реВрдк рд╕реЗ, **auto-reload** disabled рд╣реЛрддрд╛ рд╣реИред рдпрд╣ IP address `0.0.0.0` рдкрд░ рднреА listen рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рд╕рднреА available IP addresses; рдЗрд╕ рддрд░рд╣ рдпрд╣ machine рд╕реЗ communicate рдХрд░ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП publicly accessible рд╣реЛрдЧрд╛ред рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЖрдк production рдореЗрдВ рдЗрд╕реЗ рдЗрд╕реА рддрд░рд╣ run рдХрд░реЗрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА container рдореЗрдВред |
|||
|
|||
рдЕрдзрд┐рдХрд╛рдВрд╢ cases рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдКрдкрд░ HTTPS handle рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ "termination proxy" рд╣реЛрдЧрд╛ (рдФрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП), рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ depend рдХрд░реЗрдЧрд╛ рдХрд┐ рдЖрдк рдЕрдкрдиреА application рдХреИрд╕реЗ deploy рдХрд░рддреЗ рд╣реИрдВ; рдЖрдкрдХрд╛ provider рдЖрдкрдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЦреБрдж set up рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред |
|||
|
|||
/// tip | рд╕реБрдЭрд╛рд╡ |
|||
|
|||
рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ [deployment documentation](deployment/index.md) рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
/// |
|||
@ -0,0 +1,201 @@ |
|||
# рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ { #features } |
|||
|
|||
## FastAPI рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ { #fastapi-features } |
|||
|
|||
**FastAPI** рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрддрд╛ рд╣реИ: |
|||
|
|||
### рдЦреБрд▓реЗ standards рдкрд░ рдЖрдзрд╛рд░рд┐рдд { #based-on-open-standards } |
|||
|
|||
* API рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП [**OpenAPI**](https://github.com/OAI/OpenAPI-Specification), рдЬрд┐рд╕рдореЗрдВ <dfn title="рдЗрдиреНрд╣реЗрдВ рднреА рдХрд╣рддреЗ рд╣реИрдВ: endpoints, routes">path</dfn> <dfn title="рдЗрдиреНрд╣реЗрдВ HTTP methods рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ POST, GET, PUT, DELETE">operations</dfn>, parameters, request bodies, security, рдЖрджрд┐ рдХреА declarations рд╢рд╛рдорд┐рд▓ рд╣реИрдВред |
|||
* [**JSON Schema**](https://json-schema.org/) рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ-рдЖрдк data model documentation (рдХреНрдпреЛрдВрдХрд┐ OpenAPI рдЦреБрдж JSON Schema рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ)ред |
|||
* рдЗрди standards рдХреЗ рдЗрд░реНрдж-рдЧрд┐рд░реНрдж, рдЧрд╣рди рдЕрдзреНрдпрдпрди рдХреЗ рдмрд╛рдж design рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдКрдкрд░ рд╕реЗ рдЬреЛрдбрд╝реА рдЧрдИ рдмрд╛рдж рдХреА layer рдХреА рддрд░рд╣ рдирд╣реАрдВред |
|||
* рдЗрд╕рд╕реЗ рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ automatic **client code generation** рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рд╕рдВрднрд╡ рд╣реЛрддрд╛ рд╣реИред |
|||
|
|||
### Automatic docs { #automatic-docs } |
|||
|
|||
Interactive API documentation рдФрд░ exploration web user interfacesред рдЪреВрдБрдХрд┐ framework OpenAPI рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдХрдИ options рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ 2 default рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред |
|||
|
|||
* [**Swagger UI**](https://github.com/swagger-api/swagger-ui), interactive exploration рдХреЗ рд╕рд╛рде, browser рд╕реЗ рд╕реАрдзреЗ рдЕрдкрдиреА API рдХреЛ call рдФрд░ test рдХрд░реЗрдВред |
|||
|
|||
 |
|||
|
|||
* [**ReDoc**](https://github.com/Rebilly/ReDoc) рдХреЗ рд╕рд╛рде рд╡реИрдХрд▓реНрдкрд┐рдХ API documentationред |
|||
|
|||
 |
|||
|
|||
### рдмрд╕ Modern 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 |
|||
|
|||
# рдХрд┐рд╕реА variable рдХреЛ str рдХреЗ рд░реВрдк рдореЗрдВ declare рдХрд░реЗрдВ |
|||
# рдФрд░ function рдХреЗ рдЕрдВрджрд░ editor support рдкрд╛рдПрдБ |
|||
def main(user_id: str): |
|||
return user_id |
|||
|
|||
|
|||
# рдПрдХ Pydantic model |
|||
class User(BaseModel): |
|||
id: int |
|||
name: str |
|||
joined: date |
|||
``` |
|||
|
|||
рдЬрд┐рд╕реЗ рдлрд┐рд░ рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: |
|||
|
|||
```Python |
|||
my_user: User = User(id=3, name="John Doe", joined="2018-07-19") |
|||
|
|||
second_user_data = { |
|||
"id": 4, |
|||
"name": "Mary", |
|||
"joined": "2018-11-30", |
|||
} |
|||
|
|||
my_second_user: User = User(**second_user_data) |
|||
``` |
|||
|
|||
/// note | рдиреЛрдЯ |
|||
|
|||
`**second_user_data` рдХрд╛ рдЕрд░реНрде рд╣реИ: |
|||
|
|||
`second_user_data` dict рдХреА keys рдФрд░ values рдХреЛ рд╕реАрдзреЗ key-value arguments рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ, рдЬреЛ рдЗрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ: `User(id=4, name="Mary", joined="2018-11-30")` |
|||
|
|||
/// |
|||
|
|||
### Editor support { #editor-support } |
|||
|
|||
рдкреВрд░реЗ framework рдХреЛ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рди рдФрд░ intuitive рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП design рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ development рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рд╕рднреА decisions рдХреЛ рдХрдИ editors рдкрд░ test рдХрд┐рдпрд╛ рдЧрдпрд╛, рддрд╛рдХрд┐ рдмреЗрд╣рддрд░реАрди development experience рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗред |
|||
|
|||
Python developer surveys рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ [рдХрд┐ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА features рдореЗрдВ рд╕реЗ рдПрдХ "autocompletion" рд╣реИ](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features)ред |
|||
|
|||
рдкреВрд░рд╛ **FastAPI** framework рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП design рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред 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 type рдХрд░рдирд╛, 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, рдЖрджрд┐ рд╣реЛрддреА рд╣реИрдВред |
|||
|
|||
* рдЕрдзрд┐рдХ exotic types рдХреЗ рд▓рд┐рдП validation, рдЬреИрд╕реЗ: |
|||
* URLред |
|||
* Emailред |
|||
* UUIDред |
|||
* ...рдФрд░ рдЕрдиреНрдпред |
|||
|
|||
рд╕рд╛рд░рд╛ validation рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдордЬрдмреВрдд **Pydantic** рджреНрд╡рд╛рд░рд╛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред |
|||
|
|||
### Security рдФрд░ authentication { #security-and-authentication } |
|||
|
|||
Security рдФрд░ authentication integrated рд╣реИрдВред Databases рдпрд╛ data models рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рд╕рдордЭреМрддреЗ рдХреЗ рдмрд┐рдирд╛ред |
|||
|
|||
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 рджреНрд╡рд╛рд░рд╛ **рдЕрдкрдиреЗ-рдЖрдк рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ**ред |
|||
* рд╕рднреА dependencies requests рд╕реЗ data рдорд╛рдВрдЧ рд╕рдХрддреА рд╣реИрдВ рдФрд░ **path operation** constraints рдФрд░ automatic documentation рдХреЛ augment рдХрд░ рд╕рдХрддреА рд╣реИрдВред |
|||
* Dependencies рдореЗрдВ define рдХрд┐рдП рдЧрдП *path operation* parameters рдХреЗ рд▓рд┐рдП рднреА **automatic validation**ред |
|||
* Complex user authentication systems, **database connections**, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП supportред |
|||
* Databases, frontends, рдЖрджрд┐ рдХреЗ рд╕рд╛рде **рдХреЛрдИ рд╕рдордЭреМрддрд╛ рдирд╣реАрдВ**ред рд▓реЗрдХрд┐рди рдЙрди рд╕рднреА рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рди integrationред |
|||
|
|||
### рдЕрд╕реАрдорд┐рдд "plug-ins" { #unlimited-plug-ins } |
|||
|
|||
рдпрд╛ рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЙрдирдХреА рдЬрд░реВрд░рдд рд╣реА рдирд╣реАрдВ, рдЕрдкрдиреА рдЬрд░реВрд░рдд рдХрд╛ code import рдХрд░реЗрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред |
|||
|
|||
рдХреЛрдИ рднреА integration рдЗрддрдирд╛ рд╕рд░рд▓ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп design рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (dependencies рдХреЗ рд╕рд╛рде) рдХрд┐ рдЖрдк рдЕрдкрдиреА application рдХреЗ рд▓рд┐рдП рдЙрд╕реА structure рдФрд░ syntax рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП 2 lines рдХреЗ code рдореЗрдВ рдПрдХ "plug-in" рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреА *path operations* рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред |
|||
|
|||
### Tested { #tested } |
|||
|
|||
* 100% <dfn title="рдЕрдкрдиреЗ-рдЖрдк test рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ code рдХреА рдорд╛рддреНрд░рд╛">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 рдореЗрдВ** рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдм рдХреБрдЫ рдЕрдкрдиреЗ-рдЖрдк validate рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред |
|||
|
|||
рджреВрд╕рд░реА рджрд┐рд╢рд╛ рдореЗрдВ рднреА рдпрд╣реА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк 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 рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ">linter</dfn>/рджрд┐рдорд╛рдЧ** рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: |
|||
* рдХреНрдпреЛрдВрдХрд┐ 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 рдХреЛ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ define, check рдФрд░ JSON Schema рдХреЗ рд░реВрдк рдореЗрдВ document рдХрд░рдиреЗ рджреЗрддреЗ рд╣реИрдВред |
|||
* рдЖрдкрдХреЗ рдкрд╛рд╕ рдЧрд╣рд░рд╛рдИ рддрдХ **nested JSON** objects рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ рд╕рднреА validate рдФрд░ annotate рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред |
|||
* **Extensible**: |
|||
* Pydantic custom data types define рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ рдпрд╛ рдЖрдк validator decorator рд╕реЗ decorated model methods рдХреЗ рд╕рд╛рде validation extend рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред |
|||
* 100% test coverageред |
|||
@ -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** рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ frameworks, plug-ins рдФрд░ tools рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред |
|||
|
|||
рд▓реЗрдХрд┐рди рдПрдХ рд╕рдордп рдРрд╕рд╛ рдЖрдпрд╛ рдЬрдм рдРрд╕рд╛ рдХреБрдЫ рдмрдирд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рдерд╛ рдЬреЛ рдпреЗ рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░реЗ, рдкрд┐рдЫрд▓реЗ tools рд╕реЗ рд╕рд░реНрд╡реЛрддреНрддрдо рд╡рд┐рдЪрд╛рд░ рд▓реЗрдХрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд╕рдВрднрд╡ рддрд░реАрдХреЗ рд╕реЗ рдЬреЛрдбрд╝реЗ, рдФрд░ рдРрд╕реА рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗ рдЬреЛ рдкрд╣рд▓реЗ рдЙрдкрд▓рдмреНрдз рднреА рдирд╣реАрдВ рдереАрдВ (Python 3.6+ type hints)ред |
|||
|
|||
</blockquote> |
|||
|
|||
## рдЬрд╛рдБрдЪ-рдкрдбрд╝рддрд╛рд▓ { #investigation } |
|||
|
|||
рдкрд┐рдЫрд▓реЗ рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореБрдЭреЗ рдЙрди рд╕рднреА рд╕реЗ рд╕реАрдЦрдиреЗ, рд╡рд┐рдЪрд╛рд░ рд▓реЗрдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рд▓рд┐рдП рддрдерд╛ рдЬрд┐рди рдбреЗрд╡рд▓рдкрд░ рдЯреАрдореЛрдВ рдХреЗ рд╕рд╛рде рдореИрдВрдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓рд╛ред |
|||
|
|||
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдерд╛ рдХрд┐ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЗрд╕реЗ standard Python type hints рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред |
|||
|
|||
рд╕рд╛рде рд╣реА, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж standards рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛ред |
|||
|
|||
рдЗрд╕рд▓рд┐рдП, **FastAPI** рдХреЛ code рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА, рдореИрдВрдиреЗ OpenAPI, JSON Schema, OAuth2 рдЖрджрд┐ рдХреА specs рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдореЗрдВ рдХрдИ рдорд╣реАрдиреЗ рдмрд┐рддрд╛рдПред рдЙрдирдХреЗ рд╕рдВрдмрдВрдз, overlap рдФрд░ рдЕрдВрддрд░ рдХреЛ рд╕рдордЭрд╛ред |
|||
|
|||
## рдбрд┐рдЬрд╝рд╛рдЗрди { #design } |
|||
|
|||
рдлрд┐рд░ рдореИрдВрдиреЗ рдХреБрдЫ рд╕рдордп рдЙрд╕ developer "API" рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рдиреЗ рдореЗрдВ рдмрд┐рддрд╛рдпрд╛ рдЬрд┐рд╕реЗ рдореИрдВ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ (FastAPI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ developer рдХреЗ рд░реВрдк рдореЗрдВ)ред |
|||
|
|||
рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп Python editors рдореЗрдВ рдХрдИ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛: PyCharm, VS Code, Jedi рдЖрдзрд╛рд░рд┐рдд editorsред |
|||
|
|||
рдкрд┐рдЫрд▓реЗ [Python Developer Survey](https://www.jetbrains.com/research/python-developers-survey-2018/#development-tools) рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рд▓рдЧрднрдЧ 80% рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред |
|||
|
|||
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ **FastAPI** рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрди editors рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рдиреНрд╣реЗрдВ 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 } |
|||
|
|||
рдЬрдм рддрдХ рдореИрдВрдиреЗ рд╕реНрд╡рдпрдВ **FastAPI** рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддрдм рддрдХ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╣рд┐рд╕реНрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рдереЗ, рдбрд┐рдЬрд╝рд╛рдЗрди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдерд╛, requirements рдФрд░ tools рддреИрдпрд╛рд░ рдереЗ, рдФрд░ standards рддрдерд╛ specifications рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдЮрд╛рди рд╕реНрдкрд╖реНрдЯ рдФрд░ рддрд╛рдЬрд╝рд╛ рдерд╛ред |
|||
|
|||
## рднрд╡рд┐рд╖реНрдп { #future } |
|||
|
|||
рдЗрд╕ рдмрд┐рдВрджреБ рддрдХ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ **FastAPI** рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╕рд╛рдмрд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИред |
|||
|
|||
рдХрдИ use cases рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдЙрдкрдпреБрдХреНрдд рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдЗрд╕реЗ рдкрд┐рдЫрд▓реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЪреБрдирд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред |
|||
|
|||
рдХрдИ developers рдФрд░ teams рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ projects рдХреЗ рд▓рд┐рдП **FastAPI** рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВ (рдореЗрд░реЗ рдФрд░ рдореЗрд░реА team рд╕рд╣рд┐рдд)ред |
|||
|
|||
рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдХрдИ рд╕реБрдзрд╛рд░ рдФрд░ features рдЖрдиреЗ рдмрд╛рдХреА рд╣реИрдВред |
|||
|
|||
**FastAPI** рдХреЗ рдЖрдЧреЗ рдПрдХ рд╢рд╛рдирджрд╛рд░ рднрд╡рд┐рд╖реНрдп рд╣реИред |
|||
|
|||
рдФрд░ [рдЖрдкрдХреА рдорджрдж](help-fastapi.md) рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред |
|||
@ -0,0 +1,28 @@ |
|||
# Full Stack FastAPI рдЯреЗрдореНрдкрд▓реЗрдЯ { #full-stack-fastapi-template } |
|||
|
|||
рдЯреЗрдореНрдкрд▓реЗрдЯ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрдЯрдЕрдк рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрдиреНрд╣реЗрдВ рд▓рдЪреАрд▓рд╛ рдФрд░ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрджрд▓ рдФрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╡реЗ рдПрдХ рдмреЗрд╣рддрд░реАрди рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдмрди рдЬрд╛рддреЗ рд╣реИрдВред ЁЯПБ |
|||
|
|||
рдЖрдк рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╢реБрд░реБрдЖрддреА рд╕реЗрдЯрдЕрдк, рд╕реБрд░рдХреНрд╖рд╛, рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рдХреБрдЫ API endpoints рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдкрдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред |
|||
|
|||
GitHub Repository: [Full Stack FastAPI рдЯреЗрдореНрдкрд▓реЗрдЯ](https://github.com/tiangolo/full-stack-fastapi-template) |
|||
|
|||
## Full Stack FastAPI рдЯреЗрдореНрдкрд▓реЗрдЯ - 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 рдХреЗ рдЕрдиреНрдп рд╣рд┐рд╕реНрд╕реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧред |
|||
- ЁЯОи frontend components рдХреЗ рд▓рд┐рдП [Tailwind CSS](https://tailwindcss.com) рдФрд░ [shadcn/ui](https://ui.shadcn.com)ред |
|||
- ЁЯдЦ рдЕрдкрдиреЗ-рдЖрдк generate рдХрд┐рдпрд╛ рдЧрдпрд╛ 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 based password recoveryред |
|||
- тЬЕ [Pytest](https://pytest.org) рдХреЗ рд╕рд╛рде testsред |
|||
- ЁЯУЮ reverse proxy / load balancer рдХреЗ рд░реВрдк рдореЗрдВ [Traefik](https://traefik.io)ред |
|||
- ЁЯЪв Docker Compose рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ deployment instructions, рдЬрд┐рд╕рдореЗрдВ automatic HTTPS certificates рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП frontend Traefik proxy рд╕реЗрдЯ рдЕрдк рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред |
|||
- ЁЯПн GitHub Actions рдкрд░ рдЖрдзрд╛рд░рд┐рдд CI (continuous integration) рдФрд░ CD (continuous deployment)ред |
|||
@ -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">рдЯрд╛рдЗрдк</dfn> рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддреЗ рд╣реИрдВред |
|||
|
|||
рдЕрдкрдиреЗ variables рдХреЗ рд▓рд┐рдП types рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рд╕реЗ editors рдФрд░ tools рдЖрдкрдХреЛ рдмреЗрд╣рддрд░ рд╕рд╣рд╛рдпрддрд╛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
рдпрд╣ 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="рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рд░рдЦрддрд╛ рд╣реИ, рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВред рдПрдХ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрд╛рдж рджреВрд╕рд░реЗ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рдеред">рдЬреЛрдбрд╝рддрд╛</dfn> рд╣реИред |
|||
|
|||
{* ../../docs_src/python_types/tutorial001_py310.py hl[2] *} |
|||
|
|||
### рдЗрд╕реЗ edit рдХрд░реЗрдВ { #edit-it } |
|||
|
|||
рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╕рд░рд▓ program рд╣реИред |
|||
|
|||
рд▓реЗрдХрд┐рди рдЕрдм рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЗрд╕реЗ рд╢реБрд░реБрдЖрдд рд╕реЗ рд▓рд┐рдЦ рд░рд╣реЗ рдереЗред |
|||
|
|||
рдХрд┐рд╕реА рд╕рдордп рдЖрдк function define рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЗ parameters рддреИрдпрд╛рд░ рд╣реИрдВ... |
|||
|
|||
рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдкрдХреЛ "рд╡рд╣ method рдЬреЛ рдкрд╣рд▓реЗ рдЕрдХреНрд╖рд░ рдХреЛ upper case рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ" call рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред |
|||
|
|||
рдХреНрдпрд╛ рд╡рд╣ `upper` рдерд╛? рдХреНрдпрд╛ рд╡рд╣ `uppercase` рдерд╛? `first_uppercase`? `capitalize`? |
|||
|
|||
рдлрд┐рд░, рдЖрдк programmer рдХреЗ рдкреБрд░рд╛рдиреЗ рджреЛрд╕реНрдд, editor autocompletion, рдХреЛ рдЖрдЬрд╝рдорд╛рддреЗ рд╣реИрдВред |
|||
|
|||
рдЖрдк function рдХрд╛ рдкрд╣рд▓рд╛ parameter, `first_name`, type рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдПрдХ dot (`.`) рдФрд░ рдлрд┐рд░ completion trigger рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `Ctrl+Space` рджрдмрд╛рддреЗ рд╣реИрдВред |
|||
|
|||
рд▓реЗрдХрд┐рди, рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ, рдЖрдкрдХреЛ рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рдорд┐рд▓рддрд╛: |
|||
|
|||
<img src="/img/python-types/image01.png"> |
|||
|
|||
### Types рдЬреЛрдбрд╝реЗрдВ { #add-types } |
|||
|
|||
рдЖрдЗрдП рдкрд┐рдЫрд▓реЗ version рдХреА рдПрдХ рд╣реА line рдХреЛ modify рдХрд░реЗрдВред |
|||
|
|||
рд╣рдо exactly рдЗрд╕ 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 рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдЬреИрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рд╣реЛрддрд╛: |
|||
|
|||
```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 рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдЖрдкрдХреЛ рд╡рд╣ option рди рдорд┐рд▓ рдЬрд╛рдП рдЬреЛ "рдЬрд╛рдирд╛-рдкрд╣рдЪрд╛рдирд╛ рд▓рдЧреЗ": |
|||
|
|||
<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 рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ { #declaring-types } |
|||
|
|||
рдЖрдкрдиреЗ type hints рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдореБрдЦреНрдп рдЬрдЧрд╣ рдЕрднреА рджреЗрдЦреАред Function parameters рдХреЗ рд░реВрдк рдореЗрдВред |
|||
|
|||
рдпрд╣ рд╡рд╣реА рдореБрдЦреНрдп рдЬрдЧрд╣ рднреА рд╣реИ рдЬрд╣рд╛рдБ рдЖрдк рдЙрдиреНрд╣реЗрдВ **FastAPI** рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред |
|||
|
|||
### Simple types { #simple-types } |
|||
|
|||
рдЖрдк рд╕рднреА standard Python types рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ `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 рдХрд░рдиреА рдкрдбрд╝ рд╕рдХрддреА рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬрдм рдЖрдк рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ "рдХреЛрдИ рднреА 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]` рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред |
|||
|
|||
рдЗрди 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" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред |
|||
|
|||
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, `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 рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рдХрд░реЗрдВрдЧреЗ: |
|||
|
|||
{* ../../docs_src/python_types/tutorial007_py310.py hl[1] *} |
|||
|
|||
рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ: |
|||
|
|||
* Variable `items_t` рдПрдХ `tuple` рд╣реИ рдЬрд┐рд╕рдореЗрдВ 3 items рд╣реИрдВ, рдПрдХ `int`, рджреВрд╕рд░рд╛ `int`, рдФрд░ рдПрдХ `str`ред |
|||
* Variable `items_s` рдПрдХ `set` рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдкреНрд░рддреНрдпреЗрдХ item рдХрд╛ type `bytes` рд╣реИред |
|||
|
|||
#### Dict { #dict } |
|||
|
|||
`dict` define рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк 2 type parameters pass рдХрд░рддреЗ рд╣реИрдВ, commas рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдП рд╣реБрдПред |
|||
|
|||
рдкрд╣рд▓рд╛ 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 } |
|||
|
|||
рдЖрдк рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ variable **рдХрдИ types** рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ `int` рдпрд╛ рдПрдХ `str`ред |
|||
|
|||
рдЗрд╕реЗ define рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рджреЛрдиреЛрдВ types рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП <dfn title='рдЗрд╕реЗ "bitwise or operator" рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╣ рдЕрд░реНрде рдпрд╣рд╛рдБ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ'>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 } |
|||
|
|||
рдЖрдк рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА 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 рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
рдорд╛рди рд▓реЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ `Person` class рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ name рд╣реИ: |
|||
|
|||
{* ../../docs_src/python_types/tutorial010_py310.py hl[1:3] *} |
|||
|
|||
рдлрд┐рд░ рдЖрдк рдХрд┐рд╕реА variable рдХреЛ `Person` type рдХрд╛ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: |
|||
|
|||
{* ../../docs_src/python_types/tutorial010_py310.py hl[6] *} |
|||
|
|||
рдФрд░ рдлрд┐рд░, рдЖрдкрдХреЛ рдлрд┐рд░ рд╕реЗ рдкреВрд░рд╛ editor support рдорд┐рд▓рддрд╛ рд╣реИ: |
|||
|
|||
<img src="/img/python-types/image06.png"> |
|||
|
|||
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ "`one_person`, `Person` class рдХрд╛ рдПрдХ **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 рд╣реЛрддрд╛ рд╣реИред |
|||
|
|||
рдлрд┐рд░ рдЖрдк рдЙрд╕ class рдХрд╛ рдПрдХ instance рдХреБрдЫ values рдХреЗ рд╕рд╛рде рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ values рдХреЛ validate рдХрд░реЗрдЧрд╛, рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреБрдХреНрдд type рдореЗрдВ convert рдХрд░реЗрдЧрд╛ (рдпрджрд┐ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рд╣реЛ) рдФрд░ рдЖрдкрдХреЛ рд╕рднреА 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 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред |
|||
|
|||
рдЖрдк рдпрд╣ рд╕рдм рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ [Tutorial - User Guide](tutorial/index.md) рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рджреЗрдЦреЗрдВрдЧреЗред |
|||
|
|||
## Metadata Annotations рдХреЗ рд╕рд╛рде Type Hints { #type-hints-with-metadata-annotations } |
|||
|
|||
Python рдореЗрдВ рдПрдХ feature рднреА рд╣реИ рдЬреЛ `Annotated` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрди type hints рдореЗрдВ **рдЕрддрд┐рд░рд┐рдХреНрдд <dfn title="data рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ data, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, type рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА, рдЬреИрд╕реЗ рдХреЛрдИ descriptionред">metadata</dfn>** рдбрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред |
|||
|
|||
рдЖрдк `typing` рд╕реЗ `Annotated` import рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
{* ../../docs_src/python_types/tutorial013_py310.py hl[1,4] *} |
|||
|
|||
Python рд╕реНрд╡рдпрдВ рдЗрд╕ `Annotated` рдХреЗ рд╕рд╛рде рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ред рдФрд░ editors рддрдерд╛ рдЕрдиреНрдп tools рдХреЗ рд▓рд┐рдП, type рдЕрдм рднреА `str` рд╣реА рд╣реИред |
|||
|
|||
рд▓реЗрдХрд┐рди рдЖрдк `Annotated` рдореЗрдВ рдЗрд╕ space рдХрд╛ рдЙрдкрдпреЛрдЧ **FastAPI** рдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд metadata рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреА application рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреИрд╕рд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред |
|||
|
|||
рдпрд╛рдж рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ `Annotated` рдХреЛ рдЖрдк рдЬреЛ **рдкрд╣рд▓рд╛ *type parameter*** pass рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣реА **actual type** рд╣реИред рдмрд╛рдХреА рд╕рдм рдЕрдиреНрдп tools рдХреЗ рд▓рд┐рдП metadata рд╣реИред |
|||
|
|||
рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реИ рдХрд┐ `Annotated` рдореМрдЬреВрдж рд╣реИ, рдФрд░ рдпрд╣ standard Python рд╣реИред ЁЯШО |
|||
|
|||
рдмрд╛рдж рдореЗрдВ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ **powerful** рд╣реЛ рд╕рдХрддрд╛ рд╣реИред |
|||
|
|||
/// tip | рд╕реБрдЭрд╛рд╡ |
|||
|
|||
рдпрд╣ рддрдереНрдп рдХрд┐ рдпрд╣ **standard Python** рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреЗ editor рдореЗрдВ, рдЕрдкрдиреЗ code рдХреЛ analyze рдФрд░ refactor рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ tools рдЖрджрд┐ рдХреЗ рд╕рд╛рде, рдЕрдм рднреА **рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдВрднрд╡ developer experience** рдорд┐рд▓реЗрдЧрд╛ред тЬи |
|||
|
|||
рдФрд░ рдпрд╣ рднреА рдХрд┐ рдЖрдкрдХрд╛ code рдХрдИ рдЕрдиреНрдп Python tools рдФрд░ libraries рдХреЗ рд╕рд╛рде рдмрд╣реБрдд compatible рд░рд╣реЗрдЧрд╛ред ЁЯЪА |
|||
|
|||
/// |
|||
|
|||
## **FastAPI** рдореЗрдВ Type hints { #type-hints-in-fastapi } |
|||
|
|||
**FastAPI** рдЗрди type hints рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдХрд░ рдХрдИ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред |
|||
|
|||
**FastAPI** рдХреЗ рд╕рд╛рде рдЖрдк parameters рдХреЛ type hints рдХреЗ рд╕рд╛рде 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 invalid рд╣реЛрдиреЗ рдкрд░ client рдХреЛ рд▓реМрдЯрд╛рдИ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА **automatic errors** generate рдХрд░рдирд╛ред |
|||
* OpenAPI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ API рдХреЛ **Document** рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: |
|||
* рдЬрд┐рд╕реЗ рдлрд┐рд░ automatic interactive documentation user interfaces рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред |
|||
|
|||
рдпрд╣ рд╕рдм abstract рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВред рдЖрдк рдпрд╣ рд╕рдм [Tutorial - User Guide](tutorial/index.md) рдореЗрдВ action рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред |
|||
|
|||
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ standard Python types рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдПрдХ рд╣реА рдЬрдЧрд╣ рдкрд░ (рдЕрдзрд┐рдХ classes, decorators рдЖрджрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп), **FastAPI** рдЖрдкрдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░рд╛ рдХрд╛рдо рдХрд░ рджреЗрдЧрд╛ред |
|||
|
|||
/// note | рдиреЛрдЯ |
|||
|
|||
рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╣реА рдкреВрд░рд╛ tutorial рдкрдврд╝ рдЪреБрдХреЗ рд╣реИрдВ рдФрд░ types рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдЖрдП рд╣реИрдВ, рддреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ resource [`mypy` рдХреА "cheat sheet"](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html) рд╣реИред |
|||
|
|||
/// |
|||
@ -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 рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдПрдБ, рдЖрдЧреЗ рд╣рдо рдмрддрд╛рдПрдБрдЧреЗ рдХрд┐ рдХреМрди-рд╕рд╛ 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 рдХрд░реЗрдВ { #activate-the-virtual-environment } |
|||
|
|||
рдирдП рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреЛ activate рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдХреЛрдИ рднреА Python рдХрдорд╛рдВрдб рдпрд╛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреИрдХреЗрдЬ рдЙрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗред |
|||
|
|||
/// 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 | рдЯрд┐рдк |
|||
|
|||
рдЬрдм рднреА рдЖрдк рдЙрд╕ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдореЗрдВ рдХреЛрдИ **рдирдпрд╛ рдкреИрдХреЗрдЬ** рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ, рддреЛ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ **activate** рдХрд░реЗрдВред |
|||
|
|||
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдк рдЙрд╕ рдкреИрдХреЗрдЬ рджреНрд╡рд╛рд░рд╛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдИ **terminal (<abbr title="command line interface - рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕">CLI</abbr>) program** рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рд╡рд╛рд▓рд╛ рд╣реА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВ, рдХреЛрдИ рджреВрд╕рд░рд╛ рдирд╣реАрдВ рдЬреЛ globally рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдЖрдкрдХреЗ рдЖрд╡рд╢реНрдпрдХ version рд╕реЗ рдЕрд▓рдЧ version рдХреЗ рд╕рд╛рдеред |
|||
|
|||
/// |
|||
|
|||
## рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ active рд╣реИ { #check-the-virtual-environment-is-active } |
|||
|
|||
рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ active рд╣реИ (рдкрд┐рдЫрд▓рд╛ рдХрдорд╛рдВрдб рдХрд╛рдо рдХрд░ рдЧрдпрд╛)ред |
|||
|
|||
/// tip | рдЯрд┐рдк |
|||
|
|||
рдпрд╣ **рд╡реИрдХрд▓реНрдкрд┐рдХ** рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ **рдЬрд╛рдБрдЪрдиреЗ** рдХрд╛ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЖрдк рд╡рд╣реА рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рдереЗред |
|||
|
|||
/// |
|||
|
|||
//// tab | Linux, macOS, Windows Bash |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ which python |
|||
|
|||
/home/user/code/awesome-project/.venv/bin/python |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
рдЕрдЧрд░ рдпрд╣ рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ `awesome-project`) рдХреЗ рдЕрдВрджрд░ `.venv/bin/python` рдкрд░ `python` binary рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░ рдЧрдпрд╛ред ЁЯОЙ |
|||
|
|||
//// |
|||
|
|||
//// tab | Windows PowerShell |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ Get-Command python |
|||
|
|||
C:\Users\user\code\awesome-project\.venv\Scripts\python |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
рдЕрдЧрд░ рдпрд╣ рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ `awesome-project`) рдХреЗ рдЕрдВрджрд░ `.venv\Scripts\python` рдкрд░ `python` binary рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░ рдЧрдпрд╛ред ЁЯОЙ |
|||
|
|||
//// |
|||
|
|||
## `pip` upgrade рдХрд░реЗрдВ { #upgrade-pip } |
|||
|
|||
/// tip | рдЯрд┐рдк |
|||
|
|||
рдЕрдЧрд░ рдЖрдк [`uv`](https://github.com/astral-sh/uv) рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЪреАрдЬрд╝реЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `pip` рдХреЗ рдмрдЬрд╛рдп рдЙрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ `pip` upgrade рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред ЁЯШО |
|||
|
|||
/// |
|||
|
|||
рдЕрдЧрд░ рдЖрдк рдкреИрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП `pip` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдпрд╣ Python рдХреЗ рд╕рд╛рде рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЖрддрд╛ рд╣реИ), рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ latest version рдкрд░ **upgrade** рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред |
|||
|
|||
рдкреИрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдЖрдиреЗ рд╡рд╛рд▓реА рдХрдИ рдЕрдЬреАрдм errors рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ `pip` upgrade рдХрд░рдиреЗ рд╕реЗ рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред |
|||
|
|||
/// tip | рдЯрд┐рдк |
|||
|
|||
рдЖрдк рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдпрд╣ **рдПрдХ рдмрд╛рд░** рдХрд░реЗрдВрдЧреЗ, рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рджред |
|||
|
|||
/// |
|||
|
|||
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ active рд╣реИ (рдКрдкрд░ рджрд┐рдП рдЧрдП рдХрдорд╛рдВрдб рд╕реЗ) рдФрд░ рдлрд┐рд░ рдЪрд▓рд╛рдПрдБ: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ python -m pip install --upgrade pip |
|||
|
|||
---> 100% |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
/// tip | рдЯрд┐рдк |
|||
|
|||
рдХрднреА-рдХрднреА, pip upgrade рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ **`No module named pip`** error рдорд┐рд▓ рд╕рдХрддреА рд╣реИред |
|||
|
|||
рдЕрдЧрд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ pip рдЗрдВрд╕реНрдЯреЙрд▓ рдФрд░ upgrade рдХрд░реЗрдВ: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ python -m ensurepip --upgrade |
|||
|
|||
---> 100% |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
рдпрд╣ рдХрдорд╛рдВрдб pip рдХреЛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдЧрд╛ рдЕрдЧрд░ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдирд╣реАрдВ рд╣реИ рдФрд░ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ 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" рдХрд░реЗрдЧрд╛ (рдЕрдЧрд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдмрджрд▓рддрд╛ рд╣реИ) |
|||
* `>`: `>` рдХреЗ рдмрд╛рдИрдВ рдУрд░ рд╡рд╛рд▓реЗ рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ terminal рдкрд░ print рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХреЛрдИ рднреА рдЪреАрдЬрд╝ print рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдмрд▓реНрдХрд┐ `>` рдХреЗ рджрд╛рдИрдВ рдУрд░ рд╡рд╛рд▓реА file рдореЗрдВ рд▓рд┐рдЦреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП |
|||
* `.gitignore`: рдЙрд╕ file рдХрд╛ рдирд╛рдо рдЬрд╣рд╛рдБ text рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП |
|||
|
|||
рдФрд░ Git рдХреЗ рд▓рд┐рдП `*` рдХрд╛ рдЕрд░реНрде рд╣реИ "рд╕рдм рдХреБрдЫ"ред рдЗрд╕рд▓рд┐рдП, рдпрд╣ `.venv` рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╕рдм рдХреБрдЫ ignore рдХрд░реЗрдЧрд╛ред |
|||
|
|||
рдпрд╣ рдХрдорд╛рдВрдб `.gitignore` file рдмрдирд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреА content рд╣реЛрдЧреА: |
|||
|
|||
```gitignore |
|||
* |
|||
``` |
|||
|
|||
/// |
|||
|
|||
## рдкреИрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ { #install-packages } |
|||
|
|||
рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ activate рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЙрд╕рдореЗрдВ рдкреИрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
/// tip | рдЯрд┐рдк |
|||
|
|||
рдпрд╣ **рдПрдХ рдмрд╛рд░** рдХрд░реЗрдВ рдЬрдм рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЪрд╛рд╣рд┐рдП рдкреИрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдпрд╛ upgrade рдХрд░ рд░рд╣реЗ рд╣реЛрдВред |
|||
|
|||
рдЕрдЧрд░ рдЖрдкрдХреЛ рдХрд┐рд╕реА version рдХреЛ upgrade рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирдпрд╛ рдкреИрдХреЗрдЬ рдЬреЛрдбрд╝рдирд╛ рд╣реИ, рддреЛ рдЖрдк **рдпрд╣ рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВрдЧреЗ**ред |
|||
|
|||
/// |
|||
|
|||
### рдкреИрдХреЗрдЬ рд╕реАрдзреЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ { #install-packages-directly } |
|||
|
|||
рдЕрдЧрд░ рдЖрдк рдЬрд▓реНрджреА рдореЗрдВ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА package requirements declare рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП file рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕реАрдзреЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
/// tip | рдЯрд┐рдк |
|||
|
|||
рдЖрдкрдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЬрд┐рди 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 рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
//// 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 |
|||
``` |
|||
|
|||
/// |
|||
|
|||
## рдЕрдкрдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдПрдБ { #run-your-program } |
|||
|
|||
рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ activate рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЕрдкрдирд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЖрдкрдХреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреЗ рдЕрдВрджрд░ рд╡рд╛рд▓реЗ Python рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рд╡рд╣рд╛рдБ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП packages рдХреЗ рд╕рд╛рдеред |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ python main.py |
|||
|
|||
Hello World |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
## рдЕрдкрдирд╛ editor configure рдХрд░реЗрдВ { #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 рдХрд░реЗрдВ { #deactivate-the-virtual-environment } |
|||
|
|||
рдЬрдм рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд░ рд▓реЗрдВ, рддреЛ рдЖрдк рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреЛ **deactivate** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ deactivate |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
рдЗрд╕ рддрд░рд╣, рдЬрдм рдЖрдк `python` рдЪрд▓рд╛рдПрдБрдЧреЗ, рддреЛ рдпрд╣ рд╡рд╣рд╛рдБ рдЗрдВрд╕реНрдЯреЙрд▓ packages рд╡рд╛рд▓реЗ рдЙрд╕ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред |
|||
|
|||
## рдХрд╛рдо рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ { #ready-to-work } |
|||
|
|||
рдЕрдм рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред |
|||
|
|||
/// tip | рдЯрд┐рдк |
|||
|
|||
рдХреНрдпрд╛ рдЖрдк рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдКрдкрд░ рдХреА рд╕рднреА рдЪреАрдЬрд╝реЗрдВ рдХреНрдпрд╛ рд╣реИрдВ? |
|||
|
|||
рдкрдврд╝рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВред ЁЯСЗЁЯдУ |
|||
|
|||
/// |
|||
|
|||
## рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреНрдпреЛрдВ { #why-virtual-environments } |
|||
|
|||
FastAPI рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ [Python](https://www.python.org/) рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред |
|||
|
|||
рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ FastAPI рдФрд░ рдХреЛрдИ рднреА рдЕрдиреНрдп **packages** рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, **install** рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред |
|||
|
|||
Packages install рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рд╛рдорд╛рдиреНрдпрддрдГ Python рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реЗ `pip` command (рдпрд╛ рд╕рдорд╛рди рд╡рд┐рдХрд▓реНрдкреЛрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред |
|||
|
|||
рдлрд┐рд░ рднреА, рдЕрдЧрд░ рдЖрдк рд╕реАрдзреЗ `pip` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ packages рдЖрдкрдХреЗ **global Python environment** (Python рдХреА global installation) рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛ рдЬрд╛рдПрдБрдЧреЗред |
|||
|
|||
### рд╕рдорд╕реНрдпрд╛ { #the-problem } |
|||
|
|||
рддреЛ, global Python environment рдореЗрдВ packages install рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ? |
|||
|
|||
рдХрд┐рд╕реА рд╕рдордп, рдЖрдк рд╢рд╛рдпрдж рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ programs рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ **рдЕрд▓рдЧ-рдЕрд▓рдЧ packages** рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдВрдЧреЗред рдФрд░ рдЬрд┐рди projects рдкрд░ рдЖрдк рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдЙрд╕реА package рдХреЗ **рдЕрд▓рдЧ-рдЕрд▓рдЧ versions** рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдВрдЧреЗред ЁЯШ▒ |
|||
|
|||
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк `philosophers-stone` рдирд╛рдо рдХрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо **`harry`, version `1`** рдирд╛рдо рдХреЗ рдПрдХ рджреВрд╕рд░реЗ package рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ `harry` install рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред |
|||
|
|||
```mermaid |
|||
flowchart LR |
|||
stone(philosophers-stone) -->|рдЖрд╡рд╢реНрдпрдХ рд╣реИ| harry-1[harry v1] |
|||
``` |
|||
|
|||
рдлрд┐рд░, рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рд╕рдордп, рдЖрдк `prisoner-of-azkaban` рдирд╛рдо рдХрд╛ рдПрдХ рджреВрд╕рд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рднреА `harry` рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ **`harry` version `3`** рдЪрд╛рд╣рд┐рдПред |
|||
|
|||
```mermaid |
|||
flowchart LR |
|||
azkaban(prisoner-of-azkaban) --> |рдЖрд╡рд╢реНрдпрдХ рд╣реИ| harry-3[harry v3] |
|||
``` |
|||
|
|||
рд▓реЗрдХрд┐рди рдЕрдм рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдк packages рдХреЛ local **virtual environment** рдХреЗ рдмрдЬрд╛рдп 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) -->|рдЖрд╡рд╢реНрдпрдХ рд╣реИ| harry-1 |
|||
end |
|||
``` |
|||
|
|||
рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЕрдЧрд░ рдЖрдк `prisoner-of-azkaban` рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ `harry` version `1` uninstall рдХрд░рдХреЗ `harry` version `3` install рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╛ рдХреЗрд╡рд▓ version `3` install рдХрд░рдиреЗ рд╕реЗ version `1` рдЕрдкрдиреЗ-рдЖрдк 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) --> |рдЖрд╡рд╢реНрдпрдХ рд╣реИ| harry-3 |
|||
end |
|||
``` |
|||
|
|||
/// tip | рдЯрд┐рдк |
|||
|
|||
Python packages рдореЗрдВ **new versions** рдореЗрдВ **breaking changes** рд╕реЗ рдмрдЪрдиреЗ рдХреА рдкреВрд░реА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрдо рд╣реИ, рд▓реЗрдХрд┐рди рд╕реБрд░рдХреНрд╖рд┐рдд рд░рд╣рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдФрд░ рдирдП versions рдХреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдФрд░ рддрдм install рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдЬрдм рдЖрдк tests рдЪрд▓рд╛ рдХрд░ рдЬрд╛рдБрдЪ рд╕рдХреЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред |
|||
|
|||
/// |
|||
|
|||
рдЕрдм, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ **рд╕рднреА projects рдЬрд┐рди рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВ** рдРрд╕реЗ **рдХрдИ** рдЕрдиреНрдп **packages** рд╣реЛрдВред рдЗрд╕реЗ manage рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИред рдФрд░ рдЖрдк рд╢рд╛рдпрдж рдХреБрдЫ projects рдХреЛ packages рдХреЗ **incompatible versions** рдХреЗ рд╕рд╛рде рдЪрд▓рд╛ рджреЗрдВрдЧреЗ, рдФрд░ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рдкрд╛рдПрдБрдЧреЗ рдХрд┐ рдХреБрдЫ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ред |
|||
|
|||
рд╕рд╛рде рд╣реА, рдЖрдкрдХреЗ operating system (рдЬреИрд╕реЗ Linux, Windows, macOS) рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рдЙрд╕рдореЗрдВ Python рдкрд╣рд▓реЗ рд╕реЗ installed рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╢рд╛рдпрдж рдХреБрдЫ packages рдХреБрдЫ specific versions рдХреЗ рд╕рд╛рде pre-installed рдереЗ рдЬреЛ **рдЖрдкрдХреЗ system рдХреЛ рдЪрд╛рд╣рд┐рдП**ред рдЕрдЧрд░ рдЖрдк global Python environment рдореЗрдВ packages install рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ operating system рдХреЗ рд╕рд╛рде рдЖрдП рдХреБрдЫ programs рдХреЛ **break** рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
## Packages рдХрд╣рд╛рдБ install рд╣реЛрддреЗ рд╣реИрдВ { #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 рдореЗрдВ рд░рдЦреЗрдЧрд╛ред |
|||
|
|||
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдЙрди downloaded рдФрд░ extracted files рдХреЛ рдЖрдкрдХреА Python installation рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реА directory рдореЗрдВ рд░рдЦреЗрдЧрд╛, рд╡рд╣реА **global environment** рд╣реИред |
|||
|
|||
## рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреНрдпрд╛ рд╣реИрдВ { #what-are-virtual-environments } |
|||
|
|||
рд╕рднреА packages рдХреЛ global environment рдореЗрдВ рд░рдЦрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЬрд┐рд╕ рдкреНрд░рддреНрдпреЗрдХ project рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ **virtual environment** рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред |
|||
|
|||
рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдПрдХ **directory** рд╣реИ, global рд╡рд╛рд▓реА рдХреЗ рдмрд╣реБрдд рд╕рдорд╛рди, рдЬрд╣рд╛рдБ рдЖрдк рдХрд┐рд╕реА project рдХреЗ рд▓рд┐рдП packages install рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
рдЗрд╕ рддрд░рд╣, рд╣рд░ project рдХрд╛ рдЕрдкрдирд╛ virtual environment (`.venv` directory) рд╣реЛрдЧрд╛, рдЕрдкрдиреЗ packages рдХреЗ рд╕рд╛рдеред |
|||
|
|||
```mermaid |
|||
flowchart TB |
|||
subgraph stone-project[philosophers-stone project] |
|||
stone(philosophers-stone) --->|рдЖрд╡рд╢реНрдпрдХ рд╣реИ| harry-1 |
|||
subgraph venv1[.venv] |
|||
harry-1[harry v1] |
|||
end |
|||
end |
|||
subgraph azkaban-project[prisoner-of-azkaban project] |
|||
azkaban(prisoner-of-azkaban) --->|рдЖрд╡рд╢реНрдпрдХ рд╣реИ| 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 | рдЯрд┐рдк |
|||
|
|||
рдЖрдк `PATH` environment variable рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ [Environment Variables](environment-variables.md#path-environment-variable) section рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред |
|||
|
|||
/// |
|||
|
|||
рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ 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 рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ virtual environment path рдХреЛ `PATH` variable рдХреА **рд╢реБрд░реБрдЖрдд** рдореЗрдВ рд░рдЦреЗрдЧрд╛ред System рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЙрдкрд▓рдмреНрдз Python рдХреЛ рдЦреЛрдЬрдиреЗ рд╕реЗ **рдкрд╣рд▓реЗ** рдЗрд╕реЗ рдкрд╛рдПрдЧрд╛ред рдЗрд╕ рддрд░рд╣, рдЬрдм рдЖрдк `python` рдЪрд▓рд╛рдПрдБрдЧреЗ, рддреЛ рдпрд╣ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп `python` (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, global environment рдХрд╛ `python`) рдХреЗ рдмрдЬрд╛рдп **virtual environment рд╕реЗ 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 рд╡рд╣реА рд╣реИ рдЬреЛ **virtual environment рдореЗрдВ** рд╣реИред |
|||
|
|||
рдЖрдк Linux рдФрд░ macOS рдореЗрдВ `which` рдФрд░ Windows PowerShell рдореЗрдВ `Get-Command` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред |
|||
|
|||
рдпрд╣ command рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ `PATH` environment variable рдореЗрдВ рдЬрд╛рдХрд░ **рд╣рд░ path рдХреЛ рдХреНрд░рдо рд╕реЗ** check рдХрд░реЗрдЧрд╛, `python` рдирд╛рдо рдХреЗ program рдХреЛ рдЦреЛрдЬрддреЗ рд╣реБрдПред рдЬреИрд╕реЗ рд╣реА рдпрд╣ рдЙрд╕реЗ рдкрд╛рддрд╛ рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рдЙрд╕ program рдХрд╛ **path рджрд┐рдЦрд╛рдПрдЧрд╛**ред |
|||
|
|||
рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк `python` call рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣реА exact "`python`" execute рд╣реЛрдЧрд╛ред |
|||
|
|||
рдЗрд╕рд▓рд┐рдП, рдЖрдк confirm рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рд╕рд╣реА virtual environment рдореЗрдВ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред |
|||
|
|||
/// tip | рдЯрд┐рдк |
|||
|
|||
рдПрдХ virtual environment activate рдХрд░рдирд╛, рдПрдХ Python рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдФрд░ рдлрд┐рд░ **рджреВрд╕рд░реЗ project рдореЗрдВ рдЪрд▓реЗ рдЬрд╛рдирд╛** рдЖрд╕рд╛рди рд╣реИред |
|||
|
|||
рдФрд░ рджреВрд╕рд░рд╛ project **рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛** рдХреНрдпреЛрдВрдХрд┐ рдЖрдк **рдЧрд▓рдд Python** рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рджреВрд╕рд░реЗ project рдХреЗ virtual environment рд╕реЗ рд╣реИред |
|||
|
|||
рдпрд╣ check рдХрд░ рдкрд╛рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рдХреМрди-рд╕рд╛ `python` рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛ рд░рд╣рд╛ рд╣реИред ЁЯдУ |
|||
|
|||
/// |
|||
|
|||
## рд╡рд░реНрдЪреБрдЕрд▓ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ deactivate рдХреНрдпреЛрдВ рдХрд░реЗрдВ { #why-deactivate-a-virtual-environment } |
|||
|
|||
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк `philosophers-stone` project рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, **рдЙрд╕ virtual environment рдХреЛ activate** рдХрд░рдХреЗ, packages install рдХрд░рдХреЗ рдФрд░ рдЙрд╕ environment рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдХреЗред |
|||
|
|||
рдФрд░ рдлрд┐рд░ рдЖрдк **рджреВрд╕рд░реЗ project** `prisoner-of-azkaban` рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред |
|||
|
|||
рдЖрдк рдЙрд╕ project рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ cd ~/code/prisoner-of-azkaban |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
рдЕрдЧрд░ рдЖрдк `philosophers-stone` рдХреЗ virtual environment рдХреЛ deactivate рдирд╣реАрдВ рдХрд░рддреЗ, рддреЛ рдЬрдм рдЖрдк terminal рдореЗрдВ `python` рдЪрд▓рд╛рдПрдБрдЧреЗ, рдпрд╣ `philosophers-stone` рд╕реЗ Python рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ред |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ cd ~/code/prisoner-of-azkaban |
|||
|
|||
$ python main.py |
|||
|
|||
// sirius import рдХрд░рдиреЗ рдореЗрдВ error, рдпрд╣ installed рдирд╣реАрдВ рд╣реИ ЁЯШ▒ |
|||
Traceback (most recent call last): |
|||
File "main.py", line 1, in <module> |
|||
import sirius |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк virtual environment рдХреЛ deactivate рдХрд░ рджреЗрдВ рдФрд░ `prisoner-of-azkaban` рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╡рд╛рд▓рд╛ activate рдХрд░реЗрдВ, рддреЛ рдЬрдм рдЖрдк `python` рдЪрд▓рд╛рдПрдБрдЧреЗ, рдпрд╣ `prisoner-of-azkaban` рдореЗрдВ virtual environment рд╕реЗ Python рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ cd ~/code/prisoner-of-azkaban |
|||
|
|||
// deactivate рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкреБрд░рд╛рдиреА directory рдореЗрдВ рд╣реЛрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЖрдк рдЬрд╣рд╛рдБ рднреА рд╣реЛрдВ рд╡рд╣рд╛рдБ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рджреВрд╕рд░реЗ project рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рднреА ЁЯШО |
|||
$ deactivate |
|||
|
|||
// prisoner-of-azkaban/.venv рдореЗрдВ virtual environment activate рдХрд░реЗрдВ ЁЯЪА |
|||
$ source .venv/bin/activate |
|||
|
|||
// рдЕрдм рдЬрдм рдЖрдк python рдЪрд▓рд╛рдПрдБрдЧреЗ, рддреЛ рдпрд╣ рдЗрд╕ virtual environment рдореЗрдВ installed package sirius рдвреВрдБрдв рд▓реЗрдЧрд╛ тЬи |
|||
$ python main.py |
|||
|
|||
I solemnly swear ЁЯР║ |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
## рд╡рд┐рдХрд▓реНрдк { #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 рдХреЗ рд▓рд┐рдП **virtual environment** manage рдХрд░рдирд╛ |
|||
* **packages** install рдХрд░рдирд╛ |
|||
* рдЖрдкрдХреЗ project рдХреЗ рд▓рд┐рдП package **dependencies рдФрд░ versions** manage рдХрд░рдирд╛ |
|||
* рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ install рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП packages рдФрд░ versions рдХрд╛ рдПрдХ **exact** set рд╣реЛ, рдЙрдирдХреА dependencies рд╕рд╣рд┐рдд, рддрд╛рдХрд┐ рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗрдВ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ project рдХреЛ production рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕реЗ рд╣реА рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ development рдХреЗ рджреМрд░рд╛рди рдЕрдкрдиреЗ computer рдореЗрдВ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ **locking** рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ |
|||
* рдФрд░ рднреА рдХрдИ рдЪреАрдЬрд╝реЗрдВ |
|||
|
|||
## рдирд┐рд╖реНрдХрд░реНрд╖ { #conclusion } |
|||
|
|||
рдЕрдЧрд░ рдЖрдкрдиреЗ рдпрд╣ рд╕рдм рдкрдврд╝ рдФрд░ рд╕рдордЭ рд▓рд┐рдпрд╛, рддреЛ рдЕрдм **рдЖрдк virtual environments рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ** рдХрдИ developers рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирддреЗ рд╣реИрдВред ЁЯдУ |
|||
|
|||
рдЗрди details рдХреЛ рдЬрд╛рдирдирд╛ рд╕рдВрднрд╡рддрдГ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬрд╝ рдХреЛ debug рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдЬреЛ complex рд▓рдЧрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдкрддрд╛ рд╣реЛрдЧрд╛ рдХрд┐ **рдпрд╣ рд╕рдм рдЕрдВрджрд░ рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ**ред ЁЯШО |
|||
LoadingтАж
Reference in new issue