python3 中 urllib.request 的 urlopen 的奇怪行为

Strange behavior of urlopen from urllib.request in python3

我正在编写您可以找到的应用程序 here

它有我用来获取变更日志列表的功能:

def getChangeLog():
    """
    This function downloads changelog from our repository.
    :return:
    list of change strings
    """
    return [change.decode().rstrip() for change in urlopen(
        'https://raw.githubusercontent.com/Acmpo6ou/PyQtAccounts/master/change.log')]

然后我可以使用这个列表来显示添加到我的应用程序的更改,在进行更改并将它们提交到存储库之后我需要做的就是更新 change.log 文件,所以当用户打开我的应用程序,将显示对话框,其中将包含更改日志。

但是由于某些奇怪的原因,urlopen 总是下载旧的 change.log 文件。

假设我的 change.log 中有这个:

Some fixes.
Something is added.

然后假设我做了一些改变,比如序列化标准改变了。所以我将 change.log 更新为:

Changed serialization standard.

当用户打开我的应用程序时,getChangeLog 函数将获取 change.log 文件,然后它会向用户显示带有此更改日志的对话框,因此用户将看到如下内容:

Changelog for v2.3.6:
* Changed serialization standard.

但由于某些奇怪的原因,将显示以下内容:

Changelog for v2.3.6:
* Some fixes.
* Something is added.

它显示旧 change.log 我在 python 控制台中尝试了我的 getChangeLog 函数,它确实 returns 旧的 change.log,我什至尝试单独使用 urlopen 来获取 change.log 文件,它仍然获取旧的 change.log 文件一。 最有趣的是,如果我调用 getChangeLog 几次,它就会开始返回新的 change.log

我完全糊涂了,谁能告诉我如何解决这个问题?

可能的原因是我总是在启动时调用我的 getChangeLog 函数,该函数下载更新日志。因为我经常测试我的应用程序 - 我经常启动它,getChangeLog 被调用很多,我们下载更新日志很多。

所以 OS 认为:如果我们如此频繁地下载变更日志(而且它实际上很少更改),那么我们为什么不执行一些缓存?而不是实际下载更新日志 OS 提供其缓存版本。

然后,当变更日志实际更改时,OS 仍然提供其缓存版本,如果我多次调用我的 getChangeLog 函数,缓存就会过期并显示新的变更日志!

我认为这是问题所在,因为当我尝试在另一台机器上更新时,我不经常使用它,因此我不经常启动我的应用程序,我在那里看到了新的更新日志。

谜团解开了。