带烧瓶和 javascript 的动态事件源

Dynamic EventSource with flask and javascript

我目前正在使用 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 的标准输出解析为 return 当前进度的 % 值。

@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)触发此页面,以及来自 ssh.connect 函数的主机名 request.remote_addr.

当我尝试用 request.remote_addr 替换“127.0.0.1”时,出现上下文错误。

是否可以将 flask/jinja2 变量(例如 {{ image.path }} 传递到我的生成器视图?我想要的伪代码是这样的,其中主机名和 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" 对象来传递数据,然后在使用完后将其删除。