我目前正在使用 flask 构建一个工具,该工具使用 ssh 执行各种操作。其中一项操作是使用 DD 从 X 复制到 Y。
我目前在我的页面上设置了以下 javascript
<script>
var source == new EventSource("/dd");
source.onmessage = function(event){
$('.determinate'.css('width', event.data+'%')
if(event.data == 100){
source.close()
}
}
调用以下 flask 生成器解析 DD 的标准输出以返回当前进度的 % 值。
@app.route('/dd')
def progress():
def generate():
ssh.SSHClient('127.0.0.1', username, password)
chan = ssh.get_transport().open_session()
chan.settimeout(10800)
try:
ssh.do('dd if=/dev/sda of=/test.img')
while data:
data = chan.recv_stderr(1024)
try:
yield "data: " + str(data) + "\n\n\"
return Response(generate(), mimetype='text/event-stream')
以上是伪代码,但我希望能够更改的是从触发此页面的表单中获取的变量中的 DD 命令(dd if=/dev/sda of=/test/img),以及来自带有 request.remote_addr 的 ssh.connect 函数的主机名。
当我尝试用 request.remote_addr 替换“127.0.0.1”时,出现上下文错误。
有没有办法将 flask/jinja2 变量(例如 {{ image.path }} )传递到我的生成器 View ?我想要的伪代码是这样的,其中主机名和 dd 是动态的(更改在大括号中)
@app.route('/dd')
def progress():
def generate():
ssh.SSHClient({{ request.remote_addr }}, username, password)
chan = ssh.get_transport().open_session()
chan.settimeout(10800)
try:
ssh.do('dd if={{ device }} of={{ image.path }}')
while data:
data = chan.recv_stderr(1024)
try:
yield "data: " + str(data) + "\n\n\"
return Response(generate(), mimetype='text/event-stream')
最佳答案
只是弄明白了,没有阅读文档的最后一段。
如果您想在生成器中保留先前请求的上下文,只需更改
return Response(generate(), mimetype='text/event-stream')
到
return Response(stream_with_context(generatE()), mimetype='text/event-stream')
为了传递数据,我只是使用“ session ”对象来传递数据,然后在使用完后将其删除。
关于javascript - 使用 flask 和 javascript 的动态事件源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30017614/