Python http.server本地服务如何仅向指定客户端端口返回响应
实现方案
核心思路是通过http.server内置的client_address属性获取客户端端口,校验通过后再处理请求,具体实现如下:
前置说明
- 你需要提前确认可信任客户端的发起端口,确保客户端发起请求时绑定固定端口,而不是使用系统随机分配的临时端口
- 如果你的客户端无法绑定固定端口,该校验方式不适用,建议换用请求头、Cookie等其他校验方式
- 校验逻辑可根据需求调整为单端口白名单、多端口白名单或者端口段校验
完整实现代码
from http.server import HTTPServer, SimpleHTTPRequestHandler # 定义允许访问的客户端端口白名单,替换为你实际允许的端口 ALLOWED_CLIENT_PORTS = [12345, 54321] class AuthHTTPRequestHandler(SimpleHTTPRequestHandler): # 重写handle方法统一拦截所有请求,无需单独为每个请求方法写校验逻辑 def handle(self): # client_address格式为(客户端IP, 客户端端口) client_port = self.client_address[1] if client_port not in ALLOWED_CLIENT_PORTS: # 非允许端口直接返回403 self.send_error(403, "Forbidden: Your client port is not allowed") return # 校验通过走正常的请求处理逻辑 super().handle() # 可按需自定义其他请求方法的处理逻辑,比如POST def do_POST(self): self.send_response(200) self.end_headers() self.wfile.write(b"POST request handled successfully") if __name__ == "__main__": # 服务端监听端口设为8000,可自行修改 server = HTTPServer(("127.0.0.1", 8000), AuthHTTPRequestHandler) print("Server running on http://127.0.0.1:8000") server.serve_forever()
客户端固定端口发起请求示例
以Python requests库为例,发起请求时指定绑定的本地端口:
import requests from requests.adapters import HTTPAdapter # 自定义适配器,指定本地发起端口 class SourcePortAdapter(HTTPAdapter): def __init__(self, source_port, *args, **kwargs): self.source_port = source_port super().__init__(*args, **kwargs) def init_poolmanager(self, *args, **kwargs): kwargs["source_address"] = ("127.0.0.1", self.source_port) super().init_poolmanager(*args, **kwargs) s = requests.Session() # 绑定本地端口12345发起请求 s.mount("http://", SourcePortAdapter(12345)) resp = s.get("http://127.0.0.1:8000") print(resp.status_code)
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

