2012-04-26 33 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

find()方法返回一个对象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

上面的答案都是正确的。 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 %} 
0

用途:

from flask_pymongo import Pymongo 

代替:

from flask.ext.pymongo import PyMongo