¿Alguna vez ha pasado por un puente elevado y notó el letrero que indica la restricción de peso del puente? Esas restricciones se establecen para garantizar la seguridad pública. Django REST Framework utiliza un proceso similar llamado aceleración que controla la tasa de requests que el cliente puede realizar a una API. Esta restricción de límite de velocidad puede garantizar la escalabilidad, la protección contra el rendimiento lento y los ataques de denegación de servicio (DoS), y mejorar la experiencia general del usuario.
Django REST Framework tiene tres clases de limitación en el módulo rest_framework.throttling : AnonRate, UserRate y ScopedRate throttle. Todas estas clases especifican reglas de limitación que significan el número máximo de requests en un momento dado dentro del ámbito. Estas clases tienen diferentes mecanismos para especificar el alcance: para comparar información anterior con la nueva solicitud. Profundicemos en la función de limitación de DRF.
- AnonRate Acelerador
- Acelerador de tasa de usuario
- ScopedRateThrottle
Nota: consulte Adición de permisos en la API: Django REST Framework y Personalización de permisos de nivel de objeto: Django REST Framework para hacer uso del permiso con limitación .
AnonRate Acelerador
AnonRateThrottle acelerará a los usuarios no autenticados. Usando la dirección IP de la solicitud entrante, se genera una clave única para limitar. La tasa de solicitud permitida se determina a partir de cualquiera de los siguientes:
- La propiedad de tasa en la clase, proporcionada al anular AnonRateThrottle y establecer la propiedad.
- La configuración DEFAULT_THROTTLE_RATES[‘anon’].
Establezcamos la política de limitación global. Puede abrir el archivo settings.py y mencionar la clase de aceleración y la tasa de aceleración de la siguiente manera:
Python3
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES'🙁 'rest_framework.authentication.BasicAuthentication', ) 'DEFAULT_THROTTLE_CLASSES': [ 'rest_framework.throttling.AnonRateThrottle', ], 'DEFAULT_THROTTLE_RATES': { 'anon': '2/day' } }
Puede incluir segundos, minutos, horas o días como el período de aceleración (tasas de aceleración).
Probemos el comando HTTPie para recuperar los archivos robots. Aquí, recuperamos la lista sin proporcionar ninguna credencial.
http OBTENER :8000/robot/
Producción
HTTP/1.1 200 OK Allow: GET, POST, HEAD, OPTIONS Content-Language: en Content-Length: 2106 Content-Type: application/json Date: Sat, 02 Oct 2021 14:29:40 GMT Referrer-Policy: same-origin Server: WSGIServer/0.2 CPython/3.7.5 Vary: Accept, Accept-Language X-Content-Type-Options: nosniff X-Frame-Options: DENY [ { "currency": "USD", "currency_name": "US Dollar", "manufacturer": "ABB", "manufacturing_date": "2020-05-10T00:00:00Z", "name": "IRB 1100", "owner": "sonu", "price": 25000, "robot_category": "Articulated Robots", "url": "http://localhost:8000/robot/7/" }, { "currency": "USD", "currency_name": "US Dollar", "manufacturer": "ABB", "manufacturing_date": "2020-08-10T00:00:00Z", "name": "IRB 120", "owner": "sonu", "price": 35000, "robot_category": "Articulated Robots", "url": "http://localhost:8000/robot/8/" }, ]
Aquí, la tasa de aceleración anon se establece en 2 requests de API por día. Por lo tanto, no permite más de dos requests. Obtendrá una salida inferior si su tasa de requests supera las 2 requests.
Acelerador de tasa de usuario
UserRateThrottle controla la tasa de requests enviadas por usuarios autenticados y no autenticados. La identificación de usuario es la clave de caché única para las requests autenticadas, y la dirección IP es la clave de caché única para las requests no autenticadas.
La tasa de solicitud permitida se determina a partir de cualquiera de los siguientes:
- La propiedad de tasa en la clase, proporcionada al anular UserRateThrottle y establecer la propiedad.
- La configuración DEFAULT_THROTTLE_RATES[‘usuario’].
Puede editar el diccionario REST_FRAMEWORK de la siguiente manera:
Python3
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES'🙁 'rest_framework.authentication.BasicAuthentication', ) 'DEFAULT_THROTTLE_CLASSES': [ 'rest_framework.throttling.AnonRateThrottle', 'rest_framework.throttling.UserRateThrottle' ], 'DEFAULT_THROTTLE_RATES': { 'anon': '2/day', 'user': '5/day' } }
Las reglas de limitación en nuestro diccionario REST_FRAMEWORK son las siguientes:
- Un máximo de 2 requests por día para usuarios no autenticados
- Un máximo de 5 requests por día para usuarios autenticados
El siguiente comando HTTPie autenticado permite 5 requests por día.
http -a “sonu”:”sn@pswrd” OBTENER:8000/robot/
El servicio web tranquilo genera demasiadas requests durante más de 5 requests por día.
ScopedRateThrottle
La clase ScopedRateThrottle controla la tasa de requests de funciones específicas en nuestro servicio web RESTFul. Aquí, la vista a la que se accede debe incluir la propiedad .throttle_scope. Agreguemos un alcance de aceleración a nuestra clase RobotDetail y mencionemos la tasa de aceleración para el alcance.
Primero, importemos ScopedRateThrottle.
desde rest_framework.throttling import ScopedRateThrottle
Ahora agregue las siguientes líneas de código
throttle_scope = 'robots' throttle_classes = (ScopedRateThrottle,)
Nuestra clase RobotDetail tiene el siguiente aspecto:
Python3
class RobotDetail(generics.RetrieveUpdateDestroyAPIView): throttle_scope = 'robots' throttle_classes = (ScopedRateThrottle,) permission_classes = ( permissions.IsAuthenticatedOrReadOnly, custompermission.IsCurrentUserOwnerOrReadOnly, ) queryset = Robot.objects.all() serializer_class = RobotSerializer name = 'robot-detail'
A continuación, agreguemos la velocidad de aceleración para los ‘robots’ del alcance.
Python3
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES'🙁 'rest_framework.authentication.BasicAuthentication', ) 'DEFAULT_THROTTLE_CLASSES': [ 'rest_framework.throttling.AnonRateThrottle', 'rest_framework.throttling.UserRateThrottle' ], 'DEFAULT_THROTTLE_RATES': { 'anon': '2/day', 'user': '5/day', 'robots': '3/day' } }
Probemos la solicitud HTTPie autenticada para recuperar el robot según la identificación, que utiliza la clase RobotDetail para obtener el robot según la identificación. El comando es el siguiente:
http -a “sonu”:”sn@pswrd” OBTENER :8000/robot/2/
Producción
Aquí, nuestra tasa de alcance es de 3 requests por día. Obtendremos demasiadas requests si supera las 3 requests. El resultado de la cuarta solicitud es el siguiente:
Publicación traducida automáticamente
Artículo escrito por SonuGeorge y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA