ДокументацияРежимы страниц файла

ISR (устаревший при повторной проверке)

Определение

ISR кэширует HTML-код одной страницы для каждого URL-адреса и обслуживает его до истечения срока действия окна. Копия с истекшим сроком действия по-прежнему обслуживается, пока в фоновом режиме отображается новая: то есть устаревшая при повторной проверке.

Как это работает

revalidate = N в заголовке страницы .nexy включает его. N - количество секунд; отсутствие, нулевое или отрицательное значение означает отсутствие кэша вообще.

Ключом кэша является только путь запроса - request.scope["path"]. Строка запроса не является его частью.

Какая ценность
Введите URL-путь (/blog/hello)
Хранение в памяти в процессе рендеринга страницы
Связано 256 записей на процесс, последние использованные вытеснены
Заголовок ответа cache-control: public, s-maxage=N, stale-while-revalidate=N

Жизненный цикл рендеринга

  1. Поступает запрос на страницу, которая объявляет revalidate.
  2. Записей пока нет: страница отображается, сохраняется и возвращается.
  3. Запись моложе N секунд: возвращается как есть, страница не отображается.
  4. Запись старше N секунд: запись stale возвращается немедленно, а фоновая задача отображает новую.
  5. Если этот фоновый рендеринг активируется, устаревшая запись остается, и следующий устаревший запрос пытается повториться.

Когда использовать

  • Один и тот же HTML-код для каждого посетителя: сообщение в блоге, страница продукта, страница документации.
  • Страница читается часто и меняется редко.
  • Данные могут быть датированы несколькими секундами, и никто этого не заметит.

Конфигурация

src/маршруты/блог/index.nexy
---revalidate = 60---<h1>Rendered at most once per minute</h1>

N - простое целое число. В другом месте нет переопределения для каждого маршрута, а обработчики .py не являются страницами: они никогда не попадают в этот кеш.

Пример

Сообщение в блоге, которое читает базу данных:

src/маршруты/блог/[слизняк].nexy
---revalidate = 300slug: prop[str] = "untitled"posts = {"hello": {"title": "Hello"}, "other": {"title": "Other"}}post = posts.get(slug, {"title": "Untitled"})---<h1>{{ post.title }}</h1>

Первый запрос к /blog/hello обрабатывается и сохраняется. Следующие 300 секунд обслуживаются по памяти. /blog/other - это отдельная запись, отображаемая и сохраняемая отдельно. В реальном проекте posts поступает из базы данных или службы, вызываемой один раз при регенерации.

Ограничения

Nexy гарантирует, что ключ кэша является путем, устаревшая копия обслуживается во время регенерации, а хранилище ограничено и потокобезопасно.

По соглашению страница, на которой объявлено revalidate, является общедоступным контентом. Напишите это так, как будто каждый посетитель видит один и тот же HTML-код.

Ваше приложение отвечает за всё остальное:

Ограничение Что это значит
Строка запроса игнорируется. /search?q=a и /search?q=b имеют одну общую запись. Не кэшируйте страницу поиска.
Сеанс не изолирован В ответе говорится public, и HTML-код первого посетителя предоставляется всем. Никогда не читайте сеанс на странице с revalidate.
Нет аннулирования на стороне сервера. Ничто не удаляет запись до закрытия ее окна. revalidate(...) внутри Действие только сообщает браузеру о необходимости перезагрузить путь; он не касается этого кеша.
Один кэш на процесс Несколько рабочих хранят несколько кэшей с разным содержимым.
Параллельные регенерации Ничто не дедуплицирует их: десять устаревших запросов могут запустить десять рендеров.
Ошибки молчат Неудачная регенерация продолжает обслуживать старую страницу; сбой регистрируется, а не возвращается.

Следующие шаги

Изменить на GitHub

Enter открывает результат, Esc закрывает.