1.问题背景:
在Idea 2018.3 Ultimate Edition中创建一个Python Flask应用,Python版本是3.8.7版本,Flask代码如下:
from flask import Flask
app = Flask(__name__)
if __name__ == '__main__': app.run()
启动方式:在启动应用的congfig中进行配置,页面如下:
这样子启动之后,发现本地可以正常访问,现在需要让公司的内网同事也能正常访问,但是在公司内网的其他同事通过内网IP访问失败,原因是端口不通
2.解决Flask服务在idea中内网访问不通的问题
2.1 怀疑是端口的问题
同事通过ping命令检查我的ip发现可以访问,包没有丢失没有延时,排除了ip的问题,就是端口的问题了,我怀疑是5000端口被防火墙给拦截掉了,所以就把端口改为8080试试,然后修改代码如下:
app.run(port=int("8080"))
然后启动服务,发现日志中显示启动的端口还是5000,修改没起作用:
后来在网上查看,发现要在run configuration中的Additional options中配置才起作用,所以就在 run configuration中的Additional options加了参数--port=8080,重新启动之后端口变为了8080,如图:
然后让同事访问,还是不通。如果防火墙拦截端口,我也没设置过那些端口被拦截那些端口不被拦截,所以修改端口的解决方案纯属瞎搞,病急乱投医,但是后来想我的防火墙都关闭了,端口被防火墙拦截的情况也不存在,因为别的同事还能访问我的1521的端口,所以问题还是出在网络上。
2.2网络的问题是什么?
Flask在启动的时候执行app.run()的时候可以指定host,我就想既然用默认的不行就指定下host,然后直接copy网上的改为
app.run(host="0.0.0.0", port=int("8080")) 重新启动之后发现同事还是访问不了,最后就搁浅了放到第二天再搞,第二天发现启动后的ip还是127.0.0.1,修改未生效,最后就在run configuration中的Additional options加了一个配置--host=172.*.*.*.*(我的内网地址),然后启动之后同事就可以访问了,大功告成。
网络的问题是什么?我的内网ip上没有监听到8080端口。原因是什么?
1.Flask的app.run()方法中的host参数在代码中不起作用,原因是因为在Idea中使用 RunConfiguration启动服务的时候,服务启动的相关参数需要在RunConfiguration中设置,在app.run()方法中不起作用,因为我们从启动日志中可以发现:
D:\Program Files\Python38\python.exe" -m flask run --port=8080
可以看出idea在为我们启动服务的时候,是在读取RunConfiguration中设置去启动的,并不是运行代码中的app.run(),为了验证app.run的代码没有问题,我们使用python 启动该脚本,app.run(port=int("8081"))
执行 python TestFlask.py,输出日志如下:
a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:8081/ (Press CTRL+C to quit)
2.127.0.0.1只能在本地访问,内网中是访问不通的。由于Flask的启动的时候host参数没起作用,所以Flask启动的host还是默认参数,127.0.0.1,源码解释如下:
修改RunConfiguration中Additional options的--host="0.0.0.0"或者内网ip后同事都可以访问。
关于0.0.0.0我们可以理解如下:
问题复盘:
1.遇到问题要冷静的客观分析,不能病急乱投医,毫无根据的提出所谓的解决方案;
2.对于日志要仔细的查看,根据日志获取关键有用信息;
3.要明白工具的使用原理,不能想当然的认为工具的运行原理;
4.网络相关的知识需要去学习和积累