Файл CSS не обновляется при развертывании (Google AppEngine) - PullRequest
24 голосов
/ 06 мая 2010

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

Вот испорченная страница: http://www.gaiagps.com

Appengine показывает последнюю версию как правильную: http://1.latest.gaiagps.appspot.com/

Любая помощь?

Ответы [ 10 ]

26 голосов
/ 29 января 2011

Я видел это раньше в App Engine, даже при использовании таких параметров запроса, как /stylesheets/default.css?{{ App.Version }}.

Вот моя (неподтвержденная) теория:

  1. Вы выдвигаете новую версию, развертывая или изменяя новую версию на default.
  2. Пока это обновление распространяется на все экземпляры GAE, на которых работает ваше приложение ...
  3. ... кто-то зашел на ваш сайт.
  4. Запрос на статический ресурс default.css{{ App.Version }} отправляется в CDN Google, в котором его еще нет.
  5. Google CDN запрашивает у GAE ресурс, прежде чем будет выполнено распространение с шага # 2 для всех экземпляров.
  6. Если вам не повезло, GAE обслуживает ресурс из экземпляра, на котором запущена старая версия ...
  7. ... который теперь кэшируется в CDN Google как официальная "новая" версия.

Когда это (если это происходит) происходит, я могу подтвердить, что никакая работа браузера не поможет. Серверы Google CDN содержат неверную версию.

Исправить: Единственный найденный способ исправить это - развернуть другую версию. Вы не рискуете, чтобы это произошло снова (если вы не внесли никаких изменений в CSS после состояния гонки), потому что даже если условие гонки возникает, вероятно, ваше первое обновление выполнено к тому времени, когда вы развернете второе, поэтому все экземпляры будут обслуживать правильную версию, несмотря ни на что.

3 голосов
/ 15 января 2012

Вот что сработало для меня.

  1. Служите вашему CSS-файлу из статического домена. Это автоматически создается GAE.

    // статический. {Ваш-приложение-ID} .appspot.com / {CSS-файл путь}

  2. Разверните ваше приложение. На этом этапе ваше приложение будет сломано.

  3. изменить версию файла css

    // статическая. {Ваш-приложение-ID} .appspot.com / {CSS-файл путь}? V = {версия-Name}

  4. развернуть снова.

Каждый раз, когда вы меняете файл CSS. вам придется повторить 2,3 и 4.

2 голосов
/ 18 марта 2014

У меня тоже была эта проблема. Я использовал флягу с GAE, поэтому в моем app.yaml не было статического обработчика. Когда я добавил его, развертывание работает. Попробуйте добавить что-то вроде этого

handlers:
- url: /static
  static_dir: static

на app.yaml и разверните снова. Это сработало для меня. Очевидно, Google пытается оптимизировать, не обновляя файлы, которые, по его мнению, пользователи не видят.

2 голосов
/ 06 мая 2010

Ваша ссылка мне подходит, если я что-то упустил.

Возможно, вы кэшировали свой старый CSS и не получили новый CSS после его обновления. Попробуйте очистить кеш браузера и посмотрите, работает ли он.

Переходите к 1.latest загрузке нового CSS, поскольку он не находится в вашем кеше, поэтому он отображается правильно.

0 голосов
/ 21 февраля 2019

Ok. Для новых людей, видящих эту проблему, я попробовал подход с использованием кеша и, похоже, исправил его здесь. Это пример того, что я сделал для импорта css в файл app.cfg. Создайте переменную для хранения вашего appid, как установлено вФайл app.yaml и установите его как показано ниже

<link href="{{ url_for('static', filename='file.css') }}?{{config.APP_ID}}" rel="stylesheet"> 

Также для файла app.yaml добавьте этот конфиг, чтобы быть на безопасной стороне

обработчики:

  • url: / static static_dir: static
0 голосов
/ 27 декабря 2018

Для новых людей, приходящих на эти старые вопросы / набор ответов, я хотел бы дать обновленный ответ. Я думаю, что в 2018-1919 годах следующая информация, вероятно, исправит большинство проблем с обновлениями CSS, которые возникают у людей:

