Django: Обработка просроченных ключей API без сигналов
Заголовок: Django: Обработка просроченных ключей API без сигналов
Вопрос: Как реализовать в Django логику автоматического удаления просроченных API-ключей из модели OutstandingKey и обновления соответствующей записи BlacklistedKey по истечении срока действия, без использования сигналов?
У меня есть две модели Django: OutstandingKey и BlacklistedKey. Модель OutstandingKey представляет API-ключи, сгенерированные пользователями, включая поле даты истечения срока действия. Модель BlacklistedKey хранит ключи API из черного списка, ссылаясь на OutstandingKey через отношение "один к одному".
Я хочу создать систему, в которой просроченные API-ключи автоматически удаляются из модели OutstandingKey и добавляются в модель BlacklistedKey, когда истекает срок их действия. Однако я предпочитаю не использовать сигналы для этой реализации из-за этого Django Anti-Pattern.
Может ли кто-нибудь предоставить чертеж или пример того, как достичь этой логики в Django?
Ниже представлены мои модели
from django.db import models
from django.conf import settings
from django.utils import timezone
class OutstandingKey(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.SET_NULL,
null=True,
blank=True,
default=None,
verbose_name="User",
)
name = models.CharField(max_length=1000, default="", blank=True, null=True)
api_key = models.CharField(
max_length=1000,
unique=True,
verbose_name="API Key",
default="",
blank=True,
null=True,
editable=False,
)
expiry_date = models.DateTimeField(
default=None, verbose_name="Expiry Date", blank=True, null=True
)
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "Outstanding Tokens"
verbose_name = "Outstanding API Key"
ordering = ["-timestamp"]
class BlacklistedKey(models.Model):
key = models.OneToOneField(
OutstandingKey, on_delete=models.CASCADE, primary_key=True
)
key_value = models.CharField(
max_length=1000,
unique=True,
verbose_name="API Key",
default="",
blank=True,
null=True,
)
blacklisted_at = models.DateTimeField(
auto_now_add=True, verbose_name="Blacklisted At"
)
class Meta:
verbose_name_plural = "Blacklisted Tokens"
verbose_name = "Blacklisted Key"
def __str__(self):
return self.key.name