You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 18:57:00