关于flask修改代码后网页无法更新的问题。

所以问你使用的什么开发环境呀,Pycharm的话是有提示信息的:OSError: [Errno 98] Address already in use

我估计你的问题是重启服务器的时候没有把原来的进程结束,所以5000端口还在被原来的程序占用。

1 个赞

抱歉,忘了说明。开发环境就是pycharm(windows平台),并没有报错。
我继续测试了一下,发现了新的问题。

  1. 在pycharm中启动一个flask app,正常。再开一个terminal启动,并没有报错端口占用 。
    image
  2. 另外,在pycharm中,我的文件夹结构如下
    image
    pythonweb目录下有app.py和文件夹helloflask,
    工作目录切换到helloflask/demos/http后,执行python shell后得到的实例仍然是D:/pythonweb/instance
    如果把pythonweb目录下的app.py删除,就会报错找不到实例,不知道是怎么回事。
    (pycharm版本2018.3.3community)
  1. 端口你再检查下两个终端的程序是不是运行在一个端口(应该不可能)

  2. 你的项目文件夹应该有问题吧,你检查下虚拟环境呢?这样应该没有启动helloflask里面的虚拟环境

  1. 我重复试了几次,发现同一端口启动第二个flask app确实不报错,但只能向第一个app发送请求。
  2. 根目录(pythonweb)开启了虚拟环境(检查过了),切换到子目录需要重新启动?(虚拟环境不太了解)

所以不知道是不是pycharm的bug,打算换个专业版pycharm试一下。
还是多谢你耐心恢复我的问题。

关于2. 我新建了一个 virtualenv+pip的虚拟环境,就没问题了。
不知道是pipenv的问题还是pycharm集成支持pipenv的问题。

你使用pipenv创建虚拟环境的操作有问题,如果要使用helloflask目录下的虚拟环境,应该在pycharm内将helloflask文件夹作为新项目打开,pycharm会根据文件夹内的pipfile自动启动虚拟环境;

但是你在helloflask文件夹外部自己创建了虚拟环境,可能会导致非预期的行为;而且你上传截图里面的命令执行时都没有启动虚拟环境,不一定是这些导致了你上面的问题,但建议还是按照书上的步骤使用实例程序吧

  1. 按照你说的把helloflask作为新项目打开,问题确实解决了。但在我自己的项目中新建文件夹下新建app.py依旧会出现上述问题,估计是我自己不知道哪一步出了问题,我再仔细检查一下。
  2. 至于虚拟环境,确实启动了。首先,pycharm会自动启动虚拟环境,其次,为了防止pycharm没有启动虚拟环境,我另外执行了pipenv shell启动虚拟环境,结果仍然相同。(pipenv虚拟环境在windows没有前缀)

再次感谢

可以看下这篇文章大概了解下pipenv的用法: Pipenv:新一代Python项目环境与依赖管理工具

新建文件夹新建app.py会出现啥问题呢:joy:

你误会了,我的意思是在我自己的项目里新建了一个文件夹test,以及test中文件app.py,然后cd到test仍然无法用flask run启动它,flask shell只能搜索到根目录下的instance

我把我自己项目的虚拟环境删掉重新建了一下,子目录下app.py的问题已经解决了。
但端口还是会出现占用不报错的问题,这个问题放一放再说吧,我把情况放在这,希望遇到同样问题的同学可以一同解决:
pycharm中可以启动两次app.py占用同一端口,没有端口占用报错,但只能访问第一次启动的app.py。
(pycharm版本2018.3.3community)

可以尝试去实时检测系统的端口监听情况,以及检查是否设置了端口复用

我的环境是linux系统和pycharm专业版,无法复现

朋友,为了不给阅读这个帖子的读者造成误导和困扰,请允许我指出你在这个帖子中所描述的问题大部分可能是因为:

  1. 你没有完全按照书上的流程或规范流程操作(如使用示例程序和虚拟环境),因此产生了非预期行为;
  2. 你在使用pipenvpython-dotenv这两个第三方库时对它们可能缺乏了解。

:joy:另外,因为你描述的问题我都没能复现,建议阅读别轻易声称自己遇到了bug

pycharm 中可以启动两次app.py占用同一端口,没有端口占用报错,但只能访问第一次启动的app.py。

首先有两个结论:

  1. 一个端口在一些情况下确实可以被多个进程占用。
  2. 这个行为和 PyCharm 没有关系,PyCharm 只是帮我们启动了一个进程而已。和我们自己使用在命令行运行 flask run 是一样的效果。

那什么情况下一个端口可以被多次监听呢?

简单描述,就是我们启动一个 Web 服务的时候,我们可以给这个 Web 服务设置一个参数 SO_REUSEADDR,这个参数可以允许程序多次绑定同一端口,不设置这个参数就不能被多次重复监听(ps: 实际上远没有这么简单,但目前,我们可以这么理解。详情可以看这个回答

在 Flask 中,它正好设置了这个参数,你可以看 werkzeug 库的这一行代码,而 Flask 是基于 Werkzeug 开发的一个 Web 框架)。

@lyh081


扩展:有童鞋可能会想 SO_REUSEADDR 这个参数有什么用呢?看起来只会给我添麻烦呀。如果你心里产生了这个疑问,恭喜你,你非常有潜力成为一个 相对 成功的程序员~

3 个赞

先说声抱歉。
用词不当,以后会多多注意。
再次感谢。

thanks soooooooo much.

另有个问题想请教下,
如果我想详细了解一下这个问题涉及到的内容,应该学那些知识?
(抱歉,专业并非sc,许多的东西想学也不知道到底该学什么)

从这位大佬引用的SO答案来看,主要涉及到了以下知识:

  • TCP/IP协议的基础知识,至少需要了解建立TCP连接的过程,地址、端口等概念的定义。
  • 操作系统基础知识,建议学习Linux系统,了解程序如何通过操作系统进行网络通信以及操作系统如何对网络连接进行管理

个人建议如果还在入门flask的阶段没必要在这种问题上深钻,因为涉及的知识面较广,且在正常情况下对程序不会产生影响,等你过了遍网络协议和操作系统基础后就很好理解了。

1 个赞

请不要连续提问,新问题请创建新帖子。发帖规则见论坛说明

你好,我也遇到了这个问题。flask代码修改后网页无法更新。这是我的项目文件结构。我直接在命令行里运行的。

我在watchlist里安装了pipenv,也打开了虚拟环境。有人知道我的问题在哪里吗?非常感谢!

问题解决了。是因为浏览器缓存,后来在app.py中设置了时间就可以了。

from datetime import timedelta
app.config[‘SEND_FILE_MAX_AGE_DEFAULT’] = timedelta(seconds=1)

是进程的问题
C:\Users\MACHENIKE>netstat -aon|findstr 5000
TCP 127.0.0.1:5000 0.0.0.0:0 LISTENING 563112
TCP 127.0.0.1:5000 0.0.0.0:0 LISTENING 561588
TCP 127.0.0.1:5000 0.0.0.0:0 LISTENING 560316
TCP 127.0.0.1:5000 0.0.0.0:0 LISTENING 551920
就是页面刷新之后hello word都没有方法修改,这是我的进程,解除之后就没有主楼出现的问题了