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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:14:57