Add main.py
This commit is contained in:
167
main.py
Normal file
167
main.py
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
from flask import Flask, render_template, request, jsonify
|
||||||
|
import requests
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
BASE_URL = "https://meteo.cbpio.pl"
|
||||||
|
|
||||||
|
@app.route("/gui/weather")
|
||||||
|
def simple_weather():
|
||||||
|
city = request.args.get("city", "Warszawa")
|
||||||
|
|
||||||
|
if "application/json" in request.headers.get("Accept", "") or "curl" in request.headers.get("User-Agent", ""):
|
||||||
|
try:
|
||||||
|
response = requests.get(f"https://meteo.cbpio.pl/weather", params={"city": city})
|
||||||
|
return jsonify(response.json())
|
||||||
|
except Exception as e:
|
||||||
|
return jsonify({"error": str(e)}), 500
|
||||||
|
|
||||||
|
return render_template("weather.html")
|
||||||
|
|
||||||
|
@app.route("/gui/weather/geo")
|
||||||
|
def geo_weather_page():
|
||||||
|
lat = request.args.get("lat")
|
||||||
|
lon = request.args.get("lon")
|
||||||
|
|
||||||
|
if not lat or not lon:
|
||||||
|
msg = {"error": "Podaj współrzędne, np. ?lat=52.4&lon=16.9"}
|
||||||
|
if "application/json" in request.headers.get("Accept", "") or "curl" in request.headers.get("User-Agent", ""):
|
||||||
|
return jsonify(msg), 400
|
||||||
|
return msg["error"], 400
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = requests.get("https://meteo.cbpio.pl/weather/geo", params={"latitude": lat, "longitude": lon})
|
||||||
|
data = response.json()
|
||||||
|
except Exception as e:
|
||||||
|
error_msg = {"error": str(e)}
|
||||||
|
if "application/json" in request.headers.get("Accept", "") or "curl" in request.headers.get("User-Agent", ""):
|
||||||
|
return jsonify(error_msg), 500
|
||||||
|
return f"Błąd: {e}", 500
|
||||||
|
|
||||||
|
if "application/json" in request.headers.get("Accept", "") or "curl" in request.headers.get("User-Agent", ""):
|
||||||
|
return jsonify(data)
|
||||||
|
|
||||||
|
return render_template("geo_weather.html", weather=data)
|
||||||
|
|
||||||
|
@app.route("/gui/forecast")
|
||||||
|
def forecast():
|
||||||
|
city = request.args.get("city", "").strip()
|
||||||
|
if not city:
|
||||||
|
return render_template("forecast.html", city="", error="Nie podano miasta")
|
||||||
|
|
||||||
|
try:
|
||||||
|
forecast_data = requests.get(f"{BASE_URL}/forecast", params={"city": city}).json()
|
||||||
|
except Exception as e:
|
||||||
|
return render_template("forecast.html", city=city, error="Błąd pobierania danych")
|
||||||
|
|
||||||
|
accept = request.headers.get("Accept", "")
|
||||||
|
if "application/json" in accept:
|
||||||
|
return jsonify(forecast_data)
|
||||||
|
|
||||||
|
return render_template("forecast.html", city=forecast_data["city"], forecast=forecast_data["forecast"])
|
||||||
|
|
||||||
|
@app.route("/gui/forecast/hourly")
|
||||||
|
def hourly_forecast():
|
||||||
|
city = request.args.get("city", "").lower()
|
||||||
|
hours = request.args.get("hours", 24, type=int)
|
||||||
|
|
||||||
|
if not city:
|
||||||
|
return "Brak parametru 'city'", 400
|
||||||
|
|
||||||
|
try:
|
||||||
|
resp = requests.get("https://meteo.cbpio.pl/forecast/hourly", params={"city": city, "hours": hours})
|
||||||
|
resp.raise_for_status()
|
||||||
|
data = resp.json()
|
||||||
|
except Exception as e:
|
||||||
|
error_msg = f"Błąd pobierania danych: {str(e)}"
|
||||||
|
if "text/html" in request.headers.get("Accept", ""):
|
||||||
|
return render_template("hourly_forecast.html", city=city.capitalize(), hourly_forecast=None, error=error_msg)
|
||||||
|
return jsonify({"error": error_msg}), 500
|
||||||
|
|
||||||
|
hourly = data.get("hourly_forecast", {})
|
||||||
|
|
||||||
|
if "text/html" in request.headers.get("Accept", ""):
|
||||||
|
return render_template("hourly_forecast.html", city=city.capitalize(), hourly_forecast=hourly, error=None)
|
||||||
|
else:
|
||||||
|
return jsonify(data)
|
||||||
|
|
||||||
|
@app.route("/gui/history/range")
|
||||||
|
def history_range():
|
||||||
|
city = request.args.get("city", "").lower()
|
||||||
|
start_date = request.args.get("start_date")
|
||||||
|
end_date = request.args.get("end_date")
|
||||||
|
accept = request.headers.get("Accept", "")
|
||||||
|
|
||||||
|
if not city or not start_date or not end_date:
|
||||||
|
error_msg = "Brak wymaganych parametrów"
|
||||||
|
if "text/html" in accept:
|
||||||
|
return render_template("history_range.html", city=city.capitalize(),
|
||||||
|
start_date=start_date, end_date=end_date,
|
||||||
|
history=None, error=error_msg)
|
||||||
|
else:
|
||||||
|
return jsonify({"error": error_msg}), 400
|
||||||
|
|
||||||
|
url = f"https://meteo.cbpio.pl/history-range?city={city}&start_date={start_date}&end_date={end_date}"
|
||||||
|
|
||||||
|
try:
|
||||||
|
res = requests.get(url)
|
||||||
|
res.raise_for_status()
|
||||||
|
data = res.json()
|
||||||
|
except Exception as e:
|
||||||
|
if "text/html" in accept:
|
||||||
|
return render_template("history_range.html", city=city.capitalize(),
|
||||||
|
start_date=start_date, end_date=end_date,
|
||||||
|
history=None, error=str(e))
|
||||||
|
else:
|
||||||
|
return jsonify({"error": str(e)}), 500
|
||||||
|
|
||||||
|
history = data.get("history")
|
||||||
|
|
||||||
|
if "text/html" in accept:
|
||||||
|
return render_template("history_range.html", city=city.capitalize(),
|
||||||
|
start_date=start_date, end_date=end_date,
|
||||||
|
history=history, error=None)
|
||||||
|
else:
|
||||||
|
return jsonify({
|
||||||
|
"city": city.capitalize(),
|
||||||
|
"start_date": start_date,
|
||||||
|
"end_date": end_date,
|
||||||
|
"history": history
|
||||||
|
})
|
||||||
|
|
||||||
|
@app.route("/app/")
|
||||||
|
def index():
|
||||||
|
return render_template("index.html")
|
||||||
|
|
||||||
|
@app.route("/app/get_weather", methods=["POST"])
|
||||||
|
def get_weather():
|
||||||
|
data = request.get_json()
|
||||||
|
lat = data.get("lat")
|
||||||
|
lon = data.get("lon")
|
||||||
|
|
||||||
|
if lat is None or lon is None:
|
||||||
|
return jsonify({"error": "Missing coordinates"}), 400
|
||||||
|
|
||||||
|
try:
|
||||||
|
current = requests.get(f"{BASE_URL}/weather/geo", params={"latitude": lat, "longitude": lon}).json()
|
||||||
|
forecast = requests.get(f"{BASE_URL}/forecast/geo", params={
|
||||||
|
"latitude": lat,
|
||||||
|
"longitude": lon,
|
||||||
|
"days": 7
|
||||||
|
}).json()
|
||||||
|
hourly = requests.get(f"{BASE_URL}/forecast/hourly/geo", params={
|
||||||
|
"latitude": lat,
|
||||||
|
"longitude": lon,
|
||||||
|
"hours": 24
|
||||||
|
}).json()
|
||||||
|
|
||||||
|
return jsonify({
|
||||||
|
"current": current,
|
||||||
|
"daily": forecast,
|
||||||
|
"hourly": hourly
|
||||||
|
})
|
||||||
|
except Exception as e:
|
||||||
|
print("Error fetching data:", e)
|
||||||
|
return jsonify({"error": str(e)}), 500
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run(debug=True, host='0.0.0.0', port=8000)
|
Reference in New Issue
Block a user