djangoをdockerコンテナで利用(6) – モジュールの分割

◆◆◆

前回まででデータベースにある業務データを読み書きできるようになった。

(1.dockerコンテナ準備onSSL)(2.pip利用とhelloWorldとdb接続)(3.グラフ表示練習)では環境を作り、処理を作っていくための習作みたいなものまで作れた。

その後(4.ログイン画面)もでき、(5.crud)もできるようになってmariaDBの読み書き削除と登録ができるようになった。

ここまで来るとソースも大きくなりがちで、viewsとmodelsがデカくなってくる。
自分の好みやけど、できるだけ1つの定義とか機能は100行ぐらいでおさまってほしい。
modelはデータベースの列の数に依存やから、まぁしゃあないか。

できれば分割できないかって思ってたら、あります、できます、その作成メモ。

分割方法をまとめておられる方がおられた。
作者さんありがとう。

formsのことは書いてなかったけど、だいたい同じ要領でできる。

django開発で肥大化したview.py を複数ファイルに分割する方法 - Qiita
Djangoフレームワークを使って開発する中で、得た知見やクリティカルな情報が見つからなかったものを小ネタ的に書きます。環境Python:3.7.2django:2.1.5課題django…
Djangoでモジュールを複数ファイルで構成する - Qiita
タイトルの用語とかが正しいのかはたいへん疑問。。。。。。自分向けの備忘録目的Djangoを利用したプログラムを作成する際に、アプリケーションの規模が大きくなった際に都合が良いように、ビュー…

分割対象はこのへん

★の箇所を更新。まずはviewsを分割し、urls.pyを書き換えていく。
次にmodelsを分割して__init__.pyにmodel定義の一覧みたいなのを追記。
けっこうあっさりできてしまう。
今は小さいけど、formsも割る準備やっちゃう。

/code/app
|--gvisDjango3
|  (円グラフ等、ステータス表示のための別プログラムのため省略)
|--gvisWebApp
|  |--__init__.py
|  |--__pycache__
|  |--admin.py
|  |--apps.py
|  |--forms.py ★4
|  |--migrations
|  |--models.py ★3
|  |--tests.py
|  |--urls.py ★2
|  |--views.py ★1
|  |--templates/gvisWebApp
|  |  (ログインとcrudのhtmlのため省略)
|--manage.py
|--requirements.txt 
|--templates
|  |--gvisDjango3
|  |  (円グラフ等、ステータス表示のための別htmlのため省略)
|--website
|  |  (円グラフ等、ステータス表示のための別htmlのため省略)

viewsの分割

さっきのツリーにあるviewsを分割。

|  |--views.py ★1

同じ階層にviewsフォルダ作成して、views.pyをviewsフォルダの中に移動し、コピーして名前変更してから必要な箇所を残すよう編集。

さらに__init__.pyを空ファイルで置いとく。

|  |--views ★フォルダ作成
|  |  |--gvis_base_views.py  ★views.pyのインポートとdef記述入れる
|  |  |--gvis_zaiko_views.py  ★views.pyのインポートとclass記述入れる
|  |  |--__init__.py         ★空ファイル設置

分割の方針は機能単位にした。

分割前の最初のviews.pyはこんな内容。

views.py内容
インポートrender/django.views.genericとかmodels/formsとか取り込み
def定義“return render”のみのdef定義
クラス定義crudのclass定義

分割後はのviewsフォルダに置いたpyファイルは、それぞれこんな内容。

gvis_base_views.py内容
インポートrenderとか取り込み
def定義“return render”のみのdef定義
gvis_zaiko.py内容
インポートdjango.views.genericとかmodels/formsとか取り込み
クラス定義crudのclass定義

もちろんインポート内容は必要なものに絞った。
ちょっとスッキリ。

models/formsのインポート記述は少し変えないといけなかった。

  • 変更前
    from .forms import GvisZaikoForm
  • 変更後
    from ..forms import GvisZaikoForm

フォルダに入れたからと思うけど、vscodeでカンマ(.)を入力したとき候補が出てこず。

カンマを2個入れたら(..)viewsとかformsが選べるようになった。
viewsのフォルダから見て1つ上の階層ってことで(..)を指定するみたい。
これでいいのか? まぁ続けてやってみよう。

