django rest framework регулирует количество пользователей и пользователей - PullRequest
0 голосов
/ 09 мая 2018

У меня есть два представления API (рамки отдыха Django):

class ApiView1(APIView):
    ...
    throttle_classes = (UserRateThrottle, )

и API 2:

class ApiView2(APIView):
    ...
    throttle_classes = (UserRateThrottle, )

и мои настройки:

REST_FRAMEWORK = {
    ...,
    'DEFAULT_THROTTLE_RATES': {
        'user': '5/minute'
    }
}

при пятикратном запросе ApiView1 все в порядке, но после этого при запросе ApiView2 я получаю код состояния http 429 с:

Request was throttled. Expected available in 45 seconds.

Вопрос : могу ли я использовать регулирование для пользователя и для просмотра? если да, то как это можно сделать?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Потому что это особенность django-rest-framework .

Класс ScopedRateThrottle можно использовать для ограничения доступа к определенным частям API. Этот дроссель будет применяться только в том случае, если доступ к представлению включает свойство .throttle_scope. Затем будет сформирован уникальный ключ газа путем объединения «объема» запроса с уникальным идентификатором пользователя или IP-адресом.

Допустимая частота запросов определяется настройкой DEFAULT_THROTTLE_RATES с использованием ключа из запроса "scope".

Поскольку вы не устанавливаете throttle_scope для любого вида, и ApiView1, и ApiView2 используют одну и ту же область видимости газа scope. Таким образом, они имеют одинаковый лимит. При избыточном доступе к одному представлению другое представление также будет неприемлемым.

В вашем сценарии вы должны установить другой throttle_scope в apiview и добавить область действия к REST_FRAMEWORK.DEFAULT_THROTTLE_RATES.

0 голосов
/ 09 мая 2018

Да, вы можете.

Для представлений на основе классов:

class YourView(APIView):
    throttle_classes = (UserRateThrottle, )

    def get(self, request, format=None):
        content = { ... Your response here ... }
        return Response(content)

Для функциональных представлений вы можете использовать декоратор: @throttle_classes([UserRateThrottle])

Ссылка: http://www.django -rest-framework.org / api-guide / throttling /

...