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



我可以使用模型管理视图从我的 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,该 URLhttps://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中被拒绝的访问,以便我可以向用户播放媒体文件?

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

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

这也负责以 S3 URL 为前缀。请注意,url属性本身并不是 django 存储所特有的;这就是您始终应该为媒体文件生成 URL 的方式。

最新更新