我从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) 我试图在我的应用程序中使用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时,它按预期工作并给我相对路径.我在这里错过了什么吗?
我已将 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
我使用boto(2.2.1)后端用于django-storages(1.1.4)将文件上传到S3存储桶.它适用于图像,但是当我尝试上传电影文件(小型电影,小型AVI)或mp3时,我收到了一个Broken管道错误.
这很怪异.
深入研究Django回溯,我看到以下异常:
boto.https_connection.InvalidCertificateException
Run Code Online (Sandbox Code Playgroud)
哪种方式符合我使用Cyberduck直接检查存储桶的经验:有时它抱怨我在证书*.s3.amazonaws.com和域名之间存在不匹配*.s3-external-3.amazonaws.com
实际上,存储桶日志记录显示我正在为HTTP 307临时重定向服务.也许是AWS以一种方式发送一些内容类型而另一种方式发送内容类型,但boto/something无法完全跟上它?电影的上传似乎确实击中了S3两次,而图像击中它一次,所以很可能是boto正在处理307罚款(并且boto的307支持的已关闭门票是几年),所以它可以好吧,别的什么都搞定了.
但是什么?我已经从一个愉快的工作日变成了一个头脑,而且非常令人沮丧.
有关可能出现的问题和/或尝试解决此问题的任何建议?
(请注意,这与boto S3后端或简单的S3后端失败 - 只是boto给了我看起来更具体的错误)
我正在使用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) 我有一个奇怪的问题,我不知道是什么导致它.这是我当前的配置(使用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(1.4)formwizard作为我的应用程序.在第1步中,我上传了2个文件.这些文件在第二步中使用.一切都工作正常,但这--- ---"当我完成所有步骤或我在第1步后停止我仍然有临时文件存储在MEDIA目录"
如何在任何情况下确保删除这些文件?
我的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-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
我已经将我的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