Django Cache + Django数据库请求

时间:2013-07-30 18:29:25

标签: django django-database django-cache django-caching

我正在构建一个Django Web应用程序,允许用户从计算机系统中选择一张照片并继续填充用户时间线。时间线最初将显示10张照片,然后进行刷新以获取时间线上的下10张照片。

所以我的第一个问题是我能够上传存储在文件系统中的图像,但是如何只显示前10个然后再刷新以获取接下来的10个等等上。

接下来,我希望应用程序的用户体验快速。所以,我正在考虑缓存。所以,我在想,我该缓存什么。由于Django中有3种类型的缓存 - Database cache, MemCache, or FileSystem Caching。 所以我的 secon 问题是我应该缓存每个用户的前10张照片还是其他什么?

请回答您的建议。

2 个答案:

答案 0 :(得分:1)

  

所以我的第一个问题是我能够上传存储在文件系统中的图像,但是如何只显示前10个然后再刷新以获取下一个10等等。

使用初始逻辑获取前10个,按时间顺序获取下一张照片。您必须有一些与您的照片发布相关的时间戳。根据它获取图像。您可以使用Django Paginator进行此操作。

  

我要缓存什么

您想要经常向用户显示的静态数据,并且不会立即更改。您可以按用户或所有用户进行缓存。根据你选择要缓存的内容。

  

我应该缓存每个用户的前10张照片还是其他东西

取决于你。这些第一张图片对所有用户都是通用的吗?然后你可以缓存。如果没有,并且图片是依赖于用户的,那么就没有必要缓存它们。无论如何,用户必须获取第一张图像。我非常怀疑用户会经常要求前10张相同的照片。再次,这是你的逻辑。如果您认为缓存会有所帮助,您可以继续缓存。

答案 1 :(得分:1)

首先针对类似问题(缓存图像)创建了DiskCache项目。它包含一些功能,可以帮助您有效地缓存和提供图像。 DiskCache是​​一个Apache2许可的磁盘和文件支持的缓存库,用纯Python编写,并与Django兼容。

diskcache.DjangoCache提供了一个Django兼容的缓存接口,其中包含一些额外的功能。特别是,CGImageReflet imgRef: CGImageRef = CGImageCreateWithImageInRect(img.CGImage, rect)! let croppedImg = UIImage(CGImage: imgRef, scale: 1, orientation: .Up) let imgSize = CGSize(width: Conf.Size.avatarSize.width, height: Conf.Size.avatarSize.width) UIGraphicsBeginImageContextWithOptions(imgSize, false, 1.0) croppedImg.drawInRect(CGRect(origin: CGPointZero, size: imgSize)) let savingImgContext = UIGraphicsGetCurrentContext() UIGraphicsEndImageContext() if let savingImgRef: CGImageRef = CGBitmapContextCreateImage(savingImgContext) { let savingImg = UIImage(CGImage: savingImgRef, scale: 1, orientation: .Up) UIImageWriteToSavedPhotosAlbum(savingImg, nil, nil, nil) } 方法允许读取和写入文件。一个例子:

get

稍后您可以获得对该文件的引用:

set

如果您只是想要磁盘上的文件名(在缓存中):

from django.core.cache import cache

with open('filename.jpg', 'rb') as reader:
    cache.set('filename.jpg', reader, read=True)

上面的代码从缓存中请求文件。如果没有这样的值,它将返回reader = cache.get('filename.jpg', read=True) try: with cache.get('filename.jpg', read=True) as reader: filename = reader.name except AttributeError: filename = None 会导致None语句引发异常,因为它缺少None方法。在这种情况下,会捕获异常并将with设置为__exit__

使用文件名,您可以使用X-Accel-Redirect之类的内容告诉Nginx直接从磁盘提供文件。