CentOS 7 に Django 2.0.7 をインストール
〜 Python に Web フレームワークを導入 〜

2018-07-03 作成 福島
2021-08-07 更新 福島
TOP > tips > django-setup

Django (ジャンゴ) はベルギー男性の名前です。何かの略語ではありません。

ギターの天才「ジャン・バティスト・ラインハルト」の愛称「ジャンゴ」から採られたそうです。
センターで演奏しているおっさんがその人です。43 歳の時に病気でこの世を去っています。

Django のインストールに際し、Python3 と Python2 を共存させます。
Python3 をインストールした後なら Python2 が不要になりそうですが、yum は Python2 で記述されているため、Python2 は削除できないのです。


0. インストール要件
種類バージョン備考
OSCentOS 7.5本稿記述時の最新版
IP アドレス192.168.1.100公開用に使用する自分の IP アドレス
言語Python 3.6.5 (※1)yum でインストールできる最新版
pip は 10.0.1 を使用
フレームワークDjango 2.0.7 (※1)pip でインストールできる最新版
Django プロジェクトの設置場所/var/www/html/Django のテスト用 Web サーバーを起動するだけならどこに設置しても良いが、
本番稼働を考慮して Apache の (CentOS の) デフォルトディレクトリに設置する。
(/var/www/html/ に設置ユーザーの書き込み権限があること)
Django プロジェクト名称mysiteDjango のチュートリアルに準拠
Django プロジェクト用静的コンテンツ設置場所mysite/static/今回は作成するだけ。中にファイルは設置しない
URL は http://サーバ名:ポート番号/static/
Django プロジェクト用テンプレート設置場所mysite/templates/今回は作成するだけ。中にファイルは設置しない
フルパスは /var/www/html/mysite/template/static/
Django アプリケーション名称helloURL は http://サーバ名:ポート番号/hello/
Web サーバApache/2.4.6Django のローカルテストには Django の Web サーバ機能を使用する。
Web サーバ用 Python 実行系mod_wsgi 4.6.4-
※1 Python2 とそれに対応する Django 1.11 は開発が終了することが分かっているので、上記の組み合わせをインストールします。

1. yum にリポジトリ情報を追加
1-1. Python3 ダウンロード用リポジトリ情報をインストール
IUS の Web ページGetting Started からリポジトリ情報をインストール
※2 なぜか epel には python3 がない
※3 ius-release.rpm をダウンロードしてから rpm コマンドでインストールすると、あとで整合性が取れなくなるので yum で入れる

ius-release
IUS compiles separate packages for RHEL and CentOS. Use one of the
following links to get the correct release package.

  ・https://rhel6.iuscommunity.org/ius-release.rpmhttps://rhel7.iuscommunity.org/ius-release.rpmhttps://centos6.iuscommunity.org/ius-release.rpmhttps://centos7.iuscommunity.org/ius-release.rpm     <- これ


$ su
# yum -y install https://centos7.iuscommunity.org/ius-release.rpm

2. python 3.6 と pip をインストール (本稿記述時は 3.7 がリリースされているはずが、IUS はまだ 3.6 のままらしい)
2-1. yum で python 3.6 と pip 3.6 をインストール
# yum -y install python36u python36u-pip python36u-devel
# python3.6 --version
Python 3.6.5
# pip3.6 --version
pip 9.0.1 from /usr/lib/python3.6/site-packages/pip (python 3.6)
2-2. pip をアップグレード (しなくても Django は動く)
pip をアップグレードすると pip にパスが通るのでコマンド名に pip が使えるようになる
↑ そうならない場合もあるらしい。(理由は不明)

# pip3.6 install --upgrade pip
# pip3.6 --version
pip 10.0.1 from /usr/lib/python3.6/site-packages/pip (python 3.6)

3. Django をインストール
3-1. pip で Django をインストール
# pip3.6 install Django
      または
# pip3.6 install Django==2.0.7        # ← バージョンを指定してインストールする場合。
# pip3.6 install Django -U                # ← インストール済みの Django を最新にバージョンアップする場合。
3-2. インストールされた Django のバージョンを確認
# pip3.6 show Django
Name: Django
Version: 2.0.7
Summary: A high-level Python Web framework that encourages rapid development and clean, pragmatic design.
Home-page: https://www.djangoproject.com/
Author: Django Software Foundation
Author-email: foundation@djangoproject.com
License: BSD
Location: /usr/lib/python3.6/site-packages
Requires: pytz
Required-by:
# python3.6 -m django --version
2.0.7
# exit

4. Django の動作確認
4-1. プロジェクトを作成する
4-1-1. プロジェクトを設置するディレクトリへ移動
$ cd /var/www/html/
4-1-2. ディレクトリ mysite が存在しないことを確認
/var/www/html/$ ls | grep mysite | wc -l
0
4-1-3. プロジェクト mysite を作成
/var/www/html/$ django-admin startproject mysite

テンプレート用ディレクトリを作成
/var/www/html/$ mkdir ./mysite/templates

