2017-02-11 10 views
0

Предполагается, что API Evernote (Python SDK) будет устанавливать ограничение скорости в sandbox точно так же, как и производство, но ограничение скорости длится только 15 секунд.Evernote API Ограничение скорости песочницы Продолжительность более 15 секунд

У меня есть набор тестов, который проверяет ограничение скорости, вызывая вызовы API до тех пор, пока не произойдет исключение.

После ожидания 1 минута, та же ошибка, EDAMSystemException(errorCode=19, rateLimitDuration=2651, _message='DuplicateNoteLimiter'), все еще происходит.

Код:

from evernote.api.client import EvernoteClient 
from evernote.edam.error.ttypes import EDAMSystemException 
import evernote.edam.type.ttypes as Types 
import time 


def getClient(): 
    return EvernoteClient(
      token=config.dev_token, 
      sandbox=True 
     ) 

def makeNote(client): 
    note = Types.Note() 
    note.title = 'spam' 
    content = '' 
    note.content = '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">' 
    note.content += '<en-note>'+ content + '</en-note>' 
    return client.get_note_store().createNote(note) 

def test_api_limit(): 
    client = getClient() 

    try: 
     while(True): 
      makeNote(client) 
    except EDAMSystemException as e: 
      assert e.errorCode == 19 
      print 'Caught Rate Limit Exception' 
      time.sleep(60) 
      makeNote(client) # still raise exception 
      print 'No exception occurred!' # this statement is not executed. 

test_api_limit() 

ответ

1

В дополнение к errorCode=RATE_LIMIT_REACHED, исключение включает в себя

сообщение = "DuplicateNoteLimiter"

Это сообщение указывает на то, что служба Evernote обнаружила большое количество обратите внимание на дублирование через вызов API. Поскольку нет смысла иметь так много заметок с одним и тем же контентом в учетной записи, это ограничивает такой запрос, чтобы не тратить впустую свои вычислительные ресурсы.

Если вы попытаетесь создать заметку с уникальным контентом, вы не увидите этого поведения.

Например:

вы можете попробовать включить системное время в миллисекундах в новой заметке в коде

from datetime import datetime 

def makeNote(client): 
    note = Types.Note() 
    note.title = 'spam' 
    content = str(datetime.now().microsecond) 
    note.content = '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">' 
    note.content += '<en-note>'+ content + '</en-note>' 
    return client.get_note_store().createNote(note) 

Эта модификация позволит предотвратить «дублирования ограничителя» от получения тревоги. Согласно моему тестированию, предел скорости будет сбрасываться почти сразу после его броска. Как-то сброс происходит намного раньше, чем 15 секунд, как объясняет Evernote.

BTW, ваш код вызывает client.get_note_store() каждый раз, когда вы создаете заметку. Вы должны просто позвонить один раз, чтобы обработчик NoteStore повторно использовал. Поскольку вызов функции приведет к вызову API в UserStore, вы в противном случае будете тратить свое пособие.

 Смежные вопросы

  • Нет связанных вопросов^_^