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

2024-05-23 14:30:19 发布

您现在位置:Python中文网/ 问答频道 /正文

在WSGI中,post数据是通过读取类似于对象environ['wsgi.input']的文件来消耗的。如果堆栈中的第二个元素也希望读取post数据,则可能会在没有其他内容可读取时通过读取挂起程序。

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


Tags: 文件数据对象程序元素wsgi内容input
3条回答

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

from cStringIO import StringIO

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

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

去看看WebOb包。它提供的功能允许指定wsgi.input应该是可查看的。这样做的效果是允许您倒带输入流,以便可以通过不同的处理程序重放内容。即使你不使用WebOb,它的方式应该是有指导意义的,因为相信伊恩已经用了一个适当的方式。有关文档中的搜索结果,请转到here

如果你想一下子读完它,你可以把它读进去,创建一个类似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))

很可能有一种更有效的方法可以做到这一点,但我总的来说,如果你想做任何非琐碎的事情(比如多次读取post数据),wsgi的post内容会非常脆弱。。。

相关问题 更多 >