1

我可以在不使用的情况下创建 HTTP 服务器吗

python -m http.server [port number]

使用带有插座等的老式风格。

最新的代码和错误...

import socketserver

response = """HTTP/1.0 500 Internal Server Error
Content-type: text/html

Invalid Server Error"""

class MyTCPHandler(socketserver.BaseRequestHandler):
    """
    The RequestHandler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """


    def handle(self):
        # self.request is the TCP socket connected to the client
        self.data = self.request.recv(1024).strip()
        self.request.sendall(response)

if __name__ == "__main__":
    HOST, PORT = "localhost", 8000
    server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
    server.serve_forever()

TypeError: 'str' 不支持缓冲区接口

4

2 回答 2

1

是的,你可以,但这是一个糟糕的想法——事实上,甚至http.server充其量只是一个玩具实现。

你最好将任何你想要的 webapp 编写为标准 WSGI 应用程序(大多数 Python web 框架都这样做——Django、Pyramid、Flask ......),并使用现有的数十个生产级 HTTP 服务器之一为其提供服务对于 Python。

uWSGI(https://uwsgi-docs.readthedocs.org/en/latest/)是我个人的最爱,Gevent 紧随其后。

如果您想了解更多关于它是如何完成的信息,我建议您阅读 CherryPy 服务器 ( http://www.cherrypy.org/ ) 的源代码。虽然不如前面提到的 uWSGI 强大,但它是一个用纯 Python 编写的很好的参考实现,它通过线程池为 WSGI 应用程序提供服务。

于 2014-10-25T20:27:15.230 回答
0

当然可以,像Tornado这样的服务器已经这样做了。对于只能执行 HTTP/1.0 GET 请求并且一次只能处理一个请求的简单测试服务器,一旦您了解了 HTTP 协议的基础知识,它应该不会那么难。但是,如果您稍微关心一下性能,它就会很快变得复杂。

于 2014-10-25T20:39:07.040 回答