POST 请求不影响 HTML 本地主机服务器中的输出
POST Request Not Affecting HTML Output in localhost server
我有一个简单的 localhost 0.0.0.0:8000/
服务器设置,它接受 GET
和 POST
请求。服务器中的 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)
我有一个简单的 localhost 0.0.0.0:8000/
服务器设置,它接受 GET
和 POST
请求。服务器中的 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)