Python требуется байтовоподобный объект, а не 'str' - PullRequest
0 голосов
/ 04 марта 2019

Я новичок в 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'....

Пожалуйста, подскажите, что я делаю неправильно.спасибо.

1 Ответ

0 голосов
/ 04 марта 2019

Вы не можете использовать print() для записи в двоичные файлы.print() преобразует аргументы в str() перед записью в объект текстового файла.

Из документации по print() :

Печатать объекты в текстовый поток файл , разделенный sep , за которым следует end .[...]

Все аргументы, не являющиеся ключевыми словами, преобразуются в строки, такие как str() делает и записываются в поток, разделяются sep и сопровождаются конец .

жирный акцент мины .Обратите внимание, что файловый объект должен быть текстовым потоком, а не двоичным потоком.

Либо записать в TextIOWrapper() объект , обертывающий ваш BytesIO() объект, вызвать.write() на объекте BytesIO() для прямой записи bytes объектов или записи в StringIO() объект и кодирования результирующего строкового значения в конце.

...