将Flask开发服务器配置为跨网络可见

692

我不确定这是否只针对 Flask,但是当我在开发模式下运行应用程序(http://localhost:5000)时,我无法从网络中的其他计算机访问它(使用http://[dev-host-ip]:5000)例如,在Rails的开发模式下,一切都很正常。我找不到任何有关Flask开发服务器配置的文档。您有什么想法可以启用此功能吗?

18个回答

1030
虽然可能可以使用Flask开发服务器,但不建议在生产环境中使用。 Flask开发服务器的安全性、稳定性和效率都不是特别好。请查看有关部署的文档获取正确的解决方案。
通过--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快速入门文档在“可外部访问的服务器”一节中介绍了这一点:
“如果启动服务器,则会注意到仅可以从自己的计算机访问服务器,而无法从网络中的任何其他计算机访问。这是默认设置,因为在调试模式下,应用程序的用户可以在您的计算机上执行任意Python代码。
如果已禁用调试器或信任网络上的用户,则可以通过添加--host=0.0.0.0到命令行中使服务器公开可用。”
$ flask run --host=0.0.0.0

这告诉你的操作系统要监听所有公共IP地址。


1
在我关闭防火墙之前,它对我来说没有用,但关闭后它就可以工作了。 - Kunal Soni
1
@Kunal-Soni 禁用整个防火墙不是一个好主意。然而,创建一个允许特定应用程序与您的计算机通信的例外情况完全不同,是一个更好的解决方案。如果后者是你所指的"禁用防火墙",那就很好。 - Stev

175
如果您使用flask可执行文件启动服务器,请使用flask run --host=0.0.0.0来更改默认值从127.0.0.1,并将其开放给非本地连接。

If you run the server you will notice that the server is only accessible from your own computer, not from any other in the network. This is the default because in debugging mode a user of the application can execute arbitrary Python code on your computer.

If you have the debugger disabled or trust the users on your network, you can make the server publicly available simply by adding --host=0.0.0.0 to the command line:

$ flask run --host=0.0.0.0

This tells your operating system to listen on all public IPs.

参考资料:https://flask.palletsprojects.com/quickstart/


94

如果0.0.0.0方法不起作用,请尝试以下方法

无聊的东西

我曾经在将我的应用程序通过本地服务器访问到其他设备(笔记本电脑和手机)时遇到了很多麻烦。我尝试过0.0.0.0方法,但并没有成功。然后我尝试改变端口,但还是不行。所以,在尝试了很多不同的组合之后,我找到了这个方法,并解决了我的问题。

步骤

  1. 获取计算机的本地IPv4地址。可以在Windows上键入 ipconfig,在Linux和Mac上键入 ifconfig 来实现。

IPv4 (Windows)

请注意:以上步骤需要在您提供应用程序的计算机上执行,而不是在您访问它的计算机上执行。此外,请注意,如果您断开并重新连接到网络,则IPv4地址可能会更改。

  1. 现在,只需使用获取的IPv4地址运行 flask 应用程序。

    flask run -h 192.168.X.X

    例如,在我的情况下(请参见图像),我运行如下:

    flask run -h 192.168.1.100

running the flask app

在我的移动设备上

screenshot from my mobile phone

可选的东西

如果您正在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 中。

很酷。


在 macOS 或 Linux 上,您可以通过在命令行中输入“ipconfig getifaddr en0”来获取相同的 IP,并将该 IP 用作 --host 值。 - W1ck3d
请勿分享您的IP地址,包括IPv4、IPv6等。 - Heewoon
5
Heewoon,这个IP地址是本地网络的。很有可能你也有这个地址。 - Westsi

74

app.run中添加host='0.0.0.0'

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 命令找到。


27

检查特定端口在服务器上是否开放以为客户端提供服务?

在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

25

如果您的酷炫应用程序的配置是从外部文件加载的,就像以下示例一样,请不要忘记使用HOST="0.0.0.0"更新相应的配置文件。

cool.app.run(
    host=cool.app.config.get("HOST", "localhost"),
    port=cool.app.config.get("PORT", 9000)
)            

20

如果你在访问使用PyCharm部署的Flask服务器时遇到问题,请注意以下事项:

PyCharm不会直接运行您的主要.py文件,因此任何出现在if __name__ == '__main__':中的代码都不会被执行,并且任何更改(比如app.run(host='0.0.0.0', port=5000))也不会生效。

相反,您应该使用运行配置来配置Flask服务器,具体而言是将--host 0.0.0.0 --port 5000放入附加选项字段中。

Run cofigurations of Flask server PyCharm

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


1
谢谢,对于任何使用PyCharm的人来说,这是非常好的信息。 - Claudiu
这应该是最佳答案之一。 - DEEPAK S.V.

15

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

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


7

我按照上面的答案进行了修改:

  1. 打开命令提示符并使用ipconfig找到您的IPv4地址
  2. 进入flask代码所在的文件
  3. 在main函数中写入app.run(host='您的IPv4地址')

例如:

enter image description here


7

进入命令提示符(CMD)并转到项目路径,执行以下命令:

set FLASK_APP=ABC.py

SET FLASK_ENV=development

flask run -h [yourIP] -p 8080

在CMD上会得到以下输出:

  • Serving Flask app "expirement.py" (lazy loading)
    • Environment: development
    • Debug mode: on
    • Restarting with stat
    • Debugger is active!
    • Debugger PIN: 199-519-700
    • Running on http://[yourIP]:8080/ (按CTRL+C退出)

现在,您可以使用http://[yourIP]:8080/ url在另一台设备上访问您的Flask应用程序。


简化起见,请注意你必须使用你的公共IPv4地址。 - Heewoon
我的备用电脑出现了超时错误。 - myrccar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接