create project

This commit is contained in:
2026-07-16 16:06:22 +03:00
parent 0a81898f29
commit a8a18abf30
10 changed files with 256 additions and 8 deletions
+71 -7
View File
@@ -1,9 +1,73 @@
from fastapi import FastAPI
from fastapi import FastAPI, Depends, HTTPException, status
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
# Создаем само приложение
app = FastAPI()
from app.db import engine, Base, get_db
from app.models import User
from app.schemas import UserCreate, UserOut, Token
from app.auth import hash_password, verify_password, create_access_token
# Вешаем обработчик на главную страницу
@app.get("/")
def read_root():
return {"message": "Hello, world!"}
app = FastAPI(title="FastAPI JWT Auth Example")
# ---------------------------------------------------------
# Создать таблицы при запуске (для SQLite)
# ---------------------------------------------------------
@app.on_event("startup")
async def startup():
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
# ---------------------------------------------------------
# Регистрация
# ---------------------------------------------------------
@app.post("/register", response_model=UserOut)
async def register(user_in: UserCreate, db: AsyncSession = Depends(get_db)):
query = select(User).where(User.email == user_in.email)
result = await db.execute(query)
existing_user = result.scalar_one_or_none()
if existing_user:
raise HTTPException(status_code=400, detail="Email already exists")
user = User(
email=user_in.email,
hashed_password=hash_password(user_in.password),
role=user_in.role
)
db.add(user)
await db.commit()
await db.refresh(user)
return user
# ---------------------------------------------------------
# Логин
# ---------------------------------------------------------
@app.post("/login", response_model=Token)
async def login(form: UserCreate, db: AsyncSession = Depends(get_db)):
query = select(User).where(User.email == form.email)
result = await db.execute(query)
user = result.scalar_one_or_none()
if not user:
raise HTTPException(status_code=401, detail="Invalid credentials")
if not verify_password(form.password, user.hashed_password):
raise HTTPException(status_code=401, detail="Invalid credentials")
token = create_access_token(data={"sub": user.email})
return {"access_token": token, "token_type": "bearer"}
# ---------------------------------------------------------
# Защищённый маршрут
# ---------------------------------------------------------
from app.auth import get_current_user
@app.get("/me", response_model=UserOut)
async def read_me(user=Depends(get_current_user)):
return user