odiephd
odiephd

Reputation: 11

Strange Intermittent posting issue using python requests

I'm using a raspberry pi 3 and python 2.7 with requests to post data to my lamp server. All works great except for intermittent posting errors which are trapped requests.exceptions.ConnectTimeout. BTW, timeout=0.5 sec which is 2.5x the posting time (0.2 sec). See code below.

When the request exception occurs, I check for internet access using CheckConnection(). BTW, this takes only 0.016 sec on pi;so fast compared to other techniques. When False, it doesn't retry posting and logs data locally.

However, I can connect remotely to the Pi using TeamViewer while this is happening! I am posting data to our server with other installations so it is not a cloud server down issue.

After several to many minutes, the issue resolves itself and posting resumes like nothing was wrong.

Any suggestions to how I can change my code is most welcomed either to determine the root cause or fix the issue. Thank you in advance.

******** CODE ************

def PostData(payload,retry_count=3):

url = 'http://xxx.xxx.xxx.xxx/api/data/push/'
try:
    response = requests.post(url,params=payload,timeout=0.5)
    if response.status_code == 200:
        return response.text
    response.raise_for_status()

except (requests.exceptions.RequestException, requests.exceptions.ConnectTimeout) as e:
    print "Post Error..."
    x = CheckConnection()
    if x==False:
        return "Internet for Posting: " + str(x)
    if retry_count >0:
        Reason = "Post Settings Retry: " + str(retry_count) 
        print Reason
        #sleeptime = 0.05*2**(3-retry_count)
        #time.sleep(sleeptime)            
        return PostData(payload, retry_count-1)
    if retry_count==0:
        Reason = "Error! Post settings retry failed. Retry=0.  Internet: " + str(x) 
        return Reason
    return None

except Exception as e:
    x = CheckConnection()
    Reason= "Error! Posting Exception: " + str(e) + "Internet: " + str(x)
    print Reason
    return None

def CheckConnection(host="8.8.8.8",port=53,timeout=0.5):

try:
    socket.setdefaulttimeout(timeout)
    socket.socket(socket.AF_INET,socket.SOCK_STREAM).connect((host,port))
    return True
except Exception:
    return False

Upvotes: 0

Views: 219

Answers (0)

Related Questions