Ачааллж байна...
Өмнөх хичээлд бид анхны API дуудалт хийсэн. Тэр нь ажилласан — 200 OK, өгөгдөл ирсэн, бүх зүйл сайхан болсон.
Гэвч бид НАЙДСАН.
Кодыг эргэн хараарай:
python
hariult = requests.get(url, params=parametruud)
uguudul = hariult.json()
print(uguudul["current"]["temperature_2m"])Энэ код нь ГУРВАН зүйлд найдаж байна:
Сервер 200 буцаана гэж
Хариу нь JSON байна гэж
Тэр JSON -д "current" ба "temperature_2m" талбарууд байна гэж
Гурвуулаа БУРУУ байж болно.
Бодит амьдрал дээр:
Сервер 404 буцааж болно (буруу хаяг)
Сервер 400 буцааж болно (буруу параметр)
Сервер 429 буцааж болно (хэт олон хүсэлт)
Сервер 500 буцааж болно (тэр эвдэрсэн)
Хариу нь JSON биш, HTML алдааны хуудас байж болно
JSON нь байгаа ч, хүлээж байсан талбар нь байхгүй байж болно
Энэ хичээлд бид тэдгээр бүх тохиолдлыг зохицуулна.
Мөн бид үүрлэсэн JSON хариултаас өгөгдөл гаргаж авах чадвараа бататгана — Бүлэг 5.3-ын мэдлэг бодит API дээр бүрэн ажиллана.
Эхлээд ЗОРИУДААР алдаа үүсгэе.
python
import requests
# Байхгүй хаяг
hariult = requests.get("https://api.open-meteo.com/v1/baihgui-khayag")
print(f"Status code: {hariult.status_code}")
print(f"Text: {hariult.text[:200]}")Status code: 404
Text: {"error":true,"reason":"Not found"}404 — Бүлэг 11.1-ээс танил. Олдсонгүй.
Гэвч анзаараарай: программ УНАСАНГҮЙ. requests нь 404 -ыг АЛДАА гэж үзээгүй — тэр нь зөвхөн серверийн хариуг дамжуулсан.
Энэ бол чухал ойлголт: requests.get() нь ХАРИУ ирсэн бол амжилттай гэж үзнэ, тэр хариу нь юу ч байсан хамаагүй. 404 бол ХАРИУ — сервер танд "олдсонгүй" гэж хэлж байна.
Одоо буруу параметр:
python
hariult = requests.get(
"https://api.open-meteo.com/v1/forecast",
params={"latitude": "тэнэг", "longitude": 106.92},
)
print(f"Status code: {hariult.status_code}")
print(f"Text: {hariult.text}")Status code: 400
Text: {"error":true,"reason":"Data corrupted at path ''. Cannot initialize Float from invalid String value тэнэг"}400 Bad Request — та буруу өгөгдөл илгээсэн.
Мессежийг уншаарай: Cannot initialize Float from invalid String value тэнэг — "тэнэг гэсэн текстийг бутархай тоо болгож чадсангүй."
Сервер нь ТОДОРХОЙ хэлж байна. Сайн API нь үргэлж ингэдэг.
Хэрэв бид status code -ыг ШАЛГААГҮЙ бол юу болох вэ?
python
import requests
hariult = requests.get("https://api.open-meteo.com/v1/baihgui-khayag")
uguudul = hariult.json()
temperatur = uguudul["current"]["temperature_2m"]
print(temperatur)Traceback (most recent call last):
File "main.py", line 6, in <module>
temperatur = uguudul["current"]["temperature_2m"]
KeyError: 'current'KeyError: 'current' — ойлгомжгүй алдаа.
Программ унасан, гэвч мессеж нь ЖИНХЭНЭ асуудлыг нуусан. Жинхэнэ асуудал нь "current талбар байхгүй" БИШ — жинхэнэ асуудал нь "хаяг буруу, сервер 404 буцаасан."
Энэ бол status code шалгахгүй байхын аюул: алдаа нь ХОЛ ЗАЙД, ойлгомжгүй хэлбэрээр илэрдэг.
Бүлэг 4.3-ын сургамжтай ижил санаа:
"
None-ыг эх сурвалж дээр нь бариарай. Түүнийг гүн рүү дамжуулбал чимээгүй, утгагүй үр дүн үүснэ."
Status code ч ижил: алдааг ЭХ СУРВАЛЖ дээр нь бари.
python
import requests
def tsag_agaar_avakh(lat: float, lon: float) -> dict | None:
url = "https://api.open-meteo.com/v1/forecast"
parametruud = {
"latitude": lat,
"longitude": lon,
"current": "temperature_2m",
"timezone": "auto",
}
hariult = requests.get(url, params=parametruud)
if hariult.status_code != 200:
print(f"Алдаа: сервер {hariult.status_code} буцаалаа.")
return None
return hariult.json()
uguudul = tsag_agaar_avakh(47.92, 106.92)
if uguudul is None:
print("Мэдээлэл авч чадсангүй.")
else:
print(f"Температур: {uguudul['current']['temperature_2m']}°C")Температур: 18.7°CОдоо буруу утга өгье:
python
uguudul = tsag_agaar_avakh(999, 999) # боломжгүй координатАлдаа: сервер 400 буцаалаа.
Мэдээлэл авч чадсангүй.Программ унасангүй. Тодорхой мессеж хэвлэгдлээ.
if hariult.status_code != 200: — энгийн, тодорхой шалгалт.
-> dict | None (Бүлэг 4.3) — "өгөгдөл ЭСВЭЛ юу ч биш." Дуудагч шалгах ёстой.
if uguudul is None: — Бүлэг 4.3-ын дүрэм. == None биш.
.ok — богино бичлэгrequests нь тав тухтай туслах өгдөг:
python
if not hariult.ok:
print(f"Алдаа: {hariult.status_code}")
return None.ok нь True буцаана хэрэв status code нь 200-299 хооронд байвал (Бүлэг 11.1-ийн 2xx = амжилттай).
Тэгэхээр .ok нь 201 Created, 204 No Content гэх мэт бусад амжилтын кодуудыг ч зөв боловсруулна.
status_code != 200 -ээс илүү.
raise_for_status() — мэргэжлийн аргаrequests нь бүр илүү сайн зүйл өгдөг.
python
import requests
def tsag_agaar_avakh(lat: float, lon: float) -> dict:
url = "https://api.open-meteo.com/v1/forecast"
parametruud = {
"latitude": lat,
"longitude": lon,
"current": "temperature_2m",
"timezone": "auto",
}
hariult = requests.get(url, params=parametruud)
hariult.raise_for_status() # алдаа бол ЭНД зогсоно
return hariult.json()
uguudul = tsag_agaar_avakh(999, 999)
print(uguudul)Traceback (most recent call last):
File "main.py", line 15, in <module>
uguudul = tsag_agaar_avakh(999, 999)
File "main.py", line 11, in tsag_agaar_avakh
hariult.raise_for_status()
requests.exceptions.HTTPError: 400 Client Error: Bad Request for url: https://api.open-meteo.com/v1/forecast?latitude=999&longitude=999¤t=temperature_2m&timezone=autoraise_for_status() нь: "хэрэв status code нь 4xx эсвэл 5xx бол — АЛДАА ГАРГА."
Алдааны төрөл нь requests.exceptions.HTTPError.
Мессеж нь МАШ мэдээлэлтэй: status code (400), төрөл (Client Error), тайлбар (Bad Request), бүтэн URL.
Яагаад энэ нь дээр вэ?
1. Алдааг АЛГАСАХ БОЛОМЖГҮЙ. if шалгалтыг мартаж болно. raise_for_status() нь ЗОГСООНО.
2. Функцийн hint нь ЦЭВЭР. -> dict (union биш). Учир нь функц нь эсвэл өгөгдөл буцаана, эсвэл АЛДАА гаргана — "хоосон" гэсэн гурав дахь боломж байхгүй.
3. Алдааг ДЭЭД түвшинд барьж болно. try/except -ээр.
Бүлэг 9.2-ын сургамжтай ижил санаа:
"Хүчингүй төлөвтэй объект оршин байх ЁСГҮЙ. Хэрэв өгөгдөл нь буруу бол — объект үүсэх ёсгүй."
Энд: буруу хариунаас өгөгдөл гаргаж авах ёсгүй. Хэрэв хариу нь буруу бол — зогс.
try/except -ээр барихОдоо raise_for_status() -ыг зохих ёсоор нь ашиглая.
python
import requests
def tsag_agaar_avakh(lat: float, lon: float) -> dict | None:
url = "https://api.open-meteo.com/v1/forecast"
parametruud = {
"latitude": lat,
"longitude": lon,
"current": "temperature_2m,wind_speed_10m",
"timezone": "auto",
}
try:
hariult = requests.get(url, params=parametruud)
hariult.raise_for_status()
return hariult.json()
except requests.exceptions.HTTPError as alda:
kod = alda.response.status_code
if 400 <= kod < 500:
print(f"Хүсэлт буруу байна ({kod}). Параметрүүдээ шалгана уу.")
else:
print(f"Серверт асуудал гарлаа ({kod}). Дараа дахин оролдоно уу.")
return None
for lat, lon, ner in [
(47.92, 106.92, "Улаанбаатар"),
(999, 999, "Боломжгүй координат"),
]:
print(f"\n--- {ner} ---")
uguudul = tsag_agaar_avakh(lat, lon)
if uguudul is None:
print("Мэдээлэл авч чадсангүй.")
continue
odoo = uguudul["current"]
print(f"Температур: {odoo['temperature_2m']}°C")
print(f"Салхи: {odoo['wind_speed_10m']} км/ц")--- Улаанбаатар ---
Температур: 18.7°C
Салхи: 8.3 км/ц
--- Боломжгүй координат ---
Хүсэлт буруу байна (400). Параметрүүдээ шалгана уу.
Мэдээлэл авч чадсангүй.Программ унасангүй, тодорхой мессеж хэвлэгдлээ.
Хамгийн чухал хэсгийг задалъя:
python
kod = alda.response.status_code
if 400 <= kod < 500:
print(f"Хүсэлт буруу байна ({kod})...")
else:
print(f"Серверт асуудал гарлаа ({kod})...")Бүлэг 11.1-ийн ГОЛ ялгаа энд ажиллаж байна:
4xx — ТАНЫ буруу. Дахин оролдох нь утгагүй.
5xx — СЕРВЕРИЙН буруу. Дахин оролдох нь утгатай.
Тиймээс мессеж нь ӨӨР:
4xx → "параметрүүдээ шалгана уу" (та засах ёстой)
5xx → "дараа дахин оролдоно уу" (сервер засагдах болно)
400 <= kod < 500 — Python-ы гинжлэсэн харьцуулалт. kod >= 400 and kod < 500 -тэй ижил, гэхдээ илүү тод.
alda.response — алдааны объект нь ЖИНХЭНЭ Response -ыг агуулна. Тиймээс та түүнээс status code, body, headers бүгдийг авч чадна.
Сайн API нь алдааны ТОДОРХОЙ тайлбар өгдөг. Түүнийг ашиглая.
python
import requests
def tsag_agaar_avakh(lat: float, lon: float) -> dict | None:
url = "https://api.open-meteo.com/v1/forecast"
parametruud = {
"latitude": lat,
"longitude": lon,
"current": "temperature_2m",
}
try:
hariult = requests.get(url, params=parametruud)
hariult.raise_for_status()
return hariult.json()
except requests.exceptions.HTTPError as alda:
kod = alda.response.status_code
# Серверийн тайлбарыг ОЛОХ гэж оролдъё
try:
alda_uguudul = alda.response.json()
shaltgaan = alda_uguudul.get("reason", "тайлбаргүй")
except requests.exceptions.JSONDecodeError:
shaltgaan = alda.response.text[:100]
print(f"Алдаа {kod}: {shaltgaan}")
return None
tsag_agaar_avakh(999, 999)Алдаа 400: Data corrupted at path ''. Cannot initialize Float from invalid String value 999Серверийн ТОДОРХОЙ тайлбар. Хамаагүй ашигтай.
Кодыг задалъя:
Дотоод try/except — учир нь алдааны хариу нь JSON БИШ байж болно.
Заримдаа сервер эвдэрч, HTML алдааны хуудас буцаадаг. Тэр үед .json() нь JSONDecodeError гаргана.
requests.exceptions.JSONDecodeError — Бүлэг 6.2-ын json.JSONDecodeError -тэй ойролцоо алдаа.
alda.response.text[:100] — JSON биш бол зөвхөн эхний 100 тэмдэгтийг харуулна (slicing — Бүлэг 2.4). Учир нь HTML хуудас нь маш урт байж болно.
.get("reason", "тайлбаргүй") — Бүлэг 4.3. API бүр өөр өөр талбар ашигладаг тул .get() нь аюулгүй.
Одоо хичээлийн хоёр дахь хэсэг рүү орно. Хариу ирсэн, гэхдээ түүнээс өгөгдөл яаж гаргах вэ?
Бодит API-гийн хариу нь НАРИЙН байдаг. Долоо хоногийн урьдчилсан мэдээ авъя:
python
import requests
hariult = requests.get(
"https://api.open-meteo.com/v1/forecast",
params={
"latitude": 47.92,
"longitude": 106.92,
"daily": "temperature_2m_max,temperature_2m_min,precipitation_sum",
"timezone": "auto",
"forecast_days": 7,
},
)
uguudul = hariult.json()
import json
print(json.dumps(uguudul, ensure_ascii=False, indent=2))json
{
"latitude": 47.9375,
"longitude": 106.875,
"generationtime_ms": 0.09,
"utc_offset_seconds": 28800,
"timezone": "Asia/Ulaanbaatar",
"timezone_abbreviation": "+08",
"elevation": 1301.0,
"daily_units": {
"time": "iso8601",
"temperature_2m_max": "°C",
"temperature_2m_min": "°C",
"precipitation_sum": "mm"
},
"daily": {
"time": [
"2026-07-13",
"2026-07-14",
"2026-07-15",
"2026-07-16",
"2026-07-17",
"2026-07-18",
"2026-07-19"
],
"temperature_2m_max": [26.1, 24.8, 22.0, 25.3, 27.9, 26.4, 23.1],
"temperature_2m_min": [12.4, 11.9, 10.2, 13.1, 14.8, 13.5, 11.0],
"precipitation_sum": [0.0, 2.3, 5.1, 0.0, 0.0, 1.2, 0.0]
}
}Энэ бол чухал заль: json.dumps(uguudul, ensure_ascii=False, indent=2) (Бүлэг 6.2) нь хариуг ГОЁ форматлаж харуулна.
Шинэ API-тай ажиллах бүрдээ ЭХЛЭЭД үүнийг хий. Бүтцийг НҮДЭЭРЭЭ хараарай, дараа нь код бич.
Одоо бүтцийг задалъя:
uguudul["daily"] нь DICTIONARY, түүний value-ууд нь ЖАГСААЛТ.
Анзаараарай: тэр нь [{огноо, ихдээ, багадаа}, {огноо, ихдээ, багадаа}] гэсэн хэлбэртэй БИШ.
Тэр нь {"time": [огноонууд], "max": [температурууд], "min": [температурууд]} гэсэн хэлбэртэй.
Өөрөөр хэлбэл: ЗЭРЭГЦЭЭ ЖАГСААЛТУУД.
Бүлэг 2.3-ын zip нь яг үүнд зориулагдсан!
python
udur_tutmiin = uguudul["daily"]
negj = uguudul["daily_units"]
print("=" * 60)
print(f"{uguudul['timezone']} — 7 хоногийн мэдээ")
print("=" * 60)
print(f"{'ОГНОО':<14} {'БАГА':>8} {'ИХ':>8} {'ХУР ТУНАДАС':>14}")
print("-" * 60)
for ognoo, bag, ikh, khur in zip(
udur_tutmiin["time"],
udur_tutmiin["temperature_2m_min"],
udur_tutmiin["temperature_2m_max"],
udur_tutmiin["precipitation_sum"],
):
print(f"{ognoo:<14} {bag:>7.1f}° {ikh:>7.1f}° {khur:>10.1f} {negj['precipitation_sum']}")
print("=" * 60)============================================================
Asia/Ulaanbaatar — 7 хоногийн мэдээ
============================================================
ОГНОО БАГА ИХ ХУР ТУНАДАС
------------------------------------------------------------
2026-07-13 12.4° 26.1° 0.0 mm
2026-07-14 11.9° 24.8° 2.3 mm
2026-07-15 10.2° 22.0° 5.1 mm
2026-07-16 13.1° 25.3° 0.0 mm
2026-07-17 14.8° 27.9° 0.0 mm
2026-07-18 13.5° 26.4° 1.2 mm
2026-07-19 11.0° 23.1° 0.0 mm
============================================================zip нь ДӨРВӨН жагсаалтыг зэрэгцүүлж байна (Бүлэг 2.3-т "гурваас дээш ч болно" гэж хэлсэн).
Мөн daily_units -ээс нэгжийг авч байгааг анзаараарай — программ нь "mm" гэдгийг ХАТУУ бичээгүй, API-аас уншсан.
Бодит API-ууд нь заримдаа талбарыг ОРУУЛДАГГҮЙ. Хамгаалалт хэрэгтэй.
python
def talbar_avakh(uguudul: dict, zam: list[str], undsen=None):
odoo = uguudul
for tulkhuur in zam:
if not isinstance(odoo, dict):
return undsen
odoo = odoo.get(tulkhuur)
if odoo is None:
return undsen
return odoo
hariult = requests.get(url, params=parametruud)
uguudul = hariult.json()
temperatur = talbar_avakh(uguudul, ["current", "temperature_2m"], 0.0)
salkhi = talbar_avakh(uguudul, ["current", "wind_speed_10m"], 0.0)
baihgui = talbar_avakh(uguudul, ["current", "baihgui_talbar"], "мэдээлэлгүй")
print(f"Температур: {temperatur}")
print(f"Салхи: {salkhi}")
print(f"Байхгүй: {baihgui}")Температур: 18.7
Салхи: 8.3
Байхгүй: мэдээлэлгүйtalbar_avakh нь гүн замаар аюулгүй хандах функц. Ямар ч түвшинд талбар байхгүй бол — default утгыг буцаана.
Энэ нь хэрэгтэй, гэхдээ энгийн тохиолдолд хэт төвөгтэй. Ихэнхдээ .get() -ийн гинж хангалттай (Бүлэг 5.3):
python
temperatur = uguudul.get("current", {}).get("temperature_2m", 0.0)Бүлэг 5.3-ын хэв маяг. Хэрэв "current" байхгүй бол — хоосон dictionary буцаана, дараа нь тэр дээр .get() дуудахад default утга ирнэ.
Шинэ API-тай ажиллах эхний алхам нь КОД БИЧИХ БИШ. Тэр нь ХАРАХ.
python
import requests
import json
hariult = requests.get(url, params=parametruud)
print(f"Status: {hariult.status_code}")
print()
print(json.dumps(hariult.json(), ensure_ascii=False, indent=2))Бүтцийг НҮДЭЭРЭЭ хараарай. Дараа нь:
Ямар талбарууд байна вэ?
Тэдгээр нь үүрлэсэн үү?
Жагсаалт уу, dictionary юу?
Ямар нэрстэй вэ?
Дараа нь код бич.
Хэрэв та эхлээд код бичээд, дараа нь KeyError -тэй тулгарвал — та таамаглаж байна. Таамаглах нь цаг үрдэг.
Бүлэг 5.3-ын сургамж дахин:
"Эргэлзвэл ЗАДАЛ. Гинжийг мөр мөрөөр нь бичиж, тус бүрд
Хэрэв сонирхвол: зориудаар буруу хаяг руу хандаж, 404 -ыг өөрийн нүдээр хараарай. Дараа нь буруу параметр өгч, 400 -ыг хараарай. Дараа нь raise_for_status() нэмээд, HTTPError гарахыг хараарай.
Тэр гурван туршилт нь энэ хичээлийн бүх агуулгыг бататгана.
Мөн хүсвэл: өөр API олж (жишээ нь https://restcountries.com/v3.1/name/mongolia), эхлээд json.dumps(..., indent=2) -ээр бүтцийг ХАРААД, дараа нь өгөгдөл гаргаж авах код бичээрэй. Тэр дараалал — эхлээд хар, дараа нь бич — бол мэргэжлийн зуршил юм.
1. Status code шалгахгүй байх
python
uguudul = requests.get(url).json()
print(uguudul["current"]["temperature_2m"])KeyError: 'current'Ойлгомжгүй алдаа. Жинхэнэ асуудал нь 404 эсвэл 400 байсан. raise_for_status() ашигла.
2. raise_for_status() -ыг барихаа мартах
python
hariult.raise_for_status() # try/except БАЙХГҮЙrequests.exceptions.HTTPError: 404 Client Error: Not Found for url: ...Программ унана. Хэрэв та түүнийг ХҮСЭЖ байгаа бол — зүгээр. Хэрэв эвлэгээр зогсохыг хүсвэл — try/except.
3. except Exception гэж бүх зүйлийг барих
python
try:
...
except Exception:
print("Алдаа гарлаа")Ажиллана, гэхдээ МУУ. Тэр нь БҮХ алдааг барина — таны кодын алдаа ч оруулаад. Дараа нь та юу болсныг мэдэхгүй.
Тодорхой алдааг бари: except requests.exceptions.HTTPError.
4. 4xx ба 5xx -ыг ялгахгүй
Хоёулаа "алдаа", гэхдээ ХАРИУ ҮЙЛДЭЛ нь ӨӨР:
4xx → та засах ёстой, дахин оролдох нь утгагүй
5xx → сервер засагдана, дахин оролдох нь утгатай
5. Алдааны хариу нь JSON гэж бодох
python
shaltgaan = alda.response.json()["reason"]requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)Сервер эвдэрвэл HTML буцаана. Дотоод try/except -ээр хамгаал.
6. Бүтцийг харалгүй код бичих
KeyError -тэй байнга тулгарна. Эхлээд json.dumps(..., indent=2) -ээр ХАРААРАЙ.
requests.get() нь 404, 500 -ыг АЛДАА гэж үзэхгүй. Тэдгээр нь ХАРИУ — сервер танд ямар нэг зүйл хэлж байна.
Status code шалгахгүй бол алдаа нь ХОЛ ЗАЙД, ойлгомжгүй хэлбэрээр (KeyError) илэрнэ. Бүлэг 4.3-ын сургамж: алдааг эх сурвалж дээр нь бари.
Гурван арга:
if hariult.status_code != 200: — энгийн
if not hariult.ok: — 2xx бүгдийг зөв боловсруулна
hariult.raise_for_status() — МЭРГЭЖЛИЙН арга. 4xx/5xx бол HTTPError гаргана.
raise_for_status() -ийн давуу тал: алгасах боломжгүй, функцийн hint нь цэвэр (-> dict), дээд түвшинд барьж болно.
try/except requests.exceptions.HTTPError as alda: — эвлэгээр зохицуулах.
alda.response нь жинхэнэ Response -ыг агуулна → status_code, text, .json().
4xx vs 5xx -ыг ЯЛГА (Бүлэг 11.1):
400 <= kod < 500 → ТАНЫ буруу, параметрээ шалга
kod >= 500 → СЕРВЕРИЙН буруу, дараа дахин оролд
Алдааны хариу нь JSON БИШ байж болно → дотоод try/except requests.exceptions.JSONDecodeError.
API-гийн хариу нь ЗЭРЭГЦЭЭ ЖАГСААЛТ байж болно ({"time": [...], "max": [...]}) → zip (Бүлэг 2.3) нь тэднийг зэрэгцүүлнэ.
Талбар байхгүй байж болно → .get() -ийн гинж (Бүлэг 5.3): uguudul.get("current", {}).get("temperature_2m", 0.0).
ХАМГИЙН ЧУХАЛ ЗӨВЛӨГӨӨ: ЭХЛЭЭД ХАР, ДАРАА НЬ БИЧ.
python
print(json.dumps(hariult.json(), ensure_ascii=False, indent=2))Бүтцийг НҮДЭЭРЭЭ хараарай. Таамаглах нь цаг үрдэг.
Дараагийн хичээлээр Бүлэг 11 дуусна. Тэнд бид сүлжээний алдааг зохицуулна — эдгээр нь status code -ээс ТЭС ӨӨР төрлийн асуудал юм.
Учир нь одоохондоо бид хариу ИРСЭН гэж үзсэн. Гэвч заримдаа хариу ОГТ ирдэггүй: интернэт тасарсан, сервер унтарсан, домэйн байхгүй, эсвэл сервер хэт удаан хариулж байна. Тэр үед requests нь ӨӨР төрлийн алдаа гаргана — ConnectionError, Timeout.
Мөн тэнд би нэг ЧУХАЛ дадлыг заана: timeout= параметр. Түүнгүйгээр таны программ МӨНХӨД хүлээж болно.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.