web-dev-qa-db-ja.com

ユーティリティ関数はDjangoのどこに置くべきですか?

ユーティリティ関数はDjangoのどこに置くべきですか?カスタムの数値の暗号化/復号化、ツイートの送信、メールの送信、オブジェクトの所有権の確認、カスタム入力の検証などの機能。アプリ内のさまざまな場所で使用する反復的でカスタムなもの。今は間違いなくDRYを壊しています。

私は、models.pyで関数が定義されているデモをいくつか見ましたが、それは概念的には私には正しくないようです。私のプロジェクトにインポートされる「ユーティリティ」アプリに入れるべきですか?もしそうなら、彼らはユーティリティアプリのどこに行きますか?そこのmodels.pyファイル?

このn00bを手伝ってくれてありがとう。

PDATE:さらに具体的に説明します。パラメータ「number」を取り、7を掛けて10を加えて結果を返す関数「light_encrypt(number)」と、パラメータ「encr_number」を取り、10を引く関数「light_decrypt(encr_number)」が必要だとします。 7で除算して結果を返します。Djangoツリーのどこに配置しますか?これはミドルウェアではありませんよね?Felixが示唆するように、pythonパッケージを作成してインポートしますか?これらの機能が必要なビューに?

42
mitchf

異なる 質問 しかし同じ答え:

Djangoサイトの私の通常のレイアウトは:

projects/
templates/
common/
local/

どこ:

  • プロジェクトにはメインプロジェクトとその他のプロジェクトが含まれます
  • commonには、サイト間で共有できるもの、または少なくともプロジェクト固有ではないものが含まれています。たとえば、python/site-packagesに直接ダウンロードするのではなく、Django-profileとDjango-registrationをダウンロードする必要がある場合などです。
  • テンプレートにはそれだけが含まれています
  • ローカルには、現在のマシンに固有のものが含まれているため、データベースの場所やパスワードなどのデータを適切に分離できます。次に、マシン固有のバージョン(「machine1-localconfig.py」など)にソフトリンクします。 local/localconfig.pyそして、settings.pyで「localconfigをインポート」できます
  • 私は通常、プロジェクト内にプロジェクト固有のミドルウェアを配置し、common/middleware /にはプロジェクト固有ではないミドルウェアを配置します
  • テンプレートディレクトリを設定の適切な場所に追加してください(または、おそらくlocalconfig.pyを設定にインポートしてください)。また、プロジェクト、共通、ローカルディレクトリをPYTHONPATHに追加してください。
24
eruciform

ここでコメントと回答を読んだ後、プロジェクトディレクトリ内に「common/util /」というディレクトリを作成することにしました。その中に、ファイル「__ init__.py」があり、ここに小さなヘルパー関数があります。

ファイルが大きくなりすぎた場合は、関数を個別の.pyファイルに共通に分割します。だから今、私のプロジェクト構造は次のようになります。私が不適切な選択をしている場合は修正してください。開発はまだ早いので、簡単に修正できます。

myproject/         (Django project) 
  common/  
    util/
      __init__.py  (helper functions)  
  middleware/      (custom middleware)  
  templates/       (project templates)  
  myapp/
    fixtures/      (initial data to load)
    migrations/    (south migrations)
    urls/
    views/
    admin.py
    forms.py
    models.py
    test.py

 public/           (static stuff not served by Django)
   media/
     css/
     img/
     js/
     lib/
14
mitchf

これを行う別の方法を次に示します。

ユーティリティ関数がスタンドアロンモジュールであり、Djangoアプリにvirtualenv環境を使用している場合は、機能をパッケージとしてバンドルし、virtualenvにインストールできます。

これにより、Djangoアプリで必要な場所に簡単にインポートできます。

3
Josh Petitt