Chr*_*Yin 4 python django heroku amazon-s3
Heroku和Amazon S3的新手,请耐心等待.将我的Django应用程序上传到Heroku,并且用户媒体上传时出现问题.模型如下:
#models.py
class Movie(models.Model):
title = models.CharField(max_length = 500)
poster = models.ImageField(upload_to = 'storages.backends.s3boto')
pub_date = models.DateTimeField(auto_now_add = True)
author = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)
poster属性是上传图像的属性.我在本地运行良好,现在在Heroku上有一个错误.所以我添加了'storages.backends.s3boto',正如许多其他帖子告诉我的那样.(不确定是否正确).
我的Settings.py文件现在看起来像这样,有点混乱:
#settings.py
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
PROJECT_DIR = os.path.join(PROJECT_ROOT, '../qanda')
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = '****************'
AWS_SECRET_ACCESS_KEY = '************'
AWS_STORAGE_BUCKET_NAME = 'mrt-assets'
AWS_PRELOAD_METADATA = True
MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'qanda/media/movie_posters/)
MEDIA_URL = '/media'
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles')
STATIC_URL = 'https://mrt-assets.s3.amazonaws.com/static/'
STATICFILES_DIRS = (os.path.join(PROJECT_DIR, 'static'),)
Run Code Online (Sandbox Code Playgroud)
我的存储桶被称为mrt-assets,其中有2个静态文件夹(css,js,images和media.我现在不太担心静态文件,因为我已经将CSS/JS文件硬编码到我的HTML文件*,但如何将我的用户上传媒体(任何类型的图像)放入mrt-assets/media?
*虽然如果有人想帮助STATIC文件也会很棒.但用户上传媒体更为紧迫.
编辑(根据Yuji的评论):
尝试过多种选择,但都没有.我已经回去并删除了很多更改,现在这是我的设置
#settings.py
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
MEDIA_ROOT = 'http://s3.amazonaws.com/mrt-assets/media/'
MEDIA_URL = '/media/'
STATIC_ROOT = 'http://s3.amazonaws.com/mrt-assets/static/'
STATIC_URL = '/static/'
ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/'
TEMPLATE_DIRS = (os.path.join(PROJECT_ROOT, "templates"),)
#models.py
#same as before, but now have changed the poster directory
poster = models.ImageField().
Run Code Online (Sandbox Code Playgroud)
不确定该怎么做,需要将我的Heroku应用程序连接到S3,以便在那里保存用户媒体上传.
现在已将我的S3 Bucket改为此版本
mrt-assets
static
css
js
images
media
(empty)
Run Code Online (Sandbox Code Playgroud)
小智 5
将媒体上传到<bucket>/media静态资产的技巧<bucket>/static是为两种资产类型创建两个不同的默认存储后端,或者使用带location参数的存储对象显式实例化模型字段.
from storages.backends.s3boto import S3BotoStorage
class Movie(models.Model):
title = models.CharField(max_length=500)
poster = models.ImageField(storage=S3BotoStorage(location='media'))
pub_date = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)
给S3BotoStorage一个location遗嘱所有上传的前缀与其路径.
这几乎与显式定义带位置的存储后端相同,但我们将使用settings.MEDIA_ROOT并
settings.STATIC_ROOT全局应用路径前缀.
# settings.py
STATIC_ROOT = '/static/'
MEDIA_ROOT = '/media/'
DEFAULT_FILE_STORAGE = 'app.storage.S3MediaStorage'
STATICFILES_STORAGE = 'app.storage.S3StaticStorage'
# app/storage.py
from django.conf import settings
from storages.backends.s3boto import S3BotoStorage
class S3MediaStorage(S3BotoStorage):
def __init__(self, **kwargs):
kwargs['location'] = kwargs.get('location',
settings.MEDIA_ROOT.replace('/', ''))
super(S3MediaStorage, self).__init__(**kwargs)
class S3StaticStorage(S3BotoStorage):
def __init__(self, **kwargs):
kwargs['location'] = kwargs.get('location',
settings.STATIC_ROOT.replace('/', ''))
super(S3StaticStorage, self).__init__(**kwargs)
Run Code Online (Sandbox Code Playgroud)
您可以优化上面的代码,以利用 Heroku配置变量 使其更具可移植性:
# settings.py
import os
STATIC_ROOT = os.environ.get('STATIC_ROOT',
os.path.join(os.path.dirname(__file__), 'static'))
MEDIA_ROOT = os.environ.get('MEDIA_ROOT',
os.path.join(os.path.dirname(__file__), 'media'))
DEFAULT_FILE_STORAGE = os.environ.get('DEFAULT_FILE_STORAGE',
'django.core.files.storage.FileSystemStorage')
STATICFILES_STORAGE = os.environ.get('STATICFILES_STORAGE',
'django.contrib.staticfiles.storage.StaticFilesStorage')
Run Code Online (Sandbox Code Playgroud)
将上述设置与.env文件结合使用,您可以在本地使用默认存储后端进行开发和测试,在Heroku上部署时,您将自动切换到
app.storage.S3MediaStorage和app.storage.S3StaticStorage:
# .env
STATIC_ROOT=static
MEDIA_ROOT=media
DEFAULT_FILE_STORAGE=app.storage.S3MediaStorage
STATICFILES_STORAGE=app.storage.S3StaticStorage
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1292 次 |
| 最近记录: |