Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: vishnusathyanesanОтветов: 4

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

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)

flaskpymongo

Ответы

Ответ 1 · рейтинг 13 · JohnnyHK

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

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

Ответ 2 · рейтинг 6 · Sean Vieira

Когда вы возвращаете что-то из обработчика 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, чтобы вернуть соответствующий ответ.

Ответ 3 · рейтинг 1 · Eric Schrijver

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

Ответ 4 · ask_me

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

from flask_pymongo import Pymongo

вместо:

from flask.ext.pymongo import PyMongo

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы