Django環境を構築する(2023年版)

# はじめに
以前、下記記事でDjango環境を構築したが、昔作った環境を最新バージョンで作り直してみたくなったので、その内容を記載いたします。

https://qiita.com/yes_dog/items/fa7a6235d40eaea8bc33

# 前提条件
* 今回構築するDjango環境は、DBはPostgreSQLにし、それ以外は基本デフォルトの構成で構築します。
* 今回は、検証目的で環境を構築するので、基本はrootユーザで作業を実施しますので、その点はご了承ください。
* 今回使用するOSバージョンは下記である。

```
# cat /etc/redhat-release
Red Hat Enterprise Linux release 9.2 (Plow)
```

* 今回使用するPython バージョンは下記である。
 
```
# python3.11 -V
Python 3.11.2
```

* 今回使用するPostgreSQLバージョンは下記である。

```
#  postgres --version
postgres (PostgreSQL) 16.0
```

# 環境構築
## (1)Python環境のセットアップ
Redhat9の環境では、インストール時にマイナーバージョンまで指定しないといけないので、下記コマンドでインストールします。
それぞれのバージョンは下記の通りである。

```
[root@ip-10-192-0-181 ~]# dnf install python3.11 python3.11-pip
[root@ip-10-192-0-181 ~]# python3.11 -V
Python 3.11.2
[root@ip-10-192-0-181 ~]# pip3.11 -V
pip 22.3.1 from /usr/lib/python3.11/site-packages/pip (python 3.11)
```

## (2)PostgreSQL環境のセットアップ
続いて、PostgreSQL16.0の環境を以下内容で構築。

```
[root@ip-10-192-0-181 ~]# dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
[root@ip-10-192-0-181 ~]# dnf  module disable postgresql
[root@ip-10-192-0-181 ~]# dnf install postgresql16-server
[root@ip-10-192-0-181 ~]# vi /etc/profile
--
export PATH=/usr/pgsql-16/bin/:$PATH
※末尾に追記。
--
[root@ip-10-192-0-181 ~]# source /etc/profile
[root@ip-10-192-0-181 ~]# echo $PATH
/usr/pgsql-16/bin/:/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
[root@ip-10-192-0-181 ~]#  postgres --version
postgres (PostgreSQL) 16.0

・データベースの初期化
[root@ip-10-192-0-181 ~]# postgresql-16-setup initdb

・アクセス設定を「md5」に指定
[root@ip-10-192-0-181 ~]# vi /var/lib/pgsql/16/data/pg_hba.conf
--
host    all             all             127.0.0.1/32            scram-sha-256
host    all             all             ::1/128                 scram-sha-256
↓
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5
--

・PostgreSQLを起動/自動起動及びステータス確認
[root@ip-10-192-0-181 ~]# systemctl start postgresql-16 && systemctl enable postgresql-16
[root@ip-10-192-0-181 ~]# systemctl status postgresql-16 

・Django用のDB構築
[root@ip-10-192-0-181 ~]# sudo -u postgres psql -U postgres

postgres=# CREATE USER django WITH PASSWORD 'django';
postgres=# CREATE DATABASE djangodb OWNER django;
postgres=# \l djangodb
                                                    List of databases
   Name   | Owner  | Encoding | Locale Provider |   Collate   |    Ctype    | ICU Locale | ICU Rules | Access privileges
----------+--------+----------+-----------------+-------------+-------------+------------+-----------+-------------------
 djangodb | django | UTF8     | libc            | en_US.UTF-8 | en_US.UTF-8 |            |           |
(1 row)
postgres=# \q
```

## (3)Django環境のセットアップ
Djangoの初期構築は、下記内容で実施した。
```
[root@ip-10-192-0-181 ~]# mkdir /opt/django && cd /opt/django
[root@ip-10-192-0-181 ~]# pip3.11 install virtualenv 
[root@ip-10-192-0-181 ~]# virtualenv django
[root@ip-10-192-0-181 ~]# source django/bin/activate
(django) [root@ip-10-192-0-181 ~]#  pip3.11  install django psycopg2-binary django-bootstrap4
(django) [root@ip-10-192-0-181 django]#  pip3.11  list
Package           Version
----------------- -------
asgiref           3.7.2
beautifulsoup4    4.12.2
Django            4.2.7
django-bootstrap4 23.2
pip               23.3.1
psycopg2-binary   2.9.9
setuptools        68.2.2
soupsieve         2.5
sqlparse          0.4.4
wheel             0.41.2
(django) [root@ip-10-192-0-181 ~]#  python3.11 -m django --version
4.2.7
```

プロジェクト「qiita」を生成する。
※ドットをつけて「startproject」を実施することで、カレントディレクトリ直下にDjangoプロジェクトを生成することができる。(無駄なディレクトリ階層を作らない)

```
(django) [root@ip-10-192-0-181 ~]# django-admin startproject qiita . 
```

Djangoプロジェクト全体の設定値を修正

```qiita/settings.py

#変更点①(接続許可範囲を設定)
ALLOWED_HOSTS = []
↓
ALLOWED_HOSTS = ['*']


#変更点②(DBをsqliteからPostgreSQLに変更)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
↓
DATABASES = {      #※１
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'djangodb', 
        'USER': 'django',
        'PASSWORD': 'django',
        'HOST': 'localhost',
        'PORT': '',
    }
}

#変更点③(Djangoの表示言語を変更)
LANGUAGE_CODE = 'en-us'
↓
LANGUAGE_CODE = 'ja'

#変更点④(タイムゾーンを変更)
TIME_ZONE = 'UTC'
↓
TIME_ZONE = 'Asia/Tokyo'
```

※１：Djangoでは、setting.pyにデータベースの接続情報を定義しとくだけで、DBとの連携が可能になる
以下の接続情報をもとに、アプリとの連携を行っている。

> データベース名：djangodb
> ユーザ名：django
> パスワード：django
> ホスト名：localhost
> ポート：指定無しなので、PostgreSQLのデフォルトポートの「5432」が使用される。

マイグレーションを実施

```
(django) [root@ip-10-192-0-181 ~]# python3.11 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
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 auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK
```

Django管理者ユーザを設定
※メールアドレスは、必須の入力項目ではないので、入力しなくても可。

```
(django) [root@ip-10-192-0-181 ~]# python3.11 manage.py createsuperuser

ユーザー名 (leave blank to use 'root'): 
メールアドレス:
Password:
Password (again):
Superuser created successfully.
```

Appを起動し、WEBへのアクセス確認。
※指定のURLにアクセスし、無事にアクセスができればOKとする。
※管理者サイトに行く際は、「http://10.192.0.181:8000/admin」 のように「末尾に/admin」を付与してアクセスができる。

```
(django) [root@ip-10-192-0-181 ~]# python3.11 manage.py runserver 10.192.0.181:8000
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
November 01, 2023 - 18:17:58
Django version 4.2.7, using settings 'qiita.settings'
Starting development server at http://10.192.0.181:8000/
Quit the server with CONTROL-C.
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252895/47c87843-adcd-7463-51a2-77c202d37d1e.png)

# 最後に
一応管理者サイトまでアクセスできることの確認ができたので、最新バージョンで構築し直すタスクに関しては、一旦は終わりにします。
以前は、それ以降のこともやっていたので、興味がある方は、下記記事を参照してみてください。

https://qiita.com/yes_dog/items/fa7a6235d40eaea8bc33

ではでは( ｀ー´)ノ