web-dev-qa-db-fra.com

Python 3.x BaseHTTPServer ou http.server

J'essaie de faire un programme BaseHTTPServer. Je préfère utiliser Python 3.3 ou 3.2 pour cela. Je trouve que le document est difficile à comprendre en ce qui concerne l'importation, mais j'ai essayé de modifier l'importation à partir de:

from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer

à:

from http.server import BaseHTTPRequestHandler,HTTPServer

puis l'importation fonctionne et le programme démarre et attend une demande GET. MAIS quand la demande arrive une exception est levée:

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

Question: Existe-t-il une version de BaseHTTPServer ou http.server qui fonctionne avec Python3.x ou est-ce que je fais quelque chose de mal?

C’est "mon" programme que j’essaie de lancer Python 3.3 et 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()

Le programme fonctionne partiellement avec Python2.7 mais donne cette exception après 2 à 8 requêtes:

error: [Errno 10054] An existing connection was forcibly closed by the remote Host
47
Learner

Votre programme dans python 3.xx fonctionne immédiatement, à l'exception d'un problème mineur. Le problème ne se trouve pas dans votre code, mais à l'endroit où vous écrivez ces lignes:

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

Vous essayez d'écrire "chaîne" ici, mais les octets devraient y aller. Vous devez donc convertir votre chaîne en octets.

Ici, voir mon code, qui est presque identique à vous et fonctionne parfaitement. Son écrit en 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))

Veuillez noter la façon dont je les convertis d'octets en chaîne en utilisant l'encodage "UTF-8". Une fois que vous apportez ce changement dans votre programme, votre programme devrait fonctionner correctement.

58
Rash

Vous pouvez juste faire comme ça:

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

Celui qui a utilisé la documentation python 3 pour http.server) n'a pas noté la modification. La documentation 2.7 se situe tout en haut "Remarque Le module BaseHTTPServer a été fusionné dans http.server dans Python 3. L’outil 2to3 adaptera automatiquement les importations lors de la conversion de vos sources en Python 3. "

3
rdm

Vous devriez changer l'argument wfile, car dans Python 3, il accepte les octets comme des objets, donc convertissez votre chaîne en octets par:

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

Ou

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

1
salafi