我如何一起使用Django,sorl-thumbnail,memcached和S3?

时间:2012-10-11 11:01:34

标签: django amazon-s3 memcached sorl-thumbnail

我有一个项目,我需要开始创建用户上传图像的动态调整大小的缩略图,之前我已经生成了一些特定大小的缩略图。我有一个现有的模型,它代表了一个如下图像:

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文件,然后创建缩略图某处,但我不清楚它在哪里,以及我应该从哪里提供它。现在,这都在本地devserver上,使用memcached(我可以看到设置了缓存条目)。 PIL安装在我的环境中,支持jpeg / png。

1 个答案:

答案 0 :(得分:5)

您可能希望查看Django-storages这是一个很好的AWS S3,可以解决您的问题。除此之外还安装boto,因为django-storage依赖于博托。

然后,您必须将以下内容添加到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中将其写下来。