如何使用Python向POST请求发送响应?

时间:2016-01-03 06:11:45

标签: javascript python html ajax post

我正在尝试实现一个简单的网页,当我按下按钮时,该网页使用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发送响应?

编辑:

我尝试了printprint()sys.stdout.write();没有人做到这一点。

2 个答案:

答案 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

的POST请求
from flask import Flask
app = Flask(__name__)

@app.route('/login', methods=['POST'])
def login():
    return 'Login response!'

if __name__ == '__main__':
    app.run()

在这里,您可以看到完整的Web应用示例。有一个POST路由返回一个简单的字符串作为响应。