2013-01-10 23 views
11

Tôi đang gặp lỗi rất lạ khi sử dụng hình thu nhỏ sorl trong dự án django sử dụng S3 cho các tệp phương tiện. Tôi đã thực hiện các cài đặt của mình như được chỉ ra trong câu trả lời https://stackoverflow.com/a/12848650/538191 và trên thực tế tất cả các tệp phương tiện khác của tôi đang được tạo chính xác.Url sai với hình thu nhỏ Django Sorl với Amazon s3

Nhưng đối với những hình ảnh được tạo ra thông qua hình thu nhỏ sorl Tôi nhận được một url như thế này

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

Vấn đề là lạ bởi vì nó phụ thêm đường dẫn lưu trữ S3 để url hình ảnh, nhưng nó không thêm/phương tiện truyền thông/ở giữa. Nếu bạn kiểm tra

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

hình ảnh thực sự tồn tại ở đó, nhưng kể từ khi url đang được tạo sai, tôi nhận được một hình ảnh bị hỏng. Trong tập tin cài đặt tôi đã tuyên bố DEFAULT_FILE_STORAGE sử dụng s3boto và nó chứa

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

Tôi không hiểu tại sao con đường trong hình ảnh thumbnail sorl không chứa phương tiện truyền thông.

Mọi trợ giúp đều được đánh giá cao.

Cập nhật

Thay vì được giải quyết, vấn đề có trong thực tế phức tạp. Những gì tôi đã làm là tôi xóa KVStore trong hình thu nhỏ và tất cả các cơ sở dữ liệu đã được xóa. Tôi rất vui vì tôi nghĩ rằng vấn đề đã được giải quyết, tôi đã nhận được đúng url ngay bây giờ. Nhưng sau đó tôi làm mới trang, và một lần nữa tôi đã nhận được các url sai. Tôi không hiểu điều gì đang xảy ra, nếu tôi xóa hình thu nhỏ db, nó sẽ hiển thị url chính xác một lần và sau đó lại hiển thị url sai.

+1

Đầu tiên là các url bảo mật, trước tiên hãy đảm bảo cài đặt AWS_S3_SECURE_URLS là Sai hoặc cài đặt AWS_S3_CUSTOM_DOMAIN được thiết lập –

+1

Tôi cũng gặp phải sự cố tương tự. Nếu DEFAULT_FILE_STORAGE của bạn được đặt là S3, bạn có thể giữ MEDIA_URL = '/ media /'. Nhưng thêm AWS thiết lập AWS_LOCATION = '/ media /'. Tôi nghĩ điều này sẽ giải quyết được vấn đề của bạn. – chhantyal

Trả lời

28

Tôi sẽ đặt cược rằng bạn đang sử dụng một cái gì đó như thế này:

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

Tuy nhiên điều này gây ra các vấn đề trong sorl-thumbnail vì nó serializes lớp lưu trữ vào bộ nhớ cache bằng cách sử dụng tên lớp. Sau đó khi nó deserializes, nó instantiates như S3BotoStorage() mà không có tham số vị trí. Đó là lý do tại sao nó hoạt động lần đầu tiên cho bạn nhưng sau đó không thành công.

Bạn có thể sửa chữa nó bằng cách sử dụng một lớp học chính thức thay vì một nhà máy:

class MediaS3BotoStorage(S3BotoStorage): 
    location = 'media' 

Hy vọng rằng sẽ giúp!

+1

Cảm ơn! Lưu ngày của tôi! –

+1

Cảm ơn rất lớn :) –

+0

Nếu gặp vấn đề này vào năm 2017 với boto3 == 1.4.3, bạn nên sử dụng MediaRootS3BotoStorage thay thế. –

Các vấn đề liên quan