【问题标题】:How to point Django .html to S3 media file? AccessDenied如何将 Django .html 指向 S3 媒体文件?拒绝访问
【发布时间】:2019-08-22 05:50:02
【问题描述】:

我可以使用模型管理视图从我的 django 应用程序将文件上传到 S3 存储桶。我还可以在我的 django 应用管理视图中查看视频。 但我无法通过 django .html 文件查看视频。

这是我的 models.py 文件

from project_4.storage_backends import MediaStorage

class video(models.Model):
    videofile = models.FileField(storage=MediaStorage(), null=True, verbose_name="", unique=True)

我在我的应用项目文件夹下创建了一个storage_backends.py

from django.conf import settings
from storages.backends.s3boto3 import S3Boto3Storage


class MediaStorage(S3Boto3Storage):
    location = settings.AWS_MEDIA_LOCATION
    default_acl = 'private'  # To turn access control list into private use only. Will use it in models.py
    file_overwrite = False  # Not to replace files even they have same name
    custom_domain = False

在我的 settings.py 我添加了以下内容

import boto3
from botocore.client import Config

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

AWS_ACCESS_KEY_ID = 'x'
AWS_SECRET_ACCESS_KEY = 'x'
AWS_STORAGE_BUCKET_NAME = 'django-draft-project-1'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
AWS_S3_REGION_NAME = "eu-central-1"
AWS_S3_SIGNATURE_VERSION = "s3v4"

# AWS S3 Private Media Upload
AWS_MEDIA_LOCATION = 'media'
PRIVATE_FILE_STORAGE = 'project_4.storage_backends.MediaStorage'
AWS_S3_OBJECT_PARAMETERS = {
    'Expires': 'Thu, 31 Dec 2099 20:00:00 GMT',
    'CacheControl': 'max-age=94608000',
}

此时,我可以通过管理控制台上传和查看我的视频。现在我希望视频可以在我的 html 中查看。

<video controls>
<source src={{ S3_URL }}{{ detailedview.video_name }}>
</video>

{{ S3_URL }}{{ detailedview.video_name }} 产生我在管理页面中看到的根 URL,即 https://django-draft-project-1.s3.amazonaws.com/media/SampleVideo_1280x720_10mb.mp4,但是粘贴此 URL 定向会导致 &lt;Code&gt;AccessDenied&lt;/Code&gt;

播放视频时顶部的实际管理员网址是

https://django-draft-project-1.s3.amazonaws.com/media/SampleVideo_1280x720_10mb.mp4?X-Amz-Algorithm=wewe-HMAC-wewe&X-Amz-Credential=wewewe%2F20190401%wwewwe-central-1%2Fs3%wewe&X-Amz-Date=20190401T053817Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&ewew-Signature=123456qwertasdfzxcvasdfwert

另外,我在 s3 控制台上的 object url 是 Object URL

https://s3.eu-central-1.amazonaws.com/django-draft-project-1/media/SampleVideo_1280x720_5mb.mp4

但也可以直接使用它产生&lt;Code&gt;AccessDenied&lt;/Code&gt;

如何解决在我的 .html 中被拒绝的访问,以便我可以将媒体文件播放回给用户?

【问题讨论】:

  • 但是您已将默认 ACL 设置为私有。因此,您将无法公开链接到它。你为什么这么做?
  • @DanielRoseman 的目标是使视频内容只能通过 Django .html 托管页面访问,而不是通过用户直接在浏览器中复制/粘贴 URL,即不是通过 https://django-draft-project-1.s3.amazonaws.com/media/SampleVideo_1280x720_10mb.mp4,而是而是通过拥有正确的参数(AWSAccessKeyId、Signature、Expires)或更安全的形式,在这种形式下,用户在不通过网站的情况下无法共享视频链接

标签: python html django amazon-web-services amazon-s3


【解决方案1】:

您需要的是一个预签名的 URL。如果您以正确的方式访问文件,Django-storages 实际上会处理这个问题,即使用该字段的url 属性。所以:

<source src="{{ detailedview.video_name.url }}">

这还负责为 S3 URL 添加前缀。请注意,url 属性本身对于 django-storages 并不特殊;这就是您始终应该为媒体文件生成 URL 的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    相关资源
    最近更新 更多