Python 3.x BaseHTTPServer или http.server

Опитвам се да направя програма BaseHTTPServer. Предпочитам да използвам Python 3.3 или 3.2 за него. Трудно ми е да разбера документа относно това какво да импортирам, но се опитах да променя импортирането от:

from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer

to:

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

person Learner    schedule 24.04.2014    source източник


Отговори (4)


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

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

Опитвате се да напишете "низ" там, но байтовете трябва да отидат там. Така че трябва да конвертирате своя низ в байтове.

Ето вижте моя код, който е почти същият като вашия и работи перфектно. Написано е на 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". След като направите тази промяна във вашата програма, вашата програма трябва да работи добре.

person Rash    schedule 30.10.2014

Можете просто да направите така:

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

Който и да е направил документацията на python 3 за http.server, не успя да забележи промяната. В документацията 2.7 се казва точно в горната част „Забележка Модулът BaseHTTPServer е обединен в http.server в Python 3. Инструментът 2to3 автоматично ще адаптира импортирания, когато преобразува вашите източници в Python 3.“

person rdm    schedule 27.07.2014
comment
За съжаление, нормата в документите на Python 3 е да не се отбелязват промени от Python 2. Мисля, че това беше голяма грешка. - person Michael Scott Cuthbert; 11.03.2016

Трябва да промените аргумента wfile, защото в Python 3 той приема байтове като обекти, следователно преобразувайте вашия низ в байтове чрез:

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

Or

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

person salafi    schedule 23.06.2019
comment
Здравей Салафи, твоят отговор прави същото като приетия отговор. Моля, разгледайте другите отговори, преди да публикувате - person Ruben Helsloot; 23.06.2019