随着标准
cgi
库的弃用,取而代之的是 WSGI 从 Python 3.11 开始,文档 alleges:
类通常可以替换为……FieldStorage
模块或 [3rd-party] multipart foremail.message
andPOST
.PUT
然而,第一个(使用标准库解析 HTTP POST 请求)实际上是如何完成的并不明显。
例如以下代码挂在
EmailBytesParser.parse()
:
import wsgiref.simple_server
import email.parser
import logging
_EmailBytesParser = email.parser.BytesParser()
def main_wsgi(environ, start_response):
if environ['REQUEST_METHOD'] == 'GET':
start_response('200 OK', [('Content-Type', 'text/html')])
yield '<form method="POST" enctype="multipart/form-data"><label for="username">username:</label><input name="username" value="user123" /><br /><label for="avatar">avatar: </label><input name="avatar" type="file"><br /><input type="submit" value="register" />'.encode()
else:
assert environ['REQUEST_METHOD'] == 'POST'
assert environ['CONTENT_TYPE'].startswith('multipart/form-data')
start_response('200 OK', [('Content-Type', 'text/plain')])
logging.debug("About to start parsing form data...")
# body = environ['wsgi.input'].read(int(environ['CONTENT_LENGTH']))
body = _EmailBytesParser.parse(environ['wsgi.input'], headersonly=True)
logging.debug("Form data parsed!")
yield repr(body).encode()
if __name__ == '__main__':
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
wsgiref.simple_server.make_server('', 8000, main_wsgi).serve_forever()
我无法在网上找到任何实际证明
email
模块对此适用性的代码示例。我做错了什么?