web-dev-qa-db-ja.com

HTTP requests.postタイムアウト

以下のコードでは、requests.post。サイトがダウンした場合に単に続行する可能性は何ですか?

私は次のコードを持っています:

def post_test():

    import requests

    url = 'http://example.com:8000/submit'
    payload = {'data1': 1, 'data2': 2}
    try:
        r = requests.post(url, data=payload)
    except:
        return   # if the requests.post fails (eg. the site is down) I want simly to return from the post_test(). Currenly it hangs up in the requests.post without raising an error.
    if (r.text == 'stop'):
        sys.exit()  # I want to terminate the whole program if r.text = 'stop' - this works fine.

どのようにしたら、requests.postタイムアウトを作成できますか、example.comまたはその/ submitアプリがダウンしている場合、post_test()から戻りますか?

14
Zorgmorduk

timeoutパラメータを使用します。

r = requests.post(url, data=payload, timeout=1.5)

注:timeoutは、応答のダウンロード全体の時間制限ではありません。むしろ、サーバーがtimeout秒間応答を発行しなかった場合(より正確には、基になるソケットでtimeout秒間バイトが受信されなかった場合)、例外が発生します。タイムアウトが明示的に指定されていない場合、リクエストはタイムアウトしません。

22
JacobIRR

すべてのリクエストは、timeoutキーワード引数を取ります。 1

requests.postは、引数をrequests.requestに転送するのを簡単にします 2

アプリがダウンしている場合、ConnectionErrorよりもTimeoutの可能性が高くなります。 

try:
    requests.post(url, data=payload, timeout=5)
except requests.Timeout:
    # back off and retry
    pass
except requests.ConnectionError:
    pass
12
Oluwafemi Sule