http midleware

This commit is contained in:
2025-09-28 15:34:42 +03:00
parent c4fc002124
commit fe7fb0971d

View File

@@ -1,11 +1,14 @@
from fastapi import FastAPI, HTTPException, status, Depends from fastapi import FastAPI, HTTPException, status, Depends, Request
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
from fastapi.security import OAuth2PasswordRequestForm from fastapi.security import OAuth2PasswordRequestForm
from . import pydentic, JWT, password
from datetime import datetime, timedelta
from pydantic import EmailStr from pydantic import EmailStr
from . import pydentic, JWT, password
from server.database import db from server.database import db
from datetime import datetime, timedelta
import asyncio import asyncio
api = FastAPI() api = FastAPI()
@@ -25,18 +28,27 @@ api.add_middleware(
allow_headers=headers, allow_headers=headers,
) )
@api.middleware("http") #Логирование заходов перед всеми endpoints
async def log_requests(request: Request, call_next):
ip = request.client.host
ua = request.headers.get("user-agent")
method = request.method
url = str(request.url)
print(f"[{method}] {url} from {ip} ({ua})")
response = await call_next(request)
return response
@api.get("/protected") @api.get("/protected")
async def protected(current_user: str = Depends(JWT.current_user)): async def protected(current_user: str = Depends(JWT.current_user)):
return {"msg": f"Hello, {current_user}"} return {"msg": f"Hello, {current_user}"}
@api.get("/", response_model=pydentic.CreateUser) @api.get("/", response_model=list[pydentic.UsersInfo]) #список!
async def get_all_rows(current_user: str = Depends(JWT.current_user)): async def get_all_rows(current_user: str = Depends(JWT.current_user)):
for row in await db.get_all_rows(): users = await db.get_all_rows()
if row: if not users:
return row raise HTTPException(status_code=404, detail="No users found")
else: return users
raise HTTPException(status_code=404, detail="The user isn't found") @api.get("/get_user_by_email/{email}", response_model=pydentic.UsersInfo)
@api.get("/get_user_by_email/{email}", response_model=pydentic.CreateUser)
async def get_user_by_email(email:str, current_user: str = Depends(JWT.current_user)): async def get_user_by_email(email:str, current_user: str = Depends(JWT.current_user)):
user = await db.get_user_by_email(email) user = await db.get_user_by_email(email)
if user: if user:
@@ -84,7 +96,6 @@ async def login_user(form_data: OAuth2PasswordRequestForm = Depends()):
user = await db.login_user(creds) user = await db.login_user(creds)
if not user: if not user:
raise HTTPException(status_code=401, detail="The user isn't found") raise HTTPException(status_code=401, detail="The user isn't found")
access_token = await JWT.AccessToken.create( access_token = await JWT.AccessToken.create(
{"sub": user.email}, {"sub": user.email},
timedelta(minutes=JWT.ACCESS_TOKEN_EXPIRE_MINUTES) timedelta(minutes=JWT.ACCESS_TOKEN_EXPIRE_MINUTES)
@@ -92,6 +103,7 @@ async def login_user(form_data: OAuth2PasswordRequestForm = Depends()):
return {"access_token": access_token, "token_type": "bearer"} return {"access_token": access_token, "token_type": "bearer"}
@api.post("/reset", response_model=pydentic.UsersInfo) @api.post("/reset", response_model=pydentic.UsersInfo)
async def reset_user(row:pydentic.UserReset): async def reset_user(row:pydentic.UserReset):
user = await db.get_user_by_email(row.email) user = await db.get_user_by_email(row.email)
if not user: if not user:
raise HTTPException(status_code=401, detail="The user isn't found") raise HTTPException(status_code=401, detail="The user isn't found")