我使用的是s3boto后端,而不是s3后端.
在django- storages 文档中,它表示要在settings.py文件中指定AWS_HEADERS变量:
AWS_HEADERS(可选)
如果您要设置随存储的每个文件发送的标头:
# see http://developer.yahoo.com/performance/rules.html#expires
AWS_HEADERS = {
'Expires': 'Thu, 15 Apr 2010 20:00:00 GMT',
'Cache-Control': 'max-age=86400',
}
Run Code Online (Sandbox Code Playgroud)
这不适合我.
这是我的模型:
class Photo(models.Model):
"""
docstring for Photo
represents a single photo.. a photo can have many things associated to it like
a project, a portfolio, etc...
"""
def image_upload_to(instance, filename):
today = datetime.datetime.today()
return 'user_uploads/%s/%s/%s/%s/%s/%s/original/%s' % (instance.owner.username, today.year, today.month, today.day, today.hour, today.minute, filename)
def thumb_upload_to(instance, filename):
today = datetime.datetime.today()
return 'user_uploads/%s/%s/%s/%s/%s/%s/thumb/%s' % (instance.owner.username, today.year, today.month, …Run Code Online (Sandbox Code Playgroud) 我使用django-storages与s3boto作为后端.
我有一个带有两个文件夹的存储桶 - 一个用于static,一个用于media.我用它来实现这一点django-s3-folder-storage.
除了使用模型保存到S3之外,我还想实现图像调整大小和缓存功能以将文件保存到S3.为此,我直接与我的S3存储桶进行交互.代码有效,但未Content-Type在S3上设置.
在iPython中:
In [2]: from s3_folder_storage.s3 import DefaultStorage
In [3]: s3media = DefaultStorage()
In [4]: s3media
Out[4]: <s3_folder_storage.s3.DefaultStorage at 0x4788780>
Run Code Online (Sandbox Code Playgroud)
测试我们正在访问正确的存储桶 - storage_test我之前创建的是:
In [5]: s3media.exists('storage_test')
Out[5]: True
In [6]: s3media.open("test.txt", "w")
Out[6]: <S3BotoStorageFile: test.txt>
In [7]: test = s3media.open("test.txt", "w")
In [8]: test
Out[8]: <S3BotoStorageFile: test.txt>
In [9]: test.key.content_type = "text/plain"
In [10]: test.write("...")
In [11]: test.close()
In [12]: test = s3media.open("test.txt", …Run Code Online (Sandbox Code Playgroud) 正如问题所示,锁定的s3 IAM用户成功使用django-storages所需的最低权限是多少?目前我用过类似的东西
{
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListAllMyBuckets"],
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": ["s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads",
"s3:ListBucketVersions"],
"Resource": "arn:aws:s3:::bucket-name"
},
{
"Effect": "Allow",
"Action": ["s3:*Object*",
"s3:ListMultipartUploadParts",
"s3:AbortMultipartUpload"],
"Resource": "arn:aws:s3:::bucket-name/*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
这可能实际上是矫枉过正.还有什么想法?
问题:有时,但不是每次,Git都会删除static回购目录.我们不确定是什么触发它,但它似乎发生在分支之间合并或有时甚至只是检查分支.它没有询问就这样做,并且吃掉跟踪的文件.
的背景:
static目录的Django项目.我们可能在过去的某个时刻git rm编辑了static目录,或者将其放入.gitignore,但不是最近.而我们的开发分支的负责人并没有static在.gitignore和具有文件static跟踪.develop.但是分支总是从分支develop到分支develop.但我们不确定.我们正在使用git-flow,但是在使用非git-flow命令时也会出现问题.
作为何时可以攻击的例子:
1)史蒂夫有一个干净的开发分支(没有改变提交或阶段)和稳定.他git flow release start|finish在流程中切换了一个新版本(可能是从master到back的合并),整个/ static/tree被删除了.
2)Steve通过丢弃更改来修复删除(基本上取消删除文件).然后,史蒂夫只是从主人回到开发,而/ static/dir再次被摧毁(这与Git Tower有关)
3)有时只是从功能分支合并到开发作为临时合并可以触发它.但是,在切割新版本时,它似乎确实发生了
它可能与我们如何修复/ static/dir的切换有关吗?批量取消删除已删除的内容的最佳方法是什么?抛弃局部变化或硬重置HEAD似乎都无法治愈.一个rebase可能帮助我们?
更新我们刚刚再次体验过这一点git add .- 没有变化的分支,没有合并.这有助于诊断吗?
以下是Steve的.git/config的内容:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
[remote "origin"]
fetch = …Run Code Online (Sandbox Code Playgroud) 我有一个在Heroku上运行的Django应用程序.为了存储和提供我的静态文件,我将django-storage与我的S3存储桶以及标准的Django一起使用ManifestFilesMixin.我也在使用django-pipeline.
在代码中:
from django.contrib.staticfiles.storage import ManifestFilesMixin
from storages.backends.s3boto import S3BotoStorage
from pipeline.storage import PipelineMixin
class S3PipelineManifestStorage(PipelineMixin, ManifestFilesMixin, S3BotoStorage):
pass
Run Code Online (Sandbox Code Playgroud)
设置有效,但staticfiles.json清单也存储在S3上.我可以看到两个问题:
我的应用程序的存储实例必须staticfiles.json从S3 获取,而不是仅从本地文件系统获取它.这在性能方面毫无意义.清单文件的唯一使用者是服务器应用程序本身,因此它也可以存储在本地文件系统而不是远程.
我不确定这个问题有多重要,因为我想(或希望)服务器应用程序在读取一次后缓存该文件.
清单文件是在部署期间编写的collectstatic,因此,如果任何已运行的服务器应用程序版本的实例在部署完成之前从S3读取清单文件并且新的slug接管,则它们可能会获取错误的静态文件 -只应该为新的slug实例提供服务.
请注意,特别是在Heroku上,新的应用程序实例可能会动态弹出,因此即使应用程序确实缓存了清单文件,它的第一次获取也可能是在部署新的slug期间.
所描述的场景特定于Heroku,但我想其他环境会出现类似的问题.
显而易见的解决方案是将清单文件存储在本地文件系统上.每个slug都有自己的清单文件,性能最佳,并且不会有如上所述的任何部署比赛.
可能吗?
我正在使用django-storages来获取带有S3(和S3BotoStorage)的静态文件.当我从本地计算机执行collectstatic时,行为与预期一致,只有修改过的文件被推送到S3.此过程需要python-dateutils 1.5来检查修改时间.
但是,在Heroku上执行相同操作会导致每个文件都被推送,尽管设置是相同的.然后我查看了Heroku本身文件的修改时间,看起来,os.stat(static_filename).st_mtime与上次推送的时间相同.
这是预期的行为吗?即使git没有变化,heroku还能复制文件吗?
使用django-storage s3提供媒体时,正在生成的媒体网址如下所示:
https://mybucket.s3.amazonaws.com/myimage.jpg?Signature=5ifoyLqzmtfVNS1ovfzVvN92RH0%3D&Expires=1363124819&AWSAccessKeyId=AKIAJ7ZTU7K4SPYKGOFA
Run Code Online (Sandbox Code Playgroud)
由于https导致图像无法显示:
You attempted to reach mybucket.s3.amazonaws.com,
but instead you actually reached a server identifying itself as *.s3.amazonaws.com.
This may be caused by a misconfiguration on the server or by something more serious. An attacker on your network could be trying to get you to visit a fake (and potentially harmful) version of mybucket.s3.amazonaws.com.
Run Code Online (Sandbox Code Playgroud)
我需要将图像作为HTTP而不是HTTPS提供
我的设置是:
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = "AKIAJ....K4SPYKGOFA"
AWS_SECRET_ACCESS_KEY = "2Y7G98JoCRzAEp....rPoCjWZuwDaQ"
AWS_STORAGE_BUCKET_NAME = "mybucket"
Run Code Online (Sandbox Code Playgroud)
我尝试将media_url和s3_url设置为普通的http,但它没有改变任何东西.
我正在使用django 1.5
我创建了一个自定义存储后端,该文件被调用storages.py并放置在一个名为的应用程序中core:
from django.conf import settings
from storages.backends.s3boto import S3BotoStorage
class S3StaticBucket(S3BotoStorage):
def __init__(self, *args, **kwargs):
kwargs['bucket_name'] = getattr(settings, 'static.mysite.com')
super(S3BotoStorage, self).__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
在settings.py,我有以下内容:
STATICFILES_STORAGE = 'core.storages.S3StaticBucket'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
Run Code Online (Sandbox Code Playgroud)
当我尝试这样做python manage.py collectstatic时显示以下错误:
django.core.exceptions.ImproperlyConfigured: Error importing storage module core.storages: "No module named backends.s3boto"
Run Code Online (Sandbox Code Playgroud)
当我运行python manage.py shell并尝试导入相同的:
>>>
>>> from django.conf import settings
>>> from storages.backends.s3boto import S3BotoStorage
>>>
Run Code Online (Sandbox Code Playgroud)
知道我做错了什么吗?
我正在使用django-storage和sorl_thumbnail,我正在使用Amazon S3来获取静态和媒体文件.我使用一个带2个文件夹的存储桶,1个用于静态,1个用于媒体.
这是我的配置:
MEDIA_ROOT = '/media/'
MEDIA_URL = 'https://s3.amazonaws.com/my-bucket/media/'
STATIC_ROOT = '/static/'
STATIC_URL = 'https://s3.amazonaws.com/my-bucket/static/'
AWS_STORAGE_BUCKET_NAME = 'my-bucket'
DEFAULT_FILE_STORAGE = 'my_lib.s3utils.MediaRootS3BotoStorage'
STATICFILES_STORAGE = 'my_lib.s3utils.StaticRootS3BotoStorage'
Run Code Online (Sandbox Code Playgroud)
MediaRootS3BotoStorage并StaticRootS3BotoStorage定义如下:
StaticRootS3BotoStorage = lambda: S3BotoStorage(location='static')
MediaRootS3BotoStorage = lambda: S3BotoStorage(location='media')
Run Code Online (Sandbox Code Playgroud)
当我使用sorl_thumbnail时,生成的缩略图位于右侧目录中:https://s3.amazonaws.com/my-bucket/media/cache但是当sorl_thumbnail尝试检索已存在的缩略图时,生成的URL为:https://s3.amazonaws.com/my-bucket/cache,您会注意到该media文件夹被省略.
你知道我怎么能解决这个问题吗?
我知道我可以使用django-storages并将我的静态和媒体文件全部混合在我的桶中,但这对我来说有点太脏了:)
谢谢!
在我的 Django 项目中,我使用 Django-storageS 将媒体文件保存在我的 Amazon S3 中。
我遵循了本教程(我也使用了 Django-rest-framework)。这对我很有效:我可以上传一些图片,并且可以在我的 S3 存储中看到这些图片。
但是,如果我尝试删除我的模型的一个实例(包含 ImageField),这不会删除 S3 中的相应文件。这是正确的吗?我也不需要删除 S3 中的资源。
django ×10
django-storage ×10
amazon-s3 ×8
boto ×3
python ×2
amazon-iam ×1
deployment ×1
git ×1
git-branch ×1
heroku ×1