Отключить кэширование статических файлов на сервере разработки Django - PullRequest
29 голосов
/ 10 августа 2011

Есть ли простой способ отключить кэширование статических файлов на сервере разработки Django?

Я запускаю сервер стандартной командой:

$ python manage.py runserver

Я настроил settings.py для обслуживания статических файлов из каталога /static моего проекта Django.У меня также есть класс промежуточного программного обеспечения, который устанавливает для заголовка Cache-Control значение must-revalidate, no-cache для разработки, но это, похоже, влияет только на URL, которых нет в моем каталоге /static.

Ответы [ 9 ]

19 голосов
/ 10 августа 2011

@ Ответ Эрика Форсберга сработал для меня.Вот что я должен был сделать:

  • Закомментируйте приложение staticfiles из INSTALLED_APPS in settings.py:

    INSTALLED_APPS = (
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.sites',
        'django.contrib.messages',
        #'django.contrib.staticfiles',
    )
    
  • Оставьте мойSTATIC_URL переменная установлена ​​в settings.py:

    STATIC_URL = '/static/'
    
  • Добавить запись в базу моего проекта urls.py:

    # static files w/ no-cache headers
    url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
        {'document_root': settings.STATIC_ROOT}),
    

Обратите внимание, что я также устанавливаю Cache-Control заголовки в классе промежуточного программного обеспечения nocache.py:

class NoCache(object):
    def process_response(self, request, response):
        """
        set the "Cache-Control" header to "must-revalidate, no-cache"
        """
        if request.path.startswith('/static/'):
            response['Cache-Control'] = 'must-revalidate, no-cache'
        return response

И затем включаю это в settings.py:

if DEBUG:
    MIDDLEWARE_CLASSES = (
        'django.middleware.common.CommonMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'nocache.NoCache',
    )
16 голосов
/ 10 августа 2013

Приложение Django contrib.staticfiles автоматически подает вам статические файлы, переопределяя команду runserver. С этой конфигурацией вы не можете управлять тем, как она обслуживает статические файлы.

Вы можете запретить приложению staticfiles предоставлять статические файлы, добавив параметр --nostatic в команду runserver:

./manage.py runserver --nostatic

Затем вы можете написать URL-конфигурацию, чтобы вручную обрабатывать статические файлы с заголовками, которые не позволяют браузеру кэшировать ответ:

from django.conf import settings
from django.contrib.staticfiles.views import serve as serve_static
from django.views.decorators.cache import never_cache

urlpatterns = patterns('', )

if settings.DEBUG:
    urlpatterns += patterns('',
        url(r'^static/(?P<path>.*)$', never_cache(serve_static)),
    )

Если вы хотите, чтобы в вашей команде manage.py runserver была включена опция --nostatic по умолчанию, вы можете указать это в вашем manage.py:

if '--nostatic' not in sys.argv:
    sys.argv.append('--nostatic')
9 голосов
/ 07 июля 2012

Мое очень простое решение:

from django.contrib.staticfiles.views import serve
from django.views.decorators.cache import never_cache

static_view = never_cache(serve)
urlpatterns += static_view(settings.MEDIA_URL,
                           document_root=settings.MEDIA_ROOT)
9 голосов
/ 10 августа 2011

Предполагая, что вы используете django.views.static.serve, это не похоже на это - но написание собственного представления, которое просто вызывает django.views.static.serve, добавить заголовок Cache-Control должно быть довольно просто.

2 голосов
/ 16 января 2019

В новых версиях Django очень простое решение - изменить URL проекта следующим образом:

from django.conf.urls.static import static
from django.contrib.staticfiles.views import serve
from django.views.decorators.cache import cache_control

# YOUR urlpatterns here... 

if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, view=cache_control(no_cache=True, must_revalidate=True)(serve))

Я пришел к этому, посмотрев, как staticfiles автоматически изменяет URL-адреса, и просто добавив декоратор вида. Я действительно не понимаю, почему это не по умолчанию, а только для разработки. Представление может правильно обрабатывать HTTP-заголовок «If-Modified-Since», поэтому запрос всегда выполняется, но содержимое передается только при изменениях (судя по просмотру метки времени изменения в файле).

Чтобы это работало, вы должны добавить --nostatic при использовании runserver, в противном случае вышеуказанные изменения просто игнорируются.

ВАЖНОЕ РЕДАКТИРОВАНИЕ: То, что у меня было раньше, не работало, потому что я не использовал --nostatic, а декоратор never_cache также включал no-store, что означало, что неизмененные файлы всегда были перенесены повторно вместо возврата 304 Not Modified

1 голос
/ 03 апреля 2019

Используйте whitenoise. Существует много проблем со статической обработкой файлов в runserver, и все они уже исправлены в whitenoise. Это также намного быстрее. Они говорили о том, чтобы просто заменить встроенную статическую сервировку , но никто до сих пор не обошел ее.

Шаги, чтобы использовать его в разработке ...

Установить с pip install whitenoise

Добавьте следующее в конец settings.py:

if DEBUG:
    MIDDLEWARE = (
        'whitenoise.middleware.WhiteNoiseMiddleware',
    ) + MIDDLEWARE
    INSTALLED_APPS = (
        'whitenoise.runserver_nostatic',
    ) + INSTALLED_APPS
1 голос
/ 29 августа 2018

Для более новых Django способ написания классов промежуточного программного обеспечения немного изменился.

Следуйте всем инструкциям из @aaronstacy выше, но для класса промежуточного программного обеспечения используйте это:

class NoCache(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        response['Cache-Control'] = 'must-revalidate, no-cache'
        return response
0 голосов
/ 09 марта 2019

Это так просто, если вы используете Django 2.0 +

Шаг 1: Создайте django.contrib.staticfiles в качестве комментария в settings.py (Уровень проекта)

INSTALLED_APPS = [

# 'django.contrib.staticfiles',

]

Шаг 2: импорт подписок в urls.py (уровень проекта)

     from django.conf.urls.static import static

     from django.contrib.staticfiles.views import serve

     from django.views.decorators.cache import never_cache

     from . import settings

Шаг 3: добавление следующей строки в urls.py(уровень проекта) после urlpatterns

urlpatterns = [

]

if settings.DEBUG:

    urlpatterns += static(settings.STATIC_URL, view=never_cache(serve))

Убедитесь, что STATIC_URL объявлен в ваших settings.py

STATIC_URL = '/static/'
0 голосов
/ 21 декабря 2017

Это ничего не значит с Django, потому что ничего не изменилось после переустановки Django с помощью pip.

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

Хром Очистить кеш и куки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...