[英]Passing variables between Python and Javascript
想象一下,您需要编写一些 Javascript 来在更改下拉列表时简单地更改一组复选框。
根据在列表中选择的项目,某些复选框将被选中/取消选中。
在后面,你有 Python 代码和一些 SQLAlchemy。
Javascript 需要像往常一样识别列表中的选定项目,将其发送回 Python 模块,然后 Python 模块将使用一些 SQLAlchemy 中的变量返回需要检查的复选框列表,即“用户选择了‘福特’,所以复选框“焦点”、“蒙迪欧”、“嘉年华”需要被选中”
我遇到的问题是,我似乎无法找到一种方法来从 Javascript 访问 python 模块,而无需将 div 转换为迷你浏览器页面并将包含变量的 url 传递给它!
有人对这应该如何工作有任何想法吗?
有趣的是,我有一些带有 JavaScript 的网页,这些网页与使用 SQLAlchemy 的 Python CGI 模块对话。
我所做的是发送 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 传递。
python 有一个json
模块,非常适合这种情况。
使用良好的旧 AJAX,以 json 作为数据格式将允许您在 javascript 和您的 python 模块之间交换数据。
(除非您的 python 模块在客户端运行,但是我看不到您如何从浏览器执行它...)
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.