Roadmap’imin 2. haftasında FastAPI ile /register ve /login
endpoint’lerini yazarken birkaç hata yaptım.
Bunları ve nasıl çözdüğümü paylaşıyorum.
hashed_pw = hash_password(user.password)
verify = verify_password(user.password, hashed_pw)
Kullanıcının girdiği şifreyi tekrar hash’leyip
girdiği şifreyle karşılaştırıyordum.
Bu her zaman True döner — şifre yanlış olsa bile.
verify = verify_password(user.password, existing_user.hashed_password)
Veritabanındaki hash’i alıp onunla karşılaştırmak gerekiyor.
verify_password içinde zaten hash’leme yapılıyor.
@app.get("/login")
def login(user: UserRegister, ...):
Şifre URL’de görünür hale gelir. Tarayıcı geçmişi, sunucu logları, her yerde saklanır.
@app.post("/login")
def login(user: UserRegister, ...):
Şifre gibi hassas veriler her zaman POST ile body’de gitmeli.
existing_user = get_user_by_email(db, user.email)
verify = verify_password(user.password, existing_user.hashed_password)
existing_user None dönerse None.hashed_password
diyince uygulama crash olur.
if not existing_user:
raise HTTPException(status_code=404, detail="Email bulunamadı")
if not verify_password(user.password, existing_user.hashed_password):
raise HTTPException(status_code=401, detail="Yanlış şifre")
Önce email kontrolü, sonra şifre kontrolü.
raise HTTPException fonksiyonu durdurur,
sonraki satır çalışmaz.
bool verify = ...bool verify = verify_password(user.password, hashed_pw)
C++ geçmişimden gelen bir alışkanlık. Python’da tip bildirimi bu şekilde yapılmıyor.
verify = verify_password(user.password, hashed_pw)
Python’da tip belirtmek zorunlu değil.
İstersen verify: bool = ... yazabilirsin ama zorunlu değil.
models/user.py içinde hem Pydantic hem SQLAlchemy modeli vardı:
# Aynı dosyada ikisi birden — yanlış
class User(Base): # SQLAlchemy
...
class UserRegister(BaseModel): # Pydantic
...
Import sırasında Python ikisini karıştırınca
ImportError aldım.
İkisini ayır:
models/models.py → SQLAlchemy modelleri (User, Todo)models/user.py → Pydantic modelleri (UserRegister)SQLAlchemy modeli = veritabanı tablosu
Pydantic modeli = API’ye gelen verinin şekli
verify_password veritabanındaki hash ile karşılaştırır,
yeni hash üretmez