Bu README loyihani tez tushunishingiz va ishga tushirishingiz uchun barcha muhim ma'lumotlarni o'z ichiga oladi (o'zbek tilida).
FastAPI Real-Time Chat — bu oddiy, lekin to'liq ishlaydigan chat ilovasi. U quyidagilarni o'z ichiga oladi:
- FastAPI backend (REST + WebSocket)
- Async SQLAlchemy + SQLite (aiosqlite) baza
- JWT asosida oddiy autentifikatsiya (/auth/register va /auth/login)
- WebSocket chat endpoint:
/ws/{username} - Frontend: oddiy static fayllar (
app/static/index.html,script.js,style.css)
Loyihaning maqsadi — real vaqt chat va autentifikatsiya misolini ko'rsatish, shuningdek WebSocket va async DB ishlashini namoyish qilish.
- Ro'yxatga olish va kirish (bcrypt bilan parol xeshlash)
- JWT token bilan autentifikatsiya (frontend tokenni saqlaydi)
- WebSocket orqali xabarlarni jo'natish va qabul qilish
- Xabarlarni SQLite bazasiga saqlash
- Python 3.10+ (yoki 3.11/3.12 mos muhit)
- FastAPI
- Uvicorn (ASGI server)
- SQLAlchemy (async)
- aiosqlite
- passlib / bcrypt (parol xeshlash uchun)
- python-jose (JWT)
requirements.txt
app/
main.py
core/
database.py
init_db.py
security.py
manager.py
state.py
models/
__init__.py
message.py
routers/
chat.py
auth.py
static/
index.html
script.js
style.css
scripts/
test_password.py
README.md
Windows PowerShell misoli:
- Python (3.10+ tavsiya etiladi)
- virtualenv yoki venv
Quyidagi amallarni PowerShell oynasida bajarish tavsiya etiladi (repo root bilan):
- Virtual muhit yaratish va faollashtirish
python -m venv venv
# PowerShell-da:
.\venv\Scripts\Activate.ps1
# Agar cmd.exe ishlatayotgan bo'lsangiz:
# .\venv\Scripts\activate- Kerakli paketlarni o'rnatish
pip install -r requirements.txt- Bazani yaratish (birinchi marta yoki schema o'zgarganda)
python -m app.core.init_dbBu chat.db faylini loyihaning ildizida yaratadi va kerakli jadvalarni qo'shadi.
- Serverni ishga tushirish
python -m uvicorn app.main:app --reload
# yoki
uvicorn app.main:app --reloadKeyin brauzerda http://127.0.0.1:8000/ ni oching. Frontend sahifasi app/static/index.html bo'ladi.
- Ro'yxatdan o'tish
- Endpoint:
POST /auth/register - Body (JSON):
{
"username": "foydalanuvchi",
"password": "sizning_parolingiz"
}Parol bcrypt cheklovi sabab 72 baytdan (bytes) uzun bo'lmasligi kerak — frontend va backend bu cheklovni tekshiradi.
- Kirish
- Endpoint:
POST /auth/login - Body (JSON): xuddi
registerkabi - Javob: access token (JWT)
Frontend tokenni localStorage-ga saqlaydi va WebSocket-ga username orqali ulanadi.
- WebSocket
- Endpoint:
ws://localhost:8000/ws/{username} - Masalan:
ws://localhost:8000/ws/samandar - WebSocket orqali yuborilgan xabarlar serverda saqlanadi va barcha hozirgi ulashgan mijozlarga broadcast qilinadi.
Eslatma: hozirgi implementatsiyada WebSocket autentifikatsiyasi token asosida emas — bu keyingi takomillashtirish bo'lishi mumkin (token tekshiruvi, cookie yoki subprotocol orqali yuborish).
app/core/security.pyfaylidaSECRET_KEYo'rnatilgan. Ishlab chiqarishda bu qiymatni.envfaylga yoki muhit o'zgaruvchilariga ko'chiring va loyihapython-dotenvyordamida .env-ni yuklasin.- HTTPS/SSL: ishlab chiqarishda HTTPS bilan joylashtiring.
- CORS: agar frontend boshqa domen/portda bo'lsa, CORS sozlamalarini qo'shing.
- Parol cheklovi: bcrypt algoritmi 72 bayt limitiga ega — bu bilan hisoblashda e'tiborli bo'ling.
-
ValueError: password cannot be longer than 72 bytes
- Sabab: bcrypt cheklovi. Yechim: parolni 72 baytdan kichik qilib yuboring yoki serverda inputni qirqing (emas, tavsiya etilmaydi). Loyihada frontend va backendda bu tekshirish qo'yilgan.
-
passlib / bcrypt versiya xatolari
- Agar
passlibvabcryptkutubxonalari orasida mos kelmaslik bo'lsa,requirements.txtfaylida mos versiyalar ko'rsatilgan. Virtual muhitni yangilang vapip install -r requirements.txtqiling.
- Agar
-
Circular import (ImportError: cannot import name 'manager')
- Buni hal qilish uchun global
managerobyektiapp/core/state.pyda saqlanadi. Agar shu xato chiqsa, fayllarni tahrir qilinganligiga vastate.pymavjudligiga ishonch hosil qiling.
- Buni hal qilish uchun global
-
WebSocket: Unexpected ASGI message 'websocket.send', after sending 'websocket.close'
- Buning sababi: websocket holati allaqachon yopilgan yoki xabar yuborishda xato yuz berdi. Loyihada broadcast va connect metodlari tozalandi va xatolar uchun exception handling qo'shildi.
-
Coroutine was never awaited warning for DB session
- Buning sababi sync/async session aralash ishlatish. Chat router uchun
AsyncSessionvaasync with SessionLocal()ishlatiladi. Agar bu warning ko'rinsa,app/routers/chat.pyfaylini tekshiring.
- Buning sababi sync/async session aralash ishlatish. Chat router uchun
- Parol hashing testini ishlatish:
python scripts/test_password.pyBu oddiy test parolni hash qiladi va 72 bayt chegarasini tekshiradi.
- DB jadvalini tekshirish (skript):
python scripts/list_tables.pyBu chat.db dagi jadvallar ro'yxatini chop etadi.
- WebSocket autentifikatsiyasini qo'shish (JWT ni WebSocket ulanishiga yuborish va serverda tekshirish)
- Alembic yordamida migratsiyalar qo'shish (havo o'zgartirishlar uchun)
- Yagona frontendi va prod deploy (Dockerfile, gunicorn/uvicorn + nginx)
- Testlarni kengaytirish (pytest — unit va integratsion testlar)
- Virtual muhitni yaratish va faollashtirish
pip install -r requirements.txtpython -m app.core.init_dbpython -m uvicorn app.main:app --reload- Brauzerda
http://127.0.0.1:8000/oching va chatni sinab ko'ring
Loyiha MIT litsenziyasi ostida mavjud (ko'proq ma'lumot LICENSE faylida).
Agar README ga qo'shimcha bo'limlar yoki tarjima uslubi bo'yicha o'zgarishlar kerak bo'lsa, ayting — men kerakli o'zgartirishlarni kiritaman.