我有一个Channels Web套接字,我试图添加另一个应用程序的信号,因此当创建事件时,WebSocket会根据其逻辑发送一条消息。 当我第一次连接WebSocket时,该功能可以正常运行,当我添加发送者模型的新对象时,会出现错误。
消费者:
class CameraOnlineConsumer(JsonWebsocketConsumer):
def connect(self):
self.accept()
return self.send(json.dumps({"type": "websocket.accept",
"send": "Connected Successfully"})), self.camera()
def camera(self):
result = self.check_events()
print("new event")
return self.send(json.dumps({
"type": "websocket.send",
"send": result
}))
def get_events(self):
return PastureEvent.objects.filter(result=8, farm_id='1', processed=False).order_by('-time_stamp')[:2]
def check_events(self):
minute_delta = timedelta(seconds=60)
query_set = self.get_events()
if not query_set:
result = {'camera status': CameraOffline.default_detail, }
return result
elif len(query_set) == 1: # means that no new events has been recorded since last check.
result = {'camera status': CameraOnline.default_detail,
'first time_stamp': str(query_set[0].time_stamp)}
return result
elif len(query_set) >= 2: # two relevant events received.
difference = query_set[0].time_stamp - query_set[1].time_stamp
if difference <= minute_delta:
if query_set[1]:
# query_set[1].processed = True & query_set[1].save() didn't work, why?
PastureEvent.objects.select_for_update().filter(id=query_set[1].id).update(processed=True)
else:
pass
# time difference between them is under/equal to the desired time difference between events.
result = {'camera status': CameraOnline.default_detail,
'first time_stamp': str(query_set[0].time_stamp),
'last time_stamp': str(query_set[1].time_stamp)}
return result
else:
if query_set[1]:
PastureEvent.objects.select_for_update().filter(id=query_set[1].id).update(processed=True)
else:
pass
# two events exist but the difference between them is bigger then one minute, if changed in the next
# check it would be updated to camera online.
result = {'camera status': CameraOnline.default_detail,
'first time_stamp': str(query_set[0].time_stamp)}
return result
else:
# For now, every other case should result in a camera offline msg as well.
return {'camera status': CameraOffline.default_detail}
apps.py中我的信号定义:
class AgsenzeApiConfig(AppConfig):
name = 'agsenze_api'
def ready(self):
from agsenze_api.models import PastureEvent
from farm_api.consumers import CameraOnlineConsumer
post_save.connect(CameraOnlineConsumer.camera, sender=PastureEvent)
创建新对象时:
(receiver, receiver(signal=self, sender=sender, **named))
TypeError: camera() got an unexpected keyword argument 'signal'
HTTP POST /agsenze_admin/agsenze_api/pastureevent/add/ 500 [0.04, 127.0.0.1:36304]