ChatGPT解决这个技术问题 Extra ChatGPT

将 Flask 开发服务器配置为在整个网络中可见

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


H
HackDolphin

虽然这是可能的,但您不应在生产中使用 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。


d
davidism

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


A
Abhishek kumar

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

酷。👌


在 macOS 或 Linux 上,您可以通过在命令行中输入 ipconfig getifaddr en0 并使用该 IP 作为您的 --host 值来获得相同的 IP。
也请不要分享您的 IP 地址。这包括 IPv4、IPv6 等。
Heewoon 这个 IP 地址在他的网络中是本地的。很有可能你也有。
d
davidism

添加 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 找到的其他东西正在使用它。


m
mircealungu

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

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

R
Rajesh Prasad Yadav

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

在 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

V
Viacheslav Z

如果您在访问使用 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的更多信息


A
Ahmedur Rahman Shovon

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


A
Arsalan Fakhar Siddiqui

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

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

例如:

https://i.stack.imgur.com/hILNY.png


I
Ibz.Shaikh

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


为简化起见,请注意您必须使用公共 IPv4 地址。
在我的 alt 计算机上出现超时错误
S
Saurabh

在项目根目录中创建文件 .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


J
Juanes30

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

https://i.stack.imgur.com/Qo5v3.png

希望对你有帮助


T
Tiina

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

使用 netstat -ano | grep 查看地址是 0.0.0.0 还是 ::。如果是 127.0.0.1,那么它仅适用于本地请求。使用 tcpdump 查看是否有任何数据包丢失。如果显示明显不平衡,请通过 iptables 检查路由规则。

今天我像往常一样运行我的烧瓶应用程序,但我注意到它无法从其他服务器连接。然后我运行 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 重要数据包。通过删除它们,问题就消失了。


I
Ibz.Shaikh

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


R
Ronny K

这终于对我有用。

import os

然后将其放在 python app.py 或主文件的末尾。

if __name__ == "__main__":
    port = int(os.environ.get("PORT", 5000))
    app.run(host='0.0.0.0', port=port)

A
Azeezah M

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

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


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