Cargue archivos a AWS S3 con Python y Django

     

    Introducci贸n

    A medida que buscamos construir sitios web m谩s interactivos, no solo proporcionamos informaci贸n a los usuarios, sino que tambi茅n les permitimos cargar sus propios datos. Esto abre m谩s oportunidades y m谩s formas en que nuestros sitios web pueden servir a los usuarios finales.

    Al permitir que los usuarios carguen archivos, podemos permitirles compartir fotos, videos o m煤sica con otros o hacer copias de seguridad de ellos para su custodia. Tambi茅n podemos proporcionar la funcionalidad para administrar archivos y convertirlos a otros formatos instalando sitios web en lugar de aplicaciones nativas.

    El auge de las redes sociales en todo el mundo se puede atribuir a la capacidad de los usuarios para cargar sus archivos, principalmente en forma de im谩genes y videos para que otros usuarios los vean y tambi茅n como medio de comunicaci贸n. Al permitir que los usuarios carguen archivos en sitios web y plataformas, se han mejorado los m茅todos de comunicaci贸n y ahora la informaci贸n se puede difundir en muchos formatos diferentes.

    En esta publicaci贸n, exploraremos c贸mo Django maneja la carga de archivos y c贸mo podemos aprovechar esta funcionalidad y expandir el almacenamiento en la nube para satisfacer nuestras necesidades.

    C贸mo maneja Django el almacenamiento de archivos

    Django no solo nos permite convertir conceptos en aplicaciones web, sino que tambi茅n nos brinda la funcionalidad de manejar archivos y permitir que los usuarios carguen archivos en nuestras aplicaciones web para una mayor interacci贸n. A trav茅s de formularios, los usuarios pueden adjuntar archivos a sus aplicaciones y cargar y almacenar sus archivos en nuestros servidores postdoctorales.

    Antes de que se guarde un archivo, se almacena temporalmente en alg煤n lugar antes de procesarse y almacenarse en el lugar final previsto. Por ejemplo, si el archivo cargado tiene menos de 2,5 MB, el contenido de ese archivo se almacenar谩 en la memoria y luego se escribir谩 en el disco cuando se completen todas las operaciones mientras se procesa.

    Esto acelera el proceso para archivos peque帽os. Para archivos de m谩s de 2,5 MB, primero se escriben en una ubicaci贸n temporal a medida que se reciben los datos, luego, cuando se completa el procesamiento, el archivo se transfiere a su destino final.

    El transporte de archivos en Django se puede personalizar a trav茅s de varias configuraciones, por ejemplo FILE_UPLOAD_MAX_MEMORY_SIZE, que nos permite modificar un tama帽o l铆mite de carga de 2,5 MB para los archivos escritos en la memoria primero y no en una ubicaci贸n temporal. Podemos configurar los permisos predeterminados para los archivos cargados a trav茅s de FILE_UPLOAD_PERMISSIONS.

    Otras configuraciones se pueden encontrar en esta parte de la documentaci贸n oficial de Django.

    驴D贸nde podemos almacenar nuestros archivos?

    En una aplicaci贸n web impulsada por Django, podemos almacenar los archivos cargados en diferentes ubicaciones. Podemos almacenarlos en nuestros propios servidores donde se usa el c贸digo de Django, o podemos enviarlos a otros servidores que pueden haber sido configurados en otro lugar con fines de almacenamiento.

    En un esfuerzo por reducir los costos de mantenimiento del servidor y mejorar el rendimiento, tambi茅n podemos optar por no almacenar los archivos cargados en nuestros propios servidores. En este caso, podemos d谩rselos a otros proveedores de almacenamiento alojado como AWS, Azuro OneDrive, entre otros.

    Existen varios paquetes que nos permiten interactuar con las API proporcionadas por los distintos proveedores de servicios que hemos mencionado. 脡stas incluyen:

    Para esta publicaci贸n, usaremos el Django-s3direct paquete para almacenar nuestros archivos en AWS S3.

    Nuestra aplicaci贸n – Django Drive

    Usaremos Django para crear una aplicaci贸n web en la que cargaremos contenido para que lo vean los usuarios finales. Esto se lograr谩 mediante el uso de la interfaz de administraci贸n de Django, que es compatible con el marco.

    Nuestro sitio se utilizar谩 para vender autos y en 茅l mostraremos detalles y publicaremos im谩genes o videos de los autos a la venta.

    Las im谩genes o videos de autos a la venta se almacenar谩n en S3. No aplicaremos el registro de usuario o el inicio de sesi贸n en este momento por motivos de precisi贸n.

    Arreglo

    Usaremos Pipenv para configurar y administrar nuestro entorno remoto en el que construimos nuestra aplicaci贸n Django ejecutando el siguiente comando para configurarlo usando Python3:

    $ pipenv install --three
    

    Una vez que el entorno est谩 configurado, ahora podemos instalarlo Django y Django-s3direct para manejar nuestra carga de archivos a S3:

    $ pipenv install django django-s3direct
    

    Django proporciona un conjunto de comandos para configurar nuestro proyecto antes de comenzar a implementar la funcionalidad principal de nuestra aplicaci贸n. Nuestro proyecto de conducci贸n de Django tendr谩 una aplicaci贸n que ser谩 el foco de este trabajo. Para lograr esto, ejecutamos los siguientes comandos:

    $ django-admin startproject django_drive && cd django_drive
    $ django-admin startapp django_drive_app
    

    El es django-admin startproject ... la orden crea el proyecto, y el django-admin startapp ... comando crea la aplicaci贸n.

    El 煤ltimo paso en nuestra configuraci贸n es crear tablas de base de datos a trav茅s de la migrate orden:

    $ python manage.py migrate
    

    Cuando comenzamos nuestro proyecto ejecutando el l铆der python manage.py runserver, damos la bienvenida a la siguiente p谩gina, que confirma el 茅xito de nuestro acuerdo:

    Dado que cargaremos nuestros archivos en AWS S3, necesitaremos configurar una capa libre Cuenta de AWS con fines de demostraci贸n. Una vez configurados, podemos navegar hasta el panel S3 y crear un nuevo dep贸sito que contenga nuestras cargas.

    por Django-s3direct para interactuar con nuestra configuraci贸n de AWS, debemos proporcionar las siguientes credenciales AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, y el AWS_STORAGE_BUCKET_NAME.

    Luego agregaremos lo siguiente a nuestro django_drive/settings.py archivo:

    AWS_ACCESS_KEY_ID = 'aws-access-key-id'
    AWS_SECRET_ACCESS_KEY = 'secret-access-key'
    AWS_STORAGE_BUCKET_NAME = 'name-of-the-bucket'
    AWS_S3_REGION_NAME = 'name-of-the-region'
    AWS_S3_ENDPOINT_URL = 'https://s3.amazonaws.com'
    
    S3DIRECT_DESTINATIONS = {
        'primary_destination': {
            'key': 'uploads/',
            'allowed': ['image/jpg', 'image/jpeg', 'image/png', 'video/mp4'],
        },
    }
    

    Django-s3direct nos permite especificar m谩s de un destino para nuestras cargas, de esta manera podemos dirigir varios archivos a dep贸sitos de S3 separados. Para este proyecto, pondremos todas las cargas en un solo dep贸sito. Otra caracter铆stica ingeniosa es que podemos limitar los tipos de archivos que se pueden cargar en nuestro sitio web. En nuestro caso, estamos limitados a videos MP4, JPEG e im谩genes PNG 煤nicamente.

    Nota: M谩s detalles sobre la configuraci贸n Django-s3direct, como CORS y Access Setup, est谩n disponibles aqu铆.

    Necesitamos agregar las siguientes entradas en el django_drive/urls.py archivo:

    from django.urls import path, include
    
    urlpatterns = [
        ...
        path('', include('django_drive_app.urls')),
        path('s3direct/', include('s3direct.urls')),
        ...
    ]
    

    Implementaci贸n

    Comenzaremos creando el modelo para los datos de nuestro autom贸vil, que se mostrar谩 a los usuarios finales. Este modelo definir谩 la informaci贸n que agregaremos a nuestro panel de administraci贸n al agregar autos a nuestra plataforma. El modelo del coche es el siguiente:

    from django.db import models
    from s3direct.fields import S3DirectField
    
    class Car(models.Model):
        name = models.CharField(max_length=255, blank=False, null=False)
        year_of_manufacture = models.CharField(max_length=255, blank=False, null=False)
        price = models.CharField(max_length=255, blank=False, null=False)
        image = S3DirectField(dest="primary_destination", blank=True)
        video = S3DirectField(dest="primary_destination", blank=True)
    
        def __str__(self):
            return f"{self.name} ({self.year_of_manufacture}) - {self.price}"
    

    Para cada autom贸vil, almacenamos su nombre, a帽o de fabricaci贸n, precio e imagen o video. Despu茅s de crear el modelo, migremos para crear la tabla en la base de datos que contendr谩 nuestros datos ejecutando:

    $ python manage.py makemigrations
    $ python manage.py migrate
    

    Dado que usaremos el panel de administraci贸n de Django para administrar los autos en nuestra plataforma, necesitamos registrar nuestro modelo en el django_drive_app/admin.py:

    from django.contrib import admin
    from.models import Car
    
    admin.site.register(Car)
    

    Luego necesitamos crear el superusuario que se encargar谩 de agregar los autos ejecutando el siguiente comando y siguiendo los consejos:

    $ python manage.py createsuperuser
    $ python manage.py runserver
    

    El es python manage.py runserver el comando simplemente reinicia nuestra aplicaci贸n.

    Despu茅s de reiniciar nuestro servidor, ahora podemos navegar al panel de administraci贸n en http://127.0.0.1:8000/admin e inicie sesi贸n con las credenciales que especificamos anteriormente. Bajo la administraci贸n del sitio, podemos DJANGO_DRIVE_APP con la opci贸n de agregar o cambiar autos existentes.

    Aqu铆 est谩 el formulario que usamos para agregar un autom贸vil y sus detalles:

    Una vez que guardemos nuestro autom贸vil, podemos obtener la imagen que cargamos en nuestro bucket de S3 en una consola de AWS. Esto significa que nuestro archivo se carg贸 en AWS.

    Ahora crearemos una vista para mostrar los autos y sus detalles a los usuarios finales de nuestro sitio web y tambi茅n mostraremos las im谩genes o videos relacionados con cada auto. Empezaremos creando una escena en el django_drive_app/views.py:

    from django.shortcuts import render
    from django.views.generic import TemplateView
    from .models import Car
    
    class CarView(TemplateView):
        template_name="django_drive_app/cars.html"
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['cars'] = Car.objects.all()
            return context
    

    En esta vista, usamos un vista de Django basada en clases para proporcionar el archivo HTML para mostrar nuestros coches. En nuestra opini贸n, estamos realizando una consulta para encontrar todos los coches almacenados en nuestra base de datos.

    A continuaci贸n, demostr茅moslo django_drive_app/templates/django_drive_app/cars.html para traer nuestros coches:

    <!DOCTYPE html>
    <html>
      <head>
        <title>Django Drive</title>
      </head>
      <body>
        <h2>Welcome to Django Drive. </h2>
        <p>Here are the current cars available for sale: </p>
        <div class="cars-container">
          {% for car in cars %}
            <div class="car">
              <p>
                <b> {{ car.name }} ({{ car.year_of_manufacture }}) </b> <br>
                Price: {{ car.price }}
              </p>
              <!-- if the car has an image attached -->
              {% if car.image %}
              <img src="{{ car.image }}" height="200" width="400"/>
              {% endif %}
              <!-- If the car has a video -->
              {% if car.video %}
                <video width="320" height="240" controls>
                    <source src="{{ car.video }}" type="video/mp4">
                  Your browser does not support the video tag.
                </video>
              {% endif %}
            </div>
            <hr>
          {% endfor %}
        </div>
      </body>
    </html>
    

    Con la escena y la plantilla en su lugar, veamos el punto final que se utilizar谩 para mostrar la lista de autom贸viles a los usuarios finales a trav茅s de la django_drive_app/urls.py:

    from django.conf.urls import url
    from .views import CarView
    
    urlpatterns = [
      url(r'^cars/$', CarView.as_view(), name="cars"),
    ]
    

    Importamos nuestra vista y agregamos una entrada de URL para mapear el punto final a la vista que dar谩n los autos. Cuando reiniciamos nuestro servidor y navegamos a 127.0.0.1:8000/cars/, llegamos a lo siguiente:

    Como podemos ver, creamos autos con im谩genes y videos adjuntos y los subimos al servicio S3 AWS. Las mismas im谩genes y videos se realizaron en nuestra aplicaci贸n web despu茅s de recibirlos de AWS.

    Conclusi贸n

    En este art铆culo, hemos creado una aplicaci贸n Django simple que permite a los administradores cargar archivos a AWS S3 a trav茅s del panel de administraci贸n de Django. Colocamos los archivos cargados alojados en S3 en nuestra p谩gina de destino, incluidos videos e im谩genes de los autos que los usuarios desean comprar o ver.

    Sol铆amos Django-s3direct una biblioteca para manejar la interacci贸n entre nuestras aplicaciones Django y AWS S3 en las que se almacenan nuestros archivos. A trav茅s de la aplicaci贸n de administraci贸n de Django, finalmente pudimos entregar archivos a los usuarios finales en nuestra p谩gina de destino. Pudimos subir y proporcionar im谩genes y videos.

    El c贸digo fuente de este proyecto est谩 disponible aqu铆 en GitHub.

    .

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *