1

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

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

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

这在 Django 中可能吗?您对此有更好的解决方案吗?

注意:我看到了类似的问题,但它们主要涉及在请求而不是连接之间保存数据

4

2 回答 2

1

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

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

于 2012-07-05T15:54:25.200 回答
1

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

此外,您可以在 django 中将守护进程实现为您自己的自定义管理命令,以利用 django 的优势(相同的模型、方法等),请参阅编写管理命令。您可以通过 cron 或 init 脚本运行此命令。

于 2012-07-05T17:10:34.973 回答