Python WEBサービス

【DRF】venv仮想環境を用いて、DRFシステムで書籍管理システムを作成する(4)Vue.jsの導入

第3回目でAPIを動作させることができましたので、次の手順はフロントで使用する「Vue.js」の導入です。

10. Vue.jsの導入

Vue.jsとは?

Vue.jsは、Webアプリケーションにおけるユーザーインターフェイスを構築するためのJavaScriptフレームワークです。
SPA(Single Page Application)開発に使われていることが多いです。

特徴

  • 学習コストが低い
  • コードの記述量が少なく、開発スピードが早くなる
  • コンポーネント化することで、再利用することができる

個人的にJavascriptが苦手なので「学習コストが低い」というのには素直に賛同できませんが、世間では上記のように言われています(苦笑)
公式ドキュメントは以下となります。一読すべしですね。

10-1.node/npmインストール

ということで、インストールの準備を始めたいと思います。
まずは nodenpm がインストールされていることを確認します。

私の環境では下記のようになりました。

まだインストールされていない方は、下記サイトを参考にインストールしてください。

10-2.vue-cliインストール

10-3.vue.jsインストール

今回は django ディレクトリと同じ階層に vue.js をインストールしたいので、drf3 ディレクトリで vue create コマンドでインストールします。
フォルダ名は vue にします。

インストール時にいくつかオプションが表示されるので、以下のように順番に選択していきます。

1)プリセットを選ぶ質問。 Manually select features(手動)を選択します。

2)更にオプションが選択できるので、ひとまず
・Babel
・Router
・Linter / Formatter
を選択します。
説明にも書いていますが、スペースキーを押すことで選択することができます。
選択したら Enter キーを押して次へ進みます。

3)Vueバージョンの2系統と3系統が選べるので、ここは当然 3系統 を選択

4)routerでhistoryモードを使用するかを聞かれているので、Yesを選択

5)Linter / formatterの設定を選択する質問。 ESLint + Standard config を選択

6)追加の Lint 機能を選択する質問で、 Lint on save を選択

7)Babel、ESLint などの設定ファイルをどこに置くかを尋ねる質問で、 In package.json を選択

8)今回の設定を将来のプロジェクトで使用するためのプリセットとして保存するかどうかを尋ねる質問で、Nを選択

全ての質問に回答後、インストールが始まります。
少し時間がかかるので、気長に待ちましょう。

確認

10-4.webpack-bundle-tracker

vue ディレクトリで webpack-bundle-tracker をインストールします。
依存性を考慮し、--legacy-peer-deps オプションを付けて実行しています。

10-5.フロントサーバ起動

別の Ubuntu タブを開き、下記コマンドで Vueサーバを起動します。

下記URLをクリックすると、Vue.jsの初期画面が表示されます。

アクセスURL
http://localhost:8080/

11.固定ページ追加

インストールが終わったところで、いよいよ Vue.js を色々と編集していきます。

11-1.urls 追加

プロジェクトの URL を設定します。

django/apps/urls.py

次にトップページの URL を設定します。

django/apps/book/urls.py (新規作成)

11-2.views 追加

TemplateView を使用(インポート)して、固定ページを作成します。

django/apps/book/views.py

11-3.template の作成

テストで h1 タグの文字を入力しておきます。

django/apps/book/templates/book/index.html (新規作成)

11-4.バックエンドサーバー起動

バックエンドサーバーを起動して、画面が表示されることを確認します。
さきほど npm を実行したものとは違う、もともと触っていたタブで、バックエンドサーバを稼働させます。

下記バックエンドURLにアクセス
http://localhost:8000/

確認したら、Ctrl + c でサーバを停止させます。

12.Webpack導入

12-1. django-webpack-loaderのインストール

django-webpack-loader とはなんなのかを ChatGPT さんに質問したところ、以下のような回答を得ました。

