Python
Django

Django 画面の置き場所はよく考えよう

環境:Django 1.11

問題

DjangoのRest API Frameworkを使ってシングルページアプリケーション(以下SPA)を作ろうと勉強していました。

しかし、プロジェクトの構成にどうにも違和感を感じ、しばらく悩んだあげくこちらのサイトを参考にしてようやく原因がわかりました。

Creating a SPA in Django
http://www.adamwester.me/blog/creating-a-spa-in-django/

原因

Djangoのチュートリアルでは、テンプレートの配置場所について、アプリケーションのディレクトリの中に作成するようにしています。

最初に、 polls ディレクトリの中に、 templates ディレクトリを作成します。 Django はそこからテンプレートを探します。
https://docs.djangoproject.com/ja/2.0/intro/tutorial03/

最近のDjangoのバージョンでは、静的コンテンツやモデルクラスを各アプリケーション内に分散して作成させ、実行時に仮想的に統合する機構を持っています。
この機構により各アプリケーションが疎結合になり、プラグインとして自由に追加、削除が可能になります。

ただし、通常のプロジェクトでは個別のアプリケーションは疎結合であることがのぞましいのですけど、SPAでは一つの画面から複数のアプリケーションを横断して利用できるほうが望ましいです。

無理にアプリケーションに所属させようとして構成をこねくりまわしてしまいました。

対応

SPAの画面については、いずれのアプリケーションにも所属させずプロジェクトの共通ディレクトリを作ってそこで管理するということにしました。

プロジェクトに共通ディレクトリを作る方法はチュートリアルに書かれていないので、Djangoではできないものと思い込んでいましたが、そんなことはありませんでした。むしろ一般的かもしれません。

SPAのプロジェクトでは、以下の方針でDjangoを利用していこうと思います。

・アプリケーションの役割はWebAPIの提供とし、画面は持たない。
・画面はプロジェクト内に専用ディレクトリを作って管理する。
・画面へのリクエストは、プロジェクトのルートurls.pyから直接応答する。
※SPAでは画面に埋め込みタグを使う必要が無いので問題ない。

全て前述のサイトで言及されています。

クッキーカッターの構成も参考になります
https://github.com/pydanny/cookiecutter-django

共用フォルダを作った場合、設定ファイルの変更が必要です。
以下の設定に絶対パスを追加しましょう。

setting.py
・TEMPLATES.DIRS
・STATICFILES_DIRS

もっと自由に使いこなせるように勉強したいと思います。