diff --git a/main.py b/main.py index b58bfcd..6aaffc2 100644 --- a/main.py +++ b/main.py @@ -7,10 +7,43 @@ from db import get_session, engine, Base from models import WeatherRecord from datetime import datetime from fastapi.responses import HTMLResponse, JSONResponse +#from tenacity import retry, stop_after_attempt, wait_fixed #DODANE +import asyncio +import asyncpg +import redis +import json + +redis_client = redis.StrictRedis(host='localhost', port=6379, db=0, decode_responses=True) app = FastAPI() templates = Jinja2Templates(directory="templates") +@app.middleware("http") +async def log_user_action(request: Request, call_next): + method = request.method + path = request.url.path + query = dict(request.query_params) + timestamp = datetime.utcnow().isoformat() + + action = { + "method": method, + "path": path, + "query": query, + "timestamp": timestamp + } + + # Zapisujemy jako JSON w liście w Redis + redis_client.rpush("user_actions", json.dumps(action)) + + response = await call_next(request) + return response + +@app.get("/logs") +def get_logs(): + entries = redis_client.lrange("user_actions", 0, -1) + return [json.loads(e) for e in entries] + + CITIES = { "warszawa": (52.23, 21.01), "krakow": (50.06, 19.94), @@ -82,11 +115,27 @@ CITIES = { } - +''' @app.on_event("startup") async def startup(): async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) +''' + +@app.on_event("startup") +async def startup(): + for attempt in range(50): + try: + async with engine.begin() as conn: + await conn.run_sync(Base.metadata.create_all) + print("Połączono z bazą danych.") + break + except asyncpg.InvalidPasswordError: + print("Nieprawidłowe hasło.") + #raise + except Exception as e: + #print(f"Próba {attempt+1}/10 nieudana: {e}") + await asyncio.sleep(2) @app.get("/weather") async def get_weather(city: str = Query("warszawa"), session: AsyncSession = Depends(get_session)): @@ -94,7 +143,7 @@ async def get_weather(city: str = Query("warszawa"), session: AsyncSession = Dep if not coords: return {"error": "Miasto nieobsługiwane"} - url = f"https://api.open-meteo.com/v1/forecast?latitude={coords[0]}&longitude={coords[1]}¤t_weather=true" + url = f"http://api.open-meteo.com/v1/forecast?latitude={coords[0]}&longitude={coords[1]}¤t_weather=true" async with httpx.AsyncClient() as client: res = await client.get(url) @@ -159,7 +208,7 @@ async def get_weather_by_coords( session: AsyncSession = Depends(get_session) ): url = ( - f"https://api.open-meteo.com/v1/forecast?" + f"http://api.open-meteo.com/v1/forecast?" f"latitude={latitude}&longitude={longitude}¤t_weather=true" ) @@ -209,7 +258,7 @@ async def get_forecast( ) url = ( - f"https://api.open-meteo.com/v1/forecast?" + f"http://api.open-meteo.com/v1/forecast?" f"latitude={coords[0]}&longitude={coords[1]}" f"&daily=temperature_2m_max,temperature_2m_min,precipitation_sum" f"&timezone=Europe/Warsaw" @@ -248,7 +297,7 @@ async def get_forecast_geo( days: int = Query(3, ge=1, le=16) ): url = ( - f"https://api.open-meteo.com/v1/forecast?" + f"http://api.open-meteo.com/v1/forecast?" f"latitude={latitude}&longitude={longitude}" f"&daily=temperature_2m_max,temperature_2m_min,precipitation_sum" f"&timezone=Europe/Warsaw" @@ -288,7 +337,7 @@ async def get_hourly_forecast_geo( hours: int = Query(12, ge=1, le=48) ): url = ( - f"https://api.open-meteo.com/v1/forecast?" + f"http://api.open-meteo.com/v1/forecast?" f"latitude={latitude}&longitude={longitude}" f"&hourly=temperature_2m,windspeed_10m,precipitation" f"&timezone=Europe/Warsaw" @@ -345,7 +394,7 @@ async def get_hourly_forecast_city( latitude, longitude = coords url = ( - f"https://api.open-meteo.com/v1/forecast?" + f"http://api.open-meteo.com/v1/forecast?" f"latitude={latitude}&longitude={longitude}" f"&hourly=temperature_2m,windspeed_10m,precipitation" f"&timezone=Europe/Warsaw" @@ -405,7 +454,7 @@ async def get_weather_history_range( latitude, longitude = coords url = ( - f"https://archive-api.open-meteo.com/v1/archive?" + f"http://archive-api.open-meteo.com/v1/archive?" f"latitude={latitude}&longitude={longitude}" f"&daily=temperature_2m_max,temperature_2m_min,precipitation_sum" f"&start_date={start_date}&end_date={end_date}" @@ -448,7 +497,7 @@ async def get_weather_history_range_geo( end_date: str = Query(..., description="Końcowa data w formacie YYYY-MM-DD") ): url = ( - f"https://archive-api.open-meteo.com/v1/archive?" + f"http://archive-api.open-meteo.com/v1/archive?" f"latitude={latitude}&longitude={longitude}" f"&daily=temperature_2m_max,temperature_2m_min,precipitation_sum" f"&start_date={start_date}&end_date={end_date}" @@ -485,3 +534,4 @@ async def get_weather_history_range_geo( "history": daily }) + diff --git a/requirements.txt b/requirements.txt index f037d93..b63b525 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,6 @@ sqlalchemy asyncpg jinja2 uvicorn +redis[asyncio] +python-multipart +aioredis