見出し画像

【DjangoREST】DjangoにReactを結合する方法

DjangoRESTframeworkのフロントエンドとして、Reactを結合する方法を勉強したので、その方法について復習しながら、まとめていきたいと思います。

この記事では、ReactをDjangoのプロジェクトに組み込む方法を中心にしたいので、DjangoRESTframeworkやReact自体の使い方には触れません。

Reactに関して初心者なので、認識が間違っている点とかあるかもしれないです。ご注意ください。

参考にした資料

環境:
python 3.9.6
Django 3

今回の目標

Djangoのプロジェクトの中に、Reactを組み込んで、DjangoもReactも一つのプロジェクト内で開発できるようにするのが目標です。この記事では、Reactで簡単なDomを生成して、Djangoテンプレートの中で表示されるようにします。完成時のソースコードをGithubに置いておいたので、必要な場合は参照してください。

完成図↓

スクリーンショット 2021-08-08 13.34.21

1. 土台となるDjangoプロジェクトの作成

まず、作業していくフォルダーを作成、そこに移動する。

mkdir react-django
cd react-django

次に、python仮想環境の構築と起動を行う。

python3 -m venv venv
source venv/bin/activate

必要なライブラリのインストール

pip install django
pip install djangorestframework
pip freeze > requirements.txt

Djangoライブラリをインストールしたので、Djangoのプロジェクトを作り、プロジェクトの中に移動する。

django-admin startproject project
cd project

settings.pyのinstalled appにrest_frameworkを追加する。

(settings.py)
INSTALLED_APPS = [
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   # frameworks
   'rest_framework', # これ
]

ここまで来たら、サーバーを起動してちゃんと動かせることを確認する。

python manage.py migrate
python manage.py runserver

これで、土台となるDjangoプロジェクトの作成は完了です。次は、Reactを積むためのモジュールを今作ったDjangoプロジェクトに追加していきます。

2. frontend用のアプリの追加(startapp)

まず、Djangoアプリを追加します。

django-admin startapp frontend

settings.pyにinstalled appにfrontendを追加します。

(settings.py)
INSTALLED_APPS = [
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   # frameworks
   'rest_framework',
   # app
   'frontend', # これ
]

これでfrontendアプリが追加されたので、frontendアプリの中の、フォルダ構造を整理していきます。

まず、templateを入れるフォルダと、staticリソースを入れておくフォルダを作成します。(template = html, static = image, cssなど)

mkdirコマンドをmanage.pyがあるディレクトリから実行していってください。

mkdir frontend/templates
mkdir frontend/static

staticフォルダの中にも、images, css, frontendの三つのフォルダを作成します。

mkdir frontend/static/frontend
mkdir frontend/static/css
mkdir frontend/static/images

次は、Reactのコードを入れるためのフォルダを作成します。

mkdir frontend/src
mkdir frontend/src/componets

これで、frontendアプリの追加とフォルダ構造の整理ができたので、次はnodeモジュールのインストールをしていきます。node.jsがpcにインストールされている必要があるので、インストールされているか確認してください。以下のコマンドを実行すると確認できます。

npm

バージョンが出力されれば、インストールされています。インストールされていない場合は、ダウンロードしてください。


3.  nodeモジュールのセットアップ

では、必要なnpmモジュールをインストールしていきます。

まずは、カレントディレクトリをfrontendに移動します。

cd frontend

移動したら、npmをプロジェクトを初期化します。

npm init -y

これを実行すると、package.jsonというファイルが作られます。このファイルはインストールされたパッケージとかを記録しとくものらしいです。pythonのrequirements.txtのようなものだと思います。(間違ってたら、コメント等お願いしたいです。)

では、必要なものをインストールしていきます。まずは、webpackからインストール。

npm i webpack webpack-cli --save-dev

webpackは復習のjavascriptモジュールを一つのファイルのまとめるためのものです。ちなみに、--save-devオプションは、モジュールをローカルインストールするためのオプションです。

次は、babelをインストール。

npm i @babel/core babel-loader @babel/preset-env @babel/preset-react --save-dev
npm i @babel/plugin-proposal-class-properties

babelとwebpackの説明はこちらの記事がわかりやすいかと思います。

最後にreactのインストール

