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

Django – это свободный и открытый веб-фреймворк Python, который поддерживает масштабируемость, повторное использование и быструю разработку кода.

В данном мануале вы узнаете, как создать основу для блога и подключить его к базе данных MySQL. Для этого нужно создать «скелет» веб-приложения с помощью django-admin, затем создать БД MySQL и подключить веб-приложение к базе данных.

Требования

1: Создание каркаса проекта Django

Чтобы заложить основу приложения, нужно сгенерировать скелет проекта, используя команду django-admin. Этот каркас станет основой приложения для блога.

Перейдите в домашний каталог:

cd ~

Просмотрите его содержимое:

ls

Если вы выполнили руководство по установке Django, вы увидите такой каталог:

test_django_app

Это скелет проекта, который был сгенерирован для проверки установки.

Этот каталог вам не подойдет. Создайте новый каталог для приложения блога. Выберите для него описательное имя; в руководстве используется my_blog_app.

mkdir my_blog_app

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

cd my_blog_app

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

django-admin startproject blog

Чтобы убедиться, что все выполнено правильно, попробуйте перейти в каталог blog/:

cd blog

Каталог blog/ должен появиться в текущем каталоге ~/my_blog_app/ после запуска команды django-admin.

Запустите ls, чтобы убедиться, что все необходимые элементы были созданы. Должен быть каталог blog и файл manage.py:

blog manage.py

2: Настройка проекта

Сгенерировав проект, вы создали файл settings.py.

Чтобы блог использовал правильное время, связанное с вашим часовым поясом, отредактируйте файл settings.py. Этот список часовых поясов может вам помочь. В данном примере используется пояс America/New_York.

Откройте каталог, в котором находится нужный файл:

cd ~/my_blog_app/blog/blog/

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

nano settings.py

Найдите поле TIME_ZONE:

...
# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
...

Измените часовой пояс:

...
# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'America/New_York'
USE_I18N = True
...

Не закрывайте файл – далее нужно будет добавить путь к статическим файлам. Файлы, которые обслуживаются веб-приложением Django, называются статическими файлами. К ним относятся любые файлы для отображения веб-страницы, включая JavaScript, CSS и изображения.

Перейдите в конец settings.py и найдите STATIC_ROOT.

...
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

Теперь, когда часовой пояс и путь для статических файлов указаны правильно, нужно добавить ваш IP-адрес в список разрешенных хостов. Перейдите к строке ALLOWED_HOSTS, которая находится в верхней части файла settings.py.

...
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ['your server IP address']
# Application definition
...

Добавьте в скобки свой IP-адрес, взяв его в одинарные кавычки.

Теперь сохраните и закройте файл.

3: Установка соединения с базой данных MySQL

Чтобы использовать MySQL в проекте, понадобится соединительная библиотека Python 3, совместимая с Django. Установите соединитель баз данных mysqlclient, который является форком MySQLdb.

Согласно документации mysqlclient, «MySQLdb — это поточно-совместимый интерфейс к популярному серверу базы данных MySQL, который предоставляет API баз данных Python». Основное преимущество заключается в том, что mysqlclient поддерживает Python 3.

Для начала установите python3-dev.

sudo apt-get install python3-dev

Затем установите заголовки и библиотеки Python и MySQL.

sudo apt-get install python3-dev libmysqlclient-dev

Когда увидите такое сообщение:

After this operation, 11.9 MB of additional disk space will be used.
Do you want to continue? [Y/n]

Нажмите y и ENTER, чтобы продолжить.

С помощью pip3 установите библиотеку mysqlclient из PyPi:

sudo pip3 install mysqlclient

Команда выведет на экран следующее:

successfully installed mysqlclient
Collecting mysqlclient
Downloading mysqlclient-1.3.10.tar.gz (82kB)
100% |████████████████████████████████| 92kB 6.7MB/s
Building wheels for collected packages: mysqlclient
Running setup.py bdist_wheel for mysqlclient ... done
Stored in directory: /root/.cache/pip/wheels/32/50/86/c7be3383279812efb2378c7b393567569a8ab1307c75d40c5a
Successfully built mysqlclient
Installing collected packages: mysqlclient
Successfully installed mysqlclient-1.3.10

4: Создание базы данных

На данный момент у вас есть каркас приложения и соединитель mysqlclient. Теперь можно настроить бэкэнд Django для поддержки MySQL.

Сначала инициируйте сервис MySQL:

