0

我是烧瓶的新手,正在尝试构建一个 API,它返回数据库中所有帖子的 json 响应,但我无法获得所有这些帖子,只返回一个帖子。(我使用的是香草烧瓶,不使用任何像“烧瓶休息')。这是我尝试过的。

from .db import get_db
from flask import jsonify,Blueprint
bp= Blueprint("api",__name__,url_prefix="/api")

@bp.route("/posts",methods=("GET",))
def get_posts():
    db = get_db()
    posts=db.execute('SELECT p.id, title, body, created, author_id, username'
   ' FROM post p JOIN user u ON p.author_id = u.id'
   ' ORDER BY created DESC').fetchall()
   for post in posts:
     title=post["title"]
     body=post["body"]
     author=post["username"]
     return jsonify(
         title=title,
         body=body,
         author=author
     )'''

它只返回 JSON 格式的第一篇文章。我想要所有的帖子。

4

2 回答 2

0

发生这种情况是因为您在 for 循环内返回结果,因此,它停止迭代并返回第一个结果。您可以创建一个列表并将 jsonify 附加到该列表,或者您可以使用 Marshmallow 为您进行序列化。如果您想创建列表并附加结果,您可以执行以下操作:

post_list = []
for post in posts:
   ...
   post_list.append(jsonify(
     title=title,
     body=body,
     author=author
 ))
return post_list
于 2020-04-09T13:06:04.807 回答
0

问题是 jsonify 返回一个 Flask Response,因此尝试将其附加到列表不是一个好主意。
比如,你怎么能从 HTTP 请求中返回很少的响应?

更好的主意是将所有帖子存储在列表中,然后将它们 jsonify。

post_list = []
for post in posts:
   title=post["title"]
   body=post["body"]
   author=post["username"]
   resp = {"title":title, "body":body, "author":author}
   post_list.append(resp)
return jsonify(post_list)
于 2020-04-14T19:13:48.063 回答