django-webpack-loader は、DjangoプロジェクトでWebpackを使用する際に、Webpackでビルドされたファイル(例えばJavaScriptやCSS)を簡単に読み込むためのDjangoアプリケーションです。
具体的には、Webpackによって生成されたアセット(バンドルされたファイル)のパスをDjangoのテンプレート内で動的に取得するための仕組みを提供します。

主な機能は以下のようになります。
1. Webpackの出力をDjangoテンプレートで使用可能にする
Webpackのビルド結果(通常はJSON形式のマニフェストファイル)を読み込んで、Djangoのテンプレートで使用することができます。

2. キャッシュバスティング:
Webpackによって生成されたファイル名にはハッシュが含まれていることが多く、これによりキャッシュの問題を避けることができます。django-webpack-loaderはこれを簡単に扱うことができます。

3. 開発モードのサポート:
開発中には、Webpack Dev Serverを使用してホットリロードやライブリロードを行うことが多いですが、django-webpack-loaderはこれにも対応しています。

ということで、ルートディレクトリ(drf3/django)で下記コマンドを実行し、django-webpack-loader をインストールします。

インストールの結果は以下のような感じ

12-2.settings.py 変更

Django の settings.py に追記します。

  1. 一番先頭にosのインポート文を追記します。
  2. webpack_loader を INSTALLED_APPS に追加します。
  3. 一番下の方に Webpack Loader の設定を追記します。

apps/settings.py

Webpack Loader の設定で BASE_DIR の次が 「..」 となっていますが、これは今回作成するディレクトリ構造のため、1階層上であることを示しています。

12-3.template 変更

webpack_loader を使用できるように変更します。
render_bundle でフロントエンドからの情報を表示します。

apps/book/templates/book/index.html

12-4.vue.config.js 追加

vue ディレクトリ以下に vue.config.js が作成されているので、下記のように編集します。

drf3/vue/vue.config.js

12-5.Webpackのビルドが成功しているか確認

12-6.フロントエンド起動

frontend フォルダで vue.js を起動させます。

12-7.バックエンド起動

バックエンド側サーバを稼働させます。

12-8.確認

バックエンドの方の URL にアクセスします。

アクセスURL
http://localhost:8000/

左肩に、11-4で確認した「Vue JS Toogie 参上!」が表示され、それ以下はVue.jsのデフォルトページ内容が表示されました。
つまり Django のテンプレートに記載した文字と Vue.js の初期画面の両方が表示されたと言うことになります。

Django のテンプレートの文字(「Vue JS Toogie 参上!」)を削除すれば、完全にバックエンドとフロントエンドを分けることができたということになります。

テスト用に置いた h1 タグを削除しておきます。

apps/book/templates/book/index.html

閑話休題

ここで変な動きに気づきました。
ブラウザアクセス時になぜかバックエンドのURL(http://localhost:8000/)を指定すると、

http://localhost:8000/http://127.0.0.1:8080/

というURLにリダイレクトされるようになっていました。
どこか設定を間違った、足りていないのか色々調べましたが、全く直ってくれません。

仕方ないので、とりあえずはそのままにしておきますが、修正する方法が分かり次第、修正したいと思います。

なお、管理画面へは http://localhost:8000/admin/login/ でログイン画面が表示され、
APIへは、 http://localhost:8000/book/api/books/ でアクセス可能です。
フロントが絡むとおかしくなるので、vue.js 関連の設定かな? と感じています。

第4回目はここまで。次回はフロント側で使用するテンプレート用フレームワーク「Vuetify」をインストールしてみます。

関連するポスト

【DRF】venv仮想環境を用いて、DRFシステムで書籍管理システムを作成する(1)Djangoのセットアップ

【DRF】venv仮想環境を用いて、DRFシステムで書籍管理システムを作成する(2)Djangoアプリケーションの作成

【DRF】venv仮想環境を用いて、DRFシステムで書籍管理システムを作成する(3)APIの動作とテスト

-Python, WEBサービス
-, , , ,