web-dev-qa-db-ja.com

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

質問:Python3.xですぐに動作するバージョンのBaseHTTPServerまたはhttp.serverがありますか、それとも何か間違っていますか?

これは、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
47
Learner

python 3.xxのプログラムは、箱から出してすぐに動作します-1つの小さな問題を除いて。問題はあなたのコードではなく、これらの行を書いている場所です:

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」エンコーディングを使用して文字列からバイトに変換する方法に注意してください。プログラムでこの変更を行うと、プログラムは正常に動作するはずです。

58
Rash

あなたはそのようにすることができます:

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

Http.serverのpython 3ドキュメントを作成した人は誰でも、変更に気づきませんでした。 2.7ドキュメントの一番上には、「注:BaseHTTPServerモジュールがPython 3でhttp.serverにマージされました。2to3ツールは、ソースをPython 3に変換するときにインポートを自動的に適合させます。 」

3
rdm

Wfile引数を変更する必要があります。Python 3ではオブジェクトのようなバイトを受け入れるため、次の方法で文字列をバイトに変換します。

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

または

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

1
salafi