【问题标题】:How to combine request from external API and send it as a response in Flask如何组合来自外部 API 的请求并将其作为响应发送到 Flask
【发布时间】:2016-07-15 14:43:05
【问题描述】:

我正在访问 Hacker news API here,并希望获取通过 JSON 获得的每个帖子的详细信息。我想将此 JSON 发送到我的 React 前端。

此请求需要很长时间。我需要做什么才能发送响应?

@app.route('/api/posts')    
def get_posts():
    r = requests.get('https://hacker-news.firebaseio.com/v0/askstories.json?print=pretty')
    data = r.text
    jsonData = []
    for post in data:
        r = requests.get('https://hacker-news.firebaseio.com/v0/item/'+post+'.json?print=pretty')
        r.text
        jsonData.append(r.text)
    jsonData = jsonify(jsonData)
    print jsonData  
    return jsonData

【问题讨论】:

  • 您已经在做的事情有问题吗?你的缩进看起来有点不靠谱,但是你看到了什么错误?
  • 页面加载时间过长。即使是现在我们所说的控制台中也没有任何东西。
  • 嗯,是的,您必须等待其他几个请求和响应完成。这是出乎意料的吗?

标签: python flask python-requests


【解决方案1】:

您正在查询 json API 并将响应视为文本:

r = requests.get('https://hacker-news.firebaseio.com/v0/askstories.json?print=pretty')
data = r.text

所以,r.text 将是一个字符串“[1234,1235,1236]”并且不是一个整数列表。

因此,当您在 for post in data 中对其进行迭代时,您所做的是获取每个字符:

for post in data:
    print(post)

会给你:

[
1
2
3
4
,
...etc

因此,您实际上是在向黑客新闻 API 查询数百个无效帖子,而不是数十个实际帖子。您应该将 json 视为 json — 通过使用请求中内置的 json 功能:data = r.json()

这将为您提供一个要迭代的数字列表——您还需要更改连接数据以制作 url 字符串的糟糕方式(使用 .format)。

【讨论】:

    【解决方案2】:

    requests 有一个 .json() 方法,您应该使用该方法将 JSON 数组字符串转换为 python 列表。

    In [1]: import requests
    
    In [2]: r = requests.get('https://hacker-news.firebaseio.com/v0/askstories.json?print=pretty')
    
    In [3]: jsonData = r.json()
    
    In [4]: for data in jsonData[:5]:
       ...      print data
       ...:
    12102489
    12100796
    12101060
    12097110
    12094366
    

    如另一个答案所述,for post in data: 将为您提供 HTTP 响应中的单个字符。换句话说,想想for post in "abc":会给你什么。

    页面加载时间很长

    这是因为您正在针对所有这些单独的字符运行新查询。

    【讨论】:

      猜你喜欢
      • 2012-03-09
      • 2016-05-01
      • 2019-12-02
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多