如何在Django外部访问Django数据库和ORM

2 投票
2 回答
1035 浏览
提问于 2025-04-18 08:14

在我的业余时间,我正在开发一款网络监控软件,这个软件可以安装在很多客户端上,客户端会把一些数据(比如内存、CPU、存储和网络使用情况等)反馈给服务器。为了管理控制台和报告,我决定使用Django,这对我来说也是一个学习的过程。

这些Client会异步地向Server报告数据,发送它们所拥有的任何信息(目前只是接收并丢弃,并没有存储到数据库里)。我需要在Django中访问这些数据。我已经创建了符合我需求的模型,但我不知道如何安全地将实际数据导入到Django的数据库中。

我该怎么做呢?我想到了几个选项,但它们都有一些缺点:

  1. 给Django应用一个Server的引用,然后启动一个线程,不断检查新数据并将其写入数据库。
  2. Server直接访问Django的数据库,并把数据写到那里。

1个选项的问题是,这样会让服务器和Django应用的耦合度更高,但好处是可以使用ORM来优雅地写入数据。

2个选项的问题是,我无法使用ORM来写入数据,而且不确定在某些情况下这会不会导致数据库阻塞。

我是不是漏掉了什么明显的好选择?如果这个问题有点模糊,我很抱歉。我对Django还很陌生,不想把自己写到一个死胡同里。

2 个回答

1

我在设置环境的时候选择了选项 1,这个选项做的事情和其他选项差不多。

我有一个 JSON 接口,用来把数据传回服务器。因为我在一个保护得很好的 VLAN 里,这个接口运行得非常顺利。就像你说的,最大的好处就是 Django 的 ORM。只需要一个简单的地址调用和正确的数据就可以了。我觉得这也是最简单的方法。

关于“在数据库上阻塞”的问题,实际上应该是不存在的。我想这可能取决于数据库的后端,但这也是数据库的一个好处。例如,单线程的基于文件的 sqlite 实例可能就不太好用。

我尽量把所有东西都放在 Django 里。这也有助于数据库的安全性和完整性,因为它只在一个地方被访问。如果你的客户端直接访问数据库,你就需要把用户名和密码一起发给 Client

我建议你选择 1。这样会让你的生活更轻松,代码行数也会少一些。而且,只要你把 Client 编写得当,以后修改数据库访问也会很简单。

1

设置一个消息总线(可以参考celery)。

每当你的客户端需要记录一些信息时,它就会在一个队列上提交一条消息。在你的Django应用中,有一个“代理”在管理这些工作者。

这个代理会监控队列,看看有没有消息,一旦有消息,它就会启动一个工作者来处理这条消息,然后再把这个工作者放回“休眠”状态。

这个工作者会更新数据库。

这样一来,你就不需要处理那些不断运行的线程(这往往会带来很多麻烦),而且你的系统架构也能很容易地扩展,只需在消息处理流程中添加更多的部分,就能支持多个客户端。

撰写回答