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

问题描述 投票:0回答:3

我在通过 Ajax POST 接收大字符串到本地 python http.server 时遇到问题。

我正在尝试创建一个在本地主机上运行的网络应用程序。 Web 应用程序在启动时加载一个 JSON 文件,并使用该文件将数据加载到应用程序中。这些数据最终会在使用应用程序时被操纵。

保存时,我想将整个修改后的数据发送到python脚本,然后将该数据写入前面提到的JSON文件,这样当web应用程序重新打开时,它将拥有最新的数据。

服务器工作正常,将较小的数据保存到其他文件中没有任何问题。问题是由于我要保存的数据的大小所致。将数据(作为 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 header为1013727,但rfile长度只有23684。

我打印了 rfile 数据,实际上,它不是我尝试发送的整个字符串,并停在数组中间。

我使用 Chrome 开发工具进行了检查,请求负载也是我预期的完整字符串,因此我假设问题可能与 http.server 的文件大小限制有关。不幸的是,我找不到任何有关这可能是什么或如何更改它的信息。

我使用 Python 3.4 和 Google Chrome 作为浏览器。

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

javascript python ajax size server
3个回答
2
投票

我在使用 Python 3.4 + Chrome 时也遇到了同样的问题。 IE 和 Firefox 也会出现错误。

我修改了它:

# 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 缓冲,而 CGI 的 POST 数据很大...

不知道为什么...我在 python bug 数据库上打开了一个新条目。


1
投票

我通过挖掘套接字和 http.server 代码创建了一个解决方法

对于CGIHTTPRequestHandler(在http.server中),启用了rfile的缓冲,然后第一个缓冲区之后的所有内容似乎都被丢弃了。

(我认为)我所做的是禁用缓冲,然后通过将以下代码添加到 Handler 类来将“第一个缓冲区”值设置为整个字符串:

rbufsize = -1

def do_POST(self):
  self.rfile._sock = self.rfile
  return CGIHTTPRequestHandler.do_POST(self)

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


0
投票

感谢上面的回复,我根据我的需要调整了答案。 这是对我有用的解决方法:

  def do_POST(self):
        content_length = int(self.headers["content-length"])
        data = ''
        while len(data) < content_length:  # Bypass to read the buffer
            data += self.rfile._sock.read(content_length - len(data))
        data = data.decode('utf-8')
  
© www.soinside.com 2019 - 2024. All rights reserved.