我編寫了兩臺服務器,它們本質上用不同的方法做同樣的事情。兩者都是具有圍繞套接字對象的非阻塞 ssl 包裝器的網絡服務器。線程允許同時處理多個請求。一個使用 ThreadingTCPServer,另一個調用 HTTPServer 模塊上的 ThreadingMixIn。我應該使用哪一個,如果其中任何一個比另一個更好,為什么?HTTPServer 上的 ThreadingMixIn:#!/usr/bin/env python3# -*- coding: utf-8 -*-import os, sslfrom socketserver import ThreadingMixInfrom http.server import SimpleHTTPRequestHandler, HTTPServerMYSERV_WORKDIR = "/media/kingdian/server_pub"#MYSERV_CLIENTCRT = "/home/ran/keys/client.pem"MYSERV_FULLCHAIN = "/home/ran/.acme.sh/example.com_ecc/fullchain.cer"MYSERV_PRIVKEY = "/home/ran/.acme.sh/example.com_ecc/example.com.key"global sslcontextsslcontext = ssl.create_default_context(purpose=ssl.Purpose.CLIENT_AUTH)sslcontext.options |= ssl.OP_NO_TLSv1sslcontext.options |= ssl.OP_NO_TLSv1_1#sslcontext.options |= ssl.OP_NO_TLSv1_2#sslcontext.protocol = ssl.PROTOCOL_TLS#sslcontext.verify_mode = ssl.CERT_REQUIREDsslcontext.set_ciphers("ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305")sslcontext.set_ecdh_curve("secp384r1")#sslcontext.load_verify_locations(MYSERV_CLIENTCRT)sslcontext.load_cert_chain(MYSERV_FULLCHAIN, MYSERV_PRIVKEY)class HSTSHandler(SimpleHTTPRequestHandler): def end_headers(self): self.send_header("Strict-Transport-Security", "max-age=63072000; includeSubDomains; preload") self.send_header("Content-Security-Policy", "default-src 'self'") self.send_header("X-Content-Type-Options", "nosniff") self.send_header("X-Frame-Options", "SAMEORIGIN") self.send_header("X-XSS-Protection", "1; mode=block") self.send_header("Referrer-Policy", "no-referrer") SimpleHTTPRequestHandler.end_headers(self)class ThreadedHTTPServer(ThreadingMixIn, HTTPServer): daemon_threads = True
1 回答

慕勒3428872
TA貢獻1848條經驗 獲得超6個贊
這些幾乎是兩種不同的方式來獲得相同的最終結果。如果您查看 的實現ThreadingTCPServer
,那就是:
class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass
在另一個示例中,HTTPServer
它只是一個非常小的包裝器TCPServer
(添加一個覆蓋server_bind
以存儲服務器主機名并自動設置allow_reuse_address
),然后您的代碼直接添加ThreadingMixIn
.
因此,最終,無論哪種方式,您都會經歷相同的基本代碼。隨著時間的推移,python 庫中的類層次結構發生了輕微的變化,因此不同的代碼示例最終以不同的組合來做事。
就個人而言,對于您的示例,我發現使用ThreadingTCPServer
更清潔的版本,只是因為在其他地方處理了一個額外的類,因此代碼略小。OTOH,另一個版本允許更多的靈活性,因為您已經定義了一個可以控制線程混合屬性的點,HTTPServer
如果這對您來說很重要,您還可以獲得額外的包裝位。
添加回答
舉報
0/150
提交
取消