[尝试使用Python客户端将ACL插入日历时出现错误404-如果我重试,则可以使用

问题描述 投票:0回答:1

使用Google Suite for Education。

我有一个应用程序想要:

  • 创建新日历。
  • 向此类日历添加ACL,因此学生角色将为“读者”。

一切都通过服务帐户运行。

创建日历就很好,但是插入ACL会引发404错误(为保护隐私而删除:

<HttpError 404 when requesting https://www.googleapis.com/calendar/v3/calendars/MY_DOMAIN_long_string%40group.calendar.google.com/acl?alt=json returned "Not Found">

试图插入ACL的函数:

    def _create_calendar_acl(calendar_id, user, role='reader'):
        credentials = service_account.Credentials.from_service_account_file(
            CalendarAPI.module_path)
        scoped_credentials = credentials.with_scopes(
            ['https://www.googleapis.com/auth/calendar'])

        delegated_credentials = scoped_credentials.with_subject(
            'an_admin_email')

        calendar_api = googleapiclient.discovery.build('calendar',
                                                       'v3',
                                                       credentials=delegated_credentials)
        body = {'role': role,
                'scope': {'type': 'user',
                          'value': user}}

        answer = calendar_api.acl().insert(calendarId=calendar_id,
                                           body=body,
                                           ).execute()
        return answer

最有趣的是,如果我重试该操作几次,它最终会成功。因此,这就是我的代码所做的:

def create_student_schedule_calendar(email):
    MAX_RETRIES = 5
    # Get student information

    # Create calendar
    answer = Calendar.create_calendar('a.calendar.owner@mydomain',
                                      f'Student Name - schedule',
                                      timezone='Europe/Madrid')

    calendar_id = answer['id']

    counter = 0
    while counter < MAX_RETRIES:
        try:
            print('Try ' + str(counter + 1))
            _create_calendar_acl(calendar_id=calendar_id, user=email)  # This is where the 404 is thrown
            break
        except HttpError:  # this is where the 404 is caught
            counter += 1
            print('Wait ' + str(counter ** 2))
            time.sleep(counter ** 2)
            continue

    if counter == MAX_RETRIES:
        raise Exception(f'Exceeded retries to create ACL for {calendar_id}')

无论如何,要花费4次尝试(介于14到30秒之间)才能成功-有时它会过期。

新创建的日历是否可能无法立即用于使用它的API?

python google-calendar-api google-api-client
1个回答
0
投票

传播通常是基于云的服务的问题。大型在线服务是沿着机器网络分布的,这些机器本身具有一定程度的延迟-信息沿着网络传播并在各处进行更新需要花费离散的,非零的时间。

在第一次调用后所有未执行404的操作都在此过程中进行演示。

缓解措施:

我建议您是否要在同一函数调用中创建和编辑,以实现某种程度的等待/睡眠以减轻获取404错误的时间。这可以使用时间库在python中完成:

import time
# calendar creation code here
time.sleep(2)
# calendar edit code here

希望对您有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.