1
billychow 2010-12-20 20:39:49 +08:00
没问题
没必要 用 HTTP Header 就行了。 |
2
julia OP @billychow HTTP Header?你是说控制浏览器缓存? 我的意思是像生成静态页面那样,不过这个是全放memcache里了。。。
|
4
darasion 2010-12-20 22:56:42 +08:00
我也没多少经验,只是说说。
一下文字中: [内容] 就是最终的一大堆html什么的。 [header] 就是有关浏览器缓存控制和内容类型 的一些 header,,例如'last-modified', 'etag', 'cache-control', 'expires', 'content-type' 等。 我一开始的想法是: 用户第一次访问,如果memcache里边有内容和header,就返回memcache中的内容和header;如果没有就去 datastore 里取,取出后的内容和header都放进memcache。 用户其余的访问,如果memcache里有,对比请求头里边的 if-none-match, last-modified-since 什么的,对上号就直接返回 状态 304,对不上号就跟第一次访问相同。 后来在实践中,发现 GAE 的 memcache 只能保存pickle 后的 1M 大小(实际内容不到1M),所以一些类似图片什么的几百K的稍大一点的文件就不好都放在 memcache 中了(会抛异常)。于是,当经常有比较大的内容的时候,就不保存内容,直接保存 header 到 memcache 。 于是可以这样: 用户第一次访问,直接从datastore里边取出数据生成内容传给浏览器,并将 heade 保存到memcache。 用户其余的访问,对比 memcache 中保存的 header 和 请求头,如果能对上号,就返回 304 。对不上,就进行第一次访问的过程。 |
6
saga 2010-12-21 11:10:11 +08:00
My method, show code:
class Img(PlogRequestHandler): def get(self, albumidStr, imgidStr, name): self.response.headers['Content-Type'] = 'text/html;charset=utf-8' imagecachestring = "ImageA_%s_%s" % (albumidStr, imgidStr) data = None try: data = memcache.get(imagecachestring) except: data = None if data is not None: self.response.headers['Content-Type'] = 'text/html;charset=utf-8' self.write(data) return ...... self.template_values.update({ ...... }) pagecontent = self.render('templates/viewimage.html') memcache.set(imagecachestring, pagecontent, 60) |