静的コンテンツ用ディレクトリを作成
/var/www/html/$ mkdir ./mysite/static

admin 用 css ディレクトリへのリンクを作成
/var/www/html/$ pip3.6 show Django | grep Location
Location: /usr/lib/python3.6/site-packages
/var/www/html/$ ln -s /usr/lib/python3.6/site-packages/django/contrib/admin/static/admin/ ./mysite/static/admin

作成されたファイルを確認
/var/www/html/$ LANG=c tree ./mysite
./mysite
|-- manage.py
|-- mysite
|   |-- __init__.py
|   |-- settings.py
|   |-- urls.py
|   `-- wsgi.py
|-- static
|   `-- admin -> /usr/lib/python3.6/site-packages/django/contrib/admin/static/admin
`-- templates

4 directories, 5 files
4-2. Django の Web サーバ機能を起動
4-2-1. プロジェクト mysite からテスト用 Web サーバーを起動
/var/www/html/$ cd ./mysite/
/var/www/html/mysite/$ python3.6 manage.py runserver
停止するときは ^C を入力する。
※4「ここから下は~」の 1 行は手でタイプしています。
Performing system checks...

System check identified no issues (0 silenced).

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

July 03, 2018 - 09:45:00
Django version 2.0.7, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

-----↓ここから下はアクセスされるとログが表示されます(※4)↓-----


何か注意されているけど、動作チェックなので無視する。
4-2-2. ブラウザで mysite を表示させる
CentOS7 の GUI からブラウザを起動し、http://127.0.0.1:8000/ をアクセスする。
※5 他クライアントのブラウザからアクセスするには設定 (後述: 6-6 を参照) が必要なので、ここでは 127.0.0.1 (localhost) をアクセスします。

こんな表示になれば OK。

テキストブラウザだとこんな感じ
/var/www/html/mysite/$ lynx http://127.0.0.1:8000/
                    Django: the Web framework for perfectionists with deadlines.
django

   View release notes for Django 2.0

The install worked successfully! Congratulations!

   You are seeing this page because DEBUG=True is in your settings file
   and you have not configured any URLs.

Django Documentation

   Topics, references, & how-to's

Tutorial: A Polling App

   Get started with Django

Django Community

   Connect, get help, or contribute

コマンド: [矢印キー] 移動、[?] ヘルプ、[q] 終了、[←] 戻る                      
  矢印キー: [↑][↓]で移動 [→]でリンクを辿る [←]で一つ戻る
 [H]ヘルプ[o]設定[p]印刷[g]移動[m]メイン画面[q]終了 /=検索 [BackSpace]=履歴
4-2-3. 表示できたので、テスト用 Web サーバーを終了する
^C を入力する
Performing system checks...

System check identified no issues (0 silenced).

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

July 03, 2018 - 09:45:00
Django version 2.0.7, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

-----↓ここから下はアクセスされるとログが表示されます↓-----
[03/Jul/2018 10:03:27] "GET / HTTP/1.0" 200 16348
[03/Jul/2018 10:03:55] "GET / HTTP/1.0" 200 16348
^C

5. アプリケーションを追加する
5-1. アプリケーションのスケルトンを作成
/var/www/html/mysite/$ python3.6 manage.py startapp hello

作成されたファイルを確認
/var/www/html/mysite/$ LANG=c tree ../mysite
../mysite
|-- db.sqlite3         --- ※6
|-- hello              --- ※7
|   |-- __init__.py
|   |-- admin.py
|   |-- apps.py
|   |-- migrations
|   |   `-- __init__.py
|   |-- models.py
|   |-- tests.py
|   `-- views.py
|-- manage.py
|-- mysite
|   |-- __init__.py
|   |-- __pycache__    --- ※6
|   |   |-- __init__.cpython-36.pyc
|   |   |-- settings.cpython-36.pyc
|   |   |-- urls.cpython-36.pyc
|   |   `-- wsgi.cpython-36.pyc
|   |-- settings.py
|   |-- urls.py
|   `-- wsgi.py
|-- static
|   `-- admin -> /usr/lib/python3.6/site-packages/django/contrib/admin/static/admin
`-- templates

7 directories, 17 files
※6 runserver を実行したときに自動作成されたファイル群
※7 startapp hello によって自動作成されたファイル群
5-2. アプリケーションの view モデルを編集
5-2-1. view を編集する
/var/www/html/mysite/$ vim ./hello/views.py
#from django.shortcuts import render         #--- ※8

# Create your views here.

from django.http import HttpResponse

def index(request):
    return HttpResponse(u"Hello Django.\n")   #--- ※9
※8 この「from ~」の 1 行はコメントアウトしなくても動作するけど、今は不要。
※9 Hello Django. の部分はマルチバイト (日本語) も書けます。
5-2-2. view へのディスパッチャを作成する (新規作成)
/var/www/html/mysite/$ vim ./hello/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
5-2-3. メインのディスパッチャに hello へのディスパッチャ path('hello/', ~) を追加する。
/var/www/html/mysite/$ vim ./mysite/urls.py
hello へのディスパッチャは include() を使用するので、include も import する。
"""mysite URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/', include('hello.urls')),     #--- ※10
]
※10 hello.urls は上記 5-2-2 で作成した hello/urls.py の意味。
5-3. 作成したアプリケーションの動作を確認
/var/www/html/mysite/$ python3.6 manage.py runserver
/var/www/html/mysite/$ curl http://127.0.0.1:8000/hello/   #--- 別ウィンドウで操作する
Hello Django.
5-4. アプリケーション hello の動作を確認できたのでテスト用 Web サーバを終了すること。
※11 上記 4-2-3 と同じ操作を行う。

6. Apache (2.4 以上) で Django を動作させる
6-1. httpd と httpd-devel (開発用ライブラリ) をインストール
$ su
# yum -y install httpd     --- Apache がインストール済みなら実施しない
# yum -y install httpd-devel
6-2. mod_wsgi のインストールと動作環境の調査
# pip3.6 install mod_wsgi
# pip3.6 show mod_wsgi
Name: mod-wsgi
Version: 4.6.4
Summary: Installer for Apache/mod_wsgi.
Home-page: http://www.modwsgi.org/
Author: Graham Dumpleton
Author-email: Graham.Dumpleton@gmail.com
License: Apache License, Version 2.0
Location: /usr/lib64/python3.6/site-packages
Requires:
Required-by:
# mod_wsgi-express module-config
インストールした mod_wsgi がコンパイルされた環境を表示する。
LoadModule wsgi_module "/usr/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so"
WSGIPythonHome "/usr"
6-3. Apache に mod_wsgi の指定を記述する (新規作成)
本当は、
    http://サーバ名/mysite/hello/
として構築したいけれど、以下 a, b の理由により、
    http://サーバ名/hello/
として構築します。
    a. 「python3.6 manage.py runserver」で実行した場合と、パス名を同一にできる。       --- 下記 ※13 に該当
    b. mysite/settings.py の「STATIC_URL = '/static/'」をなるべく書き換えたくない。    --- 下記 ※14 に該当
# mod_wsgi-express module-config > /etc/httpd/conf.d/mysite.conf
# cat << EOF >> /etc/httpd/conf.d/mysite.conf
WSGIPythonPath /var/www/html/mysite
WSGIScriptAlias / /var/www/html/mysite/mysite/wsgi.py
Alias /static/ /var/www/html/mysite/static/
EOF

# cat /etc/httpd/conf.d/mysite.conf
LoadModule wsgi_module "/usr/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so"
WSGIPythonHome "/usr"
WSGIPythonPath /var/www/html/mysite
WSGIScriptAlias / /var/www/html/mysite/mysite/wsgi.py       --- ※13
Alias /static/ /var/www/html/mysite/static/                 --- ※14
※12 mysite は上記 4-1 で作成した Django のプロジェクト名称。
※13 http://サーバ名/hello/ が /var/www/html/mysite/mysite/wsgi.py/hello/ としてアクセスできるようにする。
※14 http://サーバ名/static/example.css が /var/www/html/mysite/static/example.css としてアクセスできるようにする。
6-4. Apache を再起動 (起動) する
# systemctl restart httpd
6-5. ブラウザから (Apache 経由での) 動作を確認する。
# curl http://127.0.0.1/hello/
Hello Django.
※15 表示結果は上記 5-3 と同じになる。
# exit
6-6. Web サーバを公開する。
そのままの設定だと外部からアクセスできない (localhost でしか動作しない) ので、変更する。
/var/www/html/mysite/$ vim ./mysite/settings.py
DEBUG と ALLOWED_HOSTS を編集する。
※ついでに、テンプレートディレクトリの指定も行う。
~~~
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [ os.path.join(BASE_DIR, 'templates'), ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
~~~
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

ALLOWED_HOSTS = ['192.168.1.100', '127.0.0.1', 'localhost']
~~~
※16 DEBUG = True のままだとエラーがあったとき、ブラウザに詳細なメッセージが表示されてしまう。
※17 ALLOWED_HOSTS に指定するのは、公開する Web サーバの名称。接続元ではない。
    Apache の VirtualHost を使う場合は、そのサーバ名もここに記述する。
settings.py を変更したので Apache を再起動する。
/var/www/html/mysite$ su
/var/www/html/mysite# systemctl restart httpd
/var/www/html/mysite# exit
/var/www/html/mysite$
6-7. デフォルト DB (SQLite) のファイルを Apache から読み書きできるようにする。
※18 SQLite ではなく、サーバ型 (MySQL, PostgreSQL 等) の DB を使用する場合、この作業は省略可能。

/var/www/html/mysite$ cd ..
/var/www/html/$ chcon -t httpd_sys_rw_content_t mysite
/var/www/html/$ chcon -t httpd_sys_rw_content_t mysite/db.sqlite3
/var/www/html/$ chmod o+w mysite
/var/www/html/$ chmod o+w mysite/db.sqlite3