前提
以下の環境で構築した。
- マシン:MacBook Pro (Retina, 15-inch, Mid 2015)
- OS:macOS High Sierra (v10.13.6)
- Python v3.7.0 ⇨
python3コマンドで実行(Mac なので) - pip v18.1 ⇨ pip は
pip3コマンドで実行。pip3 install --upgrade pipで最新にしたらpipで打てた(ちなみに Windows はpython -m pip install --upgrade pipのよう)
上記のミドルウェア環境が未構築の場合は、公式のインストーラなど適当に使ってインストールしてください。
手順
※ macOS なので python を python3 と打っています。各自で読み替えてください。
pip で必要パッケージをインストール
まず適当なディレクトリを作成してターミナルを開き、pip で以下のようにして必要なパッケージをインストールする
pip install 各パッケージ名
ダウンロード指定する必要なパッケージは以下
| パッケージ | 用途 |
|---|---|
| django | Django フレームワーク |
| djangorestframework | Django REST フレームワーク |
| django-filter | Django REST F/W に検索機能を楽に追加できるプラグイン(※ 結局、使ってないので後で調べて追記します) |
| django-cors-headers | Django REST F/W で作成した API をブラウザからも叩けるようにCORSに対応させるプラグイン |
pip 設定ファイル作成
インストールパッケージ情報を、後で別環境でも一括でインストールできるように、設定ファイルとして残しておく
pip freeze > requirements.txt
作成された設定ファイルは、バージョン明示指定されているので、必要あれば ==バージョン を削除しておくこと(消さなくても良い)
プロジェクトを作成
django-admin startproject demo_app
ディレクトリ内に demo_app が出来あがる。
この時、結果的に同じ名前のディレクトリが入れ子で2つ作られるが、一番上の demo_app はプログラムに影響ないので自由に変えていいやつ。中にできた demo_app はプログラムに影響するので安易に変えたらいかんやつ。
アプリケーションを作成
作成したプロジェクト内に移動してから、アプリケーションを作成する
cd demo_app
python3 manage.py startapp sample_app
データベースを作成
DB設定 (setting.py) はデフォルト (SQLite を使用) のまま特に変更なし
ちなみに設定されている箇所は以下
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
データベースを作成する
python3 manage.py migrate
※ これやらないと、アプリ起動時に django_session テーブルを探しにいくタイミングでエラーになります。
一時的なファイルはバージョン管理から外す (任意作業)
以下の作業は、必要だと思う人だけやってください。やらなくてもいい。
Git でバージョン管理をしてて、マイグレーションで生成されるものを対象から外したいなら、
.gitignore を新規で作成し、以下の通りに中身を記載
# Python cache files
__pycache/
*.pyc
# SQLite
db.sqlite3
Webアプリをテスト起動
3000番ポートでWebアプリを起動してみる
python3 manage.py runserver 3000
コンソールでアプリ起動状態を確認後、Web ブラウザで http://localhost:3000 にアクセスすると下図のようになる

