2012-04-26 13 views
7

Ich versuche, meine Beiträge zurückzukehren, sondern bekomme ichpymongo mit Kolben

TypeError: 'Cursor' object is not callable.

Wie kann ich das korrigieren? Hier ist mein Code:

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) 

Antwort

10

Fund() gibt ein Cursor Objekt, das Sie durchlaufen müssen die Dokumente, die von der Abfrage zurück zuzugreifen. Wie in:

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

Wenn Sie etwas aus einer Flasche Handler zurückgeben muss es eine der folgenden Arten von Dingen sein:

Wenn Sie das PyMongo Cursor Objekt Flask zurückkehren sieht, dass es keine Instanz von flask.Response (eigentlich flask.Flask.response_class) und nicht ein Tupel so wird davon ausgegangen, dass es sich um ein WSGI Objekt sein muss, und versucht, es zu nennen (daher die Error).

Die beste Lösung ist entweder zu flask.jsonfiy verwenden, um eine JSON-Antwort oder zu create a template zurückkehren, um die Beiträge zu machen und verwenden render_template die entsprechende Antwort zurück.

0

Die obigen Antworten sind beide korrekt. Es wird erwartet, dass Flask-Ansichten eine Art HTTP-Antwort zurückgeben. Sie müssen also die Daten verarbeiten und eine Antwort geben, wahrscheinlich mithilfe der Dienstprogrammfunktionen von Flask. Außerdem gibt die Methode find() einen Cursor zurück, den Sie irgendwann durchlaufen müssen.

Sie müssen nur die letzte Zeile der Ansicht ändern:

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

und ein index.html zu schaffen, wie etwas enthält:

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

Verwendung:

from flask_pymongo import Pymongo 

statt :

from flask.ext.pymongo import PyMongo