错误的网址与Django Sorl缩略图与亚马逊s3

时间:2013-01-10 20:45:04

标签: django amazon-s3 sorl-thumbnail

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

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

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

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

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

图像实际存在于那里,但由于生成的网址错误,我的图像已经破损。在设置文件中,我使用s3boto声明了DEFAULT_FILE_STORAGE,它包含

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

我无法理解为什么sorl缩略图中的路径不包含媒体。

感谢任何帮助。

更新

问题实际上已经复杂化,而不是被解决。我做的是我清除了缩略图中的KVStore并清除了所有数据库。我很高兴,因为我认为问题已经解决,我现在正在获得正确的网址。但后来我刷新了页面,而且我的错误网址也是如此。我不明白发生了什么,如果我清除了缩略图db,它会显示一次正确的URL,之后再次显示错误的URL。

1 个答案:

答案 0 :(得分:31)

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

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

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

您可以使用完整的类而不是工厂来修复它:

class MediaS3BotoStorage(S3BotoStorage):
    location = 'media'

希望有所帮助!