这是我简单的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
答案 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