Python 需要类似字节的对象,而不是 'str'

Python a bytes-like object is required, not 'str'

我是 Python 的新手。我 运行 正在使用简单的网络服务器:

from wsgiref.simple_server import make_server
from io import BytesIO

def message_wall_app(environ, start_response):
    output = BytesIO()
    status = '200 OK' # HTTP Status
    headers = [('Content-type', 'text/html; charset=utf-8')]
    start_response(status, headers)
    print(b"<h1>Message Wall</h1>",file=output)
##    if environ['REQUEST_METHOD'] == 'POST': 
##        size = int(environ['CONTENT_LENGTH'])
##        post_str = environ['wsgi.input'].read(size)
##        print(post_str,"<p>", file=output)
##    print('<form method="POST">User: <input type="text" '
##          'name="user">Message: <input type="text" '
##          'name="message"><input type="submit" value="Send"></form>', 
##           file=output)         
    # The returned object is going to be printed
    return [output.getvalue()]     

httpd = make_server('', 8000, message_wall_app)
print("Serving on port 8000...")

# Serve until process is killed
httpd.serve_forever()

不幸的是,我收到以下错误:

Traceback (most recent call last):
  File "C:\Users\xxx\Python36\lib\wsgiref\handlers.py", line 137, in run
    self.result = application(self.environ, self.start_response)
  File "C:/xxx/Python/message_wall02.py", line 9, in message_wall_app
    print("<h1>Message Wall</h1>".encode('ascii'),file=output)
TypeError: a bytes-like object is required, not 'str'....

请指出我做错了什么。谢谢。

您不能使用 print() 写入二进制文件。 print() 在写入文本文件对象之前将参数转换为 str()

来自print() function documentation:

Print objects to the text stream file, separated by sep and followed by end. [...]

All non-keyword arguments are converted to strings like str() does and written to the stream, separated by sep and followed by end.

大胆强调我的。请注意,文件对象必须是文本流,而不是二进制流。

写入 TextIOWrapper() object wrapping your BytesIO() object, call .write() on the BytesIO() object to write bytes objects directly, or write to a StringIO() object 并在末尾对结果字符串值进行编码。