Как указать Django .html в медиа файл S3?Доступ закрыт - PullRequest
0 голосов
/ 01 апреля 2019

Я могу загружать файлы в корзину S3 из моего приложения django, используя представление администратора моделей.Я также могу просматривать видео в моем представлении администратора приложения 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-адреса вызывает AccessDenied

Фактический URL-адрес администратора сверху при воспроизведении видео:

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

Более того, мой URL-адрес объекта на консоли s3 - это URL-адрес объекта

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

Но также использование его напрямую приводит к AccessDenied

Как я могу исправить отказ в доступе в моем .html, чтобы я мог воспроизвести медиа-файл обратно пользователю?

1 Ответ

1 голос
/ 01 апреля 2019

То, что вам нужно, это предопределенный URL. Django-хранилища на самом деле позаботятся об этом, если вы правильно получите доступ к файлу, то есть используйте свойство url поля. Итак:

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

Это также обеспечивает префикс с URL-адресом S3. Обратите внимание, что свойство url само по себе не является особенным для django-хранилищ; именно так вы всегда должны генерировать URL для медиа-файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...