代码之家  ›  专栏  ›  技术社区  ›  mlissner

禁用django中视图或url的缓存

  •  14
  • mlissner  · 技术社区  · 14 年前

    在django中,我编写了一个只返回文件的视图,现在我遇到了问题,因为memcache正在尝试缓存该视图,换句话说,“TypeError:cannotpicklefileobjects”。

    因为我确实需要用这个视图返回文件(我已经为这个视图创建了一个基于文件的缓存),所以我需要做的是以某种方式使memcache不能或者不会尝试缓存视图。

    两者似乎都不可能,而且似乎没有其他人遇到过这个问题,至少在公共互联网上没有。救命啊?

    我试过@never\u缓存装饰器,甚至认为它可以工作,但是当它设置头的时候 其他

    3 回复  |  直到 14 年前
        1
  •  8
  •   Unoti    14 年前

    从一个视图返回一个真实的文件对象听起来像是出了什么问题。我能看见他回来了 目录

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

    我猜如果你完全关闭缓存设置.py,则“无法pickle a file object”将变为“view must return an http response object”

    如果我对所发生的事情持正确态度,那么这里有几个想法。

    如果确实需要文件,请执行以下操作:

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

    这将解决您的“无法pickle文件”问题。

        2
  •  29
  •   Mp0int    14 年前
    from django.views.decorators.cache import never_cache
    
    @never_cache
    def myview(request):
        # ...
    

    Documentation 在这里。。。

        3
  •  3
  •   erikbstack    14 年前

    你可能做了一件坏事 per site cache ,但你现在要做的是 per view cache . 第一种更容易实现,但仅适用于“缓存所有内容”的情况。因为您现在要为每个视图选择,所以只需切换到细粒度方法。它也很容易使用,但请记住,如果您希望结果有时缓存,有时不缓存,则有时需要创建具有相同内容的第二个视图,具体取决于url。

    到目前为止你的问题的答案。但这是你问题的答案吗?为什么在视图中返回文件?通常静态文件,如视频、图片、css、flash游戏等,都应该由服务器自己(甚至由其他服务器)处理。我想,这就是你在那种观点下想做的。对吗?不让django这样做的原因是,因为启动django并让django做它的事情也会消耗大量的精力和时间。当您是测试环境中唯一的用户时,您不会有这种感觉。但是当你想扩展到上千个或更多的用户时,这类事情就变得非常糟糕了。同样从逻辑的角度来看,当程序的正常工作是根据数据状态和用户请求生成或更改HTML时,让程序在不更改文件的情况下处理文件似乎并不明智。就像让你的会计做编程工作一样。虽然他可能能做到,但你可能希望其他人去做,让会计来处理你的账目。