Aplicacion v2

Nuestra archivo app.py

from flask import Flask, render_template
from cripto.data import get_price


app = Flask(
    __name__,
    # Carpeta donde se encuentran los archivos estáticos
    static_folder='static',
    # Carpeta donde se encuentran los templates para el frontend
    template_folder='templates'
)


@app.route('/')
def index():
    site_title = 'Mi aplicacion web'
    return render_template("index.html", site_title=site_title)


@app.route("/price/<symbol>")
@app.route("/price/<symbol>/<to_symbol>")
def datos(symbol, to_symbol='USDT'):
    data = get_price(symbol, to_symbol)
    context = {
        'symbol': symbol,
        'to_symbol': to_symbol,
        'data': data,
    }
    site_title = 'Datos del sistema de transporte de la Ciudad de Córdoba'
    return render_template("datos.html", site_title=site_title, **context)

Nuestro archivo cripto/data.py (recuerda agregar un archivo vacío cripto/__init__.py)

import requests


def get_price(symbol, to_symbol='USDT'):
    """ Obtener el precio de alguna criptomoneda """
    url = f'https://api2.binance.com/api/v3/ticker/24hr?symbol={symbol}{to_symbol}'
    response = requests.get(url)

    # devuelvo todos los datos
    data = response.json()
    return data

El estilo CSS de nuestro sitio en /static/base.css

h2 {
    color: #064096;
    font-size: 1.2em;
}

h3 {
    color: #05624c;
    font-size: 1.1em;
}

.moneda {
    font-weight: bold;
}

#lista-monedas {
    margin: 20px;
    padding: 20px;
    border: 1px solid #222222;
    background-color: #bbbbbb33;
}

El código JavaScript de nuestro sitio en /static/base.js

function agregar_moneda() {
    /*
    agregar la moneda que el usuario escribio en la caja de texto
    a la lista de criptomonedas que se muestran en la pagina.
    */
    let symbol = document.getElementById("nueva-moneda").value;
    if (symbol == "") {
        alert("Debe ingresar un símbolo de moneda!");
        return;
    }
    let a = document.createElement('a');               
    let link = document.createTextNode(symbol);
    a.appendChild(link); 
    a.href = "/price/" + symbol; 
    let lista_monedas = document.getElementById("lista-monedas");
    let new_li = document.createElement("li");
    new_li.appendChild(a);
    lista_monedas.appendChild(new_li);
}

El template HTML de la home de nuestra aplicacion web en /templates/index.html

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href='{{ url_for("static", filename="base.css") }}'>
    <script src='{{ url_for("static", filename="base.js") }}'></script>
    <title>{{ site_title }}</title>
</head>
<body>
    <h2>{{ site_title }}</h2>

    <p>
    <h3>Ver precios de criptomonedas</h3>
    <ul id="lista-monedas">
        {% for coin in ['BTC', 'ETH', 'LTC'] %}
        <li class="monedas">
        <a href="{{ url_for('datos', symbol=coin) }}">
            {{ coin }}
        </a>
        {% endfor %}
    </ul>
    </p>
    <p>
        <input type="text" id="nueva-moneda" placeholder="Introduce una nueva moneda">
        <button id="boton-nueva-moneda" onclick="agregar_moneda()">Añadir</button>
    </p>

</body>
</html>

El template HTML de la pagina de detalle de una criptomoneda en /templates/datos.html

<!DOCTYPE html>
<html lang="es">
  <head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href='{{ url_for("static", filename="base.css") }}'>
    <script src='{{ url_for("static", filename="base.js") }}'></script>
    <title>{{ site_title }}</title>
</head>
<body>
    <h2>{{ site_title }}</h2>
    <p>
      Precio de {{ symbol }} a {{ to_symbol }}: <b>{{ data.lastPrice }}</b>
    </p>
    <p>
      Otros datos: {{ data }}
    </p>
    <p>
      <a href="{{ url_for('index') }}">Volver al inicio</a>
    </p>
</body>
</html>

Tarea

  • Crear una lista de criptomonedas en el backend y sacar la que esta en el frontend (la que dice ['BTC', 'ETH', 'LTC']). Se deberá pasar como variable de contexto al template. Asegurarse que el sitio siga funcionando de la misma forma.

  • Agrega un nuevo template HTML para mostrar un mensaje de error cuando no se encuentre la criptomoneda buscada. Nota: Cuando una criptomenoda no existe, el API devuelven {'code': -1121, 'msg': 'Invalid symbol.'}.