Djangoフレームワークを使って開発する中で、得た知見やクリティカルな情報が見つからなかったものを小ネタ的に書きます。
環境
- Python:3.7.2
- django:2.1.5
課題
djangoを用いたWebアプリケーション開発をしていくなかで、1つのview.pyに複数画面の処理(3,4画面ぐらい)を詰め込んだくらいから単純に、
-コード全体が読みづらい
-複数画面の処理が書かれているので、機能追加がしづらい
などの問題が出たので「view.pyを複数ファイル分割して管理しよう」という方針を取りました。
構成イメージ
【実施前のフォルダ構成】
djangoプロジェクトの自動作成デフォルトの構成
プロジェクト名
├ config .. 設定ファイルを管理するディレクトリ
├ static .. 静的ファイルを管理するディレクトリ
└ application .. アプリケーション関連ファイルを管理するディレクトリ
├ __init__.py
├ admin.py
├ apps.py
├ models.py
├ tests.py
├ urls.py
└ views.py
【実施後のフォルダ構成】
viewディレクトリを作成し、その配下に機能単位にPythonファイルを作成する。
プロジェクト名
├ config .. 設定ファイルを管理するディレクトリ
├ static .. 静的ファイルを管理するディレクトリ
└ application .. アプリケーション関連ファイルを管理するディレクトリ
├ __init__.py
├ admin.py
├ apps.py
├ models.py
├ tests.py
├ urls.py
└ views★ .. 本記事の箇所。views.pyを分割したファイルを格納
├ __init__.py
├ func1.py
├ func2.py
└ func3.py
対処ステップ1. viewsディレクトリの作成
分割したPythonファイルを格納・管理するためのディレクトリをapplication直下に作成します。
対処ステップ2. viewsフォルダに__init__.py
を作成
viewsディレクトリに、__init__.py
を作成します。
とりあえずファイル分割をするのであれば、空の__init__.py
を作成して大丈夫です。
対処ステップ3.views.pyファイルを分割
view.pyを定義した単位で分割し、新規ファイルを作成します。私は以下のルールで管理しました。(一例です)
- 「画面単位」に処理を分割
- 例えば、「ログイン画面」があった場合、
login.py
というファイルを作成し、ログイン画面に関連する処理を集約 - 複数画面で使われる処理は、共通処理として分割
対処ステップ4.呼び出されている設定ファイルの修正
例えば、「urls.pyの画面遷移の呼び出し先の変更」など、ファイル分割に伴う指定変更などあれば対処します。
urls.pyには以下のように書けば呼び出せます。
from .views import func1
from .views import func2
from .views import func3
urlpatterns = [
path('', funct1.[クラス/関数名], name='[任意の文字列]'),
path('/view2', funct2.[クラス/関数名], name='[任意の文字列]'),
path('/view3', funct3.[クラス/関数名], name='[任意の文字列]')
]