Djangoプロジェクトの作業ディレクトリ構造のベストプラクティス


174

私は実際には単一の正しい方法がないことを知っています。しかし、うまく機能し、すべての開発者と管理者にとってクリーンな状態を維持するディレクトリ構造を作成するのは難しいことがわかりました。github上のほとんどのプロジェクトにはいくつかの標準的な構造があります。しかし、PC上の別のファイルとすべてのプロジェクトを整理する方法は示していません。

開発マシンでこれらすべてのディレクトリを整理する最も便利な方法は何ですか?それらにどのように名前を付け、どのように接続してサーバーに展開しますか?

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

私が解決したい問題:

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

回答:


257

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

  • スタンドアロンのWebサイト
  • プラグ可能なアプリケーション

スタンドアロンのWebサイト

ほとんどがプライベートなプロジェクトですが、そうである必要はありません。通常は次のようになります。

~/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.pydevelopment.pyからすべてをインポートし、production.py必要な変数のみをオーバーライドします。

環境ごとに、個別の設定ファイルがあります。生産、開発。私がテストしているいくつかのプロジェクト(テストランナー用)、ステージング(最終デプロイ前のチェックとして)、およびheroku(herokuへのデプロイ用)設定。

必要条件

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

一部のサービス(herokuなど)ではrequirements.txt、ルートディレクトリにある必要があります。

setup.py

を使用してプロジェクトをデプロイするときに役立ちsetuptoolsます。これはに追加さmanage.pyれるためPATHmanage.py直接(どこでも)実行できます。

プロジェクト固有のアプリ

私はこれらのアプリをproject_name/apps/ディレクトリに配置し、相対インポートを使用してインポートしていました。

テンプレート/静的/ロケール/テストファイル

これらのテンプレートと静的ファイルを、各アプリ内ではなく、グローバルテンプレート/静的ディレクトリに配置しました。これらのファイルは通常、プロジェクトのコード構造やPythonをまったく気にしない人によって編集されます。フルスタックの開発者が単独または小さなチームで作業している場合は、アプリごとのテンプレート/静的ディレクトリを作成できます。それは本当にただの好みの問題です。

同じことがロケールにも当てはまりますが、別のロケールディレクトリを作成すると便利な場合があります。

テストは通常​​、各アプリ内に配置するのが適切ですが、通常、より多くのアプリを連携してテストする多くの統合/機能テストがあるため、グローバルテストディレクトリは理にかなっています。

Tmpディレクトリ

VCSから除外されたプロジェクトルートに一時ディレクトリがあります。開発中にメディア/静的ファイルとsqliteデータベースを格納するために使用されます。tmp内のすべてのものは、問題なくいつでも削除できます。

Virtualenv

私は好むvirtualenvwrapperとにすべてのvenvsを置く~/.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][2]単一の管理コマンドを実行して環境を更新できるアプリを作成しましたが、これを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
...

ディレクトリの名前は明確です(私は願っています)。テストファイルをアプリディレクトリの外に配置しましたが、実際には問題ありません。READMEおよびを提供することが重要です。setup.pyそのため、パッケージはから簡単にインストールできpipます。


ありがとうございました!私はあなたの構造が好きです。それは私に役立つアイデアを与えてくれました。要件にsetup.pyを使用し、PATHにmanage.pyをインストールすることについての良い点。最後の方法を教えてください。「tmp」ディレクトリの良い点も。私はむしろそれを「ローカル」と名付けたい、そしてそれから私は「env」、「tmp」および何でも内部にあるかもしれない。これはgitignoreとの取り引きが多すぎるという問題を解決します。新しい問題は、この名前が「ロケール」に近すぎることです。おそらく、「ロケール」をコアアプリ「project_name」に移動することは理にかなっています。名前が間違っているため、構造を変更したくないだけです。助言がありますか?
raacer 2014

setup.pyを使用する場合は、追加scriptsのキーワード引数を:github.com/elvard/django-start-template/blob/master/project/... ように私をtmp、それはいつでも削除することができ、「一時的な何かを」示唆しているため。トップレベルのlocaleディレクトリは必要ありません。どこにでも配置できます。私はそれが静的/テンプレートディレクトリと一致しているのが好きです。
トマーシュエールリッヒ

別のファイルをコピーせずにソースファイルの複数のコピーを作成できるという私の要件は、直接解決されていません。ただし、git checkoutプロジェクトディレクトリを複製するときに、ディレクトリ「tmp」を1つだけ使用または除外することで、目標をアーカイブすることができます。したがって、あなたの構造はすべての要件を満たしているようであり、疑いもなく定期的に使用するのに十分明確です。私はあなたの答えを受け入れています。ありがとうございました。
raacer 2014年

ありがとうございました。「別のファイルをコピーせずにソースファイルの複数のコピーを作成できる」という意味がまだわかりません。微調整rsyncコマンドを行うだろうが、それはあなたが何を意味するか、おそらくではありません...
トマーシュエールリッヒ

