如何用Flask搭建本地服务器实现局域网及公网访问?已有完整Flask应用
当然可行!用Flask搭建本地/互联网可访问的Web服务器完全没问题
首先明确:你的需求完全能实现——不管是让同一局域网(WiFi/LAN)的设备访问,还是通过互联网远程访问,Flask都能做到。你之前试uWSGI没成功,大概率是配置细节没到位,下面我一步步给你讲清楚:
一、先搞定本地网络访问(WiFi/LAN)
这是最基础的,先把这个跑通:
- 修改Flask的运行绑定地址:默认Flask只监听
127.0.0.1(只能本机访问),你需要改成0.0.0.0,这样它会监听电脑的所有网卡。- 代码里改:在你的
app.py(或主文件)里,把app.run()改成:if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) # port可以自己选,比如8080 - 或者用命令行启动(推荐,尤其是用虚拟环境时):
- Windows:
set FLASK_APP=app.py && flask run --host=0.0.0.0 --port=5000 - Linux/macOS:
export FLASK_APP=app.py && flask run --host=0.0.0.0 --port=5000
- Windows:
- 代码里改:在你的
- 找到你的本地IP:
- Windows:打开命令提示符,输入
ipconfig,找“无线局域网适配器WLAN”或“以太网适配器以太网”里的IPv4地址,比如192.168.1.105 - Linux/macOS:终端输入
ip addr或ifconfig,找类似192.168.x.x的地址
- Windows:打开命令提示符,输入
- 测试访问:同一局域网的设备(比如手机、另一台电脑)打开浏览器,输入
http://你的本地IP:5000,就能看到你的Flask应用了! - 注意防火墙:如果访问失败,检查电脑防火墙是否允许5000端口的入站连接,手动放行即可。
二、互联网远程访问
要让外网能访问,分两种情况:
1. 你有公网IP(大部分家庭宽带需要向运营商申请)
- 确认公网IP:百度搜索“我的IP”,得到的地址和你路由器WAN口的IP一致,就是有公网IP。
- 路由器端口映射:
- 登录路由器后台(一般是
192.168.1.1或192.168.0.1,看路由器说明书) - 找到“端口映射”/“虚拟服务器”选项
- 添加映射规则:外部端口设为80(默认HTTP端口,访问不用输端口),内部IP填你的电脑本地IP,内部端口填Flask用的5000,协议选TCP
- 保存设置
- 登录路由器后台(一般是
- 测试访问:用手机流量(不要连WiFi),打开浏览器输入
http://你的公网IP,就能访问了! - 补充:如果运营商屏蔽了80端口,换个端口比如8080,访问时输入
http://你的公网IP:8080;如果公网IP是动态的(隔几天变一次),可以用DDNS服务绑定一个固定域名,不用每次改IP。
2. 没有公网IP(不想折腾运营商)
用反向代理工具,比如ngrok、localtunnel,它们能把你的本地端口“穿透”到互联网:
- 以ngrok为例:
- 下载ngrok(对应系统版本)
- 解压后,在终端/命令提示符里运行:
ngrok http 5000 - 运行后会生成一个临时域名,比如
https://abc123.ngrok.io,外网用户用这个域名就能访问你的Flask应用了!
- 注意:免费版的域名是临时的,重启ngrok就会变;付费版可以固定域名。
三、生产环境部署(解决你uWSGI的问题)
Flask自带的服务器是开发用的,性能差、不稳定,不能用于长期对外提供服务。你之前试uWSGI没成功,大概率是配置细节没对,下面是标准的uWSGI+Nginx配置步骤:
1. 安装uWSGI(在虚拟环境里)
pip install uwsgi
2. 创建uWSGI配置文件(比如myapp.ini)
放在你的Flask应用根目录,内容如下:
[uwsgi] module = app:app # 左边的app是你的主文件名(比如app.py),右边的app是Flask实例的名字(比如你代码里的app = Flask(__name__)) master = true # 启用主进程 processes = 4 # 进程数,根据CPU核心数调整,比如4核就设4 socket = myapp.sock # 和Nginx通信的Unix套接字文件 chmod-socket = 660 # 设置套接字权限,让Nginx能访问 vacuum = true # 退出时自动删除套接字文件 die-on-term = true # 收到终止信号时退出
3. 测试uWSGI是否能运行你的应用
uwsgi --ini myapp.ini
如果没有报错,说明uWSGI能正确加载你的Flask应用。
4. 安装并配置Nginx
- 安装Nginx:
- Ubuntu/Debian:
sudo apt install nginx - CentOS/RHEL:
sudo yum install nginx
- Ubuntu/Debian:
- 创建Nginx站点配置文件:
内容如下(注意替换路径和域名/IP):sudo nano /etc/nginx/sites-available/myappserver { listen 80; server_name 你的公网IP或域名; # 比如123.45.67.89或yourdomain.com location / { include uwsgi_params; uwsgi_pass unix:/绝对路径/myapp.sock; # 替换成你myapp.sock的绝对路径,比如/home/yourname/flaskapp/myapp.sock } # 如果你的应用有静态文件(css、js、图片等),添加这个配置 location /static { alias /绝对路径/static; # 替换成你静态文件目录的绝对路径,比如/home/yourname/flaskapp/static } } - 启用配置文件:
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/ - 测试Nginx配置是否正确:
如果显示sudo nginx -ttest is successful,就重启Nginx:sudo systemctl restart nginx
5. 把uWSGI设为系统服务(可选,开机自启)
创建systemd服务文件:
sudo nano /etc/systemd/system/myapp.service
内容如下(替换路径和用户名):
[Unit] Description=uWSGI service for my Flask app After=network.target [Service] User=你的用户名 # 比如ubuntu Group=www-data WorkingDirectory=/绝对路径/你的Flask应用根目录 Environment="PATH=/绝对路径/你的虚拟环境/bin" # 比如/home/yourname/flaskapp/venv/bin ExecStart=/绝对路径/你的虚拟环境/bin/uwsgi --ini myapp.ini [Install] WantedBy=multi-user.target
然后启动服务并设置开机自启:
sudo systemctl start myapp sudo systemctl enable myapp
现在,不管是本地局域网还是互联网,都能稳定访问你的Flask应用了!
内容的提问来源于stack exchange,提问作者Sóstenes Apollo




