Рубрики
Без рубрики

Загрузка файлов в AWS S3 с помощью Python и Django

AWS S3-это отличный и недорогой сервис для хранения файлов. В этой статье мы будем использовать Python и Django для загрузки файлов в AWS S3.

Автор оригинала: Robley Gori.

Вступление

В стремлении создать более интерактивные веб-сайты мы не только передаем информацию пользователям, но и позволяем им загружать свои собственные данные. Это открывает больше возможностей и больше способов, которыми наши веб-сайты могут обслуживать конечных пользователей.

Разрешая пользователям загружать файлы, мы можем позволить им делиться фотографиями, видео или музыкой с другими или создавать резервные копии для безопасного хранения. Мы также можем предоставить функциональность для управления файлами и преобразования их в другие форматы через веб-сайты вместо установки собственных приложений.

Рост социальных сетей во всем мире можно объяснить способностью пользователей загружать свои файлы, в основном в виде изображений и видео для просмотра другими пользователями, а также в качестве средства коммуникации. Предоставляя пользователям возможность загружать файлы на веб-сайты и платформы, средства коммуникации были усовершенствованы, и теперь информация может распространяться в самых разных форматах.

В этом посте мы рассмотрим, как Django обрабатывает загрузку файлов и как мы можем использовать и расширять эту функциональность с помощью облачного хранилища в соответствии с нашими потребностями.

Как Django Обрабатывает Файловое Хранилище

Django не только позволяет нам превращать концепции в веб-приложения, но и предоставляет нам функциональность для обработки файлов и позволяет пользователям загружать файлы в наши веб-приложения для дальнейшего взаимодействия. С помощью форм пользователи могут прикреплять файлы к своим запросам, загружать их и хранить на наших внутренних серверах.

Прежде чем файл будет сохранен, он временно хранится где-то, прежде чем быть обработанным и сохраненным в предполагаемом конечном местоположении. Например, если загруженный файл меньше 2,5 МБ, содержимое этого файла будет сохранено в памяти, а затем записано на диск после завершения всех операций при его обработке.

Это делает процесс быстрым для небольших файлов. Для файлов размером более 2,5 МБ они сначала записываются во временное место по мере получения данных, а затем, как только обработка завершена, файл перемещается в конечный пункт назначения.

Поведение файлов в Django можно настроить с помощью различных настроек, таких как FILE_UPLOAD_MAX_MEMORY_SIZE , что позволяет нам изменить предельный размер загрузки 2,5 МБ для файлов, которые сначала записываются в память, а не во временное место. Мы также можем настроить разрешения по умолчанию для загруженных файлов через FILE_UPLOAD_PERMISSIONS .

Другие настройки можно найти в этом разделе официальной документации Django.

Где мы можем хранить наши файлы?

В веб-приложении на базе Django мы можем хранить загруженные файлы в разных местах. Мы можем хранить их на наших собственных серверах, где развернут код Django, или мы можем отправить их на другие серверы, которые, возможно, были созданы в другом месте для хранения.

Стремясь сократить расходы на обслуживание сервера и повысить производительность, мы также можем отказаться от хранения загруженных файлов на наших собственных серверах. В этом случае мы можем передать их другим поставщикам размещенных хранилищ, таким как AWS , Azure или OneDrive , среди прочих.

Существует несколько пакетов, которые позволяют нам взаимодействовать с API, предоставляемыми различными поставщиками услуг, о которых мы упоминали. Они включают в себя:

Для этого поста мы будем использовать пакет Django-s3direct для хранения наших файлов на Aws S3.

Наше приложение – Django Drive

Мы будем использовать Django для создания веб-приложения, в котором мы будем загружать контент для просмотра конечными пользователями. Это будет достигнуто с помощью интерфейса администрирования Django, который поставляется вместе с фреймворком.

Наш сайт будет использоваться для продажи автомобилей, и на нем мы будем отображать детали и добавлять изображения или видео продаваемых автомобилей.

Изображения или видео автомобилей, выставленных на продажу, будут храниться на S3. Мы не будем осуществлять регистрацию пользователя или вход в систему в настоящее время для краткости.

Установка

Мы будем использовать Pipenv для настройки и управления нашей изолированной средой, в которой мы будем создавать наше приложение Django, выполнив следующую команду для его настройки с помощью Python3:

$ pipenv install --three

Теперь, когда среда настроена, мы можем установить Django и Django-s3direct для обработки наших загрузок файлов в S3:

$ pipenv install django django-s3direct

Django предоставляет набор команд для начальной загрузки нашего проекта, прежде чем мы начнем реализовывать основную функциональность нашего приложения. Наш проект Django drive будет иметь одно приложение, которое будет в центре внимания этого поста. Для этого мы запускаем следующие команды:

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

Проект django-admin startproject ... команда создает проект, а django-admin startapp ... команда создает приложение.

Последний шаг нашей настройки-создание таблиц базы данных с помощью команды migrate :

$ python manage.py migrate

Когда мы начинаем наш проект, выполнив команду python manage.py runserver , нас приветствует следующая страница, которая подтверждает, что наша настройка прошла успешно:

загрузка файлов настройка завершена

