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

使用Werkzeug的handle_request方法时SSL功能异常求助

问题描述

尝试使用Werkzeug模块中BaseWSGIServer的handle_request方法处理单个请求后关闭服务器,但功能无法正常工作。程序启动和结束时终端无报错,但浏览器提示无法连接服务器,因响应超时。

问题代码如下:

from threading import Thread
from werkzeug.serving import make_server
from werkzeug import Request, Response

def create_server():
    @Request.application
    def callback(request):
        print("callback called")
        return Response("Successfull", 200)

    return make_server("localhost", 4000, callback, ssl_context="adhoc")

server = create_server()
Thread(target=server.handle_request).start()

使用serve_forever方法时功能正常,不清楚为何handle_request方法不行,请问是否遗漏了什么?

问题原因与解决方法

核心问题

handle_request的执行逻辑是阻塞等待请求,处理完单个请求后立刻返回,但你用Thread启动它后,主线程会直接退出,导致整个进程终止——服务器还没来得及完成响应就被干掉了,浏览器自然拿不到响应,超时报错。

而serve_forever会持续阻塞主线程,所以服务器能正常运行处理请求。

解决办法

有两种简单方式可以修复:

  1. 让主线程等待子线程完成
    修改最后几行代码,让主线程等待子线程处理完请求再退出:
server = create_server()
server_thread = Thread(target=server.handle_request)
server_thread.start()
server_thread.join()  # 主线程阻塞,直到子线程处理完请求
  1. 直接在主线程调用handle_request
    如果不需要多线程,直接在主线程执行方法,主线程会自动阻塞到请求处理完成:
server = create_server()
server.handle_request()

补充说明

  • handle_request内部会先尝试非阻塞处理请求,若无请求则阻塞等待,处理完一个请求后立即返回。
  • 你原代码中主线程无任何阻塞逻辑,启动子线程后直接结束进程,子线程里的服务器还没走完响应流程就被强制终止,这是浏览器超时的根本原因。

内容的提问来源于stack exchange,提问作者Richmond Tweneboanah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:12:25