【Python】error: [Errno 32] Broken pipe

我的解决办法

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

self.send_header("Access-Control-Allow-Origin", "*")
  • 1

如果有其他解决办法的,或者没有解决但找到其他解决办法的,恳请指教,共同进步,共创和谐社会,吼嘿~

错误出现场景

用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)  # 此处出错
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

模拟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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

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

error: [Errno 32] Broken pipe
  • 1

网上查资料 
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
  • 1
  • 搜索解决上述错误的方法,No ‘Access-Control-Allow-Origin’ 说是“ajax跨域”什么的,选了最简单的解决办法,就是添加header

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

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

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

意见&建议

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

参考了:https://blog.csdn.net/zsdt345a780rfajwet/article/details/72828816

猜你喜欢

转载自blog.csdn.net/qq_34898866/article/details/80562412