Отключить кэширование для представления или URL-адреса в django

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

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

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

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

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

Ответ 1

Возвращение реального, фактического файлового объекта из представления звучит как-то не так. Я могу увидеть возврат содержимого файла, подающего это содержимое в объект 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

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

Ответ 2

from django.views.decorators.cache import never_cache

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

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

Ответ 3

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

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