私は通常src、プロジェクトルート内にdir を作成します。これは、ソースファイルとgitリポジトリルートの作業用コピーです。このディレクトリのコピーをいくつか作成できます- srcsrc.bakなどsrc_tmp。以下のような他の非レポdirsにenvtmpmediabackup同じレベルに常駐します。ですから、cp -r src src.bakいつでもgitで実験したり、バージョンを外部ツールと比較したりすることができます。あなたはあなたのリポジトリの中にローカルファイルを持っていますが、私は私のローカルファイルディレクトリの中にリポジトリを持っています(逆も同様です)。私のsrcディレクトリのより良い名前はrepoです。
raacer

19

私の答えは私自身の実務経験にインスピレーションを得ており、主に私が強くお勧めする2つのスクープオブジャンゴで、すべての詳細な説明を見つけることができます。いくつかの点についてお答えしますが、改善や修正は歓迎します。しかし、同じ目的を達成するためのより正確な方法もあり得ます。

プロジェクト
自分の個人ディレクトリにメインフォルダがあり、そこで作業しているすべてのプロジェクトを管理しています。

ソースファイル
私は自分のプロジェクトのリポジトリルートとしてdjangoプロジェクトルートを使用しています。しかし、本では両方のものを分離することをお勧めします。これはより良いアプローチだと思うので、私のプロジェクトに徐々に変更を加えていきたいと思います。

project_repository_folder/
    .gitignore
    Makefile
    LICENSE.rst
    docs/
    README.rst
    requirements.txt
    project_folder/
        manage.py
        media/
        app-1/
        app-2/
        ...
        app-n/
        static/
        templates/
        project/
            __init__.py
            settings/
                __init__.py
                base.py
                dev.py
                local.py
                test.py
                production.py
            ulrs.py
            wsgi.py

リポジトリー
GitまたはMercurialは、Django開発者の間で最も人気のあるバージョン管理システムのようです。また、バックアップGitHubBitbucketの最も人気のあるホスティングサービス。

仮想環境
私はvirtualenvとvirtualenvwrapperを使用しています。2つ目をインストールしたら、作業ディレクトリを設定する必要があります。私の/ home / envsディレクトリにあります。virtualenvwrapperインストールガイドで推奨されています。しかし、私はそれがどこに置かれるかが最も重要だとは思いません。仮想環境で作業するときに最も重要なことは、requirements.txtファイルを最新に保つことです。

pip freeze -l > requirements.txt 

静的ルート
プロジェクトフォルダ

メディアルート
プロジェクトフォルダ

README
リポジトリのルート

LICENSE
リポジトリルート

ドキュメント
リポジトリルート。このpythonパッケージは、ドキュメントの管理を容易にするのに役立ちます。

スケッチ


データベース


あなたの経験を共有してくれてありがとう。構造内に多数の「project *」ディレクトリがあります。たぶんあなたはそのような名前を実際の生活で使わないでしょう?「todo」プロジェクトがあるとします。このような場合、これらのdirsをどのように名付けますか あなたの現在の構造で私が目にする問題は、リポジトリを非リポジトリファイルと混在させることです(前述のとおり)。ゴミ箱を.gitignoreに追加するのは面倒かもしれませんね。別の疑わしいことは、env dirをプロジェクト自体から遠くに保つことです。それは意味がありますか?〜/ docs、〜/ staticsなどを作成しないのはなぜですか?gitでさえソースファイルの近くに座るのが好きです。
raacer 2014年

私はそれらに名前を付けます: "todo_project"-> todo-> todo(または多分todoapp)。それは、ディレクトリ階層のルートにあるリポジトリフォルダーであることは重要だと思います。しかし、それは私の意見です。環境ディレクトリについては、本番環境をセットアップする必要がある場合は、pip install -U -r requirements.txtと入力するだけで完了します。しかし、私が言ったように、すべてに対して1つの解決策はありません。
2014年

したがって、メインアプリへのパスは「projects / todo_project / todo / todo」です。「プロジェクト」という言葉は2回繰り返され、「todo」という言葉は3回繰り返されました。これは「projects / project / my_project / project_dir / project / project」のようです。名前は非常に不明確です。これは、ディレクトリ構造で解決しようとしている主要な問題の1つです。階層をわかりやすくするために、ディレクトリに名前を付けたいと思います。リポジトリのルートはどうですか、なぜそれが重要なのか説明してもらえますか?また、メインプロジェクトのディレクトリの外にenvを保持することの良い点について説明してもらえますか?
raacer 2014年

13

新しいsettings/ディレクトリを作成したくありません。私は単に名前のファイルを追加settings_dev.pyし、settings_production.py私は編集する必要はありませんのでBASE_DIR。以下のアプローチでは、デフォルトの構造を変更するのではなく増やします。

