Python: Запуск кода после возврата чего-либо
Это ApiView из моего проекта django:
class Receive_Payment(APIView):
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAdminUser,)
def get(self, request, cc_number):
if Card.objects.filter(cc_num = cc_number).exists():
client = Client.objects.get(client_id = (Card.objects.get(cc_num = cc_number).client))
if not client.is_busy:
client.is_busy = True
client.save()
resp = "successful"
else:
resp = "client_is_busy"
else:
resp = "fail"
return Response({"response": resp})
Как видите, если client.is_busy не True, я делаю его True здесь. Но в данной ситуации мне нужно client.is_busy = False через 30 секунд. Если я делаю это в коде client.save(), то это задерживает ответ. Как я могу это сделать?
Вместо использования булева значения для определения того, занят ли клиент, используйте время даты, и если оно было установлено менее 30 секунд назад, то клиент занят. Это означает, что вам не нужно запускать никакой код после запроса
from django.db import models
from django.utils.timezone import now
from datetime import timedelta
class Client(models.Model):
last_updated = models.DateTimeField()
@property
def is_busy(self):
# Can add a property to maintain the same is_busy boolean attribute
return (now() - self.last_updated) < timedelta(seconds=30)
def set_busy(self):
self.last_updated = now()
self.save()
Вам следует рассмотреть возможность использования здесь объектов таймера.
e.g.
import threading
def free_up_client(client):
client.is_busy = false
timer = Theading.timer(30.0, free_up_client, [client])