前提
以下の環境で構築した。
- マシン: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 # 追記 (ファイル末尾)
以上。あとはよしなにいじってください。(後でサンプルコード等を追記するかも。取り急ぎ備忘録で記載)