Esta vez quiero compartir un widget que se me ha ocurrido hace 2 noches y que pienso que es interesante porque incorpora el uso de 2 API'S, un método de las requests de DJANGO y un script de animaciones de texto.
Puedes ver el widget en acción aquí.
Este widget muestra la ciudad, el tiempo y la temperatura del visitante usando la Ip, el procedimiento es el siguiente:
1.- Usamos un método de las requests de Django para extraer la ip:
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0]
context ={'ip': ip}
else:
ip = request.META.get('REMOTE_ADDR')
Aquí se guarda la ip en la variable "ip"
2.- Usando la API de Ipstack.com extraemos la ciudad de la ip:
Importamos los módulos:
iplocator_url = urllib.request.urlopen("http://api.ipstack.com/{0}?access_key=TUAPIKEY&fields=city,country_code".format(ip))
data = json.loads(iplocator_url.read())
city = data['city']
La ip la introduzco en la url usando {0} y luego agrego la variable ip usando .format(ip)
He de mencionar que para usar la API hay que crear una cuenta para poder obtener la API KEY, el nombre de la ciudad se guarda en la variable "city".
3.- Usando la API de OpenWeather buscamos el tiempo de la ciudad del usuario, al igual que con la API de IpStack hay que crear ua cuenta para obtener la API KEY.
weather = urllib.request.urlopen("https://api.openweathermap.org/data/2.5/weather?q={0}&units=metric&lang=es&appid=TUAPIKEY.format(city))
dataw = json.loads(weather.read())
city= dataw['name']
weather = dataw['weather'][0]['description']
temperature = str(dataw['main']['temp'])
En este paso utilizo la variable "city" para enviarla en la request a OpenWeather, especifico que quiero usar el idioma español "es" y las unidades métricas "units=metric", luego simplemente extraigo del Json los datos que me convienen como se ve en el código y los agrego al context en forma de diccionario.
La vista quedaría así:
def weather(request):
context = {}
#Método que obtiene la ip del visitante
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0]
context ={'ip': ip}
else:
ip = request.META.get('REMOTE_ADDR')
#Extraer la ciudad de la ip del usuario
iplocator_url = urllib.request.urlopen("http://api.ipstack.com/{0}?access_key=84f9a90dfbcafbae4838564dbb41ae1d&fields=city,country_code".format(ip))
data = json.loads(iplocator_url.read())
city = data['city']
#Buscar el tiempo en la ciudad del usuario
weather = urllib.request.urlopen("https://api.openweathermap.org/data/2.5/weather?q={0}&units=metric&lang=es&appid=1b4c4be6cb26e884000ba2f49b7affc4".format(city))
dataw = json.loads(weather.read())
city= dataw['name']
weather = dataw['weather'][0]['description']
temperature = str(dataw['main']['temp'])
context ={'ip': ip,
'city': city,
'weather': weather,
'temp': temperature,
}
return render(request, 'blog/index.html', context)
Estas variables estaría disponibles en la plantilla según el nombre que les he puesto, tengo que mencionar que no hace falta usar "for", la plantilla quedaría así:
<!--Widget Weather-->
<h1 class="ml12 text-center">La previsión del tiempo en {{city}} menciona {{weather}} hoy. Disfruta tus {{temp}} ºCelsius</h1>
Para la animación he utilizado un script que he conseguido en esta web. Es solo cuestión de agregar el código que indican allí en el css, html y Js.
¡Espero que te haya gustado!
Deja tu comentario y si quieres preguntarme algo escríbeme en contacto o en los comentarios.
Cheers.