前回の記事(python Django Webアプリケーションの構築 基本編)よりの続きです。
Djangoのデフォルトのデータベースは「sqLite3」ですが、今回「mysql5.7」でサイトを構築することにします。
Django2.2では定番の「PyMySql」が利用できないとのことなで「mysqlclient」をインストールして構築します。
その他環境は前回の投稿のシステムにモデルを追加し動作確認をしていきます。
また、user:django (「sudo」の実行権限を付与済み)で作業をいたしました。
myserver に djangoでログインしています。
pythonの環境として、venvによる 仮想環境 py37 (python Ver3.7.4)が登録済みとします。
参考:[python] Django ローカル環境にインストール サンプルアプリケーション を表示してみる。
Djangoのデータベースをmysqlする準備
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Centos7 mysqlclient インストール (py37) [django@myserver ~]$ pip install mysqlclient ERROR: Command errored out with exit status 1: Complete output (12 lines): /bin/sh: mysql_config: command not found /bin/sh: mariadb_config: command not found /bin/sh: mysql_config: command not found # mysqlclient には python-devel, mysql-community-develが必要とのこと (py37) [django@myserver ~]$ sudo yum install python-devel mysql-community-devel #再度 mysqlclient をインストールコマンド実行 (py37) [django@myserver ~]$ pip install mysqlclient Collecting mysqlclient Using cached https://files.pythonhosted.org/packages/4d/38/c5f8bac9c50f3042c8f05615f84206f77f03db79781db841898fde1bb284/mysqlclient-1.4.4.tar.gz Installing collected packages: mysqlclient Running setup.py install for mysqlclient ... done Successfully installed mysqlclient-1.4.4 |
今回編集する項目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#編集項目 (py37) [django@myserver ~]$ tree . |-- content | |-- __init__.py | |-- settings.py # mysql の登録 | |-- urls.py | `-- wsgi.py |-- manage.py `-- webapps |-- __init__.py |-- admin.py |-- apps.py |-- migrations | `-- __init__.py |-- models.py # データベース、テーブル、フィールドの作成 |-- tests.py `-- views.py |
settings.py の DATABASE項目の編集
1 2 3 4 5 6 7 8 9 10 |
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'content', 'USER': 'dbuser', 'PASSWORD': 'xxxxxxxxxxxxxxx', 'HOST': '127.0.0.1', 'PORT': '3306', } } |
環境の確認
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#インストールの環境確認 # サーバー (py37) [django@myserver ~]$ cat /etc/centos-release CentOS Linux release 7.7.1908 (Core) # mysql バージョン (py37) [django@myserver ~]$ mysql -V mysql Ver 14.14 Distrib 5.7.27, for Linux (x86_64) using EditLine wrapper # nginx バージョン (py37) [django@myserver ~]$ nginx -v nginx version: nginx/1.12.2 #Python 仮想環境 (py37) [django@myserver ~]$ python -V Python 3.7.4 #python のモジュール (py37) [django@myserver ~]$ pip list Package Version ------------------- ------- Django 2.2.6 djangorestframework 3.10.3 gunicorn 19.9.0 mysqlclient 1.4.4 pip 19.2.3 pytz 2019.2 setuptools 40.8.0 sqlparse 0.3.0 uWSGI 2.0.18 |
モデルを作成する
今回例題として、Webアプリケーション「リンク集」を作成します。
日々ネットで確認した内容等々を記録します。画像のアップロードもサポートしたサイトします。
今回構築したリンク集サンプルページ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# [myproject]/webapps/models.py 編集 from django.db import models from django.utils import timezone # timezone.now で現在日付・時刻を取得する class Link(models.Model): title = models.CharField('タイトル', max_length=128) published =models.DateTimeField('登録日', default=timezone.now) image = models.ImageField('画像', upload_to='media/') url = models.CharField('アドレス', max_length=256) body = models.TextField('説明') # 管理画面でレコードを識別させるために定義 # ここではタイトルを表示させます。 def __str__(self): return self.title; |
マイグレーションの準備 makemigration の実行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# マイグレーションの準備 makemigration の実行 # 今回のプロジェクトに models.py の内容の変更、更新を通知する。 (py37) [django@myserver content]$ python manage.py makemigrations Migrations for 'webapps': webapps/migrations/0001_initial.py - Create model Link (py37) [django@myserver content]$ cat webapps/migrations/0001_initial.py # Generated by Django 2.2.6 on 2019-10-15 21:50 from django.db import migrations, models import django.utils.timezone class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='Link', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=128, verbose_name='タイトル')), ('published', models.DateTimeField(default=django.utils.timezone.now, verbose_name='登録日')), ('image', models.ImageField(upload_to='media/', verbose_name='画像')), ('url', models.CharField(max_length=256, verbose_name='アドレス')), ('body', models.TextField(verbose_name='説明')), ], ), ] |
マイグレーションの実行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# マイグレーションの実行 (py37) [django@myserver content]$ python manage.py migrate SystemCheckError: System check identified some issues: ERRORS: links.Post.image: (fields.E210) Cannot use ImageField because Pillow is not installed. HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "pip install Pillow". # マイグレーションでエラー モジュールpillow インストールが必要とのことでインストールする。 (py37) [django@myserver content]$ pip install pillow Collecting pillow Downloading https://files.pythonhosted.org/packages/34/b7/fb24ad352b747340ec1975c84c30cca37bb93a0079e037d1f0930afd65ad/Pillow-6.2.0-cp37-cp37m-manylinux1_x86_64.whl (2.1MB) |████████████████████████████████| 2.1MB 1.9MB/s Installing collected packages: pillow #再度マイグレーションの実行 (py37) [django@myserver content]$ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions, webapps Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying auth.0010_alter_group_name_max_length... OK Applying auth.0011_update_proxy_permissions... OK Applying sessions.0001_initial... OK Applying webapps.0001_initial... OK (py37) [django@myserver content]$ # mysqlの確認 (py37) [django@myserver ~]$ mysql -u dbuser -p content Enter password: xxxxxxxxxx mysql> show tables; +----------------------------+ | Tables_in_content | +----------------------------+ | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | | django_content_type | | django_migrations | | django_session | | webapps_link | # 今回 model.pyの記述で作成されたテーブル +----------------------------+ 19 rows in set (0.00 sec) mysql> show create table webapps_link\G *************************** 1. row *************************** Table: webapps_link Create Table: CREATE TABLE `webapps_link` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(128) NOT NULL, `published` datetime(6) NOT NULL, `image` varchar(100) NOT NULL, `url` varchar(256) NOT NULL, `body` longtext NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 1 row in set (0.00 sec) |
Djangoアプリケーション付属の管理ページ
Djangoアプリケーションにはデフォルトで付属している管理ページがあります。
このページを利用して今回作成したデータベースにデータを入力してみます。
また、この管理ページはデフォルトで存在するため本番環境で使用するには注意が必要です。
1 2 3 4 5 6 7 8 9 10 11 |
#settings.py で Debugオプションを False に設定 # SECURITY WARNING: don't run with debug turned on in production! DEBUG = False # 管理ページのURLを変更する。 #[project]/urls.pyにて urlpatterns = [ path('xxxxxx/', admin.site.urls), # 独自のURLに変更 path('webapps/', include('webapps.urls')), ・ ・ |
1 2 3 4 5 6 7 |
#Djangoアプリケーションの管理ユーザーを作成 (py37) [django@myserver content]$ python manage.py createsuperuser ユーザー名 (leave blank to use 'django'): khagiwara メールアドレス: khagiwara@codingstock.jp Password: xxxxxxxxxxx Password (again): xxxxxxxx Superuser created successfully. |
[project]/webapps/admin.py の編集
1 2 3 4 5 6 7 8 9 10 |
#manage.pyの編集 #管理ページに 作成した linksテーブルの管理を登録するために記述します。 #これにより管理ページにログイン直後の画面に登録した links テーブルの編集用のリンクが表示されます。 from django.contrib import admin # Register your models here. from .models import Link # 追加 # link は今回 model.py で作成したテーブル # models.pyで定義内容をインポート admin.site.register(Link); # 追加 |
管理ページにログインする。
例: https://lerning.codingstock.jp/manage/xxxxxx
(注: xxxxxx はurls.pyで定義したアドレス)
Webアプリケーションを公開するにあたってアップロードしたファイル等のAlias,Nginxの設定が必要です。
各種設定、投稿、詳細ページ等々は次回以降に続きます。