2012-04-26 24 views
7

sto cercando di restituire i miei post, ma invece hopymongo con pallone

TypeError: 'Cursor' object is not callable.

Come posso correggere questo? Qui è il mio codice:

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) 

risposta

10

find() restituisce un oggetto Cursor che si deve iterare per accedere ai documenti restituiti dalla query. Come in:

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

quando si torna qualcosa da un gestore Flask deve essere uno dei seguenti tipi di cose:

Quando ritorni l'oggetto PyMongo Cursor Flask vede che non è un'istanza di flask.Response (in realtà, flask.Flask.response_class) e non una tupla quindi presuppone che esso deve essere un oggetto WSGI e tenta di chiamare (da qui il errore).

La soluzione migliore è utilizzare flask.jsonfiy per restituire una risposta JSON o create a template per il rendering dei post e utilizzare render_template per restituire la risposta appropriata.

0

Le risposte sopra sono entrambe corrette. Ci si aspetta che le visualizzazioni di Flask restituiscano una sorta di risposta HTTP. Quindi è necessario elaborare i dati ed effettuare una risposta, probabilmente utilizzando le funzioni di utilità di Flask. Inoltre, il metodo find() restituisce un cursore, che è necessario ripetere a un certo punto.

Hai solo bisogno di cambiare l'ultima riga della vista:

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

e fornire un index.html che contiene qualcosa come:

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

Usa:

from flask_pymongo import Pymongo 

invece di :

from flask.ext.pymongo import PyMongo