Поскольку мы будем загружать наши файлы в AWS S3, нам нужно будет создать бесплатный уровень аккаунт AWS для демонстрационных целей. После настройки мы можем перейти на панель мониторинга S3 и создать новое ведро, которое будет содержать наши загрузки.

Чтобы Django-s3direct взаимодействовал с нашей настройкой AWS, нам необходимо предоставить следующие учетные данные AWS_ACCESS_KEY_ID , AWS_SECRET_ACCESS_KEY и AWS_STORAGE_BUCKET_NAME .

Далее мы добавим следующее к вашему django_drive/settings.py файл:

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 позволяет нам указать более одного места назначения для наших загрузок, таким образом, мы можем направлять различные файлы в отдельные сегменты S3. Для этого проекта мы поместим все загрузки в одно ведро. Еще одна интересная особенность заключается в том, что мы также можем ограничить типы файлов, которые могут быть загружены на наш веб-сайт. В нашем случае мы ограничили его только MP4-видео, JPEG-и PNG-изображениями.

Примечание: Более подробную информацию о настройке Django-s3direct , например CARS и Access Setup , можно найти здесь .

Нам также нужно добавить следующие записи в django_drive/urls.py файл:

from django.urls import path, include

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

Реализация

Мы начнем с создания модели для наших автомобильных данных, которая будет отображаться конечным пользователям. Эта модель также определит информацию, которую мы будем вводить в нашу панель администратора при добавлении автомобилей на нашу платформу. Модель автомобиля будет выглядеть следующим образом:

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}"

Для каждого автомобиля мы будем хранить его название, год выпуска, цену и изображение или видео. После создания модели давайте сделаем миграции, чтобы создать таблицу в базе данных, которая будет содержать наши данные, запустив:

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

Поскольку мы будем использовать панель администратора Django для управления автомобилями на нашей платформе, нам нужно зарегистрировать нашу модель в django_drive_app/admin.py :

from django.contrib import admin
from.models import Car

admin.site.register(Car)

Затем нам нужно создать суперпользователя, который будет отвечать за добавление автомобилей, выполнив следующую команду и следуя подсказкам:

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

python manage.py команда runserver просто перезапускает ваше приложение.

После перезагрузки нашего сервера мы теперь можем перейти на панель администрирования по адресу http://127.0.0.1:8000/admin и войдите в систему с учетными данными, которые мы указали ранее. В разделе администрирование сайта мы можем увидеть наш DJANGO_DRIVE_APP с возможностью добавления или изменения существующих автомобилей.

Это форма, которую мы используем для добавления автомобиля и его деталей:

django application admin add car

Как только мы сохраним наш автомобиль, мы сможем найти изображение, которое мы загрузили в наше ведро S3 на консоли AWS. Это означает, что ваш файл был загружен в AWS.

Теперь мы создадим представление для отображения автомобилей и их данных конечным пользователям нашего веб-сайта, а также для отображения изображений или видео, связанных с каждым автомобилем. Мы начнем с создания представления в 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

В этом представлении мы используем class-based Django view для рендеринга HTML-файла для отображения наших автомобилей. На наш взгляд, мы запускаем запрос, чтобы получить все автомобили, хранящиеся в нашей базе данных.

Далее создадим django_drive_app/templates/django_drive_app/cars.html рендерить наши автомобили:




  
    Django Drive
  
  
    

Welcome to Django Drive.

Here are the current cars available for sale:

{% for car in cars %}

{{ car.name }} ({{ car.year_of_manufacture }})
Price: {{ car.price }}

{% if car.image %} {% endif %} {% if car.video %} {% endif %}

{% endfor %}

Имея представление и шаблон на месте, давайте добавим конечную точку, которая будет использоваться для отображения списка автомобилей конечным пользователям, создав django_drive_app/urls.py :

from django.conf.urls import url
from .views import CarView

urlpatterns = [
  url(r'^cars/$', CarView.as_view(), name="cars"),
]

Мы импортируем наше представление и добавляем запись URL-адреса, чтобы сопоставить конечную точку с представлением, которое будет отображать автомобили. Когда мы перезапускаем наш сервер и переходим к 127.0.0.1:8000/cars/ , мы сталкиваемся со следующим:

целевая страница автомобиля приложения django

Как мы видим, мы создали автомобили с прикрепленными изображениями и видео и загрузили их в сервис Aws S3. Те же изображения и видео были отрисованы в нашем веб-приложении после получения из AWS.

Вывод

В этой статье мы создали простое приложение Django, которое позволяет администраторам загружать файлы в AWS S3 через панель администрирования Django. Мы визуализировали загруженные файлы, размещенные на S3 на вашей целевой странице, включая видео и изображения автомобилей, которые пользователи хотели бы приобрести или просмотреть.

Мы использовали библиотеку Django-s3direct для обработки взаимодействия между нашим приложением Django и AWS S3, где хранятся наши файлы. С помощью приложения администрирования Django мы смогли загрузить файлы, которые в конечном итоге были представлены конечным пользователям на нашей целевой странице. Мы могли загружать и визуализировать как изображения, так и видео.

Исходный код этого проекта доступен здесь, на GitHub .