Отключить кэширование для представления или URL-адреса в Django - PullRequest
14 голосов
/ 15 сентября 2010

В django я написал представление, которое просто возвращает файл, и теперь у меня возникают проблемы, потому что memcache пытается кэшировать это представление, и, по его словам, «TypeError: не может выбрать объекты файла».

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

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

Ни то, ни другое кажется невозможным, и никто другой, похоже, не сталкивался с этой проблемой, по крайней мере, в общественных сетях. Помогите?

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

Ответы [ 3 ]

23 голосов
/ 15 сентября 2010
from django.views.decorators.cache import never_cache

@never_cache
def myview(request):
    # ...

Документация здесь ...

7 голосов
/ 15 сентября 2010

Возвращение реального, фактического файлового объекта из представления звучит так, как будто что-то не так.Я вижу возвращение содержимого файла и подачу этого содержимого в объект HttpResponse.Если я вас правильно понимаю, вы кэшируете результаты этого представления в файл.Примерно так:

def myview(request):
    file = open('somefile.txt','r')
    return file    # This isn't gonna work. You need to return an HttpRequest object.

Я предполагаю, что если вы полностью отключите кеширование в settings.py, ваше «не может выбрать объект файла» превратится в «представление должно вернуть ответ httpобъект. "

Если я нахожусь на правильном пути с тем, что происходит, то вот пара идей.

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

Если вы действительно хотите файл, то сделайте что-то вроде:

def myview(request):
    file = open('somefile.txt','r')
    contents = file.read()
    resp = HttpRespnse()
    resp.write(contents)
    file.close()
    return resp

Это решит вашу проблему "не может засечь файл"проблема.

3 голосов
/ 21 сентября 2010

Вы, вероятно, сделали на кеш сайта , но сейчас вы хотите сделать на кеш просмотра .Первый легче реализовать, но он предназначен только для случая «просто кэширования всего».Поскольку вы хотите выбирать для каждого вида сейчас, просто переключитесь на детальный подход.Он также очень прост в использовании, но помните, что иногда вам нужно создать второе представление с тем же содержимым, если вы хотите, чтобы результат иногда кэшировался, а иногда нет, в зависимости от URL.

Покана ответ на ваш вопрос.Но это ответ на вашу проблему?Почему вы возвращаете файлы в виде?Обычно статические файлы, такие как видео, картинки, CSS, флеш-игры или что-то еще, должны обрабатываться самим сервером (или даже другим сервером).И я полагаю, это то, что вы хотите сделать с этой точки зрения.Это верно?Причина, по которой Джанго не делает этого, заключается в том, что запуск Джанго и то, что Джанго делает свое дело, также отнимает много ресурсов и времени.Вы не чувствуете этого, когда вы единственный пользователь в вашей тестовой среде.Но если вы хотите масштабировать до нескольких тысяч пользователей или более, то такие вещи становятся очень неприятными.Также с логической точки зрения кажется неуместным позволить программе обрабатывать файлы без их изменения, когда обычная задача программы - генерировать или изменять HTML в соответствии с состоянием ваших данных и пользовательским запросом.Это как позволить бухгалтеру заниматься программированием.Хотя он может это сделать, вы, вероятно, захотите, чтобы кто-то другой сделал это, и пусть бухгалтер позаботится о ваших книгах.

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