1

我正在尝试在网络应用程序中使用 Twisted,但遇到了一个有趣的问题。我对 Twisted 很陌生,所以我不确定我是否在 Twisted 中看到了一个错误,或者我只是没有正确使用它。

从理论上讲,从示例中可以使用 File 资源对象来提供目录中的文件,以及提供目录列表。因此,假设我在代码片段之前的其他地方定义了变量(端口、reportsDir),我将执行以下操作:

rootResource = Resource()
rootResource.putChild("reports", File(reportsDir))
reactor.listenTCP(port, Site(rootResource))
reactor.run(installSignalHandlers=False)

现在,当我在主机上访问“/reports”时,我在浏览器中收到一条消息“请求未返回字节”,其中包含一堆显然是由扭曲产生的东西,但也包含一个 u' 的打印... ..' 字符串文字,实际上其中包含目录列表。所以 DirectoryLister 显然是在创建列表 HTML,但在 Twisted 中它并没有被认为是有效的。它似乎不喜欢 unicode 字符串;这实际上是由 Twisted 自己制作的。

我是否需要设置一些其他配置项以使其将 unicode 字符串转换为必要的字节对象(或其他),或其他方法?

非常感谢,

-D

4

1 回答 1

4

好吧,问题似乎在于,如果格式上的任何源字符串是 unicode,Python 会将任何字符串提升为 unicode。在我的例子中,“reportsDir”是 unicode,因为它来自一个 XML 文件,并且将它设置为错误路径。

更改上述行:

rootResource.putChild("reports", File(reportsDir))

至:

rootResource.putChild("reports", File(reportsDir.encode('ascii', 'ignore')))

解决了这个问题。但是,我建议 Twisted 开发人员在 File 的构造函数中检查 unicode,或者在 DirectoryLister 中简单地检查 unicode,如果是则返回 ascii 编码的版本。

于 2013-12-06T21:30:25.173 回答