do_POST 发送 200 个响应,而不是 303 个



我是Web服务器的新手,我尝试使用python的http.server模块构建一个简单的服务器。我正在一个显示表单的本地服务器上工作,通过提交此表单,它应该重定向以显示消息,所以我使用了send_response(303),但它没有重定向到主页,而是发送了 200 响应。

from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import parse_qs
memory = []
form = '''<!DOCTYPE html>
<title>Message Board</title>
<form method="POST">
<textarea name="message"></textarea>
<br>
<button type="submit">Post it!</button>
</form>
<pre>
{}
</pre>
'''

class MessageHandler(BaseHTTPRequestHandler):
def do_POST(self):
# How long was the message?
length = int(self.headers.get('Content-length', 0))
# Read the correct amount of data from the request.
data = self.rfile.read(length).decode()
# Extract the "message" field from the request data.
message = parse_qs(data)["message"][0]
# Escape HTML tags in the message so users can't break world+dog.
message = message.replace("<", "&lt;")
# Store it in memory.
memory.append(message)
# 1. Send a 303 redirect back to the root page.
self.send_response(303)
self.send_header('Content-type', 'text/html; charset=utf-8')
self.send_header('Location', '/') #This will navigate to the original page
self.end_headers()
def do_GET(self):
# First, send a 200 OK response.
self.send_response(200)
# Then send headers.
self.send_header('Content-type', 'text/html; charset=utf-8')
self.end_headers()
# 2. Put the response together out of the form and the stored messages.
response = ""
for message in memory:
response += f"{message}n"
# 3. Send the response.
self.wfile.write(form.format(response).encode())
if __name__ == '__main__':
server_address = ('', 8000)
httpd = HTTPServer(server_address, MessageHandler)
httpd.serve_forever()

我认为这正在按您的预期工作。

这是通话记录

127.0.0.1 - - [26/Feb/2020 10:42:23] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [26/Feb/2020 10:42:23] "GET /favicon.ico HTTP/1.1" 200 -
127.0.0.1 - - [26/Feb/2020 10:42:39] "POST / HTTP/1.1" 303 -
127.0.0.1 - - [26/Feb/2020 10:42:39] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [26/Feb/2020 10:42:39] "GET /favicon.ico HTTP/1.1" 200 -

当你做一个POST它返回303时,当浏览器收到它触发另一个GET请求时,服务器以200响应

最新更新