29 KiB
{!../../docs/missing-translation.md!}
FastAPI
FastAPI фреймворк, өндөр гүйцэтгэлтэй, сурахад хялбар, хурдан кодлох боломжтой, ашиглалтанд оруулахад бэлэн
Документ: https://fastapi.tiangolo.com
Эх код: https://github.com/fastapi/fastapi
FastAPI нь Python type hint стандартад суурилсан, API хөгжүүлэх зориулалттай, орчин үеийн, хурдан (өндөр гүйцэтгэлтэй) вэб фреймворк юм. { .annotate }
тайп хинт
- Тохиромжтой Монгол орчуулга байгаагүй тул Англи галигаар нь үлдээв.
Гол онцлогууд нь:
- Хурд: NodeJS болон Go-тэй адил түвшний маш хурдан гүйцэтгэлтэй (Starlette ба Pydantic-ийн ачаар). Хамгийн хурдан Python фреймворкийн нэг.
- Кодлоход хурдан: Ямар нэгэн шинэ зүйл хөгжүүлэх хурдыг 200-гаас 300% нэмэгдүүлнэ. *
- Алдааг багасгана: Хүнээс үүдэлтэй (инженерээс) алдааг 40% орчим бууруулна. *
- Ойлгомжтой: Код эдитэрийн дэмжлэг сайтай. Код эдитэрийн зөвлөгөө маш их тул алдааг засахад зарцуулах хугацаа бага.
- Хялбар: Сурч, хэрэглэхэд амархан. Документ уншаад байх шаардлага багатай.
- Богинохон: Код давталт багатай. Ганц параметр зарлахад л бараг хангалттай. Bug багатай.
- Бат бөх: Интерактив документтэй, борлуулалтанд бэлэн код хөгжүүлэхэд нэн тохиромжтой.
- Стандартанд нийцсэн: API-ийн стандартанд нийцсэн, бас түүн дээр суурилсан: OpenAPI (Өмнө нь Swagger гэж нэрлэгддэг байсан), JSON Schema.
* Борлуулалтанд зориулагдсан програмууд хөгжүүлэх явцад хийгдсэн туршилтуудад үндэслэв.
Спонсор
{% if sponsors %} {% for sponsor in sponsors.gold -%} {% endfor -%} {%- for sponsor in sponsors.silver -%} {% endfor %} {% endif %}
Коммент
"[...] FastAPI-г сүүлийн үед маш их ашиглаж байна. [...] Энэ чигээрээ Microsoft-ийн багийнхаа бүх ML-д, зарим нь Windows-ийн үндсэн бүтээгдэхүүн, зарим нь Office-ийн бүтээгдэхүүнүүдэд FastAPI-ийг ашиглахаар төлөвлөж байна."
"Бид FastAPI-г ашиглан REST серверийг хөгжүүлж, түүгээр дамжуулан прогноз/таавар авч байна. [Ludwig]"
"Netflix нь эрсдэлийн менежмент фремворк буюу Dispatch-ийг нээлттэй эх сурвалжтайгаар гаргаснаа зарлаж байгаадаа баяртай байна! [FastAPI-ээр бүтээсэн]"
"Би FastAPI-д маш их сэтгэл хангалуун, баяртай байна!"
"Яг үнэнийг хэлэхэд та бүхний бүтээсэн зүйл маш бат бөх, төгс харагдаж байна. Hug-г яг ийм байгаасай гэж төсөөлж байсан. Хэн нэгэн нь үүнийг бүтээж байгааг харахад урам орж байна."
"Хэрэв та REST API-г хөгжүүлэхэд зориулагдсан орчин үеийн фремворк-г сурахыг хүсэж байгаа бол, FastAPI-г шалгаарай [...] Хурдан, хэрэглэхэд хялбар, сурахад амар [...]"
"Бид API-аа FastAPI-гаар хийхээр болсон. [...] Та бүхэн ч бас тэгнэ гэж найдаж байна. [...]"
"Хэрэв хэн нэгэн нь борлуулалтанд бэлэн Python API хөгжүүлэхийг хүсч байвал, би FastAPI-г 100% санал болгоно. FastAPI нь төгс бүтээгдсэн, хэрэглэхэд хялбар бөгөөд томсгох, жижигсгэхэд түүртээд байхгүй. Манай API-н хөгжүүлэлтийн стратегийн түлхүүр бүрэлдэхүүн болж, олон автоматаци болон үйлчилгээнд, тухайлбал манай Virtual TAC Engineer-д ашиглагдаж байна."
Typer, CLI дахь FastAPI
Хэрэв та веб интерфейс биш, CLI интерфейс апп хөгжүүлж байвал Typer-ийг шалгаарай!.
Typer нь FastAPI-ийн төрсөн дүү нь юм. CLI дахь FastAPI байхад зориулагдсан. ⌨️ 🚀
Өмнөтгөл
FastAPI-ийн үндсэн тулгуур:
FastAPI-г суулгах
Виртуал орчинг үүсгэн идэвхижүүлээд FastAPI-г суулгана:
$ pip install "fastapi[standard]"
---> 100%
Тэмдэглэл: Бүх терминал дээр асуудалгүй ажиллуулахын тулд "fastapi[standard]"
-ийг хашилтад хийж бичихээ мартуузай.
Жишээ
Файл үүсгэцгээе
- Доорх код-оор
main.py
файлийг үүсгэнэ үү:
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Сайн уу?": "Эх дэлхий минь!"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
Эсвэл async def
-ийг...
Хэрэв код тань async
/ await
-ийг ашигладаг бол, async def
ийг ашиглана уу:
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"Сайн уу?": "Эх дэлхий минь!"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
Тэмдэглэл:
Хэрэв та мэдэхгүй, эргэлзээд байвал, "Яаралтай хэрэгтэй байна уу?" хэсгийг шалгана уу. async
ба await
-ийн тухай.
Хэрэгжүүлцгээе
Доорх коммандаар серверээ асаана уу:
$ fastapi dev main.py
╭────────── FastAPI CLI - Development mode ───────────╮
│ │
│ Serving at: http://127.0.0.1:8000 │
│ │
│ API docs: http://127.0.0.1:8000/docs │
│ │
│ Running in development mode, for production use: │
│ │
│ fastapi run │
│ │
╰─────────────────────────────────────────────────────╯
INFO: Will watch for changes in these directories: ['/home/user/code/awesomeapp']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [2248755] using WatchFiles
INFO: Started server process [2248757]
INFO: Waiting for application startup.
INFO: Application startup complete.
fastapi dev main.py
коммандын тухай...
fastapi dev
комманд нь main.py
файлыг уншснаар доторх FastAPI-г олон, Uvicorn-ийг ашиглан серверийг асаана.
fastapi dev
комманд нь нэмэлт тохиргоогүйгээр, локал хөгжүүлэлтийн үе дэх кодны өөрчлөлтийг автоматаар мэдэрч ре-старт хийнэ..
Энэ талаар дэлгэрэнгүйг FastAPI CLI документ-ээс уншина уу.
Шалгацгаая
Энэ линк-ээр http://127.0.0.1:8000/items/5?q=somequery браузер-аа нээнэ үү.
Доорхтой адил JSON хариу харагдах болно:
{"item_id": 5, "q": "somequery"}
Ингэснээр та аль хэдийн доорх API-г үүсгэсэн:
- HTTP хүсэлтийг
/
ба/items/{item_id}
хаяг дээр хүлээн авдаг API. - 2 хаяг хоёулаа
GET
гэсэн үйл ажиллагаа (HTTP протоколынGET
арга)-тай API. /items/{item_id}
хаяг ньitem_id
гэж нэрлэгдсэн,int
тайптай, зайлшгүй хэрэгтэй хаягийн параметртэй API.- Мөн
/items/{item_id}
хаяг ньq
гэж нэрлэгдсэн,str
тайптай, зайлшгүй бус хайлтын параметртай API.
Интерактив API документ
http://127.0.0.1:8000/docs-г нээснээр та:
Swagger UI-аар бүтээгдсэн, aвтомат интерактив API документ-ийг харах болно:
Хоёр дахь интерактив документ
Мөн http://127.0.0.1:8000/redoc-г нээснээр:
ReDoc-ooр бүтээгдсэн, xоёр дахь автомат документ-ийг олж харах болно:
Дээрх жишээг үргэлжлүүлцгээе
main.py
файлыг, PUT
хүсэлтийг хүлээн авах зориулалттай болгон өөрчлье.
Pydantic-ийн ачаар body-г нь Python-ий стандарт тайп-аар зарлах боломжтой.
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: Union[bool, None] = None
@app.get("/")
def read_root():
return {"Сайн уу?": "Эх дэлхий минь!"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}
fastapi dev
сервер нь автоматаар ре-старт хийх ёстой.
Интерактив API документийн шинчлэлт
Дахин http://127.0.0.1:8000/docs-г нээнэ үү.
- Интерактив API документ маань автоматаар шинэ body-той болж шинэчлэгдсэн байх ёстой:
- "Try it out" гэсэн товчлуурыг дарснаар та API-тай интерактив харилцаа (харилцан нөлөөлөх харилцаа) хийх боломжтой болно:
- Дараа нь "Execute" товч дээр дарснаар таны харч буй интерфэйс тань API-тай холбогдож, параметрүүдийг илгээн, хариуг авч, дэлгэцэн дээр харуулна:
Хоёр дахь интерактив API документийн шинчлэлт
Мөн http://127.0.0.1:8000/redoc-ийг дахин нээнэ үү.
- Хоёр дахь документ маань ч бас шинэ хайлтын параметр болон шинэ body-г харуулах болно:
Товч дүгнэлт
Товчхондоо, та параметрүүд болон body гэх мэт зүйлсийн тайпыг, функцийн параметр болгон ганц л удаа зарлана.
Үүнийг орчин үеийн стандарт Python тайпаар л хийчихнэ.
Шинэ синтакс, тодорхой нэгэн library-ний аргачлал, класс зэргийг сураад байх шаардлага байхгүй.
Зүгээр л илүү ч үгүй дутуу ч үгүй, ориг Python.
Жишээлбэл, тоо int
байхад:
item_id: int
Эсвэл комплекс Item
модел байхад:
item: Item
Дээрх ганц удаагийн зарлалтаар та:
- Kод эдитэрийн тусламж:
- Код гүйцэтгэлт.
- Тайп шалгалт.
- Аргументийн шалгалт буюу баталгаажуулалт:
- Аргумент нь алдаатай өөр үед, автоматaap тодорхой бөгөөд ойлгомжтой алдаат хариуг авна.
- Аргумент нь маш гүн салаалсан комплекс JSON байсан ч хамаагүй ягш баталгаажуулалт хийгдэнэ.
- Ирэх өгөгдлийн хөрвүүлэлт.
Дараах эх сурвалжаас ирсэн өгөгдлийг Python-ий дата ба тайп рүү хөрвүүлнэ:- JSON (JSON)
- Хаягийн параметрүүд (Path parameters)
- Хайлтын параметрүүд (Query parameters)
- Күүки (Cookies)
- Хүсэлтийн хедер (Headers)
- Форм (Forms)
- Файл (Files)
- Гарах өгөгдлийн хөрвүүлэлт.
Дараах Python-ий дата ба тайпаас гарах өгөдлийг, JSON гэх мэт тайп руу хөрвүүлнэ:- Python тайп (
str
,int
,float
,bool
,list
гэх мэт) datetime
объектUUID
объект- Database модел
- ...гэх мэтчилэн
- Python тайп (
- Дараах 2 төрлийн өөрийн гэсэн интерфэйстэй автомат интерактив API документтой:
- Swagger UI.
- ReDoc.
Дээрх кодын жишээнээс дурдахад, FastAPI нь:
GET
болонPUT
хүсэлтийн хаягндitem_id
байгаа эсэхийг шалгана.GET
болонPUT
хүсэлтийнitem_id
ньint
тайп байхыг шалгана.- Хэрэв
int
тайп буюу тоо биш бол ойлгомжтой бөгөөд тодорхой алдаат хариуг илгээнэ.
- Хэрэв
GET
хүсэлтэндq
гэж нэрлэгдсэн зайлшгүй бус хайлтын параметр байгаа эсэхийг шалгана. (http://127.0.0.1:8000/items/foo?q=somequery
гэх мэт)q
параметр нь= None
гэж зарлагдсан учраас байсан ч, байхгүй байсан ч болно. (3айлшгүй бус)None
биш бол, параметр нь залшгүй хэрэгтэй параметр болно. (Дээрх жишээнийPUT
хүсэлтэнд дурдагдсан body мэт).
/items/{item_id}
хаяг дээрхPUT
хүсэлтийн body-г JSON гэж уншин:name
гэсэнstr
тайп байх ёстой, зайлшгүй хэрэгтэй атрибут байгаа эсэхийг шалгана.price
гэсэнfloat
тайп байх ёстой, зайлшгүй хэрэгтэй атрибут байгаа эсэхийг шалгана.is_offer
гэсэнbool
тайп байх ёстой, зайлшгүй бус атрибут байгаа эсэхийг шалгана.- Маш гүн салаалсан, комплекс JSON объект байсан ч үүн шиг шалгалт болон баталгаажуулалт явагдана.
- Автоматаар JSON-г хөрвүүлнэ.
- OpenAPI-аар бүх зүйлийг документчүүлэн:
- Интерактив документ систэмд,
- Автоматаар олон төрлийн хэлд зориулсан, клаянт код үүсгэх системд тус тус ашиглана.
- 2 төрлийн веб интерфэйс-тэй интерактив документийг санал болгоно.
Ингэснээр бид ердөө л мөсөн уулын оройг л хөндлөө, гэвч та аль хэдий нь яг яаж ажлаад байгааг тодорхой хэмжээгээр ойлгосон байх.
return {"item_name": item.name, "item_id": item_id}
Дээрх эгнээг:
... "item_name": item.name ...
...aaс:
... "item_price": item.price ...
...луу солиод үзнэ үү. Таны код эдитэр атрибутын тайп зэргийг аль хэдийн мэдээд, кодыг тань автоматаар гүйцэтгээд өгч байгааг ажиглаарай:
Илүү өргөн хүрээтэй, олон боломжийг харуулсан жишээг үзэхийг хүсвэл Сургалт – Хэрэглэгчийн гарын авлага-аас хараарай.
Спойлер: Сургалт – Хэрэглэгчийн гарын авлага нь:
- Параметрүүдийг хэрхэн хедер, күүки, форм, файл зэрэг олон төрлийн эх үүсвэрээс хялбархан авч ашиглах талаар дурдана.
maximum_length
эсвэлregex
зэрэг аргументийн шалгуурыг хэрхэн тохируулах талаар дурдана.- Хэрэглэхэд хялбар атлаа маш хүчирхэг Dependency Injection системийн тухай дурдана.
- JWT токен-той OAuth2-ийн тухай, мөн HTTP Basic нотолгоо зэргийг хавсаргасан аюулгүй байдал болон хамгаалалтын тухай дурдана.
- Гүн салаалсан JSON модел-ийг хэрхэн зарлах тухай гүнзгий түвшинд авч хэлэлцэнэ. (Гэхдээ нэг их хэцүү биш. Pydantic-ийн ачаар!)
- GraphQL-ийг Strawberry болон бусад library-тай интеграци хийх талаар дурдана.
- Starlette-ийн ачаар дараахи oлон нэмэлт онцлогийн талаар дурдана:
- WebSockets
- HTTPX and
pytest
дээр суурилсан тест - CORS
- Cookie Sessions
- гэх мэтчилэн...
Үзүүлэлт
TechEmpower-ийн бие даасан бенчмарк статистикт FastAPI нь Starlette болон Uvicorn-ийн дараагаар ордог, хамгийн хурдан Python фреймворкуудын нэг гэдгийг харуулсан байна. (Uvicorn, Starlette нь FastAPI-ийн дотор ашиглагддаг фремворк)
Үүний тухай илүү ихийг мэдэхийг хүсвэл Бенчмаркхэсгийг үзнэ үү.
Хамаарлууд
FastAPI нь Pydantic ба Starlette-ээс хараат фремворк юм.
standard
Хамаарлууд
FastAPI-г pip install "fastapi[standard]"
коммандаар суулгахад, доорх standard
хамаарлуудтай хамт суулгагдана:
Pydantic-т ашиглагддаг:
email-validator
- aргумент нь э-мэйл эсэхийг шалгагч бөгөөд хэрэв хэрэгтэй бол шаардлагатай.
Starlette-т ашиглагддаг:
httpx
- ХэрэвTestClient
-ийг ашиглах хэрэгтэй бол шаардлагатай.jinja2
- Хэрэв дефолт загварын тохиргоог ашиглах хэрэгтэй бол шаардлагатай.python-multipart
- Хэрэвrequest.form()
-ийг ашиглаж "задлан шинжлэгээ" хийх хэрэгтэй бол шаардлагатай.
FastAPI / Starlette-т ашиглагддаг:
-
uvicorn
- веб серверийн төлөөх хамаарал бөгөөд энэ ньuvicorn[standard]
, улмаарuvloop
зэрэг өндөр үзүүлэлттэй веб серверт хэрэгтэй хамаарлыг агуулсан. -
fastapi-cli
-fastapi
коммандын төлөөх хамаарал.
standard
хамаарал хэрэггүй бол:
Хэрэв таны апп-нд standard
хамаарал хэрэггүй бол pip install "fastapi[standard]"
биш pip install fastapi
коммандаар FastAPI-г суулгана уу.
Нэмэлт, зайлшгүй биш хамаарлууд
Таньд хэрэгтэй нэмэлт хамаарлууд байж магадгүй юм.
Жишээлбэл, нэмэлт Pydantic хамаарлуудаас дурдахад:
pydantic-settings
- тохиргооны зохицуулалтанд зориулагдсан.pydantic-extra-types
- Pydantic-т ашиглагдах нэмэлт тайп-нд зориулагдсан.
Hэмэлт FastAPI хамаарлуудаас дурдахад:
orjson
-ORJSONResponse
-г ашиглах хэрэгтэй бол шаардлагатай.ujson
-UJSONResponse
-г ашиглах хэрэгтэй бол шаардлагатай.
Лиценз
Энэхүү төсөл нь MIT лицензийн нөхцлөөр лицензжигдсэн билээ.