[python-chinese] django缓存机制?

2 views
Skip to first unread message

老生

unread,
Mar 28, 2007, 5:24:49 AM3/28/07
to python-...@lists.python.cn
这两天研究django缓存,实在恼火,
 
数据的缓存是没什么问题,即:设置 cache.set("test",data, 60*60*24),读取 cache.get("test"),
 
在views.py的方法前设置缓存如: @cache_page(10*60),执行提示 'function' object has no attribute 'method',
 
以上是在WIN上进行测试的,原本以为是setting.py文件中设置的缓存类型不支持,如:CACHE_BACKEND = 'locmem:///c:/tem/,而公司服务器上使用的linux系统,所以今天一整天就在linux环境来进行调试。。。。
 
安装memcached,启动,再进行测试,按照在win上设置@cache_page(10*60)依然出现同样错误提示,如:'function' object has no attribute 'method'
 
换种方式,在urls.py中设置,如(r'^c(?P<cateid>\w+)-b1/$',cache_page(VerifyPostList,10*60)),不会出任何错误提示,这里不知道怎么来测试是否是在取缓存里的东西,所以用种很老土的方式测试,,
 
1、关闭memcached,重启机器,在urls.py中不设置缓存,打印程序执行时间,
 
2、开启memcached,重启机器,在urls.py中设置缓存,打印程序执行时间,
 
如此重复以上几个布置,NND,发现两种布置程序执行的时间都差不多,,,
 
网上查找了好多资料,包括英文 都没发现有django中cache实现原理的资料,看源码的话,想必大家都知道python中的源码实在是难看懂。。。
 
 
 
说了这么多,还是总结以下我的问题及想要了解的东西吧,
 
 
问题一:有兄弟用过@cache_page并成功过的吗?
 
问题二:在views.py中定义的@cache_page与在urls.py中定义的cache_page有什么不同?为何我以上调试测试程序的执行时间都一样?
 
问题三:想实现能找到cache_page中缓存页面的机制,即想在cache中找到缓存页面的key,这样或许有可能我们在后台程序里可以直接获得与修改这个key中的值。。
 
 
 

yi huang

unread,
Mar 28, 2007, 7:31:15 AM3/28/07
to python-...@lists.python.cn
我看了下代码,cache_page 不是标准的 decorator ,不能 @cache_page 这么用。
另外,python 代码很好看啊,怎么会难看懂呢。大部分代码都是平坦的一层,极少看到深层的抽象。
 
cache_page 在 views/decorators.py line 18 定义。
decorator_from_middleware 函数在 utils/decorators.py ,它返回一个 decorator ,作用是在调用 views 的前后调用相应的 middleware 代码(process_request, process_view, process_response)。middleware 放在 settings 里面是对整个站点起作用,而这个函数实际是让 middleware 只对单个views 起作用。
这里 middleware 就是 middleware/cache.py 的 CacheMiddleware 了,他去使用 django.core.cache 包,这里是真正实现 cache 的地方。
core/cache/__init__.py 根据配置创建 cache 对象。cache 对象的实现就在 backends 包中不同的后端中,这些后端中的 CacheClass 类都实现了同一个协议 (get, set ,delete, get_many, has_key)。
memcached.py 的代码也很少,就是调用 memcache 模块的 api 而已。
 
_______________________________________________
python-chinese
Post: send python-...@lists.python.cn
Subscribe: send subscribe to python-chin...@lists.python.cn
Unsubscribe: send unsubscribe to   python-chin...@lists.python.cn
Detail Info: http://python.cn/mailman/listinfo/python-chinese



--
http://codeplayer.blogspot.com/

yi huang

unread,
Mar 28, 2007, 7:36:21 AM3/28/07
to python-...@lists.python.cn
事实上,如果可以从缓存中取到数据的话,是根本不会调用你的 view 代码的,你想测试缓存是否真的起了作用的话,在 view 里面做手脚就可以,比如 log 个 helloworld,然后多次请求发现确实只有一个 helloworld 。 

On 3/28/07, 老生 <liangzh...@gmail.com> wrote:
_______________________________________________
python-chinese
Post: send python-...@lists.python.cn
Subscribe: send subscribe to python-chin...@lists.python.cn
Unsubscribe: send unsubscribe to   python-chin...@lists.python.cn
Detail Info: http://python.cn/mailman/listinfo/python-chinese



--
http://codeplayer.blogspot.com/

老生

unread,
Mar 28, 2007, 10:03:56 PM3/28/07
to python-...@lists.python.cn
谢谢yi huang ,在官方的文档上就这么写的python2.4或者以上的版本可以使用 @cache_page,真汗呀。。。
 
昨天晚上回家也想了很久,打算今天从头进行开始调试,看了你的分析,着实学习到不少。。
 
先谢了,有问题再向大家讨教。。。  

 
在07-3-28,yi huang <yi.cod...@gmail.com> 写道:

pength

