我有一个模型,Profile并ImageField与之相关联.
使用和将映像上载到AWS S3存储桶以进行存储.django-storagesboto
如果我上传一个文件名已经存在的图像(eg: sample.png)Django默认会保存新文件,sample_1.png因为在将图像上传到AWS S3时它不起作用.有没有办法解决这个问题?
如何在AWS S3不覆盖的情况下上传具有现有文件名的图像?
我有一个 Django 模型,将文件名保存为“uuid4().pdf”。其中 uuid4 为创建的每个实例生成一个随机 uuid。该文件名也以相同的名称存储在亚马逊 s3 服务器上。
我正在尝试为我上传到 amazon s3 的文件名添加自定义配置,这是因为每当我下载文件而不是 uuid 文件时,我希望看到自定义名称。同时,我希望文件以 uuid 文件名存储在 s3 上。
所以,我将django-storages与 python 2.7 一起使用。我尝试在这样的设置中添加 content_disposition:
AWS_CONTENT_DISPOSITION = 'core.utils.s3.get_file_name'
Run Code Online (Sandbox Code Playgroud)
其中 get_file_name() 返回文件名。
我也尝试将其添加到设置中:
AWS_HEADERS = {
'Content-Disposition': 'attachments; filename="%s"'% get_file_name(),
}
Run Code Online (Sandbox Code Playgroud)
没有运气!
你们中有人知道要实施这个吗?
我的问题归结为:我在 docker compose:app和中有两个服务storage。我正在寻找一种使用相同地址从应用程序内部和外部访问storage服务(端口 9000)的方法。
app是一个使用 django-storages 和 S3 后端的 Django 应用程序。
storage是一个minio服务器(S3兼容,仅用于开发)。
从app,我可以storage使用http://storage:9000进行访问。从外部 docker,我可以访问storagehttp ://localhost:9000或http://0.0.0.0:9000,甚至可以访问http://192.168.xxx.yyy(使用网络上的不同设备)。那里没有什么惊喜。
但是,当生成 URL 时,我不知道它是要在内部使用还是在外部使用(或两者兼而有之)。
docker-compose.yml
services:
app:
build: backend/
ports:
- "8000:8000"
volumes:
- ./backend/src:/app/src
command: /usr/local/bin/python src/manage.py runserver 0.0.0.0:8000
storage:
image: minio/minio:RELEASE.2019-06-19T18-24-42Z
volumes:
- storage:/data
environment:
MINIO_ACCESS_KEY: "DevelopmentAccessKey"
MINIO_SECRET_KEY: "DevelopmentSecretKey"
ports:
- "9000:9000"
command: minio server /data
volumes:
storage:
Run Code Online (Sandbox Code Playgroud)
我已经研究过更改后端以根据上下文生成端点 url,但这远非微不足道(并且仅用于开发,生产使用外部 …
我有两个由django-pipeline编译的文件以及s3boto:master.css和master.js.它们在我的桶中设置为"公共".但是,当我访问它们时,有时会提供master.css,有时它会使用SignatureDoesNotMatch.与master.js相同.这不会发生在Chrome上.我能错过什么?
编辑:它现在也发生在Chrome上.
我已经设置了一个AWS S3存储桶,以便使用应用程序django-storage在远程CDN中传输我的静态文件,一切正常,直到我尝试压缩我的静态文件,然后使用django_compressor上传到S3.
我根据django-storages的django_compressor文档设置了所有变量(https://django_compressor.readthedocs.org/en/latest/remote-storages/index.html)
我使用'manage.py collectstatic'上传了S3中的所有文件,然后:
当我'manage.py compress'时,我收到此错误:
CommandError: An error occured during rendering ../templates/base.html: 'https://my_bucket.s3.amazonaws.com/css/bootstrap.2.3.1.css' isn't accessible via COMPRESS_URL ('https://my_bucket.s3-external-3.amazonaws.com/') and can't be compressed
Run Code Online (Sandbox Code Playgroud)
我的设置有什么问题?
这是我的django-storages和django_compressor的settings.py配置:
COMPRESS_URL = 'https://mybucket_name.s3-external-3.amazonaws.com/'
STATIC_URL = COMPRESS_URL
DEFAULT_FILE_STORAGE = 'my_project.boto_custom.CachedS3BotoStorage'
AWS_ACCESS_KEY_ID = 'XXX'
AWS_SECRET_ACCESS_KEY = 'XXX'
AWS_STORAGE_BUCKET_NAME = 'mybucket_name'
COMPRESS_ROOT = STATIC_ROOT
COMPRESS_STORAGE = 'my_project.boto_custom.CachedS3BotoStorage'
STATICFILES_STORAGE = 'my_project.boto_custom.CachedS3BotoStorage'
COMPRESS_OFFLINE = True
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助
在 django-storages 第三方应用程序的帮助下,我的 Web 应用程序使用 Amazon S3 将所有媒体文件存储在我的 djagno Web 应用程序中。
我的数据库处理文件夹和文件层次结构,每个用户只看到属于他的组的链接。
但!S3 上的其他文件夹没有权限。
例如: 用户 1:组是 group1 用户 2:组是 group2 s3 链接:https: //s3.amazonaws.com/ /media/group1/folder1/1.png
用户 1 将在应用程序内的他的页面上看到此内容。用户 2 将看不到此链接,但如果他尝试访问此链接,则该文件没有权限,并且可以轻松下载。
我的目标是限制每个组的文件夹权限。
有基于我的 aws 密钥的自动解决方案吗?我迷路了...
这是我尝试过的:
r = requests.get(img_url)
temp = NamedTemporaryFile(delete=True)
temp.write(r.content)
temp.flush()
image = Image()
image.image.save('testimagefilename', File(temp), save=True)
image.save()
Run Code Online (Sandbox Code Playgroud)
在image.image.save()线路的错误跟踪:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib64/python3.4/site-packages/django/db/models/fields/files.py", line 90, in save
name = self.field.generate_filename(self.instance, name)
File "/usr/local/lib64/python3.4/site-packages/django/db/models/fields/files.py", line 332, in generate_filename
return os.path.join(self.get_directory_name(), self.get_filename(filename))
File "/usr/local/lib64/python3.4/site-packages/django/db/models/fields/files.py", line 322, in get_filename
return os.path.normpath(self.storage.get_valid_name(os.path.basename(filename)))
TypeError: get_valid_name() missing 1 required positional argument: 'name'
Run Code Online (Sandbox Code Playgroud)
问题是因为Django期待本地操作系统路径吗?我正在使用S3BotoStorage,ImageField正在使用项目其余部分的独立存储桶:
image = models.ImageField(storage=S3CustomStorage)
class S3CustomStorage(S3BotoStorage):
def __init__(self, *args, **kwargs):
kwargs['bucket'] = getattr(settings, 'AWS_BUCKET_CUSTOM')
super(S3CustomStorage, …Run Code Online (Sandbox Code Playgroud) 如果您有垂直监视器,我的IDE和Traceback 的屏幕截图(纵向视图)显示此处粘贴的所有代码可能更容易阅读.
上下文:尝试ImageField使用S3BotoStorage 将图像从URL保存到EC2上托管的Django ,并使用S3上的文件.我很困惑,因为所有这些都表明Django仍然像本地存储一样对待它,而它应该是S3.
有问题的行似乎导致了错误:
def get_filename(self, filename):
return os.path.normpath(self.storage.get_valid_name(os.path.basename(filename)))
def get_valid_name(self, name):
"""
Returns a filename, based on the provided filename, that's suitable for
use in the target storage system.
"""
return get_valid_filename(name)
Run Code Online (Sandbox Code Playgroud)
TypeError异常: get_valid_name() missing 1 required positional argument: 'name'
最后一个本地变量在错误之前跟踪get_valid_name:
filename 'testimagefilename'
self <django.db.models.fields.files.ImageField: image>
Run Code Online (Sandbox Code Playgroud)
(只有这两个水平分隔线内的东西来自我,其余来自Django 1.9)
image.image.save('testimagefilename', File(temp), save=True)
Run Code Online (Sandbox Code Playgroud)
来自Traceback的本地变量(不确定ValueErroron image,我认为是因为它尚未创建):
File <class 'django.core.files.base.File'>
image Error in formatting: ValueError: The 'image' attribute has no file associated with …Run Code Online (Sandbox Code Playgroud) 我正在将 django-storages 用于 Heroku 上托管的项目。我已经配置了 django-storages,现在可以很好地从 S3 提供静态文件。
我想以编程方式获取位于 URL 的图像并将其上传到 S3 并将其与模型相关联。
我知道如何使用 urlib2 或 requests 从 url 下载文件。
我想知道的是如何最好地将该图像放到 S3 上并让我可以将其与我的模型和相关模板一起使用。文件大小不确定,但可能总是小于 10MB。
我的问题归结为: