2011-10-08 31 views
27

Tôi đang cố gắng thiết lập django-compressordjango-staticfiles để CSS/Javascript nén và hình ảnh được phân phát từ S3 của Amazon.Làm thế nào để cấu hình django-máy nén và django-staticfiles với S3 của Amazon?

Tôi đã quản lý thiết lập các tệp tĩnh bằng cách sử dụng S3 làm phần phụ trợ để lệnh collectstatic gửi các tệp tới S3 thay vì STATIC_ROOT.

Tuy nhiên, khi cố gắng thêm django-compressor vào danh sách kết hợp là tất cả mọi thứ dường như bị xáo trộn đối với tôi. Theo sau documentation khi thiết lập kho từ xa tôi đã tạo một lớp con của phần cuối lưu trữ, boto, vì vậy tôi đã sao chép example đến storage.py. Khi tôi bắt đầu sử dụng phần phụ trợ được lưu trữ này, các tệp được sao chép vào static_media chứ không phải S3. Sau khi trang đầu tiên tải thư mục CACHE xuất hiện trên S3 và trong thư mục static_media.

Đặt STATICFILES_STORAGECOMPRESS_STORAGE quay lại lớp S3 bình thường của boto (storages.backends.s3boto.S3BotoStorage) dẫn đến nội dung tĩnh được thu thập vào thùng S3 và không có thư mục static_media. Tuy nhiên cố gắng tải lại trang ném lỗi:

Caught NotImplementedError while rendering: This backend doesn't support absolute paths. 

nổi bật {% compress css %} như thẻ và compressor/base.py như nguồn gốc.

Các s3/staticfiles/phần nén của tôi settings.py:

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage' 
AWS_ACCESS_KEY_ID = 'key' 
AWS_SECRET_ACCESS_KEY ='secret' 
AWS_STORAGE_BUCKET_NAME = 'my-bucket' 
S3_URL = 'http://my-bucket.s3.amazonaws.com/' 

MEDIA_ROOT = 'client_media' 
MEDIA_URL = '/media/' 
STATIC_ROOT = 'static_media' 
STATIC_URL = S3_URL 
ADMIN_MEDIA_PREFIX = S3_URL + 'admin/' 
STATICFILES_DIRS = (
    join(DIRNAME, 'static'), 
) 
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
    'compressor.finders.CompressorFinder', 
) 

COMPRESS_ENABLED = True 
COMPRESS_URL = S3_URL 
COMPRESS_ROOT = STATIC_ROOT 
COMPRESS_STORAGE = 'storage.CachedS3BotoStorage' 
STATICFILES_STORAGE = COMPRESS_STORAGE 

Vì vậy, nơi tôi đi sai? Tôi đã định cấu hình sai điều gì đó khi sử dụng bộ nhớ tùy chỉnh CachedS3BotoStorage có thể không?

Trả lời

9

Cài đặt của bạn trông chính xác. Bạn nên giữ cả hai STATICFILES_STORAGECOMPRESS_STORAGE đặt thành storage.CachedS3BotoStorage và không chuyển về storages.backends.s3boto.S3BotoStorage.

Theo số this vấn đề django-compressor, vấn đề là với cách django-staticfiles lưu trong quá trình thu thập (sử dụng shutil.copy2). Vấn đề này đã được sửa chữa trong phiên bản mới hơn của django-staticfiles, có thể được sử dụng thay cho phiên bản đi kèm với Django 1.3.

pip install django-staticfiles==dev 

Và trong bạn settings.py, chuyển sang phiên bản cập nhật:

STATICFILES_FINDERS = (
    #"django.contrib.staticfiles.finders.FileSystemFinder", 
    #"django.contrib.staticfiles.finders.AppDirectoriesFinder", 
    "staticfiles.finders.FileSystemFinder", 
    "staticfiles.finders.AppDirectoriesFinder", 
    "compressor.finders.CompressorFinder", 
) 

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    #'django.contrib.staticfiles', 
    'staticfiles', 
    #... 
) 

Sau khi chạy python manage.py collectstatic một lần nữa, cả hai thư mục CACHE từ django-máy nén và các tập tin staticfiles thu nên hiển thị trên S3.

0

Sử dụng django_compressor==1.2 đã hoạt động đối với tôi. Tôi không chắc chắn lý do tại sao bạn cần phải cài đặt django-staticfiles tuy nhiên tất cả các phiên bản của django_compressor ngoại trừ 1,2 có vấn đề đó.

0

Sau nhiều ngày làm việc chăm chỉ và nghiên cứu cuối cùng tôi đã có thể làm điều này và tôi quyết định viết một số detailed guide về nó, bao gồm cách cũng phục vụ chúng được nén bằng gzip.

Về cơ bản bạn cần làm một vài điều:

  1. Sử dụng AWS_IS_GZIPPED = True
  2. Nếu S3 của bạn nằm ngoài Mỹ. Bạn cần tạo một lớp tùy chỉnh S3Connection nơi bạn ghi đè biến số DefaultHost vào url S3 của mình. Ví dụ s3-eu-west-1.amazonaws.com
  3. Nếu bạn đang sử dụng tên nhóm rải rác, ví dụ subdomain.domain.tld. Bạn cần phải thiết lập AWS_S3_CALLING_FORMAT = 'boto.s3.connection.OrdinaryCallingFormat'
  4. bạn phải thiết lập non_gzipped_file_content = content.file trong bạn CachedS3BotoStorage

Đây là lớp CachedS3BotoStorage bạn cần:

class CachedS3BotoStorage(S3BotoStorage): 
    """ 
    S3 storage backend that saves the files locally, too. 
    """ 
    connection_class = EUConnection 
    location = settings.STATICFILES_LOCATION 
    def __init__(self, *args, **kwargs): 
     super(CachedS3BotoStorage, self).__init__(*args, **kwargs) 
     self.local_storage = get_storage_class(
      "compressor.storage.CompressorFileStorage")() 

def save(self, name, content): 
    non_gzipped_file_content = content.file 
    name = super(CachedS3BotoStorage, self).save(name, content) 
    content.file = non_gzipped_file_content 
    self.local_storage._save(name, content) 
    return name 

Lưu ý rằng EUConnection là một lớp tùy chỉnh nơi tôi đặt DefaultHost để tôi Vị trí S3. Kiểm tra hướng dẫn chi tiết và dài hơn để biết các kho tùy chỉnh hoàn chỉnh và cài đặt.py? Answer =

0

Hãy thử bài đăng này hoàn thành giải pháp trên với một số dòng để khắc phục sự cố tạo nhiều (manifiples) biểu hiện _% .json trong Amazon S3. https://stackoverflow.com/a/31545361/1359475

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