虽然这是可能的,但您不应在生产中使用 Flask 开发服务器。 Flask 开发服务器的设计并不是特别安全、稳定或高效。有关正确解决方案,请参阅 deploying 上的文档。
flask run
的 --host
选项或 app.run()
的 host
参数控制开发服务器侦听的地址。默认情况下它在 localhost
上运行,将其更改为 flask run --host=0.0.0.0
(或 app.run(host="0.0.0.0")
)以在您机器的所有 IP 地址上运行。
0.0.0.0
是一个特殊值,您不能直接在浏览器中使用,您需要导航到网络上机器的实际 IP 地址。您可能还需要调整防火墙以允许外部访问端口。
Flask quickstart docs 在“Externally Visible Server”部分对此进行了解释:
如果您运行服务器,您会注意到服务器只能从您自己的计算机访问,而不能从网络中的任何其他计算机访问。这是默认设置,因为在调试模式下,应用程序的用户可以在您的计算机上执行任意 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。
参考:https://flask.palletsprojects.com/quickstart/
如果 0.0.0.0 方法不起作用,试试这个
无聊的东西
为了让其他设备(笔记本电脑和手机)可以通过本地服务器访问我的应用程序,我个人做了很多努力。我尝试了 0.0.0.0 方法,但没有运气。然后我尝试更改端口,但它不起作用。所以,在尝试了一堆不同的组合之后,我找到了这个,它解决了我在本地服务器上部署我的应用程序的问题。
脚步
获取计算机的本地 IPv4 地址。这可以通过在 Windows 上输入 ipconfig 和在 Linux 和 Mac 上输入 ifconfig 来完成。
https://i.stack.imgur.com/mX8NM.png
请注意:上述步骤将在您提供应用程序的机器上执行,而不是在您访问它的机器上执行。另请注意,如果您断开并重新连接到网络,IPv4 地址可能会发生变化。
现在,只需使用获取的 IPv4 地址运行烧瓶应用程序。 flask run -h 192.168.XX 例如在我的例子中(见图),我运行它:flask run -h 192.168.1.100
https://i.stack.imgur.com/0xs1f.png
在我的移动设备上
https://i.stack.imgur.com/lGGYG.jpg
可选的东西
如果您在 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)
如果您在 Windows 上获得 OSError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions
,则您没有使用该端口的权限,或者您可以通过 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 字段。
https://i.stack.imgur.com/pjgga.png
关于configuring Flask server in PyCharm的更多信息
您还可以通过环境变量设置主机(以在面向 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
请参阅How to get all available Command Options to set environment variables?
对我来说,我遵循了上面的答案并对其进行了一些修改:
只需在命令提示符下使用 ipconfig 获取您的 ipv4 地址 转到存在烧瓶代码的文件 在主函数中写入 app.run(host= 'your ipv4 address')
例如:
https://i.stack.imgur.com/hILNY.png
转到 CMD(命令提示符)上的项目路径并执行以下命令:-
设置 FLASK_APP=ABC.py
SET FLASK_ENV=开发
烧瓶运行 -h [yourIP] -p 8080
您将在 CMD 上获得以下 o/p:-
服务 Flask 应用程序“expirement.py”(延迟加载)环境:开发调试模式:on Restarting with stat 调试器处于活动状态!调试器 PIN:199-519-700 在 http://[yourIP]:8080/ 上运行(按 CTRL+C 退出)
环境:发展
调试模式:开
用 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
我有同样的问题,我使用 PyCharm 作为编辑器,当我创建项目时,PyCharm 创建了一个 Flask 服务器。我所做的是通过以下方式使用 Python 创建服务器;
https://i.stack.imgur.com/Qo5v3.png
希望对你有帮助
这个答案不仅与烧瓶有关,而且应该适用于所有无法从另一个主机连接服务的问题。
使用 netstat -ano | grep
今天我像往常一样运行我的烧瓶应用程序,但我注意到它无法从其他服务器连接。然后我运行 netstat -ano | grep <port>
,本地地址是 ::
或 0.0.0.0
(我都试过了,我知道 127.0.0.1 只允许来自本地主机的连接)。然后我用了telnet host port
,结果就像connect to ...
。这很奇怪。然后我想我最好用 tcpdump -i any port <port> -w w.pcap
检查它。我注意到这一切都是这样的:
https://i.stack.imgur.com/yXLpR.png
然后通过检查 iptables --list
OUTPUT 部分,我可以看到几个规则:
https://i.stack.imgur.com/9dd83.png
这些规则禁止在握手时输出 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 退出)
这终于对我有用。
import os
然后将其放在 python app.py 或主文件的末尾。
if __name__ == "__main__":
port = int(os.environ.get("PORT", 5000))
app.run(host='0.0.0.0', port=port)
如果上述解决方案均无效,请尝试手动将“http://”添加到 url 的开头。
Chrome 可以从搜索查询中区分“[ip-address]:5000”。但有时这工作了一段时间,然后停止连接,似乎没有我改变任何东西。我的假设是浏览器有时可能会自动添加 https:// (它不应该,但这在我的情况下修复了它)。
ipconfig getifaddr en0
并使用该 IP 作为您的--host
值来获得相同的 IP。