пимонго с флягой

Я пытаюсь вернуть свои сообщения, но вместо этого я получаю

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)

person vishnusathyanesan    schedule 26.04.2012    source источник


Ответы (4)


find() возвращает объект Cursor. которые вы должны повторить, чтобы получить доступ к документам, возвращаемым запросом. Как в:

for post in posts.find():
    # do something with post
person JohnnyHK    schedule 27.04.2012

Когда вы возвращаете что-то из обработчика Flask, это должен быть один из следующих типов вещей:

Когда вы возвращаете объект PyMongo Cursor, Flask видит, что он не является экземпляром flask.Response (на самом деле, flask.Flask.response_class), а не кортеж, поэтому предполагается, что это должен быть объект WSGI, и он пытается его вызвать (отсюда и ошибка).

Лучшее решение — либо использовать flask.jsonfiy для возврата ответа JSON, либо создайте шаблон для отображения сообщений и используйте render_template, чтобы вернуть соответствующий ответ.

person Sean Vieira    schedule 27.04.2012

Ответы выше оба правильные. Ожидается, что представления 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 %}
person Eric Schrijver    schedule 20.05.2014

Использовать:

from flask_pymongo import Pymongo

вместо:

from flask.ext.pymongo import PyMongo
person ask_me    schedule 20.04.2017