我不确定这是否是特定于 Flask 的,但是当我在开发模式 ( http://localhost:5000
) 下运行应用程序时,我无法从网络上的其他机器访问它 (使用http://[dev-host-ip]:5000
)。例如,在开发模式下使用 Rails,它可以正常工作。我找不到任何有关 Flask 开发服务器配置的文档。知道应该配置什么来启用它吗?
15 回答
虽然这是可能的,但您不应在生产中使用 Flask 开发服务器。Flask 开发服务器的设计并不是特别安全、稳定或高效。请参阅有关部署的文档以获取正确的解决方案。
--host
to 选项flask run
或tohost
参数app.run()
控制开发服务器侦听的地址。默认情况下它在 上运行localhost
,将其更改为flask run --host=0.0.0.0
(或app.run(host="0.0.0.0")
)以在您机器的所有 IP 地址上运行。
0.0.0.0
是一个特殊值,您不能直接在浏览器中使用,您需要导航到网络上机器的实际 IP 地址。您可能还需要调整防火墙以允许外部访问端口。
Flask快速入门文档在“外部可见服务器”部分对此进行了解释:
如果您运行服务器,您会注意到服务器只能从您自己的计算机访问,而不能从网络中的任何其他计算机访问。这是默认设置,因为在调试模式下,应用程序的用户可以在您的计算机上执行任意 Python 代码。
如果您禁用了调试器或信任网络上的用户,您可以通过添加
--host=0.0.0.0
到命令行使服务器公开可用:$ flask run --host=0.0.0.0
这告诉您的操作系统侦听所有公共 IP。
如果您使用flask
可执行文件启动服务器,请使用flask run --host=0.0.0.0
从 127.0.0.1 更改默认值并将其打开到非本地连接。
如果您运行服务器,您会注意到服务器只能从您自己的计算机访问,而不能从网络中的任何其他计算机访问。这是默认设置,因为在调试模式下,应用程序的用户可以在您的计算机上执行任意 Python 代码。
如果您禁用了调试器或信任网络上的用户,您可以通过添加
--host=0.0.0.0
到命令行使服务器公开可用:$ flask run --host=0.0.0.0
这告诉您的操作系统侦听所有公共 IP。
如果 0.0.0.0 方法不起作用,试试这个
无聊的东西
为了让其他设备(笔记本电脑和手机)可以通过本地服务器访问我的应用程序,我个人做了很多努力。我尝试了 0.0.0.0 方法,但没有运气。然后我尝试更改端口,但它不起作用。所以,在尝试了一堆不同的组合之后,我找到了这个,它解决了我在本地服务器上部署我的应用程序的问题。
脚步
- 获取计算机的本地 IPv4 地址。这可以通过
ipconfig
在 Windows 以及ifconfig
Linux 和 Mac 上键入来完成。
请注意:上述步骤将在您提供应用程序的机器上执行,而不是在您访问它的机器上执行。另请注意,如果您断开并重新连接到网络,IPv4 地址可能会发生变化。
现在,只需使用获取的 IPv4 地址运行烧瓶应用程序。
flask run -h 192.168.X.X
例如,在我的情况下(见图),我将其运行为:
flask run -h 192.168.1.100
在我的移动设备上
可选的东西
如果您在 Windows 上执行此过程并使用 Power Shell 作为 CLI,但仍无法访问该网站,请在运行应用程序的 shell 中尝试 CTRL + C 命令。Power Shell 有时会被冻结,需要一点点才能恢复。这样做甚至可能会终止服务器,但它有时会奏效。
就是这样。如果您觉得这有帮助,请竖起大拇指。
还有一些可选的东西
我创建了一个简短的 Powershell 脚本,可以在您需要时获取您的 IP 地址:
$env:getIp = ipconfig
if ($env:getIp -match '(IPv4[\sa-zA-Z.]+:\s[0-9.]+)') {
if ($matches[1] -match '([^a-z\s][\d]+[.\d]+)'){
$ipv4 = $matches[1]
}
}
echo $ipv4
将其保存到扩展名为 .ps1 的文件(适用于 PowerShell),并在启动应用程序之前运行它。您可以将其保存在您的项目文件夹中并运行为:
.\getIP.ps1; flask run -h $ipv4
注意:我将上面的 shellcode 保存在 getIP.ps1 中。
凉爽的。
添加host='0.0.0.0' to
app.run`。
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
如果你OSError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions
在 Windows 上,你要么没有使用端口的权限,要么有其他东西在使用它,你可以通过netstat -na|findstr 5000
.
如果您的cool
应用程序的配置是从外部文件加载的,如下例所示,请不要忘记使用 HOST="0.0.0.0" 更新相应的配置文件
cool.app.run(
host=cool.app.config.get("HOST", "localhost"),
port=cool.app.config.get("PORT", 9000)
)
检查服务器上的特定端口是否打开以服务客户端?
在 Ubuntu 或 Linux 发行版中
sudo ufw enable
sudo ufw allow 5000/tcp //allow the server to handle the request on port 5000
配置应用程序以处理远程请求
app.run(host='0.0.0.0' , port=5000)
python3 app.py & #run application in background
如果您在访问使用PyCharm部署的 Flask 服务器时遇到问题,请考虑以下几点:
PyCharm 不会直接运行您的主 .py 文件,因此if __name__ == '__main__':
不会执行其中的任何代码,并且任何更改(如app.run(host='0.0.0.0', port=5000)
)都不会生效。
相反,您应该使用 Run Configurations 配置 Flask 服务器,特别是放置--host 0.0.0.0 --port 5000
到Additional options字段中。
您还可以通过环境变量设置主机(以在面向 IP 地址的网络上公开它)和端口。
$ export FLASK_APP=app.py
$ export FLASK_ENV=development
$ export FLASK_RUN_PORT=8000
$ export FLASK_RUN_HOST=0.0.0.0
$ flask run
* Serving Flask app "app.py" (lazy loading)
* Environment: development
* Debug mode: on
* Running on https://0.0.0.0:8000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 329-665-000
转到 CMD(命令提示符)上的项目路径并执行以下命令:-
设置 FLASK_APP=ABC.py
SET FLASK_ENV=开发
烧瓶运行 -h [yourIP] -p 8080
您将在 CMD 上获得以下 o/p:-
- 服务 Flask 应用程序“expirement.py”(延迟加载)
- 环境:发展
- 调试模式:开
- 用 stat 重启
- 调试器处于活动状态!
- 调试器 PIN:199-519-700
- 在http://[yourIP]:8080/上运行(按 CTRL+C 退出)
现在您可以使用http://[yourIP]:8080/ url在另一台机器上访问您的烧瓶应用程序
.flaskenv
在项目根目录中创建文件。
该文件中的参数通常为:
FLASK_APP=app.py
FLASK_ENV=development
FLASK_RUN_HOST=[dev-host-ip]
FLASK_RUN_PORT=5000
如果您有虚拟环境,请激活它并执行pip install python-dotenv
.
该包将使用该.flaskenv
文件,并且其中的声明将跨终端会话自动导入。
然后你可以做flask run
这个答案不仅与烧瓶有关,而且应该适用于所有无法从另一个主机连接服务的问题。
- 用于
netstat -ano | grep <port>
查看地址是 0.0.0.0 还是 ::。如果是 127.0.0.1,那么它仅适用于本地请求。 - 使用 tcpdump 查看是否有任何数据包丢失。如果显示明显不平衡,请通过 iptables 检查路由规则。
今天我像往常一样运行我的烧瓶应用程序,但我注意到它无法从其他服务器连接。然后我运行netstat -ano | grep <port>
,本地地址是::
or 0.0.0.0
(我都试过了,我知道 127.0.0.1 只允许来自本地主机的连接)。然后我用telnet host port
了,结果是这样的connect to ...
。这很奇怪。然后我想我最好用tcpdump -i any port <port> -w w.pcap
. 我注意到这一切都是这样的:
然后通过检查iptables --list
OUTPUT 部分,我可以看到几个规则:
这些规则禁止在握手时输出 tcp 重要数据包。通过删除它们,问题就消失了。
转到项目路径集 FLASK_APP=ABC.py SET FLASK_ENV=development
flask run -h [yourIP] -p 8080 你将在 CMD 上关注 o/p:- * Serving Flask app “expirement.py”(延迟加载) * Environment: development * Debug mode: on * Restarting with stat * Debugger is active !* 调试器 PIN:199-519-700 * 在http://[yourIP]:8080/上运行(按 CTRL+C 退出)
如果上述解决方案均无效,请尝试手动将“http://”添加到 url 的开头。
Chrome 可以从搜索查询中区分“[ip-address]:5000”。但有时这工作了一段时间,然后停止连接,似乎没有我改变任何东西。我的假设是浏览器有时可能会自动添加 http s :// (它不应该这样做,但这在我的情况下修复了它)。