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

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

我可以使用模型管理 View 从 django 应用程序将文件上传到 S3 存储桶。我还可以在 django 应用程序管理 View 中查看视频。 但我无法通过 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 定向会导致 <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。如果您以正确的方式访问文件,即使用字段的 url 属性,Django-storages 实际上会处理这个问题。所以:

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

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

关于python - 如何将 Django .html 指向 S3 媒体文件?拒绝访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55448744/

相关文章:

Python 2.7.2 全局变量 + tkinter

javascript - 在长页面中间暂时锁定页面滚动

html - 将 CSS 文件链接到我硬盘上同一目录中的 HTML 文档 (Windows)

javascript - 如何在 Django 管理页面上插入 &lt;script&gt; 标签

python - 运行 Django 服务器时如何订阅 GCP Pub/Sub?

python - 打印空行有什么作用?

Python错误TypeError : must be string or buffer,不是实例

python - 估计两个词之间的音素相似度

html - CSS 未覆盖 @media 查询中的 Bootstrap Margin 标记

python - Django Allauth 模板渲染期间出错 : NoReverseMatch at/accounts/login/