Как настроить хранилище объектов с помощью Django

Вступление

DigitalOcean Spaces - это решение для хранения объектов, идеально подходящее для неструктурированных данных, таких как аудио, видео, изображения или большие объемы текста. Чтобы узнать больше о пространствах и хранилище объектов, вы можете прочитатьAn Introduction to DigitalOcean Spaces.

В этом уроке мы расскажем, как настроить приложение Django для работы с Spaces.

Предпосылки

Чтобы начать этот урок, вам нужно настроить несколько вещей:

  • Учетная запись пользователя без полномочий root с привилегиямиsudo, настроенная на сервере Debian или Ubuntu Linux. Если вы еще не настроили это, следуйте инструкциямinitial server setup for Ubuntu 16.04 илиDebian.

  • Кроме того, вы должны создать DigitalOcean Space и сгенерировать ключ API. Для руководства по этому поводу вы можете следовать этомуtutorial to create a Space and set up the API key.

С первоначальной настройкой сервера и ключом DigitalOcean Space и API вы готовы к работе.

[[step-1 -—- set-up-a-virtual-environment]] == Шаг 1. Настройка виртуальной среды

Если вы еще этого не сделали, сначала обновите и обновите свой сервер.

sudo apt-get update && sudo apt-get -y upgrade

Ваш сервер должен поставляться с Python 3, но вы можете выполнить следующую команду, чтобы убедиться, что он установлен:

sudo apt-get install python3

Затем установите pip для управления программными пакетами для Python:

sudo apt-get install -y python3-pip

Наконец, мы можем установить модульvirtualenv, чтобы использовать его для настройки среды программирования:

sudo pip3 install virtualenv

Для получения дополнительных указаний и информации о средах программирования вы можете прочитать оsetting up a virtual environment.

[[step-2 -—- create-django-app-and-install-dependencies]] == Шаг 2. Создание приложения Django и установка зависимостей

Теперь мы переходим к созданию приложения Django, которое будет использовать наше пространство DigitalOcean.

Находясь в домашнем каталоге сервера, выполните следующую команду, чтобы создать каталог (в данном случае мы назовем егоdjango-apps) для хранения проекта и перехода к нему:

mkdir django-apps
cd django-apps

В этом каталоге создайте виртуальную среду с помощью следующей команды. Мы назовем егоenv, но вы можете называть его как хотите.

virtualenv env

Теперь вы можете активировать среду и получать отзывы о том, что вы находитесь в среде, путем изменения префикса командной строки.

. env/bin/activate

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

Внутри среды установите пакет Django с помощью pip, чтобы мы могли создать и запустить приложение Django. Чтобы узнать больше о Django, прочтите нашу серию руководств поDjango Development.

pip install django

Затем создайте проект с помощью следующей команды, в данном случае мы назовем егоmysite.

django-admin startproject mysite

Затем мы установим Boto 3, который представляет собойAWS SDK for Python, который позволит нашему приложению взаимодействовать с такими вещами, как S3, EC2 и DigitalOcean Spaces. Поскольку DigitalOcean Spaces совместим с Amazon S3, Spaces может легко взаимодействовать с такими инструментами, как Boto 3. Для получения дополнительных сведений о сравнении S3 и Spaces ознакомьтесь сSpaces docs.

sudo pip install boto3

Еще одна важная для нашего проекта библиотека - это django-storerages, этоa collection of custom storage backends for Django. Мы также установим это с помощью pip.

sudo pip install django-storages

Вы настроили свои зависимости в среде вашего приложения Django и теперь готовы установить статические и шаблонные каталоги.

[[step-3 -—- add-directoryies-and-assets]] == Шаг 3 - Добавить каталоги и ресурсы

Когда наша среда настроена со всеми зависимостями, теперь вы можете переключиться в каталогmysite/mysite,

cd ~/django-apps/mysite/mysite

В каталогеmysite/mysite выполните следующие команды, чтобы создать каталоги static и template.

mkdir static && mkdir templates

