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/」にアクセスしてみます。
このように「The install worked successfully! Congratulations!」とDjangoのロゴが表示されたら起動成功です。