将表单数据传递给Python

4 投票
1 回答
13597 浏览
提问于 2025-04-17 15:31

我有一个HTML表单,里面有一些数据,我想把这些数据发送到我的SVN(一个版本控制系统)。因为HTML和JavaScript本身没有办法直接做到这一点,所以我想用Python来作为表单和SVN之间的桥梁。我的问题是,我不知道怎么把数据从HTML/JavaScript发送到Python,因为这两者都是在客户端运行的(没有服务器参与)。

我想象中的情况是,用户填写完表单后,点击一个“提交”按钮,这样就能调用一个Python脚本,并把他们填写的表单数据作为参数传递过去。

我查了一下,发现很多人是在服务器端运行Python,然后从他们的JavaScript通过POST请求发送数据,但因为我没有服务器,所以我觉得这对我来说不太可能。

那么,如果HTML和JavaScript都是在客户端,是否有办法把数据发送到Python呢?


补充一下,我在Python和JavaScript方面有不错的基础。

1 个回答

2

这里有几种将Python和JavaScript结合起来的有趣方法:

从HTML/JS返回数据到Python

注意:因为你提到你没有服务器,所以你用JavaScript发出的请求必须指向Python代码运行的socket的监听端口。其实很简单,只需让Python监听80端口,然后JavaScript就可以直接向这个端口发送请求,无需多想。

基本上,你可以在HTML表单中使用JavaScript的 onSubmit() 或者一个 按钮,这个按钮会调用上面提到的 AJAX 代码,然后让Python读取 JSON 数据(根据链接顶部显示的 JSON格式来构建 <form> 数据)。


下面是如何通过JavaScript使用表单数据的简要介绍:

<HTML>
    <HEAD>
        <TITLE>Test Input</TITLE>
        <SCRIPT LANGUAGE="JavaScript">
        function testResults (form) {
            var TestVar = form.inputbox.value;
            alert ("You typed: " + TestVar);
        }
        </SCRIPT>
    </HEAD>
    <BODY>
        <FORM NAME="myform" ACTION="" METHOD="GET">Enter something in the box: <BR>
            <INPUT TYPE="text" NAME="inputbox" VALUE=""><P>
            <INPUT TYPE="button" NAME="button" Value="Click" onClick="testResults(this.form)">
        </FORM>
    </BODY>
</HTML>

用这个原则来收集你的信息,
然后在上面提到的链接中加入AJAX部分。
一旦你完成这些,就可以启动一个Python脚本(链接中也有展示),它会监听这些请求。

记住:使用 JSON 时,要格式正确,比如 ' 是不允许的,必须用 "


在我的链接中,这部分是向“服务器”(Python脚本)发送GET请求的重要部分:

xmlhttp.open("GET","Form-data",true);

下面是Python部分:

from socket import *
import json
s = socket()
s.bind(('', 80)) # <-- Since the GET request will be sent to port 80 most likely
s.listen(4)
ns, na = s.accept()

while 1:
    try:
        data = ns.recv(8192) # <-- Get the browser data
    except:
        ns.close()
        s.close()
        break

    ## ---------- NOTE ------------ ##
    ## "data" by default contains a bunch of HTTP headers
    ## You need to get rid of those and parse the HTML data,
    ## the best way is to either just "print data" and see
    ## what it contains, or just try to find a HTTP parser lib (server side)    

    data = json.loads(data)
    print data

撰写回答