Ачааллж байна...
HTTP хариу нь хоёр хэсгээс бүрддэг. Нэг нь агуулга — өмнөх хичээлд бид түүнийг сурсан, JSON өгөгдөл. Нөгөө нь status code — гурван оронтой тоо, хариу хэр амжилттай болсныг илэрхийлдэг.
Курс 2-ын Бүлэг 11-д та энэ тоог хэрэглэгчийн талаас харсан. response.status_code гэж уншиж, 200 бол сайн, 404 бол олдсонгүй гэж шийддэг байсан. Одоо та ширээний нөгөө талд байна. Одоо та тэр тоог сонгож байна.
Энэ бол зөвхөн техникийн нарийн ширийн зүйл биш. Status code бол таны API-ийн үнэнч байдал юм. Буруу тоо буцаах нь худал хэлэхтэй адил бөгөөд таны API-г ашиглаж байгаа программуудыг төөрөгдүүлдэг.
Бүлэг 2-ын төгсгөлд бичсэн кодыг санаж байна уу:
python
@app.get("/books/{book_id}")
def get_book(book_id: int):
for book in books:
if book["id"] == book_id:
return book
return {"error": "Ном олдсонгүй"}/books/99 гэж хандвал ямар status code ирэх вэ? 200.
Гэтэл ном олдоогүй. Таны API "бүх зүйл амжилттай боллоо" гэж хэлээд, дотор нь "олдсонгүй" гэж бичиж байна. Энэ бол зөрчил.
Яагаад энэ нь чухал вэ? Учир нь программ таны текстийг уншдаггүй. Курс 2-т та ийм код бичиж байсан:
python
response = requests.get(url)
if response.status_code == 200:
data = response.json()
print(data["title"])Энэ код таны API-тай ажиллавал юу болох вэ? Status 200 ирнэ. Код "амжилттай" гэж шийднэ. data["title"] гэж хайна. Гэтэл тэнд title байхгүй, зөвхөн error байна. Программ KeyError өгч унана.
Таны худал status code нөгөө хүний программыг эвдлээ. Тиймээс status code-ыг зөв сонгох нь эелдэг байдал биш — үүрэг юм.
Зочин 17-р хоол захиалав. Зөөгч гурван янзаар хариулж болно.
"Тэгье, энэ байна." Хоолыг тавьж өглөө. Бүх зүйл сайн. Энэ бол 200.
"Уучлаарай, тийм хоол цэсэнд байхгүй." Зочин буруу зүйл асуусан. Зөөгч буруутай биш; зочин байхгүй зүйл хүссэн. Энэ бол 404.
"Уучлаарай, гал тогоонд гал гарлаа." Зочин зөв асуусан, гэхдээ зоогийн газарт асуудал гарлаа. Энэ бол 500.
Гурвуулаа хариу. Гэхдээ тэдгээр нь өөр төрлийн хариу бөгөөд зочин ялгааг мэдэх ёстой. Хэрэв зөөгч гурван тохиолдолд бүгдэд нь инээмсэглээд "болж байна" гэж хэлбэл зочин юу болж байгааг ойлгохгүй.
Status code гурван оронтой байдаг бөгөөд эхний орон нь бүлгийг заана. Энэ бүлгийг мэдэх нь тоо бүрийг цээжлэхээс чухал.
2xx — Амжилт. Хүсэлт хүлээж авагдаж, боловсруулагдаж, гүйцэтгэгдсэн. 200 (OK), 201 (Created), 204 (No Content).
3xx — Чиглүүлэлт. "Хайж байгаа зүйл чинь өөр газар байна." Ихэвчлэн browser өөрөө зохицуулдаг; та үүнтэй ховор ажиллана.
4xx — Хэрэглэгчийн алдаа. "Та буруу зүйл хийлээ." 400 (Bad Request), 401 (Unauthorized), 403 (Forbidden), 404 (Not Found), 422 (Unprocessable Entity).
5xx — Серверийн алдаа. "Би буруу зүйл хийлээ." 500 (Internal Server Error), 503 (Service Unavailable).
4xx болон 5xx хоёрын ялгааг сайн ойлгох нь чухал. 4xx нь "буруу нь чинийх" гэсэн үг; 5xx нь "буруу нь минийх" гэсэн үг. Энэ ялгаа нь техникийн бус, харин хариуцлагын ялгаа юм.
Бүлэг 2-т та 422 харсан — тэр нь 4xx бүлэгт байна, учир нь хэрэглэгч буруу төрлийн өгөгдөл илгээсэн. Мөн та 500 харсан (KeyError гарахад) — тэр нь 5xx бүлэгт байна, учир нь таны код эвдэрсэн.
main.py файлаа дараах кодоор солино:
python
# main.py
from fastapi import FastAPI
app = FastAPI(title="Номын API")
books = [
{"id": 1, "title": "Цог хийморь", "year": 1962},
{"id": 2, "title": "Цагаан хэрэм", "year": 1971},
]
@app.get("/books")
def get_books():
return booksХүсэлт:
http://127.0.0.1:8000/booksХариу (статус 200):
json
[{"id":1,"title":"Цог хийморь","year":1962},{"id":2,"title":"Цагаан хэрэм","year":1971}]FastAPI ямар ч зааваргүйгээр 200-ыг үндсэн утга болгон сонгосон. Ихэнх тохиолдолд энэ нь зөв — GET хүсэлт амжилттай болвол 200 бол яг тохирох тоо.
Status code-ыг хаанаас харах вэ? Browser-ийн хаягийн мөрөнд харагдахгүй. Гурван арга бий.
Эхний арга: /docs. Try it out -> Execute дарахад Code гэсэн багана дор тоо гарна.
Хоёр дахь арга: browser-ийн хөгжүүлэгчийн хэрэгсэл. F12 -> Network таб -> хуудсаа шинэчил -> хүсэлт дээр товш -> Status гэсэн мөрийг хар.
Гурав дахь арга: Python код. Курс 2-ын мэдлэгээ ашиглан:
python
import requests
response = requests.get("http://127.0.0.1:8000/books")
print(response.status_code)Терминал дээр 200 гарна. (Энэ кодыг өөр файлд, өөр терминал дээр ажиллуулна — таны сервер ажиллаж байх ёстой.)
Сургалтын турш бид голдуу /docs-ыг ашиглана, учир нь тэр хамгийн хурдан.
Одоо status code-ыг өөрөө сонгож эхэлье. Decorator дээр status_code гэсэн параметр байдаг:
python
# main.py (нэмэлт)
@app.get("/books", status_code=200)
def get_books():
return booksЭнэ нь өмнөхтэй яг ижил зүйл хийж байна — 200 бол аль хэдийн default. Гэхдээ одоо тодорхой бичигдсэн байна.
Илүү сонирхолтой жишээ рүү орно.
Шинэ зүйл үүсгэх endpoint-ийн зөв status code нь 200 биш, 201 байдаг.
201 нь "Created" гэсэн утгатай: "Таны хүсэлт амжилттай боллоо, БА үүний үр дүнд шинэ зүйл үүслээ." Энэ нь 200-аас илүү тодорхой мэдээлэл өгч байна.
Бид POST-ыг Бүлэг 5-д зөв сурна, гэхдээ тоог одоо харуулъя:
python
# main.py (нэмэлт)
@app.post("/books", status_code=201)
def create_book():
new_book = {"id": 3, "title": "Шинэ ном", "year": 2026}
books.append(new_book)
return new_bookАнзаараарай: @app.post — @app.get биш. POST бол "шинэ зүйл үүсгэ" гэсэн утгатай HTTP method. Бүлэг 5 бүхэлдээ түүнд зориулагдана.
Энэ endpoint-ийг browser-ийн хаягийн мөрөөр туршиж болохгүй — хаягийн мөр зөвхөн GET илгээдэг. Тиймээс /docs ашиглана.
/docs хуудсаа нээнэ. Одоо POST /books гэсэн шинэ мөр харагдана — өнгө нь ногоон биш, шар байх болно (Swagger UI POST-д өөр өнгө хэрэглэдэг). Түүн дээр товшоод Try it out -> Execute дарна.
Хариу (статус 201):
json
{"id":3,"title":"Шинэ ном","year":2026}Code багана дор 201 гэсэн тоо харагдана — 200 биш.
Энэ ялгаа нь юу өгч байна вэ? Таны API-г ашиглаж байгаа программ ингэж бичиж чадна:
python
response = requests.post(url, ...)
if response.status_code == 201:
print("Шинэ ном амжилттай үүслээ")201 гэдэг тоо "зөвхөн амжилттай" биш, "амжилттай үүсгэлээ" гэсэн тодорхой утга илэрхийлж байна. Энэ бол илүү үнэн, илүү ашигтай хариу.
/docs дээр POST /books мөрийг задалж, Responses хэсгийг хараарай:
201 Successful Response
422 Validation ErrorХоёр мөр байна. Эхнийх нь таны зарласан 201. Хоёр дахь нь FastAPI өөрөө нэмсэн — validation алдаа гарч болзошгүйг мэдэж байгаа тул баримт бичигт бичсэн.
Харин GET /books дээр (status_code заагаагүй) ийм харагдана:
200 Successful ResponseГанц мөр — параметргүй endpoint тул validation алдаа гарах боломжгүй.
Дахин хэлэхэд: та зөвхөн status_code=201 гэж бичсэн. Баримт бичиг өөрөө шинэчлэгдсэн.
Одоо хамгийн чухал тоо руу орно. 404 нь "Not Found" — хайсан зүйл байхгүй.
Та үүнтэй өдөр бүр таарч байсан. Интернэтэд байхгүй хуудас руу орвол "404" гэсэн хуудас гардаг. Бүлэг 1-д та /doc гэж буруу бичээд {"detail":"Not Found"} гэсэн хариу авсан — тэр нь 404 байсан.
404 нь хоёр өөр утгаар хэрэглэгддэг бөгөөд энэ ялгааг ойлгох нь чухал.
Эхний утга: тийм зам байхгүй. /nonexistent гэж хандвал FastAPI өөрөө 404 буцаана, учир нь дэвтэрт нь тийм бүртгэл байхгүй. Энэ нь автомат.
Хоёр дахь утга: зам байгаа, гэхдээ хайсан зүйл байхгүй. /books/99 — зам бүртгэгдсэн, функц дуудагдсан, гэхдээ 99 дугаартай ном байхгүй. Энэ 404-ийг та өөрөө буцаах ёстой.
Хоёр дахь тохиолдол бол өнөөдрийн бидний асуудал.
Логик асуулт: status_code=404 гэж бичиж болох уу?
python
@app.get("/books/{book_id}", status_code=404)
def get_book(book_id: int):
...Болохгүй. Учир нь status_code параметр нь бүх хариунд хамаарна. Энэ endpoint нь ном олдвол ч, олдохгүй ч, үргэлж 404 буцаах болно. Энэ нь утгагүй.
Танд хэрэгтэй зүйл бол нөхцөлт status code: ном олдвол 200, олдохгүй бол 404. Decorator дээрх параметр үүнийг хийж чадахгүй, учир нь тэр нь функц ажиллахаас өмнө шийдэгддэг.
Тиймээс өөр механизм хэрэгтэй. Тэр механизм нь HTTPException бөгөөд дараагийн хичээл бүхэлдээ түүнд зориулагдана.
Гэхдээ асуудлыг тодорхой болгохын тулд одоохондоо түр зуурын, буруу шийдлийг харъя.
python
# main.py (нэмэлт)
from fastapi import Response
@app.get("/books/{book_id}")
def get_book(book_id: int, response: Response):
for book in books:
if book["id"] == book_id:
return book
response.status_code = 404
return {"detail": "Ном олдсонгүй"}Энд Response гэдэг объектыг функцэд оруулж, түүний status_code-ыг гараар өөрчилж байна.
Хүсэлт:
http://127.0.0.1:8000/books/99Хариу (статус 404):
json
{"detail":"Ном олдсонгүй"}Ажиллаж байна. Status code одоо 404, агуулга нь тайлбар. Худал байхаа больсон.
Гэхдээ энэ шийдэл сайн биш, гурван шалтгаанаар.
Нэгд, функц бүрт response: Response гэсэн нэмэлт параметр бичих ёстой болно — олон endpoint дээр давтагдана.
Хоёрт, алдаа гарсан ч гэсэн функц үргэлжлэн ажиллаж байна. Бодит кодонд алдаа илэрсэн даруйд зогсох нь илүү тодорхой.
Гуравт, гүн үүрлэсэн функцээс (жишээ нь тусад нь бичсэн туслах функцээс) алдаа буцаах нь төвөгтэй болно — response объектыг тэр функц рүү дамжуулах шаардлагатай болно.
Курс 2-ын Бүлэг 13-т та raise гэдгийг сурсан: алдаа гарвал шидэх, буцаах биш. Тэр санаа энд яг тохирно. FastAPI-д зориулсан тэр хэрэгсэл нь HTTPException бөгөөд дараагийн хичээлд бид түүнийг сурна.
Одоохондоо энэ түр зуурын кодыг үлдээе — дараагийн хичээлд түүнийг сайжруулна.
Энэ сургалтад та дараах тоонуудтай ажиллана. Бүгдийг нь одоо цээжлэх шаардлагагүй; жагсаалтыг эргэж харах хэрэгтэй байвал энэ хичээл рүү буцаж ирээрэй.
200 — OK. Амжилттай уншлаа. GET-ийн default.
201 — Created. Амжилттай үүсгэлээ. POST-д ашиглана.
204 — No Content. Амжилттай боллоо, гэхдээ буцаах юм алга. DELETE-д ашиглана — ном устсан, буцаах ном байхгүй. Бүлэг 5-д харна.
400 — Bad Request. Хүсэлт буруу байна (ерөнхий тохиолдол).
401 — Unauthorized. "Та хэн бэ? Танигдаагүй байна." Бүлэг 8-д API key дээр харна.
403 — Forbidden. "Та хэн бэ гэдгийг мэдлээ, гэхдээ энэ үйлдэл танд зөвшөөрөгдөөгүй." Бүлэг 8-д харна.
404 — Not Found. Хайсан зүйл байхгүй. Дараагийн хичээлд.
422 — Unprocessable Entity. Өгөгдлийн төрөл/бүтэц буруу. FastAPI автоматаар буцаана.
500 — Internal Server Error. Таны кодод алдаа гарлаа. Хэзээ ч зориудаар буцаадаггүй; энэ нь таны код унасны шинж.
401 болон 403 хоёрын ялгаа нь эхэндээ будлиантай санагддаг тул нэг өгүүлбэрээр: 401 бол "танигдаагүй", 403 бол "танигдсан боловч зөвшөөрөгдөөгүй". Зочид буудлын жишээгээр: 401 бол түлхүүрээ мартсан зочин; 403 бол түлхүүртэй боловч өөр хүний өрөө рүү орох гэж байгаа зочин.
Амжилтгүй үйлдэлд 200 буцаах
Энэ бол өнөөдөр яригдсан гол алдаа:
python
return {"error": "Ном олдсонгүй"} # статус 200Программ 200 харвал амжилттай гэж үзнэ. Таны текстийг хэн ч уншихгүй. Status code бол машины хэл; текст бол хүний хэл. Хоёулаа зөв байх ёстой.
Хэрэглэгчийн алдаанд 500 буцаах
Бүлэг 2-т бид үүнийг харсан: books[99] -> KeyError -> 500.
Энэ нь эсрэг талын алдаа. Хэрэглэгч байхгүй зүйл хайсан — тэр бол хэрэглэгчийн алдаа (404). Гэтэл таны API "би эвдэрлээ" (500) гэж хэлж байна.
Энэ нь зөвхөн буруу мэдээлэл биш, харин аюулгүй байдлын асуудал ч бас юм. 500 алдаа гарахад заримдаа таны кодны дотоод бүтэц, файлын зам, эсвэл өгөгдлийн сангийн бүтэц гадагш алдагддаг. Хэрэглэгчийн алдааг зөв 4xx болгож барих нь таны системийг ч хамгаалдаг.
Бүх зүйлд 201 буцаах
python
@app.get("/books", status_code=201)
def get_books():
return booksЭнэ ажиллана, гэхдээ утгагүй. 201 нь "шинэ зүйл үүслээ" гэсэн үг; GET нь юу ч үүсгэдэггүй, зөвхөн уншдаг. Ийм API-г ашиглаж байгаа программ төөрөгдөнө.
Дүрэм: GET -> 200. POST -> 201. DELETE -> 204 (эсвэл 200).
Хүсвэл /docs дээр GET /books/{book_id} endpoint-ийг хоёр удаа туршиж үзээрэй: эхлээд 1 гэсэн утгаар, дараа нь 99 гэсэн утгаар. Code баганын тоог хоёуланд нь ажиглаарай. 200 болон 404. Таны API одоо үнэн ярьж эхэллээ.
Сонирхвол өөр терминал нээж, Курс 2-ын requests мэдлэгээ ашиглан өөрийн API руу хандаж үзээрэй:
python
import requests
for book_id in [1, 99]:
response = requests.get(f"http://127.0.0.1:8000/books/{book_id}")
print(book_id, response.status_code, response.json())Энэ нь тойргийг бүтэн болгож байна: та Курс 2-т сурсан хэрэгслээрээ Курс 3-т бүтээсэн API-даа хандаж байна. Хоёр талыг нь ойлгосон хүн жинхэнэ хөгжүүлэгч юм.
HTTP хариу = агуулга (JSON) + status code (гурван оронтой тоо).
Бүлгүүд: 2xx амжилт, 3xx чиглүүлэлт, 4xx хэрэглэгчийн алдаа, 5xx серверийн алдаа.
4xx = "буруу нь чинийх"; 5xx = "буруу нь минийх". Энэ бол хариуцлагын ялгаа.
Decorator дээрх status_code=201 нь тэр endpoint-ийн амжилттай хариуны тоог тогтооно.
GET -> 200, POST -> 201, DELETE -> 204. Эдгээр нь зөвлөмж биш, стандарт.
Амжилтгүй үйлдэлд 200 буцаах нь худал — программууд текст биш, тоог уншдаг.
status_code параметр нь нөхцөлт алдаанд тохирохгүй (бүх хариунд хамаарна).
Одоо танд асуудал тодорхой байна: ном олдвол 200, олдохгүй бол 404 буцаах хэрэгтэй, гэхдээ decorator дээрх нэг параметр үүнийг хийж чадахгүй. Дараагийн хичээлд бид HTTPException сурна — Курс 2-ын raise санаа FastAPI-д хэрхэн ажиллаж, алдааг нэг мөрөөр зөв, цэвэрхэн буцаадгийг харна. Тэр нь энэ бүлгийн эцсийн үлдсэн эд анги бөгөөд түүний дараа бид Түвшин 1-ийн бүтээн байгуулалт руу орно.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.