扭曲与网络编程该如何选择?

9 投票
3 回答
1888 浏览
提问于 2025-04-16 10:52

几个月前,我编写了一个复杂的应用程序,现在想为它增加一个基于网页的用户界面,以便进行配置。

Twisted的官网推荐使用Nevow,但我不太确定这是否是个好选择。看起来他们的网站已经有一段时间无法访问了,而且他们的启动页面在半年内没有任何更新。这个项目是不是已经死掉了?另外,我在twisted-web的邮件列表上看到有人讨论将Nevow的部分功能移到twisted.web上。那么,现在还推荐在新项目中使用Nevow吗?

我还有一个想法是使用Django。因为在配置界面中我需要用户认证和权限管理,而我对Django比较熟悉。(我从来没有使用过Nevow或twisted.web)不过,似乎将这两个世界结合起来相当困难,我找到的例子都是关于如何在Twisted中用WSGI运行Django。

还有其他方法可以在Twisted上实现一个漂亮的用户界面吗?

3 个回答

1

现在可以肯定地说,Nevow已经彻底死了。举个例子,有一个错误,导致无法通过pip安装Nevow,这个问题在2009年就已经在开发版本中修复了,但因为从那以后就没有发布过新版本,所以这个修复并没有包含在任何正式版本里。

twisted.web,特别是twisted.web.template,几乎涵盖了Nevow中所有有用的功能,因此对于任何考虑使用Nevow的新项目,建议使用这些工具。

6

Nevow 仍然是一个不错的选择,如果你想在使用的模板系统中支持 Deferreds(延迟对象),它并没有被淘汰。它在处理复杂的 URL 路由方面,相比于普通的 Twisted Web 也有一些优势。不过,基本上来说,Nevow 只是一个模板系统,而 Twisted Web 才是真正的网络服务器。所以无论如何,你都会用到 Twisted Web。实际上,即使你在 Twisted Web 的 WSGI 容器中使用 Django,你仍然会用到 Twisted Web。因此,了解一些 Twisted Web 的知识是有益的。

如果你要生成任何 HTML 内容,那你肯定想用一个 HTML 模板库。到现在为止,没人应该还在用简单的字符串操作来构建 HTML。所以如果你想用其他的 Python HTML 模板库,比如 Cheetah、Quixote 等,而不是 Nevow,那也没问题!你只需要用模板库生成一个字符串,然后将其作为 HTTP 请求的响应输出。Twisted Web 并不关心这个字符串是从哪里来的。

如果你想用 Django(或其他基于 WSGI 的系统)做一些事情,你完全可以在你的 Twisted 进程中使用 Twisted Web 的 WSGI 支持来部署它。而且,只要你稍微小心一下,WSGI 应用和你其他的 Twisted 代码之间仍然可以进行交互——WSGI 应用是在一个线程池中运行的,而 Twisted 的 API 不是线程安全的,你必须使用 reactor.callFromThread 或者其他类似的少数 API 来调用它们(特别是,blockingCallFromThread 有时是一个有用的高级工具)。

9

首先,我想说一下关于Nevow是否已经“死掉”的看法。Nevow的代码和其他Divmod项目的代码都在divmod.org的launchpad上。由于硬件故障,这个项目的公共形象受到了很大影响,但它仍然存在,其他一些东西(比如维基和问题单)也在恢复中。现在并没有很多人在积极维护这个项目,但这主要是因为对大多数用户来说,它已经足够好了;有很多人依赖Nevow,如果它停止工作,他们会非常不高兴。这些人有能力和经验继续维护它。所以,虽然现在没有人在积极推广它,但我认为它不太可能消失。

我对Nevow的长期希望是这样的。(我本来想说“计划”,但由于我最近没有积极参与维护,这实际上取决于那些在做的人。)首先,我想把它的模板功能提取出来,放到twisted.web中。Nevow的干净、未被弃用的API主要由nevow.page.Element和各种加载器覆盖。Twisted本身在某些地方需要生成HTML,这些功能可能会很有用。接下来,我们应该把Nevow的“应用服务器”和资源模型部分扔掉。这些部分大多只是对twisted.web的一些随机修复或修改,其中大部分在某种形式上已经存在于twisted.web2中,因此要么会被回滚到twisted.web中,要么已经应用在那里。最后是关于Athena的问题。虽然双向通信是Twisted的一个强项,但Athena本身是一个庞大而复杂的JavaScript代码库,可能应该保持为一个独立的项目。

第三,关于主要问题,考虑到这些信息,你现在应该怎么做?

一般来说,我会说“使用nevow”。这个项目有一些小问题,需要更多的文档,而且它的API需要精简,以去掉一些旧的和损坏的东西,但它仍然非常有用,依然活跃。为了弥补文档稍显稀缺的不足,你可以加入Freenode上的#divmod#twisted.web频道来获得帮助。如果你能贡献一些补丁,你会发现那里会有很多热情的帮助。当你忽略那些被弃用的部分时,Nevow的API其实相对简单、合理,并且与twisted友好。上面我提到的Nevow的发展计划实际上对你来说影响很小。如果它真的发生了,意味着在1到5年后,当你升级到新版本的Twisted时,你可能会收到一些弃用警告,需要把代码中的某些import行从from nevow.page import ...; from nevow.loaders import ...改成一些假设的新东西,比如from twisted.web.page.element import ...; from twisted.web.page.templates import ...,或者类似的东西。大部分API在那之后应该保持不变,尤其是高层次的概念不会有太大变化。

使用Nevow的主要好处是它支持异步,可以在你的主线程中渲染页面而不会阻塞其他操作。而且,你可以通过Athena轻松实现COMET。

你也可以使用Django。虽然它的异步支持没有那么好,但显然它有更广泛的支持基础。不过,“不那么异步友好”并不意味着“难以使用”。你可以通过WSGIResource在twisted.web中运行它,并在你的Django应用中简单地使用blockingCallFromThread来调用任何返回Deferred的Twisted API,这应该足够强大,可以满足你几乎所有的需求。如果你有更具体的问题,关于如何实例化Twisted web资源以结合Twisted Web和Django,可能应该在Stack Overflow上单独提问。

撰写回答