1. ホーム
  2. ジャンゴ

[解決済み】Djangoプロジェクトの作業ディレクトリ構造に関するベストプラクティス【終了しました

2022-04-18 16:12:06

質問

正しい方法というのは、実は一つもないのです。しかし、すべての開発者や管理者にとって、うまく機能し、きれいな状態を保つディレクトリ構造を作るのは難しいということがわかりました。githubのほとんどのプロジェクトでは、何らかの標準的な構造があります。しかし、それはPC上の他のファイルやすべてのプロジェクトを整理する方法を示すものではありません。

開発機でこれらのディレクトリを整理する最も便利な方法は何でしょうか?また、どのように名前を付け、どのようにサーバーに接続し、デプロイするのでしょうか?

  • projects (作業しているすべてのプロジェクト)
  • ソースファイル (アプリケーション本体)
  • リポジトリの作業コピー (私はgitを使用しています)
  • 仮想環境(プロジェクトの近くに置くのが良い)
  • static root (コンパイルされた静的ファイル用)
  • メディアルート (アップロードされたメディアファイル用)
  • README
  • ライセンス
  • ドキュメント
  • スケッチ
  • examples(本プロジェクトで提供するアプリケーションを使用したサンプルプロジェクト)
  • データベース(sqliteを使用する場合)
  • その他、プロジェクトを成功させるために通常必要なもの

解決したい問題点

  • 目的がはっきりするように、ディレクトリの名前が良い。
  • すべてのプロジェクトファイル(virtualenvを含む)を一箇所にまとめておくことで、プロジェクト全体のコピー、移動、アーカイブ、削除、ディスク使用量の推定が簡単にできるようになりました。
  • アプリケーション全体、リポジトリ、virtualenvなど、選択したファイルセットの複数のコピーを作成し、クローンしたくない他のファイルのコピーは1つにしておくことができます。
  • 選択した1つのディレクトリをrsyncするだけで、正しいファイルセットをサーバーにデプロイする。

解決方法は?

私は、2 種類の Django プロジェクトを持っています。 ~/projects/ というディレクトリがあり、どちらも少し異なる構造になっています。

  • スタンドアロン型ウェブサイト
  • プラガブルアプリケーション

スタンドアロン型ウェブサイト

ほとんどが個人プロジェクトだが、そうである必要はない。通常はこのような感じです。

~/projects/project_name/

docs/               # documentation
scripts/
  manage.py         # installed to PATH via setup.py
project_name/       # project dir (the one which django-admin.py creates)
  apps/             # project-specific applications
    accounts/       # most frequent app, with custom user model
    __init__.py
    ...
  settings/         # settings for different environments, see below
    __init__.py
    production.py
    development.py
    ...
        
  __init__.py       # contains project version
  urls.py
  wsgi.py
static/             # site-specific static files
templates/          # site-specific templates
tests/              # site-specific tests (mostly in-browser ones)
tmp/                # excluded from git
setup.py
requirements.txt
requirements_dev.txt
pytest.ini
...

設定方法

主な設定項目はプロダクションのものです。その他のファイル(例. staging.py , development.py からすべてをインポートするだけです。 production.py で、必要な変数だけをオーバーライドします。

それぞれの環境ごとに、例えばproduction, 開発 プロジェクトによっては、testing (テストランナー用)、staging (ステージング) (最終デプロイ前のチェック用)、heroku (herokuへのデプロイ用) の設定があります。

必要条件

私はむしろsetup.pyで直接要件を指定しています。必要なものだけ 開発/テスト環境は requirements_dev.txt .

一部のサービス(例:heroku)には requirements.txt をルートディレクトリに配置します。

setup.py

を使用してプロジェクトをデプロイするときに便利です。 setuptools . これは manage.pyPATH を実行することができます。 manage.py を直接(どこでも)使用することができます。

プロジェクト専用アプリ

以前は、これらのアプリを project_name/apps/ ディレクトリにインポートし 相対インポートで

テンプレート/static/locale/testsファイル

これらのテンプレートや静的ファイルは、各アプリの中ではなく、グローバルの templates/static ディレクトリに置いています。 これらのファイルは、通常、プロジェクトのコードに関心のない人が編集しています。 の構造や Python を全く知らない。もしあなたがフルスタック開発者で、一人で、あるいは 小規模なチームであれば、アプリごとにテンプレート/静的ディレクトリを作成することができます。これは本当に好みの問題です。

ロケールについても同様ですが、ロケールディレクトリを別に作成した方が便利な場合があります。

テストは通常、各アプリの内部に配置するのが良いのですが、通常、多数の 統合テストや機能テストは、より多くのアプリを一緒にテストするので、グローバルな testsディレクトリは理にかなっています。

Tmpディレクトリ

プロジェクトルートには、VCSから除外されたテンポラリディレクトリが存在します。これは 開発中のメディア/静的ファイルやsqliteデータベースを保存します。すべての tmpはいつでも問題なく削除できます。

仮想環境

私は virtualenvwrapper に配置し、すべての venv を ~/.venvs ディレクトリを作成します。 の中に置くこともできますが tmp/ を使用することで、まとめることができます。

プロジェクトテンプレート

この設定のために、プロジェクトテンプレートを作成しました。 django-start-template

デプロイメント

このプロジェクトのデプロイメントは以下の通りです。

source $VENV/bin/activate
export DJANGO_SETTINGS_MODULE=project_name.settings.production
git pull
pip install -r requirements.txt

# Update database, static files, locales
manage.py syncdb  --noinput
manage.py migrate
manage.py collectstatic --noinput
manage.py makemessages -a
manage.py compilemessages

# restart wsgi
touch project_name/wsgi.py

を使用することができます。 rsync の代わりに git しかし、それでも、環境を更新するためにコマンドを一括で実行する必要があります。

最近、私は django-deploy というアプリがあるのですが、これは1つのプロジェクトにしか使っておらず、まだ試行錯誤中です。

スケッチと下書き

グローバルに配置するテンプレートのドラフト templates/ ディレクトリを作成します。というフォルダを作成することができると思います。 sketches/ をプロジェクト・ルートに追加しました。

プラガブルアプリケーション

これらのアプリは通常、オープンソースとして公開するために準備されています。例として 以下は django-forme

~/projects/django-app/

docs/
app/
tests/
example_project/
LICENCE
MANIFEST.in
README.md
setup.py
pytest.ini
tox.ini
.travis.yml
...

ディレクトリの名前は明確です(といいのですが)。テストファイルはappディレクトリの外に置いています。 しかし、それは本当に重要ではありません。重要なのは READMEsetup.py を使うので、パッケージのインストールは pip .