起動成功したら Ctrl + C でアプリを終了しておく
アプリケーションにモデルを作成
作成したアプリケーションのモデルにクラスを追記する
from django.db import models
### ここから下を追加 ###
class Test(models.Model):
title = models.CharField(max_length=140, blank=False)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
setting.py にアプリケーションを追加する
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'sample_app', # 作成したアプリケーションを追加
]
DBにアプリ設定の変更を適用
モデル変更を適用するためのマイグレーションを作成
python3 manage.py makemigrations
モデル変更を DB に適用
python3 manage.py migrate
管理者ユーザを作成
python3 manage.py createsuperuser
Username, Email address, Password は適当に決める。
パスワードがセキュリティ低い内容だと Bypass password validation and create user anyway? と出るが、 "yes" でそのまま作れる。
管理者ページを作成
from django.contrib import admin
### ここから下を追加 ###
from .models import Test
admin.site.register(Test)
Webアプリを再びテスト起動
3000番ポートでWebアプリを起動してみる
python3 manage.py runserver 3000
Web ブラウザで http://localhost:3000/admin/ にアクセスするとログイン画面になる
先ほど設定した管理者ユーザ情報でログインすると、下図のようになる
成功したら Ctrl + C でアプリ終了
アプリをローカライズしておく
アプリの言語を日本語に、タイムゾーンを「アジア/東京」に変更しておく
setting.py に以下の通りに修正する
# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/
LANGUAGE_CODE = 'ja' # 'en-us' を修正
TIME_ZONE = 'Asia/Tokyo' # 'UTC' を修正
USE_I18N = True
USE_L10N = True
USE_TZ = True
Webアプリを再びテスト起動
3000番ポートでWebアプリを起動してみる
python3 manage.py runserver 3000
http://localhost:3000/admin/ にアクセスするとログイン画面が日本語になってる
成功したら Ctrl + C でアプリ終了
REST API フレームワークを導入
setting.py に Django REST Framework を追加する
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # 追記
'sample_app',
]
モデルの REST API 定義を作成
モデルに対する REST API を作成するために以下の定義を作成する
| 作成する定義 | 用途 |
|---|---|
| Serializer | モデルのシリアライズ/デシリアライズ(データの入出力)方式を定義 |
| ViewSet | 取得, 一覧, 登録, 更新, 削除を管理するビュー定義 |
| URL pattern | DjangoにURLパターンを伝えるための定義 |
Serializer 定義ファイルを作成
アプリケーション ディレクトリ配下に serializer.py を作成し、以下の内容を書く
from rest_framework import serializers
from .models import Test
class TestSerializer(serializers.ModelSerializer):
class Meta:
model = Test
fields = ('id', 'title', 'created_at')
ViewSet 定義ファイルを作成
アプリケーション ディレクトリ配下の views.py を修正する
from django.shortcuts import render
### ここから下を追加 ###
import django_filters
from rest_framework import viewsets, filters
from .models import Test
from .serializer import TestSerializer
class TestViewSet(viewsets.ModelViewSet):
queryset = Test.objects.all().order_by('-created_at')
serializer_class = TestSerializer
URL pattern 定義ファイルを作成
プロジェクト名と同名の既存ディレクトリ配下にある urls.py を以下の通り修正する
from django.contrib import admin
from django.urls import path, include # include を追加
from sample_app.urls import router as sample_app_router # 追加
urlpatterns = [
path(r'admin/', admin.site.urls), # 修正
path(r'api/', include(sample_app_router.urls)), # 追加
]
アプリケーション ディレクトリ配下に urls.py を新たに作成する
from rest_framework import routers
from .views import TestViewSet
router = routers.DefaultRouter()
router.register(r'sample', TestViewSet)
Webアプリを再びテスト起動
3000番ポートでWebアプリを起動してみる
python3 manage.py runserver 3000
Web ブラウザで http://localhost:3000/api/ にアクセスすると以下の画面になる
成功したら Ctrl + C でアプリ終了
この時点で、http://localhost:3000/admin/, http://localhost:3000/api/ しか許可していないので、http://localhost:3000/ には行けなくなっています。これで API としてのアプリ (+管理画面) になりました。
※ アクセス拒否等のエラーが発生した場合は、「markdown」のバージョンが古い可能性があるので、ターミナル等からmarkdown のバージョンバージョンアップしてみてください。
API をブラウザなどから呼べるように CORS 許可対応しておく
setting.py に以下の通りに追加する
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'corsheaders', # 追記
'sample_app',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware', # 追記 (CommonMiddleware より前に)
'django.middleware.locale.LocaleMiddleware', # 追記 (CommonMiddleware より前に)
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
... # (中略)
# CORS 対応
CORS_ALLOW_CREDENTIALS = True # 追記 (ファイル末尾)
CORS_ORIGIN_ALLOW_ALL = True # 追記 (ファイル末尾)
以上。あとはよしなにいじってください。(後でサンプルコード等を追記するかも。取り急ぎ備忘録で記載)