[英]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.