Ачааллж байна...
Бүлэг 11 эхэлж байна. Энэ бүлэгт таны программ АНХ УДАА интернэттэй ярина.
Гэвч эхлээд бид нэг зүйлийг ойлгох ёстой: интернэт хэрхэн ажилладаг вэ?
Энэ хичээлд ганц ч мөр код байхгүй. Тэр нь зориудынх.
Учир нь requests санг ашиглаж, requests.get(url) гэж бичих нь ХЯЛБАР. Гэвч тэр мөр нь ЮУ хийж байгааг ойлгохгүй бол — алдаа гарахад та юу болж байгааг мэдэхгүй. 404 гэж юу вэ? 500 гэж юу вэ? Яагаад timeout хэрэгтэй вэ? Server гэж юу вэ?
Тиймээс энэ хичээл нь бүхэлдээ ойлголтын хичээл. Бид тэг мэдлэгээс эхэлнэ. Хэрэв та компьютерын сүлжээний талаар юу ч мэдэхгүй бол — тэр нь бүрэн зүгээр. Энэ хичээл яг тийм хүнд зориулагдсан.
Курс 1-ийн тэвчээртэй хэв маягаар, алхам алхмаар явна.
Интернэтийг ойлгох хамгийн сайн зүйрлэл нь ресторан юм. Бид түүнийг энэ бүлгийн турш ашиглана, тиймээс сайн суулгая.
Та ресторанд орлоо. Юу болох вэ?
1. Та ширээнд суулаа. Та бол ЗОЧИН.
2. Зөөгч ирлээ. Тэр бол... үгүй, тэр бол зөөгч биш. Тэр бол ЗУУЧЛАГЧ. Жинхэнэ хоол хийдэг хүн нь гал тогоонд байна.
Гэхдээ энгийн байлгахын тулд: зөөгч + гал тогоо = СЕРВЕР.
3. Та захиалга өглөө. "Надад нэг капучино." Энэ бол ХҮСЭЛТ (request).
4. Зөөгч гал тогоо руу очиж, хоол авчирлаа. Энэ бол ХАРИУ (response).
5. Та хоолоо идлээ. Ажил дууслаа.
Одоо энэ бүхнийг программын нэр томьёогоор орлуулъя:
Ресторан | Интернэт |
|---|---|
Зочин | Client (үйлчлүүлэгч) |
Зөөгч + гал тогоо | Server (сервер) |
Захиалга | Request (хүсэлт) |
Аяга хоол | Response (хариу) |
Цэс | API (дараагийн хичээл) |
Эдгээр дөрвөн үг — client, server, request, response — нь интернэтийн ҮНДСЭН үгс юм. Тэднийг сайн ойлгоорой.
Client гэдэг нь АСУУЖ БАЙГАА тал юм. Тэр нь ямар нэг зүйл ХҮСЭЖ байна.
Client нь маш олон зүйл байж болно:
Таны browser (Chrome, Firefox). Та www.google.com гэж бичихэд browser нь client болж, Google-ийн сервер рүү хүсэлт илгээнэ.
Таны утасны программ. Цаг агаарын app нь client — тэр нь цаг агаарын сервер рүү хандаж мэдээлэл авдаг.
ТАНЫ PYTHON ПРОГРАММ. Бүлэг 11.3-т та requests санг ашиглан client бичнэ.
Client-ийн үүрэг: хүсэлт илгээх, хариу хүлээх, хариуг ашиглах.
Чухал зүйл: client нь ҮРГЭЛЖ эхлүүлдэг. Сервер нь өөрөө client руу хандаж чадахгүй — тэр нь зөвхөн ХҮЛЭЭДЭГ.
Ресторанд зөөгч нь таны гэр рүү очиж "хоол идмээр байна уу" гэж асуухгүй. Та ирж, захиалга өгөх ёстой.
Server гэдэг нь ХАРИУЛЖ БАЙГАА тал юм. Тэр нь ямар нэг зүйл ӨГӨХӨД бэлэн байна.
Сервер бол үнэндээ КОМПЬЮТЕР — ихэвчлэн том, хүчирхэг, хаа нэгтээ өгөгдлийн төвд байрлаж, 24 цагийн турш асаалттай байдаг.
Тэр компьютер дээр программ ажиллаж байна. Тэр программ нь:
Хүсэлт ирэхийг ХҮЛЭЭНЭ
Хүсэлт ирвэл түүнийг УНШИНА
Юу хийхээ ШИЙДНЭ
ХАРИУ илгээнэ
Дараагийн хүсэлтийг ХҮЛЭЭНЭ
Тэр программ бол ЯГ ТЭР ЗҮЙЛ бөгөөд та Бүлэг 15-д FastAPI-аар бичих болно.
Одоо буцаж хараарай. Бүлэг 10.4-т бид жижиг framework бичсэн:
python
def khuselt_boloviruulakh(method: str, khayag: str) -> str:
func = ZAMUUD.get((method, khayag))
if func is None:
return "404 — Олдсонгүй"
return func()Тэр бол СЕРВЕРИЙН логик юм. Хүсэлт (method + зам) ирнэ, тохирох функцийг олж, дуудаж, хариу буцаана.
Ганц дутуу зүйл нь: жинхэнэ сервер нь тэр функцийг ИНТЕРНЭТЭЭР дууддаг, гараар биш. FastAPI нь тэр хэсгийг хийж өгнө.
Одоо хүсэлтийн бүтцийг харъя.
Ресторанд захиалга өгөхөд та хэдэн зүйл хэлдэг:
Юу хүсэж байна вэ? — "капучино"
Юу хийх вэ? — "авчирч өгөөч" (эсвэл "хүргэж өгөөч", "цуцлаач")
Нэмэлт мэдээлэл — "халуун байлгаарай", "сүүгүй"
Интернэтийн хүсэлт ч бас ижил бүтэцтэй:
1. ХАЯГ (URL) — "юу хүсэж байна вэ"
https://api.example.com/nomnuud2. METHOD — "юу хийх вэ"
Бүлэг 10.4-т бид GET ба POST -ыг товч харсан. Одоо тэднийг зохих ёсоор нь үзье.
3. НЭМЭЛТ МЭДЭЭЛЭЛ — headers, параметрүүд, өгөгдөл
HTTP гэдэг нь HyperText Transfer Protocol гэсэн үгсийн товчлол — "интернэтээр мэдээлэл дамжуулах ДҮРЭМ" гэсэн утгатай.
Тэр дүрэмд хэдэн method байдаг. Тэдгээр нь "би юу хийхийг хүсэж байна" гэдгийг хэлдэг.
GET — "надад ӨГӨӨЧ"
Хамгийн түгээмэл. Мэдээлэл УНШИНА, юуг ч өөрчлөхгүй.
Ресторанд: "Цэсээ үзүүлээч." Та зөвхөн ХАРЖ байна, юуг ч захиалаагүй.
Жишээ: GET /nomnuud — "надад номнуудын жагсаалтыг өг."
Browser нь та хаяг бичихэд ҮРГЭЛЖ GET хүсэлт илгээдэг. Тиймээс browser-ээр ямар ч GET хаягийг нээж болно.
POST — "энэ өгөгдлийг АВ"
Шинэ зүйл ҮҮСГЭНЭ. Сервер дээр ямар нэг зүйл ӨӨРЧЛӨГДӨНӨ.
Ресторанд: "Надад капучино авчирч өгөөч." Одоо гал тогоо ажиллана, зүйл өөрчлөгдөнө.
Жишээ: POST /nomnuud + {"garchig": "Шинэ ном", ...} — "энэ номыг нэм."
PUT — "энэ зүйлийг СОЛЬ"
Байгаа зүйлийг бүхэлд нь шинэчилнэ.
PATCH — "энэ зүйлийн ХЭСГИЙГ өөрчил"
Байгаа зүйлийн зөвхөн зарим талбарыг өөрчилнө.
DELETE — "энэ зүйлийг УСТГА"
Нэрнээс нь тодорхой.
Практикт хамгийн түгээмэл нь GET ба POST. Энэ курсэд бид ихэвчлэн GET ашиглана (өгөгдөл татах), Бүлэг 15-д POST -ыг ч бас үзнэ.
Чухал ялгаа:
GET нь АЮУЛГҮЙ. Хэдэн ч удаа дуудсан ямар ч зүйл өөрчлөгдөхгүй. Хуудсыг арван удаа шинэчлэхэд юу ч болохгүй.
POST нь АЮУЛГҮЙ БИШ. Хоёр удаа дуудвал — хоёр ном нэмэгдэнэ. Тиймээс browser нь заримдаа "формыг дахин илгээх үү?" гэж асуудаг.
Хаягийг задалъя. Энэ бол жинхэнэ URL:
https://api.open-meteo.com/v1/forecast?latitude=47.92&longitude=106.92Хэсэг хэсгээр нь:
https:// — PROTOCOL (протокол). "Ямар дүрмээр ярих вэ."
http:// — энгийн, шифрлэгдээгүй
https:// — шифрлэгдсэн, аюулгүй (s = secure)
Өнөөдөр бараг бүх сайт https ашигладаг. Хэрэв та http (s-гүй) харвал — тэр нь хуучин, эсвэл аюултай.
api.open-meteo.com — DOMAIN (домэйн). "Аль сервер рүү."
Энэ нь хүн уншихад зориулагдсан нэр. Компьютер нь түүнийг IP хаяг болгож хөрвүүлдэг (жишээ нь 104.21.65.86) — тэр нь интернэтэд байгаа тодорхой машины дугаар юм. Тэр хөрвүүлэлтийг DNS гэдэг систем хийдэг, гэхдээ тэр нь автоматаар явдаг тул та санаа зовох шаардлагагүй.
/v1/forecast — PATH (зам). "Тэр сервер дээрх аль хуудас/функц."
Бүлэг 10.4-ийн ZAMUUD dictionary-г санаж байна уу? Тэнд "/nomnuud" гэсэн key байсан. Энэ бол яг тэр.
Сервер нь энэ замыг хараад, аль функцийг дуудахаа шийднэ.
?latitude=47.92&longitude=106.92 — QUERY PARAMETERS (асуултын параметрүүд).
Асуултын тэмдэг (?) -ээс хойш эхэлнэ. Хэлбэр нь: key=value, олон байвал & -ээр холбоно.
Эдгээр нь функцийн keyword argument шиг (Бүлэг 3.2). Тэр нь "надад мэдээлэл өг, ГЭХДЭЭ эдгээр нөхцөлтэй" гэсэн утгатай.
Дээрх жишээнд: "цаг агаарын мэдээ өг, ГЭХДЭЭ энэ өргөрөг, энэ уртрагт."
Ресторанд: "капучино, гэхдээ том аяганд, бас сүүгүй."
Сервер хариу илгээхэд, тэр нь ХОЁР үндсэн хэсгээс бүрдэнэ.
1. STATUS CODE (төлөвийн код) — "юу болов?"
2. BODY (агуулга) — "энд таны хүссэн зүйл байна"
Status code бол гурван оронтой тоо бөгөөд "хүсэлт яаж болов" гэдгийг хэлдэг.
Ресторанд зөөгч танд хоол авчирахдаа юу ч хэлэхгүй байж болно. Гэхдээ заримдаа тэр хэлнэ:
"Энд таны хоол." → бүх зүйл сайн
"Уучлаарай, тэр хоол цэсэнд байхгүй." → олдсонгүй
"Уучлаарай, гал тогоо шатсан." → сервер дээр асуудал
"Уучлаарай, та захиалга өгөх эрхгүй." → эрх байхгүй
Status code нь яг тэр мессежүүд, гэхдээ ТООГООР.
Тоонууд нь БҮЛГЭЭР зохион байгуулагдсан:
Бүлэг | Утга | Санах арга |
|---|---|---|
2xx | АМЖИЛТТАЙ | "Бүх зүйл сайн" |
3xx | ШИЛЖҮҮЛЭЛТ | "Өөр газар хар" |
4xx | CLIENT-ийн алдаа | "ЧИ буруу зүйл асуулаа" |
5xx | SERVER-ийн алдаа | "БИ эвдэрсэн" |
Хамгийн чухал ялгаа: 4xx vs 5xx.
4xx — ТАНЫ буруу. Та буруу хаяг бичсэн, эрхгүй зүйл асуусан, буруу өгөгдөл илгээсэн. Дахин оролдох нь утгагүй — ижил алдаа гарна.
5xx — СЕРВЕРИЙН буруу. Тэр эвдэрсэн, ачаалал их байна, дотоод алдаа гарсан. Дахин оролдох нь УТГАТАЙ — магадгүй засагдсан байх.
Энэ ялгаа нь Хичээл 11.5-д алдаа зохицуулах үед маш чухал болно.
200 OK — "Бүх зүйл сайн"
Хамгийн түгээмэл. Хүсэлт амжилттай, өгөгдөл ирлээ.
Та энэ кодыг ХАМГИЙН олон харна.
201 Created — "Шинэ зүйл үүслээ"
POST хүсэлт амжилттай болж, шинэ зүйл үүссэн.
404 Not Found — "Олдсонгүй"
Хамгийн алдартай код. Та байхгүй хаяг руу хандсан.
Ресторанд: "Тийм хоол цэсэнд байхгүй."
Бүлэг 10.4-т бидний framework нь яг үүнийг буцаасан:
python
if func is None:
return "404 — Олдсонгүй"Одоо та тэр тоог хаанаас ирснийг мэдэж байна.
400 Bad Request — "Хүсэлт буруу"
Та буруу форматтай өгөгдөл илгээсэн. Жишээ нь тоо байх ёстой газарт текст.
Бүлэг 15-д FastAPI нь энэ кодыг АВТОМАТААР буцаана — таны type hint дээр үндэслэн (Бүлэг 9.2-ын Pydantic).
401 Unauthorized — "Нэвтрээгүй"
Та нэвтрэх ёстой, гэхдээ нэвтрээгүй.
403 Forbidden — "Эрх байхгүй"
Та нэвтэрсэн, гэхдээ ЭНЭ зүйлийг үзэх эрхгүй.
401 vs 403 -ын ялгаа: 401 нь "чи хэн бэ?", 403 нь "би чамайг мэднэ, гэхдээ чи болохгүй."
429 Too Many Requests — "Хэт олон хүсэлт"
Та хэт хурдан, хэт олон хүсэлт илгээсэн. Сервер таныг түр хориглосон.
Энэ кодыг санаж яваарай. Хэрэв та loop дотор API дуудвал — тэр нь гарч ирж болно. Үнэгүй API-ууд ихэвчлэн хязгаартай байдаг.
500 Internal Server Error — "Сервер дээр алдаа"
Серверийн программ унасан. Таны буруу БИШ.
503 Service Unavailable — "Үйлчилгээ боломжгүй"
Сервер түр зуур ажиллахгүй байна (засвар, ачаалал их).
Хариултын хоёр дахь хэсэг нь BODY — жинхэнэ өгөгдөл.
Body нь янз бүрийн форматтай байж болно:
HTML — вэб хуудас (browser түүнийг харуулна)
JSON — өгөгдөл (программ түүнийг уншина)
Зураг, видео, файл — хоёртын өгөгдөл
Бидний хувьд ХАМГИЙН чухал нь JSON.
Яагаад? Учир нь API-ууд бараг үргэлж JSON буцаадаг (Бүлэг 6.1).
Тэгэхээр API-аас ирэх хариу нь ойролцоогоор ийм харагдана:
Status: 200 OK
Body:
{
"latitude": 47.92,
"longitude": 106.92,
"current": {
"temperature_2m": 24.3,
"wind_speed_10m": 12.5
}
}Бүлэг 6.1-ээс танил! Тэнд бид яг ийм жишээг харсан.
Тэр үед би ингэж хэлсэн:
"Та ЯГ ОДОО тэр өгөгдлийг уншиж чадна. Дараагийн бүлгүүдэд зөвхөн түүнийг ХААНААС АВАХ талаар сурна."
Одоо та түүнийг хаанаас авахыг мэдэж байна. Хэрэгжүүлэлт нь Хичээл 11.3-т.
Одоо бүх зүйлийг НЭГ ТҮҮХ болгож нэгтгэе.
Та browser нээж, хаягийн мөрөнд www.ulaanbaatar.app гэж бичээд Enter дарлаа. Юу болох вэ?
Алхам 1: DNS хайлт.
Browser нь www.ulaanbaatar.app гэсэн НЭР -ийг мэднэ, гэхдээ тэр хаана байгааг мэдэхгүй.
Тэр нь DNS сервер рүү хандаж асууна: "www.ulaanbaatar.app -ын IP хаяг юу вэ?"
DNS хариулна: "76.76.21.21."
Ресторанд: та рестораны НЭРИЙГ мэднэ, гэхдээ хаягийг нь мэдэхгүй. Google-ээс хайж, хаягийг олж авлаа.
Алхам 2: холболт үүсгэх.
Browser нь тэр IP хаягтай компьютер руу холбогдоно. https тул шифрлэгдсэн холболт үүснэ.
Ресторанд: та явж, ресторанд ороод, ширээнд суулаа.
Алхам 3: REQUEST илгээх.
Browser нь хүсэлт илгээнэ:
GET / HTTP/1.1
Host: www.ulaanbaatar.app"Надад нүүр хуудсыг (/) ӨГӨӨЧ."
Ресторанд: та захиалга өглөө.
Алхам 4: сервер боловсруулна.
Тэр компьютер дээр программ ажиллаж байна. Тэр нь:
Хүсэлтийг уншина: "GET /"
Аль функцийг дуудахаа шийднэ (Бүлэг 10.4-ийн ZAMUUD -тэй яг адил!)
Функц ажиллана — магадгүй өгөгдлийн сангаас мэдээлэл татна
HTML хуудас үүсгэнэ
Ресторанд: зөөгч гал тогоо руу очлоо, тогооч хоол хийж байна.
Алхам 5: RESPONSE илгээх.
Сервер хариу илгээнэ:
HTTP/1.1 200 OK
Content-Type: text/html
<html>
<body>
<h1>УЛААНБААТАР АПП</h1>
...
</body>
</html>Status: 200 OK. Бүх зүйл сайн.
Ресторанд: зөөгч хоол авчирлаа.
Алхам 6: browser харуулна.
Browser нь HTML -ыг уншиж, хуудас болгож зурна. Та түүнийг хардаг.
Ресторанд: та хоолоо идлээ.
Алхам 7: нэмэлт хүсэлтүүд.
Тэр HTML дотор зураг, CSS, JavaScript файлууд байж болно. Browser нь тэдгээр бүрд ШИНЭ хүсэлт илгээнэ.
Тэгэхээр НЭГ хуудас нээхэд арав, зуун хүсэлт илгээгдэж болно.
Ресторанд: та дараа нь ус, талх, амтлагч гуйж болно. Хүсэлт бүр тусдаа.
Тэгээд л болоо. Энэ бол интернэтийн БҮХ мөн чанар. Хүсэлт → хариу. Дахин дахин, секундэд тэрбум удаа.
Одоо нэг чухал зүйлийг тодруулъя.
HTTP нь "санамжгүй" (stateless) юм. Хүсэлт бүр нь ТУСДАА, БИЕ ДААСАН.
Сервер нь таны өмнөх хүсэлтийг САНАДАГГҮЙ. Хүсэлт бүр цоо шинэ.
Ресторанд: төсөөлөөд үз — зөөгч бүр удаа таныг МАРТДАГ. Та капучино захиалж, тэр авчирна. Дараа нь та "өөр нэг" гэж хэлбэл — тэр "нэг юу?" гэж асууна. Тэр таны өмнөх захиалгыг санахгүй.
Тэгвэл вэб сайтууд яаж таныг санадаг вэ? Яаж та нэг удаа нэвтэрсний дараа хуудас солиход дахин нэвтрэх шаардлагагүй байдаг вэ?
Хариулт: cookie ба token.
Сервер нь танд тэмдэг өгдөг ("энэ бол таны дугаар: ABC123"). Дараагийн хүсэлт бүрд та тэр тэмдгийг ХАМТ илгээнэ. Сервер түүнийг хараад "аан, энэ бол Болд" гэж мэднэ.
Ресторанд: зөөгч танд дугаар өгнө. Дараагийн захиалга бүрд та дугаараа хэлнэ. Тэр өөрийн дэвтрээс "дугаар 5 = капучино захиалсан хүн" гэж олно.
Энэ курс нь authentication (нэвтрэлт) -ыг ГҮНЗГИЙ үзэхгүй — тэр нь өөр бүтэн сэдэв. Гэхдээ HTTP нь санамжгүй гэдгийг мэдэх нь чухал.
Одоохондоо бид browser -ийн тухай ярьсан. Browser нь HTML хүлээж авч, хуудас болгож ХАРУУЛДАГ.
Гэвч хэрэв программ нь өгөгдөл авахыг хүсвэл яах вэ?
Программд HTML хэрэггүй. Тэр нь <h1>, <div> гэсэн тэмдэглэгээг ойлгохгүй. Түүнд ЦЭВЭР ӨГӨГДӨЛ хэрэгтэй.
Тиймээс сервер нь ХОЁР төрлийн хариу өгч чадна:
Хүнд: HTML хуудас (browser харуулна)
Программд: JSON өгөгдөл (программ уншина)
JSON буцаадаг сервер бол API юм.
Тэр бол дараагийн хичээлийн сэдэв.
Хэрэв сонирхвол: Chrome нээж, F12 дараарай (Developer Tools). Дараа нь "Network" табыг сонгоод, ямар нэг вэб сайт нээгээрэй.
Та бүх хүсэлтийг ӨӨРИЙН нүдээр харна. Тэнд:
Хүсэлт бүрийн зам (/, /logo.svg, /style.css)
Status code (200, 404, 304)
Method (GET, POST)
Хэмжээ ба хугацаа
Хүсэлт дээр дарж, "Headers" ба "Response" -ыг үзээрэй. Энэ хичээлд ярьсан бүх зүйл тэнд байна.
Хэрэв та ямар нэг сайт дээр байхгүй хуудас нээвэл (жишээ нь www.ulaanbaatar.app/baihgui-khuudas) — 404 кодыг өөрийн нүдээр харна.
Тэр туршилт нь энэ хичээлийн бүх онолыг бодит болгоно.
Дөрвөн үндсэн үг: Client (асуудаг), Server (хариулдаг), Request (хүсэлт), Response (хариу).
Client нь ҮРГЭЛЖ эхлүүлдэг. Сервер нь зөвхөн ХҮЛЭЭДЭГ, өөрөө хандаж чадахгүй.
Server бол 24 цаг асаалттай компьютер + түүн дээр ажиллаж байгаа программ. Бүлэг 15-д та тэр программыг бичнэ.
HTTP method — "юу хийхийг хүсэж байна":
GET — унших (аюулгүй, хэдэн ч удаа дуудаж болно)
POST — үүсгэх (аюулгүй БИШ, хоёр удаа дуудвал хоёр зүйл үүснэ)
PUT / PATCH — өөрчлөх. DELETE — устгах.
URL-ийн бүтэц: https:// (protocol) + domain + /path (Бүлэг 10.4-ийн ZAMUUD -ын key!) + ?key=value (query parameters — keyword argument шиг).
Response = Status code + Body.
Status code бүлгүүд:
2xx — амжилттай (200 OK, 201 Created)
3xx — шилжүүлэлт
4xx — CLIENT-ийн алдаа (404 Not Found, 400 Bad Request, 401/403, 429). Дахин оролдох нь утгагүй.
5xx — SERVER-ийн алдаа (500, 503). Дахин оролдох нь утгатай.
Body нь ихэвчлэн JSON (API-ийн хувьд) эсвэл HTML (browser-ийн хувьд).
HTTP нь САНАМЖГҮЙ (stateless). Хүсэлт бүр тусдаа. Сервер нь өмнөхийг санахгүй. Тиймээс cookie/token хэрэгтэй.
JSON буцаадаг сервер бол API — дараагийн хичээлийн сэдэв.
Дараагийн хичээлд бид API гэж юу болохыг ойлгоно. Ресторан ба цэсийн зүйрлэл үргэлжилнэ: API бол ЦЭС — тэр нь "юу захиалж болох вэ" гэдгийг тодорхойлдог. Мөн тэнд ганц ч мөр код байхгүй — гэхдээ дараагийн хичээлд (11.3) та requests санг суулгаж, жинхэнэ API-аас жинхэнэ өгөгдөл татна.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.