如何将Django .html指向S3媒体文件?拒绝访问

问题描述 投票:0回答:1

我可以使用模型管理视图从我的django应用程序将文件上传到S3存储桶。我也可以在我的django app管理员视图中查看视频。但我无法通过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)

我在app项目文件夹下创建了一个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指示导致<Code>AccessDenied</Code>

播放视频时,实际的管理员页面是

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控制台上的对象URL是对象URL

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

但也直接使用它产生<Code>AccessDenied</Code>

如何在我的.html中修复拒绝访问权限,以便将媒体文件播放回用户?

python html django amazon-web-services amazon-s3
1个回答
1
投票

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

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

这也需要使用S3 URL作为前缀。注意,url属性本身并不是django-storages特有的;这就是你应该如何生成媒体文件的URL。

© www.soinside.com 2019 - 2024. All rights reserved.