Ачааллж байна...
Энэ сургалт олон зүйлийг заагаагүй.
Бүлэг 1-ийн Хичээл 1-т би тэдгээрийн заримыг нэрлэсэн: жинхэнэ хэрэглэгчийн нэвтрэлт, алхам алхмын deployment, том өгөгдлийн сан. Сургалтын явцад бас нэмэгдсэн: migration, тест, background task, frontend, WebSocket.
Эдгээр нь дутагдал биш. Сургалт бүр хилтэй байх ёстой; хилгүй сургалт нь хэзээ ч дуусдаггүй бөгөөд хэнд ч тус болдоггүй. Энэ сургалт нэг тодорхой зорилготой байсан: Python мэддэг хүнийг бодит API бүтээж чаддаг болгох. Тэр зорилго биелсэн.
Одоо тэдгээр хилийн цаана юу байгааг харцгаая. Энэ хичээл нь газрын зураг юм. Тус бүрийг гүнзгий заахгүй — юу болох, яагаад хэрэгтэй, хаанаас эхлэхийг тайлбарлана.
Мөн хамгийн чухал нь: аль нь танд хэрэгтэйг сонгоход туслах чиглэл өгнө. Бүгдийг нь сурах шаардлагагүй — хэн ч бүгдийг мэддэггүй.
Энэ жагсаалтыг уншаад "би маш их зүйл мэдэхгүй юм байна" гэж бодох нь байгалийн. Тэр мэдрэмжийг урьдчилан таньж байх нь зүйтэй.
Программ хангамжид сурах зүйл хязгааргүй байдаг. Хорин жилийн туршлагатай хөгжүүлэгч ч өдөр бүр шинэ зүйлтэй тааралддаг. Тэр нь мэргэжлийн шинж чанар юм, дутагдал биш.
Тиймээс дүрэм: нэг зүйлийг сонго, түүнийг гүйцээ, дараа нь дараагийнх руу.
Бүх зүйлийг зэрэг эхлэх нь юу ч дуусгахгүйд хүргэдэг. Нэг зүйлийг гүйцээх нь итгэл өгдөг, мөн дараагийнх нь илүү хялбар болгодог.
Аль нэгийг хэрхэн сонгох вэ? Таны дараагийн төсөлд юу хэрэгтэй байна вэ? Тэр л хамгийн сайн шалгуур. Хийсвэрээр сурсан зүйл мартагддаг; ажилд хэрэглэсэн зүйл үлддэг.
Юу дутуу байна вэ
Таны API-д API key байна. Тэр нь "чи зөвшөөрөгдсөн программ мөн үү" гэдгийг шалгадаг.
Гэхдээ "чи хэн бэ" гэдгийг шалгадаггүй. Бүх хэрэглэгч нэг түлхүүр хуваалцдаг. Тиймээс:
"Энэ бол миний тэмдэглэл, тэр бол таных" гэсэн ойлголт байхгүй.
Хэрэглэгч бүр бусдын өгөгдлийг харж, засаж чадна.
Хэн үйлдэл хийснийг мэдэх арга байхгүй.
Бодит программ ийм байж болохгүй.
Юу сурах вэ
Нууц үг хадгалах. Нууц үгийг хэзээ ч ил хадгалдаггүй. Оронд нь hash хийдэг — буцаагаад тайлж болохгүй хувиргалт. Хэрэглэгч нэвтрэхэд оруулсан нууц үгийг дахин hash хийж, хадгалсантай харьцуулдаг. Python-д passlib эсвэл bcrypt сан ашигладаг.
JWT (JSON Web Token). Хэрэглэгч нэвтэрсний дараа сервер түүнд token өгдөг — шифрлэгдсэн текст, дотор нь "энэ бол хэрэглэгч 42, эрх нь ийм, хугацаа нь тийм" гэсэн мэдээлэл. Дараагийн хүсэлт бүрд хэрэглэгч тэр token-ыг илгээдэг.
OAuth2. Стандарт протокол. FastAPI түүнийг сайн дэмждэг — OAuth2PasswordBearer гэсэн хэрэгсэлтэй.
Эрхийн ялгаа. Энгийн хэрэглэгч, админ, номын санч — тус бүр өөр эрхтэй. Dependency-д "энэ хэрэглэгч админ мөн үү" гэж шалгадаг.
Таны мэдлэг хэрхэн хэрэглэгдэх вэ
Depends нь энд гол үүрэгтэй. get_current_user гэсэн dependency бичнэ — тэр нь token уншиж, хэрэглэгчийг олж, буцаана. Дараа нь endpoint бүр user: User = Depends(get_current_user) гэж бичнэ.
Бүлэг 8-ын API key dependency-тэй яг ижил загвар, зөвхөн илүү нарийн.
Хэзээ хэрэгтэй вэ
Хэрэглэгч бүр өөрийн өгөгдөлтэй байх ёстой бол заавал. Тэмдэглэлийн апп, олон нийтийн сүлжээ, дэлгүүр — бүгд.
Хэрэггүй: дотоод хэрэгсэл, олон нийтийн уншилтын API, ганц хэрэглэгчийн систем.
Хаанаас эхлэх вэ
FastAPI-ийн албан ёсны баримт бичигт Security гэсэн бүрэн хэсэг байдаг — алхам алхмаар, ажиллах жишээтэй. Тэр бол хамгийн сайн эхлэл.
Хүндрэлийн түвшин: дунд-өндөр. Нэлээд шинэ ойлголт байна.
Юу дутуу байна вэ
Бүлэг 10-ын Хичээл 2-т SQLite-ийн хязгаарыг ярьсан: нэг сервер, хязгаарлагдмал зэрэг бичилт, хэрэглэгчийн эрхгүй.
Бүлэг 15-ын Хичээл 1-т deployment-ийн эрсдэлийг нэмсэн: файл алга болж болно.
Юу сурах вэ
PostgreSQL суулгах, тохируулах. Эсвэл үүлэн үйлчилгээ ашиглах (олон нь үнэгүй эхлэлтэй).
Холболтын мөр. postgresql://хэрэглэгч:нууц@хаяг:порт/өгөгдлийн_сан.
Connection pool. PostgreSQL-д холболт үүсгэх нь зардалтай тул тэдгээрийг дахин ашигладаг. SQLAlchemy үүнийг автоматаар хийдэг, гэхдээ тохируулга мэдэх нь зүйтэй.
Index. Бүлэг 10-т дурдсан. Том хүснэгтэд хайлт хурдасгахын тулд index үүсгэдэг. SQLModel-д Field(index=True).
Таны мэдлэг хэрхэн хэрэглэгдэх вэ
Бараг бүгд хэвээр. SQLModel нь хоёуланд ажилладаг. Таны model, session, select, where — бүгд ижил.
Шилжилт нь ойролцоогоор:
pip install psycopg2-binary (драйвер)
.env-ийн DATABASE_URL-ыг өөрчлөх
create_all ажиллуулж хүснэгт үүсгэх
Кодод бараг гар хүрэхгүй. Бүлэг 12-т "endpoint нь engine-ээс салсан" гэж ярьсны шагнал.
Хэзээ хэрэгтэй вэ
Бодит хэрэглэгчидтэй болвол. Ялангуяа олон хүн зэрэг ханддаг бол.
Хэрэггүй: ганц хэрэглэгчийн хэрэгсэл, prototype, суралцах төсөл.
Хүндрэлийн түвшин: бага-дунд. Ойлголт нь ижил, зөвхөн тохируулга нэмэгдэнэ.
Юу дутуу байна вэ
Бүлэг 11-ийн Хичээл 2-т бид дүрэм тогтоосон: model өөрчлөх бүрд .db файлыг устгах.
Тэр нь сурч байхад зүгээр. Гэхдээ бодит системд боломжгүй — өгөгдөл устна.
Бодит асуудал: таны API ажиллаж байна, мянган ном бүртгэгдсэн. Одоо Book model-д publisher талбар нэмэх шаардлагатай. Яах вэ?
Файлыг устгах? Мянган ном алга болно.
Гараар SQL бичих? Эрсдэлтэй, давтагдашгүй.
Юу сурах вэ
Alembic — Python-ы стандарт migration хэрэгсэл, SQLAlchemy-ийн зохиогчийн бүтээл.
Санаа нь: өгөгдлийн сангийн бүтцийн өөрчлөлт бүрийг файлд бичиж, дараалан хэрэглэх.
Migration файл ойролцоогоор ийм харагдана:
python
def upgrade():
op.add_column("book", sa.Column("publisher", sa.String()))
def downgrade():
op.drop_column("book", "publisher")upgrade — өөрчлөлт хийх. downgrade — буцаах.
Alembic таны model-ыг харж, өгөгдлийн сантай харьцуулж, migration-ыг автоматаар үүсгэж чаддаг. Дараа нь та түүнийг шалгаж, засаж, ажиллуулна.
Таны мэдлэг хэрхэн хэрэглэгдэх вэ
Alembic нь таны SQLModel-ын model-ыг уншдаг. Тиймээс model бичих чадвар шууд ашиглагдана.
Мөн Бүлэг 10-ын SQL мэдлэг тустай — migration файлууд SQL-тэй ойролцоо ажиллагаатай.
Хэзээ хэрэгтэй вэ
Бодит өгөгдөлтэй систем ажиллаж эхэлмэгц. Өгөгдөл алдагдах боломжгүй болмогц.
Хэрэггүй: суралцах төсөл, prototype, өгөгдөл нь чухал биш бол.
Хүндрэлийн түвшин: дунд. Ойлголт нь энгийн, тохируулга нь бага зэрэг нарийн.
Юу дутуу байна вэ
Та API-гаа гараар туршсан. /docs дээр товшиж, хариуг харж, зөв эсэхийг шалгасан.
Тэр нь ажилладаг — гэхдээ давтагдахгүй. Хэрэв та код өөрчилвөл бүх зүйлийг дахин гараар шалгах ёстой. Арван гурван endpoint, дүрэм бүр — хагас цаг.
Практикт хүмүүс бүгдийг шалгадаггүй. Тиймээс алдаа нэвчдэг.
Юу сурах вэ
pytest — Python-ы стандарт тестийн хэрэгсэл.
TestClient — FastAPI-ийн хэрэгсэл, сервер асаалгүйгээр endpoint-ыг дуудна.
Тест ойролцоогоор ийм харагдана:
python
def test_borrow_book():
response = client.post(
"/loans/borrow",
json={"book_id": 1, "member_id": 1},
headers={"X-API-Key": "тест-түлхүүр"},
)
assert response.status_code == 201
assert response.json()["returned_at"] is Noneassert — "энэ үнэн байх ёстой". Хэрэв худал бол тест унана.
Тестийн өгөгдлийн сан. Тест нь бодит өгөгдөлд гар хүрэх ёсгүй. Ихэвчлэн санах ойн SQLite ашигладаг: sqlite:// (файлгүй).
Энд dependency-ийн жинхэнэ шагнал гарч ирнэ. Бүлэг 12-ын Хичээл 1-т би "тестэд өөр get_session өгч болно" гэж дурдсан. Яг тэр:
python
app.dependency_overrides[get_session] = get_test_sessionНэг мөрөөр бүх endpoint тестийн өгөгдлийн сан руу шилжинэ. Endpoint-ууд мэдэхгүй.
Энэ бол dependency injection-ийн хамгийн тод ашиг юм.
Таны мэдлэг хэрхэн хэрэглэгдэх вэ
Тест бичихийн тулд та API-гаа сайн мэдэх ёстой — ямар status code, ямар хариу, ямар дүрэм. Та тэдгээрийг бүгдийг мэднэ.
Capstone-ийн зургаан дүрэм бүр нэг тест болно.
Хэзээ хэрэгтэй вэ
Төсөл өсөхөд. Хэдэн зуун мөр код болмогц гараар шалгах боломжгүй болно.
Багаар ажиллахад. Бусдын өөрчлөлт таны кодыг эвдээгүй эсэхийг тест хэлнэ.
Хэрэггүй: нэг удаагийн скрипт, маш жижиг төсөл.
Хүндрэлийн түвшин: бага-дунд. Эхлэхэд амархан, гүнзгийрүүлэхэд урлаг.
Миний зөвлөгөө: энэ бол хамгийн их үнэ цэнэтэй дараагийн алхам. Тест бичиж сурах нь таныг хамгийн хурдан илүү сайн хөгжүүлэгч болгоно.
Юу дутуу байна вэ
Таны бүх endpoint шууд хариу өгдөг. Гэхдээ зарим ажил удаан байдаг:
Имэйл илгээх
Тайлан үүсгэх
Зураг боловсруулах
Гадаад API руу олон дуудлага хийх
Хэрэглэгч тэдгээрийг хүлээх ёсгүй.
Жишээ: гишүүн ном зээлэхэд имэйл илгээх ёстой. Имэйл илгээх нь хоёр секунд авдаг. Хэрэглэгч хоёр секунд хүлээх үү? Утгагүй — зээл аль хэдийн бүртгэгдсэн.
Юу сурах вэ
FastAPI-ийн BackgroundTasks — хамгийн энгийн шийдэл. Хариу илгээсний дараа ажиллах функц зааж өгнө:
python
from fastapi import BackgroundTasks
@router.post("/borrow")
def borrow_book(request: BorrowRequest, background_tasks: BackgroundTasks, ...):
# ... зээл үүсгэх ...
background_tasks.add_task(send_email, member.email, book.title)
return loanХэрэглэгч шууд хариу авна; имэйл дараа нь илгээгдэнэ.
Celery эсвэл ARQ — илүү нарийн шийдэл. Ажлыг тусдаа процесс ажиллуулна. Хэрэв сервер унавал ажил алдагдахгүй, дахин оролдоно.
Хэзээ хэрэгтэй вэ
Удаан ажил байвал. Имэйл, тайлан, боловсруулалт.
BackgroundTasks хангалттай: энгийн, богино ажил.
Celery хэрэгтэй: чухал ажил (алдагдвал ноцтой), удаан ажил (минут), давтагдах ажил (өдөр бүр).
Хүндрэлийн түвшин: BackgroundTasks — бага. Celery — өндөр.
Юу дутуу байна вэ
Таны API-д нүүр царай байхгүй. /docs бол хөгжүүлэгчид зориулагдсан, энгийн хэрэглэгчид биш.
Номын санч /docs дээр JSON бичиж ном нэмэх үү? Мэдээж үгүй. Түүнд товч, маягт, хүснэгттэй хуудас хэрэгтэй.
Юу сурах вэ
Энэ бол бүхэл өөр ертөнц. Гурван түвшин байдаг.
Түвшин 1: HTML, CSS, JavaScript. Суурь. HTML нь бүтэц, CSS нь харагдац, JavaScript нь зан төлөв. Эдгээргүйгээр цааш явах боломжгүй.
Түвшин 2: Framework. React, Vue, Svelte — тэдгээр нь том, нарийн интерфейс барихад тусалдаг. React хамгийн түгээмэл.
Түвшин 3: Meta-framework. Next.js, Nuxt, SvelteKit — эдгээр нь framework дээр нэмэлт (routing, server rendering) өгдөг.
Таны мэдлэг хэрхэн хэрэглэгдэх вэ
Frontend нь таны API руу fetch хийнэ. Тэр нь Курс 2-ын requests-тэй ижил санаа, зөвхөн JavaScript-ээр.
Бүлэг 13-ын CORS тохиргоо энд шаардлагатай болно — тэр яг үүнд зориулагдсан.
Мөн та API-ийн талаас бүх зүйлийг мэднэ: ямар endpoint байна, ямар өгөгдөл ирнэ, ямар алдаа гарна. Frontend бичихэд тэр мэдлэг маш чухал.
Хэзээ хэрэгтэй вэ
Хүн шууд ашиглах программ бүтээх бол.
Хэрэггүй: зөвхөн бусад программд зориулсан API, дотоод хэрэгсэл.
Хүндрэлийн түвшин: өндөр — учир нь энэ нь шинэ хэл, шинэ ойлголтууд, өөр сэтгэлгээ.
Шударга зөвлөгөө: хэрэв танд frontend хэрэгтэй бол энгийн HTML болон JavaScript-ээс эхэл, шууд React руу бүү үсэр. Бүлэг 13-ын test_cors.html шиг жижиг хуудас бичиж, API-даа хандаж үзээрэй. Тэр нь суурь ойлголт өгнө.
Дараах зүйлсийг зөвхөн нэрлэж, товч тайлбарлая. Эдгээр нь илүү тусгай хэрэгцээнд зориулагдсан.
WebSocket — хоёр талын байнгын холболт. Чат, шууд мэдэгдэл, тоглоомд хэрэгтэй. HTTP нь "асуулт-хариу"; WebSocket нь "яриа". FastAPI дэмждэг.
Caching (Redis) — байнга ашиглагддаг өгөгдлийг санах ойд хадгалж, өгөгдлийн санд дахин дахин хандахгүй байх. Ачаалал ихтэй API-д хурдыг эрс нэмэгдүүлдэг.
Rate limiting — нэг хэрэглэгч хэт олон хүсэлт илгээхээс сэргийлэх. Халдлагаас хамгаалдаг. slowapi гэсэн сан бий.
File upload — зураг, файл хүлээж авах. FastAPI-д UploadFile бий. Дараа нь хаана хадгалах вэ (сервер дээр эсвэл үүлэнд) гэсэн асуулт гарна.
Logging — print биш, зохион байгуулалттай log. Python-ы logging модуль. Production-д заавал.
Docker — Бүлэг 15-ын Хичээл 1-т дурдсан. Программыг хайрцаглаж, хаана ч ижилхэн ажиллуулна.
GraphQL — REST-ийн өөр хувилбар. Нэг endpoint, хэрэглэгч юу хүсэхээ өөрөө заадаг. Тодорхой тохиолдолд ашигтай.
SQL гүнзгий — JOIN, GROUP BY, index, оновчлол. Бүлэг 10-т бид зөвхөн үндсийг үзсэн. Том өгөгдөлтэй ажиллах бол гүнзгий SQL нь маш үнэ цэнэтэй.
SQLModel Relationship — Бүлэг 14-т бид book_id ашиглан гараар холбосон. Relationship нь loan.book гэж шууд хандах боломж өгдөг.
Одоо практик зөвлөгөө. Аль нь танд хэрэгтэй вэ?
Хэрэв та ажилд орох бол
Тест — бараг бүх компани шаарддаг. Хамгийн өндөр өгөөжтэй.
PostgreSQL — SQLite production-д ховор.
Git — хэрэв хараахан сураагүй бол заавал. Энэ бол хамгийн үндсэн хэрэгсэл.
Docker — олон компанид стандарт.
Auth — олон төсөлд шаардлагатай.
Хэрэв та өөрийн бүтээгдэхүүн хийх бол
Auth — хэрэглэгчидтэй бол заавал.
Frontend — хүн ашиглах бол заавал.
Deployment — интернэтэд гаргах бол заавал.
Migration — өгөгдөл чухал болмогц.
Хэрэв та зүгээр л сурах хүсэлтэй бол
Тест — таны кодыг сайжруулна, шинэ ойлголт бага.
SQL гүнзгий — өргөн хэрэглэгддэг, хаана ч ашигтай.
Энгийн frontend — өөр өнцгөөс харах боломж өгнө.
Хэдэн практик зөвлөгөө өгье. Эдгээр нь энэ сургалтын бус, ерөнхий сургалтын тухай.
1. Албан ёсны баримт бичгээс эхэл
Курс 2-ын Бүлэг 15-т сурсан мета ур чадвар. FastAPI, SQLModel, pytest — бүгд маш сайн баримт бичигтэй.
Блог, видео нь тустай боловч хуучирдаг. Албан ёсны баримт бичиг нь шинэчлэгддэг.
2. Жижиг төсөл дээр сур
"React сурах" гэхээс "тэмдэглэлийн апп-даа frontend хийх" гэсэн зорилго илүү сайн. Тодорхой зорилготой сургалт илүү үлддэг.
3. Одоо байгаа кодоо сайжруул
Танд Тэмдэглэлийн API болон Номын сангийн API байна. Тэдгээрт нэмэлт хийх нь шинээр эхлэхээс илүү үр дүнтэй.
Тест нэмээрэй. Auth нэмээрэй. PostgreSQL руу шилжүүлээрэй. Тус бүр нь бодит дасгал бөгөөд ажиллах үр дүн өгнө.
4. Алдаанаас бүү ай
Энэ сургалтад бид олон алдаа зориудаар үүсгэсэн. Тэр нь санамсаргүй биш — алдаа бол хамгийн сайн багш.
Шинэ зүйл сурахад алдаа гарна. Алдааны мессежийг уншиж, ойлгож, засах чадвар нь бүх програмчлалын үндэс юм.
5. Хурдны талаар бүү санаа зов
"Би удаан сурч байна" гэсэн бодол бол хамгийн ашиггүй бодол. Хүн бүр өөр хурдтай.
Курс 1-ийн эхэнд хэлсэн зүйл эцэс хүртэл үнэн: аль ч хурд бол зөв хурд юм.
Сүүлийн зөвлөгөө, магадгүй хамгийн ашигтай нь.
Бүх framework сурах шаардлагагүй. Django, Flask, FastAPI — гурвуулаа сурах хэрэггүй. Нэгийг сайн мэдэх нь гурвыг өнгөцхөн мэдэхээс дээр.
Хамгийн шинэ хэрэгсэл хөөх шаардлагагүй. Технологийн ертөнцөд сар бүр шинэ зүйл гарч ирдэг. Ихэнх нь хоёр жилийн дараа алга болдог. Тогтвортой, өргөн ашиглагддаг хэрэгслүүд илүү үнэ цэнэтэй.
Бүх зүйлийг цээжлэх шаардлагагүй. Хөгжүүлэгчид өдөр бүр баримт бичиг уншдаг. Синтакс цээжлэх биш, ойлголт ойлгох нь чухал.
Бүх зөвлөгөөг дагах шаардлагагүй. Интернэтэд зөрчилдсөн зөвлөгөө маш их байдаг. Таны нөхцөлд юу ажиллаж байна, тэр нь зөв.
Энэ сургалтын хилүүд нь дутагдал биш, дараагийн алхмууд.
Нэг зүйлийг сонго, гүйцээ, дараа нь дараагийнх руу. Бүгдийг зэрэг эхлэх нь юу ч дуусгахгүй.
Auth (OAuth2/JWT) — "чи хэн бэ" гэдгийг шалгах. Depends загвар ижил хэвээр. Хэрэглэгч бүр өөрийн өгөгдөлтэй бол заавал.
PostgreSQL — production-ийн стандарт. Шилжилт нь DATABASE_URL өөрчлөх ажил; кодод бараг гар хүрэхгүй.
Migration (Alembic) — өгөгдөл алдалгүйгээр бүтэц өөрчлөх. Бодит өгөгдөлтэй болмогц заавал.
Тест (pytest + TestClient) — хамгийн өндөр өгөөжтэй дараагийн алхам. dependency_overrides нь dependency injection-ийн жинхэнэ шагнал.
Background task — удаан ажлыг хариунаас салгах. BackgroundTasks энгийн, Celery нарийн.
Frontend — өөр ертөнц. Энгийн HTML/JS-ээс эхэл, шууд React руу бүү үсэр. CORS энд хэрэгтэй болно.
Бусад: WebSocket, Redis, rate limiting, file upload, logging, Docker, GraphQL, SQL гүнзгий, Relationship.
Сурах арга: албан ёсны баримт бичиг, жижиг төсөл, байгаа кодоо сайжруулах, алдаанаас бүү ай.
Сурах шаардлагагүй: бүх framework, хамгийн шинэ хэрэгсэл, цээжлэх, бүх зөвлөгөө.
Газрын зураг зурагдлаа. Та хаана байгаа, хаашаа явж болохоо мэдэж байна.
Дараагийн хичээл бол сүүлчийнх. Тэнд бид код бичихгүй, шинэ зүйл сурахгүй. Оронд нь гурван сургалтын аяныг эргэн харна: print("Сайн байна уу") гэсэн эхний мөрөөс өгөгдлийн сантай, хамгаалалттай, баримтжуулагдсан вэб API хүртэлх зам. Та тэр замыг бүхэлд нь туулсан бөгөөд түүнийг тоймлон харах нь зүйтэй.
Бүртгэлтэй болсноор энэ сургалтын бүх хичээлд хандах эрх авна.