所以在业余时间,我一直在开发一种网络监控软件,基本上可以安装在一堆客户端上,客户端将数据报告回服务器(RAM / CPU /存储/网络使用情况,等等)。对于管理控制台和报告,我决定使用Django,这本身就是一种学习经验。
Client
以异步方式向Server
报告,无论他们碰巧拥有什么数据(截至目前,它只是收到并转储,而不是存储在数据库中)。我需要在Django中访问这些数据。我已经创建了符合我需求的模型。但是,我不知道如何安全地将实际数据导入django DB。
这样做的方法是什么?我想到了一些选择,但它们都有一些缺点:
Server
的引用,然后启动一个不断检查新数据并将其写入数据库的线程。 Server
直接访问Django DB,并在那里写入数据。 1
的问题在于我将服务器与django应用程序紧密结合,但好处是我可以使用ORM很好地编写数据。
2
的问题在于我无法使用ORM来写入数据,我不确定在某些情况下它是否会导致数据库阻塞。
我缺少一些明显的好选择吗?如果这个问题含糊不清,我很抱歉。我对Django很新,而且我不想把自己写进一个角落。
答案 0 :(得分:1)
我在设置环境时选择了1
选项,其中包含大部分相同的内容。
我有一个JSON接口,用于将数据传回服务器。由于我是在一个受到良好保护的VLAN上,因此效果很好。像你说的那样,最大的好处是Django ORM。只需要一个简单的地址调用和适当的数据。我也认为这是最简单的方法。
"阻止数据库"问题应该不存在。我想这将取决于数据库后端,但实际上,这是数据库的好处之一。例如,基于文件的单线程sqlite实例可能无法正常工作。
我尽可能地把事情放在Django中。这也有助于数据库安全性/完整性,因为它只能在一个地方访问。如果您的客户直接访问数据库,则您需要发送用Client
的用户名/密码。
我的建议是与1
一起使用。它将使您的生活更轻松,代码更少。此外,只要您正确编码Client
,就可以轻松地在以后修改数据库访问。
答案 1 :(得分:1)
设置消息总线(请参阅celery)。
每次客户端需要记录某些内容时,它都会在队列中提交消息。在你的django方面,你有一个管理工人的经纪人。
代理监视队列中的消息,触发工作人员处理消息,然后让工作人员重新进入休眠状态。
工作人员更新数据库。
通过这种方式,您不必处理连续线程(导致许多令人头疼的问题),只需添加到消息处理管道,您的架构就可以轻松扩展以处理多个客户端。