1

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

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

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

请回答您的建议。

4

2 回答 2

1

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

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

我要缓存什么

无论您想经常向用户显示什么静态数据并且不会立即更改。您可以为每个用户或所有用户缓存。根据您选择要缓存的内容。

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

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

于 2013-07-30T19:19:49.017 回答
1

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

diskcache.DjangoCache提供了一个与 Django 兼容的缓存接口和一些额外的特性。特别是,getset方法允许读取和写入文件。一个例子:

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

上面的代码从缓存中请求一个文件。如果没有这样的值,它将返回NoneNone将导致with语句引发异常,因为它缺少__exit__方法。在这种情况下,异常被捕获并filename设置为None

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

于 2016-03-19T05:33:09.610 回答