Django Ninja: almacenamiento de la solicitud API total del usuario, límite y filtro

Soy nuevo en Django, actualmente estoy trabajando con API usando Django Ninja Rest Framework .
en este ejemplo, los usuarios tendrán una APIKey única cada vez que cree una nueva APIKey a partir de este modelo y la adjunte al usuario seleccionado.

este es mi modelo APIKey:

### NOTE - This is just for testing, Not a real model, see the link below

class APIKey(models.Model):
    key         = models.CharField(max_length=64) # i know this should be unique, just for demo :)
    user        = models.ForeignKey(get_user_model(), related_name='free_key', on_delete=models.CASCADE)
    label       = models.CharField(max_length=40)
    revoked     = models.BooleanField(default=False)
    created_at  = models.DateTimeField(auto_now_add=True)
    expires_at  = models.DateTimeField(null=True, blank=True)

Este modelo es solo para fines de prueba , en realidad lo uso para mi proyecto y lo modifico.

Entonces, los puntos finales de mi API necesitan una clave API para la autenticación (la clave API que he creado que corresponde a un usuario específico),
luego implemento y sigo los pasos aquí y funciona normalmente

Mis preguntas son:

  1. Cada usuario tiene una clave API única. ¿Cómo contar y almacenar la solicitud total de un usuario cada vez que el usuario realiza una solicitud a un punto final? ¿Debo agregar request_totalun campo a mi APIKeymodelo o crear un nuevo modelo? ¿Debo usar middleware personalizado? ¿O debería usar Redis o algo así? si es así, ¿cómo implementarlo?

  2. ¿Cuál es la mejor manera para que este escenario implemente un límite diario por la solicitud total de un usuario? por ejemplo , la solicitud de límite diario del usuario es de 100 solicitudes y se restablece cada 00:01 a.m.

  3. De acuerdo con la pregunta número 1, ¿cuál es la forma recomendada de filtrar la solicitud total y mostrársela al usuario correspondiente? por ejemplo , en Django Views, mostrando la solicitud total cada día de los últimos 7 días

Como información adicional , mis puntos finales de API son en su mayoría métodos GET y realizan una llamada de función, hacen algún cálculo o algo así, y devuelven algunos datos, sin consultar la base(Model.objects.get(id=id), etc...) de datos.

Me disculpo si mi pregunta no tiene ningún sentido. Gracias. ..

Answer

Yo haría lo siguiente

  1. Autenticación interna: cree un nuevo objeto en la base de datos:

class ApiRequest(models.Model): clave = models.ForeignKey(APIKey) timestamp = models.DateTimeField(auto_now_add=True, db_index=True)

  1. Después de guardar, puede contar cuántas solicitudes hubo durante el día (o 24 horas), y si hay más de 100, devolver 403 prohibido