とある業界の予約システムをつくることになりまして、
ログイン周りとライブラリの優秀さから、
Pythonの『Django(ジャンゴ)』を選び、開発を進めている中で、数日間悩んだ事がありました。
それは、
という事。
例えばインターネットで映画の予約をしようとすると、
- 一般の方が見る予約用サイト(アプリ)
- 関係者が登録したりする管理サイト(アプリ)
大きく2つのアプリ(ページ)が必要になります。
URLで例えると、
http://とある映画館.com/reserve #予約側
http://とある映画館.com/manage #管理側
とURLが2つあるような状態です。
『Django』の仕組みとしては、
アプリ毎にそれぞれ独立して動かす事を推奨している
ので、
例えば
管理側から予約側の登録データを見るということはできない
ことになっています。
ということで、構成を考えてみました。
環境: Django 2.1
Django 違うアプリで同じテーブルを使えない・・?
『Django(ジャンゴ)』でアプリをつくる際、
一般的にはこんなコマンドをうってフォルダやファイルを作成することになります。
まずはお約束のこちら。
mkdir django_project #インストール用フォルダをつくる
cd django_project #フォルダに入る
python -m venv venv #venvというツールを使って仮想環境をつくる
source venv/bin/activate #仮想環境を有効にする
> (venv)
もしジャンゴがインストールされてなかったらインストール。
pip install django #ジャンゴインストール
プロジェクト作成。
プロジェクトといっても最初は共通の設定フォルダが作成されるので、
名前はconfig としておいた方がよさげです。
最後のピリオドをつけることで、このフォルダ内に作成するよと明示することになります。
django-admin startproject config . #プロジェクト作成 configで作る事を推奨
この時点のフォルダ構成はこうなります。
(venv) django_project$ tree
.
├── config
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
この次に、アプリ用のフォルダを作成することになります。
予約用のアプリをつくるなら
python manage.py startapp reserve
とすると新たに reserveフォルダが作成されて、
python manage.py startapp manage
とすると、新たにmanageフォルダが作成されます。
フォルダの中にviews.pyやらmodels.pyやら、MTVの構成が作成されます。
MTV構成の参照記事。
ただ、こうやって作っちゃうと、
管理側から予約側の登録データを見るということはできない
という事になっちゃいます。
Djangoというかpythonの仕様らしく、
importできるのは、同じ階層か下の階層
という決まりがあるようで、
試しに import ..models from *** なんてやってもうまく動かず。
ググりまくってようやく一つの解決策ができました。
Django 違うアプリで同じテーブルを使う場合のフォルダ構成
importできるのは、同じ階層か下の階層
というのがヒント。
結論からいうと、
という事になります。
具体的は、共通のアプリを1つ作ります。
python manage.py startapp newapp
(venv) django_project$ tree
.
├── config
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-36.pyc
│ │ └── settings.cpython-36.pyc
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
└── newapp
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
共通アプリ用のnewappフォルダの中に、
予約用のreserveフォルダと管理用のmanageフォルダをつくりますが、
importできるのは同じ階層か下の階層
という決まりがあるので、views.pyを同じ階層で分ける必要があります。
例えば
└── newapp
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views_reserve.py # views.pyファイルの名前変更
└── views_manage.py # 新しくファイル作成
とします。
URLをコントロールするurls.pyファイルを書き換えますが、
urls.pyは、
- configフォルダの中のurls.py
- newappの中のurls.py
と2つ必要になるので要注意です。
MTV構成の参照記事。
config/urls.py から newapp/urls.py につなげるようなイメージです。
次に、newapp/urls.pyから それぞれのviewファイルにつなげます。
xxxのところはview内の関数かクラス名を書きます。
予約情報などをデータベースとつなぐmodelsは、
フォルダをつくって分けることもできるので、
models.pyを削除してmodelフォルダを作り、
その中でファイルを分けることもできます。
├── models.py ##これは削除
├── model
│ └── __init__.py
│ └──reserve.py
│ └──manage.py
とすることもできます。
model/init.py (initの前後にアンダーバー2つずつ) ファイル内で、
from reserve import *
from manage import *
とすれば2つのモデル用ファイルを読み込むことができます。
おわりに
importできるのは同じ階層か下の階層
という仕様のおかげで数日間悩みましたが、
結果的にすっきりしたフォルダ構成になったような気がします。
『Django(ジャンゴ)』に限らずwebフレームワークはある程度決まりがあるので、
そのルールにのりつつ、カスタマイズできるところはカスタマイズして、
さくっと高品質なアプリがつくれるようになりたいものですね。
2018/10/24 追記
Qiitaに投稿していたら、こんなコメントをいただけました。
その後 しばらくして、認証テーブルを2つにわけたいと思うようになり、
Djangoの仕様上、認証はアプリ毎に1つ推奨のようで、
コメントいただいた方法でフォルダ構成を作り変えたのでした。
関連記事
『Python』関連ではこんな記事も読まれています。
1. 【Python】手軽に試す方法2つとwebフレームワークについて【初心者向け】2. 【Python(パイソン)】でできる事の実例 じゃらんや楽天トラベルからデータをとってゴニョゴニョできちゃうんです
3. 【Python(パイソン)】でホームページをつくった時の話【Flask/Vagrant/Heroku】
4. 【Python】Flaskのチュートリアルがもっとわかるようになるまとめ【初心者向け】
5. 【Python】用語集まとめてみた。~Webサービスをつくりたい人向け~【初心者向け】※随時更新中
6. 【Python】でWebアプリをがっつりやるならDjango一択な4つの理由【初心者向け】
7. 【Python/Django】Webアプリのテンプレートなら『cookiecutter』がよさげ【簡単で安心】
8. 【Python/Django】mysqlとの接続があまりにあっさりしすぎて拍子抜けした話
9. 【Python/Django】webフレームワークを使う6つのコツ〜最短距離でアプリをつくるために【初心者向け】
10. 【Django】Webアプリのフォルダ構成のアイデア〜違うアプリで同じテーブルを使いたい!
11. 【Django】【Laravel】【RubyOnRails】を比較してみた【初心者向け】【体験談】
アオキのツイッターアカウント。
この記事へのコメントはありません。