mongo.db.collectionsNames.find()
возвращает курсор: print(mongo.db.collectionsNames.find())
дает <pymongo.cursor.Cursor object at 0x7fd3854d5710>
.
Чтобы упростить (но неправильно) курсор, это особый тип экземпляра, который извлекает данные из фрагмента базы данных с помощьючанк, так что если вы хотите получить 1 000 000 первых элементов в дБ, вы фактически не храните 1M элементов в оперативной памяти, вы итерируете 100 на 100 элементов (например).Курсор обрабатывает это волшебным образом.
Как бы то ни было, вы не можете зацикливаться несколько раз на одном и том же курсоре, и вам никогда не следует помещать курсор в список, подобный list(cursor_instance)
(потому что, если ваш запрос запрашивает продукт 1M, выполните этодобавьте все эти продукты в оперативную память).
Итак, теперь, как вы можете справиться с этим.В большинстве случаев я бы сказал, что лучше вызывать метод, когда вам это нужно, дважды, если это необходимо.
Но здесь вы находитесь в среде Jinja, и если я прав, вызов методов в шаблоне Jinja невозможен.
Способ сделать это - использовать свойства.
class LazyCollection(object):
@property
def collections_names(self):
return mongo.db.collectionsNames.find()
lazycoll = LazyCollection()
return render_template('index.html', collectionsNames=lazycoll)
Затем в вашем шаблоне:
{% for asd in collectionsNames.collections_names %}
<p>{{ asd.foo }}</p>
{% endfor %}