Code source de ApiServer.meteo
#
# Created by Elowarp on 19/12/2021
#
"""
Gère toute la partie "météo" du projet
"""
import requests
import datetime
import AffichageDynamique.settings as settings
[docs]class MeteoGetter:
"""
Classe s'occupant de récupérer les données de l'api openweatherapi
et de les retournées quand elles sont demandées tout en garantissant
de ne pas se faire bannir de l'api à cause du nombre d'appel de l'api
Attributes:
lastData (dict): Dernières données récupérées via l'api
didFirstFetch (bool): Vérifie si le premier fetch a été fait
Si non, le serveur vient de s'être lancé dans on peut
fetch l'api sans risquer d'atteindre la limite
Si oui, le serveur est déjà lancé et la requête vers l'api a
déjà été faite donc on attend au moins 1h avant de re fetch
lastQuery (datetime): Dernière heure à laquelle on a récupéré les
données
"""
def __init__(self):
#Récupération de l'heure + data actuelle mais en enlevant les minutes
self._apiKey = settings.METEO_TOKEN
self.lastData = {}
self.didFirstFetch = False
self.lastQuery = datetime.datetime.now()
self.lastQuery = self.lastQuery.timestamp() - (self.lastQuery.minute * 60)
[docs] def _canQuery(self):
"""
Vérification qu'on peut faire la mise à jour des données
Sans arriver à la limite d'appel de l'api à la fin du mois
(Ce qui revient à 1 appel toutes les heures)
"""
#Vérification de la différence de temps entre la dernière fois qu'on a get et mtn
diff = datetime.datetime.now().timestamp() - self.lastQuery
if(diff > 60 * 60): #1 Requete toutes les 60 minutes
return True
return False
[docs] def _fetchMeteo(self):
"""
Récupère les données depuis l'api de `OpenWeatherMap <https://openweathermap.org/api/one-call-api>`_
"""
#Mise à jour de la derniere date où on a recup les data
self.lastQuery = datetime.datetime.now().timestamp()
print("Getting weather's data")
meteoRes = requests.get("http://api.openweathermap.org/data/2.5/onecall?lat=44.0833&lon=1.5&exclude=current,minutely&units=metric&appid=" + self._apiKey)
#Mise à jour des données de la classe
self.lastData = {
"hourly": meteoRes.json()["hourly"],
"today": meteoRes.json()["daily"][0]
}
[docs] def getMeteoData(self):
"""
Renvoie les dernière données récupérées, si :py:meth:`_canQuery` nous autorise
alors on va refaire une demande à l'api pour mettre à jour les infos, sinon
on prend les dernières stockées dans :py:attr:`lastData`
"""
#Méthode s'occupant de renvoyer les données qd elles sont demandées par les écrans
if self._canQuery() or not self.didFirstFetch:
self.didFirstFetch = True
self._fetchMeteo()
return self.lastData