Работа с образом Django в Vscale
Введение
Django — свободно распространяемый фреймворк для разработки веб-приложений на Python. Фреймворк — это набор шаблонов, которые помогают ускорить и упростить процесс разработки.
В Vscale есть готовый образ с Django, и вы можете установить его в один клик.
В этой статье мы расскажем о том, как создать сервер с предустановленным Django, и покажем, как написать простейшее приложение.
Структура образа
Сервер с Django работает под управлением ОС Ubuntu 16.04.
В состав образа входит Django версии 1.8.7 со всеми необходимыми зависимостями:
- веб-сервером nginx 1.10.0;
- UWSGI-сервером gunicorn 19.4.5;
- Python 3.5;
- системой управления базами данных PostgreSQL 9.5.
При создании сервера в системе создаётся также учётная запись специального пользователя для работы с Django — django-user. В домашней директории этого пользователя имеется директория для проектов (/home/django-user/django-projects).
Создание сервера
Выберите образ с Django в панели управления:
После этого вы получите логин и пароль для доступа к Django:
Эти же логин и пароль будут высланы вам на адрес электронной почты, который вы указали при регистрации.
Как только сервер будет создан, откройте в браузере страницу с адресом http://<IP-адрес сервера>. Вы увидите сообщение о том, что Django готов к работе:
Всё готово к тому, чтобы познакомиться с Django поближе и создать первый проект.
Практические рекомендации по работе с образом
Создаём первый проект
Подключимся к серверу по SSH.
Далее выполним команду:
$ sudo django-admin startproject myproject
В результате выполнения этой команды будет создана директория myproject, в которой находятся файл manage.py и поддиректория myproject. Схематично структуру проекта можно представить так:
myproject/
manage.py
myproject/
__init__.py
settings.py
urls.py
wsgi.py
В директории myproject находится файл manage.py, который представляет собой программу на Python. Эта программа предназначена для управления проектами и является полным аналогом утилиты django-admin.
Во вложенной директории, которая тоже называется myproject, находятся следующие файлы:
- _init_.py — пустой файл, необходимый для того, чтобы Python рассматривал директорию проекта как пакет;
- settings.py — здесь прописываются настройки проекта;
- urls.py — в этом файле хранятся шаблоны URL-адресов для проекта;
- wsgi.py — здесь хранятся настройки модуля wsgi для веб-сервера.
Пишем собственное приложение
Мы сделаем простейшее приложение, которое будет отображать в браузере текст This is our first Django app. Перейдём в директорию myproject:
$ cd myproject
Выполним:
$ sudo django-admin startapp myapp
После это в директории myproject появится ещё одна поддиректория — myapp. Перейдём в неё, откроем файл views.py и отредактируем следующим образом:
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return HttpResponse("This is my first Django app.")
Мы создали так называемое представление (view) и указали, что будет отображаться в браузере, когда пользователи откроют страницу нашего приложения.
Отредактируем файл myproject/urls.py — это нужно, чтобы “привязать” наше приложение к URL-адресу:
from django.conf.urls import include, url
from django.contrib import admin
from myapp import views
urlpatterns = (
url(r'^$', views.index, name='index'),
url(r'^admin/', include(admin.site.urls)),
)
Далее откроем файл myproject/settings.py (в нём хранятся основные настройки проекта) и найдем в нем следующую строку:
ALLOWED_HOSTS=[]
Отредактируем ее следующим образом:
ALLOWED_HOSTS= "*"
Сохраним внесённые изменения и выполним:
$ sudo gunicorn3 myproject.wsgi --bind unix:/run/gunicorn/socket
Откроем в браузере страницу http://<IP-адрес сервера>. Мы увидим тот самый текст, который мы поместили ранее в файл views.py: This is my first Django app.
Всё работает. Но есть один минус: если по каким-то причинам gunicorn остановится, то приложение не будет доступным пользователям. Поэтому gunicorn нужно всегда поддерживать запущенным. Для этого нам потребуется прописать соответствующие настройки в юнит-файле для systemd.
Редактируем юнит-файл для gunicorn
Нам даже не понадобится создавать юнит-файл с нуля: он в образе с Django уже имеется “из коробки”. Достаточно будет лишь отредактировать его под специфику проекта. Как уже говорилось выше, для работы с Django в системе заведён отдельный пользователь django-user. По умолчанию gunicorn запускается при запуске системы от его имени.
Все эти настройки прописаны в юнит-файле /etc/systemd/system/gunicorn:
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
PIDFile=/run/gunicorn/pid
User=django-user
Group=django-user
RuntimeDirectory=gunicorn
WorkingDirectory=/home/django-user/django-project/demo
ExecStart=/usr/bin/gunicorn3 --pid /run/gunicorn/pid --bind unix:/run/gunicorn/socket [имя проекта].wsgi
ExecReload=/bin/kill -s HUP
ExecStop=/bin/kill -s TERM
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Чтобы работать с Django под другой учётной записью и запускать из под неё gunicorn, нам потребуется внести в этот файл изменения. Остановим работу gunicorn:
$ sudo systemctl stop gunicorn.service
$ sudo systemctl stop gunicorn.socket
После этого откроем в текстовом редакторе файл /etc/systemd/system/gunicorn.service и отредактируем его следующим образом:
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
PIDFile=/run/gunicorn/pid
User=[имя пользователя]
Group=[группа]
RuntimeDirectory=gunicorn
WorkingDirectory=[путь к проекту]
ExecStart=/usr/bin/gunicorn3 --pid /run/gunicorn/pid --bind unix:/run/gunicorn/socket [имя проекта].wsgi
ExecReload=/bin/kill -s HUP
ExecStop=/bin/kill -s TERM
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Сохраним изменения и выполним:
$ sudo systemctl daemon-reload
$ sudo systemctl start gunicorn.service
$ sudo systemctl start gunicorn.socket
Откроем в браузере страницу http://[IP-адрес сервера].
-
Добрый день!
К сожалению, не удается связать этот образ с git-репозитарием. Может быть, я, по неопытности не так делаю.
1) В домашней директории своего пользователя выполнил git clone <myrepo>
2) Создал виртуальное окружение <myrepo>/<myvenv>, активироал, установил Django2.0.2
3) Django проект находится в /home/myuser/<myrepo>/<myproject>
4) В gunicorn.service прописал
User=myuser Group=myuser WorkingDirectory=/home/myuser/<myrepo>/<myproject> ExecStart=/usr/bin/gunicorn3 --pid /run/gunicorn/pid --bind unix:/run/gunicorn/socket <myproject>.wsgi
И теперь
$ sudo gunicorn3 myproject.wsgi --bind unix:/run/gunicorn/socket
Вылетает с ошибкой
[INFO] Starting gunicorn ...
[ERROR] Can't connect to /run/gunicorn/socket
Войдите в службу, чтобы оставить комментарий.
Комментарии
Комментариев: 4