我正在尝试实现一个简单的网页,当我按下按钮时,该网页使用AJAX更新一些文本。我正在使用HTML作为页面,Javascript用于客户端,Python用于服务器端。我使用纯CGI进行教育。
我能够正确地通过我的Python脚本获取POST请求,但是为了将值返回到ResponseText字段,我无法找到我应该做的事情。
守则
的index.html:
<html>
<head>
<title>
test
</title>
</head>
<body>
<button onclick="buttonClicked()">
click me
</button>
<script>
function buttonClicked() {
document.getElementById("modify").innerHTML = post('clicked=true', 'input.py')
}
function post(data, dest) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
return xmlhttp.responseText;
}
}
xmlhttp.open("POST", dest, true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
xmlhttp.send(data);
}
</script>
<p id="modify">
this is the text to be modified by the button
</p>
</body>
</html>
input.py:
#!/usr/bin/python
import cgi
input = cgi.FieldStorage()
with open('/var/www/test/output.txt', 'w') as f:
f.write(input.getvalue("clicked") + "\n")
clicked = input.getvalue("clicked") == "true"
with open('/var/www/test/output.txt', 'a') as f:
f.write("clicked: " + str(clicked))
output.txt的:
true
clicked: True
初始网页看起来像预期的那样。单击按钮后,文本会被修改为undefined
,这是有道理的,因为我还没有发回任何内容。
如何使用Python向POST发送响应?
编辑:
我尝试了print
,print()
和sys.stdout.write()
;没有人做到这一点。
答案 0 :(得分:1)
XMLHttpRequest
对象将返回到您的回调函数,其中包含input.py
标准输出的数据。您尝试写入stdout似乎不起作用的原因是因为您的http标头没有正确的语法。 XMLHttpRequest.responseText
是标题后面的文字。
标题应如下所示:
import sys
sys.stdout.write("Status: 200 OK\n")
sys.stdout.write("Content-Type: text/plain\n")
sys.stdout.write("\n")
sys.stdout.write("This is the text that will be in responseText")
值得注意的是,对于input.py的http请求是(我相信)标准输入。 FieldStorage只是解析它的好方法(https://github.com/python/cpython/blob/1fe0fd9feb6a4472a9a1b186502eb9c0b2366326/Lib/cgi.py)
答案 1 :(得分:0)
请不要使用CGI。这是一种令人难以置信的与浏览器通信的过时方式(至少15年)。
如果有的话尝试using Flask。这是一个非常简单的示例,可帮助您开始处理如何处理/login
from flask import Flask
app = Flask(__name__)
@app.route('/login', methods=['POST'])
def login():
return 'Login response!'
if __name__ == '__main__':
app.run()
在这里,您可以看到完整的Web应用示例。有一个POST路由返回一个简单的字符串作为响应。