do\u POST过程中的键错误,但存在键

2024-04-26 04:22:03 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是我的web服务器在GET请求时提供的表单(加上内存列表的内容)。我试图使它,以便当消息提交时,它是附加到内存中。形式如下:

form = ''' <!DOCTYPE html><html><head><title>Server</title></head><body>
           <form action="/basic-server.py" method="post">
           <label>Message <input name="message" type="text" /></label>
           </form>
           </body></html> '''

memory = []

下面是我使用BasicHTTPRequestHandler的POST方法的内容:

def do_POST(self):

    length = int(self.headers.get('Content-Length'))
    postvars = parse.parse_qs(self.rfile.read(length))
    memory.append(postvars["message"])

    self.send_response(303)
    self.send_header('Location', '/')
    self.end_headers()

它为“message”抛出一个KeyError。让我困惑的是,如果我去掉那一行并打印出postvars,它看起来就像一个字典,带有一个“message”键,其中包含我在表单上键入的消息。你知道吗

如果我使用memory.append(postvars)并输入'test',应用程序将工作并附加以下字典:{b'message': [b'test']}。“b”字是怎么回事?如果我使用[b'message']作为键,它可以工作,但会将[b'test']返回内存,而不是简单地进行测试。你知道吗


Tags: 内存testselfform消息表单内容message
1条回答
网友
1楼 · 发布于 2024-04-26 04:22:03

修复

您需要解码通过post请求推送的信息。你知道吗

postvars = parse.parse_qs(self.rfile.read(length))

应该变成。。。你知道吗

之后

postvars = parse.parse_qs(self.rfile.read(length).decode())

解释

在原始代码中,postvars是字节文字而不是字符串文字的字典。Here is a good explanation of this.

所以在之前,postvars==[{b'message': [b'Post Message']}],意味着键和值都是字节文字。不能将字符串['message']用作键,因为该键是字节实例,而不是字符串实例。这里的关键是[b'message']。你知道吗

之后的中,postvars变为[{'message': ['Test']}]键和值现在按预期解码为字符串实例。你知道吗

相关问题 更多 >