2012-04-26 1042 views
7

Tôi cố gắng để trở lại bài viết của tôi, nhưng thay vào đó tôi nhận đượcpymongo với bình

TypeError: 'Cursor' object is not callable.

Làm thế nào tôi có thể sửa chữa điều này? Đây là mã của tôi:

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) 

Trả lời

10

find() trả về một đối tượng Cursor mà bạn phải lặp trên để truy cập các tài liệu trả về bởi truy vấn. Như trong:

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

Khi bạn quay lại một cái gì đó từ một handler Flask nó phải là một trong các loại sau đây của sự vật:

Khi bạn quay lại đối tượng PyMongo Cursor Flask thấy rằng nó không phải là một thể hiện của flask.Response (trên thực tế, flask.Flask.response_class) và không phải là một tuple nên giả định rằng nó phải là một đối tượng WSGI và cố gắng gọi nó (vì thế lỗi).

Giải pháp tốt nhất là sử dụng flask.jsonfiy để trả về phản hồi JSON hoặc create a template để hiển thị bài đăng và sử dụng render_template để trả về phản hồi thích hợp.

0

Các câu trả lời ở trên đều chính xác. Các khung nhìn Flask được mong đợi sẽ trả về một số loại phản hồi HTTP. Vì vậy, bạn cần xử lý dữ liệu và đưa ra phản hồi, có thể sử dụng các chức năng tiện ích của Flask. Ngoài ra, phương thức find() trả về một con trỏ, mà bạn cần phải lặp lại tại một số điểm.

Bạn chỉ cần thay đổi dòng cuối cùng của quan điểm:

@app.route('/') 
def home_page(): 
    post = {"author":"mike","text":"jiii"} 
    posts = db.posts 
    posts.insert(post) 
    return render_template(posts.find(), "index.html") 

Và cung cấp một index.html có chứa một cái gì đó như:

{% for post in posts %} 
<h2>Post by {{ post.author}}</h2> 
<p>{{ post.text }}</p> 
{% endfor %} 
0

Sử dụng:

from flask_pymongo import Pymongo 

thay vì :

from flask.ext.pymongo import PyMongo