使用 exchangelib 从日历请求数据时出现问题
Problem when requesting data from the calendar using exchangelib
我正在尝试使用官方文档中几乎未更改的代码来读取相当大的日历。
from exchangelib import DELEGATE, Account, Credentials, CalendarItem, close_connections
from exchangelib.protocol import BaseProtocol
credentials = Credentials(
username='username',
password='password'
)
account = Account(
primary_smtp_address='address',
credentials=credentials,
autodiscover=True,
access_type=DELEGATE)
a = account
for calendar_item in a.calendar.all():
print('--------------------------')
print(calendar_item.organizer, calendar_item.start)
account.protocol.close()
同时,脚本的第一分钟什么也没有发生。那么几百行输出就是我需要的输出。之后,脚本因超时而停止,并出现以下错误:
提高 self._get_exception(code=response_code, text=msg_text, msg_xml=msg_xml)
exchangelib.errors.ErrorTimeoutExpired: 请求超时
我能否以某种方式增加超时或更改请求以使其运行更快?
第一分钟脚本没有空闲。如果你 enable debug logging, you'll most likely see that it's autodiscovery that's taking a long time. You can cache autodiscover results 并在下次 运行 脚本时使用它们,如果你想缩短启动时间。
至少有三种方法可以解决您的问题(甚至可以结合使用):
- 创建超时。设置例如。
BaseProtocol.TIMEOUT = 600
- 减少获取的数据量。而不是
a.calendar.all()
,做a.calendar.all().only('organizer', 'start')
- 配置 retry policy 让 exchangelib 在遇到超时错误时重试。
我正在尝试使用官方文档中几乎未更改的代码来读取相当大的日历。
from exchangelib import DELEGATE, Account, Credentials, CalendarItem, close_connections
from exchangelib.protocol import BaseProtocol
credentials = Credentials(
username='username',
password='password'
)
account = Account(
primary_smtp_address='address',
credentials=credentials,
autodiscover=True,
access_type=DELEGATE)
a = account
for calendar_item in a.calendar.all():
print('--------------------------')
print(calendar_item.organizer, calendar_item.start)
account.protocol.close()
同时,脚本的第一分钟什么也没有发生。那么几百行输出就是我需要的输出。之后,脚本因超时而停止,并出现以下错误: 提高 self._get_exception(code=response_code, text=msg_text, msg_xml=msg_xml) exchangelib.errors.ErrorTimeoutExpired: 请求超时
我能否以某种方式增加超时或更改请求以使其运行更快?
第一分钟脚本没有空闲。如果你 enable debug logging, you'll most likely see that it's autodiscovery that's taking a long time. You can cache autodiscover results 并在下次 运行 脚本时使用它们,如果你想缩短启动时间。
至少有三种方法可以解决您的问题(甚至可以结合使用):
- 创建超时。设置例如。
BaseProtocol.TIMEOUT = 600
- 减少获取的数据量。而不是
a.calendar.all()
,做a.calendar.all().only('organizer', 'start')
- 配置 retry policy 让 exchangelib 在遇到超时错误时重试。