Убедитесь, что ваш app.yaml имеет следующее:

 handlers:
   - url: /static
     static_dir: static
  • Выполнить gcloud app deploy
  • Охладите в течение 10 минут ... и перезагрузите ваш сайт
0 голосов
/ 27 октября 2018

Как установлено shoresh , документы для стандартной среды Pyhton утверждают, что оба параметра срок действия статического кэша , отдельный элемент expiration и элемент верхнего уровня default_expiration, отвечает за определение «времени истечения [того], которое будет отправлено в заголовках ответа HTTP Cache-Control и Expires». Это означает, что «файлы, вероятно, будут кэшироваться браузером пользователя, а также промежуточными прокси-серверами, такими как интернет-провайдеры».

Проблема здесь в том, что «повторное развертывание новой версии приложения не сбрасывает все кэши». Поэтому, если установить default_expiration, например, на 15 дней, но внести изменения в файл CSS или JS и повторно развернуть приложение, нет гарантии, что эти файлы будут автоматически обслуживаться из-за активных кэшей, особенно из-за для промежуточного кэширования прокси-серверов, которые могут включать в себя серверы Google Cloud - что, по-видимому, имеет место, так как доступ к your-project-name.appspot.com также обслуживает устаревшие файлы.

В той же документации, ссылка на которую приведена выше, указано, что «если вы когда-либо планируете изменить статический файл, он должен иметь короткий (менее одного часа) срок действия. В большинстве случаев подходит 10-минутное время истечения по умолчанию». Это то, что нужно подумать о до того, как установит срок действия статического кэша. Но для тех, кто, как и я, не знал всего этого заранее и уже был пойман этой проблемой, я нашел решение.

Несмотря на то, что в документации указано, что очистить промежуточные прокси-серверы невозможно, можно удалить хотя бы кеш Google Cloud.

Чтобы сделать это , перейдите в Облачная консоль Google и откройте свой проект. В левом меню гамбургера перейдите в «Хранилище» -> «Браузер». Там вы должны найти хотя бы один Bucket: your-project-name.appspot.com. В столбце «Жизненный цикл» нажмите на ссылку с именем your-project-name.appspot.com. Удалите все существующие правила, поскольку они могут конфликтовать с тем, которое вы создадите сейчас.

Создайте новое правило, нажав кнопку «Добавить правило». Для условий объекта выберите only параметр 'Newer version' и установите для него значение 1. Не забудьте нажать кнопку "Continue". Для действия выберите «Удалить» и нажмите кнопку «Продолжить». Сохраните ваше новое правило.

Это новое правило вступит в силу до 24 часов, но по крайней мере для моего проекта это заняло всего несколько минут. После того, как он запущен и работает, версия файлов, обслуживаемых вашим приложением под your-project-name.appspot.com , всегда будет последней развернутой , что решит проблему. Кроме того, если вы регулярно редактируете свои статические файлы, вам следует удалить элемент default_expiration из файла app.yaml, что поможет избежать непреднамеренного кэширования другими серверами.

0 голосов
/ 31 июля 2018

Из документов для стандартной среды Pyhton: static_cache_expiration .

После передачи файла с заданным сроком действия как правило, нет способа очистить его от промежуточных кэшей, даже если пользователь очищает свой кеш браузера Повторное развертывание новой версии приложение не будет сбрасывать какие-либо кэши. Поэтому, если вы когда-либо планируете изменить статический файл, он должен иметь короткий (менее одного часа) срок действия время. В большинстве случаев 10-минутное время истечения по умолчанию необходимо.

0 голосов
/ 03 декабря 2014

Вот что у меня сработало:

Сначала я изменил версию на app.yaml .

Затем выполните следующие действия

Перейдите в консоль -> Нажмите на свой проект.

В боковом меню нажмите Вычисления -> Версии :

Там будут все версии, и какая версия по умолчанию. Мой был установлен на более старую версию.

Отметить новую версию.

у меня сработало. Есть проблемы?

0 голосов
/ 06 декабря 2012

Попробуйте очистить кеш в вашем браузере. Возникла точно такая же проблема, и она была исправлена ​​путем простой очистки кэша.

...