Затем мы создадим подкаталоги для изображений и CSS, которые будут размещаться в каталогеstatic.

mkdir static/img && mkdir static/css

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

cd ~/django-apps/mysite/mysite/static/img

В этом каталоге мы загрузим изображение логотипа DigitalOcean с помощью команды Wgetwget. Это широко используемая программа GNU, предустановленная в дистрибутивах Ubuntu, для извлечения контента с веб-серверов.

wget http://assets.digitalocean.com/logos/DO_Logo_icon_blue.png

Вы увидите вывод, похожий на следующий:

OutputResolving www.digitalocean.com (www.digitalocean.com)... 104.16.24.4, 104.16.25.4
Connecting to www.digitalocean.com (www.digitalocean.com)|104.16.24.4|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1283 (1.3K) [image/png]
Saving to: ‘DO_Logo_icon_blue.png’

DO_Logo_icon_blue-6edd7377 100%[=====================================>]   1.25K  --.-KB/s    in 0s

2017-11-05 12:26:24 (9.60 MB/s) - ‘DO_Logo_icon_blue.png’ saved [1283/1283]

На этом этапе, если вы запустите командуls, вы заметите, что изображение с именемDO_Logo_icon_blue.png теперь существует в каталогеstatic/img/.

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

[[step-4 -—- edit-css-and-html-files]] == Шаг 4. Редактирование файлов CSS и HTML

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

cd ~/django-apps/mysite/mysite/static/css

Для редактирования документа используйте nano или другой текстовый редактор по вашему выбору.

nano app.css

Как только файл откроется, добавьте следующий CSS:

app.css

body {
  margin: 0;
  background-color: #f1f1f1;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}

.container {
  width: 80%;
  border: 1px solid #ddd;
  background-color: #fff;
  padding: 20px;
  margin: 40px auto;
}

form {
  margin-bottom: 20px;
  padding: 10px;
  border: 1px solid #ff9900;
  width: 350px;
}

table {
  border-collapse: collapse;
  width: 100%;
}

table td,
table th {
  border: 1px solid #eceeef;
  padding: 5px 8px;
  text-align: left;
}

table thead {
  border-bottom: 2px solid #eceeef;
}

Как только вы закончите, вы можете сохранить и закрыть файл. Отсюда перейдите в каталогtemplates.

cd ~/django-apps/mysite/mysite/templates

Нам нужно открыть файл с именемhome.html и добавить в него HTML, чтобы определить, как будет отображаться наше базовое веб-приложение. Используя nano, откройте файл, чтобы он был готов для редактирования:

nano home.html

В документе добавьте следующее:

home.html

{% load static %}



  
  Spaces + Django Tutorial
  


  

Spaces + Django Tutorial

Congratulations, you’re using Spaces!

Сохраните и закройте файл. Последний файл, который мы обновим, - это файлurls.py, чтобы он указывал на ваш недавно созданный файлhome.html. Нам нужно перейти в следующий каталог:

cd ~/django-apps/mysite/mysite

Используйте nano для редактирования файла urls.py.

nano urls.py

Вы можете удалить все в файле, а затем добавить следующее:

urls.py

from django.conf.urls import url
from django.views.generic import TemplateView


urlpatterns = [
    url(r'^$', TemplateView.as_view(template_name='home.html'), name='home'),
]

Настроив эти файлы, мы можем перейти к редактированию нашего файлаsettings.py, чтобы интегрировать его с хранилищем объектов.

[[step-5 -—- update-settings]] == Шаг 5. Обновите настройки

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

Имейте в виду, что в этом примере мы кратко закодируем наши учетные данные, но этого недостаточно для безопасной производственной установки. Рекомендуется использовать такой пакет, какPython Decouple, что-то вроде маскировки ваших учетных данных Spaces. Этот пакет отделит параметры настроек от вашего исходного кода, что необходимо для приложения Django промышленного уровня.

Начнем с перехода к местоположению файла настроек.

cd ~/django-apps/mysite/mysite

Откройте файл для редактирования, используя nano:

nano settings.py

Добавьте ваш ip сервера в качестве разрешенного хоста.

settings.py

...
ALLOWED_HOSTS = ['your-server-ip']
...

Затем добавьтеstorages в раздел установленных приложений файла настроек и удалитеdjango.contrib.admin, поскольку мы не будем использовать это в этом руководстве. Это должно выглядеть следующим образом.

settings.py

...
# Application definition

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'storages'
]
...

