标签: django-storage

通过django存储boto s3将二进制数据保存到模型文件中

我从echosign API中提取了一个pdf,它给了我一个文件的字节.

我正在尝试将这些字节保存到boto s3支持的FileField中.我运气不好.

这是我得到的最接近的,但它在保存'发言人'时出错,而写入S3的pdf似乎已损坏.

speaker是我的模型的一个实例,fileData是从echosign api返回的'bytes'字符串

afile = speaker.the_file = S3BotoStorageFile(filename, "wb", S3BotoStorage())
afile.write(fileData)
afile.close()
speaker.save()
Run Code Online (Sandbox Code Playgroud)

python django amazon-s3 django-storage

8
推荐指数
1
解决办法
3124
查看次数

Django Storages使用s3boto忽略MEDIA_URL

我试图在我的应用程序中使用django-storage与s3boto并尝试从s3提供媒体和静态文件.

我的设置文件中有以下设置:

AWS_STORAGE_BUCKET_NAME = '<bucket_name>'
AWS_S3_ACCESS_KEY_ID = '<access_key>'
AWS_S3_SECRET_ACCESS_KEY = '<secret>'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME

STATICFILES_LOCATION = 'static'
STATICFILES_STORAGE = '<custom_storage_satic>'

MEDIAFILES_LOCATION = 'media'
DEFAULT_FILE_STORAGE = '<custom_storage_media>'
Run Code Online (Sandbox Code Playgroud)

我的custom_storages.py是

from django.conf import settings
from storages.backends.s3boto import S3BotoStorage

class StaticStorage(S3BotoStorage):
    location = settings.STATICFILES_LOCATION

class MediaStorage(S3BotoStorage):
    location = settings.MEDIAFILES_LOCATION
Run Code Online (Sandbox Code Playgroud)

当我在django中创建图像时,而不是从我的图像开始的相对路径

image.url
'/media/image/<rest_of_the_path>.jpg'
Run Code Online (Sandbox Code Playgroud)

我得到了绝对的网址,就像这样

image.url
'https://<s3_bucket_name>.s3.amazonaws.com/media/image/original/'
Run Code Online (Sandbox Code Playgroud)

当我使用本地存储而不是s3boto时,它按预期工作并给我相对路径.我在这里错过了什么吗?

python django amazon-s3 django-media django-storage

7
推荐指数
1
解决办法
2032
查看次数

Django 仅在生产环境中使用私有 S3 存储

我已将 django REST API 设置为在调试模式下使用本地存储,在生产环境中使用 S3 存储。这适用于公共文件,因为我覆盖了DEFAULT_FILE_STORAGE这样的:

if IS_DEBUG:
    DEFAULT_FILE_STORAGE = 'api.storage_backends.PublicMediaStorage'
Run Code Online (Sandbox Code Playgroud)

每个人都会FileField自动使用它。现在我想以同样的方式使用私有 S3 存储,但是因为我必须显式定义存储 ( FileField(storage=PrivateMediaStorage())),所以总是使用 S3 存储。

在调试模式下如何使用本地存储而不是 S3 存储?

PS:我已经考虑过FileField根据 DEBUG 模式将模型更改为使用或不使用显式存储。这并没有完全解决我的问题,因为我的迁移是在 DEBUG 模式下创建的,因此始终包含没有私有存储类的模型。

更新: 我正在寻找一种解决方案,它可以在两种环境中共享相同的迁移,并且仅在运行时延迟实例化实际存储类。就像 djangoDEFAULT_FILE_STORAGE已经处理了一样。

python django amazon-s3 django-storage django-rest-framework

7
推荐指数
2
解决办法
1792
查看次数

使用boto的django-storages - 无法上传mp3,但可以上传图片.另外,遭受HTTP 307痛苦

我使用boto(2.2.1)后端用于django-storages(1.1.4)将文件上传到S3存储桶.它适用于图像,但是当我尝试上传电影文件(小型电影,小型AVI)或mp3时,我收到了一个Broken管道错误.

这很怪异.

深入研究Django回溯,我看到以下异常:

boto.https_connection.InvalidCertificateException
Run Code Online (Sandbox Code Playgroud)

哪种方式符合我使用Cyber​​duck直接检查存储桶的经验:有时它抱怨我在证书*.s3.amazonaws.com和域名之间存在不匹配*.s3-external-3.amazonaws.com

实际上,存储桶日志记录显示我正在为HTTP 307临时重定向服务.也许是AWS以一种方式发送一些内容类型而另一种方式发送内容类型,但boto/something无法完全跟上它?电影的上传似乎确实击中了S3两次,而图像击中它一次,所以很可能是boto正在处理307罚款(并且boto的307支持的已关闭门票是几年),所以它可以好吧,别的什么都搞定了.

但是什么?我已经从一个愉快的工作日变成了一个头脑,而且非常令人沮丧.

有关可能出现的问题和/或尝试解决此问题的任何建议?

(请注意,这与boto S3后端或简单的S3后端失败 - 只是boto给了我看起来更具体的错误)

django amazon-s3 boto amazon-web-services django-storage

6
推荐指数
1
解决办法
1451
查看次数

使用远程存储配置django-compressor(django-storage - amazon s3)

我的情景

我正在使用django-storage来通过Amazon S3提供文件.这意味着当我执行./manage.py collectstatic时,文件将保存在亚马逊的存储桶中,而不是本地文件系统上.

要压缩我执行的文件:"./ manage.py compress"这给出了这个错误:

错误:渲染期间发生错误:[Errno 2]没有这样的文件或目录:u'/ home/user/project/static/less/bootstrap.less'

由于该文件不在我的本地文件系统上.

"由于Django Compressor处理文件的方式,它要求处理文件(在{%compress%}块中)在本地文件系统缓存中可用. " http://django_compressor.readthedocs.org/en/最新/远程存储器/

如何使用django-storage(amazon s3)进行django-compress工作?

到目前为止我试图做的事情

在本地和S3上创建collectstatic保存文件.因为在django-compressor页面的文档中提到过它,所以应该有一些好方法.怎么样?

组态

STATIC_URL = 'http://mybucket.s3-website-eu-west-1.amazonaws.com/'
STATIC_ROOT = os.path.join(PROJECT_DIR,"static/")
STATICFILES_FINDERS = (
     'django.contrib.staticfiles.finders.FileSystemFinder',
     'django.contrib.staticfiles.finders.AppDirectoriesFinder',
     'compressor.finders.CompressorFinder',
)
STATICFILES_STORAGE = DEFAULT_FILE_STORAGE = 'index.storage.CachedS3BotoStorage' #defined as it is in the documentation

AWS_ACCESS_KEY_ID = "xxx"
AWS_SECRET_ACCESS_KEY = "xxx"
AWS_STORAGE_BUCKET_NAME = "xxxx"

COMPRESS_URL = STATIC_URL
COMPRESS_OFFLINE = True

COMPRESS_PRECOMPILERS = (
    ('text/less', 'lessc {infile} {outfile}'),
)
Run Code Online (Sandbox Code Playgroud)

django django-storage

6
推荐指数
1
解决办法
2311
查看次数

从S3提供Django的静态和媒体文件

我有一个奇怪的问题,我不知道是什么导致它.这是我当前的配置(使用Heroku):

MEDIA_URL = '/media/'
STATIC_URL = '/static/'

STATICFILES_DIRS = (
os.path.join(PROJECT_DIR, '../static'),
)

#Determine if local or deployed.
if 'DATABASE_URL' in os.environ:
    STATICFILES_STORAGE     = 'storages.backends.s3boto.S3BotoStorage'
    AWS_ACCESS_KEY_ID       = 'A...A' 
    AWS_SECRET_ACCESS_KEY   = '...R' 
    DEFAULT_FILE_STORAGE    = 'storages.backends.s3boto.S3BotoStorage'

    # PRODUCTION OR STAGING
    if 'PROD' in os.environ:
        AWS_STORAGE_BUCKET_NAME = 's3.project.com'
        STATIC_URL = "https://s3.amazonaws.com/project/"
    else:
        AWS_STORAGE_BUCKET_NAME = 'project-staging'
        STATIC_URL = "https://s3.amazonaws.com/project-staging/"
else:
    STATIC_ROOT = ''
Run Code Online (Sandbox Code Playgroud)

问题是,静态文件工作正常,链接看起来像这样:https://s3.amazonaws.com/project-staging/img/homepage_left.png.

第一个问题(Admin半破):

管理员工作一半.CSS文件服务很好:https://project-staging.s3.amazonaws.com/admin/js/core.js?Signature=asdasdasd%3D&Expires=1352430664&AWSAccessKeyId=asdasdasA但所有图像都被破坏了:

https://project-staging.s3.amazonaws.com/admin?Signature=%2asdasdad%3D&Expires=1352430664&AWSAccessKeyId=asdasdaimg/icon_calendar.gif

