Подтвердить что ты не робот

Python 3.x BaseHTTPServer или http.server

Я пытаюсь создать программу BaseHTTPServer. Я предпочитаю использовать Python 3.3 или 3.2 для него. Я считаю, что документ трудно понять относительно импорта, но попытался изменить импорт:

from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer

в

from http.server import BaseHTTPRequestHandler,HTTPServer

а затем импорт работает и запускается программа и ожидает запроса GET. НО, когда запрос приходит, возникает исключение:

File "C:\Python33\lib\socket.py", line 317, in write return self._sock.send(b)
TypeError: 'str' does not support the buffer interface

Вопрос: Есть ли версия BaseHTTPServer или http.server, которая работает из коробки с Python3.x или я что-то не так?

Это "моя" программа, которую я пытаюсь запустить в Python 3.3 и 3.2:

#!/usr/bin/python
# from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
from http.server import BaseHTTPRequestHandler,HTTPServer

PORT_NUMBER = 8080

# This class will handle any incoming request from
# a browser 
class myHandler(BaseHTTPRequestHandler):

    # Handler for the GET requests
    def do_GET(self):
        print   ('Get request received')
        self.send_response(200)
        self.send_header('Content-type','text/html')
        self.end_headers()
        # Send the html message
        self.wfile.write("Hello World !")
        return

try:
    # Create a web server and define the handler to manage the
    # incoming request
    server = HTTPServer(('', PORT_NUMBER), myHandler)
    print ('Started httpserver on port ' , PORT_NUMBER)

    # Wait forever for incoming http requests
    server.serve_forever()

except KeyboardInterrupt:
    print ('^C received, shutting down the web server')
    server.socket.close()

Программа работает частично в Python2.7, но дает это исключение после 2-8 запросов:

error: [Errno 10054] An existing connection was forcibly closed by the remote host
4b9b3361

Ответ 1

Ваша программа в python 3.xx работает прямо из коробки - за исключением одной незначительной проблемы. Проблема не в вашем коде, а в том месте, где вы пишете эти строки:

self.wfile.write("Hello World !")

Вы пытаетесь написать там "string", но там должны идти байты. Поэтому вам нужно преобразовать строку в байты.

Здесь вы можете увидеть мой код, который почти такой же, как вы, и работает отлично. Его написано на python 3.4

from http.server import BaseHTTPRequestHandler, HTTPServer
import time

hostName = "localhost"
hostPort = 9000

class MyServer(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write(bytes("<html><head><title>Title goes here.</title></head>", "utf-8"))
        self.wfile.write(bytes("<body><p>This is a test.</p>", "utf-8"))
        self.wfile.write(bytes("<p>You accessed path: %s</p>" % self.path, "utf-8"))
        self.wfile.write(bytes("</body></html>", "utf-8"))

myServer = HTTPServer((hostName, hostPort), MyServer)
print(time.asctime(), "Server Starts - %s:%s" % (hostName, hostPort))

try:
    myServer.serve_forever()
except KeyboardInterrupt:
    pass

myServer.server_close()
print(time.asctime(), "Server Stops - %s:%s" % (hostName, hostPort))

Обратите внимание, как я конвертирую их из строки в байты, используя кодировку "UTF-8". После того, как вы сделаете это изменение в своей программе, ваша программа должна работать нормально.

Ответ 2

Вы можете просто так:

self.send_header('Content-type','text/html'.encode())
self.end_headers()
# Send the html message
self.wfile.write("Hello World !".encode())

Ответ 3

Тот, кто сделал документацию python 3 для http.server, не смог заметить изменение. В документации 2.7 указано "наверху". Примечание. Модуль BaseHTTPServer был объединен с http.server в Python 3. Инструмент 2to3 автоматически адаптирует импорт при преобразовании ваших источников в Python 3. "

Ответ 4

Вы должны изменить аргумент wfile, потому что в Python 3 он принимает байты как объекты, поэтому преобразуйте вашу строку в байты следующим образом:

self.wfile.write(b"<h1> Hello </h1>)

Или же

self.wfile.write( bytes("<h1> Hello </h1>) )