在Python3.7中实现的多线程https服务器。
from http.server import BaseHTTPRequestHandler, HTTPServer
from socketserver import ThreadingMixIn
import threading
import ssl
hostName = "localhost"
serverPort = 8080
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>https://pythonbasics.org</title></head>", "utf-8"))
self.wfile.write(bytes("<p>Request: %s</p>" % self.path, "utf-8"))
self.wfile.write(bytes("<p>Thread: %s</p>" % threading.currentThread().getName(), "utf-8"))
self.wfile.write(bytes("<p>Thread Count: %s</p>" % threading.active_count(), "utf-8"))
self.wfile.write(bytes("<body>", "utf-8"))
self.wfile.write(bytes("<p>This is an example web server.</p>", "utf-8"))
self.wfile.write(bytes("</body></html>", "utf-8"))
class ThreadingSimpleServer(ThreadingMixIn,HTTPServer):
pass
if __name__ == "__main__":
webServer = ThreadingSimpleServer((hostName, serverPort), MyServer)
webServer.socket = ssl.wrap_socket(webServer.socket, keyfile='./privkey.pem',certfile='./certificate.pem', server_side=True)
print("Server started http://%s:%s" % (hostName, serverPort))
try:
webServer.serve_forever()
except KeyboardInterrupt:
pass
webServer.server_close()
print("Server stopped.")
你可以在浏览器中测试它:https://localhost:8080
运行结果如下:
输入图像描述
输入图像描述
请注意,你可以使用以下命令生成自己的密钥文件和证书:
$openssl req -newkey rsa:2048 -keyout privkey.pem -x509 -days 36500 -out certificate.pem
学习使用openssl创建自签名证书的详细信息:https://www.devdungeon.com/content/creating-self-signed-ssl-certificates-openssl
select()
和非阻塞式。Python 有一个socket 库。IBM 有一些关于使用 select() 进行 socket 编程的好文章。 - Shiplu MokaddimBaseHTTPServer
一次只能处理一个连接。ThreadingMixIn
和gunicorn
(即使是gevent
版本,也很遗憾)只是收集线程的结果,并将它们返回到一次连接中,这完全破坏了流式传输。幸运的是,您可以在BaseHTTPServer
中更改一个简单的设置来解决此问题。请参见下面的答案。 - personal_cloud