Рубрики
Без рубрики

Оценки ограничения API запросы в Python с декоратором

На днях мне нужно было убедиться, что питонский скрипт, который я пишу, не называет отдых API любой Fas … Помечено с Python, Tips, API, интеграция.

На днях мне нужно было убедиться, что написание сценария Python, который я пишу, не вызывает API отдыха быстрее, чем разрешено.

Я хотел « сухой », «читаемый код, так написать« если-else »код вокруг каждого вызова функции из Запросы Модуль был вне вопроса.

Благодаря Боковой проект работы в Tinacms. У меня была некоторая идея о том, что фраза, которую я должен Google, когда в поисках пути «обернуть» чужой код в дополнительной функциональности был « более высокий порядок ».

Это привело меня к этим двум учебным пособиям:

Я положил следующий код в верхней части моего сценария:

limitLeft = 500 # Although in theory some other code could be hitting the API, start with a presumption that we have all 500.

def __request_rate_limited(request_function):
    def limit_rate(*args, **kwargs):
        global limitLeft
        #if limitLeft < 500: # DEBUG LINE ONLY
            # Because we get our "actual rate limit" from API calls, it will never be 500 -- at most 499 -- in the wild.
            #print('API calls remaining before making call: ' + str(limitLeft)) # DEBUG LINE ONLY
        if limitLeft < 10:
            print('API calls remaining approaching zero (below ten); sleeping for 2 seconds to refresh.')
            sleep(2)
        response = request_function(*args, **kwargs)
        limitLeft = int(response.headers['X-Limit-Left'])
        #print('API calls remaining after making call: ' + str(limitLeft)) # DEBUG LINE ONLY
        return response
    return limit_rate

# Attach __request_rate_limited() to "requests.get" and "requests.post"    
requests.get = __request_rate_limited(requests.get)
requests.post = __request_rate_limited(requests.post)

После добавления этого куска кода на вершину моего скрипта Все вызовы requests.get () и requests.post () работал в контексте моего дополнительного кода Отказ

Довольно аккуратно

Хитрость запомнила, чтобы прикрепить __Request_rate_limited () Функция обертки для обоих requests.get () и requests.post () перед любым кодом, используя их. Сначала я только завернул requests.get () Затем не мог понять, почему мой код не работал для определенных частей моего сценария. Оказывается, эти части делали пост Запросы.

Это, вероятно, является неелегантной реализацией функциональной упаковки/декораторов в Python, но он определенно получил работу для небольшого сценария командной строки.

Оригинал: “https://dev.to/katiekodes/rate-limiting-api-requests-in-python-with-a-decorator-547g”