web-dev-qa-db-ja.com

pythonビジネスロジックをdjango

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

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

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

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

26
adrita

多くの検索を実行しましたが、これを正確にどこに配置すればよいかまだわかりませんPythonすべてのロジックを含むファイル。

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

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

  2. ロジックをプレーンPython Imageクラスとして追加します。たとえば、image.pyというファイルに追加します。Django viewsまたはmodelsモジュール以外のロジックを追加します。これは、イメージロジックがDjangoアプリ(たとえば、画像処理アプリ)。

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

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

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

Djangoには、バックエンドまたはデータベースと通信するためのモデルが必要です。何もないDjango=モデル(つまり、データベース内の1つまたは複数のテーブルの抽象化)と対比して、用語modelを設計構成(ドメイン駆動設計など)と見なします。

17
miraculixx

「Djangoの2つのスクープ」の共著者であるダニエルグリーンフェルドは、ビジネスロジックを「可能な場合はモデルに、必要な場合はフォームに」含めることを推奨しています。バートの可能性のある重複については、Django = MVCに類似している可能性がありますが、MVCではありません。公式のDjango documentation faq。 @adritaで説明されているように、確認する必要があるかもしれません。モデル、ビュー、テンプレートの概念を少しよく理解するのに役立つ公式ドキュメント。

5
diek

公式のDjango docs https://docs.djangoproject.com/en/1.11/ には、次のように書かれています:

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

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

1
Simon