Pythonビジネスロジックを正確にdjangoに配置する場所


26

Django / Python / Web Developmentを学び始めたばかりです。この問題は、しばらく私を悩ませてきました。

Djangoで複数のテンプレートを使用してアプリケーションを作成しています。私は、基本的にそれぞれのテンプレートへの応答をレンダリングするだけのviews.pyを持ち、DBを構造化したmodels.pyを持っています。テンプレートの1つで、画像をアップロードする必要があります(実行できます)。アップロードされた画像の機能に基づいたロジックを実行する必要があります(まだ実行されていません)。このロジックには、多くの重い計算が含まれます。計算の実行後、ロジックは処理済みの情報(座標)をテンプレートに返す必要があります。

pythonファイルを次々に呼び出すスタンドアロンのPythonデスクトップアプリケーションで、これらすべてのアクションを正常に実行できました。ただし、これをWebアプリケーションにしたいので、Djangoフレームワークの使用を開始しました。

私は多くの検索を行いましたが、すべてのロジックを含むこのPythonファイルをどこに正確に配置すべきかをまだ理解できていません。別のクラスベースのファイルが(logic.py)あり、それを呼び出す必要がありview.pyますか?グーグルで調べたところ、多くの開発者がDjangoのmodels.pyにビジネスロジックを配置していることがわかりました。ただし、モデルはバックエンドと排他的に通信する必要があるため、直感的には正しくないと感じています。助けていただければ幸いです。事前に感謝します。



このトピックについて広範囲に議論する記事を見つけました(djangoではなく、ピラミッドを念頭に置いて)。:一部のsenseable thaughtsありnando.oui.c​​om.br/2014/04/01/...
kratenko

回答:


16

私は多くの検索を行いましたが、すべてのロジックを含むこのPythonファイルをどこに正確に配置すべきかをまだ理解できていません。

要件に応じて、いくつかのオプションがあります。

  1. Imageモデルにロジックを追加します。これは、データベースにイメージごとのメタデータを保存する必要があり、各モデルインスタンス(各イメージ)が単独で処理される場合に便利なオプションです。

  2. ロジックをプレーンPython Imageクラスとして、たとえばというファイルに追加しますimage.py。Djangoでは、viewsor modelsモジュール以外のロジックの追加を制限していません。これは、画像ロジックがDjangoアプリの中心的なコンポーネント(画像処理アプリなど)である場合に適したオプションです。

  3. ロジックを提供する個別のPythonプロジェクトを作成し、ビューから呼び出します。このプロジェクトをDjangoアプリのPython環境にインストールしてください。Djangoアプリの目的が画像のアップロードと表示である場合、またはユーザーのリクエストに直接応答して画像処理の結果を表示することですが、画像処理が他のプロジェクトでも使用できる場合、このオプションは有効です。

  4. リクエストを非同期で処理し、Djangoアプリとは別に実行される別のアプリを作成します。このオプションは、画像処理をアプリのリクエストサイクルから分離する必要がある場合、大量の画像を処理する場合、または各計算がリクエストサイクルの時間内に解決するのに時間がかかりすぎる場合(最大500ミリ秒から1秒以内など)に便利です。

モデルはバックエンドと排他的に通信する必要があるため、直感的には正しくないと感じています。

Djangoには、バックエンドまたはデータベースと通信するためにモデルを必要とするものは何もありません。Djangoが通常モデルと見なすもの(つまり、データベース内の1つまたは複数のテーブルの抽象化)のセマンティクスと、設計コンストラクト(ドメイン駆動設計など)としての用語モデルを混合していると思います。


ありがとう!本当に洞察力に富んでいました。オプション番号3で十分だと思います。:)
adrita 14

答えを否定的に評価しても構いませんが、コメントを追加して改善してください
miraculixx 14

5

「Djangoの2つのスクープ」の共著者であるダニエル・グリーンフェルドは、ビジネスロジックを「可能であれば、または必要に応じてフォームに」含めることを推奨します。 MVCではなく、公式のdjango ドキュメンテーションfaq。 @adritaで説明されているように、モデル、ビュー、テンプレートの概念をもう少しよく理解するには、公式ドキュメンテーションを確認する必要があると思います。


ご提案ありがとうございます。確実にドキュメントを通過します:)
アドリア14

修正してくれて嬉しいです。@ miraculixxがしっかりした説明をしました。fbを使用している場合は、django python frameworkグループに参加してください。
ディエク14

2

Djangoの公式ドキュメントhttps://docs.djangoproject.com/en/1.11/では、次のように書かれています:

Djangoには、ユーザーのリクエストを処理し、レスポンスを返すロジックをカプセル化する「ビュー」の概念があります。以下のリンクからビューについて知っておく必要があるすべてを見つけてください。

Djangoは、ビュー内にロジックを含めることを推奨しています。


3
それは必ずしもビジネスロジックと同じではありません。
FirstLastname

1
Djangoドキュメントの解釈に同意しません。Djangoドキュメントの他の場所(例:)には、(Model.clean()モデル、テンプレート、およびビューに対する単純な実際のDjangoプロジェクトの場合)-ビジネスロジック(または少なくとも検証)がモデル層。この単純化にはフォームも含めなかったことに注意してください。これも受け入れられます。
キーR
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.