2015-07-03 4 views
0

У меня есть эта программа, которая отправляет запрос GET с использованием библиотеки запросов и затем отправляет запрос POST на другой сервер.Несколько случайных запросов POST в Python

import requests 

# inside the loop : 
headers = {'charset':'utf-8','Content-Type':'application/json'} 
url = "http://someurl/_get_v2.php" 
data = jenal 

try : 
    resp = requests.post(url,json=data,headers=headers, timeout=(connect_timeout,read_timeout)) 

    print "Post request sent" 
# If a connection error occurs, start from the beginning of the loop 
except requests.exceptions.ConnectionError as e: 
    continue 
# If a read_timeout error occurs, start from the beginning of the loop 
except requests.exceptions.ReadTimeout as e: 
    continue 
time.sleep(10) 

Это часть POST от основного контура. Я использовал try и за исключением случаев, когда программа задерживается, я не хочу, чтобы она останавливалась на любую ошибку, но обновляется и продолжается с самого начала цикла и так далее навсегда. Логично, что программа должна быть прекрасной, но при внезапном множестве задержек программа одновременно отправляет несколько запросов POST.

Например: журнал должен быть таким: 10 отправлено. 20 отправлено. 30 отправлено. 45 отправлено (задержка 5 секунд). 55 послало

но что это происходит: 10 послало 20 послало 30 послала задержки ..
45 послало 45 послали 45 посланных (несколько копий данных посылаются в то же самое время, которое развращает мою базу данных) 55 отправлено

Как я могу предотвратить дополнительные копии?

Это первая часть программы. В случае, если есть что-нибудь в почтовом части, эта часть повторяется, и я могу видеть на печать каждый раз:

connect_timeout = 3.05 
read_timeout = 2 

while True: 
loop_time_start = time.time() 
# GET 

url_source = 'http://something/api_json.asp?cmd=list_metering&auth=YWRtaW46YWRtaW4=' 
try: 
    url = requests.get(url_source) 
    print "GET request sent" 
except requests.exceptions.ConnectionError as e: continue 
+0

Что делать, если вы добавить 'boolean' к нему и при проводке, установите его в' 'true' .. проводки = true' и когда вы поймаете ошибку или закончите POSTing, установите ее на «False» .. 'posting = False'. Итак, вы можете сказать: 'if not posting:'. – Dobz

+0

@ RussellHickey Я помещаю его в запрос POST сэр ?! –

+0

выставить его за пределами 'try:', 'if not posting: try: posting = True'. Затем после вашего 'print' и внутри' except 'помещается' posting = False' ... С другой стороны, это может быть продолжение, это не дает времени ждать следующего. – Dobz

ответ

1

Что делать, если вы добавить таймер к коду.

import requests 
from datetime import datetime, time 

posting = False 

# inside the loop : 

if not posting: 
    posting = True 

    headers = {'charset':'utf-8','Content-Type':'application/json'} 
    url = "http://someurl/_get_v2.php" 
    data = jenal 

    start = datetime.now() 
    try : 
     resp = requests.post(url,json=data,headers=headers,timeout=(connect_timeout,read_timeout)) 

     print "Post request sent" 

     posting = False 

    except requests.exceptions.ConnectionError as e: 
     # If you continue here, then there will be no sleep. 
     # If your POST fails straight away, it tries again straight away. 

     # You should print/log here so you know which exception is being caught. 

     # Add Timer 
     end = datetime.combine(start.date(), time(0)) 

     ShouldISleep(start, end) 

     posting = False 

     continue 

    except requests.exceptions.ReadTimeout as e: 
     # If you continue here, then there will be no sleep. 
     # If your POST fails straight away, it tries again straight away. 

     # You should print/log here so you know which exception is being caught. 

     # Add Timer 
     end = datetime.combine(start.date(), time(0)) 

     ShouldISleep(start, end) 

     posting = False 

     continue 

    time.sleep(10) 

Создание функции

def ShouldISleep(t1, t2): 
    passed = (t1 - t2).seconds 
    if passed < 10: 
     time.sleep(10 - passed) 
+0

Это правда, сэр, я хочу, чтобы он начинался с начала цикла в случае, если есть ошибка, это то, что происходит? До сих пор я не понимаю эту ошибку:? Я хочу спать только после отправки, но проблема с несколькими сообщениями. –

+0

Как сделать небольшой сон, если он не сработает? Просто чтобы быть уверенным, что есть задержка. Кажется, что он сразу проваливается и снова пытается снова, так что он постоянно бомбардирует POST. Вы можете даже поспать на секунду, и проверка поможет. – Dobz

+0

На самом деле задержка уже существует, но я не включил эту часть программы, но позвольте мне включить ее в вопрос. –