使用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会持续阻塞主线程,所以服务器能正常运行处理请求。
解决办法
有两种简单方式可以修复:
- 让主线程等待子线程完成
修改最后几行代码,让主线程等待子线程处理完请求再退出:
server = create_server() server_thread = Thread(target=server.handle_request) server_thread.start() server_thread.join() # 主线程阻塞,直到子线程处理完请求
- 直接在主线程调用
handle_request
如果不需要多线程,直接在主线程执行方法,主线程会自动阻塞到请求处理完成:
server = create_server() server.handle_request()
补充说明
handle_request内部会先尝试非阻塞处理请求,若无请求则阻塞等待,处理完一个请求后立即返回。- 你原代码中主线程无任何阻塞逻辑,启动子线程后直接结束进程,子线程里的服务器还没走完响应流程就被强制终止,这是浏览器超时的根本原因。
内容的提问来源于stack exchange,提问作者Richmond Tweneboanah
相关产品推荐
相关产品推荐

