2012-04-26 3 views
7

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

TypeError: 'Cursor' object is not callable.

Как я могу это исправить? Вот мой код:

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) 

ответ

10

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

for post in posts.find(): 
    # do something with post 
6

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

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

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

0

Ответы, приведенные выше, являются правильными. Ожидается, что представления флагов возвратят какой-то 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 %} 
0

Использование:

from flask_pymongo import Pymongo 

вместо :

from flask.ext.pymongo import PyMongo 
Смежные вопросы