在Python和JavaScript之间传递变量
想象一下,你需要写一些Javascript代码,当下拉列表的选项改变时,能够简单地改变一组复选框的状态。
根据你在列表中选择的项目,有些复选框会被选中或取消选中。
在后台,你有一些Python代码和SQLAlchemy。
Javascript需要像往常一样识别出列表中被选中的项目,然后把这个信息发送回Python模块。Python模块会用这个信息在SQLAlchemy中查找需要被选中的复选框,比如“用户选择了‘福特’,所以复选框‘Focus’,‘Mondeo’,‘Fiesta’需要被选中”。
我遇到的问题是,我似乎找不到一种方法可以让Javascript直接访问Python模块,而不需要把一个div变成一个迷你浏览器页面,并把包含变量的URL传递给它!
有没有人有好的想法,能让这个过程顺利进行呢?
3 个回答
Ajax是一种很好的方法,可以在Python和JavaScript之间传递变量。
JavaScript代码:
param = {a:'hello', b: 'world', c: '!'}
$.ajax({
type: "post",
url: "scpi.py",
cache: false,
async: 'asynchronous',
dataType: 'html',
data: param,
success: function(data) {
console.log(data)
},
error: function(request, status, error){
console.log("Error: " + error)
}
})
Server.py: (要让这个工作,你需要三个函数)
def do_POST(self):
if "scpi.py" in self.path:
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={'REQUEST_METHOD': 'POST'}
)
a = form['a'].value
b = form['b'].value
c = form['c'].value
content = myfunction(a, b, c)
self.respond(content)
def handle_http(self, data):
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
print(data)
return bytes(str(data), 'UTF-8')
def respond(self, data):
response = self.handle_http(data)
print(data)
顺便说一下:“myfunction(a, b, c,)”是另一个Python文件中的一个函数,它会返回数据,然后把这些数据传递给self.respond,最后再发送回JavaScript。
Python有一个叫做json
的模块,非常适合这种情况。
使用老牌的AJAX,并把数据格式设为json,可以让你在JavaScript和Python模块之间交换数据。
(当然,前提是你的Python模块不是在客户端运行的,要不然我就不知道你怎么能从浏览器执行它了...)
有趣的是,我有一些网页,它们用JavaScript和Python的CGI模块进行交流,这些模块还用到了SQLAlchemy。
我做的事情是发送AJAX请求,不过这次请求的内容是JSON格式,而不是XML。Python的CGI模块使用标准的 json
模块来把JSON转换成字典。
JavaScript那边的代码看起来是这样的:
function on_request_success(response) {
console.debug('response', response);
}
function on_request_error(r, text_status, error_thrown) {
console.debug('error', text_status + ", " + error_thrown + ":\n" + r.responseText);
}
var request = { ... };
jQuery.ajax({
url: 'http://host/whatever.cgi',
type: 'POST',
cache: false,
data: JSON.stringify(request),
contentType: 'application/json',
processData: false,
success: on_request_success,
error: on_request_error
});
而Python那边的代码是这样的:
request = json.load(sys.stdin)
response = handle_request(request)
print("Content-Type: application/json", end="\n\n")
json.dump(response, sys.stdout, indent=2)
需要注意的是,这里并没有使用Python的CGI模块,因为整个请求的内容都是以JSON格式放在请求体里。