API Google Analytics (клиентская библиотека для Python) — обработка ошибок

Я использую пакетные запросы в Google Analytics API (Python). Ссылка на пакетную обработку: https://developers.google.com/api-client-library/python/guide/batch Пакетная обработка работает нормально, когда все записи через .add() верны (действительны). Если одно или несколько значений являются недопустимыми, пакетная обработка завершается с ошибкой для всех записей.

Я добавил функцию обратного вызова для обработки ошибки и увидел, что запрос BAtching не работает для всех записей в пакете (в отличие от только недопустимой записи). Есть ли способ обработать ошибку и пропустить недопустимую строку/запись и продолжить работу с остальными записями в пакете?

Ниже приведен пример кода, который я использовал, и сообщение об ошибке:

def add_user_callback(request_id, response, exception):
    if exception:
        print "error :",exception
    else:
        print "successful"

def main():
    ## code to set the account, property and other variables
    batch.add(service.management().webpropertyUserLinks().insert(
        accountId=account_id,
        webPropertyId=property_at,
        body={
                    'permissions': {
                        'local': [
                            'READ_AND_ANALYZE'
                        ]
                    },
                    'userRef': {
                        'email': '[email protected]'
                    }
                }))

    batch.add(service.management().webpropertyUserLinks().insert(
        accountId=account_id,
        webPropertyId=property_at,
        body={
                    'permissions': {
                        'local': [
                            'READ_AND_ANALYZE'
                        ]
                    },
                    'userRef': {
                        'email': '[email protected]' ## i used a dummy id : [email protected]
                    }
                }))
    batch.execute()


#Error :
#error : <HttpError 400 when requesting https://www.googleapis.com/analytics/v3/management/accounts/62974313/webproperties/UA-62974313-35/entityUserLinks?alt=json returned "Value for field user.email = [email protected] is not valid.">
#error : <HttpError 400 when requesting https://www.googleapis.com/analytics/v3/management/accounts/62974313/webproperties/UA-62974313-11/entityUserLinks?alt=json returned "Value for field user.email = [email protected] is not valid.">

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.


person Data Enthusiast    schedule 24.02.2016    source источник
comment
Используйте request_id в методе add, чтобы отслеживать неудачные запросы, и повторите попытку только с правильно отформатированными запросами. Все пакетные запросы должны быть атомарными, так как может потребоваться несколько запросов для изменения ACL одного пользователя — представьте запросы, необходимые для перемещения пользователя с уровня учетной записи на уровень представления.   -  person Matt    schedule 25.02.2016
comment
Мэтт, не могли бы вы указать пример кода для обработки request_id. Когда есть исключение, я пытаюсь обработать его в функции обратного вызова. Вот код, который я использую: bad_email = re.search(r'[a-zA-Z0-9]*@[a-z]*[.][a-z]*\S',str(exception)) bad_emails.append(bad_email) print "emails in the bad_emails list:",bad_emails[0] create_batch(email_list, bad_emails) create_batch() здесь вызывает функцию для создания пакета (без bad_emails)   -  person Data Enthusiast    schedule 25.02.2016
comment
Я добавил более полное решение ниже, чтобы помочь вам извлечь оскорбительное электронное письмо из ответа.   -  person Matt    schedule 26.02.2016


Ответы (1)


Предположим, у вас есть список пользователей, которых вы хотите добавить в профили, хранящиеся в списке users. Вы можете удалить плохие электронные письма с помощью следующей функции обратного вызова:

def call_back(request_id, response, exception):
  if exception is not None:
    if isinstance(exception, HttpError):
      message = json.loads(exception.content)['error']['message']
      bad = 'Value for field user.email = (\S*) is not valid.'
      match = re.match(bad, message)
      if match:
        bad_user = match.group(1)
        if bad_user in users:
          users.remove(bad_user)
  else:
    print response

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

batch = BatchHttpRequest(callback=call_back)
for user in users:
    request = analytics.management().profileUserLinks().insert(
        accountId=ACCOUNT_ID,
        webPropertyId=PROFILE_ID,
        profileId=profile,
        body={
            'permissions': {'local': ['READ_AND_ANALYZE']},
            'userRef': {'email': user}
      }
    )
    batch.add(request, request_id=PROFILE_ID + user)
batch.execute()
person Matt    schedule 26.02.2016