Python 从WSGI访问POST数据

Python 从WSGI访问POST数据,python,python-3.x,wsgi,Python,Python 3.x,Wsgi,我似乎不知道如何使用WSGI访问POST数据。我在wsgi.org网站上尝试了这个例子,但没有成功。我现在正在使用Python 3.0。请不要推荐WSGI框架,因为这不是我想要的 我想弄清楚如何将其放入fieldstorage对象。我建议您以一些框架如何实现为例。(我不推荐任何一个,只是以它们为例。) 以下是以下代码: 哪个叫 这里的总结有点复杂,所以我不做了 body= '' # b'' for consistency on Python 3.0 try: length= int

我似乎不知道如何使用WSGI访问POST数据。我在wsgi.org网站上尝试了这个例子,但没有成功。我现在正在使用Python 3.0。请不要推荐WSGI框架,因为这不是我想要的


我想弄清楚如何将其放入fieldstorage对象。

我建议您以一些框架如何实现为例。(我不推荐任何一个,只是以它们为例。)

以下是以下代码:

哪个叫

这里的总结有点复杂,所以我不做了

body= ''  # b'' for consistency on Python 3.0
try:
    length= int(environ.get('CONTENT_LENGTH', '0'))
except ValueError:
    length= 0
if length!=0:
    body= environ['wsgi.input'].read(length)

请注意,WSGI尚未完全针对Python3.0指定,许多流行的WSGI基础设施尚未转换(或者已经从2to 3D转换,但未经过适当测试)。(即使wsgiref.simple_服务器也不会运行。)今天,您在3.0上执行WSGI时遇到了困难。

假设您只想将POST数据获取到FieldStorage对象中:

# env is the environment handed to you by the WSGI server.
# I am removing the query string from the env before passing it to the
# FieldStorage so we only have POST data in there.
post_env = env.copy()
post_env['QUERY_STRING'] = ''
post = cgi.FieldStorage(
    fp=env['wsgi.input'],
    environ=post_env,
    keep_blank_values=True
)
这对我很有用(在Python 3.0中):


是的,我在让wsgiref工作时遇到了问题。我最终实现了这个补丁。这在Python 3.0中不起作用-它在wsgi.input返回字节而不是字符串时有问题:(我需要一种在Python 3.0中实现这一点的方法…您使用的是什么WSGI处理程序?如果我使用内置的CGIHandler,它对我来说很好。我有一个文件“post.cgi”在我的本地服务器上,内容运行正常。wsgi.input是什么io类?如果它是BuffereDiabase,那么您应该能够将它包装在TextIOWrapper中,以便cgi.FieldStorage可以使用它。@Mike,我也想到了这一点,但从长远来看,这会使它无法正常工作,因为post数据可以是二进制的(例如,文件)@Evan,也许我疯了,但你可以将输入包装在TextIOWrapper中,扩展FieldStorage并覆盖
make_file
方法,以返回你自己的文件包装,该文件在写入时编码回二进制数据…如果这不能用更简单的方法完成的话。你使用的是哪个WSGI处理程序?在Python 3.0中仍然不起作用,并且这就是我要找的。无论如何,谢谢。@FireCrow看看框架是怎么做的似乎是一个好主意。这并不是真正的建议框架方式。链接已经死了,尽管如此。FWIW,目前还没有针对Python 3.0的WSGI规范,所以您所做的任何事情都可能是浪费精力的,因为任何最终的规范都是update可能与任何试图实现Python3.0的人都不兼容。对于WSGI应用程序,最好还是使用Python2.X.@GrahamDumpleton not:(我们不要误导像我这样晚一点读这篇文章的人,也可以节省他们的时间)@JermoeJ——他在2009年写了这篇评论,你在2013年回复了它;不要认为他试图误导任何人。:)
import urllib.parse

post_input = urllib.parse.parse_qs(environ['wsgi.input'].readline().decode(),True)