[解決済み】Djangoプロジェクトの作業ディレクトリ構造に関するベストプラクティス【終了しました
質問
正しい方法というのは、実は一つもないのです。しかし、すべての開発者や管理者にとって、うまく機能し、きれいな状態を保つディレクトリ構造を作るのは難しいということがわかりました。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.py
に
PATH
を実行することができます。
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ディレクトリの外に置いています。
しかし、それは本当に重要ではありません。重要なのは
README
と
setup.py
を使うので、パッケージのインストールは
pip
.
関連
-
[解決済み] Django Programmingのエラーカラムが、マイグレーションを実行しても存在しない。
-
[解決済み] DISTINCT ON フィールドは、このデータベースバックエンドではサポートされていません。
-
django -- django.core.exceptions.AppRegistryNotReady: アプリはまだロードされていません。
-
Django: OperationalError そのようなテーブルがない
-
Djangoにおけるrenderとrender_to_responseの違いについて
-
[解決済み】テンプレートコード内で変数に値を設定するには?
-
[解決済み】Djangoで空のクエリセットがあるかどうか確認する
-
[解決済み】Djangoでメールテンプレートを作成する
-
[解決済み】テンプレート変数をHTMLとしてレンダリングする
-
[解決済み】Django TemplateDoesNotExist?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Django: そのようなテーブルがない: django_session
-
[解決済み] Django Programmingのエラーカラムが、マイグレーションを実行しても存在しない。
-
[解決済み] Django-Rest-Framework ルータ登録
-
[解決済み] "POSTMANを使った画像データの投稿"
-
django -- django.core.exceptions.AppRegistryNotReady: アプリはまだロードされていません。
-
django.core.exceptions.ImproperlyConfigured: MySQLdb モジュールの読み込みに失敗しました。
-
django queryset values&values_list
-
[解決済み】Djangoで1ページで複数のフォームを扱う適切な方法
-
[解決済み】Djangoでメールテンプレートを作成する
-
[解決済み] djangoモデルのカスタムsave()メソッドでは、新しいオブジェクトをどのように識別する必要がありますか?