我正在构建一个Django Web应用程序,允许用户从计算机系统中选择一张照片并继续填充用户时间线。时间线最初将显示10张照片,然后进行刷新以获取时间线上的下10张照片。
所以我的第一个问题是我能够上传存储在文件系统中的图像,但是如何只显示前10个然后再刷新以获取接下来的10个等等上。
接下来,我希望应用程序的用户体验快速。所以,我正在考虑缓存。所以,我在想,我该缓存什么。由于Django中有3种类型的缓存 - Database cache, MemCache, or FileSystem Caching
。
所以我的 secon 问题是我应该缓存每个用户的前10张照片还是其他什么?
请回答您的建议。
答案 0 :(得分:1)
所以我的第一个问题是我能够上传存储在文件系统中的图像,但是如何只显示前10个然后再刷新以获取下一个10等等。
使用初始逻辑获取前10个,按时间顺序获取下一张照片。您必须有一些与您的照片发布相关的时间戳。根据它获取图像。您可以使用Django Paginator
进行此操作。
我要缓存什么
您想要经常向用户显示的静态数据,并且不会立即更改。您可以按用户或所有用户进行缓存。根据你选择要缓存的内容。
我应该缓存每个用户的前10张照片还是其他东西
取决于你。这些第一张图片对所有用户都是通用的吗?然后你可以缓存。如果没有,并且图片是依赖于用户的,那么就没有必要缓存它们。无论如何,用户必须获取第一张图像。我非常怀疑用户会经常要求前10张相同的照片。再次,这是你的逻辑。如果您认为缓存会有所帮助,您可以继续缓存。
答案 1 :(得分:1)
首先针对类似问题(缓存图像)创建了DiskCache项目。它包含一些功能,可以帮助您有效地缓存和提供图像。 DiskCache是一个Apache2许可的磁盘和文件支持的缓存库,用纯Python编写,并与Django兼容。
diskcache.DjangoCache提供了一个Django兼容的缓存接口,其中包含一些额外的功能。特别是,CGImageRef
和let 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直接从磁盘提供文件。