分割してすぐ「どや、行けるか?」って気持ちが先に行ってしまい、__init__.pyに定義書くの忘れて、空のままにしとくとなぜかmigrateできてしまい動いた。

viewsだけ定義なしでも動くんかなぁ。それともdjangoが忖度してくれてんのかなぁ。

modelsとformsは必ず書かないとエラーになってまう。

今はわからんけど、後で気づいたら直そう。

今は__init__.pyの中はこんな感じ。いつかエラーが発生してコメント化を外せる理由がわかる日まで。

## viewsを追加する都度追記する
'''
from gvisWebApp.views.gvis_base_views import *
from gvisWebApp.views.gvis_zaiko_views import *
'''

urlsの変更

インポートの書き換え

この行カットする。さっきviews.pyは分割しちゃったし。

from . import views

代わりにこの行を入れる。分割した新しいview名をそれぞれ指定する。

さっき「..forms」って書いたのは、1つ上の階層を指定っぽいので、urls.pyから見たviewは同一階層にある。だからここの「.views」は「..views」とは書かなくても使えてるのかも。

from .views import gvis_base_views   ## 分割viewsの取り込み
from .views import gvis_zaiko_views  ## 分割viewsの取り込み

データ登録・削除・表示がちゃんとできたから、これでよしとしとこ。

urlpatternsの書き換え

4行あるうち、最初2行のloginとlogoutはそのまま。後ろ2行を更新。

さっきgvis_base_views/gvis_zaiko_viewsをインポートするようにしたので、pathの2個目の引数の「views.」の箇所を書き換えた。

【変更前】

path('login/', auth_views.LoginView.as_view(template_name='gvisWebApp/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(template_name='gvisWebApp/logout.html'), name='logout'),
path('gvis_Complete/', views.gvis_Complete, name="gvis_Complete"),
path('gvis_100_ShisanKensaku/', views.GvisZaikoList.as_view(), name="gvis_100_ShisanKensaku"),

【変更後】

path('login/', auth_views.LoginView.as_view(template_name='gvisWebApp/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(template_name='gvisWebApp/logout.html'), name='logout'),
path('gvis_Complete/', gvis_base_views.gvis_Complete, name="gvis_Complete"),
path('gvis_100_ShisanKensaku/', gvis_zaiko_views.GvisZaikoList.as_view(), name="gvis_100_ShisanKensaku"),

参考にさせてもらったページには、アプリケーション名も指定ってあったけど、書き忘れてやってみたら指定しなくても行けた。

modelsの分割

自分が扱おうとしている業務データベースはinspectして自動生成させた。
crudの基本部分を作るため、数字と文字を数個選んで部分的に読み書きさせるようにしてある。

今は部分的に抜き出して数十行のmodels.pyがあって、inspectした結果から抜き出したものを書き足すとけっこうな増え方してくれた。

これからまだ追記するし、できればテーブル単位でmodelは書きたい。

変更前の状態。

|  |--models.py ★2

変更後の状態。

|  |--models          ★フォルダ作る
|  |  |--GvisZaiko.py ★models.pyを移動して名前変更する
|  |  |--__init__.py  ★ファイル設置

変更後は、__init__.pyに「(アプリケーション名).models.(テーブルのクラス名)」を書く。

from gvisWebApp.models.GvisZaiko import GvisZaiko

formsの分割

参考にさせてもらったページには書いてなかったけど、modelsの分割と同じ要領でやってみたらできた。

変更前の状態。

|  |--forms.py ★4

変更後の状態。

|  |--forms                     ★フォルダ作る
|  |  |--gvis_zaiko_forms.py    ★forms.pyを移動して名前変更する
|  |  |--__init__.py            ★ファイル設置

modelsのときと同じやり方で、__init__.pyに追記する。

from gvisWebApp.forms.gvis_zaiko_forms import GvisZaikoForm

その次

models/formsにはmariaDBの中の項目をまだ100分の1も書いてないから今は小さいけど、デカくなってくんやろなぁ。

crudの基本部分あるから、あとは日付やblob列に入れるjpeg/pdf登録機能を作ってく。

タイトルとURLをコピーしました