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

joe*_*ker 7 python wsgi

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

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

bob*_*nce 11

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

from cStringIO import StringIO

length = int(environ.get('CONTENT_LENGTH', '0'))
body = StringIO(environ['wsgi.input'].read(length))
environ['wsgi.input'] = body
Run Code Online (Sandbox Code Playgroud)

但是,要做到这一点需要一点点气味.理想情况下,只有一段代码应该解析查询字符串和帖子正文,并将结果传递给其他组件.


Gra*_*ton 7

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