首页 > 解决方案 > 使用 python / flask + ajax 动态更新 html 站点的问题

问题描述

我有一个带有文件 dropzone 的 python/flask 应用程序文件,
一旦上传了一个文件,我就会从另一个 py 文件启动一个函数。
现在我需要在网站上传文件时打印一个字符串
这是应用程序文件的一部分:

logger = None

@app.route('/',methods=['POST','GET'])

def upload():
    
    if request.method == 'POST':
        f = request.files.get('file')
        f.save(os.path.join(app.config['UPLOADED_PATH'],f.filename))
        es.main() 
        global logger
        logger = "something here"
    return render_template('index.html', logger=logger)

这是html文件:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<script>

$(function(){
  window.setInterval(funtion(),{
  loadNewLogger() 
}, 100)

function loadNewLogger(){

  $.ajax({
    url:"/",
    type: "POST",
    datatype: "text",
    success: function(data){
      $(update_logger).replaceWith(data)
    }
  });
}
});


</script>
<body>
    <div style="color:rgb(0, 0, 0);text-align:center"> 
    NAME </div>
  
  {{ dropzone.create(action='upload') }}
  {{ dropzone.load_js() }}
  {{ dropzone.config() }}
  

  <div id="update_logger">
    {{ logger }}
  </div>

问题是什么都没有发生。html 站点显示“无”,当它应该在上传文件后打印“这里的东西”时。那个代码有什么问题?

标签: pythonhtmlajaxflask

解决方案


问题是默认情况下您的路线接受GET请求。因此,无论何时获取,它都会直接运行return render_template('index.html', logger=logger);但是你看这一次它没有访问权限logger = "something here"。这意味着当有GET请求时,该行永远不会被执行,因此值loggerstays None。你可以做的是添加一个return logger

logger = None

@app.route('/',methods=['POST','GET'])

def upload():

    if request.method == 'POST':
        f = request.files.get('file')
        f.save(os.path.join(app.config['UPLOADED_PATH'],f.filename))
        es.main() 
        global logger
        logger = "something here"
        return logger

    return render_template('index.html', logger=logger)

确保你导入url_for()——from flask import url_for


推荐阅读