Ошибка 404 при попытке вставить ACL в календарь с клиентом Python - работает, если я повторю попытку - PullRequest
0 голосов
/ 16 июня 2020

Использование 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}')

В любом случае для успеха требуется четыре попытки (от 14 до 30 секунд), а иногда и срок их действия.

Возможно ли, что недавно созданный календарь не сразу доступен для API, использующего его?

1 Ответ

1 голос
/ 17 июня 2020

Распространение часто является проблемой облачных сервисов. Крупномасштабные онлайн-сервисы распространяются по сети машин, которые сами по себе имеют определенный уровень задержки - существует дискретное ненулевое количество времени, которое требуется информации для распространения по сети и обновления повсюду.

Все операции, выполняемые после первого вызова, который не приводит к 404, являются демонстрацией этого процесса.

Смягчение:

Я предлагаю, если вы создаете и редактируете в том же вызове функции, реализуя какое-то время ожидания / сна, чтобы уменьшить вероятность получения 404-й ошибки. Это можно сделать в python, используя библиотеку времени:

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

Надеюсь, это будет вам полезно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...