Python本地服务器问题:通过ajax发布时,rfile被截断

时间:2015-03-23 15:55:40

标签: javascript python ajax size server

通过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和谷歌浏览器作为我的浏览器。

任何帮助将不胜感激。谢谢!

2 个答案:

答案 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)

所以它现在有效,但它可能在未来引起问题