为了账号安全,请及时绑定邮箱和手机立即绑定

互联网断开后如何继续请求发布

互联网断开后如何继续请求发布

米琪卡哇伊 2021-12-29 10:44:26
with open("student.csv", "r") as csv_ledger:    r = csv.DictReader(csv_ledger)    data = [dict(d) for d in r ]    groups = {}    for k, g in groupby(data, lambda r: (r['name'])):        items = []        for i in g:        #data processing        try:           post_api = requests.post(ENDPOINT_URL, json=groups, headers=headers)        except requests.ConnectionError:              print("Something went wrong")        finally:              print("resume post request")目前,当互联网连接断开时,我的代码将无法恢复发布请求。如果我使用 try 和 exception,它就不起作用。
查看完整描述

2 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

不确定您是否可以在没有服务器端实现的情况下随意恢复,但您可以从客户端恢复。这是一个简单的阻塞示例,但您可能希望将其放入线程中。


import csv

import socket

from time import sleep


import requests



def is_internet_on():

    try:

        socket.setdefaulttimeout(3)

        socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect(('1.1.1.1', '8080'))

        return True

    except:

        return False



def do_call_later(url, headers, body):

    while not is_internet_on():

        sleep(5)

    requests.post(url, headers=headers, body=body)



with open("student.csv", "r") as csv_ledger:

    r = csv.DictReader(csv_ledger)

    data = [dict(d) for d in r]

    groups = {}


    for k, g in groupby(data, lambda r: (r['name'])):

        items = []

        for i in g:

            # data processing

            pass

        try:

            timeout_arg = (

                # first tuple value is the connection timeout,

                # how long to wait before initial connection is established

                1.0,

                # second tuple value is the read timeout, this is how long

                # the client will wait after the initial connection

                # before dropping the connection because no response was sent

                1.0

            )

            post_api = requests.post(ENDPOINT_URL, json=groups, headers=headers, timeout=timeout_arg)

        except requests.ConnectionError:

            do_call_later(ENDPOINT_URL, headers, groups)

        finally:

            print("resume post request")

编辑:超时调用的文档:https : //github.com/kennethreitz/requests/blob/master/requests/api.py#L34


查看完整回答
反对 回复 2021-12-29
?
喵喔喔

TA贡献1735条经验 获得超5个赞

不确定,它是否可以像这样工作。

可恢复请求的思想是将数据分块发送,然后组装为后端。因此,如果中间请求失败,它可以稍后通过发送其他块来恢复。后端也应该能够接受块并组装它们

看一个python库可恢复


查看完整回答
反对 回复 2021-12-29
  • 2 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信