unread,
Mar 29, 2007, 1:50:53 AM3/29/07
to python.cn
学习。。。。顺便请教个问题,django部署在dreamhost上,是不是不支持memcache方式,只能用filecache?印象中在某个地
方看到了这样一句话,不过实在想不起来了。;(

On Mar 29, 10:03 am, "老生" <liangzhengzh...@gmail.com> wrote:
> 谢谢*yi huang* ,在官方的文档上就这么写的python2.4或者以上的版本可以使用 @cache_page,真汗呀。。。


>
> 昨天晚上回家也想了很久,打算今天从头进行开始调试,看了你的分析,着实学习到不少。。
>
> 先谢了,有问题再向大家讨教。。。
>

> 在07-3-28,yi huang <yi.codepla...@gmail.com> 写道:


>
>
>
>
>
> > 我看了下代码,cache_page 不是标准的 decorator ,不能 @cache_page 这么用。
> > 另外,python 代码很好看啊,怎么会难看懂呢。大部分代码都是平坦的一层,极少看到深层的抽象。
>
> > cache_page 在 views/decorators.py line 18 定义。
> > decorator_from_middleware 函数在 utils/decorators.py ,它返回一个 decorator ,作用是在调用
> > views 的前后调用相应的 middleware 代码(process_request, process_view,
> > process_response)。middleware 放在 settings 里面是对整个站点起作用,而这个函数实际是让 middleware
> > 只对单个views 起作用。
> > 这里 middleware 就是 middleware/cache.py 的 CacheMiddleware 了,他去使用
> > django.core.cache 包,这里是真正实现 cache 的地方。
> > core/cache/__init__.py 根据配置创建 cache 对象。cache 对象的实现就在 backends
> > 包中不同的后端中,这些后端中的 CacheClass 类都实现了同一个协议 (get, set ,delete, get_many, has_key)。
> > memcached.py 的代码也很少,就是调用 memcache 模块的 api 而已。
>

> > On 3/28/07, 老生 <liangzhengzh...@gmail.com> wrote:
>
> > > 这两天研究django缓存,实在恼火,
>
> > > 数据的缓存是没什么问题,即:设置 cache.set("test",data, 60*60*24),读取 cache.get("test"),
>
> > > 在views.py的方法前设置缓存如: @cache_page(10*60),执行提示 'function' object has no
> > > attribute 'method',
>
> > > 以上是在WIN上进行测试的,原本以为是setting.py文件中设置的缓存类型不支持,如:CACHE_BACKEND =
> > > 'locmem:///c:/tem/,而公司服务器上使用的linux系统,所以今天一整天就在linux环境来进行调试。。。。
>
> > > 安装memcached,启动,再进行测试,按照在win上设置@cache_page(10*60)依然出现同样错误提示,如:'function'
> > > object has no attribute 'method'
>
> > > 换种方式,在urls.py中设置,

> > > 如(r'^c(?P<cateid>\w+)-b1/$',cache_page(VerifyPostList,10*60)),不会出任何错误提示,这里不-知道怎么来测试是否是在取缓存里的东西,所以用种很老土的方式测试,,


>
> > > 1、关闭memcached,重启机器,在urls.py中不设置缓存,打印程序执行时间,
>
> > > 2、开启memcached,重启机器,在urls.py中设置缓存,打印程序执行时间,
>
> > > 如此重复以上几个布置,NND,发现两种布置程序执行的时间都差不多,,,
>
> > > 网上查找了好多资料,包括英文 都没发现有django中cache实现原理的资料,看源码的话,想必大家都知道python中的源码实在是难看懂。。。
>
> > > 说了这么多,还是总结以下我的问题及想要了解的东西吧,
>
> > > 问题一:有兄弟用过@cache_page并成功过的吗?
>
> > > 问题二:在views.py中定义的@cache_page与在urls.py中定义的cache_page
> > > 有什么不同?为何我以上调试测试程序的执行时间都一样?
>

> > > 问题三:想实现能找到cache_page中缓存页面的机制,即想在cache中找到缓存页面的key,这样或许有可能我们在后台程序里可以直接获得与修改这个-key中的值。。
>
> > > _______________________________________________
> > > python-chinese
> > > Post: send python-chin...@lists.python.cn
> > > Subscribe: send subscribe to python-chinese-requ...@lists.python.cn
> > > Unsubscribe: send unsubscribe to
> > > python-chinese-requ...@lists.python.cn


> > > Detail Info:http://python.cn/mailman/listinfo/python-chinese
>
> > --
> >http://codeplayer.blogspot.com/
> > _______________________________________________
> > python-chinese

> > Post: send python-chin...@lists.python.cn
> > Subscribe: send subscribe to python-chinese-requ...@lists.python.cn
> > Unsubscribe: send unsubscribe to python-chinese-requ...@lists.python.cn
> > Detail Info:http://python.cn/mailman/listinfo/python-chinese
>
>
>
> _______________________________________________
> python-chinese
> Post: send python-chin...@lists.python.cn
> Subscribe: send subscribe to python-chinese-requ...@lists.python.cn
> Unsubscribe: send unsubscribe to python-chinese-requ...@lists.python.cn
> Detail Info:http://python.cn/mailman/listinfo/python-chinese- Hide quoted text -
>
> - Show quoted text -

老生

unread,
Mar 30, 2007, 1:27:53 AM3/30/07
to python-...@lists.python.cn
今天总算是调通了django中的cache的cache_page,昨天在调试中出现一个低级的错误,django与memcache根本没交互,问题在于启动memcache时没绑定IP,原先以为它默认就127.0.0.1,现在指定IP就可以正常调试了。。。
 
 
Reply all
Reply to author
Forward
0 new messages