javascript - 使用 flask 和 javascript 的动态事件源

标签 javascript python flask jinja2

我目前正在使用 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/

相关文章:

javascript - 遍历输入并将数据传递给 AJAX 函数

VSCode : Why can come cell outputs be set to HTML, 中的 Python 而其他人只有文本?

python - 如何计算边界框的中心?

javascript - 从frame1中的按钮设置frame2的帧源?

javascript - Nuxt 和 Vue Apollo。如何处理智能查询内的错误并重定向到 404/400/500 错误页面?我们能捕捉到这样的错误吗?

python os.path.exists 在文件存在时报告 False

python - 导入错误 : no module named flask. ext.script

python - 如何将 Superset Apache 嵌入到 Flask Web 应用程序中?

python - 在sql分页中保持列表的顺序

javascript - 在 d3.js 中更新饼图