使用AJAX请求解析Python脚本并在Flask中显示同一页面上的数据

使用AJAX请求解析Python脚本并在Flask中显示同一页面上的数据,python,ajax,flask,Python,Ajax,Flask,我正在尝试使用AJAX请求处理Python脚本。我正在Flask上呈现我的网页。当我不使用Flask时,我的解决方案在本地机器上工作,但自从我移植到Flask以便在Azure上部署之后,我就开始面临问题 我的目标是将country和rate从My home.html页面上的表单传递到script.py文件。py使用这些变量并打印出一个静态HTML响应,该响应将在我的HTML页面的result div标记中更新 这是我的Flask application.py文件: from flask impo

我正在尝试使用AJAX请求处理Python脚本。我正在Flask上呈现我的网页。当我不使用Flask时,我的解决方案在本地机器上工作,但自从我移植到Flask以便在Azure上部署之后,我就开始面临问题

我的目标是将country和rate从My home.html页面上的表单传递到script.py文件。py使用这些变量并打印出一个静态HTML响应,该响应将在我的HTML页面的result div标记中更新

这是我的Flask application.py文件:

from flask import Flask, render_template, request

app = Flask(__name__)

@app.route("/", methods=['GET', 'POST'])
def home():
    return render_template('home.html')

if __name__ == "__main__":
    app.run(debug=True) 
我的AJAX请求:

function python_process() {

    var rate = $('input[name=rate]').val();
    var country = $('select[name=country]').val();

    $.ajax({

        url: "/static/script.py",
        type: "POST",
        data: {
            "rate" : rate, 
            "country": country
            },

        success: function(data){
                    var result = $('<div>').append(data);
                    $('#result').html(result);
                },
        error:  function(){
                    console.log('in error');
                }
        });
};
我尝试过的事情:

试图使我的script.py文件成为它自己的Flask方法,但是脚本太大,在我尝试时总是给我一个服务器错误。 已尝试控制台打印AJAX成功调用中的数据变量,但默认控制台日志始终显示错误。 您可以使用子流程在flask中运行脚本并捕获输出

import subprocess

@app.route("/script", methods=['GET', 'POST'])
def home():
    rate = request.form.get('rate', '')
    country = request.form.get('country', '')

    output = subprocess.check_output('python script.py {} {}'.format(rate, country), shell=True)

    return output
AJAX必须使用url/脚本

最少的工作示例

main.py flask+模板在一个文件中

#!/usr/bin/env python3 

from flask import Flask, render_template, request, render_template_string
import subprocess

app = Flask(__name__)

@app.route("/", methods=['GET', 'POST'])
def home():
    return render_template_string('''<!DOCTYPE html>
<html>
<head>
<!-- can't be `slim` version because it has not `$.ajax` -->
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
</head>
<body>

<form>
Rate: <input type="text" name="rate"/><br/>
Country: <select name="country"/><option>France</option><option>Germany</option></select><br/>
<button>OK</button>
</form>

<div id="result"></div>

<script>$(function() {
    $('button').click(function(e) {

        var rate = $('input[name=rate]').val();
        var country = $('select[name=country]').val();

        // alert('rate: "' + rate + '" | country: "' + country + '"');

        $.post({
            url: "/script",
            data: {
                "rate" : rate, 
                "country": country
            },
            success: function(data){
                var result = $('<div>').append(data);
                $('#result').html(result);
            },
            error: function(){
                console.log('in error');
            }
        });

        e.preventDefault();
    });
});    
</script>
</body>
</html>''')

@app.route("/script", methods=['GET', 'POST'])
def script():
    rate = request.form.get('rate')
    country = request.form.get('country')

    print('[form] rate: "{}" | country: "{}"'.format(rate, country))

    # I use `""` to send empty string as argument
    output = subprocess.check_output('python3 script.py "{}" "{}"'.format(rate, country), shell=True)

    return output

if __name__ == "__main__":
    app.run(debug=True) 

你不能这样做。Url/static/script.py被定向到flask,flask尝试将其内容作为普通文件发送,例如image、.css等。它不会超出此范围。您必须向flask中的某个函数发送请求,flask必须执行它。和任何其他模板一样,flask必须将其结果发送给客户端。您可以尝试在flask中使用模块subprocess运行script.py并捕获输出。@furas在这种情况下,我在哪里调用subprocess?而且,这也不允许我将任何变量从HTML表单传递到script.py。您必须使用ie.@app.route'/scipt'在Flask中创建函数,并在此函数内运行子流程。AJAX将运行url/script。这是一个普通的flask函数,因此它可以从AJAX获取参数。并且子流程可以运行script.py arg1 arg2 arg3来解决这个问题,谢谢,但是控制台向我显示了以下错误-POSThttp:///script 500内部服务器错误抱歉,它应该是而不是call_输出。和request.form而不是request.post。若脚本未设置为可执行文件,那个么在check_输出中可能需要python script.py。顺便说一句:如果您在console/terminal/cmd.exe中运行,那么它应该会向您显示有关问题的更多信息。我添加了用于测试它的最小工作示例。我已经测试过了,但问题似乎是以请求变量的形式传输到脚本中。我得到了输出-[script.py]rate:None | country:None,表明这些请求表单get变量没有正确分配。我以前的脚本使用CGI模块,我在脚本中用sys模块替换了CGI模块。如果没有,那么它将作为script.py None执行,这意味着它无法从request.form获取值-顺便说一下:我也提到过它-在第一个版本中,我有request.post,但它必须是request.form
#!/usr/bin/env python3 

import sys

rate = '?'
country = '?'

# send on screen instead of sending to flask
sys.stderr.write( '[sys.argv] {}\n'.format(str(sys.argv)) )

if len(sys.argv) > 1:
    rate = sys.argv[1]

if len(sys.argv) > 2:
    country = sys.argv[2]

print('[script.py] rate: "{}" | country: "{}"'.format(rate, country))