在 WSGI 中,通过读取类文件对象来消耗发布数据environ['wsgi.input']
。如果堆栈中的第二个元素也想读取发布数据,它可能会在没有更多内容可读取时通过读取来挂起程序。
我应该如何复制 POST 数据以便可以多次处理?
您可以尝试将流的类似文件的副本放回环境中:
from cStringIO import StringIO
length = int(environ.get('CONTENT_LENGTH', '0'))
body = StringIO(environ['wsgi.input'].read(length))
environ['wsgi.input'] = body
不过,需要这样做有点难闻。理想情况下,应该只有一段代码解析查询字符串和帖子正文,并将结果传递给其他组件。
如果你想一口气读完,你总是可以读进去,为你读过的东西创建一个类似 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 的帖子非常脆弱......