CentOS 7 に Django をインストールする手順を下記に示します。
// Python 3.6 のための yum リポジトリをインストールする # yum -y install https://centos7.iuscommunity.org/ius-release.rpm // Python 3.6 をインストールする # yum -y install python36u // pip 3.6 をインストールする # yum -y install python36u-pip // Django 2.0.2 をインストールする # pip3.6 install Django==2.0.2
# python3.6 -m django --version 2.0.2
まず、Django プロジェクトを作成します。
$ django-admin startproject mysite $ cd mysite
下記のファイルが作成されます。
./mysite ./mysite/manage.py ./mysite/mysite ./mysite/mysite/__init__.py ./mysite/mysite/urls.py ./mysite/mysite/wsgi.py ./mysite/mysite/settings.py ./mysite/db.sqlite3
開発用の簡易サーバを起動します。LISTEN する IPアドレスとポート番号を指定することができます。
$ python3.6 manage.py runserver 0.0.0.0:8000
外部のクライアントから接続すると 「Invalid HTTP_HOST header: '192.168.xx.xx:8000'. You may need to add '192.168.xx.xx' to ALLOWED_HOSTS.」 といったエラーとなることがあります。settings.py に接続を許可するホストの情報を設定する必要があります。
ALLOWED_HOSTS = [ "*" ]
ブラウザから、http://サーバのアドレス:8000/ にアクセスすることで、Django のサンプルページが表示されれば成功です。8000番ポート番号が解放されていない場合は、例えば下記の様にして開放する必要があります。
# yum -y install firewalld # systemctl enable firewalld # systemctl start firewalld # firewall-cmd --add-port 8000/tcp --permanent # firewall-cmd --reload
必要に応じて、言語やタイムゾーンを指定します。
LANGUAGE_CODE = 'ja' TIME_ZONE = 'Asia/Tokyo'
mysite プロジェクトの下に books アプリケーションを作成します。
$ python3.6 manage.py startapp books
下記のファイルが作成されます。
./books/__init__.py ./books/admin.py ./books/apps.py ./books/models.py ./books/tests.py ./books/views.py ./books/migrations/__init__.py
作成したアプリケーションを INSTALLED_APPS に登録します。
INSTALLED_APPS = [ 'books.apps.BooksConfig', 'django.contrib.admin', 'django.contrib.auth',
ビューを下記の様に修正します。
from django.http import HttpResponse def index(request): return HttpResponse("Hello world!")
urls.py ファイルを新規に作成します。。
from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), ]
作成した books/urls.py をプロジェクトに登録します。
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('books/', include('books.urls')), path('admin/', admin.site.urls), ]
ブラウザで http://サーバアドレス:8000/books/ にアクセスして Hello world! が表示されれば成功です。
とりあえず今日はここまで。続きはまた別途。
Django は標準では SQLite を使用しますが、MariaDB を使用する場合は次のように設定します。
# pip3.6 install PyMySQL
import pymysql pymysql.install_as_MySQLdb() DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'django', # データベース名 'USER': 'xxxxxx', # DBユーザ名 'PASSWORD': 'xxxxxxxx', # DBパスワード 'HOST': '127.0.0.1', # DBサーバアドレス 'PORT': '3306', # DBサーバポート } }
モデルを作成します。
from django.db import models class Books(models.Model): title = models.CharField(max_length=256) author = models.CharField(max_length=256) category = models.CharField(max_length=256) def __str__(self): return self.title
DB に対するマイグレーションを作成し、マイグレーションを実行します。これにより、モデルで定義したテーブルやカラムが自動的に作成されます。テーブルやカラムを変更して再度マイグレーションを行うことで、テーブル追加やカラム追加がマイグレーションされます。
$ python3.6 manage.py makemigrations $ python3.6 manage.py migrate
Django は簡易的な管理サイト機能を標準で装備しています。管理者サイトからモデルで定義した DB に対して簡単な追加・一覧・更新・削除を行うことができます。まず、管理者ユーザを作成します。
$ python3.6 manage.py createsuperuser Username (leave blank to use 'admin'): admin Email address: admin@example.com Password: Password (again): Superuser created successfully.
Books アプリケーションの Book モデルを管理者サイトで管理できるようにします。
from django.contrib import admin from .models import Book admin.site.register(Book)
ブラウザから http://サーバアドレス:8000/admin/ にアクセスすることで、上記で作成した管理者ユーザで管理者サイトにログインすることができます。管理者サイトから、Book の情報を何冊が登録してみましょう。
テンプレートを使用して Book の一覧を表示します。
<table> <thead> <tr> <th>Title</th> <th>Author</th> <th>Category</th> <th>Action</th> </tr> </thead> <tbody> {% if books %} {% for book in books %} <tr> <td><a href="/books/{{ book.id }}/">{{ book.title }}</a></td> <td>{{ book.author }}</a></td> <td>{{ book.category }}</a></td> <td><a href="/books/{{ book.id }}/edit">[Edit]</a></td> </tr> {% endfor %} {% else %} <tr> <td colspan=4>No books.</td> </tr> {% endif %} </tbody> </table>
from django.http import HttpResponse from django.template import loader from .models import Book def listBooks(request): books = Book.objects.all() context = { 'books': books } template = loader.get_template('books/listBooks.html') return HttpResponse(template.render(context, request))
rom django.urls import path from . import views urlpatterns = [ path('', views.listBooks, name='listBooks'), ]
http://サーバ:8080/users/ にアクセスして、管理者サイトで登録した本の一覧が表示されれば成功です。
一覧画面と同様に詳細画面を作成します。
<div>ID: {{ book.id }}</div> <div>Title: {{ book.title }}</div> <div>Author: {{ book.author }}</div> <div>Category: {{ book.category }}</div> <button onclick="location.href='/books/'">Return</button>
: def detailBook(request, book_id): try: book = Book.objects.get(pk=book_id) except Book.DoesNotExist: book = None context = { 'book': book, } template = loader.get_template('books/detailBook.html') return HttpResponse(template.render(context, request))
from django.urls import path from . import views urlpatterns = [ path('', views.listBooks, name='listBooks'), path('<int:book_id>/', views.detailBook, name='detailBook'), ]
CSS などのスタティックファイルを読み込むには、STATICFILES_DIRS を定義します。
: STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), )
* { margin: 0; }
標準では、プロジェクトフォルダの直下にアプリケーションフォルダが並びますが、アプリケーションの検索パスを追加することにより、アプリケーションフォルダの場所を移動することができます。
import sys sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
$ mkdir apps $ mv ./books ./apps
例えば、プロジェクトフォルダ直下の templates フォルダ内のテンプレートファイルを参照できるようにするには、TEMPLATES の DIRS を設定します。
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [ os.path.join(BASE_DIR, 'templates') ], 'APP_DIRS': True,
{% block %} や extends を用いて、複数のテンプレートで共有するレイアウトを作成することができます。
<!DOCTYPE html> <html> <head> <title>{% block title %}{% endblock %}</title> <link rel="stylesheet" href="/static/css/style.css"> </head> <body> {% block content %}{% endblock %} </body> </html>
{% extends 'layout.html' %} {% block title %} List of users {% endblock %} {% block content %} <table> : </table> {% endblock %}