595

我不确定这是否是特定于 Flask 的,但是当我在开发模式 ( http://localhost:5000) 下运行应用程序时,我无法从网络上的其他机器访问它 (使用http://[dev-host-ip]:5000)。例如,在开发模式下使用 Rails,它可以正常工作。我找不到任何有关 Flask 开发服务器配置的文档。知道应该配置什么来启用它吗?

4

15 回答 15

897

虽然这是可能的,但您不应在生产中使用 Flask 开发服务器。Flask 开发服务器的设计并不是特别安全、稳定或高效。请参阅有关部署的文档以获取正确的解决方案。


--hostto 选项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。

于 2011-08-11T13:53:42.787 回答
161

如果您使用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/

于 2016-10-29T01:28:01.613 回答
78

如果 0.0.0.0 方法不起作用,试试这个

无聊的东西

为了让其他设备(笔记本电脑和手机)可以通过本地服务器访问我的应用程序,我个人做了很多努力。我尝试了 0.0.0.0 方法,但没有运气。然后我尝试更改端口,但它不起作用。所以,在尝试了一堆不同的组合之后,我找到了这个,它解决了我在本地服务器上部署我的应用程序的问题。

脚步

  1. 获取计算机的本地 IPv4 地址。这可以通过ipconfig在 Windows 以及ifconfigLinux 和 Mac 上键入来完成。

IPv4 (Windows)

请注意:上述步骤将在您提供应用程序的机器上执行,而不是在您访问它的机器上执行。另请注意,如果您断开并重新连接到网络,IPv4 地址可能会发生变化。

  1. 现在,只需使用获取的 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 中。

凉爽的。

于 2019-06-04T06:52:06.733 回答
54

添加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.

于 2018-01-04T09:18:50.590 回答
24

如果您的cool应用程序的配置是从外部文件加载的,如下例所示,请不要忘记使用 HOST="0.0.0.0" 更新相应的配置文件

cool.app.run(
    host=cool.app.config.get("HOST", "localhost"),
    port=cool.app.config.get("PORT", 9000)
)            
于 2015-05-07T20:52:55.270 回答
20

检查服务器上的特定端口是否打开以服务客户端?

在 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
于 2018-09-01T19:12:17.727 回答
14

如果您在访问使用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 5000Additional options字段中。

运行 Flask 服务器 PyCharm 的配置

有关在 PyCharm 中配置 Flask 服务器的更多信息

于 2019-08-14T14:58:17.677 回答
12

您还可以通过环境变量设置主机(以在面向 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

请参阅如何获取所有可用的命令选项来设置环境变量?

于 2020-04-03T21:48:34.593 回答
8

对我来说,我遵循了上面的答案并对其进行了一些修改:

  1. 只需在命令提示符下使用 ipconfig 获取您的 ipv4 地址
  2. 转到存在烧瓶代码的文件
  3. 在主函数中写入 app.run(host= 'your ipv4 address')

例如:

在此处输入图像描述

于 2020-01-05T15:46:27.043 回答
7

转到 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在另一台机器上访问您的烧瓶应用程序

于 2019-06-26T10:27:15.123 回答
5

.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

于 2020-05-20T21:33:46.463 回答
3

我有同样的问题,我使用 PyCharm 作为编辑器,当我创建项目时,PyCharm 创建了一个 Flask 服务器。我所做的是通过以下方式使用 Python 创建服务器;

配置 Python 服务器 PyCharm 基本上我所做的是创建一个新服务器,但如果不是 python,则烧瓶

希望对你有帮助

于 2018-07-04T02:02:22.787 回答
3

这个答案不仅与烧瓶有关,而且应该适用于所有无法从另一个主机连接服务的问题。

  1. 用于netstat -ano | grep <port>查看地址是 0.0.0.0 还是 ::。如果是 127.0.0.1,那么它仅适用于本地请求。
  2. 使用 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. 我注意到这一切都是这样的:

tcpdump 结果显示只有来自远程主机的 SYN 数据包

然后通过检查iptables --listOUTPUT 部分,我可以看到几个规则:

iptables 列表结果

这些规则禁止在握手时输出 tcp 重要数据包。通过删除它们,问题就消失了。

于 2019-03-24T08:34:09.657 回答
1

转到项目路径集 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 退出)

于 2019-06-26T10:21:33.980 回答
0

如果上述解决方案均无效,请尝试手动将“http://”添加到 url 的开头。

Chrome 可以从搜索查询中区分“[ip-address]:5000”。但有时这工作了一段时间,然后停止连接,似乎没有我改变任何东西。我的假设是浏览器有时可能会自动添加 http s :// (它不应该这样做,但这在我的情况下修复了它)。

于 2020-12-24T15:51:39.497 回答