如何在Django中的请求之间保存对象?

时间:2012-07-05 15:47:01

标签: django ssh

我正在Django开发一个内部服务器监控/管理工具,我对此并不熟悉。 应用程序通常需要通过SSH连接到其他服务器,发出命令并读取响应。目前我用paramiko这样做,它工作正常。

但是,现在我正在为每个请求重新连接到每个服务器。这感觉就像糟糕的设计,我宁愿在整个应用程序的生命周期中保持所有SSH连接(非常少)。我知道这可能是例如NodeJS。

即。我想要做的是能够访问某种“全局”变量“ssh_connection1”并通过它发出命令,而不是每次请求都创建一个新的局部变量。

Django有可能吗?你有更好的解决方案吗?

注意:我看到了类似的问题,但它们主要涵盖了在 connections 之外的请求之间保存数据

2 个答案:

答案 0 :(得分:1)

我认为最好的办法是使用一个单独的进程,例如一个保持持久连接的扭曲客户端。您的django线程可以检查客户端进程是否处于活动状态,如果是,它可以通过套接字或其他快速本地方法与该进程通信。这类似于例如一种池化的数据库连接策略,它依赖于一个单独的守护进程,如PgBouncer。

这是一种相当复杂的方法,但我不知道任何替代方法,即将连接对象直接从一个请求传递到另一个请求的方法。即使可以传递类似的连接对象,也会遇到尝试使用相同连接对象的并发请求的问题。如果您使用twisted编写单独的进程,则可以设置一个管理此问题的连接池系统。

答案 1 :(得分:1)

正如Andrew Gorcester建议的那样,您可以实现另一个与您的服务器通信并获取信息的进程/守护进程。它还将推送数据库中的信息,您的django应用程序将使用该数据库来显示。 这样,您可以将实现分离出来,以便在单独的模块中检索数据。

此外,您可以在django中将守护进程实现为您自己的自定义管理命令,以利用django的好处(相同的模型,方法等),参考Writing admin commands。您可以通过cron或init脚本运行此命令。