[Python] CentOS7にインストール (Django SQLite)

CentS7にPython3とDjangoをインストールしてみます。SQLiteのバージョンをアップする必要があったりと、かなり試行錯誤しながらのインストールになりました。バージョンによってはエラーが出たりするので、エラーメッセージを見ながらひとつずつ対処しました。

[環境]
CentOS 7.7
Python 3.6.8

CentOSのバージョン確認

 cat /etc/re
 (Core)

Pythonのバージョン確認

# python --version
Python 2.7.5

下準備

Pythonに必要な外部モジュールのインストールです。これはPythonのインストール前に行っておく必要があります。

# yum install zlib-devel libffi-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel libuuid-devel xz-devel

パッケージがあとから足りなくなった場合は、パッケージをインストールした後にもう一度Pythonをインストールし直してビルドします。

SQLite更新の必要性

ページ下の方にも記載しておきますが、SQliteのバージョンが古いとエラーになるので、事前にバージョンアップしておきます。
SQLiteのバージョンアップは下記のページが参考になります。
Django2.2で開発サーバー起動時にSQLite3のエラーが出た場合の対応
共通のライブラリにパスを渡すを忘れずに。
「vi ~/.bashrc」で「export LD_LIBRARY_PATH=”/usr/local/lib”」を追加。
これだけではすぐに実行されないので、下記コマンドで実行する
「source ~/.bashrc」
再起動時にも実行されるように
「vi ~/.bash_profile」でファイルを開き、「source ~/.bashrc」を追加する。

その他
「/etc/ld.so.conf」に「export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH」を追加。

yumでPythonのインストール

# yum install python36

Pythonのバージョン確認

[root@ ~]#  python --version
Python 2.7.5

Pythonの3.6をインストールしたはずが、バージョンは2.7.5のままです。
デフォルトで使用するPythonのバージョンを切り替えます。

リンクを確認してみます。

ls -l /bin/python
lrwxrwxrwx 1 root root 7  3月 15 15:25 /bin/python -> python2

バージョン2のままです。これを変更します。

バージョン3にリンクを変更

#  ln -snf /bin/python3.6 /bin/python

変更されたかを確認。

ls -l /bin/python
lrwxrwxrwx 1 root root 14  3月 15 16:01 /bin/python -> /bin/python3.6

Pythonの起動

Python3で起動するかを確認してみます。コンソールにpythonを入力し実行します。

# python
Python 3.6.8 (default, Aug  7 2019, 17:28:10) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

Python 3.6.8でうまく起動しています。

yumを利用できるように

# vi /bin/yum

「#!/usr/bin/python」を「#!/usr/bin/python2」に変更

# vi /usr/libexec/urlgrabber-ext-down

「#!/usr/bin/python」を「#!/usr/bin/python2 」に変更

pipのインストール

# cd /usr/local/src
# wget wget https://bootstrap.pypa.io/get-pip.py
--2020-03-15 16:12:57--  http://wget/
wget (wget) をDNSに問いあわせています... 失敗しました: 名前またはサービスが不明です.
wget: ホストアドレス `wget' を解決できませんでした。
--2020-03-15 16:12:57--  https://bootstrap.pypa.io/get-pip.py
bootstrap.pypa.io (bootstrap.pypa.io) をDNSに問いあわせています... 
bootstrap.pypa.io (bootstrap.pypa.io)に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 1807342 (1.7M) [text/x-python]
`get-pip.py' に保存中

100%[=======================================================================================================>] 1,807,342   9.86MB/s 時間 0.2s   

