Ниже приведен примерный план возможного дизайна.Я не знаю деталей вашего проекта, поэтому я делаю много предположений.Если вы используете S3, вы можете использовать клиент boto .Но перед этим убедитесь, что все файлы в вашей корзине закрыты.Получите ключ доступа для своего приложения, чтобы вы могли выполнять вызовы API для S3.Затем, получив все это, вы можете сделать что-то вроде этого:
Создать новое приложение videofile
и определить модель VideoFile
:
import boto3 as boto
from django.conf import settings
from django.db import models
class VideoFile(models.Model):
owner = models.ForeignKey(settings.AUTH_USER_MODEL)
name = models.CharField(max_length=75)
content_key = models.CharField(max_length=200, unique=True)
def generate_download_url(self, ):
s3 = boto.client('s3')
url = s3.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': settings.S3_BUCKET_NAME,
'Key': self.content_key
}
)
return url
def __str__(self):
return self.name
Что это делает?Он создает таблицу, в которой хранятся идентификаторы файлов S3 (в столбце content_key
), и каждый файл имеет owner
, который является внешним ключом для объекта User в приложении django.generate_download_url
генерирует предварительно назначенные URL, срок действия которых истекает через некоторое время.
Чтобы загрузить новое видео на S3, возможно что-то вроде:
def create_document(file_object, key_name, owner):
try:
s3 = boto.resource('s3')
s3.Object(settings.S3_BUCKET_NAME, key_name).put(Body=file_object)
except Exception, err:
print("Could not create object in s3")
return
video_file = VideoFile.objects.create(owner=owner, name=file_object.name, content_key=key_name)
return video_file
Наконец, вы можете выполнить "is_friend_of ()"отметьте соответствующий вид DRF и верните временный URL.
class FileStreamUrl(APIView):
def get(self, request):
my_man = User.objects.get(...)
if request.user.is_friend_of(my_man):
video_file = some_user.objects.video_file_set.filter(...)
url = video_file.generate_download_url()
return Response(url)
else:
return Response(status=403) # Forbidden