Как сделать сервер на django
Обновлено: 06.07.2024
В этом руководстве мы проведем вас через создание простого приложения для опроса.
Он будет состоять из двух частей:
- Общедоступный сайт, который позволяет людям просматривать опросы и голосовать в них.
- Сайт администратора, который позволяет добавлять, изменять и удалять опросы.
Предположим, у вас уже установлен Django . Вы можете узнать, какой Django установлен и какая версия установлена, выполнив следующую команду в приглашении оболочки (обозначено префиксом $):
Это руководство написано для Django 3.2, который поддерживает Python 3.6 и новее. Если версия Django не совпадает, вы можете обратиться к руководству для вашей версии Django, используя переключатель версий в правом нижнем углу этой страницы, или обновить Django до последней версии. Если вы используете старую версию Python, проверьте, какую версию Python можно использовать с Django? чтобы найти совместимую версию Django.
См. Раздел Как установить Django, чтобы узнать, как удалить старые версии Django и установить новую.
Где получить помощь:
Создание проекта ¶
Если вы впервые используете Django, вам придется позаботиться о первоначальной настройке. А именно, вы должны будете автоматически генерировать код , который устанавливает Django проект - набор настроек для экземпляра Django, включая конфигурацию базы данных, параметры Django-специфические и настройки конкретных приложений.
Из командной строки cd в каталог, в котором вы хотите сохранить свой код, затем выполните следующую команду:
Это создаст mysite каталог в вашем текущем каталоге. Если не помогло, см. Проблемы с запуском django-admin .
Вам нужно избегать именования проектов после встроенных компонентов Python или Django. В частности, это означает, что вам следует избегать использования таких имен, как django (которые будут конфликтовать с самим Django) или test (которые конфликтуют со встроенным пакетом Python).
Где должен жить этот код?
Если ваш опыт работы с простым старым PHP (без использования современных фреймворков), вы, вероятно, привыкли помещать код в корень документа веб-сервера (в таком месте, как /var/www ). С Django этого не сделать. Не рекомендуется помещать какой-либо из этого кода Python в корень документа вашего веб-сервера, поскольку это создает риск того, что люди смогут просматривать ваш код через Интернет. Это плохо для безопасности.
Поместите свой код в какой-нибудь каталог вне корня документа, например /home/mycode .
Посмотрим, что startproject создано:
Сервер разработки ¶
Давайте проверим, что ваш проект Django работает. Перейдите во внешний mysite каталог, если вы еще этого не сделали, и выполните следующие команды:
Вы увидите следующий вывод в командной строке:
Пока не обращайте внимания на предупреждение о непримененных миграциях базы данных; мы займемся базой данных в ближайшее время.
Вы запустили сервер разработки Django, легкий веб-сервер, написанный исключительно на Python. Мы включили это в Django, чтобы вы могли быстро разрабатывать вещи, не занимаясь настройкой рабочего сервера, такого как Apache, до тех пор, пока вы не будете готовы к производству.
Пришло время отметить: не используйте этот сервер в чем-либо, напоминающем производственную среду. Он предназначен только для использования во время разработки. (Мы занимаемся созданием веб-фреймворков, а не веб-серверов.)
По умолчанию runserver команда запускает сервер разработки на внутреннем IP-адресе через порт 8000.
Если вы хотите изменить порт сервера, передайте его в качестве аргумента командной строки. Например, эта команда запускает сервер на порту 8080:
Если вы хотите изменить IP-адрес сервера, передайте его вместе с портом. Например, чтобы прослушивать все доступные общедоступные IP-адреса (что полезно, если вы используете Vagrant или хотите продемонстрировать свою работу на других компьютерах в сети), используйте:
0 - это ярлык для 0.0.0.0 . Полную документацию по серверу разработки можно найти в runserver справочнике.
Сервер разработки автоматически перезагружает код Python для каждого запроса по мере необходимости. Вам не нужно перезапускать сервер, чтобы изменения кода вступили в силу. Однако некоторые действия, такие как добавление файлов, не вызывают перезапуск, поэтому в этих случаях вам придется перезапустить сервер.
Создание приложения "Опросы" ¶
Каждое приложение, которое вы пишете в Django, состоит из пакета Python, который следует определенному соглашению. Django поставляется с утилитой, которая автоматически генерирует базовую структуру каталогов приложения, поэтому вы можете сосредоточиться на написании кода, а не на создании каталогов.
Проекты против приложений
В чем разница между проектом и приложением? Приложение - это веб-приложение, которое что-то делает, например, система веб-журналов, база данных общедоступных записей или небольшое приложение для опросов. Проект - это набор конфигураций и приложений для определенного веб-сайта. Проект может содержать несколько приложений. Приложение может быть в нескольких проектах.
Ваши приложения могут жить где угодно на вашем пути Python . В этом руководстве мы создадим наше приложение для опроса в том же каталоге, что и ваш manage.py файл, чтобы его можно было импортировать как собственный модуль верхнего уровня, а не как подмодуль mysite .
Чтобы создать приложение, убедитесь, что вы находитесь в том же каталоге, что manage.py и, и введите эту команду:
Это создаст каталог polls , который выглядит следующим образом:
В этой структуре каталогов будет размещено приложение опроса.
Напишите свой первый взгляд ¶
Напишем первое представление. Откройте файл polls/views.py и поместите в него следующий код Python:
Это самый простой вид из возможных в Django. Чтобы вызвать представление, нам нужно сопоставить его с URL-адресом - и для этого нам понадобится URLconf.
Чтобы создать URLconf в каталоге опросов, создайте файл с именем urls.py . Каталог вашего приложения теперь должен выглядеть так:
В polls/urls.py файл включаем следующий код:
Следующим шагом является указание корневого URLconf на polls.urls модуль. В mysite/urls.py добавьте импорт для django.urls.include и вставьте include() в urlpatterns список, чтобы у вас было:
include() Функция позволяет ссылку других URLconfs. Всякий раз, когда встречается Django include() , он отрезает любую часть URL-адреса, совпадающую до этого момента, и отправляет оставшуюся строку во включенный URLconf для дальнейшей обработки.
Вы всегда должны использовать, include() когда включаете другие шаблоны URL. admin.site.urls единственное исключение из этого.
Теперь вы подключили index представление к URLconf. Убедитесь, что он работает, с помощью следующей команды:
path() Функции передаются четыре аргумента, два необходимо: route и view и два опциональные: kwargs и name . На этом этапе стоит рассмотреть, для чего нужны эти аргументы.
path() аргумент: route ¶
route - строка, содержащая шаблон URL. При обработке запроса Django начинает с первого шаблона urlpatterns и продвигается вниз по списку, сравнивая запрошенный URL с каждым шаблоном, пока не найдет подходящий.
path() аргумент: view ¶
path() аргумент: kwargs ¶
В целевое представление можно передать произвольные аргументы ключевого слова в словаре. Мы не собираемся использовать эту функцию Django в учебнике.
path() аргумент: name ¶
Присвоение имени URL-адресу позволяет однозначно ссылаться на него из любого места в Django, особенно из шаблонов. Эта мощная функция позволяет вам вносить глобальные изменения в шаблоны URL-адресов вашего проекта, касаясь только одного файла.
После того, как доступ к серверу с Ubuntu 16.04 был настроен в одной из предыдущих статей , настало время развернуть на нём всё необходимое для работы сайта, а именно:
- 1. Шаг 1 - обновление системы
- 2. Шаг 2 - Установка всех необходимых пакетов без установки виртуального окружения
- 3. Шаг 3 - Создание базы данных и пользователя базы данных
- 4. Шаг 4 - Установка виртуального окружения
- 5. Шаг 5 - Установка драйвера PostgreSQL
- 6. Шаг 6 - Создание проекта
- 7. Шаг 7 - Настройка подключения к базе данных
- 8. Шаг 8 - Выполнение миграций базы данных
- 9. Шаг 9 - Установка Gunicorn
- 10. Шаг 10 - Настройка статических файлов
- 11. Шаг 11 - Настройка Nginx
- 12. Шаг 12 - Настройка supervisor
- 13. Примечание
Шаг 1 - обновление системы
Сделаем обновление существующих пакетов. Мало ли, система имеет устаревшие пакеты.
Шаг 2 - Установка всех необходимых пакетов без установки виртуального окружения
Установим пачкой все необходимые пакеты, которые не будут использоваться через virtualenv, а именно Python 3, PostgreSQL, Nginx.
Pip я в итоге устанавливал отдельно через утилиту easy_install3 , которая идёт в комплекте python3-setuptools , во-первых потому, что тогда ставится последняя версия, а вторых в случае установки через apt-get были ошибки при установке пакетов в virtualenv.
Шаг 3 - Создание базы данных и пользователя базы данных
А теперь создадим базу данных и пользователя, дав расширенные права пользователю postgres через утилиту sudo, который создаётся при установке PostgreSQL.
Выполнив данную команду, мы попадём в консоль PostgreSQL, где и создадим необходимую базу данных и пользователя, от имени которого будет подключаться Django приложение к этой базе данных.
Создадим базу данных:
Далее настройка пользователя проекта. Кодировку он будет использовать UTF8, поскольку данная кодировка используется и Django, а Python файлы рекомендует хардкодить с кодировкой UTF8, особенно, если в них присутствует текст, который будет отображаться на страницах сайта. Также устанавливается уровень изоляции в базе данных. То есть когда будут доступны данные для чтения. В данном случае после подтверждения транзакции в общем случае. Конечно, имеются случаи, когда данные доступны до подтверждения, но это отдельная тема для разговора. А также устанавливается тип временных зон, который для Django по умолчанию UTC.
Далее дадим права доступа к базе данных для этого пользователя:
Ну и выйдем из консоли PostgreSQL.
Если возникнут проблемы с кодировками на сервере, когда сервер будет иметь кодировку LATIN1, а базу данных нужно создать в UTF8, то обратитесь к следующей статье , где эта задача решается.
Шаг 4 - Установка виртуального окружения
Установим и активируем виртуальное окружение:
Шаг 5 - Установка драйвера PostgreSQL
Произведём установку следующей командой
Внутри виртуального окружения необходимо пользоваться командой pip , а не pip3
Шаг 6 - Создание проекта
Перейдём в папку с виртуальным окружением, мы по-прежнему должны находиться в режиме работы в виртуальном окружении. И создадим проект.
Шаг 7 - Настройка подключения к базе данных
А теперь отредактируем конфигурационный файл Django, чтобы он подключался к базе данных PostgreSQL, а не создавал и в дальнейшем подключался к базе данных SQLite.
Для этого найдите в файле следующий кусок кода:
И замените его следующим, с учётом ваших данных для подключения к базе данных:
Шаг 8 - Выполнение миграций базы данных
Django обладает одним очень большим преимуществом - он имеет встроенную админку, что очень облегчает жизнь. Но чтобы она заработала, необходимо выполнить миграцию базы данных, то есть подготовить из моделей данных SQL запросы, которые сформируют структуру базу данных.
А ещё создадим суперпользователя, который будет администратором с максимальными правами доступа к вашему сайту. Выполните следующую команду и следуйте инструкциям.
Шаг 9 - Установка Gunicorn
Можете проверить, что сайт уже работает:
Шаг 10 - Настройка статических файлов
Django по умолчанию отдаёт статические файлы только в Debug режиме, который не используется на боевом сервере. Для боевого сервера все статические файлы из всех проектов собираются в отдельную специальную папку с помощью команды collectstatic , а саму папку необходимо указывать в файл settings.py.
И добавим строку, которая будет указывать, куда собирать статические файлы.
А теперь соберём всю статику в данный каталог:
Шаг 11 - Настройка Nginx
Отредактируем конфигурационный файл Nginx.
Удалим всё его содержимое и замени следующим.
И запустим gunicorn
После этого вы обнаружите, что сайт доступен уже на порту 80.
Шаг 12 - Настройка supervisor
Для того, чтобы сайт был доступен в любое время суток, необходимо настроить supervisor, который висит в памяти как служба и будет следить, чтобы сайта всегда работал.
Для стабильной работы Gunicorn необходимо создать его конфигурационный файл. Он будет располагаться рядом с файлом, который будет запускаемым для нашего web-приложения.
Добавим следующую конфигурационную информацию:
То есть мы указали, к какому порту привязываемся, и какой пользователь запускает процесс. А также количество рабочих процессов. В данном случае их три. Рассчитывается по следующей формуле:
workers = Ncpu + 1
После чего создадим конфигурацию самого supervisor
Пропишем в него следующие настройки
А теперь запустим supervisor. Есть один нюанс при установке supervisor. Он не стартанул в качестве службы после того, как был установлен. Поэтому нужно принудительно добавить его в автозагрузку и запустить вручную, если не хотите перезагружать сервер.
Ну а дальше можно обновлять конфиги, проверять статус приложения сайта и его перезапуска.
При перезагрузке сервера всё будет стартовать автоматически
Примечание
Если вы изменили файлы проекта, то необходимо перезапускать gunicorn. Для этого достаточно активировать виртуальное окружение и воспользоваться командой killall
Supervisor автоматически запустит Gunicorn после этой команды, так что можете не беспокоиться, что сервер ляжет надолго. Не более секундного сбоя.
Для Django рекомендую VDS-сервера хостера Timeweb
.
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Наше развертывание мы разделим на два этапа:
- Установка и настройка среды Python и UWSGI.
- Настройка веб-сервера NGINX.
Рассмотрим эти процессы по шагам.
Python, Django и UWSGI
Устанавливаем необходимые пакеты:
apt-get install nginx uwsgi python3 uwsgi-plugin-python3 python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools
Устанавливаем пакеты для Python:
pip3 install virtualenv uwsgi django
Создаем директорию для хранения стачичных файлов (css, js, img):
mkdir -p /var/www/my_app/static /var/www/my_app/media
chown www-data.www-data /var/www/my_app/media
chown www-data.www-data /var/www/my_app/static
Копируем наше приложение в папку /var/www/my_app, структура должна получиться примерно такой:
Вносим изменения в конфигурационный файл нашего проекта:
- ALLOWED_HOSTS — разрешенные доменные имена, на которых должен открываться наш сайт.
- DATABASES — данные для подключения к базе данных. Подробнее, данная настройка описана ниже.
Запускаем команду для сбора всех статических файлов в нашем проекте (из корня проекта):
[uwsgi]
chdir = var/www/my_app
env = DJANGO_SETTINGS_MODULE=project.settings.production
wsgi-file = my_app/wsgi.py
workers = 1max-requests=5000
plugins=python3
processes = 5
threads = 2
master = true
die-on-term = true
socket = sedova.sock
chmod-socket = 660
vacuum = true
uid = www-data
gui = www-data
- chdir — указываем директорию нашего проекта.
- env — конфигурационный файл нашего приложения.
- wsgi-file — относительный путь до файла wsgi.py нашего приложения.
Перезапускаем сервис uwsgi:
service uwsgi restart
Настройка Nginx
Создаем файл конфигурации для нашего приложения
Содержимое файла должно быть примерно следующим:
server listen 80;
server_tokens off;
server_name my_app my_app.domain.local;
location / include uwsgi_params;
uwsgi_pass unix:///run/uwsgi/app/sedova/socket;
>
location /static/ alias /var/www/my_app/static/;
>
location /media/ alias /var/www/my_app/media/;
>
>
systemctl restart nginx
Подключение к базе данных
Рассмотрим пример настройки подключения к СУБД MariaDB/MySQL. Нам необходимо будет настроить как сам сервер баз данных, так и фреймворк. В инструкции опишем полный процесс, начиная от установки СУБД.
MariaDB
Выполним установку и настройку сервера баз данных. Начнем с установки:
apt-get install mariadb-server
Разрешаем автозапуск СУБД:
systemctl enable mariadb
Зададим пароль для учетной записи mysql-root:
mysqladmin -u root password
Установка и запуск завершены. Перейдем к настройке.
Для Django важно, чтобы кодировка была UTF-8. Откроем конфигурационный файл клиента:
[mysql]
.
default-character-set = utf8
Аналогичную настройку выполняем в следующем файле:
[mysql]
.
default-character-set = utf8
Редактируем файл для настройки сервера:
Задаем значения для опций:
character-set-server = utf8
collation_server = utf8_unicode_ci
Для применения настроек перезапускаем сервис:
systemctl restart mariadb
Подготовка базы данных
Предполагается, что у нас есть база данных, которую мы либо создадим на сервере, либо восстановим из резервной копии.
Не забываем также настроить права доступа на базу.
Установка модуля для Python
Для возможности подключения к базе, мы должны установить клиента mysql на сервер. Для этого выполняем две команды:
apt-get install libmysqlclient-dev
pip3 install mysqlclient
Первая команда установит библиотеки, необходимые для установки mysqlclient через менеджер пакетов Python. Вторая, собственно, и установит клиента.
Настройка подключения
Откроем конфигурационный файл нашего приложения:
DATABASES = 'default': 'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
>
>
Данная настройка прописывается, как правило, по умолчанию и позволяет использовать базу sqlite3. Поменяем ее:
DATABASES = 'default': 'ENGINE': 'django.db.backends.mysql',
'NAME': 'database_name',
'HOST': 'localhost',
'USER': 'db_user',
'PASSWORD': 'db_password',
>
>
* в данном примере:
- NAME — имя базы данных, к которой мы подключимся.
- HOST — сервер баз данных.
- USER — пользователь с привилегиями работы с базой данных.
- PASSWORD — пароль для пользователя.
Делаем выборку
Для проверки настройки создадим select-запрос с нашей базе. Предположим, к таблице users. Пример кода будет таким:
- from django.db import connection
- cursor = connection.cursor()
- cursor.execute("SELECT * FROM users")
- print(cursor.fetchall())
В данном примере мы извлечем все содержимое таблицы users и выведем это на экран.
В ходе урока мы выполним создание проекта на основе фреймворка Джанго. Мы рассмотрим все файлы и папки, что были созданы вместе с проектом, а также запустим локальный сервер и посмотрим на сайт через браузер.
Видеоурок
Установка Django
Поскольку Django является фреймворком языка Python , то сперва необходимо установить сам язык. Для этого необходимо скачать последнюю версию Питона на их официальном сайте и следовать простым инструкциям. Если вы находитесь на Windows, то обязательно отметьте галочкой поле Add Python X.Y to PATH .
Если у вас возникли проблемы с установкой Python, то вы можете посмотреть специальный урок , в котором будет рассказано как установить Python на компьютер.
Для установки Django используйте следующую команду:
Если вы находитесь на Маке или Linux, то к слову pip пропишите цифру 3: pip3 . Если у вас не установлен pip на компьютере, то скачайте его по этой ссылке .
Создание проекта
Django проект можно создать в любой папке, поэтому создайте какую-либо папку и откройте её в окне команд. На Windows это можно сделать нажатием правой клавиши мыши на папку при зажатой клавише Shift:
В командной строке пропишите команду:
Запуск локального сервера
Для запуска сервера необходимо перейти в командную строку и открыть в ней папку с вашим проектом. На Windows это можно сделать нажатием правой клавиши мыши на папку при зажатой клавише Shift :
- Пропишите слово python3 в случае если вы на маке или Linux;
- Если вы на Windows и у вас всего одна версия Питона, то пишите слово python;
- Если вы на Windows и у вас несколько версий Python, то либо удалите все версии, кроме последней, либо укажите путь к последней версии Питона.
Несколько полезных советов
- В данном курсе используется версия Django 3 , поэтому чтобы не возникали дополнительные непонятные моменты, то лучше установите такую же версию Django;
- Стандартная командная строка в Windows не особо удобная, поэтому вместо неё лучше использовать сторонние программы. Очень удобной и легкой в работе является программа PowerShell, которую вы можете скачать здесь ;
- Путь к интерпретатору можно не прописывать вручную, если поставить virtualenv и в нём указать нужную версию Python и Django. Если работать в PyCharm, то в преднастройках можно выставить нужный интерпретатор.
Материалы для курса
Чтобы скачивать материалы к видеокурсам необходимо оформить подписку на сайт
Читайте также: