11

我在将 S3 用于媒体文件的 django 项目中使用 sorl 缩略图时遇到了一个非常奇怪的错误。我已按照此答案https://stackoverflow.com/a/12848650/538191中的说明完成了设置,实际上我的所有其他媒体文件都已正确生成。

但是对于通过 sorl 缩略图生成的图像,我得到一个这样的 url

https://he-s3.s3.amazonaws.com/cache/6f/cb/6fcb83175cb63f754fba9facec5dda7f.jpg?Signature=tgDEXyRV3gl3QtK%2BvwliqAtWqpM%3D&Expires=1357853609&AWSAccessKeyId=AKIAJLE6MUHDYS3HN6YQ

这个问题很奇怪,因为它将 S3 存储路径附加到图像 url,但它没有在两者之间添加 /media/。如果你检查

https://he-s3.s3.amazonaws.com/media/cache/6f/cb/6fcb83175cb63f754fba9facec5dda7f.jpg

该图像实际上存在于那里,但由于 url 生成错误,我得到一个损坏的图像。在设置文件中,我使用 s3boto 声明了 DEFAULT_FILE_STORAGE 并且它包含

S3_URL = 'http://he-s3.s3-website-ap-southeast-1.amazonaws.com'
MEDIA_URL = S3_URL + '/media/'

我不明白为什么 sorl 缩略图图像中的路径不包含媒体。

任何帮助表示赞赏。

更新

问题不但没有得到解决,反而变得更加复杂。我所做的是我清除了缩略图中的 KVStore 并清除了所有数据库。我很高兴,因为我认为问题已经解决了,我现在得到了正确的 url。但后来我刷新了页面,我又得到了错误的 url。我不明白发生了什么,如果我清除缩略图数据库,它会显示一次正确的 url,然后再次显示错误的 url。

4

1 回答 1

31

我敢打赌你正在使用这样的东西:

MediaS3BotoStorage = lambda: S3BotoStorage(location='media')

然而,这会导致 sorl-thumbnail 出现问题,因为它使用类名将存储类序列化到缓存中。稍后当它反序列化时,它实例化为没有位置参数的 S3BotoStorage()。这就是为什么它第一次对你有用,但后来又失败了。

您可以通过使用成熟的类而不是工厂来修复它:

class MediaS3BotoStorage(S3BotoStorage):
    location = 'media'

希望有帮助!

于 2013-08-04T18:25:25.597 回答