npm i react react-dom --save-dev
npm i react-router-dom

モジュールのインストールはこんな感じです。次は、babelのconfigファイルを書いていきます。

touch babel.config.json
(babel.config.json)
{
   "presets": [
       [
           "@babel/preset-env",
           {
               "targets": {
                   "node": "14"
               }
           }
       ],
       "@babel/preset-react"
   ],
   "plugins": ["@babel/plugin-proposal-class-properties"]
}

次は、webpackのconfigファイルを作成します。

touch webpack.config.js
(webpack.config.js)
const path = require("path");
const webpack = require("webpack");

module.exports = {
   entry: "./src/index.js",
   output: {
       path: path.resolve(__dirname, "./static/frontend"),
       filename: "[name].js",
   },
   module: {
       rules: [
           {
               test: /\.js$/,
               exclude: /node_modules/,
               use: {
                   loader: "babel-loader",
               },
           },
       ],
   },
   optimization: {
       minimize: true,
   },
   plugins: [
       new webpack.DefinePlugin({
           'process.env.NODE_ENV' : JSON.stringify('production')
       })
   ]
}

上のコードの5行目でエントリーポイントに./src/index.jsを指定したので、index.jsファイルを追加しておきます。

touch src/index.js

次は、npmコマンドのショートカットをpackage.jsonに追加していきます。

(package.json)
"scripts": {
   "test": "echo \"Error: no test specified\" && exit 1",
   "dev": "webpack --mode development --watch",
   "build": "webpack --mode production"
 },

scriptsのところに、上のようにdevとbuildというショートカットを追加してください。

node.jsモジュールのセットアップは以上です。
次のところでは、ブラウザに表示するhtmlとreactを書いていきます。


4. 簡単な表示内容の作成とViewの作成

まずは、Djangoのテンプレートを追加します。

mkdir templates/frontend
touch templates/frontend/index.html
(index.html)

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>Document</title>
   {% load static %}
   <!-- cssを追加する場合 -->
   <link rel="stylesheet" href="{% static "css/index.css" %}">
</head>
<body>
   <div id="main">
       <div id="app"></div>
   </div>

   <script src="{% static "frontend/main.js" %}"></script>
</body>
</html>

テンプレートが完成したので、Viewの方を作ります。
frontendのviwe.pyファイルを開いて、以下のViewを追加してください。

def index(request, *args, **kwargs):
   return render(request, 'frontend/index.html')

そしたら、urlの設定を追加します。projectフォルダのurls.pyを以下のようにしてください。

(project/urls.py)
from django.contrib import admin
from django.urls import path, include

from frontend

urlpatterns = [
   path('admin/', admin.site.urls),
   path('', include('frontend.urls')),
]

frontendフォルダの中にも、urls.pyを作成します。

touch urls.py
(frontend/urls.py)
from django.urls import path
from .views import index

urlpatterns = [
   path('', index)
]

これでDjangoの方は終わりです。
最後に、簡単なReactのコードを書いていきます。

touch src/components/App.js
(App.js)
import React, { Component } from "react"
import { render } from "react-dom"

export default class App extends Component {
   constructor(props) {
       super(props);
   }

   render() {
       return <h1>Hello I'm Makkori.</h1>;
   }
}

const appDiv = document.getElementById("app");
render(<App/>, appDiv)

index.jsで、App.jsを読み込むようにします。

(index.js)
import App from "./components/App";

これで完了です!

ブラウザーの方で確認していきましょう!
ターミナルを二つ立ち上げてください。片方は、カレントディレクトリをmanage.pyのところに移動して、もう片方は、frontendディレクトリに移動してください。(注:仮想環境の起動をお忘れなく!)

manage.pyにいるターミナルでは、以下のコマンドを実行してローカルサーバーを立ち上げます。

python manage.py runserver

frontendディレクトリにいるターミナルでは、以下のコマンドを実行してください。

npm run dev

ターミナルを動かした状態で、http://127.0.0.1:8000/ にアクセスすると、以下のように表示されているはずです。

スクリーンショット 2021-08-08 13.34.21

以上でこの記事は終わりです。最後までありがとうございます。

ソースコードをgithubに乗っけているので、良ければ見てみてさい。










いいなと思ったら応援しよう!