通过Ajax POST向本地python http.server接收大字符串时遇到问题。
我正在尝试创建一个运行localhost的webapp。 webapp在启动时加载JSON文件,并使用它将数据加载到应用程序中。这些数据最终会在使用应用程序时被操纵。
保存时,我想将整个修改过的数据发送到python脚本,然后将该数据写入前面提到的JSON文件,因此当webapp重新打开时,它将获得最新的数据。
服务器正常工作,将较小的数据保存到其他文件可以正常工作。问题是由于我要保存的数据大小。将数据(作为JSON.stringified字符串)发送到python脚本时,字符串会被截断,因此python脚本无法解析它以重新创建JSON对象。
我修改了do_POST函数以返回内容长度标题,然后返回接收数据的实际大小:
def do_POST(self):
length = int(self.headers['Content-Length'])
print(length)
post_data = self.rfile.read(length)
print(len(post_data))
从浏览器发送未修改的数据时,Content-length头为1013727,但rfile长度仅为23684。
我打印了rfile数据,实际上,它不是我尝试发送的整个字符串,而是停留在数组中间。
我使用Chrome开发工具进行了检查,请求有效负载也是我预期的完整字符串,因此我假设问题可能与http.server的文件大小限制有关。不幸的是,我找不到任何关于这可能是什么或如何更改它的信息。
我使用Python 3.4和谷歌浏览器作为我的浏览器。
任何帮助将不胜感激。谢谢!
答案 0 :(得分:2)
我在使用Python 3.4 + Chrome时遇到了同样的问题。 IE和Firefox也会出现Bug。
我修改了它:
# Make rfile unbuffered -- we need to read one line and then pass
# the rest to a subprocess, so we can't use buffered input.
#rbufsize = 0
rbufsize = -1
并评论出来:
# throw away additional data [see bug #427345]
## while select.select([self.rfile._sock], [], [], 0)[0]:
## if not self.rfile._sock.recv(1):
## break
问题似乎是rfile缓冲,而POST数据很大,使用CGI ...
不知道为什么......我在python bug数据库上打开了一个新条目。
答案 1 :(得分:1)
我通过挖掘套接字和http.server代码
创建了一个工作对于CGIHTTPRequestHandler(在http.server中),启用了对rfile的缓冲,然后在第一个缓冲区之后的所有内容都被丢弃了。
我所做的是禁用缓冲,然后设置"第一个缓冲区"通过将以下代码添加到Handler类,将值作为整个字符串:
rbufsize = -1
def do_POST(self):
self.rfile._sock = self.rfile
return CGIHTTPRequestHandler.do_POST(self)
所以它现在有效,但它可能在未来引起问题