如何在Django外部访问Django数据库和ORM
在我的业余时间,我正在开发一款网络监控软件,这个软件可以安装在很多客户端上,客户端会把一些数据(比如内存、CPU、存储和网络使用情况等)反馈给服务器。为了管理控制台和报告,我决定使用Django,这对我来说也是一个学习的过程。
这些Client
会异步地向Server
报告数据,发送它们所拥有的任何信息(目前只是接收并丢弃,并没有存储到数据库里)。我需要在Django中访问这些数据。我已经创建了符合我需求的模型,但我不知道如何安全地将实际数据导入到Django的数据库中。
我该怎么做呢?我想到了几个选项,但它们都有一些缺点:
- 给Django应用一个
Server
的引用,然后启动一个线程,不断检查新数据并将其写入数据库。 - 让
Server
直接访问Django的数据库,并把数据写到那里。
第1
个选项的问题是,这样会让服务器和Django应用的耦合度更高,但好处是可以使用ORM来优雅地写入数据。
第2
个选项的问题是,我无法使用ORM来写入数据,而且不确定在某些情况下这会不会导致数据库阻塞。
我是不是漏掉了什么明显的好选择?如果这个问题有点模糊,我很抱歉。我对Django还很陌生,不想把自己写到一个死胡同里。
2 个回答
我在设置环境的时候选择了选项 1
,这个选项做的事情和其他选项差不多。
我有一个 JSON 接口,用来把数据传回服务器。因为我在一个保护得很好的 VLAN 里,这个接口运行得非常顺利。就像你说的,最大的好处就是 Django 的 ORM。只需要一个简单的地址调用和正确的数据就可以了。我觉得这也是最简单的方法。
关于“在数据库上阻塞”的问题,实际上应该是不存在的。我想这可能取决于数据库的后端,但这也是数据库的一个好处。例如,单线程的基于文件的 sqlite 实例可能就不太好用。
我尽量把所有东西都放在 Django 里。这也有助于数据库的安全性和完整性,因为它只在一个地方被访问。如果你的客户端直接访问数据库,你就需要把用户名和密码一起发给 Client
。
我建议你选择 1
。这样会让你的生活更轻松,代码行数也会少一些。而且,只要你把 Client
编写得当,以后修改数据库访问也会很简单。
设置一个消息总线(可以参考celery)。
每当你的客户端需要记录一些信息时,它就会在一个队列上提交一条消息。在你的Django应用中,有一个“代理”在管理这些工作者。
这个代理会监控队列,看看有没有消息,一旦有消息,它就会启动一个工作者来处理这条消息,然后再把这个工作者放回“休眠”状态。
这个工作者会更新数据库。
这样一来,你就不需要处理那些不断运行的线程(这往往会带来很多麻烦),而且你的系统架构也能很容易地扩展,只需在消息处理流程中添加更多的部分,就能支持多个客户端。