mysite/                   # Project
    conf/
        locale/
            en_US/
            fr_FR/
            it_IT/
    mysite/
        __init__.py
        settings.py
        settings_dev.py
        settings_production.py
        urls.py
        wsgi.py
    static/
        admin/
            css/           # Custom back end styles
        css/               # Project front end styles
        fonts/
        images/
        js/
        sass/
    staticfiles/
    templates/             # Project templates
        includes/
            footer.html
            header.html
        index.html
    myapp/                 # Application
        core/
        migrations/
            __init__.py
        templates/         # Application templates
            myapp/
                index.html
        static/
            myapp/
                js/  
                css/
                images/
        __init__.py
        admin.py
        apps.py
        forms.py
        models.py
        models_foo.py
        models_bar.py
        views.py
    templatetags/          # Application with custom context processors and template tags
        __init__.py
        context_processors.py
        templatetags/
            __init__.py
            templatetag_extras.py
    gulpfile.js
    manage.py
    requirements.txt

私はこれを考えます:

    settings.py
    settings_dev.py
    settings_production.py

これより良いです:

    settings/__init__.py
    settings/base.py
    settings/dev.py
    settings/production.py

この概念は他のファイルにも適用されます。


私は通常置くnode_modules/bower_components/、デフォルトの内のプロジェクトディレクトリ内のstatic/フォルダ。

時にはvendor/Gitサブモジュールのディレクトリですが、通常はstatic/フォルダに配置します。


4

これが私のシステムで私がフォローしているものです。

  1. すべてのプロジェクトは:あるフォルダ私の家でのプロジェクトディレクトリすなわち~/projects。すべてのプロジェクトはその中にあります。

  2. 個別プロジェクト:私は、django-skelと呼ばれる多くの開発者が個別プロジェクトに使用する標準化された構造テンプレートに従います。それは基本的にすべての静的ファイルとメディアファイルをすべて処理します。

  3. 仮想環境私の家の中にvirtualenvsフォルダーがあり、システムのすべての仮想環境を保存します~/virtualenvs。これにより、自分が持っているすべての仮想環境を簡単に把握できる柔軟性が得られます

上記の3つは、私の作業環境の主要なパーティションです。

あなたが言及した他のすべての部分は主にプロジェクトごとに依存しています(つまり、異なるプロジェクトに異なるデータベースを使用するかもしれません)。したがって、彼らは個々のプロジェクトに常駐する必要があります。


ありがとうございました。リポジトリと非リポジトリファイルを混在させる場合、.gitignoreにゴミを追加するのは面倒です。そうではありませんか?私のプロジェクトの中には、そのようなファイルとディレクトリが最大10個以上あるものがあるため、これが私にとって本当に問題になります。別の疑わしいことは、env dirをプロジェクト自体から遠くに保つことです。そのようなソリューションの柔軟性は何ですか?〜/ docs、〜/ staticsなどを作成しないのはなぜですか?gitでさえソースファイルの近くに座るのが好きです。柔軟性は、virtualenvを含むプロジェクトディレクトリ全体を単にコピー/移動/アーカイブ/削除でき、1つのプロジェクト内で複数の環境を簡単に維持できるときだと思いました
raacer

4

Django Project Skeletonによると、従うことができる適切なディレクトリ構造は次のとおりです。

[projectname]/                  <- project root
├── [projectname]/              <- Django root
   ├── __init__.py
   ├── settings/
      ├── common.py
      ├── development.py
      ├── i18n.py
      ├── __init__.py
      └── production.py
   ├── urls.py
   └── wsgi.py
├── apps/
   └── __init__.py
├── configs/
   ├── apache2_vhost.sample
   └── README
├── doc/
   ├── Makefile
   └── source/
       └── *snap*
├── manage.py
├── README.rst
├── run/
   ├── media/
      └── README
   ├── README
   └── static/
       └── README
├── static/
   └── README
└── templates/
    ├── base.html
    ├── core
       └── login.html
    └── README

最新のディレクトリ構造については、https://django-project-skeleton.readthedocs.io/en/latest/structure.htmlを参照してください


7
私は[プロジェクト名] / [プロジェクト名]のアプローチが嫌いです!)
raacer

1
django-project-skeletonは「Djangoドキュメント」ではありません。「django-project-skeletonによると...」と言った方が正確です。
David Winiecki

0

https://github.com/Mischback/django-project-skeletonリポジトリを使用できます。

以下のコマンドを実行します。

$ django-admin startproject --template=https://github.com/Mischback/django-project-skeleton/archive/development.zip [projectname]

構造は次のようなものです:

[projectname]/                  <- project root
├── [projectname]/              <- Django root
   ├── __init__.py
   ├── settings/
      ├── common.py
      ├── development.py
      ├── i18n.py
      ├── __init__.py
      └── production.py
   ├── urls.py
   └── wsgi.py
├── apps/
   └── __init__.py
├── configs/
   ├── apache2_vhost.sample
   └── README
├── doc/
   ├── Makefile
   └── source/
       └── *snap*
├── manage.py
├── README.rst
├── run/
   ├── media/
      └── README
   ├── README
   └── static/
       └── README
├── static/
   └── README
└── templates/
    ├── base.html
    ├── core
       └── login.html
    └── README
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.