error: [Errno 32] Broken pipe

我的解决办法

以防有的人懒得看过程,解决办法写前头~
do_xxx 设置响应头的时候多添加这一项:

self.send_header("Access-Control-Allow-Origin", "*")
如果有其他解决办法的,或者没有解决但找到其他解决办法的,恳请指教,共同进步,共创和谐社会,吼嘿~

错误出现场景

用python写一个服务,继承 BaseHTTPRequestHandler,Get请求处理正确(代码未贴出),Post请求出现错误。

def do_POST(self):
    # 配置响应头
    self.send_response(200)
    self.send_header('Content-Type', 'text/html; charset=utf-8')
    self.end_headers()

    ctype, pdict = parse_header(self.headers['content-type'])
    # print 'content-type',self.headers['content-type']
    if ctype == 'multipart/form-data':
        postvars = parse_multipart(self.rfile, pdict)
    elif ctype == 'application/x-www-form-urlencoded':
        length = int(self.headers['content-length'])
        postvars = parse_qs(
                self.rfile.read(length),
                keep_blank_values=1)
    elif ctype == 'text/plain':
        length = int(self.headers['content-length'])
        data = self.rfile.read(length)
        postvars = json.loads(data)
    else:
        postvars = {}
    self.core_process(postvars)

def core_process(self, query_dict):
    query_text  = query_dict["query_text"][0] if "query_text" in query_dict else None
    out_data = my_program(query_text)  # 主要处理程序,正确处理
    print 'has get rst'   # 能够打印该句
    self.wfile.write(out_data)  # 此处出错

模拟Post请求,写了一个简单页面,点击按钮,发送post请求,并将结果展示在下面的文本框中。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>测试Post请求</title>
<script src="http://code.jquery.com/jquery.js"></script>
<script>
$(document).ready(function(){
  $('#inputForm').submit(function(e){
    e.preventDefault();
    var $form1 = $(this);
    data = {query_text:$('#query_text').val()};
    url = "http://172.16.3.241:8088";
    $.post(url, data, function (data) {
        $('#output_result').val(data);
    });
  });
});
</script>

</head>
<body>
<form id="inputForm" name="inputForm" method="post" action="172.16.3.241:8088">
    <div>
        <label>query_text:</label>
        <textarea name="query_text" id="query_text" rows="8" cols="40"></textarea>
    </div>
    <div>
        <button type="submit">Post请求</button>
    </div>
</form>
    <div>
        <label>output_result:</label>
        <textarea name="output_result" id="output_result" rows="8" cols="40"></textarea>
    </div>
</body>
</html>

网页端模拟发送Post请求,后台报出

error: [Errno 32] Broken pipe

网上查资料
stackoverflow的一个提问 (第二个回答是我写的,如果我的办法对你有用,请帮我点个赞吧,谢谢O(∩_∩)O)
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法

基本是说:客户端在服务器返回前,就已经断开连接,服务器端写response才报错。

艰辛旅途:

  • 尝试了加close, flush,没有用。
  • 然后考虑延长客户端的连接时间,不会 O__O “… (不太懂前端),以前写过类似的,好像也没有问题,应该不是前端请求的问题!
  • 怀疑是程序处理时间太长导致,通过修改函数 my_program(input_text) 直接返回一个字符串,短时间返回不报错,但是页面未获得返回数据,post没有进入success函数!
  • 查找没有进入success回调函数原因,一番搜索(此处省略xxxxx)
  • 看到浏览器调试窗口的角角上有一个红色的小点点!网页有错误!!ヾ(。`Д´。)
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is there
  • 搜索解决上述错误的方法,No ‘Access-Control-Allow-Origin’ 说是“ajax跨域”什么的,选了最简单的解决办法,就是添加header

    在请求的java方法中加入
    ServletActionContext.getResponse().setHeader("Access-Control-Allow-Origin", "*");
    即可

  • 然后网页能够正常显示短字符串了

  • 尝试心理把处理程序改回原来的,然后也正常显示原本的处理结果了,没有报错,呵呵,就这样顺便解决了之前的问题。┑( ̄Д  ̄)┍

意见&建议

本文有什么写的不对的地方,欢迎各位指出,谢谢~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值