2024-05-23 14:30:19 发布
网友
在WSGI中,post数据是通过读取类似于对象environ['wsgi.input']的文件来消耗的。如果堆栈中的第二个元素也希望读取post数据,则可能会在没有其他内容可读取时通过读取挂起程序。
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
不过,需要这么做有点难闻。理想情况下,应该只有一段代码解析查询字符串和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内容会非常脆弱。。。
您可以尝试将流的类似文件的副本放回环境中:
不过,需要这么做有点难闻。理想情况下,应该只有一段代码解析查询字符串和post体,并将结果传递给其他组件。
去看看WebOb包。它提供的功能允许指定wsgi.input应该是可查看的。这样做的效果是允许您倒带输入流,以便可以通过不同的处理程序重放内容。即使你不使用WebOb,它的方式应该是有指导意义的,因为相信伊恩已经用了一个适当的方式。有关文档中的搜索结果,请转到here。
如果你想一下子读完它,你可以把它读进去,创建一个类似CStringIO文件的对象,然后把它分配回去,就像这样:
很可能有一种更有效的方法可以做到这一点,但我总的来说,如果你想做任何非琐碎的事情(比如多次读取post数据),wsgi的post内容会非常脆弱。。。
相关问题 更多 >
编程相关推荐