Я использую флягу для рендеринга html-шаблона. Я хочу сохранить все элементы, возвращаемые запросом pymongo, в массив java-скриптов. Я создал массив c[], который сначала пуст. И я использовал цикл фляги для перебора возвращенных элементов запрос pymongo, и я помещаю его в массив c.
Я пробовал некоторые ответы на stackoverflow, но они не соответствуют пониманию моего вопроса.
мой HTML-код находится здесь: home.html
<html>
<head>
<title>ii</title>
</head>
<script>
var c=[]
{% for todo in collection %}
c.push{{todo["q"]}};
{% endfor %}
</script>
</body>
</html>
мой файл фляги: -
from flask import Flask, render_template,json
from pymongo import MongoClient
from bson import json_util,ObjectId
app = Flask(__name__)
mongo_object = MongoClient("localhost", 27017)
app.debug= True
db = mongo_object['test']
collection = db['myc']
@app.route('/')
def index():
return render_template('home.html')
@app.route('/find',methods=['GET', 'POST'])
def pymongo_data_display():
my_data = collection.find()
a1 = "active"
return render_template('home.html',a1=a1,collection=my_data,t = "hi",h = "hoho")
'''
if not my_data:
return 'no data'
else:
return my_data
'''
if __name__ == '__main__':
app.run()
it gives nothing.But can anyone suggest what to do here?
Есть пара вещей:
my_data
непустым, когда вы предоставляете его render_template
? Какова структура данных?todo["q"]
в шаблоне? Это число или строка? Если последнее, вам нужно будет заключить его в кавычки, прежде чем вставлять в массив JavaScript.c.push{{todo["q"]}};
.Допустим, вам нужно сохранить список строк в массиве JavaScript (т. е. вам нужно заключить значения в кавычки, прежде чем вставлять их в массив). Затем вам нужно определить пользовательский фильтр для его достижения. Вот полный пример:
import jinja2
def quote(value):
return '"{}"'.format(value)
env = jinja2.Environment()
env.filters['quote'] = quote
template = env.from_string("""
<script>
var c = [];
{% for item in data %}
c.push({{ item.q|quote|safe }});
{% endfor %}
</script>
""")
data = [{'q': 1}, {'q': 2}, {'q': 3}]
print(template.render(data=data))
Это работает:
home.html file:
<html>
<head>
<title>ii</title>
<script>
function populateMyDiv(){
var ul=document.createElement('ul');
{% for name in collection %}
var li=document.createElement('li');
ul.appendChild(li);
li.innerHTML=li.innerHTML + "{{name}}";
{% endfor %}
document.getElementById("test").appendChild(ul);
}
</script>
</head>
<body onload = "populateMyDiv()">
<div id = "test"></div>
</body>
</html>
test.py file:
from flask import Flask, render_template
from pymongo import MongoClient
import json
app = Flask(__name__)
mongo_obj=MongoClient("localhost", 27017)
@app.route('/')
def hello_world():
db = mongo_obj['your_database']
collection = db['your_collection']
temp = collection.find()
my_data = []
for x in temp:
my_data.append(x['name'])
return render_template('home.html',collection=my_data)