从Djang控制Twisted服务器

2024-06-16 12:02:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图构建一个Twisted/Django mashup,它允许我通过Django的管理接口控制由Twisted server管理的各种客户端连接。也就是说,我希望能够登录到Django的admin,查看当前使用的协议,每个连接的具体细节(例如,如果服务器通过IRC连接到freenode,它应该列出当前连接到的所有通道),并允许我通过修改或创建数据库记录来断开或连接新客户机。在

最好的办法是什么?有很多关于combiningDjango和{a4}的帖子,但我还没有找到任何以前的技术来做我所概述的。我看到的所有Twisted示例都使用硬编码的连接参数,这使得我很难想象如何动态运行reactor.connectTCP当数据库中的记录发出信号时,(…)或断开连接(…)。在

我的策略是创建一个定制的ClientFactory,它每N秒单独轮询Django/托管数据库中的任何命令,并根据需要修改/创建/删除连接,在完成时反映数据库中的新状态。在

这看起来可行吗?有更好的方法吗?有人知道任何实现类似功能的现有项目吗?在


Tags: django服务器数据库协议客户端客户机serveradmin
2条回答

轮询数据库很糟糕,但不幸的是,数据库很少有好的工具(当然也没有数据库可移植的工具)来监视更改。所以你的方法可能没问题。在

但是,如果您的应用程序在Django中,并且您不支持从其他(非Django)客户机对数据库进行随机更改,并且您的WSGI容器是扭曲的,那么您可以通过执行callFromThread(connectTCP, ...)来实现这一点。在

我一直在研究另一种梳理django和twisted的方法。可以试试看:https://github.com/kowalski/featdjango。在

它的工作方式和其他的略有不同。它启动一个twisted应用程序和http站点。对django的请求在一个特殊的线程池中处理。它的特殊之处在于,这些线程可以等待延迟,这使得将同步django应用程序代码与异步twisted代码相结合变得很容易。在

我提出这样的结构的原因是,我的应用程序需要从django视图内部执行大量http请求。而不是一个接一个地执行它们,我可以一次将它们委托给运行twisted并等待它们的“主应用程序线程”。与您的问题相似的是,我还有一个异步组件,它是一个singleton,我从django视图访问它。在

例如,这就是如何启动twisted组件,然后从视图中获取引用。在

import threading

from django.conf import settings

_initiate_lock = threading.Lock()

def get_component():
    global _initiate_lock
    if not hasattr(settings, 'YOUR_CLIENT')
        _initiate_lock.acquire()
        try:
            # other thread might have did our job while we
            # were waiting for the lock
            if not hasattr(settings, 'YOUR_CLIENT'):
                client = YourComponent(**whatever)
                threading.current_thread().wait_for_deferred(
                    client.initiate)
                settings.YOUR_CLIENT = client
        finally:
            _initiate_lock.release()
    return settings.YOUR_CLIENT

上面的代码,初始化我的客户机并调用它的initiate方法。此方法是异步的,并返回一个延迟的。我做了所有必要的设置。django线程将等待它完成,然后再处理到下一行。在

我就是这样做的,因为我只从请求处理程序访问它。您可能希望在启动时启动组件,调用ListenTCP | SSL。而django请求处理程序只需访问客户机上的一些公共方法就可以获得关于连接的数据。这些方法甚至可以返回Deferred,在这种情况下,您应该使用.wait_for_defer()来调用它们。在

相关问题 更多 >