#python #python-3.x #python-requests
#python #python-3.x #python-запросы
Вопрос:
Я использую requests post для отправки некоторых данных, теперь я установил значение тайм-аута requests.post примерно на 60. другие подобные вопросы, связанные с конкретными приложениями, поэтому я хотел задать его как общую ошибку python.
это ошибка, которую я получаю:
failed to connect ('Connection aborted.', timeout('The write operation timed out'))
Я предполагаю, что это связано с тем, что по какой-то причине мой поток не смог отправить все данные вовремя, но я не уверен, поэтому просто хотел проверить. итак :
-
происходит ли эта ошибка из-за того, что поток не смог отправить все данные за время ожидания?
-
если да, могу ли я в любом случае установить время ожидания таким образом, чтобы оно начиналось только после отправки всех данных? я не хочу вечно ждать ответа сервера, но, очевидно, я хочу, чтобы таймер запускался, когда я отправляю все данные, а не в начале вызова функции. (и данные, которые я отправляю, различаются по размеру)
Ответ №1:
Если вы используете библиотеку python-request, вы можете указать параметр ‘timeout’ в качестве кортежа. Первый элемент — это «тайм-аут соединения», а второй — «тайм-аут чтения».
requests.get('http://google.com', timeout=(10,200) # give it 10 seconds to connect to the server, and timeout if server does not send any data back for 200 seconds
в запросах используется urrlib3.util.Тайм-аут под капотом.
Согласно документам urllib3, установка времени ожидания чтения на None будет вечно ждать ответа сервера. Но я согласен, что ждать вечно — плохая идея.
Сколько данных вы отправляете в своем запросе? Я прочитал часть кода python-requests и не смог найти простой способ определить, когда запрос будет отправлен.
В качестве доказательства концепции я написал этот код на основе запросов (микрозапросов)
Это позволяет передавать функцию обратного вызова в requests.get() . Этот обратный вызов будет запущен после отправки всех данных запроса, но до того, как какие-либо данные будут получены сервером.
import time
def sent_callback():
print('The request has finished sending at', time.time())
resp = get('http://google.com', send_callback=sent_callback)
print('response received at', time.time())
print('resp.text=', resp.text)
Ответ №2:
Это может быть из-за проблемы с сетью, если проект будет перенесен на рабочий сервер с высокой скоростью Интернета, это должно решить эту проблему (я все еще проверяю свой проект).
Но для разработки вы можете попробовать это:
# ('Connection aborted.', TimeoutError('The write operation timed out')): Increase chunksize
storage.blob._DEFAULT_CHUNKSIZE = 5 * 1024 * 1024
storage.blob._MAX_MULTIPART_SIZE = 5 * 1024 * 1024