下面是我的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']
返回内存,而不是简单地进行测试。你知道吗
修复
您需要解码通过post请求推送的信息。你知道吗
在
应该变成。。。你知道吗
之后
解释
在原始代码中,postvars是字节文字而不是字符串文字的字典。Here is a good explanation of this.
所以在之前,
postvars
==[{b'message': [b'Post Message']}]
,意味着键和值都是字节文字。不能将字符串['message']
用作键,因为该键是字节实例,而不是字符串实例。这里的关键是[b'message']
。你知道吗在之后的中,
postvars
变为[{'message': ['Test']}]
键和值现在按预期解码为字符串实例。你知道吗相关问题 更多 >
编程相关推荐