2020-03-15 16:12:57 (9.86 MB/s) - `get-pip.py' へ保存完了 [1807342/1807342]

終了しました --2020-03-15 16:12:57--
経過時間: 0.3s
ダウンロード完了: 1 ファイル、1.7M バイトを 0.2s で取得 (9.86 MB/s)
# python get-pip.py
Collecting pip
  Downloading pip-20.0.2-py2.py3-none-any.whl (1.4 MB)
     |████████████████████████████████| 1.4 MB 8.2 MB/s 
Collecting wheel
  Downloading wheel-0.34.2-py2.py3-none-any.whl (26 kB)
Installing collected packages: pip, wheel
  Attempting uninstall: pip
    Found existing installation: pip 9.0.3
    Uninstalling pip-9.0.3:
      Successfully uninstalled pip-9.0.3
Successfully installed pip-20.0.2 wheel-0.34.2

Djangoのインストール

# pip install django
Collecting django
  Downloading Django-3.0.4-py3-none-any.whl (7.5 MB)
     |████████████████████████████████| 7.5 MB 8.8 MB/s 
Collecting pytz
  Downloading pytz-2019.3-py2.py3-none-any.whl (509 kB)
     |████████████████████████████████| 509 kB 11.6 MB/s 
Collecting asgiref~=3.2
  Downloading asgiref-3.2.5-py2.py3-none-any.whl (19 kB)
Collecting sqlparse>=0.2.2
  Downloading sqlparse-0.3.1-py2.py3-none-any.whl (40 kB)
     |████████████████████████████████| 40 kB 7.3 MB/s 
Installing collected packages: pytz, asgiref, sqlparse, django
Successfully installed asgiref-3.2.5 django-3.0.4 pytz-2019.3 sqlparse-0.3.1

Djangoのバージョン確認

# python
>>> import django
>>> print(django.get_version())
3.0.4

Djangoのプロジェクト作成

アプリケーションを作成したいディレクトリで以下を実行

# django-admin startproject mysite

Djangoのアプリケーション作成

cd mysite
python manage.py startapp sample

ここでエラーメッセージがでてきます。(長文)

Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.6/site-packages/django/core/management/__init__.py", line 377, in execute
    django.setup()
  File "/usr/local/lib/python3.6/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/usr/local/lib/python3.6/site-packages/django/apps/registry.py", line 114, in populate
    app_config.import_models()
  File "/usr/local/lib/python3.6/site-packages/django/apps/config.py", line 211, in import_models
    self.models_module = import_module(models_module_name)
  File "/usr/lib64/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/usr/local/lib/python3.6/site-packages/django/contrib/auth/models.py", line 2, in <module>
    from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
  File "/usr/local/lib/python3.6/site-packages/django/contrib/auth/base_user.py", line 47, in <module>
    class AbstractBaseUser(models.Model):
  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 121, in __new__
    new_class.add_to_class('_meta', Options(meta, app_label))
  File "/usr/local/lib/python3.6/site-packages/django/db/models/base.py", line 325, in add_to_class
    value.contribute_to_class(cls, name)
  File "/usr/local/lib/python3.6/site-packages/django/db/models/options.py", line 208, in contribute_to_class
    self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
  File "/usr/local/lib/python3.6/site-packages/django/db/__init__.py", line 28, in __getattr__
    return getattr(connections[DEFAULT_DB_ALIAS], item)
  File "/usr/local/lib/python3.6/site-packages/django/db/utils.py", line 207, in __getitem__
    backend = load_backend(db['ENGINE'])
  File "/usr/local/lib/python3.6/site-packages/django/db/utils.py", line 111, in load_backend
    return import_module('%s.base' % backend_name)
  File "/usr/lib64/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "/usr/local/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 68, in <module>
    check_sqlite_version()
  File "/usr/local/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 65, in check_sqlite_version
    raise ImproperlyConfigured('SQLite 3.8.3 or later is required (found %s).' % Database.sqlite_version)
django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).

これはSQLiteのバージョンアップして下さいというメッセージになります。
SQLiteのバージョンアップは下記のページが参考になります。
Django2.2で開発サーバー起動時にSQLite3のエラーが出た場合の対応
(上記のパスでうまく行かないとき)
「/etc/ld.so.conf」に「export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH」

マイグレーションの実行

「python3.6 manage.py runserver xxx:xxx:xxx:xxx:8000」で起動してみます。python3.6の部分は自分のpythonのバージョンに合わせて変更。ポートは80にすると既に使われているとエラーが出ました。サーバーで事前にポート8000を開放しておきます。

起動してみると途中に赤い文字でエラーが出ており、ウェブに接続するとページが表示されません。

# python3.6 manage.py runserver xxx:xxx:xxx:xxx:8000
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 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.

March 19, 2020 - 15:52:40
Django version 3.0.4, using settings 'mysite.settings'
Starting development server at http://xxx.xxx.xxxx.xxxx:8000/
Quit the server with CONTROL-C.

「Run ‘python manage.py migrate’ to apply them.」と記載してあるので、マイグレーションを実行してみます。

# python 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 sessions.0001_initial... OK

これでマイグレーション実行が完了しました。
ここでもう一度 runserverを実行してみます。

サーバーの起動

# python3.6 manage.py runserver xxx.xxx.xxx.xxx:8000
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
March 19, 2020 - 15:55:14
Django version 3.0.4, using settings 'mysite.settings'
Starting development server at http://xxx.xxx.xxx.xxx:8000/
Quit the server with CONTROL-C.
[19/Mar/2020 15:55:23] "GET / HTTP/1.1" 200 16351
[19/Mar/2020 15:55:23] "GET /static/admin/css/fonts.css HTTP/1.1" 200 423
[19/Mar/2020 15:55:23] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 86184
[19/Mar/2020 15:55:23] "GET /static/admin/fonts/Roboto-Regular-webfont.woff HTTP/1.1" 200 85876
[19/Mar/2020 15:55:23] "GET /static/admin/fonts/Roboto-Light-webfont.woff HTTP/1.1" 200 85692
Not Found: /favicon.ico
[19/Mar/2020 15:55:23] "GET /favicon.ico HTTP/1.1" 404 1978
[19/Mar/2020 15:57:34] "GET / HTTP/1.1" 200 16351

今度はエラーメッセージが無く、無事起動したようなメッセージになっています。
ブラウザで「http://xxx.xxx.xxx.xxx:8000/」にアクセスしてみます。

2020-03-20_01h10_34
このように「The install worked successfully! Congratulations!」とDjangoのロゴが表示されたら起動成功です。



Author: webmaster