Почему {{ objects.property }} не отображаются в выпадающем списке, в то время как в Flask они отображаются в списке?

У меня есть файл app.py и папка pluginsXAI, в которой находится файл для плагина, который я хочу отобразить ElMagnificoPlugin.py.

app.py
/templates
└── index.html
/pluginsXAI
└── ElMagnificoPlugin.py
/kaasrc
└── plugin_collection.py

В том же файле, в целях тестирования, я разместил два doctypes: в первом doctype мне удалось отобразить плагин в {{ plugin.nom }}.

index.html

    <!DOCTYPE html>
        <html lang="fr">
        <head>
            <meta charset="UTF-8">
            <title>Plugins</title>
        </head>
        <body>
            <h1>Plugins</h1>
            <ul>
                {% for plugin in pluginsXAI %}
                    <li>pluginsXAI
                        <a href="/plugin/{{ plugin.nom }}">{{ plugin.nom }}</a>
                    </li>
                {% endfor %}
            </ul>
            <ul>
                {% for plugin in pluginsUCXAI %}
                    <li>pluginsUCXAI
                        <a href="/plugin/{{ plugin.nom }}">{{ plugin.nom }}</a>
                    </li>
                {% endfor %}
            </ul>
        </body>
    </html>

Но я не могу показать его во втором варианте:

index.html follow-up:

    <!DOCTYPE html>
    <html lang="fr">
    <head>
        <meta charset="UTF-8">
        <link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}">
    </head>
    <body>
    
    Les plugins
    <ul>
        {% for plugin in pluginsXAI %}
            <li>pluginsXAI
                <a href="/plugin/{{ plugin.nom }}">{{ plugin.nom }}</a>
            </li>
        {% endfor %}
    </ul>
        <div class="cas-d-usage">
            <h2>CAS D'USAGE</h2>
            <table class="table">
                <tbody>
                    <tr>
                        <td>Cas d'usage</td>
                        <td>{{ cas_d_usage }}</td>
                    </tr>
                    <tr>
                        <td>Modèle</td>
                        <td>
                            <select name="modele">
                                {% for plugin in pluginsXAI %}
                                    <option value="{{ plugin.nom }}">{{ plugin.nom }}</option>
                                {% endfor %}
                            </select>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </html>

Так почему же в первом случае в ссылках отображается ElMagnificoPlugin (plugin.nom), а во втором - нет, в выпадающем списке?

introducir la descripción de la imagen aquí

Я так не думаю, потому что шаблон рендерится до того, как заполняется переменная pluginsXAI. Хотя функция render_template не дожидается завершения асинхронных операций, поэтому коллекция плагинов недоступна при рендеринге шаблона, я пробовал использовать ее с декоратором @app.before_request, и это не сработало.

Вот app.py:

from flask import Flask, render_template
from kaasrc.plugin_collection import PluginCollection
import os

app = Flask(__name__)


@app.route("/")
def index():
  # Générez la sortie HTML
  return render_template("index.html")


@app.route("/plugins")
def plugins():
  # Récolte des plugins
  pluginsXAI = PluginCollection(os.path.join(os.getcwd(), 'pluginsXAI'))
  pluginsUCXAI = PluginCollection(os.path.join(os.getcwd(), 'pluginsUCXAI'))

  # Génère la sortie HTML
  return render_template("plugins.html", pluginsXAI=pluginsXAI, pluginsUCXAI=pluginsUCXAI)


if __name__ == "__main__":
  app.run(debug=True)

Bot ElMagnificoPlugin.py:

class ElMagnificoPlugin(kaasrc.plugin_collection.Plugin):
    #---------------------------------------------------------------------------
    def __init__(self):
        super().__init__()
        self.nom = "ElMagnificoPlugin"
        self.description = "Permiter explanear cosas importantes sobre una machina"
        self.clef = "x"

А вот kaasrc/plugin_collection.py, который позволяет получить плагины в директории:

class PluginCollection(object):
    """Upon creation, this class will read the plugins package for modules
    that contain a class definition that is inheriting from the Plugin class
    """

    #---------------------------------------------------------------------------
    def __init__(self, pluginsDirectory):
        """Constructor that initiates the reading of all available plugins
        when an instance of the PluginCollection object is created
        """
        self.plugins = []
        self.dicoPlugins = {}
        self.seen_paths = []
        self.pluginsDirectory = pluginsDirectory
        self.loadPlugins()
        self.index = 0  # Ajoutez un index pour suivre l'itération

    def __iter__(self):
        return self  # Retourne l'objet lui-même pour l'itération

    def __next__(self):
        if self.index < len(self.plugins):  # Si l'index est dans la plage des plugins
            result = self.plugins[self.index]  # Obtenez le plugin à l'index actuel
            self.index += 1  # Incrémentez l'index
            return result  # Retournez le plugin
        else:
            raise StopIteration  # Si l'index est hors de portée, arrêtez l'itération

Ответы (0 шт):