Использование Python Decouple в приложении Django с хранилищем объектов

Python Decouple – это библиотека Python, которая позволяет разработчикам отделять параметры конфигурации от кода. Первоначально разработанная для Django, теперь она является универсальным инструментом Python для хранения параметров и определения постоянных значений отдельно от кода приложения.

В этом мануале вы узнаете, как установить Python Decouple и как использовать его в базовом приложении Django с хранилищем объектов.

Требования

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.

Теперь можно перейти в среду разработки Python.

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

Затем затем создать приложение Django и установить необходимые зависимости, чтобы использовать хранилище объектов и Python Decouple.

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

mkdir django-apps
cd django-apps

В каталоге django-apps создайте новую виртуальную среду (она будет называться env).

virtualenv env

Включите виртуальную среду:

. env/bin/activate

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

(env) 8host@ubuntu:$

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

Читайте также: Создание приложения Django и подключение к базе данных

pip install django

С помощью этой команды создайте новый проект mysite:

django-admin startproject mysite

Затем нужно установить Boto 3, AWS SDK для Python, который позволит интегрировать средства хранения объектов в приложение Django.

На момент написания статьи Boto 3 совместим с S3.

Запустите следующую команду, чтоб установить Boto 3:

pip install boto3

Также нужно установить django-storages, набор пользовательских бэкэндов хранилищ для Django и boto3.

pip install django-storages

Теперь установите Python Decouple:

pip install python-decouple

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

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

cd ~/django-apps/mysite/mysite

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

mkdir static && mkdir templates

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

mkdir static/img && mkdir static/css

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

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

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

wget http://assets.my-site.com/images/my-image.png

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

Нажмите Enter, и вы увидите:

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

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

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

Для начала нужно настроить стили. Перейдите в каталог css и добавьте базовый стиль приложения.

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

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

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, откройте файл для редактирования:

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/my-image.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'),
]

5: Отделение учетных данных хранилища с помощью Python Decouple

В виртуальной среде перейдите к каталогу, в котором хранится settings.py. Здесь нужно создать файл settings.ini для хранения учетных данных.

cd ~/django-apps/mysite/mysite

Создайте файл settings.ini с помощью touch (это команда Linux для создания новых пустых файлов в текущем каталоге).

touch settings.ini

Этот файл settings будет иметь расширение .ini. Python Decouple будет искать в нем параметры, также этот файл хранит ваш ключ API. Вы можете использовать .env как альтернативное расширение для .ini.

Откройте файл settings.ini:

nano settings.ini

В этом документе будет заголовок раздела [settings] (согласно требованиям Python Decouple), после него можно добавить учетные данные хранилища, присвоив их переменным. Полный файл должен выглядеть следующим образом:

[settings]
STORAGE_ACCESS_KEY=your-object-storage-access-key
STORAGE_SECRET_ACCESS_KEY=your-object-storage-secret-access-key

Чтобы использовать эти учетные данные, нужно сослаться на файл settings.ini в settings.py.

6: Обновление конфигурации

Теперь пришло время обновить файл settings.py и указать учетные данные хранилища объектов.

Убедитесь, что вы находитесь в правильном каталоге.

cd ~/django-apps/mysite/mysite

Откройте нужный файл:

nano settings.py

В начало файла нужно добавить оператор import, чтобы использовать модуль config

Decouple.

Читайте также: Импорт модулей в Python 3

...
import os
from decouple import config
...

Найдите строку ALLOWED_HOSTS и укажите в ней IP своего сервера:

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

Затем добавьте storages в раздел установленных приложений (INSTALLED_APPS) и удалите 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. Первые две строки добавляют ссылку на файл settings.ini, чтобы приложение могло получить параметры конфигурации.

Затем обязательно добавьте имя вашей корзины.

...
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
AWS_ACCESS_KEY_ID = config('OBJECT_STORAGE_ACCESS_KEY')
AWS_SECRET_ACCESS_KEY = config('OBJECT_STORAGE_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = 'your-storage-bucket-name'
AWS_S3_ENDPOINT_URL = 'https://nyc3.your-object-storage.com'
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
AWS_LOCATION = 'your-object-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'

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

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

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

Перейдите в ~/django-apps/mysite/:

cd ~/django-apps/mysite

В этом каталоге запустите команду:

python manage.py collectstatic

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

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:

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

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

Если вы на этом этапе зайдете в корзину, вы увидите, что в указанную папку добавлены каталоги css и img, в каталоге css есть файл app.css, а в каталоге img – файл my-image.png.

8: Запуск приложения

Если у вас включен брандмауэр UFW, откройте в нем порт 8000:

sudo ufw allow 8000

Пока виртуальная среда включена, перейдите в каталог, в котором находится manage.py, и запустите приложение:

cd ~/django-apps/mysite
python manage.py runserver <your-server-ip>:8000

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

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

Чтобы отключить среду Python, запустите команду deactivate:

deactivate

После этого вы вернетесь в командную строку терминала.

Заключение

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

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

Tags: , , , ,