---
name: python-backend-review
description: Python backend (FastAPI / Django / DRF / Celery / Channels) review — async hijyeni, type, ORM, güvenlik, test.
---

# Python Backend Review

## Ortak Doktrin

`agents/shared/severity-rubric.md` ve `agents/shared/escalation-matrix.md` default-load
sayılır (`agents/coordination.md` §11). Bu skill'in çıktısı **Critical / High / Medium /
Low + kanıt** formatında olmak zorunda — spekülatif Critical yasak. Sahiplik dışı bulgu
ilgili agent'a delege; karar yetkisi eşiği aşılırsa **kullanıcı onayı zorunlu**.

## Ne Zaman Kullanılır
- PR review öncesi self-check
- Performans regresyonu
- Yeni endpoint
- Async migration

## Workflow
1. **Statik tara**
   - `ruff check`, `mypy --strict` veya `pyright`
   - `pip-audit` / `safety`
2. **Async kontrol**
   - Async fn içinde sync I/O? (`requests`, `psycopg2` sync, `time.sleep`)
   - `asyncio.gather` exception handling
   - CPU-bound iş executor'da mı
3. **ORM/DB**
   - SQLAlchemy: N+1 (`selectinload`/`joinedload`), transaction kapsamı
   - Django ORM: `select_related`/`prefetch_related`; `nplusone`/`silk` çıktısı; `.only()/.defer()`; `.iterator()` büyük export
   - Migration güvenliği (RunPython reverse, AddIndexConcurrently)
4. **API**
   - FastAPI: Pydantic v2 strict, response_model explicit, dependency-injected auth
   - Django/DRF: Serializer.Meta.fields explicit (`'__all__'` yasak prod), permission_classes default deny, pagination + throttle
   - Async view (Django 4.1+): `sync_to_async(thread_sensitive=True)` blocking ORM çağrılarında
5. **Logging/Hata**
   - structlog/JSON
   - PII redact
   - `logger.exception` except içinde
   - Django: `LOGGING` config + `django.request` ERROR; sentry-sdk `DjangoIntegration`
6. **Background Job (Celery)**
   - Task idempotent + `acks_late=True` + `time_limit` + `autoretry_for` + `retry_backoff`
   - Result backend gerçekten kullanılıyor mu (kullanılmıyorsa kapat)
   - Beat schedule kaynak kontrolü (`django-celery-beat` DB schedule vs settings)
7. **Channels (Django WS)** bkz: `websocket-realtime-systems` skill
8. **Test**
   - pytest-asyncio (FastAPI)
   - pytest-django + factory_boy + testcontainers Postgres (Django)
   - httpx in-process (FastAPI) / DRF `APIClient` (DRF)

## Checklist
- [ ] Type hint public fn
- [ ] Pydantic strict
- [ ] Async handler blocking-free
- [ ] DB session dependency-injected
- [ ] N+1 yok (eager load)
- [ ] Pagination cursor/limit
- [ ] PII log redacted
- [ ] Test fresh DB
- [ ] Dep pinned + audited

## Antipattern
- `requests` async handler içinde
- `time.sleep` async'te
- `except Exception: pass`
- `eval`/`exec` user input
- Mutable default arg
- Global ORM session
- Sync ORM (sqlalchemy classic) + FastAPI async stack
- `from x import *`
- Django: `DEBUG=True` prod, `ALLOWED_HOSTS=['*']`, `Serializer(fields='__all__')`, `Model.objects.raw(f"... {user_input}")`, view içinde N+1 loop, `signals` içinde DB write zinciri (test edilmez), Celery task içinden senkron HTTP (timeout yok)

## Örnek Agent Davranışı
```
User: /python-review services/api/app/routes/orders.py
Agent:
1. Read file
2. Detect: async def get_orders -> requests.get (blocking)
3. Detect: db.query(Order).all() pagination yok
4. Detect: type hint eksik 2 fn
5. Detect: tests/api/test_orders.py cancel path yok
6. Output rapor + diff (httpx, yield_per/limit, type hint, test stub)
```

## Çıktı Formatı
```markdown
# Python Review: <path>

## Critical/High/Medium/Low
## Diff (özet)
## Test eksiği
```
