Partage
  • Partager sur Facebook
  • Partager sur Twitter

[API][tableau][BDD] probleme route non lue

    25 janvier 2024 à 16:22:11

    bonjour a tous,

    j'ai besoin d'aide. j'ai codé une api en python, et une @app.route n'est pas lue. je ne trouve pas pourquoi .

    voici le python :
    from io import BytesIO
    from flask import Flask, render_template, request, Response
    import json
    import matplotlib
    import sqlite3
    import random
    from datetime import datetime, timedelta
    
    import logging
    
    matplotlib.use('Agg')
    
    from matplotlib.figure import Figure
    import matplotlib.pyplot as plt
    from matplotlib.backends.backend_agg import FigureCanvasAgg as CanvasVirtuel
    
    # Où se trouve le dossier à lier
    # Ici il est dans web.
    app = Flask(__name__)
    
    app.logger.setLevel(logging.DEBUG)
    
    # ===================================
    # ====ATTENTION, PARTIE A ENLEVER====
    # =============juste ici=============
    # ===================================
    
    def clear_database():
        # Connexion à la base de données
        database_path = "/your_database.db"
        connection = sqlite3.connect("your_database.db")
        cursor = connection.cursor()
    
        try:
            # Supprimer toutes les données de la table "commande"
            cursor.execute("DELETE FROM commande")
    
            # Supprimer toutes les données des autres tables si nécessaire
            cursor.execute("DELETE FROM temperature")
            cursor.execute("DELETE FROM humidite")
            cursor.execute("DELETE FROM pression")
    
            # Valider la transaction
            connection.commit()
    
        finally:
            # Fermer la connexion
            connection.close()
    
    # Appel de la fonction pour vider la base de données
    clear_database()
    
    
    
    # Fonction pour créer les tables et insérer des données fictives
    def create_and_populate_tables():
        database_path = "your_database.db"
        connection = sqlite3.connect(database_path)
        cursor = connection.cursor()
    
        # Création des tables (placez vos instructions CREATE TABLE ici)
    
        cursor.execute(
            'CREATE TABLE IF NOT EXISTS temperature (id_temp INTEGER PRIMARY KEY, temperature INTEGER)')
        cursor.execute(
            'CREATE TABLE IF NOT EXISTS humidite (id_humi INTEGER PRIMARY KEY, humidite INTEGER)')
    
        cursor.execute(
            'CREATE TABLE IF NOT EXISTS pression (id_pression INTEGER PRIMARY KEY, pression INTEGER)'
        )
    
        cursor.execute(
            '''
            CREATE TABLE IF NOT EXISTS commande (
                date DATE PRIMARY KEY,
                id_temp INTEGER,
                id_humi INTEGER,
                id_pression INTEGER,
                FOREIGN KEY (id_temp) REFERENCES temperature(id_temp),
                FOREIGN KEY (id_humi) REFERENCES humidite(id_humi),
                FOREIGN KEY (id_pression) REFERENCES pression(id_pression)
            )
            '''
    )
    
        # Insertion de données fictives
        try:
            connection.execute("BEGIN")  # Début de la transaction
    
    
    
            for _ in range(10):
                date = (datetime.now() - timedelta(days=random.randint(1, 365))).strftime('%Y-%m-%d')
                temperature = random.randint(10, 30)
                humidite = random.randint(20, 40)
                pression = random.randint(950, 1050)
    
                
    
                # Vérifiez si la date existe déjà
                cursor.execute("SELECT COUNT(*) FROM commande WHERE date = ?", (date,))
                existing_date_count = cursor.fetchone()[0]
    
                # Si la date n'existe pas, insérez les données
                if existing_date_count == 0:
                    cursor.execute("INSERT INTO temperature (temperature) VALUES (?)", (temperature,))
                    cursor.execute("INSERT INTO humidite (humidite) VALUES (?)", (humidite,))
                    cursor.execute("INSERT INTO pression (pression) VALUES (?)", (pression,))
                    cursor.execute("INSERT INTO commande (date, id_temp, id_humi, id_pression) VALUES (?, ?, ?, ?)",
                                    (date, cursor.lastrowid, cursor.lastrowid, cursor.lastrowid))
    
            connection.commit()  # Validez la transaction
    
        except Exception as e:
            connection.rollback()  # Annulation de la transaction en cas d'erreur
            raise e
        finally:
            connection.close()  # Fermez la connexion après utilisation
    
    
    def print_table_data():
        # Connexion à la base de données
        connection = sqlite3.connect("your_database.db")
        cursor = connection.cursor()
    
        try:
            # Exécutez une requête pour récupérer toutes les données de la table commande
            cursor.execute("SELECT * FROM commande")
    
            # Récupérez toutes les lignes de résultats
            rows = cursor.fetchall()
    
            # Affichez les en-têtes de colonnes
            column_names = [description[0] for description in cursor.description]
            print("\t".join(column_names))
    
            # Affichez les données
            for row in rows:
                print("\t".join(map(str, row)))
    
        finally:
            # Fermez la connexion
            connection.close()
    
    
    # Appel de la fonction au démarrage de l'application
    create_and_populate_tables()
    
    # Affichage des données de la table commande
    print_table_data()
    
    
    
    
    @app.route("/")
    def index():
        return render_template("index.html")
    
    @app.route("/chart")
    def chart():
        # Créez une connexion à la base de données et un curseur
        connection = sqlite3.connect("your_database.db")
        cursor = connection.cursor()
    
        cursor.execute("SELECT c.date, t.temperature, h.humidite, p.pression FROM commande c "
                   "INNER JOIN temperature t ON c.id_temp = t.id_temp "
                   "INNER JOIN humidite h ON c.id_humi = h.id_humi "
                   "INNER JOIN pression p ON c.id_pression = p.id_pression")
    
        # Récupérez toutes les lignes de résultats
        data_from_db = cursor.fetchall()
    
        # Fermez la connexion à la base de données
        connection.close()
    
        # Transformez les données en une structure utilisable pour le graphique
        chart_data = {
            "title": "température / humidité / Pression",
            "temperature": {entry[0]: entry[1] for entry in data_from_db},
            "humidite": {entry[0]: entry[2] for entry in data_from_db},
            "pression": {entry[0]: entry[3] for entry in data_from_db}
        }
    
        param = json.loads(request.args.get("param"))
        print(param)
    
        labels = []
        temperature = []
        humidite = []
        pression = []
    
        if param["title"] == "température / humidité / Pression":
            labels = list(chart_data["temperature"].keys())  # Utilisez les dates de la température comme étiquettes
            temperature = list(chart_data["temperature"].values())
            humidite = list(chart_data["humidite"].values())
            pression = list(chart_data["pression"].values())
        elif param["title"] == "température":
            labels = list(chart_data["temperature"].keys())
            temperature = list(chart_data["temperature"].values())
        elif param["title"] == "humidité":
            labels = list(chart_data["humidite"].keys())
            humidite = list(chart_data["humidite"].values())
        elif param["title"] == "Pression":
            labels = list(chart_data["pression"].keys())
            pression = list(chart_data["pression"].values())
    
        fig, ax1 = plt.subplots()
    
        if "title" in param:
            fig.suptitle(param["title"])
    
        if temperature and humidite and pression:
            # Si les trois existent, utilisez une triple échelle y
            ax2 = ax1.twinx()
            ax3 = ax1.twinx()
    
            # Ajustez les couleurs et autres propriétés pour chaque axe
            ax1.plot(labels, temperature, label='Température', color='b')
            ax2.plot(labels, humidite, 'r-', label='Humidité')
            ax3.plot(labels, pression, 'g-', label='Pression')
            ax3.spines['right'].set_position(('outward', 80))
    
            # Ajustez la couleur de la graduation y pour ax3
            ax3.yaxis.label.set_color('red')
        elif temperature:
            # Si seulement la température existe
            ax1.plot(labels, temperature, label='Température', color='b')
        elif humidite:
            # Si seulement l'humidité existe
            ax1.plot(labels, humidite, 'r-', label='Humidité')
        elif pression:
            ax1.plot(labels, pression, 'g-', label='Presion')
    
        fig.savefig("chart.png", format="png")
        output = BytesIO()
        CanvasVirtuel(fig).print_png(output)
    
        return Response(output.getvalue(), mimetype="image/png")
    
    @app.route("/table")
    def table():
        try:
            # Connexion à la base de données SQLite
            database_path = "/your_database.db"
            conn = sqlite3.connect('your_database.db')
            cursor = conn.cursor()
    
            # Exécution d'une requête SQL pour récupérer les dernières valeurs de température
            query_temperature = "SELECT temperature FROM temperature ORDER BY id_temp DESC LIMIT 1"
            cursor.execute(query_temperature)
            temperature = cursor.fetchone()[0]
            print("Temperature:", temperature)
    
            # Exécution d'une requête SQL pour récupérer les dernières valeurs d'humidité
            query_humidite = "SELECT humidite FROM humidite ORDER BY id_humi DESC LIMIT 1"
            cursor.execute(query_humidite)
            humidite = cursor.fetchone()[0]
            print("Humidity:", humidite)
    
            # Exécution d'une requête SQL pour récupérer les dernières valeurs de pression
            query_pression = "SELECT pression FROM pression ORDER BY id_pression DESC LIMIT 1"
            cursor.execute(query_pression)
            pression = cursor.fetchone()[0]
            print("Pressure:", pression)
    
            # Fermeture de la connexion
            conn.close()
    
            # Vérification et utilisation des données récupérées
            if temperature is not None and humidite is not None and pression is not None:
                # Création d'un dictionnaire avec des clés explicites
                meteo = {
                    "temperature": temperature,
                    "humidite": humidite,
                    "pression": pression
                }
    
                current_app.logger.info(meteo)
    
                if temperature > 20 and pression < 1000:
                    nuage = 1
                elif temperature <= 20 and pression < 1000:
                    nuage = 2
                elif temperature > 20 and pression >= 1000:
                    nuage = 3
                elif temperature <= 20 and pression >= 1000:
                    nuage = 4
    
                meteo['nuage'] = nuage
    
                # Render the template with the meteo data
                return render_template("index.html", meteos=[meteo])
            else:
                # Handle the case when data is not available
                return render_template("index.html", meteos=[])
        except Exception as e:
            print("Error:", str(e))
            return render_template("index.html", meteos=[])
    
    
    
    if __name__ == "__main__":
        app.run()

    voici le html : 
    je n'ai pas trouvé comment poster du html au niveau du choix du langage. désolé

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <table>
            <thead>
                <tr>
                    <th>pression</th>
                    <th>humidite</th>
                    <th>temperature</th>
                    <th>meteo</th>
                </tr>
            </thead>
            <tbody>
                <!-- On boucle sur la variable "vehicule" -->
                {% for meteo in meteos %}
                <tr>
                    <!-- On affiche les données dynamiquement -->
                    <td>{{ meteo['pression'] }}</td>
                    <td>{{ meteo['humidite'] }}</td>
                    <td>{{ meteo['temperature'] }}</td>
                    <td>
                        {% if meteo['nuage'] == 1 %}
                            <img src="/imageMeteo/bleuclair.png" alt="Nuage 1">
                        {% elif meteo['nuage'] == 2 %}
                            <img src="/imageMeteo/bleufonce.png" alt="Nuage 2">
                        {% elif meteo['nuage'] == 3 %}
                            <img src="/imageMeteo/grisclair.png" alt="Nuage 3">
                        {% elif meteo['nuage'] == 4 %}
                            <img src="/imageMeteo/grisfonce.png" alt="Nuage 4">
                        {% else %}
                            <!-- Ajoutez un bloc else pour gérer les autres cas -->
                            <img src="/imageMeteo/autre_image.png" alt="Autre Image">
                        {% endif %}
                    </td>
                </tr>
                {% endfor %}
            </tbody>
        </table>
    
        <h1>graph</h1>
    
    
        <p>
            <img 
                src='/chart?param={ "type":"bar", "title" : "température / humidité / Pression"}' 
            
                alt=""
            />
        </p>
        <p>
            <img 
                src='/chart?param={ "type":"bar", "title" : "humidité"}' 
            
                alt=""
            />
        </p>
        <p>
            <img 
                src='/chart?param={ "type":"bar", "title" : "température"}' 
            
                alt=""
            />
        </p>
    
        <p>
            <img 
                src='/chart?param={ "type":"bar", "title" : "Pression"}' 
            
                alt=""
            />
        </p>
    
    
    </body>
    </html>


     Ici, je cherche a créer un tableau, qui m'affiche les dernières donnée (humidité, température, et pression) et un pictogramme variant en fonction de ses données 
    le problème c'est que @app.route("/table") n'est pas lu.

    Je vous remercies pour votre aide
    Bonne journnée 

    • Partager sur Facebook
    • Partager sur Twitter
      25 janvier 2024 à 18:27:04

      tu as quoi comme erreur ? une page 404 not found ?

      ta route mène vers la page index.html, c'est bien cette page dont tu indiques le code?

      -
      Edité par umfred 25 janvier 2024 à 18:31:20

      • Partager sur Facebook
      • Partager sur Twitter
        26 janvier 2024 à 7:25:18

        c'est bien vers cette page.
        j'ai pas d'erreur. la page apparait, les en-tête du tableau aussi, mais pas les données dedans. ni le png

        -
        Edité par TheoValet1 26 janvier 2024 à 7:48:56

        • Partager sur Facebook
        • Partager sur Twitter
          26 janvier 2024 à 12:30:20

          il faut vérifier que tu passes bien dans le remplissage de ta variable meteo, parce qu'il y a 2 chemins dans lesquels meteo est vide.

          Rajoute une clé "status" par exemple dont la valeur serait "OK" si on remplit meteo, "data incomplete" si on passe dans le else (cas où pas de valeur pour temperature ou pour humidité ou pour pression, et "error" si on tombe dans le except (voir dans ce cas, rajouter le message d'erreur directement).

          ça permettra déjà de savoir si on passe par un des 3 trajets possibles de la route.

          Eventuellement, regarde aussi si la console js de ton navigateur n'affiche pas des erreurs.

          • Partager sur Facebook
          • Partager sur Twitter

          [API][tableau][BDD] probleme route non lue

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          • Editeur
          • Markdown