web-dev-qa-db-ja.com

Django:プロジェクトをアプリに分割するためのベストプラクティス

私はこのアプリ全体のアイデアに本当に苦労しています。私はたくさんのチュートリアルとスタイルガイドを読みました、そして私は特別なアプリを作成しようとするべきだと知っています、それはまさに一つのことをします。単純なチュートリアルプロジェクトを見ると、これはすべて理にかなっていますが、複雑な実際のプロジェクトに到達するとすぐに、異なるアプリ間でどのように線を引くべきかを判断できなくなります。

問題の1つは、ユーザーがさまざまなものをたくさん目にする1つのサイト(または複数のサイト)が欲しいということです。アプリのデザインルールに従うときに、さまざまなアプリからのものである必要があるもの。このようなことをどのように実現しますか?私の最初のアイデアは、実際にテンプレートにつながるすべてのビューを処理するuiという1つのアプリを作成することでした。他のすべてのアプリはモデルとヘルパー関数を提供します。しかし、uiアプリが大きくなることを恐れています。

簡単な例を挙げましょう。ユーザーが次のタスクを実行できるサイトを用意しましょう。

  • 件名を選択してください
  • 選択した主題にいくつかのオプションを設定する
  • 彼のアカウントに関連付けられているファイルをアップロードする
  • アップロードしたファイルの一部を件名に割り当てます
  • 主題に関連するいくつかの音声を録音する

今、私は3つのアプリを作成します:

  1. サブジェクト(サブジェクトモデルといくつかの関連モデルを含む)
  2. リソース(リソースモデルを含み、アップロードを処理します)
  3. オーディオ(すべてのオーディオ録音および処理を処理します)

しかし、これらのアプリの相互作用を処理し、すべてのアプリが何らかの形で関与する実際のサイトを作成するには、何らかのmainまたはuiアプリが必要です。

それで、これを行う「正しい」方法はありますか?または、使用できるパターンはありますか?私はすでにかなりの数を読んでいますが、このトピックに関する優れたリソースへのリンクにも感謝します。

35
basilikum

your構造がyouにとって意味があることを確認する必要があります。

プロジェクトのロジックの別の部分にバインドされているすべての機能に対して新しいアプリを作成する必要はありません。

再利用可能なアプリはまったく別の話であり、それらのコードはある程度実装を認識していないはずです。

インスピレーションを得るために Djangoの構造 を見てください

あなたの例の可能なレイアウト:

project_root/
    project/
        __init__.py
        settings.py
        urls.py
        templates/
            app1/  # override stuff
        static/
        media/
    app1/
        __init__.py
        admin/  # as a package
            __init__.py
            subjects.py
            resources.py
            # etc
        models/  # as a package
            subjects.py
            resources.py
            # etc
        managers/
            __init__.py
            subjects.py
            resources.py
            # etc
        services/
            __init__.py
            audio.py  # upload handler etc
        views/
            __init__.py
            subjects.py
        urls/
            __init__.py
            subjects.py
        templates/
            app1/
                subject_list.html  # override at project level
        static/
            app1/
                css/
                    subject.css  # override at project level
    app2/
        __init__.py
        models.py  # holds a Member model or whatever you require
    manage.py
13

アプリを区切る最善の方法は、オブジェクト指向プログラミング言語でクラスを区切る方法とほぼ同じだと思います。変数とメソッドの代わりに、それぞれモデルとビューを考えます。

モデルはオブジェクトの状態であり、ビューはオブジェクトの状態を確認して操作するために使用されます。

私の経験則は、アプリの作成は encapsulate モデルの特定のセットに役立ちますか?その場合は、作成を試みます。

10
Jorge Leitao