在Python和JavaScript之间传递变量

15 投票
3 回答
18998 浏览
提问于 2025-04-17 03:52

想象一下,你需要写一些Javascript代码,当下拉列表的选项改变时,能够简单地改变一组复选框的状态。

根据你在列表中选择的项目,有些复选框会被选中或取消选中。

在后台,你有一些Python代码和SQLAlchemy。

Javascript需要像往常一样识别出列表中被选中的项目,然后把这个信息发送回Python模块。Python模块会用这个信息在SQLAlchemy中查找需要被选中的复选框,比如“用户选择了‘福特’,所以复选框‘Focus’,‘Mondeo’,‘Fiesta’需要被选中”。

我遇到的问题是,我似乎找不到一种方法可以让Javascript直接访问Python模块,而不需要把一个div变成一个迷你浏览器页面,并把包含变量的URL传递给它!

有没有人有好的想法,能让这个过程顺利进行呢?

3 个回答

0

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。

6

Python有一个叫做json的模块,非常适合这种情况。

使用老牌的AJAX,并把数据格式设为json,可以让你在JavaScript和Python模块之间交换数据。

(当然,前提是你的Python模块不是在客户端运行的,要不然我就不知道你怎么能从浏览器执行它了...)

11

有趣的是,我有一些网页,它们用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格式放在请求体里。

撰写回答