POST 请求不影响 HTML 本地主机服务器中的输出

POST Request Not Affecting HTML Output in localhost server

我有一个简单的 localhost 0.0.0.0:8000/ 服务器设置,它接受 GETPOST 请求。服务器中的 html 应该在发送 get 请求时输出 GET! 并且在发送 post 请求时应该输出 POST! 。当发送 get 请求时,GET! 被输出到 html,但即使我刷新页面,它也不会与 POST 请求一起输出。

我在 Chrome(问题所在)中 运行 附上了输出的图像:

该网页仅打印 "GET!",即使有 POST 个请求。

当我在 Postman 中 运行 并且 html Postman return 确实包含 "POST!" 时,它工作得很好而不是 "GET!"Postman 中,这是我在执行 post 请求时得到的 return:

我觉得它很简单,但我不知道哪里出了问题,也不知道为什么 POST! 不会输出到本地服务器。

这是我发送的请求:

import requests

requests.post('http://0.0.0.0:8000/', data={'value':True})

这是我用于 运行 服务器的代码:

import argparse
from http.server import HTTPServer, BaseHTTPRequestHandler

class S(BaseHTTPRequestHandler):
    def _set_headers(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
def _html(self, message):
    """This just generates an HTML document that includes `message`
    in the body. Override, or re-write this do do more interesting stuff.
    """
    content = f"<html><body><h1>{message}</h1></body></html>"
    return content.encode("utf8")  # NOTE: must return a bytes object!

def do_GET(self):
    self._set_headers()
    self.wfile.write(self._html("GET!"))

def do_HEAD(self):
    self._set_headers()

def do_POST(self):
    # Doesn't do anything with posted data
    self._set_headers()
    self.wfile.write(self._html("POST!"))



def run(server_class=HTTPServer, handler_class=S, addr="localhost", port=8000):
    server_address = (addr, port)
    httpd = server_class(server_address, handler_class)

    print(f"Starting httpd server on {addr}:{port}")
    httpd.serve_forever()

if __name__ == "__main__":

    parser = argparse.ArgumentParser(description="Run a simple HTTP server")
    parser.add_argument(
        "-l",
        "--listen",
        default="localhost",
        help="Specify the IP address on which the server listens",
    )
    parser.add_argument(
        "-p",
        "--port",
        type=int,
        default=8000,
        help="Specify the port on which the server listens",
    )
    args = parser.parse_args()
    run(addr=args.listen, port=args.port)

我不知道你是如何测试来自浏览器的 POST 请求的,但你需要带有 <form method="POST"> 的页面才能发送 POST 请求。

如果我将 <form> 添加到 HTML,那么我可以单击发送 POST 请求的按钮,然后我在浏览器中得到 POST!

    def _html(self, message):
        """This just generates an HTML document that includes `message`
        in the body. Override, or re-write this do do more interesting stuff.
        """
        content = f"""<html>
<body>
<h1>{message}</h1>
<form method='POST'>
<button type='submit'>POST</button>
</form>
</body>
</html>"""
        return content.encode("utf8")

顺便说一句:如果你用 python 代码发送 POST 那么你也会得到 POST! - 使用 print()

import requests

r = requests.post('http://0.0.0.0:8000/', data={'value':True})
print(r.content)

但它无法在浏览器中更改页面。浏览器和 requests 是两个独立的程序(比如你电脑上的浏览器和我电脑上的浏览器),一个不能改变另一个的页面(你的浏览器不能改变我在浏览器中看到的内容)


编辑: 我使用的完整代码。我只添加了 <form> 的内容。

import argparse
from http.server import HTTPServer, BaseHTTPRequestHandler

class S(BaseHTTPRequestHandler):

    def _set_headers(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()

    def _html(self, message):
        """This just generates an HTML document that includes `message`
        in the body. Override, or re-write this do do more interesting stuff.
        """
        content = f"""<html>
<body>
<h1>{message}</h1>
<form method='POST'>
<button type='submit'>POST</button>
</form>
</body>
</html>"""
        return content.encode("utf8")  # NOTE: must return a bytes object!

    def do_GET(self):
        self._set_headers()
        self.wfile.write(self._html("GET!"))

    def do_HEAD(self):
        self._set_headers()

    def do_POST(self):
        # Doesn't do anything with posted data
        self._set_headers()
        self.wfile.write(self._html("POST!"))



def run(server_class=HTTPServer, handler_class=S, addr="localhost", port=8000):
    server_address = (addr, port)
    httpd = server_class(server_address, handler_class)

    print(f"Starting httpd server on {addr}:{port}")
    httpd.serve_forever()

if __name__ == "__main__":

    parser = argparse.ArgumentParser(description="Run a simple HTTP server")
    parser.add_argument(
        "-l",
        "--listen",
        default="localhost",
        help="Specify the IP address on which the server listens",
    )
    parser.add_argument(
        "-p",
        "--port",
        type=int,
        default=8000,
        help="Specify the port on which the server listens",
    )
    args = parser.parse_args()
    run(addr=args.listen, port=args.port)