【问题标题】:Why does a request via Python `requests` takes almost seven times longer than in Postman?为什么通过 Python `requests` 发出的请求比在 Postman 中花费的时间几乎长七倍?
【发布时间】:2019-01-07 02:08:22
【问题描述】:

我目前正在使用requests.post() 向 Python 2.7 中的服务器发出 HTTP Post 请求,大约需要 700 毫秒。也绝对没有可能导致延迟的代理服务器,但我仍然绕过任何代理,因为这似乎是该库的问题。

尽管如此,我还是对那段时间感到好奇,因为在我看来,大约 230 个字符的答案需要很长时间。这就是我在 Postman 中尝试相同请求的原因。结果是 Postman 中的请求用时不到 100 毫秒!这更适合我必须完成的任务。时间到了。

我想知道requests.post() 中是否有任何我必须设置的特定参数,或者这个函数有那么慢吗?

请求目前看起来像这样(非常基本的东西):

req = requests.post(url, json={"Username": username, "Password": password, "TerminalNo": terminalno)}) 
json = req.json()

如果需要,来自服务器的标头:

cache-control →private
content-length →228
content-type →application/json; charset=utf-8
date →Mon, 30 Jul 2018 17:58:05 GMT
server →Microsoft-IIS/7.5
x-aspnet-version →2.0.50727
x-powered-by →ASP.NET

【问题讨论】:

  • 你是如何测量时间的?您是否进行了多次试验?
  • 在 Python 中,我从 req.elapsed.total_seconds() 获得了那个时间。在 Postman 中,它与结果一起显示。

标签: python python-requests http-post


【解决方案1】:

不知道为什么这个重要的问题还没有回答。

无论如何,可能原因是:默认情况下 requests.get(...)requests.post(...) 不使用会话。
由于这个原因,每次我们调用这些方法时,每次它都会重新配置连接和所有其他网络内容.
这就是为什么每次都花费与之前的请求相同的时间。

为了克服这个问题,我们可以使用 session。

import requests

url_call = "https://en.wikipedia.org/wiki/Jamal_Nazrul_Islam"
session = requests.Session()
session.get(url_call)

通过使用 session,第一次调用会花费很多时间。从第二次调用开始,在同一个域上,将花费更少的时间。

我的实验:

第一次调用:2154 毫秒
第二次调用:318 毫秒
第三次调用:124 毫秒
第四次调用:125 毫秒

【讨论】:

    【解决方案2】:

    这可能是由于服务器的响应格式不正确,导致解析问题。

    您可以通过不读取从服务器收到的响应来检查这一点。如果代码仍然很慢,这不是您的问题,但如果解决了问题,问题可能在于解析响应。

    1. 如果某些标头设置不正确,可能会导致解析错误,从而阻止分块传输 (source)。
    2. 在其他情况下,手动设置编码可能会解决解析问题 (source)。

    要解决这些问题,请尝试:

    req = requests.post(url, json={"Username": username, "Password": password, "TerminalNo": terminalno)}) 
    r.raw.chunked = True # Fix issue 1
    r.encoding = 'utf-8' # Fix issue 2
    json = req.json()
    

    没有解决您的问题?

    如果那没有解决您的问题,我收集了一些其他可能的解决方案here

    【讨论】:

      【解决方案3】:

      尝试使用 http.client

      import http.client
      import json
      ​
      conn = http.client.HTTPSConnection("example.com")
      payload = {'Username': 'username', 'Password': 'password', 'TerminalNo': 'terminalno'}
      body = json.dumps(payload)
      headers = {
        'authorization': 'XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX',
        'x-api-key': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
      }
      ​
      for i in range(10):
          start = time.time()
          conn.request("GET", "/", body, headers)
          res = conn.getresponse()
          data = res.read()
          response_time = time.time() - start
          print('{} {} ms'.format(i+1, round(response_time * 1000)))
      

      结果

      1 906 ms
      2 215 ms
      3 193 ms
      4 219 ms
      5 203 ms
      6 223 ms
      7 210 ms
      8 282 ms
      9 204 ms
      10 204 ms
      

      【讨论】:

        猜你喜欢
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-18
        • 1970-01-01
        相关资源
        最近更新 更多