{"id":482601,"date":"2026-06-06T06:19:22","date_gmt":"2026-06-06T06:19:22","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=482601"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=482601","title":{"rendered":"\u0422\u043e\u043f-10 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e FastAPI"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>FastAPI \u0441\u0435\u0439\u0447\u0430\u0441 \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0434\u0435-\u0444\u0430\u043a\u0442\u043e \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 Python. Flask \u0441\u0434\u0430\u0451\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c \u043a \u043d\u0435\u043c\u0443 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u0438 Swagger \u0440\u0443\u043a\u0430\u043c\u0438 \u0432\u0441\u0435\u043c \u0434\u0430\u0432\u043d\u043e \u043d\u0430\u0434\u043e\u0435\u043b\u043e. Django \u0432\u0441\u0451 \u0435\u0449\u0451 \u043a\u0440\u0443\u0442, \u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 API \u043e\u043d \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u0439. \u0412 \u0438\u0442\u043e\u0433\u0435 FastAPI \u2014 \u0432\u0435\u0437\u0434\u0435.<\/p>\n<p>\u0420\u0430\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0442\u0430\u043a \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u0435\u043d, \u0442\u043e \u0438 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u043f\u0440\u043e \u043d\u0435\u0433\u043e \u0432\u0441\u0451 \u0447\u0430\u0449\u0435. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432 \u0440\u0435\u0437\u044e\u043c\u0435 \u0437\u0430\u044f\u0432\u043b\u0435\u043d FastAPI, \u0432\u0430\u0441 \u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0443\u0442 \u0433\u043e\u043d\u044f\u0442\u044c \u043f\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 Pydantic.<\/p>\n<p>\u042f \u0441\u043e\u0431\u0440\u0430\u043b 10 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0434\u0430\u044e\u0442 \u043d\u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0443\u0440\u043e\u0432\u043d\u044f <strong>Junior+<\/strong> \u0438 <strong>Middle<\/strong>.<\/p>\n<p><strong>\u0421\u0440\u0430\u0437\u0443 \u043e \u0433\u043b\u0430\u0432\u043d\u043e\u043c:<\/strong> \u0437\u0430\u0437\u0443\u0431\u0440\u0438\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043d\u0438\u0436\u0435 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e. \u041d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0436\u0435 \u0443\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0435\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u0435 \u043f\u043e\u0439\u043c\u0435\u0442, \u0433\u0434\u0435 \u0432\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0435\u0441\u044c \u0432 \u0442\u0435\u043c\u0435, \u0430 \u0433\u0434\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0443\u0447\u0438\u043b\u0438 \u043e\u0442\u0432\u0435\u0442. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043a\u0430\u043a \u0447\u0435\u043a-\u043b\u0438\u0441\u0442: \u043f\u0440\u043e\u0431\u0435\u0433\u0438\u0442\u0435\u0441\u044c \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443, \u043d\u0430\u0439\u0434\u0438\u0442\u0435 \u043f\u0440\u043e\u0431\u0435\u043b\u044b \u0432 \u0437\u043d\u0430\u043d\u0438\u044f\u0445 \u0438 \u043f\u043e\u0439\u0434\u0438\u0442\u0435 \u043f\u043e\u0442\u044b\u043a\u0430\u0439\u0442\u0435 \u043a\u043e\u0434 \u0440\u0443\u043a\u0430\u043c\u0438. \u0410 \u0435\u0441\u043b\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0439\u043c\u0435\u0442\u0435, \u0447\u0442\u043e \u0431\u0430\u0437\u0430 \u043f\u043e\u043a\u0430 \u0445\u0440\u043e\u043c\u0430\u0435\u0442 \u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u0441\u0451 \u0432 \u0447\u0435\u0442\u043a\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0437\u0430\u043b\u0435\u0442\u0430\u0439\u0442\u0435 \u043d\u0430 \u043c\u043e\u0439 \u043a\u0443\u0440\u0441 <a href=\"https:\/\/stepik.org\/course\/263165\/promo\" rel=\"noopener noreferrer nofollow\">\u00abFastAPI \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445\u00bb<\/a> \u043d\u0430 Stepik \u2014 \u0442\u0430\u043c \u043c\u044b \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u043b\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043e\u0442 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435.<\/p>\n<h2>1. \u0412 \u0447\u0435\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 FastAPI \u043f\u0435\u0440\u0435\u0434 Flask \u0438 Django?<\/h2>\n<p><strong>\u041e\u0442\u0432\u0435\u0442:<\/strong> \u0417\u0434\u0435\u0441\u044c \u043e\u0442 \u0432\u0430\u0441 \u0436\u0434\u0443\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0444\u0438\u0447\u0435\u0439 \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u043a\u0430\u043a\u0443\u044e \u0438\u043c\u0435\u043d\u043d\u043e \u0431\u043e\u043b\u044c \u0440\u0435\u0448\u0430\u0435\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a.<\/p>\n<ul>\n<li>\n<p><strong>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c:<\/strong> \u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 Starlette, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 FastAPI \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 <code>asyncio<\/code>. \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 NodeJS \u0438 Go.<\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u043e\u0449\u043d\u0430\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f:<\/strong> \u0417\u0430 \u043d\u0435\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 Pydantic. \u0412\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0448\u0435\u0442\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 Python, \u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0441\u0430\u043c \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e, \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e JSON. \u041c\u0435\u043d\u044c\u0448\u0435 \u0431\u043e\u0439\u043b\u0435\u0440\u043f\u043b\u0435\u0439\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f:<\/strong> OpenAPI (Swagger \u0438 ReDoc) \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043b\u0435\u0442\u0443. \u0412 \u0442\u043e\u043c \u0436\u0435 Flask \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0443\u0447\u0443 \u0434\u043e\u043a\u0441\u0442\u0440\u0438\u043d\u0433\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0412\u043e\u043f\u0440\u043e\u0441 \u0441\u043e \u0437\u0432\u0435\u0437\u0434\u043e\u0447\u043a\u043e\u0439:<\/strong> <em>\u0412 \u043a\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b \u0431\u044b \u041d\u0415 \u0441\u0442\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c FastAPI, \u0430 \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0431\u044b Django?<\/em><\/p>\n<p><strong>\u041a\u0430\u043a \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c:<\/strong> FastAPI \u2014 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f API. \u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u043e\u0432\u043e\u0441\u0442\u043d\u043e\u0439 \u043f\u043e\u0440\u0442\u0430\u043b \u0438\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d), \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u0430\u043d\u0435\u043b\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u043d\u0435\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u044f\u043c\u0438 \u0438 \u0442\u0435\u0441\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u043a\u0430 \u0441 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0411\u0414 \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb, \u043b\u0443\u0447\u0448\u0435 \u0432\u0437\u044f\u0442\u044c Django. \u0415\u0433\u043e \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u044f \u00ab\u0431\u0430\u0442\u0430\u0440\u0435\u0439\u043a\u0438 \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435\u00bb \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043d\u0435\u0434\u0435\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<h2>2. \u041a\u0430\u043a \u0432 FastAPI \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c? \u0412 \u0447\u0435\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 def \u0438 async def?<\/h2>\n<p><strong>\u041e\u0442\u0432\u0435\u0442:<\/strong> \u042d\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439, \u043d\u043e \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u0432\u0430\u0440\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0447\u0430\u0441\u0442\u043e \u0441\u044b\u043f\u044f\u0442\u0441\u044f \u0434\u0436\u0443\u043d\u044b.<\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0435 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u043a\u0430\u043a <code><strong>async def<\/strong><\/code>, \u043a\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 event loop. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u044b (<code>await<\/code>).<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <code><strong>def<\/strong><\/code>, FastAPI \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u201c\u043f\u043e\u0432\u0435\u0441\u0438\u0442\u044c\u201d \u0441\u0435\u0440\u0432\u0435\u0440, \u043e\u043d \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u043f\u0443\u043b\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (threadpool).<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0427\u0430\u0441\u0442\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 (\u0447\u0442\u043e \u043b\u044e\u0431\u044f\u0442 \u0443\u0442\u043e\u0447\u043d\u044f\u0442\u044c \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u0445):<\/strong> <em>\u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 <\/em><code><em>async def<\/em><\/code><em> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <\/em><code><em>requests.get()<\/em><\/code><em> \u0438\u043b\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e ORM?<\/em><\/p>\n<p><strong>\u041a\u0430\u043a \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c:<\/strong> \u0412\u044b \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0435 event loop. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0438 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u0436\u0434\u0430\u0442\u044c, \u043f\u043e\u043a\u0430 \u0432\u0430\u0448 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f. \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u043f\u0430\u0434\u0435\u0442 \u0434\u043e \u043d\u0443\u043b\u044f.<\/p>\n<p><strong>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e:<\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (\u043e\u0431\u044b\u0447\u043d\u044b\u0439 <code>requests<\/code>, <code>psycopg2<\/code> \u0431\u0435\u0437 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438) \u2014 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0439\u0442\u0435 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0447\u0435\u0440\u0435\u0437 <code>def<\/code>. \u0425\u043e\u0442\u0438\u0442\u0435 \u043f\u0438\u0441\u0430\u0442\u044c <code>async def<\/code> \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438 (<code>httpx<\/code>, <code>asyncpg<\/code>, SQLAlchemy 2.0+).<\/p>\n<h2>3. \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Pydantic \u0438 \u043a\u0430\u043a\u0443\u044e \u0440\u043e\u043b\u044c \u043e\u043d \u0438\u0433\u0440\u0430\u0435\u0442 \u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435?<\/h2>\n<p><strong>\u041e\u0442\u0432\u0435\u0442:<\/strong> \u042d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 Python.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043a\u043b\u0438\u0435\u043d\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 JSON-\u0437\u0430\u043f\u0440\u043e\u0441, Pydantic \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443:<\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u043b\u0438 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u0448\u043b\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0442\u0440\u043e\u043a\u0443 <code>\"1\"<\/code> \u0432 \u0447\u0438\u0441\u043b\u043e <code>1<\/code>, \u0435\u0441\u043b\u0438 \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d <code>int<\/code>).<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u043e\u043a, \u043e\u0442\u0434\u0430\u0435\u0442 \u0432\u0430\u043c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 Python-\u043e\u0431\u044a\u0435\u043a\u0442, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432 IDE.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0430, \u0441\u0430\u043c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u043c <code>422 Unprocessable Entity<\/code>, \u0433\u0434\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u043e, \u0432 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u043b\u0435 \u043a\u043e\u0441\u044f\u043a.<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438:<\/strong> \u0427\u0430\u0441\u0442\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u043c\u043b\u0430\u0434\u0448\u0435 18). \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 <code>@field_validator<\/code>:<\/p>\n<pre><code class=\"python\">from pydantic import BaseModel, field_validatorclass UserCreate(BaseModel):    username: str    age: int    @field_validator('age')    @classmethod    def check_age(cls, value: int):        if value &lt; 18:            raise ValueError('\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 18 \u043b\u0435\u0442')        return value<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h2>4. \u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 Dependency Injection (DI) \u0432 FastAPI?<\/h2>\n<p><strong>\u041e\u0442\u0432\u0435\u0442:<\/strong> \u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 (DI) \u2014 \u044d\u0442\u043e \u043a\u0438\u043b\u043b\u0435\u0440-\u0444\u0438\u0447\u0430 FastAPI, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0447\u0435\u0440\u0435\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>Depends()<\/code>. \u0421\u0443\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0430: \u0435\u0441\u043b\u0438 \u0432\u0430\u0448\u0435\u043c\u0443 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0443 \u0447\u0442\u043e-\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b (\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0411\u0414, \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u044e\u0437\u0435\u0440\u0430, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438), \u0432\u044b \u043d\u0435 \u043f\u0438\u0448\u0435\u0442\u0435 \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u044f\u043c\u043e \u0432 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0435. \u0412\u044b \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u0435 \u0435\u0451 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440: \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>get_db_session()<\/code>. \u0412\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u0435\u0451 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 \u043a\u0430\u043a <code>session = Depends(get_db_session)<\/code>. FastAPI \u0441\u0430\u043c \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u0435\u0441\u0441\u0438\u044e \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0441\u0442 \u0435\u0451 \u0432\u0430\u043c. \u042d\u0442\u043e \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0447\u0438\u0441\u0442\u044b\u043c\u0438.<\/p>\n<p><strong>\u0412\u043e\u043f\u0440\u043e\u0441 \u0441\u043e \u0437\u0432\u0435\u0437\u0434\u043e\u0447\u043a\u043e\u0439:<\/strong> <em>\u041a\u0430\u043a \u043c\u043e\u043a\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (override dependencies) \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432?<\/em><\/p>\n<p><strong>\u041a\u0430\u043a \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c:<\/strong> \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c <code>app.dependency_overrides<\/code>. \u042d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412 \u0442\u0435\u0441\u0442\u0430\u0445 \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0431\u043e\u0435\u0432\u043e\u0439 \u0411\u0414 \u0438\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0442\u043e\u043a\u0435\u043d\u0430 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435) \u0438 \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0435\u043c \u0435\u0451 \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443.<\/p>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">app.dependency_overrides[get_db_session] = override_get_db_session<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0441\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f, \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c, \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043d\u043e\u0432\u0430 \u043d\u0430\u0447\u043d\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u0418\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u044e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n<h2>5. \u041a\u0430\u043a \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u0440\u0443\u043f\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 FastAPI?<\/h2>\n<p><strong>\u041e\u0442\u0432\u0435\u0442:<\/strong> \u0413\u043b\u0430\u0432\u043d\u0430\u044f \u043b\u043e\u0432\u0443\u0448\u043a\u0430 FastAPI (\u043a\u0430\u043a \u0438 Flask) \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u043d\u0435 \u0434\u0438\u043a\u0442\u0443\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0441\u0442\u0440\u043e\u0433\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 Django. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0436\u0443\u043d\u044b \u0447\u0430\u0441\u0442\u043e \u043f\u0438\u0448\u0443\u0442 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u044b\u0439 <code>main.py<\/code> \u043d\u0430 \u043f\u0430\u0440\u0443 \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a. \u041d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u0445\u043e\u0442\u044f\u0442 \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u044b \u0443\u043c\u0435\u0435\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043b\u043e\u0438.<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u2014 <code><strong>APIRouter<\/strong><\/code>. \u041e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043c\u0438\u043d\u0438-\u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f FastAPI, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043c\u043e\u043d\u043e\u043b\u0438\u0442 \u043d\u0430 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e <code>users<\/code>, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e <code>orders<\/code>).<\/p>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438:<\/strong> \u0425\u043e\u0440\u043e\u0448\u0438\u043c \u0442\u043e\u043d\u043e\u043c \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u043d\u0430 \u0441\u043b\u043e\u0438. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code>src\/\u251c\u2500\u2500 main.py             # \u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f FastAPI\u251c\u2500\u2500 api\/                # \u042d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b (\u0440\u043e\u0443\u0442\u0435\u0440\u044b)\u2502   \u251c\u2500\u2500 dependencies.py # \u041e\u0431\u0449\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, get_db)\u2502   \u2514\u2500\u2500 v1\/             # \u0412\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 API\u2502       \u251c\u2500\u2500 users.py    # router.get(\"\/users\")\u2502       \u2514\u2500\u2500 items.py\u251c\u2500\u2500 core\/               # \u041a\u043e\u043d\u0444\u0438\u0433\u0438 (pydantic-settings), \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c (JWT)\u251c\u2500\u2500 db\/                 # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0411\u0414, \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 (Alembic)\u251c\u2500\u2500 models\/             # ORM-\u043c\u043e\u0434\u0435\u043b\u0438 (SQLAlchemy)\u251c\u2500\u2500 schemas\/            # Pydantic-\u0441\u0445\u0435\u043c\u044b (DTO) \u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0432\u0432\u043e\u0434\u0430\/\u0432\u044b\u0432\u043e\u0434\u0430\u2514\u2500\u2500 services\/           # \u0411\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 (\u0438\u043b\u0438 crud\/), \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0435\u0451 \u0432 \u0440\u043e\u0443\u0442\u0435\u0440\u0430\u0445<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0437\u0432\u0443\u0447\u0438\u0442\u044c: <strong>\u0440\u043e\u0443\u0442\u0435\u0440\u044b \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0443<\/strong>. \u0418\u0445 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441, \u043e\u0442\u0434\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u043b\u043e\u0439 <code>services<\/code>, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0443.<\/p>\n<h2>6. \u041a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u043d\u043e\u0432\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 (Background Tasks)?<\/h2>\n<p><strong>\u041e\u0442\u0432\u0435\u0442:<\/strong> \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u0435\u0439\u0441: \u044e\u0437\u0435\u0440 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u043c\u0443 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043f\u0438\u0441\u044c\u043c\u043e. \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 email \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043f\u0430\u0440\u0443 \u0441\u0435\u043a\u0443\u043d\u0434. \u0417\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u044e\u0437\u0435\u0440\u0430 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043b\u043e\u0430\u0434\u0435\u0440 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u2014 \u043f\u043b\u043e\u0445\u0430\u044f \u0438\u0434\u0435\u044f.<\/p>\n<p>\u0412 FastAPI \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <code>BackgroundTasks<\/code>. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <em>\u043f\u043e\u0441\u043b\u0435<\/em> \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0443\u0436\u0435 \u0443\u0448\u0435\u043b HTTP-\u043e\u0442\u0432\u0435\u0442.<\/p>\n<p><strong>\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u043a\u043e\u0434\u0435:<\/strong><\/p>\n<pre><code class=\"python\">from fastapi import BackgroundTasks, APIRouterrouter = APIRouter()def write_log(message: str):    with open(\"log.txt\", \"a\") as f:        f.write(message)@router.post(\"\/send-notification\/\")async def send_notification(email: str, background_tasks: BackgroundTasks):    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u0444\u043e\u043d    background_tasks.add_task(write_log, f\"\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u043d\u0430 {email}\")    return {\"message\": \"\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u043d\u0430 \u0444\u043e\u043d\u0435\"}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0412\u043e\u043f\u0440\u043e\u0441 \u0441\u043e \u0437\u0432\u0435\u0437\u0434\u043e\u0447\u043a\u043e\u0439:<\/strong> <em>\u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 <\/em><code><em>BackgroundTasks<\/em><\/code><em> \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438 \u043f\u043e\u0440\u0430 \u0442\u0430\u0449\u0438\u0442\u044c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 Celery \u0438\u043b\u0438 Taskiq?<\/em><\/p>\n<p><strong>\u041a\u0430\u043a \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c:<\/strong> \u0423 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0444\u043e\u043d\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f:<\/p>\n<ol>\n<li>\n<p><strong>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (Persistence):<\/strong> \u0417\u0430\u0434\u0430\u0447\u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0432\u043e\u0440\u043a\u0435\u0440\u0430. \u0415\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 (\u0438\u043b\u0438 pod \u0432 Kubernetes) \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f \u0438\u043b\u0438 \u043a\u0440\u0430\u0448\u043d\u0435\u0442\u0441\u044f \u2014 \u0432\u0441\u0435 \u043d\u0435\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 CPU:<\/strong> \u0415\u0441\u043b\u0438 \u0444\u043e\u043d\u043e\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u044f\u0436\u0435\u043b\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u0441\u0430\u0439\u0437 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0438\u043b\u0438 ML-\u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441), \u043e\u043d\u0430 \u0441\u043e\u0436\u0440\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b event loop\u2019\u0430 \u0438\u043b\u0438 threadpool\u2019\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0447\u043d\u0435\u0442 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435:<\/strong> \u041d\u0435\u043b\u044c\u0437\u044f \u0440\u0430\u0441\u043a\u0438\u0434\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 <code>BackgroundTasks<\/code> \u2014 \u044d\u0442\u043e \u0434\u043b\u044f \u043b\u0435\u0433\u043a\u0438\u0445 \u0438 \u043d\u0435\u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0445 I\/O \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 (\u043a\u0438\u043d\u0443\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043c\u0435\u0442\u0440\u0438\u043a\u0443, \u0431\u044b\u0441\u0442\u0440\u043e\u0435 \u043f\u0438\u0441\u044c\u043c\u043e). \u0414\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e (\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u044f\u0436\u0435\u043b\u044b\u0445 \u043e\u0442\u0447\u0435\u0442\u043e\u0432, \u043f\u0430\u0440\u0441\u0438\u043d\u0433, \u043d\u0430\u0434\u0435\u0436\u043d\u0430\u044f \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0430) \u0431\u0435\u0440\u0435\u043c \u0431\u0440\u043e\u043a\u0435\u0440\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (Redis\/RabbitMQ) + \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0435 \u0432\u043e\u0440\u043a\u0435\u0440\u044b \u0432\u0440\u043e\u0434\u0435 Celery, Taskiq \u0438\u043b\u0438 RQ.<\/p>\n<h2>7. \u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435?<\/h2>\n<p><strong>\u041e\u0442\u0432\u0435\u0442:<\/strong> \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0411\u0414 \u2014 \u044d\u0442\u043e \u0442\u043e \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u0443 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u0432 <code>async def<\/code> \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0435 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0431\u0430\u0437\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 <code>psycopg2<\/code> \u0438\u043b\u0438 \u0441\u0442\u0430\u0440\u0443\u044e \u0430\u043b\u0445\u0438\u043c\u0438\u044e), \u0442\u043e \u0432\u0435\u0441\u044c event loop \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u0431\u0430\u0437\u044b.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f FastAPI \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong>\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b<\/strong> (\u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e <code>asyncpg<\/code> \u0434\u043b\u044f PostgreSQL) \u0438 <strong>\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 ORM<\/strong>.<\/p>\n<p>\u0414\u0432\u0430 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0441\u0435\u0439\u0447\u0430\u0441:<\/p>\n<ol>\n<li>\n<p><strong>SQLAlchemy 2.0+<\/strong>: \u041d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u0437\u0430\u0432\u0435\u0437\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>AsyncEngine<\/code>, <code>AsyncSession<\/code> \u0438 \u043f\u0438\u0448\u0435\u043c <code>await session.execute(query)<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>Tortoise ORM<\/strong> \u0438\u043b\u0438 <strong>Piccolo<\/strong>: ORM, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u0438\u0441\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0434 <code>asyncio<\/code> (\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 Tortoise \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 Django ORM, \u0447\u0442\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434).<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438:<\/strong> <em>\u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044f\u043c\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445?<\/em><\/p>\n<p><strong>\u041a\u0430\u043a \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c:<\/strong> \u0421\u0435\u0441\u0441\u0438\u044e \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043d\u0430\u0447\u0430\u043b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 <em>\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e<\/em> \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435 (\u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u0442\u044c \u043f\u0443\u043b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439). \u0412 FastAPI \u044d\u0442\u043e \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 Dependency Injection (\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b).<\/p>\n<pre><code class=\"python\">from sqlalchemy.ext.asyncio import AsyncSession# \u041d\u0430\u0448\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440async def get_db_session() -&gt; AsyncSession:    async with async_session_maker() as session:        yield session # \u041e\u0442\u0434\u0430\u0435\u043c \u0441\u0435\u0441\u0441\u0438\u044e \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0443        # \u041a\u043e\u0434 \u043f\u043e\u0441\u043b\u0435 yield \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (\u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h2>8. Middleware \u0432 FastAPI \u2014 \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u044b \u0438 \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442?<\/h2>\n<p><strong>\u041e\u0442\u0432\u0435\u0442:<\/strong> Middleware (\u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u0435 \u041f\u041e) \u2014 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u043e\u0438\u0442 \u201c\u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0435\u201d \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u043d\u0430 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 <strong>\u043a\u0430\u0436\u0434\u044b\u0439<\/strong> \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441 <em>\u0434\u043e<\/em> \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u043d \u0434\u043e\u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0434\u043e \u0440\u043e\u0443\u0442\u0435\u0440\u0430\/\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430, \u0438 <strong>\u043a\u0430\u0436\u0434\u044b\u0439<\/strong> \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043e\u0442\u0432\u0435\u0442 <em>\u043f\u0435\u0440\u0435\u0434<\/em> \u0442\u0435\u043c, \u043a\u0430\u043a \u043e\u043d \u0443\u043b\u0435\u0442\u0438\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0443.<\/p>\n<p><strong>\u0417\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e (\u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u0435\u0439\u0441\u044b):<\/strong><\/p>\n<ol>\n<li>\n<p><strong>CORS (Cross-Origin Resource Sharing):<\/strong> \u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 <code>CORSMiddleware<\/code> \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0432\u0430\u0448 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434 \u043d\u0430 React\/Vue \u043c\u043e\u0433 \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a API \u0441 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430. \u0411\u0435\u0437 \u043d\u0435\u0433\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>\u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435:<\/strong> \u041c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e middleware, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c IP \u043a\u043b\u0438\u0435\u043d\u0442\u0430, URL \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u043c\u0435\u0440 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (Time process):<\/strong> \u041f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u2014 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c middleware, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0447\u0438\u0442\u0430\u0435\u0442, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441, \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u0442\u0432\u0435\u0442\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>X-Process-Time<\/code>).<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u041f\u0440\u0438\u043c\u0435\u0440 (\u0438\u0437\u043c\u0435\u0440\u044f\u0435\u043c \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430):<\/strong><\/p>\n<pre><code class=\"python\">import timefrom fastapi import Request@app.middleware(\"http\")async def add_process_time_header(request: Request, call_next):    start_time = time.time()        # \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u0430\u043b\u044c\u0448\u0435 (\u0432 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442)    response = await call_next(request)         # \u0417\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f, \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442    process_time = time.time() - start_time    response.headers[\"X-Process-Time\"] = str(process_time)        return response<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h2>9. \u041a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a?<\/h2>\n<p><strong>\u041e\u0442\u0432\u0435\u0442:<\/strong> \u0412 \u0431\u0430\u0437\u043e\u0432\u043e\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u0435\u0441\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d), \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435: <code>raise HTTPException(status_code=404, detail=\"User not found\")<\/code>. FastAPI \u0441\u0430\u043c \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442 \u044d\u0442\u043e \u0432 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0439 JSON.<\/p>\n<p>\u041d\u043e \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043b\u043e. \u0427\u0430\u0441\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0411\u0414 \u0438\u043b\u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0443 \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0438\u0445 \u043f\u0430\u0440\u0441\u0438\u0442\u044c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 <code><strong>@app.exception_handler()<\/strong><\/code>. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p><strong>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/strong> \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0448\u0438\u0431\u043e\u043a \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 Pydantic. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e FastAPI \u043f\u0440\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 <code>422 Unprocessable Entity<\/code> \u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 <code>detail<\/code>. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u0431\u043e\u043b\u0435\u0435 \u043f\u043b\u043e\u0441\u043a\u043e\u043c \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0432\u0438\u0434\u0435:<\/p>\n<pre><code class=\"python\">from fastapi import FastAPI, Requestfrom fastapi.exceptions import RequestValidationErrorfrom fastapi.responses import JSONResponseapp = FastAPI()@app.exception_handler(RequestValidationError)async def validation_exception_handler(request: Request, exc: RequestValidationError):    # \u0414\u043e\u0441\u0442\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0443\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438, \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0435\u0439 \u043c\u0435\u0442\u044b Pydantic    errors = [{\"field\": err[\"loc\"][-1], \"message\": err[\"msg\"]} for err in exc.errors()]    return JSONResponse(        status_code=422,        content={\"detail\": \"\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\", \"errors\": errors},    )<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h2>10. \u041a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c FastAPI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f?<\/h2>\n<p><strong>\u041e\u0442\u0432\u0435\u0442:<\/strong> \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c FastAPI \u2014 \u043e\u0434\u043d\u043e \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435, \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0441 \u043e\u0433\u043b\u044f\u0434\u043a\u043e\u0439 \u043d\u0430 \u044d\u0442\u043e. \u0417\u043e\u043b\u043e\u0442\u043e\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442: \u0441\u0432\u044f\u0437\u043a\u0430 <code><strong>pytest<\/strong><\/code> \u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e <code><strong>TestClient<\/strong><\/code> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0436\u0438\u0432\u0435\u0442 \u0432 <code>fastapi.testclient<\/code> \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0432\u0435\u0440\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <code>httpx<\/code>).<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0444\u0438\u0448\u043a\u0430 <code>TestClient<\/code> \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c <em>\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435<\/em> \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f <em>\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445<\/em> \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432. \u041a\u043b\u0438\u0435\u043d\u0442 \u0441\u0430\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 event loop\u2019\u043e\u043c \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u0435\u0437\u0434\u0435 \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c <code>await<\/code>.<\/p>\n<p><strong>\u041d\u044e\u0430\u043d\u0441\u044b \u0438\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 (\u0433\u0434\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0437\u044b):<\/strong> \u041d\u0430\u043f\u0438\u0441\u0430\u0442\u044c <code>client.get(\"\/users\")<\/code> \u043b\u0435\u0433\u043a\u043e. \u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043a API \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0435\u043d\u0430 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0442 \u0432\u0430\u0441 \u0445\u043e\u0442\u044f\u0442 \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c:<\/p>\n<ol>\n<li>\n<p><strong>\u0418\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0411\u0414:<\/strong> \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e \u0431\u0430\u0437\u0443 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 Docker \u0447\u0435\u0440\u0435\u0437 <code>testcontainers<\/code> \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c in-memory SQLite, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432).<\/p>\n<\/li>\n<li>\n<p><strong>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u044b:<\/strong> \u0412 <code>pytest<\/code> \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 (Alembic), \u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u2014 \u043e\u0447\u0438\u0449\u0430\u0435\u0442 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u0434\u043c\u0435\u043d\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439:<\/strong> \u0422\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 <code>app.dependency_overrides<\/code>. \u041c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c FastAPI, \u0447\u0442\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0411\u0414 <code>get_db_session<\/code> \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0443\u043d\u0443\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0434\u0430\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u044e \u043e\u0442 <em>\u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439<\/em> \u0431\u0430\u0437\u044b.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"python\"># \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432from fastapi.testclient import TestClientfrom myapp.main import appfrom myapp.dependencies import get_db_sessiondef override_get_db_session():    # ... \u043b\u043e\u0433\u0438\u043a\u0430 \u0432\u044b\u0434\u0430\u0447\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 ...    passapp.dependency_overrides[get_db_session] = override_get_db_sessionclient = TestClient(app)def test_read_main():    response = client.get(\"\/\")    assert response.status_code == 200<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h4>\n<p>FastAPI \u043e\u0431\u043c\u0430\u043d\u0447\u0438\u0432\u043e \u043f\u0440\u043e\u0441\u0442 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435: \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u00abHello World\u00bb \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u0432 \u0442\u0440\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u043e\u0434\u0430. \u041d\u043e \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u043a\u0430\u043a \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043a\u0440\u0435\u043f\u043a\u043e\u0433\u043e \u0437\u043d\u0430\u043d\u0438\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438 Python, \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u0447\u0442\u043e\u0431\u044b \u0432\u0430\u0448 \u043c\u043e\u043d\u043e\u043b\u0438\u0442 \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u0441\u044f \u0432 \u0441\u043f\u0430\u0433\u0435\u0442\u0442\u0438-\u043a\u043e\u0434.<\/p>\n<p><em>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/em><\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/fastapi.tiangolo.com\/\" rel=\"noopener noreferrer nofollow\">\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f FastAPI<\/a> (\u043e\u0434\u043d\u0430 \u0438\u0437 \u043b\u0443\u0447\u0448\u0438\u0445 \u0434\u043e\u043a \u0432 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u0435, \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e).<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/www.google.com\/search?q=https:\/\/docs.pydantic.dev\/\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f Pydantic<\/a> (\u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e V2, \u0442\u0430\u043c \u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439).<\/p>\n<\/li>\n<\/ul>\n<p>\u0410\u043d\u043e\u043d\u0441\u044b \u043d\u043e\u0432\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439, \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u0430\u00a0\u0442\u0430\u043a\u00a0\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0443\u00a0\u0432\u0430\u0441 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043e\u0431\u0441\u0443\u0434\u0438\u0442\u044c \u0438\u0445 \u0438\u043b\u0438\u00a0\u0437\u0430\u0434\u0430\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u043e\u00a0\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/t.me\/+NlTdqmVuBkIzMDBi\" rel=\"noopener noreferrer nofollow\">\u0432 \u043c\u043e\u0451\u043c Telegram\u2011\u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435<\/a>. \u0421\u043c\u0435\u043b\u043e \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u0435, \u0435\u0441\u043b\u0438 \u0447\u0442\u043e\u2011\u0442\u043e \u043f\u043e\u0439\u0434\u0435\u0442 \u043d\u0435\u00a0\u0442\u0430\u043a,\u00a0\u2014 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1044300\/\">https:\/\/habr.com\/ru\/articles\/1044300\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!FastAPI \u0441\u0435\u0439\u0447\u0430\u0441 \u2014 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 \u0434\u0435-\u0444\u0430\u043a\u0442\u043e \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 Python. Flask \u0441\u0434\u0430\u0451\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c \u043a \u043d\u0435\u043c\u0443 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u0438 Swagger \u0440\u0443\u043a\u0430\u043c\u0438 \u0432\u0441\u0435\u043c \u0434\u0430\u0432\u043d\u043e \u043d\u0430\u0434\u043e\u0435\u043b\u043e. Django \u0432\u0441\u0451 \u0435\u0449\u0451 \u043a\u0440\u0443\u0442, \u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 API \u043e\u043d \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u0439. \u0412 \u0438\u0442\u043e\u0433\u0435 FastAPI \u2014 \u0432\u0435\u0437\u0434\u0435.\u0420\u0430\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0442\u0430\u043a \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u0435\u043d, \u0442\u043e \u0438 \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442 \u043f\u0440\u043e \u043d\u0435\u0433\u043e \u0432\u0441\u0451 \u0447\u0430\u0449\u0435. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432 \u0440\u0435\u0437\u044e\u043c\u0435 \u0437\u0430\u044f\u0432\u043b\u0435\u043d FastAPI, \u0432\u0430\u0441 \u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0443\u0442 \u0433\u043e\u043d\u044f\u0442\u044c \u043f\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 Pydantic.\u042f \u0441\u043e\u0431\u0440\u0430\u043b 10 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0434\u0430\u044e\u0442 \u043d\u0430 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0443\u0440\u043e\u0432\u043d\u044f Junior+ \u0438 Middle.\u0421\u0440\u0430\u0437\u0443 \u043e \u0433\u043b\u0430\u0432\u043d\u043e\u043c: \u0437\u0430\u0437\u0443\u0431\u0440\u0438\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043d\u0438\u0436\u0435 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e. \u041d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0436\u0435 \u0443\u0442\u043e\u0447\u043d\u044f\u044e\u0449\u0435\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u0435 \u043f\u043e\u0439\u043c\u0435\u0442, \u0433\u0434\u0435 \u0432\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0435\u0441\u044c \u0432 \u0442\u0435\u043c\u0435, \u0430 \u0433\u0434\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0443\u0447\u0438\u043b\u0438 \u043e\u0442\u0432\u0435\u0442. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043a\u0430\u043a \u0447\u0435\u043a-\u043b\u0438\u0441\u0442: \u043f\u0440\u043e\u0431\u0435\u0433\u0438\u0442\u0435\u0441\u044c \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443, \u043d\u0430\u0439\u0434\u0438\u0442\u0435 \u043f\u0440\u043e\u0431\u0435\u043b\u044b \u0432 \u0437\u043d\u0430\u043d\u0438\u044f\u0445 \u0438 \u043f\u043e\u0439\u0434\u0438\u0442\u0435 \u043f\u043e\u0442\u044b\u043a\u0430\u0439\u0442\u0435 \u043a\u043e\u0434 \u0440\u0443\u043a\u0430\u043c\u0438. \u0410 \u0435\u0441\u043b\u0438 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u043e\u0439\u043c\u0435\u0442\u0435, \u0447\u0442\u043e \u0431\u0430\u0437\u0430 \u043f\u043e\u043a\u0430 \u0445\u0440\u043e\u043c\u0430\u0435\u0442 \u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u0441\u0451 \u0432 \u0447\u0435\u0442\u043a\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0437\u0430\u043b\u0435\u0442\u0430\u0439\u0442\u0435 \u043d\u0430 \u043c\u043e\u0439 \u043a\u0443\u0440\u0441 \u00abFastAPI \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445\u00bb \u043d\u0430 Stepik \u2014 \u0442\u0430\u043c \u043c\u044b \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u043b\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043e\u0442 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435.1. \u0412 \u0447\u0435\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 FastAPI \u043f\u0435\u0440\u0435\u0434 Flask \u0438 Django?\u041e\u0442\u0432\u0435\u0442: \u0417\u0434\u0435\u0441\u044c \u043e\u0442 \u0432\u0430\u0441 \u0436\u0434\u0443\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0444\u0438\u0447\u0435\u0439 \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u043a\u0430\u043a\u0443\u044e \u0438\u043c\u0435\u043d\u043d\u043e \u0431\u043e\u043b\u044c \u0440\u0435\u0448\u0430\u0435\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a.\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c: \u041f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 Starlette, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 FastAPI \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 asyncio. \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 NodeJS \u0438 Go.\u041c\u043e\u0449\u043d\u0430\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f: \u0417\u0430 \u043d\u0435\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 Pydantic. \u0412\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0448\u0435\u0442\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 Python, \u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0441\u0430\u043c \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e, \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e JSON. \u041c\u0435\u043d\u044c\u0448\u0435 \u0431\u043e\u0439\u043b\u0435\u0440\u043f\u043b\u0435\u0439\u0442\u0430.\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f: OpenAPI (Swagger \u0438 ReDoc) \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043b\u0435\u0442\u0443. \u0412 \u0442\u043e\u043c \u0436\u0435 Flask \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0443\u0447\u0443 \u0434\u043e\u043a\u0441\u0442\u0440\u0438\u043d\u0433\u043e\u0432.\u0412\u043e\u043f\u0440\u043e\u0441 \u0441\u043e \u0437\u0432\u0435\u0437\u0434\u043e\u0447\u043a\u043e\u0439: \u0412 \u043a\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b \u0431\u044b \u041d\u0415 \u0441\u0442\u0430\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c FastAPI, \u0430 \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u0431\u044b Django?\u041a\u0430\u043a \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c: FastAPI \u2014 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f API. \u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u043e\u0432\u043e\u0441\u0442\u043d\u043e\u0439 \u043f\u043e\u0440\u0442\u0430\u043b \u0438\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d), \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u043f\u0430\u043d\u0435\u043b\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u043d\u0435\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u044f\u043c\u0438 \u0438 \u0442\u0435\u0441\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u043a\u0430 \u0441 \u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0411\u0414 \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb, \u043b\u0443\u0447\u0448\u0435 \u0432\u0437\u044f\u0442\u044c Django. \u0415\u0433\u043e \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u044f \u00ab\u0431\u0430\u0442\u0430\u0440\u0435\u0439\u043a\u0438 \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435\u00bb \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043d\u0435\u0434\u0435\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.2. \u041a\u0430\u043a \u0432 FastAPI \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c? \u0412 \u0447\u0435\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 def \u0438 async def?\u041e\u0442\u0432\u0435\u0442: \u042d\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439, \u043d\u043e \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u0432\u0430\u0440\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0447\u0430\u0441\u0442\u043e \u0441\u044b\u043f\u044f\u0442\u0441\u044f \u0434\u0436\u0443\u043d\u044b.\u0415\u0441\u043b\u0438 \u0432\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0435 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u043a\u0430\u043a async def, \u043a\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0432 event loop. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u044b (await).\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 def, FastAPI \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u201c\u043f\u043e\u0432\u0435\u0441\u0438\u0442\u044c\u201d \u0441\u0435\u0440\u0432\u0435\u0440, \u043e\u043d \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u043f\u0443\u043b\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (threadpool).\u0427\u0430\u0441\u0442\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 (\u0447\u0442\u043e \u043b\u044e\u0431\u044f\u0442 \u0443\u0442\u043e\u0447\u043d\u044f\u0442\u044c \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u0445): \u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 async def \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 requests.get() \u0438\u043b\u0438 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e ORM?\u041a\u0430\u043a \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c: \u0412\u044b \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0435 event loop. \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0438 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u0436\u0434\u0430\u0442\u044c, \u043f\u043e\u043a\u0430 \u0432\u0430\u0448 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f. \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u043f\u0430\u0434\u0435\u0442 \u0434\u043e \u043d\u0443\u043b\u044f.\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (\u043e\u0431\u044b\u0447\u043d\u044b\u0439 requests, psycopg2 \u0431\u0435\u0437 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u0438) \u2014 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0439\u0442\u0435 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442 \u0447\u0435\u0440\u0435\u0437 def. \u0425\u043e\u0442\u0438\u0442\u0435 \u043f\u0438\u0441\u0430\u0442\u044c async def \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438 (httpx, asyncpg, SQLAlchemy 2.0+).3. \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Pydantic \u0438 \u043a\u0430\u043a\u0443\u044e \u0440\u043e\u043b\u044c \u043e\u043d \u0438\u0433\u0440\u0430\u0435\u0442 \u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435?\u041e\u0442\u0432\u0435\u0442: \u042d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 Python.\u041a\u043e\u0433\u0434\u0430 \u043a\u043b\u0438\u0435\u043d\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 JSON-\u0437\u0430\u043f\u0440\u043e\u0441, Pydantic \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443:\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u043b\u0438 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u0448\u043b\u0438.\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0442\u0440\u043e\u043a\u0443 &#171;1&#187; \u0432 \u0447\u0438\u0441\u043b\u043e 1, \u0435\u0441\u043b\u0438 \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d int).\u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u043e\u043a, \u043e\u0442\u0434\u0430\u0435\u0442 \u0432\u0430\u043c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 Python-\u043e\u0431\u044a\u0435\u043a\u0442, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432 IDE.\u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0430, \u0441\u0430\u043c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u043c 422 Unprocessable Entity, \u0433\u0434\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u043e, \u0432 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u043b\u0435 \u043a\u043e\u0441\u044f\u043a.\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438: \u0427\u0430\u0441\u0442\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u043c\u043b\u0430\u0434\u0448\u0435 18). \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440 @field_validator:from pydantic import BaseModel, field_validatorclass UserCreate(BaseModel):    username: str    age: int    @field_validator(&#8216;age&#8217;)    @classmethod    def check_age(cls, value: int):        if value &lt; 18:            raise ValueError(&#8216;\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 18 \u043b\u0435\u0442&#8217;)        return value4. \u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 Dependency Injection (DI) \u0432 FastAPI?\u041e\u0442\u0432\u0435\u0442: \u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 (DI) \u2014 \u044d\u0442\u043e \u043a\u0438\u043b\u043b\u0435\u0440-\u0444\u0438\u0447\u0430 FastAPI, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0447\u0435\u0440\u0435\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u044e Depends(). \u0421\u0443\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0430: \u0435\u0441\u043b\u0438 \u0432\u0430\u0448\u0435\u043c\u0443 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0443 \u0447\u0442\u043e-\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b (\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0411\u0414, \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u044e\u0437\u0435\u0440\u0430, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438), \u0432\u044b \u043d\u0435 \u043f\u0438\u0448\u0435\u0442\u0435 \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u044f\u043c\u043e \u0432 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0435. \u0412\u044b \u0432\u044b\u043d\u043e\u0441\u0438\u0442\u0435 \u0435\u0451 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c.\u041f\u0440\u0438\u043c\u0435\u0440: \u0444\u0443\u043d\u043a\u0446\u0438\u044f get_db_session(). \u0412\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u0435\u0451 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 \u043a\u0430\u043a session = Depends(get_db_session). FastAPI \u0441\u0430\u043c \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u0435\u0441\u0441\u0438\u044e \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0441\u0442 \u0435\u0451 \u0432\u0430\u043c. \u042d\u0442\u043e \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0447\u0438\u0441\u0442\u044b\u043c\u0438.\u0412\u043e\u043f\u0440\u043e\u0441 \u0441\u043e \u0437\u0432\u0435\u0437\u0434\u043e\u0447\u043a\u043e\u0439: \u041a\u0430\u043a \u043c\u043e\u043a\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (override dependencies) \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432?\u041a\u0430\u043a \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c: \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c app.dependency_overrides. \u042d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412 \u0442\u0435\u0441\u0442\u0430\u0445 \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0431\u043e\u0435\u0432\u043e\u0439 \u0411\u0414 \u0438\u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0442\u043e\u043a\u0435\u043d\u0430 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435) \u0438 \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0435\u043c \u0435\u0451 \u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0443.\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0442\u0430\u043a:app.dependency_overrides[get_db_session] = override_get_db_session\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0441\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f, \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c, \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043d\u043e\u0432\u0430 \u043d\u0430\u0447\u043d\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438. \u0418\u0434\u0435\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u044e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u043e\u0432.5. \u041a\u0430\u043a \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u0440\u0443\u043f\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 FastAPI?\u041e\u0442\u0432\u0435\u0442: \u0413\u043b\u0430\u0432\u043d\u0430\u044f \u043b\u043e\u0432\u0443\u0448\u043a\u0430 FastAPI (\u043a\u0430\u043a \u0438 Flask) \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u043d\u0435 \u0434\u0438\u043a\u0442\u0443\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0441\u0442\u0440\u043e\u0433\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 Django. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0436\u0443\u043d\u044b \u0447\u0430\u0441\u0442\u043e \u043f\u0438\u0448\u0443\u0442 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u044b\u0439 main.py \u043d\u0430 \u043f\u0430\u0440\u0443 \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a. \u041d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u0445\u043e\u0442\u044f\u0442 \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u044b \u0443\u043c\u0435\u0435\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043b\u043e\u0438.\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u2014 APIRouter. \u041e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043c\u0438\u043d\u0438-\u0432\u0435\u0440\u0441\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f FastAPI, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u043c\u043e\u043d\u043e\u043b\u0438\u0442 \u043d\u0430 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e users, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e orders).\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438: \u0425\u043e\u0440\u043e\u0448\u0438\u043c \u0442\u043e\u043d\u043e\u043c \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u043d\u0430 \u0441\u043b\u043e\u0438. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:src\/\u251c\u2500\u2500 main.py             # \u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f FastAPI\u251c\u2500\u2500 api\/                # \u042d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u044b (\u0440\u043e\u0443\u0442\u0435\u0440\u044b)\u2502   \u251c\u2500\u2500 dependencies.py # \u041e\u0431\u0449\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, get_db)\u2502   \u2514\u2500\u2500 v1\/             # \u0412\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 API\u2502       \u251c\u2500\u2500 users.py    # router.get(&#171;\/users&#187;)\u2502       \u2514\u2500\u2500 items.py\u251c\u2500\u2500 core\/               # \u041a\u043e\u043d\u0444\u0438\u0433\u0438 (pydantic-settings), \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c (JWT)\u251c\u2500\u2500 db\/                 # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0411\u0414, \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 (Alembic)\u251c\u2500\u2500 models\/             # ORM-\u043c\u043e\u0434\u0435\u043b\u0438 (SQLAlchemy)\u251c\u2500\u2500 schemas\/            # Pydantic-\u0441\u0445\u0435\u043c\u044b (DTO) \u0434\u043b\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u0432\u0432\u043e\u0434\u0430\/\u0432\u044b\u0432\u043e\u0434\u0430\u2514\u2500\u2500 services\/           # \u0411\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 (\u0438\u043b\u0438 crud\/), \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0435\u0451 \u0432 \u0440\u043e\u0443\u0442\u0435\u0440\u0430\u0445\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0437\u0432\u0443\u0447\u0438\u0442\u044c: \u0440\u043e\u0443\u0442\u0435\u0440\u044b \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0443. \u0418\u0445 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441, \u043e\u0442\u0434\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u043b\u043e\u0439 services, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0443.6. \u041a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u043d\u043e\u0432\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 (Background Tasks)?\u041e\u0442\u0432\u0435\u0442: \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u0435\u0439\u0441: \u044e\u0437\u0435\u0440 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u043c\u0443 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043f\u0438\u0441\u044c\u043c\u043e. \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 email \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043f\u0430\u0440\u0443 \u0441\u0435\u043a\u0443\u043d\u0434. \u0417\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u044e\u0437\u0435\u0440\u0430 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043b\u043e\u0430\u0434\u0435\u0440 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u2014 \u043f\u043b\u043e\u0445\u0430\u044f \u0438\u0434\u0435\u044f.\u0412 FastAPI \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 BackgroundTasks. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043a\u043b\u0438\u0435\u043d\u0442\u0443 \u0443\u0436\u0435 \u0443\u0448\u0435\u043b HTTP-\u043e\u0442\u0432\u0435\u0442.\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u043a\u043e\u0434\u0435:from fastapi import BackgroundTasks, APIRouterrouter = APIRouter()def write_log(message: str):    with open(&#171;log.txt&#187;, &#171;a&#187;) as f:        f.write(message)@router.post(&#171;\/send-notification\/&#187;)async def send_notification(email: str, background_tasks: BackgroundTasks):    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u0444\u043e\u043d    background_tasks.add_task(write_log, f&#187;\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u043d\u0430 {email}&#187;)    return {&#171;message&#187;: &#171;\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u043d\u0430 \u0444\u043e\u043d\u0435&#187;}\u0412\u043e\u043f\u0440\u043e\u0441 \u0441\u043e \u0437\u0432\u0435\u0437\u0434\u043e\u0447\u043a\u043e\u0439: \u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 BackgroundTasks \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438 \u043f\u043e\u0440\u0430 \u0442\u0430\u0449\u0438\u0442\u044c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 Celery \u0438\u043b\u0438 Taskiq?\u041a\u0430\u043a \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c: \u0423 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0444\u043e\u043d\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f:\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (Persistence): \u0417\u0430\u0434\u0430\u0447\u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0432\u043e\u0440\u043a\u0435\u0440\u0430. \u0415\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 (\u0438\u043b\u0438 pod \u0432 Kubernetes) \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f \u0438\u043b\u0438 \u043a\u0440\u0430\u0448\u043d\u0435\u0442\u0441\u044f \u2014 \u0432\u0441\u0435 \u043d\u0435\u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430.\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 CPU: \u0415\u0441\u043b\u0438 \u0444\u043e\u043d\u043e\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u044f\u0436\u0435\u043b\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u0441\u0430\u0439\u0437 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0438\u043b\u0438 ML-\u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441), \u043e\u043d\u0430 \u0441\u043e\u0436\u0440\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b event loop\u2019\u0430 \u0438\u043b\u0438 threadpool\u2019\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0447\u043d\u0435\u0442 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442\u044c.\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: \u041d\u0435\u043b\u044c\u0437\u044f \u0440\u0430\u0441\u043a\u0438\u0434\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.\u041f\u043e\u044d\u0442\u043e\u043c\u0443 BackgroundTasks \u2014 \u044d\u0442\u043e \u0434\u043b\u044f \u043b\u0435\u0433\u043a\u0438\u0445 \u0438 \u043d\u0435\u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0445 I\/O \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 (\u043a\u0438\u043d\u0443\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043c\u0435\u0442\u0440\u0438\u043a\u0443, \u0431\u044b\u0441\u0442\u0440\u043e\u0435 \u043f\u0438\u0441\u044c\u043c\u043e). \u0414\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e (\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u044f\u0436\u0435\u043b\u044b\u0445 \u043e\u0442\u0447\u0435\u0442\u043e\u0432, \u043f\u0430\u0440\u0441\u0438\u043d\u0433, \u043d\u0430\u0434\u0435\u0436\u043d\u0430\u044f \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0430) \u0431\u0435\u0440\u0435\u043c \u0431\u0440\u043e\u043a\u0435\u0440\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (Redis\/RabbitMQ) + \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0435 \u0432\u043e\u0440\u043a\u0435\u0440\u044b \u0432\u0440\u043e\u0434\u0435 Celery, Taskiq \u0438\u043b\u0438 RQ.7. \u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435?\u041e\u0442\u0432\u0435\u0442: \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0411\u0414 \u2014 \u044d\u0442\u043e \u0442\u043e \u043c\u0435\u0441\u0442\u043e, \u0433\u0434\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u0443 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u0432 async def \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0435 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u0431\u0430\u0437\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 psycopg2 \u0438\u043b\u0438 \u0441\u0442\u0430\u0440\u0443\u044e \u0430\u043b\u0445\u0438\u043c\u0438\u044e), \u0442\u043e \u0432\u0435\u0441\u044c event loop \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u0431\u0430\u0437\u044b.\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f FastAPI \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u044b (\u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e asyncpg \u0434\u043b\u044f PostgreSQL) \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 ORM.\u0414\u0432\u0430 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0441\u0435\u0439\u0447\u0430\u0441:SQLAlchemy 2.0+: \u041d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u0437\u0430\u0432\u0435\u0437\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c AsyncEngine, AsyncSession \u0438 \u043f\u0438\u0448\u0435\u043c await session.execute(query).Tortoise ORM \u0438\u043b\u0438 Piccolo: ORM, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u0438\u0441\u0430\u043b\u0438\u0441\u044c \u043f\u043e\u0434 asyncio (\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 Tortoise \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 Django ORM, \u0447\u0442\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434).\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438: \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044f\u043c\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445?\u041a\u0430\u043a \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c: \u0421\u0435\u0441\u0441\u0438\u044e \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043d\u0430\u0447\u0430\u043b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435 (\u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u0442\u044c \u043f\u0443\u043b \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439). \u0412 FastAPI \u044d\u0442\u043e \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u0443&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-482601","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/482601","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=482601"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/482601\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=482601"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=482601"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=482601"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}