Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

10.3 Уровни кэша в Django
7 из 16 шагов пройдено
0 из 27 баллов  получено

Кэширование фрагментов шаблона

Кэширование фрагментов шаблона – это подход более высокого уровня.

Для этого необходимо загрузить шаблонные теги кэша в шаблон с помощью {% load cache %}, а затем использовать шаблонный тег {% cache %}, чтобы кэшировать те или иные фрагменты шаблона.

Шаблонный тег обычно применяется следующим образом:

{% load cache %}
{% cache 600 fragment_name %}
    ...
{% endcache %}


Шаблонный тег {% cache %} имеет два обязательных аргумента: тайм-аут в секундах и имя фрагмента. Если тайм-аут равен None, фрагмент кэшируется навсегда.

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

Например, вам может потребоваться отдельная кэшированная копия боковой панели, для каждого пользователя вашего сайта. Это можно сделать, передав один или несколько дополнительных аргументов, которые могут быть переменными с фильтрами или без них, в тег шаблона {%cache %}, чтобы однозначно идентифицировать фрагмент кэша:

{% load cache %}
{% cache 600 sidebar request.user.username %}
    .. sidebar for logged in user ..
{% endcache %}


Если значение настроечного параметра USE_I18N установлено равным True, то сайтовый кеш в промежуточном компоненте будет учитывать активный язык. Если используется шаблонный тег {% cache %}, то для достижения того же результата необходимо использовать одну из имеющихся в шаблонах переводных переменных, например LANGUAGE_CODE.


Для примера попробуем кэшировать заголовок таблицы нашего проекта, для этого отредактируем шаблон base.html следующим образом:

{% load i18n %}
{% load cache %}
{% load static %}
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>{% block title %}{% trans "Books" %}{% endblock title %}</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.3/font/bootstrap-icons.css">
    <link rel="stylesheet" href="{% static 'base.css' %}">
</head>

<body hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'>

    <div class="container">
        <div class="row text-end mt-1">
            <div class="col">
                {% get_current_language as LANGUAGE_CODE %}
                {% get_available_languages as LANGUAGES %}
                {% get_language_info_list for LANGUAGES as languages %}
                {% for language in languages %}
                    {% if language.code == LANGUAGE_CODE %}
                        <u>{{ language.name_local }}</u>
                    {% else %}
                        <a href="/{{ language.code }}/">{{ language.name_local }}</a>
                    {% endif %}
                {% endfor %}
            </div>
        </div>
        <div class="row mt-5">
            <div class="col">
                <!-- Форма для добавления новой книги -->
                {% include "partial_create_book_form.html" %}

                <!-- Таблица книг -->
                <form class="form-inline">
                <table class="table table-bordered table-sm mt-5">
                <!-- Начало кэширования заголовка таблицы -->
                {% cache 600 table_header LANGUAGE_CODE %}
                    {% trans "id" as id %}{% trans "title" as title %}
                    {% trans "author" as author %}{% trans "price" as price %}
                    {% trans "read" as read %}{% trans "ascend" as ascend %}
                    {% trans "descend" as descend %}
                    <thead>
                    <!-- ... -->
                    <!-- ... -->
                    <!-- ... -->
                    </thead>
                {% endcache %}
                <!-- Конец кэширования заголовка таблицы -->
                    <!-- Список книг -->


Обновим пару раз страницу проекта, при первом обновлении видно добавление заголовка таблицы в кэш и извлечение его:


При втором обновлении только извлечение его из кэша:


В данном примере, с помощью кэширования заголовка таблицы мы избавили сервер от бесполезной работы по переводу строковых литералов при каждой загрузке страницы.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий
Нет обсуждений. Начните первое.