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