Замените и добавьте выделенный текст в разделTEMPLATES файла настроек, чтобы проект знал, где найти ваш файл home.html.

settings.py

...
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'mysite/templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
...

Наконец, давайте обновим ваши настройки внизу файла. Мы добавим следующее ниже раздела# Static files. Обязательно добавьте свои собственные ключи доступа, имя корзины и каталог, в котором вы хотите хранить свои файлы. Вы можете добавить каталог через интерфейс Spaces в браузере. На момент написания, NYC3 является единственным регионом, где в настоящее время находятся пробелы, поэтому он передается в качестве URL-адреса конечной точки.

settings.py

...
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/

AWS_ACCESS_KEY_ID = 'your-spaces-access-key'
AWS_SECRET_ACCESS_KEY = 'your-spaces-secret-access-key'
AWS_STORAGE_BUCKET_NAME = 'your-storage-bucket-name'
AWS_S3_ENDPOINT_URL = 'https://nyc3.digitaloceanspaces.com'
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}
AWS_LOCATION = 'your-spaces-files-folder'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'mysite/static'),
]
STATIC_URL = 'https://%s/%s/' % (AWS_S3_ENDPOINT_URL, AWS_LOCATION)
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

Теперь наш файл настроек готов интегрировать наше приложение Django с хранилищем объектов.

[[step-6 -—- collect-static-files]] == Шаг 6. Сбор статических файлов

Теперь запустимcollectstatic, и вы заметите, что файлы передаются, включая изображение, которое мы сохранили в нашем статическом каталоге. Он будет перенесен в место Spaces, которое мы определили в файле настроек.

Для этого перейдем к~/django-apps/mysite/:

cd ~/django-apps/mysite

В каталоге выполните следующую команду:

python manage.py collectstatic

Вы увидите следующий вывод и должны ответить «да», когда будет предложено.

OutputYou have requested to collect static files at the destination
location as specified in your settings.

This will overwrite existing files!
Are you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel:

Затем вы увидите еще один вывод о том, что файл был скопирован в пробелы.

OutputCopying '/root/django-apps/mysite/mysite/static/css/app.css'

1 static file copied, 1 unmodified.

На этом этапе, если вы вернетесь в свою корзину из своей учетной записи DigitalOcean Cloud, вы увидите, что каталогиcss иimg добавлены в папку, на которую вы их указали, сapp.css в Каталогcss и изображениеDO-Logo_icon_blue-.png в каталогеimg.

[[step-7 -—- test-the-application]] == Шаг 7. Протестируйте приложение

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

Во-первых, давайте убедимся, что наш брандмауэр будет пропускать трафик через порт 8000, выполнив следующую команду:

sudo ufw allow 8000

Теперь мы можем запустить наш сервер, ссылаясь на IP-адрес нашего сервера и используя порт 8000.

python manage.py runserver your-server-ip:8000

В веб-браузере перейдите кhttp://your-server-ip:8000, чтобы увидеть результат работы созданного вами приложения Django. Вы увидите следующий вывод в вашем браузере:

DigitalOcean Spaces Django Example App

Когда вы закончите тестирование своего приложения, вы можете нажатьCTRL +C, чтобы остановить командуrunserver. Это вернет вас в среду программирования.

Когда вы будете готовы покинуть среду Python, вы можете запустить командуdeactivate:

deactivate

Деактивация среды программирования вернет вас в командную строку терминала.

Заключение

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

Вы можете продолжить изучение веб-разработки с помощью Python и Django, прочитав нашу серию руководств поDjango Development.

Related