Ачааллж байна...
Энэ бол тэр мөч.
Курсийн эхний хичээлээс хойш бүх зам энд хөтөлж ирсэн. Одоо та өөрийн FastAPI программ бичнэ.
Тэр нь:
Жинхэнэ сервер байх болно — browser-ээр нээж болно
Жинхэнэ API байх болно — JSON буцаана
Автомат баримт бичигтэй байх болно — таны type hint-үүдээс
Мөн эцэст нь та /docs хуудсыг нээнэ. Тэр мөч бол энэ бүх курсийн шагнал юм.
Алхам бүрийг дугаарлана. Дэлгэц бүрийг тайлбарлана. Гарч болох алдаа бүрийг урьдчилан хэлнэ.
Бэлэн үү? Эхэлье.
1.1. File Explorer нээж, шинэ хавтас үүсгэнэ үү. Нэрийг нь:
nomiin-san-apiНэрэнд зай, кирилл үсэг битгий ашиглаарай.
1.2. Тэр хавтас дотор PowerShell нээнэ үү: хаягийн мөрөнд powershell гэж бичээд Enter.
1.3. Байршлаа шалгана уу:
powershell
pwdЗам нь nomiin-san-api -ээр төгсөх ёстой.
2.1. Venv үүсгэнэ:
powershell
python -m venv venvХэдэн секунд болно, дараа нь чимээгүй дуусна.
2.2. Идэвхжүүлнэ:
powershell
.\venv\Scripts\Activate.ps12.3. (venv) бичиг мөрийн эхэнд гарч ирснийг НҮДЭЭРЭЭ баталгаажуулна уу:
(venv) PS C:\Users\Dulguun\Documents\nomiin-san-api>(Эзэмшигчид: (venv) идэвхтэй байгаа терминалын screenshot энд тохиромжтой.)
Хэрэв execution policy алдаа гарвал:
.\venv\Scripts\Activate.ps1 : File ... cannot be loaded because running scripts is disabled on this system.Засвар (Бүлэг 1.2-оос):
powershell
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSignedY гээд Enter. Дараа нь 2.2 -ыг дахин.
3.1. Одоо ХОЁР сан суулгана:
powershell
pip install fastapi uvicornТерминал дээр олон мөр урсана. Эцэст нь:
Successfully installed annotated-types-0.7.0 anyio-4.4.0 click-8.1.7 fastapi-0.111.0 h11-0.14.0 idna-3.7 pydantic-2.8.2 pydantic-core-2.20.1 sniffio-1.3.1 starlette-0.37.2 typing-extensions-4.12.2 uvicorn-0.30.1Хоёр санг гуйсан ч арав гаруй суусан. Тэдгээр нь dependency (хамаарал) — Бүлэг 1.3-аас танил.
Хамгийн чухал нь: pydantic ч бас суусан. Тэр нь FastAPI-гийн зүрх (Бүлэг 9.2).
Хоёр сан юу хийдэг вэ?
Сан | Үүрэг |
|---|---|
| FRAMEWORK. Endpoint бүртгэх, JSON боловсруулах, баримт бичиг үүсгэх. |
| СЕРВЕР. Интернэтээс хүсэлт хүлээж авах, FastAPI руу дамжуулах. |
Тэдгээр нь ХОЁР ӨӨР зүйл.
Бүлэг 11.1-ийн зүйрлэлээр: uvicorn бол ЗӨӨГЧ (хүсэлт хүлээж авна), fastapi бол ГАЛ ТОГОО (хариу бэлдэнэ).
3.2. Шалгана:
powershell
pip listfastapi, uvicorn, pydantic — гурвуулаа жагсаалтад байх ёстой.
3.3. Шаардлагаа тэмдэглэнэ (Бүлэг 1.3-ын зуршил):
powershell
pip freeze > requirements.txt4.1. VS Code -оор хавтсыг нээнэ үү.
4.2. main.py нэртэй файл үүсгэнэ үү.
4.3. Хамгийн энгийн боломжит FastAPI программыг бичье:
python
# main.py
# Номын сангийн API
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def nuur_khuudas() -> dict[str, str]:
return {"mesej": "Номын сангийн API-д тавтай морил"}ЗУРГААН МӨР. Тэр л болоо.
Мөр бүрийг задалъя:
from fastapi import FastAPI — Бүлэг 12.1-ийн import.
app = FastAPI() — FastAPI объект үүсгэж байна. Тэр нь бүртгэлийг хадгална (Бүлэг 10.4-ийн ZAMUUD dictionary!).
@app.get("/") — DECORATOR (Бүлэг 10). Функцийг GET / хаягт БҮРТГЭЖ байна.
def nuur_khuudas() -> dict[str, str]: — ердийн def (Бүлэг 14.3-ын шийдвэр!). Type hint (Бүлэг 4).
return {"mesej": "..."} — dictionary буцааж байна. FastAPI нь түүнийг АВТОМАТААР JSON болгоно (Бүлэг 6).
5.1. PowerShell дээр ((venv) идэвхтэй байх ёстой):
powershell
uvicorn main:app --reloadТэр тушаалыг задалъя:
uvicorn — сервер
main — файлын нэр (main.py, .py -гүй)
:app — тэр файл доторх app хувьсагч
--reload — файл өөрчлөгдөхөд серверийг АВТОМАТААР дахин ачаална (хөгжүүлэлтэд маш ашигтай)
5.2. Терминал дээр дараах зүйл гарч ирнэ:
INFO: Will watch for changes in these directories: ['C:\\Users\\Dulguun\\Documents\\nomiin-san-api']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [12345] using StatReload
INFO: Started server process [67890]
INFO: Waiting for application startup.
INFO: Application startup complete.ТАНЫ СЕРВЕР АЖИЛЛАЖ БАЙНА.
(Эзэмшигчид: uvicorn ажиллаж байгаа терминалын screenshot энд ЗААВАЛ тохиромжтой.)
Хамгийн чухал мөр:
Uvicorn running on http://127.0.0.1:8000127.0.0.1 нь "энэ компьютер" гэсэн тусгай хаяг. Тэр нь localhost гэж ч бичигддэг.
8000 нь PORT — нэг компьютер дээр олон сервер ажиллаж болох тул тус бүр өөр дугаартай байдаг.
Анхаар: терминал ЗОГССОН мэт харагдана. Тэр нь ЗӨВ — сервер нь ХҮЛЭЭЖ БАЙНА (Бүлэг 11.1: "сервер нь зөвхөн ХҮЛЭЭДЭГ").
Терминалыг ХААЖ БОЛОХГҮЙ. Түүнийг нээлттэй үлдээж, ШИНЭ терминал (эсвэл browser) ашиглана.
6.1. Browser (Chrome, Firefox) нээж, хаягийн мөрөнд бичнэ үү:
http://127.0.0.1:80006.2. Enter дарна уу.
Та юу харах вэ?
json
{"mesej":"Номын сангийн API-д тавтай морил"}ТА ӨӨРИЙН API-ААС ХАРИУ АВЛАА.
(Эзэмшигчид: browser дээр JSON харагдаж байгаа screenshot энд ЗААВАЛ хэрэгтэй.)
Түр зогсоод, юу болсныг бодоорой.
Browser (CLIENT) нь GET / хүсэлт илгээв (Бүлэг 11.1)
uvicorn (СЕРВЕР) нь түүнийг хүлээж авав
FastAPI нь бүртгэлээс / хаягийг олж, таны функцийг ДУУДАВ (Бүлэг 10.4, 15.1)
Таны функц dictionary буцаав
FastAPI нь түүнийг JSON болгож хувиргав (Бүлэг 6)
uvicorn нь хариуг илгээв, status code 200 (Бүлэг 11.1)
Browser нь түүнийг харууллаа
Бүлэг 11-ийн БҮХ онол одоо БОДИТ болов.
6.3. Терминал руу буцаж хараарай:
INFO: 127.0.0.1:54321 - "GET / HTTP/1.1" 200 OKТаны хүсэлт БҮРТГЭГДСЭН. GET /, status 200 OK.
Одоо жинхэнэ API бүтээе.
7.1. main.py -г бүхэлд нь солино уу:
python
# main.py
# Номын сангийн API
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI(
title="Номын сангийн API",
description="Ном бүртгэх, хайх, нэмэх энгийн API",
version="1.0.0",
)
# ─── MODEL ───────────────────────────────────────────────────
class Nom(BaseModel):
garchig: str
zokhiolch: str
on: int
khuudas: int = 0
tailbar: str | None = None
# ─── ӨГӨГДӨЛ (санах ойд) ─────────────────────────────────────
nomnuud: dict[int, Nom] = {
1: Nom(
garchig="Монголын нууц товчоо",
zokhiolch="Тодорхойгүй",
on=1240,
khuudas=320,
),
2: Nom(
garchig="Цагаан хэрэм",
zokhiolch="Б. Ринчен",
on=1971,
khuudas=450,
tailbar="Түүхэн роман",
),
}
daraagiin_id = 3
# ─── ENDPOINT-УУД ────────────────────────────────────────────
@app.get("/")
def nuur_khuudas() -> dict[str, str]:
return {"mesej": "Номын сангийн API-д тавтай морил"}
@app.get("/nomnuud")
def nomnuud_jagsaakh(zokhiolch: str | None = None) -> list[Nom]:
if zokhiolch is None:
return list(nomnuud.values())
zokhiolch_tsever = zokhiolch.strip().lower()
return [
n for n in nomnuud.values() if zokhiolch_tsever in n.zokhiolch.lower()
]
@app.get("/nomnuud/{nom_id}")
def nom_avakh(nom_id: int) -> Nom:
nom = nomnuud.get(nom_id)
if nom is None:
raise HTTPException(
status_code=404, detail=f"{nom_id} ID -тай ном олдсонгүй"
)
return nom
@app.post("/nomnuud", status_code=201)
def nom_nemekh(nom: Nom) -> dict[str, int | Nom]:
global daraagiin_id
shine_id = daraagiin_id
nomnuud[shine_id] = nom
daraagiin_id += 1
return {"id": shine_id, "nom": nom}7.2. Файлыг ХАДГАЛНА уу (Ctrl+S).
7.3. Терминалыг хараарай:
WARNING: StatReload detected changes in 'main.py'. Reloading...
INFO: Started server process [67891]
INFO: Application startup complete.Сервер АВТОМАТААР дахин ачаалагдлаа. Тэр нь --reload -ийн ачаар.
Мөр бүр танил байх ёстой.
class Nom(BaseModel): — inheritance (Бүлэг 7.1). BaseModel нь Pydantic -ээс.
garchig: str — type hint (Бүлэг 4).
khuudas: int = 0 — default утга (Бүлэг 3.1).
tailbar: str | None = None — union (Бүлэг 4.3). "Байж ч болно, байхгүй ч байж болно."
Тэр class бүхэлдээ = Бүлэг 9.2-ын dataclass бүтэц.
nomnuud: dict[int, Nom] — Бүлэг 5.4: "ID -гаар индексжүүлсэн олон зүйл → dict[int, ...]"
@app.get("/nomnuud") — decorator (Бүлэг 10).
def nomnuud_jagsaakh(zokhiolch: str | None = None) -> list[Nom]:
Тэр параметр нь QUERY PARAMETER (Бүлэг 11.2)! FastAPI нь ?zokhiolch=Ринчен -ыг АВТОМАТААР уншиж, функцэд дамжуулна.
Тэр нь str | None = None тул СОНГОЛТТОЙ.
zokhiolch.strip().lower() — НОРМЧЛОЛ (Бүлэг 6.4).
[n for n in nomnuud.values() if ...] — comprehension (Бүлэг 2.1).
@app.get("/nomnuud/{nom_id}") — PATH PARAMETER (Бүлэг 11.2)!
def nom_avakh(nom_id: int) -> Nom:
FastAPI нь {nom_id} -ыг URL -ээс уншиж, int болгож ХУВИРГАЖ, функцэд дамжуулна.
Type hint -ээс! Хэрэв та /nomnuud/тэнэг гэж хандвал — FastAPI нь АВТОМАТААР 422 алдаа буцаана.
nomnuud.get(nom_id) — .get() (Бүлэг 4.3).
if nom is None: — is None (Бүлэг 4.3).
raise HTTPException(status_code=404, ...) — raise (Бүлэг 13.2) + 404 (Бүлэг 11.1).
@app.post("/nomnuud", status_code=201) — POST = үүсгэх, 201 = Created (Бүлэг 11.1).
def nom_nemekh(nom: Nom) -> ...: — ХАМГИЙН ГАЙХАЛТАЙ МӨР.
FastAPI нь:
Интернэтээс ирсэн JSON -ыг задална (Бүлэг 6.2)
Nom объект болгож хувиргана (Бүлэг 9.3)
Талбар бүрийг ШАЛГАНА (Бүлэг 9.2)
Буруу бол АВТОМАТААР 422 буцаана (Бүлэг 13.2)
Та тэдгээр БҮГДИЙГ Бүлэг 9.3-т ГАРААР бичсэн. Одоо FastAPI нь таны өмнөөс хийж байна.
8.1. Browser -ээр эдгээр хаягуудыг нээж үзээрэй:
Бүх ном:
http://127.0.0.1:8000/nomnuudjson
[
{"garchig":"Монголын нууц товчоо","zokhiolch":"Тодорхойгүй","on":1240,"khuudas":320,"tailbar":null},
{"garchig":"Цагаан хэрэм","zokhiolch":"Б. Ринчен","on":1971,"khuudas":450,"tailbar":"Түүхэн роман"}
]"tailbar":null — Бүлэг 6.1: Python-ы None нь JSON-д null.
Нэг ном:
http://127.0.0.1:8000/nomnuud/1json
{"garchig":"Монголын нууц товчоо","zokhiolch":"Тодорхойгүй","on":1240,"khuudas":320,"tailbar":null}Байхгүй ном (404!):
http://127.0.0.1:8000/nomnuud/999json
{"detail":"999 ID -тай ном олдсонгүй"}Terminal -д:
INFO: 127.0.0.1:54325 - "GET /nomnuud/999 HTTP/1.1" 404 Not Found404! Таны raise HTTPException нь ажиллалаа.
Query parameter -тай хайлт:
http://127.0.0.1:8000/nomnuud?zokhiolch=Ринченjson
[
{"garchig":"Цагаан хэрэм","zokhiolch":"Б. Ринчен","on":1971,"khuudas":450,"tailbar":"Түүхэн роман"}
]Шүүлт ажиллаж байна.
Буруу төрөл (АВТОМАТ ШАЛГАЛТ!):
http://127.0.0.1:8000/nomnuud/тэнэгjson
{
"detail": [
{
"type": "int_parsing",
"loc": ["path", "nom_id"],
"msg": "Input should be a valid integer, unable to parse string as an integer",
"input": "тэнэг"
}
]
}FastAPI нь АВТОМАТААР шалгалаа!
Та ямар ч шалгалтын код БИЧЭЭГҮЙ. Зөвхөн nom_id: int гэсэн TYPE HINT.
Тэр л мөчид та ойлгох болно: TYPE HINT нь ЖИНХЭНЭ АЖИЛ хийж байна.
/docsОдоо бэлдээрэй. Энэ бол тэр мөч.
9.1. Browser -ээр дараах хаягийг нээнэ үү:
http://127.0.0.1:8000/docs9.2. Enter дарна уу.
ТА ЮУ ХАРАХ ВЭ?
Бүрэн, гоё, ИНТЕРАКТИВ БАРИМТ БИЧИГ.
(Эзэмшигчид: /docs хуудасны screenshot энд ЗААВАЛ, ХАМГИЙН чухал. Бүтэн дэлгэц.)
Тэнд юу байна вэ:
1. Гарчиг ба тайлбар:
Номын сангийн API 1.0.0
Ном бүртгэх, хайх, нэмэх энгийн APIТэр нь хаанаас ирсэн бэ? → FastAPI(title=..., description=..., version=...)
2. БҮХ ENDPOINT жагсаагдсан:
GET / Nuur Khuudas
GET /nomnuud Nomnuud Jagsaakh
POST /nomnuud Nom Nemekh
GET /nomnuud/{nom_id} Nom AvakhТэдгээр нь хаанаас ирсэн бэ? → Таны @app.get(...), @app.post(...) DECORATOR -ууд.
3. Endpoint дээр дарвал — БҮРЭН МЭДЭЭЛЭЛ:
GET /nomnuud дээр дарна уу:
Parameters:
zokhiolch string | null (query) optionalТэр нь хаанаас ирсэн бэ? → zokhiolch: str | None = None гэсэн TYPE HINT.
Нэр, төрөл, заавал эсэх — БҮГД hint-ээс.
4. Responses:
200 Successful Response
Schema: Array of Nom
Nom {
garchig string
zokhiolch string
on integer
khuudas integer default: 0
tailbar string | null
}Тэр нь хаанаас ирсэн бэ? → -> list[Nom] гэсэн буцаах hint + class Nom(BaseModel) -ийн талбарууд.
Бүлэг 4.4-ийн "бүрэн hint-лэх" нь ЭНЭ л шалтгаанаар чухал байсан.
/docs -оос ТУРШИХХамгийн гайхалтай хэсэг: та API-г ТЭР ДОР НЬ туршиж болно.
10.1. POST /nomnuud дээр дарна уу.
10.2. Баруун талын "Try it out" товчийг дарна уу.
10.3. Request body талбарт БЭЛЭН ЖИШЭЭ гарч ирнэ:
json
{
"garchig": "string",
"zokhiolch": "string",
"on": 0,
"khuudas": 0,
"tailbar": "string"
}Тэр жишээ нь хаанаас ирсэн бэ? → Таны Nom class -аас. Type hint -ээс.
10.4. Түүнийг өөрчилнө үү:
json
{
"garchig": "Хөх толбо",
"zokhiolch": "Ч. Лодойдамба",
"on": 1970,
"khuudas": 380,
"tailbar": "Сонгодог роман"
}10.5. Том цэнхэр "Execute" товчийг дарна уу.
10.6. Доор нь хариу гарч ирнэ:
Code: 201
Response body:
{
"id": 3,
"nom": {
"garchig": "Хөх толбо",
"zokhiolch": "Ч. Лодойдамба",
"on": 1970,
"khuudas": 380,
"tailbar": "Сонгодог роман"
}
}201 Created! Ном нэмэгдлээ.
(Эзэмшигчид: "Try it out" + "Execute" -ийн дараах хариултын screenshot энд тохиромжтой.)
10.7. Одоо шалгана уу:
http://127.0.0.1:8000/nomnuudГурван ном байна. Таны нэмсэн ном тэнд байна.
10.8. Одоо ЗОРИУДААР буруу өгөгдөл илгээе.
POST /nomnuud → "Try it out" → body -г ингэж бич:
json
{
"garchig": "Тест",
"zokhiolch": "Зохиолч",
"on": "тэнэг"
}"Execute" дарна уу:
Code: 422
Response body:
{
"detail": [
{
"type": "int_parsing",
"loc": ["body", "on"],
"msg": "Input should be a valid integer, unable to parse string as an integer",
"input": "тэнэг"
}
]
}422 — АВТОМАТ ШАЛГАЛТ!
Та ямар ч шалгалтын код БИЧЭЭГҮЙ.
FastAPI нь on: int гэсэн type hint -ийг харж, "тэнэг" нь int биш гэдгийг мэдэж, тодорхой алдааны мессежтэй 422 буцаасан.
loc: ["body", "on"] — ЯГ ХААНА алдаа гарсныг хэлж байна.
Одоо тайван суугаад бодоорой.
Та юу бүтээв?
Жинхэнэ вэб сервер — интернэтээр хандаж болно
Дөрвөн endpoint — GET, POST
Автомат JSON хөрвүүлэлт — Python ↔ JSON
Автомат шалгалт — буруу төрөл бол 422
Автомат алдааны мессеж — яг хаана, яг юу
Бүрэн ИНТЕРАКТИВ баримт бичиг — туршиж болно
Та ХЭДЭН мөр код бичсэн бэ?
Дөчин мөр.
Тэр бүхэн ХААНААС гарч ирсэн бэ?
ТАНЫ TYPE HINT -ЭЭС.
python
class Nom(BaseModel):
garchig: str
zokhiolch: str
on: int
khuudas: int = 0
tailbar: str | None = NoneТэр ЗУРГААН мөрөөс:
__init__ (Бүлэг 9.1)
JSON задлалт (Бүлэг 6.2)
Объект угсралт (Бүлэг 9.3)
Төрлийн шалгалт (Бүлэг 9.2)
Алдааны мессеж (Бүлэг 13.2)
JSON хөрвүүлэлт (Бүлэг 9.3)
БАРИМТ БИЧИГ
Бүлэг 4.1-т би ингэж хэлсэн:
"Python нь type hint-ийг ШАЛГАДАГГҮЙ... Гэвч зарим framework нь hint-ийг УНШИЖ, ажиллуулдаг."
ЭНЭ Л ТЭР.
Бүлэг 9.2-т би ингэж хэлсэн:
"dataclass + type hint + default утга = ЯГ ТЭР бүтэц, Pydantic ашигладаг. Тэр нь санамсаргүй биш — тэр бол энэ курсийн бүх замын зорилго юм."
ОДОО ТА ТҮҮНИЙГ ӨӨРИЙН НҮДЭЭР ХАРЛАА.
/redoc — өөр загвар11.1. FastAPI нь ХОЁР ДАХЬ баримт бичиг ч үүсгэдэг:
http://127.0.0.1:8000/redocИжил мэдээлэл, өөр загвар. Уншихад илүү тохиромжтой (гэхдээ туршиж болохгүй).
Хоёулаа АВТОМАТААР үүссэн.
12.1. Хамгийн гүн давхарга:
http://127.0.0.1:8000/openapi.jsonАсар том JSON гарч ирнэ.
Тэр бол OPENAPI SCHEMA — API-г бүрэн тодорхойлсон стандарт формат.
/docs ба /redoc нь ЭНЭ файлаас үүсдэг.
Мөн тэр нь ХАМААГҮЙ ИЛҮҮ ЗҮЙЛД ашиглагдана:
Бусад программист таны API -г автоматаар client код үүсгэж ашиглаж чадна
Postman, Insomnia гэх мэт хэрэгсэлд импортлож болно
Тестүүд автоматаар үүсгэж болно
Та тэр бүхнийг ҮНЭГҮЙ авлаа. Type hint -ээсээ.
Дараах зүйлс нь БҮРЭН СОНГОЛТТОЙ.
Өргөтгөл 1: DELETE endpoint
python
@app.delete("/nomnuud/{nom_id}", status_code=204)
def nom_ustgakh(nom_id: int) -> None:
if nom_id not in nomnuud:
raise HTTPException(
status_code=404, detail=f"{nom_id} ID -тай ном олдсонгүй"
)
del nomnuud[nom_id]204 = No Content — устгал амжилттай, буцаах юм байхгүй.
Өргөтгөл 2: PUT endpoint (шинэчлэх)
python
@app.put("/nomnuud/{nom_id}")
def nom_shinechlekh(nom_id: int, nom: Nom) -> Nom:
if nom_id not in nomnuud:
raise HTTPException(status_code=404, detail="Ном олдсонгүй")
nomnuud[nom_id] = nom
return nomPath parameter БА body хоёулаа! FastAPI нь тэднийг зөв ялгана.
Өргөтгөл 3: илүү сайн validation
python
from pydantic import BaseModel, Field
class Nom(BaseModel):
garchig: str = Field(min_length=1, max_length=200)
zokhiolch: str = Field(min_length=1)
on: int = Field(ge=1000, le=2100) # ge = >=, le = <=
khuudas: int = Field(default=0, ge=0)
tailbar: str | None = NoneОдоо FastAPI нь:
Хоосон гарчиг → 422
1000 -аас бага он → 422
Сөрөг хуудас → 422
Бүлэг 9.2-ын __post_init__ шалгалт — гэхдээ АВТОМАТААР.
Мөн /docs дээр тэр хязгаарлалтууд ХАРАГДАНА.
Өргөтгөл 4: JSON файлд хадгалах (Бүлэг 6.2, 9.3)
python
import json
from pathlib import Path
ZAM = Path("nomnuud.json")
def khadgalakh() -> None:
uguudul = {str(k): v.model_dump() for k, v in nomnuud.items()}
with open(ZAM, "w", encoding="utf-8") as f:
json.dump(uguudul, f, ensure_ascii=False, indent=2)model_dump() — Pydantic -ийн asdict() (Бүлэг 9.3).
Дараа нь nom_nemekh дотор khadgalakh() дуудна.
1. ModuleNotFoundError: No module named 'fastapi'
(venv)идэвхтэй эсэхээ шалгаарай. (Бүлэг 1.3-ын стандарт сануулга)
Дараа нь pip install fastapi uvicorn.
2. uvicorn тушаал олдохгүй
uvicorn : The term 'uvicorn' is not recognized...(venv) идэвхгүй байна. Идэвхжүүлээд дахин.
3. Port аль хэдийн ашиглагдаж байна
ERROR: [Errno 10048] error while attempting to bind on address ('127.0.0.1', 8000)8000 порт завгүй. Хоёр шийдэл:
Хуучин uvicorn -ыг олж, Ctrl+C -ээр зогсоо
Эсвэл өөр порт ашигла: uvicorn main:app --reload --port 8001
4. main:app -ыг буруу бичих
ERROR: Error loading ASGI app. Could not import module "app".Формат нь файл:хувьсагч. Файл нь main.py тул main, хувьсагч нь app тул main:app.
5. Терминалыг хаах
Сервер зогсоно. Терминалыг НЭЭЛТТЭЙ үлдээ.
Зогсоохын тулд: Ctrl+C.
6. async def бичээд requests ашиглах
Бүлэг 14.3-ын АЮУЛТАЙ алдаа. Ердийн def бич.
ХОЁР сан: fastapi (FRAMEWORK — endpoint, JSON, docs) + uvicorn (СЕРВЕР — хүсэлт хүлээж авна).
Ажиллуулах: uvicorn main:app --reload
main = файлын нэр, app = хувьсагч, --reload = автомат дахин ачаалалт
Сервер: http://127.0.0.1:8000 (127.0.0.1 = "энэ компьютер", 8000 = порт).
Endpoint -ууд:
@app.get("/") → decorator (Б10) нь функцийг БҮРТГЭНЭ
zokhiolch: str | None = None → QUERY parameter (?zokhiolch=...)
@app.get("/nomnuud/{nom_id}") + nom_id: int → PATH parameter
raise HTTPException(status_code=404, ...) → raise (Б13.2) + 404 (Б11.1)
def nom_nemekh(nom: Nom) → JSON body АВТОМАТААР Nom объект болно
class Nom(BaseModel) = inheritance (Б7) + type hint (Б4) + default (Б3.1) + union (Б4.3) = Бүлэг 9.2-ын бүтэц.
АВТОМАТ ШАЛГАЛТ: on: int гэсэн hint -ээс FastAPI нь буруу төрөл ирвэл 422 буцаана, тодорхой мессежтэй. Та ямар ч шалгалтын код бичээгүй.
/docs — БҮРЭН ИНТЕРАКТИВ БАРИМТ БИЧИГ. Endpoint, параметр, төрөл, жишээ, "Try it out" — БҮГД ТАНЫ TYPE HINT -ЭЭС.
/redoc — өөр загвар. /openapi.json — стандарт schema.
ДӨЧИН МӨР КОД → бүрэн API + автомат шалгалт + бүрэн баримт бичиг.
Бүлэг 4.1-ийн "framework нь hint-ийг УНШИЖ, ажиллуулдаг" — ОДОО ТА ТҮҮНИЙГ ХАРЛАА.
БАЯР ХҮРГЭЕ. ТА FASTAPI ПРОГРАММ БИЧЛЭЭ.
Курсийн эхний хичээлд би амласан:
"Бид түүнийг сургалтын төгсгөлд амталж үзнэ — жижиг ажиллагаатай API бичиж, өөрсдийн гараар ажиллуулж, browser-ээр нээж харна. Тэр мөч жинхэнэ, тэр программ жинхэнэ ажиллана."
Амлалт биелэгдлээ.
Дараагийн хичээлд бид META-УР ЧАДВАР -ыг үзнэ: documentation уншиж сурах.
Учир нь та одоо FastAPI-гийн үндсийг мэднэ — гэвч түүнд ХАМААГҮЙ ИЛҮҮ зүйл байна. Мөн Python-ы ертөнцөд хэдэн зуун мянган сан бий.
Тэдгээрийг бүгдийг заах боломжгүй. Гэхдээ ӨӨРӨӨ СУРАХ АРГЫГ заах боломжтой.
Тэр бол таны цаашдын бүх аяллын хамгийн чухал ур чадвар юм.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.