systemctl status mysql.service
starting mysql.service
mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2017-08-19 11:59:33 UTC; 1min 44s ago
Main PID: 26525 (mysqld)
CGroup: /system.slice/mysql.service
└─26525 /usr/sbin/mysqld

Теперь вы можете войти в MySQL с помощью учетных данных, используя следующую команду. Флаг -u позволяет указать пользователя, а -p включает запрос пароля MySQL:

mysql -u db_user -p

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

Когда появится строка:

Enter password:

Укажите пароль своего пользователя БД. После этого на экране появится:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.19-0ubuntu0.16.04.1 (Ubuntu)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Запросите список текущих баз данных MySQL:

SHOW DATABASES;

Команда выведет имена всех БД, которые существуют на данный момент:

+-------------------+
| Database          |
+-------------------+
| information_schema|
| mysql             |
| performance_schema|
| sys               |
+-------------------+
4 rows in set (0.00 sec)

Примечание: Если при попытке подключиться вы получили ошибку, убедитесь, что правильно ввели пароль и установили MySQL. Также можно проконсультироваться с руководством по установке и настройке MySQL.

По умолчанию в MySQL есть 4 БД: information_schema, MySQL, performance_schema и sys. Не трогайте их – они содержат важную для сервера MySQL информацию.

Теперь создайте исходную базу данных, в которой будут храниться данные блога.

Для этого запустите эту команду, указав описательное имя для новой БД.

CREATE DATABASE blog_data;

После успешного создания базы данных вы увидите следующий результат:

Query OK, 1 row affected (0.00 sec)

Примечание: Если вы видите на экране такой вывод:

database creation failed
ERROR 1007 (HY000): Can't create database blog_data; database exists

значит, БД с таким именем уже существует. Если же вы видите следующую ошибку MySQL:

database creation failed
ERROR 1064 (42000): You have an error in your SQL syntax;

это означает, что в команде допущена синтаксическая ошибка. Убедитесь, что вы ввели команду точно так, как показано выше.

Снова просмотрите список доступных БД:

SHOW DATABASES;

В списке должна появиться новая БД blog_data:

+——————-+
| Database          |
+——————-+
| information_schema|
| blog_data         |
| MySQL             |
| performance_schema|
| sys               |
+——————-+
5 rows in set (0.00 sec)

База данных для блога полностью готова.

Чтобы выйти из MySQL, нажмите CTRL + D.

5: Настройка соединения базы данных MySQL и приложения

Теперь нужно добавить учетные данные БД в настройки приложения Django.

Примечание: Важно помнить, что настройки соединения согласно документации Django используются в следующем порядке:

— опции
— имя, пользователь, пароль, хост, порт
— файлы параметров MySQL.

Внесите все необходимые поправки.

Перейдите в файл settings.py и замените все текущие строки DATABASES следующими строками. Приложение должно знать, как использовать MySQL в качестве базы данных и из какого файла читать учетные данные для подключения к БД:

# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'OPTIONS': {
'read_default_file': '/etc/mysql/my.cnf',
},
}
}
...

Затем нужно указать в конфигурационном файле учетные данные MySQL. Откройте файл в nano и добавьте следующую информацию:

sudo nano /etc/mysql/my.cnf
...
[client]
database = db_name
user = db_user
password = db_password
default-character-set = utf8

utf8 устанавливается как шифрование по умолчанию, это обычный способ кодирования данных Unicode в MySQL.

После этого перезапустите MySQL:

systemctl daemon-reload
systemctl restart mysql

Это займет несколько минут.

6: Проверка соединения между приложением и БД MySQL

Теперь нужно убедиться, что приложение Django может подключиться к MySQL. Для этого просто запустите сервер. Если запустить его не получится, значит, соединение не получается создать. В противном случае соединение работает.

Перейдите в следующий каталог:

cd ~/my_blog_app/blog/

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

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

Команда выведет:

Performing system checks...
System check identified no issues (0 silenced).
You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
August 19, 2017 - 15:45:39
Django version 1.11.4, using settings 'blog.settings'
Starting development server at http://your-server-ip:8000/
Quit the server with CONTROL-C.

Следуя инструкциям из вывода, перейдите по следующей ссылке:

http://your-server-ip:8000/

чтобы просмотреть веб-приложение и убедиться, что оно работает правильно. Вы должны увидеть страницу:

It worked!
Congratulations on your first Django powered page.

Если такая страница появилась – приложение Django работает правильно!

Tags: , ,