Настройка взаимодействия приложения Django с хранилищем объектов

Данный мануал поможет вам настроить приложение Django для взаимодействия с хранилищем объектов.

Требования

  • Сервер Debian или Ubuntu (вам пригодятся мануалы по начальной настройке Debian или Ubuntu).
  • Хранилище объектов и API ключ.

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

Читайте также: Установка Python 3 и настройка среды разработки на сервере Ubuntu 16.04

2: Создание приложения Django и установка зависимостей

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

mkdir django-apps
cd django-apps

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

virtualenv env

Включите среду.

. env/bin/activate

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

(my_env) 8host@ubuntu:$

В среде с помощью pip установите пакет Django.

pip install django

Читайте также:

С помощью следующей команды создайте проект (здесь он условно называется mysite):

django-admin startproject mysite

Установите Boto 3, AWS SDK для Python, что позволит приложению взаимодействовать с S3, EC2 и т.п.

sudo pip install boto3

Также вам не обойтись без библиотеки django-storages, которая представляет собой набор пользовательских хранилищ для Django. Установите ее с помощью pip.

sudo pip install django-storages

3: Добавление каталогов и активов

Установив все зависимости, вы можете перейти в каталог mysite/mysite:

cd ~/django-apps/mysite/mysite

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

mkdir static && mkdir templates

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

mkdir static/img && mkdir static/css

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

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

Загрузите любое тестовое изображение:

wget http://assets.example.com/example-img.png

Вы получите такой вывод:

Resolving www.example.com (www.example.com)... 104.16.24.4, 104.16.25.4
Connecting to www.example.com (www.example.com)|104.16.24.4|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1283 (1.3K) [image/png]
Saving to: ‘example-img.png’
example-img-6edd7377 100%[=====================================>]   1.25K  --.-KB/s    in 0s
2017-11-05 12:26:24 (9.60 MB/s) - ‘example-img.png’ saved [1283/1283]

Если вы запустите команду ls, вы увидите изображение example-img в каталоге static/img/.

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

4: Редактирование файлов CSS и HTML

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

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

С помощью текстового редактора откройте документ:

nano app.css

Добавьте в него 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 home.html

Добавьте в него:

{% load static %}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Object Storage + Django Tutorial</title>
<link rel="stylesheet" type="text/css" href="{% static 'css/app.css' %}">
</head>
<body>
<center>
<header>
<h1>Object Storage + Django Tutorial</h1>
</header>
<main>
<img src="{% static 'img/example-img.png' %}">
<h2>Congratulations, you’re using object storage!</h2>
</main>
</center>
</body>
</html>

Сохраните и закройте файл. Теперь нужно обновить urls.py, чтобы этот файл указывал на новый файл home.html. Перейдите в каталог:

cd ~/django-apps/mysite/mysite

Отредактируйте файл urls.py:

nano 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, чтобы интегрировать его с хранилищем объектов.

5: Обновление настроек

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

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

Перейдите в каталог, где хранится ваш файл:

cd ~/django-apps/mysite/mysite

Откройте его в редакторе:

nano settings.py

В ALLOWED_HOSTS укажите ip своего сервера:

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

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

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

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

...
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 нужно вставить следующие строки. Укажите свой access key, имя корзины и каталог, в котором будут храниться файлы.

...
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
AWS_ACCESS_KEY_ID = 'your-storage-access-key'
AWS_SECRET_ACCESS_KEY = 'your-storage-secret-access-key'
AWS_STORAGE_BUCKET_NAME = 'your-storage-bucket-name'
AWS_S3_ENDPOINT_URL = 'https://nyc3.your-storage.com'
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
AWS_LOCATION = 'your-storage-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 с хранилищем объектов.

6: Сбор статических файлов

Теперь запустите collectstatic, и файлы будут переданы (включая изображение, которое вы сохранили в каталоге static) в каталог в хранилище, который вы определили в файле settings.

Перейдите в этот каталог:

cd ~/django-apps/mysite

Запустите команду:

python3 manage.py collectstatic

Вы увидите следующий вывод. По запросу введите yes.

You 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:

После этого вы увидите, что файл был скопирован в хранилище:

Copying '/root/django-apps/mysite/mysite/static/css/app.css'
1 static file copied, 1 unmodified.

После этого в каталоге хранилища появятся каталоги css и img. В каталоге css будет файл app.css, а в img – тестовое изображение example-img.png.

7: Тестирование приложения

Теперь можно протестировать работу приложения. Для этого попробуйте открыть страницу, на которой обслуживается статический файл.

Для начала убедитесь, что брандмауэр пропускает трафик по порту 8000:

sudo ufw allow 8000

Теперь можно запустить сервер:

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

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

Object Storage + Django Tutorial
Congratulations, you’re using object storage!

Нажмите CTRL + C, чтоб остановить команду runserver. Это вернет вас в стандартное окружение.

Чтобы отключить среду Python, введите:

deactivate

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

Заключение

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

Читайте также:

Tags: