【问题标题】:Python 3.x BaseHTTPServer or http.serverPython 3.x BaseHTTPServer 或 http.server
【发布时间】:2014-04-24 09:10:52
【问题描述】:

我正在尝试制作一个 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

【问题讨论】:

    标签: python basehttpserver


    【解决方案1】:

    您在 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”编码将它们从字符串转换为字节的方式。一旦您在程序中进行此更改,您的程序应该可以正常工作。

    【讨论】:

      【解决方案2】:

      你可以这样做:

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

      【讨论】:

        【解决方案3】:

        您应该更改 wfile 参数,因为在 Python 3 中它接受对象之类的字节,因此通过以下方式将您的字符串转换为字节:

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

        或者

        self.wfile.write( bytes("&lt;h1&gt; Hello &lt;/h1&gt;") )

        【讨论】:

        • 嗨 Salafi,您的答案与接受的答案相同。发帖前请看其他答案
        【解决方案4】:

        为 http.server 编写 python 3 文档的人没有注意到更改。 2.7 文档在顶部声明“注意 BaseHTTPServer 模块已合并到 Python 3 中的 http.server。当您将源代码转换为 Python 3 时,2to3 工具将自动调整导入。”

        【讨论】:

        • 遗憾的是,Python 3 文档的规范是不记录 Python 2 的变化。我认为这是一个重大错误。
        猜你喜欢
        • 2016-07-13
        • 1970-01-01
        • 2014-11-07
        • 2012-02-06
        • 1970-01-01
        • 2010-10-27
        • 1970-01-01
        • 2013-04-07
        • 1970-01-01
        相关资源
        最近更新 更多