在django中,我编写了一个只返回文件的视图,现在我遇到了问题,因为memcache正在尝试缓存该视图,用它来说,“TypeError:无法腌制文件对象”。
因为我确实需要使用此视图返回文件(我基本上为此视图创建了基于文件的缓存),我需要做的是以某种方式使得memcache无法或不会尝试缓存视图。
我认为这可以通过两种方式完成。首先,阻止视图被缓存(装饰器在这里有意义),其次,阻止URL被缓存。
似乎都没有可能,似乎没有其他人遇到过这个问题,至少在公共互联网上没有。救命?
更新:我已经尝试了@never_cache装饰器,甚至认为它正常工作,但是虽然设置了标题所以其他人们不会缓存内容,我的本地机器仍在使用。
答案 0 :(得分:23)
from django.views.decorators.cache import never_cache
@never_cache
def myview(request):
# ...
Documentation就在这里......
答案 1 :(得分:7)
从视图中返回一个真实的实际文件对象听起来像是错误的。我可以看到返回文件的内容,将这些内容提供给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 :(得分:3)
你可能做了per site cache,但你现在要做的是per view cache。第一个更容易实现,但仅适用于“只是缓存一切”的情况。因为您现在想要为每个视图选择,只需切换到细粒度的方法。它也很容易使用,但请记住,有时您需要创建具有相同内容的第二个视图,如果您希望结果有时被缓存,有时不会,具体取决于URL。
到目前为止,您的问题的答案。但这是你问题的答案吗?为什么要在视图中返回文件?通常静态文件,如视频,图片,CSS,Flash游戏或其他任何东西都应该由服务器本身(甚至是不同的服务器)处理。我猜,这就是你想要在那个视图中做的事情。那是对的吗?不让django这样做的原因是,因为开始django并且让django做它的事情也会占用很多的资源和时间。当您是测试环境中的唯一用户时,您不会感觉到这一点。但是当你想要扩展到数千个或更多用户时,这种东西变得非常讨厌。从逻辑的角度来看,当程序的正常工作是根据数据状态和用户请求生成或更改HTML时,让程序处理文件而不更改它们似乎并不聪明。这就像让你的会计师做编程工作一样。虽然他可能会这样做,但您可能希望其他人这样做并让会计师照顾您的书籍。