在macOS系统中开发Flask应用时,不少开发者会遇到一个奇怪的问题:已经按照官方文档正确配置了Flask-CORS,前端发起跨域请求时依然被拦截,返回跨域错误。这种情况很多时候不是Flask-CORS配置本身有问题,而是macOS系统默认占用了5000端口导致的。

macOS为何会占用5000端口
macOS系统内置了AirPlay接收器功能,该功能默认会监听5000端口用于接收投屏相关的请求。如果你的Flask应用恰好也使用5000端口启动,就会出现端口冲突,此时Flask应用虽然能启动,但实际请求可能被系统的AirPlay服务拦截,导致你配置的Flask-CORS规则无法生效,前端自然就会收到跨域错误提示。
如何确认5000端口被占用
我们可以通过终端命令查看5000端口的占用情况,执行以下命令:
# 查看5000端口的占用进程 lsof -i :5000
如果输出结果中出现ControlCenter相关的进程,就说明5000端口被系统的AirPlay服务占用了。
正确的Flask-CORS配置示例
首先我们先给出标准的Flask-CORS配置代码,排除配置本身的问题:
from flask import Flask
from flask_cors import CORS
# 初始化Flask应用
app = Flask(__name__)
# 全局开启跨域,允许所有来源访问
CORS(app)
@app.route('/api/test')
def test_api():
return {"msg": "跨域请求成功"}
if __name__ == '__main__':
# 默认使用5000端口,这里先保留原配置用于对比
app.run(debug=True)
解决端口占用导致CORS无效的方法
方法一:更换Flask应用启动端口
最简单的方式是修改Flask应用的启动端口,避开5000端口即可,比如换成5001端口:
from flask import Flask
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
@app.route('/api/test')
def test_api():
return {"msg": "跨域请求成功"}
if __name__ == '__main__':
# 更换为5001端口,避免和macOS系统服务冲突
app.run(debug=True, port=5001)
修改后重启应用,前端请求http://127.0.0.1:5001/api/test,跨域配置就会正常生效。
方法二:关闭系统的AirPlay接收器服务
如果你确实需要使用5000端口,可以关闭macOS的AirPlay接收器功能:打开系统偏好设置,找到共享选项,取消勾选AirPlay接收器即可。关闭后再次执行lsof -i :5000命令,确认5000端口没有被占用,再启动Flask应用即可正常使用5000端口。
注意事项
- 修改端口后,前端请求的地址也要同步更新,否则会出现请求不到服务的问题
- 关闭AirPlay接收器后,你将无法使用Mac作为AirPlay投屏的接收端
- 如果更换端口后还是出现跨域问题,再排查Flask-CORS的配置细节,比如是否限制了特定的请求方法、请求头
提示:除了5000端口,macOS还可能会占用7000、8000等端口,遇到类似CORS配置无效的问题时,优先检查端口占用情况可以少走很多弯路。
Flask_CORSmacOS端口占用Flask跨域配置修改时间:2026-07-06 18:00:21