Django 节流在生产模式下不起作用

sur*_*rma 5 django django-models django-serializer django-rest-framework django-autocomplete-light

我正在使用 DJANGO REST FRAMEWORK 来保护我的 API。Django 限制,限制匿名 API 上的请求数量并对用户进行身份验证。

限制在生产模式下不起作用。顺便说一下,我使用 Ubuntu 和 Nginx 服务器来部署我的网站。

我使用了两种方法,但两种方法都不适合我。这是代码。请帮我。我是 django 菜鸟。

我使用的第一种方法如下所述。视图.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)


Run Code Online (Sandbox Code Playgroud)

网址.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()),
]
Run Code Online (Sandbox Code Playgroud)

第二种方法-DRF

视图.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)

Run Code Online (Sandbox Code Playgroud)

设置.py


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

Run Code Online (Sandbox Code Playgroud)

另外,在第一种方法中,我没有对 settings.py 文件进行任何更改,而使用第二种方法时,我添加了 DRF 的附加代码来控制节流。

这两种方法对我都不起作用。

Lin*_*via 1

在生产中使用LocMemCache会导致随机结果。您可能正在使用多个进程,这意味着每个进程都有自己的独立缓存。一个进程中缓存的任何内容都将不可用于其他进程。

使用像您一样的单个进程来使runserver缓存保持一致。

TL;DR,不要LocMemCache在生产中使用。请改用 Redis、Memcache 或其他共享缓存。