大規模なDjangoアプリケーションのレイアウト 質問する

大規模なDjangoアプリケーションのレイアウト 質問する

私は、Django をベースにした Web ベースの大学ポータルを開発しているチームに所属しています。まだ調査段階ですが、プロジェクト/開発環境をレイアウトする最適な方法を模索しています。

私の最初のアイデアは、システムを Django の「アプリ」として開発し、システムのさまざまな部分を分離するためのサブアプリケーションを含めることです。これらの「サブ」アプリケーションを作成する理由は、親アプリケーション以外ではまったく使用されないため、個別に配布してもあまり意味がないからです。ポータルは複数の場所 (たとえば、異なる大学) にインストールされることを想定しており、メイン アプリケーションを複数の Django プロジェクトにドロップしてインストールできます。そのため、場所のプロジェクトごとに異なるリポジトリを用意します。これは、実際には、settings.pyインストールされたポータル アプリケーションを定義し、urls.pyそのアプリケーションへの URL をルーティングするファイルです。

しかし、最初のコードを書き始めたところ、問題に遭遇しました。ユーザー認証とプロファイルを処理するコードの一部は、置き場所がないようです。ポータルの機能とは関係がないため、概念的にはポータル アプリケーションには属しません。ただし、プロジェクト リポジトリに入れることもできません。そうすると、各場所のリポジトリにコードが複製されることになります。たとえば、その後このコードにバグが見つかった場合、その場所のすべてのプロジェクト ファイルに手動で修正を複製する必要があります。

私の修正案は、すべてのプロジェクト リポジトリを「マスター」ロケーション プロジェクトのフォークにして、そのマスターから変更をプルできるようにすることです。ただし、これは面倒だと思いますし、管理するリポジトリがもう 1 つ増えることになります。

このプロジェクトを達成するためのより良い方法を探しています。解決策や同様の例を誰かお勧めいただけますか?問題は、私がDjangoを開発していることのようです。プロジェクトDjangoだけではなく応用

ベストアンサー1

これを実行するための最良の方法は、アプリケーションを作成し、それらを結合するプロジェクトを作成することです。私のプロジェクトのほとんどには、それぞれに含まれる類似のアプリがあります。電子メール、メモ、アクション リマインダー、ユーザー認証などです。私が好むレイアウトは次のとおりです。

  • プロジェクト/
    • 設定.py
    • urls.py
    • ビュー.py
    • ...
  • アプリ/
    • メール/
      • urls.py
      • ビュー.py
      • ...
    • ノート/
      • urls.py
      • ビュー.py
      • ...
    • ...

アプリ:

各「アプリ」は独立しており、 以外はsettings.pyプロジェクト自体に依存しません (ただし、他のアプリに依存することはできます)。 アプリの 1 つは、ユーザー認証と管理です。 には、タスクを実行するためのすべての URL がありますapps/auth/urls.py。 テンプレートはすべて にありますapps/auth/templates/auth/。 の機能はすべて自己完結型であるため、何かを微調整する必要がある場合は、どこにアクセスすればよいかがわかります。

プロジェクト:

project/には、これらの個々のアプリを最終プロジェクトにまとめるのに必要な接着剤がすべて含まれています。私の場合は、 を多用して、アプリのどのビューが自分に使用可能かを判断しsettings.INSTALLED_APPSましproject/た。こうすることで、apps.notesを取り外してもINSTALLED_APPS、メモがないだけで、すべてが問題なく動作します。

メンテナンス:

このレイアウト/方法論/計画には、長期的なプラスの影響もあります。ほとんど手間をかけずに、後でどのアプリでも再利用できます。システムをボトムアップでテストして、各アプリが全体に統合される前に意図したとおりに動作することを確認できるため、バグをより早く発見/修正できます。アプリケーションの既存のインスタンスに展開せずに新しい機能を実装できます ( にない場合はINSTALLED_APPS、既存のインスタンスには表示されません)。

プロジェクトをレイアウトする方法としては、もっと文書化された方法や、もっと広く使われている方法があると思いますが、これがこれまでのところ私にとって最もうまく機能した方法です。

おすすめ記事