doramochi blog

doramochi blog

趣味で学んだプログラミングの知識を綴っていきます

DjangoとReactを使ったアプリケーションを作ってみる①(Django側の準備)

基本的な環境構築は以前まとめているので省略。
今回はReactとの接続において必要な処理をメインに記載していく。

環境構築参考:
Djangoを使ってみる①(環境構築~プロジェクト作成) - doramochi blog
Djangoを使ってみる②(アプリケーションの作成) - doramochi blog

プロジェクト作成~起動確認

今回は「django_react」というプロジェクトを作成し、「home」というアプリケーションを作成。
python manage.py runserver 0.0.0.0:8000」など適当なコマンドを実行し、下記画面が起動することを確認する。

パッケージのインストール

djangorestframework、django-cors-headersというパッケージをインストールしておく

conda install -c conda-forge djangorestframework
conda install -c conda-forge django-cors-headers

モデルの作成

今回はYoutubeみたいなものを作ってみようと思い、とりあえず下記の様なモデルを作成しておく。

class Video(models.Model):
    title = models.CharField(max_length=30)
    description = models.TextField(max_length=300)
    path = models.CharField(max_length=60)
    datetime = models.DateTimeField(blank=False, null=False)
    number_of_views = models.IntegerField(blank=True, default=0)

マイグレーション実行。

python manage.py makemigrations home
python manage.py migrate

動作確認用のサンプルデータとして1つデータを追加しておく。
今回は管理画面を使わず、DB Browser for SQLiteを使用してDBを編集。


django_react/settings.pyの編集

settings.pyの「INSTALLED_APPS 」の部分に下記を追加。
合わせて「CORS_ORIGIN_WHITELIST」も追加。
CORSに関しては
なんとなく CORS がわかる...はもう終わりにする。 - Qiita
などを参照。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework', #追加
    'corsheaders', #追加
    'home', #追加
]
 #追加
CORS_ORIGIN_WHITELIST = (
    'http://localhost:3000',
)

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'corsheaders.middleware.CorsMiddleware', #追加
]

django_react/urls.pyの編集

homeのurls.pyを参照するように下記を追記。

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/home/', include('home.urls')), #追加
]

home/urls.pyの編集

とりあえずviews.pyの「ListVideo」を参照するようにしておく。

urlpatterns = [
    path('', views.ListVideo.as_view()) #追加
]

home/serializer.pyの作成

DBのデータをJSON形式に変換するためのクラスを追加しておく。

from rest_framework import serializers
from .models import Video

class VideoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Video
        fields = ('id',
                  'title',
                  'description',
                  'path',
                  'datetime',
                  'number_of_views')

home/views.pyの作成

ListVideoクラスを作成。
モデルの中身をすべて取得し、idが指定された場合クエリを実行しフィルタリング。
その結果をJSON形式で返すという処理を記載。

from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Video
from home.serializer import VideoSerializer

class ListVideo(APIView):
    def get(self, request):
        video = Video.objects.all()
        req_id = self.request.query_params.get('id')
        if req_id:
            video = video.filter(id=req_id)
        serializer = VideoSerializer(video, many=True)

        return Response(serializer.data)

動作確認

サーバー起動後、「http://localhost:8000/api/home/」にアクセスし、下記のような画面が表示されればDjango側の準備は一旦終わり。

IDを指定した場合、下記のようになる。
http://localhost:8000/home/?id=0にアクセスした場合

http://localhost:8000/api/home/?id=1にアクセスした場合