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

Gre*_*nch 5 django memcached amazon-s3 sorl-thumbnail

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

class Image(models.Model):
  original = models.URLField()
  small = models.URLField()
  medium = models.URLField()
  large = models.URLField()
Run Code Online (Sandbox Code Playgroud)

其中每个都填入了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 %}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*han 5

你可能想看看Django-storage这是一个很好的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/'
Run Code Online (Sandbox Code Playgroud)

然后,您的缓存将存储在AWS S3上.

我希望它有所帮助

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

  • 非常感谢,这有效。这是我需要的“DEFAULT_FILE_STORAGE”设置。我有一种感觉,我把所有的部分都放在那里,只是没有把它们正确地放在一起。 (2认同)