Странное поведение urlopen из urllib.request в python3 - PullRequest
0 голосов
/ 19 июня 2020

Я пишу приложение, которое вы можете найти здесь .

У него есть функция, которую я использую для получения списка изменений:

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 Я попробовал свою функцию getChangeLog в консоли python и он действительно возвращает старый change.log, я даже пытался использовать urlopen сам по себе для получения файла change.log, но он все равно получает старый. Самое интересное, что если я вызову getChangeLog несколько раз, он начнет возвращать новое изменение. Log

Я совершенно запутался, может ли кто-нибудь объяснить мне, как это исправить?

1 Ответ

0 голосов
/ 01 июля 2020

Вероятно, причина в том, что я всегда вызываю свою getChangeLog функцию, которая загружает журнал изменений, при запуске. И поскольку я много тестирую свое приложение - я часто его запускаю, и getChangeLog вызывается, и мы много загружаем журнал изменений.

Итак, ОС думает: если мы так часто загружаем журнал изменений (и он на самом деле меняется редко), тогда почему бы нам не выполнить кеширование? И вместо фактической загрузки журнала изменений ОС предоставляет свою кэшированную версию.

Затем, когда журнал изменений действительно изменяется, ОС по-прежнему предоставляет свою кешированную версию, и если я вызываю свою функцию getChangeLog несколько раз, срок действия кеша истекает, и он показывает новый журнал изменений !

Я думаю, что это проблема, потому что, когда я пытался обновить на своем другом компьютере, который я использую не так часто и, следовательно, где я запускаю свое приложение не так часто, я увидел там новый журнал изменений.

Тайна раскрыта.

...