7

我有一个项目,我需要开始创建用户上传图像的动态调整大小的缩略图,以前我一直在生成一些特定大小的缩略图。我有一个现有的模型,它代表一个看起来像这样的图像:

class Image(models.Model):
  original = models.URLField()
  small = models.URLField()
  medium = models.URLField()
  large = models.URLField()

其中每一个都填写了指向 S3 上相应图像的 URL。在上传时,所有版本都被创建(实际上是在不久之后,通过计划任务),存储在 S3 中,然后在模型上设置。展望未来,我们的设计需要为每个缩略图提供许多不同的大小,因此将它们全部存储在数据库中是不切实际的。我想original在模板中保留并即时完成其余的工作。

所以这就是我来到sorl-thumbnail的地方。它似乎打算做我想做的事,但我有点迷失它应该如何工作(目前还没有)。作为一项测试,我制作了一个基本视图/模板,其中列出了一些图像并尝试对其进行缩略图,就像教程一样:

{% for img in image_set %}
  {% thumbnail img.original "180x180" crop="center" format="PNG" as im %}
  <img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
  {% endthumbnail %}
{% endfor %}

最终会为文件生成一个 URL,例如cache/84/8f/848fb078f2e8d35aecd92150c6fa6843.png(404s)。我不确定我是否了解该文件应该存储在哪里。我假设它正在拉入 S3 文件,然后在某处创建缩略图,但我不清楚那在哪里,以及我应该从哪里提供它。这一切现在都在本地开发服务器上,使用 memcached(我可以看到正在设置缓存条目)。PIL 安装在我的环境中,支持 jpeg/png。

4

1 回答 1

6

您可能想查看Django- storages,它是一个不错的AWS S3,可以为您解决问题。除此之外,还安装boto,因为 django-storage 依赖于 boto。

然后您必须将以下内容添加到您的 settings.py

import os

AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = '<YOUR BUCKET NAME>'

STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'

STATIC_URL = 'http://' + AWS_STORAGE_BUCKET_NAME + '.s3.amazonaws.com/'
ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/'

然后您的缓存将存储在 AWS S3 本身上。

我希望它有帮助

注意:出于安全原因,最好将您的 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 添加为环境变量,而不是直接将它们写在 setting.py 中。

于 2012-10-11T21:16:19.227 回答