【发布时间】:2018-03-18 18:42:47
【问题描述】:
我正在尝试开发一种拍卖类型的系统,在该系统中,客户下订单,然后不同的商店可以为该订单提供价格。
该系统的一个有趣部分是,在最初创建订单时,可用商店将有 60 秒的时间来提供各自的报价。当第一家商店提出报价时,“拍卖”现在只有接下来的 20 秒时间让其他商店提出自己的报价。如果他们确实在这个更小的分配时间内提出了另一个报价,那么这 20 秒就会被刷新。只要有足够的时间,就可以继续收到报价,时间不能超过最初给出的 60 秒。
class Order(models.Model):
customer = models.ForeignKey(Customer)
create_time = models.DateTimeField(auto_now_add=True)
update_time = models.DateTimeField(auto_now_add=True)
total = models.FloatField(default=0)
status = models.IntegerField(default=0)
delivery_address = models.ForeignKey(DeliveryAddress)
store = models.ForeignKey(Store, null=True, blank=True, related_name='orders', on_delete=models.CASCADE)
credit_card = models.ForeignKey(CreditCard, null=True, blank=True, related_name='orders')
class OrderOffer(models.Model):
store = models.ForeignKey(Store, related_name="offers", on_delete=models.CASCADE)
order = models.ForeignKey(Order, related_name="offers", on_delete=models.CASCADE)
create_time = models.DateTimeField(auto_now_add=True)
除了这些要求之外,我还想在新报价到达时实时更新客户端。为此,我使用了django-channels WebSockets 的实现。
我有以下consumers.pyfile:
from channels.generic.websockets import WebsocketConsumer
from threading import Timer
from api.models import Order, OrderOffer
from django.db.models.signals import post_save
from django.dispatch import receiver
class OrderConsumer(WebsocketConsumer):
def connect(self, message, **kwargs):
"""
Initialize objects here.
"""
order_id = int(kwargs['order_id'])
self.order = Order.objects.get(id=order_id)
self.timer = Timer(60, self.sendDone)
self.timer.start()
self.message.reply_channel.send({"accept": True})
def sendDone(self):
self.send(text="Done")
# How do I bind self to onOffer?
@receiver(post_save, sender=OrderOffer)
def onOffer(self, sender, **kwargs):
self.send(text="Offer received!")
if (len(self.offers) == 0):
self.offerTimer = Timer(20, self.sendDone)
self.offers = [kwargs['instance'],]
else:
self.offerTimer = Timer(20, self.sendDone)
self.offers.append(kwargs['instance'])
def receive(self, text=None, bytes=None, **kwargs):
# Echo
self.send(text=text, bytes=bytes)
def disconnect(self, message, **kwargs):
"""
Perform necessary disconnect operations.
"""
pass
我已经成功地在我的客户端和服务器之间建立了一个 WebSocket 通信通道。我已经测试了发送消息,一切似乎都很好。现在我想检测新OrderOffer 的创建,并向客户端发送通知。为此,我需要访问self 变量以使用self.send,这是不可能的,因为信号装饰器不发送此参数。我尝试通过用 self 声明 onOffer 来强制它,但我收到以下错误:
TypeError: onOffer() missing 1 required positional argument: 'self'
如果我能以某种方式访问信号集的关键字参数,我可能会执行以下操作:
context = self.
我将不胜感激任何帮助,甚至是我原来问题的替代解决方案。
【问题讨论】:
标签: django django-signals django-channels