Можно ли отключить кэширование на страницах администратора Django? - PullRequest
2 голосов
/ 15 марта 2019

[дополнительная информация]

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

Существует твердое мнение, что изменение настроек во время выполнения - очень плохая идея .

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

[оригинальный вопрос]

У меня есть веб-сайт на Django по адресу ozake.com , и я часто переписываю части программы или изменяю содержимое страницы.

Каждый раз, когда я над ним работаю, я изменяю settings.py, чтобы отключить кэширование , чтобы я мог видеть свои изменения в реальном времени.

Когда я закончу, я снова включаю кеширование.

Я использую файловое кэширование . Вот соответствующая часть settings.py:

CACHES = {
  'default': {'BACKEND':
 #'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
  'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
  'LOCATION': '/var/www/mysite.com/cache',

Когда я работаю на сайте, я закомментирую последние две строки и раскомментирую пустую строку кэша.

Это означает SSH, заходящий на сайт, изменяющий settings.py, работающий над сайтом и затем модифицирующий его.

Есть ли какой-нибудь способ сделать это флажком где-нибудь в / admin с admin.py?

Ответы [ 5 ]

1 голос
/ 28 марта 2019

Если вы просто хотите аннулировать весь кеш по желанию, вы можете создать тривиальное представление, которое делает это:

file views.py:

from django.core.cache import cache
from django.core.exceptions import PermissionDenied
from django.http import HttpResponse
from django.views.decorators.cache import never_cache

@never_cache
def clear_cache(request):
    if not request.user.is_superuser:
        raise PermissionDenied
    cache.clear()
    return HttpResponse('Cache has been cleared')

file urls.py:

from django.urls import path
from . import views

urlpatterns = [
    ...
    path('clear_cache/', views.clear_cache),
]

, затем вызовите его с помощью браузера:

http://HOST/clear_cache
0 голосов
/ 31 марта 2019

Что я в итоге сделал:

from django.core.cache import cache

def PageView(request):
    ...
    if request.GET.get('clear') == 'cache':
        if request.user.is_superuser:
            title = request.GET.get('flag') + ' ' + title 
            cache.clear()
    ...
    return render(request, template, context)

Так что теперь я могу перейти к https://ozake.com/en/home?clear=cache&flag=sdf

И кеш будет очищен (если я войду встраницы администратора).

Два примечания:

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

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

0 голосов
/ 23 марта 2019

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

  • , чтобы исследовать тонкие ошибки, связанные с кэшированием
  • , чтобы измерить эффективный прирост производительности с реальными производственными данными

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

В основном:

  • Джанго создает экземпляркешировать объект «по умолчанию» один раз при запуске, обрабатывая его как одноэлементный, и использовать его навсегда
  • В нашем пользовательском бэкэнде кэша мы будем хранить внутренний экземпляр двух отдельных объектов («пустышка» и «файл»)на основе кэша) и выставить только один из них через необходимые методы интерфейса
  • Таким образом, мы фактически действуем как прокси класса либо для FileBasedCache, либо для DummyCache
  • Мы можем легко контролировать, какой объектактивен с переменной, таким образом переключая поведение во время выполнения, без необходимости перезапуска Django

Следующее POC было проверено в небольшом тестовом проекте с положительными результатами.

Сначала напишите класс «proxy», который ведет себя как FileBasedCache или DummyCache:

file 'project / mycache.py ':

from django.core.cache.backends.filebased import FileBasedCache
from django.core.cache.backends.dummy import DummyCache
from django.core.cache.backends.base import DEFAULT_TIMEOUT
from constance import config


class MyCache(DummyCache):

    def __init__(self, *args, **kwargs):
        self.dummy_cache = DummyCache(*args, **kwargs)
        self.file_cache = FileBasedCache(*args, **kwargs)

    def _active_cache(self):
        """
        Select either DummyCache or FileBasedCache based on configuration
        """
        return self.file_cache if config.CACHING_ENABLED else self.dummy_cache

    def add(self, key, value, timeout=DEFAULT_TIMEOUT, version=None):
        return self._active_cache().add(key, value, timeout, version)

    def get(self, key, default=None, version=None):
        return self._active_cache().get(key, default, version)

    def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None):
        self._active_cache().set(key, value, timeout, version)

    def touch(self, key, timeout=DEFAULT_TIMEOUT, version=None):
        return self._active_cache().touch(key, timeout, version)

    def delete(self, key, version=None):
        self._active_cache().delete(key, version)

    def has_key(self, key, version=None):
        return self._active_cache().has_key(key, version)

    def clear(self):
        self._active_cache().clear()

и ссылаться на него в настройках проекта следующим образом:

CACHES = {
    'default': {
        'BACKEND': 'project.mycache.MyCache',
        'LOCATION': '/var/www/mysite.com/cache,
    }
}

Обратите внимание, что фактические действия делегированы одному из двух внутренних объектов,в соответствии с текущим значением config.CACHING_ENABLED .Логика кэширования не была повторно реализована в прокси-модели.

Наконец, для управления флагом переключения от администратора (простая часть) определите логическое значение 'CACHING_ENABLED' для django-constance (популярное приложение, которое предоставляет интерфейс администратора для редактирования динамических настроек).

Добавьте это в настройки проекта:

INSTALLED_APPS = [
    ...
    'constance',
    'constance.backends.database',
]

CONSTANCE_BACKEND = 'constance.backends.database.DatabaseBackend'
CONSTANCE_CONFIG = {
    'CACHING_ENABLED': (True, 'Set to False to disable caching'),
}

затем:

pip install django-constance[database]
python manage.py migrate
0 голосов
/ 27 марта 2019

Вы можете использовать модуль django-admin-caching .Сначала установите его в своем терминале bash:

pip install django-admin-caching

После установки добавьте этот фрагмент кода в settings.py, чтобы он автоматически регистрировался:

settings.INSTALLED_APPS = [
   #...
   'django_admin_caching',
   #...
]

Это должно включить кэширование на странице администратора django.

0 голосов
/ 22 марта 2019

Для основного запроса вы можете использовать cache-table .

Альтернативой является использование промежуточного ПО, сравнивающего IP-адрес, который получает запрос, с вашим конкретным IP-адресом, который вы можете сохранить в своих настройках. Как то так:

from django.http import HttpRequest
def get_user_ip(request):
    client_address = request.META['HTTPS_X_FORWARDED_FOR']
    if your_ip == client_address:
        save_user_ip()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...