Todo lo que intento es subir un video a Amazon S3 en lugar de guardarlo en los medios como lo hace Django regularmente. Así que creó un modelo a continuación
def upload_to_amazon_s3(instance, filename): aws_access_key_id = settings.AWS_ACCESS_KEY_ID aws_secret_access_key = settings.AWS_SECRET_ACCESS_KEY file_name = 'videos/{0}_{1}/{2}'.format(instance.user.id, instance.user.username, filename) conn = boto.connect_s3(aws_access_key_id, aws_secret_access_key) try: bucket = conn.get_bucket("ipitch_videos", validate=True) except S3ResponseError: bucket = conn.create_bucket('ipitch_videos') #Get the Key object of the bucket k = Key(bucket) #Crete a new key with id as the name of the file k.key=file_name #Upload the file result = k.set_contents_from_file(instance.video_file) # we need to make it public so it can be accessed publicly # using a URL like http://s3.amazonaws.com/bucket_name/key k.make_public() get_s3_obj = Key(bucket,file_name) endpoint_url = get_s3_obj.generate_url(expires_in=0, query_auth=False) return endpoint_url class Video(DateTimeModel): user = models.ForeignKey(User, on_delete=models.CASCADE) name = models.CharField(max_length=255) video_file = models.FileField(upload_to=upload_to_amazon_s3) Obtengo el valor endpoint_url de Amazon s3 Url, por ejemplo, como https://ipitch_videos.s3.amazonaws.com/videos/1_username/super.mpg
Entonces, cuando subo un video desde el formulario frontal o una API con todos los campos user, name, video_file , se crea un registro en la base de datos con éxito, pero ocurren los siguientes tres problemas
/ después de https:// de endpoint_url que proviene de Amazon y usa solo https:/ en lugar de https:// como se muestra a continuaciónhttps://ipitch_videos.s3.amazonaws.com/videos/1_username/super.mpg django está creando las siguientes carpetas en medios como se muestra a continuaciónEntonces, ¿cómo evitar que Django cree archivos de video localmente también?
Puede usar S3BotoStorage.
$ pip install django-storages boto Agregue 'almacenamiento' a INSTALLED_APPS:
INSTALLED_APPS = ( ..., 'storages', )agregando otra clase de almacenamiento:
class MediaStorage(S3BotoStorage): location = settings.MEDIAFILES_LOCATIONy en ajustes.py:
MEDIAFILES_LOCATION = 'media' MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION) DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage'