Django Throttling не работает в производственном режиме - PullRequest
2 голосов
/ 15 октября 2019

Я использую DJANGO REST FRAMEWORK для защиты своего API. Регулирование Django, которое ограничивает количество запросов к API для анонимных и проверяет подлинность пользователей.

Регулирование не работает в рабочем режиме. Кстати, я использую Ubuntu и сервер Nginx для развертывания своего сайта.

Я использую два пути, но оба не работали для меня. Вот коды. Пожалуйста, помогите мне. Я нуб в Django.

1-й метод, который я использую, описан ниже. Views.py

class SustainedAnon(AnonRateThrottle):
    rate = '100/day'

class BurstAnon(AnonRateThrottle):
    rate = '10/minute'

class SustainedUser(UserRateThrottle):
    rate = '100/day'


class BurstUser(UserRateThrottle):
    rate = '10/min'


class ProductApi(generics.RetrieveAPIView, mixins.CreateModelMixin):


    lookup_field= 'puid'

    serializer_class = ProductApisSerializers

    """
    Provides a get method handler.
    """
    # permission_classes = (IsAuthenticated,)

        throttle_classes = (SustainedAnon,SustainedUser,BurstAnon,BurstUser)



    def get_queryset(self):
        return ProductApis.objects.all()

    def post(self, request,*args,**kwargs):
        return self.create(request, *args, **kwargs)


URLS.PY

from django.contrib import admin
from django.urls import path, include
from . import views
from rest_framework.urlpatterns import format_suffix_patterns

urlpatterns = [
    path('',views.index, name='index'),
    path('api/<slug:puid>/',views.ProductApi.as_view()),
]

2-й метод - DRF

Views.py

class ProductApi(generics.RetrieveAPIView, mixins.CreateModelMixin):


    lookup_field= 'puid'

    serializer_class = ProductApisSerializers

    """
    Provides a get method handler.
    """
    # permission_classes = (IsAuthenticated,)

    throttle_classes = [UserRateThrottle,AnonRateThrottle]


    def get_queryset(self):
        return ProductApis.objects.all()

    def post(self, request,*args,**kwargs):
        return self.create(request, *args, **kwargs)

settings.py


REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '20/minute',
        'user': '10/minute',
    }
}

Кроме того, в первом методе я не вносил никаких изменений в файл settings.py, а для использования второго метода добавляю дополнительный код DRF для управления дросселированием.

Оба метода делаютне работает для меня.

1 Ответ

0 голосов
/ 15 октября 2019

Использование LocMemCache в производстве приведет к случайным результатам. Скорее всего, вы используете более одного процесса, что означает, что каждый из них будет иметь свой собственный изолированный кеш. Все, что будет кэшировано в одном процессе, не будет доступно для других.

Использование одного процесса, как вы делаете с runserver, делает кэш согласованным.

TL; DR, don 'т LocMemCache в производстве. Вместо этого используйте Redis, Memcache или другой общий кеш.

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