This commit is contained in:
2026-01-24 19:09:37 -05:00
parent 97ca92b945
commit 52400f888e
3 changed files with 36 additions and 46 deletions

16
app.py
View File

@@ -1,18 +1,23 @@
from flask import Flask, render_template, jsonify, request
from utils.weather import get_today_snowfall
from utils.geocode import get_city_name
from utils.weather import get_today_snowfall_async
from utils.geocode import get_city_name_async
from config import MAX_SNOW_INCHES
from flask_caching import Cache
import asyncio
app = Flask(__name__)
# Cache config: 10-minute default timeout
cache = Cache(app, config={"CACHE_TYPE": "SimpleCache", "CACHE_DEFAULT_TIMEOUT": 600})
@cache.memoize(600) # cache each request for 10 minutes
@cache.memoize()
def get_snowfall_for_location(lat, lon):
inches, snowing, tz_name = get_today_snowfall(lat, lon)
city_name = get_city_name(lat, lon)
# Run async functions in an event loop
return asyncio.run(fetch_snow_and_city(lat, lon))
async def fetch_snow_and_city(lat, lon):
inches, snowing, tz_name = await get_today_snowfall_async(lat, lon)
city_name = await get_city_name_async(lat, lon)
return inches, snowing, tz_name, city_name
@app.route("/")
@@ -43,6 +48,5 @@ def snowfall_api():
"updated": datetime.now().isoformat()
})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)

View File

@@ -1,8 +1,8 @@
import requests
import httpx
def get_city_name(lat, lon):
try:
r = requests.get(
async def get_city_name_async(lat, lon):
async with httpx.AsyncClient(timeout=5) as client:
r = await client.get(
"https://nominatim.openstreetmap.org/reverse",
params={"lat": lat, "lon": lon, "format": "json", "zoom": 10, "addressdetails": 1},
headers={"User-Agent": "AreWeBuriedApp/1.0"}
@@ -10,8 +10,4 @@ def get_city_name(lat, lon):
r.raise_for_status()
data = r.json()
address = data.get("address", {})
city = address.get("city") or address.get("town") or address.get("village") or address.get("county") or f"{lat:.2f},{lon:.2f}"
return city
except Exception as e:
print("Reverse geocoding error:", e)
return f"{lat:.2f},{lon:.2f}"
return address.get("city") or address.get("town") or address.get("village") or address.get("county") or f"{lat:.2f},{lon:.2f}"

View File

@@ -1,23 +1,17 @@
import requests
from datetime import datetime
import httpx
import pytz
from datetime import datetime
from timezonefinder import TimezoneFinder
from config import OPEN_METEO_URL
tf = TimezoneFinder()
def get_today_snowfall(lat, lon):
try:
async def get_today_snowfall_async(lat, lon):
tz_name = tf.timezone_at(lat=lat, lng=lon) or "UTC"
params = {
"latitude": lat,
"longitude": lon,
"hourly": "snowfall",
"timezone": tz_name
}
r = requests.get(OPEN_METEO_URL, params=params, timeout=5)
async with httpx.AsyncClient(timeout=5) as client:
params = {"latitude": lat, "longitude": lon, "hourly": "snowfall", "timezone": tz_name}
r = await client.get(OPEN_METEO_URL, params=params)
r.raise_for_status()
data = r.json()
@@ -37,7 +31,3 @@ def get_today_snowfall(lat, lon):
inches = round(snowfall_cm / 2.54, 1)
return inches, snowing_now, tz_name
except Exception as e:
print("Error fetching snowfall:", e)
return 0.0, False, "UTC"