如果我想多次处理POST数据,如何复制wsgi.input?

时间:2009-11-23 14:18:42

标签: python wsgi

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

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

3 个答案:

答案 0 :(得分:11)

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

from cStringIO import StringIO

length = int(environ.get('CONTENT_LENGTH', '0'))
body = StringIO(environ['wsgi.input'].read(length))
environ['wsgi.input'] = body
但是,需要这样做有点气味。理想情况下,只有一段代码应该解析查询字符串和帖子正文,并将结果传递给其他组件。

答案 1 :(得分:7)

去看看WebOb包。它提供的功能允许用户指定wsgi.input应该是可搜索的。这样可以让您回放输入流,以便可以通过不同的处理程序重放内容。即使你不使用WebOb,它的工作方式也应该是有益的,因为我相信Ian能够以适当的方式完成这项工作。对于文档中的搜索结果,请转到here

答案 2 :(得分: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的帖子非常脆弱,如果你想做任何非平凡的事情(比如阅读帖子数据多次)......