12

投稿を返そうとしていますが、代わりに

TypeError:'Cursor'オブジェクトを呼び出すことはできません。

どうすればこれを修正できますか?これが私のコードです:

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)
4

4 に答える 4

13

find()は、クエリによって返されたドキュメントにアクセスするために反復する必要があるCursorオブジェクトを返します。のように:

for post in posts.find():
    # do something with post
于 2012-04-27T00:34:33.487 に答える
7

Flaskハンドラーから何かを返すときは、次のいずれかのタイプである必要があります。

PyMongoオブジェクトを返すと、 Flaskはそれが(実際には)Cursorのインスタンスではなく、タプルでもないことを確認するため、WSGIオブジェクトである必要があると見なし、それを呼び出そうとします(したがってエラー)。flask.Responseflask.Flask.response_class

最善の解決策は、を使用flask.jsonfiyしてJSON応答を返すか、テンプレートを作成して投稿をレンダリングし、を使用render_templateして適切な応答を返すことです。

于 2012-04-27T20:20:09.257 に答える
1

上記の答えは両方とも正しいです。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 %}
于 2014-05-20T20:29:46.587 に答える
0

使用する:

from flask_pymongo import Pymongo

それ以外の:

from flask.ext.pymongo import PyMongo
于 2017-04-20T22:30:46.140 に答える