You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

29 KiB

{!../../docs/missing-translation.md!}

FastAPI

FastAPI

FastAPI фреймворк, өндөр гүйцэтгэлтэй, сурахад хялбар, хурдан кодлох боломжтой, ашиглалтанд оруулахад бэлэн

Test Coverage Package version Supported Python versions


Документ: https://fastapi.tiangolo.com

Эх код: https://github.com/fastapi/fastapi


FastAPI нь Python type hint стандартад суурилсан, API хөгжүүлэх зориулалттай, орчин үеийн, хурдан (өндөр гүйцэтгэлтэй) вэб фреймворк юм. { .annotate }

  1. тайп хинт - Тохиромжтой Монгол орчуулга байгаагүй тул Англи галигаар нь үлдээв.

Гол онцлогууд нь:

  • Хурд: 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-ийг ашиглахаар төлөвлөж байна."

Kabir Khan - Microsoft (ref)

"Бид FastAPI-г ашиглан REST серверийг хөгжүүлж, түүгээр дамжуулан прогноз/таавар авч байна. [Ludwig]"

Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)

"Netflix нь эрсдэлийн менежмент фремворк буюу Dispatch-ийг нээлттэй эх сурвалжтайгаар гаргаснаа зарлаж байгаадаа баяртай байна! [FastAPI-ээр бүтээсэн]"

Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)

"Би FastAPI-д маш их сэтгэл хангалуун, баяртай байна!"

Brian Okken - Python Bytes podcast host (ref)

"Яг үнэнийг хэлэхэд та бүхний бүтээсэн зүйл маш бат бөх, төгс харагдаж байна. Hug-г яг ийм байгаасай гэж төсөөлж байсан. Хэн нэгэн нь үүнийг бүтээж байгааг харахад урам орж байна."

Timothy Crosley - Hug үүсгэн байгуулагч (ref)

"Хэрэв та REST API-г хөгжүүлэхэд зориулагдсан орчин үеийн фремворк-г сурахыг хүсэж байгаа бол, FastAPI-г шалгаарай [...] Хурдан, хэрэглэхэд хялбар, сурахад амар [...]"

"Бид API-аа FastAPI-гаар хийхээр болсон. [...] Та бүхэн ч бас тэгнэ гэж найдаж байна. [...]"

Ines Montani - Matthew Honnibal - Explosion AI үүсгэн байгуулагч - spaCy үүсгэн байгуулагч (ref) - (ref)

"Хэрэв хэн нэгэн нь борлуулалтанд бэлэн Python API хөгжүүлэхийг хүсч байвал, би FastAPI-г 100% санал болгоно. FastAPI нь төгс бүтээгдсэн, хэрэглэхэд хялбар бөгөөд томсгох, жижигсгэхэд түүртээд байхгүй. Манай API-н хөгжүүлэлтийн стратегийн түлхүүр бүрэлдэхүүн болж, олон автоматаци болон үйлчилгээнд, тухайлбал манай Virtual TAC Engineer-д ашиглагдаж байна."

Deon Pillsbury - Cisco (ref)

Typer, CLI дахь FastAPI

Хэрэв та веб интерфейс биш, CLI интерфейс апп хөгжүүлж байвал Typer-ийг шалгаарай!.

Typer нь FastAPI-ийн төрсөн дүү нь юм. CLI дахь FastAPI байхад зориулагдсан. ⌨️ 🚀

Өмнөтгөл

FastAPI-ийн үндсэн тулгуур:

  • Bеб-тэй холбоотой зүйлс: Starlette.
  • Дата болон өгөгдөлтэй холбоотой зүйлс: Pydantic.

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 документ-ийг харах болно:

Swagger UI

Хоёр дахь интерактив документ

Мөн http://127.0.0.1:8000/redoc-г нээснээр:

ReDoc-ooр бүтээгдсэн, xоёр дахь автомат документ-ийг олж харах болно:

ReDoc

Дээрх жишээг үргэлжлүүлцгээе

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-той болж шинэчлэгдсэн байх ёстой:

Swagger UI

  • "Try it out" гэсэн товчлуурыг дарснаар та API-тай интерактив харилцаа (харилцан нөлөөлөх харилцаа) хийх боломжтой болно:

Swagger UI interaction

  • Дараа нь "Execute" товч дээр дарснаар таны харч буй интерфэйс тань API-тай холбогдож, параметрүүдийг илгээн, хариуг авч, дэлгэцэн дээр харуулна:

Swagger UI interaction

Хоёр дахь интерактив API документийн шинчлэлт

Мөн http://127.0.0.1:8000/redoc-ийг дахин нээнэ үү.

  • Хоёр дахь документ маань ч бас шинэ хайлтын параметр болон шинэ body-г харуулах болно:

ReDoc

Товч дүгнэлт

Товчхондоо, та параметрүүд болон 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 модел
    • ...гэх мэтчилэн
  • Дараах 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 ...

...луу солиод үзнэ үү. Таны код эдитэр атрибутын тайп зэргийг аль хэдийн мэдээд, кодыг тань автоматаар гүйцэтгээд өгч байгааг ажиглаарай:

editor support

Илүү өргөн хүрээтэй, олон боломжийг харуулсан жишээг үзэхийг хүсвэл Сургалт – Хэрэглэгчийн гарын авлага-аас хараарай.

Спойлер: Сургалт – Хэрэглэгчийн гарын авлага нь:

  • Параметрүүдийг хэрхэн хедер, күүки, форм, файл зэрэг олон төрлийн эх үүсвэрээс хялбархан авч ашиглах талаар дурдана.
  • 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 лицензийн нөхцлөөр лицензжигдсэн билээ.