我不知道为什么Signature和AWSAccesskey在那里:(.如果我(手动)删除它们,URL工作正常!

第二个问题(通过ImageField/FileField上传媒体):

我正在使用{{MEDIA_URL}}{{object.flyer}},它转换为/media/media/flyers/poster_1.png,我如何指出它到s3?它应该是这样的:https://project-staging.s3.amazonaws.com/media/flyers/poster_1.png

django amazon-s3 django-storage

6
推荐指数
1
解决办法
2261
查看次数

Django表单向导:删除由中间步骤存储的临时文件

我正在使用django(1.4)formwizard作为我的应用程序.在第1步中,我上传了2个文件.这些文件在第二步中使用.一切都工作正常,但这--- ---"当我完成所有步骤或我在第1步后停止我仍然有临时文件存储在MEDIA目录"

如何在任何情况下确保删除这些文件?

django django-formwizard django-storage

6
推荐指数
1
解决办法
622
查看次数

使用ImageField和自定义存储,Django"在迁移中没有反映出变化"

我的Django 1.8应用程序使用第三方应用程序(django-avatar),其模型包含ImageField.我也在我的项目的settings.py中使用自定义DEFAULT_FILE_STORAGE(来自django- storages -redux的 S3BotoStorage ).因此,每次运行时manage.py migrate,我都会收到有关头像应用的警告:

您的模型具有尚未在迁移中反映的更改,因此不会应用.运行'manage.py makemigrations'进行新的迁移,然后重新运行'manage.py migrate'以应用它们.

...因为avatar的初始迁移引用了Django的默认FileSystemStorage.运行makemigrations会在头像应用程序中创建一个新的0002迁移,以使其ImageField的存储与我的项目设置相匹配:

...
migrations.AlterField(
    model_name='avatar',
    name='avatar',
    field=models.ImageField(storage=storages.backends.s3boto.S3BotoStorage(), max_length=1024, upload_to=avatar.models.avatar_file_path, blank=True),
),
Run Code Online (Sandbox Code Playgroud)

问题是,这个新的迁移是在我的项目之外的python的site-packages中安装的头像中创建的(因此在git控件之外,不可用于部署等).

在使用自定义DEFAULT_FILE_STORAGE的项目中使用ImageField(或FileField)的第三方应用程序处理迁移的正确方法是什么?我考虑过:

  • 只是忽略警告.迁移到更改存储实际上不会影响数据库模式,并且由于我的项目的DEFAULT_FILE_STORAGE自启动以来一直是S3BotoStorage,因此不需要进行数据迁移.

  • 使用settings.MIGRATION_MODULES将头像的迁移移动到我的项目中.(然后小心地将每个未来的头像迁移移植到我的副本 - 这似乎容易出错.)[编辑:这条关于django-users邮件列表的评论表明这是错误的方法.]

  • 请django-avatar(或django-storages-redux)维护者改变......什么?(顺便说一句,S3BotoStorage已经解构了 - 这不是问题.)

  • 要么...?

django django-storage django-migrations

6
推荐指数
1
解决办法
550
查看次数

UncompressableFileError:'scripts/app.js'无法通过COMPRESS_URL('http://my-bucket.s3-us-west-2.amazonaws.com/')访问,无法压缩

我正在尝试将django-compressor和django-storages-redux与django staticfiles和Amazon S3一起使用.这些是我的设置:

STATIC_URL = COMPRESS_URL = 'http://my-bucket.s3-us-west-2.amazonaws.com/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

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

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'site-static'),
)

COMPRESS_PRECOMPILERS = (
    ('text/scss', 'sass --scss --compass {infile} {outfile}'),
)

COMPRESS_CSS_FILTERS = [
    'compressor.filters.css_default.CssAbsoluteFilter',
    'compressor.filters.cssmin.CSSMinFilter',
]

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
STATICFILES_STORAGE = COMPRESS_STORAGE = 'myapp.apps.mymodel.storage.CachedS3BotoStorage'
COMPRESS_OUTPUT_DIR = 'cache'
COMPRESS_ENABLED = False

AWS_S3_HOST = "s3-us-west-2.amazonaws.com"
AWS_ACCESS_KEY_ID = '---'
AWS_SECRET_ACCESS_KEY = '---'
AWS_STORAGE_BUCKET_NAME = 'my-bucket'
AWS_QUERYSTRING_AUTH = False
AWS_S3_CUSTOM_DOMAIN = 'my-bucket.s3-us-west-2.amazonaws.com'
Run Code Online (Sandbox Code Playgroud)

对于静态文件,我使用自定义存储后端,如此处所建议http://django-compressor.readthedocs.org/en/latest/remote-storages/

from django.core.files.storage import get_storage_class
from …
Run Code Online (Sandbox Code Playgroud)

django amazon-s3 django-storage django-staticfiles django-compressor

6
推荐指数
1
解决办法
1778
查看次数

django storages aws s3从模型记录中删除文件

我已经将我的django aws S3解决方案基于https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html.

现在我试图找到一种方法来删除包含S3文件的模型中的行.我可以使用.delete()删除该行,但它不会在S3中删除.

如何使删除行也在S3中删除?

以下是我的代码:

https://gitlab.com/firdausmah/railercom/blob/master/railercomapp/api.py

@api_view(['POST'])
def delete_employee(request):
    # ----- YAML below for Swagger -----
    """
    description: This API deletes employee
    parameters:
      - name: employee_id
        type: integer
        required: true
        location: form
    """
    employee_id = request.POST['employee_id']
    employee = Employee.objects.get(id = employee_id)
    logging.debug(f"API employee username {employee.username}")
    employee.delete() <---------- here is where the delete row happens
    return Response("Employee Deleted!", status=status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)

https://gitlab.com/firdausmah/railercom/blob/master/railercomapp/models.py

class Employee(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='employee')
    company = models.ForeignKey(Company)
    username = models.CharField(max_length=30, blank=False)
    upload = models.FileField(blank=True) <--- …
Run Code Online (Sandbox Code Playgroud)

django amazon-s3 amazon-web-services delete-row django-storage

6
推荐指数
1
解决办法
1473
查看次数