烧瓶响应中未保留命令输出中的空格和列

时间:2019-05-01 11:31:09

标签: flask python-3.6

这是我简单的flask api端点:

 # -*- coding: utf-8 -*-

 from flask import Flask, render_template
 from subprocess import PIPE, Popen

 app = Flask(__name__)

 @app.route('/', methods=['GET'])
 def main():
     cmd = Popen(['vmstat', '-a', '-w'], stdout=PIPE, stderr=PIPE)
     output, err = cmd.communicate()
     output = output.splitlines()
     return render_template('stats_template.html', output=output)

 if __name__ == '__main__': 
     app.run(port=54321, host='0.0.0.0')

模板如下:

 <ul>
  {% for l in output %}
    <p>{{ l }}</p>
  {% endfor %}
 </ul>

程序运行正常,但是换行符,未保留列且浏览器中的输出不那么可读:

b'procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------'

b' r b swpd free inact active si so bi bo in cs us sy id wa st'

b' 1 0 13068 1599088 560976 790220 0 0 36 73 139 597 21 41 38 0 0'

一直在尝试摆脱b',并获得与Linux shell完全相同的输出。

赞赏任何见识。

Edit1 :添加vmstat的输出作为参考。如您所见,flask的响应并未保留空格和列。

$ vmstat -a -w
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
 r  b         swpd         free        inact       active   si   so    bi    bo   in   cs  us  sy  id  wa  st
 1  0        13068      1611488       563132       776448    0    0    35    73  159  693  21  42  37   0   0

1 个答案:

答案 0 :(得分:0)

这需要jinja2模板中的html <pre>标记才能获得预期的输出。

最终模板:

<div>
  <ul>
    {% for line in output %}
      <pre>{{ line }}</pre>
    {% endfor %}
  </ul>
</div>

最终烧瓶片段:

# -*- coding: utf-8 -*-

from flask import Flask, render_template
from subprocess import PIPE, Popen

application = Flask(__name__)

@application.route('/', methods=['GET'])
def vmstat():
    cmd = Popen(['/usr/bin/vmstat', '-a', '-w'], shell = False, stdout=PIPE, stderr=PIPE)
    output, err = cmd.communicate()
    output = str(output, 'utf-8').splitlines()
    return render_template('stats_template.html', output=output)

if __name__ == '__main__':
    application.run(port=54321, host='0.0.0.0')

浏览器显示:

procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
 r  b         swpd         free        inact       active   si   so    bi    bo   in   cs  us  sy  id  wa  st
 0  0            0     14368716       639576       955400    0    0     8     1    1    1   0   0 100   0   0