Я пытаюсь вернуть свои сообщения, но вместо этого я получаю
TypeError: объект "Курсор" не может быть вызван.
Как я могу это исправить? Вот мой код:
from flask import Flask
from flask.ext.pymongo import PyMongo
app = Flask(__name__)
mongo = PyMongo(app)
from pymongo import Connection
connection = Connection()
db = connection.test_database
collection = db.test_collection
@app.route('/')
def home_page():
post = {"author":"mike","text":"jiii"}
posts = db.posts
posts.insert(post)
return posts.find()
if __name__=='__main__':
app.run(debug=True)
Ответ 1 · рейтинг 13 · JohnnyHK
find() возвращает объект Cursor. которые вы должны повторить, чтобы получить доступ к документам, возвращаемым запросом. Как в:
for post in posts.find():
# do something with post
Ответ 2 · рейтинг 6 · Sean Vieira
Когда вы возвращаете что-то из обработчика Flask, это должен быть один из следующих типов вещей:
Когда вы возвращаете объект PyMongo Cursor, Flask видит, что он не является экземпляром flask.Response (на самом деле, flask.Flask.response_class), а не кортеж, поэтому предполагается, что это должен быть объект WSGI, и он пытается его вызвать (отсюда и ошибка).
Лучшее решение - либо использовать flask.jsonfiy для возврата ответа JSON, либо создайте шаблон для отображения сообщений и используйте render_template, чтобы вернуть соответствующий ответ.
Ответ 3 · рейтинг 1 · Eric Schrijver
Ответы выше оба правильные. Ожидается, что представления Flask вернут какой-то HTTP-ответ. Итак, вам нужно обработать данные и дать ответ, возможно, используя служебные функции Flask. Кроме того, метод find() возвращает курсор, который вам нужно перебрать в какой-то момент.
Вам просто нужно изменить последнюю строку представления:
@app.route('/')
def home_page():
post = {"author":"mike","text":"jiii"}
posts = db.posts
posts.insert(post)
return render_template(posts.find(), "index.html")
И предоставьте index.html, который содержит что-то вроде:
{% for post in posts %}
<h2>Post by {{ post.author}}</h2>
<p>{{ post.text }}</p>
{% endfor %}