пимонго с флягой

Я пытаюсь вернуть свои сообщения, но вместо этого я получаю

TypeError: объект «Курсор» не может быть вызван.

Как я могу это исправить? Вот мой код:

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)

person vishnusathyanesan    schedule 26.04.2012    source источник


Ответы (4)


arrow_upward
13
arrow_downward

find() возвращает объект Cursor. которые вы должны повторить, чтобы получить доступ к документам, возвращаемым запросом. Как в:

for post in posts.find():
    # do something with post
person JohnnyHK    schedule 27.04.2012

arrow_upward
6
arrow_downward

Когда вы возвращаете что-то из обработчика Flask, это должен быть один из следующих типов вещей:

  • Объект flask.Response (или werkzeug.wrappers.Response). Использование render_template Flask вернет объект ответа.
  • Кортеж в форме (content, status_code, headers)
  • Вызываемый WSGI (функция или вызываемый объект, который принимает два параметра и возвращает итерируемый объект).

Когда вы возвращаете объект PyMongo Cursor, Flask видит, что он не является экземпляром flask.Response (на самом деле, flask.Flask.response_class), а не кортеж, поэтому предполагается, что это должен быть объект WSGI, и он пытается его вызвать (отсюда и ошибка).

Лучшее решение — либо использовать flask.jsonfiy для возврата ответа JSON, либо создайте шаблон для отображения сообщений и используйте render_template, чтобы вернуть соответствующий ответ.

person Sean Vieira    schedule 27.04.2012

arrow_upward
1
arrow_downward

Ответы выше оба правильные. Ожидается, что представления 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 %}
person Eric Schrijver    schedule 20.05.2014

arrow_upward
0
arrow_downward

Использовать:

from flask_pymongo import Pymongo

вместо:

from flask.ext.pymongo import PyMongo
person ask_me    schedule 20.04.2017