Python本地服务器问题:通过ajax发布时,rfile被截断
Python local server issue: rfile gets truncated when posting through ajax
通过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')
- 在指令控制器中使用$attrs时出现问题
- 从桌面读取python文件时高亮显示代码
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 在循环中分配json值时,值被覆盖
- JQuery使计数器每次更改时都会增加
- 如何在生成下载文件时显示加载动画
- 使用clickToggle并在单击另一个元素时关闭元素
- 单击时将焦点更改为元素
- 将PHP变量传递给jQuery时遇到问题
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- 让文本输入幻灯片显示输入时的新文本输入?然后向后滑动
- 单击F5时如何停止页面加载
- 使用压缩的JavaScript文件(不是运行时压缩)
- 跟踪在页面加载时应用内联样式的JavaScript
- HTML表单提交时未执行外部函数
- 播放当前视频时如何停止其他视频?JavaScript
- ExtJS——在展开/折叠时调整面板高度
- 在单击任何位置时隐藏元素,而不检查每次DOM单击
- Python本地服务器问题:通过ajax发布时,rfile被截断
- 当在堆栈底部添加ImageView时,我想删除RelativeLayout中的顶部ImageView,但它正在删除整个布