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