9

在 WSGI 中,通过读取类文件对象来消耗发布数据environ['wsgi.input']。如果堆栈中的第二个元素也想读取发布数据,它可能会在没有更多内容可读取时通过读取来挂起程序。

我应该如何复制 POST 数据以便可以多次处理?

4

3 回答 3

12

您可以尝试将流的类似文件的副本放回环境中:

from cStringIO import StringIO

length = int(environ.get('CONTENT_LENGTH', '0'))
body = StringIO(environ['wsgi.input'].read(length))
environ['wsgi.input'] = body

不过,需要这样做有点难闻。理想情况下,应该只有一段代码解析查询字符串和帖子正文,并将结果传递给其他组件。

于 2009-11-23T14:32:05.917 回答
8

去看看WebOb包。它提供的功能允许人们指定 wsgi.input 应该是可搜索的。这具有允许您倒带输入流的效果,以便可以通过不同的处理程序重播内容。即使您不使用 WebOb,它执行此操作的方式也应该具有指导意义,因为相信 Ian 会以适当的方式完成此操作。有关文档中的搜索结果,请转到此处

于 2009-11-23T22:18:43.417 回答
1

如果你想一口气读完,你总是可以读进去,为你读过的东西创建一个类似 CStringIO 文件的对象,然后将它分配回去,如下所示:

import cStringIO
import copy
lines = []
for line in environ['wsgi.input']:
    lines.append(line)
newlines = copy.copy(lines)
environ['wsgi.input'] = cStringIO.StringIO(''.join(newlines))

很可能有一种更有效的方法来做到这一点,但如果你想做任何不平凡的事情(比如多次阅读帖子数据),我通常会发现 wsgi 的帖子非常脆弱......

于 2009-11-23T14:31:32.830 回答