我想为警报创建一个流式 API(服务器发送的事件),即新添加的警报应该作为服务器发送的事件发送到打开的连接。为此,我正在使用 StreamingHttpResponse。标头设置为文本/事件流,因为它应该用于 SSE。我有一个模型可以处理数据库中的警报。我已经编写了一个signals.py 文件,它为警报模型的post_save 和警报模型的post_save 事件定义了信号,我返回了带有新添加警报的StreamingHttpResponse。当我第一次获得 API 时,我会收到所有警报的响应,但在向数据库添加新警报时不会收到新添加的警报。我做错了什么?
监控/signals.py
@receiver(post_save, sender=Alert)
def send_alert(sender, instance, **kwargs):
qs_json = serializers.serialize('json', instance)
return StreamingHttpResponse(qs_json, content_type='text/event-stream')
监控/views.py
# just importing defined signal receiver here
from .signals import send_alert
# endpoint view function
def get_alerts(self):
queryset = Alert.objects.all().order_by('-date')
resolved = self.request.query_params.get('resolved')
server = self.request.query_params.get('server')
source = self.request.query_params.get('source')
if source is not None:
queryset = queryset.filter(source=source)
if resolved is not None:
queryset = queryset.filter(resolved=resolved)
if server is not None:
queryset = queryset.filter(server=server)
return HttpResponse(queryset)
即使我自己在 Django shell 上点击 DB 上的 .save 方法,也不会触发信号。
>>> from monitoring.models import Alert
>>> a=Alert(container="something")
>>> s.save()