Flask调试模式关闭应用时触发WinError 10038错误求助
问题解决:Flask调试模式关闭时抛出WinError 10038错误
问题描述
Flask应用与MongoDB运行正常,但开启调试模式(debug=1)后,关闭应用时出现如下错误:
代码示例
import datetime from flask import Flask, render_template, request from pymongo import MongoClient app = Flask(__name__) client = MongoClient(<connectionlink>) app.db = client.blog @app.route("/", methods=["GET", "POST"]) def index(): if request.method == "POST": entry_content = request.form.get("content") formatted_date = datetime.datetime.today().strftime("%d-%m-%Y") app.db.entries.insert_one({"content":entry_content, "date":formatted_date}) entries_with_date = [ ( entry["content"], entry["date"], datetime.datetime.strptime(entry["date"], "%d-%m-%Y").strftime("%b %d") ) for entry in app.db.entries.find({}) ] return render_template("index.html", entries=entries_with_date)
错误信息
Exception in thread Thread-1 (serve_forever): Traceback (most recent call last): File "C:\Users\user\.pyenv\pyenv-win\versions\3.11.1\Lib\threading.py", line 1038, in _bootstrap_inner self.run() File "C:\Users\user\.pyenv\pyenv-win\versions\3.11.1\Lib\threading.py", line 975, in run self._target(*self._args, **self._kwargs) File "C:\Users\user\Desktop\flask\.venv\Lib\site-packages\werkzeug\serving.py", line 766, in serve_forever super().serve_forever(poll_interval=poll_interval) File "C:\Users\user\.pyenv\pyenv-win\versions\3.11.1\Lib\socketserver.py", line 233, in serve_forever ready = selector.select(poll_interval) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\.pyenv\pyenv-win\versions\3.11.1\Lib\selectors.py", line 323, in select r, w, _ = self._select(self._readers, self._writers, [], timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\.pyenv\pyenv-win\versions\3.11.1\Lib\selectors.py", line 314, in _select r, w, x = select.select(r, w, w, timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ OSError: [WinError 10038] an operation was attempted on something that is not a socket.
解决方法
1. 关闭调试模式的重载器
调试模式默认启动代码重载器(多线程),这是Windows下socket清理异常的核心原因,可通过两种方式禁用:
- 命令行启动:
flask run --debug --no-reload - 代码中设置:
添加启动逻辑并关闭重载器:if __name__ == "__main__": app.run(debug=True, use_reloader=False)
2. 优雅关闭MongoDB连接
添加应用退出时的清理逻辑,确保MongoClient连接被正确释放:
import atexit from flask import Flask, render_template, request from pymongo import MongoClient import datetime app = Flask(__name__) client = MongoClient(<connectionlink>) app.db = client.blog # 注册退出信号,关闭Mongo连接 atexit.register(client.close) @app.route("/", methods=["GET", "POST"]) def index(): # 原函数逻辑不变 if request.method == "POST": entry_content = request.form.get("content") formatted_date = datetime.datetime.today().strftime("%d-%m-%Y") app.db.entries.insert_one({"content":entry_content, "date":formatted_date}) entries_with_date = [ ( entry["content"], entry["date"], datetime.datetime.strptime(entry["date"], "%d-%m-%Y").strftime("%b %d") ) for entry in app.db.entries.find({}) ] return render_template("index.html", entries=entries_with_date) if __name__ == "__main__": app.run(debug=True)
3. 更新依赖包
Windows下的socket处理bug可能已在新版本中修复,执行以下命令更新相关依赖:
pip install --upgrade werkzeug pymongo
内容的提问来源于stack exchange,提问作者Bora Bircan
相关产品推荐
相关产品推荐

