Почему {{ 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), а во втором - нет, в выпадающем списке?
Я так не думаю, потому что шаблон рендерится до того, как заполняется переменная 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
