我正在用Tornado编写一个Python服务器,它可以与HTML5 WebSockets一起工作。我的服务器通过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,它会更新计数。在
我还尝试了一些其他的方法:
不管我对数据库做了多少更改,所有这些方法都会返回相同数量的MyModel对象。有趣的是,在MySQL Workbench中运行原始SQL会产生预期的结果。在
我想出来了! 强制Django更新其数据库引用的最简单方法是关闭数据库连接。Django将根据需要自动创建一个新的。在
如果在关闭连接之前有需要提交的更改,这将完成与上面相同的操作,但保留您所做的更改。(即,您不需要关闭连接,因为这会刷新数据库)
谢谢你的评论,祝你今天愉快!在
如果这一切都是在服务器端脚本的一个“会话”中运行的,那么也许你已经在一个DB事务中运行了整个事务(这意味着其他人看不到它)——尽管在Workbench中可以增量地看到它们这一事实并不意味着。话虽如此,还是值得检查一下你在做什么交易。在
另外,您是否阅读了this以确保Django正在做您认为它在做的事情?在
相关问题 更多 >
编程相关推荐