1

API を呼び出す Web アプリを構築しています。私が現在使用している (変動する) API のリスポーン時間 (正しい用語ではない可能性があります) は 210 秒です。

リクエストの API 呼び出しは次のとおりです。

r = requests.post(url ,headers=headers, auth=auth, data=json.dumps(data))

呼び出しの後、またはにr等しいことができます。が返されるまで、この API 呼び出しを実行したいと考えています。フォーマットは何ですか?<Response [404]><Response [200]><Response [200]><Response [200]>

私の現在のループは次のとおりです。これを行うより良い方法はありますか?

while True:
    r = requests.post(url ,headers=headers, auth=auth, data=json.dumps(data))
    if (r == '<Response [200]>'): break
4

2 に答える 2

7

repr()出力とオブジェクトを混同しています。

応答オブジェクトには.status_code属性があり、それに対してテストします。

if r.status_code == 200:
    break

ただし、200 応答が返されるまで繰り返しサービスを叩くと、IP アドレスがブロックされる可能性があります。API の DOS 処理を防ぐために、ある種の指数バックオフを組み込みます。

于 2013-08-08T17:00:35.520 に答える
0

ここで繰り返す価値があるかもしれないソリューションをhttps://stackoverflow.com/a/40918529/2398354で共有しました。

requests HTTPAdapter を使用してみてください。次のようなものが機能するはずです。

import time
import httplib

import requests
from requests.adapters import HTTPAdapter


class RetryHTTPAdapter(HTTPAdapter):

    SECONDS_BETWEEN_RETRIES = 5

    def __init__(self, retry_time=120, *args, **kwargs):
        self.retry_time = retry_time
        super(RetryHTTPAdapter, self).__init__(*args, **kwargs)

    def send(self, *args, **kwargs):
        for _ in range(int(self.retry_time / self.SECONDS_BETWEEN_RETRIES)):
            response = super(RetryHTTPAdapter, self).send(*args, **kwargs)
            if response.status_code == httplib.OK:
                break
            time.sleep(self.SECONDS_BETWEEN_RETRIES)
        return response

s = requests.Session()
s.mount('http://', RetryHTTPAdapter(retry_time=180))
s.mount('https://', RetryHTTPAdapter(retry_time=180))

s.get('http://example.com')
于 2016-12-01T19:17:48.910 に答える