我正在 Tornado 中编写一个与 HTML5 WebSockets 一起使用的 Python 服务器。我的服务器通过 JavaScript 创建与客户端浏览器的连接来工作。创建连接后,它会保持打开状态,直到浏览器(或服务器将其关闭)。我需要定期检查我的模型之一是否已更改或数据库是否已更新。
这是演示我的意思的代码示例:
>>> mymodels = MyModel.objects.all()
>>> len(mymodels)
150
>>> # Some stuff happens on the client and the model is changed, one more entry is added
>>> mymodels = MyModel.objects.all()
>>> len(mymodels)
151
这一切都发生在服务器应用程序中,其中模型的更改将发生在服务器脚本运行的一个“会话”中。无论如何我可以检查新对象或刷新我的 Django 数据库吗?
如果还不清楚,我的意思是一个例子:假设我有一个名为 MyModel 的模型。首次运行服务器脚本时,它有 150 个不同的条目或数据库行。我从我的客户端与我的服务器建立 WebSocket 连接,并请求在发生新更改时更新我。在我的客户端的其他地方,其他一些用户做了一些事情,在我的数据库中为 MyModel 类创建了一个新行。我的服务器虽然仍然保持与原始客户端的相同连接,但需要能够在不停止执行的情况下检测到该更改。
定期检查不是问题,它实际上确保 Django 数据库 API 知道新添加的信息。无论如何我可以确保发生这种情况吗?最初发布的示例代码实际上不起作用。无论我向模型添加多少项,MyModel.objects.all() 的长度仍然是 150。如果我重新启动我的 Django shell,它会更新计数。
我尝试过的其他一些事情:
- 使用内置的 reload() 函数重新加载模型模块。
- 为某组 MyModel 过滤模型
- 使用原始 SQL 查询来选择所有内容并根据特定条件进行过滤
无论我对数据库进行多少更改,所有这些方法都会返回相同数量的 MyModel 对象。有趣的是,在 MySQL Workbench 中运行原始 SQL 会产生预期的结果。