es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe una forma sencilla de pasar dataclasses de Python a una aplicación con Flask?

Tengo una dataclass de Python que almacena cosas como el nombre de la acción y la información del análisis técnico que calculo en el script. Sin embargo, después de que ese proceso termine, quiero enviar los objetos a una tabla HTML para una fácil visualización y coordinación de colores. He pensado en convertirlo a diccionarios y luego enviarlo a la página de Flask de esa manera, pero eso sería una línea de código por cada objeto que necesito convertir. Además de eso, tendría que pasar cada diccionario al web app de Flask, lo cual sería tedioso.

Me pregunto si alguien conoce alguna forma mejor de hacer referencia a una dataclass de Python en una página de Flask/HTML sin tener que rehacer el proyecto y usar un diccionario de Python masivo. A continuación se muestra un ejemplo de la dataclass que estoy usando. Luego haría un objeto separado para cada acción que deseo, y finalmente espero poder pasar el objeto a una tabla HTML usando Flask/Jinja.

    @dataclass
    class stockData:
        # Clase para cargar datos de acciones y valores de análisis técnico
        ticker:             str
        lastPrice:          float = 0
        moneyFlowIndex:     float = 0
        twentyPeriodCMF:    float = 0
        VWAPUpper:          float = 0
        VWAP:               float = 0
        VWAPLower:          float = 0
        channelUpper:       float = 0
        channel:            float = 0
        channelLower:       float = 0
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una solución posible es definir un método dentro de la clase stockData que convierta cada instancia de objeto en un diccionario utilizando la función vars() incorporada. Esto permitiría una fácil conversión de todos los objetos a diccionarios sin tener que escribir código de conversión individual para cada objeto.

    @dataclass
    class stockData:
        # Clase para cargar datos de acciones y valores TA
        ticker: str
        lastPrice: float = 0
        moneyFlowIndex: float = 0
        twentyPeriodCMF: float = 0
        VWAPUpper: float = 0
        VWAP: float = 0
        VWAPLower: float = 0
        channelUpper: float = 0
        channel: float = 0
        channelLower: float = 0
    
        def to_dict(self):
            return vars(self)
    

    Luego, al pasar los objetos a la aplicación web de Flask, podrías iterar a través de los objetos y llamar a este método para convertirlos en diccionarios antes de pasarlos a la plantilla HTML.

    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    stocks = [stockData('AAPL', 120.5, 45.6, 34.5, 121.5, 120, 118.5, 122, 120, 118),
              stockData('GOOG', 1020.5, 365.6, 324.5, 1021.5, 1020, 1018.5, 1022, 1020, 1018)]
    
    @app.route('/')
    def view_stocks():
        dict_stocks = [stock.to_dict() for stock in stocks]
        return render_template('stocks.html', stocks=dict_stocks)
    
    if __name__ == '__main__':
        app.run()
    

    En la plantilla HTML, usarías variables Jinja para acceder a los datos de los diccionarios y llenar la tabla.

    <table>
        <thead>
            <tr>
                <th>Ticker</th>
                <th>Last Price</th>
                <th>Money Flow Index</th>
                <th>20 Period CMF</th>
                <th>VWAP Upper</th>
                <th>VWAP</th>
                <th>VWAP Lower</th>
                <th>Channel Upper</th>
                <th>Channel</th>
                <th>Channel Lower</th>
            </tr>
        </thead>
        <tbody>
            {% for stock in stocks %}
            <tr>
                <td>{{ stock.ticker }}</td>
                <td>{{ stock.lastPrice }}</td>
                <td>{{ stock.moneyFlowIndex }}</td>
                <td>{{ stock.twentyPeriodCMF }}</td>
                <td>{{ stock.VWAPUpper }}</td>
                <td>{{ stock.VWAP }}</td>
                <td>{{ stock.VWAPLower }}</td>
                <td>{{ stock.channelUpper }}</td>
                <td>{{ stock.channel }}</td>
                <td>{{ stock.channelLower }}</td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
    

    Este enfoque permite una separación clara de responsabilidades entre el modelo de objeto y la capa de presentación, al tiempo que mantiene el código DRY (Don’t Repeat Yourself).

Comments are closed.