簡體   English   中英

使用 s3 和 django-storages 並上傳圖片

[英]using s3 with django-storages and uploading images

我正在嘗試在 Amazon 的 S3 服務上上傳 MEDIA_FILES。 我想先將它們上傳到存儲桶的根目錄,然后在保存文件之前創建子文件夾。 我的測試 model 很簡單

from django.db import models

# Create your models here.


class TestModel(models.Model):
    name = models.CharField(max_length=10)
    logo = models.ImageField(upload_to='pictures/')

    class Meta:
        verbose_name = ('TestModel')
        verbose_name_plural = ('TestModels')

    def __unicode__(self):
        pass

我已經創建了一個名為圖片的子文件夾。

設置.py

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = 'id'
AWS_SECRET_ACCESS_KEY = 'secret_key'
AWS_STORAGE_BUCKET_NAME = 'mybucket'

from S3 import CallingFormat
AWS_CALLING_FORMAT = CallingFormat.SUBDOMAIN

但是,當我嘗試從管理面板添加 TestModel 時,出現以下錯誤

Request URL:    http://127.0.0.1:8000/admin/testmodel/testmodel/add/
Django Version: 1.6.4
Exception Type: TypeError
Exception Value:    
'NoneType' object has no attribute '__getitem__'

s3 和 django-storages 是否像以前一樣工作? 使用 s3 時要設置的 MEDIA_URL 的值是多少? 使用 S3 和 django-storages 時要設置的 MEDIA_ROOT 的值是多少?

我可以使用這種方式將文件上傳到 S3 服務嗎? 這是我第一次使用雲存儲,所以我有點困惑。

如果您想使用S3,請檢查“ boto”,aws的python模塊, http: //boto.readthedocs.org/en/latest/,以及有關MEDIA_ROOT和MEDIA_URL的https://docs.djangoproject.com/en/dev / ref / settings /#media-root

你可以嘗試什么..

1. 確保您擁有正確的 S3 權限和策略。 通過 AWS S3 控制台中的權限選項卡訪問特定存儲桶的“策略”。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<your_bucket_name>/*"
        },
        {
            "Sid": "Statement2",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::<your_bucket_name>/images/"
        }
    ]
}

2. 在你的項目環境中安裝 WhiteNoiseMiddleware & django-storages。

pip install whitenoise
pip install django-storages

3. 在settings.py中將以下內容添加到MIDDLEWARE=

'whitenoise.middleware.WhiteNoiseMiddleware',

4. 需要在settings.py中添加以下內容才能正確處理來自 S3 的 URL。 處理由 django 中間件和 django-storages 自動完成

STATICFILES_LOCATION = 'static'
MEDIAFILES_LOCATION = 'media'

AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % os.environ['BUCKET_NAME']
AWS_ACCESS_KEY_ID = os.environ['AWS_KEY']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_ACC_KEY']
AWS_STORAGE_BUCKET_NAME = os.environ['BUCKET_NAME']
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3StaticStorage'

MEDIA_ROOT = os.path.join (BASE_DIR, 'static/images/')
STATIC_ROOT = os.path.join (BASE_DIR, 'static')

STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATICFILES_LOCATION)
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION)

5. 用於瞄准上傳到精確的 S3 Bucket 文件夾。 (額外的)

在 setting.py 中設置媒體根目錄:

MEDIA_ROOT = os.path.join (BASE_DIR, 'static/images/')

在 models.py 中使用ImageFiled並添加upload_to=獲取文件夾名稱並在第一次上傳時創建它:

image_variable = models.ImageField(null=True, default="{default_filename)", upload_to='uploads/') 

參考: django- storages , whiteNoiseMiddelware , S3 Access Troubleshooting

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM