🌐
(備忘録)Djangoの初期構築まとめ
前提
- django_config:Djangoアプリ名
- プロジェクト全体の設定を管理するDjangoのプロジェクト名
- webapp:作成アプリ名
- 実際の機能(Webページなど)を提供する個別のアプリ
- {func}:使用する関数名
- ビュー関数などの関数名をすべて {func} として統一(例:def {func}(request))
環境構築
a. venvを使う場合
プロジェクト内にvenvで仮想環境を作成してDjangoをインストール
ターミナル
mkdir django-project && cd django-project
python -m venv venv
source venv/bin/activate
pip install django
b. Dockerを使う場合
appディレクトリ、Dockerfile、compose.ymlを同プロジェクト内に作成
ターミナル
mkdir django-project && cd django-project
mkdir app && touch Dockerfile docker-compose.yml
※以下はあくまで一例
Dockerfile
FROM python:3.11-slim
WORKDIR /app
RUN pip install --upgrade pip\
&& pip install django
docker-compose.yml
version: "3.8"
services:
app:
build:
context: .
dockerfile: Dockerfile
container_name: python-django-dev
volumes:
- ./app:/app
working_dir: /app
tty: true
stdin_open: true
ports:
- "8000:8000"
コンテナをビルドして、bashに入る
ターミナル
docker-compose up -d --build
docker exec -it python-django-dev bash
c. DevContainerを使う場合
手順bに記載のファイルに加えて、devcontainerディレクトリ、ファイルを作成
ターミナル
mkdir .devcontainer && touch .devcontainer/devcontainer.json
.devcontainer/devcontainer.json
{
"name": "python-django-dev",
"dockerComposeFile": "../docker-compose.yml",
"service": "app",
"workspaceFolder": "/app",
"settings": {
"terminal.integrated.defaultProfile.linux": "bash",
"python.formatting.provider": "black",
"editor.formatOnSave": true
},
"remoteUser": "root",
"extensions": ["ms-python.python", "ms-python.black-formatter"]
}
vscodeの左下にある><をクリックして、リモートウィンドウの起動オプションから「Reopen in Container」を選択
Djangoアプリ作成
1. プロジェクト作成
カレントディレクトリにDjangoプロジェクトを作成
ターミナル
django-admin startproject django_config .
※末尾に.(ドット)をつけることで、現在のディレクトリにファイルを展開
2. setting.pyを修正
ALLOWED_HOSTSを開発用に変更
django_config/settings.py
ALLOWED_HOSTS = ["*"]
3. サーバー起動
開発用のサーバーを起動
ターミナル
python manage.py runserver
※dockerのコンテナ内で起動する場合は下記コマンドを使用
ターミナル
python manage.py runserver 0.0.0.0:8000
→ 0.0.0.0 にしておくことで外部(ホスト)からのアクセスも許可される
webアプリ作成
1. アプリ作成
webappという名前でアプリ(機能単位のサブモジュール)を作成
ターミナル
python manage.py startapp webapp
2. Djangoアプリのurls.pyに追加
全体のルーティング設定(プロジェクトルート側)に、webappアプリのURL設定を追加
django_config/urls.py
from django.urls import path, include
urlpatterns = [
path("webapp/", include("webapp.urls")), # ここにアプリを追加
]
3. setting.pyを修正
INSTALLED_APPSに作成したアプリ名を追加
django_config/settings.py
INSTALLED_APPS = [
"webapp.apps.WebappConfig", #既存のものに追加
]
4. webapp/views.pyを修正
※以下動作確認
一例として、HttpResponseを使いテキストをそのまま返す簡易的なビューを作成
webapp/views.py
from django.http import HttpResponse
def {func}(request):
return HttpResponse("表示させたい内容")
5. webapp/urls.pyを作成
アプリごとのルーティングファイルを新規作成
ターミナル
touch webapp/urls.py
webapp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path("{func}/", views.{func}, name="{func}"),
]
DBモデル作成
1. モデル定義
models.pyでデータベースのテーブル構造を定義
webapp/models.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=100)
body = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
2. マイグレーション
モデルの変更をデータベースに反映
ターミナル
python manage.py makemigrations
python manage.py migrate
3. admin設定
管理画面からモデルを操作できるように設定
webapp/admin.py
from django.contrib import admin
from .models import Post
admin.site.register(Post)
管理者アカウントを作成
ターミナル
python manage.py createsuperuser
REST APIの構築(ViewSet + Router)
1. Django REST Frameworkのインストール
ターミナル
pip install djangorestframework
2. settings.pyの設定
config/settings.py
INSTALLED_APPS = [
"rest_framework",
]
3. シリアライザの作成
ターミナル
touch webapp/serializers.py
webapp/serializers.py
from rest_framework import serializers
from .models import Post
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = "__all__"
4. webapp/views.py
webapp/views.py
# 既存のコードに追加
from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializer
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
5. URLルーティングの設定
webapp/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from . import views
# 既存のurls.pyのコードを拡張
router = DefaultRouter()
router.register("posts", views.PostViewSet)
urlpatterns = [
path("{func}/", views.{func}, name="{func}"), # 既存のルート
path('api/', include(router.urls)), # API用ルート
]
Discussion