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

Python local server issue: rfile gets truncated when posting through ajax

本文关键字:布时 rfile ajax 服务器 问题 通过 Python      更新时间:2023-09-26

通过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))

当从浏览器发送未修改的数据时,内容长度标头为1013727,但rfile长度仅为23684。

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

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

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

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

我在使用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数据库中打开了一个新条目。

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

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

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

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

因此,它目前有效,但可能会在未来的中引发问题

感谢上面的回复,我根据自己的需求调整了答案。这是一个对我有效的变通方法:

  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')